From 26abfcd28d48c49dd4a0cc8c5cb3b71fb657733a Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 25 Nov 2024 10:11:47 +0100 Subject: [PATCH 001/156] create permutation file --- src/mqt/qecc/ft_stateprep/permutation_st.py | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/mqt/qecc/ft_stateprep/permutation_st.py diff --git a/src/mqt/qecc/ft_stateprep/permutation_st.py b/src/mqt/qecc/ft_stateprep/permutation_st.py new file mode 100644 index 000000000..c87ce2ec3 --- /dev/null +++ b/src/mqt/qecc/ft_stateprep/permutation_st.py @@ -0,0 +1,6 @@ +"""This module implements the features of state preparation with qubit permutation.""" +from __future__ import annotations + +import logging + +logger = logging.getLogger(__name__) From 2b740277a2be90dfaff243cb6f8fcf05f8a9c4ba Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 26 Nov 2024 10:23:13 +0100 Subject: [PATCH 002/156] add function to create steane state prep circuit --- src/mqt/qecc/ft_stateprep/permutation_st.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/mqt/qecc/ft_stateprep/permutation_st.py b/src/mqt/qecc/ft_stateprep/permutation_st.py index c87ce2ec3..8e1eddc14 100644 --- a/src/mqt/qecc/ft_stateprep/permutation_st.py +++ b/src/mqt/qecc/ft_stateprep/permutation_st.py @@ -3,4 +3,22 @@ import logging +from qiskit import QuantumCircuit + logger = logging.getLogger(__name__) + +def get_stean_prep_circ() -> QuantumCircuit: + """Function that builds up a state preparation circuit for the Steane code.""" + circ = QuantumCircuit(7) + circ.h(0) + circ.h(1) + circ.h(2) + circ.cx(0,6) + circ.cx(1,2) + circ.cx(3,5) + circ.cx(0,4) + circ.cx(1,5) + circ.cx(0,2) + circ.cx(3,4) + circ.cx(5,6) + return circ From 010df0630175d6a797b05a38f156402a90524c5b Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 27 Nov 2024 10:40:13 +0100 Subject: [PATCH 003/156] add function preparing Steane code CSS object --- src/mqt/qecc/ft_stateprep/permutation_st.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/mqt/qecc/ft_stateprep/permutation_st.py b/src/mqt/qecc/ft_stateprep/permutation_st.py index 8e1eddc14..298170d6b 100644 --- a/src/mqt/qecc/ft_stateprep/permutation_st.py +++ b/src/mqt/qecc/ft_stateprep/permutation_st.py @@ -2,9 +2,16 @@ from __future__ import annotations import logging +from typing import TYPE_CHECKING +import numpy as np from qiskit import QuantumCircuit +from mqt.qecc.codes.css_code import CSSCode + +if TYPE_CHECKING: # pragma: no cover + import numpy.typing as npt + logger = logging.getLogger(__name__) def get_stean_prep_circ() -> QuantumCircuit: @@ -12,7 +19,7 @@ def get_stean_prep_circ() -> QuantumCircuit: circ = QuantumCircuit(7) circ.h(0) circ.h(1) - circ.h(2) + circ.h(3) circ.cx(0,6) circ.cx(1,2) circ.cx(3,5) @@ -22,3 +29,14 @@ def get_stean_prep_circ() -> QuantumCircuit: circ.cx(3,4) circ.cx(5,6) return circ + +def get_steane_css_object() -> CSSCode: + """Return the Steane Code as CSS object.""" + distance: int = 3 + hx : npt.NDArray[np.int8] = np.array([[1,1,1,1,0,0,0], + [0,1,1,0,1,1,0], + [0,0,1,1,0,6,7]]) + hz : npt.NDArray[np.int8] = np.array([[1,1,1,1,0,0,0], + [0,1,1,0,1,1,0], + [0,0,1,1,0,6,7]]) + return CSSCode(distance, hx, hz, distance, distance) From 714e8f7d722e4bc033c31cf1d9294937d8a4c999 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Thu, 28 Nov 2024 13:25:28 +0100 Subject: [PATCH 004/156] Correct wrong stabilizer generators --- src/mqt/qecc/ft_stateprep/permutation_st.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/mqt/qecc/ft_stateprep/permutation_st.py b/src/mqt/qecc/ft_stateprep/permutation_st.py index 298170d6b..099e8c4f3 100644 --- a/src/mqt/qecc/ft_stateprep/permutation_st.py +++ b/src/mqt/qecc/ft_stateprep/permutation_st.py @@ -14,7 +14,7 @@ logger = logging.getLogger(__name__) -def get_stean_prep_circ() -> QuantumCircuit: +def get_steane_prep_circ() -> QuantumCircuit: """Function that builds up a state preparation circuit for the Steane code.""" circ = QuantumCircuit(7) circ.h(0) @@ -33,10 +33,10 @@ def get_stean_prep_circ() -> QuantumCircuit: def get_steane_css_object() -> CSSCode: """Return the Steane Code as CSS object.""" distance: int = 3 - hx : npt.NDArray[np.int8] = np.array([[1,1,1,1,0,0,0], - [0,1,1,0,1,1,0], - [0,0,1,1,0,6,7]]) - hz : npt.NDArray[np.int8] = np.array([[1,1,1,1,0,0,0], - [0,1,1,0,1,1,0], - [0,0,1,1,0,6,7]]) + hx : npt.NDArray[np.int8] = np.array([[0,0,0,1,1,1,1], + [0,1,1,0,0,1,1], + [1,0,1,0,1,0,1]]) + hz : npt.NDArray[np.int8] = np.array([[0,0,0,1,1,1,1], + [0,1,1,0,0,1,1], + [1,0,1,0,1,0,1]]) return CSSCode(distance, hx, hz, distance, distance) From af5698643460b4cb3954a98e697cb7b2a1d6e647 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 28 Jan 2025 09:55:55 +0100 Subject: [PATCH 005/156] add option to check for logical 0 instead of just checking all flag qubits to be 0, one can also check if the resulting measurement correspond to the logical 0 state --- src/mqt/qecc/ft_stateprep/simulation.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/mqt/qecc/ft_stateprep/simulation.py b/src/mqt/qecc/ft_stateprep/simulation.py index 6759632d9..b3bf31451 100644 --- a/src/mqt/qecc/ft_stateprep/simulation.py +++ b/src/mqt/qecc/ft_stateprep/simulation.py @@ -30,6 +30,7 @@ def __init__( p: float, zero_state: bool = True, parallel_gates: bool = True, + check_logical_0: bool = False, ) -> None: """Initialize the simulator. @@ -39,6 +40,7 @@ def __init__( p: The error rate. zero_state: Whether thezero state is prepared or nor. parallel_gates: Whether to allow for parallel execution of gates. + check_logical_0: Whether to check flag measurements or the logical state """ if code.Hx is None or code.Hz is None: msg = "The code must have both X and Z checks." @@ -60,6 +62,7 @@ def __init__( self.n_measurements = 0 self.stim_circ = stim.Circuit() self.decoder = LutDecoder(code) + self.check_logical_0 = check_logical_0 self.set_p(p) def set_p(self, p: float) -> None: @@ -270,7 +273,14 @@ def _simulate_batch(self, shots: int = 1024) -> tuple[int, int]: # Filter events where the verification circuit flagged verification_measurements = self.x_verification_measurements + self.z_verification_measurements - index_array = np.where(np.all(detection_events[:, verification_measurements] == 0, axis=1))[0] + if self.check_logical_0: + # Compute dot products for all rows + dot_products = np.dot(detection_events[:, verification_measurements], self.code.Hx.T) %2 + + # Find rows where all dot products are zero + index_array = np.where(np.all(dot_products == 0, axis=1))[0] + else: + index_array = np.where(np.all(detection_events[:, verification_measurements] == 0, axis=1))[0] filtered_events = detection_events[index_array].astype(np.int8) if len(filtered_events) == 0: # All events were discarded From a8b5e474406982cb52a44c05e67a7a787d287ce5 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 28 Jan 2025 09:57:42 +0100 Subject: [PATCH 006/156] add set up for Simulation circuit --- src/mqt/qecc/ft_stateprep/permutation_st.py | 27 +++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/mqt/qecc/ft_stateprep/permutation_st.py b/src/mqt/qecc/ft_stateprep/permutation_st.py index 099e8c4f3..addc62818 100644 --- a/src/mqt/qecc/ft_stateprep/permutation_st.py +++ b/src/mqt/qecc/ft_stateprep/permutation_st.py @@ -30,6 +30,33 @@ def get_steane_prep_circ() -> QuantumCircuit: circ.cx(5,6) return circ +def get_steane_prep_circ_twice() -> QuantumCircuit: + """Function that builds up a state preparation circuit for the Steane code.""" + circ = QuantumCircuit(14) + circ.h(0) + circ.h(1) + circ.h(3) + circ.cx(0,6) + circ.cx(1,2) + circ.cx(3,5) + circ.cx(0,4) + circ.cx(1,5) + circ.cx(0,2) + circ.cx(3,4) + circ.cx(5,6) + circ.h(7) + circ.h(8) + circ.h(10) + circ.cx(7,13) + circ.cx(8,9) + circ.cx(10,12) + circ.cx(7,11) + circ.cx(8,12) + circ.cx(7,9) + circ.cx(10,11) + circ.cx(12,13) + return circ + def get_steane_css_object() -> CSSCode: """Return the Steane Code as CSS object.""" distance: int = 3 From 112c777473b9e47fdec48ad5aa858c4fb1e20e13 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 28 Jan 2025 09:58:49 +0100 Subject: [PATCH 007/156] disable print statement removement Print statements are automatically removed by the formatter. Temporarily disable this for debugging purpose. --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index d1eeaa5d9..ded735cac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -251,6 +251,7 @@ ignore = [ "PLC0415", # Import should be at top of file "PT004", # Incorrect, just usefixtures instead. "S101", # Use of assert detected + "T201", # avoid removing print statements ] isort.required-imports = ["from __future__ import annotations"] From 28de0e38470dea224ded0e92a06fff898e8a6fc0 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 10 Feb 2025 14:53:13 +0100 Subject: [PATCH 008/156] add utility function to get automorphism subgroup from generators this utility function returns the whole automorphism subgroup of the symmetric group based on the given generators of the automorphism group --- .../qecc/circuit_synthesis/synthesis_utils.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index de575b369..9b18f8de4 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -12,6 +12,7 @@ from ldpc import mod2 from qiskit import AncillaRegister, ClassicalRegister, QuantumCircuit from stim import Circuit +from sympy.combinatorics import Permutation, PermutationGroup if TYPE_CHECKING: # pragma: no cover from collections.abc import Callable @@ -148,9 +149,24 @@ def is_reduced() -> bool: costs[j, :] = new_weights - np.sum(matrix, axis=0) costs[:, j] = new_weights - np.sum(matrix[:, j]) np.fill_diagonal(costs, 1) + print(f"Use column {i} to eliminate column {j}") + print("Matrix after elimination:\n", matrix) return matrix, eliminations +def get_permutation_group(group_generators: list[list[int]]) -> list[Permutation]: + """Based on the generators of the permutation group find the whole permutation group. + + Args: + group_generators: A list of generators of the permutation group. Each generator is given as a list of integers describing the permutation. E.g. for a S7 generator: [0, 3, 2, 1, 6, 5, 4] + + returns: + Returns a list of Permutation object coming form sympy.combinatorics. + """ + group_generators = [Permutation(generator) for generator in group_generators] + g = PermutationGroup(group_generators) + return list(g.generate()) + def gaussian_elimination_min_column_ops( matrix: npt.NDArray[np.int8], From 0bed2639b4a950984c33459610383bb891029868 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Thu, 20 Feb 2025 14:45:33 +0100 Subject: [PATCH 009/156] add function to evaluate fault set overlap based on permutations This function as of now goes through all permutations and checks how many faults overlap in the corresponding fault sets for each permutation. --- src/mqt/qecc/circuit_synthesis/state_prep.py | 63 ++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index b3ce71a09..6bddd1af2 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -11,10 +11,12 @@ from ldpc import mod2 from qiskit import AncillaRegister, ClassicalRegister, QuantumCircuit, QuantumRegister from qiskit.converters import circuit_to_dag +from sympy.combinatorics import Permutation from ..codes import InvalidCSSCodeError from .synthesis_utils import ( build_css_circuit_from_cnot_list, + get_permutation_group, heuristic_gaussian_elimination, iterative_search_with_timeout, measure_flagged, @@ -238,6 +240,67 @@ def heuristic_prep_circuit(code: CSSCode, optimize_depth: bool = True, zero_stat circ = _build_state_prep_circuit_from_back(checks, cnots, zero_state) return StatePrepCircuit(circ, code, zero_state) +def fs_disjunct_spc(code: CSSCode, automorph_generators: list[list[int]], optimize_depth: bool = True, zero_state: bool = True) -> None: + """Returns dictionary of permutations for the given QEC. + + This function takes a QEC and the corresponding strong automorphism group. It then checks every permutation and + returns a dictionary with all permutations as keys and the overlapping propagated errors in the fault set. + + Args: + code: The CSS code to prepare the state for. + optimize_depth: If True, optimize the depth of the circuit. This may lead to a higher number of CNOTs. + zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. + automorph_generators: foobar + """ + logger.info("Starting heuristic state preparation.") + if code.Hx is None or code.Hz is None: + msg = "The code must have both X and Z stabilizers defined." + raise InvalidCSSCodeError(msg) + + checks = code.Hx if zero_state else code.Hz + assert checks is not None + checks, cnots = heuristic_gaussian_elimination(checks, parallel_elimination=optimize_depth) + # NOTE: everything above is code duplication from heuristic_prep_circuit() + + permutation_group = get_permutation_group(group_generators=automorph_generators) + # BUG: I have those prints since the stateprep circuit below gives another fault set than the one + # returned all the way at the bottom without this if section and I do not understand why + circ = _build_state_prep_circuit_from_back(checks.copy(), cnots.copy(), zero_state) + stateprepcirc = StatePrepCircuit(circ, code, zero_state) + + # NOTE: get fault sets based on code distance + stateprepcirc.compute_fault_set() + fault_set_1 = stateprepcirc.x_fault_sets[1] + if stateprepcirc.code.distance == 5: + fault_set_1 = fault_set_1[np.where(fault_set_1.sum(axis=1)>2)] + if stateprepcirc.code.distance == 7: + stateprepcirc.compute_fault_set(2) + fault_set_2 = stateprepcirc.x_fault_sets[2] + fault_set_1 = fault_set_1[np.where(fault_set_1.sum(axis=1)>3)] + fault_set_2 = fault_set_2[np.where(fault_set_2.sum(axis=1)>3)] + + # HACK: Overlap search has 3 nested for loops, check for improvment + overlapping_faults : list[npt.NDArray[np.int8]] = [] + perm_overlap: dict[Permutation, list[npt.NDArray[np.int8]]] = {} + original_faults = fault_set_1 + print(f"fault set 1: \n{fault_set_1}") + if stateprepcirc.code.distance == 7: + original_faults = np.vstack(fault_set_1, fault_set_2) + print(f"fault set 2: \n{fault_set_2}") + print(f"comparison fault set: \n{original_faults}") + for perm in permutation_group: + perm_fs = fault_set_1[:, perm.array_form] + for pf in perm_fs: + for ff in original_faults: + if code.stabilizer_eq_x_error(pf,ff): + # FIX: without this print statement append gets changed to extend on save + print(f"permutation: {perm}") + print(f"stabilizer equivalent error: \n{pf}(permuted) and \n{ff}(not permuted)") + overlapping_faults.append(pf) + perm_overlap[perm] = overlapping_faults + overlapping_faults = [] + + return perm_overlap def depth_optimal_prep_circuit( code: CSSCode, From 3e249b80e3bdf27caf521bc6ba1004ecc6e9808e Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Thu, 20 Feb 2025 14:51:00 +0100 Subject: [PATCH 010/156] mandatory format changes (return -> Return) --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 9b18f8de4..2e0631729 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -97,7 +97,7 @@ def heuristic_gaussian_elimination( matrix: The matrix to perform Gaussian elimination on. parallel_elimination: Whether to prioritize elimination steps that act on disjoint columns. - returns: + Returns: The reduced matrix and a list of the elimination steps taken. The elimination steps are represented as tuples of the form (i, j) where i is the column being eliminated with and j is the column being eliminated. """ matrix = matrix.copy() @@ -149,8 +149,6 @@ def is_reduced() -> bool: costs[j, :] = new_weights - np.sum(matrix, axis=0) costs[:, j] = new_weights - np.sum(matrix[:, j]) np.fill_diagonal(costs, 1) - print(f"Use column {i} to eliminate column {j}") - print("Matrix after elimination:\n", matrix) return matrix, eliminations @@ -160,7 +158,7 @@ def get_permutation_group(group_generators: list[list[int]]) -> list[Permutation Args: group_generators: A list of generators of the permutation group. Each generator is given as a list of integers describing the permutation. E.g. for a S7 generator: [0, 3, 2, 1, 6, 5, 4] - returns: + Returns: Returns a list of Permutation object coming form sympy.combinatorics. """ group_generators = [Permutation(generator) for generator in group_generators] @@ -182,7 +180,7 @@ def gaussian_elimination_min_column_ops( termination_criteria: A function that takes a boolean matrix as input and returns a Z3 boolean expression that is true if the matrix is considered reduced. max_eliminations: The maximum number of eliminations to perform. - returns: + Returns: The reduced matrix and a list of the elimination steps taken. The elimination steps are represented as tuples of the form (i, j) where i is the column being eliminated with and j is the column being eliminated. """ n = matrix.shape[1] @@ -251,7 +249,7 @@ def gaussian_elimination_min_parallel_eliminations( termination_criteria: A function that takes a boolean matrix as input and returns a Z3 boolean expression that is true if the matrix is considered reduced. max_parallel_steps: The maximum number of parallel elimination steps to perform. - returns: + Returns: The reduced matrix and a list of the elimination steps taken. The elimination steps are represented as tuples of the form (i, j) where i is the column being eliminated with and j is the column being eliminated. """ columns = np.array([ From 1d64f19d97e7f00441cb4f3587f69cf0be2da236 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 11:31:32 +0000 Subject: [PATCH 011/156] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../simulators/analog_tannergraph_decoding.py | 2 +- .../simulators/quasi_single_shot_v2.py | 2 +- .../simulators/simulation.py | 2 +- .../qecc/circuit_synthesis/permutation_st.py | 60 +++++++++---------- src/mqt/qecc/circuit_synthesis/simulation.py | 2 +- src/mqt/qecc/circuit_synthesis/state_prep.py | 20 ++++--- .../qecc/circuit_synthesis/synthesis_utils.py | 1 + src/mqt/qecc/ecc_qiskit_wrapper.py | 10 ++-- 8 files changed, 52 insertions(+), 47 deletions(-) diff --git a/src/mqt/qecc/analog_information_decoding/simulators/analog_tannergraph_decoding.py b/src/mqt/qecc/analog_information_decoding/simulators/analog_tannergraph_decoding.py index a85807fe6..5dfe7dcca 100644 --- a/src/mqt/qecc/analog_information_decoding/simulators/analog_tannergraph_decoding.py +++ b/src/mqt/qecc/analog_information_decoding/simulators/analog_tannergraph_decoding.py @@ -247,7 +247,7 @@ def run(self, samples: int) -> dict[str, Any]: self.code_params, self.eb_precision, ): - print("Result has converged.") # noqa: T201 + print("Result has converged.") break x_ler, x_ler_eb, x_wer, x_wer_eb = calculate_error_rates(x_success_cnt, runs, self.code_params) diff --git a/src/mqt/qecc/analog_information_decoding/simulators/quasi_single_shot_v2.py b/src/mqt/qecc/analog_information_decoding/simulators/quasi_single_shot_v2.py index 78183baec..94f22c4ec 100644 --- a/src/mqt/qecc/analog_information_decoding/simulators/quasi_single_shot_v2.py +++ b/src/mqt/qecc/analog_information_decoding/simulators/quasi_single_shot_v2.py @@ -283,6 +283,6 @@ def run(self, samples: int = 1) -> dict[str, Any]: if run % self.save_interval == 1: self._save_results(success_cnt, run) if _check_convergence(success_cnt, run, self.code_params, self.eb_precision): - print("Converged") # noqa: T201 + print("Converged") break return self._save_results(success_cnt, run) diff --git a/src/mqt/qecc/analog_information_decoding/simulators/simulation.py b/src/mqt/qecc/analog_information_decoding/simulators/simulation.py index 33654602c..68f5bd7f8 100644 --- a/src/mqt/qecc/analog_information_decoding/simulators/simulation.py +++ b/src/mqt/qecc/analog_information_decoding/simulators/simulation.py @@ -735,7 +735,7 @@ def run(self, samples: int) -> dict[str, Any]: self.code_params, self.eb_precision, ): - print("Result has converged.") # noqa: T201 + print("Result has converged.") break x_ler, x_ler_eb, x_wer, x_wer_eb = calculate_error_rates(x_success_cnt, runs, self.code_params) diff --git a/src/mqt/qecc/circuit_synthesis/permutation_st.py b/src/mqt/qecc/circuit_synthesis/permutation_st.py index addc62818..6e41e3bf9 100644 --- a/src/mqt/qecc/circuit_synthesis/permutation_st.py +++ b/src/mqt/qecc/circuit_synthesis/permutation_st.py @@ -1,4 +1,5 @@ """This module implements the features of state preparation with qubit permutation.""" + from __future__ import annotations import logging @@ -14,56 +15,55 @@ logger = logging.getLogger(__name__) + def get_steane_prep_circ() -> QuantumCircuit: """Function that builds up a state preparation circuit for the Steane code.""" circ = QuantumCircuit(7) circ.h(0) circ.h(1) circ.h(3) - circ.cx(0,6) - circ.cx(1,2) - circ.cx(3,5) - circ.cx(0,4) - circ.cx(1,5) - circ.cx(0,2) - circ.cx(3,4) - circ.cx(5,6) + circ.cx(0, 6) + circ.cx(1, 2) + circ.cx(3, 5) + circ.cx(0, 4) + circ.cx(1, 5) + circ.cx(0, 2) + circ.cx(3, 4) + circ.cx(5, 6) return circ + def get_steane_prep_circ_twice() -> QuantumCircuit: """Function that builds up a state preparation circuit for the Steane code.""" circ = QuantumCircuit(14) circ.h(0) circ.h(1) circ.h(3) - circ.cx(0,6) - circ.cx(1,2) - circ.cx(3,5) - circ.cx(0,4) - circ.cx(1,5) - circ.cx(0,2) - circ.cx(3,4) - circ.cx(5,6) + circ.cx(0, 6) + circ.cx(1, 2) + circ.cx(3, 5) + circ.cx(0, 4) + circ.cx(1, 5) + circ.cx(0, 2) + circ.cx(3, 4) + circ.cx(5, 6) circ.h(7) circ.h(8) circ.h(10) - circ.cx(7,13) - circ.cx(8,9) - circ.cx(10,12) - circ.cx(7,11) - circ.cx(8,12) - circ.cx(7,9) - circ.cx(10,11) - circ.cx(12,13) + circ.cx(7, 13) + circ.cx(8, 9) + circ.cx(10, 12) + circ.cx(7, 11) + circ.cx(8, 12) + circ.cx(7, 9) + circ.cx(10, 11) + circ.cx(12, 13) return circ + def get_steane_css_object() -> CSSCode: """Return the Steane Code as CSS object.""" distance: int = 3 - hx : npt.NDArray[np.int8] = np.array([[0,0,0,1,1,1,1], - [0,1,1,0,0,1,1], - [1,0,1,0,1,0,1]]) - hz : npt.NDArray[np.int8] = np.array([[0,0,0,1,1,1,1], - [0,1,1,0,0,1,1], - [1,0,1,0,1,0,1]]) + hx: npt.NDArray[np.int8] = np.array([[0, 0, 0, 1, 1, 1, 1], [0, 1, 1, 0, 0, 1, 1], [1, 0, 1, 0, 1, 0, 1]]) + hz: npt.NDArray[np.int8] = np.array([[0, 0, 0, 1, 1, 1, 1], [0, 1, 1, 0, 0, 1, 1], [1, 0, 1, 0, 1, 0, 1]]) return CSSCode(distance, hx, hz, distance, distance) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index a73a68392..0f0001723 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -276,7 +276,7 @@ def _simulate_batch(self, shots: int = 1024) -> tuple[int, int]: verification_measurements = self.x_verification_measurements + self.z_verification_measurements if self.check_logical_0: # Compute dot products for all rows - dot_products = np.dot(detection_events[:, verification_measurements], self.code.Hx.T) %2 + dot_products = np.dot(detection_events[:, verification_measurements], self.code.Hx.T) % 2 # Find rows where all dot products are zero index_array = np.where(np.all(dot_products == 0, axis=1))[0] diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 6bddd1af2..0c3bb5a98 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -11,7 +11,6 @@ from ldpc import mod2 from qiskit import AncillaRegister, ClassicalRegister, QuantumCircuit, QuantumRegister from qiskit.converters import circuit_to_dag -from sympy.combinatorics import Permutation from ..codes import InvalidCSSCodeError from .synthesis_utils import ( @@ -36,6 +35,7 @@ import numpy.typing as npt from qiskit import DAGNode from qiskit.quantum_info import PauliList + from sympy.combinatorics import Permutation from ..codes import CSSCode @@ -240,7 +240,10 @@ def heuristic_prep_circuit(code: CSSCode, optimize_depth: bool = True, zero_stat circ = _build_state_prep_circuit_from_back(checks, cnots, zero_state) return StatePrepCircuit(circ, code, zero_state) -def fs_disjunct_spc(code: CSSCode, automorph_generators: list[list[int]], optimize_depth: bool = True, zero_state: bool = True) -> None: + +def fs_disjunct_spc( + code: CSSCode, automorph_generators: list[list[int]], optimize_depth: bool = True, zero_state: bool = True +) -> None: """Returns dictionary of permutations for the given QEC. This function takes a QEC and the corresponding strong automorphism group. It then checks every permutation and @@ -272,15 +275,15 @@ def fs_disjunct_spc(code: CSSCode, automorph_generators: list[list[int]], optimi stateprepcirc.compute_fault_set() fault_set_1 = stateprepcirc.x_fault_sets[1] if stateprepcirc.code.distance == 5: - fault_set_1 = fault_set_1[np.where(fault_set_1.sum(axis=1)>2)] + fault_set_1 = fault_set_1[np.where(fault_set_1.sum(axis=1) > 2)] if stateprepcirc.code.distance == 7: stateprepcirc.compute_fault_set(2) fault_set_2 = stateprepcirc.x_fault_sets[2] - fault_set_1 = fault_set_1[np.where(fault_set_1.sum(axis=1)>3)] - fault_set_2 = fault_set_2[np.where(fault_set_2.sum(axis=1)>3)] + fault_set_1 = fault_set_1[np.where(fault_set_1.sum(axis=1) > 3)] + fault_set_2 = fault_set_2[np.where(fault_set_2.sum(axis=1) > 3)] - # HACK: Overlap search has 3 nested for loops, check for improvment - overlapping_faults : list[npt.NDArray[np.int8]] = [] + # HACK: Overlap search has 3 nested for loops, check for improvement + overlapping_faults: list[npt.NDArray[np.int8]] = [] perm_overlap: dict[Permutation, list[npt.NDArray[np.int8]]] = {} original_faults = fault_set_1 print(f"fault set 1: \n{fault_set_1}") @@ -292,7 +295,7 @@ def fs_disjunct_spc(code: CSSCode, automorph_generators: list[list[int]], optimi perm_fs = fault_set_1[:, perm.array_form] for pf in perm_fs: for ff in original_faults: - if code.stabilizer_eq_x_error(pf,ff): + if code.stabilizer_eq_x_error(pf, ff): # FIX: without this print statement append gets changed to extend on save print(f"permutation: {perm}") print(f"stabilizer equivalent error: \n{pf}(permuted) and \n{ff}(not permuted)") @@ -302,6 +305,7 @@ def fs_disjunct_spc(code: CSSCode, automorph_generators: list[list[int]], optimi return perm_overlap + def depth_optimal_prep_circuit( code: CSSCode, zero_state: bool = True, diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 2e0631729..c2b914aec 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -152,6 +152,7 @@ def is_reduced() -> bool: return matrix, eliminations + def get_permutation_group(group_generators: list[list[int]]) -> list[Permutation]: """Based on the generators of the permutation group find the whole permutation group. diff --git a/src/mqt/qecc/ecc_qiskit_wrapper.py b/src/mqt/qecc/ecc_qiskit_wrapper.py index 058cdea50..073d99d76 100644 --- a/src/mqt/qecc/ecc_qiskit_wrapper.py +++ b/src/mqt/qecc/ecc_qiskit_wrapper.py @@ -81,7 +81,7 @@ def print_simulation_results(result: Result, n_shots: int, threshold_probability # Print all results > threshold_probability if summarized_counts[result_id] / n_shots > threshold_probability or printed_results == 0: result_string = str(result_id) - print("State |" + result_string + "> probability " + str(summarized_counts[result_id] / n_shots)) # noqa: T201 + print("State |" + result_string + "> probability " + str(summarized_counts[result_id] / n_shots)) printed_results += 1 if printed_results == 1000: break @@ -154,7 +154,7 @@ def main() -> None: ecc_frequency = args.fq ecc_export_filename = args.e if forced_simulator is not None and "stabilizer" in forced_simulator and "A" in error_channels: - print( # noqa: T201 + print( 'Warning: Non-unitary errors (such as for example amplitude damping ("A")) are not suitable for simulation ' "with a stabilizer based simulator and may cause an error during the simulation." ) @@ -168,7 +168,7 @@ def main() -> None: circ = load(open_qasm_file) if not any(gate.operation.name == "measure" for gate in circ.data): - print("Warning: No measurement gates found in the circuit. Adding measurement gates to all qubits.") # noqa: T201 + print("Warning: No measurement gates found in the circuit. Adding measurement gates to all qubits.") circ.measure_all() # Initializing the quantum circuit @@ -178,13 +178,13 @@ def main() -> None: circ = loads(result["circ"]) if ecc_export_filename is not None: - print("Exporting circuit to: " + str(ecc_export_filename)) # noqa: T201 + print("Exporting circuit to: " + str(ecc_export_filename)) with pathlib.Path(ecc_export_filename).open("w", encoding=locale.getpreferredencoding(False)) as f: dump(circ, f) return size = circ.num_qubits - print( # noqa: T201 + print( "_____Trying to simulate with " + str(error_channels) + " (prob=" From acbabdbd474f78f0e7827c8d6584c6625e9e0130 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 3 Mar 2025 15:56:04 +0100 Subject: [PATCH 012/156] guide heuristic gauss based on penalty columns/ CNOTs given a list of qubit indices, add a penalty to each corresponding col of the cost matrix such that those CNOTs are applied later --- .../qecc/circuit_synthesis/synthesis_utils.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index c2b914aec..825a88076 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -85,7 +85,7 @@ def iterative_search_with_timeout( def heuristic_gaussian_elimination( - matrix: npt.NDArray[np.int8], parallel_elimination: bool = True + matrix: npt.NDArray[np.int8], parallel_elimination: bool = True, penalty_cols: list[int] | None = None ) -> tuple[npt.NDArray[np.int8], list[tuple[int, int]]]: """Perform Gaussian elimination on the column space of a matrix using as few eliminations as possible. @@ -100,9 +100,12 @@ def heuristic_gaussian_elimination( Returns: The reduced matrix and a list of the elimination steps taken. The elimination steps are represented as tuples of the form (i, j) where i is the column being eliminated with and j is the column being eliminated. """ + if penalty_cols is None: + penalty_cols = [] matrix = matrix.copy() rank = mod2.rank(matrix) - + print(f"initial check matrix:\n{matrix}") + print("----------------------------------") def is_reduced() -> bool: return bool(len(np.where(np.all(matrix == 0, axis=0))[0]) == matrix.shape[1] - rank) @@ -112,6 +115,10 @@ def is_reduced() -> bool: costs -= np.sum(matrix, axis=0) np.fill_diagonal(costs, 1) + # NOTE: set the penalty terms to be higher than 0 to be ignored. + for i in penalty_cols: + for j in penalty_cols: + costs[i][j] = 1 used_columns = [] # type: list[np.int_] eliminations = [] # type: list[tuple[int, int]] @@ -132,10 +139,12 @@ def is_reduced() -> bool: costs -= np.sum(matrix, axis=0) np.fill_diagonal(costs, 1) else: # try to move onto the next layer + print("\nUsed COLUMN reset\n") used_columns = [] continue i, j = np.unravel_index(np.argmin(costs_unused), costs.shape) + print(f"eliminate column {j} with column {i}") eliminations.append((int(i), int(j))) if parallel_elimination: @@ -146,9 +155,14 @@ def is_reduced() -> bool: matrix[:, j] = (matrix[:, i] + matrix[:, j]) % 2 # update costs new_weights = np.sum((matrix[:, j][:, np.newaxis] + matrix) % 2, axis=0) + print(f"new weights:\n{new_weights}") + print(f"cost matrix before update:\n{costs}") costs[j, :] = new_weights - np.sum(matrix, axis=0) costs[:, j] = new_weights - np.sum(matrix[:, j]) + print(f"cost matrix after update:\n{costs}") np.fill_diagonal(costs, 1) + print(f"matrix after elimination:\n{matrix}") + print("----------------------------------") return matrix, eliminations From 1359027811a407d5fd5226f492ed49a6d73ce369 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 3 Mar 2025 16:18:58 +0100 Subject: [PATCH 013/156] move overlap search out and turn it into a standalone function --- src/mqt/qecc/circuit_synthesis/state_prep.py | 21 +++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 0c3bb5a98..c6f05a053 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -282,20 +282,23 @@ def fs_disjunct_spc( fault_set_1 = fault_set_1[np.where(fault_set_1.sum(axis=1) > 3)] fault_set_2 = fault_set_2[np.where(fault_set_2.sum(axis=1) > 3)] - # HACK: Overlap search has 3 nested for loops, check for improvement - overlapping_faults: list[npt.NDArray[np.int8]] = [] - perm_overlap: dict[Permutation, list[npt.NDArray[np.int8]]] = {} original_faults = fault_set_1 - print(f"fault set 1: \n{fault_set_1}") if stateprepcirc.code.distance == 7: original_faults = np.vstack(fault_set_1, fault_set_2) - print(f"fault set 2: \n{fault_set_2}") - print(f"comparison fault set: \n{original_faults}") + return overlap_search(code=code, fs_2b_permuted=fault_set_1, comp_faults=original_faults, permutation_group=permutation_group) + + +def overlap_search(code: CSSCode, fs_2b_permuted: npt.NDArray[np.int8], comp_faults: npt.NDArray[np.int8], permutation_group: list[Permutation]) -> dict[Permutation, list[npt.NDArray[np.int8]]]: + # HACK: Overlap search has 3 nested for loops, check for improvment + overlapping_faults : list[npt.NDArray[np.int8]] = [] + perm_overlap: dict[Permutation, list[npt.NDArray[np.int8]]] = {} + print(f"fault set to be permuted:\n{fs_2b_permuted}") + print(f"comparison fault set:\n{comp_faults}") for perm in permutation_group: - perm_fs = fault_set_1[:, perm.array_form] + perm_fs = fs_2b_permuted[:, perm.array_form] for pf in perm_fs: - for ff in original_faults: - if code.stabilizer_eq_x_error(pf, ff): + for ff in comp_faults: + if code.stabilizer_eq_x_error(pf,ff): # FIX: without this print statement append gets changed to extend on save print(f"permutation: {perm}") print(f"stabilizer equivalent error: \n{pf}(permuted) and \n{ff}(not permuted)") From 3d7529a98710ea672d8c72b1a83c73c0f2425a20 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 3 Mar 2025 16:00:09 +0100 Subject: [PATCH 014/156] update heuristic SPC function to allow guiding information --- src/mqt/qecc/circuit_synthesis/state_prep.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index c6f05a053..d64fa607f 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -220,7 +220,7 @@ def _build_state_prep_circuit_from_back( return build_css_circuit_from_cnot_list(checks.shape[1], cnots, list(hadamards)) -def heuristic_prep_circuit(code: CSSCode, optimize_depth: bool = True, zero_state: bool = True) -> StatePrepCircuit: +def heuristic_prep_circuit(code: CSSCode, optimize_depth: bool = True, zero_state: bool = True, penalty_cols: list[int] | None = None) -> StatePrepCircuit: """Return a circuit that prepares the +1 eigenstate of the code w.r.t. the Z or X basis. Args: @@ -228,6 +228,8 @@ def heuristic_prep_circuit(code: CSSCode, optimize_depth: bool = True, zero_stat optimize_depth: If True, optimize the depth of the circuit. This may lead to a higher number of CNOTs. zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. """ + if penalty_cols is None: + penalty_cols = [] logger.info("Starting heuristic state preparation.") if code.Hx is None or code.Hz is None: msg = "The code must have both X and Z stabilizers defined." @@ -235,7 +237,7 @@ def heuristic_prep_circuit(code: CSSCode, optimize_depth: bool = True, zero_stat checks = code.Hx if zero_state else code.Hz assert checks is not None - checks, cnots = heuristic_gaussian_elimination(checks, parallel_elimination=optimize_depth) + checks, cnots = heuristic_gaussian_elimination(checks, parallel_elimination=optimize_depth, penalty_cols=penalty_cols) circ = _build_state_prep_circuit_from_back(checks, cnots, zero_state) return StatePrepCircuit(circ, code, zero_state) @@ -264,6 +266,7 @@ def fs_disjunct_spc( assert checks is not None checks, cnots = heuristic_gaussian_elimination(checks, parallel_elimination=optimize_depth) # NOTE: everything above is code duplication from heuristic_prep_circuit() + # could this be simplified but then we would need an intermediate return of checks, cnots permutation_group = get_permutation_group(group_generators=automorph_generators) # BUG: I have those prints since the stateprep circuit below gives another fault set than the one From 9bac3af58556ead691fc12887f274c3685d2ca84 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 15:26:51 +0000 Subject: [PATCH 015/156] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mqt/qecc/circuit_synthesis/state_prep.py | 25 +++++++++++++------ .../qecc/circuit_synthesis/synthesis_utils.py | 1 + 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index d64fa607f..155337f16 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -220,7 +220,9 @@ def _build_state_prep_circuit_from_back( return build_css_circuit_from_cnot_list(checks.shape[1], cnots, list(hadamards)) -def heuristic_prep_circuit(code: CSSCode, optimize_depth: bool = True, zero_state: bool = True, penalty_cols: list[int] | None = None) -> StatePrepCircuit: +def heuristic_prep_circuit( + code: CSSCode, optimize_depth: bool = True, zero_state: bool = True, penalty_cols: list[int] | None = None +) -> StatePrepCircuit: """Return a circuit that prepares the +1 eigenstate of the code w.r.t. the Z or X basis. Args: @@ -237,7 +239,9 @@ def heuristic_prep_circuit(code: CSSCode, optimize_depth: bool = True, zero_stat checks = code.Hx if zero_state else code.Hz assert checks is not None - checks, cnots = heuristic_gaussian_elimination(checks, parallel_elimination=optimize_depth, penalty_cols=penalty_cols) + checks, cnots = heuristic_gaussian_elimination( + checks, parallel_elimination=optimize_depth, penalty_cols=penalty_cols + ) circ = _build_state_prep_circuit_from_back(checks, cnots, zero_state) return StatePrepCircuit(circ, code, zero_state) @@ -288,12 +292,19 @@ def fs_disjunct_spc( original_faults = fault_set_1 if stateprepcirc.code.distance == 7: original_faults = np.vstack(fault_set_1, fault_set_2) - return overlap_search(code=code, fs_2b_permuted=fault_set_1, comp_faults=original_faults, permutation_group=permutation_group) + return overlap_search( + code=code, fs_2b_permuted=fault_set_1, comp_faults=original_faults, permutation_group=permutation_group + ) -def overlap_search(code: CSSCode, fs_2b_permuted: npt.NDArray[np.int8], comp_faults: npt.NDArray[np.int8], permutation_group: list[Permutation]) -> dict[Permutation, list[npt.NDArray[np.int8]]]: - # HACK: Overlap search has 3 nested for loops, check for improvment - overlapping_faults : list[npt.NDArray[np.int8]] = [] +def overlap_search( + code: CSSCode, + fs_2b_permuted: npt.NDArray[np.int8], + comp_faults: npt.NDArray[np.int8], + permutation_group: list[Permutation], +) -> dict[Permutation, list[npt.NDArray[np.int8]]]: + # HACK: Overlap search has 3 nested for loops, check for improvement + overlapping_faults: list[npt.NDArray[np.int8]] = [] perm_overlap: dict[Permutation, list[npt.NDArray[np.int8]]] = {} print(f"fault set to be permuted:\n{fs_2b_permuted}") print(f"comparison fault set:\n{comp_faults}") @@ -301,7 +312,7 @@ def overlap_search(code: CSSCode, fs_2b_permuted: npt.NDArray[np.int8], comp_fau perm_fs = fs_2b_permuted[:, perm.array_form] for pf in perm_fs: for ff in comp_faults: - if code.stabilizer_eq_x_error(pf,ff): + if code.stabilizer_eq_x_error(pf, ff): # FIX: without this print statement append gets changed to extend on save print(f"permutation: {perm}") print(f"stabilizer equivalent error: \n{pf}(permuted) and \n{ff}(not permuted)") diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 825a88076..eebb0276a 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -106,6 +106,7 @@ def heuristic_gaussian_elimination( rank = mod2.rank(matrix) print(f"initial check matrix:\n{matrix}") print("----------------------------------") + def is_reduced() -> bool: return bool(len(np.where(np.all(matrix == 0, axis=0))[0]) == matrix.shape[1] - rank) From a15c6e1ea02814e5bf1574f991d2f61400483665 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 5 Mar 2025 11:05:03 +0100 Subject: [PATCH 016/156] add method to permute qubits of StatePreparationCircuit --- src/mqt/qecc/circuit_synthesis/state_prep.py | 26 +++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 155337f16..3e33c98c6 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -73,6 +73,28 @@ def __init__( self.max_x_measurements = len(self.x_checks) self.max_z_measurements = len(self.z_checks) + def permute_circ(self, permutation: list[int]) -> None: + """Permutes the qubits in the given quantum circuit according to the specified permutation. + + Args: + permutation (list): A list where the i-th element represents the new index of qubit i. + """ + num_qubits = self.circ.num_qubits + if sorted(permutation) != list(range(num_qubits)): + msg = "Invalid permutation. It must be a reordering of [0, ..., num_qubits-1]." + raise ValueError(msg) + + # Create a new circuit with the same number of qubits + permuted_circuit = QuantumCircuit(num_qubits) + + # Remap gates according to the permutation + for instruction in self.circ.data: + operation = instruction.operation # Gate operation + qubits = [permutation[self.circ.qubits.index(q)] for q in instruction.qubits] # Permuted qubits + permuted_circuit.append(operation, qubits) + + self.circ = permuted_circuit + def set_error_detection(self, error_detection: bool) -> None: """Set whether the state preparation circuit is for error detection.""" self.error_detection_code = error_detection @@ -229,6 +251,7 @@ def heuristic_prep_circuit( code: The CSS code to prepare the state for. optimize_depth: If True, optimize the depth of the circuit. This may lead to a higher number of CNOTs. zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. + penalty_cols: foobar """ if penalty_cols is None: penalty_cols = [] @@ -249,7 +272,7 @@ def heuristic_prep_circuit( def fs_disjunct_spc( code: CSSCode, automorph_generators: list[list[int]], optimize_depth: bool = True, zero_state: bool = True -) -> None: +) -> dict[Permutation, list[npt.NDArray[np.int8]]]: """Returns dictionary of permutations for the given QEC. This function takes a QEC and the corresponding strong automorphism group. It then checks every permutation and @@ -303,6 +326,7 @@ def overlap_search( comp_faults: npt.NDArray[np.int8], permutation_group: list[Permutation], ) -> dict[Permutation, list[npt.NDArray[np.int8]]]: + """Foobar.""" # HACK: Overlap search has 3 nested for loops, check for improvement overlapping_faults: list[npt.NDArray[np.int8]] = [] perm_overlap: dict[Permutation, list[npt.NDArray[np.int8]]] = {} From 3beda63aca7f12b080688e866d86d419165e00ef Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Wed, 5 Mar 2025 13:09:40 +0100 Subject: [PATCH 017/156] Ignore missing library stubs sympy. --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 3f0e4bd95..303966c3a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -199,7 +199,7 @@ exclude = [ [[tool.mypy.overrides]] module = ["qiskit.*", "qecsim.*", "qiskit_aer.*", "matplotlib.*", "scipy.*", "ldpc.*", "pytest_console_scripts.*", - "z3.*", "bposd.*", "numba.*", "pymatching.*", "stim.*", "multiprocess.*", "qsample.*", "pandas.*"] + "z3.*", "bposd.*", "numba.*", "pymatching.*", "stim.*", "multiprocess.*", "qsample.*", "pandas.*", "sympy.*"] ignore_missing_imports = true From 2481cbb7fc44de130e0dc23ebbabecc693bbf74d Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 5 Mar 2025 14:07:29 +0100 Subject: [PATCH 018/156] add method that checks overlap of fault sets to SPC class --- src/mqt/qecc/circuit_synthesis/state_prep.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 3e33c98c6..117b39007 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -228,6 +228,12 @@ def _set_max_errors(self) -> None: self.x_fault_sets_unreduced: list[npt.NDArray[np.int8] | None] = [None for _ in range(self.max_errors + 1)] self.z_fault_sets_unreduced: list[npt.NDArray[np.int8] | None] = [None for _ in range(self.max_errors + 1)] + def check_fs_overlap(self, fs_1: npt.NDArray[np.int8], fs_2: npt.NDArray[np.int8], x_error: bool = True) -> bool: + """Returns True if there is an overlap between both fault sets.""" + # TODO: add method docstring and argument descriptions + check_fn = self.code.stabilizer_eq_x_error if x_error else self.code.stabilizer_eq_z_error + return any(check_fn(f1, f2) for f1 in fs_1 for f2 in fs_2) + def _build_state_prep_circuit_from_back( checks: npt.NDArray[np.int8], cnots: list[tuple[int, int]], zero_state: bool = True From 79c60e36b1201d90723d5fa6d45a84f25f673cb9 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Fri, 7 Mar 2025 14:53:20 +0100 Subject: [PATCH 019/156] add function to check mutual disjunctness function takes two sets of state preparation circuits. one set of current spcs and one of potential spcs. It then check which of the potential new spcs has mutually disjoint fault set to all others. --- .../qecc/circuit_synthesis/synthesis_utils.py | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index eebb0276a..0e3de3743 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -20,6 +20,8 @@ import numpy.typing as npt from qiskit import AncillaQubit, ClBit, Qubit + from mqt.qecc.circuit_synthesis.state_prep import StatePrepCircuit + logger = logging.getLogger(__name__) @@ -96,6 +98,7 @@ def heuristic_gaussian_elimination( Args: matrix: The matrix to perform Gaussian elimination on. parallel_elimination: Whether to prioritize elimination steps that act on disjoint columns. + penalty_cols: indices of qubits whose CNOT connection shall occur earlier in the circuit Returns: The reduced matrix and a list of the elimination steps taken. The elimination steps are represented as tuples of the form (i, j) where i is the column being eliminated with and j is the column being eliminated. @@ -182,6 +185,83 @@ def get_permutation_group(group_generators: list[list[int]]) -> list[Permutation return list(g.generate()) +def check_mutually_disjointness_spcs( + c_spcs: list[StatePrepCircuit], p_spcs: list[StatePrepCircuit] +) -> list[StatePrepCircuit]: + """Check if potential SPCs have mutually disjoint fault set with all current SPCs. + + Take list of SPCs with already mutually disjoint fault sets and another list of potential candidates for new SPCs that + have a mutually disjoint fault set with all current SPCs. + + Args: + c_spcs: current SPCs that are already mutually disjoint in terms of fault sets + p_spcs: potential SPCs that shall be tested for mutually disjointness against the current set + """ + i = 0 + while i < len(p_spcs): + pspc = p_spcs[i] + px_fs, pz_fs = get_fs_based_on_d(pspc) + + # Check against *all* existing and newly added elements in c_spcs + for _spc in c_spcs: + # NOTE: for distance 5 and 7 we only compare against the 1 error fault set. + # This might need adjustments for different distances. + x_fs = _spc.compute_fault_set() + z_fs = _spc.compute_fault_set(x_errors=False) + if _spc.check_fs_overlap(x_fs, px_fs) or _spc.check_fs_overlap(z_fs, pz_fs): + break # Stop checking if there's an overlap + else: # No overlap found, so add pspc + c_spcs.append(pspc) + + i += 1 # Move to next element in p_spcs + return c_spcs + + +def get_fs_based_on_d(spc: StatePrepCircuit) -> tuple[npt.NDArray[np.int8]]: + """Get fault sets based on the code distance. + + Only the faults sets that are of interest for the fault tolerant state preparation are being returned. + Supported are code distance 5 and 7. + + Args: + spc: State Prep Circiut of which the fault set is to be returned. + + Returns: + tuple: first entry the x fault set and second entry the z fault set. + """ + + def compute_fault_sets(level: int = 1) -> tuple[npt.NDArray[np.int8]]: + """Helper function to compute fault sets at a given level.""" + spc.compute_fault_set(level) + spc.compute_fault_set(level, x_errors=False) + return spc.x_fault_sets[level], spc.z_fault_sets[level] + + def filter_fault_set(fault_set: npt.NDArray[np.int8], threshold: int) -> npt.NDArray[np.int8]: + """Filter fault sets based on a sum threshold.""" + return fault_set[np.where(fault_set.sum(axis=1) > threshold)] + + fault_set_x_1, fault_set_z_1 = compute_fault_sets(1) + + if spc.code.distance == 5: + return filter_fault_set(fault_set_x_1, 2), filter_fault_set(fault_set_z_1, 2) + + if spc.code.distance == 7: + fault_set_x_2, fault_set_z_2 = compute_fault_sets(2) + return ( + np.vstack([ + filter_fault_set(fault_set_x_1, 3), + filter_fault_set(fault_set_x_2, 3), + ]), + np.vstack([ + filter_fault_set(fault_set_z_1, 3), + filter_fault_set(fault_set_z_2, 3), + ]), + ) + + msg = f"Unsupported code distance: {spc.code.distance}" + raise ValueError(msg) + + def gaussian_elimination_min_column_ops( matrix: npt.NDArray[np.int8], termination_criteria: Callable[[Any], z3.BoolRef], From 924b1d20905ed00c85d5e6ee230a83773ea86b65 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Fri, 7 Mar 2025 14:56:59 +0100 Subject: [PATCH 020/156] add automorphism as optional property to CSSCode class --- src/mqt/qecc/codes/css_code.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/mqt/qecc/codes/css_code.py b/src/mqt/qecc/codes/css_code.py index 707b15fcb..36ef15896 100644 --- a/src/mqt/qecc/codes/css_code.py +++ b/src/mqt/qecc/codes/css_code.py @@ -7,6 +7,7 @@ import numpy as np from ldpc import mod2 +from sympy.combinatorics import Permutation, PermutationGroup from .pauli import StabilizerTableau from .stabilizer_code import StabilizerCode @@ -74,6 +75,25 @@ def __init__( self.Lx = CSSCode._compute_logical(self.Hz, self.Hx) self.Lz = CSSCode._compute_logical(self.Hx, self.Hz) + self._automorphism_generators: list[Permutation] | None = None + self._automorphism_group: list[Permutation] | None = None + + @property + def automorphism_group(self) -> list[Permutation]: + """Property for the automorphism group.""" + return self._automorphism_group + + @property + def automorphism_generators(self) -> list[Permutation]: + """Property for the automorphism generators.""" + return self._automorphism_generators + + @automorphism_group.setter + def automorphism_group(self, generators: list[list[int]]) -> None: + self._automorphism_generators = [Permutation(generator) for generator in generators] + g = PermutationGroup(self._automorphism_generators) + self._automorphism_group = list(g.generate()) + def x_checks_as_pauli_strings(self) -> list[str]: """Return the x checks as Pauli strings.""" return ["".join("X" if bit == 1 else "I" for bit in row) for row in self.Hx] From 92143b336ce00caefe9894aeec24509f7b3ecfb4 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Fri, 14 Mar 2025 12:22:01 +0100 Subject: [PATCH 021/156] Simulation steane ftsp (#383) ## Description This PR introduces a simulation class to simulate Steane-type fault-tolerant state preparation circuits using four circuits. Since this simulation method has a lot of overlapping functionality with our previous simulation setup, this PR also refactors the common functionality into the abstract class `NoisyNDFTStatePrepSimulator`. The implementation of the old simulator is now in `VerificationNDFTStatePrepSimulator`. ## Checklist: - [x] The pull request only contains commits that are related to it. - [x] I have added appropriate tests and documentation. - [ ] I have made sure that all CI jobs on GitHub pass. - [x] The pull request introduces no new warnings and follows the project's style guidelines. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/StatePrep.ipynb | 8 +- docs/library/StatePrep.rst | 4 +- .../eval/estimate_logical_error_rate.py | 4 +- scripts/ft_stateprep/eval/run_d7.py | 6 +- src/mqt/qecc/circuit_synthesis/__init__.py | 5 +- src/mqt/qecc/circuit_synthesis/simulation.py | 234 ++++++++++++++---- .../estimate_logical_error_rate.py | 4 +- .../qecc/circuit_synthesis/synthesis_utils.py | 20 +- .../circuit_synthesis/test_simulation.py | 53 ++-- 9 files changed, 247 insertions(+), 91 deletions(-) diff --git a/docs/StatePrep.ipynb b/docs/StatePrep.ipynb index 5be56de44..8e7c6e4e5 100644 --- a/docs/StatePrep.ipynb +++ b/docs/StatePrep.ipynb @@ -105,12 +105,12 @@ "metadata": {}, "outputs": [], "source": [ - "from mqt.qecc.circuit_synthesis import NoisyNDFTStatePrepSimulator\n", + "from mqt.qecc.circuit_synthesis import VerificationNDFTStatePrepSimulator\n", "\n", "p = 0.05\n", "\n", - "non_ft_simulator = NoisyNDFTStatePrepSimulator(non_ft_sp.circ, code=steane_code, zero_state=True, p=p)\n", - "ft_simulator = NoisyNDFTStatePrepSimulator(ft_sp, code=steane_code, zero_state=True, p=p)\n", + "non_ft_simulator = VerificationNDFTStatePrepSimulator(non_ft_sp.circ, code=steane_code, zero_state=True, p=p)\n", + "ft_simulator = VerificationNDFTStatePrepSimulator(ft_sp, code=steane_code, zero_state=True, p=p)\n", "\n", "\n", "pl_non_ft, ra_non_ft, _, _ = non_ft_simulator.logical_error_rate(min_errors=10)\n", @@ -245,7 +245,7 @@ "metadata": {}, "outputs": [], "source": [ - "cc_simulator = NoisyNDFTStatePrepSimulator(cc_ft_sp, code=cc, zero_state=True)\n", + "cc_simulator = VerificationNDFTStatePrepSimulator(cc_ft_sp, code=cc, zero_state=True)\n", "\n", "ps = [0.1, 0.05, 0.04, 0.03, 0.02, 0.01, 0.009, 0.008]\n", "\n", diff --git a/docs/library/StatePrep.rst b/docs/library/StatePrep.rst index 3b8b71646..f75a77ff5 100644 --- a/docs/library/StatePrep.rst +++ b/docs/library/StatePrep.rst @@ -23,9 +23,9 @@ If the optimal synthesis takes too long, the :func:`heuristic_verification_circu .. autofunction:: heuristic_verification_circuit -State preparation circuits can be simulated using the :class:`NoisyNDFTStatePrepSimulator` class. +State preparation circuits can be simulated using the :class:`VerificationNDFTStatePrepSimulator` class. - .. autoclass:: NoisyNDFTStatePrepSimulator + .. autoclass:: VerificationNDFTStatePrepSimulator :members: :math:`d<5` codes diff --git a/scripts/ft_stateprep/eval/estimate_logical_error_rate.py b/scripts/ft_stateprep/eval/estimate_logical_error_rate.py index 4c9b18ff8..217d5f291 100644 --- a/scripts/ft_stateprep/eval/estimate_logical_error_rate.py +++ b/scripts/ft_stateprep/eval/estimate_logical_error_rate.py @@ -9,7 +9,7 @@ from mqt.qecc import CSSCode from mqt.qecc.circuit_synthesis import ( - NoisyNDFTStatePrepSimulator, + VerificationNDFTStatePrepSimulator, gate_optimal_prep_circuit, gate_optimal_verification_circuit, heuristic_prep_circuit, @@ -91,7 +91,7 @@ def main() -> None: # load circuit from file qc = QuantumCircuit.from_qasm_file(prefix / code_name / circ_file) - sim = NoisyNDFTStatePrepSimulator( + sim = VerificationNDFTStatePrepSimulator( qc, code=code, p=args.p_error, diff --git a/scripts/ft_stateprep/eval/run_d7.py b/scripts/ft_stateprep/eval/run_d7.py index 5def7df51..84066f998 100644 --- a/scripts/ft_stateprep/eval/run_d7.py +++ b/scripts/ft_stateprep/eval/run_d7.py @@ -9,7 +9,7 @@ from qiskit import QuantumCircuit from mqt.qecc.circuit_synthesis import ( - NoisyNDFTStatePrepSimulator, + VerificationNDFTStatePrepSimulator, ) from mqt.qecc.codes import SquareOctagonColorCode @@ -31,7 +31,9 @@ def main() -> None: lut_path = (Path(__file__) / "../luts/decoder_488_7.pickle").resolve() with lut_path.open("rb") as f: lut = pickle.load(f) # noqa: S301 - sim = NoisyNDFTStatePrepSimulator(qc, code, decoder=lut, p=args.p_error, p_idle=args.p_idle_factor * args.p_error) + sim = VerificationNDFTStatePrepSimulator( + qc, code, decoder=lut, p=args.p_error, p_idle=args.p_idle_factor * args.p_error + ) res = sim.logical_error_rate(min_errors=args.n_errors) print(",".join([str(x) for x in [args.p_error, *res]])) diff --git a/src/mqt/qecc/circuit_synthesis/__init__.py b/src/mqt/qecc/circuit_synthesis/__init__.py index bab7f97d9..796eec750 100644 --- a/src/mqt/qecc/circuit_synthesis/__init__.py +++ b/src/mqt/qecc/circuit_synthesis/__init__.py @@ -3,7 +3,7 @@ from __future__ import annotations from .encoding import depth_optimal_encoding_circuit, gate_optimal_encoding_circuit, heuristic_encoding_circuit -from .simulation import LutDecoder, NoisyNDFTStatePrepSimulator +from .simulation import LutDecoder, SteaneNDFTStatePrepSimulator, VerificationNDFTStatePrepSimulator from .simulation_det import NoisyDFTStatePrepSimulator from .state_prep import ( StatePrepCircuit, @@ -24,8 +24,9 @@ "DeterministicVerificationHelper", "LutDecoder", "NoisyDFTStatePrepSimulator", - "NoisyNDFTStatePrepSimulator", "StatePrepCircuit", + "SteaneNDFTStatePrepSimulator", + "VerificationNDFTStatePrepSimulator", "depth_optimal_encoding_circuit", "depth_optimal_prep_circuit", "gate_optimal_encoding_circuit", diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 344920167..6e69f4819 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -9,9 +9,11 @@ import matplotlib.pyplot as plt import numpy as np import stim +from qiskit import ClassicalRegister from qiskit.converters import circuit_to_dag, dag_to_circuit from ..codes import InvalidCSSCodeError +from .synthesis_utils import support if TYPE_CHECKING: # pragma: no cover import numpy.typing as npt @@ -23,7 +25,7 @@ class NoisyNDFTStatePrepSimulator: - """Class for simulating noisy state preparation circuit using a depolarizing noise model.""" + """Abstract class for simulating noisy state preparation circuit using a depolarizing noise model.""" def __init__( self, @@ -52,17 +54,18 @@ def __init__( self.circ = state_prep_circ self.num_qubits = state_prep_circ.num_qubits + self.num_verification_qubits = 0 self.code = code self.p = p self.p_idle = p if p_idle is None else p_idle self.zero_state = zero_state + self.parallel_gates = parallel_gates # Store which measurements are X, Z or data measurements. # The indices refer to the indices of the measurements in the stim circuit. - self.x_verification_measurements: list[int] = [] - self.z_verification_measurements: list[int] = [] + self.stim_circ = stim.Circuit() + self.data_measurements: list[int] = [] self.x_measurements: list[int] = [] self.z_measurements: list[int] = [] - self.data_measurements: list[int] = [] self.parallel_gates = parallel_gates self.n_measurements = 0 self.stim_circ = stim.Circuit() @@ -70,38 +73,35 @@ def __init__( self.decoder = LutDecoder(code) else: self.decoder = decoder + self.set_p(p, p_idle) def set_p(self, p: float, p_idle: float | None = None) -> None: - """Set the error rate. + """Set the error rate and initialize the stim circuit. - This reinitializes the stim circuit. + This overwrites the previous stim circuit. Args: p: The error rate. p_idle: Idling error rate. If None, it is set to p. """ - self.x_verification_measurements = [] - self.z_verification_measurements = [] self.x_measurements = [] self.z_measurements = [] self.data_measurements = [] self.n_measurements = 0 self.p = p - self._reused_qubits = 0 self.p_idle = p if p_idle is None else p_idle self.stim_circ = self.to_stim_circ() - self.num_qubits = ( - self.stim_circ.num_qubits - - (len(self.x_verification_measurements) + len(self.z_verification_measurements)) - + self._reused_qubits - ) + self._compute_postselection_indices() self.measure_stabilizers() if self.zero_state: self.measure_z() else: self.measure_x() + def _compute_postselection_indices(self) -> None: + """Compute indices of measurements for postselection.""" + def to_stim_circ(self) -> stim.Circuit: """Convert a QuantumCircuit to a noisy STIM circuit. @@ -125,7 +125,7 @@ def idle_error(used_qubits: list[int]) -> None: layers = dag.layers() used_qubits: list[int] = [] targets = set() - measured: defaultdict[int, int] = defaultdict(int) + defaultdict(int) for layer in layers: layer_circ = dag_to_circuit(layer["graph"]) @@ -140,7 +140,6 @@ def idle_error(used_qubits: list[int]) -> None: ctrls.append(qubit) if initialized[qubit]: stim_circuit.append_operation("H", [qubit]) - # stim_circuit.append_operation("DEPOLARIZE1", [qubit], [self.p]) if not self.parallel_gates: idle_error([qubit]) else: @@ -172,19 +171,11 @@ def idle_error(used_qubits: list[int]) -> None: anc = self.circ.find_bit(gate.qubits[0])[0] stim_circuit.append_operation("X_ERROR", [anc], [2 * self.p / 3]) stim_circuit.append_operation("MR", [anc]) - if anc in targets: - self.z_verification_measurements.append(self.n_measurements) - else: - self.x_verification_measurements.append(self.n_measurements) - self.n_measurements += 1 if not self.parallel_gates: idle_error([anc]) else: used_qubits.append(anc) initialized[anc] = False - measured[anc] += 1 - if measured[anc] == 2: - self._reused_qubits += 1 return stim_circuit @@ -196,35 +187,37 @@ def measure_stabilizers(self) -> None: assert self.code.Hx is not None assert self.code.Hz is not None + anc = self.stim_circ.num_qubits + self.num_verification_qubits for check in self.code.Hx: - supp = _support(check) - anc = self.stim_circ.num_qubits + supp = support(check) + self.stim_circ.append_operation("H", [anc]) for q in supp: self.stim_circ.append_operation("CX", [anc, q]) self.stim_circ.append_operation("MRX", [anc]) self.x_measurements.append(self.n_measurements) self.n_measurements += 1 + anc += 1 for check in self.code.Hz: - supp = _support(check) - anc = self.stim_circ.num_qubits + supp = support(check) for q in supp: self.stim_circ.append_operation("CX", [q, anc]) self.stim_circ.append_operation("MRZ", [anc]) self.z_measurements.append(self.n_measurements) self.n_measurements += 1 + anc += 1 def measure_z(self) -> None: """Measure all data qubits in the Z basis.""" - self.data_measurements = [self.n_measurements + i for i in range(self.num_qubits)] - self.n_measurements += self.num_qubits + self.data_measurements = [self.n_measurements + i for i in range(self.code.n)] + self.n_measurements += self.code.n self.stim_circ.append_operation("MRZ", list(range(self.num_qubits))) def measure_x(self) -> None: """Measure all data qubits in the X basis.""" - self.data_measurements = [self.n_measurements + i for i in range(self.num_qubits)] - self.n_measurements += self.num_qubits + self.data_measurements = [self.n_measurements + i for i in range(self.code.n)] + self.n_measurements += self.code.n self.stim_circ.append_operation("MRX", list(range(self.num_qubits))) def logical_error_rate( @@ -275,21 +268,21 @@ def logical_error_rate( return p_l / self.code.k, r_a, num_logical_errors, i * batch + def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: + """Filter samples based on measurement outcomes. + + Args: + samples: The samples to filter. + + Returns: + npt.NDArray[np.int8]: The filtered samples. + """ + def _simulate_batch(self, shots: int = 1024) -> tuple[int, int]: sampler = self.stim_circ.compile_sampler() - detection_events = sampler.sample(shots) + detection_events = sampler.sample(shots).astype(np.int8) - # Filter events where the verification circuit flagged - verification_measurements = self.x_verification_measurements + self.z_verification_measurements - if self.check_logical_0: - # Compute dot products for all rows - dot_products = np.dot(detection_events[:, verification_measurements], self.code.Hx.T) % 2 - - # Find rows where all dot products are zero - index_array = np.where(np.all(dot_products == 0, axis=1))[0] - else: - index_array = np.where(np.all(detection_events[:, verification_measurements] == 0, axis=1))[0] - filtered_events = detection_events[index_array].astype(np.int8) + filtered_events = self._filter_runs(detection_events) if len(filtered_events) == 0: # All events were discarded return 0, shots @@ -357,6 +350,154 @@ def plot_state_prep( plt.tight_layout() +class VerificationNDFTStatePrepSimulator(NoisyNDFTStatePrepSimulator): + """Class for simulating noisy state preparation circuit using a depolarizing noise model.""" + + def __init__( + self, + state_prep_circ: QuantumCircuit, + code: CSSCode, + p: float = 0.0, + p_idle: float | None = None, + zero_state: bool = True, + parallel_gates: bool = True, + decoder: LutDecoder | None = None, + ) -> None: + """Initialize the simulator. + + Args: + state_prep_circ: The state preparation circuit. + code: The code to simulate. + p: The error rate. + p_idle: Idling error rate. If None, it is set to p. + zero_state: Whether thezero state is prepared or nor. + parallel_gates: Whether to allow for parallel execution of gates. + decoder: The decoder to use. + """ + self.z_verification_measurements: list[int] = [] + self.x_verification_measurements: list[int] = [] + super().__init__(state_prep_circ, code, p, p_idle, zero_state, parallel_gates, decoder) + + def _compute_postselection_indices(self) -> None: + """Compute the indices of the verification measurements.""" + dag = circuit_to_dag(self.circ) + layers = dag.layers() + targets = set() + for layer in layers: + layer_circ = dag_to_circuit(layer["graph"]) + + for gate in layer_circ.data: + if gate.operation.name == "cx": + target = self.circ.find_bit(gate.qubits[1])[0] + targets.add(target) + + elif gate.operation.name == "measure": + anc = self.circ.find_bit(gate.qubits[0])[0] + if anc in targets: + self.z_verification_measurements.append(self.n_measurements) + else: + self.x_verification_measurements.append(self.n_measurements) + self.n_measurements += 1 + + def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: + """Filter samples based on measurement outcomes. + + Args: + samples: The samples to filter. + + Returns: + npt.NDArray[np.int8]: The filtered samples. + """ + verification_measurements = self.x_verification_measurements + self.z_verification_measurements + index_array = np.where(np.all(samples[:, verification_measurements] == 0, axis=1))[0] + return samples[index_array].astype(np.int8) + + +class SteaneNDFTStatePrepSimulator(NoisyNDFTStatePrepSimulator): + """Class for simulating steane-type noisy state preparation circuit using a depolarizing noise model.""" + + def __init__( + self, + circ1: QuantumCircuit, + circ2: QuantumCircuit, + circ3: QuantumCircuit, + circ4: QuantumCircuit, + code: CSSCode, + p: float = 0.0, + p_idle: float | None = None, + zero_state: bool = True, + parallel_gates: bool = True, + decoder: LutDecoder | None = None, + ) -> None: + """Initialize the simulator. + + Builds the circuit for the Steane-type preparation protocol by connecting the four state preparation circuits using transversal CNOTs. + + + Args: + circ1: The first, state preparation circuit. + circ2: The second, state preparation circuit. + circ3: The third, state preparation circuit. + circ4: The fourth, state preparation circuit + code: The code to simulate. + p: The error rate. + p_idle: Idling error rate. If None, it is set to p. + zero_state: Whether thezero state is prepared or nor. + parallel_gates: Whether to allow for parallel execution of gates. + decoder: The decoder to use. + """ + circ2 = circ2.copy() + circ3 = circ3.copy() + circ4 = circ4.copy() + circ2.remove_final_measurements() + circ3.remove_final_measurements() + circ4.remove_final_measurements() + combined = circ4.tensor(circ3).tensor(circ2).tensor(circ1) + + combined.barrier() # need the barrier to retain order of measurements + # transversal cnots + combined.cx(range(code.n), range(code.n, 2 * code.n)) + combined.cx(range(2 * code.n, 3 * code.n), range(3 * code.n, 4 * code.n)) + combined.cx(range(2 * code.n, 3 * code.n), range(code.n)) + + combined.h(range(2 * code.n, 3 * code.n)) # second ancilla is measured in X basis + + cr = ClassicalRegister(3 * code.n, "c") + combined.add_register(cr) + combined.measure(range(code.n, 4 * code.n), cr) # measure out ancillas + + self.anc1: list[int] = [] + self.anc2: list[int] = [] + self.anc3: list[int] = [] + + super().__init__(combined, code, p, p_idle, zero_state, parallel_gates, decoder) + + def _compute_postselection_indices(self) -> None: + """Compute indices of measurements for postselection.""" + self.anc_1 = list(range(self.code.n)) + self.anc_2 = list(range(self.code.n, 2 * self.code.n)) + self.anc_3 = list(range(2 * self.code.n, 3 * self.code.n)) + self.n_measurements = 3 * self.code.n + + def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: + """Filter samples based on measurement outcomes. + + Args: + samples: The samples to filter. + + Returns: + npt.NDArray[np.int8]: The filtered samples. + """ + anc_1 = samples[:, self.anc_1] + anc_2 = samples[:, self.anc_2] + anc_3 = samples[:, self.anc_3] + check_anc_1 = (anc_1 @ self.code.Hx.T) % 2 + check_anc_2 = (anc_2 @ self.code.Hz.T) % 2 + check_anc_3 = (anc_3 @ self.code.Hx.T) % 2 + index_array = np.where(np.all(np.hstack((check_anc_1, check_anc_2, check_anc_3)) == 0, axis=1))[0] + return samples[index_array].astype(np.int8) + + class LutDecoder: """Lookup table decoder for a CSSCode.""" @@ -443,8 +584,3 @@ def _generate_lut(checks: npt.NDArray[np.int_]) -> dict[bytes, npt.NDArray[np.in lut[key] = np.array(v[0]) return lut - - -def _support(v: npt.NDArray[np.int_]) -> npt.NDArray[np.int_]: - """Return the support of a vector.""" - return np.where(v != 0)[0] diff --git a/src/mqt/qecc/circuit_synthesis/stateprep_eval/estimate_logical_error_rate.py b/src/mqt/qecc/circuit_synthesis/stateprep_eval/estimate_logical_error_rate.py index b6b13bde2..e98ffcd52 100644 --- a/src/mqt/qecc/circuit_synthesis/stateprep_eval/estimate_logical_error_rate.py +++ b/src/mqt/qecc/circuit_synthesis/stateprep_eval/estimate_logical_error_rate.py @@ -9,7 +9,7 @@ from mqt.qecc import CSSCode from mqt.qecc.circuit_synthesis import ( - NoisyNDFTStatePrepSimulator, + VerificationNDFTStatePrepSimulator, gate_optimal_prep_circuit, gate_optimal_verification_circuit, heuristic_prep_circuit, @@ -90,7 +90,7 @@ def main() -> None: # load circuit from file qc = QuantumCircuit.from_qasm_file(prefix / code_name / circ_file) - sim = NoisyNDFTStatePrepSimulator( + sim = VerificationNDFTStatePrepSimulator( qc, code=code, p=args.p_error, zero_state=args.zero_state, parallel_gates=not args.no_parallel_gates ) sim.logical_error_rate(min_errors=args.n_errors) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index ffc6438a0..fe24b3666 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -107,8 +107,6 @@ def heuristic_gaussian_elimination( penalty_cols = [] matrix = matrix.copy() rank = mod2.rank(matrix) - print(f"initial check matrix:\n{matrix}") - print("----------------------------------") def is_reduced() -> bool: return bool(len(np.where(np.all(matrix == 0, axis=0))[0]) == matrix.shape[1] - rank) @@ -143,12 +141,10 @@ def is_reduced() -> bool: costs -= np.sum(matrix, axis=0) np.fill_diagonal(costs, 1) else: # try to move onto the next layer - print("\nUsed COLUMN reset\n") used_columns = [] continue i, j = np.unravel_index(np.argmin(costs_unused), costs.shape) - print(f"eliminate column {j} with column {i}") eliminations.append((int(i), int(j))) if parallel_elimination: @@ -159,14 +155,9 @@ def is_reduced() -> bool: matrix[:, j] = (matrix[:, i] + matrix[:, j]) % 2 # update costs new_weights = np.sum((matrix[:, j][:, np.newaxis] + matrix) % 2, axis=0) - print(f"new weights:\n{new_weights}") - print(f"cost matrix before update:\n{costs}") costs[j, :] = new_weights - np.sum(matrix, axis=0) costs[:, j] = new_weights - np.sum(matrix[:, j]) - print(f"cost matrix after update:\n{costs}") np.fill_diagonal(costs, 1) - print(f"matrix after elimination:\n{matrix}") - print("----------------------------------") return matrix, eliminations @@ -1339,3 +1330,14 @@ def qiskit_to_stim_circuit(qc: QuantumCircuit) -> Circuit: msg = f"Unsupported gate: {op}" raise ValueError(msg) return stim_circuit + + +def support(v: npt.NDArray[np.int_]) -> npt.NDArray[np.int_]: + """Return the support of a vector. + + Args: + v: F2 vector + + Returns: Array of non-zero indices + """ + return np.where(v != 0)[0] diff --git a/test/python/circuit_synthesis/test_simulation.py b/test/python/circuit_synthesis/test_simulation.py index e91c93ec6..581792570 100644 --- a/test/python/circuit_synthesis/test_simulation.py +++ b/test/python/circuit_synthesis/test_simulation.py @@ -12,7 +12,8 @@ from mqt.qecc import CSSCode from mqt.qecc.circuit_synthesis import ( LutDecoder, - NoisyNDFTStatePrepSimulator, + SteaneNDFTStatePrepSimulator, + VerificationNDFTStatePrepSimulator, gate_optimal_verification_circuit, heuristic_prep_circuit, naive_verification_circuit, @@ -118,12 +119,7 @@ def test_non_ft_sim_zero(steane_code: CSSCode, non_ft_steane_zero: QuantumCircui tol = 5e-4 p = 1e-3 lower = 1e-4 - simulator = NoisyNDFTStatePrepSimulator( - non_ft_steane_zero, - steane_code, - p=p, - p_idle=p * 0.01, - ) + simulator = VerificationNDFTStatePrepSimulator(non_ft_steane_zero, steane_code, p=p, p_idle=p * 0.01) p_l, _, _, _ = simulator.logical_error_rate(min_errors=10) assert p_l - tol > lower @@ -135,12 +131,7 @@ def test_ft_sim_zero(steane_code: CSSCode, ft_steane_zero: QuantumCircuit) -> No tol = 5e-4 p = 1e-3 lower = 1e-4 - simulator = NoisyNDFTStatePrepSimulator( - ft_steane_zero, - steane_code, - p=p, - p_idle=p * 0.01, - ) + simulator = VerificationNDFTStatePrepSimulator(ft_steane_zero, steane_code, p=p, p_idle=p * 0.01) p_l, _, _, _ = simulator.logical_error_rate(min_errors=10) assert p_l - tol < lower @@ -151,8 +142,8 @@ def test_non_ft_sim_plus(steane_code: CSSCode, non_ft_steane_plus: QuantumCircui tol = 5e-4 p = 1e-3 lower = 1e-4 - simulator = NoisyNDFTStatePrepSimulator( - non_ft_steane_plus, steane_code, p=p, p_idle=p * 0.01, zero_state=False, decoder=steane_lut + simulator = VerificationNDFTStatePrepSimulator( + non_ft_steane_plus, steane_code, p=p, p_idle=p * 0.01, zero_state=False ) p_l, _, _, _ = simulator.logical_error_rate(min_errors=10) @@ -165,9 +156,9 @@ def test_ft_sim_plus(steane_code: CSSCode, ft_steane_plus: QuantumCircuit, stean tol = 5e-4 p = 1e-3 lower = 1e-4 - simulator = NoisyNDFTStatePrepSimulator( - ft_steane_plus, steane_code, p=p, p_idle=p * 0.01, zero_state=False, decoder=steane_lut - ) + + simulator = VerificationNDFTStatePrepSimulator(ft_steane_plus, steane_code, p=p, p_idle=p * 0.01, zero_state=False) + p_l, _, _, _ = simulator.logical_error_rate(min_errors=10) assert p_l - tol < lower @@ -180,9 +171,33 @@ def test_naive_verification_circuit_with_flags( tol = 5e-4 p = 1e-3 lower = 1e-4 - simulator = NoisyNDFTStatePrepSimulator( + simulator = VerificationNDFTStatePrepSimulator( ft_steane_zero_naive, steane_code, p=p, p_idle=p * 0.01, zero_state=True, decoder=steane_lut ) + p_l, _, _, _ = simulator.logical_error_rate(min_errors=10) assert p_l - tol < lower + + +def test_steane_type_ftsp_trivial(steane_code: CSSCode, non_ft_steane_zero) -> None: + """Test state preparation using Steane-type verification. + + This is overkill for the Steane code but this is just for testing purposes. + """ + tol = 5e-3 + p = 1e-2 + lower = 1e-2 + simulator = SteaneNDFTStatePrepSimulator( + non_ft_steane_zero, + non_ft_steane_zero, + non_ft_steane_zero, + non_ft_steane_zero, + steane_code, + p=p, + p_idle=p * 0.01, + zero_state=True, + ) + p_l, _, _, _ = simulator.logical_error_rate(min_errors=100) + + assert p_l - tol < lower From 1e97ab1449fbc547dec619cc3a0bac2b62112be2 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Fri, 14 Mar 2025 12:36:54 +0100 Subject: [PATCH 022/156] Allow steane-type FTSP with only two circuits. --- src/mqt/qecc/circuit_synthesis/simulation.py | 82 +++++++++++++------ .../circuit_synthesis/test_simulation.py | 10 ++- 2 files changed, 64 insertions(+), 28 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 6e69f4819..a058deb45 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -9,7 +9,7 @@ import matplotlib.pyplot as plt import numpy as np import stim -from qiskit import ClassicalRegister +from qiskit import ClassicalRegister, QuantumCircuit from qiskit.converters import circuit_to_dag, dag_to_circuit from ..codes import InvalidCSSCodeError @@ -17,7 +17,6 @@ if TYPE_CHECKING: # pragma: no cover import numpy.typing as npt - from qiskit import QuantumCircuit from ..codes import CSSCode @@ -420,9 +419,9 @@ def __init__( self, circ1: QuantumCircuit, circ2: QuantumCircuit, - circ3: QuantumCircuit, - circ4: QuantumCircuit, code: CSSCode, + circ3: QuantumCircuit | None = None, + circ4: QuantumCircuit | None = None, p: float = 0.0, p_idle: float | None = None, zero_state: bool = True, @@ -434,6 +433,8 @@ def __init__( Builds the circuit for the Steane-type preparation protocol by connecting the four state preparation circuits using transversal CNOTs. + If only two circuits are given, than a single transversal CNOT and check are performed. + Args: circ1: The first, state preparation circuit. circ2: The second, state preparation circuit. @@ -446,38 +447,66 @@ def __init__( parallel_gates: Whether to allow for parallel execution of gates. decoder: The decoder to use. """ - circ2 = circ2.copy() - circ3 = circ3.copy() - circ4 = circ4.copy() + if (circ3 is None and circ4 is not None) or (circ3 is not None and circ4 is None): + msg = "Only two or four circuits are supported." + raise ValueError(msg) + + self.has_one_ancilla = circ3 is None + + if self.has_one_ancilla: + circ3 = QuantumCircuit() + circ4 = QuantumCircuit() + else: + assert circ3 is not None + assert circ4 is not None + circ3 = circ3.copy() + circ4 = circ4.copy() + circ2.remove_final_measurements() circ3.remove_final_measurements() circ4.remove_final_measurements() + combined = circ4.tensor(circ3).tensor(circ2).tensor(circ1) combined.barrier() # need the barrier to retain order of measurements # transversal cnots - combined.cx(range(code.n), range(code.n, 2 * code.n)) - combined.cx(range(2 * code.n, 3 * code.n), range(3 * code.n, 4 * code.n)) - combined.cx(range(2 * code.n, 3 * code.n), range(code.n)) - combined.h(range(2 * code.n, 3 * code.n)) # second ancilla is measured in X basis + if self.has_one_ancilla: + if zero_state: + combined.cx(range(code.n), range(code.n, 2 * code.n)) + else: + combined.cx(range(code.n, 2 * code.n), range(code.n)) + + else: + combined.cx(range(code.n), range(code.n, 2 * code.n)) + combined.cx(range(2 * code.n, 3 * code.n), range(3 * code.n, 4 * code.n)) + combined.cx(range(2 * code.n, 3 * code.n), range(code.n)) + + combined.h(range(2 * code.n, 3 * code.n)) # second ancilla is measured in X basis - cr = ClassicalRegister(3 * code.n, "c") + n_measured = 3 * code.n if not self.has_one_ancilla else code.n + cr = ClassicalRegister(n_measured, "c") combined.add_register(cr) - combined.measure(range(code.n, 4 * code.n), cr) # measure out ancillas + if self.has_one_ancilla: + combined.measure(range(code.n, 2 * code.n), cr) + else: + combined.measure(range(code.n, 4 * code.n), cr) - self.anc1: list[int] = [] - self.anc2: list[int] = [] - self.anc3: list[int] = [] + self.anc_1: list[int] = [] + self.anc_2: list[int] = [] + self.anc_3: list[int] = [] super().__init__(combined, code, p, p_idle, zero_state, parallel_gates, decoder) def _compute_postselection_indices(self) -> None: """Compute indices of measurements for postselection.""" self.anc_1 = list(range(self.code.n)) - self.anc_2 = list(range(self.code.n, 2 * self.code.n)) - self.anc_3 = list(range(2 * self.code.n, 3 * self.code.n)) - self.n_measurements = 3 * self.code.n + if not self.has_one_ancilla: + self.anc_2 = list(range(self.code.n, 2 * self.code.n)) + self.anc_3 = list(range(2 * self.code.n, 3 * self.code.n)) + self.n_measurements = 3 * self.code.n + else: + self.n_measurements = self.code.n def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: """Filter samples based on measurement outcomes. @@ -489,12 +518,17 @@ def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: npt.NDArray[np.int8]: The filtered samples. """ anc_1 = samples[:, self.anc_1] - anc_2 = samples[:, self.anc_2] - anc_3 = samples[:, self.anc_3] check_anc_1 = (anc_1 @ self.code.Hx.T) % 2 - check_anc_2 = (anc_2 @ self.code.Hz.T) % 2 - check_anc_3 = (anc_3 @ self.code.Hx.T) % 2 - index_array = np.where(np.all(np.hstack((check_anc_1, check_anc_2, check_anc_3)) == 0, axis=1))[0] + + if not self.has_one_ancilla: + anc_2 = samples[:, self.anc_2] + anc_3 = samples[:, self.anc_3] + + check_anc_2 = (anc_2 @ self.code.Hz.T) % 2 + check_anc_3 = (anc_3 @ self.code.Hx.T) % 2 + index_array = np.where(np.all(np.hstack((check_anc_1, check_anc_2, check_anc_3)) == 0, axis=1))[0] + else: + index_array = np.where(np.all(check_anc_1 == 0, axis=1))[0] return samples[index_array].astype(np.int8) diff --git a/test/python/circuit_synthesis/test_simulation.py b/test/python/circuit_synthesis/test_simulation.py index 581792570..9f165a57c 100644 --- a/test/python/circuit_synthesis/test_simulation.py +++ b/test/python/circuit_synthesis/test_simulation.py @@ -143,7 +143,7 @@ def test_non_ft_sim_plus(steane_code: CSSCode, non_ft_steane_plus: QuantumCircui p = 1e-3 lower = 1e-4 simulator = VerificationNDFTStatePrepSimulator( - non_ft_steane_plus, steane_code, p=p, p_idle=p * 0.01, zero_state=False + non_ft_steane_plus, steane_code, p=p, p_idle=p * 0.01, zero_state=False, decoder=steane_lut ) p_l, _, _, _ = simulator.logical_error_rate(min_errors=10) @@ -157,7 +157,9 @@ def test_ft_sim_plus(steane_code: CSSCode, ft_steane_plus: QuantumCircuit, stean p = 1e-3 lower = 1e-4 - simulator = VerificationNDFTStatePrepSimulator(ft_steane_plus, steane_code, p=p, p_idle=p * 0.01, zero_state=False) + simulator = VerificationNDFTStatePrepSimulator( + ft_steane_plus, steane_code, p=p, p_idle=p * 0.01, zero_state=False, decoder=steane_lut + ) p_l, _, _, _ = simulator.logical_error_rate(min_errors=10) @@ -180,7 +182,7 @@ def test_naive_verification_circuit_with_flags( assert p_l - tol < lower -def test_steane_type_ftsp_trivial(steane_code: CSSCode, non_ft_steane_zero) -> None: +def test_steane_type_ftsp_trivial(steane_code: CSSCode, non_ft_steane_zero: QuantumCircuit) -> None: """Test state preparation using Steane-type verification. This is overkill for the Steane code but this is just for testing purposes. @@ -191,9 +193,9 @@ def test_steane_type_ftsp_trivial(steane_code: CSSCode, non_ft_steane_zero) -> N simulator = SteaneNDFTStatePrepSimulator( non_ft_steane_zero, non_ft_steane_zero, + steane_code, non_ft_steane_zero, non_ft_steane_zero, - steane_code, p=p, p_idle=p * 0.01, zero_state=True, From c18c07e6a392cd988c95cd27a44f75969e2ffc2f Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Fri, 14 Mar 2025 14:22:18 +0100 Subject: [PATCH 023/156] Synthesis of state prep circuits in standard form. --- src/mqt/qecc/circuit_synthesis/__init__.py | 2 + src/mqt/qecc/circuit_synthesis/state_prep.py | 44 ++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/mqt/qecc/circuit_synthesis/__init__.py b/src/mqt/qecc/circuit_synthesis/__init__.py index 796eec750..95a3e7503 100644 --- a/src/mqt/qecc/circuit_synthesis/__init__.py +++ b/src/mqt/qecc/circuit_synthesis/__init__.py @@ -15,6 +15,7 @@ heuristic_verification_circuit, heuristic_verification_stabilizers, naive_verification_circuit, + standard_form_prep_circuit, ) from .state_prep_det import DeterministicVerification, DeterministicVerificationHelper from .synthesis_utils import qiskit_to_stim_circuit @@ -39,4 +40,5 @@ "heuristic_verification_stabilizers", "naive_verification_circuit", "qiskit_to_stim_circuit", + "standard_form_prep_circuit", ] diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 4ab8a22b5..284811e49 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -427,6 +427,50 @@ def gate_optimal_prep_circuit( return StatePrepCircuit(circ, code, zero_state) +def standard_form_prep_circuit(code: CSSCode, zero_state: bool = True) -> StatePrepCircuit: + """Return a circuit that prepares the +1 eigenstate of the code w.r.t. the Z or X basis using the circuit's standard form. + + Note that no depth optimization like Steane's latin rectangle method is performed. + + Args: + code: The CSS code to prepare the state for. + zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. + + Returns: A state preparation circuit for the code. + """ + h = code.Hx.copy() if zero_state else code.Hz.copy() + _h_red, _rk, _, _pivots = mod2.row_echelon(h, full=True) + cnots = _standard_form_cnots(code, zero_state) + qc = QuantumCircuit(code.n) + cnots = _standard_form_cnots(code, zero_state) + + for pivot, trgts in cnots: + qc.h(pivot) + qc.cx(pivot, trgts) + return StatePrepCircuit(qc, code, zero_state) + + +def _standard_form_cnots(code: CSSCode, zero_state: bool = True) -> list[tuple[int, list[int]]]: + """Return the cnots that prepare the +1 eigenstate of the code w.r.t. the Z or X basis using the circuit's standard form. + + Args: + code: The CSS code to prepare the state for. + zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. + + Returns: A list of ctrl, targets tuples + """ + h = code.Hx.copy() if zero_state else code.Hz.copy() + h_red, _rk, _, pivots = mod2.row_echelon(h, full=True) + + cnots = [] + for i, pivot in enumerate(pivots): + trgts = list(np.where(h_red[i, :])[0]) + trgts.remove(pivot) + cnots.append((pivot, trgts)) + + return cnots + + def gate_optimal_verification_stabilizers( sp_circ: StatePrepCircuit, x_errors: bool = True, From ef661146d6dc53752fe572827b50b69f3ac74afa Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Sat, 15 Mar 2025 11:22:27 +0100 Subject: [PATCH 024/156] Checks in simulation dependent on state. --- src/mqt/qecc/circuit_synthesis/simulation.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index a058deb45..68216f4f3 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -496,6 +496,9 @@ def __init__( self.anc_2: list[int] = [] self.anc_3: list[int] = [] + self.x_checks = code.Hx if zero_state else np.vstack((code.Hx, code.Lx)) + self.z_checks = code.Hz if not zero_state else np.vstack((code.Hz, code.Lz)) + super().__init__(combined, code, p, p_idle, zero_state, parallel_gates, decoder) def _compute_postselection_indices(self) -> None: @@ -518,14 +521,14 @@ def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: npt.NDArray[np.int8]: The filtered samples. """ anc_1 = samples[:, self.anc_1] - check_anc_1 = (anc_1 @ self.code.Hx.T) % 2 + check_anc_1 = (anc_1 @ self.z_checks.T) % 2 if not self.has_one_ancilla: anc_2 = samples[:, self.anc_2] anc_3 = samples[:, self.anc_3] - check_anc_2 = (anc_2 @ self.code.Hz.T) % 2 - check_anc_3 = (anc_3 @ self.code.Hx.T) % 2 + check_anc_2 = (anc_2 @ self.x_checks.T) % 2 + check_anc_3 = (anc_3 @ self.z_checks.T) % 2 index_array = np.where(np.all(np.hstack((check_anc_1, check_anc_2, check_anc_3)) == 0, axis=1))[0] else: index_array = np.where(np.all(check_anc_1 == 0, axis=1))[0] From 52d2095a3adcfcaaeed1cf369332e21952d79f61 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 17 Mar 2025 13:47:37 +0100 Subject: [PATCH 025/156] remove debug prints --- src/mqt/qecc/circuit_synthesis/state_prep.py | 2 ++ src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 9 --------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 117b39007..4b151cf69 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -74,6 +74,8 @@ def __init__( self.max_z_measurements = len(self.z_checks) def permute_circ(self, permutation: list[int]) -> None: + # TODO: add functionality that resets e.g. the fault sets + # are there other properties that need to be reset? """Permutes the qubits in the given quantum circuit according to the specified permutation. Args: diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 0e3de3743..012fc959d 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -107,8 +107,6 @@ def heuristic_gaussian_elimination( penalty_cols = [] matrix = matrix.copy() rank = mod2.rank(matrix) - print(f"initial check matrix:\n{matrix}") - print("----------------------------------") def is_reduced() -> bool: return bool(len(np.where(np.all(matrix == 0, axis=0))[0]) == matrix.shape[1] - rank) @@ -143,12 +141,10 @@ def is_reduced() -> bool: costs -= np.sum(matrix, axis=0) np.fill_diagonal(costs, 1) else: # try to move onto the next layer - print("\nUsed COLUMN reset\n") used_columns = [] continue i, j = np.unravel_index(np.argmin(costs_unused), costs.shape) - print(f"eliminate column {j} with column {i}") eliminations.append((int(i), int(j))) if parallel_elimination: @@ -159,14 +155,9 @@ def is_reduced() -> bool: matrix[:, j] = (matrix[:, i] + matrix[:, j]) % 2 # update costs new_weights = np.sum((matrix[:, j][:, np.newaxis] + matrix) % 2, axis=0) - print(f"new weights:\n{new_weights}") - print(f"cost matrix before update:\n{costs}") costs[j, :] = new_weights - np.sum(matrix, axis=0) costs[:, j] = new_weights - np.sum(matrix[:, j]) - print(f"cost matrix after update:\n{costs}") np.fill_diagonal(costs, 1) - print(f"matrix after elimination:\n{matrix}") - print("----------------------------------") return matrix, eliminations From 1d6e0dd86194a0c92d57b69fe35957ce64fa694f Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 18 Mar 2025 13:41:24 +0100 Subject: [PATCH 026/156] set up eval directory structure --- .../ft_stateprep/eval_circ_mod/cc_4_8_8.csv | 1 + .../circuits/cc_4_8_8/cc_4_8_8_heuristic_0 | 34 ++++++++ .../circuits/cc_4_8_8/cc_4_8_8_heuristic_1 | 34 ++++++++ .../circuits/cc_4_8_8/cc_4_8_8_heuristic_2 | 34 ++++++++ .../circuits/cc_4_8_8/cc_4_8_8_heuristic_3 | 34 ++++++++ .../circuits/cc_6_6_6/cc_6_6_6_heuristic_0 | 39 +++++++++ .../circuits/cc_6_6_6/cc_6_6_6_heuristic_1 | 39 +++++++++ .../circuits/cc_6_6_6/cc_6_6_6_heuristic_2 | 39 +++++++++ .../estimate_logical_error_rate.py | 82 +++++++++++++++++++ .../eval_circ_mod/run_eval_on_code.sh | 17 ++++ 10 files changed, 353 insertions(+) create mode 100644 scripts/ft_stateprep/eval_circ_mod/cc_4_8_8.csv create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_0 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_1 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_2 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_3 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_0 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_1 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_2 create mode 100644 scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py create mode 100755 scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh diff --git a/scripts/ft_stateprep/eval_circ_mod/cc_4_8_8.csv b/scripts/ft_stateprep/eval_circ_mod/cc_4_8_8.csv new file mode 100644 index 000000000..14440f142 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/cc_4_8_8.csv @@ -0,0 +1 @@ +p p_l acceptance errors runs diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_0 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_0 new file mode 100644 index 000000000..e9d889887 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_0 @@ -0,0 +1,34 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[17]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[9]; +h q[10]; +h q[12]; +cx q[10],q[15]; +cx q[4],q[7]; +cx q[2],q[16]; +cx q[9],q[15]; +cx q[7],q[8]; +cx q[4],q[5]; +cx q[3],q[14]; +cx q[2],q[6]; +cx q[12],q[9]; +cx q[10],q[13]; +cx q[8],q[11]; +cx q[5],q[6]; +cx q[3],q[7]; +cx q[1],q[4]; +cx q[0],q[2]; +cx q[12],q[5]; +cx q[1],q[13]; +cx q[0],q[3]; +cx q[15],q[8]; +cx q[9],q[11]; +cx q[7],q[16]; +cx q[4],q[10]; +cx q[2],q[14]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_1 new file mode 100644 index 000000000..b0d89c145 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_1 @@ -0,0 +1,34 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[17]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[5]; +cx q[4],q[8]; +cx q[4],q[6]; +cx q[2],q[6]; +cx q[0],q[2]; +cx q[4],q[7]; +cx q[1],q[4]; +h q[9]; +h q[10]; +cx q[5],q[12]; +cx q[8],q[5]; +cx q[3],q[14]; +cx q[3],q[7]; +cx q[0],q[3]; +cx q[10],q[15]; +cx q[10],q[13]; +cx q[1],q[13]; +cx q[4],q[10]; +cx q[9],q[15]; +cx q[15],q[8]; +cx q[9],q[11]; +cx q[12],q[9]; +cx q[5],q[11]; +cx q[14],q[16]; +cx q[2],q[14]; +cx q[6],q[16]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_2 new file mode 100644 index 000000000..830bbc790 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_2 @@ -0,0 +1,34 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[17]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[5]; +h q[9]; +h q[13]; +cx q[13],q[15]; +cx q[4],q[8]; +cx q[9],q[15]; +cx q[8],q[10]; +cx q[5],q[12]; +cx q[4],q[7]; +cx q[3],q[14]; +cx q[2],q[6]; +cx q[14],q[16]; +cx q[9],q[11]; +cx q[8],q[6]; +cx q[4],q[5]; +cx q[3],q[7]; +cx q[1],q[13]; +cx q[0],q[2]; +cx q[12],q[9]; +cx q[1],q[4]; +cx q[0],q[3]; +cx q[15],q[8]; +cx q[13],q[10]; +cx q[6],q[16]; +cx q[5],q[11]; +cx q[2],q[14]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_3 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_3 new file mode 100644 index 000000000..1f87fe4f1 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_3 @@ -0,0 +1,34 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[17]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[9]; +h q[10]; +h q[12]; +cx q[10],q[15]; +cx q[4],q[7]; +cx q[9],q[15]; +cx q[7],q[8]; +cx q[4],q[5]; +cx q[3],q[14]; +cx q[2],q[6]; +cx q[14],q[16]; +cx q[12],q[9]; +cx q[10],q[13]; +cx q[8],q[11]; +cx q[5],q[6]; +cx q[3],q[7]; +cx q[1],q[4]; +cx q[0],q[2]; +cx q[12],q[5]; +cx q[1],q[13]; +cx q[0],q[3]; +cx q[15],q[8]; +cx q[9],q[11]; +cx q[6],q[16]; +cx q[4],q[10]; +cx q[2],q[14]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_0 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_0 new file mode 100644 index 000000000..c2f47c95e --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_0 @@ -0,0 +1,39 @@ +OPENQASM 3.0; +include "stdgates.inc"; +qubit[19] q; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[5]; +h q[10]; +h q[14]; +h q[17]; +cx q[3], q[11]; +cx q[4], q[13]; +cx q[2], q[16]; +cx q[1], q[15]; +cx q[0], q[3]; +cx q[11], q[12]; +cx q[10], q[18]; +cx q[4], q[8]; +cx q[1], q[7]; +cx q[0], q[16]; +cx q[3], q[6]; +cx q[17], q[12]; +cx q[14], q[0]; +cx q[11], q[7]; +cx q[10], q[13]; +cx q[8], q[9]; +cx q[5], q[2]; +cx q[4], q[3]; +cx q[1], q[6]; +cx q[17], q[18]; +cx q[14], q[15]; +cx q[5], q[9]; +cx q[16], q[4]; +cx q[13], q[11]; +cx q[12], q[10]; +cx q[2], q[8]; +cx q[0], q[1]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_1 new file mode 100644 index 000000000..bef1dffb2 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_1 @@ -0,0 +1,39 @@ +OPENQASM 3.0; +include "stdgates.inc"; +qubit[19] q; +h q[1]; +h q[3]; +h q[5]; +cx q[3], q[6]; +cx q[6], q[0]; +h q[8]; +cx q[8], q[2]; +h q[9]; +cx q[9], q[3]; +cx q[3], q[4]; +h q[11]; +cx q[11], q[7]; +cx q[11], q[10]; +cx q[11], q[3]; +cx q[10], q[12]; +h q[14]; +cx q[14], q[0]; +cx q[1], q[15]; +cx q[1], q[7]; +cx q[0], q[1]; +cx q[14], q[15]; +cx q[8], q[16]; +cx q[6], q[16]; +cx q[7], q[6]; +cx q[8], q[4]; +h q[17]; +h q[18]; +cx q[18], q[13]; +cx q[17], q[18]; +cx q[17], q[12]; +cx q[18], q[10]; +cx q[9], q[13]; +cx q[13], q[11]; +cx q[5], q[9]; +cx q[5], q[2]; +cx q[9], q[8]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_2 new file mode 100644 index 000000000..7c77eddc1 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_2 @@ -0,0 +1,39 @@ +OPENQASM 3.0; +include "stdgates.inc"; +qubit[19] q; +h q[12]; +h q[10]; +h q[15]; +h q[3]; +h q[6]; +h q[14]; +h q[8]; +h q[17]; +h q[5]; +cx q[3], q[4]; +cx q[6], q[16]; +cx q[15], q[7]; +cx q[10], q[18]; +cx q[12], q[3]; +cx q[4], q[9]; +cx q[8], q[2]; +cx q[6], q[1]; +cx q[10], q[13]; +cx q[12], q[7]; +cx q[3], q[11]; +cx q[5], q[9]; +cx q[17], q[12]; +cx q[4], q[13]; +cx q[8], q[16]; +cx q[1], q[0]; +cx q[14], q[15]; +cx q[6], q[3]; +cx q[10], q[11]; +cx q[5], q[2]; +cx q[17], q[18]; +cx q[14], q[0]; +cx q[7], q[6]; +cx q[16], q[4]; +cx q[9], q[8]; +cx q[15], q[1]; +cx q[12], q[10]; diff --git a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py new file mode 100644 index 000000000..4281b0b55 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py @@ -0,0 +1,82 @@ +"""Estimate logical error rate for CSS state preparation circuits for a given code and physical error rate.""" + +from __future__ import annotations + +import argparse +from pathlib import Path + +from qiskit import QuantumCircuit + +from mqt.qecc import CSSCode +from mqt.qecc.circuit_synthesis.simulation import SteaneNDFTStatePrepSimulator +from mqt.qecc.codes import HexagonalColorCode, SquareOctagonColorCode + + +def main() -> None: + """Run the logical error rate estimation for a given code and physical error rate.""" + available_codes = ["steane", "tetrahedral", "shor", "surface", "cc_4_8_8", "cc_6_6_6", "hamming", "carbon"] + parser = argparse.ArgumentParser(description="Estimate logical error rate for CSS state preparation circuits") + parser.add_argument( + "code", + type=str, + help="Code for which to estimate logical error rate. Available codes: " + ", ".join(available_codes), + ) + parser.add_argument("-p", "--p_error", type=float, help="Physical error rate") + parser.add_argument("-p_idle_factor", "--p_idle_factor", type=float, default=0.01, help="Idling error rate") + parser.add_argument("--zero_state", default=True, action="store_true", help="Synthesize logical |0> state.") + parser.add_argument( + "--plus_state", default=False, dest="zero_state", action="store_false", help="Synthesize logical |+> state." + ) + parser.add_argument("-n", "--n_errors", type=int, default=500, help="Number of errors to sample") + parser.add_argument( + "-d", "--distance", type=int, default=3, help="Code Distance (only required for surface and color codes)" + ) + + args = parser.parse_args() + code_name = args.code + if "surface" in code_name: + d = args.distance + code = CSSCode.from_code_name("surface", d) + code_name = f"rotated_surface_d{d}" + elif "cc_4_8_8" in code_name: + d = 5 + code = SquareOctagonColorCode(d) + elif "cc_6_6_6" in code_name: + d = 5 + code = HexagonalColorCode(d) + elif code_name in available_codes: + code = CSSCode.from_code_name(code_name) + else: + raise ValueError("Code " + code_name + " not available. Available codes: " + ", ".join(available_codes)) + + prefix = (Path(__file__) / "../circuits/").resolve() + circ_file_core = f"{code_name}_heuristic_" + + # check if file exists + # if not (prefix / code_name / circ_file).exists(): + # # create circuit + # # NOTE: error message for missing circuits + # pass + # else: + circuits = [] + # load circuit from file + for _id in [0, 1, 2, 3] if code_name == "c_4_8_8" else [0, 1, 2]: + circ_file = circ_file_core + str(_id) + circuits.append(QuantumCircuit.from_qasm_file(prefix / code_name / circ_file)) + + sim = SteaneNDFTStatePrepSimulator( + circ1=circuits[0], + circ2=circuits[1], + code=code, + circ3=circuits[2], + circ4=circuits[3] if code_name == "c_4_8_8" else circuits[2], + p=args.p_error, + p_idle=args.p_idle_factor * args.p_error, + zero_state=args.zero_state, + ) + res = sim.logical_error_rate(shots=10000, min_errors=args.n_errors) + print(",".join([str(x) for x in res])) + + +if __name__ == "__main__": + main() diff --git a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh new file mode 100755 index 000000000..c56aa3152 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# Description: Estimate logical error rates for given code in parallel. Results are saved in a csv file described by the first argument. All other arguments are passed to the python script. + +declare -a p=("0.00005" "0.00006" "0.00007" "0.00008" "0.00009" "0.0001" "0.0002" "0.0003" "0.0004" "0.0005" "0.0006" "0.0007" "0.0008" "0.0009" "0.001" "0.002" "0.003" "0.004" "0.005" "0.006" "0.007" "0.008" "0.009" "0.01" "0.02" "0.03" "0.04" "0.05" "0.06" "0.07" "0.08" "0.09" "0.1" "0.2" "0.3" "0.4" "0.5") + +echo "p p_l acceptance errors runs" > "$1.csv" + +run_and_write() { + local res=$(python estimate_logical_error_rate.py ${@:2:$#-2} "-p" "${@: -1}") + local line="${@: -1} ${res}" + (flock -e 200 echo $line >> "$1.csv") 200>lock +} + +export -f run_and_write + +parallel --load 16 --link run_and_write $@ ::: ${p[@]} From 705876b46bb8c1eab21a0c3e5d312325c868ba03 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 18 Mar 2025 16:17:18 +0100 Subject: [PATCH 027/156] add z_observable flag for z errors --- src/mqt/qecc/circuit_synthesis/simulation.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 68216f4f3..dd267467c 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -35,6 +35,7 @@ def __init__( zero_state: bool = True, parallel_gates: bool = True, decoder: LutDecoder | None = None, + z_observable: bool = True, ) -> None: """Initialize the simulator. @@ -58,6 +59,7 @@ def __init__( self.p = p self.p_idle = p if p_idle is None else p_idle self.zero_state = zero_state + self.z_observable = z_observable self.parallel_gates = parallel_gates # Store which measurements are X, Z or data measurements. # The indices refer to the indices of the measurements in the stim circuit. @@ -93,7 +95,7 @@ def set_p(self, p: float, p_idle: float | None = None) -> None: self.stim_circ = self.to_stim_circ() self._compute_postselection_indices() self.measure_stabilizers() - if self.zero_state: + if self.z_observable: self.measure_z() else: self.measure_x() @@ -288,7 +290,7 @@ def _simulate_batch(self, shots: int = 1024) -> tuple[int, int]: state = filtered_events[:, self.data_measurements] - if self.zero_state: + if self.z_observable: checks = filtered_events[:, self.z_measurements] observables = self.code.Lz estimates = self.decoder.batch_decode_x(checks) @@ -427,6 +429,7 @@ def __init__( zero_state: bool = True, parallel_gates: bool = True, decoder: LutDecoder | None = None, + z_observable: bool = True ) -> None: """Initialize the simulator. @@ -499,7 +502,7 @@ def __init__( self.x_checks = code.Hx if zero_state else np.vstack((code.Hx, code.Lx)) self.z_checks = code.Hz if not zero_state else np.vstack((code.Hz, code.Lz)) - super().__init__(combined, code, p, p_idle, zero_state, parallel_gates, decoder) + super().__init__(combined, code, p, p_idle, zero_state, parallel_gates, decoder, z_observable) def _compute_postselection_indices(self) -> None: """Compute indices of measurements for postselection.""" From fff679e302eb7f72ad34d2121d2f6d1b52e56721 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 15:18:28 +0000 Subject: [PATCH 028/156] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mqt/qecc/circuit_synthesis/simulation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index dd267467c..a0210e8af 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -429,7 +429,7 @@ def __init__( zero_state: bool = True, parallel_gates: bool = True, decoder: LutDecoder | None = None, - z_observable: bool = True + z_observable: bool = True, ) -> None: """Initialize the simulator. From a04dd7ce0865c52018b4cc117a65738c82e587f9 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 18 Mar 2025 16:18:30 +0100 Subject: [PATCH 029/156] missing comma --- src/mqt/qecc/circuit_synthesis/simulation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index dd267467c..a0210e8af 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -429,7 +429,7 @@ def __init__( zero_state: bool = True, parallel_gates: bool = True, decoder: LutDecoder | None = None, - z_observable: bool = True + z_observable: bool = True, ) -> None: """Initialize the simulator. From 31cc1074712a6ef08c6e53e1a6bd8cabb213d176 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 18 Mar 2025 17:10:02 +0100 Subject: [PATCH 030/156] Revert "add z_observable flag for z errors" This reverts commit 705876b46bb8c1eab21a0c3e5d312325c868ba03. --- src/mqt/qecc/circuit_synthesis/simulation.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index a0210e8af..68216f4f3 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -35,7 +35,6 @@ def __init__( zero_state: bool = True, parallel_gates: bool = True, decoder: LutDecoder | None = None, - z_observable: bool = True, ) -> None: """Initialize the simulator. @@ -59,7 +58,6 @@ def __init__( self.p = p self.p_idle = p if p_idle is None else p_idle self.zero_state = zero_state - self.z_observable = z_observable self.parallel_gates = parallel_gates # Store which measurements are X, Z or data measurements. # The indices refer to the indices of the measurements in the stim circuit. @@ -95,7 +93,7 @@ def set_p(self, p: float, p_idle: float | None = None) -> None: self.stim_circ = self.to_stim_circ() self._compute_postselection_indices() self.measure_stabilizers() - if self.z_observable: + if self.zero_state: self.measure_z() else: self.measure_x() @@ -290,7 +288,7 @@ def _simulate_batch(self, shots: int = 1024) -> tuple[int, int]: state = filtered_events[:, self.data_measurements] - if self.z_observable: + if self.zero_state: checks = filtered_events[:, self.z_measurements] observables = self.code.Lz estimates = self.decoder.batch_decode_x(checks) @@ -429,7 +427,6 @@ def __init__( zero_state: bool = True, parallel_gates: bool = True, decoder: LutDecoder | None = None, - z_observable: bool = True, ) -> None: """Initialize the simulator. @@ -502,7 +499,7 @@ def __init__( self.x_checks = code.Hx if zero_state else np.vstack((code.Hx, code.Lx)) self.z_checks = code.Hz if not zero_state else np.vstack((code.Hz, code.Lz)) - super().__init__(combined, code, p, p_idle, zero_state, parallel_gates, decoder, z_observable) + super().__init__(combined, code, p, p_idle, zero_state, parallel_gates, decoder) def _compute_postselection_indices(self) -> None: """Compute indices of measurements for postselection.""" From e08521d1f0f74d036ea9eb714f678c6d0befd22b Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Tue, 18 Mar 2025 17:32:37 +0100 Subject: [PATCH 031/156] Canonical form circuits for Steane-type FTSP. --- src/mqt/qecc/circuit_synthesis/state_prep.py | 163 ++++++++++++++++++- 1 file changed, 160 insertions(+), 3 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 284811e49..15548312c 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -427,6 +427,163 @@ def gate_optimal_prep_circuit( return StatePrepCircuit(circ, code, zero_state) +def iter_cyclic_combinations(lists): + """Generator that yields one combination of cyclic permutations for each list. + Each list in 'lists' is rotated by an offset given by its counter. + """ + n = len(lists) + # counters to track the rotation index for each list + counters = [0] * n + # store the lengths of each list so we know when to reset a counter + lengths = [len(lst) for lst in lists] + + while True: + # Yield the current combination based on counters. + current = [lst[i:] + lst[:i] for lst, i in zip(lists, counters)] + yield current + + # Now update the counters (like an odometer) + for pos in reversed(range(n)): + counters[pos] += 1 # increment the current counter + if counters[pos] < lengths[pos]: + # Successfully incremented without overflow; + # we can break out and yield the next combination on the next iteration. + break + else: + # Reset this counter and move to the next (more significant) counter. + counters[pos] = 0 + else: + # If we have reset all counters, then we've exhausted all combinations. + break + + +def _permute_commuting_cnots( + trgt_order: dict[int, list[int]], ctrl_order, trgt_perm: dict[int, list[int]], ctrl_perm: dict[int, list[int]] +) -> list[tuple[int, int]]: + """Permute CNOTs according to the given permutations. + + Args: + trgt_order: The target order of the CNOTs. + ctrl_order: The control order of the CNOTs. + trgt_perm: The target permutation. + ctrl_perm: The control permutation. + + Returns: + The CNOTs in correct order. + """ + n = len(trgt_order) + len(ctrl_order) + + orders = [None for _ in range(n)] + for ctrl, trgts in trgt_order.items(): + perm = trgt_perm[ctrl] + orders[ctrl] = [trgts[perm[i]] for i in range(len(trgts))] + for trgt, ctrls in ctrl_order.items(): + perm = ctrl_perm[trgt] + orders[trgt] = [ctrls[perm[i]] for i in range(len(ctrls))] + + [0 for _ in range(n)] + done = [False for _ in range(n)] + cnots = [] + + stack = [] + while not all(done): + if len(stack) == 0: + for i in range(n): + if not done[i]: + stack.append(i) + break + + q1 = stack[-1] + q2 = orders[q1][0] + + if q2 in stack: # conflict -> resolve via cycles + print("conflict") + q1_idx = orders[q2].index(q1) + print(orders[q2]) + orders[q2] = orders[q2][q1_idx:] + orders[q2][:q1_idx] + print(orders[q2]) + print("####################") + # unroll stack to q2 + stack = stack[: stack.index(q2) + 1] + + if orders[q2][0] == q1: + if q1 in trgt_order: + cnots.append((q1, q2)) + else: + cnots.append((q2, q1)) + orders[q1].remove(q2) + orders[q2].remove(q1) + done[q1] = len(orders[q1]) == 0 + done[q2] = len(orders[q2]) == 0 + stack.pop() + else: + stack.append(q2) + + return cnots + + +def _canonical_permutation(w: int) -> list[int]: + """Return canonical ft5 permutation for weight w.""" + if w <= 5: + return list(range(w)) + offset = w // 2 + pi = list(range(w)) + if w % 2 == 1: + pi.remove(offset) + for i in range(offset): + if i % 2 == 0: + swap_idx = (i + w // 2) % len(pi) + pi[i], pi[swap_idx] = (pi[swap_idx], pi[i]) + else: + pi[i] + + if w % 2 == 1: + pi = pi[:offset] + [offset] + pi[offset:] + + return pi + + +def canonical_steane_type_prep_circuits( + code: CSSCode, zero_state: bool = True +) -> tuple[QuantumCircuit, QuantumCircuit, QuantumCircuit, QuantumCircuit]: + """Return four circuits in standard form that prepare the +1 eigenstate of the code w.r.t. the Z or X basis that can implement Steane-type FTSP. + + Args: + code: The CSS code to prepare the state for. + zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. + + Returns: A tuple of four state preparation circuits for the code. + """ + n = code.n + trgt_order = _standard_form_cnots(code, zero_state) + ctrls = list(trgt_order.keys()) + trgts = [trgt for trgt in range(n) if trgt not in ctrls] + ctrl_order = {trgt: [] for trgt in trgts} + for ctrl, ctrl_trgts in trgt_order.items(): + for trgt in ctrl_trgts: + ctrl_order[trgt].append(ctrl) + for trgt in trgts: + ctrl_order[trgt].sort() + + id_trgt = {ctrl: list(range(len(trgt_order[ctrl]))) for ctrl in ctrls} + id_ctrl = {trgt: list(range(len(ctrl_order[trgt]))) for trgt in trgts} + + pi_trgt = {ctrl: _canonical_permutation(len(trgt_order[ctrl])) for ctrl in trgt_order} + pi_ctrl = {trgt: _canonical_permutation(len(ctrl_order[trgt])) for trgt in trgts} + + c1 = _permute_commuting_cnots(trgt_order, ctrl_order, id_trgt, id_ctrl) + c2 = _permute_commuting_cnots(trgt_order, ctrl_order, pi_trgt, id_ctrl) + c3 = _permute_commuting_cnots(trgt_order, ctrl_order, pi_trgt, pi_ctrl) + c4 = _permute_commuting_cnots(trgt_order, ctrl_order, id_trgt, pi_ctrl) + + qc1 = build_css_circuit_from_cnot_list(n, c1, ctrls) + qc2 = build_css_circuit_from_cnot_list(n, c2, ctrls) + qc3 = build_css_circuit_from_cnot_list(n, c3, ctrls) + qc4 = build_css_circuit_from_cnot_list(n, c4, ctrls) + + return (qc1, qc2, qc3, qc4) + + def standard_form_prep_circuit(code: CSSCode, zero_state: bool = True) -> StatePrepCircuit: """Return a circuit that prepares the +1 eigenstate of the code w.r.t. the Z or X basis using the circuit's standard form. @@ -450,7 +607,7 @@ def standard_form_prep_circuit(code: CSSCode, zero_state: bool = True) -> StateP return StatePrepCircuit(qc, code, zero_state) -def _standard_form_cnots(code: CSSCode, zero_state: bool = True) -> list[tuple[int, list[int]]]: +def _standard_form_cnots(code: CSSCode, zero_state: bool = True) -> dict[int, list[int]]: """Return the cnots that prepare the +1 eigenstate of the code w.r.t. the Z or X basis using the circuit's standard form. Args: @@ -462,11 +619,11 @@ def _standard_form_cnots(code: CSSCode, zero_state: bool = True) -> list[tuple[i h = code.Hx.copy() if zero_state else code.Hz.copy() h_red, _rk, _, pivots = mod2.row_echelon(h, full=True) - cnots = [] + cnots = {} for i, pivot in enumerate(pivots): trgts = list(np.where(h_red[i, :])[0]) trgts.remove(pivot) - cnots.append((pivot, trgts)) + cnots[pivot] = trgts return cnots From d9f72f47dd549188644d44e156f5bfbecf463f4d Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 19 Mar 2025 07:44:31 +0100 Subject: [PATCH 032/156] add binomial error calulation for SteaneNDFTStatePrepSimulator --- src/mqt/qecc/circuit_synthesis/simulation.py | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 68216f4f3..24082ff90 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -534,6 +534,30 @@ def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: index_array = np.where(np.all(check_anc_1 == 0, axis=1))[0] return samples[index_array].astype(np.int8) + def logical_error_rate( + self, + shots: int = 100000, + shots_per_batch: int = 100000, + at_least_min_errors: bool = True, + min_errors: int = 500, + ) -> tuple[float, float, int, int, float, float]: + """Estimate the logical error rate of the code. + + Args: + shots: The number of shots to use. + shots_per_batch: The number of shots per batch. + at_least_min_errors: Whether to continue simulating until at least min_errors are found. + min_errors: The minimum number of errors to find before stopping. + """ + p_l, r_a, num_logical_errors, total_shots = super().logical_error_rate( + shots, shots_per_batch, at_least_min_errors, min_errors + ) + + p_l_error = np.sqrt(p_l * (1 - p_l) / total_shots) + r_a_error = np.sqrt(r_a * (1 - r_a) / total_shots) + + return p_l, r_a, num_logical_errors, total_shots, p_l_error, r_a_error + class LutDecoder: """Lookup table decoder for a CSSCode.""" From 03bba84678eb379c05dd740dcbe41335cd978d14 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 19 Mar 2025 08:09:21 +0100 Subject: [PATCH 033/156] prepare simulation --- .../eval_circ_mod/estimate_logical_error_rate.py | 2 +- scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh | 2 +- src/mqt/qecc/circuit_synthesis/simulation.py | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py index 4281b0b55..bb558d66a 100644 --- a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py +++ b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py @@ -74,7 +74,7 @@ def main() -> None: p_idle=args.p_idle_factor * args.p_error, zero_state=args.zero_state, ) - res = sim.logical_error_rate(shots=10000, min_errors=args.n_errors) + res = sim.logical_error_rate(min_errors=args.n_errors) print(",".join([str(x) for x in res])) diff --git a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh index c56aa3152..2474ed855 100755 --- a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh +++ b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh @@ -2,7 +2,7 @@ # Description: Estimate logical error rates for given code in parallel. Results are saved in a csv file described by the first argument. All other arguments are passed to the python script. -declare -a p=("0.00005" "0.00006" "0.00007" "0.00008" "0.00009" "0.0001" "0.0002" "0.0003" "0.0004" "0.0005" "0.0006" "0.0007" "0.0008" "0.0009" "0.001" "0.002" "0.003" "0.004" "0.005" "0.006" "0.007" "0.008" "0.009" "0.01" "0.02" "0.03" "0.04" "0.05" "0.06" "0.07" "0.08" "0.09" "0.1" "0.2" "0.3" "0.4" "0.5") +declare -a p=("0.5" "0.3" "0.1" "0.09" "0.07" "0.05" "0.03" "0.01" "0.009" "0.007" "0.005" "0.003" "0.001" "0.0009" "0.0007" "0.0005" "0.0003" "0.0001") echo "p p_l acceptance errors runs" > "$1.csv" diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 24082ff90..d460a5b30 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -536,10 +536,10 @@ def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: def logical_error_rate( self, - shots: int = 100000, - shots_per_batch: int = 100000, + shots: int = 500000, + shots_per_batch: int = 500000, at_least_min_errors: bool = True, - min_errors: int = 500, + min_errors: int = 250, ) -> tuple[float, float, int, int, float, float]: """Estimate the logical error rate of the code. From 48e484dd3547c5ee1752dd32026fffdcbae50c5e Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 19 Mar 2025 08:10:51 +0100 Subject: [PATCH 034/156] update cc_4_8_8 circuits --- .../circuit_synthesis/cc_4_8_8_heuristic_0 | 34 +++++++++++++++++++ .../circuit_synthesis/cc_4_8_8_heuristic_1 | 34 +++++++++++++++++++ .../circuit_synthesis/cc_4_8_8_heuristic_2 | 34 +++++++++++++++++++ .../circuit_synthesis/cc_4_8_8_heuristic_3 | 34 +++++++++++++++++++ 4 files changed, 136 insertions(+) create mode 100644 src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_0 create mode 100644 src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_1 create mode 100644 src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_2 create mode 100644 src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_3 diff --git a/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_0 b/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_0 new file mode 100644 index 000000000..e9d889887 --- /dev/null +++ b/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_0 @@ -0,0 +1,34 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[17]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[9]; +h q[10]; +h q[12]; +cx q[10],q[15]; +cx q[4],q[7]; +cx q[2],q[16]; +cx q[9],q[15]; +cx q[7],q[8]; +cx q[4],q[5]; +cx q[3],q[14]; +cx q[2],q[6]; +cx q[12],q[9]; +cx q[10],q[13]; +cx q[8],q[11]; +cx q[5],q[6]; +cx q[3],q[7]; +cx q[1],q[4]; +cx q[0],q[2]; +cx q[12],q[5]; +cx q[1],q[13]; +cx q[0],q[3]; +cx q[15],q[8]; +cx q[9],q[11]; +cx q[7],q[16]; +cx q[4],q[10]; +cx q[2],q[14]; diff --git a/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_1 b/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_1 new file mode 100644 index 000000000..b0d89c145 --- /dev/null +++ b/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_1 @@ -0,0 +1,34 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[17]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[5]; +cx q[4],q[8]; +cx q[4],q[6]; +cx q[2],q[6]; +cx q[0],q[2]; +cx q[4],q[7]; +cx q[1],q[4]; +h q[9]; +h q[10]; +cx q[5],q[12]; +cx q[8],q[5]; +cx q[3],q[14]; +cx q[3],q[7]; +cx q[0],q[3]; +cx q[10],q[15]; +cx q[10],q[13]; +cx q[1],q[13]; +cx q[4],q[10]; +cx q[9],q[15]; +cx q[15],q[8]; +cx q[9],q[11]; +cx q[12],q[9]; +cx q[5],q[11]; +cx q[14],q[16]; +cx q[2],q[14]; +cx q[6],q[16]; diff --git a/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_2 b/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_2 new file mode 100644 index 000000000..830bbc790 --- /dev/null +++ b/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_2 @@ -0,0 +1,34 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[17]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[5]; +h q[9]; +h q[13]; +cx q[13],q[15]; +cx q[4],q[8]; +cx q[9],q[15]; +cx q[8],q[10]; +cx q[5],q[12]; +cx q[4],q[7]; +cx q[3],q[14]; +cx q[2],q[6]; +cx q[14],q[16]; +cx q[9],q[11]; +cx q[8],q[6]; +cx q[4],q[5]; +cx q[3],q[7]; +cx q[1],q[13]; +cx q[0],q[2]; +cx q[12],q[9]; +cx q[1],q[4]; +cx q[0],q[3]; +cx q[15],q[8]; +cx q[13],q[10]; +cx q[6],q[16]; +cx q[5],q[11]; +cx q[2],q[14]; diff --git a/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_3 b/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_3 new file mode 100644 index 000000000..1f87fe4f1 --- /dev/null +++ b/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_3 @@ -0,0 +1,34 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[17]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[9]; +h q[10]; +h q[12]; +cx q[10],q[15]; +cx q[4],q[7]; +cx q[9],q[15]; +cx q[7],q[8]; +cx q[4],q[5]; +cx q[3],q[14]; +cx q[2],q[6]; +cx q[14],q[16]; +cx q[12],q[9]; +cx q[10],q[13]; +cx q[8],q[11]; +cx q[5],q[6]; +cx q[3],q[7]; +cx q[1],q[4]; +cx q[0],q[2]; +cx q[12],q[5]; +cx q[1],q[13]; +cx q[0],q[3]; +cx q[15],q[8]; +cx q[9],q[11]; +cx q[6],q[16]; +cx q[4],q[10]; +cx q[2],q[14]; From 10949555c543e03ee6b846c0095562b31fd6a385 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 19 Mar 2025 08:42:55 +0100 Subject: [PATCH 035/156] change cc_6_6_6 from qasm3 to qasm2 --- .../circuits/cc_6_6_6/cc_6_6_6_heuristic_0 | 60 +++++++++---------- .../circuits/cc_6_6_6/cc_6_6_6_heuristic_1 | 60 +++++++++---------- .../circuits/cc_6_6_6/cc_6_6_6_heuristic_2 | 60 +++++++++---------- 3 files changed, 90 insertions(+), 90 deletions(-) diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_0 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_0 index c2f47c95e..3d4a04424 100644 --- a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_0 +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_0 @@ -1,6 +1,6 @@ -OPENQASM 3.0; -include "stdgates.inc"; -qubit[19] q; +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[19]; h q[0]; h q[1]; h q[2]; @@ -10,30 +10,30 @@ h q[5]; h q[10]; h q[14]; h q[17]; -cx q[3], q[11]; -cx q[4], q[13]; -cx q[2], q[16]; -cx q[1], q[15]; -cx q[0], q[3]; -cx q[11], q[12]; -cx q[10], q[18]; -cx q[4], q[8]; -cx q[1], q[7]; -cx q[0], q[16]; -cx q[3], q[6]; -cx q[17], q[12]; -cx q[14], q[0]; -cx q[11], q[7]; -cx q[10], q[13]; -cx q[8], q[9]; -cx q[5], q[2]; -cx q[4], q[3]; -cx q[1], q[6]; -cx q[17], q[18]; -cx q[14], q[15]; -cx q[5], q[9]; -cx q[16], q[4]; -cx q[13], q[11]; -cx q[12], q[10]; -cx q[2], q[8]; -cx q[0], q[1]; +cx q[3],q[11]; +cx q[4],q[13]; +cx q[2],q[16]; +cx q[1],q[15]; +cx q[0],q[3]; +cx q[11],q[12]; +cx q[10],q[18]; +cx q[4],q[8]; +cx q[1],q[7]; +cx q[0],q[16]; +cx q[3],q[6]; +cx q[17],q[12]; +cx q[14],q[0]; +cx q[11],q[7]; +cx q[10],q[13]; +cx q[8],q[9]; +cx q[5],q[2]; +cx q[4],q[3]; +cx q[1],q[6]; +cx q[17],q[18]; +cx q[14],q[15]; +cx q[5],q[9]; +cx q[16],q[4]; +cx q[13],q[11]; +cx q[12],q[10]; +cx q[2],q[8]; +cx q[0],q[1]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_1 index bef1dffb2..b2a0392a5 100644 --- a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_1 +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_1 @@ -1,39 +1,39 @@ -OPENQASM 3.0; -include "stdgates.inc"; -qubit[19] q; +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[19]; h q[1]; h q[3]; h q[5]; -cx q[3], q[6]; -cx q[6], q[0]; +cx q[3],q[6]; +cx q[6],q[0]; h q[8]; -cx q[8], q[2]; +cx q[8],q[2]; h q[9]; -cx q[9], q[3]; -cx q[3], q[4]; +cx q[9],q[3]; +cx q[3],q[4]; h q[11]; -cx q[11], q[7]; -cx q[11], q[10]; -cx q[11], q[3]; -cx q[10], q[12]; +cx q[11],q[7]; +cx q[11],q[10]; +cx q[11],q[3]; +cx q[10],q[12]; h q[14]; -cx q[14], q[0]; -cx q[1], q[15]; -cx q[1], q[7]; -cx q[0], q[1]; -cx q[14], q[15]; -cx q[8], q[16]; -cx q[6], q[16]; -cx q[7], q[6]; -cx q[8], q[4]; +cx q[14],q[0]; +cx q[1],q[15]; +cx q[1],q[7]; +cx q[0],q[1]; +cx q[14],q[15]; +cx q[8],q[16]; +cx q[6],q[16]; +cx q[7],q[6]; +cx q[8],q[4]; h q[17]; h q[18]; -cx q[18], q[13]; -cx q[17], q[18]; -cx q[17], q[12]; -cx q[18], q[10]; -cx q[9], q[13]; -cx q[13], q[11]; -cx q[5], q[9]; -cx q[5], q[2]; -cx q[9], q[8]; +cx q[18],q[13]; +cx q[17],q[18]; +cx q[17],q[12]; +cx q[18],q[10]; +cx q[9],q[13]; +cx q[13],q[11]; +cx q[5],q[9]; +cx q[5],q[2]; +cx q[9],q[8]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_2 index 7c77eddc1..c9918cbc7 100644 --- a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_2 +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_2 @@ -1,6 +1,6 @@ -OPENQASM 3.0; -include "stdgates.inc"; -qubit[19] q; +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[19]; h q[12]; h q[10]; h q[15]; @@ -10,30 +10,30 @@ h q[14]; h q[8]; h q[17]; h q[5]; -cx q[3], q[4]; -cx q[6], q[16]; -cx q[15], q[7]; -cx q[10], q[18]; -cx q[12], q[3]; -cx q[4], q[9]; -cx q[8], q[2]; -cx q[6], q[1]; -cx q[10], q[13]; -cx q[12], q[7]; -cx q[3], q[11]; -cx q[5], q[9]; -cx q[17], q[12]; -cx q[4], q[13]; -cx q[8], q[16]; -cx q[1], q[0]; -cx q[14], q[15]; -cx q[6], q[3]; -cx q[10], q[11]; -cx q[5], q[2]; -cx q[17], q[18]; -cx q[14], q[0]; -cx q[7], q[6]; -cx q[16], q[4]; -cx q[9], q[8]; -cx q[15], q[1]; -cx q[12], q[10]; +cx q[3],q[4]; +cx q[6],q[16]; +cx q[15],q[7]; +cx q[10],q[18]; +cx q[12],q[3]; +cx q[4],q[9]; +cx q[8],q[2]; +cx q[6],q[1]; +cx q[10],q[13]; +cx q[12],q[7]; +cx q[3],q[11]; +cx q[5],q[9]; +cx q[17],q[12]; +cx q[4],q[13]; +cx q[8],q[16]; +cx q[1],q[0]; +cx q[14],q[15]; +cx q[6],q[3]; +cx q[10],q[11]; +cx q[5],q[2]; +cx q[17],q[18]; +cx q[14],q[0]; +cx q[7],q[6]; +cx q[16],q[4]; +cx q[9],q[8]; +cx q[15],q[1]; +cx q[12],q[10]; From a5e487705113cda3c5695137ea7454001e66afea Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Wed, 19 Mar 2025 08:59:06 +0100 Subject: [PATCH 036/156] Bugged implementation. Broken for Golay Code. --- src/mqt/qecc/circuit_synthesis/state_prep.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 15548312c..5514dec32 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -497,7 +497,6 @@ def _permute_commuting_cnots( q2 = orders[q1][0] if q2 in stack: # conflict -> resolve via cycles - print("conflict") q1_idx = orders[q2].index(q1) print(orders[q2]) orders[q2] = orders[q2][q1_idx:] + orders[q2][:q1_idx] @@ -573,8 +572,14 @@ def canonical_steane_type_prep_circuits( c1 = _permute_commuting_cnots(trgt_order, ctrl_order, id_trgt, id_ctrl) c2 = _permute_commuting_cnots(trgt_order, ctrl_order, pi_trgt, id_ctrl) - c3 = _permute_commuting_cnots(trgt_order, ctrl_order, pi_trgt, pi_ctrl) - c4 = _permute_commuting_cnots(trgt_order, ctrl_order, id_trgt, pi_ctrl) + + c3 = _permute_commuting_cnots(trgt_order, ctrl_order, id_trgt, pi_ctrl) + + new_trgt_order = {ctrl: [] for ctrl in ctrls} + for ctrl, trgt in c3: + new_trgt_order[ctrl].append(trgt) + new_pi_trgt = {ctrl: _canonical_permutation(len(new_trgt_order[ctrl])) for ctrl in ctrls} + c4 = _permute_commuting_cnots(trgt_order, ctrl_order, new_pi_trgt, pi_ctrl) qc1 = build_css_circuit_from_cnot_list(n, c1, ctrls) qc2 = build_css_circuit_from_cnot_list(n, c2, ctrls) From e05ba108499d01a0f0fc5accc730c07483f2bd6d Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 19 Mar 2025 09:57:38 +0100 Subject: [PATCH 037/156] add new headers for binomial errors in csv --- scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh index 2474ed855..06f421b23 100755 --- a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh +++ b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh @@ -4,7 +4,7 @@ declare -a p=("0.5" "0.3" "0.1" "0.09" "0.07" "0.05" "0.03" "0.01" "0.009" "0.007" "0.005" "0.003" "0.001" "0.0009" "0.0007" "0.0005" "0.0003" "0.0001") -echo "p p_l acceptance errors runs" > "$1.csv" +echo "p p_l acceptance errors runs p_l_error acceptance_error" > "$1.csv" run_and_write() { local res=$(python estimate_logical_error_rate.py ${@:2:$#-2} "-p" "${@: -1}") From a8ae963631cfd34679e7741616514fdd0e2adc46 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 19 Mar 2025 09:58:08 +0100 Subject: [PATCH 038/156] remove falsly tracked files --- .../circuit_synthesis/cc_4_8_8_heuristic_0 | 34 ------------------- .../circuit_synthesis/cc_4_8_8_heuristic_1 | 34 ------------------- .../circuit_synthesis/cc_4_8_8_heuristic_2 | 34 ------------------- .../circuit_synthesis/cc_4_8_8_heuristic_3 | 34 ------------------- 4 files changed, 136 deletions(-) delete mode 100644 src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_0 delete mode 100644 src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_1 delete mode 100644 src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_2 delete mode 100644 src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_3 diff --git a/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_0 b/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_0 deleted file mode 100644 index e9d889887..000000000 --- a/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_0 +++ /dev/null @@ -1,34 +0,0 @@ -OPENQASM 2.0; -include "qelib1.inc"; -qreg q[17]; -h q[0]; -h q[1]; -h q[2]; -h q[3]; -h q[4]; -h q[9]; -h q[10]; -h q[12]; -cx q[10],q[15]; -cx q[4],q[7]; -cx q[2],q[16]; -cx q[9],q[15]; -cx q[7],q[8]; -cx q[4],q[5]; -cx q[3],q[14]; -cx q[2],q[6]; -cx q[12],q[9]; -cx q[10],q[13]; -cx q[8],q[11]; -cx q[5],q[6]; -cx q[3],q[7]; -cx q[1],q[4]; -cx q[0],q[2]; -cx q[12],q[5]; -cx q[1],q[13]; -cx q[0],q[3]; -cx q[15],q[8]; -cx q[9],q[11]; -cx q[7],q[16]; -cx q[4],q[10]; -cx q[2],q[14]; diff --git a/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_1 b/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_1 deleted file mode 100644 index b0d89c145..000000000 --- a/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_1 +++ /dev/null @@ -1,34 +0,0 @@ -OPENQASM 2.0; -include "qelib1.inc"; -qreg q[17]; -h q[0]; -h q[1]; -h q[2]; -h q[3]; -h q[4]; -h q[5]; -cx q[4],q[8]; -cx q[4],q[6]; -cx q[2],q[6]; -cx q[0],q[2]; -cx q[4],q[7]; -cx q[1],q[4]; -h q[9]; -h q[10]; -cx q[5],q[12]; -cx q[8],q[5]; -cx q[3],q[14]; -cx q[3],q[7]; -cx q[0],q[3]; -cx q[10],q[15]; -cx q[10],q[13]; -cx q[1],q[13]; -cx q[4],q[10]; -cx q[9],q[15]; -cx q[15],q[8]; -cx q[9],q[11]; -cx q[12],q[9]; -cx q[5],q[11]; -cx q[14],q[16]; -cx q[2],q[14]; -cx q[6],q[16]; diff --git a/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_2 b/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_2 deleted file mode 100644 index 830bbc790..000000000 --- a/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_2 +++ /dev/null @@ -1,34 +0,0 @@ -OPENQASM 2.0; -include "qelib1.inc"; -qreg q[17]; -h q[0]; -h q[1]; -h q[2]; -h q[3]; -h q[4]; -h q[5]; -h q[9]; -h q[13]; -cx q[13],q[15]; -cx q[4],q[8]; -cx q[9],q[15]; -cx q[8],q[10]; -cx q[5],q[12]; -cx q[4],q[7]; -cx q[3],q[14]; -cx q[2],q[6]; -cx q[14],q[16]; -cx q[9],q[11]; -cx q[8],q[6]; -cx q[4],q[5]; -cx q[3],q[7]; -cx q[1],q[13]; -cx q[0],q[2]; -cx q[12],q[9]; -cx q[1],q[4]; -cx q[0],q[3]; -cx q[15],q[8]; -cx q[13],q[10]; -cx q[6],q[16]; -cx q[5],q[11]; -cx q[2],q[14]; diff --git a/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_3 b/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_3 deleted file mode 100644 index 1f87fe4f1..000000000 --- a/src/mqt/qecc/circuit_synthesis/cc_4_8_8_heuristic_3 +++ /dev/null @@ -1,34 +0,0 @@ -OPENQASM 2.0; -include "qelib1.inc"; -qreg q[17]; -h q[0]; -h q[1]; -h q[2]; -h q[3]; -h q[4]; -h q[9]; -h q[10]; -h q[12]; -cx q[10],q[15]; -cx q[4],q[7]; -cx q[9],q[15]; -cx q[7],q[8]; -cx q[4],q[5]; -cx q[3],q[14]; -cx q[2],q[6]; -cx q[14],q[16]; -cx q[12],q[9]; -cx q[10],q[13]; -cx q[8],q[11]; -cx q[5],q[6]; -cx q[3],q[7]; -cx q[1],q[4]; -cx q[0],q[2]; -cx q[12],q[5]; -cx q[1],q[13]; -cx q[0],q[3]; -cx q[15],q[8]; -cx q[9],q[11]; -cx q[6],q[16]; -cx q[4],q[10]; -cx q[2],q[14]; From 0450ed53aaaf4b08d6a7dcfd45cbe95d8f34e6f8 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Wed, 19 Mar 2025 10:28:48 +0100 Subject: [PATCH 039/156] Second attempt. --- src/mqt/qecc/circuit_synthesis/state_prep.py | 135 ++++++++++++++++--- 1 file changed, 116 insertions(+), 19 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 5514dec32..503ae2006 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -497,6 +497,7 @@ def _permute_commuting_cnots( q2 = orders[q1][0] if q2 in stack: # conflict -> resolve via cycles + print("CONFLICT") q1_idx = orders[q2].index(q1) print(orders[q2]) orders[q2] = orders[q2][q1_idx:] + orders[q2][:q1_idx] @@ -523,22 +524,107 @@ def _permute_commuting_cnots( def _canonical_permutation(w: int) -> list[int]: """Return canonical ft5 permutation for weight w.""" - if w <= 5: - return list(range(w)) - offset = w // 2 pi = list(range(w)) - if w % 2 == 1: - pi.remove(offset) - for i in range(offset): - if i % 2 == 0: - swap_idx = (i + w // 2) % len(pi) - pi[i], pi[swap_idx] = (pi[swap_idx], pi[i]) - else: - pi[i] + pi[0], pi[-1] = pi[-1], pi[0] + + # if w <= 5: + # return list(range(w)) + # offset = w // 2 + # pi = list(range(w)) + # if w % 2 == 1: + # pi.remove(offset) + # for i in range(offset): + # if i % 2 == 0: + # swap_idx = (i + w // 2) % len(pi) + # pi[i], pi[swap_idx] = (pi[swap_idx], pi[i]) + # else: + # pi[i] + + # if w % 2 == 1: + # pi = pi[:offset] + [offset] + pi[offset:] + + return pi + + +def find_swapping_permutation(lists: list[list[int]]) -> dict[int, int]: + """Given a list of lists of integers, finds an involution π (a permutation + composed solely of 2-cycles and fixed points) with the property that for + every list xs, π swaps one of the first three elements with one of the + last three elements. - if w % 2 == 1: - pi = pi[:offset] + [offset] + pi[offset:] + Parameters: + lists (list of list of int): The input lists (each assumed to have 7 integers). + Returns: + dict or None: A dictionary representing the permutation π, where each key maps + to its image under π, or None if no such permutation exists. + """ + # Step 1: Compute candidate pairs for each list. + # Here, "first three" are indices 0-2 and "last three" are indices 4-6. + list_candidates = [] + for xs in lists: + cand = set() + for i in range(3): # first three elements + for j in range(4, 7): # last three elements + # Use sorted tuple to represent an unordered pair + pair = tuple(sorted((xs[i], xs[j]))) + cand.add(pair) + list_candidates.append(cand) + + # Step 2: Compute the global candidate set (union of all candidate pairs). + global_candidates = set() + for cand in list_candidates: + global_candidates |= cand + candidate_edges = list(global_candidates) + + # Collect the full set of numbers (the domain for our permutation). + global_numbers = set() + for xs in lists: + global_numbers |= set(xs) + + # Step 3: Search for a matching (set of disjoint candidate pairs) such that + # for every list at least one of its candidate pairs is in the matching. + best_matching = None + + def backtrack(i, current_matching, used) -> None: + nonlocal best_matching + # If all candidate edges have been considered, + # check if current matching "covers" every list. + if i == len(candidate_edges): + for cand in list_candidates: + if not any(edge in current_matching for edge in cand): + return + best_matching = current_matching.copy() + return + + # Option 1: Skip the current candidate edge. + backtrack(i + 1, current_matching, used) + if best_matching is not None: + return # solution found + + # Option 2: Try to include candidate_edges[i] if neither number is used yet. + edge = candidate_edges[i] + a, b = edge + if a not in used and b not in used: + current_matching.add(edge) + used.add(a) + used.add(b) + backtrack(i + 1, current_matching, used) + if best_matching is not None: + return + current_matching.remove(edge) + used.remove(a) + used.remove(b) + + backtrack(0, set(), set()) + + # Step 4: If a matching was found, build the permutation π. + if best_matching is None: + return None + pi = {x: x for x in global_numbers} # initially, all elements are fixed + for a, b in best_matching: + pi[a] = b + pi[b] = a return pi @@ -572,14 +658,25 @@ def canonical_steane_type_prep_circuits( c1 = _permute_commuting_cnots(trgt_order, ctrl_order, id_trgt, id_ctrl) c2 = _permute_commuting_cnots(trgt_order, ctrl_order, pi_trgt, id_ctrl) - c3 = _permute_commuting_cnots(trgt_order, ctrl_order, id_trgt, pi_ctrl) - new_trgt_order = {ctrl: [] for ctrl in ctrls} - for ctrl, trgt in c3: - new_trgt_order[ctrl].append(trgt) - new_pi_trgt = {ctrl: _canonical_permutation(len(new_trgt_order[ctrl])) for ctrl in ctrls} - c4 = _permute_commuting_cnots(trgt_order, ctrl_order, new_pi_trgt, pi_ctrl) + # collect cnots in c3 with same target into groups + c3_groups = defaultdict(set) + for cnot in c3: + c3_groups[cnot[1]].add(cnot[0]) + + # we need to find a permutation that fulfills the following for all groups of targets: + # - map the first three elements into the second half + # - map the last element into the first half + # No conflicts should occur + lists = list(trgt_order.values()) + pi_swaps = find_swapping_permutation(lists) + pi = [pi_swaps[x] for x in trgts] + # apply pi + # use pi to order c3_groups + c4 = [] + for x in pi: + c4.extend([(y, x) for y in c3_groups[x]]) qc1 = build_css_circuit_from_cnot_list(n, c1, ctrls) qc2 = build_css_circuit_from_cnot_list(n, c2, ctrls) From f97238ba1ee7cded926a56043efd148be96e2491 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Wed, 19 Mar 2025 10:29:27 +0100 Subject: [PATCH 040/156] Fix bug in Steane Type measurement regarding measurement order. --- src/mqt/qecc/circuit_synthesis/simulation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 68216f4f3..e757278ac 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -483,7 +483,7 @@ def __init__( combined.cx(range(2 * code.n, 3 * code.n), range(code.n)) combined.h(range(2 * code.n, 3 * code.n)) # second ancilla is measured in X basis - + combined.barrier() # need the barrier to retain order of measurements n_measured = 3 * code.n if not self.has_one_ancilla else code.n cr = ClassicalRegister(n_measured, "c") combined.add_register(cr) From 7d61efca907b85859c10f24472d724bdb772438d Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Thu, 20 Mar 2025 12:47:07 +0100 Subject: [PATCH 041/156] Random CNOT Permutation. --- src/mqt/qecc/circuit_synthesis/state_prep.py | 29 ++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 503ae2006..b776983e1 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -628,6 +628,35 @@ def backtrack(i, current_matching, used) -> None: return pi +def random_steane_type_prep_circuits( + code: CSSCode, zero_state: bool = True +) -> tuple[QuantumCircuit, QuantumCircuit, QuantumCircuit, QuantumCircuit]: + """Return four circuits in permuted standard form that prepare the +1 eigenstate of the code w.r.t. the Z or X basis that can implement Steane-type FTSP. + + Args: + code: The CSS code to prepare the state for. + zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. + + Returns: A tuple of four state preparation circuits for the code. + """ + trgt_order = _standard_form_cnots(code, zero_state) + c1 = [(x, y) for x, ys in trgt_order.items() for y in ys] + + # obtain three random permutations of the cnots + n = code.n + c2 = np.random.permutation(c1) + c3 = np.random.permutation(c1) + c4 = np.random.permutation(c1) + ctrls = trgt_order.keys() + + qc1 = build_css_circuit_from_cnot_list(n, c1, ctrls) + qc2 = build_css_circuit_from_cnot_list(n, c2, ctrls) + qc3 = build_css_circuit_from_cnot_list(n, c3, ctrls) + qc4 = build_css_circuit_from_cnot_list(n, c4, ctrls) + + return (qc1, qc2, qc3, qc4) + + def canonical_steane_type_prep_circuits( code: CSSCode, zero_state: bool = True ) -> tuple[QuantumCircuit, QuantumCircuit, QuantumCircuit, QuantumCircuit]: From 5de6e3cf8c00c519489e790450f8e00e80bd9c94 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Fri, 21 Mar 2025 13:46:06 +0100 Subject: [PATCH 042/156] add circuits for cc_488 of distance 7 --- .../cc_4_8_8_d7/cc_4_8_8_d7_heuristic_0 | 64 +++++++++++++++++++ .../cc_4_8_8_d7/cc_4_8_8_d7_heuristic_1 | 64 +++++++++++++++++++ .../cc_4_8_8_d7/cc_4_8_8_d7_heuristic_2 | 64 +++++++++++++++++++ .../cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3 | 64 +++++++++++++++++++ 4 files changed, 256 insertions(+) create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_0 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_1 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_2 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3 diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_0 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_0 new file mode 100644 index 000000000..3c36afa8b --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_0 @@ -0,0 +1,64 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[31]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[5]; +h q[6]; +h q[8]; +h q[9]; +h q[10]; +h q[11]; +h q[12]; +h q[17]; +h q[19]; +h q[20]; +cx q[9],q[30]; +cx q[5],q[22]; +cx q[22],q[29]; +cx q[12],q[23]; +cx q[9],q[14]; +cx q[5],q[16]; +cx q[4],q[27]; +cx q[3],q[24]; +cx q[24],q[26]; +cx q[19],q[25]; +cx q[16],q[12]; +cx q[10],q[27]; +cx q[9],q[15]; +cx q[8],q[23]; +cx q[6],q[14]; +cx q[3],q[21]; +cx q[2],q[5]; +cx q[1],q[4]; +cx q[0],q[29]; +cx q[26],q[16]; +cx q[25],q[28]; +cx q[24],q[14]; +cx q[21],q[0]; +cx q[20],q[9]; +cx q[19],q[22]; +cx q[17],q[2]; +cx q[15],q[1]; +cx q[11],q[3]; +cx q[10],q[13]; +cx q[8],q[18]; +cx q[6],q[7]; +cx q[20],q[18]; +cx q[17],q[19]; +cx q[14],q[16]; +cx q[11],q[13]; +cx q[29],q[6]; +cx q[27],q[21]; +cx q[23],q[30]; +cx q[12],q[15]; +cx q[9],q[8]; +cx q[5],q[28]; +cx q[4],q[26]; +cx q[3],q[10]; +cx q[2],q[25]; +cx q[1],q[24]; +cx q[0],q[7]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_1 new file mode 100644 index 000000000..3c36afa8b --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_1 @@ -0,0 +1,64 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[31]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[5]; +h q[6]; +h q[8]; +h q[9]; +h q[10]; +h q[11]; +h q[12]; +h q[17]; +h q[19]; +h q[20]; +cx q[9],q[30]; +cx q[5],q[22]; +cx q[22],q[29]; +cx q[12],q[23]; +cx q[9],q[14]; +cx q[5],q[16]; +cx q[4],q[27]; +cx q[3],q[24]; +cx q[24],q[26]; +cx q[19],q[25]; +cx q[16],q[12]; +cx q[10],q[27]; +cx q[9],q[15]; +cx q[8],q[23]; +cx q[6],q[14]; +cx q[3],q[21]; +cx q[2],q[5]; +cx q[1],q[4]; +cx q[0],q[29]; +cx q[26],q[16]; +cx q[25],q[28]; +cx q[24],q[14]; +cx q[21],q[0]; +cx q[20],q[9]; +cx q[19],q[22]; +cx q[17],q[2]; +cx q[15],q[1]; +cx q[11],q[3]; +cx q[10],q[13]; +cx q[8],q[18]; +cx q[6],q[7]; +cx q[20],q[18]; +cx q[17],q[19]; +cx q[14],q[16]; +cx q[11],q[13]; +cx q[29],q[6]; +cx q[27],q[21]; +cx q[23],q[30]; +cx q[12],q[15]; +cx q[9],q[8]; +cx q[5],q[28]; +cx q[4],q[26]; +cx q[3],q[10]; +cx q[2],q[25]; +cx q[1],q[24]; +cx q[0],q[7]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_2 new file mode 100644 index 000000000..3c36afa8b --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_2 @@ -0,0 +1,64 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[31]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[5]; +h q[6]; +h q[8]; +h q[9]; +h q[10]; +h q[11]; +h q[12]; +h q[17]; +h q[19]; +h q[20]; +cx q[9],q[30]; +cx q[5],q[22]; +cx q[22],q[29]; +cx q[12],q[23]; +cx q[9],q[14]; +cx q[5],q[16]; +cx q[4],q[27]; +cx q[3],q[24]; +cx q[24],q[26]; +cx q[19],q[25]; +cx q[16],q[12]; +cx q[10],q[27]; +cx q[9],q[15]; +cx q[8],q[23]; +cx q[6],q[14]; +cx q[3],q[21]; +cx q[2],q[5]; +cx q[1],q[4]; +cx q[0],q[29]; +cx q[26],q[16]; +cx q[25],q[28]; +cx q[24],q[14]; +cx q[21],q[0]; +cx q[20],q[9]; +cx q[19],q[22]; +cx q[17],q[2]; +cx q[15],q[1]; +cx q[11],q[3]; +cx q[10],q[13]; +cx q[8],q[18]; +cx q[6],q[7]; +cx q[20],q[18]; +cx q[17],q[19]; +cx q[14],q[16]; +cx q[11],q[13]; +cx q[29],q[6]; +cx q[27],q[21]; +cx q[23],q[30]; +cx q[12],q[15]; +cx q[9],q[8]; +cx q[5],q[28]; +cx q[4],q[26]; +cx q[3],q[10]; +cx q[2],q[25]; +cx q[1],q[24]; +cx q[0],q[7]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3 new file mode 100644 index 000000000..3c36afa8b --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3 @@ -0,0 +1,64 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[31]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[5]; +h q[6]; +h q[8]; +h q[9]; +h q[10]; +h q[11]; +h q[12]; +h q[17]; +h q[19]; +h q[20]; +cx q[9],q[30]; +cx q[5],q[22]; +cx q[22],q[29]; +cx q[12],q[23]; +cx q[9],q[14]; +cx q[5],q[16]; +cx q[4],q[27]; +cx q[3],q[24]; +cx q[24],q[26]; +cx q[19],q[25]; +cx q[16],q[12]; +cx q[10],q[27]; +cx q[9],q[15]; +cx q[8],q[23]; +cx q[6],q[14]; +cx q[3],q[21]; +cx q[2],q[5]; +cx q[1],q[4]; +cx q[0],q[29]; +cx q[26],q[16]; +cx q[25],q[28]; +cx q[24],q[14]; +cx q[21],q[0]; +cx q[20],q[9]; +cx q[19],q[22]; +cx q[17],q[2]; +cx q[15],q[1]; +cx q[11],q[3]; +cx q[10],q[13]; +cx q[8],q[18]; +cx q[6],q[7]; +cx q[20],q[18]; +cx q[17],q[19]; +cx q[14],q[16]; +cx q[11],q[13]; +cx q[29],q[6]; +cx q[27],q[21]; +cx q[23],q[30]; +cx q[12],q[15]; +cx q[9],q[8]; +cx q[5],q[28]; +cx q[4],q[26]; +cx q[3],q[10]; +cx q[2],q[25]; +cx q[1],q[24]; +cx q[0],q[7]; From c57903a277dba49af364d80d4bec4257867d1404 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Fri, 21 Mar 2025 13:50:41 +0100 Subject: [PATCH 043/156] update sim file to include distance 7 cc488 --- .../eval_circ_mod/estimate_logical_error_rate.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py index bb558d66a..8ac8150b3 100644 --- a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py +++ b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py @@ -3,6 +3,7 @@ from __future__ import annotations import argparse +import pickle from pathlib import Path from qiskit import QuantumCircuit @@ -38,6 +39,10 @@ def main() -> None: d = args.distance code = CSSCode.from_code_name("surface", d) code_name = f"rotated_surface_d{d}" + elif "cc_4_8_8_d7" in code_name: + d = 7 + code = SquareOctagonColorCode(d) + lut_path = (Path("__file__") / "../../eval/luts/decoder_488_7.pickle").resolve() elif "cc_4_8_8" in code_name: d = 5 code = SquareOctagonColorCode(d) @@ -51,6 +56,12 @@ def main() -> None: prefix = (Path(__file__) / "../circuits/").resolve() circ_file_core = f"{code_name}_heuristic_" + if lut_path.exists(): + with lut_path.open("rb") as f: + lut = pickle.load(f) + else: + msg = "LUT file not found." + raise ValueError(msg) # check if file exists # if not (prefix / code_name / circ_file).exists(): @@ -73,6 +84,7 @@ def main() -> None: p=args.p_error, p_idle=args.p_idle_factor * args.p_error, zero_state=args.zero_state, + decoder=lut if code_name == "cc_4_8_8_d7" else None, ) res = sim.logical_error_rate(min_errors=args.n_errors) print(",".join([str(x) for x in res])) From 9c6587fcdb659c8e9e2414348dd2b1cc557a7832 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 24 Mar 2025 10:49:58 +0100 Subject: [PATCH 044/156] correct crucial typo --- .../eval_circ_mod/estimate_logical_error_rate.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py index 8ac8150b3..fb825a075 100644 --- a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py +++ b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py @@ -43,6 +43,12 @@ def main() -> None: d = 7 code = SquareOctagonColorCode(d) lut_path = (Path("__file__") / "../../eval/luts/decoder_488_7.pickle").resolve() + if lut_path.exists(): + with lut_path.open("rb") as f: + lut = pickle.load(f) + else: + msg = "LUT file not found." + raise ValueError(msg) elif "cc_4_8_8" in code_name: d = 5 code = SquareOctagonColorCode(d) @@ -56,12 +62,6 @@ def main() -> None: prefix = (Path(__file__) / "../circuits/").resolve() circ_file_core = f"{code_name}_heuristic_" - if lut_path.exists(): - with lut_path.open("rb") as f: - lut = pickle.load(f) - else: - msg = "LUT file not found." - raise ValueError(msg) # check if file exists # if not (prefix / code_name / circ_file).exists(): @@ -71,7 +71,7 @@ def main() -> None: # else: circuits = [] # load circuit from file - for _id in [0, 1, 2, 3] if code_name == "c_4_8_8" else [0, 1, 2]: + for _id in [0, 1, 2, 3] if code_name == "cc_4_8_8" else [0, 1, 2]: circ_file = circ_file_core + str(_id) circuits.append(QuantumCircuit.from_qasm_file(prefix / code_name / circ_file)) @@ -80,7 +80,7 @@ def main() -> None: circ2=circuits[1], code=code, circ3=circuits[2], - circ4=circuits[3] if code_name == "c_4_8_8" else circuits[2], + circ4=circuits[3] if code_name == "cc_4_8_8" else circuits[2], p=args.p_error, p_idle=args.p_idle_factor * args.p_error, zero_state=args.zero_state, From e0aa0bec27c12c8cda1a7a2169e56cd86433911e Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Mon, 24 Mar 2025 12:33:39 +0100 Subject: [PATCH 045/156] Speed up LUT creation. --- src/mqt/qecc/circuit_synthesis/simulation.py | 236 +++++++++++++++++-- 1 file changed, 216 insertions(+), 20 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 48f85364d..a8e84cfc9 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -2,7 +2,10 @@ from __future__ import annotations +import concurrent.futures +import itertools import logging +import math from collections import defaultdict from typing import TYPE_CHECKING @@ -11,6 +14,7 @@ import stim from qiskit import ClassicalRegister, QuantumCircuit from qiskit.converters import circuit_to_dag, dag_to_circuit +from tqdm import tqdm from ..codes import InvalidCSSCodeError from .synthesis_utils import support @@ -617,31 +621,223 @@ def generate_z_lut(self) -> None: self.z_lut = self.x_lut @staticmethod - def _generate_lut(checks: npt.NDArray[np.int_]) -> dict[bytes, npt.NDArray[np.int_]]: - """Generate a lookup table for the stabilizer state. + def _generate_lut( + checks: np.ndarray, chunk_size: int = 2**20, num_workers: int = 8, print_progress: bool = False + ) -> dict[bytes, np.ndarray]: + """Generate a lookup table (LUT) for error correction by processing the state space in chunks, + in parallel, and displaying a progress bar. + + Parameters: + checks (np.ndarray): The stabilizer check matrix (binary). + chunk_size (int): Number of states processed per chunk. + num_workers (int): Number of parallel worker processes (default: use available cores). + print_progress (bool): Whether to print progress information. - The lookup table maps error syndromes to their errors. + Returns: + dict[bytes, np.ndarray]: A LUT mapping syndrome bytes to error state arrays. """ n_qubits = checks.shape[1] + global_lut = {} + + # Process weights in increasing order so that lower-weight errors take precedence. + for weight in range(n_qubits): + total_combinations = math.comb(n_qubits, weight) + if total_combinations == 0: + continue + if print_progress: + print(f"Processing weight {weight} with {total_combinations} combinations.") + + # Create a generator of all combinations for this weight. + comb_iter = itertools.combinations(range(n_qubits), weight) + # Split the combinations into chunks. + chunks = list(_chunked_iterable(comb_iter, chunk_size)) + + weight_dict = {} + with concurrent.futures.ProcessPoolExecutor(max_workers=num_workers) as executor: + futures = [executor.submit(_process_combinations_chunk, chunk, checks, n_qubits) for chunk in chunks] + if print_progress: + for future in tqdm( + concurrent.futures.as_completed(futures), total=len(futures), desc=f"Weight {weight}" + ): + _merge_into(weight_dict, future.result()) + + else: + for future in concurrent.futures.as_completed(futures): + _merge_into(weight_dict, future.result()) + + _merge_into(global_lut, weight_dict) + + if len(global_lut) == 2 ** checks.shape[0]: + if print_progress: + print("All syndromes found.") + break + + return global_lut + + def generate_lut_progress( + self: np.ndarray, chunk_size: int = 2**20, num_workers: int | None = None + ) -> dict[bytes, np.ndarray]: + """Generate a lookup table (LUT) for error correction by processing the state space in chunks, + in parallel, and displaying a progress bar. + + Parameters: + checks (np.ndarray): The stabilizer check matrix (binary). + chunk_size (int): Number of states processed per chunk. + num_workers (int): Number of parallel worker processes (default: use available cores). + + Returns: + dict[bytes, np.ndarray]: A LUT mapping syndrome bytes to error state arrays. + """ + n_qubits = self.shape[1] + global_lut = {} - lut: dict[bytes, npt.NDArray[np.int8]] = {} - syndrome_weights: dict[bytes, tuple[npt.NDArray[np.int8_], int]] = {} - - for i in range(2**n_qubits): - state: npt.NDArray[np.int_] = np.array(list(np.binary_repr(i).zfill(n_qubits))).astype(np.int8) - syndrome = checks @ state % 2 - syndrome_bytes = syndrome.astype(np.int8).tobytes() - val = syndrome_weights.get(syndrome_bytes) - weight = state.sum() - if val is None: - syndrome_weights[syndrome_bytes] = (state, weight) + # Process weights in increasing order so that lower-weight errors take precedence. + for weight in range(n_qubits): + total_combinations = math.comb(n_qubits, weight) + if total_combinations == 0: continue - _, w = val + print(f"Processing weight {weight} with {total_combinations} combinations.") + + # Create a generator of all combinations for this weight. + comb_iter = itertools.combinations(range(n_qubits), weight) + # Split the combinations into chunks. + chunks = list(_chunked_iterable(comb_iter, chunk_size)) + + # results = [] + # with concurrent.futures.ProcessPoolExecutor(max_workers=num_workers) as executor: + # # Submit each chunk to be processed. + # futures = {executor.submit(process_combinations_chunk, chunk, checks, n_qubits): chunk + # for chunk in chunks} + # for future in tqdm(concurrent.futures.as_completed(futures), total=len(chunks), + # desc=f"Weight {weight}"): + # results.append(future.result()) + weight_dict = {} + with concurrent.futures.ProcessPoolExecutor(max_workers=num_workers) as executor: + futures = [executor.submit(_process_combinations_chunk, chunk, self, n_qubits) for chunk in chunks] + for future in tqdm( + concurrent.futures.as_completed(futures), total=len(futures), desc=f"Weight {weight}" + ): + # Merge the result of this chunk immediately. + _merge_into(weight_dict, future.result()) + print(len(weight_dict)) + # Merge results for the current weight. + _merge_into(global_lut, weight_dict) + # # Only update global LUT with new syndrome keys. + # for syndrome_bytes, state in weight_dict.items(): + # if syndrome_bytes not in global_lut: + # global_lut[syndrome_bytes] = state + + if len(global_lut) == 2 ** self.shape[0]: + print("All syndromes found.") + break + + return global_lut - if weight < w: - syndrome_weights[syndrome_bytes] = (state, weight) + def generate_lut_by_weight_parallel( + self: np.ndarray, max_weight: int, chunk_size: int = 10000, num_workers: int | None = None + ) -> dict[bytes, np.ndarray]: + """Generate a lookup table (LUT) for error correction codes by enumerating only the error states + (as binary vectors) with weight up to max_weight. The error states are processed in parallel + (per weight) and progress is displayed via a progress bar. - for key, v in syndrome_weights.items(): - lut[key] = np.array(v[0]) + Parameters: + checks (np.ndarray): The stabilizer check matrix (shape: [n_checks, n_qubits]). + n_qubits (int): Number of qubits (length of each error vector). + max_weight (int): Maximum weight (number of 1's) for error states to include. + chunk_size (int): Number of combinations per chunk for parallel processing. + num_workers (int): Number of parallel worker processes (default: uses as many as available). - return lut + Returns: + dict[bytes, np.ndarray]: A lookup table mapping syndrome (as bytes) to error state arrays. + """ + n_qubits = self.shape[1] + global_lut = {} + + # Process weights in increasing order so that lower-weight errors take precedence. + for weight in range(max_weight + 1): + total_combinations = math.comb(n_qubits, weight) + if total_combinations == 0: + continue + print(f"Processing weight {weight} with {total_combinations} combinations.") + + # Create a generator of all combinations for this weight. + comb_iter = itertools.combinations(range(n_qubits), weight) + # Split the combinations into chunks. + chunks = list(_chunked_iterable(comb_iter, chunk_size)) + + results = [] + with concurrent.futures.ProcessPoolExecutor(max_workers=num_workers) as executor: + # Submit each chunk to be processed. + futures = { + executor.submit(_process_combinations_chunk, chunk, self, n_qubits): chunk for chunk in chunks + } + results.extend( + future.result() + for future in tqdm( + concurrent.futures.as_completed(futures), total=len(chunks), desc=f"Weight {weight}" + ) + ) + + # Merge results for the current weight. + weight_dict = _merge_dicts(results) + # Only update global LUT with new syndrome keys. + for syndrome_bytes, state in weight_dict.items(): + if syndrome_bytes not in global_lut: + global_lut[syndrome_bytes] = state + + return global_lut + + +def _chunked_iterable(iterable, chunk_size): + """Yield lists of items from the given iterable, each of size at most chunk_size.""" + chunk = [] + for item in iterable: + chunk.append(item) + if len(chunk) == chunk_size: + yield chunk + chunk = [] + if chunk: + yield chunk + + +def _process_combinations_chunk(chunk, checks, n_qubits): + """Process a chunk of combinations. For each combination, construct the binary state, + compute its syndrome, and add it to a dictionary if not already present. + + Returns: + dict: mapping syndrome (bytes) -> error state (numpy array) + """ + chunk_dict = {} + for comb in chunk: + # Create an error state with 1's in positions given by comb. + state = np.zeros(n_qubits, dtype=np.int8) + state[list(comb)] = 1 + # Compute the syndrome and cast to int8 for consistency. + syndrome = ((checks @ state) % 2).astype(np.int8) + syndrome_bytes = syndrome.tobytes() + # Since all states here have the same weight, + # we keep the first encountered state for a given syndrome. + if syndrome_bytes not in chunk_dict: + chunk_dict[syndrome_bytes] = state.copy() + return chunk_dict + + +def _merge_dicts(dict_list): + """Merge a list of dictionaries. In case of key conflicts, + the first encountered value is kept. + """ + merged = {} + for d in dict_list: + for key, state in d.items(): + if key not in merged: + merged[key] = state + return merged + + +def _merge_into(target, source) -> None: + """Merge source dictionary into target dictionary. In case of key conflicts, + keep the existing value in the target. + """ + for key, state in source.items(): + if key not in target: + target[key] = state From 52f6b0934a72c37a1e9735031409926adada7aea Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Mon, 24 Mar 2025 12:41:19 +0100 Subject: [PATCH 046/156] Remove old function. --- src/mqt/qecc/circuit_synthesis/simulation.py | 54 -------------------- 1 file changed, 54 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index a8e84cfc9..cc79d6330 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -733,60 +733,6 @@ def generate_lut_progress( return global_lut - def generate_lut_by_weight_parallel( - self: np.ndarray, max_weight: int, chunk_size: int = 10000, num_workers: int | None = None - ) -> dict[bytes, np.ndarray]: - """Generate a lookup table (LUT) for error correction codes by enumerating only the error states - (as binary vectors) with weight up to max_weight. The error states are processed in parallel - (per weight) and progress is displayed via a progress bar. - - Parameters: - checks (np.ndarray): The stabilizer check matrix (shape: [n_checks, n_qubits]). - n_qubits (int): Number of qubits (length of each error vector). - max_weight (int): Maximum weight (number of 1's) for error states to include. - chunk_size (int): Number of combinations per chunk for parallel processing. - num_workers (int): Number of parallel worker processes (default: uses as many as available). - - Returns: - dict[bytes, np.ndarray]: A lookup table mapping syndrome (as bytes) to error state arrays. - """ - n_qubits = self.shape[1] - global_lut = {} - - # Process weights in increasing order so that lower-weight errors take precedence. - for weight in range(max_weight + 1): - total_combinations = math.comb(n_qubits, weight) - if total_combinations == 0: - continue - print(f"Processing weight {weight} with {total_combinations} combinations.") - - # Create a generator of all combinations for this weight. - comb_iter = itertools.combinations(range(n_qubits), weight) - # Split the combinations into chunks. - chunks = list(_chunked_iterable(comb_iter, chunk_size)) - - results = [] - with concurrent.futures.ProcessPoolExecutor(max_workers=num_workers) as executor: - # Submit each chunk to be processed. - futures = { - executor.submit(_process_combinations_chunk, chunk, self, n_qubits): chunk for chunk in chunks - } - results.extend( - future.result() - for future in tqdm( - concurrent.futures.as_completed(futures), total=len(chunks), desc=f"Weight {weight}" - ) - ) - - # Merge results for the current weight. - weight_dict = _merge_dicts(results) - # Only update global LUT with new syndrome keys. - for syndrome_bytes, state in weight_dict.items(): - if syndrome_bytes not in global_lut: - global_lut[syndrome_bytes] = state - - return global_lut - def _chunked_iterable(iterable, chunk_size): """Yield lists of items from the given iterable, each of size at most chunk_size.""" From b4e07ec365f98079871e89ceaa8477da333fe1c0 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Mon, 24 Mar 2025 12:42:49 +0100 Subject: [PATCH 047/156] Remove another old function. --- src/mqt/qecc/circuit_synthesis/simulation.py | 59 -------------------- 1 file changed, 59 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index cc79d6330..400a61b4d 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -674,65 +674,6 @@ def _generate_lut( return global_lut - def generate_lut_progress( - self: np.ndarray, chunk_size: int = 2**20, num_workers: int | None = None - ) -> dict[bytes, np.ndarray]: - """Generate a lookup table (LUT) for error correction by processing the state space in chunks, - in parallel, and displaying a progress bar. - - Parameters: - checks (np.ndarray): The stabilizer check matrix (binary). - chunk_size (int): Number of states processed per chunk. - num_workers (int): Number of parallel worker processes (default: use available cores). - - Returns: - dict[bytes, np.ndarray]: A LUT mapping syndrome bytes to error state arrays. - """ - n_qubits = self.shape[1] - global_lut = {} - - # Process weights in increasing order so that lower-weight errors take precedence. - for weight in range(n_qubits): - total_combinations = math.comb(n_qubits, weight) - if total_combinations == 0: - continue - print(f"Processing weight {weight} with {total_combinations} combinations.") - - # Create a generator of all combinations for this weight. - comb_iter = itertools.combinations(range(n_qubits), weight) - # Split the combinations into chunks. - chunks = list(_chunked_iterable(comb_iter, chunk_size)) - - # results = [] - # with concurrent.futures.ProcessPoolExecutor(max_workers=num_workers) as executor: - # # Submit each chunk to be processed. - # futures = {executor.submit(process_combinations_chunk, chunk, checks, n_qubits): chunk - # for chunk in chunks} - # for future in tqdm(concurrent.futures.as_completed(futures), total=len(chunks), - # desc=f"Weight {weight}"): - # results.append(future.result()) - weight_dict = {} - with concurrent.futures.ProcessPoolExecutor(max_workers=num_workers) as executor: - futures = [executor.submit(_process_combinations_chunk, chunk, self, n_qubits) for chunk in chunks] - for future in tqdm( - concurrent.futures.as_completed(futures), total=len(futures), desc=f"Weight {weight}" - ): - # Merge the result of this chunk immediately. - _merge_into(weight_dict, future.result()) - print(len(weight_dict)) - # Merge results for the current weight. - _merge_into(global_lut, weight_dict) - # # Only update global LUT with new syndrome keys. - # for syndrome_bytes, state in weight_dict.items(): - # if syndrome_bytes not in global_lut: - # global_lut[syndrome_bytes] = state - - if len(global_lut) == 2 ** self.shape[0]: - print("All syndromes found.") - break - - return global_lut - def _chunked_iterable(iterable, chunk_size): """Yield lists of items from the given iterable, each of size at most chunk_size.""" From b6ec765722313afca929fdf419426873642ba1fe Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Tue, 25 Mar 2025 08:22:20 +0100 Subject: [PATCH 048/156] Fix index error in permutation generation. --- src/mqt/qecc/circuit_synthesis/state_prep.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index f01a08ff4..6de99689a 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -562,13 +562,14 @@ def find_swapping_permutation(lists: list[list[int]]) -> dict[int, int]: to its image under π, or None if no such permutation exists. """ # Step 1: Compute candidate pairs for each list. - # Here, "first three" are indices 0-2 and "last three" are indices 4-6. list_candidates = [] for xs in lists: cand = set() for i in range(3): # first three elements - for j in range(4, 7): # last three elements + for j in range(len(xs) - 3, len(xs)): # last three elements # Use sorted tuple to represent an unordered pair + if i == j: + continue pair = tuple(sorted((xs[i], xs[j]))) cand.add(pair) list_candidates.append(cand) @@ -646,9 +647,12 @@ def random_steane_type_prep_circuits( # obtain three random permutations of the cnots n = code.n - c2 = np.random.permutation(c1) - c3 = np.random.permutation(c1) - c4 = np.random.permutation(c1) + p1 = np.random.permutation(len(c1)) + p2 = np.random.permutation(len(c1)) + p3 = np.random.permutation(len(c1)) + c2 = [c1[i] for i in p1] + c3 = [c1[i] for i in p2] + c4 = [c1[i] for i in p3] ctrls = trgt_order.keys() qc1 = build_css_circuit_from_cnot_list(n, c1, ctrls) @@ -656,7 +660,7 @@ def random_steane_type_prep_circuits( qc3 = build_css_circuit_from_cnot_list(n, c3, ctrls) qc4 = build_css_circuit_from_cnot_list(n, c4, ctrls) - return (qc1, qc2, qc3, qc4) + return qc1, qc2, qc3, qc4, [p1, p2, p3] def canonical_steane_type_prep_circuits( From fef08e7c64513ef65f9db3276b1025fd8560bfb4 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Tue, 25 Mar 2025 13:26:33 +0100 Subject: [PATCH 049/156] Steane-type check for Z errors. --- src/mqt/qecc/circuit_synthesis/simulation.py | 274 ++++++++++++++---- .../circuit_synthesis/test_simulation.py | 2 +- 2 files changed, 220 insertions(+), 56 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 400a61b4d..bbb08fa7f 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -56,7 +56,6 @@ def __init__( raise InvalidCSSCodeError(msg) self.circ = state_prep_circ - self.num_qubits = state_prep_circ.num_qubits self.num_verification_qubits = 0 self.code = code self.p = p @@ -79,7 +78,7 @@ def __init__( self.set_p(p, p_idle) - def set_p(self, p: float, p_idle: float | None = None) -> None: + def set_p(self, p: float, p_idle: float | None = None) -> int: """Set the error rate and initialize the stim circuit. This overwrites the previous stim circuit. @@ -88,24 +87,28 @@ def set_p(self, p: float, p_idle: float | None = None) -> None: p: The error rate. p_idle: Idling error rate. If None, it is set to p. """ - self.x_measurements = [] - self.z_measurements = [] - self.data_measurements = [] self.n_measurements = 0 self.p = p self.p_idle = p if p_idle is None else p_idle - self.stim_circ = self.to_stim_circ() - self._compute_postselection_indices() - self.measure_stabilizers() + self.stim_circ = self.to_stim_circ(self.circ) + self.stim_circ.append("DEPOLARIZE1", list(range(self.circ.num_qubits)), [self.p]) + n_measurements = self._compute_postselection_indices() + self.x_measurements, self.z_measurements = self.measure_stabilizers(self.stim_circ, n_measurements) + n_measurements += len(self.x_measurements) + len(self.z_measurements) if self.zero_state: - self.measure_z() + self.data_measurements = self.measure_z(self.stim_circ, n_measurements) else: - self.measure_x() + self.data_measurements = self.measure_x(self.stim_circ, n_measurements) + n_measurements += self.code.n + + def _compute_postselection_indices(self) -> int: + """Compute indices of measurements for postselection. - def _compute_postselection_indices(self) -> None: - """Compute indices of measurements for postselection.""" + Returns: + int: The number of measurements. + """ - def to_stim_circ(self) -> stim.Circuit: + def to_stim_circ(self, circ: QuantumCircuit, error_free_qubits=None) -> stim.Circuit: """Convert a QuantumCircuit to a noisy STIM circuit. A depolarizing error model is used: @@ -114,17 +117,19 @@ def to_stim_circ(self) -> stim.Circuit: - Measurements flip with a probability of 2/3 p. - Qubit are initialized in the -1 Eigenstate with probability 2/3 p. """ - initialized = [False for _ in self.circ.qubits] + if error_free_qubits is None: + error_free_qubits = [] + initialized = [False for _ in circ.qubits] stim_circuit = stim.Circuit() ctrls = [] def idle_error(used_qubits: list[int]) -> None: - for q in self.circ.qubits: - qubit = self.circ.find_bit(q)[0] - if initialized[qubit] and qubit not in used_qubits: - stim_circuit.append_operation("DEPOLARIZE1", [self.circ.find_bit(q)[0]], [self.p_idle]) + for q in circ.qubits: + qubit = circ.find_bit(q)[0] + if initialized[qubit] and qubit not in used_qubits and qubit not in error_free_qubits: + stim_circuit.append_operation("DEPOLARIZE1", [circ.find_bit(q)[0]], [self.p_idle]) - dag = circuit_to_dag(self.circ) + dag = circuit_to_dag(circ) layers = dag.layers() used_qubits: list[int] = [] targets = set() @@ -139,7 +144,7 @@ def idle_error(used_qubits: list[int]) -> None: used_qubits = [] for gate in layer_circ.data: if gate.operation.name == "h": - qubit = self.circ.find_bit(gate.qubits[0])[0] + qubit = circ.find_bit(gate.qubits[0])[0] ctrls.append(qubit) if initialized[qubit]: stim_circuit.append_operation("H", [qubit]) @@ -149,29 +154,34 @@ def idle_error(used_qubits: list[int]) -> None: used_qubits.append(qubit) elif gate.operation.name == "cx": - ctrl = self.circ.find_bit(gate.qubits[0])[0] - target = self.circ.find_bit(gate.qubits[1])[0] + ctrl = circ.find_bit(gate.qubits[0])[0] + target = circ.find_bit(gate.qubits[1])[0] targets.add(target) if not initialized[ctrl]: if ctrl in ctrls: stim_circuit.append_operation("H", [ctrl]) - stim_circuit.append_operation("Z_ERROR", [ctrl], [2 * self.p / 3]) # Wrong initialization - else: + if ctrl not in error_free_qubits: + stim_circuit.append_operation( + "Z_ERROR", [ctrl], [2 * self.p / 3] + ) # Wrong initialization + elif ctrl not in error_free_qubits: stim_circuit.append_operation("X_ERROR", [ctrl], [2 * self.p / 3]) # Wrong initialization initialized[ctrl] = True if not initialized[target]: - stim_circuit.append_operation("X_ERROR", [target], [2 * self.p / 3]) # Wrong initialization + if target not in error_free_qubits: + stim_circuit.append_operation("X_ERROR", [target], [2 * self.p / 3]) # Wrong initialization initialized[target] = True stim_circuit.append_operation("CX", [ctrl, target]) - stim_circuit.append_operation("DEPOLARIZE2", [ctrl, target], [self.p]) + if ctrl not in error_free_qubits and target not in error_free_qubits: + stim_circuit.append_operation("DEPOLARIZE2", [ctrl, target], [self.p]) if not self.parallel_gates: idle_error([ctrl, target]) else: used_qubits.extend([ctrl, target]) elif gate.operation.name == "measure": - anc = self.circ.find_bit(gate.qubits[0])[0] + anc = circ.find_bit(gate.qubits[0])[0] stim_circuit.append_operation("X_ERROR", [anc], [2 * self.p / 3]) stim_circuit.append_operation("MR", [anc]) if not self.parallel_gates: @@ -182,7 +192,9 @@ def idle_error(used_qubits: list[int]) -> None: return stim_circuit - def measure_stabilizers(self) -> None: + def measure_stabilizers( + self, circ: stim.Circuit, measurement_index, data_index: int = 0 + ) -> tuple[list[int], list[int]]: """Measure the stabilizers of the code. An ancilla is used for each measurement. @@ -190,38 +202,43 @@ def measure_stabilizers(self) -> None: assert self.code.Hx is not None assert self.code.Hz is not None - anc = self.stim_circ.num_qubits + self.num_verification_qubits + x_measurements = [] + z_measurements = [] + anc = circ.num_qubits + n_measurements = 0 for check in self.code.Hx: supp = support(check) - self.stim_circ.append_operation("H", [anc]) + circ.append_operation("H", [anc]) for q in supp: - self.stim_circ.append_operation("CX", [anc, q]) - self.stim_circ.append_operation("MRX", [anc]) - self.x_measurements.append(self.n_measurements) - self.n_measurements += 1 + circ.append_operation("CX", [anc, q + data_index]) + circ.append_operation("MRX", [anc]) + x_measurements.append(measurement_index + n_measurements) + n_measurements += 1 anc += 1 for check in self.code.Hz: supp = support(check) for q in supp: - self.stim_circ.append_operation("CX", [q, anc]) - self.stim_circ.append_operation("MRZ", [anc]) - self.z_measurements.append(self.n_measurements) - self.n_measurements += 1 + circ.append_operation("CX", [q + data_index, anc]) + circ.append_operation("MRZ", [anc]) + z_measurements.append(measurement_index + n_measurements) + n_measurements += 1 anc += 1 - def measure_z(self) -> None: + return x_measurements, z_measurements + + def measure_z(self, circ: stim.Circuit, measurement_index: int, data_index: int = 0) -> list[int]: """Measure all data qubits in the Z basis.""" - self.data_measurements = [self.n_measurements + i for i in range(self.code.n)] - self.n_measurements += self.code.n - self.stim_circ.append_operation("MRZ", list(range(self.num_qubits))) + data_measurements = [measurement_index + i for i in range(self.code.n)] + circ.append_operation("MRZ", list(range(data_index, data_index + self.code.n))) + return data_measurements - def measure_x(self) -> None: + def measure_x(self, circ: stim.Circuit, measurement_index: int, data_index: int = 0) -> list[int]: """Measure all data qubits in the X basis.""" - self.data_measurements = [self.n_measurements + i for i in range(self.code.n)] - self.n_measurements += self.code.n - self.stim_circ.append_operation("MRX", list(range(self.num_qubits))) + data_measurements = [measurement_index + i for i in range(self.code.n)] + circ.append_operation("MRX", list(range(data_index, data_index + self.code.n))) + return data_measurements def logical_error_rate( self, @@ -381,11 +398,12 @@ def __init__( self.x_verification_measurements: list[int] = [] super().__init__(state_prep_circ, code, p, p_idle, zero_state, parallel_gates, decoder) - def _compute_postselection_indices(self) -> None: + def _compute_postselection_indices(self) -> int: """Compute the indices of the verification measurements.""" dag = circuit_to_dag(self.circ) layers = dag.layers() targets = set() + n_measurements = 0 for layer in layers: layer_circ = dag_to_circuit(layer["graph"]) @@ -397,10 +415,11 @@ def _compute_postselection_indices(self) -> None: elif gate.operation.name == "measure": anc = self.circ.find_bit(gate.qubits[0])[0] if anc in targets: - self.z_verification_measurements.append(self.n_measurements) + self.z_verification_measurements.append(n_measurements) else: - self.x_verification_measurements.append(self.n_measurements) - self.n_measurements += 1 + self.x_verification_measurements.append(n_measurements) + n_measurements += 1 + return n_measurements def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: """Filter samples based on measurement outcomes. @@ -431,6 +450,7 @@ def __init__( zero_state: bool = True, parallel_gates: bool = True, decoder: LutDecoder | None = None, + check_circuit: QuantumCircuit | None = None, ) -> None: """Initialize the simulator. @@ -450,6 +470,7 @@ def __init__( zero_state: Whether thezero state is prepared or nor. parallel_gates: Whether to allow for parallel execution of gates. decoder: The decoder to use. + check_circuit: Circuit used for checking error rates for the error type that cannot form a logical error on the synthesized state. """ if (circ3 is None and circ4 is not None) or (circ3 is not None and circ4 is None): msg = "Only two or four circuits are supported." @@ -502,18 +523,74 @@ def __init__( self.x_checks = code.Hx if zero_state else np.vstack((code.Hx, code.Lx)) self.z_checks = code.Hz if not zero_state else np.vstack((code.Hz, code.Lz)) - + self.secondary_error_gadget = None super().__init__(combined, code, p, p_idle, zero_state, parallel_gates, decoder) - def _compute_postselection_indices(self) -> None: - """Compute indices of measurements for postselection.""" + if check_circuit is None: + return + + # Estimate error rate using Steane-type error correction + secondary_error_gadget = combined.copy() + secondary_error_gadget.barrier() + secondary_error_gadget = check_circuit.tensor(secondary_error_gadget) + if zero_state: + secondary_error_gadget.cx(range(code.n), range(4 * code.n, 5 * code.n)) + else: + secondary_error_gadget.cx(range(4 * code.n, 5 * code.n), range(code.n)) + if self.zero_state: + secondary_error_gadget.h(range(code.n)) + secondary_error_gadget.barrier() + new_cr = ClassicalRegister(code.n, "new_c") + secondary_error_gadget.add_register(new_cr) + secondary_error_gadget.measure(range(code.n), new_cr) + self.secondary_error_gadget = secondary_error_gadget + + def _compute_postselection_indices(self) -> int: + """Compute indices of measurements for postselection. + + Returns: + int: The number of measurements. + """ self.anc_1 = list(range(self.code.n)) if not self.has_one_ancilla: self.anc_2 = list(range(self.code.n, 2 * self.code.n)) self.anc_3 = list(range(2 * self.code.n, 3 * self.code.n)) - self.n_measurements = 3 * self.code.n + return 3 * self.code.n + return self.code.n + + def set_p(self, p: float, p_idle: float | None = None) -> None: + """Set the error rate and initialize the stim circuit. + + This overwrites the previous stim circuit. + + Args: + p: The error rate. + p_idle: Idling error rate. If None, it is set to p. + """ + super().set_p(p, p_idle) + if self.secondary_error_gadget is None: + return + self.secondary_stim_circ = self.to_stim_circ( + self.secondary_error_gadget, error_free_qubits=list(range(4 * self.code.n, 5 * self.code.n)) + ) + self.secondary_stim_circ.append("DEPOLARIZE1", list(range(4 * self.code.n, 5 * self.code.n)), [self.p]) + n_measurements = self._compute_postselection_indices() + + self.secondary_ancilla_measurements = list( + range(n_measurements, n_measurements + self.code.n) + ) # add measurements of the initial data qubit + n_measurements += self.code.n + self.secondary_x_measurements, self.secondary_z_measurements = self.measure_stabilizers( + self.secondary_stim_circ, n_measurements, data_index=4 * self.code.n + ) + if self.zero_state: + self.secondary_data_measurements = self.measure_x( + self.secondary_stim_circ, n_measurements, data_index=4 * self.code.n + ) else: - self.n_measurements = self.code.n + self.secondary_data_measurements = self.measure_z( + self.secondary_stim_circ, n_measurements, data_index=4 * self.code.n + ) def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: """Filter samples based on measurement outcomes. @@ -538,6 +615,37 @@ def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: index_array = np.where(np.all(check_anc_1 == 0, axis=1))[0] return samples[index_array].astype(np.int8) + def _simulate_secondary_batch(self, shots: int = 1024) -> tuple[int, int]: + sampler = self.secondary_stim_circ.compile_sampler() + detection_events = sampler.sample(shots).astype(np.int8) + + filtered_events = self._filter_runs(detection_events) + + if len(filtered_events) == 0: # All events were discarded + return 0, shots + + secondary_state = filtered_events[:, -self.code.n :] + + state = filtered_events[:, self.secondary_ancilla_measurements] + + if self.zero_state: + observables = self.code.Lx + estimate_1 = self.decoder.batch_decode_z((state @ self.code.Hx.T % 2).astype(np.int8)) + secondary_state = (secondary_state + estimate_1) % 2 + estimates = self.decoder.batch_decode_z((secondary_state @ self.code.Hx.T % 2).astype(np.int8)) + else: + estimate_1 = self.decoder.batch_decode_z((state @ self.code.Hz.T % 2).astype(np.int8)) + secondary_state = (secondary_state + estimate_1) % 2 + observables = self.code.Lz + estimates = self.decoder.batch_decode_x((secondary_state @ self.code.H.T % 2).astype(np.int8)) + corrected = secondary_state + estimates + + num_discarded = detection_events.shape[0] - filtered_events.shape[0] + num_logical_errors: int = np.sum( + np.any(corrected @ observables.T % 2 != 0, axis=1) + ) # number of non-commuting corrected states + return num_logical_errors, num_discarded + def logical_error_rate( self, shots: int = 500000, @@ -562,6 +670,62 @@ def logical_error_rate( return p_l, r_a, num_logical_errors, total_shots, p_l_error, r_a_error + def secondary_logical_error_rate( + self, + shots: int = 500000, + shots_per_batch: int = 500000, + at_least_min_errors: bool = True, + min_errors: int = 250, + ) -> tuple[float, float, int, int, float, float]: + """Estimate the logical error rate of the code with regards to the secondary error type. + + Args: + shots: The number of shots to use. + shots_per_batch: The number of shots per batch. + at_least_min_errors: Whether to continue simulating until at least min_errors are found. + min_errors: The minimum number of errors to find before stopping. + """ + batch = min(shots_per_batch, shots) + p_l = 0.0 + r_a = 0.0 + + num_logical_errors = 0 + + if self.zero_state: + self.decoder.generate_x_lut() + else: + self.decoder.generate_z_lut() + + i = 1 + while i <= int(np.ceil(shots / batch)) or at_least_min_errors: + num_logical_errors_batch, discarded_batch = self._simulate_secondary_batch(batch) + logger.info( + f"Batch {i}: {num_logical_errors_batch} logical errors and {discarded_batch} discarded shots. {batch - discarded_batch} shots used.", + ) + p_l_batch = num_logical_errors_batch / (batch - discarded_batch) if discarded_batch != batch else 0.0 + p_l = ((i - 1) * p_l + p_l_batch) / i + + r_a_batch = 1 - discarded_batch / batch + + # Update statistics + num_logical_errors += num_logical_errors_batch + r_a = ((i - 1) * r_a + r_a_batch) / i + + if at_least_min_errors and num_logical_errors >= min_errors: + break + i += 1 + + p_l /= self.code.k + total_shots = i * batch + # p_l, r_a, num_logical_errors, total_shots = super().logical_error_rate( + # shots, shots_per_batch, at_least_min_errors, min_errors + # ) + + p_l_error = np.sqrt(p_l * (1 - p_l) / total_shots) + r_a_error = np.sqrt(r_a * (1 - r_a) / total_shots) + + return p_l, r_a, num_logical_errors, total_shots, p_l_error, r_a_error + class LutDecoder: """Lookup table decoder for a CSSCode.""" diff --git a/test/python/circuit_synthesis/test_simulation.py b/test/python/circuit_synthesis/test_simulation.py index 9f165a57c..9d8ec0c7c 100644 --- a/test/python/circuit_synthesis/test_simulation.py +++ b/test/python/circuit_synthesis/test_simulation.py @@ -200,6 +200,6 @@ def test_steane_type_ftsp_trivial(steane_code: CSSCode, non_ft_steane_zero: Quan p_idle=p * 0.01, zero_state=True, ) - p_l, _, _, _ = simulator.logical_error_rate(min_errors=100) + p_l, _, _, _, _, _ = simulator.logical_error_rate(min_errors=100) assert p_l - tol < lower From 6540dc2c2d99f617fb866430068c80c47a286459 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Tue, 25 Mar 2025 13:55:53 +0100 Subject: [PATCH 050/156] Remove pheno noise. --- src/mqt/qecc/circuit_synthesis/simulation.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index bbb08fa7f..b07ca9921 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -91,7 +91,6 @@ def set_p(self, p: float, p_idle: float | None = None) -> int: self.p = p self.p_idle = p if p_idle is None else p_idle self.stim_circ = self.to_stim_circ(self.circ) - self.stim_circ.append("DEPOLARIZE1", list(range(self.circ.num_qubits)), [self.p]) n_measurements = self._compute_postselection_indices() self.x_measurements, self.z_measurements = self.measure_stabilizers(self.stim_circ, n_measurements) n_measurements += len(self.x_measurements) + len(self.z_measurements) From 5c7020949ef2d8bda88d45023deee1de8efdf976 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Wed, 26 Mar 2025 16:21:12 +0100 Subject: [PATCH 051/156] Noise on ancilla. --- src/mqt/qecc/circuit_synthesis/simulation.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index b07ca9921..5f932e1b9 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -78,7 +78,7 @@ def __init__( self.set_p(p, p_idle) - def set_p(self, p: float, p_idle: float | None = None) -> int: + def set_p(self, p: float, p_idle: float | None = None, error_free_qubits=[]) -> int: """Set the error rate and initialize the stim circuit. This overwrites the previous stim circuit. @@ -90,7 +90,7 @@ def set_p(self, p: float, p_idle: float | None = None) -> int: self.n_measurements = 0 self.p = p self.p_idle = p if p_idle is None else p_idle - self.stim_circ = self.to_stim_circ(self.circ) + self.stim_circ = self.to_stim_circ(self.circ, error_free_qubits=error_free_qubits) n_measurements = self._compute_postselection_indices() self.x_measurements, self.z_measurements = self.measure_stabilizers(self.stim_circ, n_measurements) n_measurements += len(self.x_measurements) + len(self.z_measurements) @@ -181,7 +181,8 @@ def idle_error(used_qubits: list[int]) -> None: elif gate.operation.name == "measure": anc = circ.find_bit(gate.qubits[0])[0] - stim_circuit.append_operation("X_ERROR", [anc], [2 * self.p / 3]) + if anc not in error_free_qubits: + stim_circuit.append_operation("X_ERROR", [anc], [2 * self.p / 3]) stim_circuit.append_operation("MR", [anc]) if not self.parallel_gates: idle_error([anc]) @@ -557,7 +558,7 @@ def _compute_postselection_indices(self) -> int: return 3 * self.code.n return self.code.n - def set_p(self, p: float, p_idle: float | None = None) -> None: + def set_p(self, p: float, p_idle: float | None = None, error_free_qubits=[]) -> None: """Set the error rate and initialize the stim circuit. This overwrites the previous stim circuit. @@ -566,11 +567,11 @@ def set_p(self, p: float, p_idle: float | None = None) -> None: p: The error rate. p_idle: Idling error rate. If None, it is set to p. """ - super().set_p(p, p_idle) + super().set_p(p, p_idle, error_free_qubits) if self.secondary_error_gadget is None: return self.secondary_stim_circ = self.to_stim_circ( - self.secondary_error_gadget, error_free_qubits=list(range(4 * self.code.n, 5 * self.code.n)) + self.secondary_error_gadget, error_free_qubits=list(range(4 * self.code.n, 5 * self.code.n)) + error_free_qubits ) self.secondary_stim_circ.append("DEPOLARIZE1", list(range(4 * self.code.n, 5 * self.code.n)), [self.p]) n_measurements = self._compute_postselection_indices() @@ -633,7 +634,7 @@ def _simulate_secondary_batch(self, shots: int = 1024) -> tuple[int, int]: secondary_state = (secondary_state + estimate_1) % 2 estimates = self.decoder.batch_decode_z((secondary_state @ self.code.Hx.T % 2).astype(np.int8)) else: - estimate_1 = self.decoder.batch_decode_z((state @ self.code.Hz.T % 2).astype(np.int8)) + estimate_1 = self.decoder.batch_decode_x((state @ self.code.Hz.T % 2).astype(np.int8)) secondary_state = (secondary_state + estimate_1) % 2 observables = self.code.Lz estimates = self.decoder.batch_decode_x((secondary_state @ self.code.H.T % 2).astype(np.int8)) From 78e8594b62353a080209d476d48cef136658eca0 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Wed, 26 Mar 2025 16:21:41 +0100 Subject: [PATCH 052/156] Eval scripts for canonical Steane State Prep. --- .../canonical_steane/estimate_canonical.py | 73 +++++++++++++++++++ .../canonical_steane/run_parallel.sh | 16 ++++ 2 files changed, 89 insertions(+) create mode 100644 scripts/ft_stateprep/canonical_steane/estimate_canonical.py create mode 100755 scripts/ft_stateprep/canonical_steane/run_parallel.sh diff --git a/scripts/ft_stateprep/canonical_steane/estimate_canonical.py b/scripts/ft_stateprep/canonical_steane/estimate_canonical.py new file mode 100644 index 000000000..d33f645ae --- /dev/null +++ b/scripts/ft_stateprep/canonical_steane/estimate_canonical.py @@ -0,0 +1,73 @@ +"""Estimate logical error rate for CSS state preparation circuits for a given code and physical error rate.""" + +from __future__ import annotations + +import argparse + +from mqt.qecc import CSSCode +from mqt.qecc.circuit_synthesis import SteaneNDFTStatePrepSimulator, heuristic_prep_circuit +from mqt.qecc.circuit_synthesis.state_prep import canonical_steane_type_prep_circuits, random_steane_type_prep_circuits +from mqt.qecc.codes import HexagonalColorCode, SquareOctagonColorCode + +codes = {"golay": CSSCode.from_code_name("golay"), "hex": HexagonalColorCode(7), "sqoct": SquareOctagonColorCode(7)} + + +def main() -> None: + """Run the logical error rate estimation for a given code and physical error rate.""" + available_codes = ["steane", "tetrahedral", "shor", "surface", "cc_4_8_8", "cc_6_6_6", "hamming", "carbon"] + parser = argparse.ArgumentParser(description="Estimate logical error rate for CSS state preparation circuits") + parser.add_argument( + "code", + type=str, + help="Code for which to estimate logical error rate. Available codes: " + ", ".join(available_codes), + ) + parser.add_argument("-p", "--p_error", type=float, help="Physical error rate") + parser.add_argument("-n", "--n_errors", type=int, default=500, help="Number of errors to sample") + parser.add_argument( + "--perm", + type=str, + default="canonical", + help="Permutation for state preparation. Can be 'canonical' or 'random'", + ) + parser.add_argument( + "-e", "--error_type", type=str, default="X", help="Type of error to use for simulation. Can be 'X' or 'Z'." + ) + + args = parser.parse_args() + code_name = args.code + if code_name in codes: + code = codes[code_name] + else: + raise ValueError("Code " + code_name + " not available. Available codes: " + ", ".join(available_codes)) + + if args.perm == "canonical": + qc1, qc2, qc3, qc4 = canonical_steane_type_prep_circuits(code) + perm = "canonical" + elif args.perm == "random": + qc1, qc2, qc3, qc4, perm = random_steane_type_prep_circuits(code) + else: + raise ValueError("Permutation " + args.perm + " not available. Available permutations: 'canonical, random'") + + sim = SteaneNDFTStatePrepSimulator( + qc1, qc2, code, qc3, qc4, check_circuit=heuristic_prep_circuit(code, zero_state=False).circ + ) + sim.set_p(args.p_error, args.p_error * 0.01) + + if args.error_type == "X": + p_l, r_a, num_logical_errors, total_shots, p_l_error, r_a_error = sim.logical_error_rate( + min_errors=args.n_errors + ) + elif args.error_type == "Z": + p_l, r_a, num_logical_errors, total_shots, p_l_error, r_a_error = sim.secondary_logical_error_rate( + min_errors=args.n_errors + ) + + print( + ";".join([ + str(x) for x in [args.p_error, p_l, r_a, num_logical_errors, total_shots, p_l_error, r_a_error, perm] + ]) + ) + + +if __name__ == "__main__": + main() diff --git a/scripts/ft_stateprep/canonical_steane/run_parallel.sh b/scripts/ft_stateprep/canonical_steane/run_parallel.sh new file mode 100755 index 000000000..48ac9e383 --- /dev/null +++ b/scripts/ft_stateprep/canonical_steane/run_parallel.sh @@ -0,0 +1,16 @@ +#!/bin/bash + + +declare -a p=("0.001" "0.0015" "0.002" "0.0025" "0.003" "0.0035" "0.004" "0.0045" "0.005" "0.0055" "0.006" "0.0065" "0.007" "0.0075" "0.008" "0.0085" "0.009" "0.0095" "0.01") + +echo "p;p_l;r_a;num_logical_errors;total_shots;p_l_error;r_a_error" > "$1.csv" + +run_and_write() { + local res=$(python estimate_canonical.py ${@:2:$#-2} "-p" "${@: -1}") + local line="${@: -1};${res}" + (flock -e 200 echo $line >> "$1.csv") 200>lock +} + +export -f run_and_write + +parallel --load 16 --link run_and_write $@ ::: ${p[@]} From 1ac2a39094028c85823c195eddb4dbf43568cdf0 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 26 Mar 2025 17:06:44 +0100 Subject: [PATCH 053/156] edit heuristic_gauss add functionality that constructs a circuit based on a reference circuit such that fault sets of both do not overlap --- .../qecc/circuit_synthesis/synthesis_utils.py | 116 ++++++++++++++++-- 1 file changed, 109 insertions(+), 7 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index fe24b3666..e0726c5df 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -85,9 +85,25 @@ def iterative_search_with_timeout( curr_param = min_param return None, max_param +def print_dynamic_eliminations(eliminations, failed_cnots) -> None: + """Prints the eliminations list dynamically on a single line. + + Parameters: + - eliminations: List of (control, target) tuples representing CNOT operations. + """ + # Clear both lines + sys.stdout.write("\r" + " " * 1000 + "\r") # Clear line 1 + + # Print the updated lists + sys.stdout.write(f"\rCurrent Eliminations: {eliminations} | Failed CNOTs: {failed_cnots}") + sys.stdout.flush() + def heuristic_gaussian_elimination( - matrix: npt.NDArray[np.int8], parallel_elimination: bool = True, penalty_cols: list[int] | None = None + matrix: npt.NDArray[np.int8], + parallel_elimination: bool = True, + penalty_cols: list[tuple[int]] | None = None, + ref_spc: StatePrepCircuit | None = None, ) -> tuple[npt.NDArray[np.int8], list[tuple[int, int]]]: """Perform Gaussian elimination on the column space of a matrix using as few eliminations as possible. @@ -98,7 +114,8 @@ def heuristic_gaussian_elimination( Args: matrix: The matrix to perform Gaussian elimination on. parallel_elimination: Whether to prioritize elimination steps that act on disjoint columns. - penalty_cols: indices of qubits whose CNOT connection shall occur earlier in the circuit + penalty_cols: tuples of CNOTs (control, target) which are initially added to the failed_cnots list and hence can only be applied once the control qubit has been used elsewhere + ref_spc: reference SPC of which the fault set determines the construction of the new circuit Returns: The reduced matrix and a list of the elimination steps taken. The elimination steps are represented as tuples of the form (i, j) where i is the column being eliminated with and j is the column being eliminated. @@ -118,18 +135,37 @@ def is_reduced() -> bool: costs -= np.sum(matrix, axis=0) np.fill_diagonal(costs, 1) # NOTE: set the penalty terms to be higher than 0 to be ignored. - for i in penalty_cols: - for j in penalty_cols: - costs[i][j] = 1 + # for i in penalty_cols: + # for j in penalty_cols: + # costs[i][j] = 1 used_columns = [] # type: list[np.int_] eliminations = [] # type: list[tuple[int, int]] + # NOTE: set up variables for distinct fault set construction + if ref_spc is not None: + # matrix that describes how and error happening at qubit i would propagate right now through + # the circuit + x_propagation_matrix: npt.NDArray[np.int8] = np.eye(matrix.shape[1], dtype=np.int8) + z_propagation_matrix: npt.NDArray[np.int8] = np.eye(matrix.shape[1], dtype=np.int8) + # fill fault set with all possible non-propagated single errors + current_x_fs = np.empty((0, matrix.shape[1]), dtype=np.int8) + current_z_fs = np.empty((0, matrix.shape[1]), dtype=np.int8) + backtrack_required: bool = False + print("calculating reference fault sets") + x_fs, _z_fs = get_fs_based_on_d(ref_spc) + print("finished calculating fault sets") + stack = [] + failed_cnots = penalty_cols + used_cnots = [] while not is_reduced(): + # flag in case algorithm can only choose CNOT that would violate t-distinctness + deadend = False + m = np.zeros((matrix.shape[1], matrix.shape[1]), dtype=bool) # type: npt.NDArray[np.bool_] m[used_columns, :] = True m[:, used_columns] = True - costs_unused = np.ma.array(costs, mask=m) # type: ignore[no-untyped-call] + if np.all(costs_unused >= 0) or len(used_columns) == matrix.shape[1]: # no more reductions possible if used_columns == []: # local minimum => get out by making matrix triangular logger.warning("Local minimum reached. Making matrix triangular.") @@ -144,8 +180,74 @@ def is_reduced() -> bool: used_columns = [] continue - i, j = np.unravel_index(np.argmin(costs_unused), costs.shape) + if ref_spc is not None: + # Get all valid (i, j) pairs sorted by cost + candidate_indices = np.argsort(costs_unused.flatten()) # Flatten and sort by value + candidate_pairs = [np.unravel_index(idx, costs.shape) for idx in candidate_indices] + + # Find the first (i, j) that does NOT cause overlap + for i, j in candidate_pairs: + if (int(i), int(j)) in failed_cnots or (int(i), int(j)) in used_cnots: + continue + + if costs_unused[i, j] >= 0 and backtrack_required: # level has been checked completely + x_propagation_matrix, z_propagation_matrix, used_columns, matrix, costs, used_cnots, _ = stack.pop() + removed_cnot = eliminations.pop() + failed_cnots = [fcnot for fcnot in failed_cnots if removed_cnot[0] != fcnot[0]] + print_dynamic_eliminations(eliminations, failed_cnots) + backtrack_required = False + deadend = True + break + + if costs_unused[i, j] >= 0: # level has been checked once but possibly not completely + used_columns = [] + deadend = True + backtrack_required = True + break + + used_cnots.append((int(i), int(j))) + + new_x_error, next_x_propagation_matrix = get_next_error( + propagation_matrix=x_propagation_matrix.copy(), cnot_gate=(int(i), int(j)) + ) + new_z_error, next_z_propagation_matrix = get_next_error( + propagation_matrix=z_propagation_matrix.copy(), cnot_gate=(int(i), int(j)), x_error=False + ) + trial_x_fs = np.append(current_x_fs, [new_x_error], axis=0) + trial_z_fs = np.append(current_z_fs, [new_z_error], axis=0) + + # Check if there is no overlap—if true, accept (i, j) + # NOTE: this needs to be updated. So far I am checking only error one events of the new circuit against error one and two + # events of the reference circuit, but it can also happen that a two error event of the new circuit overlaps with some + # error one event of the reference circuit, which is neglected here. + if not ref_spc.check_fs_overlap( + x_fs, trial_x_fs + ): # and not ref_spc.check_fs_overlap(z_fs, trial_z_fs, x_error=False): + stack.append(( + x_propagation_matrix.copy(), + z_propagation_matrix.copy(), + used_columns.copy(), + matrix.copy(), + costs.copy(), + used_cnots.copy(), + failed_cnots.copy(), + )) + used_cnots = [] + failed_cnots = [fcnot for fcnot in failed_cnots if int(i) != fcnot[0]] + current_x_fs = trial_x_fs + current_z_fs = trial_z_fs + x_propagation_matrix = next_x_propagation_matrix + z_propagation_matrix = next_z_propagation_matrix + break + failed_cnots.append((int(i), int(j))) + print_dynamic_eliminations(eliminations, failed_cnots) + + else: + i, j = np.unravel_index(np.argmin(costs_unused), costs.shape) + if deadend: + continue eliminations.append((int(i), int(j))) + print_dynamic_eliminations(eliminations, failed_cnots) if parallel_elimination: used_columns.append(i) From d8cb4756f5cdab86c8521352139682185682937b Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 26 Mar 2025 17:21:18 +0100 Subject: [PATCH 054/156] add function to find next error building the circuit from behind we can track the current fault set of the circuit live and hence decide which cnot can be build without violating fault set overlaps. --- .../qecc/circuit_synthesis/synthesis_utils.py | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index e0726c5df..3b4fa3137 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -4,6 +4,7 @@ import functools import logging +import sys from typing import TYPE_CHECKING, Any import multiprocess @@ -85,6 +86,7 @@ def iterative_search_with_timeout( curr_param = min_param return None, max_param + def print_dynamic_eliminations(eliminations, failed_cnots) -> None: """Prints the eliminations list dynamically on a single line. @@ -264,6 +266,43 @@ def is_reduced() -> bool: return matrix, eliminations +def get_next_error( + propagation_matrix: npt.NDArray[np.int8], cnot_gate: tuple[int, int], x_error: bool = True +) -> tuple[npt.NDArray[np.int8], npt.NDArray[np.int8]]: + """Propagates a single X or Z error through a CNOT gate in the circuit. + + This function updates the error propagation matrix when a new CNOT gate is applied. + Each row in the matrix represents the propagated error if a single X or Z error occurs on that qubit. + + Args: + propagation_matrix (npt.NDArray[np.int8]): + Current error propagation matrix (shape: [n_qubits, n_qubits]). + cnot_gate (Tuple[int, int]): + A tuple representing the new CNOT gate (control, target). + x_error (bool, optional): + Flag indicating whether to propagate X errors (True) or Z errors (False). + Defaults to True. + + Returns: + Tuple[npt.NDArray[np.int8], npt.NDArray[np.int8]]: + - The propagated error (affected row of the matrix). + - The updated error propagation matrix. + + """ + # NOTE: This implementation assumes single error events only. For higher-order errors, adjustments are required. + control, target = cnot_gate + + control_row = propagation_matrix[control] + target_row = propagation_matrix[target] + + if x_error: + propagation_matrix[control] = np.bitwise_xor(control_row, target_row) + return propagation_matrix[control], propagation_matrix + + propagation_matrix[target] = np.bitwise_xor(control_row, target_row) + return propagation_matrix[target], propagation_matrix + + def get_permutation_group(group_generators: list[list[int]]) -> list[Permutation]: """Based on the generators of the permutation group find the whole permutation group. From e34ae295c97f706d769268aed56cfa15631b1cf4 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 26 Mar 2025 17:23:49 +0100 Subject: [PATCH 055/156] change check mutual disjunctness function before the function checked for overlaps in x as well as z fault sets, but now one can choose to only check one (default x) This was done as for bigger codes we cannot expect to have no overlap in both fault sets, so we have to consider fault sets individually --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 3b4fa3137..cd420169f 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -318,7 +318,7 @@ def get_permutation_group(group_generators: list[list[int]]) -> list[Permutation def check_mutually_disjointness_spcs( - c_spcs: list[StatePrepCircuit], p_spcs: list[StatePrepCircuit] + c_spcs: list[StatePrepCircuit], p_spcs: list[StatePrepCircuit], x_error: bool = True ) -> list[StatePrepCircuit]: """Check if potential SPCs have mutually disjoint fault set with all current SPCs. @@ -328,10 +328,14 @@ def check_mutually_disjointness_spcs( Args: c_spcs: current SPCs that are already mutually disjoint in terms of fault sets p_spcs: potential SPCs that shall be tested for mutually disjointness against the current set + x_error: flag that decides if check happens for x errors or z errors """ i = 0 while i < len(p_spcs): pspc = p_spcs[i] + # NOTE: check if it is not better to use the big fault set of the current SPC here as those sets have already been + # calculated and do not need to be calculated again + # FIX: big fs calculation should be only done for the current elements if there are more candidates than current elements px_fs, pz_fs = get_fs_based_on_d(pspc) # Check against *all* existing and newly added elements in c_spcs @@ -340,7 +344,10 @@ def check_mutually_disjointness_spcs( # This might need adjustments for different distances. x_fs = _spc.compute_fault_set() z_fs = _spc.compute_fault_set(x_errors=False) - if _spc.check_fs_overlap(x_fs, px_fs) or _spc.check_fs_overlap(z_fs, pz_fs): + if x_error: + if _spc.check_fs_overlap(x_fs, px_fs): + break + elif _spc.check_fs_overlap(z_fs, pz_fs, x_error=False): break # Stop checking if there's an overlap else: # No overlap found, so add pspc c_spcs.append(pspc) From 0d864840bfc9f40dfdfee4fc4c6b4919803d066b Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 26 Mar 2025 17:26:46 +0100 Subject: [PATCH 056/156] change distance based fault set calculation for the distance 7 case it is necessary to also consider weight 3 errors of the single fault set, as otherwise we would allow the situation where 2 weight 3 errors cancel but then a simple weight 1 error can happen somewhere at the end of the circuit, leaving a weight 4 error and hence violating fault tolerance --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index cd420169f..99f3ef385 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -381,6 +381,9 @@ def filter_fault_set(fault_set: npt.NDArray[np.int8], threshold: int) -> npt.NDA fault_set_x_1, fault_set_z_1 = compute_fault_sets(1) + if spc.code.distance == 3: + return fault_set_x_1, fault_set_z_1 + if spc.code.distance == 5: return filter_fault_set(fault_set_x_1, 2), filter_fault_set(fault_set_z_1, 2) @@ -388,11 +391,11 @@ def filter_fault_set(fault_set: npt.NDArray[np.int8], threshold: int) -> npt.NDA fault_set_x_2, fault_set_z_2 = compute_fault_sets(2) return ( np.vstack([ - filter_fault_set(fault_set_x_1, 3), + filter_fault_set(fault_set_x_1, 2), filter_fault_set(fault_set_x_2, 3), ]), np.vstack([ - filter_fault_set(fault_set_z_1, 3), + filter_fault_set(fault_set_z_1, 2), filter_fault_set(fault_set_z_2, 3), ]), ) From 9471f0d5e2e25a2257c3d3f7f68e420bcf737ae7 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 26 Mar 2025 17:29:56 +0100 Subject: [PATCH 057/156] change build funciton for cnot circuit make the function also work for circuits without hadamards --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 99f3ef385..f9e0c3462 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -567,7 +567,8 @@ def build_css_circuit_from_cnot_list(n: int, cnots: list[tuple[int, int]], hadam The quantum circuit. """ circ = QuantumCircuit(n) - circ.h(hadamards) + if hadamards: + circ.h(hadamards) for i, j in cnots: circ.cx(i, j) return circ From 90357d612f78c201c4bb453305fa0e4cab958d52 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Fri, 28 Mar 2025 09:37:54 +0100 Subject: [PATCH 058/156] reference based heuristic changed to reference fault sets and speed ups Now we can construct a reference circuit based on fault sets that we provide. Before only the fault set of the given reference SPC was used. It is now possible to also find circuits based on other fault sets. We have introduced some speed ups to the function. We save now errors that have shown to be overlapping to prevent recalculation of those errors. We also now only check the overlap with the new error and not with the whole provisional fault set anymore. --- .../qecc/circuit_synthesis/synthesis_utils.py | 102 +++++++++++++----- 1 file changed, 75 insertions(+), 27 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index f9e0c3462..197d0d3ae 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -106,6 +106,9 @@ def heuristic_gaussian_elimination( parallel_elimination: bool = True, penalty_cols: list[tuple[int]] | None = None, ref_spc: StatePrepCircuit | None = None, + ref_x_fs: npt.NDArray[np.int8] | None = None, + ref_z_fs: npt.NDArray[np.int8] | None = None, + guide_by_x: bool = True, ) -> tuple[npt.NDArray[np.int8], list[tuple[int, int]]]: """Perform Gaussian elimination on the column space of a matrix using as few eliminations as possible. @@ -124,6 +127,14 @@ def heuristic_gaussian_elimination( """ if penalty_cols is None: penalty_cols = [] + if ref_x_fs is None: + ref_x_fs = np.empty((0,), dtype=np.int8) + if ref_z_fs is None: + ref_z_fs = np.empty((0,), dtype=np.int8) + if not ((ref_x_fs.size or ref_z_fs.size) ^ (ref_spc is None)): + msg = "It is necessary to either provide both a reference SPC and at least one fault set or nothing." + raise ValueError(msg) + matrix = matrix.copy() rank = mod2.rank(matrix) @@ -136,32 +147,26 @@ def is_reduced() -> bool: costs -= np.sum(matrix, axis=0) np.fill_diagonal(costs, 1) - # NOTE: set the penalty terms to be higher than 0 to be ignored. - # for i in penalty_cols: - # for j in penalty_cols: - # costs[i][j] = 1 used_columns = [] # type: list[np.int_] eliminations = [] # type: list[tuple[int, int]] + failed_cnots = penalty_cols + used_cnots = [] # NOTE: set up variables for distinct fault set construction if ref_spc is not None: - # matrix that describes how and error happening at qubit i would propagate right now through + # matrix that describes how an error happening at qubit i would propagate right now through # the circuit x_propagation_matrix: npt.NDArray[np.int8] = np.eye(matrix.shape[1], dtype=np.int8) z_propagation_matrix: npt.NDArray[np.int8] = np.eye(matrix.shape[1], dtype=np.int8) - # fill fault set with all possible non-propagated single errors - current_x_fs = np.empty((0, matrix.shape[1]), dtype=np.int8) - current_z_fs = np.empty((0, matrix.shape[1]), dtype=np.int8) + np.empty((0, matrix.shape[1]), dtype=np.int8) + np.empty((0, matrix.shape[1]), dtype=np.int8) backtrack_required: bool = False - print("calculating reference fault sets") - x_fs, _z_fs = get_fs_based_on_d(ref_spc) - print("finished calculating fault sets") + overlapping_errors_x = set() + overlapping_errors_z = set() stack = [] - failed_cnots = penalty_cols - used_cnots = [] while not is_reduced(): # flag in case algorithm can only choose CNOT that would violate t-distinctness - deadend = False + deadend: bool = False m = np.zeros((matrix.shape[1], matrix.shape[1]), dtype=bool) # type: npt.NDArray[np.bool_] m[used_columns, :] = True @@ -195,13 +200,16 @@ def is_reduced() -> bool: if costs_unused[i, j] >= 0 and backtrack_required: # level has been checked completely x_propagation_matrix, z_propagation_matrix, used_columns, matrix, costs, used_cnots, _ = stack.pop() removed_cnot = eliminations.pop() - failed_cnots = [fcnot for fcnot in failed_cnots if removed_cnot[0] != fcnot[0]] + if guide_by_x: + failed_cnots = [fcnot for fcnot in failed_cnots if removed_cnot[0] != fcnot[0]] + else: + failed_cnots = [fcnot for fcnot in failed_cnots if removed_cnot[1] != fcnot[1]] print_dynamic_eliminations(eliminations, failed_cnots) backtrack_required = False deadend = True break - - if costs_unused[i, j] >= 0: # level has been checked once but possibly not completely + # level has been checked once but possibly not completely due to parallelization + if costs_unused[i, j] >= 0: used_columns = [] deadend = True backtrack_required = True @@ -215,16 +223,51 @@ def is_reduced() -> bool: new_z_error, next_z_propagation_matrix = get_next_error( propagation_matrix=z_propagation_matrix.copy(), cnot_gate=(int(i), int(j)), x_error=False ) - trial_x_fs = np.append(current_x_fs, [new_x_error], axis=0) - trial_z_fs = np.append(current_z_fs, [new_z_error], axis=0) + + # INFO: Quickly check if new error is known to cause overlap. This saves another long overlap check. + new_x_error_tuple = tuple(new_x_error.flatten()) + new_z_error_tuple = tuple(new_z_error.flatten()) + if new_x_error_tuple in overlapping_errors_x: + continue + if new_z_error_tuple in overlapping_errors_z: + continue + + new_x_error = np.expand_dims(new_x_error, axis=0) + new_z_error = np.expand_dims(new_z_error, axis=0) + + # trial_x_fs = np.append(current_x_fs, [new_x_error], axis=0) + # trial_z_fs = np.append(current_z_fs, [new_z_error], axis=0) # Check if there is no overlap—if true, accept (i, j) # NOTE: this needs to be updated. So far I am checking only error one events of the new circuit against error one and two # events of the reference circuit, but it can also happen that a two error event of the new circuit overlaps with some # error one event of the reference circuit, which is neglected here. - if not ref_spc.check_fs_overlap( - x_fs, trial_x_fs - ): # and not ref_spc.check_fs_overlap(z_fs, trial_z_fs, x_error=False): + found_cnot = False + + # only calculate overlap if reference fault set is given (optimization) + if ref_x_fs.size: + x_overlap: bool = ref_spc.check_fs_overlap(ref_x_fs, new_x_error) + if ref_z_fs.size: + z_overlap: bool = ref_spc.check_fs_overlap(ref_z_fs, new_z_error, x_error=False) + + if ref_x_fs.size and ref_z_fs.size: + # Both sets provided: Enter if **both** overlaps fail + found_cnot = not (x_overlap or z_overlap) + if not found_cnot: + overlapping_errors_x.add(new_x_error_tuple) + overlapping_errors_z.add(new_z_error_tuple) + elif ref_x_fs.size: + # Only x-set provided: Enter if **x_overlap** fails + found_cnot = not x_overlap + if not found_cnot: + overlapping_errors_x.add(new_x_error_tuple) + elif ref_z_fs.size: + # Only z-set provided: Enter if **z_overlap** fails + found_cnot = not z_overlap + if not found_cnot: + overlapping_errors_z.add(new_z_error_tuple) + + if found_cnot: stack.append(( x_propagation_matrix.copy(), z_propagation_matrix.copy(), @@ -235,11 +278,16 @@ def is_reduced() -> bool: failed_cnots.copy(), )) used_cnots = [] - failed_cnots = [fcnot for fcnot in failed_cnots if int(i) != fcnot[0]] - current_x_fs = trial_x_fs - current_z_fs = trial_z_fs - x_propagation_matrix = next_x_propagation_matrix - z_propagation_matrix = next_z_propagation_matrix + if guide_by_x: + failed_cnots = [fcnot for fcnot in failed_cnots if int(i) != fcnot[0]] + else: + failed_cnots = [fcnot for fcnot in failed_cnots if int(j) != fcnot[1]] + + if ref_x_fs.size and not x_overlap: + x_propagation_matrix = next_x_propagation_matrix + elif ref_z_fs.size and not z_overlap: + z_propagation_matrix = next_z_propagation_matrix + break failed_cnots.append((int(i), int(j))) print_dynamic_eliminations(eliminations, failed_cnots) From 06ed52333ddee2954ec2262b50b776632a7346c7 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Fri, 28 Mar 2025 09:43:28 +0100 Subject: [PATCH 059/156] define default for faulst set overlap check if one of the two fault sets provided is empty, return False (no overlap) by default. --- src/mqt/qecc/circuit_synthesis/state_prep.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index b389bc389..ebd5c0077 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -233,8 +233,19 @@ def _set_max_errors(self) -> None: def check_fs_overlap(self, fs_1: npt.NDArray[np.int8], fs_2: npt.NDArray[np.int8], x_error: bool = True) -> bool: """Returns True if there is an overlap between both fault sets.""" # TODO: add method docstring and argument descriptions + # check if one of the fault sets is empty. If so, default is no overlap + if not fs_1.size or not fs_2.size: + return False check_fn = self.code.stabilizer_eq_x_error if x_error else self.code.stabilizer_eq_z_error return any(check_fn(f1, f2) for f1 in fs_1 for f2 in fs_2) + # check_fn = self.code.stabilizer_eq_x_error if x_error else self.code.stabilizer_eq_z_error + # for f1 in fs_1: + # for f2 in fs_2: + # if check_fn(f1, f2): + # print(f"\nOverlap found: f1={f1}, f2={f2}\nx-error:{x_error}") + # return True # Return immediately after finding the first overlap + # + # return False # Return False if no overlaps are found def _build_state_prep_circuit_from_back( From 77b4155233f0c70f88b7a570baf0289a25f1dd78 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Mon, 31 Mar 2025 13:53:34 +0200 Subject: [PATCH 060/156] Fix canonical permutation. --- .../canonical_steane/estimate_canonical.py | 3 +-- src/mqt/qecc/circuit_synthesis/state_prep.py | 14 +++++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/scripts/ft_stateprep/canonical_steane/estimate_canonical.py b/scripts/ft_stateprep/canonical_steane/estimate_canonical.py index d33f645ae..ebb917811 100644 --- a/scripts/ft_stateprep/canonical_steane/estimate_canonical.py +++ b/scripts/ft_stateprep/canonical_steane/estimate_canonical.py @@ -14,12 +14,11 @@ def main() -> None: """Run the logical error rate estimation for a given code and physical error rate.""" - available_codes = ["steane", "tetrahedral", "shor", "surface", "cc_4_8_8", "cc_6_6_6", "hamming", "carbon"] parser = argparse.ArgumentParser(description="Estimate logical error rate for CSS state preparation circuits") parser.add_argument( "code", type=str, - help="Code for which to estimate logical error rate. Available codes: " + ", ".join(available_codes), + help="Code for which to estimate logical error rate. Available codes: " + ", ".join(codes), ) parser.add_argument("-p", "--p_error", type=float, help="Physical error rate") parser.add_argument("-n", "--n_errors", type=int, default=500, help="Number of errors to sample") diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 6de99689a..9327cb09d 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -563,6 +563,7 @@ def find_swapping_permutation(lists: list[list[int]]) -> dict[int, int]: """ # Step 1: Compute candidate pairs for each list. list_candidates = [] + lists = [lst for lst in lists if len(lst) > 4] for xs in lists: cand = set() for i in range(3): # first three elements @@ -696,17 +697,24 @@ def canonical_steane_type_prep_circuits( c3 = _permute_commuting_cnots(trgt_order, ctrl_order, id_trgt, pi_ctrl) # collect cnots in c3 with same target into groups - c3_groups = defaultdict(set) + c3_groups = defaultdict(list) for cnot in c3: - c3_groups[cnot[1]].add(cnot[0]) + c3_groups[cnot[1]].append(cnot[0]) # we need to find a permutation that fulfills the following for all groups of targets: # - map the first three elements into the second half # - map the last element into the first half # No conflicts should occur lists = list(trgt_order.values()) + pi_swaps = find_swapping_permutation(lists) - pi = [pi_swaps[x] for x in trgts] + + pi = [] + for x in trgts: + if x in pi_swaps: + pi.append(pi_swaps[x]) + else: + pi.append(x) # apply pi # use pi to order c3_groups c4 = [] From 33970bacaa3998124027f3c098ebb293842cc616 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Tue, 1 Apr 2025 14:26:16 +0200 Subject: [PATCH 061/156] Removed old variable. --- scripts/ft_stateprep/canonical_steane/estimate_canonical.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ft_stateprep/canonical_steane/estimate_canonical.py b/scripts/ft_stateprep/canonical_steane/estimate_canonical.py index ebb917811..a40727815 100644 --- a/scripts/ft_stateprep/canonical_steane/estimate_canonical.py +++ b/scripts/ft_stateprep/canonical_steane/estimate_canonical.py @@ -37,7 +37,7 @@ def main() -> None: if code_name in codes: code = codes[code_name] else: - raise ValueError("Code " + code_name + " not available. Available codes: " + ", ".join(available_codes)) + raise ValueError("Code " + code_name + " not available. Available codes: " + ", ".join(codes)) if args.perm == "canonical": qc1, qc2, qc3, qc4 = canonical_steane_type_prep_circuits(code) From 945449a5a5dda0daf9b7ddba708d896623574113 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Wed, 2 Apr 2025 11:06:48 +0200 Subject: [PATCH 062/156] Improve memory usage. --- src/mqt/qecc/circuit_synthesis/simulation.py | 22 +++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 5f932e1b9..6ab31d0d6 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -78,7 +78,7 @@ def __init__( self.set_p(p, p_idle) - def set_p(self, p: float, p_idle: float | None = None, error_free_qubits=[]) -> int: + def set_p(self, p: float, p_idle: float | None = None, error_free_qubits=None) -> int: """Set the error rate and initialize the stim circuit. This overwrites the previous stim circuit. @@ -87,6 +87,8 @@ def set_p(self, p: float, p_idle: float | None = None, error_free_qubits=[]) -> p: The error rate. p_idle: Idling error rate. If None, it is set to p. """ + if error_free_qubits is None: + error_free_qubits = [] self.n_measurements = 0 self.p = p self.p_idle = p if p_idle is None else p_idle @@ -558,7 +560,7 @@ def _compute_postselection_indices(self) -> int: return 3 * self.code.n return self.code.n - def set_p(self, p: float, p_idle: float | None = None, error_free_qubits=[]) -> None: + def set_p(self, p: float, p_idle: float | None = None, error_free_qubits=None) -> None: """Set the error rate and initialize the stim circuit. This overwrites the previous stim circuit. @@ -567,11 +569,14 @@ def set_p(self, p: float, p_idle: float | None = None, error_free_qubits=[]) -> p: The error rate. p_idle: Idling error rate. If None, it is set to p. """ + if error_free_qubits is None: + error_free_qubits = [] super().set_p(p, p_idle, error_free_qubits) if self.secondary_error_gadget is None: return self.secondary_stim_circ = self.to_stim_circ( - self.secondary_error_gadget, error_free_qubits=list(range(4 * self.code.n, 5 * self.code.n)) + error_free_qubits + self.secondary_error_gadget, + error_free_qubits=list(range(4 * self.code.n, 5 * self.code.n)) + error_free_qubits, ) self.secondary_stim_circ.append("DEPOLARIZE1", list(range(4 * self.code.n, 5 * self.code.n)), [self.p]) n_measurements = self._compute_postselection_indices() @@ -814,11 +819,14 @@ def _generate_lut( # Create a generator of all combinations for this weight. comb_iter = itertools.combinations(range(n_qubits), weight) # Split the combinations into chunks. - chunks = list(_chunked_iterable(comb_iter, chunk_size)) + chunks = _chunked_iterable(comb_iter, chunk_size) weight_dict = {} with concurrent.futures.ProcessPoolExecutor(max_workers=num_workers) as executor: - futures = [executor.submit(_process_combinations_chunk, chunk, checks, n_qubits) for chunk in chunks] + d2 = weight_dict.copy() + futures = [ + executor.submit(_process_combinations_chunk, chunk, checks, n_qubits, d2) for chunk in chunks + ] if print_progress: for future in tqdm( concurrent.futures.as_completed(futures), total=len(futures), desc=f"Weight {weight}" @@ -851,7 +859,7 @@ def _chunked_iterable(iterable, chunk_size): yield chunk -def _process_combinations_chunk(chunk, checks, n_qubits): +def _process_combinations_chunk(chunk, checks, n_qubits, weight_map): """Process a chunk of combinations. For each combination, construct the binary state, compute its syndrome, and add it to a dictionary if not already present. @@ -868,7 +876,7 @@ def _process_combinations_chunk(chunk, checks, n_qubits): syndrome_bytes = syndrome.tobytes() # Since all states here have the same weight, # we keep the first encountered state for a given syndrome. - if syndrome_bytes not in chunk_dict: + if syndrome_bytes not in weight_map and syndrome_bytes not in chunk_dict: chunk_dict[syndrome_bytes] = state.copy() return chunk_dict From 4f1dba3187cbcbbf36b15920b5f7b75d1e5dcbd2 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Thu, 3 Apr 2025 12:44:59 +0200 Subject: [PATCH 063/156] Remove unnecessary stabilizer measurements in simulation. --- src/mqt/qecc/circuit_synthesis/simulation.py | 25 +++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 6ab31d0d6..56f2db1ec 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -94,8 +94,6 @@ def set_p(self, p: float, p_idle: float | None = None, error_free_qubits=None) - self.p_idle = p if p_idle is None else p_idle self.stim_circ = self.to_stim_circ(self.circ, error_free_qubits=error_free_qubits) n_measurements = self._compute_postselection_indices() - self.x_measurements, self.z_measurements = self.measure_stabilizers(self.stim_circ, n_measurements) - n_measurements += len(self.x_measurements) + len(self.z_measurements) if self.zero_state: self.data_measurements = self.measure_z(self.stim_circ, n_measurements) else: @@ -263,10 +261,11 @@ def logical_error_rate( num_logical_errors = 0 - if self.zero_state: - self.decoder.generate_x_lut() - else: - self.decoder.generate_z_lut() + if self.decoder is None: + if self.zero_state: + self.decoder.generate_x_lut() + else: + self.decoder.generate_z_lut() i = 1 while i <= int(np.ceil(shots / batch)) or at_least_min_errors: @@ -312,11 +311,11 @@ def _simulate_batch(self, shots: int = 1024) -> tuple[int, int]: state = filtered_events[:, self.data_measurements] if self.zero_state: - checks = filtered_events[:, self.z_measurements] - observables = self.code.Lz + checks = ((state@self.code.Hx.T) % 2).astype(np.int8) + observables = self.code.Lz % 2 estimates = self.decoder.batch_decode_x(checks) else: - checks = filtered_events[:, self.x_measurements] + checks = ((state@self.code.Hz.T) % 2).astype(np.int8) observables = self.code.Lx estimates = self.decoder.batch_decode_z(checks) @@ -585,9 +584,7 @@ def set_p(self, p: float, p_idle: float | None = None, error_free_qubits=None) - range(n_measurements, n_measurements + self.code.n) ) # add measurements of the initial data qubit n_measurements += self.code.n - self.secondary_x_measurements, self.secondary_z_measurements = self.measure_stabilizers( - self.secondary_stim_circ, n_measurements, data_index=4 * self.code.n - ) + if self.zero_state: self.secondary_data_measurements = self.measure_x( self.secondary_stim_circ, n_measurements, data_index=4 * self.code.n @@ -670,7 +667,7 @@ def logical_error_rate( shots, shots_per_batch, at_least_min_errors, min_errors ) - p_l_error = np.sqrt(p_l * (1 - p_l) / total_shots) + p_l_error = np.sqrt(p_l * (1 - p_l) / (r_a*total_shots)) r_a_error = np.sqrt(r_a * (1 - r_a) / total_shots) return p_l, r_a, num_logical_errors, total_shots, p_l_error, r_a_error @@ -726,7 +723,7 @@ def secondary_logical_error_rate( # shots, shots_per_batch, at_least_min_errors, min_errors # ) - p_l_error = np.sqrt(p_l * (1 - p_l) / total_shots) + p_l_error = np.sqrt(p_l * (1 - p_l) / (r_a*total_shots)) r_a_error = np.sqrt(r_a * (1 - r_a) / total_shots) return p_l, r_a, num_logical_errors, total_shots, p_l_error, r_a_error From 599d0af84196040433e5e67a980f598fb3b995fb Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Mon, 7 Apr 2025 09:22:18 +0200 Subject: [PATCH 064/156] Indent --- src/mqt/qecc/circuit_synthesis/state_prep.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 9327cb09d..9321df746 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -638,8 +638,8 @@ def random_steane_type_prep_circuits( """Return four circuits in permuted standard form that prepare the +1 eigenstate of the code w.r.t. the Z or X basis that can implement Steane-type FTSP. Args: - code: The CSS code to prepare the state for. - zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. + code: The CSS code to prepare the state for. + zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. Returns: A tuple of four state preparation circuits for the code. """ From f18def02cf28c4bc6de7f9915e211de98b61d226 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 07:23:25 +0000 Subject: [PATCH 065/156] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mqt/qecc/circuit_synthesis/simulation.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 56f2db1ec..037226d21 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -311,11 +311,11 @@ def _simulate_batch(self, shots: int = 1024) -> tuple[int, int]: state = filtered_events[:, self.data_measurements] if self.zero_state: - checks = ((state@self.code.Hx.T) % 2).astype(np.int8) + checks = ((state @ self.code.Hx.T) % 2).astype(np.int8) observables = self.code.Lz % 2 estimates = self.decoder.batch_decode_x(checks) else: - checks = ((state@self.code.Hz.T) % 2).astype(np.int8) + checks = ((state @ self.code.Hz.T) % 2).astype(np.int8) observables = self.code.Lx estimates = self.decoder.batch_decode_z(checks) @@ -584,7 +584,7 @@ def set_p(self, p: float, p_idle: float | None = None, error_free_qubits=None) - range(n_measurements, n_measurements + self.code.n) ) # add measurements of the initial data qubit n_measurements += self.code.n - + if self.zero_state: self.secondary_data_measurements = self.measure_x( self.secondary_stim_circ, n_measurements, data_index=4 * self.code.n @@ -667,7 +667,7 @@ def logical_error_rate( shots, shots_per_batch, at_least_min_errors, min_errors ) - p_l_error = np.sqrt(p_l * (1 - p_l) / (r_a*total_shots)) + p_l_error = np.sqrt(p_l * (1 - p_l) / (r_a * total_shots)) r_a_error = np.sqrt(r_a * (1 - r_a) / total_shots) return p_l, r_a, num_logical_errors, total_shots, p_l_error, r_a_error @@ -723,7 +723,7 @@ def secondary_logical_error_rate( # shots, shots_per_batch, at_least_min_errors, min_errors # ) - p_l_error = np.sqrt(p_l * (1 - p_l) / (r_a*total_shots)) + p_l_error = np.sqrt(p_l * (1 - p_l) / (r_a * total_shots)) r_a_error = np.sqrt(r_a * (1 - r_a) / total_shots) return p_l, r_a, num_logical_errors, total_shots, p_l_error, r_a_error From ff4ac1d3625c39097525adb8b45b0f4ad028d642 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 7 Apr 2025 16:14:07 +0200 Subject: [PATCH 066/156] update octagon distance 7 simulation circuits correct non-fault tolerant set of circuits --- .../cc_4_8_8_d7/cc_4_8_8_d7_heuristic_1 | 102 ++++++++------- .../cc_4_8_8_d7/cc_4_8_8_d7_heuristic_2 | 105 +++++++++------- .../cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3 | 118 +++++++++++------- 3 files changed, 184 insertions(+), 141 deletions(-) diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_1 index 3c36afa8b..7669ce99f 100644 --- a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_1 +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_1 @@ -2,63 +2,69 @@ OPENQASM 2.0; include "qelib1.inc"; qreg q[31]; h q[0]; -h q[1]; h q[2]; -h q[3]; -h q[4]; -h q[5]; -h q[6]; -h q[8]; +h q[7]; +cx q[7],q[6]; h q[9]; -h q[10]; +cx q[9],q[8]; +cx q[8],q[6]; h q[11]; -h q[12]; +h q[13]; +h q[16]; +cx q[16],q[14]; h q[17]; h q[19]; h q[20]; -cx q[9],q[30]; -cx q[5],q[22]; -cx q[22],q[29]; -cx q[12],q[23]; -cx q[9],q[14]; -cx q[5],q[16]; -cx q[4],q[27]; -cx q[3],q[24]; +cx q[16],q[22]; +cx q[0],q[16]; +cx q[0],q[7]; +h q[23]; +cx q[23],q[15]; +cx q[22],q[15]; +cx q[15],q[12]; +cx q[19],q[22]; +cx q[17],q[19]; +h q[24]; +h q[26]; cx q[24],q[26]; -cx q[19],q[25]; -cx q[16],q[12]; -cx q[10],q[27]; +cx q[24],q[21]; +cx q[13],q[21]; +cx q[11],q[13]; +cx q[9],q[24]; +cx q[9],q[16]; +cx q[16],q[6]; cx q[9],q[15]; -cx q[8],q[23]; -cx q[6],q[14]; -cx q[3],q[21]; -cx q[2],q[5]; +h q[27]; +cx q[27],q[10]; +cx q[10],q[3]; +cx q[10],q[21]; +cx q[13],q[10]; +cx q[27],q[26]; +cx q[26],q[24]; +cx q[27],q[1]; cx q[1],q[4]; +cx q[24],q[1]; +cx q[26],q[4]; +cx q[27],q[7]; +cx q[21],q[27]; +cx q[2],q[28]; +cx q[28],q[25]; +cx q[19],q[25]; +cx q[22],q[28]; cx q[0],q[29]; -cx q[26],q[16]; -cx q[25],q[28]; -cx q[24],q[14]; -cx q[21],q[0]; -cx q[20],q[9]; -cx q[19],q[22]; +cx q[6],q[29]; +cx q[7],q[0]; +h q[30]; +cx q[30],q[18]; +cx q[14],q[30]; +cx q[14],q[5]; +cx q[15],q[30]; +cx q[18],q[23]; +cx q[2],q[5]; cx q[17],q[2]; -cx q[15],q[1]; -cx q[11],q[3]; -cx q[10],q[13]; -cx q[8],q[18]; -cx q[6],q[7]; cx q[20],q[18]; -cx q[17],q[19]; -cx q[14],q[16]; -cx q[11],q[13]; -cx q[29],q[6]; -cx q[27],q[21]; -cx q[23],q[30]; -cx q[12],q[15]; -cx q[9],q[8]; -cx q[5],q[28]; -cx q[4],q[26]; -cx q[3],q[10]; -cx q[2],q[25]; -cx q[1],q[24]; -cx q[0],q[7]; +cx q[18],q[8]; +cx q[20],q[9]; +cx q[3],q[14]; +cx q[11],q[3]; +cx q[16],q[14]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_2 index 3c36afa8b..4d2c2d5c8 100644 --- a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_2 +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_2 @@ -1,64 +1,75 @@ OPENQASM 2.0; include "qelib1.inc"; qreg q[31]; -h q[0]; h q[1]; -h q[2]; -h q[3]; h q[4]; -h q[5]; h q[6]; +h q[7]; h q[8]; h q[9]; h q[10]; h q[11]; -h q[12]; +h q[13]; +h q[14]; +h q[15]; h q[17]; h q[19]; -h q[20]; -cx q[9],q[30]; -cx q[5],q[22]; -cx q[22],q[29]; -cx q[12],q[23]; -cx q[9],q[14]; -cx q[5],q[16]; -cx q[4],q[27]; +h q[23]; +h q[25]; +cx q[23],q[0]; +cx q[13],q[3]; +cx q[1],q[27]; +cx q[6],q[28]; +cx q[15],q[30]; +cx q[14],q[16]; +cx q[7],q[16]; +cx q[8],q[30]; +cx q[19],q[28]; +cx q[25],q[2]; +cx q[9],q[21]; +cx q[11],q[13]; +cx q[15],q[18]; +cx q[23],q[27]; +cx q[6],q[29]; +cx q[1],q[21]; cx q[3],q[24]; -cx q[24],q[26]; +cx q[9],q[30]; +cx q[0],q[15]; cx q[19],q[25]; -cx q[16],q[12]; +cx q[4],q[26]; +cx q[17],q[5]; cx q[10],q[27]; -cx q[9],q[15]; -cx q[8],q[23]; -cx q[6],q[14]; -cx q[3],q[21]; -cx q[2],q[5]; -cx q[1],q[4]; +cx q[16],q[23]; +cx q[13],q[28]; +cx q[4],q[27]; +cx q[9],q[20]; +cx q[10],q[21]; +cx q[18],q[12]; cx q[0],q[29]; -cx q[26],q[16]; -cx q[25],q[28]; -cx q[24],q[14]; -cx q[21],q[0]; -cx q[20],q[9]; -cx q[19],q[22]; -cx q[17],q[2]; -cx q[15],q[1]; -cx q[11],q[3]; -cx q[10],q[13]; -cx q[8],q[18]; -cx q[6],q[7]; -cx q[20],q[18]; -cx q[17],q[19]; -cx q[14],q[16]; -cx q[11],q[13]; -cx q[29],q[6]; -cx q[27],q[21]; -cx q[23],q[30]; -cx q[12],q[15]; -cx q[9],q[8]; -cx q[5],q[28]; -cx q[4],q[26]; -cx q[3],q[10]; -cx q[2],q[25]; cx q[1],q[24]; -cx q[0],q[7]; +cx q[11],q[26]; +cx q[7],q[28]; +cx q[14],q[30]; +cx q[16],q[15]; +cx q[13],q[23]; +cx q[25],q[17]; +cx q[11],q[24]; +cx q[8],q[18]; +cx q[26],q[21]; +cx q[13],q[15]; +cx q[29],q[30]; +cx q[25],q[22]; +cx q[16],q[27]; +cx q[28],q[17]; +cx q[23],q[20]; +cx q[5],q[22]; +cx q[3],q[26]; +cx q[2],q[28]; +cx q[6],q[16]; +cx q[7],q[29]; +cx q[10],q[13]; +cx q[11],q[27]; +cx q[30],q[23]; +cx q[20],q[21]; +cx q[15],q[18]; +cx q[17],q[25]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3 index 3c36afa8b..7e5d1256e 100644 --- a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3 +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3 @@ -4,61 +4,87 @@ qreg q[31]; h q[0]; h q[1]; h q[2]; -h q[3]; h q[4]; -h q[5]; h q[6]; +h q[7]; h q[8]; h q[9]; -h q[10]; h q[11]; h q[12]; -h q[17]; +h q[13]; +h q[15]; h q[19]; -h q[20]; +h q[22]; +h q[24]; +cx q[6],q[21]; +cx q[15],q[20]; +cx q[0],q[21]; +cx q[13],q[10]; +cx q[2],q[28]; +cx q[6],q[25]; +cx q[19],q[17]; +cx q[24],q[21]; +cx q[11],q[13]; +cx q[22],q[27]; +cx q[7],q[25]; +cx q[9],q[23]; +cx q[15],q[14]; +cx q[6],q[28]; +cx q[17],q[29]; +cx q[10],q[21]; cx q[9],q[30]; -cx q[5],q[22]; -cx q[22],q[29]; -cx q[12],q[23]; -cx q[9],q[14]; -cx q[5],q[16]; -cx q[4],q[27]; -cx q[3],q[24]; -cx q[24],q[26]; -cx q[19],q[25]; -cx q[16],q[12]; -cx q[10],q[27]; -cx q[9],q[15]; -cx q[8],q[23]; -cx q[6],q[14]; -cx q[3],q[21]; -cx q[2],q[5]; -cx q[1],q[4]; -cx q[0],q[29]; -cx q[26],q[16]; -cx q[25],q[28]; -cx q[24],q[14]; -cx q[21],q[0]; -cx q[20],q[9]; -cx q[19],q[22]; -cx q[17],q[2]; -cx q[15],q[1]; -cx q[11],q[3]; -cx q[10],q[13]; -cx q[8],q[18]; -cx q[6],q[7]; -cx q[20],q[18]; -cx q[17],q[19]; cx q[14],q[16]; -cx q[11],q[13]; -cx q[29],q[6]; -cx q[27],q[21]; -cx q[23],q[30]; +cx q[7],q[23]; +cx q[0],q[29]; +cx q[11],q[28]; +cx q[27],q[5]; +cx q[24],q[3]; +cx q[12],q[18]; +cx q[17],q[13]; +cx q[6],q[15]; +cx q[1],q[21]; +cx q[24],q[13]; +cx q[2],q[17]; +cx q[7],q[28]; +cx q[11],q[22]; +cx q[3],q[27]; cx q[12],q[15]; -cx q[9],q[8]; -cx q[5],q[28]; +cx q[10],q[23]; cx q[4],q[26]; -cx q[3],q[10]; -cx q[2],q[25]; +cx q[29],q[30]; +cx q[25],q[16]; +cx q[12],q[23]; +cx q[2],q[14]; +cx q[5],q[25]; cx q[1],q[24]; -cx q[0],q[7]; +cx q[8],q[18]; +cx q[0],q[15]; +cx q[4],q[21]; +cx q[19],q[22]; +cx q[9],q[20]; +cx q[3],q[28]; +cx q[6],q[29]; +cx q[16],q[27]; +cx q[8],q[23]; +cx q[2],q[22]; +cx q[11],q[24]; +cx q[1],q[26]; +cx q[3],q[25]; +cx q[6],q[9]; +cx q[19],q[10]; +cx q[0],q[20]; +cx q[18],q[30]; +cx q[21],q[27]; +cx q[17],q[16]; +cx q[28],q[15]; +cx q[11],q[5]; +cx q[19],q[6]; +cx q[7],q[29]; +cx q[24],q[26]; +cx q[13],q[23]; +cx q[22],q[27]; +cx q[14],q[30]; +cx q[16],q[21]; +cx q[25],q[17]; +cx q[28],q[20]; +cx q[15],q[18]; From f67bdb4a671b339d52c6588c2715fe31e11e8c93 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 7 Apr 2025 16:33:33 +0200 Subject: [PATCH 067/156] add scripts for distance 7 and private mac simulation --- .../eval_circ_mod/run_eval_on_code_d7.sh | 17 +++++++++++++++++ .../eval_circ_mod/run_eval_on_code_mac.sh | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100755 scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_d7.sh create mode 100755 scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh diff --git a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_d7.sh b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_d7.sh new file mode 100755 index 000000000..979be366e --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_d7.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# Description: Estimate logical error rates for given code in parallel. Results are saved in a csv file described by the first argument. All other arguments are passed to the python script. + +declare -a p=("0.001" "0.0015" "0.002" "0.0025" "0.003" "0.0035" "0.004" "0.0045" "0.005" "0.0055" "0.006" "0.0065" "0.007" "0.0075" "0.008" "0.0085" "0.009" "0.0095" "0.01") + +echo "p p_l acceptance errors runs p_l_error acceptance_error" > "$1.csv" + +run_and_write() { + local res=$(python estimate_logical_error_rate.py ${@:2:$#-2} "-p" "${@: -1}") + local line="${@: -1} ${res}" + (flock -e 200 echo $line >> "$1.csv") 200>lock +} + +export -f run_and_write + +parallel --load 16 --link run_and_write $@ ::: ${p[@]} diff --git a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh new file mode 100755 index 000000000..3c89558b1 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# Description: Estimate logical error rates for given code in parallel. Results are saved in a csv file described by the first argument. All other arguments are passed to the python script. + +declare -a p=("0.01" "0.009" "0.007" "0.005" "0.003" "0.001" "0.0009" "0.0007") + +echo "p p_l acceptance errors runs p_l_error acceptance_error" > "$1.csv" + +run_and_write() { + local res=$(python estimate_logical_error_rate.py ${@:2:$#-2} "-p" "${@: -1}") + local line="${@: -1} ${res}" + (flock -e 200 echo $line >> "$1.csv") 200>lock +} + +export -f run_and_write + +parallel -j 6 --link run_and_write $@ ::: ${p[@]} From 3a4f8380527efc7b5d9083e739f55d5616398bac Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 8 Apr 2025 08:46:40 +0200 Subject: [PATCH 068/156] new circuit folder structure and add hexagonal d7 circuits --- .../cc_4_8_8_d5/cc_4_8_8_d5_heuristic_0 | 34 ++++++ .../cc_4_8_8_d5/cc_4_8_8_d5_heuristic_1 | 34 ++++++ .../cc_4_8_8_d5/cc_4_8_8_d5_heuristic_2 | 34 ++++++ .../cc_4_8_8_d5/cc_4_8_8_d5_heuristic_3 | 34 ++++++ .../cc_4_8_8_heuristic_0 | 0 .../cc_4_8_8_heuristic_1 | 0 .../cc_4_8_8_heuristic_2 | 0 .../cc_4_8_8_heuristic_3 | 0 .../cc_6_6_6_d5/cc_6_6_6_d5_heuristic_0 | 39 ++++++ .../cc_6_6_6_d5/cc_6_6_6_d5_heuristic_1 | 39 ++++++ .../cc_6_6_6_d5/cc_6_6_6_d5_heuristic_2 | 39 ++++++ .../cc_6_6_6_d5/cc_6_6_6_d5_heuristic_3 | 39 ++++++ .../cc_6_6_6_heuristic_0 | 0 .../cc_6_6_6_heuristic_1 | 0 .../cc_6_6_6_heuristic_2 | 0 .../cc_6_6_6_d7/cc_6_6_6_d7_heuristic_0 | 81 +++++++++++++ .../cc_6_6_6_d7/cc_6_6_6_d7_heuristic_1 | 81 +++++++++++++ .../cc_6_6_6_d7/cc_6_6_6_d7_heuristic_2 | 110 +++++++++++++++++ .../cc_6_6_6_d7/cc_6_6_6_d7_heuristic_3 | 114 ++++++++++++++++++ 19 files changed, 678 insertions(+) create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_0 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_1 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_2 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_3 rename scripts/ft_stateprep/eval_circ_mod/circuits/{cc_4_8_8 => cc_4_8_8_d5_v1}/cc_4_8_8_heuristic_0 (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/{cc_4_8_8 => cc_4_8_8_d5_v1}/cc_4_8_8_heuristic_1 (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/{cc_4_8_8 => cc_4_8_8_d5_v1}/cc_4_8_8_heuristic_2 (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/{cc_4_8_8 => cc_4_8_8_d5_v1}/cc_4_8_8_heuristic_3 (100%) create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_0 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_1 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_2 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_3 rename scripts/ft_stateprep/eval_circ_mod/circuits/{cc_6_6_6 => cc_6_6_6_d5_v1}/cc_6_6_6_heuristic_0 (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/{cc_6_6_6 => cc_6_6_6_d5_v1}/cc_6_6_6_heuristic_1 (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/{cc_6_6_6 => cc_6_6_6_d5_v1}/cc_6_6_6_heuristic_2 (100%) create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_0 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_1 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_2 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_3 diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_0 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_0 new file mode 100644 index 000000000..f5eed9e67 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_0 @@ -0,0 +1,34 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[17]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[5]; +h q[9]; +h q[10]; +cx q[4],q[8]; +cx q[10],q[15]; +cx q[4],q[6]; +cx q[9],q[15]; +cx q[5],q[12]; +cx q[4],q[7]; +cx q[3],q[14]; +cx q[2],q[6]; +cx q[14],q[16]; +cx q[10],q[13]; +cx q[9],q[11]; +cx q[8],q[5]; +cx q[3],q[7]; +cx q[1],q[4]; +cx q[0],q[2]; +cx q[12],q[9]; +cx q[1],q[13]; +cx q[0],q[3]; +cx q[15],q[8]; +cx q[6],q[16]; +cx q[5],q[11]; +cx q[4],q[10]; +cx q[2],q[14]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_1 new file mode 100644 index 000000000..02bb49cb2 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_1 @@ -0,0 +1,34 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[17]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +cx q[1],q[4]; +cx q[3],q[7]; +h q[8]; +cx q[8],q[5]; +cx q[8],q[7]; +cx q[5],q[11]; +cx q[11],q[4]; +h q[12]; +h q[13]; +cx q[13],q[10]; +cx q[4],q[10]; +cx q[3],q[14]; +h q[15]; +cx q[15],q[9]; +cx q[12],q[9]; +cx q[13],q[15]; +cx q[1],q[13]; +cx q[15],q[8]; +cx q[9],q[11]; +cx q[2],q[16]; +cx q[2],q[6]; +cx q[0],q[2]; +cx q[0],q[3]; +cx q[2],q[14]; +cx q[5],q[6]; +cx q[12],q[5]; +cx q[7],q[16]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_2 new file mode 100644 index 000000000..f5eed9e67 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_2 @@ -0,0 +1,34 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[17]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[5]; +h q[9]; +h q[10]; +cx q[4],q[8]; +cx q[10],q[15]; +cx q[4],q[6]; +cx q[9],q[15]; +cx q[5],q[12]; +cx q[4],q[7]; +cx q[3],q[14]; +cx q[2],q[6]; +cx q[14],q[16]; +cx q[10],q[13]; +cx q[9],q[11]; +cx q[8],q[5]; +cx q[3],q[7]; +cx q[1],q[4]; +cx q[0],q[2]; +cx q[12],q[9]; +cx q[1],q[13]; +cx q[0],q[3]; +cx q[15],q[8]; +cx q[6],q[16]; +cx q[5],q[11]; +cx q[4],q[10]; +cx q[2],q[14]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_3 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_3 new file mode 100644 index 000000000..02bb49cb2 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_3 @@ -0,0 +1,34 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[17]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +cx q[1],q[4]; +cx q[3],q[7]; +h q[8]; +cx q[8],q[5]; +cx q[8],q[7]; +cx q[5],q[11]; +cx q[11],q[4]; +h q[12]; +h q[13]; +cx q[13],q[10]; +cx q[4],q[10]; +cx q[3],q[14]; +h q[15]; +cx q[15],q[9]; +cx q[12],q[9]; +cx q[13],q[15]; +cx q[1],q[13]; +cx q[15],q[8]; +cx q[9],q[11]; +cx q[2],q[16]; +cx q[2],q[6]; +cx q[0],q[2]; +cx q[0],q[3]; +cx q[2],q[14]; +cx q[5],q[6]; +cx q[12],q[5]; +cx q[7],q[16]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_0 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_0 similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_0 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_0 diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_1 similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_1 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_1 diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_2 similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_2 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_2 diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_3 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_3 similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8/cc_4_8_8_heuristic_3 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_3 diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_0 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_0 new file mode 100644 index 000000000..c7bfbf84d --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_0 @@ -0,0 +1,39 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[19]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[5]; +h q[6]; +h q[10]; +h q[12]; +cx q[6],q[16]; +cx q[4],q[13]; +cx q[3],q[7]; +cx q[12],q[17]; +cx q[10],q[18]; +cx q[7],q[11]; +cx q[6],q[3]; +cx q[4],q[8]; +cx q[2],q[16]; +cx q[1],q[15]; +cx q[0],q[14]; +cx q[11],q[12]; +cx q[10],q[13]; +cx q[8],q[9]; +cx q[6],q[0]; +cx q[5],q[2]; +cx q[4],q[3]; +cx q[1],q[7]; +cx q[17],q[18]; +cx q[14],q[15]; +cx q[5],q[9]; +cx q[16],q[4]; +cx q[13],q[11]; +cx q[12],q[10]; +cx q[7],q[6]; +cx q[2],q[8]; +cx q[0],q[1]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_1 new file mode 100644 index 000000000..88577d33c --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_1 @@ -0,0 +1,39 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[19]; +h q[2]; +h q[4]; +cx q[4],q[3]; +h q[5]; +h q[6]; +cx q[6],q[0]; +cx q[0],q[1]; +cx q[6],q[3]; +h q[7]; +cx q[4],q[9]; +cx q[5],q[9]; +h q[12]; +cx q[12],q[11]; +cx q[11],q[3]; +h q[13]; +cx q[13],q[10]; +cx q[4],q[13]; +cx q[13],q[11]; +h q[14]; +cx q[7],q[15]; +cx q[12],q[7]; +cx q[14],q[15]; +cx q[14],q[0]; +cx q[15],q[1]; +cx q[2],q[16]; +cx q[2],q[8]; +cx q[5],q[2]; +cx q[6],q[16]; +cx q[16],q[4]; +cx q[7],q[6]; +cx q[9],q[8]; +h q[17]; +cx q[17],q[12]; +cx q[10],q[18]; +cx q[12],q[10]; +cx q[17],q[18]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_2 new file mode 100644 index 000000000..b151c0b3e --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_2 @@ -0,0 +1,39 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[19]; +h q[6]; +h q[7]; +h q[9]; +h q[10]; +h q[12]; +h q[13]; +h q[14]; +h q[15]; +h q[16]; +cx q[7],q[3]; +cx q[13],q[3]; +cx q[6],q[3]; +cx q[7],q[11]; +cx q[13],q[4]; +cx q[9],q[5]; +cx q[12],q[17]; +cx q[15],q[7]; +cx q[16],q[2]; +cx q[10],q[18]; +cx q[6],q[1]; +cx q[14],q[15]; +cx q[4],q[9]; +cx q[10],q[13]; +cx q[11],q[12]; +cx q[1],q[0]; +cx q[6],q[16]; +cx q[2],q[8]; +cx q[5],q[2]; +cx q[14],q[0]; +cx q[17],q[18]; +cx q[13],q[11]; +cx q[7],q[6]; +cx q[16],q[4]; +cx q[12],q[10]; +cx q[9],q[8]; +cx q[15],q[1]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_3 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_3 new file mode 100644 index 000000000..856657b85 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_3 @@ -0,0 +1,39 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[19]; +h q[2]; +h q[5]; +h q[6]; +h q[9]; +h q[10]; +h q[12]; +h q[14]; +h q[15]; +h q[17]; +cx q[9],q[3]; +cx q[6],q[0]; +cx q[12],q[3]; +cx q[2],q[16]; +cx q[12],q[11]; +cx q[6],q[3]; +cx q[15],q[7]; +cx q[9],q[4]; +cx q[10],q[13]; +cx q[14],q[15]; +cx q[5],q[9]; +cx q[17],q[12]; +cx q[10],q[18]; +cx q[11],q[7]; +cx q[0],q[16]; +cx q[4],q[13]; +cx q[6],q[1]; +cx q[2],q[8]; +cx q[5],q[2]; +cx q[14],q[0]; +cx q[17],q[18]; +cx q[13],q[11]; +cx q[7],q[6]; +cx q[16],q[4]; +cx q[12],q[10]; +cx q[9],q[8]; +cx q[15],q[1]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_0 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_0 similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_0 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_0 diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_1 similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_1 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_1 diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_2 similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6/cc_6_6_6_heuristic_2 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_2 diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_0 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_0 new file mode 100644 index 000000000..f373d1dec --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_0 @@ -0,0 +1,81 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[37]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[5]; +h q[6]; +h q[7]; +h q[8]; +h q[10]; +h q[11]; +h q[15]; +h q[17]; +h q[18]; +h q[20]; +h q[25]; +h q[28]; +h q[33]; +cx q[10],q[16]; +cx q[8],q[26]; +cx q[5],q[35]; +cx q[4],q[34]; +cx q[3],q[36]; +cx q[25],q[35]; +cx q[18],q[31]; +cx q[11],q[23]; +cx q[10],q[4]; +cx q[8],q[16]; +cx q[7],q[13]; +cx q[6],q[12]; +cx q[5],q[29]; +cx q[3],q[22]; +cx q[0],q[32]; +cx q[33],q[6]; +cx q[23],q[34]; +cx q[22],q[26]; +cx q[18],q[24]; +cx q[17],q[10]; +cx q[15],q[19]; +cx q[13],q[25]; +cx q[12],q[3]; +cx q[11],q[7]; +cx q[8],q[14]; +cx q[5],q[9]; +cx q[2],q[30]; +cx q[1],q[27]; +cx q[0],q[29]; +cx q[32],q[26]; +cx q[31],q[33]; +cx q[28],q[9]; +cx q[22],q[23]; +cx q[20],q[17]; +cx q[18],q[21]; +cx q[15],q[12]; +cx q[14],q[24]; +cx q[11],q[1]; +cx q[8],q[7]; +cx q[5],q[3]; +cx q[2],q[13]; +cx q[0],q[16]; +cx q[28],q[19]; +cx q[27],q[30]; +cx q[20],q[31]; +cx q[16],q[24]; +cx q[7],q[23]; +cx q[3],q[29]; +cx q[35],q[36]; +cx q[34],q[8]; +cx q[33],q[32]; +cx q[25],q[22]; +cx q[17],q[21]; +cx q[13],q[11]; +cx q[12],q[5]; +cx q[10],q[18]; +cx q[9],q[15]; +cx q[6],q[0]; +cx q[4],q[14]; +cx q[1],q[2]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_1 new file mode 100644 index 000000000..e2d73cc66 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_1 @@ -0,0 +1,81 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[37]; +h q[0]; +h q[1]; +h q[6]; +h q[7]; +h q[10]; +h q[13]; +h q[15]; +h q[18]; +h q[20]; +h q[21]; +h q[22]; +h q[27]; +h q[28]; +h q[29]; +h q[30]; +h q[33]; +h q[34]; +h q[35]; +cx q[7],q[8]; +cx q[13],q[7]; +cx q[6],q[3]; +cx q[10],q[24]; +cx q[33],q[6]; +cx q[0],q[24]; +cx q[18],q[31]; +cx q[29],q[5]; +cx q[22],q[23]; +cx q[3],q[12]; +cx q[8],q[26]; +cx q[1],q[11]; +cx q[13],q[25]; +cx q[10],q[4]; +cx q[5],q[3]; +cx q[31],q[24]; +cx q[35],q[25]; +cx q[30],q[13]; +cx q[34],q[4]; +cx q[11],q[2]; +cx q[0],q[32]; +cx q[29],q[9]; +cx q[15],q[12]; +cx q[18],q[33]; +cx q[22],q[36]; +cx q[23],q[26]; +cx q[8],q[16]; +cx q[21],q[10]; +cx q[28],q[9]; +cx q[0],q[29]; +cx q[20],q[31]; +cx q[1],q[34]; +cx q[15],q[19]; +cx q[8],q[14]; +cx q[22],q[3]; +cx q[2],q[23]; +cx q[27],q[30]; +cx q[21],q[17]; +cx q[11],q[7]; +cx q[5],q[35]; +cx q[18],q[16]; +cx q[32],q[26]; +cx q[27],q[1]; +cx q[20],q[17]; +cx q[28],q[19]; +cx q[24],q[16]; +cx q[3],q[29]; +cx q[7],q[23]; +cx q[12],q[5]; +cx q[25],q[22]; +cx q[35],q[36]; +cx q[10],q[18]; +cx q[34],q[8]; +cx q[30],q[2]; +cx q[13],q[11]; +cx q[4],q[14]; +cx q[31],q[21]; +cx q[6],q[0]; +cx q[9],q[15]; +cx q[33],q[32]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_2 new file mode 100644 index 000000000..831d04413 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_2 @@ -0,0 +1,110 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[37]; +h q[0]; +h q[2]; +h q[3]; +h q[4]; +h q[5]; +h q[7]; +h q[8]; +h q[11]; +h q[12]; +h q[13]; +h q[15]; +h q[17]; +h q[18]; +h q[20]; +h q[23]; +h q[26]; +h q[29]; +h q[35]; +cx q[12],q[28]; +cx q[13],q[6]; +cx q[23],q[9]; +cx q[29],q[36]; +cx q[28],q[29]; +cx q[18],q[33]; +cx q[23],q[25]; +cx q[7],q[24]; +cx q[6],q[12]; +cx q[36],q[16]; +cx q[25],q[18]; +cx q[28],q[33]; +cx q[26],q[30]; +cx q[23],q[36]; +cx q[13],q[9]; +cx q[16],q[6]; +cx q[20],q[21]; +cx q[11],q[24]; +cx q[11],q[20]; +cx q[15],q[23]; +cx q[0],q[32]; +cx q[35],q[13]; +cx q[2],q[24]; +cx q[8],q[29]; +cx q[25],q[28]; +cx q[16],q[26]; +cx q[5],q[28]; +cx q[32],q[25]; +cx q[17],q[20]; +cx q[2],q[26]; +cx q[3],q[23]; +cx q[11],q[16]; +cx q[15],q[33]; +cx q[8],q[14]; +cx q[21],q[31]; +cx q[35],q[22]; +cx q[32],q[22]; +cx q[3],q[25]; +cx q[4],q[14]; +cx q[7],q[23]; +cx q[15],q[19]; +cx q[30],q[1]; +cx q[31],q[10]; +cx q[5],q[24]; +cx q[8],q[34]; +cx q[11],q[27]; +cx q[26],q[36]; +cx q[13],q[20]; +cx q[0],q[29]; +cx q[5],q[19]; +cx q[10],q[33]; +cx q[8],q[26]; +cx q[1],q[11]; +cx q[35],q[23]; +cx q[4],q[20]; +cx q[15],q[32]; +cx q[28],q[36]; +cx q[13],q[25]; +cx q[18],q[31]; +cx q[22],q[16]; +cx q[24],q[34]; +cx q[2],q[30]; +cx q[5],q[7]; +cx q[4],q[16]; +cx q[1],q[14]; +cx q[17],q[21]; +cx q[3],q[29]; +cx q[8],q[6]; +cx q[19],q[25]; +cx q[22],q[26]; +cx q[33],q[32]; +cx q[13],q[27]; +cx q[11],q[23]; +cx q[34],q[20]; +cx q[31],q[24]; +cx q[36],q[35]; +cx q[5],q[29]; +cx q[15],q[32]; +cx q[0],q[36]; +cx q[1],q[4]; +cx q[12],q[19]; +cx q[18],q[21]; +cx q[6],q[33]; +cx q[27],q[30]; +cx q[16],q[24]; +cx q[34],q[14]; +cx q[23],q[26]; +cx q[25],q[35]; +cx q[20],q[31]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_3 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_3 new file mode 100644 index 000000000..d47131a4e --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_3 @@ -0,0 +1,114 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[37]; +h q[0]; +h q[2]; +h q[5]; +h q[7]; +h q[14]; +h q[15]; +h q[17]; +h q[18]; +h q[19]; +h q[20]; +h q[22]; +h q[23]; +h q[25]; +h q[27]; +h q[29]; +h q[31]; +h q[33]; +h q[35]; +cx q[35],q[9]; +cx q[27],q[1]; +cx q[22],q[24]; +cx q[31],q[8]; +cx q[14],q[30]; +cx q[0],q[32]; +cx q[18],q[21]; +cx q[7],q[34]; +cx q[2],q[35]; +cx q[22],q[4]; +cx q[1],q[24]; +cx q[29],q[26]; +cx q[19],q[12]; +cx q[25],q[22]; +cx q[0],q[24]; +cx q[33],q[10]; +cx q[21],q[30]; +cx q[27],q[31]; +cx q[9],q[32]; +cx q[23],q[11]; +cx q[20],q[6]; +cx q[2],q[34]; +cx q[26],q[3]; +cx q[1],q[16]; +cx q[3],q[25]; +cx q[18],q[20]; +cx q[15],q[36]; +cx q[10],q[21]; +cx q[5],q[19]; +cx q[0],q[29]; +cx q[6],q[33]; +cx q[9],q[28]; +cx q[11],q[24]; +cx q[7],q[23]; +cx q[4],q[26]; +cx q[2],q[31]; +cx q[14],q[1]; +cx q[16],q[35]; +cx q[3],q[35]; +cx q[6],q[29]; +cx q[11],q[34]; +cx q[5],q[25]; +cx q[10],q[16]; +cx q[4],q[31]; +cx q[18],q[27]; +cx q[8],q[14]; +cx q[9],q[23]; +cx q[32],q[26]; +cx q[19],q[36]; +cx q[33],q[24]; +cx q[0],q[20]; +cx q[7],q[31]; +cx q[3],q[23]; +cx q[12],q[32]; +cx q[9],q[33]; +cx q[18],q[35]; +cx q[15],q[5]; +cx q[11],q[14]; +cx q[17],q[21]; +cx q[6],q[26]; +cx q[8],q[34]; +cx q[24],q[16]; +cx q[30],q[13]; +cx q[27],q[36]; +cx q[15],q[9]; +cx q[2],q[30]; +cx q[17],q[20]; +cx q[8],q[16]; +cx q[11],q[27]; +cx q[4],q[25]; +cx q[18],q[33]; +cx q[10],q[32]; +cx q[12],q[35]; +cx q[13],q[23]; +cx q[34],q[24]; +cx q[19],q[29]; +cx q[22],q[36]; +cx q[5],q[26]; +cx q[31],q[14]; +cx q[11],q[30]; +cx q[15],q[29]; +cx q[2],q[36]; +cx q[18],q[32]; +cx q[17],q[31]; +cx q[12],q[33]; +cx q[9],q[25]; +cx q[19],q[28]; +cx q[1],q[34]; +cx q[13],q[16]; +cx q[22],q[35]; +cx q[5],q[23]; +cx q[24],q[20]; +cx q[14],q[26]; From 210ed961f31462987b2a51862e0c424d737fa4c0 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 8 Apr 2025 09:25:01 +0200 Subject: [PATCH 069/156] correct simulation script and expand it to include hexagonal d7 circuits --- .../eval_circ_mod/estimate_logical_error_rate.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py index fb825a075..693630842 100644 --- a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py +++ b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py @@ -39,7 +39,7 @@ def main() -> None: d = args.distance code = CSSCode.from_code_name("surface", d) code_name = f"rotated_surface_d{d}" - elif "cc_4_8_8_d7" in code_name: + elif code_name == "cc_4_8_8_d7": d = 7 code = SquareOctagonColorCode(d) lut_path = (Path("__file__") / "../../eval/luts/decoder_488_7.pickle").resolve() @@ -49,10 +49,13 @@ def main() -> None: else: msg = "LUT file not found." raise ValueError(msg) - elif "cc_4_8_8" in code_name: + elif code_name == "cc_6_6_6_d7": + d = 7 + code = HexagonalColorCode(d) + elif code_name == "cc_4_8_8_d5": d = 5 code = SquareOctagonColorCode(d) - elif "cc_6_6_6" in code_name: + elif code_name == "cc_6_6_6_d5": d = 5 code = HexagonalColorCode(d) elif code_name in available_codes: @@ -71,7 +74,7 @@ def main() -> None: # else: circuits = [] # load circuit from file - for _id in [0, 1, 2, 3] if code_name == "cc_4_8_8" else [0, 1, 2]: + for _id in [0, 1, 2, 3]: circ_file = circ_file_core + str(_id) circuits.append(QuantumCircuit.from_qasm_file(prefix / code_name / circ_file)) @@ -80,7 +83,7 @@ def main() -> None: circ2=circuits[1], code=code, circ3=circuits[2], - circ4=circuits[3] if code_name == "cc_4_8_8" else circuits[2], + circ4=circuits[3], p=args.p_error, p_idle=args.p_idle_factor * args.p_error, zero_state=args.zero_state, From d2901f4f28f2afc2113ed42f16792e2587517118 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 8 Apr 2025 09:33:30 +0200 Subject: [PATCH 070/156] change C3 and C4 of hexd7 code to be reproduceable --- .../cc_6_6_6_d7/cc_6_6_6_d7_heuristic_2 | 162 +++++++-------- .../cc_6_6_6_d7/cc_6_6_6_d7_heuristic_3 | 184 ++++++++---------- 2 files changed, 159 insertions(+), 187 deletions(-) diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_2 index 831d04413..ee88e6550 100644 --- a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_2 +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_2 @@ -1,110 +1,98 @@ OPENQASM 2.0; include "qelib1.inc"; qreg q[37]; -h q[0]; -h q[2]; +h q[1]; h q[3]; h q[4]; h q[5]; +h q[6]; h q[7]; h q[8]; +h q[10]; h q[11]; -h q[12]; -h q[13]; -h q[15]; -h q[17]; h q[18]; +h q[19]; h q[20]; -h q[23]; -h q[26]; -h q[29]; -h q[35]; -cx q[12],q[28]; -cx q[13],q[6]; -cx q[23],q[9]; -cx q[29],q[36]; -cx q[28],q[29]; -cx q[18],q[33]; -cx q[23],q[25]; -cx q[7],q[24]; -cx q[6],q[12]; -cx q[36],q[16]; -cx q[25],q[18]; -cx q[28],q[33]; -cx q[26],q[30]; -cx q[23],q[36]; -cx q[13],q[9]; -cx q[16],q[6]; -cx q[20],q[21]; -cx q[11],q[24]; -cx q[11],q[20]; -cx q[15],q[23]; -cx q[0],q[32]; -cx q[35],q[13]; -cx q[2],q[24]; -cx q[8],q[29]; -cx q[25],q[28]; -cx q[16],q[26]; -cx q[5],q[28]; -cx q[32],q[25]; -cx q[17],q[20]; -cx q[2],q[26]; +h q[22]; +h q[25]; +h q[28]; +h q[30]; +h q[32]; +h q[34]; +cx q[30],q[13]; +cx q[32],q[16]; +cx q[11],q[30]; +cx q[1],q[26]; +cx q[34],q[36]; +cx q[20],q[24]; +cx q[7],q[14]; +cx q[32],q[33]; cx q[3],q[23]; -cx q[11],q[16]; -cx q[15],q[33]; -cx q[8],q[14]; -cx q[21],q[31]; -cx q[35],q[22]; -cx q[32],q[22]; -cx q[3],q[25]; +cx q[25],q[9]; cx q[4],q[14]; cx q[7],q[23]; -cx q[15],q[19]; -cx q[30],q[1]; -cx q[31],q[10]; -cx q[5],q[24]; -cx q[8],q[34]; +cx q[22],q[36]; +cx q[19],q[35]; +cx q[5],q[29]; +cx q[34],q[2]; cx q[11],q[27]; -cx q[26],q[36]; -cx q[13],q[20]; +cx q[8],q[20]; +cx q[18],q[31]; +cx q[13],q[26]; +cx q[3],q[25]; +cx q[33],q[0]; +cx q[10],q[32]; +cx q[35],q[15]; +cx q[28],q[12]; cx q[0],q[29]; +cx q[9],q[23]; +cx q[22],q[25]; +cx q[1],q[27]; +cx q[8],q[16]; +cx q[6],q[33]; cx q[5],q[19]; -cx q[10],q[33]; -cx q[8],q[26]; -cx q[1],q[11]; -cx q[35],q[23]; -cx q[4],q[20]; +cx q[24],q[17]; +cx q[31],q[32]; +cx q[2],q[14]; +cx q[26],q[36]; +cx q[30],q[20]; +cx q[10],q[24]; +cx q[22],q[35]; +cx q[3],q[29]; +cx q[8],q[34]; +cx q[17],q[21]; +cx q[12],q[36]; +cx q[6],q[16]; +cx q[5],q[25]; cx q[15],q[32]; -cx q[28],q[36]; -cx q[13],q[25]; -cx q[18],q[31]; -cx q[22],q[16]; -cx q[24],q[34]; +cx q[9],q[28]; +cx q[30],q[23]; +cx q[33],q[26]; +cx q[27],q[14]; +cx q[20],q[31]; +cx q[5],q[36]; +cx q[2],q[26]; +cx q[10],q[20]; +cx q[18],q[21]; +cx q[12],q[29]; +cx q[27],q[34]; +cx q[33],q[24]; +cx q[25],q[35]; +cx q[19],q[23]; +cx q[30],q[16]; +cx q[28],q[32]; +cx q[14],q[31]; cx q[2],q[30]; -cx q[5],q[7]; +cx q[10],q[21]; +cx q[5],q[28]; +cx q[15],q[25]; cx q[4],q[16]; -cx q[1],q[14]; -cx q[17],q[21]; -cx q[3],q[29]; -cx q[8],q[6]; -cx q[19],q[25]; -cx q[22],q[26]; -cx q[33],q[32]; +cx q[12],q[19]; +cx q[6],q[29]; cx q[13],q[27]; -cx q[11],q[23]; -cx q[34],q[20]; -cx q[31],q[24]; +cx q[7],q[34]; +cx q[14],q[20]; cx q[36],q[35]; -cx q[5],q[29]; -cx q[15],q[32]; -cx q[0],q[36]; -cx q[1],q[4]; -cx q[12],q[19]; -cx q[18],q[21]; -cx q[6],q[33]; -cx q[27],q[30]; -cx q[16],q[24]; -cx q[34],q[14]; +cx q[32],q[33]; cx q[23],q[26]; -cx q[25],q[35]; -cx q[20],q[31]; +cx q[31],q[24]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_3 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_3 index d47131a4e..01d706cb5 100644 --- a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_3 +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_3 @@ -1,114 +1,98 @@ OPENQASM 2.0; include "qelib1.inc"; qreg q[37]; -h q[0]; -h q[2]; -h q[5]; +h q[4]; +h q[6]; h q[7]; +h q[10]; +h q[11]; +h q[12]; +h q[13]; h q[14]; h q[15]; -h q[17]; -h q[18]; -h q[19]; -h q[20]; -h q[22]; -h q[23]; +h q[16]; +h q[21]; h q[25]; -h q[27]; +h q[28]; h q[29]; -h q[31]; +h q[30]; h q[33]; -h q[35]; -cx q[35],q[9]; -cx q[27],q[1]; -cx q[22],q[24]; -cx q[31],q[8]; -cx q[14],q[30]; -cx q[0],q[32]; -cx q[18],q[21]; -cx q[7],q[34]; -cx q[2],q[35]; -cx q[22],q[4]; -cx q[1],q[24]; -cx q[29],q[26]; -cx q[19],q[12]; -cx q[25],q[22]; -cx q[0],q[24]; -cx q[33],q[10]; -cx q[21],q[30]; -cx q[27],q[31]; -cx q[9],q[32]; -cx q[23],q[11]; -cx q[20],q[6]; -cx q[2],q[34]; -cx q[26],q[3]; -cx q[1],q[16]; -cx q[3],q[25]; -cx q[18],q[20]; -cx q[15],q[36]; -cx q[10],q[21]; -cx q[5],q[19]; -cx q[0],q[29]; -cx q[6],q[33]; -cx q[9],q[28]; -cx q[11],q[24]; -cx q[7],q[23]; -cx q[4],q[26]; -cx q[2],q[31]; +h q[34]; +h q[36]; +cx q[14],q[27]; +cx q[36],q[5]; +cx q[25],q[35]; +cx q[29],q[36]; cx q[14],q[1]; -cx q[16],q[35]; -cx q[3],q[35]; -cx q[6],q[29]; -cx q[11],q[34]; -cx q[5],q[25]; -cx q[10],q[16]; -cx q[4],q[31]; -cx q[18],q[27]; -cx q[8],q[14]; -cx q[9],q[23]; -cx q[32],q[26]; -cx q[19],q[36]; -cx q[33],q[24]; -cx q[0],q[20]; -cx q[7],q[31]; -cx q[3],q[23]; -cx q[12],q[32]; -cx q[9],q[33]; -cx q[18],q[35]; -cx q[15],q[5]; -cx q[11],q[14]; -cx q[17],q[21]; -cx q[6],q[26]; -cx q[8],q[34]; -cx q[24],q[16]; -cx q[30],q[13]; -cx q[27],q[36]; -cx q[15],q[9]; -cx q[2],q[30]; -cx q[17],q[20]; -cx q[8],q[16]; +cx q[29],q[3]; +cx q[34],q[31]; +cx q[16],q[0]; +cx q[13],q[27]; +cx q[5],q[35]; +cx q[7],q[14]; +cx q[28],q[36]; +cx q[12],q[26]; +cx q[33],q[18]; +cx q[11],q[23]; +cx q[7],q[23]; +cx q[21],q[31]; cx q[11],q[27]; -cx q[4],q[25]; -cx q[18],q[33]; -cx q[10],q[32]; -cx q[12],q[35]; -cx q[13],q[23]; -cx q[34],q[24]; -cx q[19],q[29]; -cx q[22],q[36]; -cx q[5],q[26]; -cx q[31],q[14]; +cx q[30],q[2]; +cx q[6],q[16]; +cx q[33],q[20]; +cx q[1],q[35]; +cx q[28],q[26]; +cx q[12],q[29]; +cx q[1],q[24]; cx q[11],q[30]; -cx q[15],q[29]; -cx q[2],q[36]; -cx q[18],q[32]; -cx q[17],q[31]; -cx q[12],q[33]; -cx q[9],q[25]; -cx q[19],q[28]; -cx q[1],q[34]; +cx q[20],q[31]; +cx q[4],q[14]; +cx q[13],q[35]; +cx q[26],q[33]; +cx q[16],q[29]; +cx q[15],q[36]; +cx q[10],q[20]; +cx q[13],q[31]; +cx q[12],q[35]; +cx q[25],q[22]; +cx q[4],q[26]; +cx q[11],q[16]; +cx q[6],q[33]; +cx q[34],q[8]; +cx q[7],q[24]; +cx q[5],q[29]; +cx q[30],q[14]; +cx q[4],q[34]; +cx q[28],q[9]; cx q[13],q[16]; -cx q[22],q[35]; -cx q[5],q[23]; -cx q[24],q[20]; +cx q[15],q[33]; +cx q[11],q[31]; +cx q[21],q[17]; +cx q[25],q[23]; +cx q[5],q[19]; +cx q[0],q[32]; +cx q[36],q[35]; +cx q[20],q[24]; cx q[14],q[26]; +cx q[5],q[28]; +cx q[10],q[33]; +cx q[13],q[23]; +cx q[6],q[32]; +cx q[12],q[19]; +cx q[2],q[35]; +cx q[15],q[26]; +cx q[34],q[16]; +cx q[20],q[21]; +cx q[30],q[24]; +cx q[14],q[31]; +cx q[36],q[25]; +cx q[13],q[30]; +cx q[12],q[28]; +cx q[15],q[19]; +cx q[35],q[36]; +cx q[25],q[23]; +cx q[14],q[34]; +cx q[29],q[26]; +cx q[33],q[32]; +cx q[16],q[24]; +cx q[31],q[20]; From 18b6805d26199647183bf395c0bf0af6f96bc2e1 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 8 Apr 2025 10:33:48 +0200 Subject: [PATCH 071/156] heuristic indep of SPC (only code) add 2 error check Remove dependency on SPC class and only work with CSSCode class introduce possibility to also track 2 error events during the construction to avoid that 2 error events of newly constructed circuit cancel one error events of the reference circuit/ fault set --- .../qecc/circuit_synthesis/synthesis_utils.py | 68 +++++++++++++------ 1 file changed, 49 insertions(+), 19 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 197d0d3ae..f2d82dd7c 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -22,6 +22,7 @@ from qiskit import AncillaQubit, ClBit, Qubit from mqt.qecc.circuit_synthesis.state_prep import StatePrepCircuit + from mqt.qecc.codes.css_code import CSSCode logger = logging.getLogger(__name__) @@ -105,10 +106,11 @@ def heuristic_gaussian_elimination( matrix: npt.NDArray[np.int8], parallel_elimination: bool = True, penalty_cols: list[tuple[int]] | None = None, - ref_spc: StatePrepCircuit | None = None, + code: CSSCode | None = None, ref_x_fs: npt.NDArray[np.int8] | None = None, ref_z_fs: npt.NDArray[np.int8] | None = None, guide_by_x: bool = True, + ref_x_1fs: npt.NDArray[np.int8] | None = None, ) -> tuple[npt.NDArray[np.int8], list[tuple[int, int]]]: """Perform Gaussian elimination on the column space of a matrix using as few eliminations as possible. @@ -120,7 +122,11 @@ def heuristic_gaussian_elimination( matrix: The matrix to perform Gaussian elimination on. parallel_elimination: Whether to prioritize elimination steps that act on disjoint columns. penalty_cols: tuples of CNOTs (control, target) which are initially added to the failed_cnots list and hence can only be applied once the control qubit has been used elsewhere - ref_spc: reference SPC of which the fault set determines the construction of the new circuit + code: Code based on which the fault sets are checked for overlaps. (Overlap check is based on check matrices) + ref_x_fs: (Optional) reference x fault set which influences the construction of the circuit + ref_z_fs: (Optional) reference z fault set which influences the construction of the circuit + guide_by_x: Flag that decides wether dismissed CNOTs are free to placement again after either the control (x guided) or the target (z guided) has been used elsewhere + ref_x_1fs: (Optional) reference one error x fault set which ensures that no two error event of the newly constructed circuit cancels a one error event of the reference circuit Returns: The reduced matrix and a list of the elimination steps taken. The elimination steps are represented as tuples of the form (i, j) where i is the column being eliminated with and j is the column being eliminated. @@ -129,13 +135,23 @@ def heuristic_gaussian_elimination( penalty_cols = [] if ref_x_fs is None: ref_x_fs = np.empty((0,), dtype=np.int8) + if ref_x_1fs is None: + ref_x_1fs = np.empty((0,), dtype=np.int8) if ref_z_fs is None: ref_z_fs = np.empty((0,), dtype=np.int8) - if not ((ref_x_fs.size or ref_z_fs.size) ^ (ref_spc is None)): - msg = "It is necessary to either provide both a reference SPC and at least one fault set or nothing." + # INFO: Code is always provided but if no reference sets are given we act like there is no code. + if (code is not None) and not (ref_x_fs.size or ref_z_fs.size): + code = None + if not ((ref_x_fs.size or ref_z_fs.size) ^ (code is None)): + msg = "If providing at least one reference set, it is also necessary to provide a reference CSS Code. Or if providing a CSSCode, at least of reference fault set must be given also." raise ValueError(msg) matrix = matrix.copy() + if code and code.distance > 5: + if ref_z_fs.size and not ref_x_fs.size: + matrix = mod2.row_echelon(matrix, full=True)[0] + if ref_z_fs.size and ref_x_fs.size: + matrix = mod2.row_echelon(matrix, full=True)[0] rank = mod2.rank(matrix) def is_reduced() -> bool: @@ -153,17 +169,18 @@ def is_reduced() -> bool: failed_cnots = penalty_cols used_cnots = [] # NOTE: set up variables for distinct fault set construction - if ref_spc is not None: + if code is not None: # matrix that describes how an error happening at qubit i would propagate right now through # the circuit x_propagation_matrix: npt.NDArray[np.int8] = np.eye(matrix.shape[1], dtype=np.int8) z_propagation_matrix: npt.NDArray[np.int8] = np.eye(matrix.shape[1], dtype=np.int8) - np.empty((0, matrix.shape[1]), dtype=np.int8) - np.empty((0, matrix.shape[1]), dtype=np.int8) backtrack_required: bool = False overlapping_errors_x = set() overlapping_errors_z = set() stack = [] + # current_x_fs = np.empty((0, matrix.shape[1]), dtype=np.int8) + current_x_fs = np.eye(matrix.shape[1], dtype=np.int8) + # current_z_fs = np.empty((0, matrix.shape[1]), dtype=np.int8) while not is_reduced(): # flag in case algorithm can only choose CNOT that would violate t-distinctness deadend: bool = False @@ -187,11 +204,16 @@ def is_reduced() -> bool: used_columns = [] continue - if ref_spc is not None: + if code is not None: # Get all valid (i, j) pairs sorted by cost candidate_indices = np.argsort(costs_unused.flatten()) # Flatten and sort by value candidate_pairs = [np.unravel_index(idx, costs.shape) for idx in candidate_indices] + # valid_indices = np.where((costs_unused < 0) & ~costs_unused.mask) + # negative_values = costs_unused[valid_indices] + # sorted_indices = np.argsort(negative_values) # Sort values in ascending order + # candidate_pairs = list(zip(valid_indices[0][sorted_indices], valid_indices[1][sorted_indices])) + # Find the first (i, j) that does NOT cause overlap for i, j in candidate_pairs: if (int(i), int(j)) in failed_cnots or (int(i), int(j)) in used_cnots: @@ -204,6 +226,7 @@ def is_reduced() -> bool: failed_cnots = [fcnot for fcnot in failed_cnots if removed_cnot[0] != fcnot[0]] else: failed_cnots = [fcnot for fcnot in failed_cnots if removed_cnot[1] != fcnot[1]] + failed_cnots.append(removed_cnot) print_dynamic_eliminations(eliminations, failed_cnots) backtrack_required = False deadend = True @@ -235,20 +258,25 @@ def is_reduced() -> bool: new_x_error = np.expand_dims(new_x_error, axis=0) new_z_error = np.expand_dims(new_z_error, axis=0) - # trial_x_fs = np.append(current_x_fs, [new_x_error], axis=0) - # trial_z_fs = np.append(current_z_fs, [new_z_error], axis=0) - # Check if there is no overlap—if true, accept (i, j) - # NOTE: this needs to be updated. So far I am checking only error one events of the new circuit against error one and two - # events of the reference circuit, but it can also happen that a two error event of the new circuit overlaps with some - # error one event of the reference circuit, which is neglected here. + # NOTE: Now if specifically given a one error x fault set it is possible to also keep track of the current + # 2 error fault set of the new circuit and check those for overlap. + # TODO: for z the above functionality is not yet implemented found_cnot = False + def filter_fault_set(fault_set: npt.NDArray[np.int8], threshold: int) -> npt.NDArray[np.int8]: + """Filter fault sets based on a sum threshold.""" + return fault_set[np.where(fault_set.sum(axis=1) > threshold)] + # only calculate overlap if reference fault set is given (optimization) if ref_x_fs.size: - x_overlap: bool = ref_spc.check_fs_overlap(ref_x_fs, new_x_error) + x_overlap: bool = code.check_fs_overlap(ref_x_fs, new_x_error) + if ref_x_1fs.size and not x_overlap: + trial_x_2fs = (current_x_fs + new_x_error) % 2 + trial_x_2fs = filter_fault_set(trial_x_2fs, int((code.distance - 1) / 2)) + x_overlap: bool = code.check_fs_overlap(ref_x_1fs, trial_x_2fs) if ref_z_fs.size: - z_overlap: bool = ref_spc.check_fs_overlap(ref_z_fs, new_z_error, x_error=False) + z_overlap: bool = code.check_fs_overlap(ref_z_fs, new_z_error, x_error=False) if ref_x_fs.size and ref_z_fs.size: # Both sets provided: Enter if **both** overlaps fail @@ -285,8 +313,10 @@ def is_reduced() -> bool: if ref_x_fs.size and not x_overlap: x_propagation_matrix = next_x_propagation_matrix - elif ref_z_fs.size and not z_overlap: + current_x_fs = np.vstack((current_x_fs, new_x_error), dtype=np.int8) + if ref_z_fs.size and not z_overlap: z_propagation_matrix = next_z_propagation_matrix + # current_z_fs = trial_z_fs break failed_cnots.append((int(i), int(j))) @@ -393,9 +423,9 @@ def check_mutually_disjointness_spcs( x_fs = _spc.compute_fault_set() z_fs = _spc.compute_fault_set(x_errors=False) if x_error: - if _spc.check_fs_overlap(x_fs, px_fs): + if _spc.code.check_fs_overlap(x_fs, px_fs): break - elif _spc.check_fs_overlap(z_fs, pz_fs, x_error=False): + elif _spc.code.check_fs_overlap(z_fs, pz_fs, x_error=False): break # Stop checking if there's an overlap else: # No overlap found, so add pspc c_spcs.append(pspc) From c817945f7d0b261b2131b44134e4a8bb74066bf7 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 8 Apr 2025 10:40:54 +0200 Subject: [PATCH 072/156] clean up StatePreparationCircuit Class add variables to heuristic --- src/mqt/qecc/circuit_synthesis/state_prep.py | 114 +++---------------- 1 file changed, 16 insertions(+), 98 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index e1b1b1875..05b39feda 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -15,7 +15,6 @@ from ..codes import InvalidCSSCodeError from .synthesis_utils import ( build_css_circuit_from_cnot_list, - get_permutation_group, heuristic_gaussian_elimination, iterative_search_with_timeout, measure_flagged, @@ -35,7 +34,6 @@ import numpy.typing as npt from qiskit import DAGNode from qiskit.quantum_info import PauliList - from sympy.combinatorics import Permutation from ..codes import CSSCode @@ -230,23 +228,6 @@ def _set_max_errors(self) -> None: self.x_fault_sets_unreduced: list[npt.NDArray[np.int8] | None] = [None for _ in range(self.max_errors + 1)] self.z_fault_sets_unreduced: list[npt.NDArray[np.int8] | None] = [None for _ in range(self.max_errors + 1)] - def check_fs_overlap(self, fs_1: npt.NDArray[np.int8], fs_2: npt.NDArray[np.int8], x_error: bool = True) -> bool: - """Returns True if there is an overlap between both fault sets.""" - # TODO: add method docstring and argument descriptions - # check if one of the fault sets is empty. If so, default is no overlap - if not fs_1.size or not fs_2.size: - return False - check_fn = self.code.stabilizer_eq_x_error if x_error else self.code.stabilizer_eq_z_error - return any(check_fn(f1, f2) for f1 in fs_1 for f2 in fs_2) - # check_fn = self.code.stabilizer_eq_x_error if x_error else self.code.stabilizer_eq_z_error - # for f1 in fs_1: - # for f2 in fs_2: - # if check_fn(f1, f2): - # print(f"\nOverlap found: f1={f1}, f2={f2}\nx-error:{x_error}") - # return True # Return immediately after finding the first overlap - # - # return False # Return False if no overlaps are found - def _build_state_prep_circuit_from_back( checks: npt.NDArray[np.int8], cnots: list[tuple[int, int]], zero_state: bool = True @@ -262,7 +243,14 @@ def _build_state_prep_circuit_from_back( def heuristic_prep_circuit( - code: CSSCode, optimize_depth: bool = True, zero_state: bool = True, penalty_cols: list[int] | None = None + code: CSSCode, + optimize_depth: bool = True, + zero_state: bool = True, + penalty_cols: list[tuple[int]] | None = None, + ref_x_fs: npt.NDArray[np.int8] | None = None, + ref_z_fs: npt.NDArray[np.int8] | None = None, + guide_by_x: bool = True, + ref_x_1fs: npt.NDArray[np.int8] | None = None, ) -> StatePrepCircuit: """Return a circuit that prepares the +1 eigenstate of the code w.r.t. the Z or X basis. @@ -282,90 +270,20 @@ def heuristic_prep_circuit( checks = code.Hx if zero_state else code.Hz assert checks is not None checks, cnots = heuristic_gaussian_elimination( - checks, parallel_elimination=optimize_depth, penalty_cols=penalty_cols + checks, + parallel_elimination=optimize_depth, + penalty_cols=penalty_cols, + code=code, + ref_x_fs=ref_x_fs, + ref_z_fs=ref_z_fs, + guide_by_x=guide_by_x, + ref_x_1fs=ref_x_1fs, ) circ = _build_state_prep_circuit_from_back(checks, cnots, zero_state) return StatePrepCircuit(circ, code, zero_state) -def fs_disjunct_spc( - code: CSSCode, automorph_generators: list[list[int]], optimize_depth: bool = True, zero_state: bool = True -) -> dict[Permutation, list[npt.NDArray[np.int8]]]: - """Returns dictionary of permutations for the given QEC. - - This function takes a QEC and the corresponding strong automorphism group. It then checks every permutation and - returns a dictionary with all permutations as keys and the overlapping propagated errors in the fault set. - - Args: - code: The CSS code to prepare the state for. - optimize_depth: If True, optimize the depth of the circuit. This may lead to a higher number of CNOTs. - zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. - automorph_generators: foobar - """ - logger.info("Starting heuristic state preparation.") - if code.Hx is None or code.Hz is None: - msg = "The code must have both X and Z stabilizers defined." - raise InvalidCSSCodeError(msg) - - checks = code.Hx if zero_state else code.Hz - assert checks is not None - checks, cnots = heuristic_gaussian_elimination(checks, parallel_elimination=optimize_depth) - # NOTE: everything above is code duplication from heuristic_prep_circuit() - # could this be simplified but then we would need an intermediate return of checks, cnots - - permutation_group = get_permutation_group(group_generators=automorph_generators) - # BUG: I have those prints since the stateprep circuit below gives another fault set than the one - # returned all the way at the bottom without this if section and I do not understand why - circ = _build_state_prep_circuit_from_back(checks.copy(), cnots.copy(), zero_state) - stateprepcirc = StatePrepCircuit(circ, code, zero_state) - - # NOTE: get fault sets based on code distance - stateprepcirc.compute_fault_set() - fault_set_1 = stateprepcirc.x_fault_sets[1] - if stateprepcirc.code.distance == 5: - fault_set_1 = fault_set_1[np.where(fault_set_1.sum(axis=1) > 2)] - if stateprepcirc.code.distance == 7: - stateprepcirc.compute_fault_set(2) - fault_set_2 = stateprepcirc.x_fault_sets[2] - fault_set_1 = fault_set_1[np.where(fault_set_1.sum(axis=1) > 3)] - fault_set_2 = fault_set_2[np.where(fault_set_2.sum(axis=1) > 3)] - - original_faults = fault_set_1 - if stateprepcirc.code.distance == 7: - original_faults = np.vstack(fault_set_1, fault_set_2) - return overlap_search( - code=code, fs_2b_permuted=fault_set_1, comp_faults=original_faults, permutation_group=permutation_group - ) - - -def overlap_search( - code: CSSCode, - fs_2b_permuted: npt.NDArray[np.int8], - comp_faults: npt.NDArray[np.int8], - permutation_group: list[Permutation], -) -> dict[Permutation, list[npt.NDArray[np.int8]]]: - """Foobar.""" - # HACK: Overlap search has 3 nested for loops, check for improvement - overlapping_faults: list[npt.NDArray[np.int8]] = [] - perm_overlap: dict[Permutation, list[npt.NDArray[np.int8]]] = {} - print(f"fault set to be permuted:\n{fs_2b_permuted}") - print(f"comparison fault set:\n{comp_faults}") - for perm in permutation_group: - perm_fs = fs_2b_permuted[:, perm.array_form] - for pf in perm_fs: - for ff in comp_faults: - if code.stabilizer_eq_x_error(pf, ff): - # FIX: without this print statement append gets changed to extend on save - print(f"permutation: {perm}") - print(f"stabilizer equivalent error: \n{pf}(permuted) and \n{ff}(not permuted)") - overlapping_faults.append(pf) - perm_overlap[perm] = overlapping_faults - overlapping_faults = [] - - return perm_overlap - - def depth_optimal_prep_circuit( code: CSSCode, zero_state: bool = True, From 461ea1b2b05f3e142e3f1000adcb6879da21ddf3 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 8 Apr 2025 10:52:12 +0200 Subject: [PATCH 073/156] add variable descriptions --- src/mqt/qecc/circuit_synthesis/state_prep.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 05b39feda..c9796747a 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -258,7 +258,11 @@ def heuristic_prep_circuit( code: The CSS code to prepare the state for. optimize_depth: If True, optimize the depth of the circuit. This may lead to a higher number of CNOTs. zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. - penalty_cols: foobar + penalty_cols: tuples of CNOTs (control, target) which are initially added to the failed_cnots list and hence can only be applied once the control qubit has been used elsewhere + ref_x_fs: (Optional) reference x fault set which influences the construction of the circuit + ref_z_fs: (Optional) reference z fault set which influences the construction of the circuit + guide_by_x: Flag that decides wether dismissed CNOTs are free to placement again after either the control (x guided) or the target (z guided) has been used elsewhere + ref_x_1fs: (Optional) reference one error x fault set which ensures that no two error event of the newly constructed circuit cancels a one error event of the reference circuit """ if penalty_cols is None: penalty_cols = [] From e3bb84954252593da938999996cd334d5b56d6e3 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 8 Apr 2025 10:59:30 +0200 Subject: [PATCH 074/156] add fs overlap check to circuit and add Z logical to equivalence check --- src/mqt/qecc/codes/css_code.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/mqt/qecc/codes/css_code.py b/src/mqt/qecc/codes/css_code.py index 36ef15896..1166a2bb7 100644 --- a/src/mqt/qecc/codes/css_code.py +++ b/src/mqt/qecc/codes/css_code.py @@ -162,12 +162,31 @@ def stabilizer_eq_z_error(self, error_1: npt.NDArray[np.int8], error_2: npt.NDAr m3 = np.vstack([self.Hz, error_1, error_2]) return bool(mod2.rank(m1) == mod2.rank(m2) == mod2.rank(m3)) + def stabilizer_eq_z_error_with_logical(self, error_1: npt.NDArray[np.int8], error_2: npt.NDArray[np.int8]) -> bool: + """Check if two Z errors are in the same coset.""" + z_checks = np.vstack((self.Lz.copy(), self.Hz.copy())) + if self.Hz.shape[0] == 0: + return bool(np.array_equal(error_1, error_2)) + m1 = np.vstack([z_checks, error_1]) + m2 = np.vstack([z_checks, error_2]) + m3 = np.vstack([z_checks, error_1, error_2]) + return bool(mod2.rank(m1) == mod2.rank(m2) == mod2.rank(m3)) + def is_self_dual(self) -> bool: """Check if the code is self-dual.""" return bool( self.Hx.shape[0] == self.Hz.shape[0] and mod2.rank(self.Hx) == mod2.rank(np.vstack([self.Hx, self.Hz])) ) + def check_fs_overlap(self, fs_1: npt.NDArray[np.int8], fs_2: npt.NDArray[np.int8], x_error: bool = True) -> bool: + """Returns True if there is an overlap between both fault sets.""" + # TODO: add method docstring and argument descriptions + # check if one of the fault sets is empty. If so, default is no overlap + if not fs_1.size or not fs_2.size: + return False + check_fn = self.stabilizer_eq_x_error if x_error else self.stabilizer_eq_z_error_with_logical + return any(check_fn(f1, f2) for f1 in fs_1 for f2 in fs_2) + @staticmethod def _check_valid_check_matrices(Hx: npt.NDArray[np.int8] | None, Hz: npt.NDArray[np.int8] | None) -> None: # noqa: N803 """Check if the code is a valid CSS code.""" From a8be98c9d15d2e66e34fb9bb6f48378cd7bc4590 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 8 Apr 2025 11:09:24 +0200 Subject: [PATCH 075/156] improve CNOT count of C4 for the distance 7 octagon code --- .../cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3 | 135 ++++++++---------- .../cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_0 | 64 +++++++++ .../cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_1 | 70 +++++++++ .../cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_2 | 75 ++++++++++ .../cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_3 | 90 ++++++++++++ 5 files changed, 361 insertions(+), 73 deletions(-) create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_0 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_1 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_2 create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_3 diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3 index 7e5d1256e..4038cabde 100644 --- a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3 +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3 @@ -3,88 +3,77 @@ include "qelib1.inc"; qreg q[31]; h q[0]; h q[1]; -h q[2]; -h q[4]; +h q[3]; h q[6]; -h q[7]; -h q[8]; h q[9]; h q[11]; -h q[12]; h q[13]; -h q[15]; +h q[14]; +h q[16]; +h q[17]; +h q[18]; h q[19]; -h q[22]; -h q[24]; -cx q[6],q[21]; -cx q[15],q[20]; -cx q[0],q[21]; +h q[25]; +h q[26]; +h q[30]; +cx q[30],q[12]; +cx q[6],q[23]; +cx q[18],q[30]; +cx q[0],q[29]; +cx q[18],q[8]; +cx q[6],q[20]; +cx q[14],q[23]; +cx q[26],q[21]; +cx q[29],q[18]; +cx q[11],q[20]; +cx q[0],q[23]; +cx q[16],q[28]; +cx q[17],q[7]; +cx q[25],q[5]; +cx q[3],q[27]; +cx q[6],q[17]; +cx q[16],q[2]; +cx q[14],q[29]; cx q[13],q[10]; -cx q[2],q[28]; -cx q[6],q[25]; -cx q[19],q[17]; -cx q[24],q[21]; -cx q[11],q[13]; -cx q[22],q[27]; -cx q[7],q[25]; +cx q[27],q[18]; +cx q[1],q[21]; cx q[9],q[23]; -cx q[15],q[14]; -cx q[6],q[28]; -cx q[17],q[29]; -cx q[10],q[21]; -cx q[9],q[30]; +cx q[20],q[25]; cx q[14],q[16]; -cx q[7],q[23]; -cx q[0],q[29]; -cx q[11],q[28]; -cx q[27],q[5]; -cx q[24],q[3]; -cx q[12],q[18]; -cx q[17],q[13]; -cx q[6],q[15]; -cx q[1],q[21]; -cx q[24],q[13]; +cx q[6],q[18]; +cx q[1],q[24]; +cx q[3],q[13]; +cx q[19],q[25]; +cx q[7],q[21]; +cx q[11],q[27]; cx q[2],q[17]; -cx q[7],q[28]; -cx q[11],q[22]; -cx q[3],q[27]; -cx q[12],q[15]; -cx q[10],q[23]; -cx q[4],q[26]; -cx q[29],q[30]; -cx q[25],q[16]; +cx q[23],q[20]; +cx q[7],q[20]; +cx q[5],q[28]; +cx q[26],q[4]; +cx q[9],q[15]; +cx q[17],q[16]; cx q[12],q[23]; -cx q[2],q[14]; -cx q[5],q[25]; -cx q[1],q[24]; -cx q[8],q[18]; -cx q[0],q[15]; -cx q[4],q[21]; -cx q[19],q[22]; -cx q[9],q[20]; -cx q[3],q[28]; -cx q[6],q[29]; -cx q[16],q[27]; -cx q[8],q[23]; -cx q[2],q[22]; -cx q[11],q[24]; -cx q[1],q[26]; +cx q[11],q[18]; cx q[3],q[25]; -cx q[6],q[9]; -cx q[19],q[10]; -cx q[0],q[20]; -cx q[18],q[30]; -cx q[21],q[27]; -cx q[17],q[16]; -cx q[28],q[15]; -cx q[11],q[5]; -cx q[19],q[6]; -cx q[7],q[29]; +cx q[13],q[21]; +cx q[27],q[24]; +cx q[7],q[25]; +cx q[12],q[15]; +cx q[16],q[18]; +cx q[1],q[26]; +cx q[3],q[20]; +cx q[28],q[22]; +cx q[29],q[21]; +cx q[27],q[17]; +cx q[23],q[30]; cx q[24],q[26]; -cx q[13],q[23]; -cx q[22],q[27]; -cx q[14],q[30]; -cx q[16],q[21]; -cx q[25],q[17]; -cx q[28],q[20]; -cx q[15],q[18]; +cx q[16],q[29]; +cx q[12],q[30]; +cx q[5],q[17]; +cx q[19],q[22]; +cx q[11],q[13]; +cx q[18],q[23]; +cx q[20],q[15]; +cx q[25],q[28]; +cx q[21],q[27]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_0 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_0 new file mode 100644 index 000000000..3c36afa8b --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_0 @@ -0,0 +1,64 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[31]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[5]; +h q[6]; +h q[8]; +h q[9]; +h q[10]; +h q[11]; +h q[12]; +h q[17]; +h q[19]; +h q[20]; +cx q[9],q[30]; +cx q[5],q[22]; +cx q[22],q[29]; +cx q[12],q[23]; +cx q[9],q[14]; +cx q[5],q[16]; +cx q[4],q[27]; +cx q[3],q[24]; +cx q[24],q[26]; +cx q[19],q[25]; +cx q[16],q[12]; +cx q[10],q[27]; +cx q[9],q[15]; +cx q[8],q[23]; +cx q[6],q[14]; +cx q[3],q[21]; +cx q[2],q[5]; +cx q[1],q[4]; +cx q[0],q[29]; +cx q[26],q[16]; +cx q[25],q[28]; +cx q[24],q[14]; +cx q[21],q[0]; +cx q[20],q[9]; +cx q[19],q[22]; +cx q[17],q[2]; +cx q[15],q[1]; +cx q[11],q[3]; +cx q[10],q[13]; +cx q[8],q[18]; +cx q[6],q[7]; +cx q[20],q[18]; +cx q[17],q[19]; +cx q[14],q[16]; +cx q[11],q[13]; +cx q[29],q[6]; +cx q[27],q[21]; +cx q[23],q[30]; +cx q[12],q[15]; +cx q[9],q[8]; +cx q[5],q[28]; +cx q[4],q[26]; +cx q[3],q[10]; +cx q[2],q[25]; +cx q[1],q[24]; +cx q[0],q[7]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_1 new file mode 100644 index 000000000..7669ce99f --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_1 @@ -0,0 +1,70 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[31]; +h q[0]; +h q[2]; +h q[7]; +cx q[7],q[6]; +h q[9]; +cx q[9],q[8]; +cx q[8],q[6]; +h q[11]; +h q[13]; +h q[16]; +cx q[16],q[14]; +h q[17]; +h q[19]; +h q[20]; +cx q[16],q[22]; +cx q[0],q[16]; +cx q[0],q[7]; +h q[23]; +cx q[23],q[15]; +cx q[22],q[15]; +cx q[15],q[12]; +cx q[19],q[22]; +cx q[17],q[19]; +h q[24]; +h q[26]; +cx q[24],q[26]; +cx q[24],q[21]; +cx q[13],q[21]; +cx q[11],q[13]; +cx q[9],q[24]; +cx q[9],q[16]; +cx q[16],q[6]; +cx q[9],q[15]; +h q[27]; +cx q[27],q[10]; +cx q[10],q[3]; +cx q[10],q[21]; +cx q[13],q[10]; +cx q[27],q[26]; +cx q[26],q[24]; +cx q[27],q[1]; +cx q[1],q[4]; +cx q[24],q[1]; +cx q[26],q[4]; +cx q[27],q[7]; +cx q[21],q[27]; +cx q[2],q[28]; +cx q[28],q[25]; +cx q[19],q[25]; +cx q[22],q[28]; +cx q[0],q[29]; +cx q[6],q[29]; +cx q[7],q[0]; +h q[30]; +cx q[30],q[18]; +cx q[14],q[30]; +cx q[14],q[5]; +cx q[15],q[30]; +cx q[18],q[23]; +cx q[2],q[5]; +cx q[17],q[2]; +cx q[20],q[18]; +cx q[18],q[8]; +cx q[20],q[9]; +cx q[3],q[14]; +cx q[11],q[3]; +cx q[16],q[14]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_2 new file mode 100644 index 000000000..4d2c2d5c8 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_2 @@ -0,0 +1,75 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[31]; +h q[1]; +h q[4]; +h q[6]; +h q[7]; +h q[8]; +h q[9]; +h q[10]; +h q[11]; +h q[13]; +h q[14]; +h q[15]; +h q[17]; +h q[19]; +h q[23]; +h q[25]; +cx q[23],q[0]; +cx q[13],q[3]; +cx q[1],q[27]; +cx q[6],q[28]; +cx q[15],q[30]; +cx q[14],q[16]; +cx q[7],q[16]; +cx q[8],q[30]; +cx q[19],q[28]; +cx q[25],q[2]; +cx q[9],q[21]; +cx q[11],q[13]; +cx q[15],q[18]; +cx q[23],q[27]; +cx q[6],q[29]; +cx q[1],q[21]; +cx q[3],q[24]; +cx q[9],q[30]; +cx q[0],q[15]; +cx q[19],q[25]; +cx q[4],q[26]; +cx q[17],q[5]; +cx q[10],q[27]; +cx q[16],q[23]; +cx q[13],q[28]; +cx q[4],q[27]; +cx q[9],q[20]; +cx q[10],q[21]; +cx q[18],q[12]; +cx q[0],q[29]; +cx q[1],q[24]; +cx q[11],q[26]; +cx q[7],q[28]; +cx q[14],q[30]; +cx q[16],q[15]; +cx q[13],q[23]; +cx q[25],q[17]; +cx q[11],q[24]; +cx q[8],q[18]; +cx q[26],q[21]; +cx q[13],q[15]; +cx q[29],q[30]; +cx q[25],q[22]; +cx q[16],q[27]; +cx q[28],q[17]; +cx q[23],q[20]; +cx q[5],q[22]; +cx q[3],q[26]; +cx q[2],q[28]; +cx q[6],q[16]; +cx q[7],q[29]; +cx q[10],q[13]; +cx q[11],q[27]; +cx q[30],q[23]; +cx q[20],q[21]; +cx q[15],q[18]; +cx q[17],q[25]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_3 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_3 new file mode 100644 index 000000000..7e5d1256e --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_3 @@ -0,0 +1,90 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[31]; +h q[0]; +h q[1]; +h q[2]; +h q[4]; +h q[6]; +h q[7]; +h q[8]; +h q[9]; +h q[11]; +h q[12]; +h q[13]; +h q[15]; +h q[19]; +h q[22]; +h q[24]; +cx q[6],q[21]; +cx q[15],q[20]; +cx q[0],q[21]; +cx q[13],q[10]; +cx q[2],q[28]; +cx q[6],q[25]; +cx q[19],q[17]; +cx q[24],q[21]; +cx q[11],q[13]; +cx q[22],q[27]; +cx q[7],q[25]; +cx q[9],q[23]; +cx q[15],q[14]; +cx q[6],q[28]; +cx q[17],q[29]; +cx q[10],q[21]; +cx q[9],q[30]; +cx q[14],q[16]; +cx q[7],q[23]; +cx q[0],q[29]; +cx q[11],q[28]; +cx q[27],q[5]; +cx q[24],q[3]; +cx q[12],q[18]; +cx q[17],q[13]; +cx q[6],q[15]; +cx q[1],q[21]; +cx q[24],q[13]; +cx q[2],q[17]; +cx q[7],q[28]; +cx q[11],q[22]; +cx q[3],q[27]; +cx q[12],q[15]; +cx q[10],q[23]; +cx q[4],q[26]; +cx q[29],q[30]; +cx q[25],q[16]; +cx q[12],q[23]; +cx q[2],q[14]; +cx q[5],q[25]; +cx q[1],q[24]; +cx q[8],q[18]; +cx q[0],q[15]; +cx q[4],q[21]; +cx q[19],q[22]; +cx q[9],q[20]; +cx q[3],q[28]; +cx q[6],q[29]; +cx q[16],q[27]; +cx q[8],q[23]; +cx q[2],q[22]; +cx q[11],q[24]; +cx q[1],q[26]; +cx q[3],q[25]; +cx q[6],q[9]; +cx q[19],q[10]; +cx q[0],q[20]; +cx q[18],q[30]; +cx q[21],q[27]; +cx q[17],q[16]; +cx q[28],q[15]; +cx q[11],q[5]; +cx q[19],q[6]; +cx q[7],q[29]; +cx q[24],q[26]; +cx q[13],q[23]; +cx q[22],q[27]; +cx q[14],q[30]; +cx q[16],q[21]; +cx q[25],q[17]; +cx q[28],q[20]; +cx q[15],q[18]; From 168fb96b6b359f34d7c61c16b616e9fedf6e19bf Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Fri, 11 Apr 2025 10:09:35 +0200 Subject: [PATCH 076/156] remove unwanted csv files and change propabilities --- scripts/ft_stateprep/eval_circ_mod/cc_4_8_8.csv | 1 - scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 scripts/ft_stateprep/eval_circ_mod/cc_4_8_8.csv diff --git a/scripts/ft_stateprep/eval_circ_mod/cc_4_8_8.csv b/scripts/ft_stateprep/eval_circ_mod/cc_4_8_8.csv deleted file mode 100644 index 14440f142..000000000 --- a/scripts/ft_stateprep/eval_circ_mod/cc_4_8_8.csv +++ /dev/null @@ -1 +0,0 @@ -p p_l acceptance errors runs diff --git a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh index 3c89558b1..40b2b7c60 100755 --- a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh +++ b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh @@ -2,7 +2,8 @@ # Description: Estimate logical error rates for given code in parallel. Results are saved in a csv file described by the first argument. All other arguments are passed to the python script. -declare -a p=("0.01" "0.009" "0.007" "0.005" "0.003" "0.001" "0.0009" "0.0007") +# declare -a p=("0.01" "0.009" "0.007" "0.005" "0.003" "0.001" "0.0009" "0.0007") +declare -a p=("0.003" "0.0025" "0.0035" "0.002" "0.004" "0.0015" "0.0045" "0.001" "0.005" "0.0055" "0.006" "0.0065" "0.007" "0.0075" "0.008" "0.0085" "0.009" "0.0095" "0.01") echo "p p_l acceptance errors runs p_l_error acceptance_error" > "$1.csv" From 7d18b2ff947c6041062f6f2abb19b94e96047f67 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Fri, 11 Apr 2025 10:11:31 +0200 Subject: [PATCH 077/156] add functionality to start z error sim --- .../eval_circ_mod/estimate_logical_error_rate.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py index 693630842..cdd4227f7 100644 --- a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py +++ b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py @@ -10,6 +10,7 @@ from mqt.qecc import CSSCode from mqt.qecc.circuit_synthesis.simulation import SteaneNDFTStatePrepSimulator +from mqt.qecc.circuit_synthesis.state_prep import heuristic_prep_circuit from mqt.qecc.codes import HexagonalColorCode, SquareOctagonColorCode @@ -28,6 +29,10 @@ def main() -> None: parser.add_argument( "--plus_state", default=False, dest="zero_state", action="store_false", help="Synthesize logical |+> state." ) + parser.add_argument("--x_errors", default=True, action="store_true", help="Calculate error rates for X-errors") + parser.add_argument( + "--z_errors", default=False, dest="x_errors", action="store_false", help="Calculate error rates for Z errors" + ) parser.add_argument("-n", "--n_errors", type=int, default=500, help="Number of errors to sample") parser.add_argument( "-d", "--distance", type=int, default=3, help="Code Distance (only required for surface and color codes)" @@ -84,12 +89,17 @@ def main() -> None: code=code, circ3=circuits[2], circ4=circuits[3], + check_circuit=None if args.x_errors else heuristic_prep_circuit(code, zero_state=False).circ, p=args.p_error, p_idle=args.p_idle_factor * args.p_error, - zero_state=args.zero_state, decoder=lut if code_name == "cc_4_8_8_d7" else None, ) - res = sim.logical_error_rate(min_errors=args.n_errors) + if args.x_errors: + res = sim.logical_error_rate(min_errors=args.n_errors) + else: + sim.set_p(args.p_error, args.p_idle_factor * args.p_error) + res = sim.secondary_logical_error_rate(min_errors=args.n_errors) + print(",".join([str(x) for x in res])) From a1ceeb7e5a499a8e62d2577d5d24ae09de1268b9 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Fri, 11 Apr 2025 10:28:58 +0200 Subject: [PATCH 078/156] remove print statements when constructing heuristic circuit --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index f2d82dd7c..b7e3bbb2f 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -227,7 +227,7 @@ def is_reduced() -> bool: else: failed_cnots = [fcnot for fcnot in failed_cnots if removed_cnot[1] != fcnot[1]] failed_cnots.append(removed_cnot) - print_dynamic_eliminations(eliminations, failed_cnots) + # print_dynamic_eliminations(eliminations, failed_cnots) backtrack_required = False deadend = True break @@ -320,14 +320,14 @@ def filter_fault_set(fault_set: npt.NDArray[np.int8], threshold: int) -> npt.NDA break failed_cnots.append((int(i), int(j))) - print_dynamic_eliminations(eliminations, failed_cnots) + # print_dynamic_eliminations(eliminations, failed_cnots) else: i, j = np.unravel_index(np.argmin(costs_unused), costs.shape) if deadend: continue eliminations.append((int(i), int(j))) - print_dynamic_eliminations(eliminations, failed_cnots) + # print_dynamic_eliminations(eliminations, failed_cnots) if parallel_elimination: used_columns.append(i) From 6e95f6cd7869ef9cc6d0e4939fad1f159bf377bd Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Mon, 14 Apr 2025 17:35:33 +0200 Subject: [PATCH 079/156] Fix bug in simulator circuit construction. --- src/mqt/qecc/circuit_synthesis/simulation.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 037226d21..0e943988d 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -133,6 +133,7 @@ def idle_error(used_qubits: list[int]) -> None: used_qubits: list[int] = [] targets = set() defaultdict(int) + [False for _ in circ.qubits] for layer in layers: layer_circ = dag_to_circuit(layer["graph"]) @@ -169,6 +170,8 @@ def idle_error(used_qubits: list[int]) -> None: if not initialized[target]: if target not in error_free_qubits: stim_circuit.append_operation("X_ERROR", [target], [2 * self.p / 3]) # Wrong initialization + if target in ctrls: + stim_circuit.append_operation("H", [target]) initialized[target] = True stim_circuit.append_operation("CX", [ctrl, target]) @@ -479,6 +482,8 @@ def __init__( self.has_one_ancilla = circ3 is None + circ1 = circ1.copy() + circ2 = circ2.copy() if self.has_one_ancilla: circ3 = QuantumCircuit() circ4 = QuantumCircuit() From 6d28a6bc6926a547b752f5444d3862696096df56 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 27 May 2025 10:23:47 +0200 Subject: [PATCH 080/156] reinstate gaussian elimination, copy advanced logic return to state of original gaussian elimination and copy advanced logic to a new function to work on it there. --- .../qecc/circuit_synthesis/synthesis_utils.py | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index b12b6cd99..16395895a 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -105,6 +105,76 @@ def print_dynamic_eliminations(eliminations, failed_cnots) -> None: def heuristic_gaussian_elimination( matrix: npt.NDArray[np.int8], parallel_elimination: bool = True, +) -> tuple[npt.NDArray[np.int8], list[tuple[int, int]]]: + """Perform Gaussian elimination on the column space of a matrix using as few eliminations as possible. + + The algorithm utilizes a greedy heuristic to select the columns to eliminate in order to minimize the number of eliminations required. + + The matrix is reduced until there are exactly rnk(matrix) columns with non-zero entries. + + Args: + matrix: The matrix to perform Gaussian elimination on. + parallel_elimination: Whether to prioritize elimination steps that act on disjoint columns. + + Returns: + The reduced matrix and a list of the elimination steps taken. The elimination steps are represented as tuples of the form (i, j) where i is the column being eliminated with and j is the column being eliminated. + """ + matrix = matrix.copy() + rank = mod2.rank(matrix) + + def is_reduced() -> bool: + return bool(len(np.where(np.all(matrix == 0, axis=0))[0]) == matrix.shape[1] - rank) + + costs = np.array([ + [np.sum((matrix[:, i] + matrix[:, j]) % 2) for j in range(matrix.shape[1])] for i in range(matrix.shape[1]) + ]) + + costs -= np.sum(matrix, axis=0) + np.fill_diagonal(costs, 1) + + used_columns = [] # type: list[np.int_] + eliminations = [] # type: list[tuple[int, int]] + while not is_reduced(): + m = np.zeros((matrix.shape[1], matrix.shape[1]), dtype=bool) # type: npt.NDArray[np.bool_] + m[used_columns, :] = True + m[:, used_columns] = True + costs_unused = np.ma.array(costs, mask=m) # type: ignore[no-untyped-call] + + if np.all(costs_unused >= 0) or len(used_columns) == matrix.shape[1]: # no more reductions possible + if used_columns == []: # local minimum => get out by making matrix triangular + logger.warning("Local minimum reached. Making matrix triangular.") + matrix = mod2.row_echelon(matrix, full=True)[0] + costs = np.array([ + [np.sum((matrix[:, i] + matrix[:, j]) % 2) for j in range(matrix.shape[1])] + for i in range(matrix.shape[1]) + ]) + costs -= np.sum(matrix, axis=0) + np.fill_diagonal(costs, 1) + else: # try to move onto the next layer + used_columns = [] + continue + + i, j = np.unravel_index(np.argmin(costs_unused), costs.shape) + eliminations.append((int(i), int(j))) + + if parallel_elimination: + used_columns.append(i) + used_columns.append(j) + + # update matrix + matrix[:, j] = (matrix[:, i] + matrix[:, j]) % 2 + # update costs + new_weights = np.sum((matrix[:, j][:, np.newaxis] + matrix) % 2, axis=0) + costs[j, :] = new_weights - np.sum(matrix, axis=0) + costs[:, j] = new_weights - np.sum(matrix[:, j]) + np.fill_diagonal(costs, 1) + + return matrix, eliminations + + +def reference_guided_elimination( + matrix: npt.NDArray[np.int8], + parallel_elimination: bool = True, penalty_cols: list[tuple[int]] | None = None, code: CSSCode | None = None, ref_x_fs: npt.NDArray[np.int8] | None = None, From f07d5f44a08a6185e3be2ba92d9e467166ac4f6e Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 27 May 2025 10:26:21 +0200 Subject: [PATCH 081/156] clean up unused files and functions --- .../qecc/circuit_synthesis/permutation_st.py | 69 ------------------- src/mqt/qecc/circuit_synthesis/state_prep.py | 24 ------- 2 files changed, 93 deletions(-) delete mode 100644 src/mqt/qecc/circuit_synthesis/permutation_st.py diff --git a/src/mqt/qecc/circuit_synthesis/permutation_st.py b/src/mqt/qecc/circuit_synthesis/permutation_st.py deleted file mode 100644 index 6e41e3bf9..000000000 --- a/src/mqt/qecc/circuit_synthesis/permutation_st.py +++ /dev/null @@ -1,69 +0,0 @@ -"""This module implements the features of state preparation with qubit permutation.""" - -from __future__ import annotations - -import logging -from typing import TYPE_CHECKING - -import numpy as np -from qiskit import QuantumCircuit - -from mqt.qecc.codes.css_code import CSSCode - -if TYPE_CHECKING: # pragma: no cover - import numpy.typing as npt - -logger = logging.getLogger(__name__) - - -def get_steane_prep_circ() -> QuantumCircuit: - """Function that builds up a state preparation circuit for the Steane code.""" - circ = QuantumCircuit(7) - circ.h(0) - circ.h(1) - circ.h(3) - circ.cx(0, 6) - circ.cx(1, 2) - circ.cx(3, 5) - circ.cx(0, 4) - circ.cx(1, 5) - circ.cx(0, 2) - circ.cx(3, 4) - circ.cx(5, 6) - return circ - - -def get_steane_prep_circ_twice() -> QuantumCircuit: - """Function that builds up a state preparation circuit for the Steane code.""" - circ = QuantumCircuit(14) - circ.h(0) - circ.h(1) - circ.h(3) - circ.cx(0, 6) - circ.cx(1, 2) - circ.cx(3, 5) - circ.cx(0, 4) - circ.cx(1, 5) - circ.cx(0, 2) - circ.cx(3, 4) - circ.cx(5, 6) - circ.h(7) - circ.h(8) - circ.h(10) - circ.cx(7, 13) - circ.cx(8, 9) - circ.cx(10, 12) - circ.cx(7, 11) - circ.cx(8, 12) - circ.cx(7, 9) - circ.cx(10, 11) - circ.cx(12, 13) - return circ - - -def get_steane_css_object() -> CSSCode: - """Return the Steane Code as CSS object.""" - distance: int = 3 - hx: npt.NDArray[np.int8] = np.array([[0, 0, 0, 1, 1, 1, 1], [0, 1, 1, 0, 0, 1, 1], [1, 0, 1, 0, 1, 0, 1]]) - hz: npt.NDArray[np.int8] = np.array([[0, 0, 0, 1, 1, 1, 1], [0, 1, 1, 0, 0, 1, 1], [1, 0, 1, 0, 1, 0, 1]]) - return CSSCode(distance, hx, hz, distance, distance) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 8d5dbfd22..d1994eea4 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -71,30 +71,6 @@ def __init__( self.max_x_measurements = len(self.x_checks) self.max_z_measurements = len(self.z_checks) - def permute_circ(self, permutation: list[int]) -> None: - # TODO: add functionality that resets e.g. the fault sets - # are there other properties that need to be reset? - """Permutes the qubits in the given quantum circuit according to the specified permutation. - - Args: - permutation (list): A list where the i-th element represents the new index of qubit i. - """ - num_qubits = self.circ.num_qubits - if sorted(permutation) != list(range(num_qubits)): - msg = "Invalid permutation. It must be a reordering of [0, ..., num_qubits-1]." - raise ValueError(msg) - - # Create a new circuit with the same number of qubits - permuted_circuit = QuantumCircuit(num_qubits) - - # Remap gates according to the permutation - for instruction in self.circ.data: - operation = instruction.operation # Gate operation - qubits = [permutation[self.circ.qubits.index(q)] for q in instruction.qubits] # Permuted qubits - permuted_circuit.append(operation, qubits) - - self.circ = permuted_circuit - def set_error_detection(self, error_detection: bool) -> None: """Set whether the state preparation circuit is for error detection.""" self.error_detection_code = error_detection From 95b3ffa8be19936af2e65d575a2e4184da902800 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 28 May 2025 09:19:30 +0200 Subject: [PATCH 082/156] set up GaussianElimination Class implement a class for Gaussian elimination to then combine here the basic elimination and the reference based elimination --- .../qecc/circuit_synthesis/synthesis_utils.py | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 16395895a..ddabea193 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -414,6 +414,90 @@ def filter_fault_set(fault_set: npt.NDArray[np.int8], threshold: int) -> npt.NDA return matrix, eliminations +class GaussianElimination: + def __init__( + self, + matrix: npt.NDArray[np.int8], + parallel_elimination: bool = True, + code: CSSCode | None = None, + ref_x_fs: npt.NDArray[np.int8] | None = None, + ref_z_fs: npt.NDArray[np.int8] | None = None, + ref_x_1fs: npt.NDArray[np.int8] | None = None, + ref_z_1fs: npt.NDArray[np.int8] | None = None, + penalty_cols: list[tuple[int]] | None = None, + guide_by_x: bool = True, + ) -> None: + self.matrix = matrix.copy() + self.parallel_eliminations = parallel_elimination + self.code = code + self.ref_x_fs = ref_x_fs or np.empty((0,), dtype=np.int8) + self.ref_z_fs = ref_z_fs or np.empty((0,), dtype=np.int8) + self.ref_x_1fs = ref_x_1fs or np.empty((0,), dtype=np.int8) + self.ref_z_1fs = ref_z_1fs or np.empty((0,), dtype=np.int8) + self.guide_by_x = guide_by_x + self.rank = mod2.rank(self.matrix) + self.eliminations = [] + self.failed_cnots = [] + self.used_columns = [] + self.costs = self.compute_cost_matrix() + + def is_reduced(self) -> bool: + return bool(len(np.where(np.all(self.matrix == 0, axis=0))[0]) == self.matrix.shape[1] - self.rank) + + def compute_cost_matrix(self) -> None: + costs = np.array([ + [np.sum((self.matrix[:, i] + self.matrix[:, j]) % 2) for j in range(self.matrix.shape[1])] + for i in range(self.matrix.shape[1]) + ]) + costs -= np.sum(self.matrix, axis=0) + np.fill_diagonal(costs, 1) + return costs + + def mask_out_used_qubits(self): + m = np.zeros((self.matrix.shape[1], self.matrix.shape[1]), dtype=bool) # type: npt.NDArray[np.bool_] + m[self.used_columns, :] = True + m[:, self.used_columns] = True + return np.ma.array(self.costs, mask=m) # type: ignore[no-untyped-call] + + def triangular_reset(self) -> None: + logger.warning("Local minimum reached. Making matrix triangular.") + self.matrix = mod2.row_echelon(self.matrix, full=True)[0] + self.costs = np.array([ + [np.sum((self.matrix[:, i] + self.matrix[:, j]) % 2) for j in range(self.matrix.shape[1])] + for i in range(self.matrix.shape[1]) + ]) + self.costs -= np.sum(self.matrix, axis=0) + np.fill_diagonal(self.costs, 1) + + def update_data_structures(self, i: int, j: int) -> None: + self.eliminations.append((int(i), int(j))) + if self.parallel_elimination: + self.used_columns.append(i) + self.used_columns.append(j) + # update matrix + self.matrix[:, j] = (self.matrix[:, i] + self.matrix[:, j]) % 2 + # update costs + new_weights = np.sum((self.matrix[:, j][:, np.newaxis] + self.matrix) % 2, axis=0) + self.costs[j, :] = new_weights - np.sum(self.matrix, axis=0) + self.costs[:, j] = new_weights - np.sum(self.matrix[:, j]) + np.fill_diagonal(self.costs, 1) + + def basic_elimination(self) -> None: + while not self.is_reduced(): + costs_unused = self.mask_out_used_qubits() + + if ( + np.all(costs_unused >= 0) or len(self.used_columns) == self.matrix.shape[1] + ): # no more reductions possible + if self.used_columns == []: # local minimum => get out by making matrix triangular + self.triangular_reset() + else: + self.used_columns = [] + continue + i, j = np.unravel_index(np.argmin(costs_unused), self.costs.shape) + self.update_data_structures(i, j) + + def get_next_error( propagation_matrix: npt.NDArray[np.int8], cnot_gate: tuple[int, int], x_error: bool = True ) -> tuple[npt.NDArray[np.int8], npt.NDArray[np.int8]]: From 9c12af13fd29c85466c22273554a6f341edb6f78 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 23 Jun 2025 14:50:22 +0200 Subject: [PATCH 083/156] refactor heuristic elimination create GaussianElimination class that contains both the basic elimination as well as the reference based elimination. This commit contains several steps of refactoring. --- .../qecc/circuit_synthesis/synthesis_utils.py | 253 +++++++++++++++--- 1 file changed, 216 insertions(+), 37 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index ddabea193..a8b3432be 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -5,6 +5,7 @@ import functools import logging import sys +from enum import Enum, auto from typing import TYPE_CHECKING, Any import multiprocess @@ -414,6 +415,12 @@ def filter_fault_set(fault_set: npt.NDArray[np.int8], threshold: int) -> npt.NDA return matrix, eliminations +class CandidateAction(Enum): + SKIP = auto() # Ignore this candidate and continue the loop + RESTART_SEARCH = auto() # Reset used_columns and break to restart the search + TRIGGER_BACKTRACK = auto() # Call backtrack() and break + EVALUATE = auto() # Proceed with full validation (overlap checks) + class GaussianElimination: def __init__( self, @@ -437,39 +444,176 @@ def __init__( self.guide_by_x = guide_by_x self.rank = mod2.rank(self.matrix) self.eliminations = [] - self.failed_cnots = [] + self.failed_cnots = penalty_cols or [] # NOTE: this is already a feature and not necessarily default self.used_columns = [] - self.costs = self.compute_cost_matrix() + self.costs = self._compute_cost_matrix() + + def basic_elimination(self) -> None: + while not self.is_reduced(): + costs_unused = self._mask_out_used_qubits() + if self._handle_stagnation(costs_unused): + continue + i, j = np.unravel_index(np.argmin(costs_unused), self.costs.shape) + self._apply_cnot_to_matrix(i, j) + + def reference_based_construction(self) -> None: + self._validate_inputs() + self._modify_matrix_structure() + self._ref_based_init() + while not self.is_reduced(): + costs_unused = self._mask_out_used_qubits() + if self._handle_stagnation(costs_unused): + continue + candidate_pairs = self._get_candidate_pairs(costs_unused) + for i, j in candidate_pairs: + action = self._get_candidate_action(i,j, costs_unused[i,j]) + if action == CandidateAction.SKIP: + continue + if action == CandidateAction.RESTART_SEARCH: + self.used_columns = [] + self.backtrack_required = True + break + + if action == CandidateAction.TRIGGER_BACKTRACK: + if self.stack: + self._backtrack() + else: + # This case means we backtracked to the beginning and still failed. + logger.error("Backtracking stack is empty. No solution found.") + break + + if action == CandidateAction.EVALUATE: + is_valid, new_errors = self._cnot_is_valid_against_references(i,j) + if is_valid: + self.used_cnots.append((int(i), int(j))) + self._commit_to_cnot(i,j,new_errors) + self._apply_cnot_to_matrix(int(i),int(j)) + break + self.failed_cnots.append((int(i), int(j))) + continue def is_reduced(self) -> bool: return bool(len(np.where(np.all(self.matrix == 0, axis=0))[0]) == self.matrix.shape[1] - self.rank) - def compute_cost_matrix(self) -> None: - costs = np.array([ - [np.sum((self.matrix[:, i] + self.matrix[:, j]) % 2) for j in range(self.matrix.shape[1])] - for i in range(self.matrix.shape[1]) - ]) - costs -= np.sum(self.matrix, axis=0) - np.fill_diagonal(costs, 1) - return costs + def _get_candidate_action(self, i: int, j: int, costs: int) -> CandidateAction: + if (int(i), int(j)) in self.failed_cnots or (int(i), int(j)) in self.used_cnots: + return CandidateAction.SKIP - def mask_out_used_qubits(self): - m = np.zeros((self.matrix.shape[1], self.matrix.shape[1]), dtype=bool) # type: npt.NDArray[np.bool_] - m[self.used_columns, :] = True - m[:, self.used_columns] = True - return np.ma.array(self.costs, mask=m) # type: ignore[no-untyped-call] + if costs >= 0: + if self.backtrack_required: + return CandidateAction.TRIGGER_BACKTRACK + return CandidateAction.RESTART_SEARCH + return CandidateAction.EVALUATE + + def _cnot_is_valid_against_references(self, i: int, j: int) -> tuple[bool, dict]: + found_cnot: bool = False + new_x_error, _next_x_propagation_matrix = get_next_error( + propagation_matrix=self.x_propagation_matrix.copy(), cnot_gate=(int(i), int(j)) + ) + new_z_error, _next_z_propagation_matrix = get_next_error( + propagation_matrix=self.z_propagation_matrix.copy(), cnot_gate=(int(i), int(j)), x_error=False + ) + + if self._check_error_existence(new_x_error, self.overlapping_errors_x): + return found_cnot, {} + if self._check_error_existence(new_z_error, self.overlapping_errors_z): + return found_cnot, {} + + new_x_error = np.expand_dims(new_x_error, axis=0) + new_z_error = np.expand_dims(new_z_error, axis=0) + + new_z_error_tuple = tuple(new_z_error.flatten()) + new_x_error_tuple = tuple(new_x_error.flatten()) + + x_overlap = self._check_overlap(self.ref_x_fs, self.ref_x_1fs, self.current_x_fs, new_x_error) + z_overlap = self._check_overlap(self.ref_z_fs, self.ref_z_1fs, self.current_z_fs, new_z_error, x_error=False) + + if self.ref_x_fs.size and self.ref_z_fs.size: + # Both sets provided: Enter if **both** overlaps fail + found_cnot = not (x_overlap or z_overlap) + if not found_cnot: + self.overlapping_errors_x.add(new_x_error_tuple) + self.overlapping_errors_z.add(new_z_error_tuple) + elif self.ref_x_fs.size: + # Only x-set provided: Enter if **x_overlap** fails + found_cnot = not x_overlap + if not found_cnot: + self.overlapping_errors_x.add(new_x_error_tuple) + elif self.ref_z_fs.size: + # Only z-set provided: Enter if **z_overlap** fails + found_cnot = not z_overlap + if not found_cnot: + self.overlapping_errors_z.add(new_z_error_tuple) + return found_cnot, {"new_x_error": new_x_error, "new_z_error": new_z_error, "x_overlap": x_overlap, "z_overlap": z_overlap} + + def _commit_to_cnot(self, i: int, j: int, new_errors: dict) -> None: + self.stack.append(( + self.x_propagation_matrix.copy(), + self.z_propagation_matrix.copy(), + self.used_columns.copy(), + self.matrix.copy(), + self.costs.copy(), + self.used_cnots.copy(), + self.failed_cnots.copy(), + )) + if self.guide_by_x: + self.failed_cnots = [fcnot for fcnot in self.failed_cnots if int(i) != fcnot[0]] + else: + self.failed_cnots = [fcnot for fcnot in self.failed_cnots if int(j) != fcnot[1]] + + if self.ref_x_fs.size and not new_errors.x_overlap: + self.current_x_fs = np.vstack((self.current_x_fs, new_errors["new_x_error"]), dtype=np.int8) + if self.ref_z_fs.size and not new_errors.z_overlap: + self.current_z_fs = np.vstack((self.current_z_fs, new_errors["new_z_error"]), dtype=np.int8) + + def _backtrack(self) -> None: + self.x_propagation_matrix, self.z_propagation_matrix, self.used_columns, self.matrix, self.costs, self.used_cnots, _ = self.stack.pop() + removed_cnot = self.eliminations.pop() + if self.guide_by_x: + failed_cnots = [fcnot for fcnot in self.failed_cnots if removed_cnot[0] != fcnot[0]] + else: + failed_cnots = [fcnot for fcnot in self.failed_cnots if removed_cnot[1] != fcnot[1]] + failed_cnots.append(removed_cnot) + # print_dynamic_eliminations(eliminations, failed_cnots) + self.backtrack_required = False - def triangular_reset(self) -> None: + def _validate_inputs(self) -> None: + """Here will be some checks that ensure that the reference based construction can actually be executed.""" + has_refs = bool(self.ref_x_fs.size or self.ref_z_fs.size) + has_code = self.code is not None + if has_refs ^ has_code: # xor + return + msg = "Must provide either both a reference fault set and CSS code, or neither." + raise ValueError(msg) + + def _ref_based_init(self) -> None: + self.x_propagation_matrix: npt.NDArray[np.int8] = np.eye(self.matrix.shape[1], dtype=np.int8) + self.z_propagation_matrix: npt.NDArray[np.int8] = np.eye(self.matrix.shape[1], dtype=np.int8) + self.backtrack_required: bool = False + self.overlapping_errors_x = set() + self.overlapping_errors_z = set() + self.stack = [] + self.current_x_fs = np.eye(self.matrix.shape[1], dtype=np.int8) + self.current_z_fs = np.eye(self.matrix.shape[1], dtype=np.int8) + self.used_cnots = [] + self.eliminations = [] + + def _handle_stagnation(self, costs_unused: npt.NDArray[np.int8]) -> bool: + """Handles local minima or full column usage. Returns True if reset occurred.""" + if np.all(costs_unused >= 0) or len(self.used_columns) == self.matrix.shape[1]: + if not self.used_columns: # Local minimum + self._triangular_reset() + else: + self.used_columns = [] + return True + return False + + def _triangular_reset(self) -> None: logger.warning("Local minimum reached. Making matrix triangular.") self.matrix = mod2.row_echelon(self.matrix, full=True)[0] - self.costs = np.array([ - [np.sum((self.matrix[:, i] + self.matrix[:, j]) % 2) for j in range(self.matrix.shape[1])] - for i in range(self.matrix.shape[1]) - ]) - self.costs -= np.sum(self.matrix, axis=0) - np.fill_diagonal(self.costs, 1) + self.costs = self._compute_cost_matrix() - def update_data_structures(self, i: int, j: int) -> None: + def _apply_cnot_to_matrix(self, i: int, j: int) -> None: self.eliminations.append((int(i), int(j))) if self.parallel_elimination: self.used_columns.append(i) @@ -482,21 +626,56 @@ def update_data_structures(self, i: int, j: int) -> None: self.costs[:, j] = new_weights - np.sum(self.matrix[:, j]) np.fill_diagonal(self.costs, 1) - def basic_elimination(self) -> None: - while not self.is_reduced(): - costs_unused = self.mask_out_used_qubits() - - if ( - np.all(costs_unused >= 0) or len(self.used_columns) == self.matrix.shape[1] - ): # no more reductions possible - if self.used_columns == []: # local minimum => get out by making matrix triangular - self.triangular_reset() - else: - self.used_columns = [] - continue - i, j = np.unravel_index(np.argmin(costs_unused), self.costs.shape) - self.update_data_structures(i, j) + def _compute_cost_matrix(self) -> None: + costs = np.array([ + [np.sum((self.matrix[:, i] + self.matrix[:, j]) % 2) for j in range(self.matrix.shape[1])] + for i in range(self.matrix.shape[1]) + ]) + costs -= np.sum(self.matrix, axis=0) + np.fill_diagonal(costs, 1) + return costs + + def _mask_out_used_qubits(self) -> npt.NDArray[np.int8]: + m = np.zeros((self.matrix.shape[1], self.matrix.shape[1]), dtype=bool) # type: npt.NDArray[np.bool_] + m[self.used_columns, :] = True + m[:, self.used_columns] = True + return np.ma.array(self.costs, mask=m) # type: ignore[no-untyped-call] + def _modify_matrix_structure(self) -> None: + """This should not neccessary but for distance seven codes this was the only way to reliably produce + solutions. + """ + if self.code and self.code.distance > 5: + if self.ref_z_fs.size and not self.ref_x_fs.size: + self.matrix = mod2.row_echelon(self.matrix, full=True)[0] + if self.ref_z_fs.size and self.ref_x_fs.size: + self.matrix = mod2.row_echelon(self.matrix, full=True)[0] + + def _get_candidate_pairs(self, costs_unused: npt.NDArray[np.int8]) -> list[tuple[int]]: + # Get all valid (i, j) pairs sorted by cost + candidate_indices = np.argsort(costs_unused.flatten()) # Flatten and sort by value + return [np.unravel_index(idx, self.costs.shape) for idx in candidate_indices] + + def _check_overlap(self, ref_fs, ref_1_fs, current_fs, new_error, x_error: bool = True) -> bool: + overlap: bool = True + if ref_fs.size: + overlap = self.code.check_fs_overlap(ref_fs, new_error, x_error=x_error) + if ref_1_fs.size and not overlap: + trial_2_fs = (current_fs + new_error) % 2 + trial_2_fs = self._filter_fault_set(trial_2_fs, int((self.code.distance - 1) / 2)) + overlap = self.code.check_fs_overlap(ref_1_fs, trial_2_fs, x_error=x_error) + return overlap + + @staticmethod + def _check_error_existence(error: npt.NDArray[np.int8], error_memory: set) -> bool: + # INFO: Quickly check if new error is known to cause overlap. This saves another long overlap check. + error_tuple = tuple(error.flatten()) + return error_tuple in error_memory + + @staticmethod + def _filter_fault_set(fault_set: npt.NDArray[np.int8], threshold: int) -> npt.NDArray[np.int8]: + """Filter fault sets based on a sum threshold.""" + return fault_set[np.where(fault_set.sum(axis=1) > threshold)] def get_next_error( propagation_matrix: npt.NDArray[np.int8], cnot_gate: tuple[int, int], x_error: bool = True From 8d04cdfecc1a31a761da226315bb8e9677cebcd9 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 24 Jun 2025 13:45:25 +0200 Subject: [PATCH 084/156] add test file for gaussian elimination and first test --- pyproject.toml | 6 --- .../test_gaussian_elimination.py | 46 +++++++++++++++++++ 2 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 test/python/circuit_synthesis/test_gaussian_elimination.py diff --git a/pyproject.toml b/pyproject.toml index 9b2131d47..092461356 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -140,13 +140,7 @@ exclude = [ [[tool.mypy.overrides]] module = ["qiskit.*", "qecsim.*", "qiskit_aer.*", "matplotlib.*", "scipy.*", "ldpc.*", "pytest_console_scripts.*", -<<<<<<< HEAD - "z3.*", "bposd.*", "numba.*", "pymatching.*", "stim.*", "multiprocess.*", "qsample.*", "pandas.*", "sympy.*"] -||||||| b466f00 - "z3.*", "bposd.*", "numba.*", "pymatching.*", "stim.*", "multiprocess.*", "qsample.*", "pandas.*"] -======= "z3.*", "bposd.*", "numba.*", "pymatching.*", "stim.*", "multiprocess.*", "sinter.*", "qsample.*", "pandas.*"] ->>>>>>> origin ignore_missing_imports = true diff --git a/test/python/circuit_synthesis/test_gaussian_elimination.py b/test/python/circuit_synthesis/test_gaussian_elimination.py new file mode 100644 index 000000000..e4b100b31 --- /dev/null +++ b/test/python/circuit_synthesis/test_gaussian_elimination.py @@ -0,0 +1,46 @@ +from __future__ import annotations + +import numpy as np +import pytest + +from mqt.qecc.circuit_synthesis.synthesis_utils import CandidateAction, GaussianElimination + +SIMPLE_MATRIX = np.array([[1, 1, 0], [0, 1, 1], [1, 0, 1]], dtype=np.int8) + + +@pytest.fixture +def get_instance(): + """A basic fixture to provide a fresh GaussianElimination instance for each test.""" + return GaussianElimination(matrix=SIMPLE_MATRIX.copy()) + + +# Use parametrize to test all logical branches +@pytest.mark.parametrize( + ("cost", "backtrack_required", "used_cnots", "failed_cnots", "expected_action"), + [ + # Case 1: Greedy step, should evaluate + (-1, False, [], [], CandidateAction.EVALUATE), + # Case 2: Already used, should skip + (-1, False, [(0, 1)], [], CandidateAction.SKIP), + # Case 3: Already failed, should skip + (-1, False, [], [(0, 1)], CandidateAction.SKIP), + # Case 4: First time hitting non-negative cost, should restart search + (0, False, [], [], CandidateAction.RESTART_SEARCH), + (1, False, [], [], CandidateAction.RESTART_SEARCH), + # Case 5: Already in backtrack mode and hitting non-negative cost, should trigger backtrack + (0, True, [], [], CandidateAction.TRIGGER_BACKTRACK), + (1, True, [], [], CandidateAction.TRIGGER_BACKTRACK), + ], +) +def test_get_candidate_action(get_instance, cost, backtrack_required, used_cnots, failed_cnots, expected_action): + """Verify that _get_candidate_action returns the correct action based on state.""" + # Arrange: Set up the instance state for the test case + get_instance.backtrack_required = backtrack_required + get_instance.used_cnots = used_cnots + get_instance.failed_cnots = failed_cnots + + # Act: Call the method + action = get_instance._get_candidate_action(i=0, j=1, costs=cost) + + # Assert: Check the result + assert action == expected_action From 5841154358fc37bf059f526eb3222fe56de64675 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 24 Jun 2025 11:46:26 +0000 Subject: [PATCH 085/156] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qecc/circuit_synthesis/synthesis_utils.py | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index a8b3432be..840a36d06 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -416,10 +416,11 @@ def filter_fault_set(fault_set: npt.NDArray[np.int8], threshold: int) -> npt.NDA class CandidateAction(Enum): - SKIP = auto() # Ignore this candidate and continue the loop - RESTART_SEARCH = auto() # Reset used_columns and break to restart the search - TRIGGER_BACKTRACK = auto() # Call backtrack() and break - EVALUATE = auto() # Proceed with full validation (overlap checks) + SKIP = auto() # Ignore this candidate and continue the loop + RESTART_SEARCH = auto() # Reset used_columns and break to restart the search + TRIGGER_BACKTRACK = auto() # Call backtrack() and break + EVALUATE = auto() # Proceed with full validation (overlap checks) + class GaussianElimination: def __init__( @@ -444,7 +445,7 @@ def __init__( self.guide_by_x = guide_by_x self.rank = mod2.rank(self.matrix) self.eliminations = [] - self.failed_cnots = penalty_cols or [] # NOTE: this is already a feature and not necessarily default + self.failed_cnots = penalty_cols or [] # NOTE: this is already a feature and not necessarily default self.used_columns = [] self.costs = self._compute_cost_matrix() @@ -466,7 +467,7 @@ def reference_based_construction(self) -> None: continue candidate_pairs = self._get_candidate_pairs(costs_unused) for i, j in candidate_pairs: - action = self._get_candidate_action(i,j, costs_unused[i,j]) + action = self._get_candidate_action(i, j, costs_unused[i, j]) if action == CandidateAction.SKIP: continue if action == CandidateAction.RESTART_SEARCH: @@ -483,11 +484,11 @@ def reference_based_construction(self) -> None: break if action == CandidateAction.EVALUATE: - is_valid, new_errors = self._cnot_is_valid_against_references(i,j) + is_valid, new_errors = self._cnot_is_valid_against_references(i, j) if is_valid: self.used_cnots.append((int(i), int(j))) - self._commit_to_cnot(i,j,new_errors) - self._apply_cnot_to_matrix(int(i),int(j)) + self._commit_to_cnot(i, j, new_errors) + self._apply_cnot_to_matrix(int(i), int(j)) break self.failed_cnots.append((int(i), int(j))) continue @@ -544,7 +545,12 @@ def _cnot_is_valid_against_references(self, i: int, j: int) -> tuple[bool, dict] found_cnot = not z_overlap if not found_cnot: self.overlapping_errors_z.add(new_z_error_tuple) - return found_cnot, {"new_x_error": new_x_error, "new_z_error": new_z_error, "x_overlap": x_overlap, "z_overlap": z_overlap} + return found_cnot, { + "new_x_error": new_x_error, + "new_z_error": new_z_error, + "x_overlap": x_overlap, + "z_overlap": z_overlap, + } def _commit_to_cnot(self, i: int, j: int, new_errors: dict) -> None: self.stack.append(( @@ -567,7 +573,15 @@ def _commit_to_cnot(self, i: int, j: int, new_errors: dict) -> None: self.current_z_fs = np.vstack((self.current_z_fs, new_errors["new_z_error"]), dtype=np.int8) def _backtrack(self) -> None: - self.x_propagation_matrix, self.z_propagation_matrix, self.used_columns, self.matrix, self.costs, self.used_cnots, _ = self.stack.pop() + ( + self.x_propagation_matrix, + self.z_propagation_matrix, + self.used_columns, + self.matrix, + self.costs, + self.used_cnots, + _, + ) = self.stack.pop() removed_cnot = self.eliminations.pop() if self.guide_by_x: failed_cnots = [fcnot for fcnot in self.failed_cnots if removed_cnot[0] != fcnot[0]] @@ -642,7 +656,7 @@ def _mask_out_used_qubits(self) -> npt.NDArray[np.int8]: return np.ma.array(self.costs, mask=m) # type: ignore[no-untyped-call] def _modify_matrix_structure(self) -> None: - """This should not neccessary but for distance seven codes this was the only way to reliably produce + """This should not necessary but for distance seven codes this was the only way to reliably produce solutions. """ if self.code and self.code.distance > 5: @@ -677,6 +691,7 @@ def _filter_fault_set(fault_set: npt.NDArray[np.int8], threshold: int) -> npt.ND """Filter fault sets based on a sum threshold.""" return fault_set[np.where(fault_set.sum(axis=1) > threshold)] + def get_next_error( propagation_matrix: npt.NDArray[np.int8], cnot_gate: tuple[int, int], x_error: bool = True ) -> tuple[npt.NDArray[np.int8], npt.NDArray[np.int8]]: From cf67d3da24efd37874b53ed61d30e9b4fa24e3d2 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 24 Jun 2025 13:51:32 +0200 Subject: [PATCH 086/156] remove Sympy from synthesis utils --- .../qecc/circuit_synthesis/synthesis_utils.py | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index a8b3432be..129ddcfb0 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -14,7 +14,6 @@ from ldpc import mod2 from qiskit.circuit import AncillaRegister, ClassicalRegister, QuantumCircuit from stim import Circuit -from sympy.combinatorics import Permutation, PermutationGroup if TYPE_CHECKING: # pragma: no cover from collections.abc import Callable @@ -416,10 +415,11 @@ def filter_fault_set(fault_set: npt.NDArray[np.int8], threshold: int) -> npt.NDA class CandidateAction(Enum): - SKIP = auto() # Ignore this candidate and continue the loop - RESTART_SEARCH = auto() # Reset used_columns and break to restart the search - TRIGGER_BACKTRACK = auto() # Call backtrack() and break - EVALUATE = auto() # Proceed with full validation (overlap checks) + SKIP = auto() # Ignore this candidate and continue the loop + RESTART_SEARCH = auto() # Reset used_columns and break to restart the search + TRIGGER_BACKTRACK = auto() # Call backtrack() and break + EVALUATE = auto() # Proceed with full validation (overlap checks) + class GaussianElimination: def __init__( @@ -444,7 +444,7 @@ def __init__( self.guide_by_x = guide_by_x self.rank = mod2.rank(self.matrix) self.eliminations = [] - self.failed_cnots = penalty_cols or [] # NOTE: this is already a feature and not necessarily default + self.failed_cnots = penalty_cols or [] # NOTE: this is already a feature and not necessarily default self.used_columns = [] self.costs = self._compute_cost_matrix() @@ -466,7 +466,7 @@ def reference_based_construction(self) -> None: continue candidate_pairs = self._get_candidate_pairs(costs_unused) for i, j in candidate_pairs: - action = self._get_candidate_action(i,j, costs_unused[i,j]) + action = self._get_candidate_action(i, j, costs_unused[i, j]) if action == CandidateAction.SKIP: continue if action == CandidateAction.RESTART_SEARCH: @@ -483,11 +483,11 @@ def reference_based_construction(self) -> None: break if action == CandidateAction.EVALUATE: - is_valid, new_errors = self._cnot_is_valid_against_references(i,j) + is_valid, new_errors = self._cnot_is_valid_against_references(i, j) if is_valid: self.used_cnots.append((int(i), int(j))) - self._commit_to_cnot(i,j,new_errors) - self._apply_cnot_to_matrix(int(i),int(j)) + self._commit_to_cnot(i, j, new_errors) + self._apply_cnot_to_matrix(int(i), int(j)) break self.failed_cnots.append((int(i), int(j))) continue @@ -544,7 +544,12 @@ def _cnot_is_valid_against_references(self, i: int, j: int) -> tuple[bool, dict] found_cnot = not z_overlap if not found_cnot: self.overlapping_errors_z.add(new_z_error_tuple) - return found_cnot, {"new_x_error": new_x_error, "new_z_error": new_z_error, "x_overlap": x_overlap, "z_overlap": z_overlap} + return found_cnot, { + "new_x_error": new_x_error, + "new_z_error": new_z_error, + "x_overlap": x_overlap, + "z_overlap": z_overlap, + } def _commit_to_cnot(self, i: int, j: int, new_errors: dict) -> None: self.stack.append(( @@ -567,7 +572,15 @@ def _commit_to_cnot(self, i: int, j: int, new_errors: dict) -> None: self.current_z_fs = np.vstack((self.current_z_fs, new_errors["new_z_error"]), dtype=np.int8) def _backtrack(self) -> None: - self.x_propagation_matrix, self.z_propagation_matrix, self.used_columns, self.matrix, self.costs, self.used_cnots, _ = self.stack.pop() + ( + self.x_propagation_matrix, + self.z_propagation_matrix, + self.used_columns, + self.matrix, + self.costs, + self.used_cnots, + _, + ) = self.stack.pop() removed_cnot = self.eliminations.pop() if self.guide_by_x: failed_cnots = [fcnot for fcnot in self.failed_cnots if removed_cnot[0] != fcnot[0]] @@ -642,7 +655,7 @@ def _mask_out_used_qubits(self) -> npt.NDArray[np.int8]: return np.ma.array(self.costs, mask=m) # type: ignore[no-untyped-call] def _modify_matrix_structure(self) -> None: - """This should not neccessary but for distance seven codes this was the only way to reliably produce + """This should not necessary but for distance seven codes this was the only way to reliably produce solutions. """ if self.code and self.code.distance > 5: @@ -677,6 +690,7 @@ def _filter_fault_set(fault_set: npt.NDArray[np.int8], threshold: int) -> npt.ND """Filter fault sets based on a sum threshold.""" return fault_set[np.where(fault_set.sum(axis=1) > threshold)] + def get_next_error( propagation_matrix: npt.NDArray[np.int8], cnot_gate: tuple[int, int], x_error: bool = True ) -> tuple[npt.NDArray[np.int8], npt.NDArray[np.int8]]: @@ -714,20 +728,6 @@ def get_next_error( return propagation_matrix[target], propagation_matrix -def get_permutation_group(group_generators: list[list[int]]) -> list[Permutation]: - """Based on the generators of the permutation group find the whole permutation group. - - Args: - group_generators: A list of generators of the permutation group. Each generator is given as a list of integers describing the permutation. E.g. for a S7 generator: [0, 3, 2, 1, 6, 5, 4] - - Returns: - Returns a list of Permutation object coming form sympy.combinatorics. - """ - group_generators = [Permutation(generator) for generator in group_generators] - g = PermutationGroup(group_generators) - return list(g.generate()) - - def check_mutually_disjointness_spcs( c_spcs: list[StatePrepCircuit], p_spcs: list[StatePrepCircuit], x_error: bool = True ) -> list[StatePrepCircuit]: From ca943c43c306759549da3dcb957261fe26ca5f8d Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 25 Jun 2025 10:29:03 +0200 Subject: [PATCH 087/156] solving mypy issues with sympy --- pyproject.toml | 2 +- src/mqt/qecc/codes/css_code.py | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 21b9c7cde..ac8cbd9b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -138,7 +138,7 @@ exclude = [ [[tool.mypy.overrides]] module = ["qiskit.*", "qecsim.*", "qiskit_aer.*", "matplotlib.*", "scipy.*", "ldpc.*", "pytest_console_scripts.*", - "z3.*", "bposd.*", "numba.*", "pymatching.*", "stim.*", "multiprocess.*", "sinter.*", "qsample.*", "pandas.*"] + "z3.*", "bposd.*", "numba.*", "pymatching.*", "stim.*", "multiprocess.*", "sinter.*", "qsample.*", "pandas.*", "sympy.*"] ignore_missing_imports = true diff --git a/src/mqt/qecc/codes/css_code.py b/src/mqt/qecc/codes/css_code.py index c32c5a1a4..f34b1ab9a 100644 --- a/src/mqt/qecc/codes/css_code.py +++ b/src/mqt/qecc/codes/css_code.py @@ -74,25 +74,25 @@ def __init__( self.Lx = CSSCode._compute_logical(self.Hz, self.Hx) self.Lz = CSSCode._compute_logical(self.Hx, self.Hz) - self._automorphism_generators: list[Permutation] | None = None - self._automorphism_group: list[Permutation] | None = None + self._automorphism_generators: list[Permutation] = [] + self._automorphism_group: list[Permutation] = [] @property def automorphism_group(self) -> list[Permutation]: """Property for the automorphism group.""" return self._automorphism_group - @property - def automorphism_generators(self) -> list[Permutation]: - """Property for the automorphism generators.""" - return self._automorphism_generators - @automorphism_group.setter def automorphism_group(self, generators: list[list[int]]) -> None: self._automorphism_generators = [Permutation(generator) for generator in generators] g = PermutationGroup(self._automorphism_generators) self._automorphism_group = list(g.generate()) + @property + def automorphism_generators(self) -> list[Permutation]: + """Property for the automorphism generators.""" + return self._automorphism_generators + def x_checks_as_pauli_strings(self) -> list[str]: """Return the x checks as Pauli strings.""" return ["".join("X" if bit == 1 else "I" for bit in row) for row in self.Hx] From ecfaa360098f61fdf3170d754507b2400f7b03a8 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 25 Jun 2025 13:46:48 +0200 Subject: [PATCH 088/156] solve issue with qsample and pytest --- src/mqt/qecc/circuit_synthesis/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mqt/qecc/circuit_synthesis/__init__.py b/src/mqt/qecc/circuit_synthesis/__init__.py index 17713dda0..1df2d0838 100644 --- a/src/mqt/qecc/circuit_synthesis/__init__.py +++ b/src/mqt/qecc/circuit_synthesis/__init__.py @@ -4,7 +4,6 @@ from .encoding import depth_optimal_encoding_circuit, gate_optimal_encoding_circuit, heuristic_encoding_circuit from .simulation import LutDecoder, SteaneNDFTStatePrepSimulator, VerificationNDFTStatePrepSimulator -from .simulation_det import NoisyDFTStatePrepSimulator from .state_prep import ( StatePrepCircuit, depth_optimal_prep_circuit, From de0580adf2a61d3c05531de95e090ccd851dee5c Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Thu, 26 Jun 2025 10:10:34 +0200 Subject: [PATCH 089/156] add integration test for basic elimination --- .../test_gaussian_elimination.py | 87 ++++++++++++++++++- 1 file changed, 85 insertions(+), 2 deletions(-) diff --git a/test/python/circuit_synthesis/test_gaussian_elimination.py b/test/python/circuit_synthesis/test_gaussian_elimination.py index e4b100b31..1df622f94 100644 --- a/test/python/circuit_synthesis/test_gaussian_elimination.py +++ b/test/python/circuit_synthesis/test_gaussian_elimination.py @@ -5,13 +5,13 @@ from mqt.qecc.circuit_synthesis.synthesis_utils import CandidateAction, GaussianElimination -SIMPLE_MATRIX = np.array([[1, 1, 0], [0, 1, 1], [1, 0, 1]], dtype=np.int8) +STEANE_CHECK_MATRIX = np.array([[1, 1, 0, 0, 1, 1, 0], [1, 0, 1, 0, 1, 0, 1], [0, 0, 0, 1, 1, 1, 1]], dtype=np.int8) @pytest.fixture def get_instance(): """A basic fixture to provide a fresh GaussianElimination instance for each test.""" - return GaussianElimination(matrix=SIMPLE_MATRIX.copy()) + return GaussianElimination(matrix=STEANE_CHECK_MATRIX.copy()) # Use parametrize to test all logical branches @@ -44,3 +44,86 @@ def test_get_candidate_action(get_instance, cost, backtrack_required, used_cnots # Assert: Check the result assert action == expected_action + + +def test_apply_cnot_to_matrix_updates_matrix_and_costs_correctly(get_instance): + """Verify the target column of the matrix is correctly updated after a CNOT.""" + expected_matrix = np.array([[1, 1, 0, 0, 0, 1, 0], [1, 0, 1, 0, 0, 0, 1], [0, 0, 0, 1, 1, 1, 1]], dtype=np.int8) + get_instance._apply_cnot_to_matrix(i=0, j=4) + np.testing.assert_array_equal(get_instance.matrix, expected_matrix) + expected_instance = GaussianElimination(matrix=expected_matrix) + expected_costs = expected_instance.costs + np.testing.assert_array_equal(get_instance.costs, expected_costs) + + +# This is our new test +@pytest.mark.parametrize( + ( + "scenario", + "initial_used_cols", + "costs_are_positive", + "expected_return", + "expect_reset_called", + "expected_final_used_cols", + ), + [ + # Scenario 1: Stagnated and no used columns -> should call triangular_reset + ("local_minimum", [], True, True, True, []), + # Scenario 2: Stagnated with used columns -> should clear used_columns + ("parallel_deadend", [1, 2], True, True, False, []), + # Scenario 3: Not stagnated (negative cost exists) -> should do nothing + ("not_stagnated", [1, 2], False, False, False, [1, 2]), + ], +) +def test_handle_stagnation( + get_instance, + monkeypatch, + scenario, + initial_used_cols, + costs_are_positive, + expected_return, + expect_reset_called, + expected_final_used_cols, +): + """Verify that _handle_stagnation behaves correctly in all scenarios.""" + costs_unused = np.array([[0, 1], [1, 0]]) if costs_are_positive else np.array([[0, -1], [1, 0]]) + get_instance.used_columns = initial_used_cols + + reset_call_log = [] # This list will act as our spy. + # We replace the real, complex _triangular_reset with a fake function + # that just appends to our log list when it's called. + monkeypatch.setattr(get_instance, "_triangular_reset", lambda: reset_call_log.append(True)) + + return_value = get_instance._handle_stagnation(costs_unused) + + assert return_value == expected_return + assert get_instance.used_columns == expected_final_used_cols + + if expect_reset_called: + assert len(reset_call_log) == 1 + else: + assert len(reset_call_log) == 0 + + +def test_basic_elimination_integration_with_known_matrix(get_instance): + """Tests the full basic_elimination method from start to finish. + + It verifies that the correct sequence of eliminations is produced + and that the matrix is fully reduced at the end. + """ + expected_final_matrix = np.array( + [[0, 1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0]], dtype=np.int8 + ) + + expected_eliminations = [(0, 4), (1, 5), (2, 6), (1, 0), (3, 4), (5, 6), (0, 2), (3, 5)] + + get_instance.basic_elimination() + + # 1. Did it produce the correct sequence of operations? + assert get_instance.eliminations == expected_eliminations + + # 2. Is the algorithm correctly reporting that it's finished? + assert get_instance.is_reduced() is True + + # 3. Is the final matrix what we expect? + np.testing.assert_array_equal(get_instance.matrix, expected_final_matrix) From 89022a9122bec61ccc9b21bca7361b608e3bf561 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Thu, 26 Jun 2025 10:11:27 +0200 Subject: [PATCH 090/156] fix typo --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 129ddcfb0..8c420017c 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -435,7 +435,7 @@ def __init__( guide_by_x: bool = True, ) -> None: self.matrix = matrix.copy() - self.parallel_eliminations = parallel_elimination + self.parallel_elimination = parallel_elimination self.code = code self.ref_x_fs = ref_x_fs or np.empty((0,), dtype=np.int8) self.ref_z_fs = ref_z_fs or np.empty((0,), dtype=np.int8) From 3ea4ccb51a8b3f5f8edbcb42b3be810468c9e0d8 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Thu, 26 Jun 2025 16:19:40 +0200 Subject: [PATCH 091/156] add more tests --- .../test_gaussian_elimination.py | 138 +++++++++++++++++- 1 file changed, 137 insertions(+), 1 deletion(-) diff --git a/test/python/circuit_synthesis/test_gaussian_elimination.py b/test/python/circuit_synthesis/test_gaussian_elimination.py index 1df622f94..97d192138 100644 --- a/test/python/circuit_synthesis/test_gaussian_elimination.py +++ b/test/python/circuit_synthesis/test_gaussian_elimination.py @@ -56,7 +56,25 @@ def test_apply_cnot_to_matrix_updates_matrix_and_costs_correctly(get_instance): np.testing.assert_array_equal(get_instance.costs, expected_costs) -# This is our new test +def test_mask_out_used_qubits(get_instance): + """Check that the matrix is masked out cleanly based on the used columns.""" + used_qubit_index = 1 + unused_qubit_index = 0 + get_instance.used_columns.append(used_qubit_index) + masked_costs = get_instance._mask_out_used_qubits() + # 1. Is the data of the masked array still the same as the original costs? + np.testing.assert_array_equal(masked_costs.data, get_instance.costs) + + # 2. Is the entire row for the used qubit masked? + assert np.all(masked_costs.mask[used_qubit_index, :]), "Row for used qubit should be fully masked" + + # 3. Is the entire column for the used qubit masked? + assert np.all(masked_costs.mask[:, used_qubit_index]), "Column for used qubit should be fully masked" + + # 4. Is a cell NOT involving the used qubit left unmasked? + assert not masked_costs.mask[unused_qubit_index, unused_qubit_index], "Unused cell should not be masked" + + @pytest.mark.parametrize( ( "scenario", @@ -127,3 +145,121 @@ def test_basic_elimination_integration_with_known_matrix(get_instance): # 3. Is the final matrix what we expect? np.testing.assert_array_equal(get_instance.matrix, expected_final_matrix) + + +@pytest.mark.parametrize( + ("guide_by_x", "expected_failed_cnots"), + [ + # Scenario 1: Guided by the control qubit (X-errors) + (True, [(6, 4), (3, 4)]), + # Scenario 2: Guided by the target qubit (Z-errors) + (False, [(3, 5), (3, 4)]), + ], +) +def test_backtrack_restores_state_and_updates_failed_cnots(get_instance, guide_by_x, expected_failed_cnots): + """Verify that _backtrack correctly pops state from the stack, restores it, and updates the failed_cnots list based on the guide_by_x flag.""" + # ARRANGE + prev_x_propagation_matrix = np.array([[-1]]) + prev_z_propagation_matrix = np.array([[-2]]) + prev_matrix = np.array([[-3]]) + prev_costs = np.array([[-4]]) + prev_used_cols = [-5] + prev_used_cnots = [(-6, -6)] + + previous_state_tuple = ( + prev_x_propagation_matrix, + prev_z_propagation_matrix, + prev_used_cols, + prev_matrix, + prev_costs, + prev_used_cnots, + None, + ) + + get_instance._ref_based_init() + get_instance.matrix = np.array([[99]]) + get_instance.costs = np.array([[98]]) + get_instance.used_columns = [97] + get_instance.used_cnots = [(96, 96)] + get_instance.x_propagation_matrix = [(95, 95)] + get_instance.z_propagation_matrix = [(94, 94)] + get_instance.eliminations = [(1, 2), (3, 4)] # Last element (3, 4) will be popped + get_instance.backtrack_required = True + get_instance.guide_by_x = guide_by_x + + get_instance.failed_cnots = [(3, 5), (6, 4)] + + get_instance.stack.append(previous_state_tuple) + + # ACT + get_instance._backtrack() + + # ASSERT + + # 1. Check that the core attributes were restored from the stack. + np.testing.assert_array_equal(get_instance.matrix, prev_matrix) + np.testing.assert_array_equal(get_instance.costs, prev_costs) + np.testing.assert_array_equal(get_instance.x_propagation_matrix, prev_x_propagation_matrix) + np.testing.assert_array_equal(get_instance.z_propagation_matrix, prev_z_propagation_matrix) + assert get_instance.used_columns == prev_used_cols + assert get_instance.used_cnots == prev_used_cnots + + # 2. Check that the backtrack flag was reset. + assert get_instance.backtrack_required is False + + # 3. Check that the eliminations list had the last item popped. + assert get_instance.eliminations == [(1, 2)] + + # 4. Check the conditional logic: Was failed_cnots updated correctly? + # The `_` in the pop restores `prev_failed_cnots`, but then the method + # recalculates it based on the popped elimination. + # NOTE: Your implementation replaces the list entirely, so we check against + # the expected final list, not the restored one. + assert get_instance.failed_cnots == expected_failed_cnots + + +def test_compute_cost_matrix_golden_master(): + """Tests if the cost matrix is calculatet correctly. + + The test is based on the initial check matrix of the Steane Code. + """ + input_matrix = np.array([[1, 1, 0, 0, 1, 1, 0], [1, 0, 1, 0, 1, 0, 1], [0, 0, 0, 1, 1, 1, 1]], dtype=np.int8) + expected_cost_matrix = np.array([ + [1, 0, 0, 2, -2, 0, 0], + [-1, 1, 1, 1, -1, -1, 1], + [-1, 1, 1, 1, -1, 1, -1], + [1, 1, 1, 1, -1, -1, -1], + [-1, 1, 1, 1, 1, -1, -1], + [0, 0, 2, 0, -2, 1, 0], + [0, 2, 0, 0, -2, 0, 1], + ]) + instance = GaussianElimination(matrix=input_matrix) + cost_matrix = instance._compute_cost_matrix() + np.testing.assert_array_equal(cost_matrix, expected_cost_matrix) + + +def test_compute_cost_matrix_diagonal_is_always_one(get_instance): + """Verify that the diagonal of the cost matrix is always 1.""" + cost_matrix = get_instance._compute_cost_matrix() + + assert np.all(np.diag(cost_matrix) == 1) + + +def test_compute_cost_matrix_off_diagonal_logic(get_instance): + """Verify the core logic for a single off-diagonal element of the cost matrix. + + cost(i->j) = sum(col_i + col_j) - weight(col_j) + """ + # Let's test the cost of applying column 0 onto column 1: costs[0, 1] + matrix = get_instance.matrix + col_0 = matrix[:, 0] + col_1 = matrix[:, 1] + + # Manually calculate the expected value for just one cell. + xor_sum = np.sum((col_0 + col_1) % 2) + weight_col_1 = np.sum(col_1) + expected_cost_0_1 = xor_sum - weight_col_1 + + cost_matrix = get_instance._compute_cost_matrix() + + assert cost_matrix[0, 1] == expected_cost_0_1 From 93d78a71be52bc73ad3c8ff3296ce1683eafda79 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Thu, 26 Jun 2025 16:21:57 +0200 Subject: [PATCH 092/156] add docstrings and typehints --- .../qecc/circuit_synthesis/synthesis_utils.py | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 8c420017c..1cc22fd89 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -415,6 +415,8 @@ def filter_fault_set(fault_set: npt.NDArray[np.int8], threshold: int) -> npt.NDA class CandidateAction(Enum): + """Class to help distinguish the control flow of the reference based heuristic gaussian elimination.""" + SKIP = auto() # Ignore this candidate and continue the loop RESTART_SEARCH = auto() # Reset used_columns and break to restart the search TRIGGER_BACKTRACK = auto() # Call backtrack() and break @@ -422,6 +424,8 @@ class CandidateAction(Enum): class GaussianElimination: + """Class to apply Gaussian Elimination on a given Matrix.""" + def __init__( self, matrix: npt.NDArray[np.int8], @@ -434,6 +438,7 @@ def __init__( penalty_cols: list[tuple[int]] | None = None, guide_by_x: bool = True, ) -> None: + """Initialiser for the basic functionality.""" self.matrix = matrix.copy() self.parallel_elimination = parallel_elimination self.code = code @@ -445,10 +450,14 @@ def __init__( self.rank = mod2.rank(self.matrix) self.eliminations = [] self.failed_cnots = penalty_cols or [] # NOTE: this is already a feature and not necessarily default - self.used_columns = [] + self.used_columns: list[int] = [] self.costs = self._compute_cost_matrix() def basic_elimination(self) -> None: + """Basic heuristic Gaussian elimination. + + Calculates CNOTS and Check matrix. + """ while not self.is_reduced(): costs_unused = self._mask_out_used_qubits() if self._handle_stagnation(costs_unused): @@ -457,6 +466,12 @@ def basic_elimination(self) -> None: self._apply_cnot_to_matrix(i, j) def reference_based_construction(self) -> None: + """Reference based heuristic Gaussian elimination. + + This version takes reference fault sets into consideration and only applies cnots that + do not cause an overlap of the reference fault set and the fault set of the newly + created circuit. + """ self._validate_inputs() self._modify_matrix_structure() self._ref_based_init() @@ -493,6 +508,7 @@ def reference_based_construction(self) -> None: continue def is_reduced(self) -> bool: + """Method decides if the Gaussian elimination has successfully ended.""" return bool(len(np.where(np.all(self.matrix == 0, axis=0))[0]) == self.matrix.shape[1] - self.rank) def _get_candidate_action(self, i: int, j: int, costs: int) -> CandidateAction: @@ -583,10 +599,10 @@ def _backtrack(self) -> None: ) = self.stack.pop() removed_cnot = self.eliminations.pop() if self.guide_by_x: - failed_cnots = [fcnot for fcnot in self.failed_cnots if removed_cnot[0] != fcnot[0]] + self.failed_cnots = [fcnot for fcnot in self.failed_cnots if removed_cnot[0] != fcnot[0]] else: - failed_cnots = [fcnot for fcnot in self.failed_cnots if removed_cnot[1] != fcnot[1]] - failed_cnots.append(removed_cnot) + self.failed_cnots = [fcnot for fcnot in self.failed_cnots if removed_cnot[1] != fcnot[1]] + self.failed_cnots.append(removed_cnot) # print_dynamic_eliminations(eliminations, failed_cnots) self.backtrack_required = False @@ -639,7 +655,7 @@ def _apply_cnot_to_matrix(self, i: int, j: int) -> None: self.costs[:, j] = new_weights - np.sum(self.matrix[:, j]) np.fill_diagonal(self.costs, 1) - def _compute_cost_matrix(self) -> None: + def _compute_cost_matrix(self) -> npt.NDArray[np.int8]: costs = np.array([ [np.sum((self.matrix[:, i] + self.matrix[:, j]) % 2) for j in range(self.matrix.shape[1])] for i in range(self.matrix.shape[1]) @@ -655,9 +671,7 @@ def _mask_out_used_qubits(self) -> npt.NDArray[np.int8]: return np.ma.array(self.costs, mask=m) # type: ignore[no-untyped-call] def _modify_matrix_structure(self) -> None: - """This should not necessary but for distance seven codes this was the only way to reliably produce - solutions. - """ + """This should not necessary but for distance seven codes this was the only way to reliably produce solutions.""" if self.code and self.code.distance > 5: if self.ref_z_fs.size and not self.ref_x_fs.size: self.matrix = mod2.row_echelon(self.matrix, full=True)[0] @@ -669,7 +683,14 @@ def _get_candidate_pairs(self, costs_unused: npt.NDArray[np.int8]) -> list[tuple candidate_indices = np.argsort(costs_unused.flatten()) # Flatten and sort by value return [np.unravel_index(idx, self.costs.shape) for idx in candidate_indices] - def _check_overlap(self, ref_fs, ref_1_fs, current_fs, new_error, x_error: bool = True) -> bool: + def _check_overlap( + self, + ref_fs: npt.NDArray[np.int8], + ref_1_fs: npt.NDArray[np.int8], + current_fs: npt.NDArray[np.int8], + new_error: npt.NDArray[np.int8], + x_error: bool = True, + ) -> bool: overlap: bool = True if ref_fs.size: overlap = self.code.check_fs_overlap(ref_fs, new_error, x_error=x_error) From fbab28e19b3f13d250bad2b34df6b061a7bf9124 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Thu, 26 Jun 2025 16:39:01 +0200 Subject: [PATCH 093/156] fix first mypy issues starting to fix mypy issues so that the CI runs through soon --- .../qecc/circuit_synthesis/synthesis_utils.py | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 1cc22fd89..dfb96abda 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -4,7 +4,6 @@ import functools import logging -import sys from enum import Enum, auto from typing import TYPE_CHECKING, Any @@ -88,18 +87,18 @@ def iterative_search_with_timeout( return None, max_param -def print_dynamic_eliminations(eliminations, failed_cnots) -> None: - """Prints the eliminations list dynamically on a single line. - - Parameters: - - eliminations: List of (control, target) tuples representing CNOT operations. - """ - # Clear both lines - sys.stdout.write("\r" + " " * 1000 + "\r") # Clear line 1 - - # Print the updated lists - sys.stdout.write(f"\rCurrent Eliminations: {eliminations} | Failed CNOTs: {failed_cnots}") - sys.stdout.flush() +# def print_dynamic_eliminations(eliminations, failed_cnots) -> None: +# """Prints the eliminations list dynamically on a single line. +# +# Parameters: +# - eliminations: List of (control, target) tuples representing CNOT operations. +# """ +# # Clear both lines +# sys.stdout.write("\r" + " " * 1000 + "\r") # Clear line 1 +# +# # Print the updated lists +# sys.stdout.write(f"\rCurrent Eliminations: {eliminations} | Failed CNOTs: {failed_cnots}") +# sys.stdout.flush() def heuristic_gaussian_elimination( @@ -448,7 +447,7 @@ def __init__( self.ref_z_1fs = ref_z_1fs or np.empty((0,), dtype=np.int8) self.guide_by_x = guide_by_x self.rank = mod2.rank(self.matrix) - self.eliminations = [] + self.eliminations: list[tuple[int]] = [] self.failed_cnots = penalty_cols or [] # NOTE: this is already a feature and not necessarily default self.used_columns: list[int] = [] self.costs = self._compute_cost_matrix() @@ -463,7 +462,7 @@ def basic_elimination(self) -> None: if self._handle_stagnation(costs_unused): continue i, j = np.unravel_index(np.argmin(costs_unused), self.costs.shape) - self._apply_cnot_to_matrix(i, j) + self._apply_cnot_to_matrix(int(i), int(j)) def reference_based_construction(self) -> None: """Reference based heuristic Gaussian elimination. @@ -486,7 +485,7 @@ def reference_based_construction(self) -> None: continue if action == CandidateAction.RESTART_SEARCH: self.used_columns = [] - self.backtrack_required = True + self.backtrack_required: bool = True break if action == CandidateAction.TRIGGER_BACKTRACK: @@ -621,11 +620,11 @@ def _ref_based_init(self) -> None: self.backtrack_required: bool = False self.overlapping_errors_x = set() self.overlapping_errors_z = set() - self.stack = [] + self.stack: list[tuple] = [] self.current_x_fs = np.eye(self.matrix.shape[1], dtype=np.int8) self.current_z_fs = np.eye(self.matrix.shape[1], dtype=np.int8) - self.used_cnots = [] - self.eliminations = [] + self.used_cnots: list[tuple[int]] = [] + self.eliminations: list[tuple[int]] = [] def _handle_stagnation(self, costs_unused: npt.NDArray[np.int8]) -> bool: """Handles local minima or full column usage. Returns True if reset occurred.""" From ab0172fd839e9bcc32112c17335dfa5dd76bf08e Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Fri, 27 Jun 2025 10:49:02 +0200 Subject: [PATCH 094/156] add to API functions for both reference based and regular SP --- src/mqt/qecc/circuit_synthesis/state_prep.py | 60 +++++++++++++++++--- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index d1994eea4..2963994f9 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -14,6 +14,7 @@ from ..codes import InvalidCSSCodeError from .synthesis_utils import ( + GaussianElimination, build_css_circuit_from_cnot_list, heuristic_gaussian_elimination, iterative_search_with_timeout, @@ -222,11 +223,40 @@ def heuristic_prep_circuit( code: CSSCode, optimize_depth: bool = True, zero_state: bool = True, +) -> StatePrepCircuit: + """Return a circuit that prepares the +1 eigenstate of the code w.r.t. the Z or X basis. + + Args: + code: The CSS code to prepare the state for. + optimize_depth: If True, optimize the depth of the circuit. This may lead to a higher number of CNOTs. + zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. + """ + logger.info("Starting heuristic state preparation.") + if code.Hx is None or code.Hz is None: + msg = "The code must have both X and Z stabilizers defined." + raise InvalidCSSCodeError(msg) + + checks = code.Hx if zero_state else code.Hz + assert checks is not None + checks, cnots = heuristic_gaussian_elimination( + checks, + parallel_elimination=optimize_depth, + ) + + circ = _build_state_prep_circuit_from_back(checks, cnots, zero_state) + return StatePrepCircuit(circ, code, zero_state) + + +def heuristic_reference_prep_circuit( + code: CSSCode, + optimize_depth: bool = True, + zero_state: bool = True, penalty_cols: list[tuple[int]] | None = None, + guide_by_x: bool = True, ref_x_fs: npt.NDArray[np.int8] | None = None, ref_z_fs: npt.NDArray[np.int8] | None = None, - guide_by_x: bool = True, ref_x_1fs: npt.NDArray[np.int8] | None = None, + ref_z_1fs: npt.NDArray[np.int8] | None = None, ) -> StatePrepCircuit: """Return a circuit that prepares the +1 eigenstate of the code w.r.t. the Z or X basis. @@ -235,10 +265,11 @@ def heuristic_prep_circuit( optimize_depth: If True, optimize the depth of the circuit. This may lead to a higher number of CNOTs. zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. penalty_cols: tuples of CNOTs (control, target) which are initially added to the failed_cnots list and hence can only be applied once the control qubit has been used elsewhere + guide_by_x: Flag that decides whether dismissed CNOTs are free to placement again after either the control (x guided) or the target (z guided) has been used elsewhere ref_x_fs: (Optional) reference x fault set which influences the construction of the circuit ref_z_fs: (Optional) reference z fault set which influences the construction of the circuit - guide_by_x: Flag that decides whether dismissed CNOTs are free to placement again after either the control (x guided) or the target (z guided) has been used elsewhere ref_x_1fs: (Optional) reference one error x fault set which ensures that no two error event of the newly constructed circuit cancels a one error event of the reference circuit + ref_z_1fs: (Optional) reference one error z fault set which ensures that no two error event of the newly constructed circuit cancels a one error event of the reference circuit """ if penalty_cols is None: penalty_cols = [] @@ -249,18 +280,31 @@ def heuristic_prep_circuit( checks = code.Hx if zero_state else code.Hz assert checks is not None - checks, cnots = heuristic_gaussian_elimination( - checks, + ge = GaussianElimination( + matrix=checks, parallel_elimination=optimize_depth, - penalty_cols=penalty_cols, code=code, ref_x_fs=ref_x_fs, ref_z_fs=ref_z_fs, - guide_by_x=guide_by_x, ref_x_1fs=ref_x_1fs, + ref_z_1fs=ref_z_1fs, + penalty_cols=penalty_cols, + guide_by_x=guide_by_x, ) - - circ = _build_state_prep_circuit_from_back(checks, cnots, zero_state) + ge.reference_based_construction() + # checks, cnots = reference_guided_elimination( + # checks, + # parallel_elimination=optimize_depth, + # penalty_cols=penalty_cols, + # code=code, + # ref_x_fs=ref_x_fs, + # ref_z_fs=ref_z_fs, + # guide_by_x=guide_by_x, + # ref_x_1fs=ref_x_1fs, + # ) + + # circ = _build_state_prep_circuit_from_back(checks, cnots, zero_state) + circ = _build_state_prep_circuit_from_back(ge.matrix, ge.eliminations, zero_state) return StatePrepCircuit(circ, code, zero_state) From f2c06e14b3e20d6319c554046661ac2ee55494f2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 27 Jun 2025 08:49:55 +0000 Subject: [PATCH 095/156] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ft_stateprep/canonical_steane/estimate_canonical.py | 7 +++++++ scripts/ft_stateprep/canonical_steane/run_parallel.sh | 7 ++++++- .../eval_circ_mod/estimate_logical_error_rate.py | 7 +++++++ scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh | 6 ++++++ scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_d7.sh | 6 ++++++ scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh | 6 ++++++ src/mqt/qecc/ecc_qiskit_wrapper.py | 7 +++++++ test/python/circuit_synthesis/test_gaussian_elimination.py | 7 +++++++ 8 files changed, 52 insertions(+), 1 deletion(-) diff --git a/scripts/ft_stateprep/canonical_steane/estimate_canonical.py b/scripts/ft_stateprep/canonical_steane/estimate_canonical.py index a40727815..049253dcb 100644 --- a/scripts/ft_stateprep/canonical_steane/estimate_canonical.py +++ b/scripts/ft_stateprep/canonical_steane/estimate_canonical.py @@ -1,3 +1,10 @@ +# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# All rights reserved. +# +# SPDX-License-Identifier: MIT +# +# Licensed under the MIT License + """Estimate logical error rate for CSS state preparation circuits for a given code and physical error rate.""" from __future__ import annotations diff --git a/scripts/ft_stateprep/canonical_steane/run_parallel.sh b/scripts/ft_stateprep/canonical_steane/run_parallel.sh index 48ac9e383..aae969a31 100755 --- a/scripts/ft_stateprep/canonical_steane/run_parallel.sh +++ b/scripts/ft_stateprep/canonical_steane/run_parallel.sh @@ -1,5 +1,10 @@ #!/bin/bash - +# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# All rights reserved. +# +# SPDX-License-Identifier: MIT +# +# Licensed under the MIT License declare -a p=("0.001" "0.0015" "0.002" "0.0025" "0.003" "0.0035" "0.004" "0.0045" "0.005" "0.0055" "0.006" "0.0065" "0.007" "0.0075" "0.008" "0.0085" "0.009" "0.0095" "0.01") diff --git a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py index cdd4227f7..72eda144c 100644 --- a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py +++ b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py @@ -1,3 +1,10 @@ +# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# All rights reserved. +# +# SPDX-License-Identifier: MIT +# +# Licensed under the MIT License + """Estimate logical error rate for CSS state preparation circuits for a given code and physical error rate.""" from __future__ import annotations diff --git a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh index 06f421b23..b276d0797 100755 --- a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh +++ b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh @@ -1,4 +1,10 @@ #!/bin/bash +# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# All rights reserved. +# +# SPDX-License-Identifier: MIT +# +# Licensed under the MIT License # Description: Estimate logical error rates for given code in parallel. Results are saved in a csv file described by the first argument. All other arguments are passed to the python script. diff --git a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_d7.sh b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_d7.sh index 979be366e..9e5329e3e 100755 --- a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_d7.sh +++ b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_d7.sh @@ -1,4 +1,10 @@ #!/bin/bash +# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# All rights reserved. +# +# SPDX-License-Identifier: MIT +# +# Licensed under the MIT License # Description: Estimate logical error rates for given code in parallel. Results are saved in a csv file described by the first argument. All other arguments are passed to the python script. diff --git a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh index 40b2b7c60..cda9257f0 100755 --- a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh +++ b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh @@ -1,4 +1,10 @@ #!/bin/bash +# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# All rights reserved. +# +# SPDX-License-Identifier: MIT +# +# Licensed under the MIT License # Description: Estimate logical error rates for given code in parallel. Results are saved in a csv file described by the first argument. All other arguments are passed to the python script. diff --git a/src/mqt/qecc/ecc_qiskit_wrapper.py b/src/mqt/qecc/ecc_qiskit_wrapper.py index 073d99d76..97a193dda 100644 --- a/src/mqt/qecc/ecc_qiskit_wrapper.py +++ b/src/mqt/qecc/ecc_qiskit_wrapper.py @@ -1,3 +1,10 @@ +# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# All rights reserved. +# +# SPDX-License-Identifier: MIT +# +# Licensed under the MIT License + """Qiskit wrapper for the ECC Framework.""" from __future__ import annotations diff --git a/test/python/circuit_synthesis/test_gaussian_elimination.py b/test/python/circuit_synthesis/test_gaussian_elimination.py index 97d192138..3ffab38a2 100644 --- a/test/python/circuit_synthesis/test_gaussian_elimination.py +++ b/test/python/circuit_synthesis/test_gaussian_elimination.py @@ -1,3 +1,10 @@ +# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# All rights reserved. +# +# SPDX-License-Identifier: MIT +# +# Licensed under the MIT License + from __future__ import annotations import numpy as np From 8e2a37e9619e8c1666c772d1bf7a496decd82b10 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Fri, 27 Jun 2025 14:08:52 +0200 Subject: [PATCH 096/156] solve more mypy issues --- .../qecc/circuit_synthesis/synthesis_utils.py | 54 +++++++++++-------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index a45d87038..c736f468b 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -441,7 +441,7 @@ def __init__( ref_z_fs: npt.NDArray[np.int8] | None = None, ref_x_1fs: npt.NDArray[np.int8] | None = None, ref_z_1fs: npt.NDArray[np.int8] | None = None, - penalty_cols: list[tuple[int]] | None = None, + penalty_cols: list[tuple[int, int]] | None = None, guide_by_x: bool = True, ) -> None: """Initialiser for the basic functionality.""" @@ -454,11 +454,35 @@ def __init__( self.ref_z_1fs = ref_z_1fs or np.empty((0,), dtype=np.int8) self.guide_by_x = guide_by_x self.rank = mod2.rank(self.matrix) - self.eliminations: list[tuple[int]] = [] - self.failed_cnots = penalty_cols or [] # NOTE: this is already a feature and not necessarily default + self.eliminations: list[tuple[int, int]] = [] + self.failed_cnots: list[tuple[int, int]] = ( + penalty_cols or [] + ) # NOTE: this is already a feature and not necessarily default self.used_columns: list[int] = [] self.costs = self._compute_cost_matrix() + def _ref_based_init(self) -> None: + self.x_propagation_matrix: npt.NDArray[np.int8] = np.eye(self.matrix.shape[1], dtype=np.int8) + self.z_propagation_matrix: npt.NDArray[np.int8] = np.eye(self.matrix.shape[1], dtype=np.int8) + self.backtrack_required: bool = False + self.overlapping_errors_x: set[npt.NDArray[np.int8]] = set() + self.overlapping_errors_z: set[npt.NDArray[np.int8]] = set() + self.stack: list[ + tuple[ + npt.NDArray[np.int8], + npt.NDArray[np.int8], + list[tuple[int, int]], + npt.NDArray[np.int8], + npt.NDArray[np.int8], + list[tuple[int, int]], + list[tuple[int, int]], + ] + ] = [] + self.current_x_fs: npt.NDArray[np.int8] = np.eye(self.matrix.shape[1], dtype=np.int8) + self.current_z_fs: npt.NDArray[np.int8] = np.eye(self.matrix.shape[1], dtype=np.int8) + self.used_cnots: list[tuple[int, int]] = [] + self.eliminations: list[tuple[int, int]] = [] + def basic_elimination(self) -> None: """Basic heuristic Gaussian elimination. @@ -527,7 +551,7 @@ def _get_candidate_action(self, i: int, j: int, costs: int) -> CandidateAction: return CandidateAction.RESTART_SEARCH return CandidateAction.EVALUATE - def _cnot_is_valid_against_references(self, i: int, j: int) -> tuple[bool, dict]: + def _cnot_is_valid_against_references(self, i: int, j: int) -> tuple[bool, dict[str, npt.NDArray[np.int8]]]: found_cnot: bool = False new_x_error, _next_x_propagation_matrix = get_next_error( propagation_matrix=self.x_propagation_matrix.copy(), cnot_gate=(int(i), int(j)) @@ -573,7 +597,7 @@ def _cnot_is_valid_against_references(self, i: int, j: int) -> tuple[bool, dict] "z_overlap": z_overlap, } - def _commit_to_cnot(self, i: int, j: int, new_errors: dict) -> None: + def _commit_to_cnot(self, i: int, j: int, new_errors: dict[str, npt.NDArray[np.int8]]) -> None: self.stack.append(( self.x_propagation_matrix.copy(), self.z_propagation_matrix.copy(), @@ -588,9 +612,9 @@ def _commit_to_cnot(self, i: int, j: int, new_errors: dict) -> None: else: self.failed_cnots = [fcnot for fcnot in self.failed_cnots if int(j) != fcnot[1]] - if self.ref_x_fs.size and not new_errors.x_overlap: + if self.ref_x_fs.size and not new_errors["x_overlap"]: self.current_x_fs = np.vstack((self.current_x_fs, new_errors["new_x_error"]), dtype=np.int8) - if self.ref_z_fs.size and not new_errors.z_overlap: + if self.ref_z_fs.size and not new_errors["z_overlap"]: self.current_z_fs = np.vstack((self.current_z_fs, new_errors["new_z_error"]), dtype=np.int8) def _backtrack(self) -> None: @@ -621,18 +645,6 @@ def _validate_inputs(self) -> None: msg = "Must provide either both a reference fault set and CSS code, or neither." raise ValueError(msg) - def _ref_based_init(self) -> None: - self.x_propagation_matrix: npt.NDArray[np.int8] = np.eye(self.matrix.shape[1], dtype=np.int8) - self.z_propagation_matrix: npt.NDArray[np.int8] = np.eye(self.matrix.shape[1], dtype=np.int8) - self.backtrack_required: bool = False - self.overlapping_errors_x = set() - self.overlapping_errors_z = set() - self.stack: list[tuple] = [] - self.current_x_fs = np.eye(self.matrix.shape[1], dtype=np.int8) - self.current_z_fs = np.eye(self.matrix.shape[1], dtype=np.int8) - self.used_cnots: list[tuple[int]] = [] - self.eliminations: list[tuple[int]] = [] - def _handle_stagnation(self, costs_unused: npt.NDArray[np.int8]) -> bool: """Handles local minima or full column usage. Returns True if reset occurred.""" if np.all(costs_unused >= 0) or len(self.used_columns) == self.matrix.shape[1]: @@ -684,7 +696,7 @@ def _modify_matrix_structure(self) -> None: if self.ref_z_fs.size and self.ref_x_fs.size: self.matrix = mod2.row_echelon(self.matrix, full=True)[0] - def _get_candidate_pairs(self, costs_unused: npt.NDArray[np.int8]) -> list[tuple[int]]: + def _get_candidate_pairs(self, costs_unused: npt.NDArray[np.int8]) -> list[tuple[int, int]]: # Get all valid (i, j) pairs sorted by cost candidate_indices = np.argsort(costs_unused.flatten()) # Flatten and sort by value return [np.unravel_index(idx, self.costs.shape) for idx in candidate_indices] @@ -707,7 +719,7 @@ def _check_overlap( return overlap @staticmethod - def _check_error_existence(error: npt.NDArray[np.int8], error_memory: set) -> bool: + def _check_error_existence(error: npt.NDArray[np.int8], error_memory: set[npt.NDArray[np.int8]]) -> bool: # INFO: Quickly check if new error is known to cause overlap. This saves another long overlap check. error_tuple = tuple(error.flatten()) return error_tuple in error_memory From 3262db8fe94e51c3d3ccad90d4ece2352cb0a298 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Fri, 27 Jun 2025 14:42:06 +0200 Subject: [PATCH 097/156] fix final mypy issues in synthesis utils --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index c736f468b..7ae27f77c 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -435,8 +435,8 @@ class GaussianElimination: def __init__( self, matrix: npt.NDArray[np.int8], + code: CSSCode, parallel_elimination: bool = True, - code: CSSCode | None = None, ref_x_fs: npt.NDArray[np.int8] | None = None, ref_z_fs: npt.NDArray[np.int8] | None = None, ref_x_1fs: npt.NDArray[np.int8] | None = None, @@ -471,7 +471,7 @@ def _ref_based_init(self) -> None: tuple[ npt.NDArray[np.int8], npt.NDArray[np.int8], - list[tuple[int, int]], + list[int], npt.NDArray[np.int8], npt.NDArray[np.int8], list[tuple[int, int]], @@ -481,7 +481,6 @@ def _ref_based_init(self) -> None: self.current_x_fs: npt.NDArray[np.int8] = np.eye(self.matrix.shape[1], dtype=np.int8) self.current_z_fs: npt.NDArray[np.int8] = np.eye(self.matrix.shape[1], dtype=np.int8) self.used_cnots: list[tuple[int, int]] = [] - self.eliminations: list[tuple[int, int]] = [] def basic_elimination(self) -> None: """Basic heuristic Gaussian elimination. @@ -516,7 +515,7 @@ def reference_based_construction(self) -> None: continue if action == CandidateAction.RESTART_SEARCH: self.used_columns = [] - self.backtrack_required: bool = True + self.backtrack_required = True break if action == CandidateAction.TRIGGER_BACKTRACK: @@ -690,7 +689,7 @@ def _mask_out_used_qubits(self) -> npt.NDArray[np.int8]: def _modify_matrix_structure(self) -> None: """This should not necessary but for distance seven codes this was the only way to reliably produce solutions.""" - if self.code and self.code.distance > 5: + if self.code.distance > 5: if self.ref_z_fs.size and not self.ref_x_fs.size: self.matrix = mod2.row_echelon(self.matrix, full=True)[0] if self.ref_z_fs.size and self.ref_x_fs.size: @@ -699,7 +698,8 @@ def _modify_matrix_structure(self) -> None: def _get_candidate_pairs(self, costs_unused: npt.NDArray[np.int8]) -> list[tuple[int, int]]: # Get all valid (i, j) pairs sorted by cost candidate_indices = np.argsort(costs_unused.flatten()) # Flatten and sort by value - return [np.unravel_index(idx, self.costs.shape) for idx in candidate_indices] + return [(int(i), int(j)) for idx in candidate_indices for i, j in [np.unravel_index(idx, self.costs.shape)]] + # return [np.unravel_index(idx, self.costs.shape) for idx in candidate_indices] def _check_overlap( self, From c01e2a1381fb89f0da2e8bc84764e1a964121fbe Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 30 Jun 2025 14:43:20 +0200 Subject: [PATCH 098/156] remove old legacy function after refactoring --- .../qecc/circuit_synthesis/synthesis_utils.py | 312 ------------------ 1 file changed, 312 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 7ae27f77c..6ba418031 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -108,318 +108,6 @@ def iterative_search_with_timeout( # sys.stdout.flush() -def heuristic_gaussian_elimination( - matrix: npt.NDArray[np.int8], - parallel_elimination: bool = True, -) -> tuple[npt.NDArray[np.int8], list[tuple[int, int]]]: - """Perform Gaussian elimination on the column space of a matrix using as few eliminations as possible. - - The algorithm utilizes a greedy heuristic to select the columns to eliminate in order to minimize the number of eliminations required. - - The matrix is reduced until there are exactly rnk(matrix) columns with non-zero entries. - - Args: - matrix: The matrix to perform Gaussian elimination on. - parallel_elimination: Whether to prioritize elimination steps that act on disjoint columns. - - Returns: - The reduced matrix and a list of the elimination steps taken. The elimination steps are represented as tuples of the form (i, j) where i is the column being eliminated with and j is the column being eliminated. - """ - matrix = matrix.copy() - rank = mod2.rank(matrix) - - def is_reduced() -> bool: - return bool(len(np.where(np.all(matrix == 0, axis=0))[0]) == matrix.shape[1] - rank) - - costs = np.array([ - [np.sum((matrix[:, i] + matrix[:, j]) % 2) for j in range(matrix.shape[1])] for i in range(matrix.shape[1]) - ]) - - costs -= np.sum(matrix, axis=0) - np.fill_diagonal(costs, 1) - - used_columns = [] # type: list[np.int_] - eliminations = [] # type: list[tuple[int, int]] - while not is_reduced(): - m = np.zeros((matrix.shape[1], matrix.shape[1]), dtype=bool) # type: npt.NDArray[np.bool_] - m[used_columns, :] = True - m[:, used_columns] = True - costs_unused = np.ma.array(costs, mask=m) # type: ignore[no-untyped-call] - - if np.all(costs_unused >= 0) or len(used_columns) == matrix.shape[1]: # no more reductions possible - if used_columns == []: # local minimum => get out by making matrix triangular - logger.warning("Local minimum reached. Making matrix triangular.") - matrix = mod2.row_echelon(matrix, full=True)[0] - costs = np.array([ - [np.sum((matrix[:, i] + matrix[:, j]) % 2) for j in range(matrix.shape[1])] - for i in range(matrix.shape[1]) - ]) - costs -= np.sum(matrix, axis=0) - np.fill_diagonal(costs, 1) - else: # try to move onto the next layer - used_columns = [] - continue - - i, j = np.unravel_index(np.argmin(costs_unused), costs.shape) - eliminations.append((int(i), int(j))) - - if parallel_elimination: - used_columns.append(i) - used_columns.append(j) - - # update matrix - matrix[:, j] = (matrix[:, i] + matrix[:, j]) % 2 - # update costs - new_weights = np.sum((matrix[:, j][:, np.newaxis] + matrix) % 2, axis=0) - costs[j, :] = new_weights - np.sum(matrix, axis=0) - costs[:, j] = new_weights - np.sum(matrix[:, j]) - np.fill_diagonal(costs, 1) - - return matrix, eliminations - - -def reference_guided_elimination( - matrix: npt.NDArray[np.int8], - parallel_elimination: bool = True, - penalty_cols: list[tuple[int]] | None = None, - code: CSSCode | None = None, - ref_x_fs: npt.NDArray[np.int8] | None = None, - ref_z_fs: npt.NDArray[np.int8] | None = None, - guide_by_x: bool = True, - ref_x_1fs: npt.NDArray[np.int8] | None = None, -) -> tuple[npt.NDArray[np.int8], list[tuple[int, int]]]: - """Perform Gaussian elimination on the column space of a matrix using as few eliminations as possible. - - The algorithm utilizes a greedy heuristic to select the columns to eliminate in order to minimize the number of eliminations required. - - The matrix is reduced until there are exactly rnk(matrix) columns with non-zero entries. - - Args: - matrix: The matrix to perform Gaussian elimination on. - parallel_elimination: Whether to prioritize elimination steps that act on disjoint columns. - penalty_cols: tuples of CNOTs (control, target) which are initially added to the failed_cnots list and hence can only be applied once the control qubit has been used elsewhere - code: Code based on which the fault sets are checked for overlaps. (Overlap check is based on check matrices) - ref_x_fs: (Optional) reference x fault set which influences the construction of the circuit - ref_z_fs: (Optional) reference z fault set which influences the construction of the circuit - guide_by_x: Flag that decides whether dismissed CNOTs are free to placement again after either the control (x guided) or the target (z guided) has been used elsewhere - ref_x_1fs: (Optional) reference one error x fault set which ensures that no two error event of the newly constructed circuit cancels a one error event of the reference circuit - - Returns: - The reduced matrix and a list of the elimination steps taken. The elimination steps are represented as tuples of the form (i, j) where i is the column being eliminated with and j is the column being eliminated. - """ - if penalty_cols is None: - penalty_cols = [] - if ref_x_fs is None: - ref_x_fs = np.empty((0,), dtype=np.int8) - if ref_x_1fs is None: - ref_x_1fs = np.empty((0,), dtype=np.int8) - if ref_z_fs is None: - ref_z_fs = np.empty((0,), dtype=np.int8) - # INFO: Code is always provided but if no reference sets are given we act like there is no code. - if (code is not None) and not (ref_x_fs.size or ref_z_fs.size): - code = None - if not ((ref_x_fs.size or ref_z_fs.size) ^ (code is None)): - msg = "If providing at least one reference set, it is also necessary to provide a reference CSS Code. Or if providing a CSSCode, at least of reference fault set must be given also." - raise ValueError(msg) - - matrix = matrix.copy() - if code and code.distance > 5: - if ref_z_fs.size and not ref_x_fs.size: - matrix = mod2.row_echelon(matrix, full=True)[0] - if ref_z_fs.size and ref_x_fs.size: - matrix = mod2.row_echelon(matrix, full=True)[0] - rank = mod2.rank(matrix) - - def is_reduced() -> bool: - return bool(len(np.where(np.all(matrix == 0, axis=0))[0]) == matrix.shape[1] - rank) - - costs = np.array([ - [np.sum((matrix[:, i] + matrix[:, j]) % 2) for j in range(matrix.shape[1])] for i in range(matrix.shape[1]) - ]) - - costs -= np.sum(matrix, axis=0) - np.fill_diagonal(costs, 1) - - used_columns = [] # type: list[np.int_] - eliminations = [] # type: list[tuple[int, int]] - failed_cnots = penalty_cols - used_cnots = [] - # NOTE: set up variables for distinct fault set construction - if code is not None: - # matrix that describes how an error happening at qubit i would propagate right now through - # the circuit - x_propagation_matrix: npt.NDArray[np.int8] = np.eye(matrix.shape[1], dtype=np.int8) - z_propagation_matrix: npt.NDArray[np.int8] = np.eye(matrix.shape[1], dtype=np.int8) - backtrack_required: bool = False - overlapping_errors_x = set() - overlapping_errors_z = set() - stack = [] - # current_x_fs = np.empty((0, matrix.shape[1]), dtype=np.int8) - current_x_fs = np.eye(matrix.shape[1], dtype=np.int8) - # current_z_fs = np.empty((0, matrix.shape[1]), dtype=np.int8) - while not is_reduced(): - # flag in case algorithm can only choose CNOT that would violate t-distinctness - deadend: bool = False - - m = np.zeros((matrix.shape[1], matrix.shape[1]), dtype=bool) # type: npt.NDArray[np.bool_] - m[used_columns, :] = True - m[:, used_columns] = True - costs_unused = np.ma.array(costs, mask=m) # type: ignore[no-untyped-call] - - if np.all(costs_unused >= 0) or len(used_columns) == matrix.shape[1]: # no more reductions possible - if used_columns == []: # local minimum => get out by making matrix triangular - logger.warning("Local minimum reached. Making matrix triangular.") - matrix = mod2.row_echelon(matrix, full=True)[0] - costs = np.array([ - [np.sum((matrix[:, i] + matrix[:, j]) % 2) for j in range(matrix.shape[1])] - for i in range(matrix.shape[1]) - ]) - costs -= np.sum(matrix, axis=0) - np.fill_diagonal(costs, 1) - else: # try to move onto the next layer - used_columns = [] - continue - - if code is not None: - # Get all valid (i, j) pairs sorted by cost - candidate_indices = np.argsort(costs_unused.flatten()) # Flatten and sort by value - candidate_pairs = [np.unravel_index(idx, costs.shape) for idx in candidate_indices] - - # valid_indices = np.where((costs_unused < 0) & ~costs_unused.mask) - # negative_values = costs_unused[valid_indices] - # sorted_indices = np.argsort(negative_values) # Sort values in ascending order - # candidate_pairs = list(zip(valid_indices[0][sorted_indices], valid_indices[1][sorted_indices])) - - # Find the first (i, j) that does NOT cause overlap - for i, j in candidate_pairs: - if (int(i), int(j)) in failed_cnots or (int(i), int(j)) in used_cnots: - continue - - if costs_unused[i, j] >= 0 and backtrack_required: # level has been checked completely - x_propagation_matrix, z_propagation_matrix, used_columns, matrix, costs, used_cnots, _ = stack.pop() - removed_cnot = eliminations.pop() - if guide_by_x: - failed_cnots = [fcnot for fcnot in failed_cnots if removed_cnot[0] != fcnot[0]] - else: - failed_cnots = [fcnot for fcnot in failed_cnots if removed_cnot[1] != fcnot[1]] - failed_cnots.append(removed_cnot) - # print_dynamic_eliminations(eliminations, failed_cnots) - backtrack_required = False - deadend = True - break - # level has been checked once but possibly not completely due to parallelization - if costs_unused[i, j] >= 0: - used_columns = [] - deadend = True - backtrack_required = True - break - - used_cnots.append((int(i), int(j))) - - new_x_error, next_x_propagation_matrix = get_next_error( - propagation_matrix=x_propagation_matrix.copy(), cnot_gate=(int(i), int(j)) - ) - new_z_error, next_z_propagation_matrix = get_next_error( - propagation_matrix=z_propagation_matrix.copy(), cnot_gate=(int(i), int(j)), x_error=False - ) - - # INFO: Quickly check if new error is known to cause overlap. This saves another long overlap check. - new_x_error_tuple = tuple(new_x_error.flatten()) - new_z_error_tuple = tuple(new_z_error.flatten()) - if new_x_error_tuple in overlapping_errors_x: - continue - if new_z_error_tuple in overlapping_errors_z: - continue - - new_x_error = np.expand_dims(new_x_error, axis=0) - new_z_error = np.expand_dims(new_z_error, axis=0) - - # Check if there is no overlap—if true, accept (i, j) - # NOTE: Now if specifically given a one error x fault set it is possible to also keep track of the current - # 2 error fault set of the new circuit and check those for overlap. - # TODO: for z the above functionality is not yet implemented - found_cnot = False - - def filter_fault_set(fault_set: npt.NDArray[np.int8], threshold: int) -> npt.NDArray[np.int8]: - """Filter fault sets based on a sum threshold.""" - return fault_set[np.where(fault_set.sum(axis=1) > threshold)] - - # only calculate overlap if reference fault set is given (optimization) - if ref_x_fs.size: - x_overlap: bool = code.check_fs_overlap(ref_x_fs, new_x_error) - if ref_x_1fs.size and not x_overlap: - trial_x_2fs = (current_x_fs + new_x_error) % 2 - trial_x_2fs = filter_fault_set(trial_x_2fs, int((code.distance - 1) / 2)) - x_overlap: bool = code.check_fs_overlap(ref_x_1fs, trial_x_2fs) - if ref_z_fs.size: - z_overlap: bool = code.check_fs_overlap(ref_z_fs, new_z_error, x_error=False) - - if ref_x_fs.size and ref_z_fs.size: - # Both sets provided: Enter if **both** overlaps fail - found_cnot = not (x_overlap or z_overlap) - if not found_cnot: - overlapping_errors_x.add(new_x_error_tuple) - overlapping_errors_z.add(new_z_error_tuple) - elif ref_x_fs.size: - # Only x-set provided: Enter if **x_overlap** fails - found_cnot = not x_overlap - if not found_cnot: - overlapping_errors_x.add(new_x_error_tuple) - elif ref_z_fs.size: - # Only z-set provided: Enter if **z_overlap** fails - found_cnot = not z_overlap - if not found_cnot: - overlapping_errors_z.add(new_z_error_tuple) - - if found_cnot: - stack.append(( - x_propagation_matrix.copy(), - z_propagation_matrix.copy(), - used_columns.copy(), - matrix.copy(), - costs.copy(), - used_cnots.copy(), - failed_cnots.copy(), - )) - used_cnots = [] - if guide_by_x: - failed_cnots = [fcnot for fcnot in failed_cnots if int(i) != fcnot[0]] - else: - failed_cnots = [fcnot for fcnot in failed_cnots if int(j) != fcnot[1]] - - if ref_x_fs.size and not x_overlap: - x_propagation_matrix = next_x_propagation_matrix - current_x_fs = np.vstack((current_x_fs, new_x_error), dtype=np.int8) - if ref_z_fs.size and not z_overlap: - z_propagation_matrix = next_z_propagation_matrix - # current_z_fs = trial_z_fs - - break - failed_cnots.append((int(i), int(j))) - # print_dynamic_eliminations(eliminations, failed_cnots) - - else: - i, j = np.unravel_index(np.argmin(costs_unused), costs.shape) - if deadend: - continue - eliminations.append((int(i), int(j))) - # print_dynamic_eliminations(eliminations, failed_cnots) - - if parallel_elimination: - used_columns.append(i) - used_columns.append(j) - - # update matrix - matrix[:, j] = (matrix[:, i] + matrix[:, j]) % 2 - # update costs - new_weights = np.sum((matrix[:, j][:, np.newaxis] + matrix) % 2, axis=0) - costs[j, :] = new_weights - np.sum(matrix, axis=0) - costs[:, j] = new_weights - np.sum(matrix[:, j]) - np.fill_diagonal(costs, 1) - - return matrix, eliminations - - class CandidateAction(Enum): """Class to help distinguish the control flow of the reference based heuristic gaussian elimination.""" From 5427d4ccf2e67fe7259768ed743efe164e655bb2 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 30 Jun 2025 14:44:39 +0200 Subject: [PATCH 099/156] change name of penalty columns to penalty cnots this is to avoid misunderstandings of what the variable represents --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 6ba418031..613507439 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -129,7 +129,7 @@ def __init__( ref_z_fs: npt.NDArray[np.int8] | None = None, ref_x_1fs: npt.NDArray[np.int8] | None = None, ref_z_1fs: npt.NDArray[np.int8] | None = None, - penalty_cols: list[tuple[int, int]] | None = None, + penalty_cnots: list[tuple[int, int]] | None = None, guide_by_x: bool = True, ) -> None: """Initialiser for the basic functionality.""" @@ -144,7 +144,7 @@ def __init__( self.rank = mod2.rank(self.matrix) self.eliminations: list[tuple[int, int]] = [] self.failed_cnots: list[tuple[int, int]] = ( - penalty_cols or [] + penalty_cnots or [] ) # NOTE: this is already a feature and not necessarily default self.used_columns: list[int] = [] self.costs = self._compute_cost_matrix() From 31d37c7ffc4885316c0a2ff65285dc583b21086d Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 30 Jun 2025 14:46:17 +0200 Subject: [PATCH 100/156] change name from penalty cols to penalty cnots on state_prep.py --- src/mqt/qecc/circuit_synthesis/state_prep.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index b8852fdcb..6fa18676f 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -258,7 +258,7 @@ def heuristic_reference_prep_circuit( code: CSSCode, optimize_depth: bool = True, zero_state: bool = True, - penalty_cols: list[tuple[int]] | None = None, + penalty_cnots: list[tuple[int, int]] | None = None, guide_by_x: bool = True, ref_x_fs: npt.NDArray[np.int8] | None = None, ref_z_fs: npt.NDArray[np.int8] | None = None, @@ -271,15 +271,15 @@ def heuristic_reference_prep_circuit( code: The CSS code to prepare the state for. optimize_depth: If True, optimize the depth of the circuit. This may lead to a higher number of CNOTs. zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. - penalty_cols: tuples of CNOTs (control, target) which are initially added to the failed_cnots list and hence can only be applied once the control qubit has been used elsewhere + penalty_cnots: tuples of CNOTs (control, target) which are initially added to the failed_cnots list and hence can only be applied once the control qubit has been used elsewhere guide_by_x: Flag that decides whether dismissed CNOTs are free to placement again after either the control (x guided) or the target (z guided) has been used elsewhere ref_x_fs: (Optional) reference x fault set which influences the construction of the circuit ref_z_fs: (Optional) reference z fault set which influences the construction of the circuit ref_x_1fs: (Optional) reference one error x fault set which ensures that no two error event of the newly constructed circuit cancels a one error event of the reference circuit ref_z_1fs: (Optional) reference one error z fault set which ensures that no two error event of the newly constructed circuit cancels a one error event of the reference circuit """ - if penalty_cols is None: - penalty_cols = [] + if penalty_cnots is None: + penalty_cnots = [] logger.info("Starting heuristic state preparation.") if code.Hx is None or code.Hz is None: msg = "The code must have both X and Z stabilizers defined." @@ -295,7 +295,7 @@ def heuristic_reference_prep_circuit( ref_z_fs=ref_z_fs, ref_x_1fs=ref_x_1fs, ref_z_1fs=ref_z_1fs, - penalty_cols=penalty_cols, + penalty_cnots=penalty_cnots, guide_by_x=guide_by_x, ) ge.reference_based_construction() From 0c9a4b6169083697cf849de516be3e0cde087413 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 30 Jun 2025 14:52:18 +0200 Subject: [PATCH 101/156] remove mypy issues in synthesis_utils.py --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 613507439..9b3a16ae9 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -494,7 +494,7 @@ def check_mutually_disjointness_spcs( return c_spcs -def get_fs_based_on_d(spc: StatePrepCircuit) -> tuple[npt.NDArray[np.int8]]: +def get_fs_based_on_d(spc: StatePrepCircuit) -> tuple[npt.NDArray[np.int8], npt.NDArray[np.int8]]: """Get fault sets based on the code distance. Only the faults sets that are of interest for the fault tolerant state preparation are being returned. @@ -507,7 +507,7 @@ def get_fs_based_on_d(spc: StatePrepCircuit) -> tuple[npt.NDArray[np.int8]]: tuple: first entry the x fault set and second entry the z fault set. """ - def compute_fault_sets(level: int = 1) -> tuple[npt.NDArray[np.int8]]: + def compute_fault_sets(level: int = 1) -> tuple[npt.NDArray[np.int8], npt.NDArray[np.int8]]: """Helper function to compute fault sets at a given level.""" spc.compute_fault_set(level) spc.compute_fault_set(level, x_errors=False) From bd463a973537748fb2b2f28b2c82d18118beacb6 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 30 Jun 2025 15:00:47 +0200 Subject: [PATCH 102/156] remove legacy entry points to legacy function replace the old legacy functions with the class api functions for the basic elimination as well as the reference based elimination --- src/mqt/qecc/circuit_synthesis/state_prep.py | 23 ++++---------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 6fa18676f..9414e7bc0 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -23,7 +23,6 @@ from .synthesis_utils import ( GaussianElimination, build_css_circuit_from_cnot_list, - heuristic_gaussian_elimination, iterative_search_with_timeout, measure_flagged, odd_overlap, @@ -245,12 +244,10 @@ def heuristic_prep_circuit( checks = code.Hx if zero_state else code.Hz assert checks is not None - checks, cnots = heuristic_gaussian_elimination( - checks, - parallel_elimination=optimize_depth, - ) + ge = GaussianElimination(matrix=checks, parallel_elimination=optimize_depth) + ge.basic_elimination() - circ = _build_state_prep_circuit_from_back(checks, cnots, zero_state) + circ = _build_state_prep_circuit_from_back(ge.matrix, ge.eliminations, zero_state) return StatePrepCircuit(circ, code, zero_state) @@ -265,7 +262,7 @@ def heuristic_reference_prep_circuit( ref_x_1fs: npt.NDArray[np.int8] | None = None, ref_z_1fs: npt.NDArray[np.int8] | None = None, ) -> StatePrepCircuit: - """Return a circuit that prepares the +1 eigenstate of the code w.r.t. the Z or X basis. + """Return a circuit that prepares the +1 eigenstate of the code w.r.t. the Z or X basis and based on (a) reference fault set(s). Args: code: The CSS code to prepare the state for. @@ -299,18 +296,6 @@ def heuristic_reference_prep_circuit( guide_by_x=guide_by_x, ) ge.reference_based_construction() - # checks, cnots = reference_guided_elimination( - # checks, - # parallel_elimination=optimize_depth, - # penalty_cols=penalty_cols, - # code=code, - # ref_x_fs=ref_x_fs, - # ref_z_fs=ref_z_fs, - # guide_by_x=guide_by_x, - # ref_x_1fs=ref_x_1fs, - # ) - - # circ = _build_state_prep_circuit_from_back(checks, cnots, zero_state) circ = _build_state_prep_circuit_from_back(ge.matrix, ge.eliminations, zero_state) return StatePrepCircuit(circ, code, zero_state) From 8c0e481a5d24781b676e57f3c7b06452106a0b26 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 30 Jun 2025 15:18:44 +0200 Subject: [PATCH 103/156] remove legacy function form encoding.py and swap it with class structure --- src/mqt/qecc/circuit_synthesis/encoding.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/encoding.py b/src/mqt/qecc/circuit_synthesis/encoding.py index 3889ecfac..f0970df80 100644 --- a/src/mqt/qecc/circuit_synthesis/encoding.py +++ b/src/mqt/qecc/circuit_synthesis/encoding.py @@ -19,7 +19,11 @@ from ldpc import mod2 from ..codes import InvalidCSSCodeError -from .synthesis_utils import build_css_circuit_from_cnot_list, heuristic_gaussian_elimination, optimal_elimination +from .synthesis_utils import ( + GaussianElimination, + build_css_circuit_from_cnot_list, + optimal_elimination, +) if TYPE_CHECKING: # pragma: no cover import numpy.typing as npt @@ -51,10 +55,13 @@ def heuristic_encoding_circuit( if balance_checks: _balance_matrix(logicals) - checks, cnots = heuristic_gaussian_elimination( - np.vstack((checks, logicals)), - parallel_elimination=optimize_depth, - ) + ge = GaussianElimination(matrix=np.vstack((checks, logicals)), code=code, parallel_elimination=optimize_depth) + ge.basic_elimination() + checks, cnots = ge.matrix, ge.eliminations + # checks, cnots = heuristic_gaussian_elimination( + # np.vstack((checks, logicals)), + # parallel_elimination=optimize_depth, + # ) # after reduction there still might be some overlap between initialized qubits and encoding qubits, we simply perform CNOTs to correct this encoding_qubits = np.where(checks[n_checks:, :].sum(axis=0) != 0)[0] From 321d687cc9805e9bc728436bd6639991613a9f97 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 30 Jun 2025 16:07:19 +0200 Subject: [PATCH 104/156] add pytest.ini to git ignore to keep locally neotest working since parallel tests where added neotest struggles to read the json reports from pytest as they are not necessarily well formatted with parallel execution. However, locally I can run test also sequentially. --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 90137b308..a9d8db638 100644 --- a/.gitignore +++ b/.gitignore @@ -174,3 +174,5 @@ out/build node_modules/ wheelhouse/ + +pytest.ini From d7a52064fc6f3fe7fc6e0a2841f5c97341847d37 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 30 Jun 2025 16:10:36 +0200 Subject: [PATCH 105/156] add required positional argument 'code' to GaussianElimination --- src/mqt/qecc/circuit_synthesis/state_prep.py | 2 +- .../python/circuit_synthesis/test_gaussian_elimination.py | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 9414e7bc0..431cef9a6 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -244,7 +244,7 @@ def heuristic_prep_circuit( checks = code.Hx if zero_state else code.Hz assert checks is not None - ge = GaussianElimination(matrix=checks, parallel_elimination=optimize_depth) + ge = GaussianElimination(matrix=checks, code=code, parallel_elimination=optimize_depth) ge.basic_elimination() circ = _build_state_prep_circuit_from_back(ge.matrix, ge.eliminations, zero_state) diff --git a/test/python/circuit_synthesis/test_gaussian_elimination.py b/test/python/circuit_synthesis/test_gaussian_elimination.py index 3ffab38a2..f362fdf6a 100644 --- a/test/python/circuit_synthesis/test_gaussian_elimination.py +++ b/test/python/circuit_synthesis/test_gaussian_elimination.py @@ -11,14 +11,16 @@ import pytest from mqt.qecc.circuit_synthesis.synthesis_utils import CandidateAction, GaussianElimination +from mqt.qecc.codes.css_code import CSSCode STEANE_CHECK_MATRIX = np.array([[1, 1, 0, 0, 1, 1, 0], [1, 0, 1, 0, 1, 0, 1], [0, 0, 0, 1, 1, 1, 1]], dtype=np.int8) +STEANE_CODE = CSSCode(Hx=STEANE_CHECK_MATRIX) @pytest.fixture def get_instance(): """A basic fixture to provide a fresh GaussianElimination instance for each test.""" - return GaussianElimination(matrix=STEANE_CHECK_MATRIX.copy()) + return GaussianElimination(matrix=STEANE_CHECK_MATRIX.copy(), code=STEANE_CODE) # Use parametrize to test all logical branches @@ -58,7 +60,7 @@ def test_apply_cnot_to_matrix_updates_matrix_and_costs_correctly(get_instance): expected_matrix = np.array([[1, 1, 0, 0, 0, 1, 0], [1, 0, 1, 0, 0, 0, 1], [0, 0, 0, 1, 1, 1, 1]], dtype=np.int8) get_instance._apply_cnot_to_matrix(i=0, j=4) np.testing.assert_array_equal(get_instance.matrix, expected_matrix) - expected_instance = GaussianElimination(matrix=expected_matrix) + expected_instance = GaussianElimination(matrix=expected_matrix, code=CSSCode(expected_matrix)) expected_costs = expected_instance.costs np.testing.assert_array_equal(get_instance.costs, expected_costs) @@ -240,7 +242,7 @@ def test_compute_cost_matrix_golden_master(): [0, 0, 2, 0, -2, 1, 0], [0, 2, 0, 0, -2, 0, 1], ]) - instance = GaussianElimination(matrix=input_matrix) + instance = GaussianElimination(matrix=input_matrix, code=CSSCode(input_matrix)) cost_matrix = instance._compute_cost_matrix() np.testing.assert_array_equal(cost_matrix, expected_cost_matrix) From 5d84f7a5a9face9f5e0b4984383e34f61a2021b0 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Fri, 4 Jul 2025 08:23:57 +0200 Subject: [PATCH 106/156] Some minor refactoring. --- src/mqt/qecc/circuit_synthesis/simulation.py | 66 +++++++++++--------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 62a130bf5..567be1a53 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -13,6 +13,7 @@ import itertools import logging import math +from abc import ABC, abstractmethod from collections import defaultdict from typing import TYPE_CHECKING @@ -20,7 +21,6 @@ import numpy as np import stim from qiskit import ClassicalRegister, QuantumCircuit -from qiskit.circuit import QuantumCircuit from qiskit.converters import circuit_to_dag, dag_to_circuit from tqdm import tqdm @@ -35,8 +35,8 @@ logger = logging.getLogger(__name__) -class NoisyNDFTStatePrepSimulator: - """Abstract class for simulating noisy state preparation circuit using a depolarizing noise model.""" +class NoisyNDFTStatePrepSimulator(ABC): + """Base class for simulating noisy quantum state preparation circuits with a depolarizing noise model and support for error correction using CSS codes.""" def __init__( self, @@ -55,7 +55,7 @@ def __init__( code: The code to simulate. p: The error rate. p_idle: Idling error rate. If None, it is set to p. - zero_state: Whether thezero state is prepared or nor. + zero_state: Whether the zero state is prepared or nor. parallel_gates: Whether to allow for parallel execution of gates. decoder: The decoder to use. """ @@ -108,6 +108,7 @@ def set_p(self, p: float, p_idle: float | None = None, error_free_qubits=None) - self.data_measurements = self.measure_x(self.stim_circ, n_measurements) n_measurements += self.code.n + @abstractmethod def _compute_postselection_indices(self) -> int: """Compute indices of measurements for postselection. @@ -383,7 +384,7 @@ def plot_state_prep( class VerificationNDFTStatePrepSimulator(NoisyNDFTStatePrepSimulator): - """Class for simulating noisy state preparation circuit using a depolarizing noise model.""" + """Class for simulating noisy state preparation circuit using stabilizer measurements to detect in a verification circuit.""" def __init__( self, @@ -402,7 +403,7 @@ def __init__( code: The code to simulate. p: The error rate. p_idle: Idling error rate. If None, it is set to p. - zero_state: Whether thezero state is prepared or nor. + zero_state: Whether the zero state is prepared or nor. parallel_gates: Whether to allow for parallel execution of gates. decoder: The decoder to use. """ @@ -448,7 +449,10 @@ def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: class SteaneNDFTStatePrepSimulator(NoisyNDFTStatePrepSimulator): - """Class for simulating steane-type noisy state preparation circuit using a depolarizing noise model.""" + """Class for simulating Steane-type noisy state preparation circuit. + + A state is checked using multiple copies of the state preparation circuit, which are connected using transversal CNOTs. + """ def __init__( self, @@ -479,7 +483,7 @@ def __init__( code: The code to simulate. p: The error rate. p_idle: Idling error rate. If None, it is set to p. - zero_state: Whether thezero state is prepared or nor. + zero_state: Whether the zero state is prepared or nor. parallel_gates: Whether to allow for parallel execution of gates. decoder: The decoder to use. check_circuit: Circuit used for checking error rates for the error type that cannot form a logical error on the synthesized state. @@ -510,26 +514,31 @@ def __init__( combined.barrier() # need the barrier to retain order of measurements # transversal cnots + # Define ranges for better readability + self._data_range = range(code.n) + self._first_ancilla_range = range(code.n, 2 * code.n) + self._second_ancilla_range = range(2 * code.n, 3 * code.n) + self._third_ancilla_range = range(3 * code.n, 4 * code.n) + if self.has_one_ancilla: if zero_state: - combined.cx(range(code.n), range(code.n, 2 * code.n)) + combined.cx(self._data_range, self._first_ancilla_range) else: - combined.cx(range(code.n, 2 * code.n), range(code.n)) - + combined.cx(self._first_ancilla_range, self._data_range) else: - combined.cx(range(code.n), range(code.n, 2 * code.n)) - combined.cx(range(2 * code.n, 3 * code.n), range(3 * code.n, 4 * code.n)) - combined.cx(range(2 * code.n, 3 * code.n), range(code.n)) + combined.cx(self._data_range, self._first_ancilla_range) + combined.cx(self._second_ancilla_range, self._third_ancilla_range) + combined.cx(self._second_ancilla_range, self._data_range) + combined.h(self._second_ancilla_range) # second ancilla is measured in X basis - combined.h(range(2 * code.n, 3 * code.n)) # second ancilla is measured in X basis combined.barrier() # need the barrier to retain order of measurements + n_measured = 3 * code.n if not self.has_one_ancilla else code.n cr = ClassicalRegister(n_measured, "c") combined.add_register(cr) - if self.has_one_ancilla: - combined.measure(range(code.n, 2 * code.n), cr) - else: - combined.measure(range(code.n, 4 * code.n), cr) + + measure_range = self._first_ancilla_range if self.has_one_ancilla else range(code.n, 4 * code.n) + combined.measure(measure_range, cr) self.anc_1: list[int] = [] self.anc_2: list[int] = [] @@ -547,16 +556,17 @@ def __init__( secondary_error_gadget = combined.copy() secondary_error_gadget.barrier() secondary_error_gadget = check_circuit.tensor(secondary_error_gadget) + self._measurement_ancilla_range = range(4 * code.n, 5 * code.n) if zero_state: - secondary_error_gadget.cx(range(code.n), range(4 * code.n, 5 * code.n)) + secondary_error_gadget.cx(self._data_range, self._measurement_ancilla_range) else: - secondary_error_gadget.cx(range(4 * code.n, 5 * code.n), range(code.n)) + secondary_error_gadget.cx(self._measurement_ancilla_range, self._data_range) if self.zero_state: - secondary_error_gadget.h(range(code.n)) + secondary_error_gadget.h(self._data_range) secondary_error_gadget.barrier() new_cr = ClassicalRegister(code.n, "new_c") secondary_error_gadget.add_register(new_cr) - secondary_error_gadget.measure(range(code.n), new_cr) + secondary_error_gadget.measure(self._data_range, new_cr) self.secondary_error_gadget = secondary_error_gadget def _compute_postselection_indices(self) -> int: @@ -565,10 +575,10 @@ def _compute_postselection_indices(self) -> int: Returns: int: The number of measurements. """ - self.anc_1 = list(range(self.code.n)) + self.anc_1 = list(self._first_ancilla_range) if not self.has_one_ancilla: - self.anc_2 = list(range(self.code.n, 2 * self.code.n)) - self.anc_3 = list(range(2 * self.code.n, 3 * self.code.n)) + self.anc_2 = list(self._second_ancilla_range) + self.anc_3 = list(self._third_ancilla_range) return 3 * self.code.n return self.code.n @@ -588,9 +598,9 @@ def set_p(self, p: float, p_idle: float | None = None, error_free_qubits=None) - return self.secondary_stim_circ = self.to_stim_circ( self.secondary_error_gadget, - error_free_qubits=list(range(4 * self.code.n, 5 * self.code.n)) + error_free_qubits, + error_free_qubits=list(self._) + error_free_qubits, ) - self.secondary_stim_circ.append("DEPOLARIZE1", list(range(4 * self.code.n, 5 * self.code.n)), [self.p]) + self.secondary_stim_circ.append("DEPOLARIZE1", list(self._measurement_ancilla_range), [self.p]) n_measurements = self._compute_postselection_indices() self.secondary_ancilla_measurements = list( From e05bf34eecca37cdfc91d7970a20f230b897be86 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Thu, 24 Jul 2025 12:55:02 +0200 Subject: [PATCH 107/156] Removed unused method. --- src/mqt/qecc/circuit_synthesis/simulation.py | 37 -------------------- 1 file changed, 37 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 567be1a53..5f11d9182 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -25,7 +25,6 @@ from tqdm import tqdm from ..codes import InvalidCSSCodeError -from .synthesis_utils import support if TYPE_CHECKING: # pragma: no cover import numpy.typing as npt @@ -204,42 +203,6 @@ def idle_error(used_qubits: list[int]) -> None: return stim_circuit - def measure_stabilizers( - self, circ: stim.Circuit, measurement_index, data_index: int = 0 - ) -> tuple[list[int], list[int]]: - """Measure the stabilizers of the code. - - An ancilla is used for each measurement. - """ - assert self.code.Hx is not None - assert self.code.Hz is not None - - x_measurements = [] - z_measurements = [] - anc = circ.num_qubits - n_measurements = 0 - for check in self.code.Hx: - supp = support(check) - - circ.append_operation("H", [anc]) - for q in supp: - circ.append_operation("CX", [anc, q + data_index]) - circ.append_operation("MRX", [anc]) - x_measurements.append(measurement_index + n_measurements) - n_measurements += 1 - anc += 1 - - for check in self.code.Hz: - supp = support(check) - for q in supp: - circ.append_operation("CX", [q + data_index, anc]) - circ.append_operation("MRZ", [anc]) - z_measurements.append(measurement_index + n_measurements) - n_measurements += 1 - anc += 1 - - return x_measurements, z_measurements - def measure_z(self, circ: stim.Circuit, measurement_index: int, data_index: int = 0) -> list[int]: """Measure all data qubits in the Z basis.""" data_measurements = [measurement_index + i for i in range(self.code.n)] From 70f53167fd8df3bfc02fd3718823986751eb0692 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Mon, 28 Jul 2025 11:25:45 +0200 Subject: [PATCH 108/156] Add ideal qubits to noise model. --- src/mqt/qecc/circuit_synthesis/noise.py | 40 ++++++++++++++++++++----- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/noise.py b/src/mqt/qecc/circuit_synthesis/noise.py index 75688bcd5..5aac9c29f 100644 --- a/src/mqt/qecc/circuit_synthesis/noise.py +++ b/src/mqt/qecc/circuit_synthesis/noise.py @@ -9,7 +9,7 @@ from __future__ import annotations -from stim import Circuit +from stim import Circuit, GateTarget from .circuit_utils import collect_circuit_layers @@ -67,10 +67,33 @@ class NoiseModel: """Class representing a noise model for a quantum circuit.""" + def __init__(self, ideal_qubits: set[int] | None = None) -> None: + """Initialize the noise model. + + Args: + ideal_qubits: Set of qubit indices that are ideal (not subject to noise). + """ + self.ideal_qubits = ideal_qubits or set() + def apply(self, circ: Circuit) -> Circuit: """Apply the noise model to a quantum circuit.""" raise NotImplementedError + def _apply_noise(self, circ: Circuit, op: str, targets: list[int | GateTarget], p: float) -> None: + """Apply noise to the circuit only if the targets are not ideal qubits. + + If any of the targets are in the set of ideal qubits, the noise operation is not applied to those targets. + + Args: + circ: The circuit to which the noise is applied. + op: The noise operation (e.g., "DEPOLARIZE1"). + targets: List of qubit indices to apply the noise to. + p: Probability of the noise operation. + """ + any_ideal = any(t in self.ideal_qubits for t in targets) + if not any_ideal: + circ.append_operation(op, targets, p) + class CircuitLevelNoise(NoiseModel): """Class representing circuit-level noise. @@ -116,21 +139,24 @@ def apply(self, circ: Circuit) -> Circuit: targets = op.targets_copy() if name in STIM_SQGS: noisy_circ.append_operation(op.name, targets) - noisy_circ.append_operation("DEPOLARIZE1", targets, self.p_sqg) + self._apply_noise(noisy_circ, "DEPOLARIZE1", targets, self.p_sqg) elif name in STIM_RESETS: noisy_circ.append_operation(op.name, targets) - noisy_circ.append_operation("DEPOLARIZE1", targets, self.p_init) + self._apply_noise(noisy_circ, "DEPOLARIZE1", targets, self.p_init) elif name in STIM_TQGS: for grp in ( op.target_groups() ): # errors might propagate so we have to apply noise to every target group individually noisy_circ.append_operation(op.name, grp) - noisy_circ.append_operation("DEPOLARIZE2", grp, self.p_tqg) + self._apply_noise(noisy_circ, "DEPOLARIZE2", grp, self.p_tqg) elif name in STIM_MEASUREMENTS: - noisy_circ.append_operation(op.name, targets, self.p_meas) + if any(t in self.ideal_qubits for t in targets): + noisy_circ.append_operation(op.name, targets) + else: + noisy_circ.append_operation(op.name, targets, p_meas) return noisy_circ @@ -265,7 +291,7 @@ def _add_idling_noise_to_layers_alap( uninitialized_qubits -= non_idling_non_resets initialized_qubits = initialized_qubits.union(non_idling_non_resets) - for q in idling: + for q in idling - noise.ideal_qubits: noisy_layer.append_operation("DEPOLARIZE1", q, p_idle) noisy_circ += noisy_layer @@ -287,7 +313,7 @@ def _add_idling_noise_to_layers_asap( uninitialized_qubits -= non_idling - for q in idling: + for q in idling - noise.ideal_qubits: noisy_layer.append_operation("DEPOLARIZE1", q, p_idle) noisy_circ += noisy_layer From fec9f2bf78663e0a69e577be2fc03384c7892750 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Mon, 28 Jul 2025 11:45:27 +0200 Subject: [PATCH 109/156] Added method to get unmeasured qubits of stim circuit. --- .../qecc/circuit_synthesis/circuit_utils.py | 14 +++++ src/mqt/qecc/circuit_synthesis/definitions.py | 60 +++++++++++++++++++ src/mqt/qecc/circuit_synthesis/noise.py | 53 +--------------- test/python/circuit_synthesis/test_utils.py | 22 +++++++ 4 files changed, 98 insertions(+), 51 deletions(-) create mode 100644 src/mqt/qecc/circuit_synthesis/definitions.py diff --git a/src/mqt/qecc/circuit_synthesis/circuit_utils.py b/src/mqt/qecc/circuit_synthesis/circuit_utils.py index 445ac4444..8b016b70e 100644 --- a/src/mqt/qecc/circuit_synthesis/circuit_utils.py +++ b/src/mqt/qecc/circuit_synthesis/circuit_utils.py @@ -12,6 +12,8 @@ from qiskit.circuit import QuantumCircuit, QuantumRegister from stim import Circuit +from .definitions import STIM_MEASUREMENTS + def reorder_qubits(circ: QuantumCircuit, qubit_mapping: dict[int, int]) -> QuantumCircuit: """Reorders the qubits in a QuantumCircuit based on the given mapping. @@ -165,3 +167,15 @@ def collect_circuit_layers(circ: Circuit) -> list[Circuit]: circ.pop(gate_idx - n_deleted) return layers + + +def unmeasured_qubits(circ: Circuit) -> list[int]: + """Return a list of qubits that are not measured in circ.""" + measured_qubits: set[int] = set() + + for instr in circ: + if instr.name in STIM_MEASUREMENTS: + measured_qubits.update(q.qubit_value for q in instr.targets_copy()) + + all_qubits = set(range(circ.num_qubits)) + return list(all_qubits - measured_qubits) diff --git a/src/mqt/qecc/circuit_synthesis/definitions.py b/src/mqt/qecc/circuit_synthesis/definitions.py new file mode 100644 index 000000000..098d59b0c --- /dev/null +++ b/src/mqt/qecc/circuit_synthesis/definitions.py @@ -0,0 +1,60 @@ +# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# All rights reserved. +# +# SPDX-License-Identifier: MIT +# +# Licensed under the MIT License + +"""Definitions used in this module.""" + +from __future__ import annotations + +STIM_SQGS = { + "H", + "X", + "Y", + "Z", + "S", + "S_DAG", + "SQRT_X", + "C_XYZ", + "C_ZYX", + "H_XY", + "H_XZ", + "H_YZ", + "SQRT_X_DAG", + "SQRT_Y", + "SQRT_Y_DAG", + "SQRT_Z", + "SQRT_Z_DAG", +} +STIM_TQGS = { + "CNOT", + "CX", + "CXSWAP", + "CY", + "CZ", + "CZSWAP", + "ISWAP", + "ISWAP_DAG", + "SQRT_XX", + "SQRT_XX_DAG", + "SQRT_YY", + "SQRT_YY_DAG", + "SQRT_ZZ", + "SQRT_ZZ_DAG", + "SWAP", + "SWAPCX", + "SWAPCZ", + "XCX", + "XCY", + "XCZ", + "YCX", + "YCY", + "YCZ", + "ZCX", + "ZCY", + "ZCZ", +} +STIM_MEASUREMENTS = {"MR", "MRX", "MRY", "MRZ"} +STIM_RESETS = {"R", "RX", "RY", "RZ"} diff --git a/src/mqt/qecc/circuit_synthesis/noise.py b/src/mqt/qecc/circuit_synthesis/noise.py index 5aac9c29f..f73a25bdd 100644 --- a/src/mqt/qecc/circuit_synthesis/noise.py +++ b/src/mqt/qecc/circuit_synthesis/noise.py @@ -12,56 +12,7 @@ from stim import Circuit, GateTarget from .circuit_utils import collect_circuit_layers - -STIM_SQGS = { - "H", - "X", - "Y", - "Z", - "S", - "S_DAG", - "SQRT_X", - "C_XYZ", - "C_ZYX", - "H_XY", - "H_XZ", - "H_YZ", - "SQRT_X_DAG", - "SQRT_Y", - "SQRT_Y_DAG", - "SQRT_Z", - "SQRT_Z_DAG", -} -STIM_TQGS = { - "CNOT", - "CX", - "CXSWAP", - "CY", - "CZ", - "CZSWAP", - "ISWAP", - "ISWAP_DAG", - "SQRT_XX", - "SQRT_XX_DAG", - "SQRT_YY", - "SQRT_YY_DAG", - "SQRT_ZZ", - "SQRT_ZZ_DAG", - "SWAP", - "SWAPCX", - "SWAPCZ", - "XCX", - "XCY", - "XCZ", - "YCX", - "YCY", - "YCZ", - "ZCX", - "ZCY", - "ZCZ", -} -STIM_MEASUREMENTS = {"MR", "MRX", "MRY", "MRZ"} -STIM_RESETS = {"R", "RX", "RY", "RZ"} +from .definitions import STIM_MEASUREMENTS, STIM_RESETS, STIM_SQGS, STIM_TQGS class NoiseModel: @@ -156,7 +107,7 @@ def apply(self, circ: Circuit) -> Circuit: if any(t in self.ideal_qubits for t in targets): noisy_circ.append_operation(op.name, targets) else: - noisy_circ.append_operation(op.name, targets, p_meas) + noisy_circ.append_operation(op.name, targets, self.p_meas) return noisy_circ diff --git a/test/python/circuit_synthesis/test_utils.py b/test/python/circuit_synthesis/test_utils.py index 19ed9e698..801a386cc 100644 --- a/test/python/circuit_synthesis/test_utils.py +++ b/test/python/circuit_synthesis/test_utils.py @@ -22,6 +22,7 @@ collect_circuit_layers, compact_stim_circuit, qiskit_to_stim_circuit, + unmeasured_qubits, ) from mqt.qecc.circuit_synthesis.state_prep import final_matrix_constraint from mqt.qecc.circuit_synthesis.synthesis_utils import ( @@ -269,3 +270,24 @@ def test_collect_circuit_layers_single_operation() -> None: layers = collect_circuit_layers(circ) assert len(layers) == 1 # One layer with a single operation assert layers[0] == stim.Circuit("H 0") + + +@pytest.mark.parametrize( + ("circuit_operations", "expected_unmeasured"), + [ + ([], []), + ([("H", [0]), ("CX", [0, 1])], [0, 1]), + ([("H", [0]), ("CX", [0, 1]), ("MR", [1])], [0]), + ([("H", [0]), ("CX", [0, 1]), ("MR", [0]), ("MR", [1])], []), + ( + [("H", [i]) for i in range(10)] + [("MR", [2]), ("MR", [5]), ("MR", [7])], + [0, 1, 3, 4, 6, 8, 9], + ), + ], +) +def test_unmeasured_qubits(circuit_operations, expected_unmeasured): + """Parameterized test for unmeasured_qubits.""" + circ = stim.Circuit() + for op, targets in circuit_operations: + circ.append_operation(op, targets) + assert sorted(unmeasured_qubits(circ)) == sorted(expected_unmeasured) From 0764a8855a19b6d9094703b2c273541e5fea8a27 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Mon, 28 Jul 2025 13:28:06 +0200 Subject: [PATCH 110/156] Start refactoring noisy simulation. --- src/mqt/qecc/circuit_synthesis/simulation.py | 215 +++---------------- 1 file changed, 30 insertions(+), 185 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 5f11d9182..454f57892 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -14,22 +14,22 @@ import logging import math from abc import ABC, abstractmethod -from collections import defaultdict from typing import TYPE_CHECKING import matplotlib.pyplot as plt import numpy as np -import stim from qiskit import ClassicalRegister, QuantumCircuit -from qiskit.converters import circuit_to_dag, dag_to_circuit from tqdm import tqdm from ..codes import InvalidCSSCodeError +from .circuit_utils import qiskit_to_stim_circuit, unmeasured_qubits if TYPE_CHECKING: # pragma: no cover import numpy.typing as npt + import stim from ..codes.css_code import CSSCode + from .noise import NoiseModel logger = logging.getLogger(__name__) @@ -39,12 +39,9 @@ class NoisyNDFTStatePrepSimulator(ABC): def __init__( self, - state_prep_circ: QuantumCircuit, + state_prep_circ: QuantumCircuit | stim.Circuit, code: CSSCode, - p: float = 0.0, - p_idle: float | None = None, zero_state: bool = True, - parallel_gates: bool = True, decoder: LutDecoder | None = None, ) -> None: """Initialize the simulator. @@ -52,171 +49,49 @@ def __init__( Args: state_prep_circ: The state preparation circuit. code: The code to simulate. - p: The error rate. - p_idle: Idling error rate. If None, it is set to p. zero_state: Whether the zero state is prepared or nor. - parallel_gates: Whether to allow for parallel execution of gates. decoder: The decoder to use. """ if code.Hx is None or code.Hz is None: msg = "The code must have both X and Z checks." raise InvalidCSSCodeError(msg) - self.circ = state_prep_circ - self.num_verification_qubits = 0 + if isinstance(state_prep_circ, QuantumCircuit): + self.circ = qiskit_to_stim_circuit(state_prep_circ) + else: + self.circ = state_prep_circ.copy() + self.code = code - self.p = p - self.p_idle = p if p_idle is None else p_idle self.zero_state = zero_state - self.parallel_gates = parallel_gates - # Store which measurements are X, Z or data measurements. - # The indices refer to the indices of the measurements in the stim circuit. - self.stim_circ = stim.Circuit() self.data_measurements: list[int] = [] - self.x_measurements: list[int] = [] - self.z_measurements: list[int] = [] - self.parallel_gates = parallel_gates self.n_measurements = 0 - self.stim_circ = stim.Circuit() if decoder is None: self.decoder = LutDecoder(code) else: self.decoder = decoder + self.data_qubits = sorted(unmeasured_qubits(self.circ)) - self.set_p(p, p_idle) - - def set_p(self, p: float, p_idle: float | None = None, error_free_qubits=None) -> int: + def _build_noisy_circuit(self, noise: NoiseModel) -> None: """Set the error rate and initialize the stim circuit. This overwrites the previous stim circuit. Args: - p: The error rate. - p_idle: Idling error rate. If None, it is set to p. + noise: The noise model to apply. """ - if error_free_qubits is None: - error_free_qubits = [] self.n_measurements = 0 - self.p = p - self.p_idle = p if p_idle is None else p_idle - self.stim_circ = self.to_stim_circ(self.circ, error_free_qubits=error_free_qubits) - n_measurements = self._compute_postselection_indices() - if self.zero_state: - self.data_measurements = self.measure_z(self.stim_circ, n_measurements) - else: - self.data_measurements = self.measure_x(self.stim_circ, n_measurements) - n_measurements += self.code.n - - @abstractmethod - def _compute_postselection_indices(self) -> int: - """Compute indices of measurements for postselection. - - Returns: - int: The number of measurements. - """ - def to_stim_circ(self, circ: QuantumCircuit, error_free_qubits=None) -> stim.Circuit: - """Convert a QuantumCircuit to a noisy STIM circuit. + self._noisy_circ = noise.apply(self.circ) - A depolarizing error model is used: - - Single-qubit gates and idling qubits are followed by a single-qubit Pauli error with probability 2/9 p. This reflects the fact that two-qubit gates are more likely to fail. - - Two-qubit gates are followed by a two-qubit Pauli error with probability p/15. - - Measurements flip with a probability of 2/3 p. - - Qubit are initialized in the -1 Eigenstate with probability 2/3 p. - """ - if error_free_qubits is None: - error_free_qubits = [] - initialized = [False for _ in circ.qubits] - stim_circuit = stim.Circuit() - ctrls = [] - - def idle_error(used_qubits: list[int]) -> None: - for q in circ.qubits: - qubit = circ.find_bit(q)[0] - if initialized[qubit] and qubit not in used_qubits and qubit not in error_free_qubits: - stim_circuit.append_operation("DEPOLARIZE1", [circ.find_bit(q)[0]], [self.p_idle]) - - dag = circuit_to_dag(circ) - layers = dag.layers() - used_qubits: list[int] = [] - targets = set() - defaultdict(int) - [False for _ in circ.qubits] - for layer in layers: - layer_circ = dag_to_circuit(layer["graph"]) - - # Apply idling errors to all qubits that were unused in the previous layer - if len(used_qubits) > 0: - idle_error(used_qubits) - - used_qubits = [] - for gate in layer_circ.data: - if gate.operation.name == "h": - qubit = circ.find_bit(gate.qubits[0])[0] - ctrls.append(qubit) - if initialized[qubit]: - stim_circuit.append_operation("H", [qubit]) - if not self.parallel_gates: - idle_error([qubit]) - else: - used_qubits.append(qubit) - - elif gate.operation.name == "cx": - ctrl = circ.find_bit(gate.qubits[0])[0] - target = circ.find_bit(gate.qubits[1])[0] - targets.add(target) - if not initialized[ctrl]: - if ctrl in ctrls: - stim_circuit.append_operation("H", [ctrl]) - if ctrl not in error_free_qubits: - stim_circuit.append_operation( - "Z_ERROR", [ctrl], [2 * self.p / 3] - ) # Wrong initialization - elif ctrl not in error_free_qubits: - stim_circuit.append_operation("X_ERROR", [ctrl], [2 * self.p / 3]) # Wrong initialization - initialized[ctrl] = True - if not initialized[target]: - if target not in error_free_qubits: - stim_circuit.append_operation("X_ERROR", [target], [2 * self.p / 3]) # Wrong initialization - if target in ctrls: - stim_circuit.append_operation("H", [target]) - initialized[target] = True - - stim_circuit.append_operation("CX", [ctrl, target]) - if ctrl not in error_free_qubits and target not in error_free_qubits: - stim_circuit.append_operation("DEPOLARIZE2", [ctrl, target], [self.p]) - if not self.parallel_gates: - idle_error([ctrl, target]) - else: - used_qubits.extend([ctrl, target]) - - elif gate.operation.name == "measure": - anc = circ.find_bit(gate.qubits[0])[0] - if anc not in error_free_qubits: - stim_circuit.append_operation("X_ERROR", [anc], [2 * self.p / 3]) - stim_circuit.append_operation("MR", [anc]) - if not self.parallel_gates: - idle_error([anc]) - else: - used_qubits.append(anc) - initialized[anc] = False - - return stim_circuit - - def measure_z(self, circ: stim.Circuit, measurement_index: int, data_index: int = 0) -> list[int]: - """Measure all data qubits in the Z basis.""" - data_measurements = [measurement_index + i for i in range(self.code.n)] - circ.append_operation("MRZ", list(range(data_index, data_index + self.code.n))) - return data_measurements - - def measure_x(self, circ: stim.Circuit, measurement_index: int, data_index: int = 0) -> list[int]: - """Measure all data qubits in the X basis.""" - data_measurements = [measurement_index + i for i in range(self.code.n)] - circ.append_operation("MRX", list(range(data_index, data_index + self.code.n))) - return data_measurements + if self.zero_state: + self.data_measurements = self._noisy_circ.append("MR", self.data_qubits) + else: + self.data_measurements = self._noisy_circ.append("MRX", self.data_qubits) + self.data_measurements = self.circ.num_measurements - self.code.n def logical_error_rate( self, + noise: NoiseModel, shots: int = 100000, shots_per_batch: int = 100000, at_least_min_errors: bool = True, @@ -225,11 +100,13 @@ def logical_error_rate( """Estimate the logical error rate of the code. Args: + noise: The noise model to apply. shots: The number of shots to use. shots_per_batch: The number of shots per batch. at_least_min_errors: Whether to continue simulating until at least min_errors are found. min_errors: The minimum number of errors to find before stopping. """ + self._build_noisy_circuit(noise) batch = min(shots_per_batch, shots) p_l = 0.0 r_a = 0.0 @@ -243,7 +120,8 @@ def logical_error_rate( self.decoder.generate_z_lut() i = 1 - while i <= int(np.ceil(shots / batch)) or at_least_min_errors: + total_batches = int(np.ceil(shots / batch)) + while i <= total_batches or at_least_min_errors: num_logical_errors_batch, discarded_batch = self._simulate_batch(batch) logger.info( @@ -264,6 +142,7 @@ def logical_error_rate( return p_l / self.code.k, r_a, num_logical_errors, i * batch + @abstractmethod def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: """Filter samples based on measurement outcomes. @@ -275,7 +154,7 @@ def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: """ def _simulate_batch(self, shots: int = 1024) -> tuple[int, int]: - sampler = self.stim_circ.compile_sampler() + sampler = self._noisy_circ.compile_sampler() detection_events = sampler.sample(shots).astype(np.int8) filtered_events = self._filter_runs(detection_events) @@ -320,7 +199,7 @@ def plot_state_prep( p_ls = [] r_as = [] for p in ps: - self.set_p(p, p_idle_factor * p) + self._build_noisy_circuit(p, p_idle_factor * p) p_l, r_a, _num_logical_errors, _num_shots = self.logical_error_rate(min_errors=min_errors) p_ls.append(p_l) r_as.append(r_a) @@ -353,10 +232,7 @@ def __init__( self, state_prep_circ: QuantumCircuit, code: CSSCode, - p: float = 0.0, - p_idle: float | None = None, zero_state: bool = True, - parallel_gates: bool = True, decoder: LutDecoder | None = None, ) -> None: """Initialize the simulator. @@ -367,35 +243,11 @@ def __init__( p: The error rate. p_idle: Idling error rate. If None, it is set to p. zero_state: Whether the zero state is prepared or nor. - parallel_gates: Whether to allow for parallel execution of gates. decoder: The decoder to use. """ self.z_verification_measurements: list[int] = [] self.x_verification_measurements: list[int] = [] - super().__init__(state_prep_circ, code, p, p_idle, zero_state, parallel_gates, decoder) - - def _compute_postselection_indices(self) -> int: - """Compute the indices of the verification measurements.""" - dag = circuit_to_dag(self.circ) - layers = dag.layers() - targets = set() - n_measurements = 0 - for layer in layers: - layer_circ = dag_to_circuit(layer["graph"]) - - for gate in layer_circ.data: - if gate.operation.name == "cx": - target = self.circ.find_bit(gate.qubits[1])[0] - targets.add(target) - - elif gate.operation.name == "measure": - anc = self.circ.find_bit(gate.qubits[0])[0] - if anc in targets: - self.z_verification_measurements.append(n_measurements) - else: - self.x_verification_measurements.append(n_measurements) - n_measurements += 1 - return n_measurements + super().__init__(state_prep_circ, code, zero_state, decoder) def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: """Filter samples based on measurement outcomes. @@ -406,8 +258,7 @@ def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: Returns: npt.NDArray[np.int8]: The filtered samples. """ - verification_measurements = self.x_verification_measurements + self.z_verification_measurements - index_array = np.where(np.all(samples[:, verification_measurements] == 0, axis=1))[0] + index_array = np.where(np.all(samples[:, self.circ.num_measurements] == 0, axis=1))[0] return samples[index_array].astype(np.int8) @@ -424,10 +275,7 @@ def __init__( code: CSSCode, circ3: QuantumCircuit | None = None, circ4: QuantumCircuit | None = None, - p: float = 0.0, - p_idle: float | None = None, zero_state: bool = True, - parallel_gates: bool = True, decoder: LutDecoder | None = None, check_circuit: QuantumCircuit | None = None, ) -> None: @@ -444,10 +292,7 @@ def __init__( circ3: The third, state preparation circuit. circ4: The fourth, state preparation circuit code: The code to simulate. - p: The error rate. - p_idle: Idling error rate. If None, it is set to p. zero_state: Whether the zero state is prepared or nor. - parallel_gates: Whether to allow for parallel execution of gates. decoder: The decoder to use. check_circuit: Circuit used for checking error rates for the error type that cannot form a logical error on the synthesized state. """ @@ -510,7 +355,7 @@ def __init__( self.x_checks = code.Hx if zero_state else np.vstack((code.Hx, code.Lx)) self.z_checks = code.Hz if not zero_state else np.vstack((code.Hz, code.Lz)) self.secondary_error_gadget = None - super().__init__(combined, code, p, p_idle, zero_state, parallel_gates, decoder) + super().__init__(combined, code, zero_state, decoder) if check_circuit is None: return @@ -556,7 +401,7 @@ def set_p(self, p: float, p_idle: float | None = None, error_free_qubits=None) - """ if error_free_qubits is None: error_free_qubits = [] - super().set_p(p, p_idle, error_free_qubits) + super()._build_noisy_circuit(p, p_idle, error_free_qubits) if self.secondary_error_gadget is None: return self.secondary_stim_circ = self.to_stim_circ( From 77345282165a24ef466a6db0db213301a1e33d83 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 28 Jul 2025 12:32:15 +0100 Subject: [PATCH 111/156] remove linter flag T201 for avoiding print removal --- pyproject.toml | 1 - .../simulators/analog_tannergraph_decoding.py | 2 +- .../simulators/quasi_single_shot_v2.py | 2 +- .../qecc/analog_information_decoding/simulators/simulation.py | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5ca55ae1b..954770671 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -218,7 +218,6 @@ ignore = [ "PLR2004", # Magic value used in comparison "PLC0415", # Import should be at top of file "S101", # Use of assert detected - "T201", # avoid removing print statements ] isort.required-imports = ["from __future__ import annotations"] diff --git a/src/mqt/qecc/analog_information_decoding/simulators/analog_tannergraph_decoding.py b/src/mqt/qecc/analog_information_decoding/simulators/analog_tannergraph_decoding.py index 0455444a9..907ced13e 100644 --- a/src/mqt/qecc/analog_information_decoding/simulators/analog_tannergraph_decoding.py +++ b/src/mqt/qecc/analog_information_decoding/simulators/analog_tannergraph_decoding.py @@ -254,7 +254,7 @@ def run(self, samples: int) -> dict[str, Any]: self.code_params, self.eb_precision, ): - print("Result has converged.") + print("Result has converged.") # noqa: T201 break x_ler, x_ler_eb, x_wer, x_wer_eb = calculate_error_rates(x_success_cnt, runs, self.code_params) diff --git a/src/mqt/qecc/analog_information_decoding/simulators/quasi_single_shot_v2.py b/src/mqt/qecc/analog_information_decoding/simulators/quasi_single_shot_v2.py index 461e7e5ae..67c651ca4 100644 --- a/src/mqt/qecc/analog_information_decoding/simulators/quasi_single_shot_v2.py +++ b/src/mqt/qecc/analog_information_decoding/simulators/quasi_single_shot_v2.py @@ -290,6 +290,6 @@ def run(self, samples: int = 1) -> dict[str, Any]: if run % self.save_interval == 1: self._save_results(success_cnt, run) if _check_convergence(success_cnt, run, self.code_params, self.eb_precision): - print("Converged") + print("Converged") # noqa: T201 break return self._save_results(success_cnt, run) diff --git a/src/mqt/qecc/analog_information_decoding/simulators/simulation.py b/src/mqt/qecc/analog_information_decoding/simulators/simulation.py index 06cce4d7d..66605687f 100644 --- a/src/mqt/qecc/analog_information_decoding/simulators/simulation.py +++ b/src/mqt/qecc/analog_information_decoding/simulators/simulation.py @@ -742,7 +742,7 @@ def run(self, samples: int) -> dict[str, Any]: self.code_params, self.eb_precision, ): - print("Result has converged.") + print("Result has converged.") # noqa: T201 break x_ler, x_ler_eb, x_wer, x_wer_eb = calculate_error_rates(x_success_cnt, runs, self.code_params) From 597e51e3655008810e005f1469b22a6530f34398 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 28 Jul 2025 12:40:50 +0100 Subject: [PATCH 112/156] remove automorphism functionality from CSSCode class --- src/mqt/qecc/codes/css_code.py | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/src/mqt/qecc/codes/css_code.py b/src/mqt/qecc/codes/css_code.py index f109a5394..7ffcbebf0 100644 --- a/src/mqt/qecc/codes/css_code.py +++ b/src/mqt/qecc/codes/css_code.py @@ -14,7 +14,6 @@ import numpy as np from ldpc import mod2 -from sympy.combinatorics import Permutation, PermutationGroup from .pauli import StabilizerTableau from .stabilizer_code import StabilizerCode @@ -81,25 +80,6 @@ def __init__( self.Lx = CSSCode._compute_logical(self.Hz, self.Hx) self.Lz = CSSCode._compute_logical(self.Hx, self.Hz) - self._automorphism_generators: list[Permutation] = [] - self._automorphism_group: list[Permutation] = [] - - @property - def automorphism_group(self) -> list[Permutation]: - """Property for the automorphism group.""" - return self._automorphism_group - - @automorphism_group.setter - def automorphism_group(self, generators: list[list[int]]) -> None: - self._automorphism_generators = [Permutation(generator) for generator in generators] - g = PermutationGroup(self._automorphism_generators) - self._automorphism_group = list(g.generate()) - - @property - def automorphism_generators(self) -> list[Permutation]: - """Property for the automorphism generators.""" - return self._automorphism_generators - def x_checks_as_pauli_strings(self) -> list[str]: """Return the x checks as Pauli strings.""" return ["".join("X" if bit == 1 else "I" for bit in row) for row in self.Hx] From c2efbd9e1ce282e8d5fc169be7ea51a8160caa43 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 28 Jul 2025 12:57:34 +0100 Subject: [PATCH 113/156] remove sympy dependency from pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 954770671..10cebd721 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -156,7 +156,7 @@ exclude = [ [[tool.mypy.overrides]] module = ["qiskit.*", "qecsim.*", "qiskit_aer.*", "matplotlib.*", "scipy.*", "ldpc.*", "pytest_console_scripts.*", - "z3.*", "bposd.*", "numba.*", "pymatching.*", "stim.*", "multiprocess.*", "sinter.*", "qsample.*", "pandas.*", "sympy.*"] + "z3.*", "bposd.*", "numba.*", "pymatching.*", "stim.*", "multiprocess.*", "sinter.*", "qsample.*", "pandas.*"] ignore_missing_imports = true From 31a9c8dbac0ef7ff1fc9a8d09506426ddaf733b5 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Mon, 28 Jul 2025 13:04:54 +0100 Subject: [PATCH 114/156] delete stateprep docs (previously removed on the master) --- docs/StatePrep.ipynb | 441 ------------------------------------- docs/library/StatePrep.rst | 49 ----- 2 files changed, 490 deletions(-) delete mode 100644 docs/StatePrep.ipynb delete mode 100644 docs/library/StatePrep.rst diff --git a/docs/StatePrep.ipynb b/docs/StatePrep.ipynb deleted file mode 100644 index 8e7c6e4e5..000000000 --- a/docs/StatePrep.ipynb +++ /dev/null @@ -1,441 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "26db7b98-afc0-48d5-846b-e4fb1fe9e6f4", - "metadata": {}, - "source": [ - "# Fault tolerant state preparation of Pauli eigenstates for CSS codes\n", - "\n", - "The QECC package contains functionality for synthesizing and simulating fault tolerant and non-fault tolerant state preparation circuits for Pauli eigenstates of CSS codes.\n", - "Currently it supports synthesizing circuits for preparing the $|0\\rangle_L^k$ and $|+\\rangle_L^k$ states of arbitrary $[[n,k,d]]$ CSS codes.\n", - "\n", - "## Synthesizing non-FT state preparation circuits\n", - "\n", - "A non-fault tolerant preparation circuit can be generated directly from a CSS code. Let's consider the [Steane code](https://errorcorrectionzoo.org/c/steane) which is a $[[7, 1, 3]]$ color code." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f556173a-1657-403f-8226-bdb565c9b8ee", - "metadata": {}, - "outputs": [], - "source": [ - "from mqt.qecc import CSSCode\n", - "\n", - "steane_code = CSSCode.from_code_name(\"Steane\")\n", - "print(steane_code.stabs_as_pauli_strings())" - ] - }, - { - "cell_type": "markdown", - "id": "b8e3bf10-7253-40f6-9b5d-ad6b85df6876", - "metadata": {}, - "source": [ - "A state preparation circuit for the logical $|0\\rangle_L$ of this code is a circuit that generates a state that is stabilized by all of the above Pauli operators and the logical $Z_L$ operator of the Steane code. \n", - "\n", - "The code is small enough that we can generate a CNOT-optimal state preparation circuit for it:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "35cc5bff-74cf-4ebc-be24-bc614b08a15f", - "metadata": {}, - "outputs": [], - "source": [ - "from mqt.qecc.circuit_synthesis import gate_optimal_prep_circuit\n", - "\n", - "non_ft_sp = gate_optimal_prep_circuit(steane_code, zero_state=True, max_timeout=2)\n", - "\n", - "non_ft_sp.circ.draw(output=\"mpl\", initial_state=True)" - ] - }, - { - "cell_type": "markdown", - "id": "a648f3c7-1002-423d-99b9-f4d15b0d4cc3", - "metadata": {}, - "source": [ - "We see that the minimal number of CNOTs required to prepare the logical $|0\\rangle_L$ circuit of the Steane code is $8$.\n", - "\n", - "## Synthesizing FT state preparation circuits\n", - "The circuit above is not fault-tolerant. For example, an $X$ error on qubit $q_1$ before the last CNOT propagates to a weight $2$ X error on $q_1$ and $q_2$. This is to be expected since we apply two-qubit gates between the qubits of a single logical qubit. \n", - "\n", - "A common method to turn a non-FT protocol into a fault tolerant one is through post-selection. We can try to detect whether an error was propagated through the circuit and restart the preparation in case of a detection event. A circuit performing such measurements is called a *verification circuit*. \n", - "\n", - "Verification circuits need to be carefully constructed such that only stabilizers of the code are measured and no more measurements are performed than necessary. Finding good verification circuits is NP-complete.\n", - "\n", - "QECC can automatically generate optimal verification circuits." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "edb629ed-50d2-4be0-9345-d938c316a9ac", - "metadata": {}, - "outputs": [], - "source": [ - "from mqt.qecc.circuit_synthesis import gate_optimal_verification_circuit\n", - "\n", - "ft_sp = gate_optimal_verification_circuit(non_ft_sp)\n", - "\n", - "ft_sp.draw(output=\"mpl\", initial_state=True)" - ] - }, - { - "cell_type": "markdown", - "id": "9fd98702-1505-4f7e-a5d9-8510d36ec78b", - "metadata": {}, - "source": [ - "We have just automatically generated the known FT state preparation circuit for the Steane\n", - "code: [^1]. We see that if an X error happens on qubit $q_1$ before the last CNOT causes the verification circuit to measure a $-1$. \n", - "\n", - "## Simulating state preparation circuits\n", - "\n", - "If we want to see the probability of a logical error happening after post-selecting, QECC provides simulation utilities that can quickly generate results. We can simulate the non-FT and FT circuits and compare the results.\n", - "\n", - "[^1]: https://www.nature.com/articles/srep19578" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9ccb7239-c669-432e-b195-b8f0887c83a3", - "metadata": {}, - "outputs": [], - "source": [ - "from mqt.qecc.circuit_synthesis import VerificationNDFTStatePrepSimulator\n", - "\n", - "p = 0.05\n", - "\n", - "non_ft_simulator = VerificationNDFTStatePrepSimulator(non_ft_sp.circ, code=steane_code, zero_state=True, p=p)\n", - "ft_simulator = VerificationNDFTStatePrepSimulator(ft_sp, code=steane_code, zero_state=True, p=p)\n", - "\n", - "\n", - "pl_non_ft, ra_non_ft, _, _ = non_ft_simulator.logical_error_rate(min_errors=10)\n", - "pl_ft, ra_ft, _, _ = ft_simulator.logical_error_rate(min_errors=10)\n", - "\n", - "print(f\"Logical error rate for non-FT state preparation: {pl_non_ft}\")\n", - "print(f\"Logical error rate for FT state preparation: {pl_ft}\")" - ] - }, - { - "cell_type": "markdown", - "id": "56258f47-3a31-4b95-a374-9b4d0725551a", - "metadata": {}, - "source": [ - "The error rates seem quite close to each other. To properly judge the fault tolerance of the circuits we want to look at how the logical error rate scales with the physical error rate." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3514dc4d-9346-4a60-b685-45241068585c", - "metadata": {}, - "outputs": [], - "source": [ - "ps = [0.1, 0.05, 0.01, 0.008, 0.006, 0.004, 0.002, 0.001]\n", - "\n", - "non_ft_simulator.plot_state_prep(ps, min_errors=50, name=\"non-FT\", p_idle_factor=0.01)\n", - "ft_simulator.plot_state_prep(ps, min_errors=50, name=\"FT\", p_idle_factor=0.01)" - ] - }, - { - "cell_type": "markdown", - "id": "d0e7d899-aa16-4252-8186-485465483df6", - "metadata": {}, - "source": [ - "Indeed we observe a quadratic scaling for the fault tolerant state preparation circuit while the logical error rate scales linearly for the non-fault tolerant state preparation.\n", - "\n", - "## Beyond distance 3\n", - "\n", - "Distance 3 circuits are particularly simple for fault tolerant state preparation because for the $|0\\rangle_L$ we can completely ignore Z errors. Due to error degeneracy any Z error is equivalent to a weight 1 or 0 error. \n", - "\n", - "Additionally one has to pay special attention to the order of measurements in the verification circuits when more than one independent error in the state preparation circuit is considered. \n", - "\n", - "Because both error types are considered, the verification circuit now measures both X- and Z-stabilizers. Unfortunately a Z error in an X measurement can propagate to the data qubits and vice versa for Z measurements. Therefore, if we check for Z errors after we have checked for X errors the measurements might introduce more X errors on the data qubits. We can check those again but that would just turn the situation around; now Z errors can propagate to the data qubits.\n", - "\n", - "Detecting such *hook errors* can be achieved via flag-fault tolerant stabilizer measurements [^2]. Usually, information from such hook errors is used to augment an error correction scheme. But we can also use these flags as additional measurements on which we post-select. If one of the flags triggers, this indicates that a hook error happened and we reset.\n", - "\n", - "By default QECC automatically performs such additional measurements when necessary. The general construction is sketched in the following figure.\n", - "\n", - "\"Construction\n", - "\n", - "Let's consider a larger code to illustrate the point. The [square-octagon color code](https://errorcorrectionzoo.org/c/488_color) is defined on the following lattice:\n", - "\n", - "\"Square-Octagon\n", - "\n", - "The distance 5 code uses 17 qubits from this lattice, i.e., we have a $[[17, 1, 5]]$ CSS code. Given the size of the code, synthesizing an optimal state preparation circuit might take a long time. QECC also has a fast heuristic state preparation circuit synthesis.\n", - "\n", - "[^2]: https://arxiv.org/abs/1708.02246" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e77aa2f2-4920-4e1c-a84f-8511053a07b5", - "metadata": {}, - "outputs": [], - "source": [ - "from mqt.qecc.circuit_synthesis import heuristic_prep_circuit\n", - "from mqt.qecc.codes import SquareOctagonColorCode\n", - "\n", - "cc = SquareOctagonColorCode(5)\n", - "cc_non_ft_sp = heuristic_prep_circuit(cc, zero_state=True, optimize_depth=True)\n", - "\n", - "cc_non_ft_sp.circ.draw(output=\"mpl\", initial_state=True, scale=0.7)" - ] - }, - { - "cell_type": "markdown", - "id": "6f29ff66-836e-4d11-ab8e-860325bdd7a9", - "metadata": {}, - "source": [ - "Even though optimal state preparation circuit synthesis seems out of range we can still synthesize good verification circuits in a short time if we give an initial guess on how many measurements we will need." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6c43c729-d303-4d99-b519-aa87a9fb2342", - "metadata": {}, - "outputs": [], - "source": [ - "cc_ft_sp = gate_optimal_verification_circuit(cc_non_ft_sp, max_timeout=2, max_ancillas=3)\n", - "\n", - "cc_ft_sp.draw(output=\"mpl\", initial_state=True, fold=-1, scale=0.2)" - ] - }, - { - "cell_type": "markdown", - "id": "2af33324-99db-48b0-aef8-4ef93546d3b1", - "metadata": {}, - "source": [ - "We see that the overhead for the verification overshadows the state preparation by a large margin. But this verification circuit is still much smaller than the naive variant of post-selecting on the stabilizer generators of the code." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b16d84d5-3b82-4f0c-8aef-3a35f54d547d", - "metadata": {}, - "outputs": [], - "source": [ - "from mqt.qecc.circuit_synthesis import naive_verification_circuit\n", - "\n", - "cc_ft_naive = naive_verification_circuit(cc_non_ft_sp)\n", - "\n", - "print(f\"CNOTs required for naive FT state preparation: {cc_ft_naive.num_nonlocal_gates()}\")\n", - "print(f\"CNOTs required for optimized FT state preparation: {cc_ft_sp.num_nonlocal_gates()}\")" - ] - }, - { - "cell_type": "markdown", - "id": "7be705a4-7732-43d5-b4e2-c13619e99703", - "metadata": {}, - "source": [ - "We expect that the distance 5 color code should be prepared with a better logical error rate than the Steane code. And this is indeed the case:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c81d9f32-af86-4388-9915-6d5be01efce3", - "metadata": {}, - "outputs": [], - "source": [ - "cc_simulator = VerificationNDFTStatePrepSimulator(cc_ft_sp, code=cc, zero_state=True)\n", - "\n", - "ps = [0.1, 0.05, 0.04, 0.03, 0.02, 0.01, 0.009, 0.008]\n", - "\n", - "ft_simulator.plot_state_prep(\n", - " ps, min_errors=50, name=\"Distance 3\", p_idle_factor=0.01\n", - ") # simulate Steane code as comparison\n", - "cc_simulator.plot_state_prep(ps, min_errors=50, name=\"Distance 5\", p_idle_factor=0.01)" - ] - }, - { - "cell_type": "markdown", - "id": "81eec694ef6af97a", - "metadata": {}, - "source": [ - "## Deterministic state preparation ($d < 5$)\n", - "A possible disadvantage of the above approach is that the verification circuits are non-deterministic. This means that we potentially have to run the circuit multiple times to successfully prepare the state. This can be circumvented by using the information gained from the verification measurements to possibly identify the dangerous error and correct it. If this this is done for every possible (single) error, we refer to the state preparation as deterministic [^1].\n", - "\n", - "For small codes ($d < 5$ i.e. we need to consider only a single error) this problem is still tractable and can be solved in an optimal way using satisfiability solvers. QECC can automatically generate deterministic state preparation circuits for such codes.\n", - "\n", - "[^1]: https://arxiv.org/abs/2301.10017\n", - "\n", - "For this we come back to our $d=3$ Steane code. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2373b4ee6cee29d", - "metadata": {}, - "outputs": [], - "source": [ - "non_ft_sp.circ.draw(output=\"mpl\", initial_state=True)" - ] - }, - { - "cell_type": "markdown", - "id": "6c8eecaac4df6b88", - "metadata": {}, - "source": [ - "And initialize an instance of the deterministic verification helper class to facilitate the generation of the deterministic FT state preparation circuit." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1877841300be6d01", - "metadata": {}, - "outputs": [], - "source": [ - "from mqt.qecc.circuit_synthesis import DeterministicVerificationHelper\n", - "\n", - "det_helper = DeterministicVerificationHelper(non_ft_sp)" - ] - }, - { - "cell_type": "markdown", - "id": "40c9070837bcd21", - "metadata": {}, - "source": [ - "Calling the `get_solution` method will generate the non-deterministic verification circuit using either the optimal or the heuristic method discussed above. The deterministic verification circuit, separated into X and Z correction layers) is then generated using the satisfiability solver." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3c83621b4ca7a1a1", - "metadata": {}, - "outputs": [], - "source": [ - "det_verify = det_helper.get_solution(use_optimal_verification=True)\n", - "det_verify_x, det_verify_z = det_verify" - ] - }, - { - "cell_type": "markdown", - "id": "15b8f7d65e69be64", - "metadata": {}, - "source": [ - "Such a `DeterministicVerification` object contains the stabilizer measurements for the non-deterministic verification circuit, the stabilizer measurements for the different deterministic verification circuits, depending on the non-deterministic measurement outcomes, and the final correction Pauli operators that need to be applied to the data qubits.\n", - "\n", - "The non-deterministic verification measurements are stored in the `stabs` attribute as a list of numpy arrays where each array represents a stabilizer measurement.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "75ac41577e4c0296", - "metadata": {}, - "outputs": [], - "source": [ - "det_verify_x.stabs" - ] - }, - { - "cell_type": "markdown", - "id": "ddecefba679c91c1", - "metadata": {}, - "source": [ - "The deterministic verification measurements are stored in the `det_stabs` attribute as a dictionary where the keys are the non-deterministic measurement outcomes (converted to int) and the values is a tuple with the first element being the deterministic stabilizer measurements and the second element being again a dictionary with the Pauli corrections for the deterministic measurement outcomes.\n", - "\n", - "For example for the Steane code whenever the non-deterministic verification triggers (1) the logical operator on qubits 2,3,6 hast to measured. If the outcome is 1, a Pauli correction on qubit 3 has to be applied, otherwise no correction is necessary." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "45c29390eb2eb0e4", - "metadata": {}, - "outputs": [], - "source": [ - "det_verify_x.det_correction" - ] - }, - { - "cell_type": "markdown", - "id": "42c85a709d72bf40", - "metadata": {}, - "source": [ - "For the case where the non-deterministic verification measurements need to be flagged (not the case for the Steane code), the `hook_corrections` attribute contains the additional stabilizer measurements and corrections in the same format as the `det_stabs` attribute." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ab975d4c4a1c11b7", - "metadata": {}, - "outputs": [], - "source": [ - "det_verify_x.hook_corrections" - ] - }, - { - "cell_type": "markdown", - "id": "d4527b797f83f919", - "metadata": {}, - "source": [ - "### Simulating deterministic state preparation circuits with Qsample\n", - "The resulting `DeterministicVerification` object can be used to directly simulate the deterministic state preparation circuit using the [Qsample](https://github.com/dpwinter/qsample) under the hood. The `NoisyDFTStatePrepSimulator` class automatically constructs a valid Qsample protocol containing the correct circuits and conditional paths to simulate the deterministic state preparation. The passed Error Model and simulation parameters are directly passed to Qsample and explained in the [Qsample documentation](https://dpwinter.github.io/qsample/). Similarly also the Qsample callbacks can be used to e.g. directly plot the logical error rates, showing the expected quadratic scaling." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "90f4d2760bc20453", - "metadata": {}, - "outputs": [], - "source": [ - "from qsample import callbacks, noise\n", - "\n", - "from mqt.qecc.circuit_synthesis import NoisyDFTStatePrepSimulator\n", - "\n", - "error_model = noise.E1_1 # depolarizing error model\n", - "err_params = {\"q\": [1e-4, 5e-4, 1e-3, 5e-3, 1e-2, 5e-2, 1e-1, 5e-1]}\n", - "shots_dss = 2000\n", - "p_max = {\"q\": 0.01}\n", - "L = 1\n", - "\n", - "qsample_sim = NoisyDFTStatePrepSimulator(non_ft_sp.circ, det_verify, steane_code, error_model)\n", - "sampling_stats = qsample_sim.dss_logical_error_rates(err_params, p_max, L, shots_dss, callbacks=[callbacks.PlotStats()])" - ] - }, - { - "cell_type": "markdown", - "id": "f9ad305e-929f-470f-86c5-e3e958750539", - "metadata": {}, - "source": [ - "# Circuits and Evaluations\n", - "\n", - "The circuits and benchmark scripts used for our non-deterministic work https://arxiv.org/abs/2408.11894, can be found [here](https://github.com/cda-tum/mqt-qecc/tree/main/scripts/ft_stateprep/eval) and for the deterministic work [here](https://github.com/cda-tum/mqt-qecc/tree/main/scripts/ft_stateprep/eval_det)." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/library/StatePrep.rst b/docs/library/StatePrep.rst deleted file mode 100644 index f75a77ff5..000000000 --- a/docs/library/StatePrep.rst +++ /dev/null @@ -1,49 +0,0 @@ -Fault tolerant state preparation -================================ - -QECC provides functionality to synthesize and simulate state preparation circuits for logical basis states for arbitrary :math:`[[n, k, d]]` quantum CSS codes. - - .. currentmodule:: mqt.qecc.circuit_synthesis - -Non-fault tolerant state preparation circuits can be synthesized using :func:`depth_optimal_prep_circuit`, :func:`gate_optimal_prep_circuit` and :func:`heuristic_prep_circuit`. - - .. autofunction:: depth_optimal_prep_circuit - - .. autofunction:: gate_optimal_prep_circuit - - .. autofunction:: heuristic_prep_circuit - -These methods return a :class:`StatePrepCircuit` from which the circuit can be obtained as a qiskit :code:`QuantumCircuit` object via the :code:`circ` member. The :class:`StatePrepCircuit` class contains methods for computing the state preparation circuit's fault set. :class:`StatePrepCircuit` are given as input to the verification circuit synthesis methods which add verification measurements to the circuit such that postselection on +1 measurement results of these circuit outputs a state with a logical error rate on the order of :math:`O(p^{\frac{d}{2}})`. - -Gate-optimal verification circuits can be generated using the :func:`gate_optimal_verification_circuit` method. This method uses the SMT solver `Z3 `_ for iteratively searching for better verification circuits. The search is guided by a :code:`min_timeout` and :code:`max_timeout` parameter. Initially, the search is only allowed to continue for the minimal amount of time. This time budget is successively increased until a solution is found. At this point the maximum number of CNOTs is reduced until the synthesis takes :code:`max_timeout` time or if the SAT solver manages to prove that no smaller circuit exists. - - .. autofunction:: gate_optimal_verification_circuit - -If the optimal synthesis takes too long, the :func:`heuristic_verification_circuit` method can be used. This method reduces the synthesis of state preparation circuits to a set cover problem. Quality of solution can be traded with performance via the :code:`max_covering_sets` parameter. The smaller this parameter is set the lower the number of sets from which a covering is obtained. - - .. autofunction:: heuristic_verification_circuit - -State preparation circuits can be simulated using the :class:`VerificationNDFTStatePrepSimulator` class. - - .. autoclass:: VerificationNDFTStatePrepSimulator - :members: - -:math:`d<5` codes ---------------------------------------------------------- -For small distance codes QECC provides functionality to not only synthesize state preparation circuits based on post-selection but also preparation protocols that yield the logical Pauli state deterministically. -Such a deterministic protocol consists of three parts: (1) a (non-deterministic) verification, (2) a deterministic correction if one of the verification measurements yields a non-trivial result, and (3) a hook correction for the case that one of the verification measurement flags indicates a hook error. -To facilitate the handling (e.g. collecting statistics regarding ancilla and CNOT count) QECC provides the :class:`DeterministicVerification` class. - - .. autoclass:: DeterministicVerification - :members: - -The :class:`DeterministicVerification` for a certain :class:`StatePrepCircuit` can be obtained using the wrapper class :class:`DeterministicVerificationHelper` which provides the two functions :func:`get_solution` and :func:`get_global_solution` where the latter optimizes over all possible(*potentially exponentially many*) non-deterministic verifications to find the global optimum (recommended only for codes with small qubit number). -The two :class:`DeterministicVerification` objects returned correspond to the two layers of verification (X and Z errors). - - .. autoclass:: DeterministicVerificationHelper - :members: -The resulting protocol consisting of the two-layered verification can be converted to a `Qsample `_ protocol and simulated using Dynamic Subset Sampling :cite:labelpar:`heussenDynamicalSubsetSampling2024`. -The protocol construction and simulation is done automatically by the :class:`NoisyDFTStatePrepSimulator` class where the returned numbers correspond to the upper and lower bounds with corresponding errors as described at the `Qsample Documentation `_. - - .. autoclass:: NoisyDFTStatePrepSimulator - :members: From 971c6ffefef6e6e8807416d6554cf2c04205d860 Mon Sep 17 00:00:00 2001 From: Tom Peham Date: Tue, 29 Jul 2025 10:49:08 +0200 Subject: [PATCH 115/156] Refactor Simulation functionality. --- pyproject.toml | 3 +- .../qecc/circuit_synthesis/circuit_utils.py | 22 +- src/mqt/qecc/circuit_synthesis/noise.py | 83 +- src/mqt/qecc/circuit_synthesis/simulation.py | 503 +- .../circuit_synthesis/test_simulation.py | 48 +- test/python/circuit_synthesis/test_utils.py | 32 + uv.lock | 4152 ++++++++--------- 7 files changed, 2442 insertions(+), 2401 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5ca55ae1b..8bd45dd0c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,6 +65,7 @@ dependencies = [ "bposd>=1.6", "qecsim>=1.0b9", "sinter>=1.14.0", + "tqdm>=4.66.2" ] dynamic = ["version"] @@ -156,7 +157,7 @@ exclude = [ [[tool.mypy.overrides]] module = ["qiskit.*", "qecsim.*", "qiskit_aer.*", "matplotlib.*", "scipy.*", "ldpc.*", "pytest_console_scripts.*", - "z3.*", "bposd.*", "numba.*", "pymatching.*", "stim.*", "multiprocess.*", "sinter.*", "qsample.*", "pandas.*", "sympy.*"] + "z3.*", "bposd.*", "numba.*", "pymatching.*", "stim.*", "multiprocess.*", "sinter.*", "qsample.*", "pandas.*", "sympy.*", "tqdm.*"] ignore_missing_imports = true diff --git a/src/mqt/qecc/circuit_synthesis/circuit_utils.py b/src/mqt/qecc/circuit_synthesis/circuit_utils.py index 8b016b70e..2fa968c3c 100644 --- a/src/mqt/qecc/circuit_synthesis/circuit_utils.py +++ b/src/mqt/qecc/circuit_synthesis/circuit_utils.py @@ -87,6 +87,8 @@ def qiskit_to_stim_circuit(qc: QuantumCircuit) -> Circuit: elif op == "cx": target = qc.find_bit(gate.qubits[1])[0] stim_circuit.append_operation("CX", [qubit, target]) + elif op == "barrier": + stim_circuit.append("TICK") else: msg = f"Unsupported gate: {op}" raise ValueError(msg) @@ -153,9 +155,9 @@ def collect_circuit_layers(circ: Circuit) -> list[Circuit]: layer.append_operation(instr.name, qubits) instr_to_delete.append(idx) # Mark this instruction for removal - # Mark the qubits used in this instruction - for q in qubits: - qubit_layer_used[q] = True + # Mark the qubits used in this instruction + for q in qubits: + qubit_layer_used[q] = True idx += 1 @@ -179,3 +181,17 @@ def unmeasured_qubits(circ: Circuit) -> list[int]: all_qubits = set(range(circ.num_qubits)) return list(all_qubits - measured_qubits) + + +def measured_qubits(circ: Circuit) -> list[int]: + """Return a list of qubits that are measured in circ. + + The qubits are in the ordered according to when they are measured. + """ + measured_qubits: list[int] = [] + + for instr in circ: + if instr.name in STIM_MEASUREMENTS: + measured_qubits.extend(q.qubit_value for q in instr.targets_copy()) + + return measured_qubits diff --git a/src/mqt/qecc/circuit_synthesis/noise.py b/src/mqt/qecc/circuit_synthesis/noise.py index f73a25bdd..254f55a99 100644 --- a/src/mqt/qecc/circuit_synthesis/noise.py +++ b/src/mqt/qecc/circuit_synthesis/noise.py @@ -56,7 +56,9 @@ class CircuitLevelNoise(NoiseModel): - Two-qubit gates are subject to depolarizing noise of strength p_tqg. """ - def __init__(self, p_tqg: float, p_sqg: float, p_meas: float, p_init: float) -> None: + def __init__( + self, p_tqg: float, p_sqg: float, p_meas: float, p_init: float, ideal_qubits: set[int] | None = None + ) -> None: """Initialize the circuit-level noise model. Args: @@ -64,18 +66,9 @@ def __init__(self, p_tqg: float, p_sqg: float, p_meas: float, p_init: float) -> p_sqg: Probability of depolarizing noise for single-qubit gates. p_meas: Probability of depolarizing noise for measurements. p_init: Probability of depolarizing noise after initialization. + ideal_qubits: Set of qubit indices that are ideal (not subject to noise). """ - self.set_noise_parameters(p_tqg, p_sqg, p_meas, p_init) - - def set_noise_parameters(self, p_tqg: float, p_sqg: float, p_meas: float, p_init: float) -> None: - """Set the noise parameters for the noise model. - - Args: - p_tqg: Probability of depolarizing noise for two-qubit gates. - p_sqg: Probability of depolarizing noise for single-qubit gates. - p_meas: Probability of depolarizing noise for measurements. - p_init: Probability of depolarizing noise after initialization. - """ + super().__init__(ideal_qubits) self.p_tqg = p_tqg self.p_sqg = p_sqg self.p_meas = p_meas @@ -112,7 +105,7 @@ def apply(self, circ: Circuit) -> Circuit: return noisy_circ -class CircuitLevelNoiseIdlingParallel(NoiseModel): +class CircuitLevelNoiseIdlingParallel(CircuitLevelNoise): """Class representing circuit-level noise with idling qubits and parallel gates. A qubit is considered idle if it is not involved in any gate operation at a given time step. @@ -126,7 +119,14 @@ class CircuitLevelNoiseIdlingParallel(NoiseModel): """ def __init__( - self, p_tqg: float, p_sqg: float, p_meas: float, p_init: float, p_idle: float, resets_alap: bool = False + self, + p_tqg: float, + p_sqg: float, + p_meas: float, + p_init: float, + p_idle: float, + resets_alap: bool = False, + ideal_qubits: set[int] | None = None, ) -> None: """Initialize the circuit-level noise model. @@ -137,34 +137,22 @@ def __init__( p_init: Probability of depolarizing noise after initialization. p_idle: Probability of depolarizing noise for idling qubits. resets_alap: If True, resets are applied as late as possible, i.e. just before the first gate where the qubit is used (ALAP). + ideal_qubits: Set of qubit indices that are ideal (not subject to noise). """ - self.standard_noise = CircuitLevelNoise(p_tqg, p_sqg, p_meas, p_init) + super().__init__(p_tqg, p_sqg, p_meas, p_init, ideal_qubits) self.resets_alap = resets_alap self.p_idle = p_idle - def set_noise_parameters(self, p_tqg: float, p_sqg: float, p_meas: float, p_init: float, p_idle: float) -> None: - """Set the noise parameters for the noise model. - - Args: - p_tqg: Probability of depolarizing noise for two-qubit gates. - p_sqg: Probability of depolarizing noise for single-qubit gates. - p_meas: Probability of depolarizing noise for measurements. - p_init: Probability of depolarizing noise after initialization. - p_idle: Probability of depolarizing noise for idling qubits. - """ - self.standard_noise.set_noise_parameters(p_tqg, p_sqg, p_meas, p_init) - self.p_idle = p_idle - def apply(self, circ: Circuit) -> Circuit: """Apply the noise model to a stim circuit.""" layers = collect_circuit_layers(circ) if self.resets_alap: - return _add_idling_noise_to_layers_alap(layers, self.standard_noise, self.p_idle, circ.num_qubits) - return _add_idling_noise_to_layers_asap(layers, self.standard_noise, self.p_idle, circ.num_qubits) + return _add_idling_noise_to_layers_alap(layers, self, self.p_idle, circ.num_qubits) + return _add_idling_noise_to_layers_asap(layers, self, self.p_idle, circ.num_qubits) -class CircuitLevelNoiseIdlingSequential(NoiseModel): +class CircuitLevelNoiseIdlingSequential(CircuitLevelNoise): """Class representing circuit-level noise with idling qubits and sequential gates. A qubit is considered idle if it is not involved in any gate operation at a given time step. @@ -179,7 +167,14 @@ class CircuitLevelNoiseIdlingSequential(NoiseModel): """ def __init__( - self, p_tqg: float, p_sqg: float, p_meas: float, p_init: float, p_idle: float, resets_alap: bool = False + self, + p_tqg: float, + p_sqg: float, + p_meas: float, + p_init: float, + p_idle: float, + resets_alap: bool = False, + ideal_qubits: set[int] | None = None, ) -> None: """Initialize the circuit-level noise model. @@ -190,24 +185,12 @@ def __init__( p_init: Probability of depolarizing noise after initialization. p_idle: Probability of depolarizing noise for idling qubits. resets_alap: If True, resets are applied as late as possible, i.e. just before the first gate where the qubit is used (ALAP). + ideal_qubits: Set of qubit indices that are ideal (not subject to noise). """ - self.standard_noise = CircuitLevelNoise(p_tqg, p_sqg, p_meas, p_init) + super().__init__(p_tqg, p_sqg, p_meas, p_init, ideal_qubits) self.resets_alap = resets_alap self.p_idle = p_idle - def set_noise_parameters(self, p_tqg: float, p_sqg: float, p_meas: float, p_init: float, p_idle: float) -> None: - """Set the noise parameters for the noise model. - - Args: - p_tqg: Probability of depolarizing noise for two-qubit gates. - p_sqg: Probability of depolarizing noise for single-qubit gates. - p_meas: Probability of depolarizing noise for measurements. - p_init: Probability of depolarizing noise after initialization. - p_idle: Probability of depolarizing noise for idling qubits. - """ - self.standard_noise.set_noise_parameters(p_tqg, p_sqg, p_meas, p_init) - self.p_idle = p_idle - def apply(self, circ: Circuit) -> Circuit: """Apply the noise model to a stim circuit.""" layers = [] @@ -219,8 +202,8 @@ def apply(self, circ: Circuit) -> Circuit: layers.append(layer_circ) if self.resets_alap: - return _add_idling_noise_to_layers_alap(layers, self.standard_noise, self.p_idle, circ.num_qubits) - return _add_idling_noise_to_layers_asap(layers, self.standard_noise, self.p_idle, circ.num_qubits) + return _add_idling_noise_to_layers_alap(layers, self, self.p_idle, circ.num_qubits) + return _add_idling_noise_to_layers_asap(layers, self, self.p_idle, circ.num_qubits) def _add_idling_noise_to_layers_alap( @@ -237,7 +220,7 @@ def _add_idling_noise_to_layers_alap( resets = _get_reset_qubits_layer(layer) non_idling_non_resets = non_idling - resets - noisy_layer = noise.apply(layer) # apply regular noise + noisy_layer = CircuitLevelNoise.apply(noise, layer) # apply regular noise uninitialized_qubits -= non_idling_non_resets initialized_qubits = initialized_qubits.union(non_idling_non_resets) @@ -260,7 +243,7 @@ def _add_idling_noise_to_layers_asap( idling = _get_idle_qubits_layer(layer, n_qubits) - uninitialized_qubits non_idling = _get_non_idle_qubits_layer(layer) - noisy_layer = noise.apply(layer) # apply regular noise + noisy_layer = CircuitLevelNoise.apply(noise, layer) # apply regular noise uninitialized_qubits -= non_idling diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 454f57892..3f98c80f5 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -22,9 +22,13 @@ from tqdm import tqdm from ..codes import InvalidCSSCodeError -from .circuit_utils import qiskit_to_stim_circuit, unmeasured_qubits +from .circuit_utils import measured_qubits, qiskit_to_stim_circuit, relabel_qubits, unmeasured_qubits +from .noise import CircuitLevelNoiseIdlingParallel +from .state_prep import heuristic_prep_circuit if TYPE_CHECKING: # pragma: no cover + from collections.abc import Callable, Generator, Iterator + import numpy.typing as npt import stim @@ -70,59 +74,66 @@ def __init__( else: self.decoder = decoder self.data_qubits = sorted(unmeasured_qubits(self.circ)) + self.data_measurements = list(range(self.circ.num_measurements, self.circ.num_measurements + code.n)) - def _build_noisy_circuit(self, noise: NoiseModel) -> None: - """Set the error rate and initialize the stim circuit. - - This overwrites the previous stim circuit. + def _build_noisy_circuit(self, noise: NoiseModel) -> stim.Circuit: + """Set the error rate and initialize the noisy stim circuit. Args: noise: The noise model to apply. - """ - self.n_measurements = 0 - self._noisy_circ = noise.apply(self.circ) + Returns: + The noisy stim circuit used for the protocol. + """ + noisy_circ = noise.apply(self.circ) if self.zero_state: - self.data_measurements = self._noisy_circ.append("MR", self.data_qubits) + noisy_circ.append("MR", self.data_qubits) else: - self.data_measurements = self._noisy_circ.append("MRX", self.data_qubits) - self.data_measurements = self.circ.num_measurements - self.code.n + noisy_circ.append("MRX", self.data_qubits) + self._noisy_circ = noisy_circ + return noisy_circ + + def _build_noisy_gadget(self, noise: NoiseModel, p: float) -> stim.Circuit: + anc = qiskit_to_stim_circuit(heuristic_prep_circuit(self.code, zero_state=not self.zero_state).circ) + noisy_circ = noise.apply(self.circ) + + anc_qubits = list(range(noisy_circ.num_qubits, noisy_circ.num_qubits + anc.num_qubits)) + anc = relabel_qubits(anc, noisy_circ.num_qubits) + anc.append_operation("DEPOLARIZE1", range(anc.num_qubits), p) + noisy_circ += anc + + ctrls = self.data_qubits if self.zero_state else anc_qubits + trgts = anc_qubits if self.zero_state else self.data_qubits + noisy_circ.append("CX", [item for pair in zip(ctrls, trgts) for item in pair]) + if self.zero_state: + noisy_circ.append("MRX", self.data_qubits) + noisy_circ.append("MRX", anc_qubits) + else: + noisy_circ.append("MR", self.data_qubits) + noisy_circ.append("MR", anc_qubits) + self._noisy_circ = noisy_circ + return noisy_circ - def logical_error_rate( + def _batched_logical_error_rate( self, - noise: NoiseModel, + sampler: stim.CompiledMeasurementSampler, + processing_fun: Callable[[stim.CompiledMeasurementSampler, int], tuple[int, int]], shots: int = 100000, shots_per_batch: int = 100000, at_least_min_errors: bool = True, min_errors: int = 500, ) -> tuple[float, float, int, int]: - """Estimate the logical error rate of the code. - - Args: - noise: The noise model to apply. - shots: The number of shots to use. - shots_per_batch: The number of shots per batch. - at_least_min_errors: Whether to continue simulating until at least min_errors are found. - min_errors: The minimum number of errors to find before stopping. - """ - self._build_noisy_circuit(noise) batch = min(shots_per_batch, shots) p_l = 0.0 r_a = 0.0 num_logical_errors = 0 - if self.decoder is None: - if self.zero_state: - self.decoder.generate_x_lut() - else: - self.decoder.generate_z_lut() - i = 1 total_batches = int(np.ceil(shots / batch)) while i <= total_batches or at_least_min_errors: - num_logical_errors_batch, discarded_batch = self._simulate_batch(batch) + num_logical_errors_batch, discarded_batch = processing_fun(sampler, batch) logger.info( f"Batch {i}: {num_logical_errors_batch} logical errors and {discarded_batch} discarded shots. {batch - discarded_batch} shots used.", @@ -142,6 +153,62 @@ def logical_error_rate( return p_l / self.code.k, r_a, num_logical_errors, i * batch + def logical_error_rate( + self, + noise: NoiseModel, + shots: int = 100000, + shots_per_batch: int = 100000, + at_least_min_errors: bool = True, + min_errors: int = 500, + ) -> tuple[float, float, int, int]: + """Estimate the logical error rate of the code. + + Args: + noise: The noise model to apply. + shots: The number of shots to use. + shots_per_batch: The number of shots per batch. + at_least_min_errors: Whether to continue simulating until at least min_errors are found. + min_errors: The minimum number of errors to find before stopping. + """ + noisy_circ = self._build_noisy_circuit(noise) + sampler = noisy_circ.compile_sampler() + return self._batched_logical_error_rate( + sampler, self._simulate_batch, shots, shots_per_batch, at_least_min_errors, min_errors + ) + + def secondary_logical_error_rate( + self, + noise: NoiseModel, + p: float, + shots: int = 100000, + shots_per_batch: int = 100000, + at_least_min_errors: bool = True, + min_errors: int = 500, + ) -> tuple[float, float, int, int]: + """Estimate the secondary logical error rate of the code. + + For a zero (plus) state, we cannot directly estimate whether the circuit is strictly fault-tolerant with respect to Z (X) errors because a logical error of that kind cannot happen. + This method is used to estimate the logical error rate for a zero (plus) state using a secondary error gadget. + The prepared qubit is used as the ancilla in Steane-type QEC of an ancillary state prepared in the opposite basis (for a zero state, the plus state is used and vice-versa). + The prepared qubit is assumed to be subject to uniform depolarizing noise of strength p. + + Args: + noise: The noise model to apply. + p: Noise to apply to the gadget. + shots: The number of shots to use. + shots_per_batch: The number of shots per batch. + at_least_min_errors: Whether to continue simulating until at least min_errors are found. + min_errors: The minimum number of errors to find before stopping. + + Returns: + The logical error rate and the acceptance rate of the protocol. + """ + noisy_circ = self._build_noisy_gadget(noise, p) + sampler = noisy_circ.compile_sampler() + return self._batched_logical_error_rate( + sampler, self._simulate_secondary_batch, shots, shots_per_batch, at_least_min_errors, min_errors + ) + @abstractmethod def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: """Filter samples based on measurement outcomes. @@ -153,8 +220,7 @@ def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: npt.NDArray[np.int8]: The filtered samples. """ - def _simulate_batch(self, shots: int = 1024) -> tuple[int, int]: - sampler = self._noisy_circ.compile_sampler() + def _simulate_batch(self, sampler: stim.CompiledMeasurementSampler, shots: int = 1024) -> tuple[int, int]: detection_events = sampler.sample(shots).astype(np.int8) filtered_events = self._filter_runs(detection_events) @@ -165,11 +231,11 @@ def _simulate_batch(self, shots: int = 1024) -> tuple[int, int]: state = filtered_events[:, self.data_measurements] if self.zero_state: - checks = ((state @ self.code.Hx.T) % 2).astype(np.int8) - observables = self.code.Lz % 2 + checks = ((state @ self.code.Hz.T) % 2).astype(np.int8) + observables = self.code.Lz estimates = self.decoder.batch_decode_x(checks) else: - checks = ((state @ self.code.Hz.T) % 2).astype(np.int8) + checks = ((state @ self.code.Hx.T) % 2).astype(np.int8) observables = self.code.Lx estimates = self.decoder.batch_decode_z(checks) @@ -181,48 +247,143 @@ def _simulate_batch(self, shots: int = 1024) -> tuple[int, int]: ) # number of non-commuting corrected states return num_logical_errors, num_discarded + def _simulate_secondary_batch(self, sampler: stim.CompiledMeasurementSampler, shots: int = 1024) -> tuple[int, int]: + detection_events = sampler.sample(shots).astype(np.int8) + + filtered_events = self._filter_runs(detection_events) + + if len(filtered_events) == 0: # All events were discarded + return 0, shots + + state = filtered_events[:, self.data_measurements] + + ancilla_state = filtered_events[:, -self.code.n :] # last n measurements are the gadget ancilla + + if self.zero_state: + checks = ((state @ self.code.Hx.T) % 2).astype(np.int8) + observables = self.code.Lx + estimates = self.decoder.batch_decode_z(checks) + else: + checks = ((state @ self.code.Hz.T) % 2).astype(np.int8) + observables = self.code.Lz + estimates = self.decoder.batch_decode_x(checks) + + # Steane-type QEC: apply estimate to the ancilla state + corrected_anc = ancilla_state ^ estimates + + if self.zero_state: + checks = ((corrected_anc @ self.code.Hx.T) % 2).astype(np.int8) + estimates = self.decoder.batch_decode_z(checks) + else: + checks = ((corrected_anc @ self.code.Hz.T) % 2).astype(np.int8) + estimates = self.decoder.batch_decode_x(checks) + + # apply new estimates + + corrected_anc ^= estimates + + num_discarded = detection_events.shape[0] - filtered_events.shape[0] + num_logical_errors: int = np.sum( + np.any(corrected_anc @ observables.T % 2 != 0, axis=1) + ) # number of non-commuting corrected states + return num_logical_errors, num_discarded + def plot_state_prep( self, ps: list[float], min_errors: int = 500, - name: str | None = None, p_idle_factor: float = 1.0, + kind: str = "primary", ) -> None: - """Plot the logical error rate and accaptence rate as a function of the physical error rate. + """Plot the logical error rate and acceptance rate as a function of the physical error rate. Args: ps: The physical error rates to plot. min_errors: The minimum number of errors to find before stopping. - name: The name of the plot. p_idle_factor: Factor to scale the idling error rate depending on ps. + kind: Which error rates to plot. Can be "primary", "secondary", or "all". """ - p_ls = [] - r_as = [] - for p in ps: - self._build_noisy_circuit(p, p_idle_factor * p) - p_l, r_a, _num_logical_errors, _num_shots = self.logical_error_rate(min_errors=min_errors) - p_ls.append(p_l) - r_as.append(r_a) - + if kind not in {"primary", "secondary", "all"}: + msg = 'kind must be either "primary", "secondary", or "all".' + raise ValueError(msg) + plot_primary = kind in {"primary", "all"} + plot_secondary = kind in {"secondary", "all"} + + if plot_primary: + results = [ + self.logical_error_rate( + CircuitLevelNoiseIdlingParallel(p, p, p, p, p * p_idle_factor, True), + min_errors=min_errors, + ) + for p in ps + ] + p_ls, r_as = zip(*[(p_l, r_a) for p_l, r_a, _, _ in results]) + + if plot_secondary: + results_secondary = [ + self.secondary_logical_error_rate( + CircuitLevelNoiseIdlingParallel(p, p, p, p, p * p_idle_factor, True), + p, + min_errors=min_errors, + ) + for p in ps + ] + p_ls_secondary, r_as = zip(*[(p_l, r_a) for p_l, r_a, _, _ in results_secondary]) + + # Create a figure with a consistent size + plt.figure(figsize=(12, 6)) + + # Plot logical error rate plt.subplot(1, 2, 1) - plt.plot(ps, p_ls, marker="o", label=name) + if plot_primary: + plt.plot( + ps, + p_ls, + marker="o", + linestyle="-", + color="blue", + label="Primary Logical Error Rate", + ) + if plot_secondary: + plt.plot( + ps, + p_ls_secondary, + marker="^", + linestyle="-", + color="red", + label="Secondary Logical Error Rate", + ) plt.xscale("log") plt.yscale("log") - plt.xlabel("Physical error rate") - plt.ylabel("Logical error rate") - - if name is not None: - plt.legend() + plt.xlabel("Physical Error Rate", fontsize=12) + plt.ylabel("Logical Error Rate", fontsize=12) + plt.title("Logical Error Rate vs Physical Error Rate", fontsize=14, fontweight="bold") + plt.grid(True, which="both", linestyle="--", linewidth=0.5, alpha=0.7) + plt.legend(fontsize=10) + # Plot acceptance rate plt.subplot(1, 2, 2) - plt.plot(ps, r_as, marker="o", label=name) + + # acceptance rate is the same for both protocols + plt.plot( + ps, + r_as, + marker="d", + linestyle="--", + color="orange", + label="Acceptance Rate", + ) plt.xscale("log") plt.yscale("log") - plt.xlabel("Physical error rate") - plt.ylabel("Acceptance rate") - if name is not None: - plt.legend() + plt.xlabel("Physical Error Rate", fontsize=12) + plt.ylabel("Acceptance Rate", fontsize=12) + plt.title("Acceptance Rate vs Physical Error Rate", fontsize=14, fontweight="bold") + plt.grid(True, which="both", linestyle="--", linewidth=0.5, alpha=0.7) + plt.legend(fontsize=10) + + # Adjust layout for better spacing plt.tight_layout() + plt.show() class VerificationNDFTStatePrepSimulator(NoisyNDFTStatePrepSimulator): @@ -240,13 +401,9 @@ def __init__( Args: state_prep_circ: The state preparation circuit. code: The code to simulate. - p: The error rate. - p_idle: Idling error rate. If None, it is set to p. zero_state: Whether the zero state is prepared or nor. decoder: The decoder to use. """ - self.z_verification_measurements: list[int] = [] - self.x_verification_measurements: list[int] = [] super().__init__(state_prep_circ, code, zero_state, decoder) def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: @@ -258,7 +415,7 @@ def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: Returns: npt.NDArray[np.int8]: The filtered samples. """ - index_array = np.where(np.all(samples[:, self.circ.num_measurements] == 0, axis=1))[0] + index_array = np.where(np.all(samples[:, : self.circ.num_measurements] == 0, axis=1))[0] return samples[index_array].astype(np.int8) @@ -277,7 +434,6 @@ def __init__( circ4: QuantumCircuit | None = None, zero_state: bool = True, decoder: LutDecoder | None = None, - check_circuit: QuantumCircuit | None = None, ) -> None: """Initialize the simulator. @@ -294,7 +450,6 @@ def __init__( code: The code to simulate. zero_state: Whether the zero state is prepared or nor. decoder: The decoder to use. - check_circuit: Circuit used for checking error rates for the error type that cannot form a logical error on the synthesized state. """ if (circ3 is None and circ4 is not None) or (circ3 is not None and circ4 is None): msg = "Only two or four circuits are supported." @@ -357,73 +512,10 @@ def __init__( self.secondary_error_gadget = None super().__init__(combined, code, zero_state, decoder) - if check_circuit is None: - return - - # Estimate error rate using Steane-type error correction - secondary_error_gadget = combined.copy() - secondary_error_gadget.barrier() - secondary_error_gadget = check_circuit.tensor(secondary_error_gadget) - self._measurement_ancilla_range = range(4 * code.n, 5 * code.n) - if zero_state: - secondary_error_gadget.cx(self._data_range, self._measurement_ancilla_range) - else: - secondary_error_gadget.cx(self._measurement_ancilla_range, self._data_range) - if self.zero_state: - secondary_error_gadget.h(self._data_range) - secondary_error_gadget.barrier() - new_cr = ClassicalRegister(code.n, "new_c") - secondary_error_gadget.add_register(new_cr) - secondary_error_gadget.measure(self._data_range, new_cr) - self.secondary_error_gadget = secondary_error_gadget - - def _compute_postselection_indices(self) -> int: - """Compute indices of measurements for postselection. - - Returns: - int: The number of measurements. - """ self.anc_1 = list(self._first_ancilla_range) if not self.has_one_ancilla: self.anc_2 = list(self._second_ancilla_range) self.anc_3 = list(self._third_ancilla_range) - return 3 * self.code.n - return self.code.n - - def set_p(self, p: float, p_idle: float | None = None, error_free_qubits=None) -> None: - """Set the error rate and initialize the stim circuit. - - This overwrites the previous stim circuit. - - Args: - p: The error rate. - p_idle: Idling error rate. If None, it is set to p. - """ - if error_free_qubits is None: - error_free_qubits = [] - super()._build_noisy_circuit(p, p_idle, error_free_qubits) - if self.secondary_error_gadget is None: - return - self.secondary_stim_circ = self.to_stim_circ( - self.secondary_error_gadget, - error_free_qubits=list(self._) + error_free_qubits, - ) - self.secondary_stim_circ.append("DEPOLARIZE1", list(self._measurement_ancilla_range), [self.p]) - n_measurements = self._compute_postselection_indices() - - self.secondary_ancilla_measurements = list( - range(n_measurements, n_measurements + self.code.n) - ) # add measurements of the initial data qubit - n_measurements += self.code.n - - if self.zero_state: - self.secondary_data_measurements = self.measure_x( - self.secondary_stim_circ, n_measurements, data_index=4 * self.code.n - ) - else: - self.secondary_data_measurements = self.measure_z( - self.secondary_stim_circ, n_measurements, data_index=4 * self.code.n - ) def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: """Filter samples based on measurement outcomes. @@ -434,12 +526,18 @@ def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: Returns: npt.NDArray[np.int8]: The filtered samples. """ - anc_1 = samples[:, self.anc_1] + measured = measured_qubits(self._noisy_circ) + + qubit_to_meas = {q: i for i, q in enumerate(measured)} + idx1 = [qubit_to_meas[q] for q in self.anc_1] + anc_1 = samples[:, idx1] check_anc_1 = (anc_1 @ self.z_checks.T) % 2 if not self.has_one_ancilla: - anc_2 = samples[:, self.anc_2] - anc_3 = samples[:, self.anc_3] + idx2 = [qubit_to_meas[q] for q in self.anc_2] + idx3 = [qubit_to_meas[q] for q in self.anc_3] + anc_2 = samples[:, idx2] + anc_3 = samples[:, idx3] check_anc_2 = (anc_2 @ self.x_checks.T) % 2 check_anc_3 = (anc_3 @ self.z_checks.T) % 2 @@ -448,117 +546,6 @@ def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: index_array = np.where(np.all(check_anc_1 == 0, axis=1))[0] return samples[index_array].astype(np.int8) - def _simulate_secondary_batch(self, shots: int = 1024) -> tuple[int, int]: - sampler = self.secondary_stim_circ.compile_sampler() - detection_events = sampler.sample(shots).astype(np.int8) - - filtered_events = self._filter_runs(detection_events) - - if len(filtered_events) == 0: # All events were discarded - return 0, shots - - secondary_state = filtered_events[:, -self.code.n :] - - state = filtered_events[:, self.secondary_ancilla_measurements] - - if self.zero_state: - observables = self.code.Lx - estimate_1 = self.decoder.batch_decode_z((state @ self.code.Hx.T % 2).astype(np.int8)) - secondary_state = (secondary_state + estimate_1) % 2 - estimates = self.decoder.batch_decode_z((secondary_state @ self.code.Hx.T % 2).astype(np.int8)) - else: - estimate_1 = self.decoder.batch_decode_x((state @ self.code.Hz.T % 2).astype(np.int8)) - secondary_state = (secondary_state + estimate_1) % 2 - observables = self.code.Lz - estimates = self.decoder.batch_decode_x((secondary_state @ self.code.H.T % 2).astype(np.int8)) - corrected = secondary_state + estimates - - num_discarded = detection_events.shape[0] - filtered_events.shape[0] - num_logical_errors: int = np.sum( - np.any(corrected @ observables.T % 2 != 0, axis=1) - ) # number of non-commuting corrected states - return num_logical_errors, num_discarded - - def logical_error_rate( - self, - shots: int = 500000, - shots_per_batch: int = 500000, - at_least_min_errors: bool = True, - min_errors: int = 250, - ) -> tuple[float, float, int, int, float, float]: - """Estimate the logical error rate of the code. - - Args: - shots: The number of shots to use. - shots_per_batch: The number of shots per batch. - at_least_min_errors: Whether to continue simulating until at least min_errors are found. - min_errors: The minimum number of errors to find before stopping. - """ - p_l, r_a, num_logical_errors, total_shots = super().logical_error_rate( - shots, shots_per_batch, at_least_min_errors, min_errors - ) - - p_l_error = np.sqrt(p_l * (1 - p_l) / (r_a * total_shots)) - r_a_error = np.sqrt(r_a * (1 - r_a) / total_shots) - - return p_l, r_a, num_logical_errors, total_shots, p_l_error, r_a_error - - def secondary_logical_error_rate( - self, - shots: int = 500000, - shots_per_batch: int = 500000, - at_least_min_errors: bool = True, - min_errors: int = 250, - ) -> tuple[float, float, int, int, float, float]: - """Estimate the logical error rate of the code with regards to the secondary error type. - - Args: - shots: The number of shots to use. - shots_per_batch: The number of shots per batch. - at_least_min_errors: Whether to continue simulating until at least min_errors are found. - min_errors: The minimum number of errors to find before stopping. - """ - batch = min(shots_per_batch, shots) - p_l = 0.0 - r_a = 0.0 - - num_logical_errors = 0 - - if self.zero_state: - self.decoder.generate_x_lut() - else: - self.decoder.generate_z_lut() - - i = 1 - while i <= int(np.ceil(shots / batch)) or at_least_min_errors: - num_logical_errors_batch, discarded_batch = self._simulate_secondary_batch(batch) - logger.info( - f"Batch {i}: {num_logical_errors_batch} logical errors and {discarded_batch} discarded shots. {batch - discarded_batch} shots used.", - ) - p_l_batch = num_logical_errors_batch / (batch - discarded_batch) if discarded_batch != batch else 0.0 - p_l = ((i - 1) * p_l + p_l_batch) / i - - r_a_batch = 1 - discarded_batch / batch - - # Update statistics - num_logical_errors += num_logical_errors_batch - r_a = ((i - 1) * r_a + r_a_batch) / i - - if at_least_min_errors and num_logical_errors >= min_errors: - break - i += 1 - - p_l /= self.code.k - total_shots = i * batch - # p_l, r_a, num_logical_errors, total_shots = super().logical_error_rate( - # shots, shots_per_batch, at_least_min_errors, min_errors - # ) - - p_l_error = np.sqrt(p_l * (1 - p_l) / (r_a * total_shots)) - r_a_error = np.sqrt(r_a * (1 - r_a) / total_shots) - - return p_l, r_a, num_logical_errors, total_shots, p_l_error, r_a_error - class LutDecoder: """Lookup table decoder for a CSSCode.""" @@ -621,8 +608,7 @@ def generate_z_lut(self) -> None: def _generate_lut( checks: np.ndarray, chunk_size: int = 2**20, num_workers: int = 8, print_progress: bool = False ) -> dict[bytes, np.ndarray]: - """Generate a lookup table (LUT) for error correction by processing the state space in chunks, - in parallel, and displaying a progress bar. + """Generate a lookup table (LUT) for error correction by processing the state space in chunks, in parallel, and displaying a progress bar. Parameters: checks (np.ndarray): The stabilizer check matrix (binary). @@ -634,7 +620,7 @@ def _generate_lut( dict[bytes, np.ndarray]: A LUT mapping syndrome bytes to error state arrays. """ n_qubits = checks.shape[1] - global_lut = {} + global_lut: dict[bytes, np.ndarray] = {} # Process weights in increasing order so that lower-weight errors take precedence. for weight in range(n_qubits): @@ -649,7 +635,7 @@ def _generate_lut( # Split the combinations into chunks. chunks = _chunked_iterable(comb_iter, chunk_size) - weight_dict = {} + weight_dict: dict[bytes, int] = {} with concurrent.futures.ProcessPoolExecutor(max_workers=num_workers) as executor: d2 = weight_dict.copy() futures = [ @@ -675,7 +661,7 @@ def _generate_lut( return global_lut -def _chunked_iterable(iterable, chunk_size): +def _chunked_iterable(iterable: Iterator[tuple[int, ...]], chunk_size: int) -> Generator[list[tuple[int, ...]]]: """Yield lists of items from the given iterable, each of size at most chunk_size.""" chunk = [] for item in iterable: @@ -687,14 +673,17 @@ def _chunked_iterable(iterable, chunk_size): yield chunk -def _process_combinations_chunk(chunk, checks, n_qubits, weight_map): - """Process a chunk of combinations. For each combination, construct the binary state, - compute its syndrome, and add it to a dictionary if not already present. +def _process_combinations_chunk( + chunk: list[tuple[int, ...]], checks: npt.NDArray[np.int8], n_qubits: int, weight_map: dict[bytes, int] +) -> dict[bytes, npt.NDArray[np.int8]]: + """Process a chunk of combinations. + + For each combination, construct the binary state, compute its syndrome, and add it to a dictionary if not already present. Returns: dict: mapping syndrome (bytes) -> error state (numpy array) """ - chunk_dict = {} + chunk_dict: dict[bytes, npt.NDArray[np.int8]] = {} for comb in chunk: # Create an error state with 1's in positions given by comb. state = np.zeros(n_qubits, dtype=np.int8) @@ -709,9 +698,10 @@ def _process_combinations_chunk(chunk, checks, n_qubits, weight_map): return chunk_dict -def _merge_dicts(dict_list): - """Merge a list of dictionaries. In case of key conflicts, - the first encountered value is kept. +def _merge_dicts(dict_list: list[dict[bytes, npt.NDArray[np.int8]]]) -> dict[bytes, npt.NDArray[np.int8]]: + """Merge a list of dictionaries. + + In case of key conflicts, the first encountered value is kept. """ merged = {} for d in dict_list: @@ -721,9 +711,10 @@ def _merge_dicts(dict_list): return merged -def _merge_into(target, source) -> None: - """Merge source dictionary into target dictionary. In case of key conflicts, - keep the existing value in the target. +def _merge_into(target: dict[bytes, npt.NDArray[np.int8]], source: dict[bytes, npt.NDArray[np.int8]]) -> None: + """Merge source dictionary into target dictionary. + + In case of key conflicts, keep the existing value in the target. """ for key, state in source.items(): if key not in target: diff --git a/test/python/circuit_synthesis/test_simulation.py b/test/python/circuit_synthesis/test_simulation.py index 7925619c8..bf9da763e 100644 --- a/test/python/circuit_synthesis/test_simulation.py +++ b/test/python/circuit_synthesis/test_simulation.py @@ -25,11 +25,17 @@ heuristic_prep_circuit, naive_verification_circuit, ) +from mqt.qecc.circuit_synthesis.noise import CircuitLevelNoiseIdlingParallel if TYPE_CHECKING: # pragma: no cover from qiskit import QuantumCircuit +def make_uniform_error_model(p: float) -> CircuitLevelNoiseIdlingParallel: + """Create a uniform error model.""" + return CircuitLevelNoiseIdlingParallel(p_tqg=p, p_sqg=p, p_idle=p * 0.01, p_meas=2 / 3 * p, p_init=p) + + @pytest.fixture def steane_code() -> CSSCode: """Return the Steane code.""" @@ -125,34 +131,46 @@ def test_non_ft_sim_zero(steane_code: CSSCode, non_ft_steane_zero: QuantumCircui """Test the simulation of a non fault-tolerant state preparation circuit for the Steane |0>.""" tol = 5e-4 p = 1e-3 + noise = make_uniform_error_model(p) lower = 1e-4 - simulator = VerificationNDFTStatePrepSimulator(non_ft_steane_zero, steane_code, p=p, p_idle=p * 0.01) - p_l, _, _, _ = simulator.logical_error_rate(min_errors=10) + simulator = VerificationNDFTStatePrepSimulator(non_ft_steane_zero, steane_code) + p_l, _, _, _ = simulator.logical_error_rate(noise, min_errors=10) assert p_l - tol > lower + # steane code prep is already FT2 due to error degeneracy. + p_l_correction, _, _, _ = simulator.secondary_logical_error_rate(noise, p, min_errors=10) + + assert p_l_correction - tol < lower + @pytest.mark.skipif(os.getenv("CI") is not None and sys.platform == "win32", reason="Too slow for CI on Windows") def test_ft_sim_zero(steane_code: CSSCode, ft_steane_zero: QuantumCircuit) -> None: """Test the simulation of a fault-tolerant state preparation circuit for the Steane |0>.""" tol = 5e-4 p = 1e-3 + noise = make_uniform_error_model(p) lower = 1e-4 - simulator = VerificationNDFTStatePrepSimulator(ft_steane_zero, steane_code, p=p, p_idle=p * 0.01) - p_l, _, _, _ = simulator.logical_error_rate(min_errors=10) + simulator = VerificationNDFTStatePrepSimulator(ft_steane_zero, steane_code) + p_l, _, _, _ = simulator.logical_error_rate(noise, min_errors=10) assert p_l - tol < lower + p_l_correction, _, _, _ = simulator.secondary_logical_error_rate(noise, p, min_errors=10) + + assert p_l_correction - tol < lower + def test_non_ft_sim_plus(steane_code: CSSCode, non_ft_steane_plus: QuantumCircuit, steane_lut: LutDecoder) -> None: """Test the simulation of a non fault-tolerant state preparation circuit for the Steane |0>.""" tol = 5e-4 p = 1e-3 + noise = make_uniform_error_model(p) lower = 1e-4 simulator = VerificationNDFTStatePrepSimulator( - non_ft_steane_plus, steane_code, p=p, p_idle=p * 0.01, zero_state=False, decoder=steane_lut + non_ft_steane_plus, steane_code, zero_state=False, decoder=steane_lut ) - p_l, _, _, _ = simulator.logical_error_rate(min_errors=10) + p_l, _, _, _ = simulator.logical_error_rate(noise, min_errors=10) assert p_l - tol > lower @@ -162,13 +180,12 @@ def test_ft_sim_plus(steane_code: CSSCode, ft_steane_plus: QuantumCircuit, stean """Test the simulation of a fault-tolerant state preparation circuit for the Steane |0>.""" tol = 5e-4 p = 1e-3 + noise = make_uniform_error_model(p) lower = 1e-4 - simulator = VerificationNDFTStatePrepSimulator( - ft_steane_plus, steane_code, p=p, p_idle=p * 0.01, zero_state=False, decoder=steane_lut - ) + simulator = VerificationNDFTStatePrepSimulator(ft_steane_plus, steane_code, zero_state=False, decoder=steane_lut) - p_l, _, _, _ = simulator.logical_error_rate(min_errors=10) + p_l, _, _, _ = simulator.logical_error_rate(noise, min_errors=10) assert p_l - tol < lower @@ -178,13 +195,15 @@ def test_naive_verification_circuit_with_flags( ) -> None: """Test that naive verification is correct.""" tol = 5e-4 + p = 1e-3 + noise = make_uniform_error_model(p) lower = 1e-4 simulator = VerificationNDFTStatePrepSimulator( - ft_steane_zero_naive, steane_code, p=p, p_idle=p * 0.01, zero_state=True, decoder=steane_lut + ft_steane_zero_naive, steane_code, zero_state=True, decoder=steane_lut ) - p_l, _, _, _ = simulator.logical_error_rate(min_errors=10) + p_l, _, _, _ = simulator.logical_error_rate(noise, min_errors=10) assert p_l - tol < lower @@ -196,6 +215,7 @@ def test_steane_type_ftsp_trivial(steane_code: CSSCode, non_ft_steane_zero: Quan """ tol = 5e-3 p = 1e-2 + noise = make_uniform_error_model(p) lower = 1e-2 simulator = SteaneNDFTStatePrepSimulator( non_ft_steane_zero, @@ -203,10 +223,8 @@ def test_steane_type_ftsp_trivial(steane_code: CSSCode, non_ft_steane_zero: Quan steane_code, non_ft_steane_zero, non_ft_steane_zero, - p=p, - p_idle=p * 0.01, zero_state=True, ) - p_l, _, _, _, _, _ = simulator.logical_error_rate(min_errors=100) + p_l, _, _, _ = simulator.logical_error_rate(noise, min_errors=100) assert p_l - tol < lower diff --git a/test/python/circuit_synthesis/test_utils.py b/test/python/circuit_synthesis/test_utils.py index 801a386cc..2083a2fcb 100644 --- a/test/python/circuit_synthesis/test_utils.py +++ b/test/python/circuit_synthesis/test_utils.py @@ -21,6 +21,7 @@ from mqt.qecc.circuit_synthesis.circuit_utils import ( collect_circuit_layers, compact_stim_circuit, + measured_qubits, qiskit_to_stim_circuit, unmeasured_qubits, ) @@ -291,3 +292,34 @@ def test_unmeasured_qubits(circuit_operations, expected_unmeasured): for op, targets in circuit_operations: circ.append_operation(op, targets) assert sorted(unmeasured_qubits(circ)) == sorted(expected_unmeasured) + + +@pytest.mark.parametrize( + ("circuit_operations", "expected_measured"), + [ + # Test case 1: Empty circuit + ([], []), + # Test case 2: Circuit with no measurements + ([("H", [0]), ("CX", [0, 1])], []), + # Test case 3: Circuit with one measurement + ([("H", [0]), ("CX", [0, 1]), ("MR", [1])], [1]), + # Test case 4: Circuit with multiple measurements + ([("H", [0]), ("CX", [0, 1]), ("MR", [1]), ("MR", [0])], [1, 0]), + # Test case 5: Circuit with interleaved operations and measurements + ( + [("H", [0]), ("MR", [1]), ("CX", [0, 1]), ("MR", [0]), ("MR", [2])], + [1, 0, 2], + ), + # Test case 6: Large circuit with measurements + ( + [("H", [i]) for i in range(10)] + [("MR", [2]), ("MR", [5]), ("MR", [7])], + [2, 5, 7], + ), + ], +) +def test_measured_qubits(circuit_operations, expected_measured): + """Parameterized test for measured_qubits.""" + circ = stim.Circuit() + for op, targets in circuit_operations: + circ.append_operation(op, targets) + assert measured_qubits(circ) == expected_measured diff --git a/uv.lock b/uv.lock index 8e88aba30..382fe8d23 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,4 @@ version = 1 -revision = 2 requires-python = ">=3.9" resolution-markers = [ "python_full_version >= '3.13'", @@ -17,9 +16,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bc/c1/bbac6a50d02774f91572938964c582fff4270eee73ab822a4aeea4d8b11b/accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872", size = 1377899, upload-time = "2024-05-10T11:23:10.216Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/c1/bbac6a50d02774f91572938964c582fff4270eee73ab822a4aeea4d8b11b/accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872", size = 1377899 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7", size = 1395903, upload-time = "2024-05-10T11:23:08.421Z" }, + { url = "https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7", size = 1395903 }, ] [[package]] @@ -30,9 +29,9 @@ resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/3e/13dd8e5ed9094e734ac430b5d0eb4f2bb001708a8b7856cbf8e084e001ba/alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", size = 23776, upload-time = "2024-01-10T00:56:10.189Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/3e/13dd8e5ed9094e734ac430b5d0eb4f2bb001708a8b7856cbf8e084e001ba/alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", size = 23776 } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92", size = 13511, upload-time = "2024-01-10T00:56:08.388Z" }, + { url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92", size = 13511 }, ] [[package]] @@ -45,18 +44,18 @@ resolution-markers = [ "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload-time = "2024-07-26T18:15:03.762Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, + { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929 }, ] [[package]] name = "antlr4-python3-runtime" version = "4.13.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/33/5f/2cdf6f7aca3b20d3f316e9f505292e1f256a32089bd702034c29ebde6242/antlr4_python3_runtime-4.13.2.tar.gz", hash = "sha256:909b647e1d2fc2b70180ac586df3933e38919c85f98ccc656a96cd3f25ef3916", size = 117467, upload-time = "2024-08-03T19:00:12.757Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/5f/2cdf6f7aca3b20d3f316e9f505292e1f256a32089bd702034c29ebde6242/antlr4_python3_runtime-4.13.2.tar.gz", hash = "sha256:909b647e1d2fc2b70180ac586df3933e38919c85f98ccc656a96cd3f25ef3916", size = 117467 } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/03/a851e84fcbb85214dc637b6378121ef9a0dd61b4c65264675d8a5c9b1ae7/antlr4_python3_runtime-4.13.2-py3-none-any.whl", hash = "sha256:fe3835eb8d33daece0e799090eda89719dbccee7aa39ef94eed3818cafa5a7e8", size = 144462, upload-time = "2024-08-03T19:00:11.134Z" }, + { url = "https://files.pythonhosted.org/packages/89/03/a851e84fcbb85214dc637b6378121ef9a0dd61b4c65264675d8a5c9b1ae7/antlr4_python3_runtime-4.13.2-py3-none-any.whl", hash = "sha256:fe3835eb8d33daece0e799090eda89719dbccee7aa39ef94eed3818cafa5a7e8", size = 144462 }, ] [[package]] @@ -69,9 +68,9 @@ resolution-markers = [ dependencies = [ { name = "six", marker = "python_full_version < '3.9.2'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f9/44/2dd9c5d0c3befe899738b930aa056e003b1441bfbf34aab8fce90b2b7dea/anytree-2.12.1.tar.gz", hash = "sha256:244def434ccf31b668ed282954e5d315b4e066c4940b94aff4a7962d85947830", size = 31110, upload-time = "2023-11-16T21:53:02.263Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/44/2dd9c5d0c3befe899738b930aa056e003b1441bfbf34aab8fce90b2b7dea/anytree-2.12.1.tar.gz", hash = "sha256:244def434ccf31b668ed282954e5d315b4e066c4940b94aff4a7962d85947830", size = 31110 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/fb/ff946843e6b55ae9fda84df3964d6c233cd2261dface789f5be02ab79bc5/anytree-2.12.1-py3-none-any.whl", hash = "sha256:5ea9e61caf96db1e5b3d0a914378d2cd83c269dfce1fb8242ce96589fa3382f0", size = 44914, upload-time = "2023-11-16T21:53:00.317Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fb/ff946843e6b55ae9fda84df3964d6c233cd2261dface789f5be02ab79bc5/anytree-2.12.1-py3-none-any.whl", hash = "sha256:5ea9e61caf96db1e5b3d0a914378d2cd83c269dfce1fb8242ce96589fa3382f0", size = 44914 }, ] [[package]] @@ -85,27 +84,27 @@ resolution-markers = [ "python_full_version == '3.10.*'", "python_full_version >= '3.9.2' and python_full_version < '3.10'", ] -sdist = { url = "https://files.pythonhosted.org/packages/bc/a8/eb55fab589c56f9b6be2b3fd6997aa04bb6f3da93b01154ce6fc8e799db2/anytree-2.13.0.tar.gz", hash = "sha256:c9d3aa6825fdd06af7ebb05b4ef291d2db63e62bb1f9b7d9b71354be9d362714", size = 48389, upload-time = "2025-04-08T21:06:30.662Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/a8/eb55fab589c56f9b6be2b3fd6997aa04bb6f3da93b01154ce6fc8e799db2/anytree-2.13.0.tar.gz", hash = "sha256:c9d3aa6825fdd06af7ebb05b4ef291d2db63e62bb1f9b7d9b71354be9d362714", size = 48389 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/98/f6aa7fe0783e42be3093d8ef1b0ecdc22c34c0d69640dfb37f56925cb141/anytree-2.13.0-py3-none-any.whl", hash = "sha256:4cbcf10df36b1f1cba131b7e487ff3edafc9d6e932a3c70071b5b768bab901ff", size = 45077, upload-time = "2025-04-08T21:06:29.494Z" }, + { url = "https://files.pythonhosted.org/packages/7b/98/f6aa7fe0783e42be3093d8ef1b0ecdc22c34c0d69640dfb37f56925cb141/anytree-2.13.0-py3-none-any.whl", hash = "sha256:4cbcf10df36b1f1cba131b7e487ff3edafc9d6e932a3c70071b5b768bab901ff", size = 45077 }, ] [[package]] name = "appdirs" version = "1.4.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470, upload-time = "2020-05-11T07:59:51.037Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566, upload-time = "2020-05-11T07:59:49.499Z" }, + { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566 }, ] [[package]] name = "appnope" version = "0.1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170 } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 }, ] [[package]] @@ -115,36 +114,36 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/18/74/dfb75f9ccd592bbedb175d4a32fc643cf569d7c218508bfbd6ea7ef9c091/astroid-3.3.11.tar.gz", hash = "sha256:1e5a5011af2920c7c67a53f65d536d65bfa7116feeaf2354d8b94f29573bb0ce", size = 400439, upload-time = "2025-07-13T18:04:23.177Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/74/dfb75f9ccd592bbedb175d4a32fc643cf569d7c218508bfbd6ea7ef9c091/astroid-3.3.11.tar.gz", hash = "sha256:1e5a5011af2920c7c67a53f65d536d65bfa7116feeaf2354d8b94f29573bb0ce", size = 400439 } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/0f/3b8fdc946b4d9cc8cc1e8af42c4e409468c84441b933d037e101b3d72d86/astroid-3.3.11-py3-none-any.whl", hash = "sha256:54c760ae8322ece1abd213057c4b5bba7c49818853fc901ef09719a60dbf9dec", size = 275612, upload-time = "2025-07-13T18:04:21.07Z" }, + { url = "https://files.pythonhosted.org/packages/af/0f/3b8fdc946b4d9cc8cc1e8af42c4e409468c84441b933d037e101b3d72d86/astroid-3.3.11-py3-none-any.whl", hash = "sha256:54c760ae8322ece1abd213057c4b5bba7c49818853fc901ef09719a60dbf9dec", size = 275612 }, ] [[package]] name = "asttokens" version = "3.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload-time = "2024-11-30T04:30:14.439Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918, upload-time = "2024-11-30T04:30:10.946Z" }, + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 }, ] [[package]] name = "attrs" version = "25.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032 } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 }, ] [[package]] name = "babel" version = "2.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537 }, ] [[package]] @@ -155,9 +154,9 @@ dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload-time = "2025-04-15T17:05:13.836Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067 } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload-time = "2025-04-15T17:05:12.221Z" }, + { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285 }, ] [[package]] @@ -168,16 +167,16 @@ dependencies = [ { name = "ldpc" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/30/acae841730ae267d839a93390f84e9175dd66d6f48b4b76d2f9c7525ce37/bposd-1.6-py3-none-any.whl", hash = "sha256:80e439246c11ca824610f9bc7858c68eb1f8a6b7cbb71760cf6c86e03c47ff5d", size = 16405, upload-time = "2022-04-14T15:53:53.661Z" }, + { url = "https://files.pythonhosted.org/packages/ad/30/acae841730ae267d839a93390f84e9175dd66d6f48b4b76d2f9c7525ce37/bposd-1.6-py3-none-any.whl", hash = "sha256:80e439246c11ca824610f9bc7858c68eb1f8a6b7cbb71760cf6c86e03c47ff5d", size = 16405 }, ] [[package]] name = "certifi" version = "2025.7.14" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/76/52c535bcebe74590f296d6c77c86dabf761c41980e1347a2422e4aa2ae41/certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995", size = 163981, upload-time = "2025-07-14T03:29:28.449Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/76/52c535bcebe74590f296d6c77c86dabf761c41980e1347a2422e4aa2ae41/certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995", size = 163981 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/52/34c6cf5bb9285074dc3531c437b3919e825d976fde097a7a73f79e726d03/certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2", size = 162722, upload-time = "2025-07-14T03:29:26.863Z" }, + { url = "https://files.pythonhosted.org/packages/4f/52/34c6cf5bb9285074dc3531c437b3919e825d976fde097a7a73f79e726d03/certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2", size = 162722 }, ] [[package]] @@ -187,140 +186,140 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload-time = "2024-09-04T20:45:21.852Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191, upload-time = "2024-09-04T20:43:30.027Z" }, - { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592, upload-time = "2024-09-04T20:43:32.108Z" }, - { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024, upload-time = "2024-09-04T20:43:34.186Z" }, - { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188, upload-time = "2024-09-04T20:43:36.286Z" }, - { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571, upload-time = "2024-09-04T20:43:38.586Z" }, - { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687, upload-time = "2024-09-04T20:43:40.084Z" }, - { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211, upload-time = "2024-09-04T20:43:41.526Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325, upload-time = "2024-09-04T20:43:43.117Z" }, - { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784, upload-time = "2024-09-04T20:43:45.256Z" }, - { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564, upload-time = "2024-09-04T20:43:46.779Z" }, - { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804, upload-time = "2024-09-04T20:43:48.186Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299, upload-time = "2024-09-04T20:43:49.812Z" }, - { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264, upload-time = "2024-09-04T20:43:51.124Z" }, - { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651, upload-time = "2024-09-04T20:43:52.872Z" }, - { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259, upload-time = "2024-09-04T20:43:56.123Z" }, - { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200, upload-time = "2024-09-04T20:43:57.891Z" }, - { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235, upload-time = "2024-09-04T20:44:00.18Z" }, - { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721, upload-time = "2024-09-04T20:44:01.585Z" }, - { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242, upload-time = "2024-09-04T20:44:03.467Z" }, - { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999, upload-time = "2024-09-04T20:44:05.023Z" }, - { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242, upload-time = "2024-09-04T20:44:06.444Z" }, - { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604, upload-time = "2024-09-04T20:44:08.206Z" }, - { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727, upload-time = "2024-09-04T20:44:09.481Z" }, - { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400, upload-time = "2024-09-04T20:44:10.873Z" }, - { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload-time = "2024-09-04T20:44:12.232Z" }, - { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload-time = "2024-09-04T20:44:13.739Z" }, - { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload-time = "2024-09-04T20:44:15.231Z" }, - { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload-time = "2024-09-04T20:44:17.188Z" }, - { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload-time = "2024-09-04T20:44:18.688Z" }, - { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload-time = "2024-09-04T20:44:20.248Z" }, - { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload-time = "2024-09-04T20:44:21.673Z" }, - { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload-time = "2024-09-04T20:44:23.245Z" }, - { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload-time = "2024-09-04T20:44:24.757Z" }, - { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload-time = "2024-09-04T20:44:26.208Z" }, - { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload-time = "2024-09-04T20:44:27.578Z" }, - { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload-time = "2024-09-04T20:44:28.956Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload-time = "2024-09-04T20:44:30.289Z" }, - { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload-time = "2024-09-04T20:44:32.01Z" }, - { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload-time = "2024-09-04T20:44:33.606Z" }, - { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload-time = "2024-09-04T20:44:35.191Z" }, - { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload-time = "2024-09-04T20:44:36.743Z" }, - { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload-time = "2024-09-04T20:44:38.492Z" }, - { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload-time = "2024-09-04T20:44:40.046Z" }, - { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload-time = "2024-09-04T20:44:41.616Z" }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload-time = "2024-09-04T20:44:43.733Z" }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" }, - { url = "https://files.pythonhosted.org/packages/b9/ea/8bb50596b8ffbc49ddd7a1ad305035daa770202a6b782fc164647c2673ad/cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", size = 182220, upload-time = "2024-09-04T20:45:01.577Z" }, - { url = "https://files.pythonhosted.org/packages/ae/11/e77c8cd24f58285a82c23af484cf5b124a376b32644e445960d1a4654c3a/cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", size = 178605, upload-time = "2024-09-04T20:45:03.837Z" }, - { url = "https://files.pythonhosted.org/packages/ed/65/25a8dc32c53bf5b7b6c2686b42ae2ad58743f7ff644844af7cdb29b49361/cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", size = 424910, upload-time = "2024-09-04T20:45:05.315Z" }, - { url = "https://files.pythonhosted.org/packages/42/7a/9d086fab7c66bd7c4d0f27c57a1b6b068ced810afc498cc8c49e0088661c/cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", size = 447200, upload-time = "2024-09-04T20:45:06.903Z" }, - { url = "https://files.pythonhosted.org/packages/da/63/1785ced118ce92a993b0ec9e0d0ac8dc3e5dbfbcaa81135be56c69cabbb6/cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", size = 454565, upload-time = "2024-09-04T20:45:08.975Z" }, - { url = "https://files.pythonhosted.org/packages/74/06/90b8a44abf3556599cdec107f7290277ae8901a58f75e6fe8f970cd72418/cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", size = 435635, upload-time = "2024-09-04T20:45:10.64Z" }, - { url = "https://files.pythonhosted.org/packages/bd/62/a1f468e5708a70b1d86ead5bab5520861d9c7eacce4a885ded9faa7729c3/cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", size = 445218, upload-time = "2024-09-04T20:45:12.366Z" }, - { url = "https://files.pythonhosted.org/packages/5b/95/b34462f3ccb09c2594aa782d90a90b045de4ff1f70148ee79c69d37a0a5a/cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", size = 460486, upload-time = "2024-09-04T20:45:13.935Z" }, - { url = "https://files.pythonhosted.org/packages/fc/fc/a1e4bebd8d680febd29cf6c8a40067182b64f00c7d105f8f26b5bc54317b/cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", size = 437911, upload-time = "2024-09-04T20:45:15.696Z" }, - { url = "https://files.pythonhosted.org/packages/e6/c3/21cab7a6154b6a5ea330ae80de386e7665254835b9e98ecc1340b3a7de9a/cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", size = 460632, upload-time = "2024-09-04T20:45:17.284Z" }, - { url = "https://files.pythonhosted.org/packages/cb/b5/fd9f8b5a84010ca169ee49f4e4ad6f8c05f4e3545b72ee041dbbcb159882/cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", size = 171820, upload-time = "2024-09-04T20:45:18.762Z" }, - { url = "https://files.pythonhosted.org/packages/8c/52/b08750ce0bce45c143e1b5d7357ee8c55341b52bdef4b0f081af1eb248c2/cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", size = 181290, upload-time = "2024-09-04T20:45:20.226Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 }, + { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 }, + { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 }, + { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 }, + { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 }, + { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 }, + { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 }, + { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 }, + { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 }, + { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 }, + { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 }, + { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 }, + { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, + { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, + { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, + { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, + { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, + { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, + { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, + { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, + { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, + { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, + { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, + { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, + { url = "https://files.pythonhosted.org/packages/b9/ea/8bb50596b8ffbc49ddd7a1ad305035daa770202a6b782fc164647c2673ad/cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", size = 182220 }, + { url = "https://files.pythonhosted.org/packages/ae/11/e77c8cd24f58285a82c23af484cf5b124a376b32644e445960d1a4654c3a/cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", size = 178605 }, + { url = "https://files.pythonhosted.org/packages/ed/65/25a8dc32c53bf5b7b6c2686b42ae2ad58743f7ff644844af7cdb29b49361/cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", size = 424910 }, + { url = "https://files.pythonhosted.org/packages/42/7a/9d086fab7c66bd7c4d0f27c57a1b6b068ced810afc498cc8c49e0088661c/cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", size = 447200 }, + { url = "https://files.pythonhosted.org/packages/da/63/1785ced118ce92a993b0ec9e0d0ac8dc3e5dbfbcaa81135be56c69cabbb6/cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", size = 454565 }, + { url = "https://files.pythonhosted.org/packages/74/06/90b8a44abf3556599cdec107f7290277ae8901a58f75e6fe8f970cd72418/cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", size = 435635 }, + { url = "https://files.pythonhosted.org/packages/bd/62/a1f468e5708a70b1d86ead5bab5520861d9c7eacce4a885ded9faa7729c3/cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", size = 445218 }, + { url = "https://files.pythonhosted.org/packages/5b/95/b34462f3ccb09c2594aa782d90a90b045de4ff1f70148ee79c69d37a0a5a/cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", size = 460486 }, + { url = "https://files.pythonhosted.org/packages/fc/fc/a1e4bebd8d680febd29cf6c8a40067182b64f00c7d105f8f26b5bc54317b/cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", size = 437911 }, + { url = "https://files.pythonhosted.org/packages/e6/c3/21cab7a6154b6a5ea330ae80de386e7665254835b9e98ecc1340b3a7de9a/cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", size = 460632 }, + { url = "https://files.pythonhosted.org/packages/cb/b5/fd9f8b5a84010ca169ee49f4e4ad6f8c05f4e3545b72ee041dbbcb159882/cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", size = 171820 }, + { url = "https://files.pythonhosted.org/packages/8c/52/b08750ce0bce45c143e1b5d7357ee8c55341b52bdef4b0f081af1eb248c2/cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", size = 181290 }, ] [[package]] name = "charset-normalizer" version = "3.4.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/28/9901804da60055b406e1a1c5ba7aac1276fb77f1dde635aabfc7fd84b8ab/charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", size = 201818, upload-time = "2025-05-02T08:31:46.725Z" }, - { url = "https://files.pythonhosted.org/packages/d9/9b/892a8c8af9110935e5adcbb06d9c6fe741b6bb02608c6513983048ba1a18/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", size = 144649, upload-time = "2025-05-02T08:31:48.889Z" }, - { url = "https://files.pythonhosted.org/packages/7b/a5/4179abd063ff6414223575e008593861d62abfc22455b5d1a44995b7c101/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", size = 155045, upload-time = "2025-05-02T08:31:50.757Z" }, - { url = "https://files.pythonhosted.org/packages/3b/95/bc08c7dfeddd26b4be8c8287b9bb055716f31077c8b0ea1cd09553794665/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", size = 147356, upload-time = "2025-05-02T08:31:52.634Z" }, - { url = "https://files.pythonhosted.org/packages/a8/2d/7a5b635aa65284bf3eab7653e8b4151ab420ecbae918d3e359d1947b4d61/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", size = 149471, upload-time = "2025-05-02T08:31:56.207Z" }, - { url = "https://files.pythonhosted.org/packages/ae/38/51fc6ac74251fd331a8cfdb7ec57beba8c23fd5493f1050f71c87ef77ed0/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", size = 151317, upload-time = "2025-05-02T08:31:57.613Z" }, - { url = "https://files.pythonhosted.org/packages/b7/17/edee1e32215ee6e9e46c3e482645b46575a44a2d72c7dfd49e49f60ce6bf/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", size = 146368, upload-time = "2025-05-02T08:31:59.468Z" }, - { url = "https://files.pythonhosted.org/packages/26/2c/ea3e66f2b5f21fd00b2825c94cafb8c326ea6240cd80a91eb09e4a285830/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", size = 154491, upload-time = "2025-05-02T08:32:01.219Z" }, - { url = "https://files.pythonhosted.org/packages/52/47/7be7fa972422ad062e909fd62460d45c3ef4c141805b7078dbab15904ff7/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", size = 157695, upload-time = "2025-05-02T08:32:03.045Z" }, - { url = "https://files.pythonhosted.org/packages/2f/42/9f02c194da282b2b340f28e5fb60762de1151387a36842a92b533685c61e/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", size = 154849, upload-time = "2025-05-02T08:32:04.651Z" }, - { url = "https://files.pythonhosted.org/packages/67/44/89cacd6628f31fb0b63201a618049be4be2a7435a31b55b5eb1c3674547a/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", size = 150091, upload-time = "2025-05-02T08:32:06.719Z" }, - { url = "https://files.pythonhosted.org/packages/1f/79/4b8da9f712bc079c0f16b6d67b099b0b8d808c2292c937f267d816ec5ecc/charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", size = 98445, upload-time = "2025-05-02T08:32:08.66Z" }, - { url = "https://files.pythonhosted.org/packages/7d/d7/96970afb4fb66497a40761cdf7bd4f6fca0fc7bafde3a84f836c1f57a926/charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", size = 105782, upload-time = "2025-05-02T08:32:10.46Z" }, - { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload-time = "2025-05-02T08:32:11.945Z" }, - { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload-time = "2025-05-02T08:32:13.946Z" }, - { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload-time = "2025-05-02T08:32:15.873Z" }, - { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload-time = "2025-05-02T08:32:17.283Z" }, - { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload-time = "2025-05-02T08:32:18.807Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload-time = "2025-05-02T08:32:20.333Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload-time = "2025-05-02T08:32:21.86Z" }, - { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload-time = "2025-05-02T08:32:23.434Z" }, - { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload-time = "2025-05-02T08:32:24.993Z" }, - { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload-time = "2025-05-02T08:32:26.435Z" }, - { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload-time = "2025-05-02T08:32:28.376Z" }, - { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload-time = "2025-05-02T08:32:30.281Z" }, - { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload-time = "2025-05-02T08:32:32.191Z" }, - { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload-time = "2025-05-02T08:32:33.712Z" }, - { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload-time = "2025-05-02T08:32:35.768Z" }, - { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload-time = "2025-05-02T08:32:37.284Z" }, - { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload-time = "2025-05-02T08:32:38.803Z" }, - { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload-time = "2025-05-02T08:32:40.251Z" }, - { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload-time = "2025-05-02T08:32:41.705Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload-time = "2025-05-02T08:32:43.709Z" }, - { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload-time = "2025-05-02T08:32:46.197Z" }, - { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload-time = "2025-05-02T08:32:48.105Z" }, - { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload-time = "2025-05-02T08:32:49.719Z" }, - { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload-time = "2025-05-02T08:32:51.404Z" }, - { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload-time = "2025-05-02T08:32:53.079Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload-time = "2025-05-02T08:32:54.573Z" }, - { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" }, - { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" }, - { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" }, - { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" }, - { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" }, - { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" }, - { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" }, - { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" }, - { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" }, - { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" }, - { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" }, - { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload-time = "2025-05-02T08:33:17.06Z" }, - { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload-time = "2025-05-02T08:33:18.753Z" }, - { url = "https://files.pythonhosted.org/packages/28/f8/dfb01ff6cc9af38552c69c9027501ff5a5117c4cc18dcd27cb5259fa1888/charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", size = 201671, upload-time = "2025-05-02T08:34:12.696Z" }, - { url = "https://files.pythonhosted.org/packages/32/fb/74e26ee556a9dbfe3bd264289b67be1e6d616329403036f6507bb9f3f29c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", size = 144744, upload-time = "2025-05-02T08:34:14.665Z" }, - { url = "https://files.pythonhosted.org/packages/ad/06/8499ee5aa7addc6f6d72e068691826ff093329fe59891e83b092ae4c851c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", size = 154993, upload-time = "2025-05-02T08:34:17.134Z" }, - { url = "https://files.pythonhosted.org/packages/f1/a2/5e4c187680728219254ef107a6949c60ee0e9a916a5dadb148c7ae82459c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", size = 147382, upload-time = "2025-05-02T08:34:19.081Z" }, - { url = "https://files.pythonhosted.org/packages/4c/fe/56aca740dda674f0cc1ba1418c4d84534be51f639b5f98f538b332dc9a95/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", size = 149536, upload-time = "2025-05-02T08:34:21.073Z" }, - { url = "https://files.pythonhosted.org/packages/53/13/db2e7779f892386b589173dd689c1b1e304621c5792046edd8a978cbf9e0/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", size = 151349, upload-time = "2025-05-02T08:34:23.193Z" }, - { url = "https://files.pythonhosted.org/packages/69/35/e52ab9a276186f729bce7a0638585d2982f50402046e4b0faa5d2c3ef2da/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", size = 146365, upload-time = "2025-05-02T08:34:25.187Z" }, - { url = "https://files.pythonhosted.org/packages/a6/d8/af7333f732fc2e7635867d56cb7c349c28c7094910c72267586947561b4b/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", size = 154499, upload-time = "2025-05-02T08:34:27.359Z" }, - { url = "https://files.pythonhosted.org/packages/7a/3d/a5b2e48acef264d71e036ff30bcc49e51bde80219bb628ba3e00cf59baac/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", size = 157735, upload-time = "2025-05-02T08:34:29.798Z" }, - { url = "https://files.pythonhosted.org/packages/85/d8/23e2c112532a29f3eef374375a8684a4f3b8e784f62b01da931186f43494/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", size = 154786, upload-time = "2025-05-02T08:34:31.858Z" }, - { url = "https://files.pythonhosted.org/packages/c7/57/93e0169f08ecc20fe82d12254a200dfaceddc1c12a4077bf454ecc597e33/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", size = 150203, upload-time = "2025-05-02T08:34:33.88Z" }, - { url = "https://files.pythonhosted.org/packages/2c/9d/9bf2b005138e7e060d7ebdec7503d0ef3240141587651f4b445bdf7286c2/charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", size = 98436, upload-time = "2025-05-02T08:34:35.907Z" }, - { url = "https://files.pythonhosted.org/packages/6d/24/5849d46cf4311bbf21b424c443b09b459f5b436b1558c04e45dbb7cc478b/charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", size = 105772, upload-time = "2025-05-02T08:34:37.935Z" }, - { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/28/9901804da60055b406e1a1c5ba7aac1276fb77f1dde635aabfc7fd84b8ab/charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", size = 201818 }, + { url = "https://files.pythonhosted.org/packages/d9/9b/892a8c8af9110935e5adcbb06d9c6fe741b6bb02608c6513983048ba1a18/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", size = 144649 }, + { url = "https://files.pythonhosted.org/packages/7b/a5/4179abd063ff6414223575e008593861d62abfc22455b5d1a44995b7c101/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", size = 155045 }, + { url = "https://files.pythonhosted.org/packages/3b/95/bc08c7dfeddd26b4be8c8287b9bb055716f31077c8b0ea1cd09553794665/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", size = 147356 }, + { url = "https://files.pythonhosted.org/packages/a8/2d/7a5b635aa65284bf3eab7653e8b4151ab420ecbae918d3e359d1947b4d61/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", size = 149471 }, + { url = "https://files.pythonhosted.org/packages/ae/38/51fc6ac74251fd331a8cfdb7ec57beba8c23fd5493f1050f71c87ef77ed0/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", size = 151317 }, + { url = "https://files.pythonhosted.org/packages/b7/17/edee1e32215ee6e9e46c3e482645b46575a44a2d72c7dfd49e49f60ce6bf/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", size = 146368 }, + { url = "https://files.pythonhosted.org/packages/26/2c/ea3e66f2b5f21fd00b2825c94cafb8c326ea6240cd80a91eb09e4a285830/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", size = 154491 }, + { url = "https://files.pythonhosted.org/packages/52/47/7be7fa972422ad062e909fd62460d45c3ef4c141805b7078dbab15904ff7/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", size = 157695 }, + { url = "https://files.pythonhosted.org/packages/2f/42/9f02c194da282b2b340f28e5fb60762de1151387a36842a92b533685c61e/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", size = 154849 }, + { url = "https://files.pythonhosted.org/packages/67/44/89cacd6628f31fb0b63201a618049be4be2a7435a31b55b5eb1c3674547a/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", size = 150091 }, + { url = "https://files.pythonhosted.org/packages/1f/79/4b8da9f712bc079c0f16b6d67b099b0b8d808c2292c937f267d816ec5ecc/charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", size = 98445 }, + { url = "https://files.pythonhosted.org/packages/7d/d7/96970afb4fb66497a40761cdf7bd4f6fca0fc7bafde3a84f836c1f57a926/charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", size = 105782 }, + { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794 }, + { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846 }, + { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350 }, + { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657 }, + { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260 }, + { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164 }, + { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571 }, + { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952 }, + { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959 }, + { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030 }, + { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015 }, + { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106 }, + { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402 }, + { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936 }, + { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790 }, + { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924 }, + { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626 }, + { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567 }, + { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957 }, + { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408 }, + { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399 }, + { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815 }, + { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537 }, + { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565 }, + { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357 }, + { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776 }, + { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622 }, + { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435 }, + { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653 }, + { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231 }, + { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243 }, + { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442 }, + { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147 }, + { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057 }, + { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454 }, + { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174 }, + { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166 }, + { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064 }, + { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641 }, + { url = "https://files.pythonhosted.org/packages/28/f8/dfb01ff6cc9af38552c69c9027501ff5a5117c4cc18dcd27cb5259fa1888/charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", size = 201671 }, + { url = "https://files.pythonhosted.org/packages/32/fb/74e26ee556a9dbfe3bd264289b67be1e6d616329403036f6507bb9f3f29c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", size = 144744 }, + { url = "https://files.pythonhosted.org/packages/ad/06/8499ee5aa7addc6f6d72e068691826ff093329fe59891e83b092ae4c851c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", size = 154993 }, + { url = "https://files.pythonhosted.org/packages/f1/a2/5e4c187680728219254ef107a6949c60ee0e9a916a5dadb148c7ae82459c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", size = 147382 }, + { url = "https://files.pythonhosted.org/packages/4c/fe/56aca740dda674f0cc1ba1418c4d84534be51f639b5f98f538b332dc9a95/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", size = 149536 }, + { url = "https://files.pythonhosted.org/packages/53/13/db2e7779f892386b589173dd689c1b1e304621c5792046edd8a978cbf9e0/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", size = 151349 }, + { url = "https://files.pythonhosted.org/packages/69/35/e52ab9a276186f729bce7a0638585d2982f50402046e4b0faa5d2c3ef2da/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", size = 146365 }, + { url = "https://files.pythonhosted.org/packages/a6/d8/af7333f732fc2e7635867d56cb7c349c28c7094910c72267586947561b4b/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", size = 154499 }, + { url = "https://files.pythonhosted.org/packages/7a/3d/a5b2e48acef264d71e036ff30bcc49e51bde80219bb628ba3e00cf59baac/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", size = 157735 }, + { url = "https://files.pythonhosted.org/packages/85/d8/23e2c112532a29f3eef374375a8684a4f3b8e784f62b01da931186f43494/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", size = 154786 }, + { url = "https://files.pythonhosted.org/packages/c7/57/93e0169f08ecc20fe82d12254a200dfaceddc1c12a4077bf454ecc597e33/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", size = 150203 }, + { url = "https://files.pythonhosted.org/packages/2c/9d/9bf2b005138e7e060d7ebdec7503d0ef3240141587651f4b445bdf7286c2/charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", size = 98436 }, + { url = "https://files.pythonhosted.org/packages/6d/24/5849d46cf4311bbf21b424c443b09b459f5b436b1558c04e45dbb7cc478b/charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", size = 105772 }, + { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626 }, ] [[package]] @@ -332,7 +331,7 @@ dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/30/7c/8cd37f6f0bf0eae8c63b4366eddf84a7df230930fd5594da538c42810557/chp_sim-0.1.1-py3-none-any.whl", hash = "sha256:760cbab16cbd6d96923d2a1db790158b0d9f23ceacf1ae56220492b1b5941524", size = 11172, upload-time = "2019-07-03T22:04:49.178Z" }, + { url = "https://files.pythonhosted.org/packages/30/7c/8cd37f6f0bf0eae8c63b4366eddf84a7df230930fd5594da538c42810557/chp_sim-0.1.1-py3-none-any.whl", hash = "sha256:760cbab16cbd6d96923d2a1db790158b0d9f23ceacf1ae56220492b1b5941524", size = 11172 }, ] [[package]] @@ -346,9 +345,9 @@ resolution-markers = [ dependencies = [ { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, ] [[package]] @@ -364,27 +363,27 @@ resolution-markers = [ dependencies = [ { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342 } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215 }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] [[package]] name = "comm" version = "0.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319 } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294 }, ] [[package]] @@ -398,72 +397,72 @@ resolution-markers = [ dependencies = [ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/f6/31a8f28b4a2a4fa0e01085e542f3081ab0588eff8e589d39d775172c9792/contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4", size = 13464370, upload-time = "2024-08-27T21:00:03.328Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/e0/be8dcc796cfdd96708933e0e2da99ba4bb8f9b2caa9d560a50f3f09a65f3/contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7", size = 265366, upload-time = "2024-08-27T20:50:09.947Z" }, - { url = "https://files.pythonhosted.org/packages/50/d6/c953b400219443535d412fcbbc42e7a5e823291236bc0bb88936e3cc9317/contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42", size = 249226, upload-time = "2024-08-27T20:50:16.1Z" }, - { url = "https://files.pythonhosted.org/packages/6f/b4/6fffdf213ffccc28483c524b9dad46bb78332851133b36ad354b856ddc7c/contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7", size = 308460, upload-time = "2024-08-27T20:50:22.536Z" }, - { url = "https://files.pythonhosted.org/packages/cf/6c/118fc917b4050f0afe07179a6dcbe4f3f4ec69b94f36c9e128c4af480fb8/contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab", size = 347623, upload-time = "2024-08-27T20:50:28.806Z" }, - { url = "https://files.pythonhosted.org/packages/f9/a4/30ff110a81bfe3abf7b9673284d21ddce8cc1278f6f77393c91199da4c90/contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589", size = 317761, upload-time = "2024-08-27T20:50:35.126Z" }, - { url = "https://files.pythonhosted.org/packages/99/e6/d11966962b1aa515f5586d3907ad019f4b812c04e4546cc19ebf62b5178e/contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41", size = 322015, upload-time = "2024-08-27T20:50:40.318Z" }, - { url = "https://files.pythonhosted.org/packages/4d/e3/182383743751d22b7b59c3c753277b6aee3637049197624f333dac5b4c80/contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d", size = 1262672, upload-time = "2024-08-27T20:50:55.643Z" }, - { url = "https://files.pythonhosted.org/packages/78/53/974400c815b2e605f252c8fb9297e2204347d1755a5374354ee77b1ea259/contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223", size = 1321688, upload-time = "2024-08-27T20:51:11.293Z" }, - { url = "https://files.pythonhosted.org/packages/52/29/99f849faed5593b2926a68a31882af98afbeac39c7fdf7de491d9c85ec6a/contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f", size = 171145, upload-time = "2024-08-27T20:51:15.2Z" }, - { url = "https://files.pythonhosted.org/packages/a9/97/3f89bba79ff6ff2b07a3cbc40aa693c360d5efa90d66e914f0ff03b95ec7/contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b", size = 216019, upload-time = "2024-08-27T20:51:19.365Z" }, - { url = "https://files.pythonhosted.org/packages/b3/1f/9375917786cb39270b0ee6634536c0e22abf225825602688990d8f5c6c19/contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad", size = 266356, upload-time = "2024-08-27T20:51:24.146Z" }, - { url = "https://files.pythonhosted.org/packages/05/46/9256dd162ea52790c127cb58cfc3b9e3413a6e3478917d1f811d420772ec/contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49", size = 250915, upload-time = "2024-08-27T20:51:28.683Z" }, - { url = "https://files.pythonhosted.org/packages/e1/5d/3056c167fa4486900dfbd7e26a2fdc2338dc58eee36d490a0ed3ddda5ded/contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66", size = 310443, upload-time = "2024-08-27T20:51:33.675Z" }, - { url = "https://files.pythonhosted.org/packages/ca/c2/1a612e475492e07f11c8e267ea5ec1ce0d89971be496c195e27afa97e14a/contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081", size = 348548, upload-time = "2024-08-27T20:51:39.322Z" }, - { url = "https://files.pythonhosted.org/packages/45/cf/2c2fc6bb5874158277b4faf136847f0689e1b1a1f640a36d76d52e78907c/contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1", size = 319118, upload-time = "2024-08-27T20:51:44.717Z" }, - { url = "https://files.pythonhosted.org/packages/03/33/003065374f38894cdf1040cef474ad0546368eea7e3a51d48b8a423961f8/contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d", size = 323162, upload-time = "2024-08-27T20:51:49.683Z" }, - { url = "https://files.pythonhosted.org/packages/42/80/e637326e85e4105a802e42959f56cff2cd39a6b5ef68d5d9aee3ea5f0e4c/contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c", size = 1265396, upload-time = "2024-08-27T20:52:04.926Z" }, - { url = "https://files.pythonhosted.org/packages/7c/3b/8cbd6416ca1bbc0202b50f9c13b2e0b922b64be888f9d9ee88e6cfabfb51/contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb", size = 1324297, upload-time = "2024-08-27T20:52:21.843Z" }, - { url = "https://files.pythonhosted.org/packages/4d/2c/021a7afaa52fe891f25535506cc861c30c3c4e5a1c1ce94215e04b293e72/contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c", size = 171808, upload-time = "2024-08-27T20:52:25.163Z" }, - { url = "https://files.pythonhosted.org/packages/8d/2f/804f02ff30a7fae21f98198828d0857439ec4c91a96e20cf2d6c49372966/contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67", size = 217181, upload-time = "2024-08-27T20:52:29.13Z" }, - { url = "https://files.pythonhosted.org/packages/c9/92/8e0bbfe6b70c0e2d3d81272b58c98ac69ff1a4329f18c73bd64824d8b12e/contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f", size = 267838, upload-time = "2024-08-27T20:52:33.911Z" }, - { url = "https://files.pythonhosted.org/packages/e3/04/33351c5d5108460a8ce6d512307690b023f0cfcad5899499f5c83b9d63b1/contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6", size = 251549, upload-time = "2024-08-27T20:52:39.179Z" }, - { url = "https://files.pythonhosted.org/packages/51/3d/aa0fe6ae67e3ef9f178389e4caaaa68daf2f9024092aa3c6032e3d174670/contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639", size = 303177, upload-time = "2024-08-27T20:52:44.789Z" }, - { url = "https://files.pythonhosted.org/packages/56/c3/c85a7e3e0cab635575d3b657f9535443a6f5d20fac1a1911eaa4bbe1aceb/contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c", size = 341735, upload-time = "2024-08-27T20:52:51.05Z" }, - { url = "https://files.pythonhosted.org/packages/dd/8d/20f7a211a7be966a53f474bc90b1a8202e9844b3f1ef85f3ae45a77151ee/contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06", size = 314679, upload-time = "2024-08-27T20:52:58.473Z" }, - { url = "https://files.pythonhosted.org/packages/6e/be/524e377567defac0e21a46e2a529652d165fed130a0d8a863219303cee18/contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09", size = 320549, upload-time = "2024-08-27T20:53:06.593Z" }, - { url = "https://files.pythonhosted.org/packages/0f/96/fdb2552a172942d888915f3a6663812e9bc3d359d53dafd4289a0fb462f0/contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd", size = 1263068, upload-time = "2024-08-27T20:53:23.442Z" }, - { url = "https://files.pythonhosted.org/packages/2a/25/632eab595e3140adfa92f1322bf8915f68c932bac468e89eae9974cf1c00/contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35", size = 1322833, upload-time = "2024-08-27T20:53:39.243Z" }, - { url = "https://files.pythonhosted.org/packages/73/e3/69738782e315a1d26d29d71a550dbbe3eb6c653b028b150f70c1a5f4f229/contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb", size = 172681, upload-time = "2024-08-27T20:53:43.05Z" }, - { url = "https://files.pythonhosted.org/packages/0c/89/9830ba00d88e43d15e53d64931e66b8792b46eb25e2050a88fec4a0df3d5/contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b", size = 218283, upload-time = "2024-08-27T20:53:47.232Z" }, - { url = "https://files.pythonhosted.org/packages/53/a1/d20415febfb2267af2d7f06338e82171824d08614084714fb2c1dac9901f/contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3", size = 267879, upload-time = "2024-08-27T20:53:51.597Z" }, - { url = "https://files.pythonhosted.org/packages/aa/45/5a28a3570ff6218d8bdfc291a272a20d2648104815f01f0177d103d985e1/contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7", size = 251573, upload-time = "2024-08-27T20:53:55.659Z" }, - { url = "https://files.pythonhosted.org/packages/39/1c/d3f51540108e3affa84f095c8b04f0aa833bb797bc8baa218a952a98117d/contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84", size = 303184, upload-time = "2024-08-27T20:54:00.225Z" }, - { url = "https://files.pythonhosted.org/packages/00/56/1348a44fb6c3a558c1a3a0cd23d329d604c99d81bf5a4b58c6b71aab328f/contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0", size = 340262, upload-time = "2024-08-27T20:54:05.234Z" }, - { url = "https://files.pythonhosted.org/packages/2b/23/00d665ba67e1bb666152131da07e0f24c95c3632d7722caa97fb61470eca/contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b", size = 313806, upload-time = "2024-08-27T20:54:09.889Z" }, - { url = "https://files.pythonhosted.org/packages/5a/42/3cf40f7040bb8362aea19af9a5fb7b32ce420f645dd1590edcee2c657cd5/contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da", size = 319710, upload-time = "2024-08-27T20:54:14.536Z" }, - { url = "https://files.pythonhosted.org/packages/05/32/f3bfa3fc083b25e1a7ae09197f897476ee68e7386e10404bdf9aac7391f0/contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14", size = 1264107, upload-time = "2024-08-27T20:54:29.735Z" }, - { url = "https://files.pythonhosted.org/packages/1c/1e/1019d34473a736664f2439542b890b2dc4c6245f5c0d8cdfc0ccc2cab80c/contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8", size = 1322458, upload-time = "2024-08-27T20:54:45.507Z" }, - { url = "https://files.pythonhosted.org/packages/22/85/4f8bfd83972cf8909a4d36d16b177f7b8bdd942178ea4bf877d4a380a91c/contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294", size = 172643, upload-time = "2024-08-27T20:55:52.754Z" }, - { url = "https://files.pythonhosted.org/packages/cc/4a/fb3c83c1baba64ba90443626c228ca14f19a87c51975d3b1de308dd2cf08/contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087", size = 218301, upload-time = "2024-08-27T20:55:56.509Z" }, - { url = "https://files.pythonhosted.org/packages/76/65/702f4064f397821fea0cb493f7d3bc95a5d703e20954dce7d6d39bacf378/contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8", size = 278972, upload-time = "2024-08-27T20:54:50.347Z" }, - { url = "https://files.pythonhosted.org/packages/80/85/21f5bba56dba75c10a45ec00ad3b8190dbac7fd9a8a8c46c6116c933e9cf/contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b", size = 263375, upload-time = "2024-08-27T20:54:54.909Z" }, - { url = "https://files.pythonhosted.org/packages/0a/64/084c86ab71d43149f91ab3a4054ccf18565f0a8af36abfa92b1467813ed6/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973", size = 307188, upload-time = "2024-08-27T20:55:00.184Z" }, - { url = "https://files.pythonhosted.org/packages/3d/ff/d61a4c288dc42da0084b8d9dc2aa219a850767165d7d9a9c364ff530b509/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18", size = 345644, upload-time = "2024-08-27T20:55:05.673Z" }, - { url = "https://files.pythonhosted.org/packages/ca/aa/00d2313d35ec03f188e8f0786c2fc61f589306e02fdc158233697546fd58/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8", size = 317141, upload-time = "2024-08-27T20:55:11.047Z" }, - { url = "https://files.pythonhosted.org/packages/8d/6a/b5242c8cb32d87f6abf4f5e3044ca397cb1a76712e3fa2424772e3ff495f/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6", size = 323469, upload-time = "2024-08-27T20:55:15.914Z" }, - { url = "https://files.pythonhosted.org/packages/6f/a6/73e929d43028a9079aca4bde107494864d54f0d72d9db508a51ff0878593/contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2", size = 1260894, upload-time = "2024-08-27T20:55:31.553Z" }, - { url = "https://files.pythonhosted.org/packages/2b/1e/1e726ba66eddf21c940821df8cf1a7d15cb165f0682d62161eaa5e93dae1/contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927", size = 1314829, upload-time = "2024-08-27T20:55:47.837Z" }, - { url = "https://files.pythonhosted.org/packages/b3/e3/b9f72758adb6ef7397327ceb8b9c39c75711affb220e4f53c745ea1d5a9a/contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8", size = 265518, upload-time = "2024-08-27T20:56:01.333Z" }, - { url = "https://files.pythonhosted.org/packages/ec/22/19f5b948367ab5260fb41d842c7a78dae645603881ea6bc39738bcfcabf6/contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c", size = 249350, upload-time = "2024-08-27T20:56:05.432Z" }, - { url = "https://files.pythonhosted.org/packages/26/76/0c7d43263dd00ae21a91a24381b7e813d286a3294d95d179ef3a7b9fb1d7/contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca", size = 309167, upload-time = "2024-08-27T20:56:10.034Z" }, - { url = "https://files.pythonhosted.org/packages/96/3b/cadff6773e89f2a5a492c1a8068e21d3fccaf1a1c1df7d65e7c8e3ef60ba/contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f", size = 348279, upload-time = "2024-08-27T20:56:15.41Z" }, - { url = "https://files.pythonhosted.org/packages/e1/86/158cc43aa549d2081a955ab11c6bdccc7a22caacc2af93186d26f5f48746/contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc", size = 318519, upload-time = "2024-08-27T20:56:21.813Z" }, - { url = "https://files.pythonhosted.org/packages/05/11/57335544a3027e9b96a05948c32e566328e3a2f84b7b99a325b7a06d2b06/contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2", size = 321922, upload-time = "2024-08-27T20:56:26.983Z" }, - { url = "https://files.pythonhosted.org/packages/0b/e3/02114f96543f4a1b694333b92a6dcd4f8eebbefcc3a5f3bbb1316634178f/contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e", size = 1258017, upload-time = "2024-08-27T20:56:42.246Z" }, - { url = "https://files.pythonhosted.org/packages/f3/3b/bfe4c81c6d5881c1c643dde6620be0b42bf8aab155976dd644595cfab95c/contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800", size = 1316773, upload-time = "2024-08-27T20:56:58.58Z" }, - { url = "https://files.pythonhosted.org/packages/f1/17/c52d2970784383cafb0bd918b6fb036d98d96bbf0bc1befb5d1e31a07a70/contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5", size = 171353, upload-time = "2024-08-27T20:57:02.718Z" }, - { url = "https://files.pythonhosted.org/packages/53/23/db9f69676308e094d3c45f20cc52e12d10d64f027541c995d89c11ad5c75/contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843", size = 211817, upload-time = "2024-08-27T20:57:06.328Z" }, - { url = "https://files.pythonhosted.org/packages/d1/09/60e486dc2b64c94ed33e58dcfb6f808192c03dfc5574c016218b9b7680dc/contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c", size = 261886, upload-time = "2024-08-27T20:57:10.863Z" }, - { url = "https://files.pythonhosted.org/packages/19/20/b57f9f7174fcd439a7789fb47d764974ab646fa34d1790551de386457a8e/contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779", size = 311008, upload-time = "2024-08-27T20:57:15.588Z" }, - { url = "https://files.pythonhosted.org/packages/74/fc/5040d42623a1845d4f17a418e590fd7a79ae8cb2bad2b2f83de63c3bdca4/contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4", size = 215690, upload-time = "2024-08-27T20:57:19.321Z" }, - { url = "https://files.pythonhosted.org/packages/2b/24/dc3dcd77ac7460ab7e9d2b01a618cb31406902e50e605a8d6091f0a8f7cc/contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0", size = 261894, upload-time = "2024-08-27T20:57:23.873Z" }, - { url = "https://files.pythonhosted.org/packages/b1/db/531642a01cfec39d1682e46b5457b07cf805e3c3c584ec27e2a6223f8f6c/contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102", size = 311099, upload-time = "2024-08-27T20:57:28.58Z" }, - { url = "https://files.pythonhosted.org/packages/38/1e/94bda024d629f254143a134eead69e21c836429a2a6ce82209a00ddcb79a/contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb", size = 215838, upload-time = "2024-08-27T20:57:32.913Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f5/f6/31a8f28b4a2a4fa0e01085e542f3081ab0588eff8e589d39d775172c9792/contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4", size = 13464370 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/e0/be8dcc796cfdd96708933e0e2da99ba4bb8f9b2caa9d560a50f3f09a65f3/contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7", size = 265366 }, + { url = "https://files.pythonhosted.org/packages/50/d6/c953b400219443535d412fcbbc42e7a5e823291236bc0bb88936e3cc9317/contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42", size = 249226 }, + { url = "https://files.pythonhosted.org/packages/6f/b4/6fffdf213ffccc28483c524b9dad46bb78332851133b36ad354b856ddc7c/contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7", size = 308460 }, + { url = "https://files.pythonhosted.org/packages/cf/6c/118fc917b4050f0afe07179a6dcbe4f3f4ec69b94f36c9e128c4af480fb8/contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab", size = 347623 }, + { url = "https://files.pythonhosted.org/packages/f9/a4/30ff110a81bfe3abf7b9673284d21ddce8cc1278f6f77393c91199da4c90/contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589", size = 317761 }, + { url = "https://files.pythonhosted.org/packages/99/e6/d11966962b1aa515f5586d3907ad019f4b812c04e4546cc19ebf62b5178e/contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41", size = 322015 }, + { url = "https://files.pythonhosted.org/packages/4d/e3/182383743751d22b7b59c3c753277b6aee3637049197624f333dac5b4c80/contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d", size = 1262672 }, + { url = "https://files.pythonhosted.org/packages/78/53/974400c815b2e605f252c8fb9297e2204347d1755a5374354ee77b1ea259/contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223", size = 1321688 }, + { url = "https://files.pythonhosted.org/packages/52/29/99f849faed5593b2926a68a31882af98afbeac39c7fdf7de491d9c85ec6a/contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f", size = 171145 }, + { url = "https://files.pythonhosted.org/packages/a9/97/3f89bba79ff6ff2b07a3cbc40aa693c360d5efa90d66e914f0ff03b95ec7/contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b", size = 216019 }, + { url = "https://files.pythonhosted.org/packages/b3/1f/9375917786cb39270b0ee6634536c0e22abf225825602688990d8f5c6c19/contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad", size = 266356 }, + { url = "https://files.pythonhosted.org/packages/05/46/9256dd162ea52790c127cb58cfc3b9e3413a6e3478917d1f811d420772ec/contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49", size = 250915 }, + { url = "https://files.pythonhosted.org/packages/e1/5d/3056c167fa4486900dfbd7e26a2fdc2338dc58eee36d490a0ed3ddda5ded/contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66", size = 310443 }, + { url = "https://files.pythonhosted.org/packages/ca/c2/1a612e475492e07f11c8e267ea5ec1ce0d89971be496c195e27afa97e14a/contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081", size = 348548 }, + { url = "https://files.pythonhosted.org/packages/45/cf/2c2fc6bb5874158277b4faf136847f0689e1b1a1f640a36d76d52e78907c/contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1", size = 319118 }, + { url = "https://files.pythonhosted.org/packages/03/33/003065374f38894cdf1040cef474ad0546368eea7e3a51d48b8a423961f8/contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d", size = 323162 }, + { url = "https://files.pythonhosted.org/packages/42/80/e637326e85e4105a802e42959f56cff2cd39a6b5ef68d5d9aee3ea5f0e4c/contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c", size = 1265396 }, + { url = "https://files.pythonhosted.org/packages/7c/3b/8cbd6416ca1bbc0202b50f9c13b2e0b922b64be888f9d9ee88e6cfabfb51/contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb", size = 1324297 }, + { url = "https://files.pythonhosted.org/packages/4d/2c/021a7afaa52fe891f25535506cc861c30c3c4e5a1c1ce94215e04b293e72/contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c", size = 171808 }, + { url = "https://files.pythonhosted.org/packages/8d/2f/804f02ff30a7fae21f98198828d0857439ec4c91a96e20cf2d6c49372966/contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67", size = 217181 }, + { url = "https://files.pythonhosted.org/packages/c9/92/8e0bbfe6b70c0e2d3d81272b58c98ac69ff1a4329f18c73bd64824d8b12e/contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f", size = 267838 }, + { url = "https://files.pythonhosted.org/packages/e3/04/33351c5d5108460a8ce6d512307690b023f0cfcad5899499f5c83b9d63b1/contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6", size = 251549 }, + { url = "https://files.pythonhosted.org/packages/51/3d/aa0fe6ae67e3ef9f178389e4caaaa68daf2f9024092aa3c6032e3d174670/contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639", size = 303177 }, + { url = "https://files.pythonhosted.org/packages/56/c3/c85a7e3e0cab635575d3b657f9535443a6f5d20fac1a1911eaa4bbe1aceb/contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c", size = 341735 }, + { url = "https://files.pythonhosted.org/packages/dd/8d/20f7a211a7be966a53f474bc90b1a8202e9844b3f1ef85f3ae45a77151ee/contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06", size = 314679 }, + { url = "https://files.pythonhosted.org/packages/6e/be/524e377567defac0e21a46e2a529652d165fed130a0d8a863219303cee18/contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09", size = 320549 }, + { url = "https://files.pythonhosted.org/packages/0f/96/fdb2552a172942d888915f3a6663812e9bc3d359d53dafd4289a0fb462f0/contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd", size = 1263068 }, + { url = "https://files.pythonhosted.org/packages/2a/25/632eab595e3140adfa92f1322bf8915f68c932bac468e89eae9974cf1c00/contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35", size = 1322833 }, + { url = "https://files.pythonhosted.org/packages/73/e3/69738782e315a1d26d29d71a550dbbe3eb6c653b028b150f70c1a5f4f229/contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb", size = 172681 }, + { url = "https://files.pythonhosted.org/packages/0c/89/9830ba00d88e43d15e53d64931e66b8792b46eb25e2050a88fec4a0df3d5/contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b", size = 218283 }, + { url = "https://files.pythonhosted.org/packages/53/a1/d20415febfb2267af2d7f06338e82171824d08614084714fb2c1dac9901f/contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3", size = 267879 }, + { url = "https://files.pythonhosted.org/packages/aa/45/5a28a3570ff6218d8bdfc291a272a20d2648104815f01f0177d103d985e1/contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7", size = 251573 }, + { url = "https://files.pythonhosted.org/packages/39/1c/d3f51540108e3affa84f095c8b04f0aa833bb797bc8baa218a952a98117d/contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84", size = 303184 }, + { url = "https://files.pythonhosted.org/packages/00/56/1348a44fb6c3a558c1a3a0cd23d329d604c99d81bf5a4b58c6b71aab328f/contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0", size = 340262 }, + { url = "https://files.pythonhosted.org/packages/2b/23/00d665ba67e1bb666152131da07e0f24c95c3632d7722caa97fb61470eca/contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b", size = 313806 }, + { url = "https://files.pythonhosted.org/packages/5a/42/3cf40f7040bb8362aea19af9a5fb7b32ce420f645dd1590edcee2c657cd5/contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da", size = 319710 }, + { url = "https://files.pythonhosted.org/packages/05/32/f3bfa3fc083b25e1a7ae09197f897476ee68e7386e10404bdf9aac7391f0/contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14", size = 1264107 }, + { url = "https://files.pythonhosted.org/packages/1c/1e/1019d34473a736664f2439542b890b2dc4c6245f5c0d8cdfc0ccc2cab80c/contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8", size = 1322458 }, + { url = "https://files.pythonhosted.org/packages/22/85/4f8bfd83972cf8909a4d36d16b177f7b8bdd942178ea4bf877d4a380a91c/contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294", size = 172643 }, + { url = "https://files.pythonhosted.org/packages/cc/4a/fb3c83c1baba64ba90443626c228ca14f19a87c51975d3b1de308dd2cf08/contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087", size = 218301 }, + { url = "https://files.pythonhosted.org/packages/76/65/702f4064f397821fea0cb493f7d3bc95a5d703e20954dce7d6d39bacf378/contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8", size = 278972 }, + { url = "https://files.pythonhosted.org/packages/80/85/21f5bba56dba75c10a45ec00ad3b8190dbac7fd9a8a8c46c6116c933e9cf/contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b", size = 263375 }, + { url = "https://files.pythonhosted.org/packages/0a/64/084c86ab71d43149f91ab3a4054ccf18565f0a8af36abfa92b1467813ed6/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973", size = 307188 }, + { url = "https://files.pythonhosted.org/packages/3d/ff/d61a4c288dc42da0084b8d9dc2aa219a850767165d7d9a9c364ff530b509/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18", size = 345644 }, + { url = "https://files.pythonhosted.org/packages/ca/aa/00d2313d35ec03f188e8f0786c2fc61f589306e02fdc158233697546fd58/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8", size = 317141 }, + { url = "https://files.pythonhosted.org/packages/8d/6a/b5242c8cb32d87f6abf4f5e3044ca397cb1a76712e3fa2424772e3ff495f/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6", size = 323469 }, + { url = "https://files.pythonhosted.org/packages/6f/a6/73e929d43028a9079aca4bde107494864d54f0d72d9db508a51ff0878593/contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2", size = 1260894 }, + { url = "https://files.pythonhosted.org/packages/2b/1e/1e726ba66eddf21c940821df8cf1a7d15cb165f0682d62161eaa5e93dae1/contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927", size = 1314829 }, + { url = "https://files.pythonhosted.org/packages/b3/e3/b9f72758adb6ef7397327ceb8b9c39c75711affb220e4f53c745ea1d5a9a/contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8", size = 265518 }, + { url = "https://files.pythonhosted.org/packages/ec/22/19f5b948367ab5260fb41d842c7a78dae645603881ea6bc39738bcfcabf6/contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c", size = 249350 }, + { url = "https://files.pythonhosted.org/packages/26/76/0c7d43263dd00ae21a91a24381b7e813d286a3294d95d179ef3a7b9fb1d7/contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca", size = 309167 }, + { url = "https://files.pythonhosted.org/packages/96/3b/cadff6773e89f2a5a492c1a8068e21d3fccaf1a1c1df7d65e7c8e3ef60ba/contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f", size = 348279 }, + { url = "https://files.pythonhosted.org/packages/e1/86/158cc43aa549d2081a955ab11c6bdccc7a22caacc2af93186d26f5f48746/contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc", size = 318519 }, + { url = "https://files.pythonhosted.org/packages/05/11/57335544a3027e9b96a05948c32e566328e3a2f84b7b99a325b7a06d2b06/contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2", size = 321922 }, + { url = "https://files.pythonhosted.org/packages/0b/e3/02114f96543f4a1b694333b92a6dcd4f8eebbefcc3a5f3bbb1316634178f/contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e", size = 1258017 }, + { url = "https://files.pythonhosted.org/packages/f3/3b/bfe4c81c6d5881c1c643dde6620be0b42bf8aab155976dd644595cfab95c/contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800", size = 1316773 }, + { url = "https://files.pythonhosted.org/packages/f1/17/c52d2970784383cafb0bd918b6fb036d98d96bbf0bc1befb5d1e31a07a70/contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5", size = 171353 }, + { url = "https://files.pythonhosted.org/packages/53/23/db9f69676308e094d3c45f20cc52e12d10d64f027541c995d89c11ad5c75/contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843", size = 211817 }, + { url = "https://files.pythonhosted.org/packages/d1/09/60e486dc2b64c94ed33e58dcfb6f808192c03dfc5574c016218b9b7680dc/contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c", size = 261886 }, + { url = "https://files.pythonhosted.org/packages/19/20/b57f9f7174fcd439a7789fb47d764974ab646fa34d1790551de386457a8e/contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779", size = 311008 }, + { url = "https://files.pythonhosted.org/packages/74/fc/5040d42623a1845d4f17a418e590fd7a79ae8cb2bad2b2f83de63c3bdca4/contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4", size = 215690 }, + { url = "https://files.pythonhosted.org/packages/2b/24/dc3dcd77ac7460ab7e9d2b01a618cb31406902e50e605a8d6091f0a8f7cc/contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0", size = 261894 }, + { url = "https://files.pythonhosted.org/packages/b1/db/531642a01cfec39d1682e46b5457b07cf805e3c3c584ec27e2a6223f8f6c/contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102", size = 311099 }, + { url = "https://files.pythonhosted.org/packages/38/1e/94bda024d629f254143a134eead69e21c836429a2a6ce82209a00ddcb79a/contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb", size = 215838 }, ] [[package]] @@ -476,64 +475,64 @@ resolution-markers = [ dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/a3/da4153ec8fe25d263aa48c1a4cbde7f49b59af86f0b6f7862788c60da737/contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", size = 268551, upload-time = "2025-04-15T17:34:46.581Z" }, - { url = "https://files.pythonhosted.org/packages/2f/6c/330de89ae1087eb622bfca0177d32a7ece50c3ef07b28002de4757d9d875/contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", size = 253399, upload-time = "2025-04-15T17:34:51.427Z" }, - { url = "https://files.pythonhosted.org/packages/c1/bd/20c6726b1b7f81a8bee5271bed5c165f0a8e1f572578a9d27e2ccb763cb2/contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", size = 312061, upload-time = "2025-04-15T17:34:55.961Z" }, - { url = "https://files.pythonhosted.org/packages/22/fc/a9665c88f8a2473f823cf1ec601de9e5375050f1958cbb356cdf06ef1ab6/contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", size = 351956, upload-time = "2025-04-15T17:35:00.992Z" }, - { url = "https://files.pythonhosted.org/packages/25/eb/9f0a0238f305ad8fb7ef42481020d6e20cf15e46be99a1fcf939546a177e/contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", size = 320872, upload-time = "2025-04-15T17:35:06.177Z" }, - { url = "https://files.pythonhosted.org/packages/32/5c/1ee32d1c7956923202f00cf8d2a14a62ed7517bdc0ee1e55301227fc273c/contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", size = 325027, upload-time = "2025-04-15T17:35:11.244Z" }, - { url = "https://files.pythonhosted.org/packages/83/bf/9baed89785ba743ef329c2b07fd0611d12bfecbedbdd3eeecf929d8d3b52/contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", size = 1306641, upload-time = "2025-04-15T17:35:26.701Z" }, - { url = "https://files.pythonhosted.org/packages/d4/cc/74e5e83d1e35de2d28bd97033426b450bc4fd96e092a1f7a63dc7369b55d/contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", size = 1374075, upload-time = "2025-04-15T17:35:43.204Z" }, - { url = "https://files.pythonhosted.org/packages/0c/42/17f3b798fd5e033b46a16f8d9fcb39f1aba051307f5ebf441bad1ecf78f8/contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", size = 177534, upload-time = "2025-04-15T17:35:46.554Z" }, - { url = "https://files.pythonhosted.org/packages/54/ec/5162b8582f2c994721018d0c9ece9dc6ff769d298a8ac6b6a652c307e7df/contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", size = 221188, upload-time = "2025-04-15T17:35:50.064Z" }, - { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636, upload-time = "2025-04-15T17:35:54.473Z" }, - { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636, upload-time = "2025-04-15T17:35:58.283Z" }, - { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053, upload-time = "2025-04-15T17:36:03.235Z" }, - { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985, upload-time = "2025-04-15T17:36:08.275Z" }, - { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750, upload-time = "2025-04-15T17:36:13.29Z" }, - { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246, upload-time = "2025-04-15T17:36:18.329Z" }, - { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728, upload-time = "2025-04-15T17:36:33.878Z" }, - { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762, upload-time = "2025-04-15T17:36:51.295Z" }, - { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196, upload-time = "2025-04-15T17:36:55.002Z" }, - { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017, upload-time = "2025-04-15T17:36:58.576Z" }, - { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580, upload-time = "2025-04-15T17:37:03.105Z" }, - { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530, upload-time = "2025-04-15T17:37:07.026Z" }, - { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688, upload-time = "2025-04-15T17:37:11.481Z" }, - { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331, upload-time = "2025-04-15T17:37:18.212Z" }, - { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963, upload-time = "2025-04-15T17:37:22.76Z" }, - { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681, upload-time = "2025-04-15T17:37:33.001Z" }, - { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674, upload-time = "2025-04-15T17:37:48.64Z" }, - { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480, upload-time = "2025-04-15T17:38:06.7Z" }, - { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489, upload-time = "2025-04-15T17:38:10.338Z" }, - { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042, upload-time = "2025-04-15T17:38:14.239Z" }, - { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630, upload-time = "2025-04-15T17:38:19.142Z" }, - { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670, upload-time = "2025-04-15T17:38:23.688Z" }, - { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694, upload-time = "2025-04-15T17:38:28.238Z" }, - { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986, upload-time = "2025-04-15T17:38:33.502Z" }, - { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060, upload-time = "2025-04-15T17:38:38.672Z" }, - { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747, upload-time = "2025-04-15T17:38:43.712Z" }, - { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895, upload-time = "2025-04-15T17:39:00.224Z" }, - { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098, upload-time = "2025-04-15T17:43:29.649Z" }, - { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535, upload-time = "2025-04-15T17:44:44.532Z" }, - { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096, upload-time = "2025-04-15T17:44:48.194Z" }, - { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090, upload-time = "2025-04-15T17:43:34.084Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643, upload-time = "2025-04-15T17:43:38.626Z" }, - { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443, upload-time = "2025-04-15T17:43:44.522Z" }, - { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865, upload-time = "2025-04-15T17:43:49.545Z" }, - { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162, upload-time = "2025-04-15T17:43:54.203Z" }, - { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355, upload-time = "2025-04-15T17:44:01.025Z" }, - { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935, upload-time = "2025-04-15T17:44:17.322Z" }, - { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168, upload-time = "2025-04-15T17:44:33.43Z" }, - { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550, upload-time = "2025-04-15T17:44:37.092Z" }, - { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214, upload-time = "2025-04-15T17:44:40.827Z" }, - { url = "https://files.pythonhosted.org/packages/33/05/b26e3c6ecc05f349ee0013f0bb850a761016d89cec528a98193a48c34033/contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c", size = 265681, upload-time = "2025-04-15T17:44:59.314Z" }, - { url = "https://files.pythonhosted.org/packages/2b/25/ac07d6ad12affa7d1ffed11b77417d0a6308170f44ff20fa1d5aa6333f03/contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", size = 315101, upload-time = "2025-04-15T17:45:04.165Z" }, - { url = "https://files.pythonhosted.org/packages/8f/4d/5bb3192bbe9d3f27e3061a6a8e7733c9120e203cb8515767d30973f71030/contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", size = 220599, upload-time = "2025-04-15T17:45:08.456Z" }, - { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807, upload-time = "2025-04-15T17:45:15.535Z" }, - { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729, upload-time = "2025-04-15T17:45:20.166Z" }, - { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791, upload-time = "2025-04-15T17:45:24.794Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/a3/da4153ec8fe25d263aa48c1a4cbde7f49b59af86f0b6f7862788c60da737/contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", size = 268551 }, + { url = "https://files.pythonhosted.org/packages/2f/6c/330de89ae1087eb622bfca0177d32a7ece50c3ef07b28002de4757d9d875/contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", size = 253399 }, + { url = "https://files.pythonhosted.org/packages/c1/bd/20c6726b1b7f81a8bee5271bed5c165f0a8e1f572578a9d27e2ccb763cb2/contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", size = 312061 }, + { url = "https://files.pythonhosted.org/packages/22/fc/a9665c88f8a2473f823cf1ec601de9e5375050f1958cbb356cdf06ef1ab6/contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", size = 351956 }, + { url = "https://files.pythonhosted.org/packages/25/eb/9f0a0238f305ad8fb7ef42481020d6e20cf15e46be99a1fcf939546a177e/contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", size = 320872 }, + { url = "https://files.pythonhosted.org/packages/32/5c/1ee32d1c7956923202f00cf8d2a14a62ed7517bdc0ee1e55301227fc273c/contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", size = 325027 }, + { url = "https://files.pythonhosted.org/packages/83/bf/9baed89785ba743ef329c2b07fd0611d12bfecbedbdd3eeecf929d8d3b52/contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", size = 1306641 }, + { url = "https://files.pythonhosted.org/packages/d4/cc/74e5e83d1e35de2d28bd97033426b450bc4fd96e092a1f7a63dc7369b55d/contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", size = 1374075 }, + { url = "https://files.pythonhosted.org/packages/0c/42/17f3b798fd5e033b46a16f8d9fcb39f1aba051307f5ebf441bad1ecf78f8/contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", size = 177534 }, + { url = "https://files.pythonhosted.org/packages/54/ec/5162b8582f2c994721018d0c9ece9dc6ff769d298a8ac6b6a652c307e7df/contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", size = 221188 }, + { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636 }, + { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636 }, + { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053 }, + { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985 }, + { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750 }, + { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246 }, + { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728 }, + { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762 }, + { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196 }, + { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017 }, + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580 }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530 }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688 }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331 }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963 }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681 }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674 }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480 }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489 }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042 }, + { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630 }, + { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670 }, + { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694 }, + { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986 }, + { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060 }, + { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747 }, + { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895 }, + { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098 }, + { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535 }, + { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096 }, + { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090 }, + { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643 }, + { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443 }, + { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865 }, + { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162 }, + { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355 }, + { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935 }, + { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168 }, + { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550 }, + { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214 }, + { url = "https://files.pythonhosted.org/packages/33/05/b26e3c6ecc05f349ee0013f0bb850a761016d89cec528a98193a48c34033/contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c", size = 265681 }, + { url = "https://files.pythonhosted.org/packages/2b/25/ac07d6ad12affa7d1ffed11b77417d0a6308170f44ff20fa1d5aa6333f03/contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", size = 315101 }, + { url = "https://files.pythonhosted.org/packages/8f/4d/5bb3192bbe9d3f27e3061a6a8e7733c9120e203cb8515767d30973f71030/contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", size = 220599 }, + { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807 }, + { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729 }, + { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791 }, ] [[package]] @@ -548,174 +547,174 @@ resolution-markers = [ dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773, upload-time = "2025-07-26T12:01:02.277Z" }, - { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149, upload-time = "2025-07-26T12:01:04.072Z" }, - { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222, upload-time = "2025-07-26T12:01:05.688Z" }, - { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234, upload-time = "2025-07-26T12:01:07.054Z" }, - { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555, upload-time = "2025-07-26T12:01:08.801Z" }, - { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238, upload-time = "2025-07-26T12:01:10.319Z" }, - { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218, upload-time = "2025-07-26T12:01:12.659Z" }, - { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867, upload-time = "2025-07-26T12:01:15.533Z" }, - { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677, upload-time = "2025-07-26T12:01:17.088Z" }, - { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234, upload-time = "2025-07-26T12:01:18.256Z" }, - { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123, upload-time = "2025-07-26T12:01:19.848Z" }, - { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, - { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, - { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, - { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, - { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, - { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, - { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, - { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, - { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, - { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, - { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, - { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, - { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, - { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, - { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, - { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, - { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, - { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, - { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, - { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, - { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, - { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, - { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, - { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, - { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, - { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, - { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, - { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, - { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, - { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, - { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, - { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, - { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, - { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, - { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, - { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, - { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, - { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, - { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, - { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, - { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, - { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, - { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, - { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, - { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, - { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, - { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, - { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, - { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, - { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, - { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, - { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, - { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, - { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809, upload-time = "2025-07-26T12:02:52.74Z" }, - { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593, upload-time = "2025-07-26T12:02:54.037Z" }, - { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202, upload-time = "2025-07-26T12:02:55.947Z" }, - { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207, upload-time = "2025-07-26T12:02:57.468Z" }, - { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773 }, + { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149 }, + { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222 }, + { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234 }, + { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555 }, + { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238 }, + { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218 }, + { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867 }, + { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677 }, + { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234 }, + { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123 }, + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419 }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979 }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653 }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536 }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397 }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601 }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288 }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386 }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018 }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567 }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655 }, + { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257 }, + { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034 }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672 }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234 }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169 }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859 }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062 }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932 }, + { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024 }, + { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578 }, + { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524 }, + { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730 }, + { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897 }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751 }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486 }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106 }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548 }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297 }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023 }, + { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157 }, + { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570 }, + { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713 }, + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189 }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251 }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810 }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871 }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264 }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819 }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650 }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833 }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692 }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424 }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300 }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769 }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892 }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748 }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554 }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118 }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555 }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295 }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027 }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428 }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331 }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831 }, + { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809 }, + { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593 }, + { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202 }, + { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207 }, + { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315 }, ] [[package]] name = "coverage" version = "7.10.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/87/0e/66dbd4c6a7f0758a8d18044c048779ba21fb94856e1edcf764bd5403e710/coverage-7.10.1.tar.gz", hash = "sha256:ae2b4856f29ddfe827106794f3589949a57da6f0d38ab01e24ec35107979ba57", size = 819938, upload-time = "2025-07-27T14:13:39.045Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/e7/0f4e35a15361337529df88151bddcac8e8f6d6fd01da94a4b7588901c2fe/coverage-7.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1c86eb388bbd609d15560e7cc0eb936c102b6f43f31cf3e58b4fd9afe28e1372", size = 214627, upload-time = "2025-07-27T14:11:01.211Z" }, - { url = "https://files.pythonhosted.org/packages/e0/fd/17872e762c408362072c936dbf3ca28c67c609a1f5af434b1355edcb7e12/coverage-7.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6b4ba0f488c1bdb6bd9ba81da50715a372119785458831c73428a8566253b86b", size = 215015, upload-time = "2025-07-27T14:11:03.988Z" }, - { url = "https://files.pythonhosted.org/packages/54/50/c9d445ba38ee5f685f03876c0f8223469e2e46c5d3599594dca972b470c8/coverage-7.10.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:083442ecf97d434f0cb3b3e3676584443182653da08b42e965326ba12d6b5f2a", size = 241995, upload-time = "2025-07-27T14:11:05.983Z" }, - { url = "https://files.pythonhosted.org/packages/cc/83/4ae6e0f60376af33de543368394d21b9ac370dc86434039062ef171eebf8/coverage-7.10.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c1a40c486041006b135759f59189385da7c66d239bad897c994e18fd1d0c128f", size = 243253, upload-time = "2025-07-27T14:11:07.424Z" }, - { url = "https://files.pythonhosted.org/packages/49/90/17a4d9ac7171be364ce8c0bb2b6da05e618ebfe1f11238ad4f26c99f5467/coverage-7.10.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3beb76e20b28046989300c4ea81bf690df84ee98ade4dc0bbbf774a28eb98440", size = 245110, upload-time = "2025-07-27T14:11:09.152Z" }, - { url = "https://files.pythonhosted.org/packages/e1/f7/edc3f485d536ed417f3af2b4969582bcb5fab456241721825fa09354161e/coverage-7.10.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bc265a7945e8d08da28999ad02b544963f813a00f3ed0a7a0ce4165fd77629f8", size = 243056, upload-time = "2025-07-27T14:11:10.586Z" }, - { url = "https://files.pythonhosted.org/packages/58/2c/c4c316a57718556b8d0cc8304437741c31b54a62934e7c8c551a7915c2f4/coverage-7.10.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:47c91f32ba4ac46f1e224a7ebf3f98b4b24335bad16137737fe71a5961a0665c", size = 241731, upload-time = "2025-07-27T14:11:12.145Z" }, - { url = "https://files.pythonhosted.org/packages/f7/93/c78e144c6f086043d0d7d9237c5b880e71ac672ed2712c6f8cca5544481f/coverage-7.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1a108dd78ed185020f66f131c60078f3fae3f61646c28c8bb4edd3fa121fc7fc", size = 242023, upload-time = "2025-07-27T14:11:13.573Z" }, - { url = "https://files.pythonhosted.org/packages/8f/e1/34e8505ca81fc144a612e1cc79fadd4a78f42e96723875f4e9f1f470437e/coverage-7.10.1-cp310-cp310-win32.whl", hash = "sha256:7092cc82382e634075cc0255b0b69cb7cada7c1f249070ace6a95cb0f13548ef", size = 217130, upload-time = "2025-07-27T14:11:15.11Z" }, - { url = "https://files.pythonhosted.org/packages/75/2b/82adfce6edffc13d804aee414e64c0469044234af9296e75f6d13f92f6a2/coverage-7.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:ac0c5bba938879c2fc0bc6c1b47311b5ad1212a9dcb8b40fe2c8110239b7faed", size = 218015, upload-time = "2025-07-27T14:11:16.836Z" }, - { url = "https://files.pythonhosted.org/packages/20/8e/ef088112bd1b26e2aa931ee186992b3e42c222c64f33e381432c8ee52aae/coverage-7.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b45e2f9d5b0b5c1977cb4feb5f594be60eb121106f8900348e29331f553a726f", size = 214747, upload-time = "2025-07-27T14:11:18.217Z" }, - { url = "https://files.pythonhosted.org/packages/2d/76/a1e46f3c6e0897758eb43af88bb3c763cb005f4950769f7b553e22aa5f89/coverage-7.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a7a4d74cb0f5e3334f9aa26af7016ddb94fb4bfa11b4a573d8e98ecba8c34f1", size = 215128, upload-time = "2025-07-27T14:11:19.706Z" }, - { url = "https://files.pythonhosted.org/packages/78/4d/903bafb371a8c887826ecc30d3977b65dfad0e1e66aa61b7e173de0828b0/coverage-7.10.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d4b0aab55ad60ead26159ff12b538c85fbab731a5e3411c642b46c3525863437", size = 245140, upload-time = "2025-07-27T14:11:21.261Z" }, - { url = "https://files.pythonhosted.org/packages/55/f1/1f8f09536f38394a8698dd08a0e9608a512eacee1d3b771e2d06397f77bf/coverage-7.10.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:dcc93488c9ebd229be6ee1f0d9aad90da97b33ad7e2912f5495804d78a3cd6b7", size = 246977, upload-time = "2025-07-27T14:11:23.15Z" }, - { url = "https://files.pythonhosted.org/packages/57/cc/ed6bbc5a3bdb36ae1bca900bbbfdcb23b260ef2767a7b2dab38b92f61adf/coverage-7.10.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa309df995d020f3438407081b51ff527171cca6772b33cf8f85344b8b4b8770", size = 249140, upload-time = "2025-07-27T14:11:24.743Z" }, - { url = "https://files.pythonhosted.org/packages/10/f5/e881ade2d8e291b60fa1d93d6d736107e940144d80d21a0d4999cff3642f/coverage-7.10.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cfb8b9d8855c8608f9747602a48ab525b1d320ecf0113994f6df23160af68262", size = 246869, upload-time = "2025-07-27T14:11:26.156Z" }, - { url = "https://files.pythonhosted.org/packages/53/b9/6a5665cb8996e3cd341d184bb11e2a8edf01d8dadcf44eb1e742186cf243/coverage-7.10.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:320d86da829b012982b414c7cdda65f5d358d63f764e0e4e54b33097646f39a3", size = 244899, upload-time = "2025-07-27T14:11:27.622Z" }, - { url = "https://files.pythonhosted.org/packages/27/11/24156776709c4e25bf8a33d6bb2ece9a9067186ddac19990f6560a7f8130/coverage-7.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dc60ddd483c556590da1d9482a4518292eec36dd0e1e8496966759a1f282bcd0", size = 245507, upload-time = "2025-07-27T14:11:29.544Z" }, - { url = "https://files.pythonhosted.org/packages/43/db/a6f0340b7d6802a79928659c9a32bc778ea420e87a61b568d68ac36d45a8/coverage-7.10.1-cp311-cp311-win32.whl", hash = "sha256:4fcfe294f95b44e4754da5b58be750396f2b1caca8f9a0e78588e3ef85f8b8be", size = 217167, upload-time = "2025-07-27T14:11:31.349Z" }, - { url = "https://files.pythonhosted.org/packages/f5/6f/1990eb4fd05cea4cfabdf1d587a997ac5f9a8bee883443a1d519a2a848c9/coverage-7.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:efa23166da3fe2915f8ab452dde40319ac84dc357f635737174a08dbd912980c", size = 218054, upload-time = "2025-07-27T14:11:33.202Z" }, - { url = "https://files.pythonhosted.org/packages/b4/4d/5e061d6020251b20e9b4303bb0b7900083a1a384ec4e5db326336c1c4abd/coverage-7.10.1-cp311-cp311-win_arm64.whl", hash = "sha256:d12b15a8c3759e2bb580ffa423ae54be4f184cf23beffcbd641f4fe6e1584293", size = 216483, upload-time = "2025-07-27T14:11:34.663Z" }, - { url = "https://files.pythonhosted.org/packages/a5/3f/b051feeb292400bd22d071fdf933b3ad389a8cef5c80c7866ed0c7414b9e/coverage-7.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6b7dc7f0a75a7eaa4584e5843c873c561b12602439d2351ee28c7478186c4da4", size = 214934, upload-time = "2025-07-27T14:11:36.096Z" }, - { url = "https://files.pythonhosted.org/packages/f8/e4/a61b27d5c4c2d185bdfb0bfe9d15ab4ac4f0073032665544507429ae60eb/coverage-7.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:607f82389f0ecafc565813aa201a5cade04f897603750028dd660fb01797265e", size = 215173, upload-time = "2025-07-27T14:11:38.005Z" }, - { url = "https://files.pythonhosted.org/packages/8a/01/40a6ee05b60d02d0bc53742ad4966e39dccd450aafb48c535a64390a3552/coverage-7.10.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f7da31a1ba31f1c1d4d5044b7c5813878adae1f3af8f4052d679cc493c7328f4", size = 246190, upload-time = "2025-07-27T14:11:39.887Z" }, - { url = "https://files.pythonhosted.org/packages/11/ef/a28d64d702eb583c377255047281305dc5a5cfbfb0ee36e721f78255adb6/coverage-7.10.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:51fe93f3fe4f5d8483d51072fddc65e717a175490804e1942c975a68e04bf97a", size = 248618, upload-time = "2025-07-27T14:11:41.841Z" }, - { url = "https://files.pythonhosted.org/packages/6a/ad/73d018bb0c8317725370c79d69b5c6e0257df84a3b9b781bda27a438a3be/coverage-7.10.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e59d00830da411a1feef6ac828b90bbf74c9b6a8e87b8ca37964925bba76dbe", size = 250081, upload-time = "2025-07-27T14:11:43.705Z" }, - { url = "https://files.pythonhosted.org/packages/2d/dd/496adfbbb4503ebca5d5b2de8bed5ec00c0a76558ffc5b834fd404166bc9/coverage-7.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:924563481c27941229cb4e16eefacc35da28563e80791b3ddc5597b062a5c386", size = 247990, upload-time = "2025-07-27T14:11:45.244Z" }, - { url = "https://files.pythonhosted.org/packages/18/3c/a9331a7982facfac0d98a4a87b36ae666fe4257d0f00961a3a9ef73e015d/coverage-7.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ca79146ee421b259f8131f153102220b84d1a5e6fb9c8aed13b3badfd1796de6", size = 246191, upload-time = "2025-07-27T14:11:47.093Z" }, - { url = "https://files.pythonhosted.org/packages/62/0c/75345895013b83f7afe92ec595e15a9a525ede17491677ceebb2ba5c3d85/coverage-7.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2b225a06d227f23f386fdc0eab471506d9e644be699424814acc7d114595495f", size = 247400, upload-time = "2025-07-27T14:11:48.643Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a9/98b268cfc5619ef9df1d5d34fee408ecb1542d9fd43d467e5c2f28668cd4/coverage-7.10.1-cp312-cp312-win32.whl", hash = "sha256:5ba9a8770effec5baaaab1567be916c87d8eea0c9ad11253722d86874d885eca", size = 217338, upload-time = "2025-07-27T14:11:50.258Z" }, - { url = "https://files.pythonhosted.org/packages/fe/31/22a5440e4d1451f253c5cd69fdcead65e92ef08cd4ec237b8756dc0b20a7/coverage-7.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:9eb245a8d8dd0ad73b4062135a251ec55086fbc2c42e0eb9725a9b553fba18a3", size = 218125, upload-time = "2025-07-27T14:11:52.034Z" }, - { url = "https://files.pythonhosted.org/packages/d6/2b/40d9f0ce7ee839f08a43c5bfc9d05cec28aaa7c9785837247f96cbe490b9/coverage-7.10.1-cp312-cp312-win_arm64.whl", hash = "sha256:7718060dd4434cc719803a5e526838a5d66e4efa5dc46d2b25c21965a9c6fcc4", size = 216523, upload-time = "2025-07-27T14:11:53.965Z" }, - { url = "https://files.pythonhosted.org/packages/ef/72/135ff5fef09b1ffe78dbe6fcf1e16b2e564cd35faeacf3d63d60d887f12d/coverage-7.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ebb08d0867c5a25dffa4823377292a0ffd7aaafb218b5d4e2e106378b1061e39", size = 214960, upload-time = "2025-07-27T14:11:55.959Z" }, - { url = "https://files.pythonhosted.org/packages/b1/aa/73a5d1a6fc08ca709a8177825616aa95ee6bf34d522517c2595484a3e6c9/coverage-7.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f32a95a83c2e17422f67af922a89422cd24c6fa94041f083dd0bb4f6057d0bc7", size = 215220, upload-time = "2025-07-27T14:11:57.899Z" }, - { url = "https://files.pythonhosted.org/packages/8d/40/3124fdd45ed3772a42fc73ca41c091699b38a2c3bd4f9cb564162378e8b6/coverage-7.10.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c4c746d11c8aba4b9f58ca8bfc6fbfd0da4efe7960ae5540d1a1b13655ee8892", size = 245772, upload-time = "2025-07-27T14:12:00.422Z" }, - { url = "https://files.pythonhosted.org/packages/42/62/a77b254822efa8c12ad59e8039f2bc3df56dc162ebda55e1943e35ba31a5/coverage-7.10.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7f39edd52c23e5c7ed94e0e4bf088928029edf86ef10b95413e5ea670c5e92d7", size = 248116, upload-time = "2025-07-27T14:12:03.099Z" }, - { url = "https://files.pythonhosted.org/packages/1d/01/8101f062f472a3a6205b458d18ef0444a63ae5d36a8a5ed5dd0f6167f4db/coverage-7.10.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab6e19b684981d0cd968906e293d5628e89faacb27977c92f3600b201926b994", size = 249554, upload-time = "2025-07-27T14:12:04.668Z" }, - { url = "https://files.pythonhosted.org/packages/8f/7b/e51bc61573e71ff7275a4f167aecbd16cb010aefdf54bcd8b0a133391263/coverage-7.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5121d8cf0eacb16133501455d216bb5f99899ae2f52d394fe45d59229e6611d0", size = 247766, upload-time = "2025-07-27T14:12:06.234Z" }, - { url = "https://files.pythonhosted.org/packages/4b/71/1c96d66a51d4204a9d6d12df53c4071d87e110941a2a1fe94693192262f5/coverage-7.10.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:df1c742ca6f46a6f6cbcaef9ac694dc2cb1260d30a6a2f5c68c5f5bcfee1cfd7", size = 245735, upload-time = "2025-07-27T14:12:08.305Z" }, - { url = "https://files.pythonhosted.org/packages/13/d5/efbc2ac4d35ae2f22ef6df2ca084c60e13bd9378be68655e3268c80349ab/coverage-7.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:40f9a38676f9c073bf4b9194707aa1eb97dca0e22cc3766d83879d72500132c7", size = 247118, upload-time = "2025-07-27T14:12:09.903Z" }, - { url = "https://files.pythonhosted.org/packages/d1/22/073848352bec28ca65f2b6816b892fcf9a31abbef07b868487ad15dd55f1/coverage-7.10.1-cp313-cp313-win32.whl", hash = "sha256:2348631f049e884839553b9974f0821d39241c6ffb01a418efce434f7eba0fe7", size = 217381, upload-time = "2025-07-27T14:12:11.535Z" }, - { url = "https://files.pythonhosted.org/packages/b7/df/df6a0ff33b042f000089bd11b6bb034bab073e2ab64a56e78ed882cba55d/coverage-7.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:4072b31361b0d6d23f750c524f694e1a417c1220a30d3ef02741eed28520c48e", size = 218152, upload-time = "2025-07-27T14:12:13.182Z" }, - { url = "https://files.pythonhosted.org/packages/30/e3/5085ca849a40ed6b47cdb8f65471c2f754e19390b5a12fa8abd25cbfaa8f/coverage-7.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:3e31dfb8271937cab9425f19259b1b1d1f556790e98eb266009e7a61d337b6d4", size = 216559, upload-time = "2025-07-27T14:12:14.807Z" }, - { url = "https://files.pythonhosted.org/packages/cc/93/58714efbfdeb547909feaabe1d67b2bdd59f0597060271b9c548d5efb529/coverage-7.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1c4f679c6b573a5257af6012f167a45be4c749c9925fd44d5178fd641ad8bf72", size = 215677, upload-time = "2025-07-27T14:12:16.68Z" }, - { url = "https://files.pythonhosted.org/packages/c0/0c/18eaa5897e7e8cb3f8c45e563e23e8a85686b4585e29d53cacb6bc9cb340/coverage-7.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:871ebe8143da284bd77b84a9136200bd638be253618765d21a1fce71006d94af", size = 215899, upload-time = "2025-07-27T14:12:18.758Z" }, - { url = "https://files.pythonhosted.org/packages/84/c1/9d1affacc3c75b5a184c140377701bbf14fc94619367f07a269cd9e4fed6/coverage-7.10.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:998c4751dabf7d29b30594af416e4bf5091f11f92a8d88eb1512c7ba136d1ed7", size = 257140, upload-time = "2025-07-27T14:12:20.357Z" }, - { url = "https://files.pythonhosted.org/packages/3d/0f/339bc6b8fa968c346df346068cca1f24bdea2ddfa93bb3dc2e7749730962/coverage-7.10.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:780f750a25e7749d0af6b3631759c2c14f45de209f3faaa2398312d1c7a22759", size = 259005, upload-time = "2025-07-27T14:12:22.007Z" }, - { url = "https://files.pythonhosted.org/packages/c8/22/89390864b92ea7c909079939b71baba7e5b42a76bf327c1d615bd829ba57/coverage-7.10.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:590bdba9445df4763bdbebc928d8182f094c1f3947a8dc0fc82ef014dbdd8324", size = 261143, upload-time = "2025-07-27T14:12:23.746Z" }, - { url = "https://files.pythonhosted.org/packages/2c/56/3d04d89017c0c41c7a71bd69b29699d919b6bbf2649b8b2091240b97dd6a/coverage-7.10.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b2df80cb6a2af86d300e70acb82e9b79dab2c1e6971e44b78dbfc1a1e736b53", size = 258735, upload-time = "2025-07-27T14:12:25.73Z" }, - { url = "https://files.pythonhosted.org/packages/cb/40/312252c8afa5ca781063a09d931f4b9409dc91526cd0b5a2b84143ffafa2/coverage-7.10.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d6a558c2725bfb6337bf57c1cd366c13798bfd3bfc9e3dd1f4a6f6fc95a4605f", size = 256871, upload-time = "2025-07-27T14:12:27.767Z" }, - { url = "https://files.pythonhosted.org/packages/1f/2b/564947d5dede068215aaddb9e05638aeac079685101462218229ddea9113/coverage-7.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e6150d167f32f2a54690e572e0a4c90296fb000a18e9b26ab81a6489e24e78dd", size = 257692, upload-time = "2025-07-27T14:12:29.347Z" }, - { url = "https://files.pythonhosted.org/packages/93/1b/c8a867ade85cb26d802aea2209b9c2c80613b9c122baa8c8ecea6799648f/coverage-7.10.1-cp313-cp313t-win32.whl", hash = "sha256:d946a0c067aa88be4a593aad1236493313bafaa27e2a2080bfe88db827972f3c", size = 218059, upload-time = "2025-07-27T14:12:31.076Z" }, - { url = "https://files.pythonhosted.org/packages/a1/fe/cd4ab40570ae83a516bf5e754ea4388aeedd48e660e40c50b7713ed4f930/coverage-7.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e37c72eaccdd5ed1130c67a92ad38f5b2af66eeff7b0abe29534225db2ef7b18", size = 219150, upload-time = "2025-07-27T14:12:32.746Z" }, - { url = "https://files.pythonhosted.org/packages/8d/16/6e5ed5854be6d70d0c39e9cb9dd2449f2c8c34455534c32c1a508c7dbdb5/coverage-7.10.1-cp313-cp313t-win_arm64.whl", hash = "sha256:89ec0ffc215c590c732918c95cd02b55c7d0f569d76b90bb1a5e78aa340618e4", size = 217014, upload-time = "2025-07-27T14:12:34.406Z" }, - { url = "https://files.pythonhosted.org/packages/54/8e/6d0bfe9c3d7121cf936c5f8b03e8c3da1484fb801703127dba20fb8bd3c7/coverage-7.10.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:166d89c57e877e93d8827dac32cedae6b0277ca684c6511497311249f35a280c", size = 214951, upload-time = "2025-07-27T14:12:36.069Z" }, - { url = "https://files.pythonhosted.org/packages/f2/29/e3e51a8c653cf2174c60532aafeb5065cea0911403fa144c9abe39790308/coverage-7.10.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bed4a2341b33cd1a7d9ffc47df4a78ee61d3416d43b4adc9e18b7d266650b83e", size = 215229, upload-time = "2025-07-27T14:12:37.759Z" }, - { url = "https://files.pythonhosted.org/packages/e0/59/3c972080b2fa18b6c4510201f6d4dc87159d450627d062cd9ad051134062/coverage-7.10.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ddca1e4f5f4c67980533df01430184c19b5359900e080248bbf4ed6789584d8b", size = 245738, upload-time = "2025-07-27T14:12:39.453Z" }, - { url = "https://files.pythonhosted.org/packages/2e/04/fc0d99d3f809452654e958e1788454f6e27b34e43f8f8598191c8ad13537/coverage-7.10.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:37b69226001d8b7de7126cad7366b0778d36777e4d788c66991455ba817c5b41", size = 248045, upload-time = "2025-07-27T14:12:41.387Z" }, - { url = "https://files.pythonhosted.org/packages/5e/2e/afcbf599e77e0dfbf4c97197747250d13d397d27e185b93987d9eaac053d/coverage-7.10.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2f22102197bcb1722691296f9e589f02b616f874e54a209284dd7b9294b0b7f", size = 249666, upload-time = "2025-07-27T14:12:43.056Z" }, - { url = "https://files.pythonhosted.org/packages/6e/ae/bc47f7f8ecb7a06cbae2bf86a6fa20f479dd902bc80f57cff7730438059d/coverage-7.10.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1e0c768b0f9ac5839dac5cf88992a4bb459e488ee8a1f8489af4cb33b1af00f1", size = 247692, upload-time = "2025-07-27T14:12:44.83Z" }, - { url = "https://files.pythonhosted.org/packages/b6/26/cbfa3092d31ccba8ba7647e4d25753263e818b4547eba446b113d7d1efdf/coverage-7.10.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:991196702d5e0b120a8fef2664e1b9c333a81d36d5f6bcf6b225c0cf8b0451a2", size = 245536, upload-time = "2025-07-27T14:12:46.527Z" }, - { url = "https://files.pythonhosted.org/packages/56/77/9c68e92500e6a1c83d024a70eadcc9a173f21aadd73c4675fe64c9c43fdf/coverage-7.10.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae8e59e5f4fd85d6ad34c2bb9d74037b5b11be072b8b7e9986beb11f957573d4", size = 246954, upload-time = "2025-07-27T14:12:49.279Z" }, - { url = "https://files.pythonhosted.org/packages/7f/a5/ba96671c5a669672aacd9877a5987c8551501b602827b4e84256da2a30a7/coverage-7.10.1-cp314-cp314-win32.whl", hash = "sha256:042125c89cf74a074984002e165d61fe0e31c7bd40ebb4bbebf07939b5924613", size = 217616, upload-time = "2025-07-27T14:12:51.214Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3c/e1e1eb95fc1585f15a410208c4795db24a948e04d9bde818fe4eb893bc85/coverage-7.10.1-cp314-cp314-win_amd64.whl", hash = "sha256:a22c3bfe09f7a530e2c94c87ff7af867259c91bef87ed2089cd69b783af7b84e", size = 218412, upload-time = "2025-07-27T14:12:53.429Z" }, - { url = "https://files.pythonhosted.org/packages/b0/85/7e1e5be2cb966cba95566ba702b13a572ca744fbb3779df9888213762d67/coverage-7.10.1-cp314-cp314-win_arm64.whl", hash = "sha256:ee6be07af68d9c4fca4027c70cea0c31a0f1bc9cb464ff3c84a1f916bf82e652", size = 216776, upload-time = "2025-07-27T14:12:55.482Z" }, - { url = "https://files.pythonhosted.org/packages/62/0f/5bb8f29923141cca8560fe2217679caf4e0db643872c1945ac7d8748c2a7/coverage-7.10.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d24fb3c0c8ff0d517c5ca5de7cf3994a4cd559cde0315201511dbfa7ab528894", size = 215698, upload-time = "2025-07-27T14:12:57.225Z" }, - { url = "https://files.pythonhosted.org/packages/80/29/547038ffa4e8e4d9e82f7dfc6d152f75fcdc0af146913f0ba03875211f03/coverage-7.10.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1217a54cfd79be20512a67ca81c7da3f2163f51bbfd188aab91054df012154f5", size = 215902, upload-time = "2025-07-27T14:12:59.071Z" }, - { url = "https://files.pythonhosted.org/packages/e1/8a/7aaa8fbfaed900147987a424e112af2e7790e1ac9cd92601e5bd4e1ba60a/coverage-7.10.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:51f30da7a52c009667e02f125737229d7d8044ad84b79db454308033a7808ab2", size = 257230, upload-time = "2025-07-27T14:13:01.248Z" }, - { url = "https://files.pythonhosted.org/packages/e5/1d/c252b5ffac44294e23a0d79dd5acf51749b39795ccc898faeabf7bee903f/coverage-7.10.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ed3718c757c82d920f1c94089066225ca2ad7f00bb904cb72b1c39ebdd906ccb", size = 259194, upload-time = "2025-07-27T14:13:03.247Z" }, - { url = "https://files.pythonhosted.org/packages/16/ad/6c8d9f83d08f3bac2e7507534d0c48d1a4f52c18e6f94919d364edbdfa8f/coverage-7.10.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc452481e124a819ced0c25412ea2e144269ef2f2534b862d9f6a9dae4bda17b", size = 261316, upload-time = "2025-07-27T14:13:04.957Z" }, - { url = "https://files.pythonhosted.org/packages/d6/4e/f9bbf3a36c061e2e0e0f78369c006d66416561a33d2bee63345aee8ee65e/coverage-7.10.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9d6f494c307e5cb9b1e052ec1a471060f1dea092c8116e642e7a23e79d9388ea", size = 258794, upload-time = "2025-07-27T14:13:06.715Z" }, - { url = "https://files.pythonhosted.org/packages/87/82/e600bbe78eb2cb0541751d03cef9314bcd0897e8eea156219c39b685f869/coverage-7.10.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:fc0e46d86905ddd16b85991f1f4919028092b4e511689bbdaff0876bd8aab3dd", size = 256869, upload-time = "2025-07-27T14:13:08.933Z" }, - { url = "https://files.pythonhosted.org/packages/ce/5d/2fc9a9236c5268f68ac011d97cd3a5ad16cc420535369bedbda659fdd9b7/coverage-7.10.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80b9ccd82e30038b61fc9a692a8dc4801504689651b281ed9109f10cc9fe8b4d", size = 257765, upload-time = "2025-07-27T14:13:10.778Z" }, - { url = "https://files.pythonhosted.org/packages/8a/05/b4e00b2bd48a2dc8e1c7d2aea7455f40af2e36484ab2ef06deb85883e9fe/coverage-7.10.1-cp314-cp314t-win32.whl", hash = "sha256:e58991a2b213417285ec866d3cd32db17a6a88061a985dbb7e8e8f13af429c47", size = 218420, upload-time = "2025-07-27T14:13:12.882Z" }, - { url = "https://files.pythonhosted.org/packages/77/fb/d21d05f33ea27ece327422240e69654b5932b0b29e7fbc40fbab3cf199bf/coverage-7.10.1-cp314-cp314t-win_amd64.whl", hash = "sha256:e88dd71e4ecbc49d9d57d064117462c43f40a21a1383507811cf834a4a620651", size = 219536, upload-time = "2025-07-27T14:13:14.718Z" }, - { url = "https://files.pythonhosted.org/packages/a6/68/7fea94b141281ed8be3d1d5c4319a97f2befc3e487ce33657fc64db2c45e/coverage-7.10.1-cp314-cp314t-win_arm64.whl", hash = "sha256:1aadfb06a30c62c2eb82322171fe1f7c288c80ca4156d46af0ca039052814bab", size = 217190, upload-time = "2025-07-27T14:13:16.85Z" }, - { url = "https://files.pythonhosted.org/packages/c3/98/9b19d4aebfb31552596a7ac55cd678c3ebd74be6153888c56d39e23f376b/coverage-7.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:57b6e8789cbefdef0667e4a94f8ffa40f9402cee5fc3b8e4274c894737890145", size = 214625, upload-time = "2025-07-27T14:13:18.661Z" }, - { url = "https://files.pythonhosted.org/packages/ea/24/e2391365d0940fc757666ecd7572aced0963e859188e57169bd18fba5d29/coverage-7.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:85b22a9cce00cb03156334da67eb86e29f22b5e93876d0dd6a98646bb8a74e53", size = 215001, upload-time = "2025-07-27T14:13:20.478Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0c/c1740d7fac57cb0c54cd04786f3dbfc4d0bfa0a6cc9f19f69c170ae67f6a/coverage-7.10.1-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:97b6983a2f9c76d345ca395e843a049390b39652984e4a3b45b2442fa733992d", size = 241082, upload-time = "2025-07-27T14:13:22.318Z" }, - { url = "https://files.pythonhosted.org/packages/45/b5/965b26315ecae6455bc40f1de8563a57e82cb31af8af2e2844655cf400f1/coverage-7.10.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ddf2a63b91399a1c2f88f40bc1705d5a7777e31c7e9eb27c602280f477b582ba", size = 242979, upload-time = "2025-07-27T14:13:24.123Z" }, - { url = "https://files.pythonhosted.org/packages/0b/48/80c5c6a5a792348ba71b2315809c5a2daab2981564e31d1f3cd092c8cd97/coverage-7.10.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:47ab6dbbc31a14c5486420c2c1077fcae692097f673cf5be9ddbec8cdaa4cdbc", size = 244550, upload-time = "2025-07-27T14:13:25.9Z" }, - { url = "https://files.pythonhosted.org/packages/ab/73/332667b91cfa3c27130026af220fca478b07e913e96932d12c100e1a7314/coverage-7.10.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:21eb7d8b45d3700e7c2936a736f732794c47615a20f739f4133d5230a6512a88", size = 242482, upload-time = "2025-07-27T14:13:28.121Z" }, - { url = "https://files.pythonhosted.org/packages/ae/e6/24c9120ad91314be82f793a2a174fe738583a716264b1523fe95ad731cb3/coverage-7.10.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:283005bb4d98ae33e45f2861cd2cde6a21878661c9ad49697f6951b358a0379b", size = 240717, upload-time = "2025-07-27T14:13:29.93Z" }, - { url = "https://files.pythonhosted.org/packages/94/9a/21a4d5135eb4b8064fd9bf8a8eb8d4465982611d2d7fb569d6c2edf38f04/coverage-7.10.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:fefe31d61d02a8b2c419700b1fade9784a43d726de26495f243b663cd9fe1513", size = 241669, upload-time = "2025-07-27T14:13:31.726Z" }, - { url = "https://files.pythonhosted.org/packages/3f/1d/e4ce3b23f8b8b0fe196c436499414b1af06b9e1610cefedaaad37c9668d0/coverage-7.10.1-cp39-cp39-win32.whl", hash = "sha256:e8ab8e4c7ec7f8a55ac05b5b715a051d74eac62511c6d96d5bb79aaafa3b04cf", size = 217138, upload-time = "2025-07-27T14:13:33.481Z" }, - { url = "https://files.pythonhosted.org/packages/d3/c6/b7fcf41c341e686610fdf9ef1a4b29045015f36d3eecd17679874e4739ed/coverage-7.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:c36baa0ecde742784aa76c2b816466d3ea888d5297fda0edbac1bf48fa94688a", size = 218035, upload-time = "2025-07-27T14:13:35.337Z" }, - { url = "https://files.pythonhosted.org/packages/0f/64/922899cff2c0fd3496be83fa8b81230f5a8d82a2ad30f98370b133c2c83b/coverage-7.10.1-py3-none-any.whl", hash = "sha256:fa2a258aa6bf188eb9a8948f7102a83da7c430a0dce918dbd8b60ef8fcb772d7", size = 206597, upload-time = "2025-07-27T14:13:37.221Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/87/0e/66dbd4c6a7f0758a8d18044c048779ba21fb94856e1edcf764bd5403e710/coverage-7.10.1.tar.gz", hash = "sha256:ae2b4856f29ddfe827106794f3589949a57da6f0d38ab01e24ec35107979ba57", size = 819938 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/e7/0f4e35a15361337529df88151bddcac8e8f6d6fd01da94a4b7588901c2fe/coverage-7.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1c86eb388bbd609d15560e7cc0eb936c102b6f43f31cf3e58b4fd9afe28e1372", size = 214627 }, + { url = "https://files.pythonhosted.org/packages/e0/fd/17872e762c408362072c936dbf3ca28c67c609a1f5af434b1355edcb7e12/coverage-7.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6b4ba0f488c1bdb6bd9ba81da50715a372119785458831c73428a8566253b86b", size = 215015 }, + { url = "https://files.pythonhosted.org/packages/54/50/c9d445ba38ee5f685f03876c0f8223469e2e46c5d3599594dca972b470c8/coverage-7.10.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:083442ecf97d434f0cb3b3e3676584443182653da08b42e965326ba12d6b5f2a", size = 241995 }, + { url = "https://files.pythonhosted.org/packages/cc/83/4ae6e0f60376af33de543368394d21b9ac370dc86434039062ef171eebf8/coverage-7.10.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c1a40c486041006b135759f59189385da7c66d239bad897c994e18fd1d0c128f", size = 243253 }, + { url = "https://files.pythonhosted.org/packages/49/90/17a4d9ac7171be364ce8c0bb2b6da05e618ebfe1f11238ad4f26c99f5467/coverage-7.10.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3beb76e20b28046989300c4ea81bf690df84ee98ade4dc0bbbf774a28eb98440", size = 245110 }, + { url = "https://files.pythonhosted.org/packages/e1/f7/edc3f485d536ed417f3af2b4969582bcb5fab456241721825fa09354161e/coverage-7.10.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bc265a7945e8d08da28999ad02b544963f813a00f3ed0a7a0ce4165fd77629f8", size = 243056 }, + { url = "https://files.pythonhosted.org/packages/58/2c/c4c316a57718556b8d0cc8304437741c31b54a62934e7c8c551a7915c2f4/coverage-7.10.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:47c91f32ba4ac46f1e224a7ebf3f98b4b24335bad16137737fe71a5961a0665c", size = 241731 }, + { url = "https://files.pythonhosted.org/packages/f7/93/c78e144c6f086043d0d7d9237c5b880e71ac672ed2712c6f8cca5544481f/coverage-7.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1a108dd78ed185020f66f131c60078f3fae3f61646c28c8bb4edd3fa121fc7fc", size = 242023 }, + { url = "https://files.pythonhosted.org/packages/8f/e1/34e8505ca81fc144a612e1cc79fadd4a78f42e96723875f4e9f1f470437e/coverage-7.10.1-cp310-cp310-win32.whl", hash = "sha256:7092cc82382e634075cc0255b0b69cb7cada7c1f249070ace6a95cb0f13548ef", size = 217130 }, + { url = "https://files.pythonhosted.org/packages/75/2b/82adfce6edffc13d804aee414e64c0469044234af9296e75f6d13f92f6a2/coverage-7.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:ac0c5bba938879c2fc0bc6c1b47311b5ad1212a9dcb8b40fe2c8110239b7faed", size = 218015 }, + { url = "https://files.pythonhosted.org/packages/20/8e/ef088112bd1b26e2aa931ee186992b3e42c222c64f33e381432c8ee52aae/coverage-7.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b45e2f9d5b0b5c1977cb4feb5f594be60eb121106f8900348e29331f553a726f", size = 214747 }, + { url = "https://files.pythonhosted.org/packages/2d/76/a1e46f3c6e0897758eb43af88bb3c763cb005f4950769f7b553e22aa5f89/coverage-7.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a7a4d74cb0f5e3334f9aa26af7016ddb94fb4bfa11b4a573d8e98ecba8c34f1", size = 215128 }, + { url = "https://files.pythonhosted.org/packages/78/4d/903bafb371a8c887826ecc30d3977b65dfad0e1e66aa61b7e173de0828b0/coverage-7.10.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d4b0aab55ad60ead26159ff12b538c85fbab731a5e3411c642b46c3525863437", size = 245140 }, + { url = "https://files.pythonhosted.org/packages/55/f1/1f8f09536f38394a8698dd08a0e9608a512eacee1d3b771e2d06397f77bf/coverage-7.10.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:dcc93488c9ebd229be6ee1f0d9aad90da97b33ad7e2912f5495804d78a3cd6b7", size = 246977 }, + { url = "https://files.pythonhosted.org/packages/57/cc/ed6bbc5a3bdb36ae1bca900bbbfdcb23b260ef2767a7b2dab38b92f61adf/coverage-7.10.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa309df995d020f3438407081b51ff527171cca6772b33cf8f85344b8b4b8770", size = 249140 }, + { url = "https://files.pythonhosted.org/packages/10/f5/e881ade2d8e291b60fa1d93d6d736107e940144d80d21a0d4999cff3642f/coverage-7.10.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cfb8b9d8855c8608f9747602a48ab525b1d320ecf0113994f6df23160af68262", size = 246869 }, + { url = "https://files.pythonhosted.org/packages/53/b9/6a5665cb8996e3cd341d184bb11e2a8edf01d8dadcf44eb1e742186cf243/coverage-7.10.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:320d86da829b012982b414c7cdda65f5d358d63f764e0e4e54b33097646f39a3", size = 244899 }, + { url = "https://files.pythonhosted.org/packages/27/11/24156776709c4e25bf8a33d6bb2ece9a9067186ddac19990f6560a7f8130/coverage-7.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dc60ddd483c556590da1d9482a4518292eec36dd0e1e8496966759a1f282bcd0", size = 245507 }, + { url = "https://files.pythonhosted.org/packages/43/db/a6f0340b7d6802a79928659c9a32bc778ea420e87a61b568d68ac36d45a8/coverage-7.10.1-cp311-cp311-win32.whl", hash = "sha256:4fcfe294f95b44e4754da5b58be750396f2b1caca8f9a0e78588e3ef85f8b8be", size = 217167 }, + { url = "https://files.pythonhosted.org/packages/f5/6f/1990eb4fd05cea4cfabdf1d587a997ac5f9a8bee883443a1d519a2a848c9/coverage-7.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:efa23166da3fe2915f8ab452dde40319ac84dc357f635737174a08dbd912980c", size = 218054 }, + { url = "https://files.pythonhosted.org/packages/b4/4d/5e061d6020251b20e9b4303bb0b7900083a1a384ec4e5db326336c1c4abd/coverage-7.10.1-cp311-cp311-win_arm64.whl", hash = "sha256:d12b15a8c3759e2bb580ffa423ae54be4f184cf23beffcbd641f4fe6e1584293", size = 216483 }, + { url = "https://files.pythonhosted.org/packages/a5/3f/b051feeb292400bd22d071fdf933b3ad389a8cef5c80c7866ed0c7414b9e/coverage-7.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6b7dc7f0a75a7eaa4584e5843c873c561b12602439d2351ee28c7478186c4da4", size = 214934 }, + { url = "https://files.pythonhosted.org/packages/f8/e4/a61b27d5c4c2d185bdfb0bfe9d15ab4ac4f0073032665544507429ae60eb/coverage-7.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:607f82389f0ecafc565813aa201a5cade04f897603750028dd660fb01797265e", size = 215173 }, + { url = "https://files.pythonhosted.org/packages/8a/01/40a6ee05b60d02d0bc53742ad4966e39dccd450aafb48c535a64390a3552/coverage-7.10.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f7da31a1ba31f1c1d4d5044b7c5813878adae1f3af8f4052d679cc493c7328f4", size = 246190 }, + { url = "https://files.pythonhosted.org/packages/11/ef/a28d64d702eb583c377255047281305dc5a5cfbfb0ee36e721f78255adb6/coverage-7.10.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:51fe93f3fe4f5d8483d51072fddc65e717a175490804e1942c975a68e04bf97a", size = 248618 }, + { url = "https://files.pythonhosted.org/packages/6a/ad/73d018bb0c8317725370c79d69b5c6e0257df84a3b9b781bda27a438a3be/coverage-7.10.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e59d00830da411a1feef6ac828b90bbf74c9b6a8e87b8ca37964925bba76dbe", size = 250081 }, + { url = "https://files.pythonhosted.org/packages/2d/dd/496adfbbb4503ebca5d5b2de8bed5ec00c0a76558ffc5b834fd404166bc9/coverage-7.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:924563481c27941229cb4e16eefacc35da28563e80791b3ddc5597b062a5c386", size = 247990 }, + { url = "https://files.pythonhosted.org/packages/18/3c/a9331a7982facfac0d98a4a87b36ae666fe4257d0f00961a3a9ef73e015d/coverage-7.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ca79146ee421b259f8131f153102220b84d1a5e6fb9c8aed13b3badfd1796de6", size = 246191 }, + { url = "https://files.pythonhosted.org/packages/62/0c/75345895013b83f7afe92ec595e15a9a525ede17491677ceebb2ba5c3d85/coverage-7.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2b225a06d227f23f386fdc0eab471506d9e644be699424814acc7d114595495f", size = 247400 }, + { url = "https://files.pythonhosted.org/packages/e2/a9/98b268cfc5619ef9df1d5d34fee408ecb1542d9fd43d467e5c2f28668cd4/coverage-7.10.1-cp312-cp312-win32.whl", hash = "sha256:5ba9a8770effec5baaaab1567be916c87d8eea0c9ad11253722d86874d885eca", size = 217338 }, + { url = "https://files.pythonhosted.org/packages/fe/31/22a5440e4d1451f253c5cd69fdcead65e92ef08cd4ec237b8756dc0b20a7/coverage-7.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:9eb245a8d8dd0ad73b4062135a251ec55086fbc2c42e0eb9725a9b553fba18a3", size = 218125 }, + { url = "https://files.pythonhosted.org/packages/d6/2b/40d9f0ce7ee839f08a43c5bfc9d05cec28aaa7c9785837247f96cbe490b9/coverage-7.10.1-cp312-cp312-win_arm64.whl", hash = "sha256:7718060dd4434cc719803a5e526838a5d66e4efa5dc46d2b25c21965a9c6fcc4", size = 216523 }, + { url = "https://files.pythonhosted.org/packages/ef/72/135ff5fef09b1ffe78dbe6fcf1e16b2e564cd35faeacf3d63d60d887f12d/coverage-7.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ebb08d0867c5a25dffa4823377292a0ffd7aaafb218b5d4e2e106378b1061e39", size = 214960 }, + { url = "https://files.pythonhosted.org/packages/b1/aa/73a5d1a6fc08ca709a8177825616aa95ee6bf34d522517c2595484a3e6c9/coverage-7.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f32a95a83c2e17422f67af922a89422cd24c6fa94041f083dd0bb4f6057d0bc7", size = 215220 }, + { url = "https://files.pythonhosted.org/packages/8d/40/3124fdd45ed3772a42fc73ca41c091699b38a2c3bd4f9cb564162378e8b6/coverage-7.10.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c4c746d11c8aba4b9f58ca8bfc6fbfd0da4efe7960ae5540d1a1b13655ee8892", size = 245772 }, + { url = "https://files.pythonhosted.org/packages/42/62/a77b254822efa8c12ad59e8039f2bc3df56dc162ebda55e1943e35ba31a5/coverage-7.10.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7f39edd52c23e5c7ed94e0e4bf088928029edf86ef10b95413e5ea670c5e92d7", size = 248116 }, + { url = "https://files.pythonhosted.org/packages/1d/01/8101f062f472a3a6205b458d18ef0444a63ae5d36a8a5ed5dd0f6167f4db/coverage-7.10.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab6e19b684981d0cd968906e293d5628e89faacb27977c92f3600b201926b994", size = 249554 }, + { url = "https://files.pythonhosted.org/packages/8f/7b/e51bc61573e71ff7275a4f167aecbd16cb010aefdf54bcd8b0a133391263/coverage-7.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5121d8cf0eacb16133501455d216bb5f99899ae2f52d394fe45d59229e6611d0", size = 247766 }, + { url = "https://files.pythonhosted.org/packages/4b/71/1c96d66a51d4204a9d6d12df53c4071d87e110941a2a1fe94693192262f5/coverage-7.10.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:df1c742ca6f46a6f6cbcaef9ac694dc2cb1260d30a6a2f5c68c5f5bcfee1cfd7", size = 245735 }, + { url = "https://files.pythonhosted.org/packages/13/d5/efbc2ac4d35ae2f22ef6df2ca084c60e13bd9378be68655e3268c80349ab/coverage-7.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:40f9a38676f9c073bf4b9194707aa1eb97dca0e22cc3766d83879d72500132c7", size = 247118 }, + { url = "https://files.pythonhosted.org/packages/d1/22/073848352bec28ca65f2b6816b892fcf9a31abbef07b868487ad15dd55f1/coverage-7.10.1-cp313-cp313-win32.whl", hash = "sha256:2348631f049e884839553b9974f0821d39241c6ffb01a418efce434f7eba0fe7", size = 217381 }, + { url = "https://files.pythonhosted.org/packages/b7/df/df6a0ff33b042f000089bd11b6bb034bab073e2ab64a56e78ed882cba55d/coverage-7.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:4072b31361b0d6d23f750c524f694e1a417c1220a30d3ef02741eed28520c48e", size = 218152 }, + { url = "https://files.pythonhosted.org/packages/30/e3/5085ca849a40ed6b47cdb8f65471c2f754e19390b5a12fa8abd25cbfaa8f/coverage-7.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:3e31dfb8271937cab9425f19259b1b1d1f556790e98eb266009e7a61d337b6d4", size = 216559 }, + { url = "https://files.pythonhosted.org/packages/cc/93/58714efbfdeb547909feaabe1d67b2bdd59f0597060271b9c548d5efb529/coverage-7.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1c4f679c6b573a5257af6012f167a45be4c749c9925fd44d5178fd641ad8bf72", size = 215677 }, + { url = "https://files.pythonhosted.org/packages/c0/0c/18eaa5897e7e8cb3f8c45e563e23e8a85686b4585e29d53cacb6bc9cb340/coverage-7.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:871ebe8143da284bd77b84a9136200bd638be253618765d21a1fce71006d94af", size = 215899 }, + { url = "https://files.pythonhosted.org/packages/84/c1/9d1affacc3c75b5a184c140377701bbf14fc94619367f07a269cd9e4fed6/coverage-7.10.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:998c4751dabf7d29b30594af416e4bf5091f11f92a8d88eb1512c7ba136d1ed7", size = 257140 }, + { url = "https://files.pythonhosted.org/packages/3d/0f/339bc6b8fa968c346df346068cca1f24bdea2ddfa93bb3dc2e7749730962/coverage-7.10.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:780f750a25e7749d0af6b3631759c2c14f45de209f3faaa2398312d1c7a22759", size = 259005 }, + { url = "https://files.pythonhosted.org/packages/c8/22/89390864b92ea7c909079939b71baba7e5b42a76bf327c1d615bd829ba57/coverage-7.10.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:590bdba9445df4763bdbebc928d8182f094c1f3947a8dc0fc82ef014dbdd8324", size = 261143 }, + { url = "https://files.pythonhosted.org/packages/2c/56/3d04d89017c0c41c7a71bd69b29699d919b6bbf2649b8b2091240b97dd6a/coverage-7.10.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b2df80cb6a2af86d300e70acb82e9b79dab2c1e6971e44b78dbfc1a1e736b53", size = 258735 }, + { url = "https://files.pythonhosted.org/packages/cb/40/312252c8afa5ca781063a09d931f4b9409dc91526cd0b5a2b84143ffafa2/coverage-7.10.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d6a558c2725bfb6337bf57c1cd366c13798bfd3bfc9e3dd1f4a6f6fc95a4605f", size = 256871 }, + { url = "https://files.pythonhosted.org/packages/1f/2b/564947d5dede068215aaddb9e05638aeac079685101462218229ddea9113/coverage-7.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e6150d167f32f2a54690e572e0a4c90296fb000a18e9b26ab81a6489e24e78dd", size = 257692 }, + { url = "https://files.pythonhosted.org/packages/93/1b/c8a867ade85cb26d802aea2209b9c2c80613b9c122baa8c8ecea6799648f/coverage-7.10.1-cp313-cp313t-win32.whl", hash = "sha256:d946a0c067aa88be4a593aad1236493313bafaa27e2a2080bfe88db827972f3c", size = 218059 }, + { url = "https://files.pythonhosted.org/packages/a1/fe/cd4ab40570ae83a516bf5e754ea4388aeedd48e660e40c50b7713ed4f930/coverage-7.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e37c72eaccdd5ed1130c67a92ad38f5b2af66eeff7b0abe29534225db2ef7b18", size = 219150 }, + { url = "https://files.pythonhosted.org/packages/8d/16/6e5ed5854be6d70d0c39e9cb9dd2449f2c8c34455534c32c1a508c7dbdb5/coverage-7.10.1-cp313-cp313t-win_arm64.whl", hash = "sha256:89ec0ffc215c590c732918c95cd02b55c7d0f569d76b90bb1a5e78aa340618e4", size = 217014 }, + { url = "https://files.pythonhosted.org/packages/54/8e/6d0bfe9c3d7121cf936c5f8b03e8c3da1484fb801703127dba20fb8bd3c7/coverage-7.10.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:166d89c57e877e93d8827dac32cedae6b0277ca684c6511497311249f35a280c", size = 214951 }, + { url = "https://files.pythonhosted.org/packages/f2/29/e3e51a8c653cf2174c60532aafeb5065cea0911403fa144c9abe39790308/coverage-7.10.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bed4a2341b33cd1a7d9ffc47df4a78ee61d3416d43b4adc9e18b7d266650b83e", size = 215229 }, + { url = "https://files.pythonhosted.org/packages/e0/59/3c972080b2fa18b6c4510201f6d4dc87159d450627d062cd9ad051134062/coverage-7.10.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ddca1e4f5f4c67980533df01430184c19b5359900e080248bbf4ed6789584d8b", size = 245738 }, + { url = "https://files.pythonhosted.org/packages/2e/04/fc0d99d3f809452654e958e1788454f6e27b34e43f8f8598191c8ad13537/coverage-7.10.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:37b69226001d8b7de7126cad7366b0778d36777e4d788c66991455ba817c5b41", size = 248045 }, + { url = "https://files.pythonhosted.org/packages/5e/2e/afcbf599e77e0dfbf4c97197747250d13d397d27e185b93987d9eaac053d/coverage-7.10.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2f22102197bcb1722691296f9e589f02b616f874e54a209284dd7b9294b0b7f", size = 249666 }, + { url = "https://files.pythonhosted.org/packages/6e/ae/bc47f7f8ecb7a06cbae2bf86a6fa20f479dd902bc80f57cff7730438059d/coverage-7.10.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1e0c768b0f9ac5839dac5cf88992a4bb459e488ee8a1f8489af4cb33b1af00f1", size = 247692 }, + { url = "https://files.pythonhosted.org/packages/b6/26/cbfa3092d31ccba8ba7647e4d25753263e818b4547eba446b113d7d1efdf/coverage-7.10.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:991196702d5e0b120a8fef2664e1b9c333a81d36d5f6bcf6b225c0cf8b0451a2", size = 245536 }, + { url = "https://files.pythonhosted.org/packages/56/77/9c68e92500e6a1c83d024a70eadcc9a173f21aadd73c4675fe64c9c43fdf/coverage-7.10.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae8e59e5f4fd85d6ad34c2bb9d74037b5b11be072b8b7e9986beb11f957573d4", size = 246954 }, + { url = "https://files.pythonhosted.org/packages/7f/a5/ba96671c5a669672aacd9877a5987c8551501b602827b4e84256da2a30a7/coverage-7.10.1-cp314-cp314-win32.whl", hash = "sha256:042125c89cf74a074984002e165d61fe0e31c7bd40ebb4bbebf07939b5924613", size = 217616 }, + { url = "https://files.pythonhosted.org/packages/e7/3c/e1e1eb95fc1585f15a410208c4795db24a948e04d9bde818fe4eb893bc85/coverage-7.10.1-cp314-cp314-win_amd64.whl", hash = "sha256:a22c3bfe09f7a530e2c94c87ff7af867259c91bef87ed2089cd69b783af7b84e", size = 218412 }, + { url = "https://files.pythonhosted.org/packages/b0/85/7e1e5be2cb966cba95566ba702b13a572ca744fbb3779df9888213762d67/coverage-7.10.1-cp314-cp314-win_arm64.whl", hash = "sha256:ee6be07af68d9c4fca4027c70cea0c31a0f1bc9cb464ff3c84a1f916bf82e652", size = 216776 }, + { url = "https://files.pythonhosted.org/packages/62/0f/5bb8f29923141cca8560fe2217679caf4e0db643872c1945ac7d8748c2a7/coverage-7.10.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d24fb3c0c8ff0d517c5ca5de7cf3994a4cd559cde0315201511dbfa7ab528894", size = 215698 }, + { url = "https://files.pythonhosted.org/packages/80/29/547038ffa4e8e4d9e82f7dfc6d152f75fcdc0af146913f0ba03875211f03/coverage-7.10.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1217a54cfd79be20512a67ca81c7da3f2163f51bbfd188aab91054df012154f5", size = 215902 }, + { url = "https://files.pythonhosted.org/packages/e1/8a/7aaa8fbfaed900147987a424e112af2e7790e1ac9cd92601e5bd4e1ba60a/coverage-7.10.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:51f30da7a52c009667e02f125737229d7d8044ad84b79db454308033a7808ab2", size = 257230 }, + { url = "https://files.pythonhosted.org/packages/e5/1d/c252b5ffac44294e23a0d79dd5acf51749b39795ccc898faeabf7bee903f/coverage-7.10.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ed3718c757c82d920f1c94089066225ca2ad7f00bb904cb72b1c39ebdd906ccb", size = 259194 }, + { url = "https://files.pythonhosted.org/packages/16/ad/6c8d9f83d08f3bac2e7507534d0c48d1a4f52c18e6f94919d364edbdfa8f/coverage-7.10.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc452481e124a819ced0c25412ea2e144269ef2f2534b862d9f6a9dae4bda17b", size = 261316 }, + { url = "https://files.pythonhosted.org/packages/d6/4e/f9bbf3a36c061e2e0e0f78369c006d66416561a33d2bee63345aee8ee65e/coverage-7.10.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9d6f494c307e5cb9b1e052ec1a471060f1dea092c8116e642e7a23e79d9388ea", size = 258794 }, + { url = "https://files.pythonhosted.org/packages/87/82/e600bbe78eb2cb0541751d03cef9314bcd0897e8eea156219c39b685f869/coverage-7.10.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:fc0e46d86905ddd16b85991f1f4919028092b4e511689bbdaff0876bd8aab3dd", size = 256869 }, + { url = "https://files.pythonhosted.org/packages/ce/5d/2fc9a9236c5268f68ac011d97cd3a5ad16cc420535369bedbda659fdd9b7/coverage-7.10.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80b9ccd82e30038b61fc9a692a8dc4801504689651b281ed9109f10cc9fe8b4d", size = 257765 }, + { url = "https://files.pythonhosted.org/packages/8a/05/b4e00b2bd48a2dc8e1c7d2aea7455f40af2e36484ab2ef06deb85883e9fe/coverage-7.10.1-cp314-cp314t-win32.whl", hash = "sha256:e58991a2b213417285ec866d3cd32db17a6a88061a985dbb7e8e8f13af429c47", size = 218420 }, + { url = "https://files.pythonhosted.org/packages/77/fb/d21d05f33ea27ece327422240e69654b5932b0b29e7fbc40fbab3cf199bf/coverage-7.10.1-cp314-cp314t-win_amd64.whl", hash = "sha256:e88dd71e4ecbc49d9d57d064117462c43f40a21a1383507811cf834a4a620651", size = 219536 }, + { url = "https://files.pythonhosted.org/packages/a6/68/7fea94b141281ed8be3d1d5c4319a97f2befc3e487ce33657fc64db2c45e/coverage-7.10.1-cp314-cp314t-win_arm64.whl", hash = "sha256:1aadfb06a30c62c2eb82322171fe1f7c288c80ca4156d46af0ca039052814bab", size = 217190 }, + { url = "https://files.pythonhosted.org/packages/c3/98/9b19d4aebfb31552596a7ac55cd678c3ebd74be6153888c56d39e23f376b/coverage-7.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:57b6e8789cbefdef0667e4a94f8ffa40f9402cee5fc3b8e4274c894737890145", size = 214625 }, + { url = "https://files.pythonhosted.org/packages/ea/24/e2391365d0940fc757666ecd7572aced0963e859188e57169bd18fba5d29/coverage-7.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:85b22a9cce00cb03156334da67eb86e29f22b5e93876d0dd6a98646bb8a74e53", size = 215001 }, + { url = "https://files.pythonhosted.org/packages/ce/0c/c1740d7fac57cb0c54cd04786f3dbfc4d0bfa0a6cc9f19f69c170ae67f6a/coverage-7.10.1-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:97b6983a2f9c76d345ca395e843a049390b39652984e4a3b45b2442fa733992d", size = 241082 }, + { url = "https://files.pythonhosted.org/packages/45/b5/965b26315ecae6455bc40f1de8563a57e82cb31af8af2e2844655cf400f1/coverage-7.10.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ddf2a63b91399a1c2f88f40bc1705d5a7777e31c7e9eb27c602280f477b582ba", size = 242979 }, + { url = "https://files.pythonhosted.org/packages/0b/48/80c5c6a5a792348ba71b2315809c5a2daab2981564e31d1f3cd092c8cd97/coverage-7.10.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:47ab6dbbc31a14c5486420c2c1077fcae692097f673cf5be9ddbec8cdaa4cdbc", size = 244550 }, + { url = "https://files.pythonhosted.org/packages/ab/73/332667b91cfa3c27130026af220fca478b07e913e96932d12c100e1a7314/coverage-7.10.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:21eb7d8b45d3700e7c2936a736f732794c47615a20f739f4133d5230a6512a88", size = 242482 }, + { url = "https://files.pythonhosted.org/packages/ae/e6/24c9120ad91314be82f793a2a174fe738583a716264b1523fe95ad731cb3/coverage-7.10.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:283005bb4d98ae33e45f2861cd2cde6a21878661c9ad49697f6951b358a0379b", size = 240717 }, + { url = "https://files.pythonhosted.org/packages/94/9a/21a4d5135eb4b8064fd9bf8a8eb8d4465982611d2d7fb569d6c2edf38f04/coverage-7.10.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:fefe31d61d02a8b2c419700b1fade9784a43d726de26495f243b663cd9fe1513", size = 241669 }, + { url = "https://files.pythonhosted.org/packages/3f/1d/e4ce3b23f8b8b0fe196c436499414b1af06b9e1610cefedaaad37c9668d0/coverage-7.10.1-cp39-cp39-win32.whl", hash = "sha256:e8ab8e4c7ec7f8a55ac05b5b715a051d74eac62511c6d96d5bb79aaafa3b04cf", size = 217138 }, + { url = "https://files.pythonhosted.org/packages/d3/c6/b7fcf41c341e686610fdf9ef1a4b29045015f36d3eecd17679874e4739ed/coverage-7.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:c36baa0ecde742784aa76c2b816466d3ea888d5297fda0edbac1bf48fa94688a", size = 218035 }, + { url = "https://files.pythonhosted.org/packages/0f/64/922899cff2c0fd3496be83fa8b81230f5a8d82a2ad30f98370b133c2c83b/coverage-7.10.1-py3-none-any.whl", hash = "sha256:fa2a258aa6bf188eb9a8948f7102a83da7c430a0dce918dbd8b60ef8fcb772d7", size = 206597 }, ] [package.optional-dependencies] @@ -727,65 +726,65 @@ toml = [ name = "cycler" version = "0.12.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321 }, ] [[package]] name = "debugpy" version = "1.8.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/3a9a28ddb750a76eaec445c7f4d3147ea2c579a97dbd9e25d39001b92b21/debugpy-1.8.15.tar.gz", hash = "sha256:58d7a20b7773ab5ee6bdfb2e6cf622fdf1e40c9d5aef2857d85391526719ac00", size = 1643279, upload-time = "2025-07-15T16:43:29.135Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/51/0b4315169f0d945271db037ae6b98c0548a2d48cc036335cd1b2f5516c1b/debugpy-1.8.15-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:e9a8125c85172e3ec30985012e7a81ea5e70bbb836637f8a4104f454f9b06c97", size = 2084890, upload-time = "2025-07-15T16:43:31.239Z" }, - { url = "https://files.pythonhosted.org/packages/36/cc/a5391dedb079280d7b72418022e00ba8227ae0b5bc8b2e3d1ecffc5d6b01/debugpy-1.8.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fd0b6b5eccaa745c214fd240ea82f46049d99ef74b185a3517dad3ea1ec55d9", size = 3561470, upload-time = "2025-07-15T16:43:32.515Z" }, - { url = "https://files.pythonhosted.org/packages/e8/92/acf64b92010c66b33c077dee3862c733798a2c90e7d14b25c01d771e2a0d/debugpy-1.8.15-cp310-cp310-win32.whl", hash = "sha256:8181cce4d344010f6bfe94a531c351a46a96b0f7987750932b2908e7a1e14a55", size = 5229194, upload-time = "2025-07-15T16:43:33.997Z" }, - { url = "https://files.pythonhosted.org/packages/3f/f5/c58c015c9ff78de35901bea3ab4dbf7946d7a4aa867ee73875df06ba6468/debugpy-1.8.15-cp310-cp310-win_amd64.whl", hash = "sha256:af2dcae4e4cd6e8b35f982ccab29fe65f7e8766e10720a717bc80c464584ee21", size = 5260900, upload-time = "2025-07-15T16:43:35.413Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b3/1c44a2ed311199ab11c2299c9474a6c7cd80d19278defd333aeb7c287995/debugpy-1.8.15-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:babc4fb1962dd6a37e94d611280e3d0d11a1f5e6c72ac9b3d87a08212c4b6dd3", size = 2183442, upload-time = "2025-07-15T16:43:36.733Z" }, - { url = "https://files.pythonhosted.org/packages/f6/69/e2dcb721491e1c294d348681227c9b44fb95218f379aa88e12a19d85528d/debugpy-1.8.15-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f778e68f2986a58479d0ac4f643e0b8c82fdd97c2e200d4d61e7c2d13838eb53", size = 3134215, upload-time = "2025-07-15T16:43:38.116Z" }, - { url = "https://files.pythonhosted.org/packages/17/76/4ce63b95d8294dcf2fd1820860b300a420d077df4e93afcaa25a984c2ca7/debugpy-1.8.15-cp311-cp311-win32.whl", hash = "sha256:f9d1b5abd75cd965e2deabb1a06b0e93a1546f31f9f621d2705e78104377c702", size = 5154037, upload-time = "2025-07-15T16:43:39.471Z" }, - { url = "https://files.pythonhosted.org/packages/c2/a7/e5a7c784465eb9c976d84408873d597dc7ce74a0fc69ed009548a1a94813/debugpy-1.8.15-cp311-cp311-win_amd64.whl", hash = "sha256:62954fb904bec463e2b5a415777f6d1926c97febb08ef1694da0e5d1463c5c3b", size = 5178133, upload-time = "2025-07-15T16:43:40.969Z" }, - { url = "https://files.pythonhosted.org/packages/ab/4a/4508d256e52897f5cdfee6a6d7580974811e911c6d01321df3264508a5ac/debugpy-1.8.15-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:3dcc7225cb317469721ab5136cda9ff9c8b6e6fb43e87c9e15d5b108b99d01ba", size = 2511197, upload-time = "2025-07-15T16:43:42.343Z" }, - { url = "https://files.pythonhosted.org/packages/99/8d/7f6ef1097e7fecf26b4ef72338d08e41644a41b7ee958a19f494ffcffc29/debugpy-1.8.15-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:047a493ca93c85ccede1dbbaf4e66816794bdc214213dde41a9a61e42d27f8fc", size = 4229517, upload-time = "2025-07-15T16:43:44.14Z" }, - { url = "https://files.pythonhosted.org/packages/3f/e8/e8c6a9aa33a9c9c6dacbf31747384f6ed2adde4de2e9693c766bdf323aa3/debugpy-1.8.15-cp312-cp312-win32.whl", hash = "sha256:b08e9b0bc260cf324c890626961dad4ffd973f7568fbf57feb3c3a65ab6b6327", size = 5276132, upload-time = "2025-07-15T16:43:45.529Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ad/231050c6177b3476b85fcea01e565dac83607b5233d003ff067e2ee44d8f/debugpy-1.8.15-cp312-cp312-win_amd64.whl", hash = "sha256:e2a4fe357c92334272eb2845fcfcdbec3ef9f22c16cf613c388ac0887aed15fa", size = 5317645, upload-time = "2025-07-15T16:43:46.968Z" }, - { url = "https://files.pythonhosted.org/packages/28/70/2928aad2310726d5920b18ed9f54b9f06df5aa4c10cf9b45fa18ff0ab7e8/debugpy-1.8.15-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:f5e01291ad7d6649aed5773256c5bba7a1a556196300232de1474c3c372592bf", size = 2495538, upload-time = "2025-07-15T16:43:48.927Z" }, - { url = "https://files.pythonhosted.org/packages/9e/c6/9b8ffb4ca91fac8b2877eef63c9cc0e87dd2570b1120054c272815ec4cd0/debugpy-1.8.15-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94dc0f0d00e528d915e0ce1c78e771475b2335b376c49afcc7382ee0b146bab6", size = 4221874, upload-time = "2025-07-15T16:43:50.282Z" }, - { url = "https://files.pythonhosted.org/packages/55/8a/9b8d59674b4bf489318c7c46a1aab58e606e583651438084b7e029bf3c43/debugpy-1.8.15-cp313-cp313-win32.whl", hash = "sha256:fcf0748d4f6e25f89dc5e013d1129ca6f26ad4da405e0723a4f704583896a709", size = 5275949, upload-time = "2025-07-15T16:43:52.079Z" }, - { url = "https://files.pythonhosted.org/packages/72/83/9e58e6fdfa8710a5e6ec06c2401241b9ad48b71c0a7eb99570a1f1edb1d3/debugpy-1.8.15-cp313-cp313-win_amd64.whl", hash = "sha256:73c943776cb83e36baf95e8f7f8da765896fd94b05991e7bc162456d25500683", size = 5317720, upload-time = "2025-07-15T16:43:53.703Z" }, - { url = "https://files.pythonhosted.org/packages/90/ca/5253cc91a5380722bdf20f500cc03c3ffc78ef8e1f711788dd08a02a8a04/debugpy-1.8.15-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:085b6d0adb3eb457c2823ac497a0690b10a99eff8b01c01a041e84579f114b56", size = 2086078, upload-time = "2025-07-15T16:44:00.761Z" }, - { url = "https://files.pythonhosted.org/packages/b6/ed/333d555e8a26792cec1d7521d7f6d4eb23f4c9e67e11ed55342c2312f188/debugpy-1.8.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd546a405381d17527814852642df0a74b7da8acc20ae5f3cfad0b7c86419511", size = 3556714, upload-time = "2025-07-15T16:44:02.188Z" }, - { url = "https://files.pythonhosted.org/packages/01/e2/699a9471a4c2bbbe5e2326e6dcd9b79d37a752c576f06ae2c27bc4f14a90/debugpy-1.8.15-cp39-cp39-win32.whl", hash = "sha256:ae0d445fe11ff4351428e6c2389e904e1cdcb4a47785da5a5ec4af6c5b95fce5", size = 5229934, upload-time = "2025-07-15T16:44:03.536Z" }, - { url = "https://files.pythonhosted.org/packages/1a/c4/aa720b33b601b96fe482aa025e5a9eac22ff9f223756313d6f117474e366/debugpy-1.8.15-cp39-cp39-win_amd64.whl", hash = "sha256:de7db80189ca97ab4b10a87e4039cfe4dd7ddfccc8f33b5ae40fcd33792fc67a", size = 5261732, upload-time = "2025-07-15T16:44:04.97Z" }, - { url = "https://files.pythonhosted.org/packages/07/d5/98748d9860e767a1248b5e31ffa7ce8cb7006e97bf8abbf3d891d0a8ba4e/debugpy-1.8.15-py2.py3-none-any.whl", hash = "sha256:bce2e6c5ff4f2e00b98d45e7e01a49c7b489ff6df5f12d881c67d2f1ac635f3d", size = 5282697, upload-time = "2025-07-15T16:44:07.996Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/3a9a28ddb750a76eaec445c7f4d3147ea2c579a97dbd9e25d39001b92b21/debugpy-1.8.15.tar.gz", hash = "sha256:58d7a20b7773ab5ee6bdfb2e6cf622fdf1e40c9d5aef2857d85391526719ac00", size = 1643279 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/51/0b4315169f0d945271db037ae6b98c0548a2d48cc036335cd1b2f5516c1b/debugpy-1.8.15-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:e9a8125c85172e3ec30985012e7a81ea5e70bbb836637f8a4104f454f9b06c97", size = 2084890 }, + { url = "https://files.pythonhosted.org/packages/36/cc/a5391dedb079280d7b72418022e00ba8227ae0b5bc8b2e3d1ecffc5d6b01/debugpy-1.8.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fd0b6b5eccaa745c214fd240ea82f46049d99ef74b185a3517dad3ea1ec55d9", size = 3561470 }, + { url = "https://files.pythonhosted.org/packages/e8/92/acf64b92010c66b33c077dee3862c733798a2c90e7d14b25c01d771e2a0d/debugpy-1.8.15-cp310-cp310-win32.whl", hash = "sha256:8181cce4d344010f6bfe94a531c351a46a96b0f7987750932b2908e7a1e14a55", size = 5229194 }, + { url = "https://files.pythonhosted.org/packages/3f/f5/c58c015c9ff78de35901bea3ab4dbf7946d7a4aa867ee73875df06ba6468/debugpy-1.8.15-cp310-cp310-win_amd64.whl", hash = "sha256:af2dcae4e4cd6e8b35f982ccab29fe65f7e8766e10720a717bc80c464584ee21", size = 5260900 }, + { url = "https://files.pythonhosted.org/packages/d2/b3/1c44a2ed311199ab11c2299c9474a6c7cd80d19278defd333aeb7c287995/debugpy-1.8.15-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:babc4fb1962dd6a37e94d611280e3d0d11a1f5e6c72ac9b3d87a08212c4b6dd3", size = 2183442 }, + { url = "https://files.pythonhosted.org/packages/f6/69/e2dcb721491e1c294d348681227c9b44fb95218f379aa88e12a19d85528d/debugpy-1.8.15-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f778e68f2986a58479d0ac4f643e0b8c82fdd97c2e200d4d61e7c2d13838eb53", size = 3134215 }, + { url = "https://files.pythonhosted.org/packages/17/76/4ce63b95d8294dcf2fd1820860b300a420d077df4e93afcaa25a984c2ca7/debugpy-1.8.15-cp311-cp311-win32.whl", hash = "sha256:f9d1b5abd75cd965e2deabb1a06b0e93a1546f31f9f621d2705e78104377c702", size = 5154037 }, + { url = "https://files.pythonhosted.org/packages/c2/a7/e5a7c784465eb9c976d84408873d597dc7ce74a0fc69ed009548a1a94813/debugpy-1.8.15-cp311-cp311-win_amd64.whl", hash = "sha256:62954fb904bec463e2b5a415777f6d1926c97febb08ef1694da0e5d1463c5c3b", size = 5178133 }, + { url = "https://files.pythonhosted.org/packages/ab/4a/4508d256e52897f5cdfee6a6d7580974811e911c6d01321df3264508a5ac/debugpy-1.8.15-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:3dcc7225cb317469721ab5136cda9ff9c8b6e6fb43e87c9e15d5b108b99d01ba", size = 2511197 }, + { url = "https://files.pythonhosted.org/packages/99/8d/7f6ef1097e7fecf26b4ef72338d08e41644a41b7ee958a19f494ffcffc29/debugpy-1.8.15-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:047a493ca93c85ccede1dbbaf4e66816794bdc214213dde41a9a61e42d27f8fc", size = 4229517 }, + { url = "https://files.pythonhosted.org/packages/3f/e8/e8c6a9aa33a9c9c6dacbf31747384f6ed2adde4de2e9693c766bdf323aa3/debugpy-1.8.15-cp312-cp312-win32.whl", hash = "sha256:b08e9b0bc260cf324c890626961dad4ffd973f7568fbf57feb3c3a65ab6b6327", size = 5276132 }, + { url = "https://files.pythonhosted.org/packages/e9/ad/231050c6177b3476b85fcea01e565dac83607b5233d003ff067e2ee44d8f/debugpy-1.8.15-cp312-cp312-win_amd64.whl", hash = "sha256:e2a4fe357c92334272eb2845fcfcdbec3ef9f22c16cf613c388ac0887aed15fa", size = 5317645 }, + { url = "https://files.pythonhosted.org/packages/28/70/2928aad2310726d5920b18ed9f54b9f06df5aa4c10cf9b45fa18ff0ab7e8/debugpy-1.8.15-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:f5e01291ad7d6649aed5773256c5bba7a1a556196300232de1474c3c372592bf", size = 2495538 }, + { url = "https://files.pythonhosted.org/packages/9e/c6/9b8ffb4ca91fac8b2877eef63c9cc0e87dd2570b1120054c272815ec4cd0/debugpy-1.8.15-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94dc0f0d00e528d915e0ce1c78e771475b2335b376c49afcc7382ee0b146bab6", size = 4221874 }, + { url = "https://files.pythonhosted.org/packages/55/8a/9b8d59674b4bf489318c7c46a1aab58e606e583651438084b7e029bf3c43/debugpy-1.8.15-cp313-cp313-win32.whl", hash = "sha256:fcf0748d4f6e25f89dc5e013d1129ca6f26ad4da405e0723a4f704583896a709", size = 5275949 }, + { url = "https://files.pythonhosted.org/packages/72/83/9e58e6fdfa8710a5e6ec06c2401241b9ad48b71c0a7eb99570a1f1edb1d3/debugpy-1.8.15-cp313-cp313-win_amd64.whl", hash = "sha256:73c943776cb83e36baf95e8f7f8da765896fd94b05991e7bc162456d25500683", size = 5317720 }, + { url = "https://files.pythonhosted.org/packages/90/ca/5253cc91a5380722bdf20f500cc03c3ffc78ef8e1f711788dd08a02a8a04/debugpy-1.8.15-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:085b6d0adb3eb457c2823ac497a0690b10a99eff8b01c01a041e84579f114b56", size = 2086078 }, + { url = "https://files.pythonhosted.org/packages/b6/ed/333d555e8a26792cec1d7521d7f6d4eb23f4c9e67e11ed55342c2312f188/debugpy-1.8.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd546a405381d17527814852642df0a74b7da8acc20ae5f3cfad0b7c86419511", size = 3556714 }, + { url = "https://files.pythonhosted.org/packages/01/e2/699a9471a4c2bbbe5e2326e6dcd9b79d37a752c576f06ae2c27bc4f14a90/debugpy-1.8.15-cp39-cp39-win32.whl", hash = "sha256:ae0d445fe11ff4351428e6c2389e904e1cdcb4a47785da5a5ec4af6c5b95fce5", size = 5229934 }, + { url = "https://files.pythonhosted.org/packages/1a/c4/aa720b33b601b96fe482aa025e5a9eac22ff9f223756313d6f117474e366/debugpy-1.8.15-cp39-cp39-win_amd64.whl", hash = "sha256:de7db80189ca97ab4b10a87e4039cfe4dd7ddfccc8f33b5ae40fcd33792fc67a", size = 5261732 }, + { url = "https://files.pythonhosted.org/packages/07/d5/98748d9860e767a1248b5e31ffa7ce8cb7006e97bf8abbf3d891d0a8ba4e/debugpy-1.8.15-py2.py3-none-any.whl", hash = "sha256:bce2e6c5ff4f2e00b98d45e7e01a49c7b489ff6df5f12d881c67d2f1ac635f3d", size = 5282697 }, ] [[package]] name = "decorator" version = "5.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190 }, ] [[package]] name = "dill" version = "0.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/12/80/630b4b88364e9a8c8c5797f4602d0f76ef820909ee32f0bacb9f90654042/dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", size = 186976, upload-time = "2025-04-16T00:41:48.867Z" } +sdist = { url = "https://files.pythonhosted.org/packages/12/80/630b4b88364e9a8c8c5797f4602d0f76ef820909ee32f0bacb9f90654042/dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", size = 186976 } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049", size = 119668, upload-time = "2025-04-16T00:41:47.671Z" }, + { url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049", size = 119668 }, ] [[package]] name = "docutils" version = "0.21.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, + { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408 }, ] [[package]] @@ -795,27 +794,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749 } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" }, + { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674 }, ] [[package]] name = "execnet" version = "2.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524, upload-time = "2024-04-08T09:04:19.245Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524 } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612, upload-time = "2024-04-08T09:04:17.414Z" }, + { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612 }, ] [[package]] name = "executing" version = "2.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693, upload-time = "2025-01-22T15:41:29.403Z" } +sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702, upload-time = "2025-01-22T15:41:25.929Z" }, + { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702 }, ] [[package]] @@ -825,67 +824,67 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/d0/c49361f37e115a56eaff0bff640c63f4099a9976ab007f43cba02c771e4b/fastcore-1.8.7.tar.gz", hash = "sha256:ff4d976abaf2e298265e675cf8bf504f6ee2ab5fc159f9b4f153c6a5a03f6bf7", size = 76591, upload-time = "2025-07-25T15:57:50.42Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/d0/c49361f37e115a56eaff0bff640c63f4099a9976ab007f43cba02c771e4b/fastcore-1.8.7.tar.gz", hash = "sha256:ff4d976abaf2e298265e675cf8bf504f6ee2ab5fc159f9b4f153c6a5a03f6bf7", size = 76591 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/2f/e37fbde84c64468ec72093b0fc822c86ba6c8038a3ea66dddf82c758ae27/fastcore-1.8.7-py3-none-any.whl", hash = "sha256:3d71e9bae64d335dfad9bff58ff8985091e8fbc23651b0b1b8d16fa4895ff42d", size = 79342, upload-time = "2025-07-25T15:57:48.125Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2f/e37fbde84c64468ec72093b0fc822c86ba6c8038a3ea66dddf82c758ae27/fastcore-1.8.7-py3-none-any.whl", hash = "sha256:3d71e9bae64d335dfad9bff58ff8985091e8fbc23651b0b1b8d16fa4895ff42d", size = 79342 }, ] [[package]] name = "fastjsonschema" version = "2.21.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8b/50/4b769ce1ac4071a1ef6d86b1a3fb56cdc3a37615e8c5519e1af96cdac366/fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", size = 373939, upload-time = "2024-12-02T10:55:15.133Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/50/4b769ce1ac4071a1ef6d86b1a3fb56cdc3a37615e8c5519e1af96cdac366/fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", size = 373939 } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667", size = 23924, upload-time = "2024-12-02T10:55:07.599Z" }, + { url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667", size = 23924 }, ] [[package]] name = "fonttools" version = "4.59.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/27/ec3c723bfdf86f34c5c82bf6305df3e0f0d8ea798d2d3a7cb0c0a866d286/fonttools-4.59.0.tar.gz", hash = "sha256:be392ec3529e2f57faa28709d60723a763904f71a2b63aabe14fee6648fe3b14", size = 3532521, upload-time = "2025-07-16T12:04:54.613Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/1f/3dcae710b7c4b56e79442b03db64f6c9f10c3348f7af40339dffcefb581e/fonttools-4.59.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:524133c1be38445c5c0575eacea42dbd44374b310b1ffc4b60ff01d881fabb96", size = 2761846, upload-time = "2025-07-16T12:03:33.267Z" }, - { url = "https://files.pythonhosted.org/packages/eb/0e/ae3a1884fa1549acac1191cc9ec039142f6ac0e9cbc139c2e6a3dab967da/fonttools-4.59.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21e606b2d38fed938dde871c5736822dd6bda7a4631b92e509a1f5cd1b90c5df", size = 2332060, upload-time = "2025-07-16T12:03:36.472Z" }, - { url = "https://files.pythonhosted.org/packages/75/46/58bff92a7216829159ac7bdb1d05a48ad1b8ab8c539555f12d29fdecfdd4/fonttools-4.59.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e93df708c69a193fc7987192f94df250f83f3851fda49413f02ba5dded639482", size = 4852354, upload-time = "2025-07-16T12:03:39.102Z" }, - { url = "https://files.pythonhosted.org/packages/05/57/767e31e48861045d89691128bd81fd4c62b62150f9a17a666f731ce4f197/fonttools-4.59.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:62224a9bb85b4b66d1b46d45cbe43d71cbf8f527d332b177e3b96191ffbc1e64", size = 4781132, upload-time = "2025-07-16T12:03:41.415Z" }, - { url = "https://files.pythonhosted.org/packages/d7/78/adb5e9b0af5c6ce469e8b0e112f144eaa84b30dd72a486e9c778a9b03b31/fonttools-4.59.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8974b2a266b54c96709bd5e239979cddfd2dbceed331aa567ea1d7c4a2202db", size = 4832901, upload-time = "2025-07-16T12:03:43.115Z" }, - { url = "https://files.pythonhosted.org/packages/ac/92/bc3881097fbf3d56d112bec308c863c058e5d4c9c65f534e8ae58450ab8a/fonttools-4.59.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:209b75943d158f610b78320eacb5539aa9e920bee2c775445b2846c65d20e19d", size = 4940140, upload-time = "2025-07-16T12:03:44.781Z" }, - { url = "https://files.pythonhosted.org/packages/4a/54/39cdb23f0eeda2e07ae9cb189f2b6f41da89aabc682d3a387b3ff4a4ed29/fonttools-4.59.0-cp310-cp310-win32.whl", hash = "sha256:4c908a7036f0f3677f8afa577bcd973e3e20ddd2f7c42a33208d18bee95cdb6f", size = 2215890, upload-time = "2025-07-16T12:03:46.961Z" }, - { url = "https://files.pythonhosted.org/packages/d8/eb/f8388d9e19f95d8df2449febe9b1a38ddd758cfdb7d6de3a05198d785d61/fonttools-4.59.0-cp310-cp310-win_amd64.whl", hash = "sha256:8b4309a2775e4feee7356e63b163969a215d663399cce1b3d3b65e7ec2d9680e", size = 2260191, upload-time = "2025-07-16T12:03:48.908Z" }, - { url = "https://files.pythonhosted.org/packages/06/96/520733d9602fa1bf6592e5354c6721ac6fc9ea72bc98d112d0c38b967199/fonttools-4.59.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:841b2186adce48903c0fef235421ae21549020eca942c1da773ac380b056ab3c", size = 2782387, upload-time = "2025-07-16T12:03:51.424Z" }, - { url = "https://files.pythonhosted.org/packages/87/6a/170fce30b9bce69077d8eec9bea2cfd9f7995e8911c71be905e2eba6368b/fonttools-4.59.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9bcc1e77fbd1609198966ded6b2a9897bd6c6bcbd2287a2fc7d75f1a254179c5", size = 2342194, upload-time = "2025-07-16T12:03:53.295Z" }, - { url = "https://files.pythonhosted.org/packages/b0/b6/7c8166c0066856f1408092f7968ac744060cf72ca53aec9036106f57eeca/fonttools-4.59.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37c377f7cb2ab2eca8a0b319c68146d34a339792f9420fca6cd49cf28d370705", size = 5032333, upload-time = "2025-07-16T12:03:55.177Z" }, - { url = "https://files.pythonhosted.org/packages/eb/0c/707c5a19598eafcafd489b73c4cb1c142102d6197e872f531512d084aa76/fonttools-4.59.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fa39475eaccb98f9199eccfda4298abaf35ae0caec676ffc25b3a5e224044464", size = 4974422, upload-time = "2025-07-16T12:03:57.406Z" }, - { url = "https://files.pythonhosted.org/packages/f6/e7/6d33737d9fe632a0f59289b6f9743a86d2a9d0673de2a0c38c0f54729822/fonttools-4.59.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d3972b13148c1d1fbc092b27678a33b3080d1ac0ca305742b0119b75f9e87e38", size = 5010631, upload-time = "2025-07-16T12:03:59.449Z" }, - { url = "https://files.pythonhosted.org/packages/63/e1/a4c3d089ab034a578820c8f2dff21ef60daf9668034a1e4fb38bb1cc3398/fonttools-4.59.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a408c3c51358c89b29cfa5317cf11518b7ce5de1717abb55c5ae2d2921027de6", size = 5122198, upload-time = "2025-07-16T12:04:01.542Z" }, - { url = "https://files.pythonhosted.org/packages/09/77/ca82b9c12fa4de3c520b7760ee61787640cf3fde55ef1b0bfe1de38c8153/fonttools-4.59.0-cp311-cp311-win32.whl", hash = "sha256:6770d7da00f358183d8fd5c4615436189e4f683bdb6affb02cad3d221d7bb757", size = 2214216, upload-time = "2025-07-16T12:04:03.515Z" }, - { url = "https://files.pythonhosted.org/packages/ab/25/5aa7ca24b560b2f00f260acf32c4cf29d7aaf8656e159a336111c18bc345/fonttools-4.59.0-cp311-cp311-win_amd64.whl", hash = "sha256:84fc186980231a287b28560d3123bd255d3c6b6659828c642b4cf961e2b923d0", size = 2261879, upload-time = "2025-07-16T12:04:05.015Z" }, - { url = "https://files.pythonhosted.org/packages/e2/77/b1c8af22f4265e951cd2e5535dbef8859efcef4fb8dee742d368c967cddb/fonttools-4.59.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f9b3a78f69dcbd803cf2fb3f972779875b244c1115481dfbdd567b2c22b31f6b", size = 2767562, upload-time = "2025-07-16T12:04:06.895Z" }, - { url = "https://files.pythonhosted.org/packages/ff/5a/aeb975699588176bb357e8b398dfd27e5d3a2230d92b81ab8cbb6187358d/fonttools-4.59.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:57bb7e26928573ee7c6504f54c05860d867fd35e675769f3ce01b52af38d48e2", size = 2335168, upload-time = "2025-07-16T12:04:08.695Z" }, - { url = "https://files.pythonhosted.org/packages/54/97/c6101a7e60ae138c4ef75b22434373a0da50a707dad523dd19a4889315bf/fonttools-4.59.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4536f2695fe5c1ffb528d84a35a7d3967e5558d2af58b4775e7ab1449d65767b", size = 4909850, upload-time = "2025-07-16T12:04:10.761Z" }, - { url = "https://files.pythonhosted.org/packages/bd/6c/fa4d18d641054f7bff878cbea14aa9433f292b9057cb1700d8e91a4d5f4f/fonttools-4.59.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:885bde7d26e5b40e15c47bd5def48b38cbd50830a65f98122a8fb90962af7cd1", size = 4955131, upload-time = "2025-07-16T12:04:12.846Z" }, - { url = "https://files.pythonhosted.org/packages/20/5c/331947fc1377deb928a69bde49f9003364f5115e5cbe351eea99e39412a2/fonttools-4.59.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6801aeddb6acb2c42eafa45bc1cb98ba236871ae6f33f31e984670b749a8e58e", size = 4899667, upload-time = "2025-07-16T12:04:14.558Z" }, - { url = "https://files.pythonhosted.org/packages/8a/46/b66469dfa26b8ff0baa7654b2cc7851206c6d57fe3abdabbaab22079a119/fonttools-4.59.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:31003b6a10f70742a63126b80863ab48175fb8272a18ca0846c0482968f0588e", size = 5051349, upload-time = "2025-07-16T12:04:16.388Z" }, - { url = "https://files.pythonhosted.org/packages/2e/05/ebfb6b1f3a4328ab69787d106a7d92ccde77ce66e98659df0f9e3f28d93d/fonttools-4.59.0-cp312-cp312-win32.whl", hash = "sha256:fbce6dae41b692a5973d0f2158f782b9ad05babc2c2019a970a1094a23909b1b", size = 2201315, upload-time = "2025-07-16T12:04:18.557Z" }, - { url = "https://files.pythonhosted.org/packages/09/45/d2bdc9ea20bbadec1016fd0db45696d573d7a26d95ab5174ffcb6d74340b/fonttools-4.59.0-cp312-cp312-win_amd64.whl", hash = "sha256:332bfe685d1ac58ca8d62b8d6c71c2e52a6c64bc218dc8f7825c9ea51385aa01", size = 2249408, upload-time = "2025-07-16T12:04:20.489Z" }, - { url = "https://files.pythonhosted.org/packages/f3/bb/390990e7c457d377b00890d9f96a3ca13ae2517efafb6609c1756e213ba4/fonttools-4.59.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:78813b49d749e1bb4db1c57f2d4d7e6db22c253cb0a86ad819f5dc197710d4b2", size = 2758704, upload-time = "2025-07-16T12:04:22.217Z" }, - { url = "https://files.pythonhosted.org/packages/df/6f/d730d9fcc9b410a11597092bd2eb9ca53e5438c6cb90e4b3047ce1b723e9/fonttools-4.59.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:401b1941ce37e78b8fd119b419b617277c65ae9417742a63282257434fd68ea2", size = 2330764, upload-time = "2025-07-16T12:04:23.985Z" }, - { url = "https://files.pythonhosted.org/packages/75/b4/b96bb66f6f8cc4669de44a158099b249c8159231d254ab6b092909388be5/fonttools-4.59.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:efd7e6660674e234e29937bc1481dceb7e0336bfae75b856b4fb272b5093c5d4", size = 4890699, upload-time = "2025-07-16T12:04:25.664Z" }, - { url = "https://files.pythonhosted.org/packages/b5/57/7969af50b26408be12baa317c6147588db5b38af2759e6df94554dbc5fdb/fonttools-4.59.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51ab1ff33c19e336c02dee1e9fd1abd974a4ca3d8f7eef2a104d0816a241ce97", size = 4952934, upload-time = "2025-07-16T12:04:27.733Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e2/dd968053b6cf1f46c904f5bd409b22341477c017d8201619a265e50762d3/fonttools-4.59.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a9bf8adc9e1f3012edc8f09b08336272aec0c55bc677422273e21280db748f7c", size = 4892319, upload-time = "2025-07-16T12:04:30.074Z" }, - { url = "https://files.pythonhosted.org/packages/6b/95/a59810d8eda09129f83467a4e58f84205dc6994ebaeb9815406363e07250/fonttools-4.59.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37e01c6ec0c98599778c2e688350d624fa4770fbd6144551bd5e032f1199171c", size = 5034753, upload-time = "2025-07-16T12:04:32.292Z" }, - { url = "https://files.pythonhosted.org/packages/a5/84/51a69ee89ff8d1fea0c6997e946657e25a3f08513de8435fe124929f3eef/fonttools-4.59.0-cp313-cp313-win32.whl", hash = "sha256:70d6b3ceaa9cc5a6ac52884f3b3d9544e8e231e95b23f138bdb78e6d4dc0eae3", size = 2199688, upload-time = "2025-07-16T12:04:34.444Z" }, - { url = "https://files.pythonhosted.org/packages/a0/ee/f626cd372932d828508137a79b85167fdcf3adab2e3bed433f295c596c6a/fonttools-4.59.0-cp313-cp313-win_amd64.whl", hash = "sha256:26731739daa23b872643f0e4072d5939960237d540c35c14e6a06d47d71ca8fe", size = 2248560, upload-time = "2025-07-16T12:04:36.034Z" }, - { url = "https://files.pythonhosted.org/packages/c5/68/635adfcd75d86a965f633ea704308a762ee7e80f000456da010eadd3b032/fonttools-4.59.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8d77f92438daeaddc05682f0f3dac90c5b9829bcac75b57e8ce09cb67786073c", size = 2768038, upload-time = "2025-07-16T12:04:37.692Z" }, - { url = "https://files.pythonhosted.org/packages/d4/c7/41812171da0337a4d3e58da0fe9e13df55990a8e48d1babf1ece2f48a717/fonttools-4.59.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:60f6665579e909b618282f3c14fa0b80570fbf1ee0e67678b9a9d43aa5d67a37", size = 2335207, upload-time = "2025-07-16T12:04:39.314Z" }, - { url = "https://files.pythonhosted.org/packages/c9/40/0b1c47982ccb8c5eec15ddae486ccdf34364c2683307e139f877c6a4710f/fonttools-4.59.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:169b99a2553a227f7b5fea8d9ecd673aa258617f466b2abc6091fe4512a0dcd0", size = 4832505, upload-time = "2025-07-16T12:04:40.959Z" }, - { url = "https://files.pythonhosted.org/packages/ee/40/70cfe1b4a3f6218457e76ce0743e692cb82a4e5c8a9a1fe64576428488a2/fonttools-4.59.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:052444a5d0151878e87e3e512a1aa1a0ab35ee4c28afde0a778e23b0ace4a7de", size = 4762567, upload-time = "2025-07-16T12:04:42.934Z" }, - { url = "https://files.pythonhosted.org/packages/d4/18/5231342b4e528eb8d2c048f4663cf7dc892dee51387f5a0383b8e9e49283/fonttools-4.59.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d40dcf533ca481355aa7b682e9e079f766f35715defa4929aeb5597f9604272e", size = 4815520, upload-time = "2025-07-16T12:04:44.869Z" }, - { url = "https://files.pythonhosted.org/packages/91/b3/7661184576e235f84ed6ff232d287c598fb517224c5dfad8ae67fdd158e5/fonttools-4.59.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b818db35879d2edf7f46c7e729c700a0bce03b61b9412f5a7118406687cb151d", size = 4924601, upload-time = "2025-07-16T12:04:47.119Z" }, - { url = "https://files.pythonhosted.org/packages/cf/96/dfd52d0e603c2c03f1b6153a1989c810a2083f8ad282b8b80acf3fe736f8/fonttools-4.59.0-cp39-cp39-win32.whl", hash = "sha256:2e7cf8044ce2598bb87e44ba1d2c6e45d7a8decf56055b92906dc53f67c76d64", size = 1485238, upload-time = "2025-07-16T12:04:49.14Z" }, - { url = "https://files.pythonhosted.org/packages/3b/75/efc6486371cc1125e41fc0c149d80605e17ce7fc28c05cc33d503b0bf41f/fonttools-4.59.0-cp39-cp39-win_amd64.whl", hash = "sha256:902425f5afe28572d65d2bf9c33edd5265c612ff82c69e6f83ea13eafc0dcbea", size = 1530070, upload-time = "2025-07-16T12:04:50.767Z" }, - { url = "https://files.pythonhosted.org/packages/d0/9c/df0ef2c51845a13043e5088f7bb988ca6cd5bb82d5d4203d6a158aa58cf2/fonttools-4.59.0-py3-none-any.whl", hash = "sha256:241313683afd3baacb32a6bd124d0bce7404bc5280e12e291bae1b9bba28711d", size = 1128050, upload-time = "2025-07-16T12:04:52.687Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/8a/27/ec3c723bfdf86f34c5c82bf6305df3e0f0d8ea798d2d3a7cb0c0a866d286/fonttools-4.59.0.tar.gz", hash = "sha256:be392ec3529e2f57faa28709d60723a763904f71a2b63aabe14fee6648fe3b14", size = 3532521 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/1f/3dcae710b7c4b56e79442b03db64f6c9f10c3348f7af40339dffcefb581e/fonttools-4.59.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:524133c1be38445c5c0575eacea42dbd44374b310b1ffc4b60ff01d881fabb96", size = 2761846 }, + { url = "https://files.pythonhosted.org/packages/eb/0e/ae3a1884fa1549acac1191cc9ec039142f6ac0e9cbc139c2e6a3dab967da/fonttools-4.59.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21e606b2d38fed938dde871c5736822dd6bda7a4631b92e509a1f5cd1b90c5df", size = 2332060 }, + { url = "https://files.pythonhosted.org/packages/75/46/58bff92a7216829159ac7bdb1d05a48ad1b8ab8c539555f12d29fdecfdd4/fonttools-4.59.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e93df708c69a193fc7987192f94df250f83f3851fda49413f02ba5dded639482", size = 4852354 }, + { url = "https://files.pythonhosted.org/packages/05/57/767e31e48861045d89691128bd81fd4c62b62150f9a17a666f731ce4f197/fonttools-4.59.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:62224a9bb85b4b66d1b46d45cbe43d71cbf8f527d332b177e3b96191ffbc1e64", size = 4781132 }, + { url = "https://files.pythonhosted.org/packages/d7/78/adb5e9b0af5c6ce469e8b0e112f144eaa84b30dd72a486e9c778a9b03b31/fonttools-4.59.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8974b2a266b54c96709bd5e239979cddfd2dbceed331aa567ea1d7c4a2202db", size = 4832901 }, + { url = "https://files.pythonhosted.org/packages/ac/92/bc3881097fbf3d56d112bec308c863c058e5d4c9c65f534e8ae58450ab8a/fonttools-4.59.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:209b75943d158f610b78320eacb5539aa9e920bee2c775445b2846c65d20e19d", size = 4940140 }, + { url = "https://files.pythonhosted.org/packages/4a/54/39cdb23f0eeda2e07ae9cb189f2b6f41da89aabc682d3a387b3ff4a4ed29/fonttools-4.59.0-cp310-cp310-win32.whl", hash = "sha256:4c908a7036f0f3677f8afa577bcd973e3e20ddd2f7c42a33208d18bee95cdb6f", size = 2215890 }, + { url = "https://files.pythonhosted.org/packages/d8/eb/f8388d9e19f95d8df2449febe9b1a38ddd758cfdb7d6de3a05198d785d61/fonttools-4.59.0-cp310-cp310-win_amd64.whl", hash = "sha256:8b4309a2775e4feee7356e63b163969a215d663399cce1b3d3b65e7ec2d9680e", size = 2260191 }, + { url = "https://files.pythonhosted.org/packages/06/96/520733d9602fa1bf6592e5354c6721ac6fc9ea72bc98d112d0c38b967199/fonttools-4.59.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:841b2186adce48903c0fef235421ae21549020eca942c1da773ac380b056ab3c", size = 2782387 }, + { url = "https://files.pythonhosted.org/packages/87/6a/170fce30b9bce69077d8eec9bea2cfd9f7995e8911c71be905e2eba6368b/fonttools-4.59.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9bcc1e77fbd1609198966ded6b2a9897bd6c6bcbd2287a2fc7d75f1a254179c5", size = 2342194 }, + { url = "https://files.pythonhosted.org/packages/b0/b6/7c8166c0066856f1408092f7968ac744060cf72ca53aec9036106f57eeca/fonttools-4.59.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37c377f7cb2ab2eca8a0b319c68146d34a339792f9420fca6cd49cf28d370705", size = 5032333 }, + { url = "https://files.pythonhosted.org/packages/eb/0c/707c5a19598eafcafd489b73c4cb1c142102d6197e872f531512d084aa76/fonttools-4.59.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fa39475eaccb98f9199eccfda4298abaf35ae0caec676ffc25b3a5e224044464", size = 4974422 }, + { url = "https://files.pythonhosted.org/packages/f6/e7/6d33737d9fe632a0f59289b6f9743a86d2a9d0673de2a0c38c0f54729822/fonttools-4.59.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d3972b13148c1d1fbc092b27678a33b3080d1ac0ca305742b0119b75f9e87e38", size = 5010631 }, + { url = "https://files.pythonhosted.org/packages/63/e1/a4c3d089ab034a578820c8f2dff21ef60daf9668034a1e4fb38bb1cc3398/fonttools-4.59.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a408c3c51358c89b29cfa5317cf11518b7ce5de1717abb55c5ae2d2921027de6", size = 5122198 }, + { url = "https://files.pythonhosted.org/packages/09/77/ca82b9c12fa4de3c520b7760ee61787640cf3fde55ef1b0bfe1de38c8153/fonttools-4.59.0-cp311-cp311-win32.whl", hash = "sha256:6770d7da00f358183d8fd5c4615436189e4f683bdb6affb02cad3d221d7bb757", size = 2214216 }, + { url = "https://files.pythonhosted.org/packages/ab/25/5aa7ca24b560b2f00f260acf32c4cf29d7aaf8656e159a336111c18bc345/fonttools-4.59.0-cp311-cp311-win_amd64.whl", hash = "sha256:84fc186980231a287b28560d3123bd255d3c6b6659828c642b4cf961e2b923d0", size = 2261879 }, + { url = "https://files.pythonhosted.org/packages/e2/77/b1c8af22f4265e951cd2e5535dbef8859efcef4fb8dee742d368c967cddb/fonttools-4.59.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f9b3a78f69dcbd803cf2fb3f972779875b244c1115481dfbdd567b2c22b31f6b", size = 2767562 }, + { url = "https://files.pythonhosted.org/packages/ff/5a/aeb975699588176bb357e8b398dfd27e5d3a2230d92b81ab8cbb6187358d/fonttools-4.59.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:57bb7e26928573ee7c6504f54c05860d867fd35e675769f3ce01b52af38d48e2", size = 2335168 }, + { url = "https://files.pythonhosted.org/packages/54/97/c6101a7e60ae138c4ef75b22434373a0da50a707dad523dd19a4889315bf/fonttools-4.59.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4536f2695fe5c1ffb528d84a35a7d3967e5558d2af58b4775e7ab1449d65767b", size = 4909850 }, + { url = "https://files.pythonhosted.org/packages/bd/6c/fa4d18d641054f7bff878cbea14aa9433f292b9057cb1700d8e91a4d5f4f/fonttools-4.59.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:885bde7d26e5b40e15c47bd5def48b38cbd50830a65f98122a8fb90962af7cd1", size = 4955131 }, + { url = "https://files.pythonhosted.org/packages/20/5c/331947fc1377deb928a69bde49f9003364f5115e5cbe351eea99e39412a2/fonttools-4.59.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6801aeddb6acb2c42eafa45bc1cb98ba236871ae6f33f31e984670b749a8e58e", size = 4899667 }, + { url = "https://files.pythonhosted.org/packages/8a/46/b66469dfa26b8ff0baa7654b2cc7851206c6d57fe3abdabbaab22079a119/fonttools-4.59.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:31003b6a10f70742a63126b80863ab48175fb8272a18ca0846c0482968f0588e", size = 5051349 }, + { url = "https://files.pythonhosted.org/packages/2e/05/ebfb6b1f3a4328ab69787d106a7d92ccde77ce66e98659df0f9e3f28d93d/fonttools-4.59.0-cp312-cp312-win32.whl", hash = "sha256:fbce6dae41b692a5973d0f2158f782b9ad05babc2c2019a970a1094a23909b1b", size = 2201315 }, + { url = "https://files.pythonhosted.org/packages/09/45/d2bdc9ea20bbadec1016fd0db45696d573d7a26d95ab5174ffcb6d74340b/fonttools-4.59.0-cp312-cp312-win_amd64.whl", hash = "sha256:332bfe685d1ac58ca8d62b8d6c71c2e52a6c64bc218dc8f7825c9ea51385aa01", size = 2249408 }, + { url = "https://files.pythonhosted.org/packages/f3/bb/390990e7c457d377b00890d9f96a3ca13ae2517efafb6609c1756e213ba4/fonttools-4.59.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:78813b49d749e1bb4db1c57f2d4d7e6db22c253cb0a86ad819f5dc197710d4b2", size = 2758704 }, + { url = "https://files.pythonhosted.org/packages/df/6f/d730d9fcc9b410a11597092bd2eb9ca53e5438c6cb90e4b3047ce1b723e9/fonttools-4.59.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:401b1941ce37e78b8fd119b419b617277c65ae9417742a63282257434fd68ea2", size = 2330764 }, + { url = "https://files.pythonhosted.org/packages/75/b4/b96bb66f6f8cc4669de44a158099b249c8159231d254ab6b092909388be5/fonttools-4.59.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:efd7e6660674e234e29937bc1481dceb7e0336bfae75b856b4fb272b5093c5d4", size = 4890699 }, + { url = "https://files.pythonhosted.org/packages/b5/57/7969af50b26408be12baa317c6147588db5b38af2759e6df94554dbc5fdb/fonttools-4.59.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51ab1ff33c19e336c02dee1e9fd1abd974a4ca3d8f7eef2a104d0816a241ce97", size = 4952934 }, + { url = "https://files.pythonhosted.org/packages/d6/e2/dd968053b6cf1f46c904f5bd409b22341477c017d8201619a265e50762d3/fonttools-4.59.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a9bf8adc9e1f3012edc8f09b08336272aec0c55bc677422273e21280db748f7c", size = 4892319 }, + { url = "https://files.pythonhosted.org/packages/6b/95/a59810d8eda09129f83467a4e58f84205dc6994ebaeb9815406363e07250/fonttools-4.59.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37e01c6ec0c98599778c2e688350d624fa4770fbd6144551bd5e032f1199171c", size = 5034753 }, + { url = "https://files.pythonhosted.org/packages/a5/84/51a69ee89ff8d1fea0c6997e946657e25a3f08513de8435fe124929f3eef/fonttools-4.59.0-cp313-cp313-win32.whl", hash = "sha256:70d6b3ceaa9cc5a6ac52884f3b3d9544e8e231e95b23f138bdb78e6d4dc0eae3", size = 2199688 }, + { url = "https://files.pythonhosted.org/packages/a0/ee/f626cd372932d828508137a79b85167fdcf3adab2e3bed433f295c596c6a/fonttools-4.59.0-cp313-cp313-win_amd64.whl", hash = "sha256:26731739daa23b872643f0e4072d5939960237d540c35c14e6a06d47d71ca8fe", size = 2248560 }, + { url = "https://files.pythonhosted.org/packages/c5/68/635adfcd75d86a965f633ea704308a762ee7e80f000456da010eadd3b032/fonttools-4.59.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8d77f92438daeaddc05682f0f3dac90c5b9829bcac75b57e8ce09cb67786073c", size = 2768038 }, + { url = "https://files.pythonhosted.org/packages/d4/c7/41812171da0337a4d3e58da0fe9e13df55990a8e48d1babf1ece2f48a717/fonttools-4.59.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:60f6665579e909b618282f3c14fa0b80570fbf1ee0e67678b9a9d43aa5d67a37", size = 2335207 }, + { url = "https://files.pythonhosted.org/packages/c9/40/0b1c47982ccb8c5eec15ddae486ccdf34364c2683307e139f877c6a4710f/fonttools-4.59.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:169b99a2553a227f7b5fea8d9ecd673aa258617f466b2abc6091fe4512a0dcd0", size = 4832505 }, + { url = "https://files.pythonhosted.org/packages/ee/40/70cfe1b4a3f6218457e76ce0743e692cb82a4e5c8a9a1fe64576428488a2/fonttools-4.59.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:052444a5d0151878e87e3e512a1aa1a0ab35ee4c28afde0a778e23b0ace4a7de", size = 4762567 }, + { url = "https://files.pythonhosted.org/packages/d4/18/5231342b4e528eb8d2c048f4663cf7dc892dee51387f5a0383b8e9e49283/fonttools-4.59.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d40dcf533ca481355aa7b682e9e079f766f35715defa4929aeb5597f9604272e", size = 4815520 }, + { url = "https://files.pythonhosted.org/packages/91/b3/7661184576e235f84ed6ff232d287c598fb517224c5dfad8ae67fdd158e5/fonttools-4.59.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b818db35879d2edf7f46c7e729c700a0bce03b61b9412f5a7118406687cb151d", size = 4924601 }, + { url = "https://files.pythonhosted.org/packages/cf/96/dfd52d0e603c2c03f1b6153a1989c810a2083f8ad282b8b80acf3fe736f8/fonttools-4.59.0-cp39-cp39-win32.whl", hash = "sha256:2e7cf8044ce2598bb87e44ba1d2c6e45d7a8decf56055b92906dc53f67c76d64", size = 1485238 }, + { url = "https://files.pythonhosted.org/packages/3b/75/efc6486371cc1125e41fc0c149d80605e17ce7fc28c05cc33d503b0bf41f/fonttools-4.59.0-cp39-cp39-win_amd64.whl", hash = "sha256:902425f5afe28572d65d2bf9c33edd5265c612ff82c69e6f83ea13eafc0dcbea", size = 1530070 }, + { url = "https://files.pythonhosted.org/packages/d0/9c/df0ef2c51845a13043e5088f7bb988ca6cd5bb82d5d4203d6a158aa58cf2/fonttools-4.59.0-py3-none-any.whl", hash = "sha256:241313683afd3baacb32a6bd124d0bce7404bc5280e12e291bae1b9bba28711d", size = 1128050 }, ] [[package]] @@ -897,9 +896,9 @@ dependencies = [ { name = "setuptools" }, { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5d/a9/af5bfd5a92592c16cdae5c04f68187a309be8a146b528eac3c6e30edbad2/fs-2.4.16.tar.gz", hash = "sha256:ae97c7d51213f4b70b6a958292530289090de3a7e15841e108fbe144f069d313", size = 187441, upload-time = "2022-05-02T09:25:54.22Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5d/a9/af5bfd5a92592c16cdae5c04f68187a309be8a146b528eac3c6e30edbad2/fs-2.4.16.tar.gz", hash = "sha256:ae97c7d51213f4b70b6a958292530289090de3a7e15841e108fbe144f069d313", size = 187441 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/5c/a3d95dc1ec6cdeb032d789b552ecc76effa3557ea9186e1566df6aac18df/fs-2.4.16-py2.py3-none-any.whl", hash = "sha256:660064febbccda264ae0b6bace80a8d1be9e089e0a5eb2427b7d517f9a91545c", size = 135261, upload-time = "2022-05-02T09:25:52.363Z" }, + { url = "https://files.pythonhosted.org/packages/b9/5c/a3d95dc1ec6cdeb032d789b552ecc76effa3557ea9186e1566df6aac18df/fs-2.4.16-py2.py3-none-any.whl", hash = "sha256:660064febbccda264ae0b6bace80a8d1be9e089e0a5eb2427b7d517f9a91545c", size = 135261 }, ] [[package]] @@ -915,88 +914,88 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d0/69/312cd100fa45ddaea5a588334d2defa331ff427bcb61f5fe2ae61bdc3762/furo-2025.7.19.tar.gz", hash = "sha256:4164b2cafcf4023a59bb3c594e935e2516f6b9d35e9a5ea83d8f6b43808fe91f", size = 1662054, upload-time = "2025-07-19T10:52:09.754Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/69/312cd100fa45ddaea5a588334d2defa331ff427bcb61f5fe2ae61bdc3762/furo-2025.7.19.tar.gz", hash = "sha256:4164b2cafcf4023a59bb3c594e935e2516f6b9d35e9a5ea83d8f6b43808fe91f", size = 1662054 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/34/2b07b72bee02a63241d654f5d8af87a2de977c59638eec41ca356ab915cd/furo-2025.7.19-py3-none-any.whl", hash = "sha256:bdea869822dfd2b494ea84c0973937e35d1575af088b6721a29c7f7878adc9e3", size = 342175, upload-time = "2025-07-19T10:52:02.399Z" }, + { url = "https://files.pythonhosted.org/packages/3a/34/2b07b72bee02a63241d654f5d8af87a2de977c59638eec41ca356ab915cd/furo-2025.7.19-py3-none-any.whl", hash = "sha256:bdea869822dfd2b494ea84c0973937e35d1575af088b6721a29c7f7878adc9e3", size = 342175 }, ] [[package]] name = "greenlet" version = "3.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c9/92/bb85bd6e80148a4d2e0c59f7c0c2891029f8fd510183afc7d8d2feeed9b6/greenlet-3.2.3.tar.gz", hash = "sha256:8b0dd8ae4c0d6f5e54ee55ba935eeb3d735a9b58a8a1e5b5cbab64e01a39f365", size = 185752, upload-time = "2025-06-05T16:16:09.955Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/92/db/b4c12cff13ebac2786f4f217f06588bccd8b53d260453404ef22b121fc3a/greenlet-3.2.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:1afd685acd5597349ee6d7a88a8bec83ce13c106ac78c196ee9dde7c04fe87be", size = 268977, upload-time = "2025-06-05T16:10:24.001Z" }, - { url = "https://files.pythonhosted.org/packages/52/61/75b4abd8147f13f70986df2801bf93735c1bd87ea780d70e3b3ecda8c165/greenlet-3.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:761917cac215c61e9dc7324b2606107b3b292a8349bdebb31503ab4de3f559ac", size = 627351, upload-time = "2025-06-05T16:38:50.685Z" }, - { url = "https://files.pythonhosted.org/packages/35/aa/6894ae299d059d26254779a5088632874b80ee8cf89a88bca00b0709d22f/greenlet-3.2.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:a433dbc54e4a37e4fff90ef34f25a8c00aed99b06856f0119dcf09fbafa16392", size = 638599, upload-time = "2025-06-05T16:41:34.057Z" }, - { url = "https://files.pythonhosted.org/packages/30/64/e01a8261d13c47f3c082519a5e9dbf9e143cc0498ed20c911d04e54d526c/greenlet-3.2.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:72e77ed69312bab0434d7292316d5afd6896192ac4327d44f3d613ecb85b037c", size = 634482, upload-time = "2025-06-05T16:48:16.26Z" }, - { url = "https://files.pythonhosted.org/packages/47/48/ff9ca8ba9772d083a4f5221f7b4f0ebe8978131a9ae0909cf202f94cd879/greenlet-3.2.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:68671180e3849b963649254a882cd544a3c75bfcd2c527346ad8bb53494444db", size = 633284, upload-time = "2025-06-05T16:13:01.599Z" }, - { url = "https://files.pythonhosted.org/packages/e9/45/626e974948713bc15775b696adb3eb0bd708bec267d6d2d5c47bb47a6119/greenlet-3.2.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49c8cfb18fb419b3d08e011228ef8a25882397f3a859b9fe1436946140b6756b", size = 582206, upload-time = "2025-06-05T16:12:48.51Z" }, - { url = "https://files.pythonhosted.org/packages/b1/8e/8b6f42c67d5df7db35b8c55c9a850ea045219741bb14416255616808c690/greenlet-3.2.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:efc6dc8a792243c31f2f5674b670b3a95d46fa1c6a912b8e310d6f542e7b0712", size = 1111412, upload-time = "2025-06-05T16:36:45.479Z" }, - { url = "https://files.pythonhosted.org/packages/05/46/ab58828217349500a7ebb81159d52ca357da747ff1797c29c6023d79d798/greenlet-3.2.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:731e154aba8e757aedd0781d4b240f1225b075b4409f1bb83b05ff410582cf00", size = 1135054, upload-time = "2025-06-05T16:12:36.478Z" }, - { url = "https://files.pythonhosted.org/packages/68/7f/d1b537be5080721c0f0089a8447d4ef72839039cdb743bdd8ffd23046e9a/greenlet-3.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:96c20252c2f792defe9a115d3287e14811036d51e78b3aaddbee23b69b216302", size = 296573, upload-time = "2025-06-05T16:34:26.521Z" }, - { url = "https://files.pythonhosted.org/packages/fc/2e/d4fcb2978f826358b673f779f78fa8a32ee37df11920dc2bb5589cbeecef/greenlet-3.2.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:784ae58bba89fa1fa5733d170d42486580cab9decda3484779f4759345b29822", size = 270219, upload-time = "2025-06-05T16:10:10.414Z" }, - { url = "https://files.pythonhosted.org/packages/16/24/929f853e0202130e4fe163bc1d05a671ce8dcd604f790e14896adac43a52/greenlet-3.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0921ac4ea42a5315d3446120ad48f90c3a6b9bb93dd9b3cf4e4d84a66e42de83", size = 630383, upload-time = "2025-06-05T16:38:51.785Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b2/0320715eb61ae70c25ceca2f1d5ae620477d246692d9cc284c13242ec31c/greenlet-3.2.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d2971d93bb99e05f8c2c0c2f4aa9484a18d98c4c3bd3c62b65b7e6ae33dfcfaf", size = 642422, upload-time = "2025-06-05T16:41:35.259Z" }, - { url = "https://files.pythonhosted.org/packages/bd/49/445fd1a210f4747fedf77615d941444349c6a3a4a1135bba9701337cd966/greenlet-3.2.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c667c0bf9d406b77a15c924ef3285e1e05250948001220368e039b6aa5b5034b", size = 638375, upload-time = "2025-06-05T16:48:18.235Z" }, - { url = "https://files.pythonhosted.org/packages/7e/c8/ca19760cf6eae75fa8dc32b487e963d863b3ee04a7637da77b616703bc37/greenlet-3.2.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:592c12fb1165be74592f5de0d70f82bc5ba552ac44800d632214b76089945147", size = 637627, upload-time = "2025-06-05T16:13:02.858Z" }, - { url = "https://files.pythonhosted.org/packages/65/89/77acf9e3da38e9bcfca881e43b02ed467c1dedc387021fc4d9bd9928afb8/greenlet-3.2.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29e184536ba333003540790ba29829ac14bb645514fbd7e32af331e8202a62a5", size = 585502, upload-time = "2025-06-05T16:12:49.642Z" }, - { url = "https://files.pythonhosted.org/packages/97/c6/ae244d7c95b23b7130136e07a9cc5aadd60d59b5951180dc7dc7e8edaba7/greenlet-3.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:93c0bb79844a367782ec4f429d07589417052e621aa39a5ac1fb99c5aa308edc", size = 1114498, upload-time = "2025-06-05T16:36:46.598Z" }, - { url = "https://files.pythonhosted.org/packages/89/5f/b16dec0cbfd3070658e0d744487919740c6d45eb90946f6787689a7efbce/greenlet-3.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:751261fc5ad7b6705f5f76726567375bb2104a059454e0226e1eef6c756748ba", size = 1139977, upload-time = "2025-06-05T16:12:38.262Z" }, - { url = "https://files.pythonhosted.org/packages/66/77/d48fb441b5a71125bcac042fc5b1494c806ccb9a1432ecaa421e72157f77/greenlet-3.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:83a8761c75312361aa2b5b903b79da97f13f556164a7dd2d5448655425bd4c34", size = 297017, upload-time = "2025-06-05T16:25:05.225Z" }, - { url = "https://files.pythonhosted.org/packages/f3/94/ad0d435f7c48debe960c53b8f60fb41c2026b1d0fa4a99a1cb17c3461e09/greenlet-3.2.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:25ad29caed5783d4bd7a85c9251c651696164622494c00802a139c00d639242d", size = 271992, upload-time = "2025-06-05T16:11:23.467Z" }, - { url = "https://files.pythonhosted.org/packages/93/5d/7c27cf4d003d6e77749d299c7c8f5fd50b4f251647b5c2e97e1f20da0ab5/greenlet-3.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88cd97bf37fe24a6710ec6a3a7799f3f81d9cd33317dcf565ff9950c83f55e0b", size = 638820, upload-time = "2025-06-05T16:38:52.882Z" }, - { url = "https://files.pythonhosted.org/packages/c6/7e/807e1e9be07a125bb4c169144937910bf59b9d2f6d931578e57f0bce0ae2/greenlet-3.2.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:baeedccca94880d2f5666b4fa16fc20ef50ba1ee353ee2d7092b383a243b0b0d", size = 653046, upload-time = "2025-06-05T16:41:36.343Z" }, - { url = "https://files.pythonhosted.org/packages/9d/ab/158c1a4ea1068bdbc78dba5a3de57e4c7aeb4e7fa034320ea94c688bfb61/greenlet-3.2.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:be52af4b6292baecfa0f397f3edb3c6092ce071b499dd6fe292c9ac9f2c8f264", size = 647701, upload-time = "2025-06-05T16:48:19.604Z" }, - { url = "https://files.pythonhosted.org/packages/cc/0d/93729068259b550d6a0288da4ff72b86ed05626eaf1eb7c0d3466a2571de/greenlet-3.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0cc73378150b8b78b0c9fe2ce56e166695e67478550769536a6742dca3651688", size = 649747, upload-time = "2025-06-05T16:13:04.628Z" }, - { url = "https://files.pythonhosted.org/packages/f6/f6/c82ac1851c60851302d8581680573245c8fc300253fc1ff741ae74a6c24d/greenlet-3.2.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:706d016a03e78df129f68c4c9b4c4f963f7d73534e48a24f5f5a7101ed13dbbb", size = 605461, upload-time = "2025-06-05T16:12:50.792Z" }, - { url = "https://files.pythonhosted.org/packages/98/82/d022cf25ca39cf1200650fc58c52af32c90f80479c25d1cbf57980ec3065/greenlet-3.2.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:419e60f80709510c343c57b4bb5a339d8767bf9aef9b8ce43f4f143240f88b7c", size = 1121190, upload-time = "2025-06-05T16:36:48.59Z" }, - { url = "https://files.pythonhosted.org/packages/f5/e1/25297f70717abe8104c20ecf7af0a5b82d2f5a980eb1ac79f65654799f9f/greenlet-3.2.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:93d48533fade144203816783373f27a97e4193177ebaaf0fc396db19e5d61163", size = 1149055, upload-time = "2025-06-05T16:12:40.457Z" }, - { url = "https://files.pythonhosted.org/packages/1f/8f/8f9e56c5e82eb2c26e8cde787962e66494312dc8cb261c460e1f3a9c88bc/greenlet-3.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:7454d37c740bb27bdeddfc3f358f26956a07d5220818ceb467a483197d84f849", size = 297817, upload-time = "2025-06-05T16:29:49.244Z" }, - { url = "https://files.pythonhosted.org/packages/b1/cf/f5c0b23309070ae93de75c90d29300751a5aacefc0a3ed1b1d8edb28f08b/greenlet-3.2.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:500b8689aa9dd1ab26872a34084503aeddefcb438e2e7317b89b11eaea1901ad", size = 270732, upload-time = "2025-06-05T16:10:08.26Z" }, - { url = "https://files.pythonhosted.org/packages/48/ae/91a957ba60482d3fecf9be49bc3948f341d706b52ddb9d83a70d42abd498/greenlet-3.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a07d3472c2a93117af3b0136f246b2833fdc0b542d4a9799ae5f41c28323faef", size = 639033, upload-time = "2025-06-05T16:38:53.983Z" }, - { url = "https://files.pythonhosted.org/packages/6f/df/20ffa66dd5a7a7beffa6451bdb7400d66251374ab40b99981478c69a67a8/greenlet-3.2.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8704b3768d2f51150626962f4b9a9e4a17d2e37c8a8d9867bbd9fa4eb938d3b3", size = 652999, upload-time = "2025-06-05T16:41:37.89Z" }, - { url = "https://files.pythonhosted.org/packages/51/b4/ebb2c8cb41e521f1d72bf0465f2f9a2fd803f674a88db228887e6847077e/greenlet-3.2.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5035d77a27b7c62db6cf41cf786cfe2242644a7a337a0e155c80960598baab95", size = 647368, upload-time = "2025-06-05T16:48:21.467Z" }, - { url = "https://files.pythonhosted.org/packages/8e/6a/1e1b5aa10dced4ae876a322155705257748108b7fd2e4fae3f2a091fe81a/greenlet-3.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2d8aa5423cd4a396792f6d4580f88bdc6efcb9205891c9d40d20f6e670992efb", size = 650037, upload-time = "2025-06-05T16:13:06.402Z" }, - { url = "https://files.pythonhosted.org/packages/26/f2/ad51331a157c7015c675702e2d5230c243695c788f8f75feba1af32b3617/greenlet-3.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c724620a101f8170065d7dded3f962a2aea7a7dae133a009cada42847e04a7b", size = 608402, upload-time = "2025-06-05T16:12:51.91Z" }, - { url = "https://files.pythonhosted.org/packages/26/bc/862bd2083e6b3aff23300900a956f4ea9a4059de337f5c8734346b9b34fc/greenlet-3.2.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:873abe55f134c48e1f2a6f53f7d1419192a3d1a4e873bace00499a4e45ea6af0", size = 1119577, upload-time = "2025-06-05T16:36:49.787Z" }, - { url = "https://files.pythonhosted.org/packages/86/94/1fc0cc068cfde885170e01de40a619b00eaa8f2916bf3541744730ffb4c3/greenlet-3.2.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:024571bbce5f2c1cfff08bf3fbaa43bbc7444f580ae13b0099e95d0e6e67ed36", size = 1147121, upload-time = "2025-06-05T16:12:42.527Z" }, - { url = "https://files.pythonhosted.org/packages/27/1a/199f9587e8cb08a0658f9c30f3799244307614148ffe8b1e3aa22f324dea/greenlet-3.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5195fb1e75e592dd04ce79881c8a22becdfa3e6f500e7feb059b1e6fdd54d3e3", size = 297603, upload-time = "2025-06-05T16:20:12.651Z" }, - { url = "https://files.pythonhosted.org/packages/d8/ca/accd7aa5280eb92b70ed9e8f7fd79dc50a2c21d8c73b9a0856f5b564e222/greenlet-3.2.3-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:3d04332dddb10b4a211b68111dabaee2e1a073663d117dc10247b5b1642bac86", size = 271479, upload-time = "2025-06-05T16:10:47.525Z" }, - { url = "https://files.pythonhosted.org/packages/55/71/01ed9895d9eb49223280ecc98a557585edfa56b3d0e965b9fa9f7f06b6d9/greenlet-3.2.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8186162dffde068a465deab08fc72c767196895c39db26ab1c17c0b77a6d8b97", size = 683952, upload-time = "2025-06-05T16:38:55.125Z" }, - { url = "https://files.pythonhosted.org/packages/ea/61/638c4bdf460c3c678a0a1ef4c200f347dff80719597e53b5edb2fb27ab54/greenlet-3.2.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f4bfbaa6096b1b7a200024784217defedf46a07c2eee1a498e94a1b5f8ec5728", size = 696917, upload-time = "2025-06-05T16:41:38.959Z" }, - { url = "https://files.pythonhosted.org/packages/22/cc/0bd1a7eb759d1f3e3cc2d1bc0f0b487ad3cc9f34d74da4b80f226fde4ec3/greenlet-3.2.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ed6cfa9200484d234d8394c70f5492f144b20d4533f69262d530a1a082f6ee9a", size = 692443, upload-time = "2025-06-05T16:48:23.113Z" }, - { url = "https://files.pythonhosted.org/packages/67/10/b2a4b63d3f08362662e89c103f7fe28894a51ae0bc890fabf37d1d780e52/greenlet-3.2.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:02b0df6f63cd15012bed5401b47829cfd2e97052dc89da3cfaf2c779124eb892", size = 692995, upload-time = "2025-06-05T16:13:07.972Z" }, - { url = "https://files.pythonhosted.org/packages/5a/c6/ad82f148a4e3ce9564056453a71529732baf5448ad53fc323e37efe34f66/greenlet-3.2.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86c2d68e87107c1792e2e8d5399acec2487a4e993ab76c792408e59394d52141", size = 655320, upload-time = "2025-06-05T16:12:53.453Z" }, - { url = "https://files.pythonhosted.org/packages/5c/4f/aab73ecaa6b3086a4c89863d94cf26fa84cbff63f52ce9bc4342b3087a06/greenlet-3.2.3-cp314-cp314-win_amd64.whl", hash = "sha256:8c47aae8fbbfcf82cc13327ae802ba13c9c36753b67e760023fd116bc124a62a", size = 301236, upload-time = "2025-06-05T16:15:20.111Z" }, - { url = "https://files.pythonhosted.org/packages/3d/d9/a3114df5fba2bf9823e0acc01e9e2abdcd8ea4c5487cf1c3dcd4cc0b48cf/greenlet-3.2.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:42efc522c0bd75ffa11a71e09cd8a399d83fafe36db250a87cf1dacfaa15dc64", size = 267769, upload-time = "2025-06-05T16:10:44.802Z" }, - { url = "https://files.pythonhosted.org/packages/bc/da/47dfc50f6e5673116e66a737dc58d1eca651db9a9aa8797c1d27e940e211/greenlet-3.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d760f9bdfe79bff803bad32b4d8ffb2c1d2ce906313fc10a83976ffb73d64ca7", size = 625472, upload-time = "2025-06-05T16:38:56.882Z" }, - { url = "https://files.pythonhosted.org/packages/f5/74/f6ef9f85d981b2fcd665bbee3e69e3c0a10fb962eb4c6a5889ac3b6debfa/greenlet-3.2.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8324319cbd7b35b97990090808fdc99c27fe5338f87db50514959f8059999805", size = 637253, upload-time = "2025-06-05T16:41:40.542Z" }, - { url = "https://files.pythonhosted.org/packages/66/69/4919bb1c9e43bfc16dc886e7a37fe1bc04bfa4101aba177936a10f313cad/greenlet-3.2.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:8c37ef5b3787567d322331d5250e44e42b58c8c713859b8a04c6065f27efbf72", size = 632611, upload-time = "2025-06-05T16:48:24.976Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8d/97d988d019f40b6b360b0c71c99e5b4c877a3d92666fe48b081d0e1ea1cd/greenlet-3.2.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ce539fb52fb774d0802175d37fcff5c723e2c7d249c65916257f0a940cee8904", size = 631843, upload-time = "2025-06-05T16:13:09.476Z" }, - { url = "https://files.pythonhosted.org/packages/59/24/d5e1504ec00768755d4ccc2168b76d9f4524e96694a14ad45bd87796e9bb/greenlet-3.2.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:003c930e0e074db83559edc8705f3a2d066d4aa8c2f198aff1e454946efd0f26", size = 580781, upload-time = "2025-06-05T16:12:55.029Z" }, - { url = "https://files.pythonhosted.org/packages/9c/df/d009bcca566dbfd2283b306b4e424f4c0e59bf984868f8b789802fe9e607/greenlet-3.2.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7e70ea4384b81ef9e84192e8a77fb87573138aa5d4feee541d8014e452b434da", size = 1109903, upload-time = "2025-06-05T16:36:51.491Z" }, - { url = "https://files.pythonhosted.org/packages/33/54/5036097197a78388aa6901a5b90b562f3a154a9fbee89c301a26f56f3942/greenlet-3.2.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:22eb5ba839c4b2156f18f76768233fe44b23a31decd9cc0d4cc8141c211fd1b4", size = 1133975, upload-time = "2025-06-05T16:12:43.866Z" }, - { url = "https://files.pythonhosted.org/packages/e2/15/b001456a430805fdd8b600a788d19a790664eee8863739523395f68df752/greenlet-3.2.3-cp39-cp39-win32.whl", hash = "sha256:4532f0d25df67f896d137431b13f4cdce89f7e3d4a96387a41290910df4d3a57", size = 279320, upload-time = "2025-06-05T16:43:34.043Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4c/bf2100cbc1bd07f39bee3b09e7eef39beffe29f5453dc2477a2693737913/greenlet-3.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:aaa7aae1e7f75eaa3ae400ad98f8644bb81e1dc6ba47ce8a93d3f17274e08322", size = 296444, upload-time = "2025-06-05T16:39:22.664Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/c9/92/bb85bd6e80148a4d2e0c59f7c0c2891029f8fd510183afc7d8d2feeed9b6/greenlet-3.2.3.tar.gz", hash = "sha256:8b0dd8ae4c0d6f5e54ee55ba935eeb3d735a9b58a8a1e5b5cbab64e01a39f365", size = 185752 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/db/b4c12cff13ebac2786f4f217f06588bccd8b53d260453404ef22b121fc3a/greenlet-3.2.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:1afd685acd5597349ee6d7a88a8bec83ce13c106ac78c196ee9dde7c04fe87be", size = 268977 }, + { url = "https://files.pythonhosted.org/packages/52/61/75b4abd8147f13f70986df2801bf93735c1bd87ea780d70e3b3ecda8c165/greenlet-3.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:761917cac215c61e9dc7324b2606107b3b292a8349bdebb31503ab4de3f559ac", size = 627351 }, + { url = "https://files.pythonhosted.org/packages/35/aa/6894ae299d059d26254779a5088632874b80ee8cf89a88bca00b0709d22f/greenlet-3.2.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:a433dbc54e4a37e4fff90ef34f25a8c00aed99b06856f0119dcf09fbafa16392", size = 638599 }, + { url = "https://files.pythonhosted.org/packages/30/64/e01a8261d13c47f3c082519a5e9dbf9e143cc0498ed20c911d04e54d526c/greenlet-3.2.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:72e77ed69312bab0434d7292316d5afd6896192ac4327d44f3d613ecb85b037c", size = 634482 }, + { url = "https://files.pythonhosted.org/packages/47/48/ff9ca8ba9772d083a4f5221f7b4f0ebe8978131a9ae0909cf202f94cd879/greenlet-3.2.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:68671180e3849b963649254a882cd544a3c75bfcd2c527346ad8bb53494444db", size = 633284 }, + { url = "https://files.pythonhosted.org/packages/e9/45/626e974948713bc15775b696adb3eb0bd708bec267d6d2d5c47bb47a6119/greenlet-3.2.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49c8cfb18fb419b3d08e011228ef8a25882397f3a859b9fe1436946140b6756b", size = 582206 }, + { url = "https://files.pythonhosted.org/packages/b1/8e/8b6f42c67d5df7db35b8c55c9a850ea045219741bb14416255616808c690/greenlet-3.2.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:efc6dc8a792243c31f2f5674b670b3a95d46fa1c6a912b8e310d6f542e7b0712", size = 1111412 }, + { url = "https://files.pythonhosted.org/packages/05/46/ab58828217349500a7ebb81159d52ca357da747ff1797c29c6023d79d798/greenlet-3.2.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:731e154aba8e757aedd0781d4b240f1225b075b4409f1bb83b05ff410582cf00", size = 1135054 }, + { url = "https://files.pythonhosted.org/packages/68/7f/d1b537be5080721c0f0089a8447d4ef72839039cdb743bdd8ffd23046e9a/greenlet-3.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:96c20252c2f792defe9a115d3287e14811036d51e78b3aaddbee23b69b216302", size = 296573 }, + { url = "https://files.pythonhosted.org/packages/fc/2e/d4fcb2978f826358b673f779f78fa8a32ee37df11920dc2bb5589cbeecef/greenlet-3.2.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:784ae58bba89fa1fa5733d170d42486580cab9decda3484779f4759345b29822", size = 270219 }, + { url = "https://files.pythonhosted.org/packages/16/24/929f853e0202130e4fe163bc1d05a671ce8dcd604f790e14896adac43a52/greenlet-3.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0921ac4ea42a5315d3446120ad48f90c3a6b9bb93dd9b3cf4e4d84a66e42de83", size = 630383 }, + { url = "https://files.pythonhosted.org/packages/d1/b2/0320715eb61ae70c25ceca2f1d5ae620477d246692d9cc284c13242ec31c/greenlet-3.2.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d2971d93bb99e05f8c2c0c2f4aa9484a18d98c4c3bd3c62b65b7e6ae33dfcfaf", size = 642422 }, + { url = "https://files.pythonhosted.org/packages/bd/49/445fd1a210f4747fedf77615d941444349c6a3a4a1135bba9701337cd966/greenlet-3.2.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c667c0bf9d406b77a15c924ef3285e1e05250948001220368e039b6aa5b5034b", size = 638375 }, + { url = "https://files.pythonhosted.org/packages/7e/c8/ca19760cf6eae75fa8dc32b487e963d863b3ee04a7637da77b616703bc37/greenlet-3.2.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:592c12fb1165be74592f5de0d70f82bc5ba552ac44800d632214b76089945147", size = 637627 }, + { url = "https://files.pythonhosted.org/packages/65/89/77acf9e3da38e9bcfca881e43b02ed467c1dedc387021fc4d9bd9928afb8/greenlet-3.2.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29e184536ba333003540790ba29829ac14bb645514fbd7e32af331e8202a62a5", size = 585502 }, + { url = "https://files.pythonhosted.org/packages/97/c6/ae244d7c95b23b7130136e07a9cc5aadd60d59b5951180dc7dc7e8edaba7/greenlet-3.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:93c0bb79844a367782ec4f429d07589417052e621aa39a5ac1fb99c5aa308edc", size = 1114498 }, + { url = "https://files.pythonhosted.org/packages/89/5f/b16dec0cbfd3070658e0d744487919740c6d45eb90946f6787689a7efbce/greenlet-3.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:751261fc5ad7b6705f5f76726567375bb2104a059454e0226e1eef6c756748ba", size = 1139977 }, + { url = "https://files.pythonhosted.org/packages/66/77/d48fb441b5a71125bcac042fc5b1494c806ccb9a1432ecaa421e72157f77/greenlet-3.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:83a8761c75312361aa2b5b903b79da97f13f556164a7dd2d5448655425bd4c34", size = 297017 }, + { url = "https://files.pythonhosted.org/packages/f3/94/ad0d435f7c48debe960c53b8f60fb41c2026b1d0fa4a99a1cb17c3461e09/greenlet-3.2.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:25ad29caed5783d4bd7a85c9251c651696164622494c00802a139c00d639242d", size = 271992 }, + { url = "https://files.pythonhosted.org/packages/93/5d/7c27cf4d003d6e77749d299c7c8f5fd50b4f251647b5c2e97e1f20da0ab5/greenlet-3.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88cd97bf37fe24a6710ec6a3a7799f3f81d9cd33317dcf565ff9950c83f55e0b", size = 638820 }, + { url = "https://files.pythonhosted.org/packages/c6/7e/807e1e9be07a125bb4c169144937910bf59b9d2f6d931578e57f0bce0ae2/greenlet-3.2.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:baeedccca94880d2f5666b4fa16fc20ef50ba1ee353ee2d7092b383a243b0b0d", size = 653046 }, + { url = "https://files.pythonhosted.org/packages/9d/ab/158c1a4ea1068bdbc78dba5a3de57e4c7aeb4e7fa034320ea94c688bfb61/greenlet-3.2.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:be52af4b6292baecfa0f397f3edb3c6092ce071b499dd6fe292c9ac9f2c8f264", size = 647701 }, + { url = "https://files.pythonhosted.org/packages/cc/0d/93729068259b550d6a0288da4ff72b86ed05626eaf1eb7c0d3466a2571de/greenlet-3.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0cc73378150b8b78b0c9fe2ce56e166695e67478550769536a6742dca3651688", size = 649747 }, + { url = "https://files.pythonhosted.org/packages/f6/f6/c82ac1851c60851302d8581680573245c8fc300253fc1ff741ae74a6c24d/greenlet-3.2.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:706d016a03e78df129f68c4c9b4c4f963f7d73534e48a24f5f5a7101ed13dbbb", size = 605461 }, + { url = "https://files.pythonhosted.org/packages/98/82/d022cf25ca39cf1200650fc58c52af32c90f80479c25d1cbf57980ec3065/greenlet-3.2.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:419e60f80709510c343c57b4bb5a339d8767bf9aef9b8ce43f4f143240f88b7c", size = 1121190 }, + { url = "https://files.pythonhosted.org/packages/f5/e1/25297f70717abe8104c20ecf7af0a5b82d2f5a980eb1ac79f65654799f9f/greenlet-3.2.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:93d48533fade144203816783373f27a97e4193177ebaaf0fc396db19e5d61163", size = 1149055 }, + { url = "https://files.pythonhosted.org/packages/1f/8f/8f9e56c5e82eb2c26e8cde787962e66494312dc8cb261c460e1f3a9c88bc/greenlet-3.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:7454d37c740bb27bdeddfc3f358f26956a07d5220818ceb467a483197d84f849", size = 297817 }, + { url = "https://files.pythonhosted.org/packages/b1/cf/f5c0b23309070ae93de75c90d29300751a5aacefc0a3ed1b1d8edb28f08b/greenlet-3.2.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:500b8689aa9dd1ab26872a34084503aeddefcb438e2e7317b89b11eaea1901ad", size = 270732 }, + { url = "https://files.pythonhosted.org/packages/48/ae/91a957ba60482d3fecf9be49bc3948f341d706b52ddb9d83a70d42abd498/greenlet-3.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a07d3472c2a93117af3b0136f246b2833fdc0b542d4a9799ae5f41c28323faef", size = 639033 }, + { url = "https://files.pythonhosted.org/packages/6f/df/20ffa66dd5a7a7beffa6451bdb7400d66251374ab40b99981478c69a67a8/greenlet-3.2.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8704b3768d2f51150626962f4b9a9e4a17d2e37c8a8d9867bbd9fa4eb938d3b3", size = 652999 }, + { url = "https://files.pythonhosted.org/packages/51/b4/ebb2c8cb41e521f1d72bf0465f2f9a2fd803f674a88db228887e6847077e/greenlet-3.2.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5035d77a27b7c62db6cf41cf786cfe2242644a7a337a0e155c80960598baab95", size = 647368 }, + { url = "https://files.pythonhosted.org/packages/8e/6a/1e1b5aa10dced4ae876a322155705257748108b7fd2e4fae3f2a091fe81a/greenlet-3.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2d8aa5423cd4a396792f6d4580f88bdc6efcb9205891c9d40d20f6e670992efb", size = 650037 }, + { url = "https://files.pythonhosted.org/packages/26/f2/ad51331a157c7015c675702e2d5230c243695c788f8f75feba1af32b3617/greenlet-3.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c724620a101f8170065d7dded3f962a2aea7a7dae133a009cada42847e04a7b", size = 608402 }, + { url = "https://files.pythonhosted.org/packages/26/bc/862bd2083e6b3aff23300900a956f4ea9a4059de337f5c8734346b9b34fc/greenlet-3.2.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:873abe55f134c48e1f2a6f53f7d1419192a3d1a4e873bace00499a4e45ea6af0", size = 1119577 }, + { url = "https://files.pythonhosted.org/packages/86/94/1fc0cc068cfde885170e01de40a619b00eaa8f2916bf3541744730ffb4c3/greenlet-3.2.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:024571bbce5f2c1cfff08bf3fbaa43bbc7444f580ae13b0099e95d0e6e67ed36", size = 1147121 }, + { url = "https://files.pythonhosted.org/packages/27/1a/199f9587e8cb08a0658f9c30f3799244307614148ffe8b1e3aa22f324dea/greenlet-3.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5195fb1e75e592dd04ce79881c8a22becdfa3e6f500e7feb059b1e6fdd54d3e3", size = 297603 }, + { url = "https://files.pythonhosted.org/packages/d8/ca/accd7aa5280eb92b70ed9e8f7fd79dc50a2c21d8c73b9a0856f5b564e222/greenlet-3.2.3-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:3d04332dddb10b4a211b68111dabaee2e1a073663d117dc10247b5b1642bac86", size = 271479 }, + { url = "https://files.pythonhosted.org/packages/55/71/01ed9895d9eb49223280ecc98a557585edfa56b3d0e965b9fa9f7f06b6d9/greenlet-3.2.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8186162dffde068a465deab08fc72c767196895c39db26ab1c17c0b77a6d8b97", size = 683952 }, + { url = "https://files.pythonhosted.org/packages/ea/61/638c4bdf460c3c678a0a1ef4c200f347dff80719597e53b5edb2fb27ab54/greenlet-3.2.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f4bfbaa6096b1b7a200024784217defedf46a07c2eee1a498e94a1b5f8ec5728", size = 696917 }, + { url = "https://files.pythonhosted.org/packages/22/cc/0bd1a7eb759d1f3e3cc2d1bc0f0b487ad3cc9f34d74da4b80f226fde4ec3/greenlet-3.2.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ed6cfa9200484d234d8394c70f5492f144b20d4533f69262d530a1a082f6ee9a", size = 692443 }, + { url = "https://files.pythonhosted.org/packages/67/10/b2a4b63d3f08362662e89c103f7fe28894a51ae0bc890fabf37d1d780e52/greenlet-3.2.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:02b0df6f63cd15012bed5401b47829cfd2e97052dc89da3cfaf2c779124eb892", size = 692995 }, + { url = "https://files.pythonhosted.org/packages/5a/c6/ad82f148a4e3ce9564056453a71529732baf5448ad53fc323e37efe34f66/greenlet-3.2.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86c2d68e87107c1792e2e8d5399acec2487a4e993ab76c792408e59394d52141", size = 655320 }, + { url = "https://files.pythonhosted.org/packages/5c/4f/aab73ecaa6b3086a4c89863d94cf26fa84cbff63f52ce9bc4342b3087a06/greenlet-3.2.3-cp314-cp314-win_amd64.whl", hash = "sha256:8c47aae8fbbfcf82cc13327ae802ba13c9c36753b67e760023fd116bc124a62a", size = 301236 }, + { url = "https://files.pythonhosted.org/packages/3d/d9/a3114df5fba2bf9823e0acc01e9e2abdcd8ea4c5487cf1c3dcd4cc0b48cf/greenlet-3.2.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:42efc522c0bd75ffa11a71e09cd8a399d83fafe36db250a87cf1dacfaa15dc64", size = 267769 }, + { url = "https://files.pythonhosted.org/packages/bc/da/47dfc50f6e5673116e66a737dc58d1eca651db9a9aa8797c1d27e940e211/greenlet-3.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d760f9bdfe79bff803bad32b4d8ffb2c1d2ce906313fc10a83976ffb73d64ca7", size = 625472 }, + { url = "https://files.pythonhosted.org/packages/f5/74/f6ef9f85d981b2fcd665bbee3e69e3c0a10fb962eb4c6a5889ac3b6debfa/greenlet-3.2.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8324319cbd7b35b97990090808fdc99c27fe5338f87db50514959f8059999805", size = 637253 }, + { url = "https://files.pythonhosted.org/packages/66/69/4919bb1c9e43bfc16dc886e7a37fe1bc04bfa4101aba177936a10f313cad/greenlet-3.2.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:8c37ef5b3787567d322331d5250e44e42b58c8c713859b8a04c6065f27efbf72", size = 632611 }, + { url = "https://files.pythonhosted.org/packages/6b/8d/97d988d019f40b6b360b0c71c99e5b4c877a3d92666fe48b081d0e1ea1cd/greenlet-3.2.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ce539fb52fb774d0802175d37fcff5c723e2c7d249c65916257f0a940cee8904", size = 631843 }, + { url = "https://files.pythonhosted.org/packages/59/24/d5e1504ec00768755d4ccc2168b76d9f4524e96694a14ad45bd87796e9bb/greenlet-3.2.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:003c930e0e074db83559edc8705f3a2d066d4aa8c2f198aff1e454946efd0f26", size = 580781 }, + { url = "https://files.pythonhosted.org/packages/9c/df/d009bcca566dbfd2283b306b4e424f4c0e59bf984868f8b789802fe9e607/greenlet-3.2.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7e70ea4384b81ef9e84192e8a77fb87573138aa5d4feee541d8014e452b434da", size = 1109903 }, + { url = "https://files.pythonhosted.org/packages/33/54/5036097197a78388aa6901a5b90b562f3a154a9fbee89c301a26f56f3942/greenlet-3.2.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:22eb5ba839c4b2156f18f76768233fe44b23a31decd9cc0d4cc8141c211fd1b4", size = 1133975 }, + { url = "https://files.pythonhosted.org/packages/e2/15/b001456a430805fdd8b600a788d19a790664eee8863739523395f68df752/greenlet-3.2.3-cp39-cp39-win32.whl", hash = "sha256:4532f0d25df67f896d137431b13f4cdce89f7e3d4a96387a41290910df4d3a57", size = 279320 }, + { url = "https://files.pythonhosted.org/packages/6c/4c/bf2100cbc1bd07f39bee3b09e7eef39beffe29f5453dc2477a2693737913/greenlet-3.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:aaa7aae1e7f75eaa3ae400ad98f8644bb81e1dc6ba47ce8a93d3f17274e08322", size = 296444 }, ] [[package]] name = "idna" version = "3.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, ] [[package]] name = "imagesize" version = "1.4.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026, upload-time = "2022-07-01T12:21:05.687Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload-time = "2022-07-01T12:21:02.467Z" }, + { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769 }, ] [[package]] @@ -1006,9 +1005,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "zipp" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } +sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641 } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656 }, ] [[package]] @@ -1018,18 +1017,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "zipp", marker = "python_full_version < '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/8c/f834fbf984f691b4f7ff60f50b514cc3de5cc08abfc3295564dd89c5e2e7/importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c", size = 44693, upload-time = "2025-01-03T18:51:56.698Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/8c/f834fbf984f691b4f7ff60f50b514cc3de5cc08abfc3295564dd89c5e2e7/importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c", size = 44693 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec", size = 37461, upload-time = "2025-01-03T18:51:54.306Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec", size = 37461 }, ] [[package]] name = "iniconfig" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 }, ] [[package]] @@ -1053,9 +1052,9 @@ dependencies = [ { name = "tornado" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/27/9e6e30ed92f2ac53d29f70b09da8b2dc456e256148e289678fa0e825f46a/ipykernel-6.30.0.tar.gz", hash = "sha256:b7b808ddb2d261aae2df3a26ff3ff810046e6de3dfbc6f7de8c98ea0a6cb632c", size = 165125, upload-time = "2025-07-21T10:36:09.259Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/27/9e6e30ed92f2ac53d29f70b09da8b2dc456e256148e289678fa0e825f46a/ipykernel-6.30.0.tar.gz", hash = "sha256:b7b808ddb2d261aae2df3a26ff3ff810046e6de3dfbc6f7de8c98ea0a6cb632c", size = 165125 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/3d/00813c3d9b46e3dcd88bd4530e0a3c63c0509e5d8c9eff34723ea243ab04/ipykernel-6.30.0-py3-none-any.whl", hash = "sha256:fd2936e55c4a1c2ee8b1e5fa6a372b8eecc0ab1338750dee76f48fa5cca1301e", size = 117264, upload-time = "2025-07-21T10:36:06.854Z" }, + { url = "https://files.pythonhosted.org/packages/1f/3d/00813c3d9b46e3dcd88bd4530e0a3c63c0509e5d8c9eff34723ea243ab04/ipykernel-6.30.0-py3-none-any.whl", hash = "sha256:fd2936e55c4a1c2ee8b1e5fa6a372b8eecc0ab1338750dee76f48fa5cca1301e", size = 117264 }, ] [[package]] @@ -1079,9 +1078,9 @@ dependencies = [ { name = "traitlets", marker = "python_full_version < '3.10'" }, { name = "typing-extensions", marker = "python_full_version < '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/b9/3ba6c45a6df813c09a48bac313c22ff83efa26cbb55011218d925a46e2ad/ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27", size = 5486330, upload-time = "2023-11-27T09:58:34.596Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/b9/3ba6c45a6df813c09a48bac313c22ff83efa26cbb55011218d925a46e2ad/ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27", size = 5486330 } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/6b/d9fdcdef2eb6a23f391251fde8781c38d42acd82abe84d054cb74f7863b0/ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397", size = 808161, upload-time = "2023-11-27T09:58:30.538Z" }, + { url = "https://files.pythonhosted.org/packages/47/6b/d9fdcdef2eb6a23f391251fde8781c38d42acd82abe84d054cb74f7863b0/ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397", size = 808161 }, ] [[package]] @@ -1104,9 +1103,9 @@ dependencies = [ { name = "traitlets", marker = "python_full_version == '3.10.*'" }, { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/85/31/10ac88f3357fc276dc8a64e8880c82e80e7459326ae1d0a211b40abf6665/ipython-8.37.0.tar.gz", hash = "sha256:ca815841e1a41a1e6b73a0b08f3038af9b2252564d01fc405356d34033012216", size = 5606088, upload-time = "2025-05-31T16:39:09.613Z" } +sdist = { url = "https://files.pythonhosted.org/packages/85/31/10ac88f3357fc276dc8a64e8880c82e80e7459326ae1d0a211b40abf6665/ipython-8.37.0.tar.gz", hash = "sha256:ca815841e1a41a1e6b73a0b08f3038af9b2252564d01fc405356d34033012216", size = 5606088 } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/d0/274fbf7b0b12643cbbc001ce13e6a5b1607ac4929d1b11c72460152c9fc3/ipython-8.37.0-py3-none-any.whl", hash = "sha256:ed87326596b878932dbcb171e3e698845434d8c61b8d8cd474bf663041a9dcf2", size = 831864, upload-time = "2025-05-31T16:39:06.38Z" }, + { url = "https://files.pythonhosted.org/packages/91/d0/274fbf7b0b12643cbbc001ce13e6a5b1607ac4929d1b11c72460152c9fc3/ipython-8.37.0-py3-none-any.whl", hash = "sha256:ed87326596b878932dbcb171e3e698845434d8c61b8d8cd474bf663041a9dcf2", size = 831864 }, ] [[package]] @@ -1131,9 +1130,9 @@ dependencies = [ { name = "traitlets", marker = "python_full_version >= '3.11'" }, { name = "typing-extensions", marker = "python_full_version == '3.11.*'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/54/80/406f9e3bde1c1fd9bf5a0be9d090f8ae623e401b7670d8f6fdf2ab679891/ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270", size = 4385338, upload-time = "2025-07-01T11:11:30.606Z" } +sdist = { url = "https://files.pythonhosted.org/packages/54/80/406f9e3bde1c1fd9bf5a0be9d090f8ae623e401b7670d8f6fdf2ab679891/ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270", size = 4385338 } wheels = [ - { url = "https://files.pythonhosted.org/packages/63/f8/0031ee2b906a15a33d6bfc12dd09c3dfa966b3cb5b284ecfb7549e6ac3c4/ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066", size = 611021, upload-time = "2025-07-01T11:11:27.85Z" }, + { url = "https://files.pythonhosted.org/packages/63/f8/0031ee2b906a15a33d6bfc12dd09c3dfa966b3cb5b284ecfb7549e6ac3c4/ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066", size = 611021 }, ] [[package]] @@ -1143,9 +1142,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pygments", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074 }, ] [[package]] @@ -1161,9 +1160,9 @@ dependencies = [ { name = "traitlets" }, { name = "widgetsnbextension" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3e/48/d3dbac45c2814cb73812f98dd6b38bbcc957a4e7bb31d6ea9c03bf94ed87/ipywidgets-8.1.7.tar.gz", hash = "sha256:15f1ac050b9ccbefd45dccfbb2ef6bed0029d8278682d569d71b8dd96bee0376", size = 116721, upload-time = "2025-05-05T12:42:03.489Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/48/d3dbac45c2814cb73812f98dd6b38bbcc957a4e7bb31d6ea9c03bf94ed87/ipywidgets-8.1.7.tar.gz", hash = "sha256:15f1ac050b9ccbefd45dccfbb2ef6bed0029d8278682d569d71b8dd96bee0376", size = 116721 } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/6a/9166369a2f092bd286d24e6307de555d63616e8ddb373ebad2b5635ca4cd/ipywidgets-8.1.7-py3-none-any.whl", hash = "sha256:764f2602d25471c213919b8a1997df04bef869251db4ca8efba1b76b1bd9f7bb", size = 139806, upload-time = "2025-05-05T12:41:56.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/6a/9166369a2f092bd286d24e6307de555d63616e8ddb373ebad2b5635ca4cd/ipywidgets-8.1.7-py3-none-any.whl", hash = "sha256:764f2602d25471c213919b8a1997df04bef869251db4ca8efba1b76b1bd9f7bb", size = 139806 }, ] [[package]] @@ -1173,9 +1172,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "parso" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, ] [[package]] @@ -1185,9 +1184,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, ] [[package]] @@ -1200,9 +1199,9 @@ dependencies = [ { name = "referencing" }, { name = "rpds-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d5/00/a297a868e9d0784450faa7365c2172a7d6110c763e30ba861867c32ae6a9/jsonschema-4.25.0.tar.gz", hash = "sha256:e63acf5c11762c0e6672ffb61482bdf57f0876684d8d249c0fe2d730d48bc55f", size = 356830, upload-time = "2025-07-18T15:39:45.11Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/00/a297a868e9d0784450faa7365c2172a7d6110c763e30ba861867c32ae6a9/jsonschema-4.25.0.tar.gz", hash = "sha256:e63acf5c11762c0e6672ffb61482bdf57f0876684d8d249c0fe2d730d48bc55f", size = 356830 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/54/c86cd8e011fe98803d7e382fd67c0df5ceab8d2b7ad8c5a81524f791551c/jsonschema-4.25.0-py3-none-any.whl", hash = "sha256:24c2e8da302de79c8b9382fee3e76b355e44d2a4364bb207159ce10b517bd716", size = 89184, upload-time = "2025-07-18T15:39:42.956Z" }, + { url = "https://files.pythonhosted.org/packages/fe/54/c86cd8e011fe98803d7e382fd67c0df5ceab8d2b7ad8c5a81524f791551c/jsonschema-4.25.0-py3-none-any.whl", hash = "sha256:24c2e8da302de79c8b9382fee3e76b355e44d2a4364bb207159ce10b517bd716", size = 89184 }, ] [[package]] @@ -1212,9 +1211,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "referencing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513, upload-time = "2025-04-23T12:34:07.418Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513 } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload-time = "2025-04-23T12:34:05.422Z" }, + { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437 }, ] [[package]] @@ -1232,9 +1231,9 @@ dependencies = [ { name = "sqlalchemy" }, { name = "tabulate" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/f7/3627358075f183956e8c4974603232b03afd4ddc7baf72c2bc9fff522291/jupyter_cache-1.0.1.tar.gz", hash = "sha256:16e808eb19e3fb67a223db906e131ea6e01f03aa27f49a7214ce6a5fec186fb9", size = 32048, upload-time = "2024-11-15T16:03:55.322Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/f7/3627358075f183956e8c4974603232b03afd4ddc7baf72c2bc9fff522291/jupyter_cache-1.0.1.tar.gz", hash = "sha256:16e808eb19e3fb67a223db906e131ea6e01f03aa27f49a7214ce6a5fec186fb9", size = 32048 } wheels = [ - { url = "https://files.pythonhosted.org/packages/64/6b/67b87da9d36bff9df7d0efbd1a325fa372a43be7158effaf43ed7b22341d/jupyter_cache-1.0.1-py3-none-any.whl", hash = "sha256:9c3cafd825ba7da8b5830485343091143dff903e4d8c69db9349b728b140abf6", size = 33907, upload-time = "2024-11-15T16:03:54.021Z" }, + { url = "https://files.pythonhosted.org/packages/64/6b/67b87da9d36bff9df7d0efbd1a325fa372a43be7158effaf43ed7b22341d/jupyter_cache-1.0.1-py3-none-any.whl", hash = "sha256:9c3cafd825ba7da8b5830485343091143dff903e4d8c69db9349b728b140abf6", size = 33907 }, ] [[package]] @@ -1249,9 +1248,9 @@ dependencies = [ { name = "tornado" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019, upload-time = "2024-09-17T10:44:17.613Z" } +sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019 } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105, upload-time = "2024-09-17T10:44:15.218Z" }, + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 }, ] [[package]] @@ -1263,18 +1262,18 @@ dependencies = [ { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923, upload-time = "2025-05-27T07:38:16.655Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880, upload-time = "2025-05-27T07:38:15.137Z" }, + { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880 }, ] [[package]] name = "jupyterlab-widgets" version = "3.0.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b9/7d/160595ca88ee87ac6ba95d82177d29ec60aaa63821d3077babb22ce031a5/jupyterlab_widgets-3.0.15.tar.gz", hash = "sha256:2920888a0c2922351a9202817957a68c07d99673504d6cd37345299e971bb08b", size = 213149, upload-time = "2025-05-05T12:32:31.004Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/7d/160595ca88ee87ac6ba95d82177d29ec60aaa63821d3077babb22ce031a5/jupyterlab_widgets-3.0.15.tar.gz", hash = "sha256:2920888a0c2922351a9202817957a68c07d99673504d6cd37345299e971bb08b", size = 213149 } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/6a/ca128561b22b60bd5a0c4ea26649e68c8556b82bc70a0c396eebc977fe86/jupyterlab_widgets-3.0.15-py3-none-any.whl", hash = "sha256:d59023d7d7ef71400d51e6fee9a88867f6e65e10a4201605d2d7f3e8f012a31c", size = 216571, upload-time = "2025-05-05T12:32:29.534Z" }, + { url = "https://files.pythonhosted.org/packages/43/6a/ca128561b22b60bd5a0c4ea26649e68c8556b82bc70a0c396eebc977fe86/jupyterlab_widgets-3.0.15-py3-none-any.whl", hash = "sha256:d59023d7d7ef71400d51e6fee9a88867f6e65e10a4201605d2d7f3e8f012a31c", size = 216571 }, ] [[package]] @@ -1285,100 +1284,100 @@ resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] -sdist = { url = "https://files.pythonhosted.org/packages/85/4d/2255e1c76304cbd60b48cee302b66d1dde4468dc5b1160e4b7cb43778f2a/kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60", size = 97286, upload-time = "2024-09-04T09:39:44.302Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/97/14/fc943dd65268a96347472b4fbe5dcc2f6f55034516f80576cd0dd3a8930f/kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6", size = 122440, upload-time = "2024-09-04T09:03:44.9Z" }, - { url = "https://files.pythonhosted.org/packages/1e/46/e68fed66236b69dd02fcdb506218c05ac0e39745d696d22709498896875d/kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17", size = 65758, upload-time = "2024-09-04T09:03:46.582Z" }, - { url = "https://files.pythonhosted.org/packages/ef/fa/65de49c85838681fc9cb05de2a68067a683717321e01ddafb5b8024286f0/kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9", size = 64311, upload-time = "2024-09-04T09:03:47.973Z" }, - { url = "https://files.pythonhosted.org/packages/42/9c/cc8d90f6ef550f65443bad5872ffa68f3dee36de4974768628bea7c14979/kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9", size = 1637109, upload-time = "2024-09-04T09:03:49.281Z" }, - { url = "https://files.pythonhosted.org/packages/55/91/0a57ce324caf2ff5403edab71c508dd8f648094b18cfbb4c8cc0fde4a6ac/kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c", size = 1617814, upload-time = "2024-09-04T09:03:51.444Z" }, - { url = "https://files.pythonhosted.org/packages/12/5d/c36140313f2510e20207708adf36ae4919416d697ee0236b0ddfb6fd1050/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599", size = 1400881, upload-time = "2024-09-04T09:03:53.357Z" }, - { url = "https://files.pythonhosted.org/packages/56/d0/786e524f9ed648324a466ca8df86298780ef2b29c25313d9a4f16992d3cf/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05", size = 1512972, upload-time = "2024-09-04T09:03:55.082Z" }, - { url = "https://files.pythonhosted.org/packages/67/5a/77851f2f201e6141d63c10a0708e996a1363efaf9e1609ad0441b343763b/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407", size = 1444787, upload-time = "2024-09-04T09:03:56.588Z" }, - { url = "https://files.pythonhosted.org/packages/06/5f/1f5eaab84355885e224a6fc8d73089e8713dc7e91c121f00b9a1c58a2195/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278", size = 2199212, upload-time = "2024-09-04T09:03:58.557Z" }, - { url = "https://files.pythonhosted.org/packages/b5/28/9152a3bfe976a0ae21d445415defc9d1cd8614b2910b7614b30b27a47270/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5", size = 2346399, upload-time = "2024-09-04T09:04:00.178Z" }, - { url = "https://files.pythonhosted.org/packages/26/f6/453d1904c52ac3b400f4d5e240ac5fec25263716723e44be65f4d7149d13/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad", size = 2308688, upload-time = "2024-09-04T09:04:02.216Z" }, - { url = "https://files.pythonhosted.org/packages/5a/9a/d4968499441b9ae187e81745e3277a8b4d7c60840a52dc9d535a7909fac3/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895", size = 2445493, upload-time = "2024-09-04T09:04:04.571Z" }, - { url = "https://files.pythonhosted.org/packages/07/c9/032267192e7828520dacb64dfdb1d74f292765f179e467c1cba97687f17d/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3", size = 2262191, upload-time = "2024-09-04T09:04:05.969Z" }, - { url = "https://files.pythonhosted.org/packages/6c/ad/db0aedb638a58b2951da46ddaeecf204be8b4f5454df020d850c7fa8dca8/kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc", size = 46644, upload-time = "2024-09-04T09:04:07.408Z" }, - { url = "https://files.pythonhosted.org/packages/12/ca/d0f7b7ffbb0be1e7c2258b53554efec1fd652921f10d7d85045aff93ab61/kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c", size = 55877, upload-time = "2024-09-04T09:04:08.869Z" }, - { url = "https://files.pythonhosted.org/packages/97/6c/cfcc128672f47a3e3c0d918ecb67830600078b025bfc32d858f2e2d5c6a4/kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a", size = 48347, upload-time = "2024-09-04T09:04:10.106Z" }, - { url = "https://files.pythonhosted.org/packages/e9/44/77429fa0a58f941d6e1c58da9efe08597d2e86bf2b2cce6626834f49d07b/kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54", size = 122442, upload-time = "2024-09-04T09:04:11.432Z" }, - { url = "https://files.pythonhosted.org/packages/e5/20/8c75caed8f2462d63c7fd65e16c832b8f76cda331ac9e615e914ee80bac9/kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95", size = 65762, upload-time = "2024-09-04T09:04:12.468Z" }, - { url = "https://files.pythonhosted.org/packages/f4/98/fe010f15dc7230f45bc4cf367b012d651367fd203caaa992fd1f5963560e/kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935", size = 64319, upload-time = "2024-09-04T09:04:13.635Z" }, - { url = "https://files.pythonhosted.org/packages/8b/1b/b5d618f4e58c0675654c1e5051bcf42c776703edb21c02b8c74135541f60/kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb", size = 1334260, upload-time = "2024-09-04T09:04:14.878Z" }, - { url = "https://files.pythonhosted.org/packages/b8/01/946852b13057a162a8c32c4c8d2e9ed79f0bb5d86569a40c0b5fb103e373/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02", size = 1426589, upload-time = "2024-09-04T09:04:16.514Z" }, - { url = "https://files.pythonhosted.org/packages/70/d1/c9f96df26b459e15cf8a965304e6e6f4eb291e0f7a9460b4ad97b047561e/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51", size = 1541080, upload-time = "2024-09-04T09:04:18.322Z" }, - { url = "https://files.pythonhosted.org/packages/d3/73/2686990eb8b02d05f3de759d6a23a4ee7d491e659007dd4c075fede4b5d0/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052", size = 1470049, upload-time = "2024-09-04T09:04:20.266Z" }, - { url = "https://files.pythonhosted.org/packages/a7/4b/2db7af3ed3af7c35f388d5f53c28e155cd402a55432d800c543dc6deb731/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18", size = 1426376, upload-time = "2024-09-04T09:04:22.419Z" }, - { url = "https://files.pythonhosted.org/packages/05/83/2857317d04ea46dc5d115f0df7e676997bbd968ced8e2bd6f7f19cfc8d7f/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545", size = 2222231, upload-time = "2024-09-04T09:04:24.526Z" }, - { url = "https://files.pythonhosted.org/packages/0d/b5/866f86f5897cd4ab6d25d22e403404766a123f138bd6a02ecb2cdde52c18/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b", size = 2368634, upload-time = "2024-09-04T09:04:25.899Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ee/73de8385403faba55f782a41260210528fe3273d0cddcf6d51648202d6d0/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36", size = 2329024, upload-time = "2024-09-04T09:04:28.523Z" }, - { url = "https://files.pythonhosted.org/packages/a1/e7/cd101d8cd2cdfaa42dc06c433df17c8303d31129c9fdd16c0ea37672af91/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3", size = 2468484, upload-time = "2024-09-04T09:04:30.547Z" }, - { url = "https://files.pythonhosted.org/packages/e1/72/84f09d45a10bc57a40bb58b81b99d8f22b58b2040c912b7eb97ebf625bf2/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523", size = 2284078, upload-time = "2024-09-04T09:04:33.218Z" }, - { url = "https://files.pythonhosted.org/packages/d2/d4/71828f32b956612dc36efd7be1788980cb1e66bfb3706e6dec9acad9b4f9/kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d", size = 46645, upload-time = "2024-09-04T09:04:34.371Z" }, - { url = "https://files.pythonhosted.org/packages/a1/65/d43e9a20aabcf2e798ad1aff6c143ae3a42cf506754bcb6a7ed8259c8425/kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b", size = 56022, upload-time = "2024-09-04T09:04:35.786Z" }, - { url = "https://files.pythonhosted.org/packages/35/b3/9f75a2e06f1b4ca00b2b192bc2b739334127d27f1d0625627ff8479302ba/kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376", size = 48536, upload-time = "2024-09-04T09:04:37.525Z" }, - { url = "https://files.pythonhosted.org/packages/97/9c/0a11c714cf8b6ef91001c8212c4ef207f772dd84540104952c45c1f0a249/kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2", size = 121808, upload-time = "2024-09-04T09:04:38.637Z" }, - { url = "https://files.pythonhosted.org/packages/f2/d8/0fe8c5f5d35878ddd135f44f2af0e4e1d379e1c7b0716f97cdcb88d4fd27/kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a", size = 65531, upload-time = "2024-09-04T09:04:39.694Z" }, - { url = "https://files.pythonhosted.org/packages/80/c5/57fa58276dfdfa612241d640a64ca2f76adc6ffcebdbd135b4ef60095098/kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee", size = 63894, upload-time = "2024-09-04T09:04:41.6Z" }, - { url = "https://files.pythonhosted.org/packages/8b/e9/26d3edd4c4ad1c5b891d8747a4f81b1b0aba9fb9721de6600a4adc09773b/kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640", size = 1369296, upload-time = "2024-09-04T09:04:42.886Z" }, - { url = "https://files.pythonhosted.org/packages/b6/67/3f4850b5e6cffb75ec40577ddf54f7b82b15269cc5097ff2e968ee32ea7d/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f", size = 1461450, upload-time = "2024-09-04T09:04:46.284Z" }, - { url = "https://files.pythonhosted.org/packages/52/be/86cbb9c9a315e98a8dc6b1d23c43cffd91d97d49318854f9c37b0e41cd68/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483", size = 1579168, upload-time = "2024-09-04T09:04:47.91Z" }, - { url = "https://files.pythonhosted.org/packages/0f/00/65061acf64bd5fd34c1f4ae53f20b43b0a017a541f242a60b135b9d1e301/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258", size = 1507308, upload-time = "2024-09-04T09:04:49.465Z" }, - { url = "https://files.pythonhosted.org/packages/21/e4/c0b6746fd2eb62fe702118b3ca0cb384ce95e1261cfada58ff693aeec08a/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e", size = 1464186, upload-time = "2024-09-04T09:04:50.949Z" }, - { url = "https://files.pythonhosted.org/packages/0a/0f/529d0a9fffb4d514f2782c829b0b4b371f7f441d61aa55f1de1c614c4ef3/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107", size = 2247877, upload-time = "2024-09-04T09:04:52.388Z" }, - { url = "https://files.pythonhosted.org/packages/d1/e1/66603ad779258843036d45adcbe1af0d1a889a07af4635f8b4ec7dccda35/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948", size = 2404204, upload-time = "2024-09-04T09:04:54.385Z" }, - { url = "https://files.pythonhosted.org/packages/8d/61/de5fb1ca7ad1f9ab7970e340a5b833d735df24689047de6ae71ab9d8d0e7/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038", size = 2352461, upload-time = "2024-09-04T09:04:56.307Z" }, - { url = "https://files.pythonhosted.org/packages/ba/d2/0edc00a852e369827f7e05fd008275f550353f1f9bcd55db9363d779fc63/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383", size = 2501358, upload-time = "2024-09-04T09:04:57.922Z" }, - { url = "https://files.pythonhosted.org/packages/84/15/adc15a483506aec6986c01fb7f237c3aec4d9ed4ac10b756e98a76835933/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520", size = 2314119, upload-time = "2024-09-04T09:04:59.332Z" }, - { url = "https://files.pythonhosted.org/packages/36/08/3a5bb2c53c89660863a5aa1ee236912269f2af8762af04a2e11df851d7b2/kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b", size = 46367, upload-time = "2024-09-04T09:05:00.804Z" }, - { url = "https://files.pythonhosted.org/packages/19/93/c05f0a6d825c643779fc3c70876bff1ac221f0e31e6f701f0e9578690d70/kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb", size = 55884, upload-time = "2024-09-04T09:05:01.924Z" }, - { url = "https://files.pythonhosted.org/packages/d2/f9/3828d8f21b6de4279f0667fb50a9f5215e6fe57d5ec0d61905914f5b6099/kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a", size = 48528, upload-time = "2024-09-04T09:05:02.983Z" }, - { url = "https://files.pythonhosted.org/packages/c4/06/7da99b04259b0f18b557a4effd1b9c901a747f7fdd84cf834ccf520cb0b2/kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e", size = 121913, upload-time = "2024-09-04T09:05:04.072Z" }, - { url = "https://files.pythonhosted.org/packages/97/f5/b8a370d1aa593c17882af0a6f6755aaecd643640c0ed72dcfd2eafc388b9/kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6", size = 65627, upload-time = "2024-09-04T09:05:05.119Z" }, - { url = "https://files.pythonhosted.org/packages/2a/fc/6c0374f7503522539e2d4d1b497f5ebad3f8ed07ab51aed2af988dd0fb65/kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750", size = 63888, upload-time = "2024-09-04T09:05:06.191Z" }, - { url = "https://files.pythonhosted.org/packages/bf/3e/0b7172793d0f41cae5c923492da89a2ffcd1adf764c16159ca047463ebd3/kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d", size = 1369145, upload-time = "2024-09-04T09:05:07.919Z" }, - { url = "https://files.pythonhosted.org/packages/77/92/47d050d6f6aced2d634258123f2688fbfef8ded3c5baf2c79d94d91f1f58/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379", size = 1461448, upload-time = "2024-09-04T09:05:10.01Z" }, - { url = "https://files.pythonhosted.org/packages/9c/1b/8f80b18e20b3b294546a1adb41701e79ae21915f4175f311a90d042301cf/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c", size = 1578750, upload-time = "2024-09-04T09:05:11.598Z" }, - { url = "https://files.pythonhosted.org/packages/a4/fe/fe8e72f3be0a844f257cadd72689c0848c6d5c51bc1d60429e2d14ad776e/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34", size = 1507175, upload-time = "2024-09-04T09:05:13.22Z" }, - { url = "https://files.pythonhosted.org/packages/39/fa/cdc0b6105d90eadc3bee525fecc9179e2b41e1ce0293caaf49cb631a6aaf/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1", size = 1463963, upload-time = "2024-09-04T09:05:15.925Z" }, - { url = "https://files.pythonhosted.org/packages/6e/5c/0c03c4e542720c6177d4f408e56d1c8315899db72d46261a4e15b8b33a41/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f", size = 2248220, upload-time = "2024-09-04T09:05:17.434Z" }, - { url = "https://files.pythonhosted.org/packages/3d/ee/55ef86d5a574f4e767df7da3a3a7ff4954c996e12d4fbe9c408170cd7dcc/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b", size = 2404463, upload-time = "2024-09-04T09:05:18.997Z" }, - { url = "https://files.pythonhosted.org/packages/0f/6d/73ad36170b4bff4825dc588acf4f3e6319cb97cd1fb3eb04d9faa6b6f212/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27", size = 2352842, upload-time = "2024-09-04T09:05:21.299Z" }, - { url = "https://files.pythonhosted.org/packages/0b/16/fa531ff9199d3b6473bb4d0f47416cdb08d556c03b8bc1cccf04e756b56d/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a", size = 2501635, upload-time = "2024-09-04T09:05:23.588Z" }, - { url = "https://files.pythonhosted.org/packages/78/7e/aa9422e78419db0cbe75fb86d8e72b433818f2e62e2e394992d23d23a583/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee", size = 2314556, upload-time = "2024-09-04T09:05:25.907Z" }, - { url = "https://files.pythonhosted.org/packages/a8/b2/15f7f556df0a6e5b3772a1e076a9d9f6c538ce5f05bd590eca8106508e06/kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07", size = 46364, upload-time = "2024-09-04T09:05:27.184Z" }, - { url = "https://files.pythonhosted.org/packages/0b/db/32e897e43a330eee8e4770bfd2737a9584b23e33587a0812b8e20aac38f7/kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76", size = 55887, upload-time = "2024-09-04T09:05:28.372Z" }, - { url = "https://files.pythonhosted.org/packages/c8/a4/df2bdca5270ca85fd25253049eb6708d4127be2ed0e5c2650217450b59e9/kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650", size = 48530, upload-time = "2024-09-04T09:05:30.225Z" }, - { url = "https://files.pythonhosted.org/packages/11/88/37ea0ea64512997b13d69772db8dcdc3bfca5442cda3a5e4bb943652ee3e/kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd", size = 122449, upload-time = "2024-09-04T09:05:55.311Z" }, - { url = "https://files.pythonhosted.org/packages/4e/45/5a5c46078362cb3882dcacad687c503089263c017ca1241e0483857791eb/kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583", size = 65757, upload-time = "2024-09-04T09:05:56.906Z" }, - { url = "https://files.pythonhosted.org/packages/8a/be/a6ae58978772f685d48dd2e84460937761c53c4bbd84e42b0336473d9775/kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417", size = 64312, upload-time = "2024-09-04T09:05:58.384Z" }, - { url = "https://files.pythonhosted.org/packages/f4/04/18ef6f452d311e1e1eb180c9bf5589187fa1f042db877e6fe443ef10099c/kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904", size = 1626966, upload-time = "2024-09-04T09:05:59.855Z" }, - { url = "https://files.pythonhosted.org/packages/21/b1/40655f6c3fa11ce740e8a964fa8e4c0479c87d6a7944b95af799c7a55dfe/kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a", size = 1607044, upload-time = "2024-09-04T09:06:02.16Z" }, - { url = "https://files.pythonhosted.org/packages/fd/93/af67dbcfb9b3323bbd2c2db1385a7139d8f77630e4a37bb945b57188eb2d/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8", size = 1391879, upload-time = "2024-09-04T09:06:03.908Z" }, - { url = "https://files.pythonhosted.org/packages/40/6f/d60770ef98e77b365d96061d090c0cd9e23418121c55fff188fa4bdf0b54/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2", size = 1504751, upload-time = "2024-09-04T09:06:05.58Z" }, - { url = "https://files.pythonhosted.org/packages/fa/3a/5f38667d313e983c432f3fcd86932177519ed8790c724e07d77d1de0188a/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88", size = 1436990, upload-time = "2024-09-04T09:06:08.126Z" }, - { url = "https://files.pythonhosted.org/packages/cb/3b/1520301a47326e6a6043b502647e42892be33b3f051e9791cc8bb43f1a32/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde", size = 2191122, upload-time = "2024-09-04T09:06:10.345Z" }, - { url = "https://files.pythonhosted.org/packages/cf/c4/eb52da300c166239a2233f1f9c4a1b767dfab98fae27681bfb7ea4873cb6/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c", size = 2338126, upload-time = "2024-09-04T09:06:12.321Z" }, - { url = "https://files.pythonhosted.org/packages/1a/cb/42b92fd5eadd708dd9107c089e817945500685f3437ce1fd387efebc6d6e/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2", size = 2298313, upload-time = "2024-09-04T09:06:14.562Z" }, - { url = "https://files.pythonhosted.org/packages/4f/eb/be25aa791fe5fc75a8b1e0c965e00f942496bc04635c9aae8035f6b76dcd/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb", size = 2437784, upload-time = "2024-09-04T09:06:16.767Z" }, - { url = "https://files.pythonhosted.org/packages/c5/22/30a66be7f3368d76ff95689e1c2e28d382383952964ab15330a15d8bfd03/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327", size = 2253988, upload-time = "2024-09-04T09:06:18.705Z" }, - { url = "https://files.pythonhosted.org/packages/35/d3/5f2ecb94b5211c8a04f218a76133cc8d6d153b0f9cd0b45fad79907f0689/kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644", size = 46980, upload-time = "2024-09-04T09:06:20.106Z" }, - { url = "https://files.pythonhosted.org/packages/ef/17/cd10d020578764ea91740204edc6b3236ed8106228a46f568d716b11feb2/kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4", size = 55847, upload-time = "2024-09-04T09:06:21.407Z" }, - { url = "https://files.pythonhosted.org/packages/91/84/32232502020bd78d1d12be7afde15811c64a95ed1f606c10456db4e4c3ac/kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f", size = 48494, upload-time = "2024-09-04T09:06:22.648Z" }, - { url = "https://files.pythonhosted.org/packages/ac/59/741b79775d67ab67ced9bb38552da688c0305c16e7ee24bba7a2be253fb7/kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643", size = 59491, upload-time = "2024-09-04T09:06:24.188Z" }, - { url = "https://files.pythonhosted.org/packages/58/cc/fb239294c29a5656e99e3527f7369b174dd9cc7c3ef2dea7cb3c54a8737b/kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706", size = 57648, upload-time = "2024-09-04T09:06:25.559Z" }, - { url = "https://files.pythonhosted.org/packages/3b/ef/2f009ac1f7aab9f81efb2d837301d255279d618d27b6015780115ac64bdd/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6", size = 84257, upload-time = "2024-09-04T09:06:27.038Z" }, - { url = "https://files.pythonhosted.org/packages/81/e1/c64f50987f85b68b1c52b464bb5bf73e71570c0f7782d626d1eb283ad620/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2", size = 80906, upload-time = "2024-09-04T09:06:28.48Z" }, - { url = "https://files.pythonhosted.org/packages/fd/71/1687c5c0a0be2cee39a5c9c389e546f9c6e215e46b691d00d9f646892083/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4", size = 79951, upload-time = "2024-09-04T09:06:29.966Z" }, - { url = "https://files.pythonhosted.org/packages/ea/8b/d7497df4a1cae9367adf21665dd1f896c2a7aeb8769ad77b662c5e2bcce7/kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a", size = 55715, upload-time = "2024-09-04T09:06:31.489Z" }, - { url = "https://files.pythonhosted.org/packages/d5/df/ce37d9b26f07ab90880923c94d12a6ff4d27447096b4c849bfc4339ccfdf/kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39", size = 58666, upload-time = "2024-09-04T09:06:43.756Z" }, - { url = "https://files.pythonhosted.org/packages/b0/d3/e4b04f43bc629ac8e186b77b2b1a251cdfa5b7610fa189dc0db622672ce6/kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e", size = 57088, upload-time = "2024-09-04T09:06:45.406Z" }, - { url = "https://files.pythonhosted.org/packages/30/1c/752df58e2d339e670a535514d2db4fe8c842ce459776b8080fbe08ebb98e/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608", size = 84321, upload-time = "2024-09-04T09:06:47.557Z" }, - { url = "https://files.pythonhosted.org/packages/f0/f8/fe6484e847bc6e238ec9f9828089fb2c0bb53f2f5f3a79351fde5b565e4f/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674", size = 80776, upload-time = "2024-09-04T09:06:49.235Z" }, - { url = "https://files.pythonhosted.org/packages/9b/57/d7163c0379f250ef763aba85330a19feefb5ce6cb541ade853aaba881524/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225", size = 79984, upload-time = "2024-09-04T09:06:51.336Z" }, - { url = "https://files.pythonhosted.org/packages/8c/95/4a103776c265d13b3d2cd24fb0494d4e04ea435a8ef97e1b2c026d43250b/kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0", size = 55811, upload-time = "2024-09-04T09:06:53.078Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/85/4d/2255e1c76304cbd60b48cee302b66d1dde4468dc5b1160e4b7cb43778f2a/kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60", size = 97286 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/14/fc943dd65268a96347472b4fbe5dcc2f6f55034516f80576cd0dd3a8930f/kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6", size = 122440 }, + { url = "https://files.pythonhosted.org/packages/1e/46/e68fed66236b69dd02fcdb506218c05ac0e39745d696d22709498896875d/kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17", size = 65758 }, + { url = "https://files.pythonhosted.org/packages/ef/fa/65de49c85838681fc9cb05de2a68067a683717321e01ddafb5b8024286f0/kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9", size = 64311 }, + { url = "https://files.pythonhosted.org/packages/42/9c/cc8d90f6ef550f65443bad5872ffa68f3dee36de4974768628bea7c14979/kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9", size = 1637109 }, + { url = "https://files.pythonhosted.org/packages/55/91/0a57ce324caf2ff5403edab71c508dd8f648094b18cfbb4c8cc0fde4a6ac/kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c", size = 1617814 }, + { url = "https://files.pythonhosted.org/packages/12/5d/c36140313f2510e20207708adf36ae4919416d697ee0236b0ddfb6fd1050/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599", size = 1400881 }, + { url = "https://files.pythonhosted.org/packages/56/d0/786e524f9ed648324a466ca8df86298780ef2b29c25313d9a4f16992d3cf/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05", size = 1512972 }, + { url = "https://files.pythonhosted.org/packages/67/5a/77851f2f201e6141d63c10a0708e996a1363efaf9e1609ad0441b343763b/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407", size = 1444787 }, + { url = "https://files.pythonhosted.org/packages/06/5f/1f5eaab84355885e224a6fc8d73089e8713dc7e91c121f00b9a1c58a2195/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278", size = 2199212 }, + { url = "https://files.pythonhosted.org/packages/b5/28/9152a3bfe976a0ae21d445415defc9d1cd8614b2910b7614b30b27a47270/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5", size = 2346399 }, + { url = "https://files.pythonhosted.org/packages/26/f6/453d1904c52ac3b400f4d5e240ac5fec25263716723e44be65f4d7149d13/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad", size = 2308688 }, + { url = "https://files.pythonhosted.org/packages/5a/9a/d4968499441b9ae187e81745e3277a8b4d7c60840a52dc9d535a7909fac3/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895", size = 2445493 }, + { url = "https://files.pythonhosted.org/packages/07/c9/032267192e7828520dacb64dfdb1d74f292765f179e467c1cba97687f17d/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3", size = 2262191 }, + { url = "https://files.pythonhosted.org/packages/6c/ad/db0aedb638a58b2951da46ddaeecf204be8b4f5454df020d850c7fa8dca8/kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc", size = 46644 }, + { url = "https://files.pythonhosted.org/packages/12/ca/d0f7b7ffbb0be1e7c2258b53554efec1fd652921f10d7d85045aff93ab61/kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c", size = 55877 }, + { url = "https://files.pythonhosted.org/packages/97/6c/cfcc128672f47a3e3c0d918ecb67830600078b025bfc32d858f2e2d5c6a4/kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a", size = 48347 }, + { url = "https://files.pythonhosted.org/packages/e9/44/77429fa0a58f941d6e1c58da9efe08597d2e86bf2b2cce6626834f49d07b/kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54", size = 122442 }, + { url = "https://files.pythonhosted.org/packages/e5/20/8c75caed8f2462d63c7fd65e16c832b8f76cda331ac9e615e914ee80bac9/kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95", size = 65762 }, + { url = "https://files.pythonhosted.org/packages/f4/98/fe010f15dc7230f45bc4cf367b012d651367fd203caaa992fd1f5963560e/kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935", size = 64319 }, + { url = "https://files.pythonhosted.org/packages/8b/1b/b5d618f4e58c0675654c1e5051bcf42c776703edb21c02b8c74135541f60/kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb", size = 1334260 }, + { url = "https://files.pythonhosted.org/packages/b8/01/946852b13057a162a8c32c4c8d2e9ed79f0bb5d86569a40c0b5fb103e373/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02", size = 1426589 }, + { url = "https://files.pythonhosted.org/packages/70/d1/c9f96df26b459e15cf8a965304e6e6f4eb291e0f7a9460b4ad97b047561e/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51", size = 1541080 }, + { url = "https://files.pythonhosted.org/packages/d3/73/2686990eb8b02d05f3de759d6a23a4ee7d491e659007dd4c075fede4b5d0/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052", size = 1470049 }, + { url = "https://files.pythonhosted.org/packages/a7/4b/2db7af3ed3af7c35f388d5f53c28e155cd402a55432d800c543dc6deb731/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18", size = 1426376 }, + { url = "https://files.pythonhosted.org/packages/05/83/2857317d04ea46dc5d115f0df7e676997bbd968ced8e2bd6f7f19cfc8d7f/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545", size = 2222231 }, + { url = "https://files.pythonhosted.org/packages/0d/b5/866f86f5897cd4ab6d25d22e403404766a123f138bd6a02ecb2cdde52c18/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b", size = 2368634 }, + { url = "https://files.pythonhosted.org/packages/c1/ee/73de8385403faba55f782a41260210528fe3273d0cddcf6d51648202d6d0/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36", size = 2329024 }, + { url = "https://files.pythonhosted.org/packages/a1/e7/cd101d8cd2cdfaa42dc06c433df17c8303d31129c9fdd16c0ea37672af91/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3", size = 2468484 }, + { url = "https://files.pythonhosted.org/packages/e1/72/84f09d45a10bc57a40bb58b81b99d8f22b58b2040c912b7eb97ebf625bf2/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523", size = 2284078 }, + { url = "https://files.pythonhosted.org/packages/d2/d4/71828f32b956612dc36efd7be1788980cb1e66bfb3706e6dec9acad9b4f9/kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d", size = 46645 }, + { url = "https://files.pythonhosted.org/packages/a1/65/d43e9a20aabcf2e798ad1aff6c143ae3a42cf506754bcb6a7ed8259c8425/kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b", size = 56022 }, + { url = "https://files.pythonhosted.org/packages/35/b3/9f75a2e06f1b4ca00b2b192bc2b739334127d27f1d0625627ff8479302ba/kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376", size = 48536 }, + { url = "https://files.pythonhosted.org/packages/97/9c/0a11c714cf8b6ef91001c8212c4ef207f772dd84540104952c45c1f0a249/kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2", size = 121808 }, + { url = "https://files.pythonhosted.org/packages/f2/d8/0fe8c5f5d35878ddd135f44f2af0e4e1d379e1c7b0716f97cdcb88d4fd27/kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a", size = 65531 }, + { url = "https://files.pythonhosted.org/packages/80/c5/57fa58276dfdfa612241d640a64ca2f76adc6ffcebdbd135b4ef60095098/kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee", size = 63894 }, + { url = "https://files.pythonhosted.org/packages/8b/e9/26d3edd4c4ad1c5b891d8747a4f81b1b0aba9fb9721de6600a4adc09773b/kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640", size = 1369296 }, + { url = "https://files.pythonhosted.org/packages/b6/67/3f4850b5e6cffb75ec40577ddf54f7b82b15269cc5097ff2e968ee32ea7d/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f", size = 1461450 }, + { url = "https://files.pythonhosted.org/packages/52/be/86cbb9c9a315e98a8dc6b1d23c43cffd91d97d49318854f9c37b0e41cd68/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483", size = 1579168 }, + { url = "https://files.pythonhosted.org/packages/0f/00/65061acf64bd5fd34c1f4ae53f20b43b0a017a541f242a60b135b9d1e301/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258", size = 1507308 }, + { url = "https://files.pythonhosted.org/packages/21/e4/c0b6746fd2eb62fe702118b3ca0cb384ce95e1261cfada58ff693aeec08a/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e", size = 1464186 }, + { url = "https://files.pythonhosted.org/packages/0a/0f/529d0a9fffb4d514f2782c829b0b4b371f7f441d61aa55f1de1c614c4ef3/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107", size = 2247877 }, + { url = "https://files.pythonhosted.org/packages/d1/e1/66603ad779258843036d45adcbe1af0d1a889a07af4635f8b4ec7dccda35/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948", size = 2404204 }, + { url = "https://files.pythonhosted.org/packages/8d/61/de5fb1ca7ad1f9ab7970e340a5b833d735df24689047de6ae71ab9d8d0e7/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038", size = 2352461 }, + { url = "https://files.pythonhosted.org/packages/ba/d2/0edc00a852e369827f7e05fd008275f550353f1f9bcd55db9363d779fc63/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383", size = 2501358 }, + { url = "https://files.pythonhosted.org/packages/84/15/adc15a483506aec6986c01fb7f237c3aec4d9ed4ac10b756e98a76835933/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520", size = 2314119 }, + { url = "https://files.pythonhosted.org/packages/36/08/3a5bb2c53c89660863a5aa1ee236912269f2af8762af04a2e11df851d7b2/kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b", size = 46367 }, + { url = "https://files.pythonhosted.org/packages/19/93/c05f0a6d825c643779fc3c70876bff1ac221f0e31e6f701f0e9578690d70/kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb", size = 55884 }, + { url = "https://files.pythonhosted.org/packages/d2/f9/3828d8f21b6de4279f0667fb50a9f5215e6fe57d5ec0d61905914f5b6099/kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a", size = 48528 }, + { url = "https://files.pythonhosted.org/packages/c4/06/7da99b04259b0f18b557a4effd1b9c901a747f7fdd84cf834ccf520cb0b2/kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e", size = 121913 }, + { url = "https://files.pythonhosted.org/packages/97/f5/b8a370d1aa593c17882af0a6f6755aaecd643640c0ed72dcfd2eafc388b9/kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6", size = 65627 }, + { url = "https://files.pythonhosted.org/packages/2a/fc/6c0374f7503522539e2d4d1b497f5ebad3f8ed07ab51aed2af988dd0fb65/kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750", size = 63888 }, + { url = "https://files.pythonhosted.org/packages/bf/3e/0b7172793d0f41cae5c923492da89a2ffcd1adf764c16159ca047463ebd3/kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d", size = 1369145 }, + { url = "https://files.pythonhosted.org/packages/77/92/47d050d6f6aced2d634258123f2688fbfef8ded3c5baf2c79d94d91f1f58/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379", size = 1461448 }, + { url = "https://files.pythonhosted.org/packages/9c/1b/8f80b18e20b3b294546a1adb41701e79ae21915f4175f311a90d042301cf/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c", size = 1578750 }, + { url = "https://files.pythonhosted.org/packages/a4/fe/fe8e72f3be0a844f257cadd72689c0848c6d5c51bc1d60429e2d14ad776e/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34", size = 1507175 }, + { url = "https://files.pythonhosted.org/packages/39/fa/cdc0b6105d90eadc3bee525fecc9179e2b41e1ce0293caaf49cb631a6aaf/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1", size = 1463963 }, + { url = "https://files.pythonhosted.org/packages/6e/5c/0c03c4e542720c6177d4f408e56d1c8315899db72d46261a4e15b8b33a41/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f", size = 2248220 }, + { url = "https://files.pythonhosted.org/packages/3d/ee/55ef86d5a574f4e767df7da3a3a7ff4954c996e12d4fbe9c408170cd7dcc/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b", size = 2404463 }, + { url = "https://files.pythonhosted.org/packages/0f/6d/73ad36170b4bff4825dc588acf4f3e6319cb97cd1fb3eb04d9faa6b6f212/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27", size = 2352842 }, + { url = "https://files.pythonhosted.org/packages/0b/16/fa531ff9199d3b6473bb4d0f47416cdb08d556c03b8bc1cccf04e756b56d/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a", size = 2501635 }, + { url = "https://files.pythonhosted.org/packages/78/7e/aa9422e78419db0cbe75fb86d8e72b433818f2e62e2e394992d23d23a583/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee", size = 2314556 }, + { url = "https://files.pythonhosted.org/packages/a8/b2/15f7f556df0a6e5b3772a1e076a9d9f6c538ce5f05bd590eca8106508e06/kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07", size = 46364 }, + { url = "https://files.pythonhosted.org/packages/0b/db/32e897e43a330eee8e4770bfd2737a9584b23e33587a0812b8e20aac38f7/kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76", size = 55887 }, + { url = "https://files.pythonhosted.org/packages/c8/a4/df2bdca5270ca85fd25253049eb6708d4127be2ed0e5c2650217450b59e9/kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650", size = 48530 }, + { url = "https://files.pythonhosted.org/packages/11/88/37ea0ea64512997b13d69772db8dcdc3bfca5442cda3a5e4bb943652ee3e/kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd", size = 122449 }, + { url = "https://files.pythonhosted.org/packages/4e/45/5a5c46078362cb3882dcacad687c503089263c017ca1241e0483857791eb/kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583", size = 65757 }, + { url = "https://files.pythonhosted.org/packages/8a/be/a6ae58978772f685d48dd2e84460937761c53c4bbd84e42b0336473d9775/kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417", size = 64312 }, + { url = "https://files.pythonhosted.org/packages/f4/04/18ef6f452d311e1e1eb180c9bf5589187fa1f042db877e6fe443ef10099c/kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904", size = 1626966 }, + { url = "https://files.pythonhosted.org/packages/21/b1/40655f6c3fa11ce740e8a964fa8e4c0479c87d6a7944b95af799c7a55dfe/kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a", size = 1607044 }, + { url = "https://files.pythonhosted.org/packages/fd/93/af67dbcfb9b3323bbd2c2db1385a7139d8f77630e4a37bb945b57188eb2d/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8", size = 1391879 }, + { url = "https://files.pythonhosted.org/packages/40/6f/d60770ef98e77b365d96061d090c0cd9e23418121c55fff188fa4bdf0b54/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2", size = 1504751 }, + { url = "https://files.pythonhosted.org/packages/fa/3a/5f38667d313e983c432f3fcd86932177519ed8790c724e07d77d1de0188a/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88", size = 1436990 }, + { url = "https://files.pythonhosted.org/packages/cb/3b/1520301a47326e6a6043b502647e42892be33b3f051e9791cc8bb43f1a32/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde", size = 2191122 }, + { url = "https://files.pythonhosted.org/packages/cf/c4/eb52da300c166239a2233f1f9c4a1b767dfab98fae27681bfb7ea4873cb6/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c", size = 2338126 }, + { url = "https://files.pythonhosted.org/packages/1a/cb/42b92fd5eadd708dd9107c089e817945500685f3437ce1fd387efebc6d6e/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2", size = 2298313 }, + { url = "https://files.pythonhosted.org/packages/4f/eb/be25aa791fe5fc75a8b1e0c965e00f942496bc04635c9aae8035f6b76dcd/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb", size = 2437784 }, + { url = "https://files.pythonhosted.org/packages/c5/22/30a66be7f3368d76ff95689e1c2e28d382383952964ab15330a15d8bfd03/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327", size = 2253988 }, + { url = "https://files.pythonhosted.org/packages/35/d3/5f2ecb94b5211c8a04f218a76133cc8d6d153b0f9cd0b45fad79907f0689/kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644", size = 46980 }, + { url = "https://files.pythonhosted.org/packages/ef/17/cd10d020578764ea91740204edc6b3236ed8106228a46f568d716b11feb2/kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4", size = 55847 }, + { url = "https://files.pythonhosted.org/packages/91/84/32232502020bd78d1d12be7afde15811c64a95ed1f606c10456db4e4c3ac/kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f", size = 48494 }, + { url = "https://files.pythonhosted.org/packages/ac/59/741b79775d67ab67ced9bb38552da688c0305c16e7ee24bba7a2be253fb7/kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643", size = 59491 }, + { url = "https://files.pythonhosted.org/packages/58/cc/fb239294c29a5656e99e3527f7369b174dd9cc7c3ef2dea7cb3c54a8737b/kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706", size = 57648 }, + { url = "https://files.pythonhosted.org/packages/3b/ef/2f009ac1f7aab9f81efb2d837301d255279d618d27b6015780115ac64bdd/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6", size = 84257 }, + { url = "https://files.pythonhosted.org/packages/81/e1/c64f50987f85b68b1c52b464bb5bf73e71570c0f7782d626d1eb283ad620/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2", size = 80906 }, + { url = "https://files.pythonhosted.org/packages/fd/71/1687c5c0a0be2cee39a5c9c389e546f9c6e215e46b691d00d9f646892083/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4", size = 79951 }, + { url = "https://files.pythonhosted.org/packages/ea/8b/d7497df4a1cae9367adf21665dd1f896c2a7aeb8769ad77b662c5e2bcce7/kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a", size = 55715 }, + { url = "https://files.pythonhosted.org/packages/d5/df/ce37d9b26f07ab90880923c94d12a6ff4d27447096b4c849bfc4339ccfdf/kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39", size = 58666 }, + { url = "https://files.pythonhosted.org/packages/b0/d3/e4b04f43bc629ac8e186b77b2b1a251cdfa5b7610fa189dc0db622672ce6/kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e", size = 57088 }, + { url = "https://files.pythonhosted.org/packages/30/1c/752df58e2d339e670a535514d2db4fe8c842ce459776b8080fbe08ebb98e/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608", size = 84321 }, + { url = "https://files.pythonhosted.org/packages/f0/f8/fe6484e847bc6e238ec9f9828089fb2c0bb53f2f5f3a79351fde5b565e4f/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674", size = 80776 }, + { url = "https://files.pythonhosted.org/packages/9b/57/d7163c0379f250ef763aba85330a19feefb5ce6cb541ade853aaba881524/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225", size = 79984 }, + { url = "https://files.pythonhosted.org/packages/8c/95/4a103776c265d13b3d2cd24fb0494d4e04ea435a8ef97e1b2c026d43250b/kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0", size = 55811 }, ] [[package]] @@ -1391,96 +1390,96 @@ resolution-markers = [ "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] -sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538, upload-time = "2024-12-24T18:30:51.519Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/5f/4d8e9e852d98ecd26cdf8eaf7ed8bc33174033bba5e07001b289f07308fd/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db", size = 124623, upload-time = "2024-12-24T18:28:17.687Z" }, - { url = "https://files.pythonhosted.org/packages/1d/70/7f5af2a18a76fe92ea14675f8bd88ce53ee79e37900fa5f1a1d8e0b42998/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b", size = 66720, upload-time = "2024-12-24T18:28:19.158Z" }, - { url = "https://files.pythonhosted.org/packages/c6/13/e15f804a142353aefd089fadc8f1d985561a15358c97aca27b0979cb0785/kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d", size = 65413, upload-time = "2024-12-24T18:28:20.064Z" }, - { url = "https://files.pythonhosted.org/packages/ce/6d/67d36c4d2054e83fb875c6b59d0809d5c530de8148846b1370475eeeece9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d", size = 1650826, upload-time = "2024-12-24T18:28:21.203Z" }, - { url = "https://files.pythonhosted.org/packages/de/c6/7b9bb8044e150d4d1558423a1568e4f227193662a02231064e3824f37e0a/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c", size = 1628231, upload-time = "2024-12-24T18:28:23.851Z" }, - { url = "https://files.pythonhosted.org/packages/b6/38/ad10d437563063eaaedbe2c3540a71101fc7fb07a7e71f855e93ea4de605/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3", size = 1408938, upload-time = "2024-12-24T18:28:26.687Z" }, - { url = "https://files.pythonhosted.org/packages/52/ce/c0106b3bd7f9e665c5f5bc1e07cc95b5dabd4e08e3dad42dbe2faad467e7/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed", size = 1422799, upload-time = "2024-12-24T18:28:30.538Z" }, - { url = "https://files.pythonhosted.org/packages/d0/87/efb704b1d75dc9758087ba374c0f23d3254505edaedd09cf9d247f7878b9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f", size = 1354362, upload-time = "2024-12-24T18:28:32.943Z" }, - { url = "https://files.pythonhosted.org/packages/eb/b3/fd760dc214ec9a8f208b99e42e8f0130ff4b384eca8b29dd0efc62052176/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff", size = 2222695, upload-time = "2024-12-24T18:28:35.641Z" }, - { url = "https://files.pythonhosted.org/packages/a2/09/a27fb36cca3fc01700687cc45dae7a6a5f8eeb5f657b9f710f788748e10d/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d", size = 2370802, upload-time = "2024-12-24T18:28:38.357Z" }, - { url = "https://files.pythonhosted.org/packages/3d/c3/ba0a0346db35fe4dc1f2f2cf8b99362fbb922d7562e5f911f7ce7a7b60fa/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c", size = 2334646, upload-time = "2024-12-24T18:28:40.941Z" }, - { url = "https://files.pythonhosted.org/packages/41/52/942cf69e562f5ed253ac67d5c92a693745f0bed3c81f49fc0cbebe4d6b00/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605", size = 2467260, upload-time = "2024-12-24T18:28:42.273Z" }, - { url = "https://files.pythonhosted.org/packages/32/26/2d9668f30d8a494b0411d4d7d4ea1345ba12deb6a75274d58dd6ea01e951/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e", size = 2288633, upload-time = "2024-12-24T18:28:44.87Z" }, - { url = "https://files.pythonhosted.org/packages/98/99/0dd05071654aa44fe5d5e350729961e7bb535372935a45ac89a8924316e6/kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751", size = 71885, upload-time = "2024-12-24T18:28:47.346Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fc/822e532262a97442989335394d441cd1d0448c2e46d26d3e04efca84df22/kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271", size = 65175, upload-time = "2024-12-24T18:28:49.651Z" }, - { url = "https://files.pythonhosted.org/packages/da/ed/c913ee28936c371418cb167b128066ffb20bbf37771eecc2c97edf8a6e4c/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", size = 124635, upload-time = "2024-12-24T18:28:51.826Z" }, - { url = "https://files.pythonhosted.org/packages/4c/45/4a7f896f7467aaf5f56ef093d1f329346f3b594e77c6a3c327b2d415f521/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", size = 66717, upload-time = "2024-12-24T18:28:54.256Z" }, - { url = "https://files.pythonhosted.org/packages/5f/b4/c12b3ac0852a3a68f94598d4c8d569f55361beef6159dce4e7b624160da2/kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", size = 65413, upload-time = "2024-12-24T18:28:55.184Z" }, - { url = "https://files.pythonhosted.org/packages/a9/98/1df4089b1ed23d83d410adfdc5947245c753bddfbe06541c4aae330e9e70/kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03", size = 1343994, upload-time = "2024-12-24T18:28:57.493Z" }, - { url = "https://files.pythonhosted.org/packages/8d/bf/b4b169b050c8421a7c53ea1ea74e4ef9c335ee9013216c558a047f162d20/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954", size = 1434804, upload-time = "2024-12-24T18:29:00.077Z" }, - { url = "https://files.pythonhosted.org/packages/66/5a/e13bd341fbcf73325ea60fdc8af752addf75c5079867af2e04cc41f34434/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79", size = 1450690, upload-time = "2024-12-24T18:29:01.401Z" }, - { url = "https://files.pythonhosted.org/packages/9b/4f/5955dcb376ba4a830384cc6fab7d7547bd6759fe75a09564910e9e3bb8ea/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6", size = 1376839, upload-time = "2024-12-24T18:29:02.685Z" }, - { url = "https://files.pythonhosted.org/packages/3a/97/5edbed69a9d0caa2e4aa616ae7df8127e10f6586940aa683a496c2c280b9/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0", size = 1435109, upload-time = "2024-12-24T18:29:04.113Z" }, - { url = "https://files.pythonhosted.org/packages/13/fc/e756382cb64e556af6c1809a1bbb22c141bbc2445049f2da06b420fe52bf/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab", size = 2245269, upload-time = "2024-12-24T18:29:05.488Z" }, - { url = "https://files.pythonhosted.org/packages/76/15/e59e45829d7f41c776d138245cabae6515cb4eb44b418f6d4109c478b481/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc", size = 2393468, upload-time = "2024-12-24T18:29:06.79Z" }, - { url = "https://files.pythonhosted.org/packages/e9/39/483558c2a913ab8384d6e4b66a932406f87c95a6080112433da5ed668559/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25", size = 2355394, upload-time = "2024-12-24T18:29:08.24Z" }, - { url = "https://files.pythonhosted.org/packages/01/aa/efad1fbca6570a161d29224f14b082960c7e08268a133fe5dc0f6906820e/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc", size = 2490901, upload-time = "2024-12-24T18:29:09.653Z" }, - { url = "https://files.pythonhosted.org/packages/c9/4f/15988966ba46bcd5ab9d0c8296914436720dd67fca689ae1a75b4ec1c72f/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67", size = 2312306, upload-time = "2024-12-24T18:29:12.644Z" }, - { url = "https://files.pythonhosted.org/packages/2d/27/bdf1c769c83f74d98cbc34483a972f221440703054894a37d174fba8aa68/kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34", size = 71966, upload-time = "2024-12-24T18:29:14.089Z" }, - { url = "https://files.pythonhosted.org/packages/4a/c9/9642ea855604aeb2968a8e145fc662edf61db7632ad2e4fb92424be6b6c0/kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2", size = 65311, upload-time = "2024-12-24T18:29:15.892Z" }, - { url = "https://files.pythonhosted.org/packages/fc/aa/cea685c4ab647f349c3bc92d2daf7ae34c8e8cf405a6dcd3a497f58a2ac3/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", size = 124152, upload-time = "2024-12-24T18:29:16.85Z" }, - { url = "https://files.pythonhosted.org/packages/c5/0b/8db6d2e2452d60d5ebc4ce4b204feeb16176a851fd42462f66ade6808084/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", size = 66555, upload-time = "2024-12-24T18:29:19.146Z" }, - { url = "https://files.pythonhosted.org/packages/60/26/d6a0db6785dd35d3ba5bf2b2df0aedc5af089962c6eb2cbf67a15b81369e/kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", size = 65067, upload-time = "2024-12-24T18:29:20.096Z" }, - { url = "https://files.pythonhosted.org/packages/c9/ed/1d97f7e3561e09757a196231edccc1bcf59d55ddccefa2afc9c615abd8e0/kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", size = 1378443, upload-time = "2024-12-24T18:29:22.843Z" }, - { url = "https://files.pythonhosted.org/packages/29/61/39d30b99954e6b46f760e6289c12fede2ab96a254c443639052d1b573fbc/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", size = 1472728, upload-time = "2024-12-24T18:29:24.463Z" }, - { url = "https://files.pythonhosted.org/packages/0c/3e/804163b932f7603ef256e4a715e5843a9600802bb23a68b4e08c8c0ff61d/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", size = 1478388, upload-time = "2024-12-24T18:29:25.776Z" }, - { url = "https://files.pythonhosted.org/packages/8a/9e/60eaa75169a154700be74f875a4d9961b11ba048bef315fbe89cb6999056/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", size = 1413849, upload-time = "2024-12-24T18:29:27.202Z" }, - { url = "https://files.pythonhosted.org/packages/bc/b3/9458adb9472e61a998c8c4d95cfdfec91c73c53a375b30b1428310f923e4/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", size = 1475533, upload-time = "2024-12-24T18:29:28.638Z" }, - { url = "https://files.pythonhosted.org/packages/e4/7a/0a42d9571e35798de80aef4bb43a9b672aa7f8e58643d7bd1950398ffb0a/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", size = 2268898, upload-time = "2024-12-24T18:29:30.368Z" }, - { url = "https://files.pythonhosted.org/packages/d9/07/1255dc8d80271400126ed8db35a1795b1a2c098ac3a72645075d06fe5c5d/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", size = 2425605, upload-time = "2024-12-24T18:29:33.151Z" }, - { url = "https://files.pythonhosted.org/packages/84/df/5a3b4cf13780ef6f6942df67b138b03b7e79e9f1f08f57c49957d5867f6e/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", size = 2375801, upload-time = "2024-12-24T18:29:34.584Z" }, - { url = "https://files.pythonhosted.org/packages/8f/10/2348d068e8b0f635c8c86892788dac7a6b5c0cb12356620ab575775aad89/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", size = 2520077, upload-time = "2024-12-24T18:29:36.138Z" }, - { url = "https://files.pythonhosted.org/packages/32/d8/014b89fee5d4dce157d814303b0fce4d31385a2af4c41fed194b173b81ac/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", size = 2338410, upload-time = "2024-12-24T18:29:39.991Z" }, - { url = "https://files.pythonhosted.org/packages/bd/72/dfff0cc97f2a0776e1c9eb5bef1ddfd45f46246c6533b0191887a427bca5/kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", size = 71853, upload-time = "2024-12-24T18:29:42.006Z" }, - { url = "https://files.pythonhosted.org/packages/dc/85/220d13d914485c0948a00f0b9eb419efaf6da81b7d72e88ce2391f7aed8d/kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", size = 65424, upload-time = "2024-12-24T18:29:44.38Z" }, - { url = "https://files.pythonhosted.org/packages/79/b3/e62464a652f4f8cd9006e13d07abad844a47df1e6537f73ddfbf1bc997ec/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", size = 124156, upload-time = "2024-12-24T18:29:45.368Z" }, - { url = "https://files.pythonhosted.org/packages/8d/2d/f13d06998b546a2ad4f48607a146e045bbe48030774de29f90bdc573df15/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", size = 66555, upload-time = "2024-12-24T18:29:46.37Z" }, - { url = "https://files.pythonhosted.org/packages/59/e3/b8bd14b0a54998a9fd1e8da591c60998dc003618cb19a3f94cb233ec1511/kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", size = 65071, upload-time = "2024-12-24T18:29:47.333Z" }, - { url = "https://files.pythonhosted.org/packages/f0/1c/6c86f6d85ffe4d0ce04228d976f00674f1df5dc893bf2dd4f1928748f187/kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", size = 1378053, upload-time = "2024-12-24T18:29:49.636Z" }, - { url = "https://files.pythonhosted.org/packages/4e/b9/1c6e9f6dcb103ac5cf87cb695845f5fa71379021500153566d8a8a9fc291/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", size = 1472278, upload-time = "2024-12-24T18:29:51.164Z" }, - { url = "https://files.pythonhosted.org/packages/ee/81/aca1eb176de671f8bda479b11acdc42c132b61a2ac861c883907dde6debb/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", size = 1478139, upload-time = "2024-12-24T18:29:52.594Z" }, - { url = "https://files.pythonhosted.org/packages/49/f4/e081522473671c97b2687d380e9e4c26f748a86363ce5af48b4a28e48d06/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", size = 1413517, upload-time = "2024-12-24T18:29:53.941Z" }, - { url = "https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", size = 1474952, upload-time = "2024-12-24T18:29:56.523Z" }, - { url = "https://files.pythonhosted.org/packages/82/13/13fa685ae167bee5d94b415991c4fc7bb0a1b6ebea6e753a87044b209678/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794", size = 2269132, upload-time = "2024-12-24T18:29:57.989Z" }, - { url = "https://files.pythonhosted.org/packages/ef/92/bb7c9395489b99a6cb41d502d3686bac692586db2045adc19e45ee64ed23/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", size = 2425997, upload-time = "2024-12-24T18:29:59.393Z" }, - { url = "https://files.pythonhosted.org/packages/ed/12/87f0e9271e2b63d35d0d8524954145837dd1a6c15b62a2d8c1ebe0f182b4/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", size = 2376060, upload-time = "2024-12-24T18:30:01.338Z" }, - { url = "https://files.pythonhosted.org/packages/02/6e/c8af39288edbce8bf0fa35dee427b082758a4b71e9c91ef18fa667782138/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", size = 2520471, upload-time = "2024-12-24T18:30:04.574Z" }, - { url = "https://files.pythonhosted.org/packages/13/78/df381bc7b26e535c91469f77f16adcd073beb3e2dd25042efd064af82323/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", size = 2338793, upload-time = "2024-12-24T18:30:06.25Z" }, - { url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", size = 71855, upload-time = "2024-12-24T18:30:07.535Z" }, - { url = "https://files.pythonhosted.org/packages/a0/b6/21529d595b126ac298fdd90b705d87d4c5693de60023e0efcb4f387ed99e/kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", size = 65430, upload-time = "2024-12-24T18:30:08.504Z" }, - { url = "https://files.pythonhosted.org/packages/34/bd/b89380b7298e3af9b39f49334e3e2a4af0e04819789f04b43d560516c0c8/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", size = 126294, upload-time = "2024-12-24T18:30:09.508Z" }, - { url = "https://files.pythonhosted.org/packages/83/41/5857dc72e5e4148eaac5aa76e0703e594e4465f8ab7ec0fc60e3a9bb8fea/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", size = 67736, upload-time = "2024-12-24T18:30:11.039Z" }, - { url = "https://files.pythonhosted.org/packages/e1/d1/be059b8db56ac270489fb0b3297fd1e53d195ba76e9bbb30e5401fa6b759/kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", size = 66194, upload-time = "2024-12-24T18:30:14.886Z" }, - { url = "https://files.pythonhosted.org/packages/e1/83/4b73975f149819eb7dcf9299ed467eba068ecb16439a98990dcb12e63fdd/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", size = 1465942, upload-time = "2024-12-24T18:30:18.927Z" }, - { url = "https://files.pythonhosted.org/packages/c7/2c/30a5cdde5102958e602c07466bce058b9d7cb48734aa7a4327261ac8e002/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", size = 1595341, upload-time = "2024-12-24T18:30:22.102Z" }, - { url = "https://files.pythonhosted.org/packages/ff/9b/1e71db1c000385aa069704f5990574b8244cce854ecd83119c19e83c9586/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", size = 1598455, upload-time = "2024-12-24T18:30:24.947Z" }, - { url = "https://files.pythonhosted.org/packages/85/92/c8fec52ddf06231b31cbb779af77e99b8253cd96bd135250b9498144c78b/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", size = 1522138, upload-time = "2024-12-24T18:30:26.286Z" }, - { url = "https://files.pythonhosted.org/packages/0b/51/9eb7e2cd07a15d8bdd976f6190c0164f92ce1904e5c0c79198c4972926b7/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", size = 1582857, upload-time = "2024-12-24T18:30:28.86Z" }, - { url = "https://files.pythonhosted.org/packages/0f/95/c5a00387a5405e68ba32cc64af65ce881a39b98d73cc394b24143bebc5b8/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", size = 2293129, upload-time = "2024-12-24T18:30:30.34Z" }, - { url = "https://files.pythonhosted.org/packages/44/83/eeb7af7d706b8347548313fa3a3a15931f404533cc54fe01f39e830dd231/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", size = 2421538, upload-time = "2024-12-24T18:30:33.334Z" }, - { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661, upload-time = "2024-12-24T18:30:34.939Z" }, - { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710, upload-time = "2024-12-24T18:30:37.281Z" }, - { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213, upload-time = "2024-12-24T18:30:40.019Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f9/ae81c47a43e33b93b0a9819cac6723257f5da2a5a60daf46aa5c7226ea85/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a", size = 60403, upload-time = "2024-12-24T18:30:41.372Z" }, - { url = "https://files.pythonhosted.org/packages/58/ca/f92b5cb6f4ce0c1ebfcfe3e2e42b96917e16f7090e45b21102941924f18f/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8", size = 58657, upload-time = "2024-12-24T18:30:42.392Z" }, - { url = "https://files.pythonhosted.org/packages/80/28/ae0240f732f0484d3a4dc885d055653c47144bdf59b670aae0ec3c65a7c8/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0", size = 84948, upload-time = "2024-12-24T18:30:44.703Z" }, - { url = "https://files.pythonhosted.org/packages/5d/eb/78d50346c51db22c7203c1611f9b513075f35c4e0e4877c5dde378d66043/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c", size = 81186, upload-time = "2024-12-24T18:30:45.654Z" }, - { url = "https://files.pythonhosted.org/packages/43/f8/7259f18c77adca88d5f64f9a522792e178b2691f3748817a8750c2d216ef/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b", size = 80279, upload-time = "2024-12-24T18:30:47.951Z" }, - { url = "https://files.pythonhosted.org/packages/3a/1d/50ad811d1c5dae091e4cf046beba925bcae0a610e79ae4c538f996f63ed5/kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b", size = 71762, upload-time = "2024-12-24T18:30:48.903Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/5f/4d8e9e852d98ecd26cdf8eaf7ed8bc33174033bba5e07001b289f07308fd/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db", size = 124623 }, + { url = "https://files.pythonhosted.org/packages/1d/70/7f5af2a18a76fe92ea14675f8bd88ce53ee79e37900fa5f1a1d8e0b42998/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b", size = 66720 }, + { url = "https://files.pythonhosted.org/packages/c6/13/e15f804a142353aefd089fadc8f1d985561a15358c97aca27b0979cb0785/kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d", size = 65413 }, + { url = "https://files.pythonhosted.org/packages/ce/6d/67d36c4d2054e83fb875c6b59d0809d5c530de8148846b1370475eeeece9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d", size = 1650826 }, + { url = "https://files.pythonhosted.org/packages/de/c6/7b9bb8044e150d4d1558423a1568e4f227193662a02231064e3824f37e0a/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c", size = 1628231 }, + { url = "https://files.pythonhosted.org/packages/b6/38/ad10d437563063eaaedbe2c3540a71101fc7fb07a7e71f855e93ea4de605/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3", size = 1408938 }, + { url = "https://files.pythonhosted.org/packages/52/ce/c0106b3bd7f9e665c5f5bc1e07cc95b5dabd4e08e3dad42dbe2faad467e7/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed", size = 1422799 }, + { url = "https://files.pythonhosted.org/packages/d0/87/efb704b1d75dc9758087ba374c0f23d3254505edaedd09cf9d247f7878b9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f", size = 1354362 }, + { url = "https://files.pythonhosted.org/packages/eb/b3/fd760dc214ec9a8f208b99e42e8f0130ff4b384eca8b29dd0efc62052176/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff", size = 2222695 }, + { url = "https://files.pythonhosted.org/packages/a2/09/a27fb36cca3fc01700687cc45dae7a6a5f8eeb5f657b9f710f788748e10d/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d", size = 2370802 }, + { url = "https://files.pythonhosted.org/packages/3d/c3/ba0a0346db35fe4dc1f2f2cf8b99362fbb922d7562e5f911f7ce7a7b60fa/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c", size = 2334646 }, + { url = "https://files.pythonhosted.org/packages/41/52/942cf69e562f5ed253ac67d5c92a693745f0bed3c81f49fc0cbebe4d6b00/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605", size = 2467260 }, + { url = "https://files.pythonhosted.org/packages/32/26/2d9668f30d8a494b0411d4d7d4ea1345ba12deb6a75274d58dd6ea01e951/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e", size = 2288633 }, + { url = "https://files.pythonhosted.org/packages/98/99/0dd05071654aa44fe5d5e350729961e7bb535372935a45ac89a8924316e6/kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751", size = 71885 }, + { url = "https://files.pythonhosted.org/packages/6c/fc/822e532262a97442989335394d441cd1d0448c2e46d26d3e04efca84df22/kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271", size = 65175 }, + { url = "https://files.pythonhosted.org/packages/da/ed/c913ee28936c371418cb167b128066ffb20bbf37771eecc2c97edf8a6e4c/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", size = 124635 }, + { url = "https://files.pythonhosted.org/packages/4c/45/4a7f896f7467aaf5f56ef093d1f329346f3b594e77c6a3c327b2d415f521/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", size = 66717 }, + { url = "https://files.pythonhosted.org/packages/5f/b4/c12b3ac0852a3a68f94598d4c8d569f55361beef6159dce4e7b624160da2/kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", size = 65413 }, + { url = "https://files.pythonhosted.org/packages/a9/98/1df4089b1ed23d83d410adfdc5947245c753bddfbe06541c4aae330e9e70/kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03", size = 1343994 }, + { url = "https://files.pythonhosted.org/packages/8d/bf/b4b169b050c8421a7c53ea1ea74e4ef9c335ee9013216c558a047f162d20/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954", size = 1434804 }, + { url = "https://files.pythonhosted.org/packages/66/5a/e13bd341fbcf73325ea60fdc8af752addf75c5079867af2e04cc41f34434/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79", size = 1450690 }, + { url = "https://files.pythonhosted.org/packages/9b/4f/5955dcb376ba4a830384cc6fab7d7547bd6759fe75a09564910e9e3bb8ea/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6", size = 1376839 }, + { url = "https://files.pythonhosted.org/packages/3a/97/5edbed69a9d0caa2e4aa616ae7df8127e10f6586940aa683a496c2c280b9/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0", size = 1435109 }, + { url = "https://files.pythonhosted.org/packages/13/fc/e756382cb64e556af6c1809a1bbb22c141bbc2445049f2da06b420fe52bf/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab", size = 2245269 }, + { url = "https://files.pythonhosted.org/packages/76/15/e59e45829d7f41c776d138245cabae6515cb4eb44b418f6d4109c478b481/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc", size = 2393468 }, + { url = "https://files.pythonhosted.org/packages/e9/39/483558c2a913ab8384d6e4b66a932406f87c95a6080112433da5ed668559/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25", size = 2355394 }, + { url = "https://files.pythonhosted.org/packages/01/aa/efad1fbca6570a161d29224f14b082960c7e08268a133fe5dc0f6906820e/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc", size = 2490901 }, + { url = "https://files.pythonhosted.org/packages/c9/4f/15988966ba46bcd5ab9d0c8296914436720dd67fca689ae1a75b4ec1c72f/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67", size = 2312306 }, + { url = "https://files.pythonhosted.org/packages/2d/27/bdf1c769c83f74d98cbc34483a972f221440703054894a37d174fba8aa68/kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34", size = 71966 }, + { url = "https://files.pythonhosted.org/packages/4a/c9/9642ea855604aeb2968a8e145fc662edf61db7632ad2e4fb92424be6b6c0/kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2", size = 65311 }, + { url = "https://files.pythonhosted.org/packages/fc/aa/cea685c4ab647f349c3bc92d2daf7ae34c8e8cf405a6dcd3a497f58a2ac3/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", size = 124152 }, + { url = "https://files.pythonhosted.org/packages/c5/0b/8db6d2e2452d60d5ebc4ce4b204feeb16176a851fd42462f66ade6808084/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", size = 66555 }, + { url = "https://files.pythonhosted.org/packages/60/26/d6a0db6785dd35d3ba5bf2b2df0aedc5af089962c6eb2cbf67a15b81369e/kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", size = 65067 }, + { url = "https://files.pythonhosted.org/packages/c9/ed/1d97f7e3561e09757a196231edccc1bcf59d55ddccefa2afc9c615abd8e0/kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", size = 1378443 }, + { url = "https://files.pythonhosted.org/packages/29/61/39d30b99954e6b46f760e6289c12fede2ab96a254c443639052d1b573fbc/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", size = 1472728 }, + { url = "https://files.pythonhosted.org/packages/0c/3e/804163b932f7603ef256e4a715e5843a9600802bb23a68b4e08c8c0ff61d/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", size = 1478388 }, + { url = "https://files.pythonhosted.org/packages/8a/9e/60eaa75169a154700be74f875a4d9961b11ba048bef315fbe89cb6999056/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", size = 1413849 }, + { url = "https://files.pythonhosted.org/packages/bc/b3/9458adb9472e61a998c8c4d95cfdfec91c73c53a375b30b1428310f923e4/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", size = 1475533 }, + { url = "https://files.pythonhosted.org/packages/e4/7a/0a42d9571e35798de80aef4bb43a9b672aa7f8e58643d7bd1950398ffb0a/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", size = 2268898 }, + { url = "https://files.pythonhosted.org/packages/d9/07/1255dc8d80271400126ed8db35a1795b1a2c098ac3a72645075d06fe5c5d/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", size = 2425605 }, + { url = "https://files.pythonhosted.org/packages/84/df/5a3b4cf13780ef6f6942df67b138b03b7e79e9f1f08f57c49957d5867f6e/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", size = 2375801 }, + { url = "https://files.pythonhosted.org/packages/8f/10/2348d068e8b0f635c8c86892788dac7a6b5c0cb12356620ab575775aad89/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", size = 2520077 }, + { url = "https://files.pythonhosted.org/packages/32/d8/014b89fee5d4dce157d814303b0fce4d31385a2af4c41fed194b173b81ac/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", size = 2338410 }, + { url = "https://files.pythonhosted.org/packages/bd/72/dfff0cc97f2a0776e1c9eb5bef1ddfd45f46246c6533b0191887a427bca5/kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", size = 71853 }, + { url = "https://files.pythonhosted.org/packages/dc/85/220d13d914485c0948a00f0b9eb419efaf6da81b7d72e88ce2391f7aed8d/kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", size = 65424 }, + { url = "https://files.pythonhosted.org/packages/79/b3/e62464a652f4f8cd9006e13d07abad844a47df1e6537f73ddfbf1bc997ec/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", size = 124156 }, + { url = "https://files.pythonhosted.org/packages/8d/2d/f13d06998b546a2ad4f48607a146e045bbe48030774de29f90bdc573df15/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", size = 66555 }, + { url = "https://files.pythonhosted.org/packages/59/e3/b8bd14b0a54998a9fd1e8da591c60998dc003618cb19a3f94cb233ec1511/kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", size = 65071 }, + { url = "https://files.pythonhosted.org/packages/f0/1c/6c86f6d85ffe4d0ce04228d976f00674f1df5dc893bf2dd4f1928748f187/kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", size = 1378053 }, + { url = "https://files.pythonhosted.org/packages/4e/b9/1c6e9f6dcb103ac5cf87cb695845f5fa71379021500153566d8a8a9fc291/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", size = 1472278 }, + { url = "https://files.pythonhosted.org/packages/ee/81/aca1eb176de671f8bda479b11acdc42c132b61a2ac861c883907dde6debb/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", size = 1478139 }, + { url = "https://files.pythonhosted.org/packages/49/f4/e081522473671c97b2687d380e9e4c26f748a86363ce5af48b4a28e48d06/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", size = 1413517 }, + { url = "https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", size = 1474952 }, + { url = "https://files.pythonhosted.org/packages/82/13/13fa685ae167bee5d94b415991c4fc7bb0a1b6ebea6e753a87044b209678/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794", size = 2269132 }, + { url = "https://files.pythonhosted.org/packages/ef/92/bb7c9395489b99a6cb41d502d3686bac692586db2045adc19e45ee64ed23/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", size = 2425997 }, + { url = "https://files.pythonhosted.org/packages/ed/12/87f0e9271e2b63d35d0d8524954145837dd1a6c15b62a2d8c1ebe0f182b4/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", size = 2376060 }, + { url = "https://files.pythonhosted.org/packages/02/6e/c8af39288edbce8bf0fa35dee427b082758a4b71e9c91ef18fa667782138/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", size = 2520471 }, + { url = "https://files.pythonhosted.org/packages/13/78/df381bc7b26e535c91469f77f16adcd073beb3e2dd25042efd064af82323/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", size = 2338793 }, + { url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", size = 71855 }, + { url = "https://files.pythonhosted.org/packages/a0/b6/21529d595b126ac298fdd90b705d87d4c5693de60023e0efcb4f387ed99e/kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", size = 65430 }, + { url = "https://files.pythonhosted.org/packages/34/bd/b89380b7298e3af9b39f49334e3e2a4af0e04819789f04b43d560516c0c8/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", size = 126294 }, + { url = "https://files.pythonhosted.org/packages/83/41/5857dc72e5e4148eaac5aa76e0703e594e4465f8ab7ec0fc60e3a9bb8fea/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", size = 67736 }, + { url = "https://files.pythonhosted.org/packages/e1/d1/be059b8db56ac270489fb0b3297fd1e53d195ba76e9bbb30e5401fa6b759/kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", size = 66194 }, + { url = "https://files.pythonhosted.org/packages/e1/83/4b73975f149819eb7dcf9299ed467eba068ecb16439a98990dcb12e63fdd/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", size = 1465942 }, + { url = "https://files.pythonhosted.org/packages/c7/2c/30a5cdde5102958e602c07466bce058b9d7cb48734aa7a4327261ac8e002/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", size = 1595341 }, + { url = "https://files.pythonhosted.org/packages/ff/9b/1e71db1c000385aa069704f5990574b8244cce854ecd83119c19e83c9586/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", size = 1598455 }, + { url = "https://files.pythonhosted.org/packages/85/92/c8fec52ddf06231b31cbb779af77e99b8253cd96bd135250b9498144c78b/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", size = 1522138 }, + { url = "https://files.pythonhosted.org/packages/0b/51/9eb7e2cd07a15d8bdd976f6190c0164f92ce1904e5c0c79198c4972926b7/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", size = 1582857 }, + { url = "https://files.pythonhosted.org/packages/0f/95/c5a00387a5405e68ba32cc64af65ce881a39b98d73cc394b24143bebc5b8/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", size = 2293129 }, + { url = "https://files.pythonhosted.org/packages/44/83/eeb7af7d706b8347548313fa3a3a15931f404533cc54fe01f39e830dd231/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", size = 2421538 }, + { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661 }, + { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710 }, + { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213 }, + { url = "https://files.pythonhosted.org/packages/1f/f9/ae81c47a43e33b93b0a9819cac6723257f5da2a5a60daf46aa5c7226ea85/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a", size = 60403 }, + { url = "https://files.pythonhosted.org/packages/58/ca/f92b5cb6f4ce0c1ebfcfe3e2e42b96917e16f7090e45b21102941924f18f/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8", size = 58657 }, + { url = "https://files.pythonhosted.org/packages/80/28/ae0240f732f0484d3a4dc885d055653c47144bdf59b670aae0ec3c65a7c8/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0", size = 84948 }, + { url = "https://files.pythonhosted.org/packages/5d/eb/78d50346c51db22c7203c1611f9b513075f35c4e0e4877c5dde378d66043/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c", size = 81186 }, + { url = "https://files.pythonhosted.org/packages/43/f8/7259f18c77adca88d5f64f9a522792e178b2691f3748817a8750c2d216ef/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b", size = 80279 }, + { url = "https://files.pythonhosted.org/packages/3a/1d/50ad811d1c5dae091e4cf046beba925bcae0a610e79ae4c538f996f63ed5/kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b", size = 71762 }, ] [[package]] name = "latexcodec" version = "3.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/27/dd/4270b2c5e2ee49316c3859e62293bd2ea8e382339d63ab7bbe9f39c0ec3b/latexcodec-3.0.1.tar.gz", hash = "sha256:e78a6911cd72f9dec35031c6ec23584de6842bfbc4610a9678868d14cdfb0357", size = 31222, upload-time = "2025-06-17T18:47:34.051Z" } +sdist = { url = "https://files.pythonhosted.org/packages/27/dd/4270b2c5e2ee49316c3859e62293bd2ea8e382339d63ab7bbe9f39c0ec3b/latexcodec-3.0.1.tar.gz", hash = "sha256:e78a6911cd72f9dec35031c6ec23584de6842bfbc4610a9678868d14cdfb0357", size = 31222 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/40/23569737873cc9637fd488606347e9dd92b9fa37ba4fcda1f98ee5219a97/latexcodec-3.0.1-py3-none-any.whl", hash = "sha256:a9eb8200bff693f0437a69581f7579eb6bca25c4193515c09900ce76451e452e", size = 18532, upload-time = "2025-06-17T18:47:30.726Z" }, + { url = "https://files.pythonhosted.org/packages/b5/40/23569737873cc9637fd488606347e9dd92b9fa37ba4fcda1f98ee5219a97/latexcodec-3.0.1-py3-none-any.whl", hash = "sha256:a9eb8200bff693f0437a69581f7579eb6bca25c4193515c09900ce76451e452e", size = 18532 }, ] [[package]] @@ -1491,7 +1490,7 @@ dependencies = [ { name = "fs" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/09/96/35c67a8a318c782a9d36ce6dae30c4f441aff1c4341040fa9a873e6fb216/latextools-0.5.0-py3-none-any.whl", hash = "sha256:6e6bb6c8c98ca3e11a84da724c5c081cdc78ff29aaadbaadbe5ef66d327aa4bd", size = 27267, upload-time = "2023-02-26T10:38:36.797Z" }, + { url = "https://files.pythonhosted.org/packages/09/96/35c67a8a318c782a9d36ce6dae30c4f441aff1c4341040fa9a873e6fb216/latextools-0.5.0-py3-none-any.whl", hash = "sha256:6e6bb6c8c98ca3e11a84da724c5c081cdc78ff29aaadbaadbe5ef66d327aa4bd", size = 27267 }, ] [[package]] @@ -1506,38 +1505,38 @@ dependencies = [ { name = "scipy", version = "1.16.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ef/f8/76b240cda917e1c25afacd6ddde86b3ad34bfb33da4e33df0c389e2c3bec/ldpc-0.1.60.tar.gz", hash = "sha256:06152fcce834c2d46ee04add2102e7d90f9c86617e04113ae84deba9e84f17ba", size = 374066, upload-time = "2024-10-23T13:25:02.034Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/93/dbc2b7d95e05f0066b61598e1d74dda322dee5a6542972b074c61cc61116/ldpc-0.1.60-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b17c58620d96c7003f4d5428d8199d7807446ff0e6fc0c39832affa967370243", size = 574114, upload-time = "2024-10-23T13:24:08.42Z" }, - { url = "https://files.pythonhosted.org/packages/6e/cc/3b337f258e72e486924e6c5a5d723d0a03a81c0339f1ab5bbd7365a0788d/ldpc-0.1.60-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5103cce5713a338c7d2319ace5a555cfdefd9a33e81a4491c1e3973cc602bbad", size = 568538, upload-time = "2024-10-23T13:24:10.434Z" }, - { url = "https://files.pythonhosted.org/packages/d1/31/4364f966bc834cfb7012b68debb65f75f2d78acbb4ead70c858330b2ce99/ldpc-0.1.60-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28066a55b855de08da4a33c1349a486f79ee3e5f9883a42a14357320a71bf7e0", size = 1313121, upload-time = "2024-10-23T13:24:11.93Z" }, - { url = "https://files.pythonhosted.org/packages/02/80/deec8a03cf75043d791db61240139ce57bd35d4d6172b1add1f7a6a1a3ee/ldpc-0.1.60-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79e045cb7a03ec2d4eaf8405fe37f6f9b27c733a66de0f41a453a930b16a40d5", size = 1267499, upload-time = "2024-10-23T13:24:16.09Z" }, - { url = "https://files.pythonhosted.org/packages/a2/36/ff2c26dc96fd33f124f080d90b4aa6540e792589213c6deadd1910a913df/ldpc-0.1.60-cp310-cp310-win32.whl", hash = "sha256:dd42d119a0bb1b8ff70088adfe4266ba5f8c5768e81d6db989e818abacc857db", size = 523302, upload-time = "2024-10-23T13:24:19.706Z" }, - { url = "https://files.pythonhosted.org/packages/46/cb/ded17d77fbfb4a1e75270e93a5e7688252f76a05a773659835b61a767035/ldpc-0.1.60-cp310-cp310-win_amd64.whl", hash = "sha256:a29445a339b9069df96b2545cb9216034683ae85b5a5b59712c330327d320f23", size = 540886, upload-time = "2024-10-23T13:24:22.461Z" }, - { url = "https://files.pythonhosted.org/packages/4a/9a/e4e6d70f7c1c2d4faf1bcd3b1666e183b24fd581a6169cacfb3dab6f3e03/ldpc-0.1.60-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:35c8326f6ad7d8017ba89ec9fb9c2b2fdfc3cdbefebaedc17423519bd70d1a71", size = 573517, upload-time = "2024-10-23T13:24:23.609Z" }, - { url = "https://files.pythonhosted.org/packages/ad/77/383c6cdb2ef3818362a9654e6bafb5c7415c49f1fbb5c6dc9f988e8aa7b2/ldpc-0.1.60-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:411584c084470288d95737eb6de94cde2571459c15b880d9e8a4e552cd942393", size = 568029, upload-time = "2024-10-23T13:24:24.638Z" }, - { url = "https://files.pythonhosted.org/packages/40/1a/b05618c9533b4c4d0de8be8f23a68b69e311110d0e7d7e9a23ccf8b65056/ldpc-0.1.60-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1896ef67af5be3998aebba5e0b6110dbd02b119fed2e6bdc5f2738d26eccb7ea", size = 1384062, upload-time = "2024-10-23T13:24:26.442Z" }, - { url = "https://files.pythonhosted.org/packages/8a/24/0578140b2ed4c6ba3d56f03949c8e1a868c3060a240d9215b7665f637a5c/ldpc-0.1.60-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f83cda648d68998e98e817eae0e84b5057ebb3d6941db9855adf3f0286000bd5", size = 1341428, upload-time = "2024-10-23T13:24:28.146Z" }, - { url = "https://files.pythonhosted.org/packages/19/34/955b40e8313817ad6853412f9207fdac5dfc94e061988554bf1b07345222/ldpc-0.1.60-cp311-cp311-win32.whl", hash = "sha256:eaa7fe7d813a1935908e4730605595c000f20efa3541f9ee0aa3cdb98c33de5f", size = 522250, upload-time = "2024-10-23T13:24:29.258Z" }, - { url = "https://files.pythonhosted.org/packages/09/25/c7cbbc4089eac07b5b335735370192ed87268ad52374f3c73b137cc31082/ldpc-0.1.60-cp311-cp311-win_amd64.whl", hash = "sha256:18b721d0a25b4b149e8b5cdbd8cae7d327c9eb445bdfaa84878f4e7ee87702a5", size = 541363, upload-time = "2024-10-23T13:24:30.339Z" }, - { url = "https://files.pythonhosted.org/packages/f7/a4/6d3b61e813ae14be8357ea6c5d182ae17147fb87ae7f7313a0ccae85880f/ldpc-0.1.60-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:85cd76ec06834bf4c1ccd69577328782e4cd7524f3cc15a92f220debabf86ce6", size = 573433, upload-time = "2024-10-23T13:24:31.401Z" }, - { url = "https://files.pythonhosted.org/packages/48/fd/917f8ec5ace1eb1e666a6cf00981b029417822983daa1a72fbbdfa21fa43/ldpc-0.1.60-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3bf499917617fda559160635d49f88ff8402de0b10e82121087f3c5c081dac4a", size = 568160, upload-time = "2024-10-23T13:24:32.402Z" }, - { url = "https://files.pythonhosted.org/packages/cf/54/74bab08c53059f94a1608eeb04f429efb5c1dd1d1d596de9f5a556bc44d9/ldpc-0.1.60-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f101742220f52d5fcd7cbe282d26b924bbfe4823feaa01c2da2aa7aa54e0318", size = 1410814, upload-time = "2024-10-23T13:24:33.461Z" }, - { url = "https://files.pythonhosted.org/packages/9d/d2/eb83817184d8e07f43b0f3c8a1928298282e8bd7cf59ca4c2e38719da248/ldpc-0.1.60-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdecbf7aa294066e5f0cab4f2b257980ddab910899a654a930a35c3dbc769974", size = 1362258, upload-time = "2024-10-23T13:24:34.748Z" }, - { url = "https://files.pythonhosted.org/packages/09/1c/75d0a99b6efa2b8fb3a59b26999ca74e532df4244691168c6f05532886b9/ldpc-0.1.60-cp312-cp312-win32.whl", hash = "sha256:d0c82887ede968b34eae89fe1ca8d98170586dfeefafee1bfee2f773d94469fe", size = 522158, upload-time = "2024-10-23T13:24:35.898Z" }, - { url = "https://files.pythonhosted.org/packages/ea/ec/a1abad143c61f08b1bd6aff180a4e7030b2e782ac152b1f43c3a2b5dd784/ldpc-0.1.60-cp312-cp312-win_amd64.whl", hash = "sha256:2d3d422ba4d2d9b8a94f3beed4888f6daa7e61c779dc905a030c39afea4a8708", size = 541313, upload-time = "2024-10-23T13:24:37.101Z" }, - { url = "https://files.pythonhosted.org/packages/6b/a7/e970595e94cfbfe6c66a6df0deff7425b754b2ac618eac0413c7055f0627/ldpc-0.1.60-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a108c65a00e8e064e627c09565e95b18ba9c9b7b309cfe1fa405285ef17d6832", size = 570176, upload-time = "2024-10-23T13:24:38.184Z" }, - { url = "https://files.pythonhosted.org/packages/39/13/b4a8560d76c9b623facf7450ec6055a3ccab4905edcdf829d6d3c9d20f12/ldpc-0.1.60-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42808fcf37ea58e2e61cc90c1f0dfe2326ef57f302ddbf80c9937963b7811159", size = 564834, upload-time = "2024-10-23T13:24:39.644Z" }, - { url = "https://files.pythonhosted.org/packages/07/a8/f3c08e292c6dbf544a76a422cebeb1228d660663330c5202eca04719dd44/ldpc-0.1.60-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ccb020863d62b51553431cd7986a85c4f6a7024ed5f7992796db7ac38672023", size = 1398979, upload-time = "2024-10-23T13:24:40.806Z" }, - { url = "https://files.pythonhosted.org/packages/7d/31/645b0f4e3f1ca1a493739d0de83c29321d53ab80127cee1910a89490679b/ldpc-0.1.60-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e32662918590b59fc16283e59f4be26f6011b16bc966de3eff93664a6a6eb858", size = 1353581, upload-time = "2024-10-23T13:24:42.384Z" }, - { url = "https://files.pythonhosted.org/packages/fa/50/dc4bd6efac99fa817f18a5501dbfc4b35daa7f40aad76de038a19d664e8d/ldpc-0.1.60-cp313-cp313-win32.whl", hash = "sha256:cb56fbfc2dc6ee3c13ead819c9c9c18d6aa6025b21cf583fd5ac29c7fa2492bc", size = 521161, upload-time = "2024-10-23T13:24:43.495Z" }, - { url = "https://files.pythonhosted.org/packages/e1/d8/f38f4c323beb2124880d9672668759a1c23185a4769b87144a001bb8022a/ldpc-0.1.60-cp313-cp313-win_amd64.whl", hash = "sha256:f277ea524ab80c59dc6ee6a95373e91b9fcae63abbb0f3979998d5aa6f608cf9", size = 540076, upload-time = "2024-10-23T13:24:44.47Z" }, - { url = "https://files.pythonhosted.org/packages/51/30/4c4ebe5dae12a475c0f04ffcd24891ba58910a5fa4748b8fc73c522ffe6c/ldpc-0.1.60-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c14cc88df29208a5d538e9d64567d27c2994dc2e8030eecd7f9c35aa5ff1da0e", size = 575952, upload-time = "2024-10-23T13:24:53.923Z" }, - { url = "https://files.pythonhosted.org/packages/3b/3c/22b6dc6fefd6b59f2edaa20b21190058f3d17cf30b7b19d2fb25cc3c6434/ldpc-0.1.60-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dde97f0d18a2c84bb7c6ef29f753e56a8114e7b49b7d11f34aa1bde2f3b4db43", size = 570238, upload-time = "2024-10-23T13:24:55.5Z" }, - { url = "https://files.pythonhosted.org/packages/fc/80/256b6e3799635534b0aada94d75d2b01cf1db932e3e06c57982fade30982/ldpc-0.1.60-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6241d9b34488323df07dfc10ddbb218098cb29c4329ab2b6aab214f2467a0dc", size = 1321533, upload-time = "2024-10-23T13:24:56.798Z" }, - { url = "https://files.pythonhosted.org/packages/4f/71/792c4c007219c26b69c72f00a340f227513f9eec9fc7b68d7a5cd1c987b5/ldpc-0.1.60-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1456605f3abdb34f05ecbe7496c7847546caa70801e875e01120791abd558cc2", size = 1276065, upload-time = "2024-10-23T13:24:57.921Z" }, - { url = "https://files.pythonhosted.org/packages/41/f8/b68c9c801519eeac44542ed751feec49962249dd16e8973548403b00eb12/ldpc-0.1.60-cp39-cp39-win32.whl", hash = "sha256:8f0870b6c07894ec55917180f6b6898180a28a2368be202c684229fa2269eeb5", size = 525169, upload-time = "2024-10-23T13:24:59.063Z" }, - { url = "https://files.pythonhosted.org/packages/c9/0b/1db19bcfb798464d5eee91eb87aa309bac694171c20e444cc8e2bc6b8af6/ldpc-0.1.60-cp39-cp39-win_amd64.whl", hash = "sha256:e9a1f26465b95d5b732c3dbdaf1556275c34fc4b115aef40a9e3b3d99bbf460a", size = 542584, upload-time = "2024-10-23T13:25:00.562Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ef/f8/76b240cda917e1c25afacd6ddde86b3ad34bfb33da4e33df0c389e2c3bec/ldpc-0.1.60.tar.gz", hash = "sha256:06152fcce834c2d46ee04add2102e7d90f9c86617e04113ae84deba9e84f17ba", size = 374066 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/93/dbc2b7d95e05f0066b61598e1d74dda322dee5a6542972b074c61cc61116/ldpc-0.1.60-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b17c58620d96c7003f4d5428d8199d7807446ff0e6fc0c39832affa967370243", size = 574114 }, + { url = "https://files.pythonhosted.org/packages/6e/cc/3b337f258e72e486924e6c5a5d723d0a03a81c0339f1ab5bbd7365a0788d/ldpc-0.1.60-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5103cce5713a338c7d2319ace5a555cfdefd9a33e81a4491c1e3973cc602bbad", size = 568538 }, + { url = "https://files.pythonhosted.org/packages/d1/31/4364f966bc834cfb7012b68debb65f75f2d78acbb4ead70c858330b2ce99/ldpc-0.1.60-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28066a55b855de08da4a33c1349a486f79ee3e5f9883a42a14357320a71bf7e0", size = 1313121 }, + { url = "https://files.pythonhosted.org/packages/02/80/deec8a03cf75043d791db61240139ce57bd35d4d6172b1add1f7a6a1a3ee/ldpc-0.1.60-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79e045cb7a03ec2d4eaf8405fe37f6f9b27c733a66de0f41a453a930b16a40d5", size = 1267499 }, + { url = "https://files.pythonhosted.org/packages/a2/36/ff2c26dc96fd33f124f080d90b4aa6540e792589213c6deadd1910a913df/ldpc-0.1.60-cp310-cp310-win32.whl", hash = "sha256:dd42d119a0bb1b8ff70088adfe4266ba5f8c5768e81d6db989e818abacc857db", size = 523302 }, + { url = "https://files.pythonhosted.org/packages/46/cb/ded17d77fbfb4a1e75270e93a5e7688252f76a05a773659835b61a767035/ldpc-0.1.60-cp310-cp310-win_amd64.whl", hash = "sha256:a29445a339b9069df96b2545cb9216034683ae85b5a5b59712c330327d320f23", size = 540886 }, + { url = "https://files.pythonhosted.org/packages/4a/9a/e4e6d70f7c1c2d4faf1bcd3b1666e183b24fd581a6169cacfb3dab6f3e03/ldpc-0.1.60-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:35c8326f6ad7d8017ba89ec9fb9c2b2fdfc3cdbefebaedc17423519bd70d1a71", size = 573517 }, + { url = "https://files.pythonhosted.org/packages/ad/77/383c6cdb2ef3818362a9654e6bafb5c7415c49f1fbb5c6dc9f988e8aa7b2/ldpc-0.1.60-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:411584c084470288d95737eb6de94cde2571459c15b880d9e8a4e552cd942393", size = 568029 }, + { url = "https://files.pythonhosted.org/packages/40/1a/b05618c9533b4c4d0de8be8f23a68b69e311110d0e7d7e9a23ccf8b65056/ldpc-0.1.60-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1896ef67af5be3998aebba5e0b6110dbd02b119fed2e6bdc5f2738d26eccb7ea", size = 1384062 }, + { url = "https://files.pythonhosted.org/packages/8a/24/0578140b2ed4c6ba3d56f03949c8e1a868c3060a240d9215b7665f637a5c/ldpc-0.1.60-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f83cda648d68998e98e817eae0e84b5057ebb3d6941db9855adf3f0286000bd5", size = 1341428 }, + { url = "https://files.pythonhosted.org/packages/19/34/955b40e8313817ad6853412f9207fdac5dfc94e061988554bf1b07345222/ldpc-0.1.60-cp311-cp311-win32.whl", hash = "sha256:eaa7fe7d813a1935908e4730605595c000f20efa3541f9ee0aa3cdb98c33de5f", size = 522250 }, + { url = "https://files.pythonhosted.org/packages/09/25/c7cbbc4089eac07b5b335735370192ed87268ad52374f3c73b137cc31082/ldpc-0.1.60-cp311-cp311-win_amd64.whl", hash = "sha256:18b721d0a25b4b149e8b5cdbd8cae7d327c9eb445bdfaa84878f4e7ee87702a5", size = 541363 }, + { url = "https://files.pythonhosted.org/packages/f7/a4/6d3b61e813ae14be8357ea6c5d182ae17147fb87ae7f7313a0ccae85880f/ldpc-0.1.60-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:85cd76ec06834bf4c1ccd69577328782e4cd7524f3cc15a92f220debabf86ce6", size = 573433 }, + { url = "https://files.pythonhosted.org/packages/48/fd/917f8ec5ace1eb1e666a6cf00981b029417822983daa1a72fbbdfa21fa43/ldpc-0.1.60-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3bf499917617fda559160635d49f88ff8402de0b10e82121087f3c5c081dac4a", size = 568160 }, + { url = "https://files.pythonhosted.org/packages/cf/54/74bab08c53059f94a1608eeb04f429efb5c1dd1d1d596de9f5a556bc44d9/ldpc-0.1.60-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f101742220f52d5fcd7cbe282d26b924bbfe4823feaa01c2da2aa7aa54e0318", size = 1410814 }, + { url = "https://files.pythonhosted.org/packages/9d/d2/eb83817184d8e07f43b0f3c8a1928298282e8bd7cf59ca4c2e38719da248/ldpc-0.1.60-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdecbf7aa294066e5f0cab4f2b257980ddab910899a654a930a35c3dbc769974", size = 1362258 }, + { url = "https://files.pythonhosted.org/packages/09/1c/75d0a99b6efa2b8fb3a59b26999ca74e532df4244691168c6f05532886b9/ldpc-0.1.60-cp312-cp312-win32.whl", hash = "sha256:d0c82887ede968b34eae89fe1ca8d98170586dfeefafee1bfee2f773d94469fe", size = 522158 }, + { url = "https://files.pythonhosted.org/packages/ea/ec/a1abad143c61f08b1bd6aff180a4e7030b2e782ac152b1f43c3a2b5dd784/ldpc-0.1.60-cp312-cp312-win_amd64.whl", hash = "sha256:2d3d422ba4d2d9b8a94f3beed4888f6daa7e61c779dc905a030c39afea4a8708", size = 541313 }, + { url = "https://files.pythonhosted.org/packages/6b/a7/e970595e94cfbfe6c66a6df0deff7425b754b2ac618eac0413c7055f0627/ldpc-0.1.60-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a108c65a00e8e064e627c09565e95b18ba9c9b7b309cfe1fa405285ef17d6832", size = 570176 }, + { url = "https://files.pythonhosted.org/packages/39/13/b4a8560d76c9b623facf7450ec6055a3ccab4905edcdf829d6d3c9d20f12/ldpc-0.1.60-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42808fcf37ea58e2e61cc90c1f0dfe2326ef57f302ddbf80c9937963b7811159", size = 564834 }, + { url = "https://files.pythonhosted.org/packages/07/a8/f3c08e292c6dbf544a76a422cebeb1228d660663330c5202eca04719dd44/ldpc-0.1.60-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ccb020863d62b51553431cd7986a85c4f6a7024ed5f7992796db7ac38672023", size = 1398979 }, + { url = "https://files.pythonhosted.org/packages/7d/31/645b0f4e3f1ca1a493739d0de83c29321d53ab80127cee1910a89490679b/ldpc-0.1.60-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e32662918590b59fc16283e59f4be26f6011b16bc966de3eff93664a6a6eb858", size = 1353581 }, + { url = "https://files.pythonhosted.org/packages/fa/50/dc4bd6efac99fa817f18a5501dbfc4b35daa7f40aad76de038a19d664e8d/ldpc-0.1.60-cp313-cp313-win32.whl", hash = "sha256:cb56fbfc2dc6ee3c13ead819c9c9c18d6aa6025b21cf583fd5ac29c7fa2492bc", size = 521161 }, + { url = "https://files.pythonhosted.org/packages/e1/d8/f38f4c323beb2124880d9672668759a1c23185a4769b87144a001bb8022a/ldpc-0.1.60-cp313-cp313-win_amd64.whl", hash = "sha256:f277ea524ab80c59dc6ee6a95373e91b9fcae63abbb0f3979998d5aa6f608cf9", size = 540076 }, + { url = "https://files.pythonhosted.org/packages/51/30/4c4ebe5dae12a475c0f04ffcd24891ba58910a5fa4748b8fc73c522ffe6c/ldpc-0.1.60-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c14cc88df29208a5d538e9d64567d27c2994dc2e8030eecd7f9c35aa5ff1da0e", size = 575952 }, + { url = "https://files.pythonhosted.org/packages/3b/3c/22b6dc6fefd6b59f2edaa20b21190058f3d17cf30b7b19d2fb25cc3c6434/ldpc-0.1.60-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dde97f0d18a2c84bb7c6ef29f753e56a8114e7b49b7d11f34aa1bde2f3b4db43", size = 570238 }, + { url = "https://files.pythonhosted.org/packages/fc/80/256b6e3799635534b0aada94d75d2b01cf1db932e3e06c57982fade30982/ldpc-0.1.60-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6241d9b34488323df07dfc10ddbb218098cb29c4329ab2b6aab214f2467a0dc", size = 1321533 }, + { url = "https://files.pythonhosted.org/packages/4f/71/792c4c007219c26b69c72f00a340f227513f9eec9fc7b68d7a5cd1c987b5/ldpc-0.1.60-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1456605f3abdb34f05ecbe7496c7847546caa70801e875e01120791abd558cc2", size = 1276065 }, + { url = "https://files.pythonhosted.org/packages/41/f8/b68c9c801519eeac44542ed751feec49962249dd16e8973548403b00eb12/ldpc-0.1.60-cp39-cp39-win32.whl", hash = "sha256:8f0870b6c07894ec55917180f6b6898180a28a2368be202c684229fa2269eeb5", size = 525169 }, + { url = "https://files.pythonhosted.org/packages/c9/0b/1db19bcfb798464d5eee91eb87aa309bac694171c20e444cc8e2bc6b8af6/ldpc-0.1.60-cp39-cp39-win_amd64.whl", hash = "sha256:e9a1f26465b95d5b732c3dbdaf1556275c34fc4b115aef40a9e3b3d99bbf460a", size = 542584 }, ] [[package]] @@ -1548,28 +1547,28 @@ resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/3d/f513755f285db51ab363a53e898b85562e950f79a2e6767a364530c2f645/llvmlite-0.43.0.tar.gz", hash = "sha256:ae2b5b5c3ef67354824fb75517c8db5fbe93bc02cd9671f3c62271626bc041d5", size = 157069, upload-time = "2024-06-13T18:09:32.641Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/23/ff/6ca7e98998b573b4bd6566f15c35e5c8bea829663a6df0c7aa55ab559da9/llvmlite-0.43.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a289af9a1687c6cf463478f0fa8e8aa3b6fb813317b0d70bf1ed0759eab6f761", size = 31064408, upload-time = "2024-06-13T18:08:13.462Z" }, - { url = "https://files.pythonhosted.org/packages/ca/5c/a27f9257f86f0cda3f764ff21d9f4217b9f6a0d45e7a39ecfa7905f524ce/llvmlite-0.43.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d4fd101f571a31acb1559ae1af30f30b1dc4b3186669f92ad780e17c81e91bc", size = 28793153, upload-time = "2024-06-13T18:08:17.336Z" }, - { url = "https://files.pythonhosted.org/packages/7e/3c/4410f670ad0a911227ea2ecfcba9f672a77cf1924df5280c4562032ec32d/llvmlite-0.43.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d434ec7e2ce3cc8f452d1cd9a28591745de022f931d67be688a737320dfcead", size = 42857276, upload-time = "2024-06-13T18:08:21.071Z" }, - { url = "https://files.pythonhosted.org/packages/c6/21/2ffbab5714e72f2483207b4a1de79b2eecd9debbf666ff4e7067bcc5c134/llvmlite-0.43.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6912a87782acdff6eb8bf01675ed01d60ca1f2551f8176a300a886f09e836a6a", size = 43871781, upload-time = "2024-06-13T18:08:26.32Z" }, - { url = "https://files.pythonhosted.org/packages/f2/26/b5478037c453554a61625ef1125f7e12bb1429ae11c6376f47beba9b0179/llvmlite-0.43.0-cp310-cp310-win_amd64.whl", hash = "sha256:14f0e4bf2fd2d9a75a3534111e8ebeb08eda2f33e9bdd6dfa13282afacdde0ed", size = 28123487, upload-time = "2024-06-13T18:08:30.348Z" }, - { url = "https://files.pythonhosted.org/packages/95/8c/de3276d773ab6ce3ad676df5fab5aac19696b2956319d65d7dd88fb10f19/llvmlite-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8d0618cb9bfe40ac38a9633f2493d4d4e9fcc2f438d39a4e854f39cc0f5f98", size = 31064409, upload-time = "2024-06-13T18:08:34.006Z" }, - { url = "https://files.pythonhosted.org/packages/ee/e1/38deed89ced4cf378c61e232265cfe933ccde56ae83c901aa68b477d14b1/llvmlite-0.43.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0a9a1a39d4bf3517f2af9d23d479b4175ead205c592ceeb8b89af48a327ea57", size = 28793149, upload-time = "2024-06-13T18:08:37.42Z" }, - { url = "https://files.pythonhosted.org/packages/2f/b2/4429433eb2dc8379e2cb582502dca074c23837f8fd009907f78a24de4c25/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1da416ab53e4f7f3bc8d4eeba36d801cc1894b9fbfbf2022b29b6bad34a7df2", size = 42857277, upload-time = "2024-06-13T18:08:40.822Z" }, - { url = "https://files.pythonhosted.org/packages/6b/99/5d00a7d671b1ba1751fc9f19d3b36f3300774c6eebe2bcdb5f6191763eb4/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977525a1e5f4059316b183fb4fd34fa858c9eade31f165427a3977c95e3ee749", size = 43871781, upload-time = "2024-06-13T18:08:46.41Z" }, - { url = "https://files.pythonhosted.org/packages/20/ab/ed5ed3688c6ba4f0b8d789da19fd8e30a9cf7fc5852effe311bc5aefe73e/llvmlite-0.43.0-cp311-cp311-win_amd64.whl", hash = "sha256:d5bd550001d26450bd90777736c69d68c487d17bf371438f975229b2b8241a91", size = 28107433, upload-time = "2024-06-13T18:08:50.834Z" }, - { url = "https://files.pythonhosted.org/packages/0b/67/9443509e5d2b6d8587bae3ede5598fa8bd586b1c7701696663ea8af15b5b/llvmlite-0.43.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f99b600aa7f65235a5a05d0b9a9f31150c390f31261f2a0ba678e26823ec38f7", size = 31064409, upload-time = "2024-06-13T18:08:54.375Z" }, - { url = "https://files.pythonhosted.org/packages/a2/9c/24139d3712d2d352e300c39c0e00d167472c08b3bd350c3c33d72c88ff8d/llvmlite-0.43.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:35d80d61d0cda2d767f72de99450766250560399edc309da16937b93d3b676e7", size = 28793145, upload-time = "2024-06-13T18:08:57.953Z" }, - { url = "https://files.pythonhosted.org/packages/bf/f1/4c205a48488e574ee9f6505d50e84370a978c90f08dab41a42d8f2c576b6/llvmlite-0.43.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eccce86bba940bae0d8d48ed925f21dbb813519169246e2ab292b5092aba121f", size = 42857276, upload-time = "2024-06-13T18:09:02.067Z" }, - { url = "https://files.pythonhosted.org/packages/00/5f/323c4d56e8401c50185fd0e875fcf06b71bf825a863699be1eb10aa2a9cb/llvmlite-0.43.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df6509e1507ca0760787a199d19439cc887bfd82226f5af746d6977bd9f66844", size = 43871781, upload-time = "2024-06-13T18:09:06.667Z" }, - { url = "https://files.pythonhosted.org/packages/c6/94/dea10e263655ce78d777e78d904903faae39d1fc440762be4a9dc46bed49/llvmlite-0.43.0-cp312-cp312-win_amd64.whl", hash = "sha256:7a2872ee80dcf6b5dbdc838763d26554c2a18aa833d31a2635bff16aafefb9c9", size = 28107442, upload-time = "2024-06-13T18:09:10.709Z" }, - { url = "https://files.pythonhosted.org/packages/2a/73/12925b1bbb3c2beb6d96f892ef5b4d742c34f00ddb9f4a125e9e87b22f52/llvmlite-0.43.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cd2a7376f7b3367019b664c21f0c61766219faa3b03731113ead75107f3b66c", size = 31064410, upload-time = "2024-06-13T18:09:14.091Z" }, - { url = "https://files.pythonhosted.org/packages/cc/61/58c70aa0808a8cba825a7d98cc65bef4801b99328fba80837bfcb5fc767f/llvmlite-0.43.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18e9953c748b105668487b7c81a3e97b046d8abf95c4ddc0cd3c94f4e4651ae8", size = 28793145, upload-time = "2024-06-13T18:09:17.531Z" }, - { url = "https://files.pythonhosted.org/packages/c8/c6/9324eb5de2ba9d99cbed853d85ba7a318652a48e077797bec27cf40f911d/llvmlite-0.43.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74937acd22dc11b33946b67dca7680e6d103d6e90eeaaaf932603bec6fe7b03a", size = 42857276, upload-time = "2024-06-13T18:09:21.377Z" }, - { url = "https://files.pythonhosted.org/packages/e0/d0/889e9705107db7b1ec0767b03f15d7b95b4c4f9fdf91928ab1c7e9ffacf6/llvmlite-0.43.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc9efc739cc6ed760f795806f67889923f7274276f0eb45092a1473e40d9b867", size = 43871777, upload-time = "2024-06-13T18:09:25.76Z" }, - { url = "https://files.pythonhosted.org/packages/df/41/73cc26a2634b538cfe813f618c91e7e9960b8c163f8f0c94a2b0f008b9da/llvmlite-0.43.0-cp39-cp39-win_amd64.whl", hash = "sha256:47e147cdda9037f94b399bf03bfd8a6b6b1f2f90be94a454e3386f006455a9b4", size = 28123489, upload-time = "2024-06-13T18:09:29.78Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/9f/3d/f513755f285db51ab363a53e898b85562e950f79a2e6767a364530c2f645/llvmlite-0.43.0.tar.gz", hash = "sha256:ae2b5b5c3ef67354824fb75517c8db5fbe93bc02cd9671f3c62271626bc041d5", size = 157069 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/ff/6ca7e98998b573b4bd6566f15c35e5c8bea829663a6df0c7aa55ab559da9/llvmlite-0.43.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a289af9a1687c6cf463478f0fa8e8aa3b6fb813317b0d70bf1ed0759eab6f761", size = 31064408 }, + { url = "https://files.pythonhosted.org/packages/ca/5c/a27f9257f86f0cda3f764ff21d9f4217b9f6a0d45e7a39ecfa7905f524ce/llvmlite-0.43.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d4fd101f571a31acb1559ae1af30f30b1dc4b3186669f92ad780e17c81e91bc", size = 28793153 }, + { url = "https://files.pythonhosted.org/packages/7e/3c/4410f670ad0a911227ea2ecfcba9f672a77cf1924df5280c4562032ec32d/llvmlite-0.43.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d434ec7e2ce3cc8f452d1cd9a28591745de022f931d67be688a737320dfcead", size = 42857276 }, + { url = "https://files.pythonhosted.org/packages/c6/21/2ffbab5714e72f2483207b4a1de79b2eecd9debbf666ff4e7067bcc5c134/llvmlite-0.43.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6912a87782acdff6eb8bf01675ed01d60ca1f2551f8176a300a886f09e836a6a", size = 43871781 }, + { url = "https://files.pythonhosted.org/packages/f2/26/b5478037c453554a61625ef1125f7e12bb1429ae11c6376f47beba9b0179/llvmlite-0.43.0-cp310-cp310-win_amd64.whl", hash = "sha256:14f0e4bf2fd2d9a75a3534111e8ebeb08eda2f33e9bdd6dfa13282afacdde0ed", size = 28123487 }, + { url = "https://files.pythonhosted.org/packages/95/8c/de3276d773ab6ce3ad676df5fab5aac19696b2956319d65d7dd88fb10f19/llvmlite-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8d0618cb9bfe40ac38a9633f2493d4d4e9fcc2f438d39a4e854f39cc0f5f98", size = 31064409 }, + { url = "https://files.pythonhosted.org/packages/ee/e1/38deed89ced4cf378c61e232265cfe933ccde56ae83c901aa68b477d14b1/llvmlite-0.43.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0a9a1a39d4bf3517f2af9d23d479b4175ead205c592ceeb8b89af48a327ea57", size = 28793149 }, + { url = "https://files.pythonhosted.org/packages/2f/b2/4429433eb2dc8379e2cb582502dca074c23837f8fd009907f78a24de4c25/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1da416ab53e4f7f3bc8d4eeba36d801cc1894b9fbfbf2022b29b6bad34a7df2", size = 42857277 }, + { url = "https://files.pythonhosted.org/packages/6b/99/5d00a7d671b1ba1751fc9f19d3b36f3300774c6eebe2bcdb5f6191763eb4/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977525a1e5f4059316b183fb4fd34fa858c9eade31f165427a3977c95e3ee749", size = 43871781 }, + { url = "https://files.pythonhosted.org/packages/20/ab/ed5ed3688c6ba4f0b8d789da19fd8e30a9cf7fc5852effe311bc5aefe73e/llvmlite-0.43.0-cp311-cp311-win_amd64.whl", hash = "sha256:d5bd550001d26450bd90777736c69d68c487d17bf371438f975229b2b8241a91", size = 28107433 }, + { url = "https://files.pythonhosted.org/packages/0b/67/9443509e5d2b6d8587bae3ede5598fa8bd586b1c7701696663ea8af15b5b/llvmlite-0.43.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f99b600aa7f65235a5a05d0b9a9f31150c390f31261f2a0ba678e26823ec38f7", size = 31064409 }, + { url = "https://files.pythonhosted.org/packages/a2/9c/24139d3712d2d352e300c39c0e00d167472c08b3bd350c3c33d72c88ff8d/llvmlite-0.43.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:35d80d61d0cda2d767f72de99450766250560399edc309da16937b93d3b676e7", size = 28793145 }, + { url = "https://files.pythonhosted.org/packages/bf/f1/4c205a48488e574ee9f6505d50e84370a978c90f08dab41a42d8f2c576b6/llvmlite-0.43.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eccce86bba940bae0d8d48ed925f21dbb813519169246e2ab292b5092aba121f", size = 42857276 }, + { url = "https://files.pythonhosted.org/packages/00/5f/323c4d56e8401c50185fd0e875fcf06b71bf825a863699be1eb10aa2a9cb/llvmlite-0.43.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df6509e1507ca0760787a199d19439cc887bfd82226f5af746d6977bd9f66844", size = 43871781 }, + { url = "https://files.pythonhosted.org/packages/c6/94/dea10e263655ce78d777e78d904903faae39d1fc440762be4a9dc46bed49/llvmlite-0.43.0-cp312-cp312-win_amd64.whl", hash = "sha256:7a2872ee80dcf6b5dbdc838763d26554c2a18aa833d31a2635bff16aafefb9c9", size = 28107442 }, + { url = "https://files.pythonhosted.org/packages/2a/73/12925b1bbb3c2beb6d96f892ef5b4d742c34f00ddb9f4a125e9e87b22f52/llvmlite-0.43.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cd2a7376f7b3367019b664c21f0c61766219faa3b03731113ead75107f3b66c", size = 31064410 }, + { url = "https://files.pythonhosted.org/packages/cc/61/58c70aa0808a8cba825a7d98cc65bef4801b99328fba80837bfcb5fc767f/llvmlite-0.43.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18e9953c748b105668487b7c81a3e97b046d8abf95c4ddc0cd3c94f4e4651ae8", size = 28793145 }, + { url = "https://files.pythonhosted.org/packages/c8/c6/9324eb5de2ba9d99cbed853d85ba7a318652a48e077797bec27cf40f911d/llvmlite-0.43.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74937acd22dc11b33946b67dca7680e6d103d6e90eeaaaf932603bec6fe7b03a", size = 42857276 }, + { url = "https://files.pythonhosted.org/packages/e0/d0/889e9705107db7b1ec0767b03f15d7b95b4c4f9fdf91928ab1c7e9ffacf6/llvmlite-0.43.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc9efc739cc6ed760f795806f67889923f7274276f0eb45092a1473e40d9b867", size = 43871777 }, + { url = "https://files.pythonhosted.org/packages/df/41/73cc26a2634b538cfe813f618c91e7e9960b8c163f8f0c94a2b0f008b9da/llvmlite-0.43.0-cp39-cp39-win_amd64.whl", hash = "sha256:47e147cdda9037f94b399bf03bfd8a6b6b1f2f90be94a454e3386f006455a9b4", size = 28123489 }, ] [[package]] @@ -1582,28 +1581,28 @@ resolution-markers = [ "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] -sdist = { url = "https://files.pythonhosted.org/packages/89/6a/95a3d3610d5c75293d5dbbb2a76480d5d4eeba641557b69fe90af6c5b84e/llvmlite-0.44.0.tar.gz", hash = "sha256:07667d66a5d150abed9157ab6c0b9393c9356f229784a4385c02f99e94fc94d4", size = 171880, upload-time = "2025-01-20T11:14:41.342Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/75/d4863ddfd8ab5f6e70f4504cf8cc37f4e986ec6910f4ef8502bb7d3c1c71/llvmlite-0.44.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:9fbadbfba8422123bab5535b293da1cf72f9f478a65645ecd73e781f962ca614", size = 28132306, upload-time = "2025-01-20T11:12:18.634Z" }, - { url = "https://files.pythonhosted.org/packages/37/d9/6e8943e1515d2f1003e8278819ec03e4e653e2eeb71e4d00de6cfe59424e/llvmlite-0.44.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cccf8eb28f24840f2689fb1a45f9c0f7e582dd24e088dcf96e424834af11f791", size = 26201096, upload-time = "2025-01-20T11:12:24.544Z" }, - { url = "https://files.pythonhosted.org/packages/aa/46/8ffbc114def88cc698906bf5acab54ca9fdf9214fe04aed0e71731fb3688/llvmlite-0.44.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7202b678cdf904823c764ee0fe2dfe38a76981f4c1e51715b4cb5abb6cf1d9e8", size = 42361859, upload-time = "2025-01-20T11:12:31.839Z" }, - { url = "https://files.pythonhosted.org/packages/30/1c/9366b29ab050a726af13ebaae8d0dff00c3c58562261c79c635ad4f5eb71/llvmlite-0.44.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40526fb5e313d7b96bda4cbb2c85cd5374e04d80732dd36a282d72a560bb6408", size = 41184199, upload-time = "2025-01-20T11:12:40.049Z" }, - { url = "https://files.pythonhosted.org/packages/69/07/35e7c594b021ecb1938540f5bce543ddd8713cff97f71d81f021221edc1b/llvmlite-0.44.0-cp310-cp310-win_amd64.whl", hash = "sha256:41e3839150db4330e1b2716c0be3b5c4672525b4c9005e17c7597f835f351ce2", size = 30332381, upload-time = "2025-01-20T11:12:47.054Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e2/86b245397052386595ad726f9742e5223d7aea999b18c518a50e96c3aca4/llvmlite-0.44.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:eed7d5f29136bda63b6d7804c279e2b72e08c952b7c5df61f45db408e0ee52f3", size = 28132305, upload-time = "2025-01-20T11:12:53.936Z" }, - { url = "https://files.pythonhosted.org/packages/ff/ec/506902dc6870249fbe2466d9cf66d531265d0f3a1157213c8f986250c033/llvmlite-0.44.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ace564d9fa44bb91eb6e6d8e7754977783c68e90a471ea7ce913bff30bd62427", size = 26201090, upload-time = "2025-01-20T11:12:59.847Z" }, - { url = "https://files.pythonhosted.org/packages/99/fe/d030f1849ebb1f394bb3f7adad5e729b634fb100515594aca25c354ffc62/llvmlite-0.44.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5d22c3bfc842668168a786af4205ec8e3ad29fb1bc03fd11fd48460d0df64c1", size = 42361858, upload-time = "2025-01-20T11:13:07.623Z" }, - { url = "https://files.pythonhosted.org/packages/d7/7a/ce6174664b9077fc673d172e4c888cb0b128e707e306bc33fff8c2035f0d/llvmlite-0.44.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f01a394e9c9b7b1d4e63c327b096d10f6f0ed149ef53d38a09b3749dcf8c9610", size = 41184200, upload-time = "2025-01-20T11:13:20.058Z" }, - { url = "https://files.pythonhosted.org/packages/5f/c6/258801143975a6d09a373f2641237992496e15567b907a4d401839d671b8/llvmlite-0.44.0-cp311-cp311-win_amd64.whl", hash = "sha256:d8489634d43c20cd0ad71330dde1d5bc7b9966937a263ff1ec1cebb90dc50955", size = 30331193, upload-time = "2025-01-20T11:13:26.976Z" }, - { url = "https://files.pythonhosted.org/packages/15/86/e3c3195b92e6e492458f16d233e58a1a812aa2bfbef9bdd0fbafcec85c60/llvmlite-0.44.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:1d671a56acf725bf1b531d5ef76b86660a5ab8ef19bb6a46064a705c6ca80aad", size = 28132297, upload-time = "2025-01-20T11:13:32.57Z" }, - { url = "https://files.pythonhosted.org/packages/d6/53/373b6b8be67b9221d12b24125fd0ec56b1078b660eeae266ec388a6ac9a0/llvmlite-0.44.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f79a728e0435493611c9f405168682bb75ffd1fbe6fc360733b850c80a026db", size = 26201105, upload-time = "2025-01-20T11:13:38.744Z" }, - { url = "https://files.pythonhosted.org/packages/cb/da/8341fd3056419441286c8e26bf436923021005ece0bff5f41906476ae514/llvmlite-0.44.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0143a5ef336da14deaa8ec26c5449ad5b6a2b564df82fcef4be040b9cacfea9", size = 42361901, upload-time = "2025-01-20T11:13:46.711Z" }, - { url = "https://files.pythonhosted.org/packages/53/ad/d79349dc07b8a395a99153d7ce8b01d6fcdc9f8231355a5df55ded649b61/llvmlite-0.44.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d752f89e31b66db6f8da06df8b39f9b91e78c5feea1bf9e8c1fba1d1c24c065d", size = 41184247, upload-time = "2025-01-20T11:13:56.159Z" }, - { url = "https://files.pythonhosted.org/packages/e2/3b/a9a17366af80127bd09decbe2a54d8974b6d8b274b39bf47fbaedeec6307/llvmlite-0.44.0-cp312-cp312-win_amd64.whl", hash = "sha256:eae7e2d4ca8f88f89d315b48c6b741dcb925d6a1042da694aa16ab3dd4cbd3a1", size = 30332380, upload-time = "2025-01-20T11:14:02.442Z" }, - { url = "https://files.pythonhosted.org/packages/89/24/4c0ca705a717514c2092b18476e7a12c74d34d875e05e4d742618ebbf449/llvmlite-0.44.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:319bddd44e5f71ae2689859b7203080716448a3cd1128fb144fe5c055219d516", size = 28132306, upload-time = "2025-01-20T11:14:09.035Z" }, - { url = "https://files.pythonhosted.org/packages/01/cf/1dd5a60ba6aee7122ab9243fd614abcf22f36b0437cbbe1ccf1e3391461c/llvmlite-0.44.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c58867118bad04a0bb22a2e0068c693719658105e40009ffe95c7000fcde88e", size = 26201090, upload-time = "2025-01-20T11:14:15.401Z" }, - { url = "https://files.pythonhosted.org/packages/d2/1b/656f5a357de7135a3777bd735cc7c9b8f23b4d37465505bd0eaf4be9befe/llvmlite-0.44.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46224058b13c96af1365290bdfebe9a6264ae62fb79b2b55693deed11657a8bf", size = 42361904, upload-time = "2025-01-20T11:14:22.949Z" }, - { url = "https://files.pythonhosted.org/packages/d8/e1/12c5f20cb9168fb3464a34310411d5ad86e4163c8ff2d14a2b57e5cc6bac/llvmlite-0.44.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0097052c32bf721a4efc03bd109d335dfa57d9bffb3d4c24cc680711b8b4fc", size = 41184245, upload-time = "2025-01-20T11:14:31.731Z" }, - { url = "https://files.pythonhosted.org/packages/d0/81/e66fc86539293282fd9cb7c9417438e897f369e79ffb62e1ae5e5154d4dd/llvmlite-0.44.0-cp313-cp313-win_amd64.whl", hash = "sha256:2fb7c4f2fb86cbae6dca3db9ab203eeea0e22d73b99bc2341cdf9de93612e930", size = 30331193, upload-time = "2025-01-20T11:14:38.578Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/89/6a/95a3d3610d5c75293d5dbbb2a76480d5d4eeba641557b69fe90af6c5b84e/llvmlite-0.44.0.tar.gz", hash = "sha256:07667d66a5d150abed9157ab6c0b9393c9356f229784a4385c02f99e94fc94d4", size = 171880 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/75/d4863ddfd8ab5f6e70f4504cf8cc37f4e986ec6910f4ef8502bb7d3c1c71/llvmlite-0.44.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:9fbadbfba8422123bab5535b293da1cf72f9f478a65645ecd73e781f962ca614", size = 28132306 }, + { url = "https://files.pythonhosted.org/packages/37/d9/6e8943e1515d2f1003e8278819ec03e4e653e2eeb71e4d00de6cfe59424e/llvmlite-0.44.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cccf8eb28f24840f2689fb1a45f9c0f7e582dd24e088dcf96e424834af11f791", size = 26201096 }, + { url = "https://files.pythonhosted.org/packages/aa/46/8ffbc114def88cc698906bf5acab54ca9fdf9214fe04aed0e71731fb3688/llvmlite-0.44.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7202b678cdf904823c764ee0fe2dfe38a76981f4c1e51715b4cb5abb6cf1d9e8", size = 42361859 }, + { url = "https://files.pythonhosted.org/packages/30/1c/9366b29ab050a726af13ebaae8d0dff00c3c58562261c79c635ad4f5eb71/llvmlite-0.44.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40526fb5e313d7b96bda4cbb2c85cd5374e04d80732dd36a282d72a560bb6408", size = 41184199 }, + { url = "https://files.pythonhosted.org/packages/69/07/35e7c594b021ecb1938540f5bce543ddd8713cff97f71d81f021221edc1b/llvmlite-0.44.0-cp310-cp310-win_amd64.whl", hash = "sha256:41e3839150db4330e1b2716c0be3b5c4672525b4c9005e17c7597f835f351ce2", size = 30332381 }, + { url = "https://files.pythonhosted.org/packages/b5/e2/86b245397052386595ad726f9742e5223d7aea999b18c518a50e96c3aca4/llvmlite-0.44.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:eed7d5f29136bda63b6d7804c279e2b72e08c952b7c5df61f45db408e0ee52f3", size = 28132305 }, + { url = "https://files.pythonhosted.org/packages/ff/ec/506902dc6870249fbe2466d9cf66d531265d0f3a1157213c8f986250c033/llvmlite-0.44.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ace564d9fa44bb91eb6e6d8e7754977783c68e90a471ea7ce913bff30bd62427", size = 26201090 }, + { url = "https://files.pythonhosted.org/packages/99/fe/d030f1849ebb1f394bb3f7adad5e729b634fb100515594aca25c354ffc62/llvmlite-0.44.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5d22c3bfc842668168a786af4205ec8e3ad29fb1bc03fd11fd48460d0df64c1", size = 42361858 }, + { url = "https://files.pythonhosted.org/packages/d7/7a/ce6174664b9077fc673d172e4c888cb0b128e707e306bc33fff8c2035f0d/llvmlite-0.44.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f01a394e9c9b7b1d4e63c327b096d10f6f0ed149ef53d38a09b3749dcf8c9610", size = 41184200 }, + { url = "https://files.pythonhosted.org/packages/5f/c6/258801143975a6d09a373f2641237992496e15567b907a4d401839d671b8/llvmlite-0.44.0-cp311-cp311-win_amd64.whl", hash = "sha256:d8489634d43c20cd0ad71330dde1d5bc7b9966937a263ff1ec1cebb90dc50955", size = 30331193 }, + { url = "https://files.pythonhosted.org/packages/15/86/e3c3195b92e6e492458f16d233e58a1a812aa2bfbef9bdd0fbafcec85c60/llvmlite-0.44.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:1d671a56acf725bf1b531d5ef76b86660a5ab8ef19bb6a46064a705c6ca80aad", size = 28132297 }, + { url = "https://files.pythonhosted.org/packages/d6/53/373b6b8be67b9221d12b24125fd0ec56b1078b660eeae266ec388a6ac9a0/llvmlite-0.44.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f79a728e0435493611c9f405168682bb75ffd1fbe6fc360733b850c80a026db", size = 26201105 }, + { url = "https://files.pythonhosted.org/packages/cb/da/8341fd3056419441286c8e26bf436923021005ece0bff5f41906476ae514/llvmlite-0.44.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0143a5ef336da14deaa8ec26c5449ad5b6a2b564df82fcef4be040b9cacfea9", size = 42361901 }, + { url = "https://files.pythonhosted.org/packages/53/ad/d79349dc07b8a395a99153d7ce8b01d6fcdc9f8231355a5df55ded649b61/llvmlite-0.44.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d752f89e31b66db6f8da06df8b39f9b91e78c5feea1bf9e8c1fba1d1c24c065d", size = 41184247 }, + { url = "https://files.pythonhosted.org/packages/e2/3b/a9a17366af80127bd09decbe2a54d8974b6d8b274b39bf47fbaedeec6307/llvmlite-0.44.0-cp312-cp312-win_amd64.whl", hash = "sha256:eae7e2d4ca8f88f89d315b48c6b741dcb925d6a1042da694aa16ab3dd4cbd3a1", size = 30332380 }, + { url = "https://files.pythonhosted.org/packages/89/24/4c0ca705a717514c2092b18476e7a12c74d34d875e05e4d742618ebbf449/llvmlite-0.44.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:319bddd44e5f71ae2689859b7203080716448a3cd1128fb144fe5c055219d516", size = 28132306 }, + { url = "https://files.pythonhosted.org/packages/01/cf/1dd5a60ba6aee7122ab9243fd614abcf22f36b0437cbbe1ccf1e3391461c/llvmlite-0.44.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c58867118bad04a0bb22a2e0068c693719658105e40009ffe95c7000fcde88e", size = 26201090 }, + { url = "https://files.pythonhosted.org/packages/d2/1b/656f5a357de7135a3777bd735cc7c9b8f23b4d37465505bd0eaf4be9befe/llvmlite-0.44.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46224058b13c96af1365290bdfebe9a6264ae62fb79b2b55693deed11657a8bf", size = 42361904 }, + { url = "https://files.pythonhosted.org/packages/d8/e1/12c5f20cb9168fb3464a34310411d5ad86e4163c8ff2d14a2b57e5cc6bac/llvmlite-0.44.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0097052c32bf721a4efc03bd109d335dfa57d9bffb3d4c24cc680711b8b4fc", size = 41184245 }, + { url = "https://files.pythonhosted.org/packages/d0/81/e66fc86539293282fd9cb7c9417438e897f369e79ffb62e1ae5e5154d4dd/llvmlite-0.44.0-cp313-cp313-win_amd64.whl", hash = "sha256:2fb7c4f2fb86cbae6dca3db9ab203eeea0e22d73b99bc2341cdf9de93612e930", size = 30331193 }, ] [[package]] @@ -1613,77 +1612,77 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, ] [[package]] name = "markupsafe" version = "3.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357, upload-time = "2024-10-18T15:20:51.44Z" }, - { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393, upload-time = "2024-10-18T15:20:52.426Z" }, - { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732, upload-time = "2024-10-18T15:20:53.578Z" }, - { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866, upload-time = "2024-10-18T15:20:55.06Z" }, - { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964, upload-time = "2024-10-18T15:20:55.906Z" }, - { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977, upload-time = "2024-10-18T15:20:57.189Z" }, - { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366, upload-time = "2024-10-18T15:20:58.235Z" }, - { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091, upload-time = "2024-10-18T15:20:59.235Z" }, - { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065, upload-time = "2024-10-18T15:21:00.307Z" }, - { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514, upload-time = "2024-10-18T15:21:01.122Z" }, - { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353, upload-time = "2024-10-18T15:21:02.187Z" }, - { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392, upload-time = "2024-10-18T15:21:02.941Z" }, - { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984, upload-time = "2024-10-18T15:21:03.953Z" }, - { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120, upload-time = "2024-10-18T15:21:06.495Z" }, - { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032, upload-time = "2024-10-18T15:21:07.295Z" }, - { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057, upload-time = "2024-10-18T15:21:08.073Z" }, - { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359, upload-time = "2024-10-18T15:21:09.318Z" }, - { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306, upload-time = "2024-10-18T15:21:10.185Z" }, - { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094, upload-time = "2024-10-18T15:21:11.005Z" }, - { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521, upload-time = "2024-10-18T15:21:12.911Z" }, - { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload-time = "2024-10-18T15:21:13.777Z" }, - { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload-time = "2024-10-18T15:21:14.822Z" }, - { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload-time = "2024-10-18T15:21:15.642Z" }, - { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload-time = "2024-10-18T15:21:17.133Z" }, - { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload-time = "2024-10-18T15:21:18.064Z" }, - { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload-time = "2024-10-18T15:21:18.859Z" }, - { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload-time = "2024-10-18T15:21:19.671Z" }, - { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload-time = "2024-10-18T15:21:20.971Z" }, - { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload-time = "2024-10-18T15:21:22.646Z" }, - { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload-time = "2024-10-18T15:21:23.499Z" }, - { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" }, - { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" }, - { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" }, - { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" }, - { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" }, - { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" }, - { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" }, - { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" }, - { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" }, - { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" }, - { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" }, - { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" }, - { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" }, - { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" }, - { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" }, - { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" }, - { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" }, - { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" }, - { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" }, - { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, - { url = "https://files.pythonhosted.org/packages/a7/ea/9b1530c3fdeeca613faeb0fb5cbcf2389d816072fab72a71b45749ef6062/MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", size = 14344, upload-time = "2024-10-18T15:21:43.721Z" }, - { url = "https://files.pythonhosted.org/packages/4b/c2/fbdbfe48848e7112ab05e627e718e854d20192b674952d9042ebd8c9e5de/MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", size = 12389, upload-time = "2024-10-18T15:21:44.666Z" }, - { url = "https://files.pythonhosted.org/packages/f0/25/7a7c6e4dbd4f867d95d94ca15449e91e52856f6ed1905d58ef1de5e211d0/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", size = 21607, upload-time = "2024-10-18T15:21:45.452Z" }, - { url = "https://files.pythonhosted.org/packages/53/8f/f339c98a178f3c1e545622206b40986a4c3307fe39f70ccd3d9df9a9e425/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", size = 20728, upload-time = "2024-10-18T15:21:46.295Z" }, - { url = "https://files.pythonhosted.org/packages/1a/03/8496a1a78308456dbd50b23a385c69b41f2e9661c67ea1329849a598a8f9/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", size = 20826, upload-time = "2024-10-18T15:21:47.134Z" }, - { url = "https://files.pythonhosted.org/packages/e6/cf/0a490a4bd363048c3022f2f475c8c05582179bb179defcee4766fb3dcc18/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", size = 21843, upload-time = "2024-10-18T15:21:48.334Z" }, - { url = "https://files.pythonhosted.org/packages/19/a3/34187a78613920dfd3cdf68ef6ce5e99c4f3417f035694074beb8848cd77/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", size = 21219, upload-time = "2024-10-18T15:21:49.587Z" }, - { url = "https://files.pythonhosted.org/packages/17/d8/5811082f85bb88410ad7e452263af048d685669bbbfb7b595e8689152498/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", size = 20946, upload-time = "2024-10-18T15:21:50.441Z" }, - { url = "https://files.pythonhosted.org/packages/7c/31/bd635fb5989440d9365c5e3c47556cfea121c7803f5034ac843e8f37c2f2/MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", size = 15063, upload-time = "2024-10-18T15:21:51.385Z" }, - { url = "https://files.pythonhosted.org/packages/b3/73/085399401383ce949f727afec55ec3abd76648d04b9f22e1c0e99cb4bec3/MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", size = 15506, upload-time = "2024-10-18T15:21:52.974Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357 }, + { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393 }, + { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732 }, + { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866 }, + { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964 }, + { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977 }, + { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366 }, + { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091 }, + { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065 }, + { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514 }, + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, + { url = "https://files.pythonhosted.org/packages/a7/ea/9b1530c3fdeeca613faeb0fb5cbcf2389d816072fab72a71b45749ef6062/MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", size = 14344 }, + { url = "https://files.pythonhosted.org/packages/4b/c2/fbdbfe48848e7112ab05e627e718e854d20192b674952d9042ebd8c9e5de/MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", size = 12389 }, + { url = "https://files.pythonhosted.org/packages/f0/25/7a7c6e4dbd4f867d95d94ca15449e91e52856f6ed1905d58ef1de5e211d0/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", size = 21607 }, + { url = "https://files.pythonhosted.org/packages/53/8f/f339c98a178f3c1e545622206b40986a4c3307fe39f70ccd3d9df9a9e425/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", size = 20728 }, + { url = "https://files.pythonhosted.org/packages/1a/03/8496a1a78308456dbd50b23a385c69b41f2e9661c67ea1329849a598a8f9/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", size = 20826 }, + { url = "https://files.pythonhosted.org/packages/e6/cf/0a490a4bd363048c3022f2f475c8c05582179bb179defcee4766fb3dcc18/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", size = 21843 }, + { url = "https://files.pythonhosted.org/packages/19/a3/34187a78613920dfd3cdf68ef6ce5e99c4f3417f035694074beb8848cd77/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", size = 21219 }, + { url = "https://files.pythonhosted.org/packages/17/d8/5811082f85bb88410ad7e452263af048d685669bbbfb7b595e8689152498/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", size = 20946 }, + { url = "https://files.pythonhosted.org/packages/7c/31/bd635fb5989440d9365c5e3c47556cfea121c7803f5034ac843e8f37c2f2/MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", size = 15063 }, + { url = "https://files.pythonhosted.org/packages/b3/73/085399401383ce949f727afec55ec3abd76648d04b9f22e1c0e99cb4bec3/MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", size = 15506 }, ] [[package]] @@ -1706,48 +1705,48 @@ dependencies = [ { name = "pyparsing", marker = "python_full_version < '3.10'" }, { name = "python-dateutil", marker = "python_full_version < '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/17/1747b4154034befd0ed33b52538f5eb7752d05bb51c5e2a31470c3bc7d52/matplotlib-3.9.4.tar.gz", hash = "sha256:1e00e8be7393cbdc6fedfa8a6fba02cf3e83814b285db1c60b906a023ba41bc3", size = 36106529, upload-time = "2024-12-13T05:56:34.184Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/94/27d2e2c30d54b56c7b764acc1874a909e34d1965a427fc7092bb6a588b63/matplotlib-3.9.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c5fdd7abfb706dfa8d307af64a87f1a862879ec3cd8d0ec8637458f0885b9c50", size = 7885089, upload-time = "2024-12-13T05:54:24.224Z" }, - { url = "https://files.pythonhosted.org/packages/c6/25/828273307e40a68eb8e9df832b6b2aaad075864fdc1de4b1b81e40b09e48/matplotlib-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d89bc4e85e40a71d1477780366c27fb7c6494d293e1617788986f74e2a03d7ff", size = 7770600, upload-time = "2024-12-13T05:54:27.214Z" }, - { url = "https://files.pythonhosted.org/packages/f2/65/f841a422ec994da5123368d76b126acf4fc02ea7459b6e37c4891b555b83/matplotlib-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddf9f3c26aae695c5daafbf6b94e4c1a30d6cd617ba594bbbded3b33a1fcfa26", size = 8200138, upload-time = "2024-12-13T05:54:29.497Z" }, - { url = "https://files.pythonhosted.org/packages/07/06/272aca07a38804d93b6050813de41ca7ab0e29ba7a9dd098e12037c919a9/matplotlib-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18ebcf248030173b59a868fda1fe42397253f6698995b55e81e1f57431d85e50", size = 8312711, upload-time = "2024-12-13T05:54:34.396Z" }, - { url = "https://files.pythonhosted.org/packages/98/37/f13e23b233c526b7e27ad61be0a771894a079e0f7494a10d8d81557e0e9a/matplotlib-3.9.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974896ec43c672ec23f3f8c648981e8bc880ee163146e0312a9b8def2fac66f5", size = 9090622, upload-time = "2024-12-13T05:54:36.808Z" }, - { url = "https://files.pythonhosted.org/packages/4f/8c/b1f5bd2bd70e60f93b1b54c4d5ba7a992312021d0ddddf572f9a1a6d9348/matplotlib-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:4598c394ae9711cec135639374e70871fa36b56afae17bdf032a345be552a88d", size = 7828211, upload-time = "2024-12-13T05:54:40.596Z" }, - { url = "https://files.pythonhosted.org/packages/74/4b/65be7959a8fa118a3929b49a842de5b78bb55475236fcf64f3e308ff74a0/matplotlib-3.9.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4dd29641d9fb8bc4492420c5480398dd40a09afd73aebe4eb9d0071a05fbe0c", size = 7894430, upload-time = "2024-12-13T05:54:44.049Z" }, - { url = "https://files.pythonhosted.org/packages/e9/18/80f70d91896e0a517b4a051c3fd540daa131630fd75e02e250365353b253/matplotlib-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30e5b22e8bcfb95442bf7d48b0d7f3bdf4a450cbf68986ea45fca3d11ae9d099", size = 7780045, upload-time = "2024-12-13T05:54:46.414Z" }, - { url = "https://files.pythonhosted.org/packages/a2/73/ccb381026e3238c5c25c3609ba4157b2d1a617ec98d65a8b4ee4e1e74d02/matplotlib-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bb0030d1d447fd56dcc23b4c64a26e44e898f0416276cac1ebc25522e0ac249", size = 8209906, upload-time = "2024-12-13T05:54:49.459Z" }, - { url = "https://files.pythonhosted.org/packages/ab/33/1648da77b74741c89f5ea95cbf42a291b4b364f2660b316318811404ed97/matplotlib-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aca90ed222ac3565d2752b83dbb27627480d27662671e4d39da72e97f657a423", size = 8322873, upload-time = "2024-12-13T05:54:53.066Z" }, - { url = "https://files.pythonhosted.org/packages/57/d3/8447ba78bc6593c9044c372d1609f8ea10fb1e071e7a9e0747bea74fc16c/matplotlib-3.9.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a181b2aa2906c608fcae72f977a4a2d76e385578939891b91c2550c39ecf361e", size = 9099566, upload-time = "2024-12-13T05:54:55.522Z" }, - { url = "https://files.pythonhosted.org/packages/23/e1/4f0e237bf349c02ff9d1b6e7109f1a17f745263809b9714a8576dc17752b/matplotlib-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:1f6882828231eca17f501c4dcd98a05abb3f03d157fbc0769c6911fe08b6cfd3", size = 7838065, upload-time = "2024-12-13T05:54:58.337Z" }, - { url = "https://files.pythonhosted.org/packages/1a/2b/c918bf6c19d6445d1cefe3d2e42cb740fb997e14ab19d4daeb6a7ab8a157/matplotlib-3.9.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:dfc48d67e6661378a21c2983200a654b72b5c5cdbd5d2cf6e5e1ece860f0cc70", size = 7891131, upload-time = "2024-12-13T05:55:02.837Z" }, - { url = "https://files.pythonhosted.org/packages/c1/e5/b4e8fc601ca302afeeabf45f30e706a445c7979a180e3a978b78b2b681a4/matplotlib-3.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:47aef0fab8332d02d68e786eba8113ffd6f862182ea2999379dec9e237b7e483", size = 7776365, upload-time = "2024-12-13T05:55:05.158Z" }, - { url = "https://files.pythonhosted.org/packages/99/06/b991886c506506476e5d83625c5970c656a491b9f80161458fed94597808/matplotlib-3.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fba1f52c6b7dc764097f52fd9ab627b90db452c9feb653a59945de16752e965f", size = 8200707, upload-time = "2024-12-13T05:55:09.48Z" }, - { url = "https://files.pythonhosted.org/packages/c3/e2/556b627498cb27e61026f2d1ba86a78ad1b836fef0996bef5440e8bc9559/matplotlib-3.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:173ac3748acaac21afcc3fa1633924609ba1b87749006bc25051c52c422a5d00", size = 8313761, upload-time = "2024-12-13T05:55:12.95Z" }, - { url = "https://files.pythonhosted.org/packages/58/ff/165af33ec766ff818306ea88e91f9f60d2a6ed543be1eb122a98acbf3b0d/matplotlib-3.9.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320edea0cadc07007765e33f878b13b3738ffa9745c5f707705692df70ffe0e0", size = 9095284, upload-time = "2024-12-13T05:55:16.199Z" }, - { url = "https://files.pythonhosted.org/packages/9f/8b/3d0c7a002db3b1ed702731c2a9a06d78d035f1f2fb0fb936a8e43cc1e9f4/matplotlib-3.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a4a4cfc82330b27042a7169533da7991e8789d180dd5b3daeaee57d75cd5a03b", size = 7841160, upload-time = "2024-12-13T05:55:19.991Z" }, - { url = "https://files.pythonhosted.org/packages/49/b1/999f89a7556d101b23a2f0b54f1b6e140d73f56804da1398f2f0bc0924bc/matplotlib-3.9.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37eeffeeca3c940985b80f5b9a7b95ea35671e0e7405001f249848d2b62351b6", size = 7891499, upload-time = "2024-12-13T05:55:22.142Z" }, - { url = "https://files.pythonhosted.org/packages/87/7b/06a32b13a684977653396a1bfcd34d4e7539c5d55c8cbfaa8ae04d47e4a9/matplotlib-3.9.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3e7465ac859ee4abcb0d836137cd8414e7bb7ad330d905abced457217d4f0f45", size = 7776802, upload-time = "2024-12-13T05:55:25.947Z" }, - { url = "https://files.pythonhosted.org/packages/65/87/ac498451aff739e515891bbb92e566f3c7ef31891aaa878402a71f9b0910/matplotlib-3.9.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4c12302c34afa0cf061bea23b331e747e5e554b0fa595c96e01c7b75bc3b858", size = 8200802, upload-time = "2024-12-13T05:55:28.461Z" }, - { url = "https://files.pythonhosted.org/packages/f8/6b/9eb761c00e1cb838f6c92e5f25dcda3f56a87a52f6cb8fdfa561e6cf6a13/matplotlib-3.9.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b8c97917f21b75e72108b97707ba3d48f171541a74aa2a56df7a40626bafc64", size = 8313880, upload-time = "2024-12-13T05:55:30.965Z" }, - { url = "https://files.pythonhosted.org/packages/d7/a2/c8eaa600e2085eec7e38cbbcc58a30fc78f8224939d31d3152bdafc01fd1/matplotlib-3.9.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0229803bd7e19271b03cb09f27db76c918c467aa4ce2ae168171bc67c3f508df", size = 9094637, upload-time = "2024-12-13T05:55:33.701Z" }, - { url = "https://files.pythonhosted.org/packages/71/1f/c6e1daea55b7bfeb3d84c6cb1abc449f6a02b181e7e2a5e4db34c3afb793/matplotlib-3.9.4-cp313-cp313-win_amd64.whl", hash = "sha256:7c0d8ef442ebf56ff5e206f8083d08252ee738e04f3dc88ea882853a05488799", size = 7841311, upload-time = "2024-12-13T05:55:36.737Z" }, - { url = "https://files.pythonhosted.org/packages/c0/3a/2757d3f7d388b14dd48f5a83bea65b6d69f000e86b8f28f74d86e0d375bd/matplotlib-3.9.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a04c3b00066a688834356d196136349cb32f5e1003c55ac419e91585168b88fb", size = 7919989, upload-time = "2024-12-13T05:55:39.024Z" }, - { url = "https://files.pythonhosted.org/packages/24/28/f5077c79a4f521589a37fe1062d6a6ea3534e068213f7357e7cfffc2e17a/matplotlib-3.9.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:04c519587f6c210626741a1e9a68eefc05966ede24205db8982841826af5871a", size = 7809417, upload-time = "2024-12-13T05:55:42.412Z" }, - { url = "https://files.pythonhosted.org/packages/36/c8/c523fd2963156692916a8eb7d4069084cf729359f7955cf09075deddfeaf/matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308afbf1a228b8b525fcd5cec17f246bbbb63b175a3ef6eb7b4d33287ca0cf0c", size = 8226258, upload-time = "2024-12-13T05:55:47.259Z" }, - { url = "https://files.pythonhosted.org/packages/f6/88/499bf4b8fa9349b6f5c0cf4cead0ebe5da9d67769129f1b5651e5ac51fbc/matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddb3b02246ddcffd3ce98e88fed5b238bc5faff10dbbaa42090ea13241d15764", size = 8335849, upload-time = "2024-12-13T05:55:49.763Z" }, - { url = "https://files.pythonhosted.org/packages/b8/9f/20a4156b9726188646a030774ee337d5ff695a965be45ce4dbcb9312c170/matplotlib-3.9.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8a75287e9cb9eee48cb79ec1d806f75b29c0fde978cb7223a1f4c5848d696041", size = 9102152, upload-time = "2024-12-13T05:55:51.997Z" }, - { url = "https://files.pythonhosted.org/packages/10/11/237f9c3a4e8d810b1759b67ff2da7c32c04f9c80aa475e7beb36ed43a8fb/matplotlib-3.9.4-cp313-cp313t-win_amd64.whl", hash = "sha256:488deb7af140f0ba86da003e66e10d55ff915e152c78b4b66d231638400b1965", size = 7896987, upload-time = "2024-12-13T05:55:55.941Z" }, - { url = "https://files.pythonhosted.org/packages/56/eb/501b465c9fef28f158e414ea3a417913dc2ac748564c7ed41535f23445b4/matplotlib-3.9.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3c3724d89a387ddf78ff88d2a30ca78ac2b4c89cf37f2db4bd453c34799e933c", size = 7885919, upload-time = "2024-12-13T05:55:59.66Z" }, - { url = "https://files.pythonhosted.org/packages/da/36/236fbd868b6c91309a5206bd90c3f881f4f44b2d997cd1d6239ef652f878/matplotlib-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d5f0a8430ffe23d7e32cfd86445864ccad141797f7d25b7c41759a5b5d17cfd7", size = 7771486, upload-time = "2024-12-13T05:56:04.264Z" }, - { url = "https://files.pythonhosted.org/packages/e0/4b/105caf2d54d5ed11d9f4335398f5103001a03515f2126c936a752ccf1461/matplotlib-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bb0141a21aef3b64b633dc4d16cbd5fc538b727e4958be82a0e1c92a234160e", size = 8201838, upload-time = "2024-12-13T05:56:06.792Z" }, - { url = "https://files.pythonhosted.org/packages/5d/a7/bb01188fb4013d34d274caf44a2f8091255b0497438e8b6c0a7c1710c692/matplotlib-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57aa235109e9eed52e2c2949db17da185383fa71083c00c6c143a60e07e0888c", size = 8314492, upload-time = "2024-12-13T05:56:09.964Z" }, - { url = "https://files.pythonhosted.org/packages/33/19/02e1a37f7141fc605b193e927d0a9cdf9dc124a20b9e68793f4ffea19695/matplotlib-3.9.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b18c600061477ccfdd1e6fd050c33d8be82431700f3452b297a56d9ed7037abb", size = 9092500, upload-time = "2024-12-13T05:56:13.55Z" }, - { url = "https://files.pythonhosted.org/packages/57/68/c2feb4667adbf882ffa4b3e0ac9967f848980d9f8b5bebd86644aa67ce6a/matplotlib-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:ef5f2d1b67d2d2145ff75e10f8c008bfbf71d45137c4b648c87193e7dd053eac", size = 7822962, upload-time = "2024-12-13T05:56:16.358Z" }, - { url = "https://files.pythonhosted.org/packages/0c/22/2ef6a364cd3f565442b0b055e0599744f1e4314ec7326cdaaa48a4d864d7/matplotlib-3.9.4-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:44e0ed786d769d85bc787b0606a53f2d8d2d1d3c8a2608237365e9121c1a338c", size = 7877995, upload-time = "2024-12-13T05:56:18.805Z" }, - { url = "https://files.pythonhosted.org/packages/87/b8/2737456e566e9f4d94ae76b8aa0d953d9acb847714f9a7ad80184474f5be/matplotlib-3.9.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:09debb9ce941eb23ecdbe7eab972b1c3e0276dcf01688073faff7b0f61d6c6ca", size = 7769300, upload-time = "2024-12-13T05:56:21.315Z" }, - { url = "https://files.pythonhosted.org/packages/b2/1f/e709c6ec7b5321e6568769baa288c7178e60a93a9da9e682b39450da0e29/matplotlib-3.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc53cf157a657bfd03afab14774d54ba73aa84d42cfe2480c91bd94873952db", size = 8313423, upload-time = "2024-12-13T05:56:26.719Z" }, - { url = "https://files.pythonhosted.org/packages/5e/b6/5a1f868782cd13f053a679984e222007ecff654a9bfbac6b27a65f4eeb05/matplotlib-3.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ad45da51be7ad02387801fd154ef74d942f49fe3fcd26a64c94842ba7ec0d865", size = 7854624, upload-time = "2024-12-13T05:56:29.359Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/df/17/1747b4154034befd0ed33b52538f5eb7752d05bb51c5e2a31470c3bc7d52/matplotlib-3.9.4.tar.gz", hash = "sha256:1e00e8be7393cbdc6fedfa8a6fba02cf3e83814b285db1c60b906a023ba41bc3", size = 36106529 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/94/27d2e2c30d54b56c7b764acc1874a909e34d1965a427fc7092bb6a588b63/matplotlib-3.9.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c5fdd7abfb706dfa8d307af64a87f1a862879ec3cd8d0ec8637458f0885b9c50", size = 7885089 }, + { url = "https://files.pythonhosted.org/packages/c6/25/828273307e40a68eb8e9df832b6b2aaad075864fdc1de4b1b81e40b09e48/matplotlib-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d89bc4e85e40a71d1477780366c27fb7c6494d293e1617788986f74e2a03d7ff", size = 7770600 }, + { url = "https://files.pythonhosted.org/packages/f2/65/f841a422ec994da5123368d76b126acf4fc02ea7459b6e37c4891b555b83/matplotlib-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddf9f3c26aae695c5daafbf6b94e4c1a30d6cd617ba594bbbded3b33a1fcfa26", size = 8200138 }, + { url = "https://files.pythonhosted.org/packages/07/06/272aca07a38804d93b6050813de41ca7ab0e29ba7a9dd098e12037c919a9/matplotlib-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18ebcf248030173b59a868fda1fe42397253f6698995b55e81e1f57431d85e50", size = 8312711 }, + { url = "https://files.pythonhosted.org/packages/98/37/f13e23b233c526b7e27ad61be0a771894a079e0f7494a10d8d81557e0e9a/matplotlib-3.9.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974896ec43c672ec23f3f8c648981e8bc880ee163146e0312a9b8def2fac66f5", size = 9090622 }, + { url = "https://files.pythonhosted.org/packages/4f/8c/b1f5bd2bd70e60f93b1b54c4d5ba7a992312021d0ddddf572f9a1a6d9348/matplotlib-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:4598c394ae9711cec135639374e70871fa36b56afae17bdf032a345be552a88d", size = 7828211 }, + { url = "https://files.pythonhosted.org/packages/74/4b/65be7959a8fa118a3929b49a842de5b78bb55475236fcf64f3e308ff74a0/matplotlib-3.9.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4dd29641d9fb8bc4492420c5480398dd40a09afd73aebe4eb9d0071a05fbe0c", size = 7894430 }, + { url = "https://files.pythonhosted.org/packages/e9/18/80f70d91896e0a517b4a051c3fd540daa131630fd75e02e250365353b253/matplotlib-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30e5b22e8bcfb95442bf7d48b0d7f3bdf4a450cbf68986ea45fca3d11ae9d099", size = 7780045 }, + { url = "https://files.pythonhosted.org/packages/a2/73/ccb381026e3238c5c25c3609ba4157b2d1a617ec98d65a8b4ee4e1e74d02/matplotlib-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bb0030d1d447fd56dcc23b4c64a26e44e898f0416276cac1ebc25522e0ac249", size = 8209906 }, + { url = "https://files.pythonhosted.org/packages/ab/33/1648da77b74741c89f5ea95cbf42a291b4b364f2660b316318811404ed97/matplotlib-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aca90ed222ac3565d2752b83dbb27627480d27662671e4d39da72e97f657a423", size = 8322873 }, + { url = "https://files.pythonhosted.org/packages/57/d3/8447ba78bc6593c9044c372d1609f8ea10fb1e071e7a9e0747bea74fc16c/matplotlib-3.9.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a181b2aa2906c608fcae72f977a4a2d76e385578939891b91c2550c39ecf361e", size = 9099566 }, + { url = "https://files.pythonhosted.org/packages/23/e1/4f0e237bf349c02ff9d1b6e7109f1a17f745263809b9714a8576dc17752b/matplotlib-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:1f6882828231eca17f501c4dcd98a05abb3f03d157fbc0769c6911fe08b6cfd3", size = 7838065 }, + { url = "https://files.pythonhosted.org/packages/1a/2b/c918bf6c19d6445d1cefe3d2e42cb740fb997e14ab19d4daeb6a7ab8a157/matplotlib-3.9.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:dfc48d67e6661378a21c2983200a654b72b5c5cdbd5d2cf6e5e1ece860f0cc70", size = 7891131 }, + { url = "https://files.pythonhosted.org/packages/c1/e5/b4e8fc601ca302afeeabf45f30e706a445c7979a180e3a978b78b2b681a4/matplotlib-3.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:47aef0fab8332d02d68e786eba8113ffd6f862182ea2999379dec9e237b7e483", size = 7776365 }, + { url = "https://files.pythonhosted.org/packages/99/06/b991886c506506476e5d83625c5970c656a491b9f80161458fed94597808/matplotlib-3.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fba1f52c6b7dc764097f52fd9ab627b90db452c9feb653a59945de16752e965f", size = 8200707 }, + { url = "https://files.pythonhosted.org/packages/c3/e2/556b627498cb27e61026f2d1ba86a78ad1b836fef0996bef5440e8bc9559/matplotlib-3.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:173ac3748acaac21afcc3fa1633924609ba1b87749006bc25051c52c422a5d00", size = 8313761 }, + { url = "https://files.pythonhosted.org/packages/58/ff/165af33ec766ff818306ea88e91f9f60d2a6ed543be1eb122a98acbf3b0d/matplotlib-3.9.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320edea0cadc07007765e33f878b13b3738ffa9745c5f707705692df70ffe0e0", size = 9095284 }, + { url = "https://files.pythonhosted.org/packages/9f/8b/3d0c7a002db3b1ed702731c2a9a06d78d035f1f2fb0fb936a8e43cc1e9f4/matplotlib-3.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a4a4cfc82330b27042a7169533da7991e8789d180dd5b3daeaee57d75cd5a03b", size = 7841160 }, + { url = "https://files.pythonhosted.org/packages/49/b1/999f89a7556d101b23a2f0b54f1b6e140d73f56804da1398f2f0bc0924bc/matplotlib-3.9.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37eeffeeca3c940985b80f5b9a7b95ea35671e0e7405001f249848d2b62351b6", size = 7891499 }, + { url = "https://files.pythonhosted.org/packages/87/7b/06a32b13a684977653396a1bfcd34d4e7539c5d55c8cbfaa8ae04d47e4a9/matplotlib-3.9.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3e7465ac859ee4abcb0d836137cd8414e7bb7ad330d905abced457217d4f0f45", size = 7776802 }, + { url = "https://files.pythonhosted.org/packages/65/87/ac498451aff739e515891bbb92e566f3c7ef31891aaa878402a71f9b0910/matplotlib-3.9.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4c12302c34afa0cf061bea23b331e747e5e554b0fa595c96e01c7b75bc3b858", size = 8200802 }, + { url = "https://files.pythonhosted.org/packages/f8/6b/9eb761c00e1cb838f6c92e5f25dcda3f56a87a52f6cb8fdfa561e6cf6a13/matplotlib-3.9.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b8c97917f21b75e72108b97707ba3d48f171541a74aa2a56df7a40626bafc64", size = 8313880 }, + { url = "https://files.pythonhosted.org/packages/d7/a2/c8eaa600e2085eec7e38cbbcc58a30fc78f8224939d31d3152bdafc01fd1/matplotlib-3.9.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0229803bd7e19271b03cb09f27db76c918c467aa4ce2ae168171bc67c3f508df", size = 9094637 }, + { url = "https://files.pythonhosted.org/packages/71/1f/c6e1daea55b7bfeb3d84c6cb1abc449f6a02b181e7e2a5e4db34c3afb793/matplotlib-3.9.4-cp313-cp313-win_amd64.whl", hash = "sha256:7c0d8ef442ebf56ff5e206f8083d08252ee738e04f3dc88ea882853a05488799", size = 7841311 }, + { url = "https://files.pythonhosted.org/packages/c0/3a/2757d3f7d388b14dd48f5a83bea65b6d69f000e86b8f28f74d86e0d375bd/matplotlib-3.9.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a04c3b00066a688834356d196136349cb32f5e1003c55ac419e91585168b88fb", size = 7919989 }, + { url = "https://files.pythonhosted.org/packages/24/28/f5077c79a4f521589a37fe1062d6a6ea3534e068213f7357e7cfffc2e17a/matplotlib-3.9.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:04c519587f6c210626741a1e9a68eefc05966ede24205db8982841826af5871a", size = 7809417 }, + { url = "https://files.pythonhosted.org/packages/36/c8/c523fd2963156692916a8eb7d4069084cf729359f7955cf09075deddfeaf/matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308afbf1a228b8b525fcd5cec17f246bbbb63b175a3ef6eb7b4d33287ca0cf0c", size = 8226258 }, + { url = "https://files.pythonhosted.org/packages/f6/88/499bf4b8fa9349b6f5c0cf4cead0ebe5da9d67769129f1b5651e5ac51fbc/matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddb3b02246ddcffd3ce98e88fed5b238bc5faff10dbbaa42090ea13241d15764", size = 8335849 }, + { url = "https://files.pythonhosted.org/packages/b8/9f/20a4156b9726188646a030774ee337d5ff695a965be45ce4dbcb9312c170/matplotlib-3.9.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8a75287e9cb9eee48cb79ec1d806f75b29c0fde978cb7223a1f4c5848d696041", size = 9102152 }, + { url = "https://files.pythonhosted.org/packages/10/11/237f9c3a4e8d810b1759b67ff2da7c32c04f9c80aa475e7beb36ed43a8fb/matplotlib-3.9.4-cp313-cp313t-win_amd64.whl", hash = "sha256:488deb7af140f0ba86da003e66e10d55ff915e152c78b4b66d231638400b1965", size = 7896987 }, + { url = "https://files.pythonhosted.org/packages/56/eb/501b465c9fef28f158e414ea3a417913dc2ac748564c7ed41535f23445b4/matplotlib-3.9.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3c3724d89a387ddf78ff88d2a30ca78ac2b4c89cf37f2db4bd453c34799e933c", size = 7885919 }, + { url = "https://files.pythonhosted.org/packages/da/36/236fbd868b6c91309a5206bd90c3f881f4f44b2d997cd1d6239ef652f878/matplotlib-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d5f0a8430ffe23d7e32cfd86445864ccad141797f7d25b7c41759a5b5d17cfd7", size = 7771486 }, + { url = "https://files.pythonhosted.org/packages/e0/4b/105caf2d54d5ed11d9f4335398f5103001a03515f2126c936a752ccf1461/matplotlib-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bb0141a21aef3b64b633dc4d16cbd5fc538b727e4958be82a0e1c92a234160e", size = 8201838 }, + { url = "https://files.pythonhosted.org/packages/5d/a7/bb01188fb4013d34d274caf44a2f8091255b0497438e8b6c0a7c1710c692/matplotlib-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57aa235109e9eed52e2c2949db17da185383fa71083c00c6c143a60e07e0888c", size = 8314492 }, + { url = "https://files.pythonhosted.org/packages/33/19/02e1a37f7141fc605b193e927d0a9cdf9dc124a20b9e68793f4ffea19695/matplotlib-3.9.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b18c600061477ccfdd1e6fd050c33d8be82431700f3452b297a56d9ed7037abb", size = 9092500 }, + { url = "https://files.pythonhosted.org/packages/57/68/c2feb4667adbf882ffa4b3e0ac9967f848980d9f8b5bebd86644aa67ce6a/matplotlib-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:ef5f2d1b67d2d2145ff75e10f8c008bfbf71d45137c4b648c87193e7dd053eac", size = 7822962 }, + { url = "https://files.pythonhosted.org/packages/0c/22/2ef6a364cd3f565442b0b055e0599744f1e4314ec7326cdaaa48a4d864d7/matplotlib-3.9.4-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:44e0ed786d769d85bc787b0606a53f2d8d2d1d3c8a2608237365e9121c1a338c", size = 7877995 }, + { url = "https://files.pythonhosted.org/packages/87/b8/2737456e566e9f4d94ae76b8aa0d953d9acb847714f9a7ad80184474f5be/matplotlib-3.9.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:09debb9ce941eb23ecdbe7eab972b1c3e0276dcf01688073faff7b0f61d6c6ca", size = 7769300 }, + { url = "https://files.pythonhosted.org/packages/b2/1f/e709c6ec7b5321e6568769baa288c7178e60a93a9da9e682b39450da0e29/matplotlib-3.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc53cf157a657bfd03afab14774d54ba73aa84d42cfe2480c91bd94873952db", size = 8313423 }, + { url = "https://files.pythonhosted.org/packages/5e/b6/5a1f868782cd13f053a679984e222007ecff654a9bfbac6b27a65f4eeb05/matplotlib-3.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ad45da51be7ad02387801fd154ef74d942f49fe3fcd26a64c94842ba7ec0d865", size = 7854624 }, ] [[package]] @@ -1772,41 +1771,41 @@ dependencies = [ { name = "pyparsing", marker = "python_full_version >= '3.10'" }, { name = "python-dateutil", marker = "python_full_version >= '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/26/91/d49359a21893183ed2a5b6c76bec40e0b1dcbf8ca148f864d134897cfc75/matplotlib-3.10.3.tar.gz", hash = "sha256:2f82d2c5bb7ae93aaaa4cd42aca65d76ce6376f83304fa3a630b569aca274df0", size = 34799811, upload-time = "2025-05-08T19:10:54.39Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/ea/2bba25d289d389c7451f331ecd593944b3705f06ddf593fa7be75037d308/matplotlib-3.10.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:213fadd6348d106ca7db99e113f1bea1e65e383c3ba76e8556ba4a3054b65ae7", size = 8167862, upload-time = "2025-05-08T19:09:39.563Z" }, - { url = "https://files.pythonhosted.org/packages/41/81/cc70b5138c926604e8c9ed810ed4c79e8116ba72e02230852f5c12c87ba2/matplotlib-3.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3bec61cb8221f0ca6313889308326e7bb303d0d302c5cc9e523b2f2e6c73deb", size = 8042149, upload-time = "2025-05-08T19:09:42.413Z" }, - { url = "https://files.pythonhosted.org/packages/4a/9a/0ff45b6bfa42bb16de597e6058edf2361c298ad5ef93b327728145161bbf/matplotlib-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c21ae75651c0231b3ba014b6d5e08fb969c40cdb5a011e33e99ed0c9ea86ecb", size = 8453719, upload-time = "2025-05-08T19:09:44.901Z" }, - { url = "https://files.pythonhosted.org/packages/85/c7/1866e972fed6d71ef136efbc980d4d1854ab7ef1ea8152bbd995ca231c81/matplotlib-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a49e39755580b08e30e3620efc659330eac5d6534ab7eae50fa5e31f53ee4e30", size = 8590801, upload-time = "2025-05-08T19:09:47.404Z" }, - { url = "https://files.pythonhosted.org/packages/5d/b9/748f6626d534ab7e255bdc39dc22634d337cf3ce200f261b5d65742044a1/matplotlib-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cf4636203e1190871d3a73664dea03d26fb019b66692cbfd642faafdad6208e8", size = 9402111, upload-time = "2025-05-08T19:09:49.474Z" }, - { url = "https://files.pythonhosted.org/packages/1f/78/8bf07bd8fb67ea5665a6af188e70b57fcb2ab67057daa06b85a08e59160a/matplotlib-3.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:fd5641a9bb9d55f4dd2afe897a53b537c834b9012684c8444cc105895c8c16fd", size = 8057213, upload-time = "2025-05-08T19:09:51.489Z" }, - { url = "https://files.pythonhosted.org/packages/f5/bd/af9f655456f60fe1d575f54fb14704ee299b16e999704817a7645dfce6b0/matplotlib-3.10.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0ef061f74cd488586f552d0c336b2f078d43bc00dc473d2c3e7bfee2272f3fa8", size = 8178873, upload-time = "2025-05-08T19:09:53.857Z" }, - { url = "https://files.pythonhosted.org/packages/c2/86/e1c86690610661cd716eda5f9d0b35eaf606ae6c9b6736687cfc8f2d0cd8/matplotlib-3.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d96985d14dc5f4a736bbea4b9de9afaa735f8a0fc2ca75be2fa9e96b2097369d", size = 8052205, upload-time = "2025-05-08T19:09:55.684Z" }, - { url = "https://files.pythonhosted.org/packages/54/51/a9f8e49af3883dacddb2da1af5fca1f7468677f1188936452dd9aaaeb9ed/matplotlib-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c5f0283da91e9522bdba4d6583ed9d5521566f63729ffb68334f86d0bb98049", size = 8465823, upload-time = "2025-05-08T19:09:57.442Z" }, - { url = "https://files.pythonhosted.org/packages/e7/e3/c82963a3b86d6e6d5874cbeaa390166458a7f1961bab9feb14d3d1a10f02/matplotlib-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdfa07c0ec58035242bc8b2c8aae37037c9a886370eef6850703d7583e19964b", size = 8606464, upload-time = "2025-05-08T19:09:59.471Z" }, - { url = "https://files.pythonhosted.org/packages/0e/34/24da1027e7fcdd9e82da3194c470143c551852757a4b473a09a012f5b945/matplotlib-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c0b9849a17bce080a16ebcb80a7b714b5677d0ec32161a2cc0a8e5a6030ae220", size = 9413103, upload-time = "2025-05-08T19:10:03.208Z" }, - { url = "https://files.pythonhosted.org/packages/a6/da/948a017c3ea13fd4a97afad5fdebe2f5bbc4d28c0654510ce6fd6b06b7bd/matplotlib-3.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:eef6ed6c03717083bc6d69c2d7ee8624205c29a8e6ea5a31cd3492ecdbaee1e1", size = 8065492, upload-time = "2025-05-08T19:10:05.271Z" }, - { url = "https://files.pythonhosted.org/packages/eb/43/6b80eb47d1071f234ef0c96ca370c2ca621f91c12045f1401b5c9b28a639/matplotlib-3.10.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ab1affc11d1f495ab9e6362b8174a25afc19c081ba5b0775ef00533a4236eea", size = 8179689, upload-time = "2025-05-08T19:10:07.602Z" }, - { url = "https://files.pythonhosted.org/packages/0f/70/d61a591958325c357204870b5e7b164f93f2a8cca1dc6ce940f563909a13/matplotlib-3.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2a818d8bdcafa7ed2eed74487fdb071c09c1ae24152d403952adad11fa3c65b4", size = 8050466, upload-time = "2025-05-08T19:10:09.383Z" }, - { url = "https://files.pythonhosted.org/packages/e7/75/70c9d2306203148cc7902a961240c5927dd8728afedf35e6a77e105a2985/matplotlib-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748ebc3470c253e770b17d8b0557f0aa85cf8c63fd52f1a61af5b27ec0b7ffee", size = 8456252, upload-time = "2025-05-08T19:10:11.958Z" }, - { url = "https://files.pythonhosted.org/packages/c4/91/ba0ae1ff4b3f30972ad01cd4a8029e70a0ec3b8ea5be04764b128b66f763/matplotlib-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed70453fd99733293ace1aec568255bc51c6361cb0da94fa5ebf0649fdb2150a", size = 8601321, upload-time = "2025-05-08T19:10:14.47Z" }, - { url = "https://files.pythonhosted.org/packages/d2/88/d636041eb54a84b889e11872d91f7cbf036b3b0e194a70fa064eb8b04f7a/matplotlib-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dbed9917b44070e55640bd13419de83b4c918e52d97561544814ba463811cbc7", size = 9406972, upload-time = "2025-05-08T19:10:16.569Z" }, - { url = "https://files.pythonhosted.org/packages/b1/79/0d1c165eac44405a86478082e225fce87874f7198300bbebc55faaf6d28d/matplotlib-3.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:cf37d8c6ef1a48829443e8ba5227b44236d7fcaf7647caa3178a4ff9f7a5be05", size = 8067954, upload-time = "2025-05-08T19:10:18.663Z" }, - { url = "https://files.pythonhosted.org/packages/3b/c1/23cfb566a74c696a3b338d8955c549900d18fe2b898b6e94d682ca21e7c2/matplotlib-3.10.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9f2efccc8dcf2b86fc4ee849eea5dcaecedd0773b30f47980dc0cbeabf26ec84", size = 8180318, upload-time = "2025-05-08T19:10:20.426Z" }, - { url = "https://files.pythonhosted.org/packages/6c/0c/02f1c3b66b30da9ee343c343acbb6251bef5b01d34fad732446eaadcd108/matplotlib-3.10.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ddbba06a6c126e3301c3d272a99dcbe7f6c24c14024e80307ff03791a5f294e", size = 8051132, upload-time = "2025-05-08T19:10:22.569Z" }, - { url = "https://files.pythonhosted.org/packages/b4/ab/8db1a5ac9b3a7352fb914133001dae889f9fcecb3146541be46bed41339c/matplotlib-3.10.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748302b33ae9326995b238f606e9ed840bf5886ebafcb233775d946aa8107a15", size = 8457633, upload-time = "2025-05-08T19:10:24.749Z" }, - { url = "https://files.pythonhosted.org/packages/f5/64/41c4367bcaecbc03ef0d2a3ecee58a7065d0a36ae1aa817fe573a2da66d4/matplotlib-3.10.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a80fcccbef63302c0efd78042ea3c2436104c5b1a4d3ae20f864593696364ac7", size = 8601031, upload-time = "2025-05-08T19:10:27.03Z" }, - { url = "https://files.pythonhosted.org/packages/12/6f/6cc79e9e5ab89d13ed64da28898e40fe5b105a9ab9c98f83abd24e46d7d7/matplotlib-3.10.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55e46cbfe1f8586adb34f7587c3e4f7dedc59d5226719faf6cb54fc24f2fd52d", size = 9406988, upload-time = "2025-05-08T19:10:29.056Z" }, - { url = "https://files.pythonhosted.org/packages/b1/0f/eed564407bd4d935ffabf561ed31099ed609e19287409a27b6d336848653/matplotlib-3.10.3-cp313-cp313-win_amd64.whl", hash = "sha256:151d89cb8d33cb23345cd12490c76fd5d18a56581a16d950b48c6ff19bb2ab93", size = 8068034, upload-time = "2025-05-08T19:10:31.221Z" }, - { url = "https://files.pythonhosted.org/packages/3e/e5/2f14791ff69b12b09e9975e1d116d9578ac684460860ce542c2588cb7a1c/matplotlib-3.10.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c26dd9834e74d164d06433dc7be5d75a1e9890b926b3e57e74fa446e1a62c3e2", size = 8218223, upload-time = "2025-05-08T19:10:33.114Z" }, - { url = "https://files.pythonhosted.org/packages/5c/08/30a94afd828b6e02d0a52cae4a29d6e9ccfcf4c8b56cc28b021d3588873e/matplotlib-3.10.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:24853dad5b8c84c8c2390fc31ce4858b6df504156893292ce8092d190ef8151d", size = 8094985, upload-time = "2025-05-08T19:10:35.337Z" }, - { url = "https://files.pythonhosted.org/packages/89/44/f3bc6b53066c889d7a1a3ea8094c13af6a667c5ca6220ec60ecceec2dabe/matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f7878214d369d7d4215e2a9075fef743be38fa401d32e6020bab2dfabaa566", size = 8483109, upload-time = "2025-05-08T19:10:37.611Z" }, - { url = "https://files.pythonhosted.org/packages/ba/c7/473bc559beec08ebee9f86ca77a844b65747e1a6c2691e8c92e40b9f42a8/matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6929fc618cb6db9cb75086f73b3219bbb25920cb24cee2ea7a12b04971a4158", size = 8618082, upload-time = "2025-05-08T19:10:39.892Z" }, - { url = "https://files.pythonhosted.org/packages/d8/e9/6ce8edd264c8819e37bbed8172e0ccdc7107fe86999b76ab5752276357a4/matplotlib-3.10.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c7818292a5cc372a2dc4c795e5c356942eb8350b98ef913f7fda51fe175ac5d", size = 9413699, upload-time = "2025-05-08T19:10:42.376Z" }, - { url = "https://files.pythonhosted.org/packages/1b/92/9a45c91089c3cf690b5badd4be81e392ff086ccca8a1d4e3a08463d8a966/matplotlib-3.10.3-cp313-cp313t-win_amd64.whl", hash = "sha256:4f23ffe95c5667ef8a2b56eea9b53db7f43910fa4a2d5472ae0f72b64deab4d5", size = 8139044, upload-time = "2025-05-08T19:10:44.551Z" }, - { url = "https://files.pythonhosted.org/packages/3d/d1/f54d43e95384b312ffa4a74a4326c722f3b8187aaaa12e9a84cdf3037131/matplotlib-3.10.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:86ab63d66bbc83fdb6733471d3bff40897c1e9921cba112accd748eee4bce5e4", size = 8162896, upload-time = "2025-05-08T19:10:46.432Z" }, - { url = "https://files.pythonhosted.org/packages/24/a4/fbfc00c2346177c95b353dcf9b5a004106abe8730a62cb6f27e79df0a698/matplotlib-3.10.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a48f9c08bf7444b5d2391a83e75edb464ccda3c380384b36532a0962593a1751", size = 8039702, upload-time = "2025-05-08T19:10:49.634Z" }, - { url = "https://files.pythonhosted.org/packages/6a/b9/59e120d24a2ec5fc2d30646adb2efb4621aab3c6d83d66fb2a7a182db032/matplotlib-3.10.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb73d8aa75a237457988f9765e4dfe1c0d2453c5ca4eabc897d4309672c8e014", size = 8594298, upload-time = "2025-05-08T19:10:51.738Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/26/91/d49359a21893183ed2a5b6c76bec40e0b1dcbf8ca148f864d134897cfc75/matplotlib-3.10.3.tar.gz", hash = "sha256:2f82d2c5bb7ae93aaaa4cd42aca65d76ce6376f83304fa3a630b569aca274df0", size = 34799811 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/ea/2bba25d289d389c7451f331ecd593944b3705f06ddf593fa7be75037d308/matplotlib-3.10.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:213fadd6348d106ca7db99e113f1bea1e65e383c3ba76e8556ba4a3054b65ae7", size = 8167862 }, + { url = "https://files.pythonhosted.org/packages/41/81/cc70b5138c926604e8c9ed810ed4c79e8116ba72e02230852f5c12c87ba2/matplotlib-3.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3bec61cb8221f0ca6313889308326e7bb303d0d302c5cc9e523b2f2e6c73deb", size = 8042149 }, + { url = "https://files.pythonhosted.org/packages/4a/9a/0ff45b6bfa42bb16de597e6058edf2361c298ad5ef93b327728145161bbf/matplotlib-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c21ae75651c0231b3ba014b6d5e08fb969c40cdb5a011e33e99ed0c9ea86ecb", size = 8453719 }, + { url = "https://files.pythonhosted.org/packages/85/c7/1866e972fed6d71ef136efbc980d4d1854ab7ef1ea8152bbd995ca231c81/matplotlib-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a49e39755580b08e30e3620efc659330eac5d6534ab7eae50fa5e31f53ee4e30", size = 8590801 }, + { url = "https://files.pythonhosted.org/packages/5d/b9/748f6626d534ab7e255bdc39dc22634d337cf3ce200f261b5d65742044a1/matplotlib-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cf4636203e1190871d3a73664dea03d26fb019b66692cbfd642faafdad6208e8", size = 9402111 }, + { url = "https://files.pythonhosted.org/packages/1f/78/8bf07bd8fb67ea5665a6af188e70b57fcb2ab67057daa06b85a08e59160a/matplotlib-3.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:fd5641a9bb9d55f4dd2afe897a53b537c834b9012684c8444cc105895c8c16fd", size = 8057213 }, + { url = "https://files.pythonhosted.org/packages/f5/bd/af9f655456f60fe1d575f54fb14704ee299b16e999704817a7645dfce6b0/matplotlib-3.10.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0ef061f74cd488586f552d0c336b2f078d43bc00dc473d2c3e7bfee2272f3fa8", size = 8178873 }, + { url = "https://files.pythonhosted.org/packages/c2/86/e1c86690610661cd716eda5f9d0b35eaf606ae6c9b6736687cfc8f2d0cd8/matplotlib-3.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d96985d14dc5f4a736bbea4b9de9afaa735f8a0fc2ca75be2fa9e96b2097369d", size = 8052205 }, + { url = "https://files.pythonhosted.org/packages/54/51/a9f8e49af3883dacddb2da1af5fca1f7468677f1188936452dd9aaaeb9ed/matplotlib-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c5f0283da91e9522bdba4d6583ed9d5521566f63729ffb68334f86d0bb98049", size = 8465823 }, + { url = "https://files.pythonhosted.org/packages/e7/e3/c82963a3b86d6e6d5874cbeaa390166458a7f1961bab9feb14d3d1a10f02/matplotlib-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdfa07c0ec58035242bc8b2c8aae37037c9a886370eef6850703d7583e19964b", size = 8606464 }, + { url = "https://files.pythonhosted.org/packages/0e/34/24da1027e7fcdd9e82da3194c470143c551852757a4b473a09a012f5b945/matplotlib-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c0b9849a17bce080a16ebcb80a7b714b5677d0ec32161a2cc0a8e5a6030ae220", size = 9413103 }, + { url = "https://files.pythonhosted.org/packages/a6/da/948a017c3ea13fd4a97afad5fdebe2f5bbc4d28c0654510ce6fd6b06b7bd/matplotlib-3.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:eef6ed6c03717083bc6d69c2d7ee8624205c29a8e6ea5a31cd3492ecdbaee1e1", size = 8065492 }, + { url = "https://files.pythonhosted.org/packages/eb/43/6b80eb47d1071f234ef0c96ca370c2ca621f91c12045f1401b5c9b28a639/matplotlib-3.10.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ab1affc11d1f495ab9e6362b8174a25afc19c081ba5b0775ef00533a4236eea", size = 8179689 }, + { url = "https://files.pythonhosted.org/packages/0f/70/d61a591958325c357204870b5e7b164f93f2a8cca1dc6ce940f563909a13/matplotlib-3.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2a818d8bdcafa7ed2eed74487fdb071c09c1ae24152d403952adad11fa3c65b4", size = 8050466 }, + { url = "https://files.pythonhosted.org/packages/e7/75/70c9d2306203148cc7902a961240c5927dd8728afedf35e6a77e105a2985/matplotlib-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748ebc3470c253e770b17d8b0557f0aa85cf8c63fd52f1a61af5b27ec0b7ffee", size = 8456252 }, + { url = "https://files.pythonhosted.org/packages/c4/91/ba0ae1ff4b3f30972ad01cd4a8029e70a0ec3b8ea5be04764b128b66f763/matplotlib-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed70453fd99733293ace1aec568255bc51c6361cb0da94fa5ebf0649fdb2150a", size = 8601321 }, + { url = "https://files.pythonhosted.org/packages/d2/88/d636041eb54a84b889e11872d91f7cbf036b3b0e194a70fa064eb8b04f7a/matplotlib-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dbed9917b44070e55640bd13419de83b4c918e52d97561544814ba463811cbc7", size = 9406972 }, + { url = "https://files.pythonhosted.org/packages/b1/79/0d1c165eac44405a86478082e225fce87874f7198300bbebc55faaf6d28d/matplotlib-3.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:cf37d8c6ef1a48829443e8ba5227b44236d7fcaf7647caa3178a4ff9f7a5be05", size = 8067954 }, + { url = "https://files.pythonhosted.org/packages/3b/c1/23cfb566a74c696a3b338d8955c549900d18fe2b898b6e94d682ca21e7c2/matplotlib-3.10.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9f2efccc8dcf2b86fc4ee849eea5dcaecedd0773b30f47980dc0cbeabf26ec84", size = 8180318 }, + { url = "https://files.pythonhosted.org/packages/6c/0c/02f1c3b66b30da9ee343c343acbb6251bef5b01d34fad732446eaadcd108/matplotlib-3.10.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ddbba06a6c126e3301c3d272a99dcbe7f6c24c14024e80307ff03791a5f294e", size = 8051132 }, + { url = "https://files.pythonhosted.org/packages/b4/ab/8db1a5ac9b3a7352fb914133001dae889f9fcecb3146541be46bed41339c/matplotlib-3.10.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748302b33ae9326995b238f606e9ed840bf5886ebafcb233775d946aa8107a15", size = 8457633 }, + { url = "https://files.pythonhosted.org/packages/f5/64/41c4367bcaecbc03ef0d2a3ecee58a7065d0a36ae1aa817fe573a2da66d4/matplotlib-3.10.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a80fcccbef63302c0efd78042ea3c2436104c5b1a4d3ae20f864593696364ac7", size = 8601031 }, + { url = "https://files.pythonhosted.org/packages/12/6f/6cc79e9e5ab89d13ed64da28898e40fe5b105a9ab9c98f83abd24e46d7d7/matplotlib-3.10.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55e46cbfe1f8586adb34f7587c3e4f7dedc59d5226719faf6cb54fc24f2fd52d", size = 9406988 }, + { url = "https://files.pythonhosted.org/packages/b1/0f/eed564407bd4d935ffabf561ed31099ed609e19287409a27b6d336848653/matplotlib-3.10.3-cp313-cp313-win_amd64.whl", hash = "sha256:151d89cb8d33cb23345cd12490c76fd5d18a56581a16d950b48c6ff19bb2ab93", size = 8068034 }, + { url = "https://files.pythonhosted.org/packages/3e/e5/2f14791ff69b12b09e9975e1d116d9578ac684460860ce542c2588cb7a1c/matplotlib-3.10.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c26dd9834e74d164d06433dc7be5d75a1e9890b926b3e57e74fa446e1a62c3e2", size = 8218223 }, + { url = "https://files.pythonhosted.org/packages/5c/08/30a94afd828b6e02d0a52cae4a29d6e9ccfcf4c8b56cc28b021d3588873e/matplotlib-3.10.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:24853dad5b8c84c8c2390fc31ce4858b6df504156893292ce8092d190ef8151d", size = 8094985 }, + { url = "https://files.pythonhosted.org/packages/89/44/f3bc6b53066c889d7a1a3ea8094c13af6a667c5ca6220ec60ecceec2dabe/matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f7878214d369d7d4215e2a9075fef743be38fa401d32e6020bab2dfabaa566", size = 8483109 }, + { url = "https://files.pythonhosted.org/packages/ba/c7/473bc559beec08ebee9f86ca77a844b65747e1a6c2691e8c92e40b9f42a8/matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6929fc618cb6db9cb75086f73b3219bbb25920cb24cee2ea7a12b04971a4158", size = 8618082 }, + { url = "https://files.pythonhosted.org/packages/d8/e9/6ce8edd264c8819e37bbed8172e0ccdc7107fe86999b76ab5752276357a4/matplotlib-3.10.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c7818292a5cc372a2dc4c795e5c356942eb8350b98ef913f7fda51fe175ac5d", size = 9413699 }, + { url = "https://files.pythonhosted.org/packages/1b/92/9a45c91089c3cf690b5badd4be81e392ff086ccca8a1d4e3a08463d8a966/matplotlib-3.10.3-cp313-cp313t-win_amd64.whl", hash = "sha256:4f23ffe95c5667ef8a2b56eea9b53db7f43910fa4a2d5472ae0f72b64deab4d5", size = 8139044 }, + { url = "https://files.pythonhosted.org/packages/3d/d1/f54d43e95384b312ffa4a74a4326c722f3b8187aaaa12e9a84cdf3037131/matplotlib-3.10.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:86ab63d66bbc83fdb6733471d3bff40897c1e9921cba112accd748eee4bce5e4", size = 8162896 }, + { url = "https://files.pythonhosted.org/packages/24/a4/fbfc00c2346177c95b353dcf9b5a004106abe8730a62cb6f27e79df0a698/matplotlib-3.10.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a48f9c08bf7444b5d2391a83e75edb464ccda3c380384b36532a0962593a1751", size = 8039702 }, + { url = "https://files.pythonhosted.org/packages/6a/b9/59e120d24a2ec5fc2d30646adb2efb4621aab3c6d83d66fb2a7a182db032/matplotlib-3.10.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb73d8aa75a237457988f9765e4dfe1c0d2453c5ca4eabc897d4309672c8e014", size = 8594298 }, ] [[package]] @@ -1816,9 +1815,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload-time = "2024-04-15T13:44:44.803Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload-time = "2024-04-15T13:44:43.265Z" }, + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, ] [[package]] @@ -1828,27 +1827,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542, upload-time = "2024-09-09T20:27:49.564Z" } +sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316, upload-time = "2024-09-09T20:27:48.397Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316 }, ] [[package]] name = "mdurl" version = "0.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, ] [[package]] name = "mpmath" version = "1.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106 } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198 }, ] [[package]] @@ -1870,6 +1869,7 @@ dependencies = [ { name = "scipy", version = "1.16.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sinter" }, { name = "stim" }, + { name = "tqdm" }, { name = "z3-solver" }, ] @@ -1948,10 +1948,10 @@ requires-dist = [ { name = "scipy", marker = "python_full_version >= '3.10'", specifier = ">=1.15.2" }, { name = "sinter", specifier = ">=1.14.0" }, { name = "stim", specifier = ">=1.14.0" }, + { name = "tqdm", specifier = ">=4.66.2" }, { name = "urllib3", marker = "extra == 'qsample'", specifier = ">=2.3.0" }, { name = "z3-solver", specifier = ">=4.12.2" }, ] -provides-extras = ["qsample"] [package.metadata.requires-dev] dev = [ @@ -2008,23 +2008,23 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "dill" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/fd/2ae3826f5be24c6ed87266bc4e59c46ea5b059a103f3d7e7eb76a52aeecb/multiprocess-0.70.18.tar.gz", hash = "sha256:f9597128e6b3e67b23956da07cf3d2e5cba79e2f4e0fba8d7903636663ec6d0d", size = 1798503, upload-time = "2025-04-17T03:11:27.742Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/fd/2ae3826f5be24c6ed87266bc4e59c46ea5b059a103f3d7e7eb76a52aeecb/multiprocess-0.70.18.tar.gz", hash = "sha256:f9597128e6b3e67b23956da07cf3d2e5cba79e2f4e0fba8d7903636663ec6d0d", size = 1798503 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/f8/7f9a8f08bf98cea1dfaa181e05cc8bbcb59cecf044b5a9ac3cce39f9c449/multiprocess-0.70.18-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:25d4012dcaaf66b9e8e955f58482b42910c2ee526d532844d8bcf661bbc604df", size = 135083, upload-time = "2025-04-17T03:11:04.223Z" }, - { url = "https://files.pythonhosted.org/packages/e5/03/b7b10dbfc17b2b3ce07d4d30b3ba8367d0ed32d6d46cd166e298f161dd46/multiprocess-0.70.18-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:06b19433de0d02afe5869aec8931dd5c01d99074664f806c73896b0d9e527213", size = 135128, upload-time = "2025-04-17T03:11:06.045Z" }, - { url = "https://files.pythonhosted.org/packages/c1/a3/5f8d3b9690ea5580bee5868ab7d7e2cfca74b7e826b28192b40aa3881cdc/multiprocess-0.70.18-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6fa1366f994373aaf2d4738b0f56e707caeaa05486e97a7f71ee0853823180c2", size = 135132, upload-time = "2025-04-17T03:11:07.533Z" }, - { url = "https://files.pythonhosted.org/packages/55/4d/9af0d1279c84618bcd35bf5fd7e371657358c7b0a523e54a9cffb87461f8/multiprocess-0.70.18-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b8940ae30139e04b076da6c5b83e9398585ebdf0f2ad3250673fef5b2ff06d6", size = 144695, upload-time = "2025-04-17T03:11:09.161Z" }, - { url = "https://files.pythonhosted.org/packages/17/bf/87323e79dd0562474fad3373c21c66bc6c3c9963b68eb2a209deb4c8575e/multiprocess-0.70.18-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0929ba95831adb938edbd5fb801ac45e705ecad9d100b3e653946b7716cb6bd3", size = 144742, upload-time = "2025-04-17T03:11:10.072Z" }, - { url = "https://files.pythonhosted.org/packages/dd/74/cb8c831e58dc6d5cf450b17c7db87f14294a1df52eb391da948b5e0a0b94/multiprocess-0.70.18-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4d77f8e4bfe6c6e2e661925bbf9aed4d5ade9a1c6502d5dfc10129b9d1141797", size = 144745, upload-time = "2025-04-17T03:11:11.453Z" }, - { url = "https://files.pythonhosted.org/packages/12/89/733ebfc487a4381590d863222f3f0c8bac105d032102d7a96d6566823d67/multiprocess-0.70.18-pp39-pypy39_pp73-macosx_10_13_arm64.whl", hash = "sha256:9fd8d662f7524a95a1be7cbea271f0b33089fe792baabec17d93103d368907da", size = 133534, upload-time = "2025-04-17T03:11:17.045Z" }, - { url = "https://files.pythonhosted.org/packages/41/65/d74a7955593c2c56c79d01ef07be5aa103342441673657dc7387855703de/multiprocess-0.70.18-pp39-pypy39_pp73-macosx_10_13_x86_64.whl", hash = "sha256:3fbba48bfcd932747c33f0b152b26207c4e0840c35cab359afaff7a8672b1031", size = 133533, upload-time = "2025-04-17T03:11:18.378Z" }, - { url = "https://files.pythonhosted.org/packages/7d/5a/6f3ebcbc1508aa651cbe8deeca612b7915b97303410c93e9a4d83ba07e03/multiprocess-0.70.18-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5f9be0342e597dde86152c10442c5fb6c07994b1c29de441b7a3a08b0e6be2a0", size = 133537, upload-time = "2025-04-17T03:11:19.29Z" }, - { url = "https://files.pythonhosted.org/packages/ba/d8/0cba6cf51a1a31f20471fbc823a716170c73012ddc4fb85d706630ed6e8f/multiprocess-0.70.18-py310-none-any.whl", hash = "sha256:60c194974c31784019c1f459d984e8f33ee48f10fcf42c309ba97b30d9bd53ea", size = 134948, upload-time = "2025-04-17T03:11:20.223Z" }, - { url = "https://files.pythonhosted.org/packages/4b/88/9039f2fed1012ef584751d4ceff9ab4a51e5ae264898f0b7cbf44340a859/multiprocess-0.70.18-py311-none-any.whl", hash = "sha256:5aa6eef98e691281b3ad923be2832bf1c55dd2c859acd73e5ec53a66aae06a1d", size = 144462, upload-time = "2025-04-17T03:11:21.657Z" }, - { url = "https://files.pythonhosted.org/packages/bf/b6/5f922792be93b82ec6b5f270bbb1ef031fd0622847070bbcf9da816502cc/multiprocess-0.70.18-py312-none-any.whl", hash = "sha256:9b78f8e5024b573730bfb654783a13800c2c0f2dfc0c25e70b40d184d64adaa2", size = 150287, upload-time = "2025-04-17T03:11:22.69Z" }, - { url = "https://files.pythonhosted.org/packages/ee/25/7d7e78e750bc1aecfaf0efbf826c69a791d2eeaf29cf20cba93ff4cced78/multiprocess-0.70.18-py313-none-any.whl", hash = "sha256:871743755f43ef57d7910a38433cfe41319e72be1bbd90b79c7a5ac523eb9334", size = 151917, upload-time = "2025-04-17T03:11:24.044Z" }, - { url = "https://files.pythonhosted.org/packages/3b/c3/ca84c19bd14cdfc21c388fdcebf08b86a7a470ebc9f5c3c084fc2dbc50f7/multiprocess-0.70.18-py38-none-any.whl", hash = "sha256:dbf705e52a154fe5e90fb17b38f02556169557c2dd8bb084f2e06c2784d8279b", size = 132636, upload-time = "2025-04-17T03:11:24.936Z" }, - { url = "https://files.pythonhosted.org/packages/6c/28/dd72947e59a6a8c856448a5e74da6201cb5502ddff644fbc790e4bd40b9a/multiprocess-0.70.18-py39-none-any.whl", hash = "sha256:e78ca805a72b1b810c690b6b4cc32579eba34f403094bbbae962b7b5bf9dfcb8", size = 133478, upload-time = "2025-04-17T03:11:26.253Z" }, + { url = "https://files.pythonhosted.org/packages/c8/f8/7f9a8f08bf98cea1dfaa181e05cc8bbcb59cecf044b5a9ac3cce39f9c449/multiprocess-0.70.18-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:25d4012dcaaf66b9e8e955f58482b42910c2ee526d532844d8bcf661bbc604df", size = 135083 }, + { url = "https://files.pythonhosted.org/packages/e5/03/b7b10dbfc17b2b3ce07d4d30b3ba8367d0ed32d6d46cd166e298f161dd46/multiprocess-0.70.18-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:06b19433de0d02afe5869aec8931dd5c01d99074664f806c73896b0d9e527213", size = 135128 }, + { url = "https://files.pythonhosted.org/packages/c1/a3/5f8d3b9690ea5580bee5868ab7d7e2cfca74b7e826b28192b40aa3881cdc/multiprocess-0.70.18-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6fa1366f994373aaf2d4738b0f56e707caeaa05486e97a7f71ee0853823180c2", size = 135132 }, + { url = "https://files.pythonhosted.org/packages/55/4d/9af0d1279c84618bcd35bf5fd7e371657358c7b0a523e54a9cffb87461f8/multiprocess-0.70.18-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b8940ae30139e04b076da6c5b83e9398585ebdf0f2ad3250673fef5b2ff06d6", size = 144695 }, + { url = "https://files.pythonhosted.org/packages/17/bf/87323e79dd0562474fad3373c21c66bc6c3c9963b68eb2a209deb4c8575e/multiprocess-0.70.18-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0929ba95831adb938edbd5fb801ac45e705ecad9d100b3e653946b7716cb6bd3", size = 144742 }, + { url = "https://files.pythonhosted.org/packages/dd/74/cb8c831e58dc6d5cf450b17c7db87f14294a1df52eb391da948b5e0a0b94/multiprocess-0.70.18-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4d77f8e4bfe6c6e2e661925bbf9aed4d5ade9a1c6502d5dfc10129b9d1141797", size = 144745 }, + { url = "https://files.pythonhosted.org/packages/12/89/733ebfc487a4381590d863222f3f0c8bac105d032102d7a96d6566823d67/multiprocess-0.70.18-pp39-pypy39_pp73-macosx_10_13_arm64.whl", hash = "sha256:9fd8d662f7524a95a1be7cbea271f0b33089fe792baabec17d93103d368907da", size = 133534 }, + { url = "https://files.pythonhosted.org/packages/41/65/d74a7955593c2c56c79d01ef07be5aa103342441673657dc7387855703de/multiprocess-0.70.18-pp39-pypy39_pp73-macosx_10_13_x86_64.whl", hash = "sha256:3fbba48bfcd932747c33f0b152b26207c4e0840c35cab359afaff7a8672b1031", size = 133533 }, + { url = "https://files.pythonhosted.org/packages/7d/5a/6f3ebcbc1508aa651cbe8deeca612b7915b97303410c93e9a4d83ba07e03/multiprocess-0.70.18-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5f9be0342e597dde86152c10442c5fb6c07994b1c29de441b7a3a08b0e6be2a0", size = 133537 }, + { url = "https://files.pythonhosted.org/packages/ba/d8/0cba6cf51a1a31f20471fbc823a716170c73012ddc4fb85d706630ed6e8f/multiprocess-0.70.18-py310-none-any.whl", hash = "sha256:60c194974c31784019c1f459d984e8f33ee48f10fcf42c309ba97b30d9bd53ea", size = 134948 }, + { url = "https://files.pythonhosted.org/packages/4b/88/9039f2fed1012ef584751d4ceff9ab4a51e5ae264898f0b7cbf44340a859/multiprocess-0.70.18-py311-none-any.whl", hash = "sha256:5aa6eef98e691281b3ad923be2832bf1c55dd2c859acd73e5ec53a66aae06a1d", size = 144462 }, + { url = "https://files.pythonhosted.org/packages/bf/b6/5f922792be93b82ec6b5f270bbb1ef031fd0622847070bbcf9da816502cc/multiprocess-0.70.18-py312-none-any.whl", hash = "sha256:9b78f8e5024b573730bfb654783a13800c2c0f2dfc0c25e70b40d184d64adaa2", size = 150287 }, + { url = "https://files.pythonhosted.org/packages/ee/25/7d7e78e750bc1aecfaf0efbf826c69a791d2eeaf29cf20cba93ff4cced78/multiprocess-0.70.18-py313-none-any.whl", hash = "sha256:871743755f43ef57d7910a38433cfe41319e72be1bbd90b79c7a5ac523eb9334", size = 151917 }, + { url = "https://files.pythonhosted.org/packages/3b/c3/ca84c19bd14cdfc21c388fdcebf08b86a7a470ebc9f5c3c084fc2dbc50f7/multiprocess-0.70.18-py38-none-any.whl", hash = "sha256:dbf705e52a154fe5e90fb17b38f02556169557c2dd8bb084f2e06c2784d8279b", size = 132636 }, + { url = "https://files.pythonhosted.org/packages/6c/28/dd72947e59a6a8c856448a5e74da6201cb5502ddff644fbc790e4bd40b9a/multiprocess-0.70.18-py39-none-any.whl", hash = "sha256:e78ca805a72b1b810c690b6b4cc32579eba34f403094bbbae962b7b5bf9dfcb8", size = 133478 }, ] [[package]] @@ -2048,9 +2048,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/21/83/a894bd8dea7a6e9f053502ee8413484dcbf75a219013d6a72e971c0fecfd/myst_nb-1.3.0.tar.gz", hash = "sha256:df3cd4680f51a5af673fd46b38b562be3559aef1475e906ed0f2e66e4587ce4b", size = 81963, upload-time = "2025-07-13T22:49:38.493Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/83/a894bd8dea7a6e9f053502ee8413484dcbf75a219013d6a72e971c0fecfd/myst_nb-1.3.0.tar.gz", hash = "sha256:df3cd4680f51a5af673fd46b38b562be3559aef1475e906ed0f2e66e4587ce4b", size = 81963 } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/a6/03d410c114b8c4856579b3d294dafc27626a7690a552625eec42b16dfa41/myst_nb-1.3.0-py3-none-any.whl", hash = "sha256:1f36af3c19964960ec4e51ac30949b6ed6df220356ffa8d60dd410885e132d7d", size = 82396, upload-time = "2025-07-13T22:49:37.019Z" }, + { url = "https://files.pythonhosted.org/packages/69/a6/03d410c114b8c4856579b3d294dafc27626a7690a552625eec42b16dfa41/myst_nb-1.3.0-py3-none-any.whl", hash = "sha256:1f36af3c19964960ec4e51ac30949b6ed6df220356ffa8d60dd410885e132d7d", size = 82396 }, ] [[package]] @@ -2069,9 +2069,9 @@ dependencies = [ { name = "pyyaml", marker = "python_full_version < '3.10'" }, { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/49/64/e2f13dac02f599980798c01156393b781aec983b52a6e4057ee58f07c43a/myst_parser-3.0.1.tar.gz", hash = "sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87", size = 92392, upload-time = "2024-04-28T20:22:42.116Z" } +sdist = { url = "https://files.pythonhosted.org/packages/49/64/e2f13dac02f599980798c01156393b781aec983b52a6e4057ee58f07c43a/myst_parser-3.0.1.tar.gz", hash = "sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87", size = 92392 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/de/21aa8394f16add8f7427f0a1326ccd2b3a2a8a3245c9252bc5ac034c6155/myst_parser-3.0.1-py3-none-any.whl", hash = "sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1", size = 83163, upload-time = "2024-04-28T20:22:39.985Z" }, + { url = "https://files.pythonhosted.org/packages/e2/de/21aa8394f16add8f7427f0a1326ccd2b3a2a8a3245c9252bc5ac034c6155/myst_parser-3.0.1-py3-none-any.whl", hash = "sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1", size = 83163 }, ] [[package]] @@ -2093,9 +2093,9 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985, upload-time = "2025-02-12T10:53:03.833Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579, upload-time = "2025-02-12T10:53:02.078Z" }, + { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579 }, ] [[package]] @@ -2108,9 +2108,9 @@ dependencies = [ { name = "nbformat" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424, upload-time = "2024-12-19T10:32:27.164Z" } +sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424 } wheels = [ - { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434, upload-time = "2024-12-19T10:32:24.139Z" }, + { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434 }, ] [[package]] @@ -2123,18 +2123,18 @@ dependencies = [ { name = "jupyter-core" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454 }, ] [[package]] name = "nest-asyncio" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, ] [[package]] @@ -2145,9 +2145,9 @@ resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] -sdist = { url = "https://files.pythonhosted.org/packages/c4/80/a84676339aaae2f1cfdf9f418701dd634aef9cc76f708ef55c36ff39c3ca/networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6", size = 2073928, upload-time = "2023-10-28T08:41:39.364Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/80/a84676339aaae2f1cfdf9f418701dd634aef9cc76f708ef55c36ff39c3ca/networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6", size = 2073928 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/f0/8fbc882ca80cf077f1b246c0e3c3465f7f415439bdea6b899f6b19f61f70/networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2", size = 1647772, upload-time = "2023-10-28T08:41:36.945Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f0/8fbc882ca80cf077f1b246c0e3c3465f7f415439bdea6b899f6b19f61f70/networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2", size = 1647772 }, ] [[package]] @@ -2157,9 +2157,9 @@ source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version == '3.10.*'", ] -sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263, upload-time = "2024-10-21T12:39:36.247Z" }, + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263 }, ] [[package]] @@ -2171,9 +2171,9 @@ resolution-markers = [ "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", ] -sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065, upload-time = "2025-05-29T11:35:07.804Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065 } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406, upload-time = "2025-05-29T11:35:04.961Z" }, + { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406 }, ] [[package]] @@ -2188,28 +2188,28 @@ dependencies = [ { name = "llvmlite", version = "0.43.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3c/93/2849300a9184775ba274aba6f82f303343669b0592b7bb0849ea713dabb0/numba-0.60.0.tar.gz", hash = "sha256:5df6158e5584eece5fc83294b949fd30b9f1125df7708862205217e068aabf16", size = 2702171, upload-time = "2024-06-13T18:11:19.869Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/cf/baa13a7e3556d73d9e38021e6d6aa4aeb30d8b94545aa8b70d0f24a1ccc4/numba-0.60.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d761de835cd38fb400d2c26bb103a2726f548dc30368853121d66201672e651", size = 2647627, upload-time = "2024-06-13T18:10:29.857Z" }, - { url = "https://files.pythonhosted.org/packages/ac/ba/4b57fa498564457c3cc9fc9e570a6b08e6086c74220f24baaf04e54b995f/numba-0.60.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:159e618ef213fba758837f9837fb402bbe65326e60ba0633dbe6c7f274d42c1b", size = 2650322, upload-time = "2024-06-13T18:10:32.849Z" }, - { url = "https://files.pythonhosted.org/packages/28/98/7ea97ee75870a54f938a8c70f7e0be4495ba5349c5f9db09d467c4a5d5b7/numba-0.60.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1527dc578b95c7c4ff248792ec33d097ba6bef9eda466c948b68dfc995c25781", size = 3407390, upload-time = "2024-06-13T18:10:34.741Z" }, - { url = "https://files.pythonhosted.org/packages/79/58/cb4ac5b8f7ec64200460aef1fed88258fb872ceef504ab1f989d2ff0f684/numba-0.60.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe0b28abb8d70f8160798f4de9d486143200f34458d34c4a214114e445d7124e", size = 3699694, upload-time = "2024-06-13T18:10:37.295Z" }, - { url = "https://files.pythonhosted.org/packages/1c/b0/c61a93ca947d12233ff45de506ddbf52af3f752066a0b8be4d27426e16da/numba-0.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:19407ced081d7e2e4b8d8c36aa57b7452e0283871c296e12d798852bc7d7f198", size = 2687030, upload-time = "2024-06-13T18:10:39.47Z" }, - { url = "https://files.pythonhosted.org/packages/98/ad/df18d492a8f00d29a30db307904b9b296e37507034eedb523876f3a2e13e/numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a17b70fc9e380ee29c42717e8cc0bfaa5556c416d94f9aa96ba13acb41bdece8", size = 2647254, upload-time = "2024-06-13T18:10:41.69Z" }, - { url = "https://files.pythonhosted.org/packages/9a/51/a4dc2c01ce7a850b8e56ff6d5381d047a5daea83d12bad08aa071d34b2ee/numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fb02b344a2a80efa6f677aa5c40cd5dd452e1b35f8d1c2af0dfd9ada9978e4b", size = 2649970, upload-time = "2024-06-13T18:10:44.682Z" }, - { url = "https://files.pythonhosted.org/packages/f9/4c/8889ac94c0b33dca80bed11564b8c6d9ea14d7f094e674c58e5c5b05859b/numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703", size = 3412492, upload-time = "2024-06-13T18:10:47.1Z" }, - { url = "https://files.pythonhosted.org/packages/57/03/2b4245b05b71c0cee667e6a0b51606dfa7f4157c9093d71c6b208385a611/numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8", size = 3705018, upload-time = "2024-06-13T18:10:49.539Z" }, - { url = "https://files.pythonhosted.org/packages/79/89/2d924ca60dbf949f18a6fec223a2445f5f428d9a5f97a6b29c2122319015/numba-0.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:cac02c041e9b5bc8cf8f2034ff6f0dbafccd1ae9590dc146b3a02a45e53af4e2", size = 2686920, upload-time = "2024-06-13T18:10:51.937Z" }, - { url = "https://files.pythonhosted.org/packages/eb/5c/b5ec752c475e78a6c3676b67c514220dbde2725896bbb0b6ec6ea54b2738/numba-0.60.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7da4098db31182fc5ffe4bc42c6f24cd7d1cb8a14b59fd755bfee32e34b8404", size = 2647866, upload-time = "2024-06-13T18:10:54.453Z" }, - { url = "https://files.pythonhosted.org/packages/65/42/39559664b2e7c15689a638c2a38b3b74c6e69a04e2b3019b9f7742479188/numba-0.60.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:38d6ea4c1f56417076ecf8fc327c831ae793282e0ff51080c5094cb726507b1c", size = 2650208, upload-time = "2024-06-13T18:10:56.779Z" }, - { url = "https://files.pythonhosted.org/packages/67/88/c4459ccc05674ef02119abf2888ccd3e2fed12a323f52255f4982fc95876/numba-0.60.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:62908d29fb6a3229c242e981ca27e32a6e606cc253fc9e8faeb0e48760de241e", size = 3466946, upload-time = "2024-06-13T18:10:58.961Z" }, - { url = "https://files.pythonhosted.org/packages/8b/41/ac11cf33524def12aa5bd698226ae196a1185831c05ed29dc0c56eaa308b/numba-0.60.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0ebaa91538e996f708f1ab30ef4d3ddc344b64b5227b67a57aa74f401bb68b9d", size = 3761463, upload-time = "2024-06-13T18:11:01.657Z" }, - { url = "https://files.pythonhosted.org/packages/ca/bd/0fe29fcd1b6a8de479a4ed25c6e56470e467e3611c079d55869ceef2b6d1/numba-0.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:f75262e8fe7fa96db1dca93d53a194a38c46da28b112b8a4aca168f0df860347", size = 2707588, upload-time = "2024-06-13T18:11:04.261Z" }, - { url = "https://files.pythonhosted.org/packages/68/1a/87c53f836cdf557083248c3f47212271f220280ff766538795e77c8c6bbf/numba-0.60.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:01ef4cd7d83abe087d644eaa3d95831b777aa21d441a23703d649e06b8e06b74", size = 2647186, upload-time = "2024-06-13T18:11:06.753Z" }, - { url = "https://files.pythonhosted.org/packages/28/14/a5baa1f2edea7b49afa4dc1bb1b126645198cf1075186853b5b497be826e/numba-0.60.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:819a3dfd4630d95fd574036f99e47212a1af41cbcb019bf8afac63ff56834449", size = 2650038, upload-time = "2024-06-13T18:11:10.869Z" }, - { url = "https://files.pythonhosted.org/packages/3b/bd/f1985719ff34e37e07bb18f9d3acd17e5a21da255f550c8eae031e2ddf5f/numba-0.60.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b983bd6ad82fe868493012487f34eae8bf7dd94654951404114f23c3466d34b", size = 3403010, upload-time = "2024-06-13T18:11:13.057Z" }, - { url = "https://files.pythonhosted.org/packages/54/9b/cd73d3f6617ddc8398a63ef97d8dc9139a9879b9ca8a7ca4b8789056ea46/numba-0.60.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c151748cd269ddeab66334bd754817ffc0cabd9433acb0f551697e5151917d25", size = 3695086, upload-time = "2024-06-13T18:11:15.497Z" }, - { url = "https://files.pythonhosted.org/packages/01/01/8b7b670c77c5ea0e47e283d82332969bf672ab6410d0b2610cac5b7a3ded/numba-0.60.0-cp39-cp39-win_amd64.whl", hash = "sha256:3031547a015710140e8c87226b4cfe927cac199835e5bf7d4fe5cb64e814e3ab", size = 2686978, upload-time = "2024-06-13T18:11:17.765Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/3c/93/2849300a9184775ba274aba6f82f303343669b0592b7bb0849ea713dabb0/numba-0.60.0.tar.gz", hash = "sha256:5df6158e5584eece5fc83294b949fd30b9f1125df7708862205217e068aabf16", size = 2702171 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/cf/baa13a7e3556d73d9e38021e6d6aa4aeb30d8b94545aa8b70d0f24a1ccc4/numba-0.60.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d761de835cd38fb400d2c26bb103a2726f548dc30368853121d66201672e651", size = 2647627 }, + { url = "https://files.pythonhosted.org/packages/ac/ba/4b57fa498564457c3cc9fc9e570a6b08e6086c74220f24baaf04e54b995f/numba-0.60.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:159e618ef213fba758837f9837fb402bbe65326e60ba0633dbe6c7f274d42c1b", size = 2650322 }, + { url = "https://files.pythonhosted.org/packages/28/98/7ea97ee75870a54f938a8c70f7e0be4495ba5349c5f9db09d467c4a5d5b7/numba-0.60.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1527dc578b95c7c4ff248792ec33d097ba6bef9eda466c948b68dfc995c25781", size = 3407390 }, + { url = "https://files.pythonhosted.org/packages/79/58/cb4ac5b8f7ec64200460aef1fed88258fb872ceef504ab1f989d2ff0f684/numba-0.60.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe0b28abb8d70f8160798f4de9d486143200f34458d34c4a214114e445d7124e", size = 3699694 }, + { url = "https://files.pythonhosted.org/packages/1c/b0/c61a93ca947d12233ff45de506ddbf52af3f752066a0b8be4d27426e16da/numba-0.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:19407ced081d7e2e4b8d8c36aa57b7452e0283871c296e12d798852bc7d7f198", size = 2687030 }, + { url = "https://files.pythonhosted.org/packages/98/ad/df18d492a8f00d29a30db307904b9b296e37507034eedb523876f3a2e13e/numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a17b70fc9e380ee29c42717e8cc0bfaa5556c416d94f9aa96ba13acb41bdece8", size = 2647254 }, + { url = "https://files.pythonhosted.org/packages/9a/51/a4dc2c01ce7a850b8e56ff6d5381d047a5daea83d12bad08aa071d34b2ee/numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fb02b344a2a80efa6f677aa5c40cd5dd452e1b35f8d1c2af0dfd9ada9978e4b", size = 2649970 }, + { url = "https://files.pythonhosted.org/packages/f9/4c/8889ac94c0b33dca80bed11564b8c6d9ea14d7f094e674c58e5c5b05859b/numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703", size = 3412492 }, + { url = "https://files.pythonhosted.org/packages/57/03/2b4245b05b71c0cee667e6a0b51606dfa7f4157c9093d71c6b208385a611/numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8", size = 3705018 }, + { url = "https://files.pythonhosted.org/packages/79/89/2d924ca60dbf949f18a6fec223a2445f5f428d9a5f97a6b29c2122319015/numba-0.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:cac02c041e9b5bc8cf8f2034ff6f0dbafccd1ae9590dc146b3a02a45e53af4e2", size = 2686920 }, + { url = "https://files.pythonhosted.org/packages/eb/5c/b5ec752c475e78a6c3676b67c514220dbde2725896bbb0b6ec6ea54b2738/numba-0.60.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7da4098db31182fc5ffe4bc42c6f24cd7d1cb8a14b59fd755bfee32e34b8404", size = 2647866 }, + { url = "https://files.pythonhosted.org/packages/65/42/39559664b2e7c15689a638c2a38b3b74c6e69a04e2b3019b9f7742479188/numba-0.60.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:38d6ea4c1f56417076ecf8fc327c831ae793282e0ff51080c5094cb726507b1c", size = 2650208 }, + { url = "https://files.pythonhosted.org/packages/67/88/c4459ccc05674ef02119abf2888ccd3e2fed12a323f52255f4982fc95876/numba-0.60.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:62908d29fb6a3229c242e981ca27e32a6e606cc253fc9e8faeb0e48760de241e", size = 3466946 }, + { url = "https://files.pythonhosted.org/packages/8b/41/ac11cf33524def12aa5bd698226ae196a1185831c05ed29dc0c56eaa308b/numba-0.60.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0ebaa91538e996f708f1ab30ef4d3ddc344b64b5227b67a57aa74f401bb68b9d", size = 3761463 }, + { url = "https://files.pythonhosted.org/packages/ca/bd/0fe29fcd1b6a8de479a4ed25c6e56470e467e3611c079d55869ceef2b6d1/numba-0.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:f75262e8fe7fa96db1dca93d53a194a38c46da28b112b8a4aca168f0df860347", size = 2707588 }, + { url = "https://files.pythonhosted.org/packages/68/1a/87c53f836cdf557083248c3f47212271f220280ff766538795e77c8c6bbf/numba-0.60.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:01ef4cd7d83abe087d644eaa3d95831b777aa21d441a23703d649e06b8e06b74", size = 2647186 }, + { url = "https://files.pythonhosted.org/packages/28/14/a5baa1f2edea7b49afa4dc1bb1b126645198cf1075186853b5b497be826e/numba-0.60.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:819a3dfd4630d95fd574036f99e47212a1af41cbcb019bf8afac63ff56834449", size = 2650038 }, + { url = "https://files.pythonhosted.org/packages/3b/bd/f1985719ff34e37e07bb18f9d3acd17e5a21da255f550c8eae031e2ddf5f/numba-0.60.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b983bd6ad82fe868493012487f34eae8bf7dd94654951404114f23c3466d34b", size = 3403010 }, + { url = "https://files.pythonhosted.org/packages/54/9b/cd73d3f6617ddc8398a63ef97d8dc9139a9879b9ca8a7ca4b8789056ea46/numba-0.60.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c151748cd269ddeab66334bd754817ffc0cabd9433acb0f551697e5151917d25", size = 3695086 }, + { url = "https://files.pythonhosted.org/packages/01/01/8b7b670c77c5ea0e47e283d82332969bf672ab6410d0b2610cac5b7a3ded/numba-0.60.0-cp39-cp39-win_amd64.whl", hash = "sha256:3031547a015710140e8c87226b4cfe927cac199835e5bf7d4fe5cb64e814e3ab", size = 2686978 }, ] [[package]] @@ -2226,28 +2226,28 @@ dependencies = [ { name = "llvmlite", version = "0.44.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1c/a0/e21f57604304aa03ebb8e098429222722ad99176a4f979d34af1d1ee80da/numba-0.61.2.tar.gz", hash = "sha256:8750ee147940a6637b80ecf7f95062185ad8726c8c28a2295b8ec1160a196f7d", size = 2820615, upload-time = "2025-04-09T02:58:07.659Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/ca/f470be59552ccbf9531d2d383b67ae0b9b524d435fb4a0d229fef135116e/numba-0.61.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:cf9f9fc00d6eca0c23fc840817ce9f439b9f03c8f03d6246c0e7f0cb15b7162a", size = 2775663, upload-time = "2025-04-09T02:57:34.143Z" }, - { url = "https://files.pythonhosted.org/packages/f5/13/3bdf52609c80d460a3b4acfb9fdb3817e392875c0d6270cf3fd9546f138b/numba-0.61.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ea0247617edcb5dd61f6106a56255baab031acc4257bddaeddb3a1003b4ca3fd", size = 2778344, upload-time = "2025-04-09T02:57:36.609Z" }, - { url = "https://files.pythonhosted.org/packages/e2/7d/bfb2805bcfbd479f04f835241ecf28519f6e3609912e3a985aed45e21370/numba-0.61.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae8c7a522c26215d5f62ebec436e3d341f7f590079245a2f1008dfd498cc1642", size = 3824054, upload-time = "2025-04-09T02:57:38.162Z" }, - { url = "https://files.pythonhosted.org/packages/e3/27/797b2004745c92955470c73c82f0e300cf033c791f45bdecb4b33b12bdea/numba-0.61.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd1e74609855aa43661edffca37346e4e8462f6903889917e9f41db40907daa2", size = 3518531, upload-time = "2025-04-09T02:57:39.709Z" }, - { url = "https://files.pythonhosted.org/packages/b1/c6/c2fb11e50482cb310afae87a997707f6c7d8a48967b9696271347441f650/numba-0.61.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae45830b129c6137294093b269ef0a22998ccc27bf7cf096ab8dcf7bca8946f9", size = 2831612, upload-time = "2025-04-09T02:57:41.559Z" }, - { url = "https://files.pythonhosted.org/packages/3f/97/c99d1056aed767503c228f7099dc11c402906b42a4757fec2819329abb98/numba-0.61.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:efd3db391df53aaa5cfbee189b6c910a5b471488749fd6606c3f33fc984c2ae2", size = 2775825, upload-time = "2025-04-09T02:57:43.442Z" }, - { url = "https://files.pythonhosted.org/packages/95/9e/63c549f37136e892f006260c3e2613d09d5120672378191f2dc387ba65a2/numba-0.61.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:49c980e4171948ffebf6b9a2520ea81feed113c1f4890747ba7f59e74be84b1b", size = 2778695, upload-time = "2025-04-09T02:57:44.968Z" }, - { url = "https://files.pythonhosted.org/packages/97/c8/8740616c8436c86c1b9a62e72cb891177d2c34c2d24ddcde4c390371bf4c/numba-0.61.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3945615cd73c2c7eba2a85ccc9c1730c21cd3958bfcf5a44302abae0fb07bb60", size = 3829227, upload-time = "2025-04-09T02:57:46.63Z" }, - { url = "https://files.pythonhosted.org/packages/fc/06/66e99ae06507c31d15ff3ecd1f108f2f59e18b6e08662cd5f8a5853fbd18/numba-0.61.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbfdf4eca202cebade0b7d43896978e146f39398909a42941c9303f82f403a18", size = 3523422, upload-time = "2025-04-09T02:57:48.222Z" }, - { url = "https://files.pythonhosted.org/packages/0f/a4/2b309a6a9f6d4d8cfba583401c7c2f9ff887adb5d54d8e2e130274c0973f/numba-0.61.2-cp311-cp311-win_amd64.whl", hash = "sha256:76bcec9f46259cedf888041b9886e257ae101c6268261b19fda8cfbc52bec9d1", size = 2831505, upload-time = "2025-04-09T02:57:50.108Z" }, - { url = "https://files.pythonhosted.org/packages/b4/a0/c6b7b9c615cfa3b98c4c63f4316e3f6b3bbe2387740277006551784218cd/numba-0.61.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:34fba9406078bac7ab052efbf0d13939426c753ad72946baaa5bf9ae0ebb8dd2", size = 2776626, upload-time = "2025-04-09T02:57:51.857Z" }, - { url = "https://files.pythonhosted.org/packages/92/4a/fe4e3c2ecad72d88f5f8cd04e7f7cff49e718398a2fac02d2947480a00ca/numba-0.61.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ddce10009bc097b080fc96876d14c051cc0c7679e99de3e0af59014dab7dfe8", size = 2779287, upload-time = "2025-04-09T02:57:53.658Z" }, - { url = "https://files.pythonhosted.org/packages/9a/2d/e518df036feab381c23a624dac47f8445ac55686ec7f11083655eb707da3/numba-0.61.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b1bb509d01f23d70325d3a5a0e237cbc9544dd50e50588bc581ba860c213546", size = 3885928, upload-time = "2025-04-09T02:57:55.206Z" }, - { url = "https://files.pythonhosted.org/packages/10/0f/23cced68ead67b75d77cfcca3df4991d1855c897ee0ff3fe25a56ed82108/numba-0.61.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48a53a3de8f8793526cbe330f2a39fe9a6638efcbf11bd63f3d2f9757ae345cd", size = 3577115, upload-time = "2025-04-09T02:57:56.818Z" }, - { url = "https://files.pythonhosted.org/packages/68/1d/ddb3e704c5a8fb90142bf9dc195c27db02a08a99f037395503bfbc1d14b3/numba-0.61.2-cp312-cp312-win_amd64.whl", hash = "sha256:97cf4f12c728cf77c9c1d7c23707e4d8fb4632b46275f8f3397de33e5877af18", size = 2831929, upload-time = "2025-04-09T02:57:58.45Z" }, - { url = "https://files.pythonhosted.org/packages/0b/f3/0fe4c1b1f2569e8a18ad90c159298d862f96c3964392a20d74fc628aee44/numba-0.61.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:3a10a8fc9afac40b1eac55717cece1b8b1ac0b946f5065c89e00bde646b5b154", size = 2771785, upload-time = "2025-04-09T02:57:59.96Z" }, - { url = "https://files.pythonhosted.org/packages/e9/71/91b277d712e46bd5059f8a5866862ed1116091a7cb03bd2704ba8ebe015f/numba-0.61.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d3bcada3c9afba3bed413fba45845f2fb9cd0d2b27dd58a1be90257e293d140", size = 2773289, upload-time = "2025-04-09T02:58:01.435Z" }, - { url = "https://files.pythonhosted.org/packages/0d/e0/5ea04e7ad2c39288c0f0f9e8d47638ad70f28e275d092733b5817cf243c9/numba-0.61.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bdbca73ad81fa196bd53dc12e3aaf1564ae036e0c125f237c7644fe64a4928ab", size = 3893918, upload-time = "2025-04-09T02:58:02.933Z" }, - { url = "https://files.pythonhosted.org/packages/17/58/064f4dcb7d7e9412f16ecf80ed753f92297e39f399c905389688cf950b81/numba-0.61.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5f154aaea625fb32cfbe3b80c5456d514d416fcdf79733dd69c0df3a11348e9e", size = 3584056, upload-time = "2025-04-09T02:58:04.538Z" }, - { url = "https://files.pythonhosted.org/packages/af/a4/6d3a0f2d3989e62a18749e1e9913d5fa4910bbb3e3311a035baea6caf26d/numba-0.61.2-cp313-cp313-win_amd64.whl", hash = "sha256:59321215e2e0ac5fa928a8020ab00b8e57cda8a97384963ac0dfa4d4e6aa54e7", size = 2831846, upload-time = "2025-04-09T02:58:06.125Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/1c/a0/e21f57604304aa03ebb8e098429222722ad99176a4f979d34af1d1ee80da/numba-0.61.2.tar.gz", hash = "sha256:8750ee147940a6637b80ecf7f95062185ad8726c8c28a2295b8ec1160a196f7d", size = 2820615 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/ca/f470be59552ccbf9531d2d383b67ae0b9b524d435fb4a0d229fef135116e/numba-0.61.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:cf9f9fc00d6eca0c23fc840817ce9f439b9f03c8f03d6246c0e7f0cb15b7162a", size = 2775663 }, + { url = "https://files.pythonhosted.org/packages/f5/13/3bdf52609c80d460a3b4acfb9fdb3817e392875c0d6270cf3fd9546f138b/numba-0.61.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ea0247617edcb5dd61f6106a56255baab031acc4257bddaeddb3a1003b4ca3fd", size = 2778344 }, + { url = "https://files.pythonhosted.org/packages/e2/7d/bfb2805bcfbd479f04f835241ecf28519f6e3609912e3a985aed45e21370/numba-0.61.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae8c7a522c26215d5f62ebec436e3d341f7f590079245a2f1008dfd498cc1642", size = 3824054 }, + { url = "https://files.pythonhosted.org/packages/e3/27/797b2004745c92955470c73c82f0e300cf033c791f45bdecb4b33b12bdea/numba-0.61.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd1e74609855aa43661edffca37346e4e8462f6903889917e9f41db40907daa2", size = 3518531 }, + { url = "https://files.pythonhosted.org/packages/b1/c6/c2fb11e50482cb310afae87a997707f6c7d8a48967b9696271347441f650/numba-0.61.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae45830b129c6137294093b269ef0a22998ccc27bf7cf096ab8dcf7bca8946f9", size = 2831612 }, + { url = "https://files.pythonhosted.org/packages/3f/97/c99d1056aed767503c228f7099dc11c402906b42a4757fec2819329abb98/numba-0.61.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:efd3db391df53aaa5cfbee189b6c910a5b471488749fd6606c3f33fc984c2ae2", size = 2775825 }, + { url = "https://files.pythonhosted.org/packages/95/9e/63c549f37136e892f006260c3e2613d09d5120672378191f2dc387ba65a2/numba-0.61.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:49c980e4171948ffebf6b9a2520ea81feed113c1f4890747ba7f59e74be84b1b", size = 2778695 }, + { url = "https://files.pythonhosted.org/packages/97/c8/8740616c8436c86c1b9a62e72cb891177d2c34c2d24ddcde4c390371bf4c/numba-0.61.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3945615cd73c2c7eba2a85ccc9c1730c21cd3958bfcf5a44302abae0fb07bb60", size = 3829227 }, + { url = "https://files.pythonhosted.org/packages/fc/06/66e99ae06507c31d15ff3ecd1f108f2f59e18b6e08662cd5f8a5853fbd18/numba-0.61.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbfdf4eca202cebade0b7d43896978e146f39398909a42941c9303f82f403a18", size = 3523422 }, + { url = "https://files.pythonhosted.org/packages/0f/a4/2b309a6a9f6d4d8cfba583401c7c2f9ff887adb5d54d8e2e130274c0973f/numba-0.61.2-cp311-cp311-win_amd64.whl", hash = "sha256:76bcec9f46259cedf888041b9886e257ae101c6268261b19fda8cfbc52bec9d1", size = 2831505 }, + { url = "https://files.pythonhosted.org/packages/b4/a0/c6b7b9c615cfa3b98c4c63f4316e3f6b3bbe2387740277006551784218cd/numba-0.61.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:34fba9406078bac7ab052efbf0d13939426c753ad72946baaa5bf9ae0ebb8dd2", size = 2776626 }, + { url = "https://files.pythonhosted.org/packages/92/4a/fe4e3c2ecad72d88f5f8cd04e7f7cff49e718398a2fac02d2947480a00ca/numba-0.61.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ddce10009bc097b080fc96876d14c051cc0c7679e99de3e0af59014dab7dfe8", size = 2779287 }, + { url = "https://files.pythonhosted.org/packages/9a/2d/e518df036feab381c23a624dac47f8445ac55686ec7f11083655eb707da3/numba-0.61.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b1bb509d01f23d70325d3a5a0e237cbc9544dd50e50588bc581ba860c213546", size = 3885928 }, + { url = "https://files.pythonhosted.org/packages/10/0f/23cced68ead67b75d77cfcca3df4991d1855c897ee0ff3fe25a56ed82108/numba-0.61.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48a53a3de8f8793526cbe330f2a39fe9a6638efcbf11bd63f3d2f9757ae345cd", size = 3577115 }, + { url = "https://files.pythonhosted.org/packages/68/1d/ddb3e704c5a8fb90142bf9dc195c27db02a08a99f037395503bfbc1d14b3/numba-0.61.2-cp312-cp312-win_amd64.whl", hash = "sha256:97cf4f12c728cf77c9c1d7c23707e4d8fb4632b46275f8f3397de33e5877af18", size = 2831929 }, + { url = "https://files.pythonhosted.org/packages/0b/f3/0fe4c1b1f2569e8a18ad90c159298d862f96c3964392a20d74fc628aee44/numba-0.61.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:3a10a8fc9afac40b1eac55717cece1b8b1ac0b946f5065c89e00bde646b5b154", size = 2771785 }, + { url = "https://files.pythonhosted.org/packages/e9/71/91b277d712e46bd5059f8a5866862ed1116091a7cb03bd2704ba8ebe015f/numba-0.61.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d3bcada3c9afba3bed413fba45845f2fb9cd0d2b27dd58a1be90257e293d140", size = 2773289 }, + { url = "https://files.pythonhosted.org/packages/0d/e0/5ea04e7ad2c39288c0f0f9e8d47638ad70f28e275d092733b5817cf243c9/numba-0.61.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bdbca73ad81fa196bd53dc12e3aaf1564ae036e0c125f237c7644fe64a4928ab", size = 3893918 }, + { url = "https://files.pythonhosted.org/packages/17/58/064f4dcb7d7e9412f16ecf80ed753f92297e39f399c905389688cf950b81/numba-0.61.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5f154aaea625fb32cfbe3b80c5456d514d416fcdf79733dd69c0df3a11348e9e", size = 3584056 }, + { url = "https://files.pythonhosted.org/packages/af/a4/6d3a0f2d3989e62a18749e1e9913d5fa4910bbb3e3311a035baea6caf26d/numba-0.61.2-cp313-cp313-win_amd64.whl", hash = "sha256:59321215e2e0ac5fa928a8020ab00b8e57cda8a97384963ac0dfa4d4e6aa54e7", size = 2831846 }, ] [[package]] @@ -2258,52 +2258,52 @@ resolution-markers = [ "python_full_version >= '3.9.2' and python_full_version < '3.10'", "python_full_version < '3.9.2'", ] -sdist = { url = "https://files.pythonhosted.org/packages/a9/75/10dd1f8116a8b796cb2c737b674e02d02e80454bda953fa7e65d8c12b016/numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78", size = 18902015, upload-time = "2024-08-26T20:19:40.945Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/21/91/3495b3237510f79f5d81f2508f9f13fea78ebfdf07538fc7444badda173d/numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece", size = 21165245, upload-time = "2024-08-26T20:04:14.625Z" }, - { url = "https://files.pythonhosted.org/packages/05/33/26178c7d437a87082d11019292dce6d3fe6f0e9026b7b2309cbf3e489b1d/numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04", size = 13738540, upload-time = "2024-08-26T20:04:36.784Z" }, - { url = "https://files.pythonhosted.org/packages/ec/31/cc46e13bf07644efc7a4bf68df2df5fb2a1a88d0cd0da9ddc84dc0033e51/numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66", size = 5300623, upload-time = "2024-08-26T20:04:46.491Z" }, - { url = "https://files.pythonhosted.org/packages/6e/16/7bfcebf27bb4f9d7ec67332ffebee4d1bf085c84246552d52dbb548600e7/numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b", size = 6901774, upload-time = "2024-08-26T20:04:58.173Z" }, - { url = "https://files.pythonhosted.org/packages/f9/a3/561c531c0e8bf082c5bef509d00d56f82e0ea7e1e3e3a7fc8fa78742a6e5/numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd", size = 13907081, upload-time = "2024-08-26T20:05:19.098Z" }, - { url = "https://files.pythonhosted.org/packages/fa/66/f7177ab331876200ac7563a580140643d1179c8b4b6a6b0fc9838de2a9b8/numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318", size = 19523451, upload-time = "2024-08-26T20:05:47.479Z" }, - { url = "https://files.pythonhosted.org/packages/25/7f/0b209498009ad6453e4efc2c65bcdf0ae08a182b2b7877d7ab38a92dc542/numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8", size = 19927572, upload-time = "2024-08-26T20:06:17.137Z" }, - { url = "https://files.pythonhosted.org/packages/3e/df/2619393b1e1b565cd2d4c4403bdd979621e2c4dea1f8532754b2598ed63b/numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326", size = 14400722, upload-time = "2024-08-26T20:06:39.16Z" }, - { url = "https://files.pythonhosted.org/packages/22/ad/77e921b9f256d5da36424ffb711ae79ca3f451ff8489eeca544d0701d74a/numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97", size = 6472170, upload-time = "2024-08-26T20:06:50.361Z" }, - { url = "https://files.pythonhosted.org/packages/10/05/3442317535028bc29cf0c0dd4c191a4481e8376e9f0db6bcf29703cadae6/numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131", size = 15905558, upload-time = "2024-08-26T20:07:13.881Z" }, - { url = "https://files.pythonhosted.org/packages/8b/cf/034500fb83041aa0286e0fb16e7c76e5c8b67c0711bb6e9e9737a717d5fe/numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448", size = 21169137, upload-time = "2024-08-26T20:07:45.345Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d9/32de45561811a4b87fbdee23b5797394e3d1504b4a7cf40c10199848893e/numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195", size = 13703552, upload-time = "2024-08-26T20:08:06.666Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ca/2f384720020c7b244d22508cb7ab23d95f179fcfff33c31a6eeba8d6c512/numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57", size = 5298957, upload-time = "2024-08-26T20:08:15.83Z" }, - { url = "https://files.pythonhosted.org/packages/0e/78/a3e4f9fb6aa4e6fdca0c5428e8ba039408514388cf62d89651aade838269/numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a", size = 6905573, upload-time = "2024-08-26T20:08:27.185Z" }, - { url = "https://files.pythonhosted.org/packages/a0/72/cfc3a1beb2caf4efc9d0b38a15fe34025230da27e1c08cc2eb9bfb1c7231/numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669", size = 13914330, upload-time = "2024-08-26T20:08:48.058Z" }, - { url = "https://files.pythonhosted.org/packages/ba/a8/c17acf65a931ce551fee11b72e8de63bf7e8a6f0e21add4c937c83563538/numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951", size = 19534895, upload-time = "2024-08-26T20:09:16.536Z" }, - { url = "https://files.pythonhosted.org/packages/ba/86/8767f3d54f6ae0165749f84648da9dcc8cd78ab65d415494962c86fac80f/numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9", size = 19937253, upload-time = "2024-08-26T20:09:46.263Z" }, - { url = "https://files.pythonhosted.org/packages/df/87/f76450e6e1c14e5bb1eae6836478b1028e096fd02e85c1c37674606ab752/numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15", size = 14414074, upload-time = "2024-08-26T20:10:08.483Z" }, - { url = "https://files.pythonhosted.org/packages/5c/ca/0f0f328e1e59f73754f06e1adfb909de43726d4f24c6a3f8805f34f2b0fa/numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4", size = 6470640, upload-time = "2024-08-26T20:10:19.732Z" }, - { url = "https://files.pythonhosted.org/packages/eb/57/3a3f14d3a759dcf9bf6e9eda905794726b758819df4663f217d658a58695/numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc", size = 15910230, upload-time = "2024-08-26T20:10:43.413Z" }, - { url = "https://files.pythonhosted.org/packages/45/40/2e117be60ec50d98fa08c2f8c48e09b3edea93cfcabd5a9ff6925d54b1c2/numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b", size = 20895803, upload-time = "2024-08-26T20:11:13.916Z" }, - { url = "https://files.pythonhosted.org/packages/46/92/1b8b8dee833f53cef3e0a3f69b2374467789e0bb7399689582314df02651/numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e", size = 13471835, upload-time = "2024-08-26T20:11:34.779Z" }, - { url = "https://files.pythonhosted.org/packages/7f/19/e2793bde475f1edaea6945be141aef6c8b4c669b90c90a300a8954d08f0a/numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c", size = 5038499, upload-time = "2024-08-26T20:11:43.902Z" }, - { url = "https://files.pythonhosted.org/packages/e3/ff/ddf6dac2ff0dd50a7327bcdba45cb0264d0e96bb44d33324853f781a8f3c/numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c", size = 6633497, upload-time = "2024-08-26T20:11:55.09Z" }, - { url = "https://files.pythonhosted.org/packages/72/21/67f36eac8e2d2cd652a2e69595a54128297cdcb1ff3931cfc87838874bd4/numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692", size = 13621158, upload-time = "2024-08-26T20:12:14.95Z" }, - { url = "https://files.pythonhosted.org/packages/39/68/e9f1126d757653496dbc096cb429014347a36b228f5a991dae2c6b6cfd40/numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a", size = 19236173, upload-time = "2024-08-26T20:12:44.049Z" }, - { url = "https://files.pythonhosted.org/packages/d1/e9/1f5333281e4ebf483ba1c888b1d61ba7e78d7e910fdd8e6499667041cc35/numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c", size = 19634174, upload-time = "2024-08-26T20:13:13.634Z" }, - { url = "https://files.pythonhosted.org/packages/71/af/a469674070c8d8408384e3012e064299f7a2de540738a8e414dcfd639996/numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded", size = 14099701, upload-time = "2024-08-26T20:13:34.851Z" }, - { url = "https://files.pythonhosted.org/packages/d0/3d/08ea9f239d0e0e939b6ca52ad403c84a2bce1bde301a8eb4888c1c1543f1/numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5", size = 6174313, upload-time = "2024-08-26T20:13:45.653Z" }, - { url = "https://files.pythonhosted.org/packages/b2/b5/4ac39baebf1fdb2e72585c8352c56d063b6126be9fc95bd2bb5ef5770c20/numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a", size = 15606179, upload-time = "2024-08-26T20:14:08.786Z" }, - { url = "https://files.pythonhosted.org/packages/43/c1/41c8f6df3162b0c6ffd4437d729115704bd43363de0090c7f913cfbc2d89/numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c", size = 21169942, upload-time = "2024-08-26T20:14:40.108Z" }, - { url = "https://files.pythonhosted.org/packages/39/bc/fd298f308dcd232b56a4031fd6ddf11c43f9917fbc937e53762f7b5a3bb1/numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd", size = 13711512, upload-time = "2024-08-26T20:15:00.985Z" }, - { url = "https://files.pythonhosted.org/packages/96/ff/06d1aa3eeb1c614eda245c1ba4fb88c483bee6520d361641331872ac4b82/numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b", size = 5306976, upload-time = "2024-08-26T20:15:10.876Z" }, - { url = "https://files.pythonhosted.org/packages/2d/98/121996dcfb10a6087a05e54453e28e58694a7db62c5a5a29cee14c6e047b/numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729", size = 6906494, upload-time = "2024-08-26T20:15:22.055Z" }, - { url = "https://files.pythonhosted.org/packages/15/31/9dffc70da6b9bbf7968f6551967fc21156207366272c2a40b4ed6008dc9b/numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1", size = 13912596, upload-time = "2024-08-26T20:15:42.452Z" }, - { url = "https://files.pythonhosted.org/packages/b9/14/78635daab4b07c0930c919d451b8bf8c164774e6a3413aed04a6d95758ce/numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd", size = 19526099, upload-time = "2024-08-26T20:16:11.048Z" }, - { url = "https://files.pythonhosted.org/packages/26/4c/0eeca4614003077f68bfe7aac8b7496f04221865b3a5e7cb230c9d055afd/numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d", size = 19932823, upload-time = "2024-08-26T20:16:40.171Z" }, - { url = "https://files.pythonhosted.org/packages/f1/46/ea25b98b13dccaebddf1a803f8c748680d972e00507cd9bc6dcdb5aa2ac1/numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d", size = 14404424, upload-time = "2024-08-26T20:17:02.604Z" }, - { url = "https://files.pythonhosted.org/packages/c8/a6/177dd88d95ecf07e722d21008b1b40e681a929eb9e329684d449c36586b2/numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa", size = 6476809, upload-time = "2024-08-26T20:17:13.553Z" }, - { url = "https://files.pythonhosted.org/packages/ea/2b/7fc9f4e7ae5b507c1a3a21f0f15ed03e794c1242ea8a242ac158beb56034/numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73", size = 15911314, upload-time = "2024-08-26T20:17:36.72Z" }, - { url = "https://files.pythonhosted.org/packages/8f/3b/df5a870ac6a3be3a86856ce195ef42eec7ae50d2a202be1f5a4b3b340e14/numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8", size = 21025288, upload-time = "2024-08-26T20:18:07.732Z" }, - { url = "https://files.pythonhosted.org/packages/2c/97/51af92f18d6f6f2d9ad8b482a99fb74e142d71372da5d834b3a2747a446e/numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4", size = 6762793, upload-time = "2024-08-26T20:18:19.125Z" }, - { url = "https://files.pythonhosted.org/packages/12/46/de1fbd0c1b5ccaa7f9a005b66761533e2f6a3e560096682683a223631fe9/numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c", size = 19334885, upload-time = "2024-08-26T20:18:47.237Z" }, - { url = "https://files.pythonhosted.org/packages/cc/dc/d330a6faefd92b446ec0f0dfea4c3207bb1fef3c4771d19cf4543efd2c78/numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385", size = 15828784, upload-time = "2024-08-26T20:19:11.19Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a9/75/10dd1f8116a8b796cb2c737b674e02d02e80454bda953fa7e65d8c12b016/numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78", size = 18902015 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/91/3495b3237510f79f5d81f2508f9f13fea78ebfdf07538fc7444badda173d/numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece", size = 21165245 }, + { url = "https://files.pythonhosted.org/packages/05/33/26178c7d437a87082d11019292dce6d3fe6f0e9026b7b2309cbf3e489b1d/numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04", size = 13738540 }, + { url = "https://files.pythonhosted.org/packages/ec/31/cc46e13bf07644efc7a4bf68df2df5fb2a1a88d0cd0da9ddc84dc0033e51/numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66", size = 5300623 }, + { url = "https://files.pythonhosted.org/packages/6e/16/7bfcebf27bb4f9d7ec67332ffebee4d1bf085c84246552d52dbb548600e7/numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b", size = 6901774 }, + { url = "https://files.pythonhosted.org/packages/f9/a3/561c531c0e8bf082c5bef509d00d56f82e0ea7e1e3e3a7fc8fa78742a6e5/numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd", size = 13907081 }, + { url = "https://files.pythonhosted.org/packages/fa/66/f7177ab331876200ac7563a580140643d1179c8b4b6a6b0fc9838de2a9b8/numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318", size = 19523451 }, + { url = "https://files.pythonhosted.org/packages/25/7f/0b209498009ad6453e4efc2c65bcdf0ae08a182b2b7877d7ab38a92dc542/numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8", size = 19927572 }, + { url = "https://files.pythonhosted.org/packages/3e/df/2619393b1e1b565cd2d4c4403bdd979621e2c4dea1f8532754b2598ed63b/numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326", size = 14400722 }, + { url = "https://files.pythonhosted.org/packages/22/ad/77e921b9f256d5da36424ffb711ae79ca3f451ff8489eeca544d0701d74a/numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97", size = 6472170 }, + { url = "https://files.pythonhosted.org/packages/10/05/3442317535028bc29cf0c0dd4c191a4481e8376e9f0db6bcf29703cadae6/numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131", size = 15905558 }, + { url = "https://files.pythonhosted.org/packages/8b/cf/034500fb83041aa0286e0fb16e7c76e5c8b67c0711bb6e9e9737a717d5fe/numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448", size = 21169137 }, + { url = "https://files.pythonhosted.org/packages/4a/d9/32de45561811a4b87fbdee23b5797394e3d1504b4a7cf40c10199848893e/numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195", size = 13703552 }, + { url = "https://files.pythonhosted.org/packages/c1/ca/2f384720020c7b244d22508cb7ab23d95f179fcfff33c31a6eeba8d6c512/numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57", size = 5298957 }, + { url = "https://files.pythonhosted.org/packages/0e/78/a3e4f9fb6aa4e6fdca0c5428e8ba039408514388cf62d89651aade838269/numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a", size = 6905573 }, + { url = "https://files.pythonhosted.org/packages/a0/72/cfc3a1beb2caf4efc9d0b38a15fe34025230da27e1c08cc2eb9bfb1c7231/numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669", size = 13914330 }, + { url = "https://files.pythonhosted.org/packages/ba/a8/c17acf65a931ce551fee11b72e8de63bf7e8a6f0e21add4c937c83563538/numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951", size = 19534895 }, + { url = "https://files.pythonhosted.org/packages/ba/86/8767f3d54f6ae0165749f84648da9dcc8cd78ab65d415494962c86fac80f/numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9", size = 19937253 }, + { url = "https://files.pythonhosted.org/packages/df/87/f76450e6e1c14e5bb1eae6836478b1028e096fd02e85c1c37674606ab752/numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15", size = 14414074 }, + { url = "https://files.pythonhosted.org/packages/5c/ca/0f0f328e1e59f73754f06e1adfb909de43726d4f24c6a3f8805f34f2b0fa/numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4", size = 6470640 }, + { url = "https://files.pythonhosted.org/packages/eb/57/3a3f14d3a759dcf9bf6e9eda905794726b758819df4663f217d658a58695/numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc", size = 15910230 }, + { url = "https://files.pythonhosted.org/packages/45/40/2e117be60ec50d98fa08c2f8c48e09b3edea93cfcabd5a9ff6925d54b1c2/numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b", size = 20895803 }, + { url = "https://files.pythonhosted.org/packages/46/92/1b8b8dee833f53cef3e0a3f69b2374467789e0bb7399689582314df02651/numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e", size = 13471835 }, + { url = "https://files.pythonhosted.org/packages/7f/19/e2793bde475f1edaea6945be141aef6c8b4c669b90c90a300a8954d08f0a/numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c", size = 5038499 }, + { url = "https://files.pythonhosted.org/packages/e3/ff/ddf6dac2ff0dd50a7327bcdba45cb0264d0e96bb44d33324853f781a8f3c/numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c", size = 6633497 }, + { url = "https://files.pythonhosted.org/packages/72/21/67f36eac8e2d2cd652a2e69595a54128297cdcb1ff3931cfc87838874bd4/numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692", size = 13621158 }, + { url = "https://files.pythonhosted.org/packages/39/68/e9f1126d757653496dbc096cb429014347a36b228f5a991dae2c6b6cfd40/numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a", size = 19236173 }, + { url = "https://files.pythonhosted.org/packages/d1/e9/1f5333281e4ebf483ba1c888b1d61ba7e78d7e910fdd8e6499667041cc35/numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c", size = 19634174 }, + { url = "https://files.pythonhosted.org/packages/71/af/a469674070c8d8408384e3012e064299f7a2de540738a8e414dcfd639996/numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded", size = 14099701 }, + { url = "https://files.pythonhosted.org/packages/d0/3d/08ea9f239d0e0e939b6ca52ad403c84a2bce1bde301a8eb4888c1c1543f1/numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5", size = 6174313 }, + { url = "https://files.pythonhosted.org/packages/b2/b5/4ac39baebf1fdb2e72585c8352c56d063b6126be9fc95bd2bb5ef5770c20/numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a", size = 15606179 }, + { url = "https://files.pythonhosted.org/packages/43/c1/41c8f6df3162b0c6ffd4437d729115704bd43363de0090c7f913cfbc2d89/numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c", size = 21169942 }, + { url = "https://files.pythonhosted.org/packages/39/bc/fd298f308dcd232b56a4031fd6ddf11c43f9917fbc937e53762f7b5a3bb1/numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd", size = 13711512 }, + { url = "https://files.pythonhosted.org/packages/96/ff/06d1aa3eeb1c614eda245c1ba4fb88c483bee6520d361641331872ac4b82/numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b", size = 5306976 }, + { url = "https://files.pythonhosted.org/packages/2d/98/121996dcfb10a6087a05e54453e28e58694a7db62c5a5a29cee14c6e047b/numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729", size = 6906494 }, + { url = "https://files.pythonhosted.org/packages/15/31/9dffc70da6b9bbf7968f6551967fc21156207366272c2a40b4ed6008dc9b/numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1", size = 13912596 }, + { url = "https://files.pythonhosted.org/packages/b9/14/78635daab4b07c0930c919d451b8bf8c164774e6a3413aed04a6d95758ce/numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd", size = 19526099 }, + { url = "https://files.pythonhosted.org/packages/26/4c/0eeca4614003077f68bfe7aac8b7496f04221865b3a5e7cb230c9d055afd/numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d", size = 19932823 }, + { url = "https://files.pythonhosted.org/packages/f1/46/ea25b98b13dccaebddf1a803f8c748680d972e00507cd9bc6dcdb5aa2ac1/numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d", size = 14404424 }, + { url = "https://files.pythonhosted.org/packages/c8/a6/177dd88d95ecf07e722d21008b1b40e681a929eb9e329684d449c36586b2/numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa", size = 6476809 }, + { url = "https://files.pythonhosted.org/packages/ea/2b/7fc9f4e7ae5b507c1a3a21f0f15ed03e794c1242ea8a242ac158beb56034/numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73", size = 15911314 }, + { url = "https://files.pythonhosted.org/packages/8f/3b/df5a870ac6a3be3a86856ce195ef42eec7ae50d2a202be1f5a4b3b340e14/numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8", size = 21025288 }, + { url = "https://files.pythonhosted.org/packages/2c/97/51af92f18d6f6f2d9ad8b482a99fb74e142d71372da5d834b3a2747a446e/numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4", size = 6762793 }, + { url = "https://files.pythonhosted.org/packages/12/46/de1fbd0c1b5ccaa7f9a005b66761533e2f6a3e560096682683a223631fe9/numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c", size = 19334885 }, + { url = "https://files.pythonhosted.org/packages/cc/dc/d330a6faefd92b446ec0f0dfea4c3207bb1fef3c4771d19cf4543efd2c78/numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385", size = 15828784 }, ] [[package]] @@ -2316,71 +2316,71 @@ resolution-markers = [ "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] -sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, - { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, - { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, - { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, - { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, - { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, - { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, - { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, - { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, - { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, - { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, - { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, - { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, - { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, - { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, - { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, - { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, - { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, - { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, - { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, - { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, - { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, - { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, - { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, - { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, - { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, - { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, - { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, - { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, - { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, - { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, - { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, - { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, - { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, - { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, - { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, - { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, - { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, - { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, - { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, - { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, - { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, - { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, - { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, - { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, - { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, - { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, - { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, - { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, - { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, - { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, - { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245 }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048 }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542 }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301 }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320 }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050 }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034 }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185 }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149 }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620 }, + { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963 }, + { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743 }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616 }, + { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579 }, + { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005 }, + { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570 }, + { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548 }, + { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521 }, + { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866 }, + { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455 }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348 }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362 }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103 }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382 }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462 }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618 }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511 }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783 }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506 }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190 }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828 }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006 }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765 }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736 }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719 }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072 }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213 }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632 }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532 }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885 }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467 }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144 }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217 }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014 }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935 }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122 }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143 }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260 }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225 }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374 }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391 }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754 }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476 }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666 }, ] [[package]] name = "openqasm3" version = "1.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/92/a0/678ce1e4efbeb1cf06a7728b4056754e52bfd2c5cad174dae0f2a17b2d03/openqasm3-1.0.1.tar.gz", hash = "sha256:c589dc05d4ced50ca24167d14e0f2c916e717499ba0442e0ff2a3030ef312d0a", size = 536861, upload-time = "2025-02-19T22:51:06.204Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/a0/678ce1e4efbeb1cf06a7728b4056754e52bfd2c5cad174dae0f2a17b2d03/openqasm3-1.0.1.tar.gz", hash = "sha256:c589dc05d4ced50ca24167d14e0f2c916e717499ba0442e0ff2a3030ef312d0a", size = 536861 } wheels = [ - { url = "https://files.pythonhosted.org/packages/75/dd/2aa7698341948f3229f7a1cb75e84d9677444d9c730632d1907716574dc5/openqasm3-1.0.1-py3-none-any.whl", hash = "sha256:0d3a1ebe3465e3ea619bcaa369858bba8944cbb0c49604b24f94662d3ec41d41", size = 541545, upload-time = "2025-02-19T22:51:01.852Z" }, + { url = "https://files.pythonhosted.org/packages/75/dd/2aa7698341948f3229f7a1cb75e84d9677444d9c730632d1907716574dc5/openqasm3-1.0.1-py3-none-any.whl", hash = "sha256:0d3a1ebe3465e3ea619bcaa369858bba8944cbb0c49604b24f94662d3ec41d41", size = 541545 }, ] [package.optional-dependencies] @@ -2393,9 +2393,9 @@ parser = [ name = "packaging" version = "25.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, ] [[package]] @@ -2409,58 +2409,58 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d1/6f/75aa71f8a14267117adeeed5d21b204770189c0a0025acbdc03c337b28fc/pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2", size = 4487493, upload-time = "2025-07-07T19:20:04.079Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/ca/aa97b47287221fa37a49634532e520300088e290b20d690b21ce3e448143/pandas-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22c2e866f7209ebc3a8f08d75766566aae02bcc91d196935a1d9e59c7b990ac9", size = 11542731, upload-time = "2025-07-07T19:18:12.619Z" }, - { url = "https://files.pythonhosted.org/packages/80/bf/7938dddc5f01e18e573dcfb0f1b8c9357d9b5fa6ffdee6e605b92efbdff2/pandas-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3583d348546201aff730c8c47e49bc159833f971c2899d6097bce68b9112a4f1", size = 10790031, upload-time = "2025-07-07T19:18:16.611Z" }, - { url = "https://files.pythonhosted.org/packages/ee/2f/9af748366763b2a494fed477f88051dbf06f56053d5c00eba652697e3f94/pandas-2.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f951fbb702dacd390561e0ea45cdd8ecfa7fb56935eb3dd78e306c19104b9b0", size = 11724083, upload-time = "2025-07-07T19:18:20.512Z" }, - { url = "https://files.pythonhosted.org/packages/2c/95/79ab37aa4c25d1e7df953dde407bb9c3e4ae47d154bc0dd1692f3a6dcf8c/pandas-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd05b72ec02ebfb993569b4931b2e16fbb4d6ad6ce80224a3ee838387d83a191", size = 12342360, upload-time = "2025-07-07T19:18:23.194Z" }, - { url = "https://files.pythonhosted.org/packages/75/a7/d65e5d8665c12c3c6ff5edd9709d5836ec9b6f80071b7f4a718c6106e86e/pandas-2.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1b916a627919a247d865aed068eb65eb91a344b13f5b57ab9f610b7716c92de1", size = 13202098, upload-time = "2025-07-07T19:18:25.558Z" }, - { url = "https://files.pythonhosted.org/packages/65/f3/4c1dbd754dbaa79dbf8b537800cb2fa1a6e534764fef50ab1f7533226c5c/pandas-2.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fe67dc676818c186d5a3d5425250e40f179c2a89145df477dd82945eaea89e97", size = 13837228, upload-time = "2025-07-07T19:18:28.344Z" }, - { url = "https://files.pythonhosted.org/packages/3f/d6/d7f5777162aa9b48ec3910bca5a58c9b5927cfd9cfde3aa64322f5ba4b9f/pandas-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:2eb789ae0274672acbd3c575b0598d213345660120a257b47b5dafdc618aec83", size = 11336561, upload-time = "2025-07-07T19:18:31.211Z" }, - { url = "https://files.pythonhosted.org/packages/76/1c/ccf70029e927e473a4476c00e0d5b32e623bff27f0402d0a92b7fc29bb9f/pandas-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2b0540963d83431f5ce8870ea02a7430adca100cec8a050f0811f8e31035541b", size = 11566608, upload-time = "2025-07-07T19:18:33.86Z" }, - { url = "https://files.pythonhosted.org/packages/ec/d3/3c37cb724d76a841f14b8f5fe57e5e3645207cc67370e4f84717e8bb7657/pandas-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fe7317f578c6a153912bd2292f02e40c1d8f253e93c599e82620c7f69755c74f", size = 10823181, upload-time = "2025-07-07T19:18:36.151Z" }, - { url = "https://files.pythonhosted.org/packages/8a/4c/367c98854a1251940edf54a4df0826dcacfb987f9068abf3e3064081a382/pandas-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6723a27ad7b244c0c79d8e7007092d7c8f0f11305770e2f4cd778b3ad5f9f85", size = 11793570, upload-time = "2025-07-07T19:18:38.385Z" }, - { url = "https://files.pythonhosted.org/packages/07/5f/63760ff107bcf5146eee41b38b3985f9055e710a72fdd637b791dea3495c/pandas-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3462c3735fe19f2638f2c3a40bd94ec2dc5ba13abbb032dd2fa1f540a075509d", size = 12378887, upload-time = "2025-07-07T19:18:41.284Z" }, - { url = "https://files.pythonhosted.org/packages/15/53/f31a9b4dfe73fe4711c3a609bd8e60238022f48eacedc257cd13ae9327a7/pandas-2.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:98bcc8b5bf7afed22cc753a28bc4d9e26e078e777066bc53fac7904ddef9a678", size = 13230957, upload-time = "2025-07-07T19:18:44.187Z" }, - { url = "https://files.pythonhosted.org/packages/e0/94/6fce6bf85b5056d065e0a7933cba2616dcb48596f7ba3c6341ec4bcc529d/pandas-2.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d544806b485ddf29e52d75b1f559142514e60ef58a832f74fb38e48d757b299", size = 13883883, upload-time = "2025-07-07T19:18:46.498Z" }, - { url = "https://files.pythonhosted.org/packages/c8/7b/bdcb1ed8fccb63d04bdb7635161d0ec26596d92c9d7a6cce964e7876b6c1/pandas-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b3cd4273d3cb3707b6fffd217204c52ed92859533e31dc03b7c5008aa933aaab", size = 11340212, upload-time = "2025-07-07T19:18:49.293Z" }, - { url = "https://files.pythonhosted.org/packages/46/de/b8445e0f5d217a99fe0eeb2f4988070908979bec3587c0633e5428ab596c/pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3", size = 11588172, upload-time = "2025-07-07T19:18:52.054Z" }, - { url = "https://files.pythonhosted.org/packages/1e/e0/801cdb3564e65a5ac041ab99ea6f1d802a6c325bb6e58c79c06a3f1cd010/pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232", size = 10717365, upload-time = "2025-07-07T19:18:54.785Z" }, - { url = "https://files.pythonhosted.org/packages/51/a5/c76a8311833c24ae61a376dbf360eb1b1c9247a5d9c1e8b356563b31b80c/pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e", size = 11280411, upload-time = "2025-07-07T19:18:57.045Z" }, - { url = "https://files.pythonhosted.org/packages/da/01/e383018feba0a1ead6cf5fe8728e5d767fee02f06a3d800e82c489e5daaf/pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4", size = 11988013, upload-time = "2025-07-07T19:18:59.771Z" }, - { url = "https://files.pythonhosted.org/packages/5b/14/cec7760d7c9507f11c97d64f29022e12a6cc4fc03ac694535e89f88ad2ec/pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8", size = 12767210, upload-time = "2025-07-07T19:19:02.944Z" }, - { url = "https://files.pythonhosted.org/packages/50/b9/6e2d2c6728ed29fb3d4d4d302504fb66f1a543e37eb2e43f352a86365cdf/pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679", size = 13440571, upload-time = "2025-07-07T19:19:06.82Z" }, - { url = "https://files.pythonhosted.org/packages/80/a5/3a92893e7399a691bad7664d977cb5e7c81cf666c81f89ea76ba2bff483d/pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8", size = 10987601, upload-time = "2025-07-07T19:19:09.589Z" }, - { url = "https://files.pythonhosted.org/packages/32/ed/ff0a67a2c5505e1854e6715586ac6693dd860fbf52ef9f81edee200266e7/pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22", size = 11531393, upload-time = "2025-07-07T19:19:12.245Z" }, - { url = "https://files.pythonhosted.org/packages/c7/db/d8f24a7cc9fb0972adab0cc80b6817e8bef888cfd0024eeb5a21c0bb5c4a/pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a", size = 10668750, upload-time = "2025-07-07T19:19:14.612Z" }, - { url = "https://files.pythonhosted.org/packages/0f/b0/80f6ec783313f1e2356b28b4fd8d2148c378370045da918c73145e6aab50/pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928", size = 11342004, upload-time = "2025-07-07T19:19:16.857Z" }, - { url = "https://files.pythonhosted.org/packages/e9/e2/20a317688435470872885e7fc8f95109ae9683dec7c50be29b56911515a5/pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9", size = 12050869, upload-time = "2025-07-07T19:19:19.265Z" }, - { url = "https://files.pythonhosted.org/packages/55/79/20d746b0a96c67203a5bee5fb4e00ac49c3e8009a39e1f78de264ecc5729/pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12", size = 12750218, upload-time = "2025-07-07T19:19:21.547Z" }, - { url = "https://files.pythonhosted.org/packages/7c/0f/145c8b41e48dbf03dd18fdd7f24f8ba95b8254a97a3379048378f33e7838/pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb", size = 13416763, upload-time = "2025-07-07T19:19:23.939Z" }, - { url = "https://files.pythonhosted.org/packages/b2/c0/54415af59db5cdd86a3d3bf79863e8cc3fa9ed265f0745254061ac09d5f2/pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956", size = 10987482, upload-time = "2025-07-07T19:19:42.699Z" }, - { url = "https://files.pythonhosted.org/packages/48/64/2fd2e400073a1230e13b8cd604c9bc95d9e3b962e5d44088ead2e8f0cfec/pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a", size = 12029159, upload-time = "2025-07-07T19:19:26.362Z" }, - { url = "https://files.pythonhosted.org/packages/d8/0a/d84fd79b0293b7ef88c760d7dca69828d867c89b6d9bc52d6a27e4d87316/pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9", size = 11393287, upload-time = "2025-07-07T19:19:29.157Z" }, - { url = "https://files.pythonhosted.org/packages/50/ae/ff885d2b6e88f3c7520bb74ba319268b42f05d7e583b5dded9837da2723f/pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275", size = 11309381, upload-time = "2025-07-07T19:19:31.436Z" }, - { url = "https://files.pythonhosted.org/packages/85/86/1fa345fc17caf5d7780d2699985c03dbe186c68fee00b526813939062bb0/pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab", size = 11883998, upload-time = "2025-07-07T19:19:34.267Z" }, - { url = "https://files.pythonhosted.org/packages/81/aa/e58541a49b5e6310d89474333e994ee57fea97c8aaa8fc7f00b873059bbf/pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96", size = 12704705, upload-time = "2025-07-07T19:19:36.856Z" }, - { url = "https://files.pythonhosted.org/packages/d5/f9/07086f5b0f2a19872554abeea7658200824f5835c58a106fa8f2ae96a46c/pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444", size = 13189044, upload-time = "2025-07-07T19:19:39.999Z" }, - { url = "https://files.pythonhosted.org/packages/6e/21/ecf2df680982616459409b09962a8c2065330c7151dc6538069f3b634acf/pandas-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4645f770f98d656f11c69e81aeb21c6fca076a44bed3dcbb9396a4311bc7f6d8", size = 11567275, upload-time = "2025-07-07T19:19:45.152Z" }, - { url = "https://files.pythonhosted.org/packages/1e/1a/dcb50e44b75419e96b276c9fb023b0f147b3c411be1cd517492aa2a184d4/pandas-2.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:342e59589cc454aaff7484d75b816a433350b3d7964d7847327edda4d532a2e3", size = 10811488, upload-time = "2025-07-07T19:19:47.797Z" }, - { url = "https://files.pythonhosted.org/packages/2d/55/66cd2b679f6a27398380eac7574bc24746128f74626a3c02b978ea00e5ce/pandas-2.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d12f618d80379fde6af007f65f0c25bd3e40251dbd1636480dfffce2cf1e6da", size = 11763000, upload-time = "2025-07-07T19:19:50.83Z" }, - { url = "https://files.pythonhosted.org/packages/ae/1c/5b9b263c80fd5e231b77df6f78cd7426d1d4ad3a4e858e85b7b3d93d0e9c/pandas-2.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd71c47a911da120d72ef173aeac0bf5241423f9bfea57320110a978457e069e", size = 12361395, upload-time = "2025-07-07T19:19:53.714Z" }, - { url = "https://files.pythonhosted.org/packages/f7/74/7e817b31413fbb96366ea327d43d1926a9c48c58074e27e094e2839a0e36/pandas-2.3.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:09e3b1587f0f3b0913e21e8b32c3119174551deb4a4eba4a89bc7377947977e7", size = 13225086, upload-time = "2025-07-07T19:19:56.378Z" }, - { url = "https://files.pythonhosted.org/packages/1f/0f/bc0a44b47eba2f22ae4235719a573d552ef7ad76ed3ea39ae62d554e040b/pandas-2.3.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2323294c73ed50f612f67e2bf3ae45aea04dce5690778e08a09391897f35ff88", size = 13871698, upload-time = "2025-07-07T19:19:58.854Z" }, - { url = "https://files.pythonhosted.org/packages/fa/cb/6c32f8fadefa4314b740fbe8f74f6a02423bd1549e7c930826df35ac3c1b/pandas-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:b4b0de34dc8499c2db34000ef8baad684cfa4cbd836ecee05f323ebfba348c7d", size = 11357186, upload-time = "2025-07-07T19:20:01.475Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/d1/6f/75aa71f8a14267117adeeed5d21b204770189c0a0025acbdc03c337b28fc/pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2", size = 4487493 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/ca/aa97b47287221fa37a49634532e520300088e290b20d690b21ce3e448143/pandas-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22c2e866f7209ebc3a8f08d75766566aae02bcc91d196935a1d9e59c7b990ac9", size = 11542731 }, + { url = "https://files.pythonhosted.org/packages/80/bf/7938dddc5f01e18e573dcfb0f1b8c9357d9b5fa6ffdee6e605b92efbdff2/pandas-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3583d348546201aff730c8c47e49bc159833f971c2899d6097bce68b9112a4f1", size = 10790031 }, + { url = "https://files.pythonhosted.org/packages/ee/2f/9af748366763b2a494fed477f88051dbf06f56053d5c00eba652697e3f94/pandas-2.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f951fbb702dacd390561e0ea45cdd8ecfa7fb56935eb3dd78e306c19104b9b0", size = 11724083 }, + { url = "https://files.pythonhosted.org/packages/2c/95/79ab37aa4c25d1e7df953dde407bb9c3e4ae47d154bc0dd1692f3a6dcf8c/pandas-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd05b72ec02ebfb993569b4931b2e16fbb4d6ad6ce80224a3ee838387d83a191", size = 12342360 }, + { url = "https://files.pythonhosted.org/packages/75/a7/d65e5d8665c12c3c6ff5edd9709d5836ec9b6f80071b7f4a718c6106e86e/pandas-2.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1b916a627919a247d865aed068eb65eb91a344b13f5b57ab9f610b7716c92de1", size = 13202098 }, + { url = "https://files.pythonhosted.org/packages/65/f3/4c1dbd754dbaa79dbf8b537800cb2fa1a6e534764fef50ab1f7533226c5c/pandas-2.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fe67dc676818c186d5a3d5425250e40f179c2a89145df477dd82945eaea89e97", size = 13837228 }, + { url = "https://files.pythonhosted.org/packages/3f/d6/d7f5777162aa9b48ec3910bca5a58c9b5927cfd9cfde3aa64322f5ba4b9f/pandas-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:2eb789ae0274672acbd3c575b0598d213345660120a257b47b5dafdc618aec83", size = 11336561 }, + { url = "https://files.pythonhosted.org/packages/76/1c/ccf70029e927e473a4476c00e0d5b32e623bff27f0402d0a92b7fc29bb9f/pandas-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2b0540963d83431f5ce8870ea02a7430adca100cec8a050f0811f8e31035541b", size = 11566608 }, + { url = "https://files.pythonhosted.org/packages/ec/d3/3c37cb724d76a841f14b8f5fe57e5e3645207cc67370e4f84717e8bb7657/pandas-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fe7317f578c6a153912bd2292f02e40c1d8f253e93c599e82620c7f69755c74f", size = 10823181 }, + { url = "https://files.pythonhosted.org/packages/8a/4c/367c98854a1251940edf54a4df0826dcacfb987f9068abf3e3064081a382/pandas-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6723a27ad7b244c0c79d8e7007092d7c8f0f11305770e2f4cd778b3ad5f9f85", size = 11793570 }, + { url = "https://files.pythonhosted.org/packages/07/5f/63760ff107bcf5146eee41b38b3985f9055e710a72fdd637b791dea3495c/pandas-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3462c3735fe19f2638f2c3a40bd94ec2dc5ba13abbb032dd2fa1f540a075509d", size = 12378887 }, + { url = "https://files.pythonhosted.org/packages/15/53/f31a9b4dfe73fe4711c3a609bd8e60238022f48eacedc257cd13ae9327a7/pandas-2.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:98bcc8b5bf7afed22cc753a28bc4d9e26e078e777066bc53fac7904ddef9a678", size = 13230957 }, + { url = "https://files.pythonhosted.org/packages/e0/94/6fce6bf85b5056d065e0a7933cba2616dcb48596f7ba3c6341ec4bcc529d/pandas-2.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d544806b485ddf29e52d75b1f559142514e60ef58a832f74fb38e48d757b299", size = 13883883 }, + { url = "https://files.pythonhosted.org/packages/c8/7b/bdcb1ed8fccb63d04bdb7635161d0ec26596d92c9d7a6cce964e7876b6c1/pandas-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b3cd4273d3cb3707b6fffd217204c52ed92859533e31dc03b7c5008aa933aaab", size = 11340212 }, + { url = "https://files.pythonhosted.org/packages/46/de/b8445e0f5d217a99fe0eeb2f4988070908979bec3587c0633e5428ab596c/pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3", size = 11588172 }, + { url = "https://files.pythonhosted.org/packages/1e/e0/801cdb3564e65a5ac041ab99ea6f1d802a6c325bb6e58c79c06a3f1cd010/pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232", size = 10717365 }, + { url = "https://files.pythonhosted.org/packages/51/a5/c76a8311833c24ae61a376dbf360eb1b1c9247a5d9c1e8b356563b31b80c/pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e", size = 11280411 }, + { url = "https://files.pythonhosted.org/packages/da/01/e383018feba0a1ead6cf5fe8728e5d767fee02f06a3d800e82c489e5daaf/pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4", size = 11988013 }, + { url = "https://files.pythonhosted.org/packages/5b/14/cec7760d7c9507f11c97d64f29022e12a6cc4fc03ac694535e89f88ad2ec/pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8", size = 12767210 }, + { url = "https://files.pythonhosted.org/packages/50/b9/6e2d2c6728ed29fb3d4d4d302504fb66f1a543e37eb2e43f352a86365cdf/pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679", size = 13440571 }, + { url = "https://files.pythonhosted.org/packages/80/a5/3a92893e7399a691bad7664d977cb5e7c81cf666c81f89ea76ba2bff483d/pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8", size = 10987601 }, + { url = "https://files.pythonhosted.org/packages/32/ed/ff0a67a2c5505e1854e6715586ac6693dd860fbf52ef9f81edee200266e7/pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22", size = 11531393 }, + { url = "https://files.pythonhosted.org/packages/c7/db/d8f24a7cc9fb0972adab0cc80b6817e8bef888cfd0024eeb5a21c0bb5c4a/pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a", size = 10668750 }, + { url = "https://files.pythonhosted.org/packages/0f/b0/80f6ec783313f1e2356b28b4fd8d2148c378370045da918c73145e6aab50/pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928", size = 11342004 }, + { url = "https://files.pythonhosted.org/packages/e9/e2/20a317688435470872885e7fc8f95109ae9683dec7c50be29b56911515a5/pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9", size = 12050869 }, + { url = "https://files.pythonhosted.org/packages/55/79/20d746b0a96c67203a5bee5fb4e00ac49c3e8009a39e1f78de264ecc5729/pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12", size = 12750218 }, + { url = "https://files.pythonhosted.org/packages/7c/0f/145c8b41e48dbf03dd18fdd7f24f8ba95b8254a97a3379048378f33e7838/pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb", size = 13416763 }, + { url = "https://files.pythonhosted.org/packages/b2/c0/54415af59db5cdd86a3d3bf79863e8cc3fa9ed265f0745254061ac09d5f2/pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956", size = 10987482 }, + { url = "https://files.pythonhosted.org/packages/48/64/2fd2e400073a1230e13b8cd604c9bc95d9e3b962e5d44088ead2e8f0cfec/pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a", size = 12029159 }, + { url = "https://files.pythonhosted.org/packages/d8/0a/d84fd79b0293b7ef88c760d7dca69828d867c89b6d9bc52d6a27e4d87316/pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9", size = 11393287 }, + { url = "https://files.pythonhosted.org/packages/50/ae/ff885d2b6e88f3c7520bb74ba319268b42f05d7e583b5dded9837da2723f/pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275", size = 11309381 }, + { url = "https://files.pythonhosted.org/packages/85/86/1fa345fc17caf5d7780d2699985c03dbe186c68fee00b526813939062bb0/pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab", size = 11883998 }, + { url = "https://files.pythonhosted.org/packages/81/aa/e58541a49b5e6310d89474333e994ee57fea97c8aaa8fc7f00b873059bbf/pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96", size = 12704705 }, + { url = "https://files.pythonhosted.org/packages/d5/f9/07086f5b0f2a19872554abeea7658200824f5835c58a106fa8f2ae96a46c/pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444", size = 13189044 }, + { url = "https://files.pythonhosted.org/packages/6e/21/ecf2df680982616459409b09962a8c2065330c7151dc6538069f3b634acf/pandas-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4645f770f98d656f11c69e81aeb21c6fca076a44bed3dcbb9396a4311bc7f6d8", size = 11567275 }, + { url = "https://files.pythonhosted.org/packages/1e/1a/dcb50e44b75419e96b276c9fb023b0f147b3c411be1cd517492aa2a184d4/pandas-2.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:342e59589cc454aaff7484d75b816a433350b3d7964d7847327edda4d532a2e3", size = 10811488 }, + { url = "https://files.pythonhosted.org/packages/2d/55/66cd2b679f6a27398380eac7574bc24746128f74626a3c02b978ea00e5ce/pandas-2.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d12f618d80379fde6af007f65f0c25bd3e40251dbd1636480dfffce2cf1e6da", size = 11763000 }, + { url = "https://files.pythonhosted.org/packages/ae/1c/5b9b263c80fd5e231b77df6f78cd7426d1d4ad3a4e858e85b7b3d93d0e9c/pandas-2.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd71c47a911da120d72ef173aeac0bf5241423f9bfea57320110a978457e069e", size = 12361395 }, + { url = "https://files.pythonhosted.org/packages/f7/74/7e817b31413fbb96366ea327d43d1926a9c48c58074e27e094e2839a0e36/pandas-2.3.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:09e3b1587f0f3b0913e21e8b32c3119174551deb4a4eba4a89bc7377947977e7", size = 13225086 }, + { url = "https://files.pythonhosted.org/packages/1f/0f/bc0a44b47eba2f22ae4235719a573d552ef7ad76ed3ea39ae62d554e040b/pandas-2.3.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2323294c73ed50f612f67e2bf3ae45aea04dce5690778e08a09391897f35ff88", size = 13871698 }, + { url = "https://files.pythonhosted.org/packages/fa/cb/6c32f8fadefa4314b740fbe8f74f6a02423bd1549e7c930826df35ac3c1b/pandas-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:b4b0de34dc8499c2db34000ef8baad684cfa4cbd836ecee05f323ebfba348c7d", size = 11357186 }, ] [[package]] name = "parso" version = "0.8.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609, upload-time = "2024-04-05T09:43:55.897Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650, upload-time = "2024-04-05T09:43:53.299Z" }, + { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, ] [[package]] @@ -2470,9 +2470,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "setuptools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/01/d2/510cc0d218e753ba62a1bc1434651db3cd797a9716a0a66cc714cb4f0935/pbr-6.1.1.tar.gz", hash = "sha256:93ea72ce6989eb2eed99d0f75721474f69ad88128afdef5ac377eb797c4bf76b", size = 125702, upload-time = "2025-02-04T14:28:06.514Z" } +sdist = { url = "https://files.pythonhosted.org/packages/01/d2/510cc0d218e753ba62a1bc1434651db3cd797a9716a0a66cc714cb4f0935/pbr-6.1.1.tar.gz", hash = "sha256:93ea72ce6989eb2eed99d0f75721474f69ad88128afdef5ac377eb797c4bf76b", size = 125702 } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/ac/684d71315abc7b1214d59304e23a982472967f6bf4bde5a98f1503f648dc/pbr-6.1.1-py2.py3-none-any.whl", hash = "sha256:38d4daea5d9fa63b3f626131b9d34947fd0c8be9b05a29276870580050a25a76", size = 108997, upload-time = "2025-02-04T14:28:03.168Z" }, + { url = "https://files.pythonhosted.org/packages/47/ac/684d71315abc7b1214d59304e23a982472967f6bf4bde5a98f1503f648dc/pbr-6.1.1-py2.py3-none-any.whl", hash = "sha256:38d4daea5d9fa63b3f626131b9d34947fd0c8be9b05a29276870580050a25a76", size = 108997 }, ] [[package]] @@ -2482,140 +2482,140 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ptyprocess" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, ] [[package]] name = "pillow" version = "11.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/5d/45a3553a253ac8763f3561371432a90bdbe6000fbdcf1397ffe502aa206c/pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860", size = 5316554, upload-time = "2025-07-01T09:13:39.342Z" }, - { url = "https://files.pythonhosted.org/packages/7c/c8/67c12ab069ef586a25a4a79ced553586748fad100c77c0ce59bb4983ac98/pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad", size = 4686548, upload-time = "2025-07-01T09:13:41.835Z" }, - { url = "https://files.pythonhosted.org/packages/2f/bd/6741ebd56263390b382ae4c5de02979af7f8bd9807346d068700dd6d5cf9/pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0", size = 5859742, upload-time = "2025-07-03T13:09:47.439Z" }, - { url = "https://files.pythonhosted.org/packages/ca/0b/c412a9e27e1e6a829e6ab6c2dca52dd563efbedf4c9c6aa453d9a9b77359/pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b", size = 7633087, upload-time = "2025-07-03T13:09:51.796Z" }, - { url = "https://files.pythonhosted.org/packages/59/9d/9b7076aaf30f5dd17e5e5589b2d2f5a5d7e30ff67a171eb686e4eecc2adf/pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50", size = 5963350, upload-time = "2025-07-01T09:13:43.865Z" }, - { url = "https://files.pythonhosted.org/packages/f0/16/1a6bf01fb622fb9cf5c91683823f073f053005c849b1f52ed613afcf8dae/pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae", size = 6631840, upload-time = "2025-07-01T09:13:46.161Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e6/6ff7077077eb47fde78739e7d570bdcd7c10495666b6afcd23ab56b19a43/pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9", size = 6074005, upload-time = "2025-07-01T09:13:47.829Z" }, - { url = "https://files.pythonhosted.org/packages/c3/3a/b13f36832ea6d279a697231658199e0a03cd87ef12048016bdcc84131601/pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e", size = 6708372, upload-time = "2025-07-01T09:13:52.145Z" }, - { url = "https://files.pythonhosted.org/packages/6c/e4/61b2e1a7528740efbc70b3d581f33937e38e98ef3d50b05007267a55bcb2/pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6", size = 6277090, upload-time = "2025-07-01T09:13:53.915Z" }, - { url = "https://files.pythonhosted.org/packages/a9/d3/60c781c83a785d6afbd6a326ed4d759d141de43aa7365725cbcd65ce5e54/pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f", size = 6985988, upload-time = "2025-07-01T09:13:55.699Z" }, - { url = "https://files.pythonhosted.org/packages/9f/28/4f4a0203165eefb3763939c6789ba31013a2e90adffb456610f30f613850/pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f", size = 2422899, upload-time = "2025-07-01T09:13:57.497Z" }, - { url = "https://files.pythonhosted.org/packages/db/26/77f8ed17ca4ffd60e1dcd220a6ec6d71210ba398cfa33a13a1cd614c5613/pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", size = 5316531, upload-time = "2025-07-01T09:13:59.203Z" }, - { url = "https://files.pythonhosted.org/packages/cb/39/ee475903197ce709322a17a866892efb560f57900d9af2e55f86db51b0a5/pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", size = 4686560, upload-time = "2025-07-01T09:14:01.101Z" }, - { url = "https://files.pythonhosted.org/packages/d5/90/442068a160fd179938ba55ec8c97050a612426fae5ec0a764e345839f76d/pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", size = 5870978, upload-time = "2025-07-03T13:09:55.638Z" }, - { url = "https://files.pythonhosted.org/packages/13/92/dcdd147ab02daf405387f0218dcf792dc6dd5b14d2573d40b4caeef01059/pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", size = 7641168, upload-time = "2025-07-03T13:10:00.37Z" }, - { url = "https://files.pythonhosted.org/packages/6e/db/839d6ba7fd38b51af641aa904e2960e7a5644d60ec754c046b7d2aee00e5/pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", size = 5973053, upload-time = "2025-07-01T09:14:04.491Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2f/d7675ecae6c43e9f12aa8d58b6012683b20b6edfbdac7abcb4e6af7a3784/pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", size = 6640273, upload-time = "2025-07-01T09:14:06.235Z" }, - { url = "https://files.pythonhosted.org/packages/45/ad/931694675ede172e15b2ff03c8144a0ddaea1d87adb72bb07655eaffb654/pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", size = 6082043, upload-time = "2025-07-01T09:14:07.978Z" }, - { url = "https://files.pythonhosted.org/packages/3a/04/ba8f2b11fc80d2dd462d7abec16351b45ec99cbbaea4387648a44190351a/pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", size = 6715516, upload-time = "2025-07-01T09:14:10.233Z" }, - { url = "https://files.pythonhosted.org/packages/48/59/8cd06d7f3944cc7d892e8533c56b0acb68399f640786313275faec1e3b6f/pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0", size = 6274768, upload-time = "2025-07-01T09:14:11.921Z" }, - { url = "https://files.pythonhosted.org/packages/f1/cc/29c0f5d64ab8eae20f3232da8f8571660aa0ab4b8f1331da5c2f5f9a938e/pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac", size = 6986055, upload-time = "2025-07-01T09:14:13.623Z" }, - { url = "https://files.pythonhosted.org/packages/c6/df/90bd886fabd544c25addd63e5ca6932c86f2b701d5da6c7839387a076b4a/pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", size = 2423079, upload-time = "2025-07-01T09:14:15.268Z" }, - { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload-time = "2025-07-01T09:14:17.648Z" }, - { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload-time = "2025-07-01T09:14:19.828Z" }, - { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload-time = "2025-07-03T13:10:04.448Z" }, - { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload-time = "2025-07-03T13:10:10.391Z" }, - { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload-time = "2025-07-01T09:14:21.63Z" }, - { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload-time = "2025-07-01T09:14:23.321Z" }, - { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload-time = "2025-07-01T09:14:25.237Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload-time = "2025-07-01T09:14:27.053Z" }, - { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload-time = "2025-07-01T09:14:30.104Z" }, - { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload-time = "2025-07-01T09:14:31.899Z" }, - { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload-time = "2025-07-01T09:14:33.709Z" }, - { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload-time = "2025-07-01T09:14:35.276Z" }, - { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload-time = "2025-07-01T09:14:37.203Z" }, - { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload-time = "2025-07-01T09:14:39.344Z" }, - { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload-time = "2025-07-01T09:14:41.843Z" }, - { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload-time = "2025-07-01T09:14:44.008Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload-time = "2025-07-03T13:10:15.628Z" }, - { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload-time = "2025-07-03T13:10:21.857Z" }, - { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload-time = "2025-07-01T09:14:45.698Z" }, - { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload-time = "2025-07-01T09:14:47.415Z" }, - { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload-time = "2025-07-01T09:14:49.636Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload-time = "2025-07-01T09:14:51.962Z" }, - { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload-time = "2025-07-01T09:14:54.142Z" }, - { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload-time = "2025-07-01T09:14:56.436Z" }, - { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload-time = "2025-07-01T09:14:58.072Z" }, - { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload-time = "2025-07-01T09:14:59.79Z" }, - { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload-time = "2025-07-01T09:15:01.648Z" }, - { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload-time = "2025-07-03T13:10:27.018Z" }, - { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload-time = "2025-07-03T13:10:33.01Z" }, - { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload-time = "2025-07-01T09:15:03.365Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload-time = "2025-07-01T09:15:05.655Z" }, - { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload-time = "2025-07-01T09:15:07.358Z" }, - { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload-time = "2025-07-01T09:15:09.317Z" }, - { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload-time = "2025-07-01T09:15:11.311Z" }, - { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload-time = "2025-07-01T09:15:13.164Z" }, - { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload-time = "2025-07-01T09:15:15.695Z" }, - { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload-time = "2025-07-01T09:15:17.429Z" }, - { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload-time = "2025-07-01T09:15:19.423Z" }, - { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload-time = "2025-07-03T13:10:38.404Z" }, - { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload-time = "2025-07-03T13:10:44.987Z" }, - { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload-time = "2025-07-01T09:15:21.237Z" }, - { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload-time = "2025-07-01T09:15:23.186Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload-time = "2025-07-01T09:15:25.1Z" }, - { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload-time = "2025-07-01T09:15:27.378Z" }, - { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload-time = "2025-07-01T09:15:29.294Z" }, - { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload-time = "2025-07-01T09:15:31.128Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload-time = "2025-07-01T09:15:33.328Z" }, - { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload-time = "2025-07-01T09:15:35.194Z" }, - { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload-time = "2025-07-01T09:15:37.114Z" }, - { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload-time = "2025-07-03T13:10:50.248Z" }, - { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload-time = "2025-07-03T13:10:56.432Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload-time = "2025-07-01T09:15:39.436Z" }, - { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload-time = "2025-07-01T09:15:41.269Z" }, - { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload-time = "2025-07-01T09:15:43.13Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload-time = "2025-07-01T09:15:44.937Z" }, - { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload-time = "2025-07-01T09:15:46.673Z" }, - { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload-time = "2025-07-01T09:15:48.512Z" }, - { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload-time = "2025-07-01T09:15:50.399Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8e/9c089f01677d1264ab8648352dcb7773f37da6ad002542760c80107da816/pillow-11.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f", size = 5316478, upload-time = "2025-07-01T09:15:52.209Z" }, - { url = "https://files.pythonhosted.org/packages/b5/a9/5749930caf674695867eb56a581e78eb5f524b7583ff10b01b6e5048acb3/pillow-11.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081", size = 4686522, upload-time = "2025-07-01T09:15:54.162Z" }, - { url = "https://files.pythonhosted.org/packages/43/46/0b85b763eb292b691030795f9f6bb6fcaf8948c39413c81696a01c3577f7/pillow-11.3.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4", size = 5853376, upload-time = "2025-07-03T13:11:01.066Z" }, - { url = "https://files.pythonhosted.org/packages/5e/c6/1a230ec0067243cbd60bc2dad5dc3ab46a8a41e21c15f5c9b52b26873069/pillow-11.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc", size = 7626020, upload-time = "2025-07-03T13:11:06.479Z" }, - { url = "https://files.pythonhosted.org/packages/63/dd/f296c27ffba447bfad76c6a0c44c1ea97a90cb9472b9304c94a732e8dbfb/pillow-11.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06", size = 5956732, upload-time = "2025-07-01T09:15:56.111Z" }, - { url = "https://files.pythonhosted.org/packages/a5/a0/98a3630f0b57f77bae67716562513d3032ae70414fcaf02750279c389a9e/pillow-11.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a", size = 6624404, upload-time = "2025-07-01T09:15:58.245Z" }, - { url = "https://files.pythonhosted.org/packages/de/e6/83dfba5646a290edd9a21964da07674409e410579c341fc5b8f7abd81620/pillow-11.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978", size = 6067760, upload-time = "2025-07-01T09:16:00.003Z" }, - { url = "https://files.pythonhosted.org/packages/bc/41/15ab268fe6ee9a2bc7391e2bbb20a98d3974304ab1a406a992dcb297a370/pillow-11.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d", size = 6700534, upload-time = "2025-07-01T09:16:02.29Z" }, - { url = "https://files.pythonhosted.org/packages/64/79/6d4f638b288300bed727ff29f2a3cb63db054b33518a95f27724915e3fbc/pillow-11.3.0-cp39-cp39-win32.whl", hash = "sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71", size = 6277091, upload-time = "2025-07-01T09:16:04.4Z" }, - { url = "https://files.pythonhosted.org/packages/46/05/4106422f45a05716fd34ed21763f8ec182e8ea00af6e9cb05b93a247361a/pillow-11.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada", size = 6986091, upload-time = "2025-07-01T09:16:06.342Z" }, - { url = "https://files.pythonhosted.org/packages/63/c6/287fd55c2c12761d0591549d48885187579b7c257bef0c6660755b0b59ae/pillow-11.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb", size = 2422632, upload-time = "2025-07-01T09:16:08.142Z" }, - { url = "https://files.pythonhosted.org/packages/6f/8b/209bd6b62ce8367f47e68a218bffac88888fdf2c9fcf1ecadc6c3ec1ebc7/pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967", size = 5270556, upload-time = "2025-07-01T09:16:09.961Z" }, - { url = "https://files.pythonhosted.org/packages/2e/e6/231a0b76070c2cfd9e260a7a5b504fb72da0a95279410fa7afd99d9751d6/pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe", size = 4654625, upload-time = "2025-07-01T09:16:11.913Z" }, - { url = "https://files.pythonhosted.org/packages/13/f4/10cf94fda33cb12765f2397fc285fa6d8eb9c29de7f3185165b702fc7386/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c", size = 4874207, upload-time = "2025-07-03T13:11:10.201Z" }, - { url = "https://files.pythonhosted.org/packages/72/c9/583821097dc691880c92892e8e2d41fe0a5a3d6021f4963371d2f6d57250/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25", size = 6583939, upload-time = "2025-07-03T13:11:15.68Z" }, - { url = "https://files.pythonhosted.org/packages/3b/8e/5c9d410f9217b12320efc7c413e72693f48468979a013ad17fd690397b9a/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27", size = 4957166, upload-time = "2025-07-01T09:16:13.74Z" }, - { url = "https://files.pythonhosted.org/packages/62/bb/78347dbe13219991877ffb3a91bf09da8317fbfcd4b5f9140aeae020ad71/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a", size = 5581482, upload-time = "2025-07-01T09:16:16.107Z" }, - { url = "https://files.pythonhosted.org/packages/d9/28/1000353d5e61498aaeaaf7f1e4b49ddb05f2c6575f9d4f9f914a3538b6e1/pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f", size = 6984596, upload-time = "2025-07-01T09:16:18.07Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e3/6fa84033758276fb31da12e5fb66ad747ae83b93c67af17f8c6ff4cc8f34/pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", size = 5270566, upload-time = "2025-07-01T09:16:19.801Z" }, - { url = "https://files.pythonhosted.org/packages/5b/ee/e8d2e1ab4892970b561e1ba96cbd59c0d28cf66737fc44abb2aec3795a4e/pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", size = 4654618, upload-time = "2025-07-01T09:16:21.818Z" }, - { url = "https://files.pythonhosted.org/packages/f2/6d/17f80f4e1f0761f02160fc433abd4109fa1548dcfdca46cfdadaf9efa565/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3", size = 4874248, upload-time = "2025-07-03T13:11:20.738Z" }, - { url = "https://files.pythonhosted.org/packages/de/5f/c22340acd61cef960130585bbe2120e2fd8434c214802f07e8c03596b17e/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", size = 6583963, upload-time = "2025-07-03T13:11:26.283Z" }, - { url = "https://files.pythonhosted.org/packages/31/5e/03966aedfbfcbb4d5f8aa042452d3361f325b963ebbadddac05b122e47dd/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", size = 4957170, upload-time = "2025-07-01T09:16:23.762Z" }, - { url = "https://files.pythonhosted.org/packages/cc/2d/e082982aacc927fc2cab48e1e731bdb1643a1406acace8bed0900a61464e/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", size = 5581505, upload-time = "2025-07-01T09:16:25.593Z" }, - { url = "https://files.pythonhosted.org/packages/34/e7/ae39f538fd6844e982063c3a5e4598b8ced43b9633baa3a85ef33af8c05c/pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", size = 6984598, upload-time = "2025-07-01T09:16:27.732Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/5d/45a3553a253ac8763f3561371432a90bdbe6000fbdcf1397ffe502aa206c/pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860", size = 5316554 }, + { url = "https://files.pythonhosted.org/packages/7c/c8/67c12ab069ef586a25a4a79ced553586748fad100c77c0ce59bb4983ac98/pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad", size = 4686548 }, + { url = "https://files.pythonhosted.org/packages/2f/bd/6741ebd56263390b382ae4c5de02979af7f8bd9807346d068700dd6d5cf9/pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0", size = 5859742 }, + { url = "https://files.pythonhosted.org/packages/ca/0b/c412a9e27e1e6a829e6ab6c2dca52dd563efbedf4c9c6aa453d9a9b77359/pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b", size = 7633087 }, + { url = "https://files.pythonhosted.org/packages/59/9d/9b7076aaf30f5dd17e5e5589b2d2f5a5d7e30ff67a171eb686e4eecc2adf/pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50", size = 5963350 }, + { url = "https://files.pythonhosted.org/packages/f0/16/1a6bf01fb622fb9cf5c91683823f073f053005c849b1f52ed613afcf8dae/pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae", size = 6631840 }, + { url = "https://files.pythonhosted.org/packages/7b/e6/6ff7077077eb47fde78739e7d570bdcd7c10495666b6afcd23ab56b19a43/pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9", size = 6074005 }, + { url = "https://files.pythonhosted.org/packages/c3/3a/b13f36832ea6d279a697231658199e0a03cd87ef12048016bdcc84131601/pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e", size = 6708372 }, + { url = "https://files.pythonhosted.org/packages/6c/e4/61b2e1a7528740efbc70b3d581f33937e38e98ef3d50b05007267a55bcb2/pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6", size = 6277090 }, + { url = "https://files.pythonhosted.org/packages/a9/d3/60c781c83a785d6afbd6a326ed4d759d141de43aa7365725cbcd65ce5e54/pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f", size = 6985988 }, + { url = "https://files.pythonhosted.org/packages/9f/28/4f4a0203165eefb3763939c6789ba31013a2e90adffb456610f30f613850/pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f", size = 2422899 }, + { url = "https://files.pythonhosted.org/packages/db/26/77f8ed17ca4ffd60e1dcd220a6ec6d71210ba398cfa33a13a1cd614c5613/pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", size = 5316531 }, + { url = "https://files.pythonhosted.org/packages/cb/39/ee475903197ce709322a17a866892efb560f57900d9af2e55f86db51b0a5/pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", size = 4686560 }, + { url = "https://files.pythonhosted.org/packages/d5/90/442068a160fd179938ba55ec8c97050a612426fae5ec0a764e345839f76d/pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", size = 5870978 }, + { url = "https://files.pythonhosted.org/packages/13/92/dcdd147ab02daf405387f0218dcf792dc6dd5b14d2573d40b4caeef01059/pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", size = 7641168 }, + { url = "https://files.pythonhosted.org/packages/6e/db/839d6ba7fd38b51af641aa904e2960e7a5644d60ec754c046b7d2aee00e5/pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", size = 5973053 }, + { url = "https://files.pythonhosted.org/packages/f2/2f/d7675ecae6c43e9f12aa8d58b6012683b20b6edfbdac7abcb4e6af7a3784/pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", size = 6640273 }, + { url = "https://files.pythonhosted.org/packages/45/ad/931694675ede172e15b2ff03c8144a0ddaea1d87adb72bb07655eaffb654/pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", size = 6082043 }, + { url = "https://files.pythonhosted.org/packages/3a/04/ba8f2b11fc80d2dd462d7abec16351b45ec99cbbaea4387648a44190351a/pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", size = 6715516 }, + { url = "https://files.pythonhosted.org/packages/48/59/8cd06d7f3944cc7d892e8533c56b0acb68399f640786313275faec1e3b6f/pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0", size = 6274768 }, + { url = "https://files.pythonhosted.org/packages/f1/cc/29c0f5d64ab8eae20f3232da8f8571660aa0ab4b8f1331da5c2f5f9a938e/pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac", size = 6986055 }, + { url = "https://files.pythonhosted.org/packages/c6/df/90bd886fabd544c25addd63e5ca6932c86f2b701d5da6c7839387a076b4a/pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", size = 2423079 }, + { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800 }, + { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296 }, + { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726 }, + { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652 }, + { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787 }, + { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236 }, + { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950 }, + { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358 }, + { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079 }, + { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324 }, + { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067 }, + { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328 }, + { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652 }, + { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443 }, + { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474 }, + { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038 }, + { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407 }, + { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094 }, + { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503 }, + { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574 }, + { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060 }, + { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407 }, + { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841 }, + { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450 }, + { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055 }, + { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110 }, + { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547 }, + { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554 }, + { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132 }, + { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001 }, + { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814 }, + { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124 }, + { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186 }, + { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546 }, + { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102 }, + { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803 }, + { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520 }, + { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116 }, + { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597 }, + { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246 }, + { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336 }, + { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699 }, + { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789 }, + { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386 }, + { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911 }, + { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383 }, + { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385 }, + { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129 }, + { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580 }, + { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860 }, + { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694 }, + { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888 }, + { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330 }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089 }, + { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206 }, + { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370 }, + { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500 }, + { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835 }, + { url = "https://files.pythonhosted.org/packages/9e/8e/9c089f01677d1264ab8648352dcb7773f37da6ad002542760c80107da816/pillow-11.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f", size = 5316478 }, + { url = "https://files.pythonhosted.org/packages/b5/a9/5749930caf674695867eb56a581e78eb5f524b7583ff10b01b6e5048acb3/pillow-11.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081", size = 4686522 }, + { url = "https://files.pythonhosted.org/packages/43/46/0b85b763eb292b691030795f9f6bb6fcaf8948c39413c81696a01c3577f7/pillow-11.3.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4", size = 5853376 }, + { url = "https://files.pythonhosted.org/packages/5e/c6/1a230ec0067243cbd60bc2dad5dc3ab46a8a41e21c15f5c9b52b26873069/pillow-11.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc", size = 7626020 }, + { url = "https://files.pythonhosted.org/packages/63/dd/f296c27ffba447bfad76c6a0c44c1ea97a90cb9472b9304c94a732e8dbfb/pillow-11.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06", size = 5956732 }, + { url = "https://files.pythonhosted.org/packages/a5/a0/98a3630f0b57f77bae67716562513d3032ae70414fcaf02750279c389a9e/pillow-11.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a", size = 6624404 }, + { url = "https://files.pythonhosted.org/packages/de/e6/83dfba5646a290edd9a21964da07674409e410579c341fc5b8f7abd81620/pillow-11.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978", size = 6067760 }, + { url = "https://files.pythonhosted.org/packages/bc/41/15ab268fe6ee9a2bc7391e2bbb20a98d3974304ab1a406a992dcb297a370/pillow-11.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d", size = 6700534 }, + { url = "https://files.pythonhosted.org/packages/64/79/6d4f638b288300bed727ff29f2a3cb63db054b33518a95f27724915e3fbc/pillow-11.3.0-cp39-cp39-win32.whl", hash = "sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71", size = 6277091 }, + { url = "https://files.pythonhosted.org/packages/46/05/4106422f45a05716fd34ed21763f8ec182e8ea00af6e9cb05b93a247361a/pillow-11.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada", size = 6986091 }, + { url = "https://files.pythonhosted.org/packages/63/c6/287fd55c2c12761d0591549d48885187579b7c257bef0c6660755b0b59ae/pillow-11.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb", size = 2422632 }, + { url = "https://files.pythonhosted.org/packages/6f/8b/209bd6b62ce8367f47e68a218bffac88888fdf2c9fcf1ecadc6c3ec1ebc7/pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967", size = 5270556 }, + { url = "https://files.pythonhosted.org/packages/2e/e6/231a0b76070c2cfd9e260a7a5b504fb72da0a95279410fa7afd99d9751d6/pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe", size = 4654625 }, + { url = "https://files.pythonhosted.org/packages/13/f4/10cf94fda33cb12765f2397fc285fa6d8eb9c29de7f3185165b702fc7386/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c", size = 4874207 }, + { url = "https://files.pythonhosted.org/packages/72/c9/583821097dc691880c92892e8e2d41fe0a5a3d6021f4963371d2f6d57250/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25", size = 6583939 }, + { url = "https://files.pythonhosted.org/packages/3b/8e/5c9d410f9217b12320efc7c413e72693f48468979a013ad17fd690397b9a/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27", size = 4957166 }, + { url = "https://files.pythonhosted.org/packages/62/bb/78347dbe13219991877ffb3a91bf09da8317fbfcd4b5f9140aeae020ad71/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a", size = 5581482 }, + { url = "https://files.pythonhosted.org/packages/d9/28/1000353d5e61498aaeaaf7f1e4b49ddb05f2c6575f9d4f9f914a3538b6e1/pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f", size = 6984596 }, + { url = "https://files.pythonhosted.org/packages/9e/e3/6fa84033758276fb31da12e5fb66ad747ae83b93c67af17f8c6ff4cc8f34/pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", size = 5270566 }, + { url = "https://files.pythonhosted.org/packages/5b/ee/e8d2e1ab4892970b561e1ba96cbd59c0d28cf66737fc44abb2aec3795a4e/pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", size = 4654618 }, + { url = "https://files.pythonhosted.org/packages/f2/6d/17f80f4e1f0761f02160fc433abd4109fa1548dcfdca46cfdadaf9efa565/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3", size = 4874248 }, + { url = "https://files.pythonhosted.org/packages/de/5f/c22340acd61cef960130585bbe2120e2fd8434c214802f07e8c03596b17e/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", size = 6583963 }, + { url = "https://files.pythonhosted.org/packages/31/5e/03966aedfbfcbb4d5f8aa042452d3361f325b963ebbadddac05b122e47dd/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", size = 4957170 }, + { url = "https://files.pythonhosted.org/packages/cc/2d/e082982aacc927fc2cab48e1e731bdb1643a1406acace8bed0900a61464e/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", size = 5581505 }, + { url = "https://files.pythonhosted.org/packages/34/e7/ae39f538fd6844e982063c3a5e4598b8ced43b9633baa3a85ef33af8c05c/pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", size = 6984598 }, ] [[package]] name = "platformdirs" version = "4.3.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" }, + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567 }, ] [[package]] name = "pluggy" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412 } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538 }, ] [[package]] @@ -2635,7 +2635,7 @@ dependencies = [ { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, { name = "scipy", version = "1.16.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/30/88/48c8347cadf6afb7f329e7c06d30880159e2a50b6e8a643c7667c26ffaf0/projectq-0.8.0.tar.gz", hash = "sha256:0bcd242afabe947ac4737dffab1de62628b84125ee6ccb3ec23bd4f1d082ec60", size = 433667, upload-time = "2022-10-18T16:03:17.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/88/48c8347cadf6afb7f329e7c06d30880159e2a50b6e8a643c7667c26ffaf0/projectq-0.8.0.tar.gz", hash = "sha256:0bcd242afabe947ac4737dffab1de62628b84125ee6ccb3ec23bd4f1d082ec60", size = 433667 } [[package]] name = "prompt-toolkit" @@ -2644,42 +2644,42 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wcwidth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940, upload-time = "2025-04-15T09:18:47.731Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810, upload-time = "2025-04-15T09:18:44.753Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810 }, ] [[package]] name = "psutil" version = "7.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003, upload-time = "2025-02-13T21:54:07.946Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051, upload-time = "2025-02-13T21:54:12.36Z" }, - { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535, upload-time = "2025-02-13T21:54:16.07Z" }, - { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004, upload-time = "2025-02-13T21:54:18.662Z" }, - { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986, upload-time = "2025-02-13T21:54:21.811Z" }, - { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544, upload-time = "2025-02-13T21:54:24.68Z" }, - { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053, upload-time = "2025-02-13T21:54:34.31Z" }, - { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885, upload-time = "2025-02-13T21:54:37.486Z" }, + { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 }, + { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 }, + { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 }, + { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 }, + { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 }, + { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 }, + { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 }, ] [[package]] name = "ptyprocess" version = "0.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, ] [[package]] name = "pure-eval" version = "0.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 }, ] [[package]] @@ -2691,9 +2691,9 @@ dependencies = [ { name = "latexcodec" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5f/bc/c2be05ca72f8c103670e983df8be26d1e288bc6556f487fa8cccaa27779f/pybtex-0.25.1.tar.gz", hash = "sha256:9eaf90267c7e83e225af89fea65c370afbf65f458220d3946a9e3049e1eca491", size = 406157, upload-time = "2025-06-26T13:27:41.903Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/bc/c2be05ca72f8c103670e983df8be26d1e288bc6556f487fa8cccaa27779f/pybtex-0.25.1.tar.gz", hash = "sha256:9eaf90267c7e83e225af89fea65c370afbf65f458220d3946a9e3049e1eca491", size = 406157 } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/68/ceb5d6679baa326261f5d3e5113d9cfed6efef2810afd9f18bffb8ed312b/pybtex-0.25.1-py2.py3-none-any.whl", hash = "sha256:9053b0d619409a0a83f38abad5d9921de5f7b3ede00742beafcd9f10ad0d8c5c", size = 127437, upload-time = "2025-06-26T13:27:43.585Z" }, + { url = "https://files.pythonhosted.org/packages/25/68/ceb5d6679baa326261f5d3e5113d9cfed6efef2810afd9f18bffb8ed312b/pybtex-0.25.1-py2.py3-none-any.whl", hash = "sha256:9053b0d619409a0a83f38abad5d9921de5f7b3ede00742beafcd9f10ad0d8c5c", size = 127437 }, ] [[package]] @@ -2704,18 +2704,18 @@ dependencies = [ { name = "docutils" }, { name = "pybtex" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7e/84/796ea94d26188a853660f81bded39f8de4cfe595130aef0dea1088705a11/pybtex-docutils-1.0.3.tar.gz", hash = "sha256:3a7ebdf92b593e00e8c1c538aa9a20bca5d92d84231124715acc964d51d93c6b", size = 18348, upload-time = "2023-08-22T18:47:54.833Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/84/796ea94d26188a853660f81bded39f8de4cfe595130aef0dea1088705a11/pybtex-docutils-1.0.3.tar.gz", hash = "sha256:3a7ebdf92b593e00e8c1c538aa9a20bca5d92d84231124715acc964d51d93c6b", size = 18348 } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/b1/ce1f4596211efb5410e178a803f08e59b20bedb66837dcf41e21c54f9ec1/pybtex_docutils-1.0.3-py3-none-any.whl", hash = "sha256:8fd290d2ae48e32fcb54d86b0efb8d573198653c7e2447d5bec5847095f430b9", size = 6385, upload-time = "2023-08-22T06:43:20.513Z" }, + { url = "https://files.pythonhosted.org/packages/11/b1/ce1f4596211efb5410e178a803f08e59b20bedb66837dcf41e21c54f9ec1/pybtex_docutils-1.0.3-py3-none-any.whl", hash = "sha256:8fd290d2ae48e32fcb54d86b0efb8d573198653c7e2447d5bec5847095f430b9", size = 6385 }, ] [[package]] name = "pycparser" version = "2.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736, upload-time = "2024-03-30T13:22:22.564Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload-time = "2024-03-30T13:22:20.476Z" }, + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, ] [[package]] @@ -2725,25 +2725,25 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyparsing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/50/35/b17cb89ff865484c6a20ef46bf9d95a5f07328292578de0b295f4a6beec2/pydot-4.0.1.tar.gz", hash = "sha256:c2148f681c4a33e08bf0e26a9e5f8e4099a82e0e2a068098f32ce86577364ad5", size = 162594, upload-time = "2025-06-17T20:09:56.454Z" } +sdist = { url = "https://files.pythonhosted.org/packages/50/35/b17cb89ff865484c6a20ef46bf9d95a5f07328292578de0b295f4a6beec2/pydot-4.0.1.tar.gz", hash = "sha256:c2148f681c4a33e08bf0e26a9e5f8e4099a82e0e2a068098f32ce86577364ad5", size = 162594 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/32/a7125fb28c4261a627f999d5fb4afff25b523800faed2c30979949d6facd/pydot-4.0.1-py3-none-any.whl", hash = "sha256:869c0efadd2708c0be1f916eb669f3d664ca684bc57ffb7ecc08e70d5e93fee6", size = 37087, upload-time = "2025-06-17T20:09:55.25Z" }, + { url = "https://files.pythonhosted.org/packages/7e/32/a7125fb28c4261a627f999d5fb4afff25b523800faed2c30979949d6facd/pydot-4.0.1-py3-none-any.whl", hash = "sha256:869c0efadd2708c0be1f916eb669f3d664ca684bc57ffb7ecc08e70d5e93fee6", size = 37087 }, ] [[package]] name = "pygments" version = "2.19.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217 }, ] [[package]] name = "pylatexenc" version = "2.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5d/ab/34ec41718af73c00119d0351b7a2531d2ebddb51833a36448fc7b862be60/pylatexenc-2.10.tar.gz", hash = "sha256:3dd8fd84eb46dc30bee1e23eaab8d8fb5a7f507347b23e5f38ad9675c84f40d3", size = 162597, upload-time = "2021-04-06T07:56:07.854Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5d/ab/34ec41718af73c00119d0351b7a2531d2ebddb51833a36448fc7b862be60/pylatexenc-2.10.tar.gz", hash = "sha256:3dd8fd84eb46dc30bee1e23eaab8d8fb5a7f507347b23e5f38ad9675c84f40d3", size = 162597 } [[package]] name = "pymatching" @@ -2761,37 +2761,37 @@ dependencies = [ { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, { name = "scipy", version = "1.16.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/07/e8/001d6a4f4ae1d54309852bceab240380b573b3642827bef7ae03ddaf8ab8/pymatching-2.2.2.tar.gz", hash = "sha256:66857ecc58913326938de812fcd878793f6f9e2cca2ffc9fd88693629e026684", size = 336174, upload-time = "2025-04-03T11:45:12.21Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/89/d28ff3a1b36c6c9cf8086af5c4f73240a84726eaede480d0a4cf472e7d75/pymatching-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc602a3c437b41a19e3fb65d48b776c63f0bfbeaa053cfa26ab2233aea6458bf", size = 395533, upload-time = "2025-04-03T11:44:34.839Z" }, - { url = "https://files.pythonhosted.org/packages/bd/3c/22294377d5088f7877716e94d1d851f426d85f59f0cc7b8c5fb37d510b51/pymatching-2.2.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:502c0871d5d92b23ce7bd37efa65537222f409fcaa6ee0a4f591a9ce91cfcc46", size = 435842, upload-time = "2025-04-03T11:44:36.683Z" }, - { url = "https://files.pythonhosted.org/packages/dd/53/b87968f5f0c54e65a83589c432f036b7bd31fb1ca5b42528cbd6446cf963/pymatching-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:878c0c490511736438c9b14f31e93f3396310687796d853888d0a444a93aae00", size = 648425, upload-time = "2025-04-03T11:44:37.834Z" }, - { url = "https://files.pythonhosted.org/packages/88/54/5749bb765c7c53181158f65764bd99940e2e508cc5c4843c23d8f3fb629d/pymatching-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:0f19e38bc06b2f1f184137299ddc04533114416b776976ad7b32d000cfb80439", size = 337919, upload-time = "2025-04-03T11:44:39.237Z" }, - { url = "https://files.pythonhosted.org/packages/12/2c/e5c47f2830ca48f543b910f40050031220a6c45b60b91f43986fd90ffc0c/pymatching-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64a86a2c17f98c111da186775024fb26c21d82b7ebbb244570074bc2483020b0", size = 396946, upload-time = "2025-04-03T11:44:40.368Z" }, - { url = "https://files.pythonhosted.org/packages/aa/2d/c651278db24ed4602ba0de86996a124fe89a941037a9428cf4c99ac371b0/pymatching-2.2.2-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:fc9a5cff53559b6a605eb099ee73f4f3043bf0f4098d227331f10f7751d35607", size = 437708, upload-time = "2025-04-03T11:44:41.793Z" }, - { url = "https://files.pythonhosted.org/packages/b9/0f/3888a8c740eee437a3007ae6ff5da28640794ddcf1ef5401eeeeb238265f/pymatching-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:166abeb45525cbbcb656e66e4400ff24a11b2cf29495dc7b213885809f45d237", size = 649496, upload-time = "2025-04-03T11:44:43.242Z" }, - { url = "https://files.pythonhosted.org/packages/95/45/5cd05feb089f32dfca8bba551ef796282ef9c00be235ab8ce1b1c52d80a4/pymatching-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:e4a6931a13aa413cd2820d2239b8fe141e685d8de550385d032535b3a7963bbd", size = 339186, upload-time = "2025-04-03T11:44:44.659Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3b/704b994b8f0f8d9e717400ce9470e3cbbdd880a54bf09c0d003493d60580/pymatching-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f35326c45c062f21ade7c8e2c9871fd56811dd01fdd951dbfd51d199daebfe58", size = 396417, upload-time = "2025-04-03T11:44:45.705Z" }, - { url = "https://files.pythonhosted.org/packages/59/1a/b228012fdc05505aebe31dd70c66a2d45afabf48544c3b1d56b686bb0efe/pymatching-2.2.2-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:52bc990e7373403f12e021259f9525c0a849e8f044c1ce2f56696721e264b2af", size = 437284, upload-time = "2025-04-03T11:44:46.825Z" }, - { url = "https://files.pythonhosted.org/packages/7e/66/eb16b60a47bac449b84b674ef11a65cc9f4151f8b0f59feae7121da9476f/pymatching-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffc778d3cc689acaf65de74898d1ac90215c5e4455599fdcda833695bcd5509", size = 647367, upload-time = "2025-04-03T11:44:47.983Z" }, - { url = "https://files.pythonhosted.org/packages/f1/0f/12f8141533ee6c1818d68ab1e765c00e386899464980c5fba961b01fc9e0/pymatching-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:a24ebb291d6252384928283308707f1ccbc2ee9343a15640c1a60e1fb35ad3db", size = 340149, upload-time = "2025-04-03T11:44:49.583Z" }, - { url = "https://files.pythonhosted.org/packages/0a/2a/b76dbdd016c1c0124c61c43738f401c4adf01d865e64a48462a447c186f9/pymatching-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:efde929996872d087ba0ca4c90516361a3d74472c3333a8cfb95c51d743baadd", size = 396532, upload-time = "2025-04-03T11:44:51.019Z" }, - { url = "https://files.pythonhosted.org/packages/7d/ad/8cabe7fbc10b4a45fad9e40eeeeeb3797333c348c2ffa3ed514041bdc2bb/pymatching-2.2.2-cp313-cp313-macosx_11_0_x86_64.whl", hash = "sha256:becb7f90e1c3a7456d60c89f384e88a532a42069e868d20ef4f671f17a7ec64f", size = 437362, upload-time = "2025-04-03T11:44:52.162Z" }, - { url = "https://files.pythonhosted.org/packages/85/f1/4eedf13761bf6ce657b7614b9a70b444086500f84cc26bf7435decc634a2/pymatching-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d37810c6475540518a147ddfef5fd7d8b5579936b455c9eed0bf7dd6cacbd8b", size = 647435, upload-time = "2025-04-03T11:44:53.6Z" }, - { url = "https://files.pythonhosted.org/packages/cf/8b/56450f75b2000dfd03293820a17ce6abda7e310f98e2d49b34c8152d2866/pymatching-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:f6a93a67145e54b663ae7397cb2ff7626ec4d4d1d9bd62ae40f5f15613ec4982", size = 340147, upload-time = "2025-04-03T11:44:54.664Z" }, - { url = "https://files.pythonhosted.org/packages/05/c5/7965a9dfd9ae6e01fd22a8ccfbcead5b50ca0303f2f35b7e99052e5d3cf1/pymatching-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d2fcf66592c9276b97073df87f0e87f0aaebbe93800874c75b4122d29a40523", size = 395604, upload-time = "2025-04-03T11:45:05.57Z" }, - { url = "https://files.pythonhosted.org/packages/65/9e/5de61f05a5b21de8fad7da317b7384c1f614a87b48dd3b10a579d1647a13/pymatching-2.2.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:312977149f2e7a97ad9aca1df3a8295758577f2abb81d7f505f8f424ee879226", size = 435961, upload-time = "2025-04-03T11:45:06.949Z" }, - { url = "https://files.pythonhosted.org/packages/97/88/977ef45e412f0ea9ced223e0d9bdc9e17073a64b05501a6ffe8f39988c49/pymatching-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42c348fc0e99b126f87edc4bca52d407a3d525fdb01820b608e946a51b09d119", size = 648613, upload-time = "2025-04-03T11:45:09.455Z" }, - { url = "https://files.pythonhosted.org/packages/ec/27/ce10edc287f6d817f70ed2fd65d42b0cb04bfaa5eaa103f3268e510e3df7/pymatching-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:a00332d86bd6296594aadce50aeed4cb9df53f87155d6a27badc1f98aa953a97", size = 336664, upload-time = "2025-04-03T11:45:10.872Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/07/e8/001d6a4f4ae1d54309852bceab240380b573b3642827bef7ae03ddaf8ab8/pymatching-2.2.2.tar.gz", hash = "sha256:66857ecc58913326938de812fcd878793f6f9e2cca2ffc9fd88693629e026684", size = 336174 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/89/d28ff3a1b36c6c9cf8086af5c4f73240a84726eaede480d0a4cf472e7d75/pymatching-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc602a3c437b41a19e3fb65d48b776c63f0bfbeaa053cfa26ab2233aea6458bf", size = 395533 }, + { url = "https://files.pythonhosted.org/packages/bd/3c/22294377d5088f7877716e94d1d851f426d85f59f0cc7b8c5fb37d510b51/pymatching-2.2.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:502c0871d5d92b23ce7bd37efa65537222f409fcaa6ee0a4f591a9ce91cfcc46", size = 435842 }, + { url = "https://files.pythonhosted.org/packages/dd/53/b87968f5f0c54e65a83589c432f036b7bd31fb1ca5b42528cbd6446cf963/pymatching-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:878c0c490511736438c9b14f31e93f3396310687796d853888d0a444a93aae00", size = 648425 }, + { url = "https://files.pythonhosted.org/packages/88/54/5749bb765c7c53181158f65764bd99940e2e508cc5c4843c23d8f3fb629d/pymatching-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:0f19e38bc06b2f1f184137299ddc04533114416b776976ad7b32d000cfb80439", size = 337919 }, + { url = "https://files.pythonhosted.org/packages/12/2c/e5c47f2830ca48f543b910f40050031220a6c45b60b91f43986fd90ffc0c/pymatching-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64a86a2c17f98c111da186775024fb26c21d82b7ebbb244570074bc2483020b0", size = 396946 }, + { url = "https://files.pythonhosted.org/packages/aa/2d/c651278db24ed4602ba0de86996a124fe89a941037a9428cf4c99ac371b0/pymatching-2.2.2-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:fc9a5cff53559b6a605eb099ee73f4f3043bf0f4098d227331f10f7751d35607", size = 437708 }, + { url = "https://files.pythonhosted.org/packages/b9/0f/3888a8c740eee437a3007ae6ff5da28640794ddcf1ef5401eeeeb238265f/pymatching-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:166abeb45525cbbcb656e66e4400ff24a11b2cf29495dc7b213885809f45d237", size = 649496 }, + { url = "https://files.pythonhosted.org/packages/95/45/5cd05feb089f32dfca8bba551ef796282ef9c00be235ab8ce1b1c52d80a4/pymatching-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:e4a6931a13aa413cd2820d2239b8fe141e685d8de550385d032535b3a7963bbd", size = 339186 }, + { url = "https://files.pythonhosted.org/packages/e7/3b/704b994b8f0f8d9e717400ce9470e3cbbdd880a54bf09c0d003493d60580/pymatching-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f35326c45c062f21ade7c8e2c9871fd56811dd01fdd951dbfd51d199daebfe58", size = 396417 }, + { url = "https://files.pythonhosted.org/packages/59/1a/b228012fdc05505aebe31dd70c66a2d45afabf48544c3b1d56b686bb0efe/pymatching-2.2.2-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:52bc990e7373403f12e021259f9525c0a849e8f044c1ce2f56696721e264b2af", size = 437284 }, + { url = "https://files.pythonhosted.org/packages/7e/66/eb16b60a47bac449b84b674ef11a65cc9f4151f8b0f59feae7121da9476f/pymatching-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffc778d3cc689acaf65de74898d1ac90215c5e4455599fdcda833695bcd5509", size = 647367 }, + { url = "https://files.pythonhosted.org/packages/f1/0f/12f8141533ee6c1818d68ab1e765c00e386899464980c5fba961b01fc9e0/pymatching-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:a24ebb291d6252384928283308707f1ccbc2ee9343a15640c1a60e1fb35ad3db", size = 340149 }, + { url = "https://files.pythonhosted.org/packages/0a/2a/b76dbdd016c1c0124c61c43738f401c4adf01d865e64a48462a447c186f9/pymatching-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:efde929996872d087ba0ca4c90516361a3d74472c3333a8cfb95c51d743baadd", size = 396532 }, + { url = "https://files.pythonhosted.org/packages/7d/ad/8cabe7fbc10b4a45fad9e40eeeeeb3797333c348c2ffa3ed514041bdc2bb/pymatching-2.2.2-cp313-cp313-macosx_11_0_x86_64.whl", hash = "sha256:becb7f90e1c3a7456d60c89f384e88a532a42069e868d20ef4f671f17a7ec64f", size = 437362 }, + { url = "https://files.pythonhosted.org/packages/85/f1/4eedf13761bf6ce657b7614b9a70b444086500f84cc26bf7435decc634a2/pymatching-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d37810c6475540518a147ddfef5fd7d8b5579936b455c9eed0bf7dd6cacbd8b", size = 647435 }, + { url = "https://files.pythonhosted.org/packages/cf/8b/56450f75b2000dfd03293820a17ce6abda7e310f98e2d49b34c8152d2866/pymatching-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:f6a93a67145e54b663ae7397cb2ff7626ec4d4d1d9bd62ae40f5f15613ec4982", size = 340147 }, + { url = "https://files.pythonhosted.org/packages/05/c5/7965a9dfd9ae6e01fd22a8ccfbcead5b50ca0303f2f35b7e99052e5d3cf1/pymatching-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d2fcf66592c9276b97073df87f0e87f0aaebbe93800874c75b4122d29a40523", size = 395604 }, + { url = "https://files.pythonhosted.org/packages/65/9e/5de61f05a5b21de8fad7da317b7384c1f614a87b48dd3b10a579d1647a13/pymatching-2.2.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:312977149f2e7a97ad9aca1df3a8295758577f2abb81d7f505f8f424ee879226", size = 435961 }, + { url = "https://files.pythonhosted.org/packages/97/88/977ef45e412f0ea9ced223e0d9bdc9e17073a64b05501a6ffe8f39988c49/pymatching-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42c348fc0e99b126f87edc4bca52d407a3d525fdb01820b608e946a51b09d119", size = 648613 }, + { url = "https://files.pythonhosted.org/packages/ec/27/ce10edc287f6d817f70ed2fd65d42b0cb04bfaa5eaa103f3268e510e3df7/pymatching-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:a00332d86bd6296594aadce50aeed4cb9df53f87155d6a27badc1f98aa953a97", size = 336664 }, ] [[package]] name = "pyparsing" version = "3.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608, upload-time = "2025-03-25T05:01:28.114Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608 } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload-time = "2025-03-25T05:01:24.908Z" }, + { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120 }, ] [[package]] @@ -2807,9 +2807,9 @@ dependencies = [ { name = "pygments" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714, upload-time = "2025-06-18T05:48:06.109Z" } +sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714 } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474, upload-time = "2025-06-18T05:48:03.955Z" }, + { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474 }, ] [[package]] @@ -2820,9 +2820,9 @@ dependencies = [ { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/85/2fbafaea1fa948497ef7f52574448e7ff99236c71a1519e312b8a2f01008/pytest-console-scripts-1.4.1.tar.gz", hash = "sha256:5a826ed84cc0afa202eb9e44381d7d762f7bdda8e0c23f9f79a7f1f44cf4a895", size = 20994, upload-time = "2023-05-31T08:44:36.954Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/85/2fbafaea1fa948497ef7f52574448e7ff99236c71a1519e312b8a2f01008/pytest-console-scripts-1.4.1.tar.gz", hash = "sha256:5a826ed84cc0afa202eb9e44381d7d762f7bdda8e0c23f9f79a7f1f44cf4a895", size = 20994 } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/12/149a568c244b58912350c7fd3b997ed6b57889a22098564cc43c3e511b76/pytest_console_scripts-1.4.1-py3-none-any.whl", hash = "sha256:ad860a951a90eca4bd3bd1159b8f5428633ba4ea01abd5c9526b67a95f65437a", size = 10881, upload-time = "2023-05-31T08:44:34.516Z" }, + { url = "https://files.pythonhosted.org/packages/32/12/149a568c244b58912350c7fd3b997ed6b57889a22098564cc43c3e511b76/pytest_console_scripts-1.4.1-py3-none-any.whl", hash = "sha256:ad860a951a90eca4bd3bd1159b8f5428633ba4ea01abd5c9526b67a95f65437a", size = 10881 }, ] [[package]] @@ -2834,9 +2834,9 @@ dependencies = [ { name = "pluggy" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/18/99/668cade231f434aaa59bbfbf49469068d2ddd945000621d3d165d2e7dd7b/pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2", size = 69432, upload-time = "2025-06-12T10:47:47.684Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/99/668cade231f434aaa59bbfbf49469068d2ddd945000621d3d165d2e7dd7b/pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2", size = 69432 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5", size = 24644, upload-time = "2025-06-12T10:47:45.932Z" }, + { url = "https://files.pythonhosted.org/packages/bc/16/4ea354101abb1287856baa4af2732be351c7bee728065aed451b678153fd/pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5", size = 24644 }, ] [[package]] @@ -2846,9 +2846,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/28/67172c96ba684058a4d24ffe144d64783d2a270d0af0d9e792737bddc75c/pytest_mock-3.14.1.tar.gz", hash = "sha256:159e9edac4c451ce77a5cdb9fc5d1100708d2dd4ba3c3df572f14097351af80e", size = 33241, upload-time = "2025-05-26T13:58:45.167Z" } +sdist = { url = "https://files.pythonhosted.org/packages/71/28/67172c96ba684058a4d24ffe144d64783d2a270d0af0d9e792737bddc75c/pytest_mock-3.14.1.tar.gz", hash = "sha256:159e9edac4c451ce77a5cdb9fc5d1100708d2dd4ba3c3df572f14097351af80e", size = 33241 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/05/77b60e520511c53d1c1ca75f1930c7dd8e971d0c4379b7f4b3f9644685ba/pytest_mock-3.14.1-py3-none-any.whl", hash = "sha256:178aefcd11307d874b4cd3100344e7e2d888d9791a6a1d9bfe90fbc1b74fd1d0", size = 9923, upload-time = "2025-05-26T13:58:43.487Z" }, + { url = "https://files.pythonhosted.org/packages/b2/05/77b60e520511c53d1c1ca75f1930c7dd8e971d0c4379b7f4b3f9644685ba/pytest_mock-3.14.1-py3-none-any.whl", hash = "sha256:178aefcd11307d874b4cd3100344e7e2d888d9791a6a1d9bfe90fbc1b74fd1d0", size = 9923 }, ] [[package]] @@ -2860,9 +2860,9 @@ dependencies = [ { name = "pytest" }, { name = "termcolor" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/ac/5754f5edd6d508bc6493bc37d74b928f102a5fff82d9a80347e180998f08/pytest-sugar-1.0.0.tar.gz", hash = "sha256:6422e83258f5b0c04ce7c632176c7732cab5fdb909cb39cca5c9139f81276c0a", size = 14992, upload-time = "2024-02-01T18:30:36.735Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/ac/5754f5edd6d508bc6493bc37d74b928f102a5fff82d9a80347e180998f08/pytest-sugar-1.0.0.tar.gz", hash = "sha256:6422e83258f5b0c04ce7c632176c7732cab5fdb909cb39cca5c9139f81276c0a", size = 14992 } wheels = [ - { url = "https://files.pythonhosted.org/packages/92/fb/889f1b69da2f13691de09a111c16c4766a433382d44aa0ecf221deded44a/pytest_sugar-1.0.0-py3-none-any.whl", hash = "sha256:70ebcd8fc5795dc457ff8b69d266a4e2e8a74ae0c3edc749381c64b5246c8dfd", size = 10171, upload-time = "2024-02-01T18:30:29.395Z" }, + { url = "https://files.pythonhosted.org/packages/92/fb/889f1b69da2f13691de09a111c16c4766a433382d44aa0ecf221deded44a/pytest_sugar-1.0.0-py3-none-any.whl", hash = "sha256:70ebcd8fc5795dc457ff8b69d266a4e2e8a74ae0c3edc749381c64b5246c8dfd", size = 10171 }, ] [[package]] @@ -2873,9 +2873,9 @@ dependencies = [ { name = "execnet" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload-time = "2025-07-01T13:30:59.346Z" } +sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload-time = "2025-07-01T13:30:56.632Z" }, + { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396 }, ] [[package]] @@ -2885,18 +2885,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, ] [[package]] name = "pytz" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, ] [[package]] @@ -2904,77 +2904,77 @@ name = "pywin32" version = "311" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/40/44efbb0dfbd33aca6a6483191dae0716070ed99e2ecb0c53683f400a0b4f/pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3", size = 8760432, upload-time = "2025-07-14T20:13:05.9Z" }, - { url = "https://files.pythonhosted.org/packages/5e/bf/360243b1e953bd254a82f12653974be395ba880e7ec23e3731d9f73921cc/pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b", size = 9590103, upload-time = "2025-07-14T20:13:07.698Z" }, - { url = "https://files.pythonhosted.org/packages/57/38/d290720e6f138086fb3d5ffe0b6caa019a791dd57866940c82e4eeaf2012/pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b", size = 8778557, upload-time = "2025-07-14T20:13:11.11Z" }, - { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload-time = "2025-07-14T20:13:13.266Z" }, - { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload-time = "2025-07-14T20:13:15.147Z" }, - { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload-time = "2025-07-14T20:13:16.945Z" }, - { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" }, - { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" }, - { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, - { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, - { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, - { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, - { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, - { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, - { url = "https://files.pythonhosted.org/packages/59/42/b86689aac0cdaee7ae1c58d464b0ff04ca909c19bb6502d4973cdd9f9544/pywin32-311-cp39-cp39-win32.whl", hash = "sha256:aba8f82d551a942cb20d4a83413ccbac30790b50efb89a75e4f586ac0bb8056b", size = 8760837, upload-time = "2025-07-14T20:12:59.59Z" }, - { url = "https://files.pythonhosted.org/packages/9f/8a/1403d0353f8c5a2f0829d2b1c4becbf9da2f0a4d040886404fc4a5431e4d/pywin32-311-cp39-cp39-win_amd64.whl", hash = "sha256:e0c4cfb0621281fe40387df582097fd796e80430597cb9944f0ae70447bacd91", size = 9590187, upload-time = "2025-07-14T20:13:01.419Z" }, - { url = "https://files.pythonhosted.org/packages/60/22/e0e8d802f124772cec9c75430b01a212f86f9de7546bda715e54140d5aeb/pywin32-311-cp39-cp39-win_arm64.whl", hash = "sha256:62ea666235135fee79bb154e695f3ff67370afefd71bd7fea7512fc70ef31e3d", size = 8778162, upload-time = "2025-07-14T20:13:03.544Z" }, + { url = "https://files.pythonhosted.org/packages/7b/40/44efbb0dfbd33aca6a6483191dae0716070ed99e2ecb0c53683f400a0b4f/pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3", size = 8760432 }, + { url = "https://files.pythonhosted.org/packages/5e/bf/360243b1e953bd254a82f12653974be395ba880e7ec23e3731d9f73921cc/pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b", size = 9590103 }, + { url = "https://files.pythonhosted.org/packages/57/38/d290720e6f138086fb3d5ffe0b6caa019a791dd57866940c82e4eeaf2012/pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b", size = 8778557 }, + { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031 }, + { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308 }, + { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930 }, + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543 }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040 }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102 }, + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700 }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700 }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318 }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714 }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800 }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540 }, + { url = "https://files.pythonhosted.org/packages/59/42/b86689aac0cdaee7ae1c58d464b0ff04ca909c19bb6502d4973cdd9f9544/pywin32-311-cp39-cp39-win32.whl", hash = "sha256:aba8f82d551a942cb20d4a83413ccbac30790b50efb89a75e4f586ac0bb8056b", size = 8760837 }, + { url = "https://files.pythonhosted.org/packages/9f/8a/1403d0353f8c5a2f0829d2b1c4becbf9da2f0a4d040886404fc4a5431e4d/pywin32-311-cp39-cp39-win_amd64.whl", hash = "sha256:e0c4cfb0621281fe40387df582097fd796e80430597cb9944f0ae70447bacd91", size = 9590187 }, + { url = "https://files.pythonhosted.org/packages/60/22/e0e8d802f124772cec9c75430b01a212f86f9de7546bda715e54140d5aeb/pywin32-311-cp39-cp39-win_arm64.whl", hash = "sha256:62ea666235135fee79bb154e695f3ff67370afefd71bd7fea7512fc70ef31e3d", size = 8778162 }, ] [[package]] name = "pyyaml" version = "6.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199, upload-time = "2024-08-06T20:31:40.178Z" }, - { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758, upload-time = "2024-08-06T20:31:42.173Z" }, - { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463, upload-time = "2024-08-06T20:31:44.263Z" }, - { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280, upload-time = "2024-08-06T20:31:50.199Z" }, - { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239, upload-time = "2024-08-06T20:31:52.292Z" }, - { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802, upload-time = "2024-08-06T20:31:53.836Z" }, - { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527, upload-time = "2024-08-06T20:31:55.565Z" }, - { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052, upload-time = "2024-08-06T20:31:56.914Z" }, - { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774, upload-time = "2024-08-06T20:31:58.304Z" }, - { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload-time = "2024-08-06T20:32:03.408Z" }, - { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload-time = "2024-08-06T20:32:04.926Z" }, - { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload-time = "2024-08-06T20:32:06.459Z" }, - { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload-time = "2024-08-06T20:32:08.338Z" }, - { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload-time = "2024-08-06T20:32:14.124Z" }, - { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload-time = "2024-08-06T20:32:16.17Z" }, - { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload-time = "2024-08-06T20:32:18.555Z" }, - { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload-time = "2024-08-06T20:32:19.889Z" }, - { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload-time = "2024-08-06T20:32:21.273Z" }, - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload-time = "2024-08-06T20:32:25.131Z" }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload-time = "2024-08-06T20:32:26.511Z" }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload-time = "2024-08-06T20:32:28.363Z" }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload-time = "2024-08-06T20:32:30.058Z" }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload-time = "2024-08-06T20:32:31.881Z" }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload-time = "2024-08-06T20:32:37.083Z" }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload-time = "2024-08-06T20:32:38.898Z" }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload-time = "2024-08-06T20:32:40.241Z" }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload-time = "2024-08-06T20:32:41.93Z" }, - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, - { url = "https://files.pythonhosted.org/packages/65/d8/b7a1db13636d7fb7d4ff431593c510c8b8fca920ade06ca8ef20015493c5/PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", size = 184777, upload-time = "2024-08-06T20:33:25.896Z" }, - { url = "https://files.pythonhosted.org/packages/0a/02/6ec546cd45143fdf9840b2c6be8d875116a64076218b61d68e12548e5839/PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", size = 172318, upload-time = "2024-08-06T20:33:27.212Z" }, - { url = "https://files.pythonhosted.org/packages/0e/9a/8cc68be846c972bda34f6c2a93abb644fb2476f4dcc924d52175786932c9/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", size = 720891, upload-time = "2024-08-06T20:33:28.974Z" }, - { url = "https://files.pythonhosted.org/packages/e9/6c/6e1b7f40181bc4805e2e07f4abc10a88ce4648e7e95ff1abe4ae4014a9b2/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", size = 722614, upload-time = "2024-08-06T20:33:34.157Z" }, - { url = "https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", size = 737360, upload-time = "2024-08-06T20:33:35.84Z" }, - { url = "https://files.pythonhosted.org/packages/d7/12/7322c1e30b9be969670b672573d45479edef72c9a0deac3bb2868f5d7469/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", size = 699006, upload-time = "2024-08-06T20:33:37.501Z" }, - { url = "https://files.pythonhosted.org/packages/82/72/04fcad41ca56491995076630c3ec1e834be241664c0c09a64c9a2589b507/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", size = 723577, upload-time = "2024-08-06T20:33:39.389Z" }, - { url = "https://files.pythonhosted.org/packages/ed/5e/46168b1f2757f1fcd442bc3029cd8767d88a98c9c05770d8b420948743bb/PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", size = 144593, upload-time = "2024-08-06T20:33:46.63Z" }, - { url = "https://files.pythonhosted.org/packages/19/87/5124b1c1f2412bb95c59ec481eaf936cd32f0fe2a7b16b97b81c4c017a6a/PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", size = 162312, upload-time = "2024-08-06T20:33:49.073Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199 }, + { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758 }, + { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463 }, + { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280 }, + { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239 }, + { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802 }, + { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527 }, + { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052 }, + { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774 }, + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, + { url = "https://files.pythonhosted.org/packages/65/d8/b7a1db13636d7fb7d4ff431593c510c8b8fca920ade06ca8ef20015493c5/PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", size = 184777 }, + { url = "https://files.pythonhosted.org/packages/0a/02/6ec546cd45143fdf9840b2c6be8d875116a64076218b61d68e12548e5839/PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", size = 172318 }, + { url = "https://files.pythonhosted.org/packages/0e/9a/8cc68be846c972bda34f6c2a93abb644fb2476f4dcc924d52175786932c9/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", size = 720891 }, + { url = "https://files.pythonhosted.org/packages/e9/6c/6e1b7f40181bc4805e2e07f4abc10a88ce4648e7e95ff1abe4ae4014a9b2/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", size = 722614 }, + { url = "https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", size = 737360 }, + { url = "https://files.pythonhosted.org/packages/d7/12/7322c1e30b9be969670b672573d45479edef72c9a0deac3bb2868f5d7469/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", size = 699006 }, + { url = "https://files.pythonhosted.org/packages/82/72/04fcad41ca56491995076630c3ec1e834be241664c0c09a64c9a2589b507/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", size = 723577 }, + { url = "https://files.pythonhosted.org/packages/ed/5e/46168b1f2757f1fcd442bc3029cd8767d88a98c9c05770d8b420948743bb/PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", size = 144593 }, + { url = "https://files.pythonhosted.org/packages/19/87/5124b1c1f2412bb95c59ec481eaf936cd32f0fe2a7b16b97b81c4c017a6a/PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", size = 162312 }, ] [[package]] @@ -2984,72 +2984,72 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "implementation_name == 'pypy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/06/50a4e9648b3e8b992bef8eb632e457307553a89d294103213cfd47b3da69/pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf", size = 280478, upload-time = "2025-06-13T14:09:07.087Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/09/1681d4b047626d352c083770618ac29655ab1f5c20eee31dc94c000b9b7b/pyzmq-27.0.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:b973ee650e8f442ce482c1d99ca7ab537c69098d53a3d046676a484fd710c87a", size = 1329291, upload-time = "2025-06-13T14:06:57.945Z" }, - { url = "https://files.pythonhosted.org/packages/9d/b2/9c9385225fdd54db9506ed8accbb9ea63ca813ba59d43d7f282a6a16a30b/pyzmq-27.0.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:661942bc7cd0223d569d808f2e5696d9cc120acc73bf3e88a1f1be7ab648a7e4", size = 905952, upload-time = "2025-06-13T14:07:03.232Z" }, - { url = "https://files.pythonhosted.org/packages/41/73/333c72c7ec182cdffe25649e3da1c3b9f3cf1cede63cfdc23d1384d4a601/pyzmq-27.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50360fb2a056ffd16e5f4177eee67f1dd1017332ea53fb095fe7b5bf29c70246", size = 666165, upload-time = "2025-06-13T14:07:04.667Z" }, - { url = "https://files.pythonhosted.org/packages/a5/fe/fc7b9c1a50981928e25635a926653cb755364316db59ccd6e79cfb9a0b4f/pyzmq-27.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf209a6dc4b420ed32a7093642843cbf8703ed0a7d86c16c0b98af46762ebefb", size = 853755, upload-time = "2025-06-13T14:07:06.93Z" }, - { url = "https://files.pythonhosted.org/packages/8c/4c/740ed4b6e8fa160cd19dc5abec8db68f440564b2d5b79c1d697d9862a2f7/pyzmq-27.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c2dace4a7041cca2fba5357a2d7c97c5effdf52f63a1ef252cfa496875a3762d", size = 1654868, upload-time = "2025-06-13T14:07:08.224Z" }, - { url = "https://files.pythonhosted.org/packages/97/00/875b2ecfcfc78ab962a59bd384995186818524ea957dc8ad3144611fae12/pyzmq-27.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:63af72b2955fc77caf0a77444baa2431fcabb4370219da38e1a9f8d12aaebe28", size = 2033443, upload-time = "2025-06-13T14:07:09.653Z" }, - { url = "https://files.pythonhosted.org/packages/60/55/6dd9c470c42d713297c5f2a56f7903dc1ebdb4ab2edda996445c21651900/pyzmq-27.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e8c4adce8e37e75c4215297d7745551b8dcfa5f728f23ce09bf4e678a9399413", size = 1891288, upload-time = "2025-06-13T14:07:11.099Z" }, - { url = "https://files.pythonhosted.org/packages/28/5d/54b0ef50d40d7c65a627f4a4b4127024ba9820f2af8acd933a4d30ae192e/pyzmq-27.0.0-cp310-cp310-win32.whl", hash = "sha256:5d5ef4718ecab24f785794e0e7536436698b459bfbc19a1650ef55280119d93b", size = 567936, upload-time = "2025-06-13T14:07:12.468Z" }, - { url = "https://files.pythonhosted.org/packages/18/ea/dedca4321de748ca48d3bcdb72274d4d54e8d84ea49088d3de174bd45d88/pyzmq-27.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:e40609380480b3d12c30f841323f42451c755b8fece84235236f5fe5ffca8c1c", size = 628686, upload-time = "2025-06-13T14:07:14.051Z" }, - { url = "https://files.pythonhosted.org/packages/d4/a7/fcdeedc306e71e94ac262cba2d02337d885f5cdb7e8efced8e5ffe327808/pyzmq-27.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6b0397b0be277b46762956f576e04dc06ced265759e8c2ff41a0ee1aa0064198", size = 559039, upload-time = "2025-06-13T14:07:15.289Z" }, - { url = "https://files.pythonhosted.org/packages/44/df/84c630654106d9bd9339cdb564aa941ed41b023a0264251d6743766bb50e/pyzmq-27.0.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:21457825249b2a53834fa969c69713f8b5a79583689387a5e7aed880963ac564", size = 1332718, upload-time = "2025-06-13T14:07:16.555Z" }, - { url = "https://files.pythonhosted.org/packages/c1/8e/f6a5461a07654d9840d256476434ae0ff08340bba562a455f231969772cb/pyzmq-27.0.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1958947983fef513e6e98eff9cb487b60bf14f588dc0e6bf35fa13751d2c8251", size = 908248, upload-time = "2025-06-13T14:07:18.033Z" }, - { url = "https://files.pythonhosted.org/packages/7c/93/82863e8d695a9a3ae424b63662733ae204a295a2627d52af2f62c2cd8af9/pyzmq-27.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0dc628b5493f9a8cd9844b8bee9732ef587ab00002157c9329e4fc0ef4d3afa", size = 668647, upload-time = "2025-06-13T14:07:19.378Z" }, - { url = "https://files.pythonhosted.org/packages/f3/85/15278769b348121eacdbfcbd8c4d40f1102f32fa6af5be1ffc032ed684be/pyzmq-27.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7bbe9e1ed2c8d3da736a15694d87c12493e54cc9dc9790796f0321794bbc91f", size = 856600, upload-time = "2025-06-13T14:07:20.906Z" }, - { url = "https://files.pythonhosted.org/packages/d4/af/1c469b3d479bd095edb28e27f12eee10b8f00b356acbefa6aeb14dd295d1/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dc1091f59143b471d19eb64f54bae4f54bcf2a466ffb66fe45d94d8d734eb495", size = 1657748, upload-time = "2025-06-13T14:07:22.549Z" }, - { url = "https://files.pythonhosted.org/packages/8c/f4/17f965d0ee6380b1d6326da842a50e4b8b9699745161207945f3745e8cb5/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7011ade88c8e535cf140f8d1a59428676fbbce7c6e54fefce58bf117aefb6667", size = 2034311, upload-time = "2025-06-13T14:07:23.966Z" }, - { url = "https://files.pythonhosted.org/packages/e0/6e/7c391d81fa3149fd759de45d298003de6cfab343fb03e92c099821c448db/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c386339d7e3f064213aede5d03d054b237937fbca6dd2197ac8cf3b25a6b14e", size = 1893630, upload-time = "2025-06-13T14:07:25.899Z" }, - { url = "https://files.pythonhosted.org/packages/0e/e0/eaffe7a86f60e556399e224229e7769b717f72fec0706b70ab2c03aa04cb/pyzmq-27.0.0-cp311-cp311-win32.whl", hash = "sha256:0546a720c1f407b2172cb04b6b094a78773491497e3644863cf5c96c42df8cff", size = 567706, upload-time = "2025-06-13T14:07:27.595Z" }, - { url = "https://files.pythonhosted.org/packages/c9/05/89354a8cffdcce6e547d48adaaf7be17007fc75572123ff4ca90a4ca04fc/pyzmq-27.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:15f39d50bd6c9091c67315ceb878a4f531957b121d2a05ebd077eb35ddc5efed", size = 630322, upload-time = "2025-06-13T14:07:28.938Z" }, - { url = "https://files.pythonhosted.org/packages/fa/07/4ab976d5e1e63976719389cc4f3bfd248a7f5f2bb2ebe727542363c61b5f/pyzmq-27.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c5817641eebb391a2268c27fecd4162448e03538387093cdbd8bf3510c316b38", size = 558435, upload-time = "2025-06-13T14:07:30.256Z" }, - { url = "https://files.pythonhosted.org/packages/93/a7/9ad68f55b8834ede477842214feba6a4c786d936c022a67625497aacf61d/pyzmq-27.0.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52", size = 1305438, upload-time = "2025-06-13T14:07:31.676Z" }, - { url = "https://files.pythonhosted.org/packages/ba/ee/26aa0f98665a22bc90ebe12dced1de5f3eaca05363b717f6fb229b3421b3/pyzmq-27.0.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3", size = 895095, upload-time = "2025-06-13T14:07:33.104Z" }, - { url = "https://files.pythonhosted.org/packages/cf/85/c57e7ab216ecd8aa4cc7e3b83b06cc4e9cf45c87b0afc095f10cd5ce87c1/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152", size = 651826, upload-time = "2025-06-13T14:07:34.831Z" }, - { url = "https://files.pythonhosted.org/packages/69/9a/9ea7e230feda9400fb0ae0d61d7d6ddda635e718d941c44eeab22a179d34/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22", size = 839750, upload-time = "2025-06-13T14:07:36.553Z" }, - { url = "https://files.pythonhosted.org/packages/08/66/4cebfbe71f3dfbd417011daca267539f62ed0fbc68105357b68bbb1a25b7/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371", size = 1641357, upload-time = "2025-06-13T14:07:38.21Z" }, - { url = "https://files.pythonhosted.org/packages/ac/f6/b0f62578c08d2471c791287149cb8c2aaea414ae98c6e995c7dbe008adfb/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d", size = 2020281, upload-time = "2025-06-13T14:07:39.599Z" }, - { url = "https://files.pythonhosted.org/packages/37/b9/4f670b15c7498495da9159edc374ec09c88a86d9cd5a47d892f69df23450/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be", size = 1877110, upload-time = "2025-06-13T14:07:41.027Z" }, - { url = "https://files.pythonhosted.org/packages/66/31/9dee25c226295b740609f0d46db2fe972b23b6f5cf786360980524a3ba92/pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4", size = 559297, upload-time = "2025-06-13T14:07:42.533Z" }, - { url = "https://files.pythonhosted.org/packages/9b/12/52da5509800f7ff2d287b2f2b4e636e7ea0f001181cba6964ff6c1537778/pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371", size = 619203, upload-time = "2025-06-13T14:07:43.843Z" }, - { url = "https://files.pythonhosted.org/packages/93/6d/7f2e53b19d1edb1eb4f09ec7c3a1f945ca0aac272099eab757d15699202b/pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e", size = 551927, upload-time = "2025-06-13T14:07:45.51Z" }, - { url = "https://files.pythonhosted.org/packages/19/62/876b27c4ff777db4ceba1c69ea90d3c825bb4f8d5e7cd987ce5802e33c55/pyzmq-27.0.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c36ad534c0c29b4afa088dc53543c525b23c0797e01b69fef59b1a9c0e38b688", size = 1340826, upload-time = "2025-06-13T14:07:46.881Z" }, - { url = "https://files.pythonhosted.org/packages/43/69/58ef8f4f59d3bcd505260c73bee87b008850f45edca40ddaba54273c35f4/pyzmq-27.0.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:67855c14173aec36395d7777aaba3cc527b393821f30143fd20b98e1ff31fd38", size = 897283, upload-time = "2025-06-13T14:07:49.562Z" }, - { url = "https://files.pythonhosted.org/packages/43/15/93a0d0396700a60475ad3c5d42c5f1c308d3570bc94626b86c71ef9953e0/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8617c7d43cd8ccdb62aebe984bfed77ca8f036e6c3e46dd3dddda64b10f0ab7a", size = 660567, upload-time = "2025-06-13T14:07:51.364Z" }, - { url = "https://files.pythonhosted.org/packages/0e/b3/fe055513e498ca32f64509abae19b9c9eb4d7c829e02bd8997dd51b029eb/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67bfbcbd0a04c575e8103a6061d03e393d9f80ffdb9beb3189261e9e9bc5d5e9", size = 847681, upload-time = "2025-06-13T14:07:52.77Z" }, - { url = "https://files.pythonhosted.org/packages/b6/4f/ff15300b00b5b602191f3df06bbc8dd4164e805fdd65bb77ffbb9c5facdc/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5cd11d46d7b7e5958121b3eaf4cd8638eff3a720ec527692132f05a57f14341d", size = 1650148, upload-time = "2025-06-13T14:07:54.178Z" }, - { url = "https://files.pythonhosted.org/packages/c4/6f/84bdfff2a224a6f26a24249a342e5906993c50b0761e311e81b39aef52a7/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:b801c2e40c5aa6072c2f4876de8dccd100af6d9918d4d0d7aa54a1d982fd4f44", size = 2023768, upload-time = "2025-06-13T14:07:55.714Z" }, - { url = "https://files.pythonhosted.org/packages/64/39/dc2db178c26a42228c5ac94a9cc595030458aa64c8d796a7727947afbf55/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:20d5cb29e8c5f76a127c75b6e7a77e846bc4b655c373baa098c26a61b7ecd0ef", size = 1885199, upload-time = "2025-06-13T14:07:57.166Z" }, - { url = "https://files.pythonhosted.org/packages/c7/21/dae7b06a1f8cdee5d8e7a63d99c5d129c401acc40410bef2cbf42025e26f/pyzmq-27.0.0-cp313-cp313t-win32.whl", hash = "sha256:a20528da85c7ac7a19b7384e8c3f8fa707841fd85afc4ed56eda59d93e3d98ad", size = 575439, upload-time = "2025-06-13T14:07:58.959Z" }, - { url = "https://files.pythonhosted.org/packages/eb/bc/1709dc55f0970cf4cb8259e435e6773f9946f41a045c2cb90e870b7072da/pyzmq-27.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f", size = 639933, upload-time = "2025-06-13T14:08:00.777Z" }, - { url = "https://files.pythonhosted.org/packages/19/dc/95210fe17e5d7dba89bd663e1d88f50a8003f296284731b09f1d95309a42/pyzmq-27.0.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:100f6e5052ba42b2533011d34a018a5ace34f8cac67cb03cfa37c8bdae0ca617", size = 1330656, upload-time = "2025-06-13T14:08:17.414Z" }, - { url = "https://files.pythonhosted.org/packages/d3/7e/63f742b578316258e03ecb393d35c0964348d80834bdec8a100ed7bb9c91/pyzmq-27.0.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:bf6c6b061efd00404b9750e2cfbd9507492c8d4b3721ded76cb03786131be2ed", size = 906522, upload-time = "2025-06-13T14:08:18.945Z" }, - { url = "https://files.pythonhosted.org/packages/1f/bf/f0b2b67f5a9bfe0fbd0e978a2becd901f802306aa8e29161cb0963094352/pyzmq-27.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee05728c0b0b2484a9fc20466fa776fffb65d95f7317a3419985b8c908563861", size = 863545, upload-time = "2025-06-13T14:08:20.386Z" }, - { url = "https://files.pythonhosted.org/packages/87/0e/7d90ccd2ef577c8bae7f926acd2011a6d960eea8a068c5fd52b419206960/pyzmq-27.0.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7cdf07fe0a557b131366f80727ec8ccc4b70d89f1e3f920d94a594d598d754f0", size = 666796, upload-time = "2025-06-13T14:08:21.836Z" }, - { url = "https://files.pythonhosted.org/packages/4f/6d/ca8007a313baa73361778773aef210f4902e68f468d1f93b6c8b908fabbd/pyzmq-27.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:90252fa2ff3a104219db1f5ced7032a7b5fc82d7c8d2fec2b9a3e6fd4e25576b", size = 1655599, upload-time = "2025-06-13T14:08:23.343Z" }, - { url = "https://files.pythonhosted.org/packages/46/de/5cb4f99d6c0dd8f33d729c9ebd49af279586e5ab127e93aa6ef0ecd08c4c/pyzmq-27.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ea6d441c513bf18c578c73c323acf7b4184507fc244762193aa3a871333c9045", size = 2034119, upload-time = "2025-06-13T14:08:26.369Z" }, - { url = "https://files.pythonhosted.org/packages/d0/8d/57cc90c8b5f30a97a7e86ec91a3b9822ec7859d477e9c30f531fb78f4a97/pyzmq-27.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ae2b34bcfaae20c064948a4113bf8709eee89fd08317eb293ae4ebd69b4d9740", size = 1891955, upload-time = "2025-06-13T14:08:28.39Z" }, - { url = "https://files.pythonhosted.org/packages/24/f5/a7012022573188903802ab75b5314b00e5c629228f3a36fadb421a42ebff/pyzmq-27.0.0-cp39-cp39-win32.whl", hash = "sha256:5b10bd6f008937705cf6e7bf8b6ece5ca055991e3eb130bca8023e20b86aa9a3", size = 568497, upload-time = "2025-06-13T14:08:30.089Z" }, - { url = "https://files.pythonhosted.org/packages/9b/f3/2a4b2798275a574801221d94d599ed3e26d19f6378a7364cdfa3bee53944/pyzmq-27.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:00387d12a8af4b24883895f7e6b9495dc20a66027b696536edac35cb988c38f3", size = 629315, upload-time = "2025-06-13T14:08:31.877Z" }, - { url = "https://files.pythonhosted.org/packages/da/eb/386a70314f305816142d6e8537f5557e5fd9614c03698d6c88cbd6c41190/pyzmq-27.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:4c19d39c04c29a6619adfeb19e3735c421b3bfee082f320662f52e59c47202ba", size = 559596, upload-time = "2025-06-13T14:08:33.357Z" }, - { url = "https://files.pythonhosted.org/packages/09/6f/be6523a7f3821c0b5370912ef02822c028611360e0d206dd945bdbf9eaef/pyzmq-27.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:656c1866505a5735d0660b7da6d7147174bbf59d4975fc2b7f09f43c9bc25745", size = 835950, upload-time = "2025-06-13T14:08:35Z" }, - { url = "https://files.pythonhosted.org/packages/c6/1e/a50fdd5c15018de07ab82a61bc460841be967ee7bbe7abee3b714d66f7ac/pyzmq-27.0.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:74175b9e12779382432dd1d1f5960ebe7465d36649b98a06c6b26be24d173fab", size = 799876, upload-time = "2025-06-13T14:08:36.849Z" }, - { url = "https://files.pythonhosted.org/packages/88/a1/89eb5b71f5a504f8f887aceb8e1eb3626e00c00aa8085381cdff475440dc/pyzmq-27.0.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8c6de908465697a8708e4d6843a1e884f567962fc61eb1706856545141d0cbb", size = 567400, upload-time = "2025-06-13T14:08:38.95Z" }, - { url = "https://files.pythonhosted.org/packages/56/aa/4571dbcff56cfb034bac73fde8294e123c975ce3eea89aff31bf6dc6382b/pyzmq-27.0.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c644aaacc01d0df5c7072826df45e67301f191c55f68d7b2916d83a9ddc1b551", size = 747031, upload-time = "2025-06-13T14:08:40.413Z" }, - { url = "https://files.pythonhosted.org/packages/46/e0/d25f30fe0991293c5b2f5ef3b070d35fa6d57c0c7428898c3ab4913d0297/pyzmq-27.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:10f70c1d9a446a85013a36871a296007f6fe4232b530aa254baf9da3f8328bc0", size = 544726, upload-time = "2025-06-13T14:08:41.997Z" }, - { url = "https://files.pythonhosted.org/packages/98/a6/92394373b8dbc1edc9d53c951e8d3989d518185174ee54492ec27711779d/pyzmq-27.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd1dc59763effd1576f8368047c9c31468fce0af89d76b5067641137506792ae", size = 835948, upload-time = "2025-06-13T14:08:43.516Z" }, - { url = "https://files.pythonhosted.org/packages/56/f3/4dc38d75d9995bfc18773df3e41f2a2ca9b740b06f1a15dbf404077e7588/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:60e8cc82d968174650c1860d7b716366caab9973787a1c060cf8043130f7d0f7", size = 799874, upload-time = "2025-06-13T14:08:45.017Z" }, - { url = "https://files.pythonhosted.org/packages/ab/ba/64af397e0f421453dc68e31d5e0784d554bf39013a2de0872056e96e58af/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14fe7aaac86e4e93ea779a821967360c781d7ac5115b3f1a171ced77065a0174", size = 567400, upload-time = "2025-06-13T14:08:46.855Z" }, - { url = "https://files.pythonhosted.org/packages/63/87/ec956cbe98809270b59a22891d5758edae147a258e658bf3024a8254c855/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6ad0562d4e6abb785be3e4dd68599c41be821b521da38c402bc9ab2a8e7ebc7e", size = 747031, upload-time = "2025-06-13T14:08:48.419Z" }, - { url = "https://files.pythonhosted.org/packages/be/8a/4a3764a68abc02e2fbb0668d225b6fda5cd39586dd099cee8b2ed6ab0452/pyzmq-27.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:9df43a2459cd3a3563404c1456b2c4c69564daa7dbaf15724c09821a3329ce46", size = 544726, upload-time = "2025-06-13T14:08:49.903Z" }, - { url = "https://files.pythonhosted.org/packages/03/f6/11b2a6c8cd13275c31cddc3f89981a1b799a3c41dec55289fa18dede96b5/pyzmq-27.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:39ddd3ba0a641f01d8f13a3cfd4c4924eb58e660d8afe87e9061d6e8ca6f7ac3", size = 835944, upload-time = "2025-06-13T14:08:59.189Z" }, - { url = "https://files.pythonhosted.org/packages/73/34/aa39076f4e07ae1912fa4b966fe24e831e01d736d4c1c7e8a3aa28a555b5/pyzmq-27.0.0-pp39-pypy39_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8ca7e6a0388dd9e1180b14728051068f4efe83e0d2de058b5ff92c63f399a73f", size = 799869, upload-time = "2025-06-13T14:09:00.758Z" }, - { url = "https://files.pythonhosted.org/packages/65/f3/81ed6b3dd242408ee79c0d8a88734644acf208baee8666ecd7e52664cf55/pyzmq-27.0.0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2524c40891be6a3106885a3935d58452dd83eb7a5742a33cc780a1ad4c49dec0", size = 758371, upload-time = "2025-06-13T14:09:02.461Z" }, - { url = "https://files.pythonhosted.org/packages/e1/04/dac4ca674764281caf744e8adefd88f7e325e1605aba0f9a322094b903fa/pyzmq-27.0.0-pp39-pypy39_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a56e3e5bd2d62a01744fd2f1ce21d760c7c65f030e9522738d75932a14ab62a", size = 567393, upload-time = "2025-06-13T14:09:04.037Z" }, - { url = "https://files.pythonhosted.org/packages/51/8b/619a9ee2fa4d3c724fbadde946427735ade64da03894b071bbdc3b789d83/pyzmq-27.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:096af9e133fec3a72108ddefba1e42985cb3639e9de52cfd336b6fc23aa083e9", size = 544715, upload-time = "2025-06-13T14:09:05.579Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f1/06/50a4e9648b3e8b992bef8eb632e457307553a89d294103213cfd47b3da69/pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf", size = 280478 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/09/1681d4b047626d352c083770618ac29655ab1f5c20eee31dc94c000b9b7b/pyzmq-27.0.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:b973ee650e8f442ce482c1d99ca7ab537c69098d53a3d046676a484fd710c87a", size = 1329291 }, + { url = "https://files.pythonhosted.org/packages/9d/b2/9c9385225fdd54db9506ed8accbb9ea63ca813ba59d43d7f282a6a16a30b/pyzmq-27.0.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:661942bc7cd0223d569d808f2e5696d9cc120acc73bf3e88a1f1be7ab648a7e4", size = 905952 }, + { url = "https://files.pythonhosted.org/packages/41/73/333c72c7ec182cdffe25649e3da1c3b9f3cf1cede63cfdc23d1384d4a601/pyzmq-27.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50360fb2a056ffd16e5f4177eee67f1dd1017332ea53fb095fe7b5bf29c70246", size = 666165 }, + { url = "https://files.pythonhosted.org/packages/a5/fe/fc7b9c1a50981928e25635a926653cb755364316db59ccd6e79cfb9a0b4f/pyzmq-27.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf209a6dc4b420ed32a7093642843cbf8703ed0a7d86c16c0b98af46762ebefb", size = 853755 }, + { url = "https://files.pythonhosted.org/packages/8c/4c/740ed4b6e8fa160cd19dc5abec8db68f440564b2d5b79c1d697d9862a2f7/pyzmq-27.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c2dace4a7041cca2fba5357a2d7c97c5effdf52f63a1ef252cfa496875a3762d", size = 1654868 }, + { url = "https://files.pythonhosted.org/packages/97/00/875b2ecfcfc78ab962a59bd384995186818524ea957dc8ad3144611fae12/pyzmq-27.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:63af72b2955fc77caf0a77444baa2431fcabb4370219da38e1a9f8d12aaebe28", size = 2033443 }, + { url = "https://files.pythonhosted.org/packages/60/55/6dd9c470c42d713297c5f2a56f7903dc1ebdb4ab2edda996445c21651900/pyzmq-27.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e8c4adce8e37e75c4215297d7745551b8dcfa5f728f23ce09bf4e678a9399413", size = 1891288 }, + { url = "https://files.pythonhosted.org/packages/28/5d/54b0ef50d40d7c65a627f4a4b4127024ba9820f2af8acd933a4d30ae192e/pyzmq-27.0.0-cp310-cp310-win32.whl", hash = "sha256:5d5ef4718ecab24f785794e0e7536436698b459bfbc19a1650ef55280119d93b", size = 567936 }, + { url = "https://files.pythonhosted.org/packages/18/ea/dedca4321de748ca48d3bcdb72274d4d54e8d84ea49088d3de174bd45d88/pyzmq-27.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:e40609380480b3d12c30f841323f42451c755b8fece84235236f5fe5ffca8c1c", size = 628686 }, + { url = "https://files.pythonhosted.org/packages/d4/a7/fcdeedc306e71e94ac262cba2d02337d885f5cdb7e8efced8e5ffe327808/pyzmq-27.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6b0397b0be277b46762956f576e04dc06ced265759e8c2ff41a0ee1aa0064198", size = 559039 }, + { url = "https://files.pythonhosted.org/packages/44/df/84c630654106d9bd9339cdb564aa941ed41b023a0264251d6743766bb50e/pyzmq-27.0.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:21457825249b2a53834fa969c69713f8b5a79583689387a5e7aed880963ac564", size = 1332718 }, + { url = "https://files.pythonhosted.org/packages/c1/8e/f6a5461a07654d9840d256476434ae0ff08340bba562a455f231969772cb/pyzmq-27.0.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1958947983fef513e6e98eff9cb487b60bf14f588dc0e6bf35fa13751d2c8251", size = 908248 }, + { url = "https://files.pythonhosted.org/packages/7c/93/82863e8d695a9a3ae424b63662733ae204a295a2627d52af2f62c2cd8af9/pyzmq-27.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0dc628b5493f9a8cd9844b8bee9732ef587ab00002157c9329e4fc0ef4d3afa", size = 668647 }, + { url = "https://files.pythonhosted.org/packages/f3/85/15278769b348121eacdbfcbd8c4d40f1102f32fa6af5be1ffc032ed684be/pyzmq-27.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7bbe9e1ed2c8d3da736a15694d87c12493e54cc9dc9790796f0321794bbc91f", size = 856600 }, + { url = "https://files.pythonhosted.org/packages/d4/af/1c469b3d479bd095edb28e27f12eee10b8f00b356acbefa6aeb14dd295d1/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dc1091f59143b471d19eb64f54bae4f54bcf2a466ffb66fe45d94d8d734eb495", size = 1657748 }, + { url = "https://files.pythonhosted.org/packages/8c/f4/17f965d0ee6380b1d6326da842a50e4b8b9699745161207945f3745e8cb5/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7011ade88c8e535cf140f8d1a59428676fbbce7c6e54fefce58bf117aefb6667", size = 2034311 }, + { url = "https://files.pythonhosted.org/packages/e0/6e/7c391d81fa3149fd759de45d298003de6cfab343fb03e92c099821c448db/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c386339d7e3f064213aede5d03d054b237937fbca6dd2197ac8cf3b25a6b14e", size = 1893630 }, + { url = "https://files.pythonhosted.org/packages/0e/e0/eaffe7a86f60e556399e224229e7769b717f72fec0706b70ab2c03aa04cb/pyzmq-27.0.0-cp311-cp311-win32.whl", hash = "sha256:0546a720c1f407b2172cb04b6b094a78773491497e3644863cf5c96c42df8cff", size = 567706 }, + { url = "https://files.pythonhosted.org/packages/c9/05/89354a8cffdcce6e547d48adaaf7be17007fc75572123ff4ca90a4ca04fc/pyzmq-27.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:15f39d50bd6c9091c67315ceb878a4f531957b121d2a05ebd077eb35ddc5efed", size = 630322 }, + { url = "https://files.pythonhosted.org/packages/fa/07/4ab976d5e1e63976719389cc4f3bfd248a7f5f2bb2ebe727542363c61b5f/pyzmq-27.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c5817641eebb391a2268c27fecd4162448e03538387093cdbd8bf3510c316b38", size = 558435 }, + { url = "https://files.pythonhosted.org/packages/93/a7/9ad68f55b8834ede477842214feba6a4c786d936c022a67625497aacf61d/pyzmq-27.0.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52", size = 1305438 }, + { url = "https://files.pythonhosted.org/packages/ba/ee/26aa0f98665a22bc90ebe12dced1de5f3eaca05363b717f6fb229b3421b3/pyzmq-27.0.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3", size = 895095 }, + { url = "https://files.pythonhosted.org/packages/cf/85/c57e7ab216ecd8aa4cc7e3b83b06cc4e9cf45c87b0afc095f10cd5ce87c1/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152", size = 651826 }, + { url = "https://files.pythonhosted.org/packages/69/9a/9ea7e230feda9400fb0ae0d61d7d6ddda635e718d941c44eeab22a179d34/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22", size = 839750 }, + { url = "https://files.pythonhosted.org/packages/08/66/4cebfbe71f3dfbd417011daca267539f62ed0fbc68105357b68bbb1a25b7/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371", size = 1641357 }, + { url = "https://files.pythonhosted.org/packages/ac/f6/b0f62578c08d2471c791287149cb8c2aaea414ae98c6e995c7dbe008adfb/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d", size = 2020281 }, + { url = "https://files.pythonhosted.org/packages/37/b9/4f670b15c7498495da9159edc374ec09c88a86d9cd5a47d892f69df23450/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be", size = 1877110 }, + { url = "https://files.pythonhosted.org/packages/66/31/9dee25c226295b740609f0d46db2fe972b23b6f5cf786360980524a3ba92/pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4", size = 559297 }, + { url = "https://files.pythonhosted.org/packages/9b/12/52da5509800f7ff2d287b2f2b4e636e7ea0f001181cba6964ff6c1537778/pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371", size = 619203 }, + { url = "https://files.pythonhosted.org/packages/93/6d/7f2e53b19d1edb1eb4f09ec7c3a1f945ca0aac272099eab757d15699202b/pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e", size = 551927 }, + { url = "https://files.pythonhosted.org/packages/19/62/876b27c4ff777db4ceba1c69ea90d3c825bb4f8d5e7cd987ce5802e33c55/pyzmq-27.0.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c36ad534c0c29b4afa088dc53543c525b23c0797e01b69fef59b1a9c0e38b688", size = 1340826 }, + { url = "https://files.pythonhosted.org/packages/43/69/58ef8f4f59d3bcd505260c73bee87b008850f45edca40ddaba54273c35f4/pyzmq-27.0.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:67855c14173aec36395d7777aaba3cc527b393821f30143fd20b98e1ff31fd38", size = 897283 }, + { url = "https://files.pythonhosted.org/packages/43/15/93a0d0396700a60475ad3c5d42c5f1c308d3570bc94626b86c71ef9953e0/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8617c7d43cd8ccdb62aebe984bfed77ca8f036e6c3e46dd3dddda64b10f0ab7a", size = 660567 }, + { url = "https://files.pythonhosted.org/packages/0e/b3/fe055513e498ca32f64509abae19b9c9eb4d7c829e02bd8997dd51b029eb/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67bfbcbd0a04c575e8103a6061d03e393d9f80ffdb9beb3189261e9e9bc5d5e9", size = 847681 }, + { url = "https://files.pythonhosted.org/packages/b6/4f/ff15300b00b5b602191f3df06bbc8dd4164e805fdd65bb77ffbb9c5facdc/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5cd11d46d7b7e5958121b3eaf4cd8638eff3a720ec527692132f05a57f14341d", size = 1650148 }, + { url = "https://files.pythonhosted.org/packages/c4/6f/84bdfff2a224a6f26a24249a342e5906993c50b0761e311e81b39aef52a7/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:b801c2e40c5aa6072c2f4876de8dccd100af6d9918d4d0d7aa54a1d982fd4f44", size = 2023768 }, + { url = "https://files.pythonhosted.org/packages/64/39/dc2db178c26a42228c5ac94a9cc595030458aa64c8d796a7727947afbf55/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:20d5cb29e8c5f76a127c75b6e7a77e846bc4b655c373baa098c26a61b7ecd0ef", size = 1885199 }, + { url = "https://files.pythonhosted.org/packages/c7/21/dae7b06a1f8cdee5d8e7a63d99c5d129c401acc40410bef2cbf42025e26f/pyzmq-27.0.0-cp313-cp313t-win32.whl", hash = "sha256:a20528da85c7ac7a19b7384e8c3f8fa707841fd85afc4ed56eda59d93e3d98ad", size = 575439 }, + { url = "https://files.pythonhosted.org/packages/eb/bc/1709dc55f0970cf4cb8259e435e6773f9946f41a045c2cb90e870b7072da/pyzmq-27.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f", size = 639933 }, + { url = "https://files.pythonhosted.org/packages/19/dc/95210fe17e5d7dba89bd663e1d88f50a8003f296284731b09f1d95309a42/pyzmq-27.0.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:100f6e5052ba42b2533011d34a018a5ace34f8cac67cb03cfa37c8bdae0ca617", size = 1330656 }, + { url = "https://files.pythonhosted.org/packages/d3/7e/63f742b578316258e03ecb393d35c0964348d80834bdec8a100ed7bb9c91/pyzmq-27.0.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:bf6c6b061efd00404b9750e2cfbd9507492c8d4b3721ded76cb03786131be2ed", size = 906522 }, + { url = "https://files.pythonhosted.org/packages/1f/bf/f0b2b67f5a9bfe0fbd0e978a2becd901f802306aa8e29161cb0963094352/pyzmq-27.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee05728c0b0b2484a9fc20466fa776fffb65d95f7317a3419985b8c908563861", size = 863545 }, + { url = "https://files.pythonhosted.org/packages/87/0e/7d90ccd2ef577c8bae7f926acd2011a6d960eea8a068c5fd52b419206960/pyzmq-27.0.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7cdf07fe0a557b131366f80727ec8ccc4b70d89f1e3f920d94a594d598d754f0", size = 666796 }, + { url = "https://files.pythonhosted.org/packages/4f/6d/ca8007a313baa73361778773aef210f4902e68f468d1f93b6c8b908fabbd/pyzmq-27.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:90252fa2ff3a104219db1f5ced7032a7b5fc82d7c8d2fec2b9a3e6fd4e25576b", size = 1655599 }, + { url = "https://files.pythonhosted.org/packages/46/de/5cb4f99d6c0dd8f33d729c9ebd49af279586e5ab127e93aa6ef0ecd08c4c/pyzmq-27.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ea6d441c513bf18c578c73c323acf7b4184507fc244762193aa3a871333c9045", size = 2034119 }, + { url = "https://files.pythonhosted.org/packages/d0/8d/57cc90c8b5f30a97a7e86ec91a3b9822ec7859d477e9c30f531fb78f4a97/pyzmq-27.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ae2b34bcfaae20c064948a4113bf8709eee89fd08317eb293ae4ebd69b4d9740", size = 1891955 }, + { url = "https://files.pythonhosted.org/packages/24/f5/a7012022573188903802ab75b5314b00e5c629228f3a36fadb421a42ebff/pyzmq-27.0.0-cp39-cp39-win32.whl", hash = "sha256:5b10bd6f008937705cf6e7bf8b6ece5ca055991e3eb130bca8023e20b86aa9a3", size = 568497 }, + { url = "https://files.pythonhosted.org/packages/9b/f3/2a4b2798275a574801221d94d599ed3e26d19f6378a7364cdfa3bee53944/pyzmq-27.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:00387d12a8af4b24883895f7e6b9495dc20a66027b696536edac35cb988c38f3", size = 629315 }, + { url = "https://files.pythonhosted.org/packages/da/eb/386a70314f305816142d6e8537f5557e5fd9614c03698d6c88cbd6c41190/pyzmq-27.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:4c19d39c04c29a6619adfeb19e3735c421b3bfee082f320662f52e59c47202ba", size = 559596 }, + { url = "https://files.pythonhosted.org/packages/09/6f/be6523a7f3821c0b5370912ef02822c028611360e0d206dd945bdbf9eaef/pyzmq-27.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:656c1866505a5735d0660b7da6d7147174bbf59d4975fc2b7f09f43c9bc25745", size = 835950 }, + { url = "https://files.pythonhosted.org/packages/c6/1e/a50fdd5c15018de07ab82a61bc460841be967ee7bbe7abee3b714d66f7ac/pyzmq-27.0.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:74175b9e12779382432dd1d1f5960ebe7465d36649b98a06c6b26be24d173fab", size = 799876 }, + { url = "https://files.pythonhosted.org/packages/88/a1/89eb5b71f5a504f8f887aceb8e1eb3626e00c00aa8085381cdff475440dc/pyzmq-27.0.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8c6de908465697a8708e4d6843a1e884f567962fc61eb1706856545141d0cbb", size = 567400 }, + { url = "https://files.pythonhosted.org/packages/56/aa/4571dbcff56cfb034bac73fde8294e123c975ce3eea89aff31bf6dc6382b/pyzmq-27.0.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c644aaacc01d0df5c7072826df45e67301f191c55f68d7b2916d83a9ddc1b551", size = 747031 }, + { url = "https://files.pythonhosted.org/packages/46/e0/d25f30fe0991293c5b2f5ef3b070d35fa6d57c0c7428898c3ab4913d0297/pyzmq-27.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:10f70c1d9a446a85013a36871a296007f6fe4232b530aa254baf9da3f8328bc0", size = 544726 }, + { url = "https://files.pythonhosted.org/packages/98/a6/92394373b8dbc1edc9d53c951e8d3989d518185174ee54492ec27711779d/pyzmq-27.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd1dc59763effd1576f8368047c9c31468fce0af89d76b5067641137506792ae", size = 835948 }, + { url = "https://files.pythonhosted.org/packages/56/f3/4dc38d75d9995bfc18773df3e41f2a2ca9b740b06f1a15dbf404077e7588/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:60e8cc82d968174650c1860d7b716366caab9973787a1c060cf8043130f7d0f7", size = 799874 }, + { url = "https://files.pythonhosted.org/packages/ab/ba/64af397e0f421453dc68e31d5e0784d554bf39013a2de0872056e96e58af/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14fe7aaac86e4e93ea779a821967360c781d7ac5115b3f1a171ced77065a0174", size = 567400 }, + { url = "https://files.pythonhosted.org/packages/63/87/ec956cbe98809270b59a22891d5758edae147a258e658bf3024a8254c855/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6ad0562d4e6abb785be3e4dd68599c41be821b521da38c402bc9ab2a8e7ebc7e", size = 747031 }, + { url = "https://files.pythonhosted.org/packages/be/8a/4a3764a68abc02e2fbb0668d225b6fda5cd39586dd099cee8b2ed6ab0452/pyzmq-27.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:9df43a2459cd3a3563404c1456b2c4c69564daa7dbaf15724c09821a3329ce46", size = 544726 }, + { url = "https://files.pythonhosted.org/packages/03/f6/11b2a6c8cd13275c31cddc3f89981a1b799a3c41dec55289fa18dede96b5/pyzmq-27.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:39ddd3ba0a641f01d8f13a3cfd4c4924eb58e660d8afe87e9061d6e8ca6f7ac3", size = 835944 }, + { url = "https://files.pythonhosted.org/packages/73/34/aa39076f4e07ae1912fa4b966fe24e831e01d736d4c1c7e8a3aa28a555b5/pyzmq-27.0.0-pp39-pypy39_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8ca7e6a0388dd9e1180b14728051068f4efe83e0d2de058b5ff92c63f399a73f", size = 799869 }, + { url = "https://files.pythonhosted.org/packages/65/f3/81ed6b3dd242408ee79c0d8a88734644acf208baee8666ecd7e52664cf55/pyzmq-27.0.0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2524c40891be6a3106885a3935d58452dd83eb7a5742a33cc780a1ad4c49dec0", size = 758371 }, + { url = "https://files.pythonhosted.org/packages/e1/04/dac4ca674764281caf744e8adefd88f7e325e1605aba0f9a322094b903fa/pyzmq-27.0.0-pp39-pypy39_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a56e3e5bd2d62a01744fd2f1ce21d760c7c65f030e9522738d75932a14ab62a", size = 567393 }, + { url = "https://files.pythonhosted.org/packages/51/8b/619a9ee2fa4d3c724fbadde946427735ade64da03894b071bbdc3b789d83/pyzmq-27.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:096af9e133fec3a72108ddefba1e42985cb3639e9de52cfd336b6fc23aa083e9", size = 544715 }, ] [[package]] @@ -3069,9 +3069,9 @@ dependencies = [ { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, { name = "scipy", version = "1.16.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6a/ea/73311df8eb1143d5d20d636f62a9c8b4c4cfa5cafb7ed88043f25f040997/qecsim-1.0b9.tar.gz", hash = "sha256:ca13b6c74cd801f2aefcc14baf1217086f5cef446402376eeb378aec6ce885da", size = 119474, upload-time = "2021-02-10T02:16:15.005Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/ea/73311df8eb1143d5d20d636f62a9c8b4c4cfa5cafb7ed88043f25f040997/qecsim-1.0b9.tar.gz", hash = "sha256:ca13b6c74cd801f2aefcc14baf1217086f5cef446402376eeb378aec6ce885da", size = 119474 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/e5/469fd5bfdc447ce80895fd2370b5001d5c879c4099b9f8607615c6aea831/qecsim-1.0b9-py3-none-any.whl", hash = "sha256:71a53803ae382953a792618a212e6a4dbc0e0d60de7df039e1c32118b52e445b", size = 148041, upload-time = "2021-02-10T02:16:10.787Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e5/469fd5bfdc447ce80895fd2370b5001d5c879c4099b9f8607615c6aea831/qecsim-1.0b9-py3-none-any.whl", hash = "sha256:71a53803ae382953a792618a212e6a4dbc0e0d60de7df039e1c32118b52e445b", size = 148041 }, ] [[package]] @@ -3089,15 +3089,15 @@ dependencies = [ { name = "stevedore" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/39/97/903041c27db9105f5036a579b2b7ee2a0caa21c6061fa29e0ccbd35aa19a/qiskit-2.1.1.tar.gz", hash = "sha256:148f62d314cd138a1f4da305c6293b19c73115323e77123b13a048cdcbc1fcdd", size = 3600302, upload-time = "2025-07-10T21:30:11.665Z" } +sdist = { url = "https://files.pythonhosted.org/packages/39/97/903041c27db9105f5036a579b2b7ee2a0caa21c6061fa29e0ccbd35aa19a/qiskit-2.1.1.tar.gz", hash = "sha256:148f62d314cd138a1f4da305c6293b19c73115323e77123b13a048cdcbc1fcdd", size = 3600302 } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/3a/26a99184f830be25a14ef7cbc40f19b98721ac018aa0c4db18c5dedc774c/qiskit-2.1.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:00f8fe1980a80e8e79e01352f2502cd3ca4fe89d07872bc9a244ba9cba304a7d", size = 7283884, upload-time = "2025-07-10T21:30:02.576Z" }, - { url = "https://files.pythonhosted.org/packages/60/a1/2a63ab52a5166346599df7bec2e41fd2be9876ccf01637c73603beebdcb5/qiskit-2.1.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:e00985d1b348bf8cc60b686a64a150af2043538e81a61b48400ff71064588fdd", size = 6817779, upload-time = "2025-07-10T21:30:04.513Z" }, - { url = "https://files.pythonhosted.org/packages/ba/87/1a184f6dcd614f57362d9b0be1c718ff857c1a3d69ca0f426c84adda6755/qiskit-2.1.1-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:10f546148c86fd15cdbc68270e1d3937a021bd718779dff95f912c8b7cfad7bd", size = 7437467, upload-time = "2025-07-10T21:30:06.524Z" }, - { url = "https://files.pythonhosted.org/packages/82/d7/d0fc92d20b266692db8aedc5e259a2d4cff76613ec155178f855144c7a71/qiskit-2.1.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3765cef67ccc8b3d54b86ede2266c282039da045be1b10e64660a4bbf815680", size = 7696275, upload-time = "2025-07-11T13:15:14.672Z" }, - { url = "https://files.pythonhosted.org/packages/ba/30/ba384695bc9c9cb5795ef3ab47f33eb579460dc928115918d4eb0046ae9f/qiskit-2.1.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca95a1ab710eb3e0fc65dd876734b5c6fc6df1bb78249f86913d77ed1984983f", size = 7411176, upload-time = "2025-07-11T13:15:16.62Z" }, - { url = "https://files.pythonhosted.org/packages/75/dc/551c6afe0aa087ebe53988173290904ded5bf93e56b22503d8311d421d82/qiskit-2.1.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b41c66958c2e0550bc1047524cd754dce2277bea0a1db1085c052cc5bb07ec6", size = 7458353, upload-time = "2025-07-10T21:30:08.223Z" }, - { url = "https://files.pythonhosted.org/packages/83/6c/988791f56e6ab2999e1a4c7e60831b0f02c3e29a467400bced501ce6b637/qiskit-2.1.1-cp39-abi3-win_amd64.whl", hash = "sha256:e7225798221ecf0c8a5cf2e96c37d6d9d00674a412e8c397542fe387909b80db", size = 7234838, upload-time = "2025-07-10T21:30:10.121Z" }, + { url = "https://files.pythonhosted.org/packages/76/3a/26a99184f830be25a14ef7cbc40f19b98721ac018aa0c4db18c5dedc774c/qiskit-2.1.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:00f8fe1980a80e8e79e01352f2502cd3ca4fe89d07872bc9a244ba9cba304a7d", size = 7283884 }, + { url = "https://files.pythonhosted.org/packages/60/a1/2a63ab52a5166346599df7bec2e41fd2be9876ccf01637c73603beebdcb5/qiskit-2.1.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:e00985d1b348bf8cc60b686a64a150af2043538e81a61b48400ff71064588fdd", size = 6817779 }, + { url = "https://files.pythonhosted.org/packages/ba/87/1a184f6dcd614f57362d9b0be1c718ff857c1a3d69ca0f426c84adda6755/qiskit-2.1.1-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:10f546148c86fd15cdbc68270e1d3937a021bd718779dff95f912c8b7cfad7bd", size = 7437467 }, + { url = "https://files.pythonhosted.org/packages/82/d7/d0fc92d20b266692db8aedc5e259a2d4cff76613ec155178f855144c7a71/qiskit-2.1.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3765cef67ccc8b3d54b86ede2266c282039da045be1b10e64660a4bbf815680", size = 7696275 }, + { url = "https://files.pythonhosted.org/packages/ba/30/ba384695bc9c9cb5795ef3ab47f33eb579460dc928115918d4eb0046ae9f/qiskit-2.1.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca95a1ab710eb3e0fc65dd876734b5c6fc6df1bb78249f86913d77ed1984983f", size = 7411176 }, + { url = "https://files.pythonhosted.org/packages/75/dc/551c6afe0aa087ebe53988173290904ded5bf93e56b22503d8311d421d82/qiskit-2.1.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b41c66958c2e0550bc1047524cd754dce2277bea0a1db1085c052cc5bb07ec6", size = 7458353 }, + { url = "https://files.pythonhosted.org/packages/83/6c/988791f56e6ab2999e1a4c7e60831b0f02c3e29a467400bced501ce6b637/qiskit-2.1.1-cp39-abi3-win_amd64.whl", hash = "sha256:e7225798221ecf0c8a5cf2e96c37d6d9d00674a412e8c397542fe387909b80db", size = 7234838 }, ] [package.optional-dependencies] @@ -3122,9 +3122,9 @@ dependencies = [ { name = "openqasm3", extra = ["parser"] }, { name = "qiskit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ea/e4/0229893ae295763a9273e47a7b1a8f10599ee49c2963750440d56a4b0023/qiskit_qasm3_import-0.6.0.tar.gz", hash = "sha256:6b763ee58538b33eaf5aaa8126b687f3c03f26c4d28e6a4f04f9be24a6b184ff", size = 37141, upload-time = "2025-06-10T16:34:11.287Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/e4/0229893ae295763a9273e47a7b1a8f10599ee49c2963750440d56a4b0023/qiskit_qasm3_import-0.6.0.tar.gz", hash = "sha256:6b763ee58538b33eaf5aaa8126b687f3c03f26c4d28e6a4f04f9be24a6b184ff", size = 37141 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/7e/b8bbfbf1acfe0b40872727ef4741b54794beb65da34c4c327dc31a73d35d/qiskit_qasm3_import-0.6.0-py3-none-any.whl", hash = "sha256:2109b65a6859bec4a51e7b61bd525365f298f67f19b3952bf602423c6d21d697", size = 29490, upload-time = "2025-06-10T16:34:10.035Z" }, + { url = "https://files.pythonhosted.org/packages/3e/7e/b8bbfbf1acfe0b40872727ef4741b54794beb65da34c4c327dc31a73d35d/qiskit_qasm3_import-0.6.0-py3-none-any.whl", hash = "sha256:2109b65a6859bec4a51e7b61bd525365f298f67f19b3952bf602423c6d21d697", size = 29490 }, ] [[package]] @@ -3152,9 +3152,9 @@ dependencies = [ { name = "simpleeval" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/55/c0d0a6ab89c17dfe294425ec3cd32bebf61a8d23864383fca4f5cae856f8/qsample-0.0.2.tar.gz", hash = "sha256:92be0415d3ef45b574fc57f4eb242f5a0c182a4028029c2b18cc14bb42e33102", size = 43847, upload-time = "2023-08-29T13:29:04.814Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/55/c0d0a6ab89c17dfe294425ec3cd32bebf61a8d23864383fca4f5cae856f8/qsample-0.0.2.tar.gz", hash = "sha256:92be0415d3ef45b574fc57f4eb242f5a0c182a4028029c2b18cc14bb42e33102", size = 43847 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/25/8dd8096cad59b98de59737c7ff7bfb9535d86216c5a95e403d06fc005c7e/qsample-0.0.2-py3-none-any.whl", hash = "sha256:b6a85139dec3ab69e49b18b1b2f608814415efd2d07875b278a3644a42db58d2", size = 44643, upload-time = "2023-08-29T13:29:02.972Z" }, + { url = "https://files.pythonhosted.org/packages/ae/25/8dd8096cad59b98de59737c7ff7bfb9535d86216c5a95e403d06fc005c7e/qsample-0.0.2-py3-none-any.whl", hash = "sha256:b6a85139dec3ab69e49b18b1b2f608814415efd2d07875b278a3644a42db58d2", size = 44643 }, ] [[package]] @@ -3166,9 +3166,9 @@ dependencies = [ { name = "rpds-py" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775 }, ] [[package]] @@ -3181,169 +3181,169 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" }, + { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847 }, ] [[package]] name = "roman-numerals-py" version = "3.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/76/48fd56d17c5bdbdf65609abbc67288728a98ed4c02919428d4f52d23b24b/roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d", size = 9017, upload-time = "2025-02-22T07:34:54.333Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/76/48fd56d17c5bdbdf65609abbc67288728a98ed4c02919428d4f52d23b24b/roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d", size = 9017 } wheels = [ - { url = "https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", size = 7742, upload-time = "2025-02-22T07:34:52.422Z" }, + { url = "https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", size = 7742 }, ] [[package]] name = "rpds-py" version = "0.26.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385, upload-time = "2025-07-01T15:57:13.958Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/31/1459645f036c3dfeacef89e8e5825e430c77dde8489f3b99eaafcd4a60f5/rpds_py-0.26.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4c70c70f9169692b36307a95f3d8c0a9fcd79f7b4a383aad5eaa0e9718b79b37", size = 372466, upload-time = "2025-07-01T15:53:40.55Z" }, - { url = "https://files.pythonhosted.org/packages/dd/ff/3d0727f35836cc8773d3eeb9a46c40cc405854e36a8d2e951f3a8391c976/rpds_py-0.26.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:777c62479d12395bfb932944e61e915741e364c843afc3196b694db3d669fcd0", size = 357825, upload-time = "2025-07-01T15:53:42.247Z" }, - { url = "https://files.pythonhosted.org/packages/bf/ce/badc5e06120a54099ae287fa96d82cbb650a5f85cf247ffe19c7b157fd1f/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec671691e72dff75817386aa02d81e708b5a7ec0dec6669ec05213ff6b77e1bd", size = 381530, upload-time = "2025-07-01T15:53:43.585Z" }, - { url = "https://files.pythonhosted.org/packages/1e/a5/fa5d96a66c95d06c62d7a30707b6a4cfec696ab8ae280ee7be14e961e118/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a1cb5d6ce81379401bbb7f6dbe3d56de537fb8235979843f0d53bc2e9815a79", size = 396933, upload-time = "2025-07-01T15:53:45.78Z" }, - { url = "https://files.pythonhosted.org/packages/00/a7/7049d66750f18605c591a9db47d4a059e112a0c9ff8de8daf8fa0f446bba/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f789e32fa1fb6a7bf890e0124e7b42d1e60d28ebff57fe806719abb75f0e9a3", size = 513973, upload-time = "2025-07-01T15:53:47.085Z" }, - { url = "https://files.pythonhosted.org/packages/0e/f1/528d02c7d6b29d29fac8fd784b354d3571cc2153f33f842599ef0cf20dd2/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c55b0a669976cf258afd718de3d9ad1b7d1fe0a91cd1ab36f38b03d4d4aeaaf", size = 402293, upload-time = "2025-07-01T15:53:48.117Z" }, - { url = "https://files.pythonhosted.org/packages/15/93/fde36cd6e4685df2cd08508f6c45a841e82f5bb98c8d5ecf05649522acb5/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c70d9ec912802ecfd6cd390dadb34a9578b04f9bcb8e863d0a7598ba5e9e7ccc", size = 383787, upload-time = "2025-07-01T15:53:50.874Z" }, - { url = "https://files.pythonhosted.org/packages/69/f2/5007553aaba1dcae5d663143683c3dfd03d9395289f495f0aebc93e90f24/rpds_py-0.26.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3021933c2cb7def39d927b9862292e0f4c75a13d7de70eb0ab06efed4c508c19", size = 416312, upload-time = "2025-07-01T15:53:52.046Z" }, - { url = "https://files.pythonhosted.org/packages/8f/a7/ce52c75c1e624a79e48a69e611f1c08844564e44c85db2b6f711d76d10ce/rpds_py-0.26.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8a7898b6ca3b7d6659e55cdac825a2e58c638cbf335cde41f4619e290dd0ad11", size = 558403, upload-time = "2025-07-01T15:53:53.192Z" }, - { url = "https://files.pythonhosted.org/packages/79/d5/e119db99341cc75b538bf4cb80504129fa22ce216672fb2c28e4a101f4d9/rpds_py-0.26.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:12bff2ad9447188377f1b2794772f91fe68bb4bbfa5a39d7941fbebdbf8c500f", size = 588323, upload-time = "2025-07-01T15:53:54.336Z" }, - { url = "https://files.pythonhosted.org/packages/93/94/d28272a0b02f5fe24c78c20e13bbcb95f03dc1451b68e7830ca040c60bd6/rpds_py-0.26.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:191aa858f7d4902e975d4cf2f2d9243816c91e9605070aeb09c0a800d187e323", size = 554541, upload-time = "2025-07-01T15:53:55.469Z" }, - { url = "https://files.pythonhosted.org/packages/93/e0/8c41166602f1b791da892d976057eba30685486d2e2c061ce234679c922b/rpds_py-0.26.0-cp310-cp310-win32.whl", hash = "sha256:b37a04d9f52cb76b6b78f35109b513f6519efb481d8ca4c321f6a3b9580b3f45", size = 220442, upload-time = "2025-07-01T15:53:56.524Z" }, - { url = "https://files.pythonhosted.org/packages/87/f0/509736bb752a7ab50fb0270c2a4134d671a7b3038030837e5536c3de0e0b/rpds_py-0.26.0-cp310-cp310-win_amd64.whl", hash = "sha256:38721d4c9edd3eb6670437d8d5e2070063f305bfa2d5aa4278c51cedcd508a84", size = 231314, upload-time = "2025-07-01T15:53:57.842Z" }, - { url = "https://files.pythonhosted.org/packages/09/4c/4ee8f7e512030ff79fda1df3243c88d70fc874634e2dbe5df13ba4210078/rpds_py-0.26.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9e8cb77286025bdb21be2941d64ac6ca016130bfdcd228739e8ab137eb4406ed", size = 372610, upload-time = "2025-07-01T15:53:58.844Z" }, - { url = "https://files.pythonhosted.org/packages/fa/9d/3dc16be00f14fc1f03c71b1d67c8df98263ab2710a2fbd65a6193214a527/rpds_py-0.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e09330b21d98adc8ccb2dbb9fc6cb434e8908d4c119aeaa772cb1caab5440a0", size = 358032, upload-time = "2025-07-01T15:53:59.985Z" }, - { url = "https://files.pythonhosted.org/packages/e7/5a/7f1bf8f045da2866324a08ae80af63e64e7bfaf83bd31f865a7b91a58601/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9c1b92b774b2e68d11193dc39620d62fd8ab33f0a3c77ecdabe19c179cdbc1", size = 381525, upload-time = "2025-07-01T15:54:01.162Z" }, - { url = "https://files.pythonhosted.org/packages/45/8a/04479398c755a066ace10e3d158866beb600867cacae194c50ffa783abd0/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:824e6d3503ab990d7090768e4dfd9e840837bae057f212ff9f4f05ec6d1975e7", size = 397089, upload-time = "2025-07-01T15:54:02.319Z" }, - { url = "https://files.pythonhosted.org/packages/72/88/9203f47268db488a1b6d469d69c12201ede776bb728b9d9f29dbfd7df406/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ad7fd2258228bf288f2331f0a6148ad0186b2e3643055ed0db30990e59817a6", size = 514255, upload-time = "2025-07-01T15:54:03.38Z" }, - { url = "https://files.pythonhosted.org/packages/f5/b4/01ce5d1e853ddf81fbbd4311ab1eff0b3cf162d559288d10fd127e2588b5/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dc23bbb3e06ec1ea72d515fb572c1fea59695aefbffb106501138762e1e915e", size = 402283, upload-time = "2025-07-01T15:54:04.923Z" }, - { url = "https://files.pythonhosted.org/packages/34/a2/004c99936997bfc644d590a9defd9e9c93f8286568f9c16cdaf3e14429a7/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d80bf832ac7b1920ee29a426cdca335f96a2b5caa839811803e999b41ba9030d", size = 383881, upload-time = "2025-07-01T15:54:06.482Z" }, - { url = "https://files.pythonhosted.org/packages/05/1b/ef5fba4a8f81ce04c427bfd96223f92f05e6cd72291ce9d7523db3b03a6c/rpds_py-0.26.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0919f38f5542c0a87e7b4afcafab6fd2c15386632d249e9a087498571250abe3", size = 415822, upload-time = "2025-07-01T15:54:07.605Z" }, - { url = "https://files.pythonhosted.org/packages/16/80/5c54195aec456b292f7bd8aa61741c8232964063fd8a75fdde9c1e982328/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d422b945683e409000c888e384546dbab9009bb92f7c0b456e217988cf316107", size = 558347, upload-time = "2025-07-01T15:54:08.591Z" }, - { url = "https://files.pythonhosted.org/packages/f2/1c/1845c1b1fd6d827187c43afe1841d91678d7241cbdb5420a4c6de180a538/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a7711fa562ba2da1aa757e11024ad6d93bad6ad7ede5afb9af144623e5f76a", size = 587956, upload-time = "2025-07-01T15:54:09.963Z" }, - { url = "https://files.pythonhosted.org/packages/2e/ff/9e979329dd131aa73a438c077252ddabd7df6d1a7ad7b9aacf6261f10faa/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238e8c8610cb7c29460e37184f6799547f7e09e6a9bdbdab4e8edb90986a2318", size = 554363, upload-time = "2025-07-01T15:54:11.073Z" }, - { url = "https://files.pythonhosted.org/packages/00/8b/d78cfe034b71ffbe72873a136e71acc7a831a03e37771cfe59f33f6de8a2/rpds_py-0.26.0-cp311-cp311-win32.whl", hash = "sha256:893b022bfbdf26d7bedb083efeea624e8550ca6eb98bf7fea30211ce95b9201a", size = 220123, upload-time = "2025-07-01T15:54:12.382Z" }, - { url = "https://files.pythonhosted.org/packages/94/c1/3c8c94c7dd3905dbfde768381ce98778500a80db9924731d87ddcdb117e9/rpds_py-0.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:87a5531de9f71aceb8af041d72fc4cab4943648d91875ed56d2e629bef6d4c03", size = 231732, upload-time = "2025-07-01T15:54:13.434Z" }, - { url = "https://files.pythonhosted.org/packages/67/93/e936fbed1b734eabf36ccb5d93c6a2e9246fbb13c1da011624b7286fae3e/rpds_py-0.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:de2713f48c1ad57f89ac25b3cb7daed2156d8e822cf0eca9b96a6f990718cc41", size = 221917, upload-time = "2025-07-01T15:54:14.559Z" }, - { url = "https://files.pythonhosted.org/packages/ea/86/90eb87c6f87085868bd077c7a9938006eb1ce19ed4d06944a90d3560fce2/rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d", size = 363933, upload-time = "2025-07-01T15:54:15.734Z" }, - { url = "https://files.pythonhosted.org/packages/63/78/4469f24d34636242c924626082b9586f064ada0b5dbb1e9d096ee7a8e0c6/rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136", size = 350447, upload-time = "2025-07-01T15:54:16.922Z" }, - { url = "https://files.pythonhosted.org/packages/ad/91/c448ed45efdfdade82348d5e7995e15612754826ea640afc20915119734f/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582", size = 384711, upload-time = "2025-07-01T15:54:18.101Z" }, - { url = "https://files.pythonhosted.org/packages/ec/43/e5c86fef4be7f49828bdd4ecc8931f0287b1152c0bb0163049b3218740e7/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e", size = 400865, upload-time = "2025-07-01T15:54:19.295Z" }, - { url = "https://files.pythonhosted.org/packages/55/34/e00f726a4d44f22d5c5fe2e5ddd3ac3d7fd3f74a175607781fbdd06fe375/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15", size = 517763, upload-time = "2025-07-01T15:54:20.858Z" }, - { url = "https://files.pythonhosted.org/packages/52/1c/52dc20c31b147af724b16104500fba13e60123ea0334beba7b40e33354b4/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8", size = 406651, upload-time = "2025-07-01T15:54:22.508Z" }, - { url = "https://files.pythonhosted.org/packages/2e/77/87d7bfabfc4e821caa35481a2ff6ae0b73e6a391bb6b343db2c91c2b9844/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a", size = 386079, upload-time = "2025-07-01T15:54:23.987Z" }, - { url = "https://files.pythonhosted.org/packages/e3/d4/7f2200c2d3ee145b65b3cddc4310d51f7da6a26634f3ac87125fd789152a/rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323", size = 421379, upload-time = "2025-07-01T15:54:25.073Z" }, - { url = "https://files.pythonhosted.org/packages/ae/13/9fdd428b9c820869924ab62236b8688b122baa22d23efdd1c566938a39ba/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158", size = 562033, upload-time = "2025-07-01T15:54:26.225Z" }, - { url = "https://files.pythonhosted.org/packages/f3/e1/b69686c3bcbe775abac3a4c1c30a164a2076d28df7926041f6c0eb5e8d28/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3", size = 591639, upload-time = "2025-07-01T15:54:27.424Z" }, - { url = "https://files.pythonhosted.org/packages/5c/c9/1e3d8c8863c84a90197ac577bbc3d796a92502124c27092413426f670990/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2", size = 557105, upload-time = "2025-07-01T15:54:29.93Z" }, - { url = "https://files.pythonhosted.org/packages/9f/c5/90c569649057622959f6dcc40f7b516539608a414dfd54b8d77e3b201ac0/rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44", size = 223272, upload-time = "2025-07-01T15:54:31.128Z" }, - { url = "https://files.pythonhosted.org/packages/7d/16/19f5d9f2a556cfed454eebe4d354c38d51c20f3db69e7b4ce6cff904905d/rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c", size = 234995, upload-time = "2025-07-01T15:54:32.195Z" }, - { url = "https://files.pythonhosted.org/packages/83/f0/7935e40b529c0e752dfaa7880224771b51175fce08b41ab4a92eb2fbdc7f/rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8", size = 223198, upload-time = "2025-07-01T15:54:33.271Z" }, - { url = "https://files.pythonhosted.org/packages/6a/67/bb62d0109493b12b1c6ab00de7a5566aa84c0e44217c2d94bee1bd370da9/rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d", size = 363917, upload-time = "2025-07-01T15:54:34.755Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f3/34e6ae1925a5706c0f002a8d2d7f172373b855768149796af87bd65dcdb9/rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1", size = 350073, upload-time = "2025-07-01T15:54:36.292Z" }, - { url = "https://files.pythonhosted.org/packages/75/83/1953a9d4f4e4de7fd0533733e041c28135f3c21485faaef56a8aadbd96b5/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e", size = 384214, upload-time = "2025-07-01T15:54:37.469Z" }, - { url = "https://files.pythonhosted.org/packages/48/0e/983ed1b792b3322ea1d065e67f4b230f3b96025f5ce3878cc40af09b7533/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1", size = 400113, upload-time = "2025-07-01T15:54:38.954Z" }, - { url = "https://files.pythonhosted.org/packages/69/7f/36c0925fff6f660a80be259c5b4f5e53a16851f946eb080351d057698528/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9", size = 515189, upload-time = "2025-07-01T15:54:40.57Z" }, - { url = "https://files.pythonhosted.org/packages/13/45/cbf07fc03ba7a9b54662c9badb58294ecfb24f828b9732970bd1a431ed5c/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7", size = 406998, upload-time = "2025-07-01T15:54:43.025Z" }, - { url = "https://files.pythonhosted.org/packages/6c/b0/8fa5e36e58657997873fd6a1cf621285ca822ca75b4b3434ead047daa307/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04", size = 385903, upload-time = "2025-07-01T15:54:44.752Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f7/b25437772f9f57d7a9fbd73ed86d0dcd76b4c7c6998348c070d90f23e315/rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1", size = 419785, upload-time = "2025-07-01T15:54:46.043Z" }, - { url = "https://files.pythonhosted.org/packages/a7/6b/63ffa55743dfcb4baf2e9e77a0b11f7f97ed96a54558fcb5717a4b2cd732/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9", size = 561329, upload-time = "2025-07-01T15:54:47.64Z" }, - { url = "https://files.pythonhosted.org/packages/2f/07/1f4f5e2886c480a2346b1e6759c00278b8a69e697ae952d82ae2e6ee5db0/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9", size = 590875, upload-time = "2025-07-01T15:54:48.9Z" }, - { url = "https://files.pythonhosted.org/packages/cc/bc/e6639f1b91c3a55f8c41b47d73e6307051b6e246254a827ede730624c0f8/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba", size = 556636, upload-time = "2025-07-01T15:54:50.619Z" }, - { url = "https://files.pythonhosted.org/packages/05/4c/b3917c45566f9f9a209d38d9b54a1833f2bb1032a3e04c66f75726f28876/rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b", size = 222663, upload-time = "2025-07-01T15:54:52.023Z" }, - { url = "https://files.pythonhosted.org/packages/e0/0b/0851bdd6025775aaa2365bb8de0697ee2558184c800bfef8d7aef5ccde58/rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5", size = 234428, upload-time = "2025-07-01T15:54:53.692Z" }, - { url = "https://files.pythonhosted.org/packages/ed/e8/a47c64ed53149c75fb581e14a237b7b7cd18217e969c30d474d335105622/rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256", size = 222571, upload-time = "2025-07-01T15:54:54.822Z" }, - { url = "https://files.pythonhosted.org/packages/89/bf/3d970ba2e2bcd17d2912cb42874107390f72873e38e79267224110de5e61/rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618", size = 360475, upload-time = "2025-07-01T15:54:56.228Z" }, - { url = "https://files.pythonhosted.org/packages/82/9f/283e7e2979fc4ec2d8ecee506d5a3675fce5ed9b4b7cb387ea5d37c2f18d/rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35", size = 346692, upload-time = "2025-07-01T15:54:58.561Z" }, - { url = "https://files.pythonhosted.org/packages/e3/03/7e50423c04d78daf391da3cc4330bdb97042fc192a58b186f2d5deb7befd/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f", size = 379415, upload-time = "2025-07-01T15:54:59.751Z" }, - { url = "https://files.pythonhosted.org/packages/57/00/d11ee60d4d3b16808432417951c63df803afb0e0fc672b5e8d07e9edaaae/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83", size = 391783, upload-time = "2025-07-01T15:55:00.898Z" }, - { url = "https://files.pythonhosted.org/packages/08/b3/1069c394d9c0d6d23c5b522e1f6546b65793a22950f6e0210adcc6f97c3e/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1", size = 512844, upload-time = "2025-07-01T15:55:02.201Z" }, - { url = "https://files.pythonhosted.org/packages/08/3b/c4fbf0926800ed70b2c245ceca99c49f066456755f5d6eb8863c2c51e6d0/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8", size = 402105, upload-time = "2025-07-01T15:55:03.698Z" }, - { url = "https://files.pythonhosted.org/packages/1c/b0/db69b52ca07413e568dae9dc674627a22297abb144c4d6022c6d78f1e5cc/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f", size = 383440, upload-time = "2025-07-01T15:55:05.398Z" }, - { url = "https://files.pythonhosted.org/packages/4c/e1/c65255ad5b63903e56b3bb3ff9dcc3f4f5c3badde5d08c741ee03903e951/rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed", size = 412759, upload-time = "2025-07-01T15:55:08.316Z" }, - { url = "https://files.pythonhosted.org/packages/e4/22/bb731077872377a93c6e93b8a9487d0406c70208985831034ccdeed39c8e/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632", size = 556032, upload-time = "2025-07-01T15:55:09.52Z" }, - { url = "https://files.pythonhosted.org/packages/e0/8b/393322ce7bac5c4530fb96fc79cc9ea2f83e968ff5f6e873f905c493e1c4/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c", size = 585416, upload-time = "2025-07-01T15:55:11.216Z" }, - { url = "https://files.pythonhosted.org/packages/49/ae/769dc372211835bf759319a7aae70525c6eb523e3371842c65b7ef41c9c6/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0", size = 554049, upload-time = "2025-07-01T15:55:13.004Z" }, - { url = "https://files.pythonhosted.org/packages/6b/f9/4c43f9cc203d6ba44ce3146246cdc38619d92c7bd7bad4946a3491bd5b70/rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9", size = 218428, upload-time = "2025-07-01T15:55:14.486Z" }, - { url = "https://files.pythonhosted.org/packages/7e/8b/9286b7e822036a4a977f2f1e851c7345c20528dbd56b687bb67ed68a8ede/rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9", size = 231524, upload-time = "2025-07-01T15:55:15.745Z" }, - { url = "https://files.pythonhosted.org/packages/55/07/029b7c45db910c74e182de626dfdae0ad489a949d84a468465cd0ca36355/rpds_py-0.26.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:da619979df60a940cd434084355c514c25cf8eb4cf9a508510682f6c851a4f7a", size = 364292, upload-time = "2025-07-01T15:55:17.001Z" }, - { url = "https://files.pythonhosted.org/packages/13/d1/9b3d3f986216b4d1f584878dca15ce4797aaf5d372d738974ba737bf68d6/rpds_py-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea89a2458a1a75f87caabefe789c87539ea4e43b40f18cff526052e35bbb4fdf", size = 350334, upload-time = "2025-07-01T15:55:18.922Z" }, - { url = "https://files.pythonhosted.org/packages/18/98/16d5e7bc9ec715fa9668731d0cf97f6b032724e61696e2db3d47aeb89214/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feac1045b3327a45944e7dcbeb57530339f6b17baff154df51ef8b0da34c8c12", size = 384875, upload-time = "2025-07-01T15:55:20.399Z" }, - { url = "https://files.pythonhosted.org/packages/f9/13/aa5e2b1ec5ab0e86a5c464d53514c0467bec6ba2507027d35fc81818358e/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b818a592bd69bfe437ee8368603d4a2d928c34cffcdf77c2e761a759ffd17d20", size = 399993, upload-time = "2025-07-01T15:55:21.729Z" }, - { url = "https://files.pythonhosted.org/packages/17/03/8021810b0e97923abdbab6474c8b77c69bcb4b2c58330777df9ff69dc559/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a8b0dd8648709b62d9372fc00a57466f5fdeefed666afe3fea5a6c9539a0331", size = 516683, upload-time = "2025-07-01T15:55:22.918Z" }, - { url = "https://files.pythonhosted.org/packages/dc/b1/da8e61c87c2f3d836954239fdbbfb477bb7b54d74974d8f6fcb34342d166/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d3498ad0df07d81112aa6ec6c95a7e7b1ae00929fb73e7ebee0f3faaeabad2f", size = 408825, upload-time = "2025-07-01T15:55:24.207Z" }, - { url = "https://files.pythonhosted.org/packages/38/bc/1fc173edaaa0e52c94b02a655db20697cb5fa954ad5a8e15a2c784c5cbdd/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4146ccb15be237fdef10f331c568e1b0e505f8c8c9ed5d67759dac58ac246", size = 387292, upload-time = "2025-07-01T15:55:25.554Z" }, - { url = "https://files.pythonhosted.org/packages/7c/eb/3a9bb4bd90867d21916f253caf4f0d0be7098671b6715ad1cead9fe7bab9/rpds_py-0.26.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9a63785467b2d73635957d32a4f6e73d5e4df497a16a6392fa066b753e87387", size = 420435, upload-time = "2025-07-01T15:55:27.798Z" }, - { url = "https://files.pythonhosted.org/packages/cd/16/e066dcdb56f5632713445271a3f8d3d0b426d51ae9c0cca387799df58b02/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de4ed93a8c91debfd5a047be327b7cc8b0cc6afe32a716bbbc4aedca9e2a83af", size = 562410, upload-time = "2025-07-01T15:55:29.057Z" }, - { url = "https://files.pythonhosted.org/packages/60/22/ddbdec7eb82a0dc2e455be44c97c71c232983e21349836ce9f272e8a3c29/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:caf51943715b12af827696ec395bfa68f090a4c1a1d2509eb4e2cb69abbbdb33", size = 590724, upload-time = "2025-07-01T15:55:30.719Z" }, - { url = "https://files.pythonhosted.org/packages/2c/b4/95744085e65b7187d83f2fcb0bef70716a1ea0a9e5d8f7f39a86e5d83424/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4a59e5bc386de021f56337f757301b337d7ab58baa40174fb150accd480bc953", size = 558285, upload-time = "2025-07-01T15:55:31.981Z" }, - { url = "https://files.pythonhosted.org/packages/37/37/6309a75e464d1da2559446f9c811aa4d16343cebe3dbb73701e63f760caa/rpds_py-0.26.0-cp314-cp314-win32.whl", hash = "sha256:92c8db839367ef16a662478f0a2fe13e15f2227da3c1430a782ad0f6ee009ec9", size = 223459, upload-time = "2025-07-01T15:55:33.312Z" }, - { url = "https://files.pythonhosted.org/packages/d9/6f/8e9c11214c46098b1d1391b7e02b70bb689ab963db3b19540cba17315291/rpds_py-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:b0afb8cdd034150d4d9f53926226ed27ad15b7f465e93d7468caaf5eafae0d37", size = 236083, upload-time = "2025-07-01T15:55:34.933Z" }, - { url = "https://files.pythonhosted.org/packages/47/af/9c4638994dd623d51c39892edd9d08e8be8220a4b7e874fa02c2d6e91955/rpds_py-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:ca3f059f4ba485d90c8dc75cb5ca897e15325e4e609812ce57f896607c1c0867", size = 223291, upload-time = "2025-07-01T15:55:36.202Z" }, - { url = "https://files.pythonhosted.org/packages/4d/db/669a241144460474aab03e254326b32c42def83eb23458a10d163cb9b5ce/rpds_py-0.26.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5afea17ab3a126006dc2f293b14ffc7ef3c85336cf451564a0515ed7648033da", size = 361445, upload-time = "2025-07-01T15:55:37.483Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2d/133f61cc5807c6c2fd086a46df0eb8f63a23f5df8306ff9f6d0fd168fecc/rpds_py-0.26.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:69f0c0a3df7fd3a7eec50a00396104bb9a843ea6d45fcc31c2d5243446ffd7a7", size = 347206, upload-time = "2025-07-01T15:55:38.828Z" }, - { url = "https://files.pythonhosted.org/packages/05/bf/0e8fb4c05f70273469eecf82f6ccf37248558526a45321644826555db31b/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:801a71f70f9813e82d2513c9a96532551fce1e278ec0c64610992c49c04c2dad", size = 380330, upload-time = "2025-07-01T15:55:40.175Z" }, - { url = "https://files.pythonhosted.org/packages/d4/a8/060d24185d8b24d3923322f8d0ede16df4ade226a74e747b8c7c978e3dd3/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df52098cde6d5e02fa75c1f6244f07971773adb4a26625edd5c18fee906fa84d", size = 392254, upload-time = "2025-07-01T15:55:42.015Z" }, - { url = "https://files.pythonhosted.org/packages/b9/7b/7c2e8a9ee3e6bc0bae26bf29f5219955ca2fbb761dca996a83f5d2f773fe/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bc596b30f86dc6f0929499c9e574601679d0341a0108c25b9b358a042f51bca", size = 516094, upload-time = "2025-07-01T15:55:43.603Z" }, - { url = "https://files.pythonhosted.org/packages/75/d6/f61cafbed8ba1499b9af9f1777a2a199cd888f74a96133d8833ce5eaa9c5/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dfbe56b299cf5875b68eb6f0ebaadc9cac520a1989cac0db0765abfb3709c19", size = 402889, upload-time = "2025-07-01T15:55:45.275Z" }, - { url = "https://files.pythonhosted.org/packages/92/19/c8ac0a8a8df2dd30cdec27f69298a5c13e9029500d6d76718130f5e5be10/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac64f4b2bdb4ea622175c9ab7cf09444e412e22c0e02e906978b3b488af5fde8", size = 384301, upload-time = "2025-07-01T15:55:47.098Z" }, - { url = "https://files.pythonhosted.org/packages/41/e1/6b1859898bc292a9ce5776016c7312b672da00e25cec74d7beced1027286/rpds_py-0.26.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ef9b6bbf9845a264f9aa45c31836e9f3c1f13be565d0d010e964c661d1e2b", size = 412891, upload-time = "2025-07-01T15:55:48.412Z" }, - { url = "https://files.pythonhosted.org/packages/ef/b9/ceb39af29913c07966a61367b3c08b4f71fad841e32c6b59a129d5974698/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:49028aa684c144ea502a8e847d23aed5e4c2ef7cadfa7d5eaafcb40864844b7a", size = 557044, upload-time = "2025-07-01T15:55:49.816Z" }, - { url = "https://files.pythonhosted.org/packages/2f/27/35637b98380731a521f8ec4f3fd94e477964f04f6b2f8f7af8a2d889a4af/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e5d524d68a474a9688336045bbf76cb0def88549c1b2ad9dbfec1fb7cfbe9170", size = 585774, upload-time = "2025-07-01T15:55:51.192Z" }, - { url = "https://files.pythonhosted.org/packages/52/d9/3f0f105420fecd18551b678c9a6ce60bd23986098b252a56d35781b3e7e9/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1851f429b822831bd2edcbe0cfd12ee9ea77868f8d3daf267b189371671c80e", size = 554886, upload-time = "2025-07-01T15:55:52.541Z" }, - { url = "https://files.pythonhosted.org/packages/6b/c5/347c056a90dc8dd9bc240a08c527315008e1b5042e7a4cf4ac027be9d38a/rpds_py-0.26.0-cp314-cp314t-win32.whl", hash = "sha256:7bdb17009696214c3b66bb3590c6d62e14ac5935e53e929bcdbc5a495987a84f", size = 219027, upload-time = "2025-07-01T15:55:53.874Z" }, - { url = "https://files.pythonhosted.org/packages/75/04/5302cea1aa26d886d34cadbf2dc77d90d7737e576c0065f357b96dc7a1a6/rpds_py-0.26.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f14440b9573a6f76b4ee4770c13f0b5921f71dde3b6fcb8dabbefd13b7fe05d7", size = 232821, upload-time = "2025-07-01T15:55:55.167Z" }, - { url = "https://files.pythonhosted.org/packages/fb/74/846ab687119c9d31fc21ab1346ef9233c31035ce53c0e2d43a130a0c5a5e/rpds_py-0.26.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:7a48af25d9b3c15684059d0d1fc0bc30e8eee5ca521030e2bffddcab5be40226", size = 372786, upload-time = "2025-07-01T15:55:56.512Z" }, - { url = "https://files.pythonhosted.org/packages/33/02/1f9e465cb1a6032d02b17cd117c7bd9fb6156bc5b40ffeb8053d8a2aa89c/rpds_py-0.26.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0c71c2f6bf36e61ee5c47b2b9b5d47e4d1baad6426bfed9eea3e858fc6ee8806", size = 358062, upload-time = "2025-07-01T15:55:58.084Z" }, - { url = "https://files.pythonhosted.org/packages/2a/49/81a38e3c67ac943907a9711882da3d87758c82cf26b2120b8128e45d80df/rpds_py-0.26.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d815d48b1804ed7867b539236b6dd62997850ca1c91cad187f2ddb1b7bbef19", size = 381576, upload-time = "2025-07-01T15:55:59.422Z" }, - { url = "https://files.pythonhosted.org/packages/14/37/418f030a76ef59f41e55f9dc916af8afafa3c9e3be38df744b2014851474/rpds_py-0.26.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84cfbd4d4d2cdeb2be61a057a258d26b22877266dd905809e94172dff01a42ae", size = 397062, upload-time = "2025-07-01T15:56:00.868Z" }, - { url = "https://files.pythonhosted.org/packages/47/e3/9090817a8f4388bfe58e28136e9682fa7872a06daff2b8a2f8c78786a6e1/rpds_py-0.26.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fbaa70553ca116c77717f513e08815aec458e6b69a028d4028d403b3bc84ff37", size = 516277, upload-time = "2025-07-01T15:56:02.672Z" }, - { url = "https://files.pythonhosted.org/packages/3f/3a/1ec3dd93250fb8023f27d49b3f92e13f679141f2e59a61563f88922c2821/rpds_py-0.26.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39bfea47c375f379d8e87ab4bb9eb2c836e4f2069f0f65731d85e55d74666387", size = 402604, upload-time = "2025-07-01T15:56:04.453Z" }, - { url = "https://files.pythonhosted.org/packages/f2/98/9133c06e42ec3ce637936263c50ac647f879b40a35cfad2f5d4ad418a439/rpds_py-0.26.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1533b7eb683fb5f38c1d68a3c78f5fdd8f1412fa6b9bf03b40f450785a0ab915", size = 383664, upload-time = "2025-07-01T15:56:05.823Z" }, - { url = "https://files.pythonhosted.org/packages/a9/10/a59ce64099cc77c81adb51f06909ac0159c19a3e2c9d9613bab171f4730f/rpds_py-0.26.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c5ab0ee51f560d179b057555b4f601b7df909ed31312d301b99f8b9fc6028284", size = 415944, upload-time = "2025-07-01T15:56:07.132Z" }, - { url = "https://files.pythonhosted.org/packages/c3/f1/ae0c60b3be9df9d5bef3527d83b8eb4b939e3619f6dd8382840e220a27df/rpds_py-0.26.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e5162afc9e0d1f9cae3b577d9c29ddbab3505ab39012cb794d94a005825bde21", size = 558311, upload-time = "2025-07-01T15:56:08.484Z" }, - { url = "https://files.pythonhosted.org/packages/fb/2b/bf1498ebb3ddc5eff2fe3439da88963d1fc6e73d1277fa7ca0c72620d167/rpds_py-0.26.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:43f10b007033f359bc3fa9cd5e6c1e76723f056ffa9a6b5c117cc35720a80292", size = 587928, upload-time = "2025-07-01T15:56:09.946Z" }, - { url = "https://files.pythonhosted.org/packages/b6/eb/e6b949edf7af5629848c06d6e544a36c9f2781e2d8d03b906de61ada04d0/rpds_py-0.26.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e3730a48e5622e598293eee0762b09cff34dd3f271530f47b0894891281f051d", size = 554554, upload-time = "2025-07-01T15:56:11.775Z" }, - { url = "https://files.pythonhosted.org/packages/0a/1c/aa0298372ea898620d4706ad26b5b9e975550a4dd30bd042b0fe9ae72cce/rpds_py-0.26.0-cp39-cp39-win32.whl", hash = "sha256:4b1f66eb81eab2e0ff5775a3a312e5e2e16bf758f7b06be82fb0d04078c7ac51", size = 220273, upload-time = "2025-07-01T15:56:13.273Z" }, - { url = "https://files.pythonhosted.org/packages/b8/b0/8b3bef6ad0b35c172d1c87e2e5c2bb027d99e2a7bc7a16f744e66cf318f3/rpds_py-0.26.0-cp39-cp39-win_amd64.whl", hash = "sha256:519067e29f67b5c90e64fb1a6b6e9d2ec0ba28705c51956637bac23a2f4ddae1", size = 231627, upload-time = "2025-07-01T15:56:14.853Z" }, - { url = "https://files.pythonhosted.org/packages/ef/9a/1f033b0b31253d03d785b0cd905bc127e555ab496ea6b4c7c2e1f951f2fd/rpds_py-0.26.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3c0909c5234543ada2515c05dc08595b08d621ba919629e94427e8e03539c958", size = 373226, upload-time = "2025-07-01T15:56:16.578Z" }, - { url = "https://files.pythonhosted.org/packages/58/29/5f88023fd6aaaa8ca3c4a6357ebb23f6f07da6079093ccf27c99efce87db/rpds_py-0.26.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c1fb0cda2abcc0ac62f64e2ea4b4e64c57dfd6b885e693095460c61bde7bb18e", size = 359230, upload-time = "2025-07-01T15:56:17.978Z" }, - { url = "https://files.pythonhosted.org/packages/6c/6c/13eaebd28b439da6964dde22712b52e53fe2824af0223b8e403249d10405/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84d142d2d6cf9b31c12aa4878d82ed3b2324226270b89b676ac62ccd7df52d08", size = 382363, upload-time = "2025-07-01T15:56:19.977Z" }, - { url = "https://files.pythonhosted.org/packages/55/fc/3bb9c486b06da19448646f96147796de23c5811ef77cbfc26f17307b6a9d/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a547e21c5610b7e9093d870be50682a6a6cf180d6da0f42c47c306073bfdbbf6", size = 397146, upload-time = "2025-07-01T15:56:21.39Z" }, - { url = "https://files.pythonhosted.org/packages/15/18/9d1b79eb4d18e64ba8bba9e7dec6f9d6920b639f22f07ee9368ca35d4673/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35e9a70a0f335371275cdcd08bc5b8051ac494dd58bff3bbfb421038220dc871", size = 514804, upload-time = "2025-07-01T15:56:22.78Z" }, - { url = "https://files.pythonhosted.org/packages/4f/5a/175ad7191bdbcd28785204621b225ad70e85cdfd1e09cc414cb554633b21/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dfa6115c6def37905344d56fb54c03afc49104e2ca473d5dedec0f6606913b4", size = 402820, upload-time = "2025-07-01T15:56:24.584Z" }, - { url = "https://files.pythonhosted.org/packages/11/45/6a67ecf6d61c4d4aff4bc056e864eec4b2447787e11d1c2c9a0242c6e92a/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:313cfcd6af1a55a286a3c9a25f64af6d0e46cf60bc5798f1db152d97a216ff6f", size = 384567, upload-time = "2025-07-01T15:56:26.064Z" }, - { url = "https://files.pythonhosted.org/packages/a1/ba/16589da828732b46454c61858950a78fe4c931ea4bf95f17432ffe64b241/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f7bf2496fa563c046d05e4d232d7b7fd61346e2402052064b773e5c378bf6f73", size = 416520, upload-time = "2025-07-01T15:56:27.608Z" }, - { url = "https://files.pythonhosted.org/packages/81/4b/00092999fc7c0c266045e984d56b7314734cc400a6c6dc4d61a35f135a9d/rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:aa81873e2c8c5aa616ab8e017a481a96742fdf9313c40f14338ca7dbf50cb55f", size = 559362, upload-time = "2025-07-01T15:56:29.078Z" }, - { url = "https://files.pythonhosted.org/packages/96/0c/43737053cde1f93ac4945157f7be1428724ab943e2132a0d235a7e161d4e/rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:68ffcf982715f5b5b7686bdd349ff75d422e8f22551000c24b30eaa1b7f7ae84", size = 588113, upload-time = "2025-07-01T15:56:30.485Z" }, - { url = "https://files.pythonhosted.org/packages/46/46/8e38f6161466e60a997ed7e9951ae5de131dedc3cf778ad35994b4af823d/rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6188de70e190847bb6db3dc3981cbadff87d27d6fe9b4f0e18726d55795cee9b", size = 555429, upload-time = "2025-07-01T15:56:31.956Z" }, - { url = "https://files.pythonhosted.org/packages/2c/ac/65da605e9f1dd643ebe615d5bbd11b6efa1d69644fc4bf623ea5ae385a82/rpds_py-0.26.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1c962145c7473723df9722ba4c058de12eb5ebedcb4e27e7d902920aa3831ee8", size = 231950, upload-time = "2025-07-01T15:56:33.337Z" }, - { url = "https://files.pythonhosted.org/packages/51/f2/b5c85b758a00c513bb0389f8fc8e61eb5423050c91c958cdd21843faa3e6/rpds_py-0.26.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f61a9326f80ca59214d1cceb0a09bb2ece5b2563d4e0cd37bfd5515c28510674", size = 373505, upload-time = "2025-07-01T15:56:34.716Z" }, - { url = "https://files.pythonhosted.org/packages/23/e0/25db45e391251118e915e541995bb5f5ac5691a3b98fb233020ba53afc9b/rpds_py-0.26.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:183f857a53bcf4b1b42ef0f57ca553ab56bdd170e49d8091e96c51c3d69ca696", size = 359468, upload-time = "2025-07-01T15:56:36.219Z" }, - { url = "https://files.pythonhosted.org/packages/0b/73/dd5ee6075bb6491be3a646b301dfd814f9486d924137a5098e61f0487e16/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:941c1cfdf4799d623cf3aa1d326a6b4fdb7a5799ee2687f3516738216d2262fb", size = 382680, upload-time = "2025-07-01T15:56:37.644Z" }, - { url = "https://files.pythonhosted.org/packages/2f/10/84b522ff58763a5c443f5bcedc1820240e454ce4e620e88520f04589e2ea/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72a8d9564a717ee291f554eeb4bfeafe2309d5ec0aa6c475170bdab0f9ee8e88", size = 397035, upload-time = "2025-07-01T15:56:39.241Z" }, - { url = "https://files.pythonhosted.org/packages/06/ea/8667604229a10a520fcbf78b30ccc278977dcc0627beb7ea2c96b3becef0/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:511d15193cbe013619dd05414c35a7dedf2088fcee93c6bbb7c77859765bd4e8", size = 514922, upload-time = "2025-07-01T15:56:40.645Z" }, - { url = "https://files.pythonhosted.org/packages/24/e6/9ed5b625c0661c4882fc8cdf302bf8e96c73c40de99c31e0b95ed37d508c/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aea1f9741b603a8d8fedb0ed5502c2bc0accbc51f43e2ad1337fe7259c2b77a5", size = 402822, upload-time = "2025-07-01T15:56:42.137Z" }, - { url = "https://files.pythonhosted.org/packages/8a/58/212c7b6fd51946047fb45d3733da27e2fa8f7384a13457c874186af691b1/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4019a9d473c708cf2f16415688ef0b4639e07abaa569d72f74745bbeffafa2c7", size = 384336, upload-time = "2025-07-01T15:56:44.239Z" }, - { url = "https://files.pythonhosted.org/packages/aa/f5/a40ba78748ae8ebf4934d4b88e77b98497378bc2c24ba55ebe87a4e87057/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:093d63b4b0f52d98ebae33b8c50900d3d67e0666094b1be7a12fffd7f65de74b", size = 416871, upload-time = "2025-07-01T15:56:46.284Z" }, - { url = "https://files.pythonhosted.org/packages/d5/a6/33b1fc0c9f7dcfcfc4a4353daa6308b3ece22496ceece348b3e7a7559a09/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2abe21d8ba64cded53a2a677e149ceb76dcf44284202d737178afe7ba540c1eb", size = 559439, upload-time = "2025-07-01T15:56:48.549Z" }, - { url = "https://files.pythonhosted.org/packages/71/2d/ceb3f9c12f8cfa56d34995097f6cd99da1325642c60d1b6680dd9df03ed8/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:4feb7511c29f8442cbbc28149a92093d32e815a28aa2c50d333826ad2a20fdf0", size = 588380, upload-time = "2025-07-01T15:56:50.086Z" }, - { url = "https://files.pythonhosted.org/packages/c8/ed/9de62c2150ca8e2e5858acf3f4f4d0d180a38feef9fdab4078bea63d8dba/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e99685fc95d386da368013e7fb4269dd39c30d99f812a8372d62f244f662709c", size = 555334, upload-time = "2025-07-01T15:56:51.703Z" }, - { url = "https://files.pythonhosted.org/packages/7e/78/a08e2f28e91c7e45db1150813c6d760a0fb114d5652b1373897073369e0d/rpds_py-0.26.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a90a13408a7a856b87be8a9f008fff53c5080eea4e4180f6c2e546e4a972fb5d", size = 373157, upload-time = "2025-07-01T15:56:53.291Z" }, - { url = "https://files.pythonhosted.org/packages/52/01/ddf51517497c8224fb0287e9842b820ed93748bc28ea74cab56a71e3dba4/rpds_py-0.26.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ac51b65e8dc76cf4949419c54c5528adb24fc721df722fd452e5fbc236f5c40", size = 358827, upload-time = "2025-07-01T15:56:54.963Z" }, - { url = "https://files.pythonhosted.org/packages/4d/f4/acaefa44b83705a4fcadd68054280127c07cdb236a44a1c08b7c5adad40b/rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59b2093224a18c6508d95cfdeba8db9cbfd6f3494e94793b58972933fcee4c6d", size = 382182, upload-time = "2025-07-01T15:56:56.474Z" }, - { url = "https://files.pythonhosted.org/packages/e9/a2/d72ac03d37d33f6ff4713ca4c704da0c3b1b3a959f0bf5eb738c0ad94ea2/rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4f01a5d6444a3258b00dc07b6ea4733e26f8072b788bef750baa37b370266137", size = 397123, upload-time = "2025-07-01T15:56:58.272Z" }, - { url = "https://files.pythonhosted.org/packages/74/58/c053e9d1da1d3724434dd7a5f506623913e6404d396ff3cf636a910c0789/rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b6e2c12160c72aeda9d1283e612f68804621f448145a210f1bf1d79151c47090", size = 516285, upload-time = "2025-07-01T15:57:00.283Z" }, - { url = "https://files.pythonhosted.org/packages/94/41/c81e97ee88b38b6d1847c75f2274dee8d67cb8d5ed7ca8c6b80442dead75/rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cb28c1f569f8d33b2b5dcd05d0e6ef7005d8639c54c2f0be824f05aedf715255", size = 402182, upload-time = "2025-07-01T15:57:02.587Z" }, - { url = "https://files.pythonhosted.org/packages/74/74/38a176b34ce5197b4223e295f36350dd90713db13cf3c3b533e8e8f7484e/rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1766b5724c3f779317d5321664a343c07773c8c5fd1532e4039e6cc7d1a815be", size = 384436, upload-time = "2025-07-01T15:57:04.125Z" }, - { url = "https://files.pythonhosted.org/packages/e4/21/f40b9a5709d7078372c87fd11335469dc4405245528b60007cd4078ed57a/rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b6d9e5a2ed9c4988c8f9b28b3bc0e3e5b1aaa10c28d210a594ff3a8c02742daf", size = 417039, upload-time = "2025-07-01T15:57:05.608Z" }, - { url = "https://files.pythonhosted.org/packages/02/ee/ed835925731c7e87306faa80a3a5e17b4d0f532083155e7e00fe1cd4e242/rpds_py-0.26.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:b5f7a446ddaf6ca0fad9a5535b56fbfc29998bf0e0b450d174bbec0d600e1d72", size = 559111, upload-time = "2025-07-01T15:57:07.371Z" }, - { url = "https://files.pythonhosted.org/packages/ce/88/d6e9e686b8ffb6139b82eb1c319ef32ae99aeb21f7e4bf45bba44a760d09/rpds_py-0.26.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:eed5ac260dd545fbc20da5f4f15e7efe36a55e0e7cf706e4ec005b491a9546a0", size = 588609, upload-time = "2025-07-01T15:57:09.319Z" }, - { url = "https://files.pythonhosted.org/packages/e5/96/09bcab08fa12a69672716b7f86c672ee7f79c5319f1890c5a79dcb8e0df2/rpds_py-0.26.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:582462833ba7cee52e968b0341b85e392ae53d44c0f9af6a5927c80e539a8b67", size = 555212, upload-time = "2025-07-01T15:57:10.905Z" }, - { url = "https://files.pythonhosted.org/packages/2c/07/c554b6ed0064b6e0350a622714298e930b3cf5a3d445a2e25c412268abcf/rpds_py-0.26.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:69a607203441e07e9a8a529cff1d5b73f6a160f22db1097211e6212a68567d11", size = 232048, upload-time = "2025-07-01T15:57:12.473Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/31/1459645f036c3dfeacef89e8e5825e430c77dde8489f3b99eaafcd4a60f5/rpds_py-0.26.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4c70c70f9169692b36307a95f3d8c0a9fcd79f7b4a383aad5eaa0e9718b79b37", size = 372466 }, + { url = "https://files.pythonhosted.org/packages/dd/ff/3d0727f35836cc8773d3eeb9a46c40cc405854e36a8d2e951f3a8391c976/rpds_py-0.26.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:777c62479d12395bfb932944e61e915741e364c843afc3196b694db3d669fcd0", size = 357825 }, + { url = "https://files.pythonhosted.org/packages/bf/ce/badc5e06120a54099ae287fa96d82cbb650a5f85cf247ffe19c7b157fd1f/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec671691e72dff75817386aa02d81e708b5a7ec0dec6669ec05213ff6b77e1bd", size = 381530 }, + { url = "https://files.pythonhosted.org/packages/1e/a5/fa5d96a66c95d06c62d7a30707b6a4cfec696ab8ae280ee7be14e961e118/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a1cb5d6ce81379401bbb7f6dbe3d56de537fb8235979843f0d53bc2e9815a79", size = 396933 }, + { url = "https://files.pythonhosted.org/packages/00/a7/7049d66750f18605c591a9db47d4a059e112a0c9ff8de8daf8fa0f446bba/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f789e32fa1fb6a7bf890e0124e7b42d1e60d28ebff57fe806719abb75f0e9a3", size = 513973 }, + { url = "https://files.pythonhosted.org/packages/0e/f1/528d02c7d6b29d29fac8fd784b354d3571cc2153f33f842599ef0cf20dd2/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c55b0a669976cf258afd718de3d9ad1b7d1fe0a91cd1ab36f38b03d4d4aeaaf", size = 402293 }, + { url = "https://files.pythonhosted.org/packages/15/93/fde36cd6e4685df2cd08508f6c45a841e82f5bb98c8d5ecf05649522acb5/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c70d9ec912802ecfd6cd390dadb34a9578b04f9bcb8e863d0a7598ba5e9e7ccc", size = 383787 }, + { url = "https://files.pythonhosted.org/packages/69/f2/5007553aaba1dcae5d663143683c3dfd03d9395289f495f0aebc93e90f24/rpds_py-0.26.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3021933c2cb7def39d927b9862292e0f4c75a13d7de70eb0ab06efed4c508c19", size = 416312 }, + { url = "https://files.pythonhosted.org/packages/8f/a7/ce52c75c1e624a79e48a69e611f1c08844564e44c85db2b6f711d76d10ce/rpds_py-0.26.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8a7898b6ca3b7d6659e55cdac825a2e58c638cbf335cde41f4619e290dd0ad11", size = 558403 }, + { url = "https://files.pythonhosted.org/packages/79/d5/e119db99341cc75b538bf4cb80504129fa22ce216672fb2c28e4a101f4d9/rpds_py-0.26.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:12bff2ad9447188377f1b2794772f91fe68bb4bbfa5a39d7941fbebdbf8c500f", size = 588323 }, + { url = "https://files.pythonhosted.org/packages/93/94/d28272a0b02f5fe24c78c20e13bbcb95f03dc1451b68e7830ca040c60bd6/rpds_py-0.26.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:191aa858f7d4902e975d4cf2f2d9243816c91e9605070aeb09c0a800d187e323", size = 554541 }, + { url = "https://files.pythonhosted.org/packages/93/e0/8c41166602f1b791da892d976057eba30685486d2e2c061ce234679c922b/rpds_py-0.26.0-cp310-cp310-win32.whl", hash = "sha256:b37a04d9f52cb76b6b78f35109b513f6519efb481d8ca4c321f6a3b9580b3f45", size = 220442 }, + { url = "https://files.pythonhosted.org/packages/87/f0/509736bb752a7ab50fb0270c2a4134d671a7b3038030837e5536c3de0e0b/rpds_py-0.26.0-cp310-cp310-win_amd64.whl", hash = "sha256:38721d4c9edd3eb6670437d8d5e2070063f305bfa2d5aa4278c51cedcd508a84", size = 231314 }, + { url = "https://files.pythonhosted.org/packages/09/4c/4ee8f7e512030ff79fda1df3243c88d70fc874634e2dbe5df13ba4210078/rpds_py-0.26.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9e8cb77286025bdb21be2941d64ac6ca016130bfdcd228739e8ab137eb4406ed", size = 372610 }, + { url = "https://files.pythonhosted.org/packages/fa/9d/3dc16be00f14fc1f03c71b1d67c8df98263ab2710a2fbd65a6193214a527/rpds_py-0.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e09330b21d98adc8ccb2dbb9fc6cb434e8908d4c119aeaa772cb1caab5440a0", size = 358032 }, + { url = "https://files.pythonhosted.org/packages/e7/5a/7f1bf8f045da2866324a08ae80af63e64e7bfaf83bd31f865a7b91a58601/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9c1b92b774b2e68d11193dc39620d62fd8ab33f0a3c77ecdabe19c179cdbc1", size = 381525 }, + { url = "https://files.pythonhosted.org/packages/45/8a/04479398c755a066ace10e3d158866beb600867cacae194c50ffa783abd0/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:824e6d3503ab990d7090768e4dfd9e840837bae057f212ff9f4f05ec6d1975e7", size = 397089 }, + { url = "https://files.pythonhosted.org/packages/72/88/9203f47268db488a1b6d469d69c12201ede776bb728b9d9f29dbfd7df406/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ad7fd2258228bf288f2331f0a6148ad0186b2e3643055ed0db30990e59817a6", size = 514255 }, + { url = "https://files.pythonhosted.org/packages/f5/b4/01ce5d1e853ddf81fbbd4311ab1eff0b3cf162d559288d10fd127e2588b5/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dc23bbb3e06ec1ea72d515fb572c1fea59695aefbffb106501138762e1e915e", size = 402283 }, + { url = "https://files.pythonhosted.org/packages/34/a2/004c99936997bfc644d590a9defd9e9c93f8286568f9c16cdaf3e14429a7/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d80bf832ac7b1920ee29a426cdca335f96a2b5caa839811803e999b41ba9030d", size = 383881 }, + { url = "https://files.pythonhosted.org/packages/05/1b/ef5fba4a8f81ce04c427bfd96223f92f05e6cd72291ce9d7523db3b03a6c/rpds_py-0.26.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0919f38f5542c0a87e7b4afcafab6fd2c15386632d249e9a087498571250abe3", size = 415822 }, + { url = "https://files.pythonhosted.org/packages/16/80/5c54195aec456b292f7bd8aa61741c8232964063fd8a75fdde9c1e982328/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d422b945683e409000c888e384546dbab9009bb92f7c0b456e217988cf316107", size = 558347 }, + { url = "https://files.pythonhosted.org/packages/f2/1c/1845c1b1fd6d827187c43afe1841d91678d7241cbdb5420a4c6de180a538/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a7711fa562ba2da1aa757e11024ad6d93bad6ad7ede5afb9af144623e5f76a", size = 587956 }, + { url = "https://files.pythonhosted.org/packages/2e/ff/9e979329dd131aa73a438c077252ddabd7df6d1a7ad7b9aacf6261f10faa/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238e8c8610cb7c29460e37184f6799547f7e09e6a9bdbdab4e8edb90986a2318", size = 554363 }, + { url = "https://files.pythonhosted.org/packages/00/8b/d78cfe034b71ffbe72873a136e71acc7a831a03e37771cfe59f33f6de8a2/rpds_py-0.26.0-cp311-cp311-win32.whl", hash = "sha256:893b022bfbdf26d7bedb083efeea624e8550ca6eb98bf7fea30211ce95b9201a", size = 220123 }, + { url = "https://files.pythonhosted.org/packages/94/c1/3c8c94c7dd3905dbfde768381ce98778500a80db9924731d87ddcdb117e9/rpds_py-0.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:87a5531de9f71aceb8af041d72fc4cab4943648d91875ed56d2e629bef6d4c03", size = 231732 }, + { url = "https://files.pythonhosted.org/packages/67/93/e936fbed1b734eabf36ccb5d93c6a2e9246fbb13c1da011624b7286fae3e/rpds_py-0.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:de2713f48c1ad57f89ac25b3cb7daed2156d8e822cf0eca9b96a6f990718cc41", size = 221917 }, + { url = "https://files.pythonhosted.org/packages/ea/86/90eb87c6f87085868bd077c7a9938006eb1ce19ed4d06944a90d3560fce2/rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d", size = 363933 }, + { url = "https://files.pythonhosted.org/packages/63/78/4469f24d34636242c924626082b9586f064ada0b5dbb1e9d096ee7a8e0c6/rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136", size = 350447 }, + { url = "https://files.pythonhosted.org/packages/ad/91/c448ed45efdfdade82348d5e7995e15612754826ea640afc20915119734f/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582", size = 384711 }, + { url = "https://files.pythonhosted.org/packages/ec/43/e5c86fef4be7f49828bdd4ecc8931f0287b1152c0bb0163049b3218740e7/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e", size = 400865 }, + { url = "https://files.pythonhosted.org/packages/55/34/e00f726a4d44f22d5c5fe2e5ddd3ac3d7fd3f74a175607781fbdd06fe375/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15", size = 517763 }, + { url = "https://files.pythonhosted.org/packages/52/1c/52dc20c31b147af724b16104500fba13e60123ea0334beba7b40e33354b4/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8", size = 406651 }, + { url = "https://files.pythonhosted.org/packages/2e/77/87d7bfabfc4e821caa35481a2ff6ae0b73e6a391bb6b343db2c91c2b9844/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a", size = 386079 }, + { url = "https://files.pythonhosted.org/packages/e3/d4/7f2200c2d3ee145b65b3cddc4310d51f7da6a26634f3ac87125fd789152a/rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323", size = 421379 }, + { url = "https://files.pythonhosted.org/packages/ae/13/9fdd428b9c820869924ab62236b8688b122baa22d23efdd1c566938a39ba/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158", size = 562033 }, + { url = "https://files.pythonhosted.org/packages/f3/e1/b69686c3bcbe775abac3a4c1c30a164a2076d28df7926041f6c0eb5e8d28/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3", size = 591639 }, + { url = "https://files.pythonhosted.org/packages/5c/c9/1e3d8c8863c84a90197ac577bbc3d796a92502124c27092413426f670990/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2", size = 557105 }, + { url = "https://files.pythonhosted.org/packages/9f/c5/90c569649057622959f6dcc40f7b516539608a414dfd54b8d77e3b201ac0/rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44", size = 223272 }, + { url = "https://files.pythonhosted.org/packages/7d/16/19f5d9f2a556cfed454eebe4d354c38d51c20f3db69e7b4ce6cff904905d/rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c", size = 234995 }, + { url = "https://files.pythonhosted.org/packages/83/f0/7935e40b529c0e752dfaa7880224771b51175fce08b41ab4a92eb2fbdc7f/rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8", size = 223198 }, + { url = "https://files.pythonhosted.org/packages/6a/67/bb62d0109493b12b1c6ab00de7a5566aa84c0e44217c2d94bee1bd370da9/rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d", size = 363917 }, + { url = "https://files.pythonhosted.org/packages/4b/f3/34e6ae1925a5706c0f002a8d2d7f172373b855768149796af87bd65dcdb9/rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1", size = 350073 }, + { url = "https://files.pythonhosted.org/packages/75/83/1953a9d4f4e4de7fd0533733e041c28135f3c21485faaef56a8aadbd96b5/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e", size = 384214 }, + { url = "https://files.pythonhosted.org/packages/48/0e/983ed1b792b3322ea1d065e67f4b230f3b96025f5ce3878cc40af09b7533/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1", size = 400113 }, + { url = "https://files.pythonhosted.org/packages/69/7f/36c0925fff6f660a80be259c5b4f5e53a16851f946eb080351d057698528/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9", size = 515189 }, + { url = "https://files.pythonhosted.org/packages/13/45/cbf07fc03ba7a9b54662c9badb58294ecfb24f828b9732970bd1a431ed5c/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7", size = 406998 }, + { url = "https://files.pythonhosted.org/packages/6c/b0/8fa5e36e58657997873fd6a1cf621285ca822ca75b4b3434ead047daa307/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04", size = 385903 }, + { url = "https://files.pythonhosted.org/packages/4b/f7/b25437772f9f57d7a9fbd73ed86d0dcd76b4c7c6998348c070d90f23e315/rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1", size = 419785 }, + { url = "https://files.pythonhosted.org/packages/a7/6b/63ffa55743dfcb4baf2e9e77a0b11f7f97ed96a54558fcb5717a4b2cd732/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9", size = 561329 }, + { url = "https://files.pythonhosted.org/packages/2f/07/1f4f5e2886c480a2346b1e6759c00278b8a69e697ae952d82ae2e6ee5db0/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9", size = 590875 }, + { url = "https://files.pythonhosted.org/packages/cc/bc/e6639f1b91c3a55f8c41b47d73e6307051b6e246254a827ede730624c0f8/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba", size = 556636 }, + { url = "https://files.pythonhosted.org/packages/05/4c/b3917c45566f9f9a209d38d9b54a1833f2bb1032a3e04c66f75726f28876/rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b", size = 222663 }, + { url = "https://files.pythonhosted.org/packages/e0/0b/0851bdd6025775aaa2365bb8de0697ee2558184c800bfef8d7aef5ccde58/rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5", size = 234428 }, + { url = "https://files.pythonhosted.org/packages/ed/e8/a47c64ed53149c75fb581e14a237b7b7cd18217e969c30d474d335105622/rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256", size = 222571 }, + { url = "https://files.pythonhosted.org/packages/89/bf/3d970ba2e2bcd17d2912cb42874107390f72873e38e79267224110de5e61/rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618", size = 360475 }, + { url = "https://files.pythonhosted.org/packages/82/9f/283e7e2979fc4ec2d8ecee506d5a3675fce5ed9b4b7cb387ea5d37c2f18d/rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35", size = 346692 }, + { url = "https://files.pythonhosted.org/packages/e3/03/7e50423c04d78daf391da3cc4330bdb97042fc192a58b186f2d5deb7befd/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f", size = 379415 }, + { url = "https://files.pythonhosted.org/packages/57/00/d11ee60d4d3b16808432417951c63df803afb0e0fc672b5e8d07e9edaaae/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83", size = 391783 }, + { url = "https://files.pythonhosted.org/packages/08/b3/1069c394d9c0d6d23c5b522e1f6546b65793a22950f6e0210adcc6f97c3e/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1", size = 512844 }, + { url = "https://files.pythonhosted.org/packages/08/3b/c4fbf0926800ed70b2c245ceca99c49f066456755f5d6eb8863c2c51e6d0/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8", size = 402105 }, + { url = "https://files.pythonhosted.org/packages/1c/b0/db69b52ca07413e568dae9dc674627a22297abb144c4d6022c6d78f1e5cc/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f", size = 383440 }, + { url = "https://files.pythonhosted.org/packages/4c/e1/c65255ad5b63903e56b3bb3ff9dcc3f4f5c3badde5d08c741ee03903e951/rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed", size = 412759 }, + { url = "https://files.pythonhosted.org/packages/e4/22/bb731077872377a93c6e93b8a9487d0406c70208985831034ccdeed39c8e/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632", size = 556032 }, + { url = "https://files.pythonhosted.org/packages/e0/8b/393322ce7bac5c4530fb96fc79cc9ea2f83e968ff5f6e873f905c493e1c4/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c", size = 585416 }, + { url = "https://files.pythonhosted.org/packages/49/ae/769dc372211835bf759319a7aae70525c6eb523e3371842c65b7ef41c9c6/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0", size = 554049 }, + { url = "https://files.pythonhosted.org/packages/6b/f9/4c43f9cc203d6ba44ce3146246cdc38619d92c7bd7bad4946a3491bd5b70/rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9", size = 218428 }, + { url = "https://files.pythonhosted.org/packages/7e/8b/9286b7e822036a4a977f2f1e851c7345c20528dbd56b687bb67ed68a8ede/rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9", size = 231524 }, + { url = "https://files.pythonhosted.org/packages/55/07/029b7c45db910c74e182de626dfdae0ad489a949d84a468465cd0ca36355/rpds_py-0.26.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:da619979df60a940cd434084355c514c25cf8eb4cf9a508510682f6c851a4f7a", size = 364292 }, + { url = "https://files.pythonhosted.org/packages/13/d1/9b3d3f986216b4d1f584878dca15ce4797aaf5d372d738974ba737bf68d6/rpds_py-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea89a2458a1a75f87caabefe789c87539ea4e43b40f18cff526052e35bbb4fdf", size = 350334 }, + { url = "https://files.pythonhosted.org/packages/18/98/16d5e7bc9ec715fa9668731d0cf97f6b032724e61696e2db3d47aeb89214/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feac1045b3327a45944e7dcbeb57530339f6b17baff154df51ef8b0da34c8c12", size = 384875 }, + { url = "https://files.pythonhosted.org/packages/f9/13/aa5e2b1ec5ab0e86a5c464d53514c0467bec6ba2507027d35fc81818358e/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b818a592bd69bfe437ee8368603d4a2d928c34cffcdf77c2e761a759ffd17d20", size = 399993 }, + { url = "https://files.pythonhosted.org/packages/17/03/8021810b0e97923abdbab6474c8b77c69bcb4b2c58330777df9ff69dc559/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a8b0dd8648709b62d9372fc00a57466f5fdeefed666afe3fea5a6c9539a0331", size = 516683 }, + { url = "https://files.pythonhosted.org/packages/dc/b1/da8e61c87c2f3d836954239fdbbfb477bb7b54d74974d8f6fcb34342d166/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d3498ad0df07d81112aa6ec6c95a7e7b1ae00929fb73e7ebee0f3faaeabad2f", size = 408825 }, + { url = "https://files.pythonhosted.org/packages/38/bc/1fc173edaaa0e52c94b02a655db20697cb5fa954ad5a8e15a2c784c5cbdd/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4146ccb15be237fdef10f331c568e1b0e505f8c8c9ed5d67759dac58ac246", size = 387292 }, + { url = "https://files.pythonhosted.org/packages/7c/eb/3a9bb4bd90867d21916f253caf4f0d0be7098671b6715ad1cead9fe7bab9/rpds_py-0.26.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9a63785467b2d73635957d32a4f6e73d5e4df497a16a6392fa066b753e87387", size = 420435 }, + { url = "https://files.pythonhosted.org/packages/cd/16/e066dcdb56f5632713445271a3f8d3d0b426d51ae9c0cca387799df58b02/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de4ed93a8c91debfd5a047be327b7cc8b0cc6afe32a716bbbc4aedca9e2a83af", size = 562410 }, + { url = "https://files.pythonhosted.org/packages/60/22/ddbdec7eb82a0dc2e455be44c97c71c232983e21349836ce9f272e8a3c29/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:caf51943715b12af827696ec395bfa68f090a4c1a1d2509eb4e2cb69abbbdb33", size = 590724 }, + { url = "https://files.pythonhosted.org/packages/2c/b4/95744085e65b7187d83f2fcb0bef70716a1ea0a9e5d8f7f39a86e5d83424/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4a59e5bc386de021f56337f757301b337d7ab58baa40174fb150accd480bc953", size = 558285 }, + { url = "https://files.pythonhosted.org/packages/37/37/6309a75e464d1da2559446f9c811aa4d16343cebe3dbb73701e63f760caa/rpds_py-0.26.0-cp314-cp314-win32.whl", hash = "sha256:92c8db839367ef16a662478f0a2fe13e15f2227da3c1430a782ad0f6ee009ec9", size = 223459 }, + { url = "https://files.pythonhosted.org/packages/d9/6f/8e9c11214c46098b1d1391b7e02b70bb689ab963db3b19540cba17315291/rpds_py-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:b0afb8cdd034150d4d9f53926226ed27ad15b7f465e93d7468caaf5eafae0d37", size = 236083 }, + { url = "https://files.pythonhosted.org/packages/47/af/9c4638994dd623d51c39892edd9d08e8be8220a4b7e874fa02c2d6e91955/rpds_py-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:ca3f059f4ba485d90c8dc75cb5ca897e15325e4e609812ce57f896607c1c0867", size = 223291 }, + { url = "https://files.pythonhosted.org/packages/4d/db/669a241144460474aab03e254326b32c42def83eb23458a10d163cb9b5ce/rpds_py-0.26.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5afea17ab3a126006dc2f293b14ffc7ef3c85336cf451564a0515ed7648033da", size = 361445 }, + { url = "https://files.pythonhosted.org/packages/3b/2d/133f61cc5807c6c2fd086a46df0eb8f63a23f5df8306ff9f6d0fd168fecc/rpds_py-0.26.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:69f0c0a3df7fd3a7eec50a00396104bb9a843ea6d45fcc31c2d5243446ffd7a7", size = 347206 }, + { url = "https://files.pythonhosted.org/packages/05/bf/0e8fb4c05f70273469eecf82f6ccf37248558526a45321644826555db31b/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:801a71f70f9813e82d2513c9a96532551fce1e278ec0c64610992c49c04c2dad", size = 380330 }, + { url = "https://files.pythonhosted.org/packages/d4/a8/060d24185d8b24d3923322f8d0ede16df4ade226a74e747b8c7c978e3dd3/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df52098cde6d5e02fa75c1f6244f07971773adb4a26625edd5c18fee906fa84d", size = 392254 }, + { url = "https://files.pythonhosted.org/packages/b9/7b/7c2e8a9ee3e6bc0bae26bf29f5219955ca2fbb761dca996a83f5d2f773fe/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bc596b30f86dc6f0929499c9e574601679d0341a0108c25b9b358a042f51bca", size = 516094 }, + { url = "https://files.pythonhosted.org/packages/75/d6/f61cafbed8ba1499b9af9f1777a2a199cd888f74a96133d8833ce5eaa9c5/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dfbe56b299cf5875b68eb6f0ebaadc9cac520a1989cac0db0765abfb3709c19", size = 402889 }, + { url = "https://files.pythonhosted.org/packages/92/19/c8ac0a8a8df2dd30cdec27f69298a5c13e9029500d6d76718130f5e5be10/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac64f4b2bdb4ea622175c9ab7cf09444e412e22c0e02e906978b3b488af5fde8", size = 384301 }, + { url = "https://files.pythonhosted.org/packages/41/e1/6b1859898bc292a9ce5776016c7312b672da00e25cec74d7beced1027286/rpds_py-0.26.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ef9b6bbf9845a264f9aa45c31836e9f3c1f13be565d0d010e964c661d1e2b", size = 412891 }, + { url = "https://files.pythonhosted.org/packages/ef/b9/ceb39af29913c07966a61367b3c08b4f71fad841e32c6b59a129d5974698/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:49028aa684c144ea502a8e847d23aed5e4c2ef7cadfa7d5eaafcb40864844b7a", size = 557044 }, + { url = "https://files.pythonhosted.org/packages/2f/27/35637b98380731a521f8ec4f3fd94e477964f04f6b2f8f7af8a2d889a4af/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e5d524d68a474a9688336045bbf76cb0def88549c1b2ad9dbfec1fb7cfbe9170", size = 585774 }, + { url = "https://files.pythonhosted.org/packages/52/d9/3f0f105420fecd18551b678c9a6ce60bd23986098b252a56d35781b3e7e9/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1851f429b822831bd2edcbe0cfd12ee9ea77868f8d3daf267b189371671c80e", size = 554886 }, + { url = "https://files.pythonhosted.org/packages/6b/c5/347c056a90dc8dd9bc240a08c527315008e1b5042e7a4cf4ac027be9d38a/rpds_py-0.26.0-cp314-cp314t-win32.whl", hash = "sha256:7bdb17009696214c3b66bb3590c6d62e14ac5935e53e929bcdbc5a495987a84f", size = 219027 }, + { url = "https://files.pythonhosted.org/packages/75/04/5302cea1aa26d886d34cadbf2dc77d90d7737e576c0065f357b96dc7a1a6/rpds_py-0.26.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f14440b9573a6f76b4ee4770c13f0b5921f71dde3b6fcb8dabbefd13b7fe05d7", size = 232821 }, + { url = "https://files.pythonhosted.org/packages/fb/74/846ab687119c9d31fc21ab1346ef9233c31035ce53c0e2d43a130a0c5a5e/rpds_py-0.26.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:7a48af25d9b3c15684059d0d1fc0bc30e8eee5ca521030e2bffddcab5be40226", size = 372786 }, + { url = "https://files.pythonhosted.org/packages/33/02/1f9e465cb1a6032d02b17cd117c7bd9fb6156bc5b40ffeb8053d8a2aa89c/rpds_py-0.26.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0c71c2f6bf36e61ee5c47b2b9b5d47e4d1baad6426bfed9eea3e858fc6ee8806", size = 358062 }, + { url = "https://files.pythonhosted.org/packages/2a/49/81a38e3c67ac943907a9711882da3d87758c82cf26b2120b8128e45d80df/rpds_py-0.26.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d815d48b1804ed7867b539236b6dd62997850ca1c91cad187f2ddb1b7bbef19", size = 381576 }, + { url = "https://files.pythonhosted.org/packages/14/37/418f030a76ef59f41e55f9dc916af8afafa3c9e3be38df744b2014851474/rpds_py-0.26.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84cfbd4d4d2cdeb2be61a057a258d26b22877266dd905809e94172dff01a42ae", size = 397062 }, + { url = "https://files.pythonhosted.org/packages/47/e3/9090817a8f4388bfe58e28136e9682fa7872a06daff2b8a2f8c78786a6e1/rpds_py-0.26.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fbaa70553ca116c77717f513e08815aec458e6b69a028d4028d403b3bc84ff37", size = 516277 }, + { url = "https://files.pythonhosted.org/packages/3f/3a/1ec3dd93250fb8023f27d49b3f92e13f679141f2e59a61563f88922c2821/rpds_py-0.26.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39bfea47c375f379d8e87ab4bb9eb2c836e4f2069f0f65731d85e55d74666387", size = 402604 }, + { url = "https://files.pythonhosted.org/packages/f2/98/9133c06e42ec3ce637936263c50ac647f879b40a35cfad2f5d4ad418a439/rpds_py-0.26.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1533b7eb683fb5f38c1d68a3c78f5fdd8f1412fa6b9bf03b40f450785a0ab915", size = 383664 }, + { url = "https://files.pythonhosted.org/packages/a9/10/a59ce64099cc77c81adb51f06909ac0159c19a3e2c9d9613bab171f4730f/rpds_py-0.26.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c5ab0ee51f560d179b057555b4f601b7df909ed31312d301b99f8b9fc6028284", size = 415944 }, + { url = "https://files.pythonhosted.org/packages/c3/f1/ae0c60b3be9df9d5bef3527d83b8eb4b939e3619f6dd8382840e220a27df/rpds_py-0.26.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e5162afc9e0d1f9cae3b577d9c29ddbab3505ab39012cb794d94a005825bde21", size = 558311 }, + { url = "https://files.pythonhosted.org/packages/fb/2b/bf1498ebb3ddc5eff2fe3439da88963d1fc6e73d1277fa7ca0c72620d167/rpds_py-0.26.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:43f10b007033f359bc3fa9cd5e6c1e76723f056ffa9a6b5c117cc35720a80292", size = 587928 }, + { url = "https://files.pythonhosted.org/packages/b6/eb/e6b949edf7af5629848c06d6e544a36c9f2781e2d8d03b906de61ada04d0/rpds_py-0.26.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e3730a48e5622e598293eee0762b09cff34dd3f271530f47b0894891281f051d", size = 554554 }, + { url = "https://files.pythonhosted.org/packages/0a/1c/aa0298372ea898620d4706ad26b5b9e975550a4dd30bd042b0fe9ae72cce/rpds_py-0.26.0-cp39-cp39-win32.whl", hash = "sha256:4b1f66eb81eab2e0ff5775a3a312e5e2e16bf758f7b06be82fb0d04078c7ac51", size = 220273 }, + { url = "https://files.pythonhosted.org/packages/b8/b0/8b3bef6ad0b35c172d1c87e2e5c2bb027d99e2a7bc7a16f744e66cf318f3/rpds_py-0.26.0-cp39-cp39-win_amd64.whl", hash = "sha256:519067e29f67b5c90e64fb1a6b6e9d2ec0ba28705c51956637bac23a2f4ddae1", size = 231627 }, + { url = "https://files.pythonhosted.org/packages/ef/9a/1f033b0b31253d03d785b0cd905bc127e555ab496ea6b4c7c2e1f951f2fd/rpds_py-0.26.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3c0909c5234543ada2515c05dc08595b08d621ba919629e94427e8e03539c958", size = 373226 }, + { url = "https://files.pythonhosted.org/packages/58/29/5f88023fd6aaaa8ca3c4a6357ebb23f6f07da6079093ccf27c99efce87db/rpds_py-0.26.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c1fb0cda2abcc0ac62f64e2ea4b4e64c57dfd6b885e693095460c61bde7bb18e", size = 359230 }, + { url = "https://files.pythonhosted.org/packages/6c/6c/13eaebd28b439da6964dde22712b52e53fe2824af0223b8e403249d10405/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84d142d2d6cf9b31c12aa4878d82ed3b2324226270b89b676ac62ccd7df52d08", size = 382363 }, + { url = "https://files.pythonhosted.org/packages/55/fc/3bb9c486b06da19448646f96147796de23c5811ef77cbfc26f17307b6a9d/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a547e21c5610b7e9093d870be50682a6a6cf180d6da0f42c47c306073bfdbbf6", size = 397146 }, + { url = "https://files.pythonhosted.org/packages/15/18/9d1b79eb4d18e64ba8bba9e7dec6f9d6920b639f22f07ee9368ca35d4673/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35e9a70a0f335371275cdcd08bc5b8051ac494dd58bff3bbfb421038220dc871", size = 514804 }, + { url = "https://files.pythonhosted.org/packages/4f/5a/175ad7191bdbcd28785204621b225ad70e85cdfd1e09cc414cb554633b21/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dfa6115c6def37905344d56fb54c03afc49104e2ca473d5dedec0f6606913b4", size = 402820 }, + { url = "https://files.pythonhosted.org/packages/11/45/6a67ecf6d61c4d4aff4bc056e864eec4b2447787e11d1c2c9a0242c6e92a/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:313cfcd6af1a55a286a3c9a25f64af6d0e46cf60bc5798f1db152d97a216ff6f", size = 384567 }, + { url = "https://files.pythonhosted.org/packages/a1/ba/16589da828732b46454c61858950a78fe4c931ea4bf95f17432ffe64b241/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f7bf2496fa563c046d05e4d232d7b7fd61346e2402052064b773e5c378bf6f73", size = 416520 }, + { url = "https://files.pythonhosted.org/packages/81/4b/00092999fc7c0c266045e984d56b7314734cc400a6c6dc4d61a35f135a9d/rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:aa81873e2c8c5aa616ab8e017a481a96742fdf9313c40f14338ca7dbf50cb55f", size = 559362 }, + { url = "https://files.pythonhosted.org/packages/96/0c/43737053cde1f93ac4945157f7be1428724ab943e2132a0d235a7e161d4e/rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:68ffcf982715f5b5b7686bdd349ff75d422e8f22551000c24b30eaa1b7f7ae84", size = 588113 }, + { url = "https://files.pythonhosted.org/packages/46/46/8e38f6161466e60a997ed7e9951ae5de131dedc3cf778ad35994b4af823d/rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6188de70e190847bb6db3dc3981cbadff87d27d6fe9b4f0e18726d55795cee9b", size = 555429 }, + { url = "https://files.pythonhosted.org/packages/2c/ac/65da605e9f1dd643ebe615d5bbd11b6efa1d69644fc4bf623ea5ae385a82/rpds_py-0.26.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1c962145c7473723df9722ba4c058de12eb5ebedcb4e27e7d902920aa3831ee8", size = 231950 }, + { url = "https://files.pythonhosted.org/packages/51/f2/b5c85b758a00c513bb0389f8fc8e61eb5423050c91c958cdd21843faa3e6/rpds_py-0.26.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f61a9326f80ca59214d1cceb0a09bb2ece5b2563d4e0cd37bfd5515c28510674", size = 373505 }, + { url = "https://files.pythonhosted.org/packages/23/e0/25db45e391251118e915e541995bb5f5ac5691a3b98fb233020ba53afc9b/rpds_py-0.26.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:183f857a53bcf4b1b42ef0f57ca553ab56bdd170e49d8091e96c51c3d69ca696", size = 359468 }, + { url = "https://files.pythonhosted.org/packages/0b/73/dd5ee6075bb6491be3a646b301dfd814f9486d924137a5098e61f0487e16/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:941c1cfdf4799d623cf3aa1d326a6b4fdb7a5799ee2687f3516738216d2262fb", size = 382680 }, + { url = "https://files.pythonhosted.org/packages/2f/10/84b522ff58763a5c443f5bcedc1820240e454ce4e620e88520f04589e2ea/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72a8d9564a717ee291f554eeb4bfeafe2309d5ec0aa6c475170bdab0f9ee8e88", size = 397035 }, + { url = "https://files.pythonhosted.org/packages/06/ea/8667604229a10a520fcbf78b30ccc278977dcc0627beb7ea2c96b3becef0/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:511d15193cbe013619dd05414c35a7dedf2088fcee93c6bbb7c77859765bd4e8", size = 514922 }, + { url = "https://files.pythonhosted.org/packages/24/e6/9ed5b625c0661c4882fc8cdf302bf8e96c73c40de99c31e0b95ed37d508c/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aea1f9741b603a8d8fedb0ed5502c2bc0accbc51f43e2ad1337fe7259c2b77a5", size = 402822 }, + { url = "https://files.pythonhosted.org/packages/8a/58/212c7b6fd51946047fb45d3733da27e2fa8f7384a13457c874186af691b1/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4019a9d473c708cf2f16415688ef0b4639e07abaa569d72f74745bbeffafa2c7", size = 384336 }, + { url = "https://files.pythonhosted.org/packages/aa/f5/a40ba78748ae8ebf4934d4b88e77b98497378bc2c24ba55ebe87a4e87057/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:093d63b4b0f52d98ebae33b8c50900d3d67e0666094b1be7a12fffd7f65de74b", size = 416871 }, + { url = "https://files.pythonhosted.org/packages/d5/a6/33b1fc0c9f7dcfcfc4a4353daa6308b3ece22496ceece348b3e7a7559a09/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2abe21d8ba64cded53a2a677e149ceb76dcf44284202d737178afe7ba540c1eb", size = 559439 }, + { url = "https://files.pythonhosted.org/packages/71/2d/ceb3f9c12f8cfa56d34995097f6cd99da1325642c60d1b6680dd9df03ed8/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:4feb7511c29f8442cbbc28149a92093d32e815a28aa2c50d333826ad2a20fdf0", size = 588380 }, + { url = "https://files.pythonhosted.org/packages/c8/ed/9de62c2150ca8e2e5858acf3f4f4d0d180a38feef9fdab4078bea63d8dba/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e99685fc95d386da368013e7fb4269dd39c30d99f812a8372d62f244f662709c", size = 555334 }, + { url = "https://files.pythonhosted.org/packages/7e/78/a08e2f28e91c7e45db1150813c6d760a0fb114d5652b1373897073369e0d/rpds_py-0.26.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a90a13408a7a856b87be8a9f008fff53c5080eea4e4180f6c2e546e4a972fb5d", size = 373157 }, + { url = "https://files.pythonhosted.org/packages/52/01/ddf51517497c8224fb0287e9842b820ed93748bc28ea74cab56a71e3dba4/rpds_py-0.26.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ac51b65e8dc76cf4949419c54c5528adb24fc721df722fd452e5fbc236f5c40", size = 358827 }, + { url = "https://files.pythonhosted.org/packages/4d/f4/acaefa44b83705a4fcadd68054280127c07cdb236a44a1c08b7c5adad40b/rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59b2093224a18c6508d95cfdeba8db9cbfd6f3494e94793b58972933fcee4c6d", size = 382182 }, + { url = "https://files.pythonhosted.org/packages/e9/a2/d72ac03d37d33f6ff4713ca4c704da0c3b1b3a959f0bf5eb738c0ad94ea2/rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4f01a5d6444a3258b00dc07b6ea4733e26f8072b788bef750baa37b370266137", size = 397123 }, + { url = "https://files.pythonhosted.org/packages/74/58/c053e9d1da1d3724434dd7a5f506623913e6404d396ff3cf636a910c0789/rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b6e2c12160c72aeda9d1283e612f68804621f448145a210f1bf1d79151c47090", size = 516285 }, + { url = "https://files.pythonhosted.org/packages/94/41/c81e97ee88b38b6d1847c75f2274dee8d67cb8d5ed7ca8c6b80442dead75/rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cb28c1f569f8d33b2b5dcd05d0e6ef7005d8639c54c2f0be824f05aedf715255", size = 402182 }, + { url = "https://files.pythonhosted.org/packages/74/74/38a176b34ce5197b4223e295f36350dd90713db13cf3c3b533e8e8f7484e/rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1766b5724c3f779317d5321664a343c07773c8c5fd1532e4039e6cc7d1a815be", size = 384436 }, + { url = "https://files.pythonhosted.org/packages/e4/21/f40b9a5709d7078372c87fd11335469dc4405245528b60007cd4078ed57a/rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b6d9e5a2ed9c4988c8f9b28b3bc0e3e5b1aaa10c28d210a594ff3a8c02742daf", size = 417039 }, + { url = "https://files.pythonhosted.org/packages/02/ee/ed835925731c7e87306faa80a3a5e17b4d0f532083155e7e00fe1cd4e242/rpds_py-0.26.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:b5f7a446ddaf6ca0fad9a5535b56fbfc29998bf0e0b450d174bbec0d600e1d72", size = 559111 }, + { url = "https://files.pythonhosted.org/packages/ce/88/d6e9e686b8ffb6139b82eb1c319ef32ae99aeb21f7e4bf45bba44a760d09/rpds_py-0.26.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:eed5ac260dd545fbc20da5f4f15e7efe36a55e0e7cf706e4ec005b491a9546a0", size = 588609 }, + { url = "https://files.pythonhosted.org/packages/e5/96/09bcab08fa12a69672716b7f86c672ee7f79c5319f1890c5a79dcb8e0df2/rpds_py-0.26.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:582462833ba7cee52e968b0341b85e392ae53d44c0f9af6a5927c80e539a8b67", size = 555212 }, + { url = "https://files.pythonhosted.org/packages/2c/07/c554b6ed0064b6e0350a622714298e930b3cf5a3d445a2e25c412268abcf/rpds_py-0.26.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:69a607203441e07e9a8a529cff1d5b73f6a160f22db1097211e6212a68567d11", size = 232048 }, ] [[package]] @@ -3354,18 +3354,18 @@ dependencies = [ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a5/c4/6d6ef39e57610d54c5f106dc3dece9eebce8b9d52d561ae092e3aede1b66/rustworkx-0.16.0.tar.gz", hash = "sha256:9f0dcb83f38d5ca2c3a683eb9b6951c8aec3262fbfe5141946a7ee5ba37e0bb6", size = 349524, upload-time = "2025-01-24T01:22:34.686Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/c4/6d6ef39e57610d54c5f106dc3dece9eebce8b9d52d561ae092e3aede1b66/rustworkx-0.16.0.tar.gz", hash = "sha256:9f0dcb83f38d5ca2c3a683eb9b6951c8aec3262fbfe5141946a7ee5ba37e0bb6", size = 349524 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/70/36f5916aee41ffe4f604ad75742eb1bb1b849fb568e010555f9d159cd93e/rustworkx-0.16.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:476a6c67b0142acd941691943750cc6737a48372304489969c2b62d30aaf4c27", size = 2141999, upload-time = "2025-01-24T01:21:50.3Z" }, - { url = "https://files.pythonhosted.org/packages/94/47/7e7c37fb73efcc87be6414b235534605c4008a4cdbd92a61db23b878eecd/rustworkx-0.16.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:bef2ef42870f806af93979b457e240f6dfa4f867ca33965c620f3a804409ed3a", size = 1940309, upload-time = "2025-01-24T01:21:52.053Z" }, - { url = "https://files.pythonhosted.org/packages/c6/42/a6d6b3137be55ef1d887becdf6b64b0917c7d437bd483065a88500a55603/rustworkx-0.16.0-cp39-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0db3a73bf68b3e66c08322a2fc95d3aa663d037d9b4e49c3509da4898d3529cc", size = 2195350, upload-time = "2025-01-24T01:21:53.785Z" }, - { url = "https://files.pythonhosted.org/packages/59/d2/1bc99df831c132c4b7420a85ce9150e065f4c993798f31b6a4229f238398/rustworkx-0.16.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f12a13d7486234fa2a84746d5e41f436bf9df43548043e7a232f48804ff8c61", size = 1971689, upload-time = "2025-01-24T17:09:26.338Z" }, - { url = "https://files.pythonhosted.org/packages/b5/3b/1125e7eb834f4408bcec3cee79947efd504c715fb7ab1876f8cd4bbca497/rustworkx-0.16.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89efd5c3a4653ddacc55ca39f28b261d43deec7d678f8f8fc6b76b5087f1dfea", size = 3297342, upload-time = "2025-01-24T03:18:48.885Z" }, - { url = "https://files.pythonhosted.org/packages/4f/e2/e21187b255c6211d71db0d08a44fc16771038b2af41712d66c408d9bec16/rustworkx-0.16.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec0c12aac8c54910ace20ac6ada4b890cd39f95f69100514715f8ad7af9041e4", size = 2110107, upload-time = "2025-01-24T01:21:58.884Z" }, - { url = "https://files.pythonhosted.org/packages/3c/79/e3fcff21f31253ea85ef196bf2fcabad7802b11468f7d3a5d592cd0ac789/rustworkx-0.16.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d650e39fc1a1534335f7517358ebfc3478bb235428463cfcd7c5750d50377b33", size = 2007544, upload-time = "2025-01-26T04:16:53.807Z" }, - { url = "https://files.pythonhosted.org/packages/67/04/741ed09c2b0dc0f360f85270c1179ed433785372ac9ab6ab26d3dd3ae02d/rustworkx-0.16.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:293180b83509ee9bff4c3af7ccc1024f6528d61b65d0cb7320bd31924f10cb71", size = 2172787, upload-time = "2025-01-24T01:22:01.282Z" }, - { url = "https://files.pythonhosted.org/packages/6d/fd/9c71e90f8cde76fed95dbc1e7d019977b89a29492f49ded232c6fad3055f/rustworkx-0.16.0-cp39-abi3-win32.whl", hash = "sha256:040c4368729cf502f756a3b0ff5f1c6915fc389f74dcc6afc6c3833688c97c01", size = 1840183, upload-time = "2025-01-24T01:22:03.643Z" }, - { url = "https://files.pythonhosted.org/packages/3e/79/9bdd52d2a33d468c81c1827de1b588080cb055d1d3561b194ab7bf2635b5/rustworkx-0.16.0-cp39-abi3-win_amd64.whl", hash = "sha256:905df608843c32fa45ac023687769fe13056edf7584474c801d5c50705d76e9b", size = 1953559, upload-time = "2025-01-24T01:22:06.136Z" }, + { url = "https://files.pythonhosted.org/packages/f8/70/36f5916aee41ffe4f604ad75742eb1bb1b849fb568e010555f9d159cd93e/rustworkx-0.16.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:476a6c67b0142acd941691943750cc6737a48372304489969c2b62d30aaf4c27", size = 2141999 }, + { url = "https://files.pythonhosted.org/packages/94/47/7e7c37fb73efcc87be6414b235534605c4008a4cdbd92a61db23b878eecd/rustworkx-0.16.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:bef2ef42870f806af93979b457e240f6dfa4f867ca33965c620f3a804409ed3a", size = 1940309 }, + { url = "https://files.pythonhosted.org/packages/c6/42/a6d6b3137be55ef1d887becdf6b64b0917c7d437bd483065a88500a55603/rustworkx-0.16.0-cp39-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0db3a73bf68b3e66c08322a2fc95d3aa663d037d9b4e49c3509da4898d3529cc", size = 2195350 }, + { url = "https://files.pythonhosted.org/packages/59/d2/1bc99df831c132c4b7420a85ce9150e065f4c993798f31b6a4229f238398/rustworkx-0.16.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f12a13d7486234fa2a84746d5e41f436bf9df43548043e7a232f48804ff8c61", size = 1971689 }, + { url = "https://files.pythonhosted.org/packages/b5/3b/1125e7eb834f4408bcec3cee79947efd504c715fb7ab1876f8cd4bbca497/rustworkx-0.16.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89efd5c3a4653ddacc55ca39f28b261d43deec7d678f8f8fc6b76b5087f1dfea", size = 3297342 }, + { url = "https://files.pythonhosted.org/packages/4f/e2/e21187b255c6211d71db0d08a44fc16771038b2af41712d66c408d9bec16/rustworkx-0.16.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec0c12aac8c54910ace20ac6ada4b890cd39f95f69100514715f8ad7af9041e4", size = 2110107 }, + { url = "https://files.pythonhosted.org/packages/3c/79/e3fcff21f31253ea85ef196bf2fcabad7802b11468f7d3a5d592cd0ac789/rustworkx-0.16.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d650e39fc1a1534335f7517358ebfc3478bb235428463cfcd7c5750d50377b33", size = 2007544 }, + { url = "https://files.pythonhosted.org/packages/67/04/741ed09c2b0dc0f360f85270c1179ed433785372ac9ab6ab26d3dd3ae02d/rustworkx-0.16.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:293180b83509ee9bff4c3af7ccc1024f6528d61b65d0cb7320bd31924f10cb71", size = 2172787 }, + { url = "https://files.pythonhosted.org/packages/6d/fd/9c71e90f8cde76fed95dbc1e7d019977b89a29492f49ded232c6fad3055f/rustworkx-0.16.0-cp39-abi3-win32.whl", hash = "sha256:040c4368729cf502f756a3b0ff5f1c6915fc389f74dcc6afc6c3833688c97c01", size = 1840183 }, + { url = "https://files.pythonhosted.org/packages/3e/79/9bdd52d2a33d468c81c1827de1b588080cb055d1d3561b194ab7bf2635b5/rustworkx-0.16.0-cp39-abi3-win_amd64.whl", hash = "sha256:905df608843c32fa45ac023687769fe13056edf7584474c801d5c50705d76e9b", size = 1953559 }, ] [[package]] @@ -3379,32 +3379,32 @@ resolution-markers = [ dependencies = [ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/00/48c2f661e2816ccf2ecd77982f6605b2950afe60f60a52b4cbbc2504aa8f/scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c", size = 57210720, upload-time = "2024-05-23T03:29:26.079Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/33/59/41b2529908c002ade869623b87eecff3e11e3ce62e996d0bdcb536984187/scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca", size = 39328076, upload-time = "2024-05-23T03:19:01.687Z" }, - { url = "https://files.pythonhosted.org/packages/d5/33/f1307601f492f764062ce7dd471a14750f3360e33cd0f8c614dae208492c/scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f", size = 30306232, upload-time = "2024-05-23T03:19:09.089Z" }, - { url = "https://files.pythonhosted.org/packages/c0/66/9cd4f501dd5ea03e4a4572ecd874936d0da296bd04d1c45ae1a4a75d9c3a/scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989", size = 33743202, upload-time = "2024-05-23T03:19:15.138Z" }, - { url = "https://files.pythonhosted.org/packages/a3/ba/7255e5dc82a65adbe83771c72f384d99c43063648456796436c9a5585ec3/scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f", size = 38577335, upload-time = "2024-05-23T03:19:21.984Z" }, - { url = "https://files.pythonhosted.org/packages/49/a5/bb9ded8326e9f0cdfdc412eeda1054b914dfea952bda2097d174f8832cc0/scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94", size = 38820728, upload-time = "2024-05-23T03:19:28.225Z" }, - { url = "https://files.pythonhosted.org/packages/12/30/df7a8fcc08f9b4a83f5f27cfaaa7d43f9a2d2ad0b6562cced433e5b04e31/scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54", size = 46210588, upload-time = "2024-05-23T03:19:35.661Z" }, - { url = "https://files.pythonhosted.org/packages/b4/15/4a4bb1b15bbd2cd2786c4f46e76b871b28799b67891f23f455323a0cdcfb/scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9", size = 39333805, upload-time = "2024-05-23T03:19:43.081Z" }, - { url = "https://files.pythonhosted.org/packages/ba/92/42476de1af309c27710004f5cdebc27bec62c204db42e05b23a302cb0c9a/scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326", size = 30317687, upload-time = "2024-05-23T03:19:48.799Z" }, - { url = "https://files.pythonhosted.org/packages/80/ba/8be64fe225360a4beb6840f3cbee494c107c0887f33350d0a47d55400b01/scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299", size = 33694638, upload-time = "2024-05-23T03:19:55.104Z" }, - { url = "https://files.pythonhosted.org/packages/36/07/035d22ff9795129c5a847c64cb43c1fa9188826b59344fee28a3ab02e283/scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa", size = 38569931, upload-time = "2024-05-23T03:20:01.82Z" }, - { url = "https://files.pythonhosted.org/packages/d9/10/f9b43de37e5ed91facc0cfff31d45ed0104f359e4f9a68416cbf4e790241/scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59", size = 38838145, upload-time = "2024-05-23T03:20:09.173Z" }, - { url = "https://files.pythonhosted.org/packages/4a/48/4513a1a5623a23e95f94abd675ed91cfb19989c58e9f6f7d03990f6caf3d/scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b", size = 46196227, upload-time = "2024-05-23T03:20:16.433Z" }, - { url = "https://files.pythonhosted.org/packages/f2/7b/fb6b46fbee30fc7051913068758414f2721003a89dd9a707ad49174e3843/scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1", size = 39357301, upload-time = "2024-05-23T03:20:23.538Z" }, - { url = "https://files.pythonhosted.org/packages/dc/5a/2043a3bde1443d94014aaa41e0b50c39d046dda8360abd3b2a1d3f79907d/scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d", size = 30363348, upload-time = "2024-05-23T03:20:29.885Z" }, - { url = "https://files.pythonhosted.org/packages/e7/cb/26e4a47364bbfdb3b7fb3363be6d8a1c543bcd70a7753ab397350f5f189a/scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627", size = 33406062, upload-time = "2024-05-23T03:20:36.012Z" }, - { url = "https://files.pythonhosted.org/packages/88/ab/6ecdc526d509d33814835447bbbeedbebdec7cca46ef495a61b00a35b4bf/scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884", size = 38218311, upload-time = "2024-05-23T03:20:42.086Z" }, - { url = "https://files.pythonhosted.org/packages/0b/00/9f54554f0f8318100a71515122d8f4f503b1a2c4b4cfab3b4b68c0eb08fa/scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16", size = 38442493, upload-time = "2024-05-23T03:20:48.292Z" }, - { url = "https://files.pythonhosted.org/packages/3e/df/963384e90733e08eac978cd103c34df181d1fec424de383cdc443f418dd4/scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949", size = 45910955, upload-time = "2024-05-23T03:20:55.091Z" }, - { url = "https://files.pythonhosted.org/packages/7f/29/c2ea58c9731b9ecb30b6738113a95d147e83922986b34c685b8f6eefde21/scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5", size = 39352927, upload-time = "2024-05-23T03:21:01.95Z" }, - { url = "https://files.pythonhosted.org/packages/5c/c0/e71b94b20ccf9effb38d7147c0064c08c622309fd487b1b677771a97d18c/scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24", size = 30324538, upload-time = "2024-05-23T03:21:07.634Z" }, - { url = "https://files.pythonhosted.org/packages/6d/0f/aaa55b06d474817cea311e7b10aab2ea1fd5d43bc6a2861ccc9caec9f418/scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004", size = 33732190, upload-time = "2024-05-23T03:21:14.41Z" }, - { url = "https://files.pythonhosted.org/packages/35/f5/d0ad1a96f80962ba65e2ce1de6a1e59edecd1f0a7b55990ed208848012e0/scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d", size = 38612244, upload-time = "2024-05-23T03:21:21.827Z" }, - { url = "https://files.pythonhosted.org/packages/8d/02/1165905f14962174e6569076bcc3315809ae1291ed14de6448cc151eedfd/scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c", size = 38845637, upload-time = "2024-05-23T03:21:28.729Z" }, - { url = "https://files.pythonhosted.org/packages/3e/77/dab54fe647a08ee4253963bcd8f9cf17509c8ca64d6335141422fe2e2114/scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2", size = 46227440, upload-time = "2024-05-23T03:21:35.888Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ae/00/48c2f661e2816ccf2ecd77982f6605b2950afe60f60a52b4cbbc2504aa8f/scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c", size = 57210720 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/59/41b2529908c002ade869623b87eecff3e11e3ce62e996d0bdcb536984187/scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca", size = 39328076 }, + { url = "https://files.pythonhosted.org/packages/d5/33/f1307601f492f764062ce7dd471a14750f3360e33cd0f8c614dae208492c/scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f", size = 30306232 }, + { url = "https://files.pythonhosted.org/packages/c0/66/9cd4f501dd5ea03e4a4572ecd874936d0da296bd04d1c45ae1a4a75d9c3a/scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989", size = 33743202 }, + { url = "https://files.pythonhosted.org/packages/a3/ba/7255e5dc82a65adbe83771c72f384d99c43063648456796436c9a5585ec3/scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f", size = 38577335 }, + { url = "https://files.pythonhosted.org/packages/49/a5/bb9ded8326e9f0cdfdc412eeda1054b914dfea952bda2097d174f8832cc0/scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94", size = 38820728 }, + { url = "https://files.pythonhosted.org/packages/12/30/df7a8fcc08f9b4a83f5f27cfaaa7d43f9a2d2ad0b6562cced433e5b04e31/scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54", size = 46210588 }, + { url = "https://files.pythonhosted.org/packages/b4/15/4a4bb1b15bbd2cd2786c4f46e76b871b28799b67891f23f455323a0cdcfb/scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9", size = 39333805 }, + { url = "https://files.pythonhosted.org/packages/ba/92/42476de1af309c27710004f5cdebc27bec62c204db42e05b23a302cb0c9a/scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326", size = 30317687 }, + { url = "https://files.pythonhosted.org/packages/80/ba/8be64fe225360a4beb6840f3cbee494c107c0887f33350d0a47d55400b01/scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299", size = 33694638 }, + { url = "https://files.pythonhosted.org/packages/36/07/035d22ff9795129c5a847c64cb43c1fa9188826b59344fee28a3ab02e283/scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa", size = 38569931 }, + { url = "https://files.pythonhosted.org/packages/d9/10/f9b43de37e5ed91facc0cfff31d45ed0104f359e4f9a68416cbf4e790241/scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59", size = 38838145 }, + { url = "https://files.pythonhosted.org/packages/4a/48/4513a1a5623a23e95f94abd675ed91cfb19989c58e9f6f7d03990f6caf3d/scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b", size = 46196227 }, + { url = "https://files.pythonhosted.org/packages/f2/7b/fb6b46fbee30fc7051913068758414f2721003a89dd9a707ad49174e3843/scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1", size = 39357301 }, + { url = "https://files.pythonhosted.org/packages/dc/5a/2043a3bde1443d94014aaa41e0b50c39d046dda8360abd3b2a1d3f79907d/scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d", size = 30363348 }, + { url = "https://files.pythonhosted.org/packages/e7/cb/26e4a47364bbfdb3b7fb3363be6d8a1c543bcd70a7753ab397350f5f189a/scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627", size = 33406062 }, + { url = "https://files.pythonhosted.org/packages/88/ab/6ecdc526d509d33814835447bbbeedbebdec7cca46ef495a61b00a35b4bf/scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884", size = 38218311 }, + { url = "https://files.pythonhosted.org/packages/0b/00/9f54554f0f8318100a71515122d8f4f503b1a2c4b4cfab3b4b68c0eb08fa/scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16", size = 38442493 }, + { url = "https://files.pythonhosted.org/packages/3e/df/963384e90733e08eac978cd103c34df181d1fec424de383cdc443f418dd4/scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949", size = 45910955 }, + { url = "https://files.pythonhosted.org/packages/7f/29/c2ea58c9731b9ecb30b6738113a95d147e83922986b34c685b8f6eefde21/scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5", size = 39352927 }, + { url = "https://files.pythonhosted.org/packages/5c/c0/e71b94b20ccf9effb38d7147c0064c08c622309fd487b1b677771a97d18c/scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24", size = 30324538 }, + { url = "https://files.pythonhosted.org/packages/6d/0f/aaa55b06d474817cea311e7b10aab2ea1fd5d43bc6a2861ccc9caec9f418/scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004", size = 33732190 }, + { url = "https://files.pythonhosted.org/packages/35/f5/d0ad1a96f80962ba65e2ce1de6a1e59edecd1f0a7b55990ed208848012e0/scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d", size = 38612244 }, + { url = "https://files.pythonhosted.org/packages/8d/02/1165905f14962174e6569076bcc3315809ae1291ed14de6448cc151eedfd/scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c", size = 38845637 }, + { url = "https://files.pythonhosted.org/packages/3e/77/dab54fe647a08ee4253963bcd8f9cf17509c8ca64d6335141422fe2e2114/scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2", size = 46227440 }, ] [[package]] @@ -3417,53 +3417,53 @@ resolution-markers = [ dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214, upload-time = "2025-05-08T16:13:05.955Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/2f/4966032c5f8cc7e6a60f1b2e0ad686293b9474b65246b0c642e3ef3badd0/scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c", size = 38702770, upload-time = "2025-05-08T16:04:20.849Z" }, - { url = "https://files.pythonhosted.org/packages/a0/6e/0c3bf90fae0e910c274db43304ebe25a6b391327f3f10b5dcc638c090795/scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253", size = 30094511, upload-time = "2025-05-08T16:04:27.103Z" }, - { url = "https://files.pythonhosted.org/packages/ea/b1/4deb37252311c1acff7f101f6453f0440794f51b6eacb1aad4459a134081/scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f", size = 22368151, upload-time = "2025-05-08T16:04:31.731Z" }, - { url = "https://files.pythonhosted.org/packages/38/7d/f457626e3cd3c29b3a49ca115a304cebb8cc6f31b04678f03b216899d3c6/scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92", size = 25121732, upload-time = "2025-05-08T16:04:36.596Z" }, - { url = "https://files.pythonhosted.org/packages/db/0a/92b1de4a7adc7a15dcf5bddc6e191f6f29ee663b30511ce20467ef9b82e4/scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", size = 35547617, upload-time = "2025-05-08T16:04:43.546Z" }, - { url = "https://files.pythonhosted.org/packages/8e/6d/41991e503e51fc1134502694c5fa7a1671501a17ffa12716a4a9151af3df/scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", size = 37662964, upload-time = "2025-05-08T16:04:49.431Z" }, - { url = "https://files.pythonhosted.org/packages/25/e1/3df8f83cb15f3500478c889be8fb18700813b95e9e087328230b98d547ff/scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", size = 37238749, upload-time = "2025-05-08T16:04:55.215Z" }, - { url = "https://files.pythonhosted.org/packages/93/3e/b3257cf446f2a3533ed7809757039016b74cd6f38271de91682aa844cfc5/scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", size = 40022383, upload-time = "2025-05-08T16:05:01.914Z" }, - { url = "https://files.pythonhosted.org/packages/d1/84/55bc4881973d3f79b479a5a2e2df61c8c9a04fcb986a213ac9c02cfb659b/scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13", size = 41259201, upload-time = "2025-05-08T16:05:08.166Z" }, - { url = "https://files.pythonhosted.org/packages/96/ab/5cc9f80f28f6a7dff646c5756e559823614a42b1939d86dd0ed550470210/scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b", size = 38714255, upload-time = "2025-05-08T16:05:14.596Z" }, - { url = "https://files.pythonhosted.org/packages/4a/4a/66ba30abe5ad1a3ad15bfb0b59d22174012e8056ff448cb1644deccbfed2/scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba", size = 30111035, upload-time = "2025-05-08T16:05:20.152Z" }, - { url = "https://files.pythonhosted.org/packages/4b/fa/a7e5b95afd80d24313307f03624acc65801846fa75599034f8ceb9e2cbf6/scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65", size = 22384499, upload-time = "2025-05-08T16:05:24.494Z" }, - { url = "https://files.pythonhosted.org/packages/17/99/f3aaddccf3588bb4aea70ba35328c204cadd89517a1612ecfda5b2dd9d7a/scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1", size = 25152602, upload-time = "2025-05-08T16:05:29.313Z" }, - { url = "https://files.pythonhosted.org/packages/56/c5/1032cdb565f146109212153339f9cb8b993701e9fe56b1c97699eee12586/scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889", size = 35503415, upload-time = "2025-05-08T16:05:34.699Z" }, - { url = "https://files.pythonhosted.org/packages/bd/37/89f19c8c05505d0601ed5650156e50eb881ae3918786c8fd7262b4ee66d3/scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982", size = 37652622, upload-time = "2025-05-08T16:05:40.762Z" }, - { url = "https://files.pythonhosted.org/packages/7e/31/be59513aa9695519b18e1851bb9e487de66f2d31f835201f1b42f5d4d475/scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9", size = 37244796, upload-time = "2025-05-08T16:05:48.119Z" }, - { url = "https://files.pythonhosted.org/packages/10/c0/4f5f3eeccc235632aab79b27a74a9130c6c35df358129f7ac8b29f562ac7/scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594", size = 40047684, upload-time = "2025-05-08T16:05:54.22Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a7/0ddaf514ce8a8714f6ed243a2b391b41dbb65251affe21ee3077ec45ea9a/scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb", size = 41246504, upload-time = "2025-05-08T16:06:00.437Z" }, - { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735, upload-time = "2025-05-08T16:06:06.471Z" }, - { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284, upload-time = "2025-05-08T16:06:11.686Z" }, - { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958, upload-time = "2025-05-08T16:06:15.97Z" }, - { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454, upload-time = "2025-05-08T16:06:20.394Z" }, - { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199, upload-time = "2025-05-08T16:06:26.159Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455, upload-time = "2025-05-08T16:06:32.778Z" }, - { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140, upload-time = "2025-05-08T16:06:39.249Z" }, - { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549, upload-time = "2025-05-08T16:06:45.729Z" }, - { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184, upload-time = "2025-05-08T16:06:52.623Z" }, - { url = "https://files.pythonhosted.org/packages/73/18/ec27848c9baae6e0d6573eda6e01a602e5649ee72c27c3a8aad673ebecfd/scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759", size = 38728256, upload-time = "2025-05-08T16:06:58.696Z" }, - { url = "https://files.pythonhosted.org/packages/74/cd/1aef2184948728b4b6e21267d53b3339762c285a46a274ebb7863c9e4742/scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62", size = 30109540, upload-time = "2025-05-08T16:07:04.209Z" }, - { url = "https://files.pythonhosted.org/packages/5b/d8/59e452c0a255ec352bd0a833537a3bc1bfb679944c4938ab375b0a6b3a3e/scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb", size = 22383115, upload-time = "2025-05-08T16:07:08.998Z" }, - { url = "https://files.pythonhosted.org/packages/08/f5/456f56bbbfccf696263b47095291040655e3cbaf05d063bdc7c7517f32ac/scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730", size = 25163884, upload-time = "2025-05-08T16:07:14.091Z" }, - { url = "https://files.pythonhosted.org/packages/a2/66/a9618b6a435a0f0c0b8a6d0a2efb32d4ec5a85f023c2b79d39512040355b/scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825", size = 35174018, upload-time = "2025-05-08T16:07:19.427Z" }, - { url = "https://files.pythonhosted.org/packages/b5/09/c5b6734a50ad4882432b6bb7c02baf757f5b2f256041da5df242e2d7e6b6/scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7", size = 37269716, upload-time = "2025-05-08T16:07:25.712Z" }, - { url = "https://files.pythonhosted.org/packages/77/0a/eac00ff741f23bcabd352731ed9b8995a0a60ef57f5fd788d611d43d69a1/scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11", size = 36872342, upload-time = "2025-05-08T16:07:31.468Z" }, - { url = "https://files.pythonhosted.org/packages/fe/54/4379be86dd74b6ad81551689107360d9a3e18f24d20767a2d5b9253a3f0a/scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126", size = 39670869, upload-time = "2025-05-08T16:07:38.002Z" }, - { url = "https://files.pythonhosted.org/packages/87/2e/892ad2862ba54f084ffe8cc4a22667eaf9c2bcec6d2bff1d15713c6c0703/scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163", size = 40988851, upload-time = "2025-05-08T16:08:33.671Z" }, - { url = "https://files.pythonhosted.org/packages/1b/e9/7a879c137f7e55b30d75d90ce3eb468197646bc7b443ac036ae3fe109055/scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8", size = 38863011, upload-time = "2025-05-08T16:07:44.039Z" }, - { url = "https://files.pythonhosted.org/packages/51/d1/226a806bbd69f62ce5ef5f3ffadc35286e9fbc802f606a07eb83bf2359de/scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5", size = 30266407, upload-time = "2025-05-08T16:07:49.891Z" }, - { url = "https://files.pythonhosted.org/packages/e5/9b/f32d1d6093ab9eeabbd839b0f7619c62e46cc4b7b6dbf05b6e615bbd4400/scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e", size = 22540030, upload-time = "2025-05-08T16:07:54.121Z" }, - { url = "https://files.pythonhosted.org/packages/e7/29/c278f699b095c1a884f29fda126340fcc201461ee8bfea5c8bdb1c7c958b/scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb", size = 25218709, upload-time = "2025-05-08T16:07:58.506Z" }, - { url = "https://files.pythonhosted.org/packages/24/18/9e5374b617aba742a990581373cd6b68a2945d65cc588482749ef2e64467/scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723", size = 34809045, upload-time = "2025-05-08T16:08:03.929Z" }, - { url = "https://files.pythonhosted.org/packages/e1/fe/9c4361e7ba2927074360856db6135ef4904d505e9b3afbbcb073c4008328/scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb", size = 36703062, upload-time = "2025-05-08T16:08:09.558Z" }, - { url = "https://files.pythonhosted.org/packages/b7/8e/038ccfe29d272b30086b25a4960f757f97122cb2ec42e62b460d02fe98e9/scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4", size = 36393132, upload-time = "2025-05-08T16:08:15.34Z" }, - { url = "https://files.pythonhosted.org/packages/10/7e/5c12285452970be5bdbe8352c619250b97ebf7917d7a9a9e96b8a8140f17/scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5", size = 38979503, upload-time = "2025-05-08T16:08:21.513Z" }, - { url = "https://files.pythonhosted.org/packages/81/06/0a5e5349474e1cbc5757975b21bd4fad0e72ebf138c5592f191646154e06/scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca", size = 40308097, upload-time = "2025-05-08T16:08:27.627Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/2f/4966032c5f8cc7e6a60f1b2e0ad686293b9474b65246b0c642e3ef3badd0/scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c", size = 38702770 }, + { url = "https://files.pythonhosted.org/packages/a0/6e/0c3bf90fae0e910c274db43304ebe25a6b391327f3f10b5dcc638c090795/scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253", size = 30094511 }, + { url = "https://files.pythonhosted.org/packages/ea/b1/4deb37252311c1acff7f101f6453f0440794f51b6eacb1aad4459a134081/scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f", size = 22368151 }, + { url = "https://files.pythonhosted.org/packages/38/7d/f457626e3cd3c29b3a49ca115a304cebb8cc6f31b04678f03b216899d3c6/scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92", size = 25121732 }, + { url = "https://files.pythonhosted.org/packages/db/0a/92b1de4a7adc7a15dcf5bddc6e191f6f29ee663b30511ce20467ef9b82e4/scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", size = 35547617 }, + { url = "https://files.pythonhosted.org/packages/8e/6d/41991e503e51fc1134502694c5fa7a1671501a17ffa12716a4a9151af3df/scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", size = 37662964 }, + { url = "https://files.pythonhosted.org/packages/25/e1/3df8f83cb15f3500478c889be8fb18700813b95e9e087328230b98d547ff/scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", size = 37238749 }, + { url = "https://files.pythonhosted.org/packages/93/3e/b3257cf446f2a3533ed7809757039016b74cd6f38271de91682aa844cfc5/scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", size = 40022383 }, + { url = "https://files.pythonhosted.org/packages/d1/84/55bc4881973d3f79b479a5a2e2df61c8c9a04fcb986a213ac9c02cfb659b/scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13", size = 41259201 }, + { url = "https://files.pythonhosted.org/packages/96/ab/5cc9f80f28f6a7dff646c5756e559823614a42b1939d86dd0ed550470210/scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b", size = 38714255 }, + { url = "https://files.pythonhosted.org/packages/4a/4a/66ba30abe5ad1a3ad15bfb0b59d22174012e8056ff448cb1644deccbfed2/scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba", size = 30111035 }, + { url = "https://files.pythonhosted.org/packages/4b/fa/a7e5b95afd80d24313307f03624acc65801846fa75599034f8ceb9e2cbf6/scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65", size = 22384499 }, + { url = "https://files.pythonhosted.org/packages/17/99/f3aaddccf3588bb4aea70ba35328c204cadd89517a1612ecfda5b2dd9d7a/scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1", size = 25152602 }, + { url = "https://files.pythonhosted.org/packages/56/c5/1032cdb565f146109212153339f9cb8b993701e9fe56b1c97699eee12586/scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889", size = 35503415 }, + { url = "https://files.pythonhosted.org/packages/bd/37/89f19c8c05505d0601ed5650156e50eb881ae3918786c8fd7262b4ee66d3/scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982", size = 37652622 }, + { url = "https://files.pythonhosted.org/packages/7e/31/be59513aa9695519b18e1851bb9e487de66f2d31f835201f1b42f5d4d475/scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9", size = 37244796 }, + { url = "https://files.pythonhosted.org/packages/10/c0/4f5f3eeccc235632aab79b27a74a9130c6c35df358129f7ac8b29f562ac7/scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594", size = 40047684 }, + { url = "https://files.pythonhosted.org/packages/ab/a7/0ddaf514ce8a8714f6ed243a2b391b41dbb65251affe21ee3077ec45ea9a/scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb", size = 41246504 }, + { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735 }, + { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284 }, + { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958 }, + { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454 }, + { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199 }, + { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455 }, + { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140 }, + { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549 }, + { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184 }, + { url = "https://files.pythonhosted.org/packages/73/18/ec27848c9baae6e0d6573eda6e01a602e5649ee72c27c3a8aad673ebecfd/scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759", size = 38728256 }, + { url = "https://files.pythonhosted.org/packages/74/cd/1aef2184948728b4b6e21267d53b3339762c285a46a274ebb7863c9e4742/scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62", size = 30109540 }, + { url = "https://files.pythonhosted.org/packages/5b/d8/59e452c0a255ec352bd0a833537a3bc1bfb679944c4938ab375b0a6b3a3e/scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb", size = 22383115 }, + { url = "https://files.pythonhosted.org/packages/08/f5/456f56bbbfccf696263b47095291040655e3cbaf05d063bdc7c7517f32ac/scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730", size = 25163884 }, + { url = "https://files.pythonhosted.org/packages/a2/66/a9618b6a435a0f0c0b8a6d0a2efb32d4ec5a85f023c2b79d39512040355b/scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825", size = 35174018 }, + { url = "https://files.pythonhosted.org/packages/b5/09/c5b6734a50ad4882432b6bb7c02baf757f5b2f256041da5df242e2d7e6b6/scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7", size = 37269716 }, + { url = "https://files.pythonhosted.org/packages/77/0a/eac00ff741f23bcabd352731ed9b8995a0a60ef57f5fd788d611d43d69a1/scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11", size = 36872342 }, + { url = "https://files.pythonhosted.org/packages/fe/54/4379be86dd74b6ad81551689107360d9a3e18f24d20767a2d5b9253a3f0a/scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126", size = 39670869 }, + { url = "https://files.pythonhosted.org/packages/87/2e/892ad2862ba54f084ffe8cc4a22667eaf9c2bcec6d2bff1d15713c6c0703/scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163", size = 40988851 }, + { url = "https://files.pythonhosted.org/packages/1b/e9/7a879c137f7e55b30d75d90ce3eb468197646bc7b443ac036ae3fe109055/scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8", size = 38863011 }, + { url = "https://files.pythonhosted.org/packages/51/d1/226a806bbd69f62ce5ef5f3ffadc35286e9fbc802f606a07eb83bf2359de/scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5", size = 30266407 }, + { url = "https://files.pythonhosted.org/packages/e5/9b/f32d1d6093ab9eeabbd839b0f7619c62e46cc4b7b6dbf05b6e615bbd4400/scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e", size = 22540030 }, + { url = "https://files.pythonhosted.org/packages/e7/29/c278f699b095c1a884f29fda126340fcc201461ee8bfea5c8bdb1c7c958b/scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb", size = 25218709 }, + { url = "https://files.pythonhosted.org/packages/24/18/9e5374b617aba742a990581373cd6b68a2945d65cc588482749ef2e64467/scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723", size = 34809045 }, + { url = "https://files.pythonhosted.org/packages/e1/fe/9c4361e7ba2927074360856db6135ef4904d505e9b3afbbcb073c4008328/scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb", size = 36703062 }, + { url = "https://files.pythonhosted.org/packages/b7/8e/038ccfe29d272b30086b25a4960f757f97122cb2ec42e62b460d02fe98e9/scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4", size = 36393132 }, + { url = "https://files.pythonhosted.org/packages/10/7e/5c12285452970be5bdbe8352c619250b97ebf7917d7a9a9e96b8a8140f17/scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5", size = 38979503 }, + { url = "https://files.pythonhosted.org/packages/81/06/0a5e5349474e1cbc5757975b21bd4fad0e72ebf138c5592f191646154e06/scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca", size = 40308097 }, ] [[package]] @@ -3478,62 +3478,62 @@ resolution-markers = [ dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/4a/b927028464795439faec8eaf0b03b011005c487bb2d07409f28bf30879c4/scipy-1.16.1.tar.gz", hash = "sha256:44c76f9e8b6e8e488a586190ab38016e4ed2f8a038af7cd3defa903c0a2238b3", size = 30580861, upload-time = "2025-07-27T16:33:30.834Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/da/91/812adc6f74409b461e3a5fa97f4f74c769016919203138a3bf6fc24ba4c5/scipy-1.16.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:c033fa32bab91dc98ca59d0cf23bb876454e2bb02cbe592d5023138778f70030", size = 36552519, upload-time = "2025-07-27T16:26:29.658Z" }, - { url = "https://files.pythonhosted.org/packages/47/18/8e355edcf3b71418d9e9f9acd2708cc3a6c27e8f98fde0ac34b8a0b45407/scipy-1.16.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6e5c2f74e5df33479b5cd4e97a9104c511518fbd979aa9b8f6aec18b2e9ecae7", size = 28638010, upload-time = "2025-07-27T16:26:38.196Z" }, - { url = "https://files.pythonhosted.org/packages/d9/eb/e931853058607bdfbc11b86df19ae7a08686121c203483f62f1ecae5989c/scipy-1.16.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0a55ffe0ba0f59666e90951971a884d1ff6f4ec3275a48f472cfb64175570f77", size = 20909790, upload-time = "2025-07-27T16:26:43.93Z" }, - { url = "https://files.pythonhosted.org/packages/45/0c/be83a271d6e96750cd0be2e000f35ff18880a46f05ce8b5d3465dc0f7a2a/scipy-1.16.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:f8a5d6cd147acecc2603fbd382fed6c46f474cccfcf69ea32582e033fb54dcfe", size = 23513352, upload-time = "2025-07-27T16:26:50.017Z" }, - { url = "https://files.pythonhosted.org/packages/7c/bf/fe6eb47e74f762f933cca962db7f2c7183acfdc4483bd1c3813cfe83e538/scipy-1.16.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb18899127278058bcc09e7b9966d41a5a43740b5bb8dcba401bd983f82e885b", size = 33534643, upload-time = "2025-07-27T16:26:57.503Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ba/63f402e74875486b87ec6506a4f93f6d8a0d94d10467280f3d9d7837ce3a/scipy-1.16.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adccd93a2fa937a27aae826d33e3bfa5edf9aa672376a4852d23a7cd67a2e5b7", size = 35376776, upload-time = "2025-07-27T16:27:06.639Z" }, - { url = "https://files.pythonhosted.org/packages/c3/b4/04eb9d39ec26a1b939689102da23d505ea16cdae3dbb18ffc53d1f831044/scipy-1.16.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:18aca1646a29ee9a0625a1be5637fa798d4d81fdf426481f06d69af828f16958", size = 35698906, upload-time = "2025-07-27T16:27:14.943Z" }, - { url = "https://files.pythonhosted.org/packages/04/d6/bb5468da53321baeb001f6e4e0d9049eadd175a4a497709939128556e3ec/scipy-1.16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d85495cef541729a70cdddbbf3e6b903421bc1af3e8e3a9a72a06751f33b7c39", size = 38129275, upload-time = "2025-07-27T16:27:23.873Z" }, - { url = "https://files.pythonhosted.org/packages/c4/94/994369978509f227cba7dfb9e623254d0d5559506fe994aef4bea3ed469c/scipy-1.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:226652fca853008119c03a8ce71ffe1b3f6d2844cc1686e8f9806edafae68596", size = 38644572, upload-time = "2025-07-27T16:27:32.637Z" }, - { url = "https://files.pythonhosted.org/packages/f8/d9/ec4864f5896232133f51382b54a08de91a9d1af7a76dfa372894026dfee2/scipy-1.16.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81b433bbeaf35728dad619afc002db9b189e45eebe2cd676effe1fb93fef2b9c", size = 36575194, upload-time = "2025-07-27T16:27:41.321Z" }, - { url = "https://files.pythonhosted.org/packages/5c/6d/40e81ecfb688e9d25d34a847dca361982a6addf8e31f0957b1a54fbfa994/scipy-1.16.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:886cc81fdb4c6903a3bb0464047c25a6d1016fef77bb97949817d0c0d79f9e04", size = 28594590, upload-time = "2025-07-27T16:27:49.204Z" }, - { url = "https://files.pythonhosted.org/packages/0e/37/9f65178edfcc629377ce9a64fc09baebea18c80a9e57ae09a52edf84880b/scipy-1.16.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:15240c3aac087a522b4eaedb09f0ad061753c5eebf1ea430859e5bf8640d5919", size = 20866458, upload-time = "2025-07-27T16:27:54.98Z" }, - { url = "https://files.pythonhosted.org/packages/2c/7b/749a66766871ea4cb1d1ea10f27004db63023074c22abed51f22f09770e0/scipy-1.16.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:65f81a25805f3659b48126b5053d9e823d3215e4a63730b5e1671852a1705921", size = 23539318, upload-time = "2025-07-27T16:28:01.604Z" }, - { url = "https://files.pythonhosted.org/packages/c4/db/8d4afec60eb833a666434d4541a3151eedbf2494ea6d4d468cbe877f00cd/scipy-1.16.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6c62eea7f607f122069b9bad3f99489ddca1a5173bef8a0c75555d7488b6f725", size = 33292899, upload-time = "2025-07-27T16:28:09.147Z" }, - { url = "https://files.pythonhosted.org/packages/51/1e/79023ca3bbb13a015d7d2757ecca3b81293c663694c35d6541b4dca53e98/scipy-1.16.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f965bbf3235b01c776115ab18f092a95aa74c271a52577bcb0563e85738fd618", size = 35162637, upload-time = "2025-07-27T16:28:17.535Z" }, - { url = "https://files.pythonhosted.org/packages/b6/49/0648665f9c29fdaca4c679182eb972935b3b4f5ace41d323c32352f29816/scipy-1.16.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f006e323874ffd0b0b816d8c6a8e7f9a73d55ab3b8c3f72b752b226d0e3ac83d", size = 35490507, upload-time = "2025-07-27T16:28:25.705Z" }, - { url = "https://files.pythonhosted.org/packages/62/8f/66cbb9d6bbb18d8c658f774904f42a92078707a7c71e5347e8bf2f52bb89/scipy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8fd15fc5085ab4cca74cb91fe0a4263b1f32e4420761ddae531ad60934c2119", size = 37923998, upload-time = "2025-07-27T16:28:34.339Z" }, - { url = "https://files.pythonhosted.org/packages/14/c3/61f273ae550fbf1667675701112e380881905e28448c080b23b5a181df7c/scipy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7b8013c6c066609577d910d1a2a077021727af07b6fab0ee22c2f901f22352a", size = 38508060, upload-time = "2025-07-27T16:28:43.242Z" }, - { url = "https://files.pythonhosted.org/packages/93/0b/b5c99382b839854a71ca9482c684e3472badc62620287cbbdab499b75ce6/scipy-1.16.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5451606823a5e73dfa621a89948096c6528e2896e40b39248295d3a0138d594f", size = 36533717, upload-time = "2025-07-27T16:28:51.706Z" }, - { url = "https://files.pythonhosted.org/packages/eb/e5/69ab2771062c91e23e07c12e7d5033a6b9b80b0903ee709c3c36b3eb520c/scipy-1.16.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:89728678c5ca5abd610aee148c199ac1afb16e19844401ca97d43dc548a354eb", size = 28570009, upload-time = "2025-07-27T16:28:57.017Z" }, - { url = "https://files.pythonhosted.org/packages/f4/69/bd75dbfdd3cf524f4d753484d723594aed62cfaac510123e91a6686d520b/scipy-1.16.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e756d688cb03fd07de0fffad475649b03cb89bee696c98ce508b17c11a03f95c", size = 20841942, upload-time = "2025-07-27T16:29:01.152Z" }, - { url = "https://files.pythonhosted.org/packages/ea/74/add181c87663f178ba7d6144b370243a87af8476664d5435e57d599e6874/scipy-1.16.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5aa2687b9935da3ed89c5dbed5234576589dd28d0bf7cd237501ccfbdf1ad608", size = 23498507, upload-time = "2025-07-27T16:29:05.202Z" }, - { url = "https://files.pythonhosted.org/packages/1d/74/ece2e582a0d9550cee33e2e416cc96737dce423a994d12bbe59716f47ff1/scipy-1.16.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0851f6a1e537fe9399f35986897e395a1aa61c574b178c0d456be5b1a0f5ca1f", size = 33286040, upload-time = "2025-07-27T16:29:10.201Z" }, - { url = "https://files.pythonhosted.org/packages/e4/82/08e4076df538fb56caa1d489588d880ec7c52d8273a606bb54d660528f7c/scipy-1.16.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fedc2cbd1baed37474b1924c331b97bdff611d762c196fac1a9b71e67b813b1b", size = 35176096, upload-time = "2025-07-27T16:29:17.091Z" }, - { url = "https://files.pythonhosted.org/packages/fa/79/cd710aab8c921375711a8321c6be696e705a120e3011a643efbbcdeeabcc/scipy-1.16.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2ef500e72f9623a6735769e4b93e9dcb158d40752cdbb077f305487e3e2d1f45", size = 35490328, upload-time = "2025-07-27T16:29:22.928Z" }, - { url = "https://files.pythonhosted.org/packages/71/73/e9cc3d35ee4526d784520d4494a3e1ca969b071fb5ae5910c036a375ceec/scipy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:978d8311674b05a8f7ff2ea6c6bce5d8b45a0cb09d4c5793e0318f448613ea65", size = 37939921, upload-time = "2025-07-27T16:29:29.108Z" }, - { url = "https://files.pythonhosted.org/packages/21/12/c0efd2941f01940119b5305c375ae5c0fcb7ec193f806bd8f158b73a1782/scipy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:81929ed0fa7a5713fcdd8b2e6f73697d3b4c4816d090dd34ff937c20fa90e8ab", size = 38479462, upload-time = "2025-07-27T16:30:24.078Z" }, - { url = "https://files.pythonhosted.org/packages/7a/19/c3d08b675260046a991040e1ea5d65f91f40c7df1045fffff412dcfc6765/scipy-1.16.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:bcc12db731858abda693cecdb3bdc9e6d4bd200213f49d224fe22df82687bdd6", size = 36938832, upload-time = "2025-07-27T16:29:35.057Z" }, - { url = "https://files.pythonhosted.org/packages/81/f2/ce53db652c033a414a5b34598dba6b95f3d38153a2417c5a3883da429029/scipy-1.16.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:744d977daa4becb9fc59135e75c069f8d301a87d64f88f1e602a9ecf51e77b27", size = 29093084, upload-time = "2025-07-27T16:29:40.201Z" }, - { url = "https://files.pythonhosted.org/packages/a9/ae/7a10ff04a7dc15f9057d05b33737ade244e4bd195caa3f7cc04d77b9e214/scipy-1.16.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:dc54f76ac18073bcecffb98d93f03ed6b81a92ef91b5d3b135dcc81d55a724c7", size = 21365098, upload-time = "2025-07-27T16:29:44.295Z" }, - { url = "https://files.pythonhosted.org/packages/36/ac/029ff710959932ad3c2a98721b20b405f05f752f07344622fd61a47c5197/scipy-1.16.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:367d567ee9fc1e9e2047d31f39d9d6a7a04e0710c86e701e053f237d14a9b4f6", size = 23896858, upload-time = "2025-07-27T16:29:48.784Z" }, - { url = "https://files.pythonhosted.org/packages/71/13/d1ef77b6bd7898720e1f0b6b3743cb945f6c3cafa7718eaac8841035ab60/scipy-1.16.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4cf5785e44e19dcd32a0e4807555e1e9a9b8d475c6afff3d21c3c543a6aa84f4", size = 33438311, upload-time = "2025-07-27T16:29:54.164Z" }, - { url = "https://files.pythonhosted.org/packages/2d/e0/e64a6821ffbb00b4c5b05169f1c1fddb4800e9307efe3db3788995a82a2c/scipy-1.16.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3d0b80fb26d3e13a794c71d4b837e2a589d839fd574a6bbb4ee1288c213ad4a3", size = 35279542, upload-time = "2025-07-27T16:30:00.249Z" }, - { url = "https://files.pythonhosted.org/packages/57/59/0dc3c8b43e118f1e4ee2b798dcc96ac21bb20014e5f1f7a8e85cc0653bdb/scipy-1.16.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8503517c44c18d1030d666cb70aaac1cc8913608816e06742498833b128488b7", size = 35667665, upload-time = "2025-07-27T16:30:05.916Z" }, - { url = "https://files.pythonhosted.org/packages/45/5f/844ee26e34e2f3f9f8febb9343748e72daeaec64fe0c70e9bf1ff84ec955/scipy-1.16.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:30cc4bb81c41831ecfd6dc450baf48ffd80ef5aed0f5cf3ea775740e80f16ecc", size = 38045210, upload-time = "2025-07-27T16:30:11.655Z" }, - { url = "https://files.pythonhosted.org/packages/8d/d7/210f2b45290f444f1de64bc7353aa598ece9f0e90c384b4a156f9b1a5063/scipy-1.16.1-cp313-cp313t-win_amd64.whl", hash = "sha256:c24fa02f7ed23ae514460a22c57eca8f530dbfa50b1cfdbf4f37c05b5309cc39", size = 38593661, upload-time = "2025-07-27T16:30:17.825Z" }, - { url = "https://files.pythonhosted.org/packages/81/ea/84d481a5237ed223bd3d32d6e82d7a6a96e34756492666c260cef16011d1/scipy-1.16.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:796a5a9ad36fa3a782375db8f4241ab02a091308eb079746bc0f874c9b998318", size = 36525921, upload-time = "2025-07-27T16:30:30.081Z" }, - { url = "https://files.pythonhosted.org/packages/4e/9f/d9edbdeff9f3a664807ae3aea383e10afaa247e8e6255e6d2aa4515e8863/scipy-1.16.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:3ea0733a2ff73fd6fdc5fecca54ee9b459f4d74f00b99aced7d9a3adb43fb1cc", size = 28564152, upload-time = "2025-07-27T16:30:35.336Z" }, - { url = "https://files.pythonhosted.org/packages/3b/95/8125bcb1fe04bc267d103e76516243e8d5e11229e6b306bda1024a5423d1/scipy-1.16.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:85764fb15a2ad994e708258bb4ed8290d1305c62a4e1ef07c414356a24fcfbf8", size = 20836028, upload-time = "2025-07-27T16:30:39.421Z" }, - { url = "https://files.pythonhosted.org/packages/77/9c/bf92e215701fc70bbcd3d14d86337cf56a9b912a804b9c776a269524a9e9/scipy-1.16.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:ca66d980469cb623b1759bdd6e9fd97d4e33a9fad5b33771ced24d0cb24df67e", size = 23489666, upload-time = "2025-07-27T16:30:43.663Z" }, - { url = "https://files.pythonhosted.org/packages/5e/00/5e941d397d9adac41b02839011594620d54d99488d1be5be755c00cde9ee/scipy-1.16.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e7cc1ffcc230f568549fc56670bcf3df1884c30bd652c5da8138199c8c76dae0", size = 33358318, upload-time = "2025-07-27T16:30:48.982Z" }, - { url = "https://files.pythonhosted.org/packages/0e/87/8db3aa10dde6e3e8e7eb0133f24baa011377d543f5b19c71469cf2648026/scipy-1.16.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ddfb1e8d0b540cb4ee9c53fc3dea3186f97711248fb94b4142a1b27178d8b4b", size = 35185724, upload-time = "2025-07-27T16:30:54.26Z" }, - { url = "https://files.pythonhosted.org/packages/89/b4/6ab9ae443216807622bcff02690262d8184078ea467efee2f8c93288a3b1/scipy-1.16.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4dc0e7be79e95d8ba3435d193e0d8ce372f47f774cffd882f88ea4e1e1ddc731", size = 35554335, upload-time = "2025-07-27T16:30:59.765Z" }, - { url = "https://files.pythonhosted.org/packages/9c/9a/d0e9dc03c5269a1afb60661118296a32ed5d2c24298af61b676c11e05e56/scipy-1.16.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f23634f9e5adb51b2a77766dac217063e764337fbc816aa8ad9aaebcd4397fd3", size = 37960310, upload-time = "2025-07-27T16:31:06.151Z" }, - { url = "https://files.pythonhosted.org/packages/5e/00/c8f3130a50521a7977874817ca89e0599b1b4ee8e938bad8ae798a0e1f0d/scipy-1.16.1-cp314-cp314-win_amd64.whl", hash = "sha256:57d75524cb1c5a374958a2eae3d84e1929bb971204cc9d52213fb8589183fc19", size = 39319239, upload-time = "2025-07-27T16:31:59.942Z" }, - { url = "https://files.pythonhosted.org/packages/f2/f2/1ca3eda54c3a7e4c92f6acef7db7b3a057deb135540d23aa6343ef8ad333/scipy-1.16.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:d8da7c3dd67bcd93f15618938f43ed0995982eb38973023d46d4646c4283ad65", size = 36939460, upload-time = "2025-07-27T16:31:11.865Z" }, - { url = "https://files.pythonhosted.org/packages/80/30/98c2840b293a132400c0940bb9e140171dcb8189588619048f42b2ce7b4f/scipy-1.16.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:cc1d2f2fd48ba1e0620554fe5bc44d3e8f5d4185c8c109c7fbdf5af2792cfad2", size = 29093322, upload-time = "2025-07-27T16:31:17.045Z" }, - { url = "https://files.pythonhosted.org/packages/c1/e6/1e6e006e850622cf2a039b62d1a6ddc4497d4851e58b68008526f04a9a00/scipy-1.16.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:21a611ced9275cb861bacadbada0b8c0623bc00b05b09eb97f23b370fc2ae56d", size = 21365329, upload-time = "2025-07-27T16:31:21.188Z" }, - { url = "https://files.pythonhosted.org/packages/8e/02/72a5aa5b820589dda9a25e329ca752842bfbbaf635e36bc7065a9b42216e/scipy-1.16.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dfbb25dffc4c3dd9371d8ab456ca81beeaf6f9e1c2119f179392f0dc1ab7695", size = 23897544, upload-time = "2025-07-27T16:31:25.408Z" }, - { url = "https://files.pythonhosted.org/packages/2b/dc/7122d806a6f9eb8a33532982234bed91f90272e990f414f2830cfe656e0b/scipy-1.16.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f0ebb7204f063fad87fc0a0e4ff4a2ff40b2a226e4ba1b7e34bf4b79bf97cd86", size = 33442112, upload-time = "2025-07-27T16:31:30.62Z" }, - { url = "https://files.pythonhosted.org/packages/24/39/e383af23564daa1021a5b3afbe0d8d6a68ec639b943661841f44ac92de85/scipy-1.16.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f1b9e5962656f2734c2b285a8745358ecb4e4efbadd00208c80a389227ec61ff", size = 35286594, upload-time = "2025-07-27T16:31:36.112Z" }, - { url = "https://files.pythonhosted.org/packages/95/47/1a0b0aff40c3056d955f38b0df5d178350c3d74734ec54f9c68d23910be5/scipy-1.16.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e1a106f8c023d57a2a903e771228bf5c5b27b5d692088f457acacd3b54511e4", size = 35665080, upload-time = "2025-07-27T16:31:42.025Z" }, - { url = "https://files.pythonhosted.org/packages/64/df/ce88803e9ed6e27fe9b9abefa157cf2c80e4fa527cf17ee14be41f790ad4/scipy-1.16.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:709559a1db68a9abc3b2c8672c4badf1614f3b440b3ab326d86a5c0491eafae3", size = 38050306, upload-time = "2025-07-27T16:31:48.109Z" }, - { url = "https://files.pythonhosted.org/packages/6e/6c/a76329897a7cae4937d403e623aa6aaea616a0bb5b36588f0b9d1c9a3739/scipy-1.16.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c0c804d60492a0aad7f5b2bb1862f4548b990049e27e828391ff2bf6f7199998", size = 39427705, upload-time = "2025-07-27T16:31:53.96Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f5/4a/b927028464795439faec8eaf0b03b011005c487bb2d07409f28bf30879c4/scipy-1.16.1.tar.gz", hash = "sha256:44c76f9e8b6e8e488a586190ab38016e4ed2f8a038af7cd3defa903c0a2238b3", size = 30580861 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/91/812adc6f74409b461e3a5fa97f4f74c769016919203138a3bf6fc24ba4c5/scipy-1.16.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:c033fa32bab91dc98ca59d0cf23bb876454e2bb02cbe592d5023138778f70030", size = 36552519 }, + { url = "https://files.pythonhosted.org/packages/47/18/8e355edcf3b71418d9e9f9acd2708cc3a6c27e8f98fde0ac34b8a0b45407/scipy-1.16.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6e5c2f74e5df33479b5cd4e97a9104c511518fbd979aa9b8f6aec18b2e9ecae7", size = 28638010 }, + { url = "https://files.pythonhosted.org/packages/d9/eb/e931853058607bdfbc11b86df19ae7a08686121c203483f62f1ecae5989c/scipy-1.16.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0a55ffe0ba0f59666e90951971a884d1ff6f4ec3275a48f472cfb64175570f77", size = 20909790 }, + { url = "https://files.pythonhosted.org/packages/45/0c/be83a271d6e96750cd0be2e000f35ff18880a46f05ce8b5d3465dc0f7a2a/scipy-1.16.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:f8a5d6cd147acecc2603fbd382fed6c46f474cccfcf69ea32582e033fb54dcfe", size = 23513352 }, + { url = "https://files.pythonhosted.org/packages/7c/bf/fe6eb47e74f762f933cca962db7f2c7183acfdc4483bd1c3813cfe83e538/scipy-1.16.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb18899127278058bcc09e7b9966d41a5a43740b5bb8dcba401bd983f82e885b", size = 33534643 }, + { url = "https://files.pythonhosted.org/packages/bb/ba/63f402e74875486b87ec6506a4f93f6d8a0d94d10467280f3d9d7837ce3a/scipy-1.16.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adccd93a2fa937a27aae826d33e3bfa5edf9aa672376a4852d23a7cd67a2e5b7", size = 35376776 }, + { url = "https://files.pythonhosted.org/packages/c3/b4/04eb9d39ec26a1b939689102da23d505ea16cdae3dbb18ffc53d1f831044/scipy-1.16.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:18aca1646a29ee9a0625a1be5637fa798d4d81fdf426481f06d69af828f16958", size = 35698906 }, + { url = "https://files.pythonhosted.org/packages/04/d6/bb5468da53321baeb001f6e4e0d9049eadd175a4a497709939128556e3ec/scipy-1.16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d85495cef541729a70cdddbbf3e6b903421bc1af3e8e3a9a72a06751f33b7c39", size = 38129275 }, + { url = "https://files.pythonhosted.org/packages/c4/94/994369978509f227cba7dfb9e623254d0d5559506fe994aef4bea3ed469c/scipy-1.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:226652fca853008119c03a8ce71ffe1b3f6d2844cc1686e8f9806edafae68596", size = 38644572 }, + { url = "https://files.pythonhosted.org/packages/f8/d9/ec4864f5896232133f51382b54a08de91a9d1af7a76dfa372894026dfee2/scipy-1.16.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81b433bbeaf35728dad619afc002db9b189e45eebe2cd676effe1fb93fef2b9c", size = 36575194 }, + { url = "https://files.pythonhosted.org/packages/5c/6d/40e81ecfb688e9d25d34a847dca361982a6addf8e31f0957b1a54fbfa994/scipy-1.16.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:886cc81fdb4c6903a3bb0464047c25a6d1016fef77bb97949817d0c0d79f9e04", size = 28594590 }, + { url = "https://files.pythonhosted.org/packages/0e/37/9f65178edfcc629377ce9a64fc09baebea18c80a9e57ae09a52edf84880b/scipy-1.16.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:15240c3aac087a522b4eaedb09f0ad061753c5eebf1ea430859e5bf8640d5919", size = 20866458 }, + { url = "https://files.pythonhosted.org/packages/2c/7b/749a66766871ea4cb1d1ea10f27004db63023074c22abed51f22f09770e0/scipy-1.16.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:65f81a25805f3659b48126b5053d9e823d3215e4a63730b5e1671852a1705921", size = 23539318 }, + { url = "https://files.pythonhosted.org/packages/c4/db/8d4afec60eb833a666434d4541a3151eedbf2494ea6d4d468cbe877f00cd/scipy-1.16.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6c62eea7f607f122069b9bad3f99489ddca1a5173bef8a0c75555d7488b6f725", size = 33292899 }, + { url = "https://files.pythonhosted.org/packages/51/1e/79023ca3bbb13a015d7d2757ecca3b81293c663694c35d6541b4dca53e98/scipy-1.16.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f965bbf3235b01c776115ab18f092a95aa74c271a52577bcb0563e85738fd618", size = 35162637 }, + { url = "https://files.pythonhosted.org/packages/b6/49/0648665f9c29fdaca4c679182eb972935b3b4f5ace41d323c32352f29816/scipy-1.16.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f006e323874ffd0b0b816d8c6a8e7f9a73d55ab3b8c3f72b752b226d0e3ac83d", size = 35490507 }, + { url = "https://files.pythonhosted.org/packages/62/8f/66cbb9d6bbb18d8c658f774904f42a92078707a7c71e5347e8bf2f52bb89/scipy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8fd15fc5085ab4cca74cb91fe0a4263b1f32e4420761ddae531ad60934c2119", size = 37923998 }, + { url = "https://files.pythonhosted.org/packages/14/c3/61f273ae550fbf1667675701112e380881905e28448c080b23b5a181df7c/scipy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7b8013c6c066609577d910d1a2a077021727af07b6fab0ee22c2f901f22352a", size = 38508060 }, + { url = "https://files.pythonhosted.org/packages/93/0b/b5c99382b839854a71ca9482c684e3472badc62620287cbbdab499b75ce6/scipy-1.16.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5451606823a5e73dfa621a89948096c6528e2896e40b39248295d3a0138d594f", size = 36533717 }, + { url = "https://files.pythonhosted.org/packages/eb/e5/69ab2771062c91e23e07c12e7d5033a6b9b80b0903ee709c3c36b3eb520c/scipy-1.16.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:89728678c5ca5abd610aee148c199ac1afb16e19844401ca97d43dc548a354eb", size = 28570009 }, + { url = "https://files.pythonhosted.org/packages/f4/69/bd75dbfdd3cf524f4d753484d723594aed62cfaac510123e91a6686d520b/scipy-1.16.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e756d688cb03fd07de0fffad475649b03cb89bee696c98ce508b17c11a03f95c", size = 20841942 }, + { url = "https://files.pythonhosted.org/packages/ea/74/add181c87663f178ba7d6144b370243a87af8476664d5435e57d599e6874/scipy-1.16.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5aa2687b9935da3ed89c5dbed5234576589dd28d0bf7cd237501ccfbdf1ad608", size = 23498507 }, + { url = "https://files.pythonhosted.org/packages/1d/74/ece2e582a0d9550cee33e2e416cc96737dce423a994d12bbe59716f47ff1/scipy-1.16.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0851f6a1e537fe9399f35986897e395a1aa61c574b178c0d456be5b1a0f5ca1f", size = 33286040 }, + { url = "https://files.pythonhosted.org/packages/e4/82/08e4076df538fb56caa1d489588d880ec7c52d8273a606bb54d660528f7c/scipy-1.16.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fedc2cbd1baed37474b1924c331b97bdff611d762c196fac1a9b71e67b813b1b", size = 35176096 }, + { url = "https://files.pythonhosted.org/packages/fa/79/cd710aab8c921375711a8321c6be696e705a120e3011a643efbbcdeeabcc/scipy-1.16.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2ef500e72f9623a6735769e4b93e9dcb158d40752cdbb077f305487e3e2d1f45", size = 35490328 }, + { url = "https://files.pythonhosted.org/packages/71/73/e9cc3d35ee4526d784520d4494a3e1ca969b071fb5ae5910c036a375ceec/scipy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:978d8311674b05a8f7ff2ea6c6bce5d8b45a0cb09d4c5793e0318f448613ea65", size = 37939921 }, + { url = "https://files.pythonhosted.org/packages/21/12/c0efd2941f01940119b5305c375ae5c0fcb7ec193f806bd8f158b73a1782/scipy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:81929ed0fa7a5713fcdd8b2e6f73697d3b4c4816d090dd34ff937c20fa90e8ab", size = 38479462 }, + { url = "https://files.pythonhosted.org/packages/7a/19/c3d08b675260046a991040e1ea5d65f91f40c7df1045fffff412dcfc6765/scipy-1.16.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:bcc12db731858abda693cecdb3bdc9e6d4bd200213f49d224fe22df82687bdd6", size = 36938832 }, + { url = "https://files.pythonhosted.org/packages/81/f2/ce53db652c033a414a5b34598dba6b95f3d38153a2417c5a3883da429029/scipy-1.16.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:744d977daa4becb9fc59135e75c069f8d301a87d64f88f1e602a9ecf51e77b27", size = 29093084 }, + { url = "https://files.pythonhosted.org/packages/a9/ae/7a10ff04a7dc15f9057d05b33737ade244e4bd195caa3f7cc04d77b9e214/scipy-1.16.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:dc54f76ac18073bcecffb98d93f03ed6b81a92ef91b5d3b135dcc81d55a724c7", size = 21365098 }, + { url = "https://files.pythonhosted.org/packages/36/ac/029ff710959932ad3c2a98721b20b405f05f752f07344622fd61a47c5197/scipy-1.16.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:367d567ee9fc1e9e2047d31f39d9d6a7a04e0710c86e701e053f237d14a9b4f6", size = 23896858 }, + { url = "https://files.pythonhosted.org/packages/71/13/d1ef77b6bd7898720e1f0b6b3743cb945f6c3cafa7718eaac8841035ab60/scipy-1.16.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4cf5785e44e19dcd32a0e4807555e1e9a9b8d475c6afff3d21c3c543a6aa84f4", size = 33438311 }, + { url = "https://files.pythonhosted.org/packages/2d/e0/e64a6821ffbb00b4c5b05169f1c1fddb4800e9307efe3db3788995a82a2c/scipy-1.16.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3d0b80fb26d3e13a794c71d4b837e2a589d839fd574a6bbb4ee1288c213ad4a3", size = 35279542 }, + { url = "https://files.pythonhosted.org/packages/57/59/0dc3c8b43e118f1e4ee2b798dcc96ac21bb20014e5f1f7a8e85cc0653bdb/scipy-1.16.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8503517c44c18d1030d666cb70aaac1cc8913608816e06742498833b128488b7", size = 35667665 }, + { url = "https://files.pythonhosted.org/packages/45/5f/844ee26e34e2f3f9f8febb9343748e72daeaec64fe0c70e9bf1ff84ec955/scipy-1.16.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:30cc4bb81c41831ecfd6dc450baf48ffd80ef5aed0f5cf3ea775740e80f16ecc", size = 38045210 }, + { url = "https://files.pythonhosted.org/packages/8d/d7/210f2b45290f444f1de64bc7353aa598ece9f0e90c384b4a156f9b1a5063/scipy-1.16.1-cp313-cp313t-win_amd64.whl", hash = "sha256:c24fa02f7ed23ae514460a22c57eca8f530dbfa50b1cfdbf4f37c05b5309cc39", size = 38593661 }, + { url = "https://files.pythonhosted.org/packages/81/ea/84d481a5237ed223bd3d32d6e82d7a6a96e34756492666c260cef16011d1/scipy-1.16.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:796a5a9ad36fa3a782375db8f4241ab02a091308eb079746bc0f874c9b998318", size = 36525921 }, + { url = "https://files.pythonhosted.org/packages/4e/9f/d9edbdeff9f3a664807ae3aea383e10afaa247e8e6255e6d2aa4515e8863/scipy-1.16.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:3ea0733a2ff73fd6fdc5fecca54ee9b459f4d74f00b99aced7d9a3adb43fb1cc", size = 28564152 }, + { url = "https://files.pythonhosted.org/packages/3b/95/8125bcb1fe04bc267d103e76516243e8d5e11229e6b306bda1024a5423d1/scipy-1.16.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:85764fb15a2ad994e708258bb4ed8290d1305c62a4e1ef07c414356a24fcfbf8", size = 20836028 }, + { url = "https://files.pythonhosted.org/packages/77/9c/bf92e215701fc70bbcd3d14d86337cf56a9b912a804b9c776a269524a9e9/scipy-1.16.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:ca66d980469cb623b1759bdd6e9fd97d4e33a9fad5b33771ced24d0cb24df67e", size = 23489666 }, + { url = "https://files.pythonhosted.org/packages/5e/00/5e941d397d9adac41b02839011594620d54d99488d1be5be755c00cde9ee/scipy-1.16.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e7cc1ffcc230f568549fc56670bcf3df1884c30bd652c5da8138199c8c76dae0", size = 33358318 }, + { url = "https://files.pythonhosted.org/packages/0e/87/8db3aa10dde6e3e8e7eb0133f24baa011377d543f5b19c71469cf2648026/scipy-1.16.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ddfb1e8d0b540cb4ee9c53fc3dea3186f97711248fb94b4142a1b27178d8b4b", size = 35185724 }, + { url = "https://files.pythonhosted.org/packages/89/b4/6ab9ae443216807622bcff02690262d8184078ea467efee2f8c93288a3b1/scipy-1.16.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4dc0e7be79e95d8ba3435d193e0d8ce372f47f774cffd882f88ea4e1e1ddc731", size = 35554335 }, + { url = "https://files.pythonhosted.org/packages/9c/9a/d0e9dc03c5269a1afb60661118296a32ed5d2c24298af61b676c11e05e56/scipy-1.16.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f23634f9e5adb51b2a77766dac217063e764337fbc816aa8ad9aaebcd4397fd3", size = 37960310 }, + { url = "https://files.pythonhosted.org/packages/5e/00/c8f3130a50521a7977874817ca89e0599b1b4ee8e938bad8ae798a0e1f0d/scipy-1.16.1-cp314-cp314-win_amd64.whl", hash = "sha256:57d75524cb1c5a374958a2eae3d84e1929bb971204cc9d52213fb8589183fc19", size = 39319239 }, + { url = "https://files.pythonhosted.org/packages/f2/f2/1ca3eda54c3a7e4c92f6acef7db7b3a057deb135540d23aa6343ef8ad333/scipy-1.16.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:d8da7c3dd67bcd93f15618938f43ed0995982eb38973023d46d4646c4283ad65", size = 36939460 }, + { url = "https://files.pythonhosted.org/packages/80/30/98c2840b293a132400c0940bb9e140171dcb8189588619048f42b2ce7b4f/scipy-1.16.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:cc1d2f2fd48ba1e0620554fe5bc44d3e8f5d4185c8c109c7fbdf5af2792cfad2", size = 29093322 }, + { url = "https://files.pythonhosted.org/packages/c1/e6/1e6e006e850622cf2a039b62d1a6ddc4497d4851e58b68008526f04a9a00/scipy-1.16.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:21a611ced9275cb861bacadbada0b8c0623bc00b05b09eb97f23b370fc2ae56d", size = 21365329 }, + { url = "https://files.pythonhosted.org/packages/8e/02/72a5aa5b820589dda9a25e329ca752842bfbbaf635e36bc7065a9b42216e/scipy-1.16.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dfbb25dffc4c3dd9371d8ab456ca81beeaf6f9e1c2119f179392f0dc1ab7695", size = 23897544 }, + { url = "https://files.pythonhosted.org/packages/2b/dc/7122d806a6f9eb8a33532982234bed91f90272e990f414f2830cfe656e0b/scipy-1.16.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f0ebb7204f063fad87fc0a0e4ff4a2ff40b2a226e4ba1b7e34bf4b79bf97cd86", size = 33442112 }, + { url = "https://files.pythonhosted.org/packages/24/39/e383af23564daa1021a5b3afbe0d8d6a68ec639b943661841f44ac92de85/scipy-1.16.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f1b9e5962656f2734c2b285a8745358ecb4e4efbadd00208c80a389227ec61ff", size = 35286594 }, + { url = "https://files.pythonhosted.org/packages/95/47/1a0b0aff40c3056d955f38b0df5d178350c3d74734ec54f9c68d23910be5/scipy-1.16.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e1a106f8c023d57a2a903e771228bf5c5b27b5d692088f457acacd3b54511e4", size = 35665080 }, + { url = "https://files.pythonhosted.org/packages/64/df/ce88803e9ed6e27fe9b9abefa157cf2c80e4fa527cf17ee14be41f790ad4/scipy-1.16.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:709559a1db68a9abc3b2c8672c4badf1614f3b440b3ab326d86a5c0491eafae3", size = 38050306 }, + { url = "https://files.pythonhosted.org/packages/6e/6c/a76329897a7cae4937d403e623aa6aaea616a0bb5b36588f0b9d1c9a3739/scipy-1.16.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c0c804d60492a0aad7f5b2bb1862f4548b990049e27e828391ff2bf6f7199998", size = 39427705 }, ] [[package]] @@ -3547,18 +3547,18 @@ dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "pandas" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/86/59/a451d7420a77ab0b98f7affa3a1d78a313d2f7281a57afb1a34bae8ab412/seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7", size = 1457696, upload-time = "2024-01-25T13:21:52.551Z" } +sdist = { url = "https://files.pythonhosted.org/packages/86/59/a451d7420a77ab0b98f7affa3a1d78a313d2f7281a57afb1a34bae8ab412/seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7", size = 1457696 } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", size = 294914, upload-time = "2024-01-25T13:21:49.598Z" }, + { url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", size = 294914 }, ] [[package]] name = "setuptools" version = "80.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486 }, ] [[package]] @@ -3572,18 +3572,18 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions", marker = "python_full_version < '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/19/7ae64b70b2429c48c3a7a4ed36f50f94687d3bfcd0ae2f152367b6410dff/setuptools_scm-8.3.1.tar.gz", hash = "sha256:3d555e92b75dacd037d32bafdf94f97af51ea29ae8c7b234cf94b7a5bd242a63", size = 78088, upload-time = "2025-04-23T11:53:19.739Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/19/7ae64b70b2429c48c3a7a4ed36f50f94687d3bfcd0ae2f152367b6410dff/setuptools_scm-8.3.1.tar.gz", hash = "sha256:3d555e92b75dacd037d32bafdf94f97af51ea29ae8c7b234cf94b7a5bd242a63", size = 78088 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/ac/8f96ba9b4cfe3e4ea201f23f4f97165862395e9331a424ed325ae37024a8/setuptools_scm-8.3.1-py3-none-any.whl", hash = "sha256:332ca0d43791b818b841213e76b1971b7711a960761c5bea5fc5cdb5196fbce3", size = 43935, upload-time = "2025-04-23T11:53:17.922Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ac/8f96ba9b4cfe3e4ea201f23f4f97165862395e9331a424ed325ae37024a8/setuptools_scm-8.3.1-py3-none-any.whl", hash = "sha256:332ca0d43791b818b841213e76b1971b7711a960761c5bea5fc5cdb5196fbce3", size = 43935 }, ] [[package]] name = "simpleeval" version = "1.0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ff/6f/15be211749430f52f2c8f0c69158a6fc961c03aac93fa28d44d1a6f5ebc7/simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829", size = 24358, upload-time = "2024-11-02T10:29:46.912Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/6f/15be211749430f52f2c8f0c69158a6fc961c03aac93fa28d44d1a6f5ebc7/simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829", size = 24358 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e9/e58082fbb8cecbb6fb4133033c40cc50c248b1a331582be3a0f39138d65b/simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38", size = 15762, upload-time = "2024-11-02T10:29:45.706Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e9/e58082fbb8cecbb6fb4133033c40cc50c248b1a331582be3a0f39138d65b/simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38", size = 15762 }, ] [[package]] @@ -3600,36 +3600,36 @@ dependencies = [ { name = "scipy", version = "1.16.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "stim" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/ce/ba7f22ac1535b95b16f046678d133b2af65288effb6e4e99c28b576ef54d/sinter-1.15.0.tar.gz", hash = "sha256:47c7e4412d73bcbd5cabca49b6d9bfc0b33eb18d333f525076512e0efa873d45", size = 176702, upload-time = "2025-05-07T06:19:38.872Z" } +sdist = { url = "https://files.pythonhosted.org/packages/78/ce/ba7f22ac1535b95b16f046678d133b2af65288effb6e4e99c28b576ef54d/sinter-1.15.0.tar.gz", hash = "sha256:47c7e4412d73bcbd5cabca49b6d9bfc0b33eb18d333f525076512e0efa873d45", size = 176702 } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/45/be8193757e44880348dc9561bedadce0b815b408c959ceaf56c1863fd65d/sinter-1.15.0-py3-none-any.whl", hash = "sha256:6bec05cc643e301192c2acaca9ede464576572635c5e25a592e48294b7e53bed", size = 196891, upload-time = "2025-05-07T06:19:37.398Z" }, + { url = "https://files.pythonhosted.org/packages/62/45/be8193757e44880348dc9561bedadce0b815b408c959ceaf56c1863fd65d/sinter-1.15.0-py3-none-any.whl", hash = "sha256:6bec05cc643e301192c2acaca9ede464576572635c5e25a592e48294b7e53bed", size = 196891 }, ] [[package]] name = "six" version = "1.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, ] [[package]] name = "snowballstemmer" version = "3.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575, upload-time = "2025-05-09T16:34:51.843Z" } +sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274 }, ] [[package]] name = "soupsieve" version = "2.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload-time = "2025-04-20T18:50:08.518Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload-time = "2025-04-20T18:50:07.196Z" }, + { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677 }, ] [[package]] @@ -3660,9 +3660,9 @@ dependencies = [ { name = "sphinxcontrib-serializinghtml", marker = "python_full_version < '3.10'" }, { name = "tomli", marker = "python_full_version < '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5b/be/50e50cb4f2eff47df05673d361095cafd95521d2a22521b920c67a372dcb/sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe", size = 8067911, upload-time = "2024-07-20T14:46:56.059Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/be/50e50cb4f2eff47df05673d361095cafd95521d2a22521b920c67a372dcb/sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe", size = 8067911 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/ef/153f6803c5d5f8917dbb7f7fcf6d34a871ede3296fa89c2c703f5f8a6c8e/sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239", size = 3401624, upload-time = "2024-07-20T14:46:52.142Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ef/153f6803c5d5f8917dbb7f7fcf6d34a871ede3296fa89c2c703f5f8a6c8e/sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239", size = 3401624 }, ] [[package]] @@ -3691,9 +3691,9 @@ dependencies = [ { name = "sphinxcontrib-serializinghtml", marker = "python_full_version == '3.10.*'" }, { name = "tomli", marker = "python_full_version == '3.10.*'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611, upload-time = "2024-10-13T20:27:13.93Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611 } wheels = [ - { url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125, upload-time = "2024-10-13T20:27:10.448Z" }, + { url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125 }, ] [[package]] @@ -3724,9 +3724,9 @@ dependencies = [ { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.11'" }, { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876, upload-time = "2025-03-02T22:31:59.658Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876 } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload-time = "2025-03-02T22:31:56.836Z" }, + { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741 }, ] [[package]] @@ -3742,9 +3742,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "stdlib-list", marker = "python_full_version < '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7f/a8/22b379a2a75ccb881217d3d4ae56d7d35f2d1bb4c8c0c51d0253676746a1/sphinx_autoapi-3.6.0.tar.gz", hash = "sha256:c685f274e41d0842ae7e199460c322c4bd7fec816ccc2da8d806094b4f64af06", size = 55417, upload-time = "2025-02-18T01:50:55.241Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/a8/22b379a2a75ccb881217d3d4ae56d7d35f2d1bb4c8c0c51d0253676746a1/sphinx_autoapi-3.6.0.tar.gz", hash = "sha256:c685f274e41d0842ae7e199460c322c4bd7fec816ccc2da8d806094b4f64af06", size = 55417 } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/17/0eda9dc80fcaf257222b506844207e71b5d59567c41bbdcca2a72da119b9/sphinx_autoapi-3.6.0-py3-none-any.whl", hash = "sha256:f3b66714493cab140b0e896d33ce7137654a16ac1edb6563edcbd47bf975f711", size = 35281, upload-time = "2025-02-18T01:50:52.789Z" }, + { url = "https://files.pythonhosted.org/packages/58/17/0eda9dc80fcaf257222b506844207e71b5d59567c41bbdcca2a72da119b9/sphinx_autoapi-3.6.0-py3-none-any.whl", hash = "sha256:f3b66714493cab140b0e896d33ce7137654a16ac1edb6563edcbd47bf975f711", size = 35281 }, ] [[package]] @@ -3756,9 +3756,9 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736, upload-time = "2023-07-08T18:40:54.166Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496, upload-time = "2023-07-08T18:40:52.659Z" }, + { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496 }, ] [[package]] @@ -3770,9 +3770,9 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039, upload-time = "2023-04-14T08:10:22.998Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343, upload-time = "2023-04-14T08:10:20.844Z" }, + { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343 }, ] [[package]] @@ -3784,18 +3784,18 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2b/69/b34e0cb5336f09c6866d53b4a19d76c227cdec1bbc7ac4de63ca7d58c9c7/sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632", size = 2193689, upload-time = "2024-08-02T13:48:44.277Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/69/b34e0cb5336f09c6866d53b4a19d76c227cdec1bbc7ac4de63ca7d58c9c7/sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632", size = 2193689 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c", size = 2215338, upload-time = "2024-08-02T13:48:42.106Z" }, + { url = "https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c", size = 2215338 }, ] [[package]] name = "sphinxcontrib-applehelp" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload-time = "2024-07-29T01:09:00.465Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload-time = "2024-07-29T01:08:58.99Z" }, + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300 }, ] [[package]] @@ -3811,54 +3811,54 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/de/83/1488c9879f2fa3c2cbd6f666c7a3a42a1fa9e08462bec73281fa6c092cba/sphinxcontrib_bibtex-2.6.5.tar.gz", hash = "sha256:9b3224dd6fece9268ebd8c905dc0a83ff2f6c54148a9235fe70e9d1e9ff149c0", size = 118462, upload-time = "2025-06-27T10:40:14.061Z" } +sdist = { url = "https://files.pythonhosted.org/packages/de/83/1488c9879f2fa3c2cbd6f666c7a3a42a1fa9e08462bec73281fa6c092cba/sphinxcontrib_bibtex-2.6.5.tar.gz", hash = "sha256:9b3224dd6fece9268ebd8c905dc0a83ff2f6c54148a9235fe70e9d1e9ff149c0", size = 118462 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/a0/3a612da94f828f26cabb247817393e79472c32b12c49222bf85fb6d7b6c8/sphinxcontrib_bibtex-2.6.5-py3-none-any.whl", hash = "sha256:455ea4509642ea0b28ede3721550273626f85af65af01f161bfd8e19dc1edd7d", size = 40410, upload-time = "2025-06-27T10:40:12.274Z" }, + { url = "https://files.pythonhosted.org/packages/9e/a0/3a612da94f828f26cabb247817393e79472c32b12c49222bf85fb6d7b6c8/sphinxcontrib_bibtex-2.6.5-py3-none-any.whl", hash = "sha256:455ea4509642ea0b28ede3721550273626f85af65af01f161bfd8e19dc1edd7d", size = 40410 }, ] [[package]] name = "sphinxcontrib-devhelp" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload-time = "2024-07-29T01:09:23.417Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967 } wheels = [ - { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload-time = "2024-07-29T01:09:21.945Z" }, + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530 }, ] [[package]] name = "sphinxcontrib-htmlhelp" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload-time = "2024-07-29T01:09:37.889Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload-time = "2024-07-29T01:09:36.407Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705 }, ] [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload-time = "2019-01-21T16:10:16.347Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z" }, + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071 }, ] [[package]] name = "sphinxcontrib-qthelp" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload-time = "2024-07-29T01:09:56.435Z" } +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165 } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload-time = "2024-07-29T01:09:54.885Z" }, + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743 }, ] [[package]] name = "sphinxcontrib-serializinghtml" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload-time = "2024-07-29T01:10:09.332Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080 } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072 }, ] [[package]] @@ -3870,9 +3870,9 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/e2/ff9a504da29525e1443004751bdf8e2d23aef8e47a88135aa7a9a026d94a/sphinxcontrib_svg2pdfconverter-1.3.0.tar.gz", hash = "sha256:6411a4cc2f57eed96a0d7bbfa139f68cbe7983018881e1e6d7c46053cd69911f", size = 6209, upload-time = "2025-03-07T18:39:19.358Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/e2/ff9a504da29525e1443004751bdf8e2d23aef8e47a88135aa7a9a026d94a/sphinxcontrib_svg2pdfconverter-1.3.0.tar.gz", hash = "sha256:6411a4cc2f57eed96a0d7bbfa139f68cbe7983018881e1e6d7c46053cd69911f", size = 6209 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/39/7263bf392abd5b102171942337249fb7019332767aa06a6eb88be0456b51/sphinxcontrib_svg2pdfconverter-1.3.0-py3-none-any.whl", hash = "sha256:5df6b0895e2e2101d720bfd08841bb56d74c57b1f86229a7c18b771dfdf4ffbb", size = 7904, upload-time = "2025-03-07T18:39:18.316Z" }, + { url = "https://files.pythonhosted.org/packages/d5/39/7263bf392abd5b102171942337249fb7019332767aa06a6eb88be0456b51/sphinxcontrib_svg2pdfconverter-1.3.0-py3-none-any.whl", hash = "sha256:5df6b0895e2e2101d720bfd08841bb56d74c57b1f86229a7c18b771dfdf4ffbb", size = 7904 }, ] [[package]] @@ -3884,9 +3884,9 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2c/27/d8e269030e1f063494ee2b8110256de8fa05b1ef532c76e6807b5c42c8b1/sphinxext_opengraph-0.10.0.tar.gz", hash = "sha256:5781149c1dfc306c3701661acdd02c512c2e6f21d2253487bf0b39639017fc24", size = 1027562, upload-time = "2025-04-04T21:35:19.646Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/27/d8e269030e1f063494ee2b8110256de8fa05b1ef532c76e6807b5c42c8b1/sphinxext_opengraph-0.10.0.tar.gz", hash = "sha256:5781149c1dfc306c3701661acdd02c512c2e6f21d2253487bf0b39639017fc24", size = 1027562 } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/3f/bb8bbee4d26aa2abd46e76025697040708e1b0d37c9f198877cebf0e3ba0/sphinxext_opengraph-0.10.0-py3-none-any.whl", hash = "sha256:8afd33f96a02d9506d9dc8f284840888ca8948482ac93015a68d88493df43712", size = 1004031, upload-time = "2025-04-04T21:35:17.637Z" }, + { url = "https://files.pythonhosted.org/packages/47/3f/bb8bbee4d26aa2abd46e76025697040708e1b0d37c9f198877cebf0e3ba0/sphinxext_opengraph-0.10.0-py3-none-any.whl", hash = "sha256:8afd33f96a02d9506d9dc8f284840888ca8948482ac93015a68d88493df43712", size = 1004031 }, ] [[package]] @@ -3897,49 +3897,49 @@ dependencies = [ { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/66/45b165c595ec89aa7dcc2c1cd222ab269bc753f1fc7a1e68f8481bd957bf/sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9", size = 9689424, upload-time = "2025-05-14T17:10:32.339Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/12/d7c445b1940276a828efce7331cb0cb09d6e5f049651db22f4ebb0922b77/sqlalchemy-2.0.41-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b1f09b6821406ea1f94053f346f28f8215e293344209129a9c0fcc3578598d7b", size = 2117967, upload-time = "2025-05-14T17:48:15.841Z" }, - { url = "https://files.pythonhosted.org/packages/6f/b8/cb90f23157e28946b27eb01ef401af80a1fab7553762e87df51507eaed61/sqlalchemy-2.0.41-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1936af879e3db023601196a1684d28e12f19ccf93af01bf3280a3262c4b6b4e5", size = 2107583, upload-time = "2025-05-14T17:48:18.688Z" }, - { url = "https://files.pythonhosted.org/packages/9e/c2/eef84283a1c8164a207d898e063edf193d36a24fb6a5bb3ce0634b92a1e8/sqlalchemy-2.0.41-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2ac41acfc8d965fb0c464eb8f44995770239668956dc4cdf502d1b1ffe0d747", size = 3186025, upload-time = "2025-05-14T17:51:51.226Z" }, - { url = "https://files.pythonhosted.org/packages/bd/72/49d52bd3c5e63a1d458fd6d289a1523a8015adedbddf2c07408ff556e772/sqlalchemy-2.0.41-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81c24e0c0fde47a9723c81d5806569cddef103aebbf79dbc9fcbb617153dea30", size = 3186259, upload-time = "2025-05-14T17:55:22.526Z" }, - { url = "https://files.pythonhosted.org/packages/4f/9e/e3ffc37d29a3679a50b6bbbba94b115f90e565a2b4545abb17924b94c52d/sqlalchemy-2.0.41-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23a8825495d8b195c4aa9ff1c430c28f2c821e8c5e2d98089228af887e5d7e29", size = 3126803, upload-time = "2025-05-14T17:51:53.277Z" }, - { url = "https://files.pythonhosted.org/packages/8a/76/56b21e363f6039978ae0b72690237b38383e4657281285a09456f313dd77/sqlalchemy-2.0.41-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:60c578c45c949f909a4026b7807044e7e564adf793537fc762b2489d522f3d11", size = 3148566, upload-time = "2025-05-14T17:55:24.398Z" }, - { url = "https://files.pythonhosted.org/packages/3b/92/11b8e1b69bf191bc69e300a99badbbb5f2f1102f2b08b39d9eee2e21f565/sqlalchemy-2.0.41-cp310-cp310-win32.whl", hash = "sha256:118c16cd3f1b00c76d69343e38602006c9cfb9998fa4f798606d28d63f23beda", size = 2086696, upload-time = "2025-05-14T17:55:59.136Z" }, - { url = "https://files.pythonhosted.org/packages/5c/88/2d706c9cc4502654860f4576cd54f7db70487b66c3b619ba98e0be1a4642/sqlalchemy-2.0.41-cp310-cp310-win_amd64.whl", hash = "sha256:7492967c3386df69f80cf67efd665c0f667cee67032090fe01d7d74b0e19bb08", size = 2110200, upload-time = "2025-05-14T17:56:00.757Z" }, - { url = "https://files.pythonhosted.org/packages/37/4e/b00e3ffae32b74b5180e15d2ab4040531ee1bef4c19755fe7926622dc958/sqlalchemy-2.0.41-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6375cd674fe82d7aa9816d1cb96ec592bac1726c11e0cafbf40eeee9a4516b5f", size = 2121232, upload-time = "2025-05-14T17:48:20.444Z" }, - { url = "https://files.pythonhosted.org/packages/ef/30/6547ebb10875302074a37e1970a5dce7985240665778cfdee2323709f749/sqlalchemy-2.0.41-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f8c9fdd15a55d9465e590a402f42082705d66b05afc3ffd2d2eb3c6ba919560", size = 2110897, upload-time = "2025-05-14T17:48:21.634Z" }, - { url = "https://files.pythonhosted.org/packages/9e/21/59df2b41b0f6c62da55cd64798232d7349a9378befa7f1bb18cf1dfd510a/sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f9dc8c44acdee06c8fc6440db9eae8b4af8b01e4b1aee7bdd7241c22edff4f", size = 3273313, upload-time = "2025-05-14T17:51:56.205Z" }, - { url = "https://files.pythonhosted.org/packages/62/e4/b9a7a0e5c6f79d49bcd6efb6e90d7536dc604dab64582a9dec220dab54b6/sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c11ceb9a1f482c752a71f203a81858625d8df5746d787a4786bca4ffdf71c6", size = 3273807, upload-time = "2025-05-14T17:55:26.928Z" }, - { url = "https://files.pythonhosted.org/packages/39/d8/79f2427251b44ddee18676c04eab038d043cff0e764d2d8bb08261d6135d/sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:911cc493ebd60de5f285bcae0491a60b4f2a9f0f5c270edd1c4dbaef7a38fc04", size = 3209632, upload-time = "2025-05-14T17:51:59.384Z" }, - { url = "https://files.pythonhosted.org/packages/d4/16/730a82dda30765f63e0454918c982fb7193f6b398b31d63c7c3bd3652ae5/sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03968a349db483936c249f4d9cd14ff2c296adfa1290b660ba6516f973139582", size = 3233642, upload-time = "2025-05-14T17:55:29.901Z" }, - { url = "https://files.pythonhosted.org/packages/04/61/c0d4607f7799efa8b8ea3c49b4621e861c8f5c41fd4b5b636c534fcb7d73/sqlalchemy-2.0.41-cp311-cp311-win32.whl", hash = "sha256:293cd444d82b18da48c9f71cd7005844dbbd06ca19be1ccf6779154439eec0b8", size = 2086475, upload-time = "2025-05-14T17:56:02.095Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8e/8344f8ae1cb6a479d0741c02cd4f666925b2bf02e2468ddaf5ce44111f30/sqlalchemy-2.0.41-cp311-cp311-win_amd64.whl", hash = "sha256:3d3549fc3e40667ec7199033a4e40a2f669898a00a7b18a931d3efb4c7900504", size = 2110903, upload-time = "2025-05-14T17:56:03.499Z" }, - { url = "https://files.pythonhosted.org/packages/3e/2a/f1f4e068b371154740dd10fb81afb5240d5af4aa0087b88d8b308b5429c2/sqlalchemy-2.0.41-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:81f413674d85cfd0dfcd6512e10e0f33c19c21860342a4890c3a2b59479929f9", size = 2119645, upload-time = "2025-05-14T17:55:24.854Z" }, - { url = "https://files.pythonhosted.org/packages/9b/e8/c664a7e73d36fbfc4730f8cf2bf930444ea87270f2825efbe17bf808b998/sqlalchemy-2.0.41-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:598d9ebc1e796431bbd068e41e4de4dc34312b7aa3292571bb3674a0cb415dd1", size = 2107399, upload-time = "2025-05-14T17:55:28.097Z" }, - { url = "https://files.pythonhosted.org/packages/5c/78/8a9cf6c5e7135540cb682128d091d6afa1b9e48bd049b0d691bf54114f70/sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a104c5694dfd2d864a6f91b0956eb5d5883234119cb40010115fd45a16da5e70", size = 3293269, upload-time = "2025-05-14T17:50:38.227Z" }, - { url = "https://files.pythonhosted.org/packages/3c/35/f74add3978c20de6323fb11cb5162702670cc7a9420033befb43d8d5b7a4/sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6145afea51ff0af7f2564a05fa95eb46f542919e6523729663a5d285ecb3cf5e", size = 3303364, upload-time = "2025-05-14T17:51:49.829Z" }, - { url = "https://files.pythonhosted.org/packages/6a/d4/c990f37f52c3f7748ebe98883e2a0f7d038108c2c5a82468d1ff3eec50b7/sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b46fa6eae1cd1c20e6e6f44e19984d438b6b2d8616d21d783d150df714f44078", size = 3229072, upload-time = "2025-05-14T17:50:39.774Z" }, - { url = "https://files.pythonhosted.org/packages/15/69/cab11fecc7eb64bc561011be2bd03d065b762d87add52a4ca0aca2e12904/sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41836fe661cc98abfae476e14ba1906220f92c4e528771a8a3ae6a151242d2ae", size = 3268074, upload-time = "2025-05-14T17:51:51.736Z" }, - { url = "https://files.pythonhosted.org/packages/5c/ca/0c19ec16858585d37767b167fc9602593f98998a68a798450558239fb04a/sqlalchemy-2.0.41-cp312-cp312-win32.whl", hash = "sha256:a8808d5cf866c781150d36a3c8eb3adccfa41a8105d031bf27e92c251e3969d6", size = 2084514, upload-time = "2025-05-14T17:55:49.915Z" }, - { url = "https://files.pythonhosted.org/packages/7f/23/4c2833d78ff3010a4e17f984c734f52b531a8c9060a50429c9d4b0211be6/sqlalchemy-2.0.41-cp312-cp312-win_amd64.whl", hash = "sha256:5b14e97886199c1f52c14629c11d90c11fbb09e9334fa7bb5f6d068d9ced0ce0", size = 2111557, upload-time = "2025-05-14T17:55:51.349Z" }, - { url = "https://files.pythonhosted.org/packages/d3/ad/2e1c6d4f235a97eeef52d0200d8ddda16f6c4dd70ae5ad88c46963440480/sqlalchemy-2.0.41-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eeb195cdedaf17aab6b247894ff2734dcead6c08f748e617bfe05bd5a218443", size = 2115491, upload-time = "2025-05-14T17:55:31.177Z" }, - { url = "https://files.pythonhosted.org/packages/cf/8d/be490e5db8400dacc89056f78a52d44b04fbf75e8439569d5b879623a53b/sqlalchemy-2.0.41-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d4ae769b9c1c7757e4ccce94b0641bc203bbdf43ba7a2413ab2523d8d047d8dc", size = 2102827, upload-time = "2025-05-14T17:55:34.921Z" }, - { url = "https://files.pythonhosted.org/packages/a0/72/c97ad430f0b0e78efaf2791342e13ffeafcbb3c06242f01a3bb8fe44f65d/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a62448526dd9ed3e3beedc93df9bb6b55a436ed1474db31a2af13b313a70a7e1", size = 3225224, upload-time = "2025-05-14T17:50:41.418Z" }, - { url = "https://files.pythonhosted.org/packages/5e/51/5ba9ea3246ea068630acf35a6ba0d181e99f1af1afd17e159eac7e8bc2b8/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc56c9788617b8964ad02e8fcfeed4001c1f8ba91a9e1f31483c0dffb207002a", size = 3230045, upload-time = "2025-05-14T17:51:54.722Z" }, - { url = "https://files.pythonhosted.org/packages/78/2f/8c14443b2acea700c62f9b4a8bad9e49fc1b65cfb260edead71fd38e9f19/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c153265408d18de4cc5ded1941dcd8315894572cddd3c58df5d5b5705b3fa28d", size = 3159357, upload-time = "2025-05-14T17:50:43.483Z" }, - { url = "https://files.pythonhosted.org/packages/fc/b2/43eacbf6ccc5276d76cea18cb7c3d73e294d6fb21f9ff8b4eef9b42bbfd5/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f67766965996e63bb46cfbf2ce5355fc32d9dd3b8ad7e536a920ff9ee422e23", size = 3197511, upload-time = "2025-05-14T17:51:57.308Z" }, - { url = "https://files.pythonhosted.org/packages/fa/2e/677c17c5d6a004c3c45334ab1dbe7b7deb834430b282b8a0f75ae220c8eb/sqlalchemy-2.0.41-cp313-cp313-win32.whl", hash = "sha256:bfc9064f6658a3d1cadeaa0ba07570b83ce6801a1314985bf98ec9b95d74e15f", size = 2082420, upload-time = "2025-05-14T17:55:52.69Z" }, - { url = "https://files.pythonhosted.org/packages/e9/61/e8c1b9b6307c57157d328dd8b8348ddc4c47ffdf1279365a13b2b98b8049/sqlalchemy-2.0.41-cp313-cp313-win_amd64.whl", hash = "sha256:82ca366a844eb551daff9d2e6e7a9e5e76d2612c8564f58db6c19a726869c1df", size = 2108329, upload-time = "2025-05-14T17:55:54.495Z" }, - { url = "https://files.pythonhosted.org/packages/dd/1c/3d2a893c020fcc18463794e0a687de58044d1c8a9892d23548ca7e71274a/sqlalchemy-2.0.41-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9a420a91913092d1e20c86a2f5f1fc85c1a8924dbcaf5e0586df8aceb09c9cc2", size = 2121327, upload-time = "2025-05-14T18:01:30.842Z" }, - { url = "https://files.pythonhosted.org/packages/3e/84/389c8f7c7b465682c4e5ba97f6e7825149a6625c629e09b5e872ec3b378f/sqlalchemy-2.0.41-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:906e6b0d7d452e9a98e5ab8507c0da791856b2380fdee61b765632bb8698026f", size = 2110739, upload-time = "2025-05-14T18:01:32.881Z" }, - { url = "https://files.pythonhosted.org/packages/b2/3d/036e84ecb46d6687fa57dc25ab366dff50773a19364def210b8770fd1516/sqlalchemy-2.0.41-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a373a400f3e9bac95ba2a06372c4fd1412a7cee53c37fc6c05f829bf672b8769", size = 3198018, upload-time = "2025-05-14T17:57:53.791Z" }, - { url = "https://files.pythonhosted.org/packages/8d/de/112e2142bf730a16a6cb43efc87e36dd62426e155727490c041130c6e852/sqlalchemy-2.0.41-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:087b6b52de812741c27231b5a3586384d60c353fbd0e2f81405a814b5591dc8b", size = 3197074, upload-time = "2025-05-14T17:36:18.732Z" }, - { url = "https://files.pythonhosted.org/packages/d4/be/a766c78ec3050cb5b734c3087cd20bafd7370b0ab0c8636a87652631af1f/sqlalchemy-2.0.41-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:34ea30ab3ec98355235972dadc497bb659cc75f8292b760394824fab9cf39826", size = 3138698, upload-time = "2025-05-14T17:57:55.395Z" }, - { url = "https://files.pythonhosted.org/packages/e5/c3/245e39ec45e1a8c86ff1ac3a88b13d0457307ac728eaeb217834a3ac6813/sqlalchemy-2.0.41-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8280856dd7c6a68ab3a164b4a4b1c51f7691f6d04af4d4ca23d6ecf2261b7923", size = 3160877, upload-time = "2025-05-14T17:36:20.178Z" }, - { url = "https://files.pythonhosted.org/packages/d7/0c/cda8631405f6417208e160070b513bb752da0885e462fce42ac200c8262f/sqlalchemy-2.0.41-cp39-cp39-win32.whl", hash = "sha256:b50eab9994d64f4a823ff99a0ed28a6903224ddbe7fef56a6dd865eec9243440", size = 2089270, upload-time = "2025-05-14T18:01:41.315Z" }, - { url = "https://files.pythonhosted.org/packages/b0/1f/f68c58970d80ea5a1868ca5dc965d154a3b711f9ab06376ad9840d1475b8/sqlalchemy-2.0.41-cp39-cp39-win_amd64.whl", hash = "sha256:5e22575d169529ac3e0a120cf050ec9daa94b6a9597993d1702884f6954a7d71", size = 2113134, upload-time = "2025-05-14T18:01:42.801Z" }, - { url = "https://files.pythonhosted.org/packages/1c/fc/9ba22f01b5cdacc8f5ed0d22304718d2c758fce3fd49a5372b886a86f37c/sqlalchemy-2.0.41-py3-none-any.whl", hash = "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576", size = 1911224, upload-time = "2025-05-14T17:39:42.154Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/63/66/45b165c595ec89aa7dcc2c1cd222ab269bc753f1fc7a1e68f8481bd957bf/sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9", size = 9689424 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/12/d7c445b1940276a828efce7331cb0cb09d6e5f049651db22f4ebb0922b77/sqlalchemy-2.0.41-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b1f09b6821406ea1f94053f346f28f8215e293344209129a9c0fcc3578598d7b", size = 2117967 }, + { url = "https://files.pythonhosted.org/packages/6f/b8/cb90f23157e28946b27eb01ef401af80a1fab7553762e87df51507eaed61/sqlalchemy-2.0.41-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1936af879e3db023601196a1684d28e12f19ccf93af01bf3280a3262c4b6b4e5", size = 2107583 }, + { url = "https://files.pythonhosted.org/packages/9e/c2/eef84283a1c8164a207d898e063edf193d36a24fb6a5bb3ce0634b92a1e8/sqlalchemy-2.0.41-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2ac41acfc8d965fb0c464eb8f44995770239668956dc4cdf502d1b1ffe0d747", size = 3186025 }, + { url = "https://files.pythonhosted.org/packages/bd/72/49d52bd3c5e63a1d458fd6d289a1523a8015adedbddf2c07408ff556e772/sqlalchemy-2.0.41-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81c24e0c0fde47a9723c81d5806569cddef103aebbf79dbc9fcbb617153dea30", size = 3186259 }, + { url = "https://files.pythonhosted.org/packages/4f/9e/e3ffc37d29a3679a50b6bbbba94b115f90e565a2b4545abb17924b94c52d/sqlalchemy-2.0.41-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23a8825495d8b195c4aa9ff1c430c28f2c821e8c5e2d98089228af887e5d7e29", size = 3126803 }, + { url = "https://files.pythonhosted.org/packages/8a/76/56b21e363f6039978ae0b72690237b38383e4657281285a09456f313dd77/sqlalchemy-2.0.41-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:60c578c45c949f909a4026b7807044e7e564adf793537fc762b2489d522f3d11", size = 3148566 }, + { url = "https://files.pythonhosted.org/packages/3b/92/11b8e1b69bf191bc69e300a99badbbb5f2f1102f2b08b39d9eee2e21f565/sqlalchemy-2.0.41-cp310-cp310-win32.whl", hash = "sha256:118c16cd3f1b00c76d69343e38602006c9cfb9998fa4f798606d28d63f23beda", size = 2086696 }, + { url = "https://files.pythonhosted.org/packages/5c/88/2d706c9cc4502654860f4576cd54f7db70487b66c3b619ba98e0be1a4642/sqlalchemy-2.0.41-cp310-cp310-win_amd64.whl", hash = "sha256:7492967c3386df69f80cf67efd665c0f667cee67032090fe01d7d74b0e19bb08", size = 2110200 }, + { url = "https://files.pythonhosted.org/packages/37/4e/b00e3ffae32b74b5180e15d2ab4040531ee1bef4c19755fe7926622dc958/sqlalchemy-2.0.41-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6375cd674fe82d7aa9816d1cb96ec592bac1726c11e0cafbf40eeee9a4516b5f", size = 2121232 }, + { url = "https://files.pythonhosted.org/packages/ef/30/6547ebb10875302074a37e1970a5dce7985240665778cfdee2323709f749/sqlalchemy-2.0.41-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f8c9fdd15a55d9465e590a402f42082705d66b05afc3ffd2d2eb3c6ba919560", size = 2110897 }, + { url = "https://files.pythonhosted.org/packages/9e/21/59df2b41b0f6c62da55cd64798232d7349a9378befa7f1bb18cf1dfd510a/sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f9dc8c44acdee06c8fc6440db9eae8b4af8b01e4b1aee7bdd7241c22edff4f", size = 3273313 }, + { url = "https://files.pythonhosted.org/packages/62/e4/b9a7a0e5c6f79d49bcd6efb6e90d7536dc604dab64582a9dec220dab54b6/sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c11ceb9a1f482c752a71f203a81858625d8df5746d787a4786bca4ffdf71c6", size = 3273807 }, + { url = "https://files.pythonhosted.org/packages/39/d8/79f2427251b44ddee18676c04eab038d043cff0e764d2d8bb08261d6135d/sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:911cc493ebd60de5f285bcae0491a60b4f2a9f0f5c270edd1c4dbaef7a38fc04", size = 3209632 }, + { url = "https://files.pythonhosted.org/packages/d4/16/730a82dda30765f63e0454918c982fb7193f6b398b31d63c7c3bd3652ae5/sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03968a349db483936c249f4d9cd14ff2c296adfa1290b660ba6516f973139582", size = 3233642 }, + { url = "https://files.pythonhosted.org/packages/04/61/c0d4607f7799efa8b8ea3c49b4621e861c8f5c41fd4b5b636c534fcb7d73/sqlalchemy-2.0.41-cp311-cp311-win32.whl", hash = "sha256:293cd444d82b18da48c9f71cd7005844dbbd06ca19be1ccf6779154439eec0b8", size = 2086475 }, + { url = "https://files.pythonhosted.org/packages/9d/8e/8344f8ae1cb6a479d0741c02cd4f666925b2bf02e2468ddaf5ce44111f30/sqlalchemy-2.0.41-cp311-cp311-win_amd64.whl", hash = "sha256:3d3549fc3e40667ec7199033a4e40a2f669898a00a7b18a931d3efb4c7900504", size = 2110903 }, + { url = "https://files.pythonhosted.org/packages/3e/2a/f1f4e068b371154740dd10fb81afb5240d5af4aa0087b88d8b308b5429c2/sqlalchemy-2.0.41-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:81f413674d85cfd0dfcd6512e10e0f33c19c21860342a4890c3a2b59479929f9", size = 2119645 }, + { url = "https://files.pythonhosted.org/packages/9b/e8/c664a7e73d36fbfc4730f8cf2bf930444ea87270f2825efbe17bf808b998/sqlalchemy-2.0.41-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:598d9ebc1e796431bbd068e41e4de4dc34312b7aa3292571bb3674a0cb415dd1", size = 2107399 }, + { url = "https://files.pythonhosted.org/packages/5c/78/8a9cf6c5e7135540cb682128d091d6afa1b9e48bd049b0d691bf54114f70/sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a104c5694dfd2d864a6f91b0956eb5d5883234119cb40010115fd45a16da5e70", size = 3293269 }, + { url = "https://files.pythonhosted.org/packages/3c/35/f74add3978c20de6323fb11cb5162702670cc7a9420033befb43d8d5b7a4/sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6145afea51ff0af7f2564a05fa95eb46f542919e6523729663a5d285ecb3cf5e", size = 3303364 }, + { url = "https://files.pythonhosted.org/packages/6a/d4/c990f37f52c3f7748ebe98883e2a0f7d038108c2c5a82468d1ff3eec50b7/sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b46fa6eae1cd1c20e6e6f44e19984d438b6b2d8616d21d783d150df714f44078", size = 3229072 }, + { url = "https://files.pythonhosted.org/packages/15/69/cab11fecc7eb64bc561011be2bd03d065b762d87add52a4ca0aca2e12904/sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41836fe661cc98abfae476e14ba1906220f92c4e528771a8a3ae6a151242d2ae", size = 3268074 }, + { url = "https://files.pythonhosted.org/packages/5c/ca/0c19ec16858585d37767b167fc9602593f98998a68a798450558239fb04a/sqlalchemy-2.0.41-cp312-cp312-win32.whl", hash = "sha256:a8808d5cf866c781150d36a3c8eb3adccfa41a8105d031bf27e92c251e3969d6", size = 2084514 }, + { url = "https://files.pythonhosted.org/packages/7f/23/4c2833d78ff3010a4e17f984c734f52b531a8c9060a50429c9d4b0211be6/sqlalchemy-2.0.41-cp312-cp312-win_amd64.whl", hash = "sha256:5b14e97886199c1f52c14629c11d90c11fbb09e9334fa7bb5f6d068d9ced0ce0", size = 2111557 }, + { url = "https://files.pythonhosted.org/packages/d3/ad/2e1c6d4f235a97eeef52d0200d8ddda16f6c4dd70ae5ad88c46963440480/sqlalchemy-2.0.41-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eeb195cdedaf17aab6b247894ff2734dcead6c08f748e617bfe05bd5a218443", size = 2115491 }, + { url = "https://files.pythonhosted.org/packages/cf/8d/be490e5db8400dacc89056f78a52d44b04fbf75e8439569d5b879623a53b/sqlalchemy-2.0.41-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d4ae769b9c1c7757e4ccce94b0641bc203bbdf43ba7a2413ab2523d8d047d8dc", size = 2102827 }, + { url = "https://files.pythonhosted.org/packages/a0/72/c97ad430f0b0e78efaf2791342e13ffeafcbb3c06242f01a3bb8fe44f65d/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a62448526dd9ed3e3beedc93df9bb6b55a436ed1474db31a2af13b313a70a7e1", size = 3225224 }, + { url = "https://files.pythonhosted.org/packages/5e/51/5ba9ea3246ea068630acf35a6ba0d181e99f1af1afd17e159eac7e8bc2b8/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc56c9788617b8964ad02e8fcfeed4001c1f8ba91a9e1f31483c0dffb207002a", size = 3230045 }, + { url = "https://files.pythonhosted.org/packages/78/2f/8c14443b2acea700c62f9b4a8bad9e49fc1b65cfb260edead71fd38e9f19/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c153265408d18de4cc5ded1941dcd8315894572cddd3c58df5d5b5705b3fa28d", size = 3159357 }, + { url = "https://files.pythonhosted.org/packages/fc/b2/43eacbf6ccc5276d76cea18cb7c3d73e294d6fb21f9ff8b4eef9b42bbfd5/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f67766965996e63bb46cfbf2ce5355fc32d9dd3b8ad7e536a920ff9ee422e23", size = 3197511 }, + { url = "https://files.pythonhosted.org/packages/fa/2e/677c17c5d6a004c3c45334ab1dbe7b7deb834430b282b8a0f75ae220c8eb/sqlalchemy-2.0.41-cp313-cp313-win32.whl", hash = "sha256:bfc9064f6658a3d1cadeaa0ba07570b83ce6801a1314985bf98ec9b95d74e15f", size = 2082420 }, + { url = "https://files.pythonhosted.org/packages/e9/61/e8c1b9b6307c57157d328dd8b8348ddc4c47ffdf1279365a13b2b98b8049/sqlalchemy-2.0.41-cp313-cp313-win_amd64.whl", hash = "sha256:82ca366a844eb551daff9d2e6e7a9e5e76d2612c8564f58db6c19a726869c1df", size = 2108329 }, + { url = "https://files.pythonhosted.org/packages/dd/1c/3d2a893c020fcc18463794e0a687de58044d1c8a9892d23548ca7e71274a/sqlalchemy-2.0.41-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9a420a91913092d1e20c86a2f5f1fc85c1a8924dbcaf5e0586df8aceb09c9cc2", size = 2121327 }, + { url = "https://files.pythonhosted.org/packages/3e/84/389c8f7c7b465682c4e5ba97f6e7825149a6625c629e09b5e872ec3b378f/sqlalchemy-2.0.41-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:906e6b0d7d452e9a98e5ab8507c0da791856b2380fdee61b765632bb8698026f", size = 2110739 }, + { url = "https://files.pythonhosted.org/packages/b2/3d/036e84ecb46d6687fa57dc25ab366dff50773a19364def210b8770fd1516/sqlalchemy-2.0.41-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a373a400f3e9bac95ba2a06372c4fd1412a7cee53c37fc6c05f829bf672b8769", size = 3198018 }, + { url = "https://files.pythonhosted.org/packages/8d/de/112e2142bf730a16a6cb43efc87e36dd62426e155727490c041130c6e852/sqlalchemy-2.0.41-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:087b6b52de812741c27231b5a3586384d60c353fbd0e2f81405a814b5591dc8b", size = 3197074 }, + { url = "https://files.pythonhosted.org/packages/d4/be/a766c78ec3050cb5b734c3087cd20bafd7370b0ab0c8636a87652631af1f/sqlalchemy-2.0.41-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:34ea30ab3ec98355235972dadc497bb659cc75f8292b760394824fab9cf39826", size = 3138698 }, + { url = "https://files.pythonhosted.org/packages/e5/c3/245e39ec45e1a8c86ff1ac3a88b13d0457307ac728eaeb217834a3ac6813/sqlalchemy-2.0.41-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8280856dd7c6a68ab3a164b4a4b1c51f7691f6d04af4d4ca23d6ecf2261b7923", size = 3160877 }, + { url = "https://files.pythonhosted.org/packages/d7/0c/cda8631405f6417208e160070b513bb752da0885e462fce42ac200c8262f/sqlalchemy-2.0.41-cp39-cp39-win32.whl", hash = "sha256:b50eab9994d64f4a823ff99a0ed28a6903224ddbe7fef56a6dd865eec9243440", size = 2089270 }, + { url = "https://files.pythonhosted.org/packages/b0/1f/f68c58970d80ea5a1868ca5dc965d154a3b711f9ab06376ad9840d1475b8/sqlalchemy-2.0.41-cp39-cp39-win_amd64.whl", hash = "sha256:5e22575d169529ac3e0a120cf050ec9daa94b6a9597993d1702884f6954a7d71", size = 2113134 }, + { url = "https://files.pythonhosted.org/packages/1c/fc/9ba22f01b5cdacc8f5ed0d22304718d2c758fce3fd49a5372b886a86f37c/sqlalchemy-2.0.41-py3-none-any.whl", hash = "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576", size = 1911224 }, ] [[package]] @@ -3951,18 +3951,18 @@ dependencies = [ { name = "executing" }, { name = "pure-eval" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 }, ] [[package]] name = "stdlib-list" version = "0.11.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5d/09/8d5c564931ae23bef17420a6c72618463a59222ca4291a7dd88de8a0d490/stdlib_list-0.11.1.tar.gz", hash = "sha256:95ebd1d73da9333bba03ccc097f5bac05e3aa03e6822a0c0290f87e1047f1857", size = 60442, upload-time = "2025-02-18T15:39:38.769Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5d/09/8d5c564931ae23bef17420a6c72618463a59222ca4291a7dd88de8a0d490/stdlib_list-0.11.1.tar.gz", hash = "sha256:95ebd1d73da9333bba03ccc097f5bac05e3aa03e6822a0c0290f87e1047f1857", size = 60442 } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/c7/4102536de33c19d090ed2b04e90e7452e2e3dc653cf3323208034eaaca27/stdlib_list-0.11.1-py3-none-any.whl", hash = "sha256:9029ea5e3dfde8cd4294cfd4d1797be56a67fc4693c606181730148c3fd1da29", size = 83620, upload-time = "2025-02-18T15:39:37.02Z" }, + { url = "https://files.pythonhosted.org/packages/88/c7/4102536de33c19d090ed2b04e90e7452e2e3dc653cf3323208034eaaca27/stdlib_list-0.11.1-py3-none-any.whl", hash = "sha256:9029ea5e3dfde8cd4294cfd4d1797be56a67fc4693c606181730148c3fd1da29", size = 83620 }, ] [[package]] @@ -3972,9 +3972,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pbr" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/28/3f/13cacea96900bbd31bb05c6b74135f85d15564fc583802be56976c940470/stevedore-5.4.1.tar.gz", hash = "sha256:3135b5ae50fe12816ef291baff420acb727fcd356106e3e9cbfa9e5985cd6f4b", size = 513858, upload-time = "2025-02-20T14:03:57.285Z" } +sdist = { url = "https://files.pythonhosted.org/packages/28/3f/13cacea96900bbd31bb05c6b74135f85d15564fc583802be56976c940470/stevedore-5.4.1.tar.gz", hash = "sha256:3135b5ae50fe12816ef291baff420acb727fcd356106e3e9cbfa9e5985cd6f4b", size = 513858 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/45/8c4ebc0c460e6ec38e62ab245ad3c7fc10b210116cea7c16d61602aa9558/stevedore-5.4.1-py3-none-any.whl", hash = "sha256:d10a31c7b86cba16c1f6e8d15416955fc797052351a56af15e608ad20811fcfe", size = 49533, upload-time = "2025-02-20T14:03:55.849Z" }, + { url = "https://files.pythonhosted.org/packages/f7/45/8c4ebc0c460e6ec38e62ab245ad3c7fc10b210116cea7c16d61602aa9558/stevedore-5.4.1-py3-none-any.whl", hash = "sha256:d10a31c7b86cba16c1f6e8d15416955fc797052351a56af15e608ad20811fcfe", size = 49533 }, ] [[package]] @@ -3985,27 +3985,27 @@ dependencies = [ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/15/0218eacd61cda992daf398bc36daf9830c8b430157a3ac0c06379598d24a/stim-1.15.0.tar.gz", hash = "sha256:95236006859d6754be99629d4fb44788e742e962ac8c59caad421ca088f7350e", size = 853226, upload-time = "2025-05-07T06:19:30.452Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/30/e8/5d0c058e59ba156c6f1bfd8569a889dec80154e95d7903bf50bea31814ec/stim-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c10d2022b3c4c245f5f421dbf01b012a4d04901df697d9aca69eaea329c8532", size = 1952385, upload-time = "2025-05-07T06:18:29.003Z" }, - { url = "https://files.pythonhosted.org/packages/16/85/e82bd61413db51c92642620340c9175f0e1e93d2afc5274e8fa775831326/stim-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f240c196f23126bfed79bd78de5baa1fdde9c8fbfe56de032a12657fc42da37", size = 1824039, upload-time = "2025-05-07T06:18:31.537Z" }, - { url = "https://files.pythonhosted.org/packages/d8/06/b267359c50d735ca718dd487ec57842d0ed34865b62b0d8e6bdc3381d611/stim-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31c55fad7529d6ee508f268534eeca1433017f2e83082f88275bea362b94f30f", size = 4982908, upload-time = "2025-05-07T06:18:33.035Z" }, - { url = "https://files.pythonhosted.org/packages/c6/2c/84b07f2fe78f382c3514ce3863554ae47019536293d366e80e57598fe9cb/stim-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:d94638feaac9d037690779c383592bb898eda9db460d23fc0652d10030d570c9", size = 2624472, upload-time = "2025-05-07T06:18:34.678Z" }, - { url = "https://files.pythonhosted.org/packages/94/5f/82a80a3b0e494af4723737ea2109e64edbedc25fe05dcee8918e70d3a060/stim-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:48525d92965cc65b61399a9e1fe1d7a8925981bb4430ef69866d4e5c67a77d16", size = 1956537, upload-time = "2025-05-07T06:18:36.685Z" }, - { url = "https://files.pythonhosted.org/packages/a8/82/0a01580071c6d50107298e93faa88250fc30f1538117ec887ec48de7816d/stim-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0bb3757c69c9b16fd24ff7400b5cddb22017c4cae84fc4b7b73f84373cb03c00", size = 1826988, upload-time = "2025-05-07T06:18:38.598Z" }, - { url = "https://files.pythonhosted.org/packages/d7/c1/1dfa90b0622070eb39b4260eca26814d6fbac0f278e23b156072d9fac86b/stim-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0fb249f1a2897a22cbe4e0c2627abf49188cbbf19b942d4749972d1c3bdf12c", size = 4989254, upload-time = "2025-05-07T06:18:40.628Z" }, - { url = "https://files.pythonhosted.org/packages/cb/27/5b8e8155e7fb75a9313e70f77a62233e0b9041c5acb60f6cf5a908d221e8/stim-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e3b61a2d9dc4b4312f5cf2ccf9c9f7175fe13a12e5c08df99835c5275680919", size = 2625370, upload-time = "2025-05-07T06:18:42.65Z" }, - { url = "https://files.pythonhosted.org/packages/65/99/da44f1fde8692deb74e291899699ee166e5726b975addff50f0f68bfc4c1/stim-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d426e00afe21478828369df3aaa82905e710c5b1f72582ec45244e3739d6183d", size = 1974467, upload-time = "2025-05-07T06:18:44.665Z" }, - { url = "https://files.pythonhosted.org/packages/46/f3/5aa6a7b31bcc9fb2540f65954b99dbf1e8c5fcd8d0aa164857b74e5eae9a/stim-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc613f78bc88b4318d7f34f9fddacec52638c11b72cc618f911bdd7ca153f938", size = 1838840, upload-time = "2025-05-07T06:18:46.025Z" }, - { url = "https://files.pythonhosted.org/packages/5b/25/f3b56b07c0c3fb31cb973a5c47ef88da022a859940dd46c910b706fc74aa/stim-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdd9e5ab85ba2fb113b8834422518f6e46a4aea2e0f6f7305cfc2ad0fcd07086", size = 4968123, upload-time = "2025-05-07T06:18:48.197Z" }, - { url = "https://files.pythonhosted.org/packages/81/7e/abfed103a045a6ee8c7f3f00cd820d1cf9127304066aec42ea9fb89ee9c0/stim-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:e92d5be90f6c92bada6b5aea64dfe9c80813a06e1316a71d5a36203dd24492f5", size = 2625908, upload-time = "2025-05-07T06:18:49.681Z" }, - { url = "https://files.pythonhosted.org/packages/28/7f/825d745dc128321dd2f41da75d18111121a90e7bb711da24f28b1e003c9e/stim-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:673a323402c266b1a1225565d69d31816c3d4a4c259383ed4fa9c15cacd12411", size = 1974528, upload-time = "2025-05-07T06:18:51.125Z" }, - { url = "https://files.pythonhosted.org/packages/bb/99/10604264cd7159573d6d01cdf5f9675c71580dcc3df5c533fccabad59cda/stim-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:35e36d0479015b4dcb4261b8b68be85067cbd4bac5632bdfdb3ee3f8671d05a9", size = 1838700, upload-time = "2025-05-07T06:18:52.95Z" }, - { url = "https://files.pythonhosted.org/packages/25/97/1bf3bf16129667eff1c0d0f3bb95262a2bec8c8d1227aa973b8e2a1935b6/stim-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb9465ab120837ecbd26b5af216a00715f04da087ddcfa09646892c8de720d09", size = 4967782, upload-time = "2025-05-07T06:18:54.94Z" }, - { url = "https://files.pythonhosted.org/packages/ce/94/d44651fd1754b0282d65c2c39dc4c72833c7adc99e7dc873bb6400aa3787/stim-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a49af2ffc5f18178cddb1ef0014568a7114f97fe9a12f2b905ab8e2158d40558", size = 1952843, upload-time = "2025-05-07T06:19:23.931Z" }, - { url = "https://files.pythonhosted.org/packages/bd/6e/b0fe30a5befe967632409ec068d49f4dcc186c7383d245cf8c9a343e3f2d/stim-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:190c5a3c9cecdfae3302d02057d1ed6d9ce7910d2bcc2ff375807d8f8ec5494d", size = 1824199, upload-time = "2025-05-07T06:19:25.347Z" }, - { url = "https://files.pythonhosted.org/packages/48/c1/9a5a0db2e9735debdda7d498c0ae3407aca88b705beb8a8c1c90350d4316/stim-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f64ab075e856040c3b4157a4f2caa329204d579cbd7c0c02c7247e5a78da5db", size = 4993068, upload-time = "2025-05-07T06:19:27.729Z" }, - { url = "https://files.pythonhosted.org/packages/52/26/901a92dedf818c1fb086a160887f39a85f4f3d9e4f683b0f06888c457381/stim-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:d6d409d42899bf35cd949806231d382ee3e4f679dd0e960910b39207d2fbe62e", size = 2711841, upload-time = "2025-05-07T06:19:29.172Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/77/15/0218eacd61cda992daf398bc36daf9830c8b430157a3ac0c06379598d24a/stim-1.15.0.tar.gz", hash = "sha256:95236006859d6754be99629d4fb44788e742e962ac8c59caad421ca088f7350e", size = 853226 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/e8/5d0c058e59ba156c6f1bfd8569a889dec80154e95d7903bf50bea31814ec/stim-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c10d2022b3c4c245f5f421dbf01b012a4d04901df697d9aca69eaea329c8532", size = 1952385 }, + { url = "https://files.pythonhosted.org/packages/16/85/e82bd61413db51c92642620340c9175f0e1e93d2afc5274e8fa775831326/stim-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f240c196f23126bfed79bd78de5baa1fdde9c8fbfe56de032a12657fc42da37", size = 1824039 }, + { url = "https://files.pythonhosted.org/packages/d8/06/b267359c50d735ca718dd487ec57842d0ed34865b62b0d8e6bdc3381d611/stim-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31c55fad7529d6ee508f268534eeca1433017f2e83082f88275bea362b94f30f", size = 4982908 }, + { url = "https://files.pythonhosted.org/packages/c6/2c/84b07f2fe78f382c3514ce3863554ae47019536293d366e80e57598fe9cb/stim-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:d94638feaac9d037690779c383592bb898eda9db460d23fc0652d10030d570c9", size = 2624472 }, + { url = "https://files.pythonhosted.org/packages/94/5f/82a80a3b0e494af4723737ea2109e64edbedc25fe05dcee8918e70d3a060/stim-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:48525d92965cc65b61399a9e1fe1d7a8925981bb4430ef69866d4e5c67a77d16", size = 1956537 }, + { url = "https://files.pythonhosted.org/packages/a8/82/0a01580071c6d50107298e93faa88250fc30f1538117ec887ec48de7816d/stim-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0bb3757c69c9b16fd24ff7400b5cddb22017c4cae84fc4b7b73f84373cb03c00", size = 1826988 }, + { url = "https://files.pythonhosted.org/packages/d7/c1/1dfa90b0622070eb39b4260eca26814d6fbac0f278e23b156072d9fac86b/stim-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0fb249f1a2897a22cbe4e0c2627abf49188cbbf19b942d4749972d1c3bdf12c", size = 4989254 }, + { url = "https://files.pythonhosted.org/packages/cb/27/5b8e8155e7fb75a9313e70f77a62233e0b9041c5acb60f6cf5a908d221e8/stim-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e3b61a2d9dc4b4312f5cf2ccf9c9f7175fe13a12e5c08df99835c5275680919", size = 2625370 }, + { url = "https://files.pythonhosted.org/packages/65/99/da44f1fde8692deb74e291899699ee166e5726b975addff50f0f68bfc4c1/stim-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d426e00afe21478828369df3aaa82905e710c5b1f72582ec45244e3739d6183d", size = 1974467 }, + { url = "https://files.pythonhosted.org/packages/46/f3/5aa6a7b31bcc9fb2540f65954b99dbf1e8c5fcd8d0aa164857b74e5eae9a/stim-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc613f78bc88b4318d7f34f9fddacec52638c11b72cc618f911bdd7ca153f938", size = 1838840 }, + { url = "https://files.pythonhosted.org/packages/5b/25/f3b56b07c0c3fb31cb973a5c47ef88da022a859940dd46c910b706fc74aa/stim-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdd9e5ab85ba2fb113b8834422518f6e46a4aea2e0f6f7305cfc2ad0fcd07086", size = 4968123 }, + { url = "https://files.pythonhosted.org/packages/81/7e/abfed103a045a6ee8c7f3f00cd820d1cf9127304066aec42ea9fb89ee9c0/stim-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:e92d5be90f6c92bada6b5aea64dfe9c80813a06e1316a71d5a36203dd24492f5", size = 2625908 }, + { url = "https://files.pythonhosted.org/packages/28/7f/825d745dc128321dd2f41da75d18111121a90e7bb711da24f28b1e003c9e/stim-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:673a323402c266b1a1225565d69d31816c3d4a4c259383ed4fa9c15cacd12411", size = 1974528 }, + { url = "https://files.pythonhosted.org/packages/bb/99/10604264cd7159573d6d01cdf5f9675c71580dcc3df5c533fccabad59cda/stim-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:35e36d0479015b4dcb4261b8b68be85067cbd4bac5632bdfdb3ee3f8671d05a9", size = 1838700 }, + { url = "https://files.pythonhosted.org/packages/25/97/1bf3bf16129667eff1c0d0f3bb95262a2bec8c8d1227aa973b8e2a1935b6/stim-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb9465ab120837ecbd26b5af216a00715f04da087ddcfa09646892c8de720d09", size = 4967782 }, + { url = "https://files.pythonhosted.org/packages/ce/94/d44651fd1754b0282d65c2c39dc4c72833c7adc99e7dc873bb6400aa3787/stim-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a49af2ffc5f18178cddb1ef0014568a7114f97fe9a12f2b905ab8e2158d40558", size = 1952843 }, + { url = "https://files.pythonhosted.org/packages/bd/6e/b0fe30a5befe967632409ec068d49f4dcc186c7383d245cf8c9a343e3f2d/stim-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:190c5a3c9cecdfae3302d02057d1ed6d9ce7910d2bcc2ff375807d8f8ec5494d", size = 1824199 }, + { url = "https://files.pythonhosted.org/packages/48/c1/9a5a0db2e9735debdda7d498c0ae3407aca88b705beb8a8c1c90350d4316/stim-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f64ab075e856040c3b4157a4f2caa329204d579cbd7c0c02c7247e5a78da5db", size = 4993068 }, + { url = "https://files.pythonhosted.org/packages/52/26/901a92dedf818c1fb086a160887f39a85f4f3d9e4f683b0f06888c457381/stim-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:d6d409d42899bf35cd949806231d382ee3e4f679dd0e960910b39207d2fbe62e", size = 2711841 }, ] [[package]] @@ -4015,85 +4015,85 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mpmath" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353 }, ] [[package]] name = "tabulate" version = "0.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload-time = "2022-10-06T17:21:48.54Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090 } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload-time = "2022-10-06T17:21:44.262Z" }, + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252 }, ] [[package]] name = "termcolor" version = "3.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/6c/3d75c196ac07ac8749600b60b03f4f6094d54e132c4d94ebac6ee0e0add0/termcolor-3.1.0.tar.gz", hash = "sha256:6a6dd7fbee581909eeec6a756cff1d7f7c376063b14e4a298dc4980309e55970", size = 14324, upload-time = "2025-04-30T11:37:53.791Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/6c/3d75c196ac07ac8749600b60b03f4f6094d54e132c4d94ebac6ee0e0add0/termcolor-3.1.0.tar.gz", hash = "sha256:6a6dd7fbee581909eeec6a756cff1d7f7c376063b14e4a298dc4980309e55970", size = 14324 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/bd/de8d508070629b6d84a30d01d57e4a65c69aa7f5abe7560b8fad3b50ea59/termcolor-3.1.0-py3-none-any.whl", hash = "sha256:591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa", size = 7684, upload-time = "2025-04-30T11:37:52.382Z" }, + { url = "https://files.pythonhosted.org/packages/4f/bd/de8d508070629b6d84a30d01d57e4a65c69aa7f5abe7560b8fad3b50ea59/termcolor-3.1.0-py3-none-any.whl", hash = "sha256:591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa", size = 7684 }, ] [[package]] name = "tomli" version = "2.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload-time = "2024-11-27T22:38:36.873Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077, upload-time = "2024-11-27T22:37:54.956Z" }, - { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429, upload-time = "2024-11-27T22:37:56.698Z" }, - { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067, upload-time = "2024-11-27T22:37:57.63Z" }, - { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030, upload-time = "2024-11-27T22:37:59.344Z" }, - { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898, upload-time = "2024-11-27T22:38:00.429Z" }, - { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894, upload-time = "2024-11-27T22:38:02.094Z" }, - { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319, upload-time = "2024-11-27T22:38:03.206Z" }, - { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload-time = "2024-11-27T22:38:04.217Z" }, - { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310, upload-time = "2024-11-27T22:38:05.908Z" }, - { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309, upload-time = "2024-11-27T22:38:06.812Z" }, - { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload-time = "2024-11-27T22:38:07.731Z" }, - { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload-time = "2024-11-27T22:38:09.384Z" }, - { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload-time = "2024-11-27T22:38:10.329Z" }, - { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload-time = "2024-11-27T22:38:11.443Z" }, - { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload-time = "2024-11-27T22:38:13.099Z" }, - { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload-time = "2024-11-27T22:38:14.766Z" }, - { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload-time = "2024-11-27T22:38:15.843Z" }, - { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload-time = "2024-11-27T22:38:17.645Z" }, - { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload-time = "2024-11-27T22:38:19.159Z" }, - { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload-time = "2024-11-27T22:38:20.064Z" }, - { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload-time = "2024-11-27T22:38:21.659Z" }, - { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload-time = "2024-11-27T22:38:22.693Z" }, - { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload-time = "2024-11-27T22:38:24.367Z" }, - { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload-time = "2024-11-27T22:38:26.081Z" }, - { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload-time = "2024-11-27T22:38:27.921Z" }, - { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload-time = "2024-11-27T22:38:29.591Z" }, - { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload-time = "2024-11-27T22:38:30.639Z" }, - { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload-time = "2024-11-27T22:38:31.702Z" }, - { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724, upload-time = "2024-11-27T22:38:32.837Z" }, - { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383, upload-time = "2024-11-27T22:38:34.455Z" }, - { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 }, + { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 }, + { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 }, + { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 }, + { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 }, + { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 }, + { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 }, + { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 }, + { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 }, + { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 }, + { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 }, + { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 }, + { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 }, + { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 }, + { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 }, + { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 }, + { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 }, + { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 }, + { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 }, + { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 }, + { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 }, + { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 }, + { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 }, + { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 }, + { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 }, + { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 }, + { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 }, + { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 }, + { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 }, + { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 }, + { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, ] [[package]] name = "tornado" version = "6.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934, upload-time = "2025-05-22T18:15:38.788Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934 } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948, upload-time = "2025-05-22T18:15:20.862Z" }, - { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112, upload-time = "2025-05-22T18:15:22.591Z" }, - { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672, upload-time = "2025-05-22T18:15:24.027Z" }, - { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019, upload-time = "2025-05-22T18:15:25.735Z" }, - { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252, upload-time = "2025-05-22T18:15:27.499Z" }, - { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930, upload-time = "2025-05-22T18:15:29.299Z" }, - { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351, upload-time = "2025-05-22T18:15:31.038Z" }, - { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328, upload-time = "2025-05-22T18:15:32.426Z" }, - { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396, upload-time = "2025-05-22T18:15:34.205Z" }, - { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840, upload-time = "2025-05-22T18:15:36.1Z" }, - { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596, upload-time = "2025-05-22T18:15:37.433Z" }, + { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948 }, + { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112 }, + { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672 }, + { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019 }, + { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252 }, + { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930 }, + { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351 }, + { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328 }, + { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396 }, + { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840 }, + { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596 }, ] [[package]] @@ -4103,84 +4103,84 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, ] [[package]] name = "traitlets" version = "5.14.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, ] [[package]] name = "typing-extensions" version = "4.14.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" }, + { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906 }, ] [[package]] name = "tzdata" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, ] [[package]] name = "urllib3" version = "2.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795 }, ] [[package]] name = "wcwidth" version = "0.2.13" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload-time = "2024-01-06T02:10:57.829Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload-time = "2024-01-06T02:10:55.763Z" }, + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, ] [[package]] name = "widgetsnbextension" version = "4.0.14" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/41/53/2e0253c5efd69c9656b1843892052a31c36d37ad42812b5da45c62191f7e/widgetsnbextension-4.0.14.tar.gz", hash = "sha256:a3629b04e3edb893212df862038c7232f62973373869db5084aed739b437b5af", size = 1097428, upload-time = "2025-04-10T13:01:25.628Z" } +sdist = { url = "https://files.pythonhosted.org/packages/41/53/2e0253c5efd69c9656b1843892052a31c36d37ad42812b5da45c62191f7e/widgetsnbextension-4.0.14.tar.gz", hash = "sha256:a3629b04e3edb893212df862038c7232f62973373869db5084aed739b437b5af", size = 1097428 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/51/5447876806d1088a0f8f71e16542bf350918128d0a69437df26047c8e46f/widgetsnbextension-4.0.14-py3-none-any.whl", hash = "sha256:4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575", size = 2196503, upload-time = "2025-04-10T13:01:23.086Z" }, + { url = "https://files.pythonhosted.org/packages/ca/51/5447876806d1088a0f8f71e16542bf350918128d0a69437df26047c8e46f/widgetsnbextension-4.0.14-py3-none-any.whl", hash = "sha256:4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575", size = 2196503 }, ] [[package]] name = "z3-solver" version = "4.15.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/96/c5481ef8e1fb64f398cb81caca0a808b4eee845091d41fb6e72bf06a9ee2/z3_solver-4.15.1.0.tar.gz", hash = "sha256:e8522602a76f6e45c45e78eec7bff5cbaa44fa51e94dce0d5432b0f9ab3f7064", size = 5054686, upload-time = "2025-06-08T18:54:41.118Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/c5481ef8e1fb64f398cb81caca0a808b4eee845091d41fb6e72bf06a9ee2/z3_solver-4.15.1.0.tar.gz", hash = "sha256:e8522602a76f6e45c45e78eec7bff5cbaa44fa51e94dce0d5432b0f9ab3f7064", size = 5054686 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/8b/e47ed5d6e3b565e400f2948549a9d633bdeea0eb081ddb3047bd04266d92/z3_solver-4.15.1.0-py3-none-macosx_13_0_arm64.whl", hash = "sha256:4fdf8675500f32b03114670a8c734fa9fc9f8c9bd1047d575449ca69fa397ac5", size = 37542839, upload-time = "2025-06-08T18:54:25.435Z" }, - { url = "https://files.pythonhosted.org/packages/f0/10/b9828d71ac9a65f9ddf75a94b95f269c063dc052ccb200ecfcd81cf5557a/z3_solver-4.15.1.0-py3-none-macosx_13_0_x86_64.whl", hash = "sha256:878814bef41ca3d9957923d07fc3084967d14dff1a3c039d00f76324461bb11b", size = 40356020, upload-time = "2025-06-08T18:54:28.354Z" }, - { url = "https://files.pythonhosted.org/packages/96/95/b37b98fa23811559987e8403729093b8fae1d0c5321286667768956e31da/z3_solver-4.15.1.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f1d15073c78d793be56ff334f3d4770fe66d57808fdad2780e25c936d8fab0a", size = 29530873, upload-time = "2025-06-08T18:54:31.026Z" }, - { url = "https://files.pythonhosted.org/packages/54/c9/117858dc7396435026988fb3ab59c6634887488511cc1014007a81fa3b0e/z3_solver-4.15.1.0-py3-none-manylinux_2_34_aarch64.whl", hash = "sha256:1ac01865e9b07e35b8856157fa95259b1741529c05ef019f599675c7b0caab42", size = 27517613, upload-time = "2025-06-08T18:54:33.89Z" }, - { url = "https://files.pythonhosted.org/packages/32/c2/1cb7df76d243f33f99416e9fcfefc76195cf9305e23fc9296edf6d5fb6be/z3_solver-4.15.1.0-py3-none-win32.whl", hash = "sha256:0b41c73ed6ea30514210853e31b432c3654b36e7e7a74db23906ddba345cb654", size = 13363408, upload-time = "2025-06-08T18:54:36.521Z" }, - { url = "https://files.pythonhosted.org/packages/28/ee/110ee33282331c5dab4e63bb570b345d85b2ed5ee1d30a54a987903e22fe/z3_solver-4.15.1.0-py3-none-win_amd64.whl", hash = "sha256:1d858c5b7ecd60788576ec6ae62cc7b9ae142e9ed38dff3dfd415e2fe230c712", size = 16428380, upload-time = "2025-06-08T18:54:38.872Z" }, + { url = "https://files.pythonhosted.org/packages/bc/8b/e47ed5d6e3b565e400f2948549a9d633bdeea0eb081ddb3047bd04266d92/z3_solver-4.15.1.0-py3-none-macosx_13_0_arm64.whl", hash = "sha256:4fdf8675500f32b03114670a8c734fa9fc9f8c9bd1047d575449ca69fa397ac5", size = 37542839 }, + { url = "https://files.pythonhosted.org/packages/f0/10/b9828d71ac9a65f9ddf75a94b95f269c063dc052ccb200ecfcd81cf5557a/z3_solver-4.15.1.0-py3-none-macosx_13_0_x86_64.whl", hash = "sha256:878814bef41ca3d9957923d07fc3084967d14dff1a3c039d00f76324461bb11b", size = 40356020 }, + { url = "https://files.pythonhosted.org/packages/96/95/b37b98fa23811559987e8403729093b8fae1d0c5321286667768956e31da/z3_solver-4.15.1.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f1d15073c78d793be56ff334f3d4770fe66d57808fdad2780e25c936d8fab0a", size = 29530873 }, + { url = "https://files.pythonhosted.org/packages/54/c9/117858dc7396435026988fb3ab59c6634887488511cc1014007a81fa3b0e/z3_solver-4.15.1.0-py3-none-manylinux_2_34_aarch64.whl", hash = "sha256:1ac01865e9b07e35b8856157fa95259b1741529c05ef019f599675c7b0caab42", size = 27517613 }, + { url = "https://files.pythonhosted.org/packages/32/c2/1cb7df76d243f33f99416e9fcfefc76195cf9305e23fc9296edf6d5fb6be/z3_solver-4.15.1.0-py3-none-win32.whl", hash = "sha256:0b41c73ed6ea30514210853e31b432c3654b36e7e7a74db23906ddba345cb654", size = 13363408 }, + { url = "https://files.pythonhosted.org/packages/28/ee/110ee33282331c5dab4e63bb570b345d85b2ed5ee1d30a54a987903e22fe/z3_solver-4.15.1.0-py3-none-win_amd64.whl", hash = "sha256:1d858c5b7ecd60788576ec6ae62cc7b9ae142e9ed38dff3dfd415e2fe230c712", size = 16428380 }, ] [[package]] name = "zipp" version = "3.23.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276 }, ] From 3478a68a572f95641e1e4ad00c3b5d88e29728a7 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 29 Jul 2025 16:42:32 +0200 Subject: [PATCH 116/156] remove commented out code --- src/mqt/qecc/circuit_synthesis/encoding.py | 4 ---- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 14 -------------- 2 files changed, 18 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/encoding.py b/src/mqt/qecc/circuit_synthesis/encoding.py index f0970df80..cb419b182 100644 --- a/src/mqt/qecc/circuit_synthesis/encoding.py +++ b/src/mqt/qecc/circuit_synthesis/encoding.py @@ -58,10 +58,6 @@ def heuristic_encoding_circuit( ge = GaussianElimination(matrix=np.vstack((checks, logicals)), code=code, parallel_elimination=optimize_depth) ge.basic_elimination() checks, cnots = ge.matrix, ge.eliminations - # checks, cnots = heuristic_gaussian_elimination( - # np.vstack((checks, logicals)), - # parallel_elimination=optimize_depth, - # ) # after reduction there still might be some overlap between initialized qubits and encoding qubits, we simply perform CNOTs to correct this encoding_qubits = np.where(checks[n_checks:, :].sum(axis=0) != 0)[0] diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 9b3a16ae9..ac909126d 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -94,20 +94,6 @@ def iterative_search_with_timeout( return None, max_param -# def print_dynamic_eliminations(eliminations, failed_cnots) -> None: -# """Prints the eliminations list dynamically on a single line. -# -# Parameters: -# - eliminations: List of (control, target) tuples representing CNOT operations. -# """ -# # Clear both lines -# sys.stdout.write("\r" + " " * 1000 + "\r") # Clear line 1 -# -# # Print the updated lists -# sys.stdout.write(f"\rCurrent Eliminations: {eliminations} | Failed CNOTs: {failed_cnots}") -# sys.stdout.flush() - - class CandidateAction(Enum): """Class to help distinguish the control flow of the reference based heuristic gaussian elimination.""" From 8cf2622fda14b4a7202c926871ed945a32fcacdc Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Tue, 29 Jul 2025 17:18:02 +0200 Subject: [PATCH 117/156] rename EliminationCNOTSynthesizer and API functions --- src/mqt/qecc/circuit_synthesis/encoding.py | 8 +++++--- src/mqt/qecc/circuit_synthesis/state_prep.py | 14 +++++--------- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 6 +++--- .../circuit_synthesis/test_gaussian_elimination.py | 14 +++++++------- 4 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/encoding.py b/src/mqt/qecc/circuit_synthesis/encoding.py index cb419b182..ca792f253 100644 --- a/src/mqt/qecc/circuit_synthesis/encoding.py +++ b/src/mqt/qecc/circuit_synthesis/encoding.py @@ -20,7 +20,7 @@ from ..codes import InvalidCSSCodeError from .synthesis_utils import ( - GaussianElimination, + EliminationCNOTSynthesizer, build_css_circuit_from_cnot_list, optimal_elimination, ) @@ -55,8 +55,10 @@ def heuristic_encoding_circuit( if balance_checks: _balance_matrix(logicals) - ge = GaussianElimination(matrix=np.vstack((checks, logicals)), code=code, parallel_elimination=optimize_depth) - ge.basic_elimination() + ge = EliminationCNOTSynthesizer( + matrix=np.vstack((checks, logicals)), code=code, parallel_elimination=optimize_depth + ) + ge.greedy_synthesis() checks, cnots = ge.matrix, ge.eliminations # after reduction there still might be some overlap between initialized qubits and encoding qubits, we simply perform CNOTs to correct this diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 431cef9a6..9cd09a3a8 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -21,7 +21,7 @@ from ..codes import InvalidCSSCodeError from .synthesis_utils import ( - GaussianElimination, + EliminationCNOTSynthesizer, build_css_circuit_from_cnot_list, iterative_search_with_timeout, measure_flagged, @@ -244,8 +244,8 @@ def heuristic_prep_circuit( checks = code.Hx if zero_state else code.Hz assert checks is not None - ge = GaussianElimination(matrix=checks, code=code, parallel_elimination=optimize_depth) - ge.basic_elimination() + ge = EliminationCNOTSynthesizer(matrix=checks, code=code, parallel_elimination=optimize_depth) + ge.greedy_synthesis() circ = _build_state_prep_circuit_from_back(ge.matrix, ge.eliminations, zero_state) return StatePrepCircuit(circ, code, zero_state) @@ -284,7 +284,7 @@ def heuristic_reference_prep_circuit( checks = code.Hx if zero_state else code.Hz assert checks is not None - ge = GaussianElimination( + ge = EliminationCNOTSynthesizer( matrix=checks, parallel_elimination=optimize_depth, code=code, @@ -295,7 +295,7 @@ def heuristic_reference_prep_circuit( penalty_cnots=penalty_cnots, guide_by_x=guide_by_x, ) - ge.reference_based_construction() + ge.fault_set_guided_synthesis() circ = _build_state_prep_circuit_from_back(ge.matrix, ge.eliminations, zero_state) return StatePrepCircuit(circ, code, zero_state) @@ -444,12 +444,8 @@ def _permute_commuting_cnots( q2 = orders[q1][0] if q2 in stack: # conflict -> resolve via cycles - print("CONFLICT") q1_idx = orders[q2].index(q1) - print(orders[q2]) orders[q2] = orders[q2][q1_idx:] + orders[q2][:q1_idx] - print(orders[q2]) - print("####################") # unroll stack to q2 stack = stack[: stack.index(q2) + 1] diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index ac909126d..0d8300adb 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -103,7 +103,7 @@ class CandidateAction(Enum): EVALUATE = auto() # Proceed with full validation (overlap checks) -class GaussianElimination: +class EliminationCNOTSynthesizer: """Class to apply Gaussian Elimination on a given Matrix.""" def __init__( @@ -156,7 +156,7 @@ def _ref_based_init(self) -> None: self.current_z_fs: npt.NDArray[np.int8] = np.eye(self.matrix.shape[1], dtype=np.int8) self.used_cnots: list[tuple[int, int]] = [] - def basic_elimination(self) -> None: + def greedy_synthesis(self) -> None: """Basic heuristic Gaussian elimination. Calculates CNOTS and Check matrix. @@ -168,7 +168,7 @@ def basic_elimination(self) -> None: i, j = np.unravel_index(np.argmin(costs_unused), self.costs.shape) self._apply_cnot_to_matrix(int(i), int(j)) - def reference_based_construction(self) -> None: + def fault_set_guided_synthesis(self) -> None: """Reference based heuristic Gaussian elimination. This version takes reference fault sets into consideration and only applies cnots that diff --git a/test/python/circuit_synthesis/test_gaussian_elimination.py b/test/python/circuit_synthesis/test_gaussian_elimination.py index f362fdf6a..21089f183 100644 --- a/test/python/circuit_synthesis/test_gaussian_elimination.py +++ b/test/python/circuit_synthesis/test_gaussian_elimination.py @@ -10,7 +10,7 @@ import numpy as np import pytest -from mqt.qecc.circuit_synthesis.synthesis_utils import CandidateAction, GaussianElimination +from mqt.qecc.circuit_synthesis.synthesis_utils import CandidateAction, EliminationCNOTSynthesizer from mqt.qecc.codes.css_code import CSSCode STEANE_CHECK_MATRIX = np.array([[1, 1, 0, 0, 1, 1, 0], [1, 0, 1, 0, 1, 0, 1], [0, 0, 0, 1, 1, 1, 1]], dtype=np.int8) @@ -20,7 +20,7 @@ @pytest.fixture def get_instance(): """A basic fixture to provide a fresh GaussianElimination instance for each test.""" - return GaussianElimination(matrix=STEANE_CHECK_MATRIX.copy(), code=STEANE_CODE) + return EliminationCNOTSynthesizer(matrix=STEANE_CHECK_MATRIX.copy(), code=STEANE_CODE) # Use parametrize to test all logical branches @@ -60,7 +60,7 @@ def test_apply_cnot_to_matrix_updates_matrix_and_costs_correctly(get_instance): expected_matrix = np.array([[1, 1, 0, 0, 0, 1, 0], [1, 0, 1, 0, 0, 0, 1], [0, 0, 0, 1, 1, 1, 1]], dtype=np.int8) get_instance._apply_cnot_to_matrix(i=0, j=4) np.testing.assert_array_equal(get_instance.matrix, expected_matrix) - expected_instance = GaussianElimination(matrix=expected_matrix, code=CSSCode(expected_matrix)) + expected_instance = EliminationCNOTSynthesizer(matrix=expected_matrix, code=CSSCode(expected_matrix)) expected_costs = expected_instance.costs np.testing.assert_array_equal(get_instance.costs, expected_costs) @@ -132,8 +132,8 @@ def test_handle_stagnation( assert len(reset_call_log) == 0 -def test_basic_elimination_integration_with_known_matrix(get_instance): - """Tests the full basic_elimination method from start to finish. +def test_greedy_synthesis_integration_with_known_matrix(get_instance): + """Tests the full greedy_synthesis method from start to finish. It verifies that the correct sequence of eliminations is produced and that the matrix is fully reduced at the end. @@ -144,7 +144,7 @@ def test_basic_elimination_integration_with_known_matrix(get_instance): expected_eliminations = [(0, 4), (1, 5), (2, 6), (1, 0), (3, 4), (5, 6), (0, 2), (3, 5)] - get_instance.basic_elimination() + get_instance.greedy_synthesis() # 1. Did it produce the correct sequence of operations? assert get_instance.eliminations == expected_eliminations @@ -242,7 +242,7 @@ def test_compute_cost_matrix_golden_master(): [0, 0, 2, 0, -2, 1, 0], [0, 2, 0, 0, -2, 0, 1], ]) - instance = GaussianElimination(matrix=input_matrix, code=CSSCode(input_matrix)) + instance = EliminationCNOTSynthesizer(matrix=input_matrix, code=CSSCode(input_matrix)) cost_matrix = instance._compute_cost_matrix() np.testing.assert_array_equal(cost_matrix, expected_cost_matrix) From 693867ff715affc21beca5f4cc6adfef7031481a Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 30 Jul 2025 08:41:46 +0200 Subject: [PATCH 118/156] improve docstring of EliminationCNOTSynthesizer class --- .../qecc/circuit_synthesis/synthesis_utils.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 0d8300adb..8faa0a202 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -104,7 +104,23 @@ class CandidateAction(Enum): class EliminationCNOTSynthesizer: - """Class to apply Gaussian Elimination on a given Matrix.""" + """Synthesizes a CNOT circuit through check matrix reduction via eliminations. + + This class implements algorithms to find a sequence of CNOT gates that + transforms a given binary matrix (e.g., a stabilizer generator matrix + from a quantum error-correcting code) into a reduced row echelon form. + The core mechanism is based on Gaussian elimination, where CNOT gates + correspond to column operations. + + Two primary synthesis strategies are provided: + 1. `greedy_synthesis`: A fast, purely cost-based algorithm that always + chooses the CNOT gate that reduces the column weights the most. + 2. `fault_set_guided_synthesis`: A more advanced algorithm that uses a + backtracking search guided by reference fault sets. This ensures the + synthesized circuit adheres to specific fault-tolerance constraints, + with respect to the reference fault sets given. + + """ def __init__( self, From d699a12a1d489a387781f1788dd8ee94f9da925d Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 30 Jul 2025 08:48:04 +0200 Subject: [PATCH 119/156] rename _handle_stagnation to _reset_if_stuck --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 6 +++--- test/python/circuit_synthesis/test_gaussian_elimination.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 8faa0a202..57f932889 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -179,7 +179,7 @@ def greedy_synthesis(self) -> None: """ while not self.is_reduced(): costs_unused = self._mask_out_used_qubits() - if self._handle_stagnation(costs_unused): + if self._reset_if_stuck(costs_unused): continue i, j = np.unravel_index(np.argmin(costs_unused), self.costs.shape) self._apply_cnot_to_matrix(int(i), int(j)) @@ -196,7 +196,7 @@ def fault_set_guided_synthesis(self) -> None: self._ref_based_init() while not self.is_reduced(): costs_unused = self._mask_out_used_qubits() - if self._handle_stagnation(costs_unused): + if self._reset_if_stuck(costs_unused): continue candidate_pairs = self._get_candidate_pairs(costs_unused) for i, j in candidate_pairs: @@ -334,7 +334,7 @@ def _validate_inputs(self) -> None: msg = "Must provide either both a reference fault set and CSS code, or neither." raise ValueError(msg) - def _handle_stagnation(self, costs_unused: npt.NDArray[np.int8]) -> bool: + def _reset_if_stuck(self, costs_unused: npt.NDArray[np.int8]) -> bool: """Handles local minima or full column usage. Returns True if reset occurred.""" if np.all(costs_unused >= 0) or len(self.used_columns) == self.matrix.shape[1]: if not self.used_columns: # Local minimum diff --git a/test/python/circuit_synthesis/test_gaussian_elimination.py b/test/python/circuit_synthesis/test_gaussian_elimination.py index 21089f183..d14072e53 100644 --- a/test/python/circuit_synthesis/test_gaussian_elimination.py +++ b/test/python/circuit_synthesis/test_gaussian_elimination.py @@ -102,7 +102,7 @@ def test_mask_out_used_qubits(get_instance): ("not_stagnated", [1, 2], False, False, False, [1, 2]), ], ) -def test_handle_stagnation( +def test_reset_if_stuck( get_instance, monkeypatch, scenario, @@ -112,7 +112,7 @@ def test_handle_stagnation( expect_reset_called, expected_final_used_cols, ): - """Verify that _handle_stagnation behaves correctly in all scenarios.""" + """Verify that _reset_if_stuck behaves correctly in all scenarios.""" costs_unused = np.array([[0, 1], [1, 0]]) if costs_are_positive else np.array([[0, -1], [1, 0]]) get_instance.used_columns = initial_used_cols @@ -121,7 +121,7 @@ def test_handle_stagnation( # that just appends to our log list when it's called. monkeypatch.setattr(get_instance, "_triangular_reset", lambda: reset_call_log.append(True)) - return_value = get_instance._handle_stagnation(costs_unused) + return_value = get_instance._reset_if_stuck(costs_unused) assert return_value == expected_return assert get_instance.used_columns == expected_final_used_cols From 2966b4ca799957427909bb477b7cba228e819446 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 30 Jul 2025 09:05:42 +0200 Subject: [PATCH 120/156] update docstring of _is_reduced() method --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 57f932889..23c386643 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -227,7 +227,11 @@ def fault_set_guided_synthesis(self) -> None: continue def is_reduced(self) -> bool: - """Method decides if the Gaussian elimination has successfully ended.""" + """Method decides if the Gaussian elimination has successfully ended. + + The matrix is considered reduced when the number of columns actually turned into + all-zeros matches the number of linearily depended columns. + """ return bool(len(np.where(np.all(self.matrix == 0, axis=0))[0]) == self.matrix.shape[1] - self.rank) def _get_candidate_action(self, i: int, j: int, costs: int) -> CandidateAction: From 95de5b122c4b763e1b6cd6e5523c209d4d700433 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 30 Jul 2025 09:22:19 +0200 Subject: [PATCH 121/156] fix logical error in validate_inputs() method --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 23c386643..149542779 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -330,13 +330,12 @@ def _backtrack(self) -> None: self.backtrack_required = False def _validate_inputs(self) -> None: - """Here will be some checks that ensure that the reference based construction can actually be executed.""" + """Here are some checks that ensure that the reference based construction can actually be executed.""" has_refs = bool(self.ref_x_fs.size or self.ref_z_fs.size) has_code = self.code is not None - if has_refs ^ has_code: # xor - return - msg = "Must provide either both a reference fault set and CSS code, or neither." - raise ValueError(msg) + if has_refs != has_code: + msg = "Must provide either both a reference fault set and CSS code, or neither." + raise ValueError(msg) def _reset_if_stuck(self, costs_unused: npt.NDArray[np.int8]) -> bool: """Handles local minima or full column usage. Returns True if reset occurred.""" From f219dd23fda433609775c7e7364c152e11068534 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 30 Jul 2025 09:31:53 +0200 Subject: [PATCH 122/156] fix type cast --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 149542779..9542b072e 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -353,7 +353,7 @@ def _triangular_reset(self) -> None: self.costs = self._compute_cost_matrix() def _apply_cnot_to_matrix(self, i: int, j: int) -> None: - self.eliminations.append((int(i), int(j))) + self.eliminations.append((i, j)) if self.parallel_elimination: self.used_columns.append(i) self.used_columns.append(j) From 3ec3bf7b3f4e5de7cde948ed447260681cc86ef8 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 30 Jul 2025 10:37:11 +0200 Subject: [PATCH 123/156] remove _modify_matrix_structure() method after internalt discussions we decided that it should be up to the user to provide a different inital matrix to achieve a correct result. This is because finding a solution does not depend on the matrix structure but rather the speed of finding a solution. --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 9542b072e..deed109a9 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -192,7 +192,6 @@ def fault_set_guided_synthesis(self) -> None: created circuit. """ self._validate_inputs() - self._modify_matrix_structure() self._ref_based_init() while not self.is_reduced(): costs_unused = self._mask_out_used_qubits() @@ -380,14 +379,6 @@ def _mask_out_used_qubits(self) -> npt.NDArray[np.int8]: m[:, self.used_columns] = True return np.ma.array(self.costs, mask=m) # type: ignore[no-untyped-call] - def _modify_matrix_structure(self) -> None: - """This should not necessary but for distance seven codes this was the only way to reliably produce solutions.""" - if self.code.distance > 5: - if self.ref_z_fs.size and not self.ref_x_fs.size: - self.matrix = mod2.row_echelon(self.matrix, full=True)[0] - if self.ref_z_fs.size and self.ref_x_fs.size: - self.matrix = mod2.row_echelon(self.matrix, full=True)[0] - def _get_candidate_pairs(self, costs_unused: npt.NDArray[np.int8]) -> list[tuple[int, int]]: # Get all valid (i, j) pairs sorted by cost candidate_indices = np.argsort(costs_unused.flatten()) # Flatten and sort by value From 9e5d02aa072768a87fee8045a3d144e3eb30eeeb Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 30 Jul 2025 10:53:01 +0200 Subject: [PATCH 124/156] separate greedy initialisation from fault set guided init before the EliminationCNOTSynthesizer needed to be initialised with the reference fault set, even though they were only used for one synthesis method. Now the reference fault sets are passed directly to the fault_set_guided_synthesis as arguments. --- src/mqt/qecc/circuit_synthesis/state_prep.py | 3 +- .../qecc/circuit_synthesis/synthesis_utils.py | 41 +++++++++++++------ 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 9cd09a3a8..644a2695e 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -288,6 +288,8 @@ def heuristic_reference_prep_circuit( matrix=checks, parallel_elimination=optimize_depth, code=code, + ) + ge.fault_set_guided_synthesis( ref_x_fs=ref_x_fs, ref_z_fs=ref_z_fs, ref_x_1fs=ref_x_1fs, @@ -295,7 +297,6 @@ def heuristic_reference_prep_circuit( penalty_cnots=penalty_cnots, guide_by_x=guide_by_x, ) - ge.fault_set_guided_synthesis() circ = _build_state_prep_circuit_from_back(ge.matrix, ge.eliminations, zero_state) return StatePrepCircuit(circ, code, zero_state) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index deed109a9..1abac3583 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -127,6 +127,18 @@ def __init__( matrix: npt.NDArray[np.int8], code: CSSCode, parallel_elimination: bool = True, + ) -> None: + """Initialiser for the basic functionality.""" + self.matrix = matrix.copy() + self.parallel_elimination = parallel_elimination + self.code = code + self.rank = mod2.rank(self.matrix) + self.eliminations: list[tuple[int, int]] = [] + self.used_columns: list[int] = [] + self.costs = self._compute_cost_matrix() + + def _ref_based_init( + self, ref_x_fs: npt.NDArray[np.int8] | None = None, ref_z_fs: npt.NDArray[np.int8] | None = None, ref_x_1fs: npt.NDArray[np.int8] | None = None, @@ -134,24 +146,14 @@ def __init__( penalty_cnots: list[tuple[int, int]] | None = None, guide_by_x: bool = True, ) -> None: - """Initialiser for the basic functionality.""" - self.matrix = matrix.copy() - self.parallel_elimination = parallel_elimination - self.code = code self.ref_x_fs = ref_x_fs or np.empty((0,), dtype=np.int8) self.ref_z_fs = ref_z_fs or np.empty((0,), dtype=np.int8) self.ref_x_1fs = ref_x_1fs or np.empty((0,), dtype=np.int8) self.ref_z_1fs = ref_z_1fs or np.empty((0,), dtype=np.int8) self.guide_by_x = guide_by_x - self.rank = mod2.rank(self.matrix) - self.eliminations: list[tuple[int, int]] = [] self.failed_cnots: list[tuple[int, int]] = ( penalty_cnots or [] ) # NOTE: this is already a feature and not necessarily default - self.used_columns: list[int] = [] - self.costs = self._compute_cost_matrix() - - def _ref_based_init(self) -> None: self.x_propagation_matrix: npt.NDArray[np.int8] = np.eye(self.matrix.shape[1], dtype=np.int8) self.z_propagation_matrix: npt.NDArray[np.int8] = np.eye(self.matrix.shape[1], dtype=np.int8) self.backtrack_required: bool = False @@ -184,7 +186,15 @@ def greedy_synthesis(self) -> None: i, j = np.unravel_index(np.argmin(costs_unused), self.costs.shape) self._apply_cnot_to_matrix(int(i), int(j)) - def fault_set_guided_synthesis(self) -> None: + def fault_set_guided_synthesis( + self, + ref_x_fs: npt.NDArray[np.int8] | None = None, + ref_z_fs: npt.NDArray[np.int8] | None = None, + ref_x_1fs: npt.NDArray[np.int8] | None = None, + ref_z_1fs: npt.NDArray[np.int8] | None = None, + penalty_cnots: list[tuple[int, int]] | None = None, + guide_by_x: bool = True, + ) -> None: """Reference based heuristic Gaussian elimination. This version takes reference fault sets into consideration and only applies cnots that @@ -192,7 +202,14 @@ def fault_set_guided_synthesis(self) -> None: created circuit. """ self._validate_inputs() - self._ref_based_init() + self._ref_based_init( + ref_x_fs=ref_x_fs, + ref_z_fs=ref_z_fs, + ref_x_1fs=ref_x_1fs, + ref_z_1fs=ref_z_1fs, + penalty_cnots=penalty_cnots, + guide_by_x=guide_by_x, + ) while not self.is_reduced(): costs_unused = self._mask_out_used_qubits() if self._reset_if_stuck(costs_unused): From 0f1ad6fc54c436f648d983b97b992882ce61bb86 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 11:21:55 +0000 Subject: [PATCH 125/156] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mqt/qecc/ecc_qiskit_wrapper.py | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/src/mqt/qecc/ecc_qiskit_wrapper.py b/src/mqt/qecc/ecc_qiskit_wrapper.py index 97a193dda..7ceffbba0 100644 --- a/src/mqt/qecc/ecc_qiskit_wrapper.py +++ b/src/mqt/qecc/ecc_qiskit_wrapper.py @@ -87,8 +87,7 @@ def print_simulation_results(result: Result, n_shots: int, threshold_probability for result_id in sorted(summarized_counts.keys()): # Print all results > threshold_probability if summarized_counts[result_id] / n_shots > threshold_probability or printed_results == 0: - result_string = str(result_id) - print("State |" + result_string + "> probability " + str(summarized_counts[result_id] / n_shots)) + str(result_id) printed_results += 1 if printed_results == 1000: break @@ -161,10 +160,7 @@ def main() -> None: ecc_frequency = args.fq ecc_export_filename = args.e if forced_simulator is not None and "stabilizer" in forced_simulator and "A" in error_channels: - print( - 'Warning: Non-unitary errors (such as for example amplitude damping ("A")) are not suitable for simulation ' - "with a stabilizer based simulator and may cause an error during the simulation." - ) + pass # Creating the noise model if error_probability > 0: @@ -175,7 +171,6 @@ def main() -> None: circ = load(open_qasm_file) if not any(gate.operation.name == "measure" for gate in circ.data): - print("Warning: No measurement gates found in the circuit. Adding measurement gates to all qubits.") circ.measure_all() # Initializing the quantum circuit @@ -185,27 +180,10 @@ def main() -> None: circ = loads(result["circ"]) if ecc_export_filename is not None: - print("Exporting circuit to: " + str(ecc_export_filename)) with pathlib.Path(ecc_export_filename).open("w", encoding=locale.getpreferredencoding(False)) as f: dump(circ, f) return - size = circ.num_qubits - print( - "_____Trying to simulate with " - + str(error_channels) - + " (prob=" - + str(error_probability) - + ", shots=" - + str(number_of_shots) - + ", n_qubits=" - + str(size) - + ", error correction=" - + str(ecc) - + ") Error______", - flush=True, - ) - # Setting the simulator backend to the requested one simulator_backend = AerSimulator(method=forced_simulator, noise_model=noise_model) From 0b4696ac94788898a574ccf4edf42ef066198273 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Thu, 14 Aug 2025 13:16:39 +0200 Subject: [PATCH 126/156] clean up repository and add personal playground directory --- .gitignore | 6 ++++++ .../eval_circ_mod/results/all_acceptance.pdf | Bin 0 -> 18013 bytes .../eval_circ_mod/results/all_error.pdf | Bin 0 -> 23983 bytes .../results/cc_4_8_8_d5_n250_z.csv | 17 +++++++++++++++ .../results/cc_4_8_8_d5_n500.csv | 16 ++++++++++++++ .../results/cc_4_8_8_d7_n100_z.csv | 20 ++++++++++++++++++ .../eval_circ_mod/results/cc_4_8_8_d7_n50.csv | 18 ++++++++++++++++ .../results/cc_6_6_6_d5_n250_z.csv | 16 ++++++++++++++ .../results/cc_6_6_6_d5_n500_2.csv | 15 +++++++++++++ .../results/cc_6_6_6_d7_n100_z.csv | 20 ++++++++++++++++++ .../eval_circ_mod/results/cc_6_6_6_d7_n50.csv | 19 +++++++++++++++++ 11 files changed, 147 insertions(+) create mode 100644 scripts/ft_stateprep/eval_circ_mod/results/all_acceptance.pdf create mode 100644 scripts/ft_stateprep/eval_circ_mod/results/all_error.pdf create mode 100644 scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d5_n250_z.csv create mode 100644 scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d5_n500.csv create mode 100644 scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n100_z.csv create mode 100644 scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n50.csv create mode 100644 scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d5_n250_z.csv create mode 100644 scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d5_n500_2.csv create mode 100644 scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d7_n100_z.csv create mode 100644 scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d7_n50.csv diff --git a/.gitignore b/.gitignore index a9d8db638..c0b563690 100644 --- a/.gitignore +++ b/.gitignore @@ -176,3 +176,9 @@ node_modules/ wheelhouse/ pytest.ini + +# ----------------------------------------------------------------------------- +# Personal / local development ignore rules +# (Feel free to add your own scratch or playground folders here) +# ----------------------------------------------------------------------------- +playground/ diff --git a/scripts/ft_stateprep/eval_circ_mod/results/all_acceptance.pdf b/scripts/ft_stateprep/eval_circ_mod/results/all_acceptance.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1d00a454672f24bc740a8fbb234d571acd442976 GIT binary patch literal 18013 zcmcJ%2RxNu{5Wopn^9)=wI$qruWOYV%9bsAg-h2ZAxTC;MnPNnCNi=zD=NxL zRv8gV{GO}&w0wW{|Nj5~>vdk|Jm)#%y`J+P=N!ViDr%B2DI`d^U>KZV4T6E8U=Q1q zAUQcO#PE!#0~n%gL$Go4Z~{YgZJZpuz;K{}K3G8kO;DE=0QN%|O#K76c-Ua6bMt^&Y_pmc?Ab`z* zX;st!P#k;-V2Fl00D{uDT=`qB0k-@J9N3=-5aA|5k9Po|`wBip-@(hn8*c~TLxdlg zU(3PX#YV})7nl(W{Grg&Qb;UT8V-YE5g0HM4wJ$Hj~Em%8AKUC6Bx@2jQt9%A`a&P zJi&+^^+7*KLwx<6md6}$P6TH#?A!cmE^Yw!V2GLsjzGm;`R4#lM zS?+MS@tC`J$$N35D_1_JANsVQGpJL)wLCCZ>cOx!=rLHtfZU8acZkk$ont$Y&v~6` zJ5YLmfWOZo|7EFLZ6QTEokf>jj;)LFdK#SjvgEnG<+;rqdnWWzy&Sh(w4VC5^Teh` z#6TPKeb&t~3R!$sm!Yu$t2E?eXRrCgYe<=-$zTm5s)K>YxWkim!p_n6gnv#ihSN~e z$!!MuBHN~^WS18uuWsR>c9|?uDo*^H)56j)1+{J~mXo1h7FUy%@AfvaHfz|}lj8MZ zjTfBs?iiP2Rg3AR+ONb?UOlp)1I#cGxhPL`(%jF{nTgsAF-sxSC|;7FH!sO4pSJ3OAYA>Jx>Tb zs45%aKjRkx}#UDP1+nX%GS z`)~w7Y?g6*Xe%y>JnFq;XL3G^%Th>#EK#{gP;(Gf9d7h^qi<#a7yd{4?uF;V4h~(+R z;|=ti5>*FYz&lC%!=RTiZTk~Fg4mnuI>k$A2LS_g`gX3EbB09%Q zq|QO(OZf*6QDYKnj1E%Vy$8SeW^q7UdHv3U@4Zb^iE_!HvKgck{>$8X3Tau7^=V;?ObECYokE6y(;}QgQ_T2Q!uCD1KGx1c~M=PSz@u{%w z0+qX~ikxG(`<$@slnmpP-+?%M=E*q+l^U0dRi?{|ZnCTWHAA^c47k@rxV$8mEVq1N zBcG9z5p-!l7zIw=tpJ)?(Px!6897y}oR;}+;(d|&6J;wj zn45`V_DpEIz@@$B0a-1+y^YN)v@u7}MtrA+#HIXFrG@I<)oHuN@6cnsiXF z{|I5dcF_01q?5*pkV#chqr_y^TJz-(LJ;NU`}qY!7LA{U4;@{G3t5>@#&=RyTfIk6 zK$K3-Yu;Zv?HsHrwPz7m)pMnmu3gVYm1)`i@f7G4wvBk}2? zXE@^5UR5d7EM1?wD|G1Sy|~)v5yd*rr!&1@EZ^qO;GA@CD&sIc&FA>SRgUxhmx)K) zbsIAqO9Nw($$a!eb|PmP(@j?+Vjw3NtcqUqZf{HqPEU;)SHJVMG7qyXYOp#dx-ecl zlRxdAh)cRXGOaGWRs7|p$5BUFP9FtL_b#&f!Bp1vr)j7b=8yK8S+p|SmxAjCP8u+$ zRWV=dzw36%X+Y)8L-*OJ`qsTKvs*Z-2X9bTJxvw9e^;_;Ln1~ADpI=U!JSU(pYPn2 zVEH)*S$g301CCy}i69#3f~S0aPsW?Jx-7K5C$F|Z9a?YVVNuW`HR}JSP`xmCkOguW zUo67#d9-zuGN58oxLs-a(m16$uS$$<$`h72vU>C7czgacs!L=-F;Ph8TKBrMp$kd1 zLZ<2`^lC}k<4&*iUeFc%1bQubM&n*=ZRYxxu+xMMZQ17xmlUJ*6YU4%^CwX)dt$j| z4>Foom7F2{-q4pc{wQ||RWWC~@j9;kXng1-Ys(s>N?86eKNIIQ_Qkq*Vq*Guf+ zs;8G?vNh>9kQzQK~a$u3q7Dqg-RsHdQW! z4GkEyu0C)%-HPwfgFw7-lRj^~egvbRzPZko@ck>A)OU?#R`%SK=w8$A_!3dnFBh&? z&xy-TNuI?%Fdhmw7<%LqFVn8)AQFEn^o6uu$A!uV*Tz1u?Z=JTz!*c?t*kocZ<3o2bi!J_eP#;h*!Lf zxw=H9mD7iZpc^wOY#ZrxAPYe!rOx@0Etu?@P@}D%=TdFvQc^KH$AHjo4PU&)l_2_;*EA3R9;(Dh!~O^J9l|HlYQK;@)|xI z%-;X8Wvy2)HR8$RGa~QgvZMN)(vS=)5Z5KW$Ue^LJ`HxBGv-!`B1O!fqqKYDr%T>Q z`UF4V6ywR85IiUaHGkJ#K6L7s`urWk%P~|+H%mg<{P8D2%9{O&qV>v32(t0qw-Ukg zqfg{sahLFH!OI`rS<5;(=*AZ&G>M!TaCEbZc`ITE2_Kzk6T-C2(#>>GhWTl?Yr`r z-!Wf={8W&q>b+<7o|FbO;|g)KUQdRYX-)h3=Bj4K&8h3O+nB3cO_!f27ct+#+wI$Yl}Bo{+f5G+<-_qdJ(=E`M*V(?bUcXF z;<Lb;2R})8Ye)u4G(<3KAhW1``%eOzLtN%dQC*YlSIkwIm4EZ zKqfmh12>}O(O1E|Z_iv@_@X?nTyS5dM{}UN3$ykmko-8gtNA|AN=13&(WimdynVAz zx~iT(J9k%h*(C;>5(yq5G;y(bA+4Z4!oRD^X#r!z4AHcva2o<0O7zvhi8=4Wn}96dJA4B^Rl_ zF~berZRMD50{QAY3lWORGxGAo%CEZ}0#uIUKa}OQzKU`ngF}7ZbmDF+z3y_b7ME}0 z_D^$bh4Yp_yg*YV<%3AlVAN1VWg@oT#80}epsTl1tlJjy|6?FH3`})|R<`%^RqkD87IJ+gkv{JcK z(yJ;DC?wvK9_K-XrHPUHIkZTh^{AY$om8Q1Yf9Z;5OMTlJhL!Z=kn;WH0#&AeoibQ zxK`5<$mw3$EO3H=8%_MXo2S(jV<~x{Yb*mP6#V2(iI3$@#xfs2+(#R_kD;Ys`L%X% zapGd$9jUpOda)+&sG2`MdBs85=sYyg)XTH-SWLalLs8J$ufW4mkrX93OB!>7v!WE7 zKyrH_!5@!vQdD@z(ff9_d6@2k+?8nOW&IxW@+Ppo(6dX%wui)YsFw(wlfLlj$AOg2 z+rm9{70flR=@w&KqCPSdx868oyYZVPV;2UJ6G*>sYRSG0y?JEzx=xprr(4(A_YP?y zZLII(?w@JV_M~8Ty_0_K*7}BSLkYjil$CRlX9pMAg0Gm7;hnC7Qk$&3bNV;PF3Zb_ zUwvN@eQ>P1|Ekga#3fHneGR}O?O7v|n?hG?{bI6~sAL!%q zFYp+DqDyjwMa8~4Add0=9vZ2F$VQrJJqz;d!p0!Vp||aM=}G3(<94_!;=B*9TAjBC zQ8xKCG*K6I-pyncWNx`BazV=7tXXVyC9`GpmFRiq6F1I-pQapZsOa6AlrK_C=XP-9@g9>d6DIQ#4Hoj%K z>bub4JQSR6WL@_3;Lu7#WMdAUPq%Y*Y#TP~mO00}`)asbeFFGFv|i!p3unr8p0w+^ z`|nYv=d-F9DeSq%I$GD-DDpThQtaq+Y5WW6>w`~4we}U~PB-_E6>8}Pyk6nzRSHp`wrZp6pnXj!wkPF8Dt-^BTJ$^I>Qxs<^5W}VZYVh)`RK6!_o^!>=> zX3-keU1Y?E5&U>SMHBYjlDKWOF*)w)U9>WsHW|(ARXS_L)jyD736N5!<-XgEd zKYNuzfQ&RKcPm{!DdR7BxzO(PtuvO956(#5D>sj1^K@S#+hlm9{DeC+SdVv=m+S?d z>j!7J6hzla=gwFGLU}1(`0!DVw~l9vbvLMZeUcv!u9gjQNhRON@u-%qav&YNVHEVbv9ffkjXi31n?1IEwXNy> zJyFYs9FiiHI|U;rME95!HA*#nyw7E>`Pp?%LDbiC{gB+T>HWmO*ta;&w-DJ*(1#cZ zLZXnc?{Tx8Xc4i}9Blc$4o(b){T4C8!hk5zU!p~*s2chPD27ccUOqP#Z z?iVH5hvjD?KDb%iUk?{7n_#<_<7seAU;EB!x|6psJhIcmkG~+>{iHZo7*DOTmR}=} z*At2hS4r+nbb4bIpg`xrZTlxKaAJV&HxS_n)IY$er-37Z(bT+U-8y`$SacyJZ#Lu0 z_WdwD2s!!CkkCS-nvgIaw8#XF8X z82&|b(w)_znRSgrF{Jc1Lk7q8G&6TeY_Y>mp;h;|mqUD!T9^`J~8}JYeMvzvz<%u!Wq$doq`Qol| z=zS@wu3U|3yz|99S^3VLrsBhxC@o9o#HMR4?@dSA$1g1uSxh{YXzW^Rs(8T7XFM`3 z{%EKp{X~=tJ4WMLJ8GLK7)(h{?-M6-_ErSTLaGacF^&F^jt7fDv z!;zK}?(fy6&z>?9RS1Ck^bj6fho8?9`?A=59WPgOh<#)isD2Lff0JAU6!UkmXUfag?c;*2A(>qqXwV^CfPLNcl1hirg^&xbIMH z?@it(C@ESD!8ps|0Mah+^SOTi%_#Wj$zzso`uYBRawk-dPft@Hi4d?$W`8@ONIRqX z(An%_;%QZK#rMl)9sacMU%oooc8@yuYPakG$KpAHz7&oZ%^^M4pE!ab9+t~HQRwYAsA7q~IV2&ZKfE zImDTOC-9ZlRBs!)I>$OjHOWbMBiIsm0f@Ne^cz5E>^}p9H2w+@8mjjVpkSC+qeQVA z1N$+a5C>0emIAvY%ulmrZpSV2Jx$zX9`43k(WSkj+rK zn$N784J6Or*NV2>4F9-2sNcatb6B{%QrOl`kPHG_$6g#>k4I&R1Uli3HzjmJk376P zs=;zTdF+Hwa3@!*!yyI)Uv08ccXsO)x;9m`yxczcknmm^XbqM3kmHMpdj7FeLH);S zNdtpSEB)dW9R}sEXM&mB^EbRc7wmEW{DN8A$A4Di4fDmfNd*lK6RcNSOsM4bs*b|W z#?HEBh-TD^rC)GUIC)VeSpBc6J4fpLruw9HE^gk>x2y_`BPEZVyd&uKZI9wNsgzEv~1VL`hy(_Oc2; z-5fR)vM97H=*g>=FX_1Ox{y5efbOxta)eOtzVk=uU@GK`!l=?_2s!f9BG}IlK_OmT4)aFpq7iulmuC@| z58M#anw?E&$ z`c}X|Z(aY6l&zBGMXsKVeT(uLu1uySbxT-@tQ4<$YQE4)3Pc8}-B}HI)t#wCer9bt zZ*B&&?1z=EwoT(^eR9#mxX)^i4k97+G4@Ks`-3im=g98umqCLPM zbGh^)gAXP=qa|b-HRpAWmQFqM!6-{EkKQ@EwBc-&Y#rKnbk)SyDpcWWZi>(QcqP9v zEm?ssUQjk%R`TF||K?fT`He%J`io!M*VcK87$0w1r0qh%-Hb9c^6$%;YV4y^lz?hm z$RiVm27y)!9(`b(+bRlM8Bp}wuS937^RU>$_>>KyDW*aaL4WQD$NSa|xLxg26R_ws zIbB>teqZ*6PYXxh%H&hq!mLaSh>QSJSNuf&VZi{IdylS^mm|IqPVmk1FEDS5i@(L$ zkV@sfKm19bZ|O8Ky(|oBQbsMfdQb%q!R+pGB|6<_~uaC^~ zF39d;j$!`68biPd@J>i_7f3~W{C6Tb?jP^RX=PomkBZFT;7RSxKGOVxO zWlrLA-gkde_FT1EePBC+y%ur4y@QA5@vOn{C$wy4b#?nz_M_o~!N7y_$8B6pk9N{l zT(5CFOgn6VeUUGJhz}(5aTi>7u`Ceqe~?dgJvTU+Ur{*V_*pkslhTeV7I&L&_z@##N z-AAa3nidZ;oi<=ly>y_WA%H{Td7N3=9NrYPjXO)mX%i|vUmB@0dZvN=n9!DekXw&} z`TXpxD%vMZdZsrhGU(c4AyP#H>3oGso6jd}rrxHAiArOi6=lNe>9wbh>c29sden1M z@zpv)>}JU4~R$nw1eUaQH}rT8P5^o(3uMa*dkPcAB5k><`papg|w+81Qr~+Rk?w zc?@knn(lDabBj$}?VDlf7{1AD%j;pEVScatGlsGB>^7+thyN~)8*(?h3ic0ng1l~3 zGzE;V(=wFPq`~i9t`l42(VXoS^-muK`q)(U#Zf8o2O!=F!lnkVWCD_!8P0^g!P%pQ z#Z@6!iiOvDK}%;NrdZZSo+gzlBa@x6fqM|*d0adLN71RC;>^`Ihno-^^zH<5qj265 zb8v6A^s|WOZg>jXlBk~qJv?&L0h$dyK8*~z3 zmZ#3IBtiFB9MQdeeLl8U1U7Q#iIB@a0wg>)MiU_9v%L`v+Vmk#BhwJ>2)G zlRZl9zT}<0lZn!dP-cU^#8dfk=M$Kzl%0+kBlp~D>+n-TJ&eX?q|`NeT9bE{hGgHm zt6$6LKsrrk`9fv_sTq8k$k z2wp4byx+L7olE`fNahR~lDnEstHY1QSz)F`Eu*^Eby`9*UZs&Oo=5k#-9=e3^<(OG z@#^Kg7X(vHN-eLZ7>bwbkCnN!Jbdun>}i`yv}g2Y#0-_;rp~NI!lKrNqIlTGe#2VX z3sD;DCsc>cVDGk6pd}n1X+2a$C_^Gja-Y}tSci43fd-`?eV{)UjG5a7(Os+_1mYj8 z9!dS9_!cnTOD~Y+O~g9&q}&Xl+P7}IJpPKR8iVx;>`hpNW`HTUBI{XmMReEU(6OTY zuFxL!mu)f^J7Xg&<0V7=RU{^1&2r7b3;9dDyq^lX+DoZhAmwW1Nt0r4{ycwQgY2eUp`nS$ZG{#uNeamTwca4B$@HSjqo3m0T-L6-4;1@#D5$(ZeKFOt7C~-R4+lwu{QI}-uOt{8en;p{As;#44Z;Y7Z$FkDq+L{?Ry0E0! z(!OM}GSD+f_2bz3y!?JiHgJnn!YjaQ7q;wXpZ$aQArNQ-qOVWJl#>$%no>*JvCkAP zCU#OXcaoNNNpzi;5Zn`+#4V+~#}4Xl>y~ZpXiH^p3WkBJiN5vKRA%x&p+W6po&Adn z*l`tunpl(zkt94*xECy?chwvy+qUByO(Hi>vC~q7BuE#nHwvwRi?Rscl@CX&Ek;ZiE5s`TZU2f5N*{{@R@=ERptIm0+{=aMfZ4M7fIjy*3;8L6euAu-p-*Rc zsNwy2!l$yt7fhJR(+;7{wC(v!@ASje@6;OcKV3+H7geB~DBARIJ)F#*Jk=h2sOi@2 zJ&!(>mlVBeGCJp&J+EbN+=o9oApMM~`m>AqHcf ze!-7xo|* zGB@8orDH-mM8~&M-+h4%%S_QT@~u$5LjM@{i2nn_jV2CS%?&x02Qk9TJPB>D8R#?4 zS@C8?rJ-MuO=TW(XQgHsFKs$eb)Hp|-8FuVH22u_`I+sarTg`RgM2*if?9WB&Mr13 z9Q6;|0g`$ecydLWnx2CzA&$3S+a(_ipWGg#>7b^fk338;8^0Nq4wf*keG`}O-1Hg& z3w})*9(Zuj-DL8xAy~ss7nR|&JsqJ$__%QK7xPTzRQYVb<3s zTKa_zUDsJ!4hv)2Qmh$nW%u(OiSx6S-fzKM#&vnTWO`#?O}yjT-d3e*Vdo(K0t1)f zoKwurJSfW91G8yawR@}5bDf5e@gvC6c&|$O2mU<^C^< zpZ3scSBfz#|91@C;b5)ty+14A<$x11e z@x~Tu`VqsVKj{Pi`OEq0CGXrgfGF8`IeaT=>FKE$9aM2RX=CJVV1x4_u6cMbg0iy> z9*E0Aj@f)G!%--}Lk14=t2lVs;axll9(XX|*b(nG{P4Jma{xL(+r}NZK%n&d&|mxi z#UCe5p=CqByX@R7kb**qiU#=muVe{=5P{PLE<6C2D|RkNfFPe7_7~iWv z5EU0kM+e|C1M&8PIheS2<>hH(2VATGtR*`ScXt~w5^#(B9Pl1shzAaUoNyW_5uEW3 z4qz03j-!hYPyocr%fZJ1xPXBHL2xcWJ2X(G2u1_Z4rMSge69+X1}LTrmIh|f2V;S< z85m-Vx3P0|Ah=bcMZVmw85CejPyAiRVW#hYp5g3L*!hgE1vV$KH9dj@m3jO~gf&RDSAOK4W z2`~)_xEIn0X)qdr24Mk<3j;_29Ju&`03?8zPyn37_r&%HH0)~*+>rs=|KAem`+Ee? zmY9fRd`~C@43G~Z0i=;Y0tUiLgE7EPG#U_Z6fil4m{4#q9E$=036NDZAi}^PK;Q`j zh&x6a000V7gd{#di6kO|O+<~D18IjZ z#Ob~!5b7Jx{u}CR0RZsp5WuQR?1myj1wj5?48F7Ldk#PgxZq!@v@-${10$ln13pm> z{u`gziip#WFaZKZeEx3~B2Z8$Xy@Ix0kFVg^F0v-;j0V~<>1$}Lu)`Th%)h0+K~sM zOngr}vhqzPi1P4rBEq%v42(gPjqizwIU0%rcnH8sl!09ma2pJeIpTXFrGBLEGVwhp z5(VHpXeTF@e@Z*N{`#KS=D$Rg3nEvE`H$m3KU+D9;GNS!fO=8}?;OGbN~(Yi?yQf% zDh=Pc$VObLfz@h9jhTUW_U?gpHUL+Nb)fId_0IAQpuf}Zmn9tVd3Gx8zyNe#OFJqB zfNkf=0r=*LCD2zj0*LTVwKEtX>`uuAko&JCH$VcumTP1v(UrReW3)oQl`n03?cHBY$A_5@uU+cdqyKj>c^&g=4 zc6yuvqrTy_qaXn_NUZ*GXYXedLk$MrF*$yI{|ifCKkMiJE;vGz6@ft^b~b=BOH^fw z@c*$HpzwY)L;R1;pi+S91R4@^1%;oW{mEebfx=IrwjY&0$C0#%%g9%9XaV2tH+pEn z!GKWj5J?NzRQSdNEnsWm8xyopVBqTo8UVK?(O}p&7HDC>@NaBZgGv4{yd>RSaNYpl zeplc-Gykf<|F+d34VDB{1@QM{e*=bq0UG=-$Ku>$6&XUnbgFCes*pvEqpA*b{jQZM z$Hu=@ke@nyYy{a`FBhn{6~Cx`t6^P;_NaF0q~AbnfAz7b{Zmixi9NchC;6<~Tl!8< zucsX$vVg6r1v^9pYvv3h`%C7O^-0qY8h$2lBFMd*6){Pa60# zqXX^Cl)wCG!tN0J|26i2X8tSk2;H`ExbEV3Kgx(C(?SZGNS=K-TPmbubR0iUMv|sN zZL|w?KgrX#+rR${-XIYF3>}%RU8seWr5z=>V=P#o!@@$_g2c6g3bYGoKS}lf6*SO) zJ7icXI1-LVLebKIqLKXN>3@FsA!5jX*h2e3WZhm=9|8{S!odvN-UK7)S@1#2o;ZeN zsY`}b?8(gRB;|>8w{}76=kM~XIs3n%IAC}G?PK@_R3l)^&j@PNHr5}i`;F>ZyHcI_ zz5k22{-8QWN*Yk&fDMKOOfE@`6cUbsqM%r5Km+~q>gTT+P4vb7@-cshpNy#$RAo`E z=Es)P8a4%@@=H>iq5@)!Sc~c~zbVJo)*MIBVN>R-Vn&J*)riWmMmoTc56KGr&&J_swU(HvfOl&YUDRswqcMm|qSE zs~%u^C+K`|AuLvn{m4LaW6PUnN)oQHeb8O-_=AaG|4jkpsEa+(JqGMLqDlikYh@2_ zzcwqM&Jv4F4gTOAbs2YgT@ z7C7_rYdaWF2e9*(@nC?b_4{}*6aw=H%qSGmLjJ8UhG>fZR)>ZDK?A^o|FaJ9C!GP` z>5uW?*gxCBi9Ysk^CF3HgmTo1L&Y%+X3FypLH1EckAe960UrkQ2VJ1j z&_84n3Mi95aFZq;h52nfY1A%#F+>O8*LkI}fRFrJ9TxGYoMO>`(s@U-{n{4@ef=p{ z&|TyOiuqGspje`x_X~VL$m~xU2SoCZZvi-l^E+-Z7#8(Aoq<5xA94Ug6J7NG<|W{5 zT-+S+JO2j8z{L-U7Xo2HeGd=f0=nZOXy6E;B*MFGvPVW%c3Ihb78Q~$*)t=X?5qgcTgaA@6{5(g4hZs!TB{H7#Iq+H?{%^ z3xgpV?hdA4h@_E=k&V4M7@}fiZt4t%0}0f?qM{&EyDR8~{6A%ovA1&pBMuWlv@aN2 znVPtO`Mx|#UvrUFcQJA?1tY&is2I7pm^#^kQRqhyMBT#Zilv=7nD^^jCwmihQx~uv zP_2{<0LAp03m77A3qX+gdX@Zol?Pw?2@dSf2B2}H(L0#}=)S;*sF^z3yE>Tw?Lp%Q z>Q^$oVre8{e+{S+3j9#K{5)_zBtIMm6+rNTk#HyvKN86ggQI}jAd)~kfx?`@0$&HP8>*pkIF@rlP5xxr+rD_7#APr47)0Fhs@%pox^JiTxE*bSs=)oJ@^u zLD!PrUeXI=;JfR2?nyc$gP}f^>!=Al0YsU(0&#LG1y=2>od5qu^F<|HkoyM3U)y zVJZZ6aK}#}34;Yxc7FS6k%i|G($3lTikwdGR;uzw{Un77T^?R$BR@?(WCLyBgJd5h zc_ydaD025EX~@i(x-g|=R2h}9wJC!0sY<>#C{l}A7i+By|0T}6@zCxGb)|m0z1K?` z_?x~Fy^SYbLq(|(={haY#lJdT$6ATP8BQXh4uA-$6lCiHN*)62iVYddWa*A`p(kZWw z;4xlwhAtnhVWrE(p4ky8Jib|c14^yyc%I{W8YSX7gXEo1&5j-#sq^*2!KsCWjgK_X zQq3Hb9UM6C>*<<786NuZG_S5aO^Mn>wdPq5B7%_TLOEu1Tz)R*y7F&?^|a5H*xtk2 znU2#jNm{ay&VkZNK3(bzpyjoGXpUj}VXk9>gQF6Xn;!A73HScfmdZP{I9?dx_pOOD z?#JH~5+XlNd0%R=H$AR^oLB+(at^LjB9?e&F98ek7Lj_-W-fSc@jm~|Y0YT^ID<)h zDzBoA{@n%lZ1x`F`2oVk6$tE=#&VKc5(lYeC3ZdrRbZNBuh*MQ`aXSyacluO)#i~} z_Co5KdnTKm&2qT7@_Oc0&u?udQoO=~)4mkrXtn`kcOcyd$D#+s;w#o*wx`U5f@p$I zx0ms4aj}RAspLP5$3zIuq+Gt}Z)|p3lXLkY&3TtHym+^46vaqw`q&s=7p z0Yxon%ZM8InZ-p5LTntOH|d5(XG+Y}1i5&$X+Zt7bai-zY1%tOG-VfT38XEP*CSPE zgA-xw&t}T}(#~`c_{V6qb*VtFNG`1?@k%xtoWy+kFxubeT&QMer2^(>7x{p&H;UIP zw#>HXZ4e??iEc_gqKxOyv?h=4y(@Xm{loF6Vig4^r(btA_F*Lqho%N-QtGAH?F*N` zDX1(ovLtqFd>oml)O1Fqy%sw3z_-^pDOzhV{g}yH8)!vLF&p94P9pra#&`OSd8#ex z*R|dWUwlX3vtBUY&%Rh@HFH;UjMXD_xO^b^*3g|!9L@@3*l}})iu~g3@iR&p(caQj zx*Z=NF*7WE+Nl$*e5GrwuU}`WAx~?hgsGhkYWOsXNmK{jnrZk@z^3L9TBPbY?O=9-fN4a5diM4RRhtH?)b2hyk0zG!iGctT&G ze!2PFOkz?Q4GmeJEkts;_5QU7232_&XE?&s+A?v;wIthy#wh6ZB+4Hzs*F+KDC5D? z%s$=q{JlLTEblbq6-Vx8Jk>(^eI1agh0t& zTI+mnnvJN)+9HiZYsyMZPiUnyQ~XW4$MCX4CQQ+OYHav7xdkX9o-5F zykfa1+0og~u%zw<+B^01cwI;yRXup>eCp*z=hUqCrgYSMwd`|jczOOh9kU%*br`V( z)YL-O@T+xDJrazv_1)_<9SZ(Bgk|CF5vvb{an^mu140%p;o4m42J3+2lUYV~OE2`0n)EJitrHlJmDRNjh3(yy>&S#H>^1 z?gVqD3K=KOm=6mim@|f4BKlt2!#<7gRXdfkK?1&_#H=3M&ySpwV3euv0}ytPT&oZ& zQEPWxg$m=mS$rMsqv55-@;BN4*5%cJ|UMuFVZxAs$&4QK2nsfra^Pd<^o?bOe!Z~OYZ zt_gga?=>g)6DafaeX<(^IoRFn-BjA$YCfplA$aKifzqDo<>-jP(!lPxyNMEaMyTMP zr*uh~_3F-GuCbqRSmcGXAOJFd)5Z!+&~-e3(gjwQff44yis((H_# zf5}S4e$HsfCryld_r*D@IRkw&2D%HH9T~Z7%|10VR}XSClI!66y*7R|;j*d<{@AXq ztDjX_{biYo#&gGWGvcuyW9m2wVHlrcjeSJ*#J@Ho0EX|6Sw08klwZLz(>c~$rLKw&zCC`YMm3f=`Y>jiPT|qH)*P_aCmFc6MNGKsmt9} z{CKjiKOjOO7Sp};{pW}bV$pr+id8m%C3c-94FF4yxhC3fie^)NkYQ@));|9#a`sqw z)IAPkjkgNjKcQIIIGJS4_x$)b6eq-rc5AV+c!G&RH)*P`aD;223D!fAURfz!KhPe5 zA4^s}cMW4shTGg2shWTPTceMK3yBi;JKk~*t^E!QqeCQaUC%1y81_#^J)PL?ucxQ{ zL3;OB8}dlM*QUYW%K``}?j7%COQ5wl+kveRr0)dqLNscKv*wKO+3)PZbZS4ra?KV0kyPxPC{f87CX8|_a?c(Z1=}uk#4jyyed))lFZ&rA_Beg$S<*Tb0Lmeq{ z0)sLzAJIE{4=EbX-aR39m%d3b|C066_kw^ZIl)t+p0(VgFBfOGCVaBE#$o~X3zIU* z+Umvt-_WE_nm6|@!?B9g&YH1zPw@8m?HbiEKF6q1P5;& z%B3mnMwooajf@`@+wE|t`My*I7XN%rr$Q25XR+A)nE6F9+pu zJobX;9n@~zsX4unvGCC&cXG7(oY-(<%}d8wVlB>6wtY~YC+dY-p#9jUXR&T-QH7{i zeVe9crfr8UX3iCxE~Y!5@)PTC)K!e!z!m)*DxA7iwCn3h&LP23Gn!Zo!{ANEeVW9Q zS%`A4pUE5)Y^rzl#k}dF9rZaHjn%b3aqW@ivj4rxkxq}Z%=J3&ru0tRxX-w}4Z6p^!s$|f!J-tu zM$pLhd|SYcx8gajwmrVntr%YCIbC$MMhFaYA~jW?57EgYj0k;`eU3S22o>JLqch)+ z(eQ-?ex!+DZX&{*j7-0Dr{Bc~MlwQP7D77P@KB5~Gi5W8w!6Z?!ggl{G_cp)JGL>e zE2?zEa=^o$*fV}*i&T9lKyU0bNmYsM=UHCP!cXlVT9ziro4hDK>D4FLlpW(;ZdI&6 zS`|#-IzUYV>neE>GWC;USFRUwE1pnJ#$@Z5?7LfdEHLI>g$%uU^ljkWSezc02gLcY0xFB9GLI?PCW-TKX?4@$H3^w;iBhM zV}@F0;&Iw9M=Ymi@jtrZ-VH2FEk52fV|Ax0w#GIMvj;n1{Deb^4gbZ!40hbylgmT} zJ_{%NTxaxB4K-g>ik`%}5{#gAF&1G?NoV8@VdkW)off*sGEze#AffrG(joqsdg`-H z8d%1y;j=8P?Q2H#JPWQXE~9$Jw#qQ3BIG`nf#oBQOZ6Is1J?5)}oN%lS7aFjSbQDI7-h%U}p zMitgVZj_t3-(!5<_0dVDfiX&U*jBF=(y|aVD)B_n)j4CsZx?)`9eE*bs*>MepAhlk zm`7~zj#z!%D|grG4=N&)q#n%-X(0-;3K!2h;$0otG4q-hSuI^As%x?N;M zpshNcU0AGTv^hP?7T~bk_F`yud6H>-TC2FMIPzcdg&hX7LF>L>@9Y@0zuiv@Q%~qr>eR~mu&(4JQOtKlmsw z(0karr@Evj+#zH2YHg0i03mhi=0w*h*-D8sC#8Ol?fge9b83e^0jiaXLj7}&wn}Rc zgkDZ;nat2gsF394taNRdaI`Io=owyMh?!mBJ5PdndbFnMq@CM7X_|l*)p80AXFD+i z`(;kn_PceJt?$eHVWkxQkkHRqNtKFa-IR9w2Wz*lxfD9EzRY>8221IFO+OG(?4{2= zpIgrzL7m=3OgPt?kj_|F(|C#ApJ!D+x}wJ^M=`oqv#K%Zp`5#Ed~VX?r8iE?0!9IE z)uJ-JuG6bKF3nujYW-Tb8Tx zCFh^Nio2a8^|WahGJ@w^DiO5$^a_knli-fpJOcZ{gYzQRJ{3~V&cmq^K+4fJSe_sy1R zbUtP5KKsP;?CEpI;@6DQ^WEn#U7|3G~~( zER!&BIOwHQJ6?m^ZoC{Fcw2rUR^8q2&aNxTdo#(8uT|;OSWJ8HV7haO&)y({J1z!i zs&kuU(g{o2E?5}V4TYqHgxR}x)t^x=f+*2EdHU9$(N4Ji$@A@D#u4tjdKRC1)q?Bn z91AWa6-{&%x_5Uo;oiy}^YT-LXw@{3Yw%SBUf139z;1am|B()}TYUbc{qQ8|`>8M| z{HMw!syxrs2&23Tw&lh)P~_B#qI$(aJ2f>GK2xIDPoKi@-Oq_6t=@U4RphhBFB#_h z^5Pt;VeuuG#;ev~HT4@IQ=5-$t8Y_r7&SZy3Qz5B)3NR@G|#T@S;4jFy`E9QlLWz< z*SewqG^O}%(*v)KP?hcDBlUD+?5X!mBecnM-L7BQ9bK9mE9jg0Bs;P@qqV+3zMvNZ z`ZOQ3{XpadukJJV#!IXGGlN)X3<@~&I`(>=eb|-n-xZ?Lx`tmf-$D#qJ>@Z%>{}K< zK1)8dfO!|Z5sVQw6N`U^4{q;OY+Lp2lp`J8j@^}G^I4~;C$kXD=|xGYsh%_T+7n%Q zuLpf2ipBMtoE$!LaXBfujARqX4aKp)411L6IS1i*P|7dRw76?qbl>CY0%hu_?$k#d zr^;|QOUlVHy~{}=telNLbZ%ImIhE~+R~bGxC+D<`yK#>Md#HtSV%>bIxIQ?F*Vs& zJ@cs4>Nh>xCban?K*bUK#RR^9)J zux`qj=g@4lp%AF8W# zR=n=EJ!2-Pz^X`?8qK!MO&!%inHYMItNOE<2HY|w+_;j76VN-oSr%wcpS|{qms;0R#d@G2GwGPW-*jLm>n&}kr*0S z2&R$}>WC^&^CviUlGeESidg3>-deZX{K%>6t^=i2H8w-%JArbt*kcA%X|ooJF`dow zNLv#xc1mwkCY;+E>4F4=HsbEgrgWV`Qi~VVP?O>6?~!iggN!&XF7rpRi{jV5zC@6F zQa(OHNE?K5Zz$^DUIXnExoz3`VK)`+m@a2+jOE5$!h6F|J6hBh)pdsZcyfM4^@sDv zBk6{z9=rlm8Hw6~9Xq9lHC37)`=;-U&n%u4&i+t*;efctuxuS|f%KjN6+qvDYRa$&5_Nh z-aIHa(HaWqP{zPIeN(rxB{r_c1<4r2bSZ-E;^|b%=R6w(dHgeSTnKlFbxac3MzmDD z?JGB_%}l9K3(4n7<&`_fS@B{yPU2N4F;))Y6P8P$wP<^g|7&4RL z!4nD>`O_T<_jEs8_UeACFMF^>5lh77vMiq4B0Vm9x`Mgy2W)nx@C3c& zN4HK-5a}(oFpQ{Zmo$P$?y)f%@~(XnurhRH!3n_BN%OK!C#qr3}CUfGw+}Dy|IrQ)U0OiF!h+_rGdwG2FxJe;`!>iwO|jb zKUoJy8~%Q?l_3y_f8a=@!rf*lf#kM;9}h{x-mY^B5l)%h>XT&l$Jmi_Fw>yS7b01m zw!*e@Pua%r?JrX1hkOj*?le0;WX(Ac1euFZ%9(ep zgVub`$yco2w&Zk%6h~tdzfFI$22y=}pCne-BX0!Nk9n@Rv$VfI&gN?T-qy0~r?k1; zn+8<5nbo1E^A>Np?zsippVn9_<{}n}czW|4*FcIYq{HouYPo6>o=E$=4kjmJ$Mk*3 z z0tExZczL0KHI|nj_~H+%QZjOJvOKiy@<5?z3o-Efeup;b0w7fYlQUr6J~U5*Akub# zNfvF8{$U9J9tDxIG&3^=%*kl`u^yNY=r=BaVL;~tark13hG$%eMf!e?!-Ve&B{9c+sYP2RTzqa|;(V zgS5Zh0(N!4;%{jpZf9;|3N!$s?qX`IiM~-Xx^~zyFbsi${$zANZ0DCQmKO>I|1Suj z|85xw7(W;ZuowwQ06&5s%!}X!2>@XE_@Q7p9}0{RfF1@EfD`>5ogTpp`*H;={XqKv z6hPnJBY?E%fG*=(Kp_CpgQ5w*j|2ixkN`iJj}Lf8z`-b>az1oG!NG6=6bJ}lUKB4F zg#rrUMSuZk0{|od01Dirujuy(AOIc>d_aD5nF9O*!1YTU`g+(HV5CD|(IC)`LI++L z;xI1?X!w^hfV4ophxZ61KnVWBfC5ApeJ{WV;05A&VQ`>7|&;$f90E7jh>qG&04vF#&9Qt}FKj@l}=m#j8L}=LP zrlGGuIOGeux-S8Q0-AW36HVVAHvqsdMZmw*jzXgXkbe_{Z|wSZ1<-=N0Xam40A z$;7uSAPWFKBkpFY< z2vF@u%CG)1aGV6Tvf{BL+4+lo3F_0yIsCu zYiU5^O2LO6LBu3fdt#U6H5ZRygx!aG904(z%>3NmOhIWHeMH5ir#;P1UF%9wUd=$( zeh?qrs=F>OYj^qzXO)T!XG#IG?M~WWsKx2L)q`6pTXprHF(j2Vs{b6J0q*}nGk)0L zNv72Mn6Lp%aJ)Z-Lm2bbfv9RU%lMN}LejL-R2TMS!vK(-qc%ag5Pjj!kb3;hMMknn z73UXH+6cA@-%NwOZfJA7c1L9~pH`7mJ=G+A$PvJPRvo@F6ZpRV%1Zd?vm0x)WS(QYW zOfL9x>(9HKR92@A3wdmI>3+8ne9*o&vARLSC}MaeeUGL#ZKJ>}p!gyJ=F68rcG8gZ zsuS_nRu2E$=aJzyT1NfJCo{{SJrVmNB7rk;slaH9%zyT@wmnJ(MXa3q`uW8}r^S$W{pPzTU zORx!l(6CPKNKbCQ5r~^fzh7Wvrb1pD;3qk3D0F|h!CXxF)kz)~4u^~hU*{Xi&G$fw zj{@3lD&z{1=M|aXKu^otEXsHAKDBU~O`3e5@lw&cu5IR?)78ga))TQ!bpc&_{IePY z`JC1fyrc=z)^v?Bj4LI58Tl67I-HYyca$!X$28w-eW&xHb0&DTSbuhytFdRhx#|f$ zlh%tx&i1h`-*L65*UtpDiem@%9LhudJf>x@pO$lQ%?Dr18hJXQ?(s=|^3>iZtj$I( zh9d}e#LNR26aPvtrJhDYZxvjuej#-zra>ChHmvRTJFf~u#~d9fV%a$^cn`-$~g0B?P;=;aPc|n7e}B%`%Ql9HNQ$O0?PMy zSR#=Mc33cgjiQJ1q4AWB%riCdFTI|#vn>VFk5fro#nve5s56EmqkO%V)*MQc*M)5Q z%*cGLmPj2-K_Yx5an))IX? zC1=?-<;MIGPVDb2+FlQJ%!Ge_8G2kHtjL0S<5jWU2#;Z{x}dc26=kOa%aDu8+bR@; z)y;JTBwIGpk{r$v!*2|lpW<7`+E86PzlY73@#3@sk>>dGT;5`A;1T3K*qZ zpahRUQtmfkjJ&I5Z@nMz;b2s)ivm}St@06@u?Z_C1hyj(IJpyv$~f(5?xeNPb-_=z zsqmFN#jUvM%Wgj1bZw^Rh!9M*ahgvv+oA|Mq}L2In>6;c+B2!QZA7gCrQ*(*zY1z>Jkw9KQvKF^<|4Djr58E2Cb=@_+XtTzDk(+c z?n>dAS0dk0efH`D)Pax0%FG(1M-c1?wFa1){+)Zg<$yRr`Ow@$UWCHoDo`X`6%Z#l z5_tmQTy5whU>F;8EZhk9RO3lNjC7qF1i=qg3I+6O^(`?R)5*+_z;cAT07w3VD2b>D z-IZb{SQhYuteskCbzqdq=QdlND#A+SP*L=(M4aj;y(LQki!PpJE4*KH>q&^jd%KzC z+fCqnNj30O58^s%;ctz=H0c*ne;DzT2JM<1!1`}75W7=I9dv=n_pWYUrtl6Fo z;ys}hIW5vQG3jwo9yXI7W0B;frc#3+>3VV%E9i5&jGqDM^Nwxy#@j3)PH5C zh?;_3s~GO{1q%K9&(`ksxvO1#QTx%}T2d{Kvo;9U2EEx8UOlgHiOkWjv+8n@o^bXJ z9zERz_rS*?p=_d+lX35uD=)e5l=3skuH(a#Ii+%Y9}J}JNW}V`2v=T9!*9AN@Oc*E z-8fo8_-I-LE?#o#HHSo-ohof2nK-G@LIh=Qrb?<#)0FDF?VX8L zQi9kG?Z>!v&i&54j$_-hZ*IA74Ajo$Q0azTD2jhz+y9pxwxN&^!~O6;Afl zP(i>jEpAr!)pH$J(jtcHM^9aDF~y8HD3&jKc5Gev?DAZ<*R|FOH(hLANqp@wQISk( zOAA~yIh4aAovY+zVyz6K(TId}WV^Wo>*Ob=S`uWAHA}fR%e@L?snB2>XOX(&BZ{l7 z0wc}jO*X5^BWVv22u^07i5h>aWihw1`VEK5)N_c%blW3%dW4$zPhW+Ss(dgO(4{R< z?ujv9j;hU(OpshS80{kR6F81n92pfGuZ>R(^JU@^*@<9w=KDnFnLhql$0M?H{2+dT zMO}4AEtkhw;!+@8UmEF}NSZa7PHEkH0j`V$=lT;&evghL(vF$jl!sU6zK&rgS0-?! zC(_MqdSq?fJfk}x96D+DQO3;lv@c=U6^Th2??CV}=0h5;XkK1&xXx3ow}hR9x`v~9 zbgCgfXQM~(T+%gL9`w8_dp+XDC&|73D);95Jqyh^L%#uqE$wRtexmVt32yHqB|N5; zgjjkQL78wN?z0uwTi)2++B?^+w)UxWdxxQzxOZPa=?DrQp>+x%|Nc=(hc=QnfN_r> zXo%y1Kob{EM*%}ZC<*+A;R4Y+Uu^tJcNr$^nA4XjwNIQknN$fAtDAP>?wrIXc3}6K z=+{V!9lUB8A%Br$GLy{xfXMuGc&__^N%A(n$wyYLHN-Fe#A+zFjF8?(-+= z4!7i{x2uMZK8uX*Up)vQMM zGShb-sNCW*ec=RR6W8m%xdkHAb{=o4f`$4< zB8=P|@^b7B+KG3(92OWCYeM9kGS)rp+|q3_E-vlTV<3p2P7Q%MJ$4dp!|W%J-1fc2b*)l z#zh(F`Vc`DvYyDgpkuqOT&Bi<|= z2~~&kqAqsK!})kI%bXgxSe;qH_@_b)#jhZM#RSR?(2XOo9-+q}fEE3})`wDkY}*PY zSV3V^L&2VGy|ZAsh$^ppLKAs%gSAW-FT=C+d0aa=b&S@tBwd5EZ={%I?-Ol>&&D&3 zGuNn(#9pVNiVbo<&rq7kwe5hpRah^^oi=Nym=$d>*mkD)bAbQeXsY_F>!VNe9=cnAFUq0UPw5@ z&Mz=hoDQoeRDP|X_EM|5z3;yG%N>NU`PI8BM2RZ6n=dfI0WTV4d_^nz8hEfOt`+}W-t+TFA#)(%;Hka>3Xu_L7Q2tAemA11NVcYuXKD6Z7? zY{TQ8r#}D-gH11=5R$OjJz{?$qR)Vrz+s1Imc&UR;PSuZcxy8jimxxLayNM;!)Unv z&GFE!Y_*M5;^>r>f*JqiW0(>r&5nR}gt`R-dV;@m?}7jkVC#MU3FHa(cGa$Y8O5>~ z{@JT=@jkEG?5tx(~);Ne59Y?i#P`=)R zngm74re0K7K88)c^K94ao!zS2&0~hG(8Fc!U%e0j`{p0Q2?MN>e{CKrteX&R%3e+M z!9U*L_fYsk@cjUn18cS%Y=U@bC;K?n?T9;)iiRukCev&h7YapBu~yZ{3y|cg@EyNk zp-6y8%2aq2vs7;?Ty;&La0oj&yyJzAEmDfMSJ*!zXN6LE58@n^8$)YK)KQ@RLb;>M zhccde$Z4wYQK3^BIb-G7=5(RfK&N}OmOGzTGx;tVOkRTyAHlvOv?v&0Zu@Kdq{9Ws zuwb~yo$Gwq<@9~F3%V;B_YU$-jL4=hVIt{ksFb=qC@e&mN@db&`mGna&PPf$QbjVT zs zL_?2INDzRz-=E^%dkaQ&KkW^>-DvDuIV(N<^fo7`n?V2Qj71t+Kr^L z+>W;$Eb=H(6ncHN-mf2lt%yl@QdP@tpih{28wmimd ztDO^!SqQMof>_&QW4IcYtIOGn%wr_(`RnYAfX?1ho`; zMZ+e>0FFCa_+`0_HtTxiF_{d7v$W&Tm)%fxMRyyV5$M z8Xjtz#GS7K3fj7vC+~Bu`N(tnGpmHepN!x(wX5=e&P(|4VT^j#-I9H4GhDBadIEhtzvz9)sZ>(V8Q4Cj_vl``2C#r6ynp=uXR@KsUkO zcF$MG0X26231Qwi1(u_WTC|X^hFf=lpGL)s%Wiqh1R3AlRa3tfyv}^Gw`%@!xwV?i z!>bAK;wqH+@eZ}Drn$^H$4;Mf%~?74?Yotw#q%8uVT{_8tZ7mW@Ya^ald(_Vm6+*y z##%OnUGq&kJHp+rjjcxag8yyscA7i)L!7|6gxFvZgJuwwr}+E(vY|IW&}e9b2j0@l zJKPCUiSTy2H6ceJaGlFdm1z@k21dR(K_@*aev2(KUZAzcWpiq$zx4j+u{(TE1UZ-V zbahOgiPF7|ZsUS4d1!CCY>c$u#z(HE?=K7!kReS&Bil|CP6+s?C#Y&(tCEZ&?1i;6 zZxE$4)8d`q6Q+0)#zxK%-7!T(nC4}`m~khG_a)}*^mDe9Cx~XsnlD%1qC8J+9l3oh zPjT_q(n0b2iu%z}CWg1(ZAUQY2(1nNFS-M_s=O1HIPT-VvzxwVIa4NaX9MOAMsd4N z;1Gt0x#-T^zmp2)(yE=0$hT;oLcn~cume2Lj@oL^iD`i4O;k{6Ztp!d8OI#s@p__0 zN(jsfi1+VsOfI%g!)VQ`MoouERxTBbB#3tw=(n%|-qOQHtmZ`L65u@L&LVu^1sUx) zqi{RTlL)fANIyAdzX$g+pB@({yHg|+%Iie&F$)sr;(swT7q;TeZEMh{#BbfdqFt~) z7tMIdk%yfcQb51C#fwF)YFV%@CfD%Ej(E%YVbs($g@vb7gR|FrJJ*{u3|sGw+KKTF z&rH<@&VIa8ys)qfY``(p3p|2`N2!lHolGoL!zwAXAH6t9>)AM`i$jtcV|i$ z_edW{n%(Sglc-^{@V;K4ZaJClNZ!JL!hXZ?CMlzqq&hXvd<+@+0$CR6{D|<$^*;5{ zgPi=@?p^GbI`1@z8DnNwAOt7*II7ghi1G#n~{Y>xYC%tzDG#MN9 z{mY}76V}zDa+&AVMLiODl4>SLd#sQPvE|&(-j6D4A%&3*L1uxs8!h7>9ZM8GCOJBg zt13y&*guq|ex_vdxM*;d9q|j3id%7&%nLza<1@5e;=Os&RD~EG`Db$Y4X#LE{?9nh+H^5;6e!>%13q6;E_wS2=Cs_9wuMbMLvU*4YiRLSYg!) zeS#`uV30d@V_r!;A6+)rVqdyhhNHFj`B zcvQ`IKg2&>6G6YZCZg^B&JIQ{SG3^+;W@Yd+>SPaw*xLbamo8U0bn}%_4x}F z0iXmUumDhk3E+qY%$Q7p3y=sne8>U}u>>9fgf@VyCGg4~1cL#{0aVTaN?;iXh;s+L zj(|gSzPn$3IeX~Gc|3HJAK7ixazKk2l zuK*6m6<{1X%yKx?Aiu&e2OPP-L|cFXbHrf+OY}f>Sc(l8a9uczI~;%jJ^Ap#9+1bc zcfhcO`dZ14(GPW46X@qb@NmrzK<)&b{PrcQGvKlP_3m(}Lw#*9dh|mb)(ZMMv>r}8 zfxIq&kL;Hmhl3`V_bUkWI0{%R4xzb&0fW}z-QhsX`=yybMksW$Z%mT`9L2w8lYs$# z!H4;NBt@6=EvY!{=Y0y_kJ^JsiUWxtCPu|i+hyRz!fYI|uGQ@wG3^)ewFd_OX zD*Dq{^pke_1L98$g+C&{4O(dJMG5T+e%LOE65xCNl{89lFre5TQb`H0@_c285@753 z$`K_L7+CBF5&-A+@q%GrWk87!46M5xW|M(&|Fj{+*3!-uVCR>2KY$$8{EdSDW_#iX za|7=F!0(5_35J0E-Qr{$E>7eNCXn71k%p|vD@dCzKeK+6pg8lX3d>PU@ddKKUf5Ih zbL5(GR>RIIJO$;lIgi2cXElm!SsDUXx)YC*)^3$LC@*%PRr&|x~ zuK4Q&1fkL~16Ns_d4|%&NZ03q#$aWNW%BrTy_#{F!Nf?CI-z+4x}W6f>p7HvvkM-< z8w9Y0=x@frujnw1P5ktEE}3A1yQY2AX!Z4#^)alga6m^u`$?+*BQ(%=lcfL;90}(| z0vnQm%>vxNJpI=XKST`q4>rvoL{{lX4ItovSrn$xG4F#Qq;T?Hcd#Rh;|bQlp^hV` z#;A-T$U34~KYy41?XLmYUh%IK2jl^OstMR&HKCdv)6e`=zEVBoNUEd1_kR)BA5`b# z;RiGVK%qkd+h(}=c#v>DC<-dT4-AFBy!!cT=0*KGeoV49P_=%Ij0aVAoBwMNjz_G_ zYaC!@SwO$W-{ZAeTU)jnNKA)3{*0zLR}JFPqohX|V>aX>N01)ff&K4qo4`Mak?ma} zkhd6t)W;+i>ap-uv#N^CQ!E|_Bi>-#=f~j*eB`a$Bky4`qx13n@y49ay~(rM%N&^lnipc5uPcG}?2)*trS|I+#& zE&zNyC;@&bA1@p|1q6EJU!D&){e86w1B3ZLi{p28X2(+Dyfy>*dt`$Ia zyg&CTlE4wL=uMGlfTaNk8+#WUOJlGbf(Pg+xWE=JE)LFu5Qy#fS3LGk<{TghuzT@} zs|j$T?9aIzu9$(1(erJ)D_=_hQXUp>X>TWmK8*K_lpq`mM?sM=;D-=E@}Gsm*`ZK& zj-Q71Yfh$SAYelg9|+ic_4N6}P{{u6WANprHKE6L_4;*-m)(w8a0_7Ee{$4LY0_gAQVEp{R%FnNPVf?(n-0b%_ z^m@&2aRTTas=vkoSkU@7`tJuX1$faq^lx$eXx;F)IP|{HU*mv9C1BC%_c-Jq`~db2 zqvsgElm~-B(d$RQ#lilNNf@9J{*Dg@<3($!zvbma&m(?~1H|tSy1-F?$Sw?y)+Bz* zi-4jhYQL6;K%yr_zr_K9|3@4@dRq8fI)Oj)A_2YP_jEuNf0T#hhyKwvq`)711Kc8j zt&P9ci$ZTb{XLEsJw5ytA20Mzd;ppMz{iUMw&MPtm-kOOJ)%E=@u9b4{+5^T2ww8> zqbJk9;DZBRWCkOBP<_@9cn literal 0 HcmV?d00001 diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d5_n250_z.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d5_n250_z.csv new file mode 100644 index 000000000..cdd552cc8 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d5_n250_z.csv @@ -0,0 +1,17 @@ +p p_l acceptance errors runs p_l_error acceptance_error +0.009 0.0007890339097207587,0.161573,255,2000000,4.9394323025686795e-05,0.0002602567632848376 +0.01 0.0011265701109701436,0.132713,299,2000000,6.511223632910568e-05,0.0002398960812841677 +0.007 0.00040734497233834896,0.24223566666666665,296,3000000,2.367080548162525e-05,0.00024735773585451916 +0.03 0.025298360285963748,0.002608749999999993,264,4000000,0.0015372192285635726,2.5504629106485224e-05 +0.005 0.00015490446723033228,0.3629295555555556,253,4500000,9.73824970047213e-06,0.00022667239858429193 +0.003 3.526640834883042e-05,0.5439522962962963,259,13500000,2.191420229100756e-06,0.00013555597330999815 +0.05 0.0940370801139355,6.871794871794202e-05,252,39000000,0.005638159819334154,1.3273573761953313e-06 +0.001 1.28694527985199e-06,0.8161162689075634,250,238000000,8.139828692263711e-08,2.51107215820172e-05 +0.07 0.15134538152610452,3.144578313229873e-06,250,415000000,0.009920757178871009,8.704753478938209e-08 +0.0009 9.236335175530411e-07,0.8328545476923083,250,325000000,5.8414865420648934e-08,2.069617951221164e-05 +0.0007 4.305385983106496e-07,0.8673773054518295,250,669500000,2.7228682928316697e-08,1.3108037055857542e-05 +0.09 0.04252726497288748,3.344909522863836e-07,250,2735500000,0.006670930060891094,1.105792793462423e-08 +0.0005 1.5508647826796515e-07,0.9033607671616706,250,1784500000,9.808397197275573e-09,6.994377580909208e-06 +0.1 0.023195458231954538,1.5201946471647367e-07,250,5137500000,0.005386166773271978,5.4396837178443764e-09 +0.0003 3.359863926833596e-08,0.9408375637880885,250,7909000000,2.1249206895028857e-09,2.6528919455898927e-06 +0.3 0.0037853775395813435,1.4865093136788645e-08,250,32559500000,0.0027913119551415313,6.75686046659029e-10 diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d5_n500.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d5_n500.csv new file mode 100644 index 000000000..525414b34 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d5_n500.csv @@ -0,0 +1,16 @@ +p p_l acceptance errors runs p_l_error acceptance_error +0.01 9.218831846556789e-05,0.13254195121951215,501,41000000,4.1185971923604335e-06,5.2955246264994925e-05 +0.009 7.262618113061721e-05,0.16196414117647068,500,42500000,3.2480816039759583e-06,5.651272800923366e-05 +0.03 0.003720151668562525,0.002588865384615384,501,52000000,0.00016592605586369122,7.0467711654614775e-06 +0.007 3.243637487425767e-05,0.24230985937500002,503,64000000,1.446217399192766e-06,5.3560099337197216e-05 +0.005 1.0898580634137458e-05,0.36273152569169953,500,126500000,4.873541742426324e-07,4.274729179976205e-05 +0.05 0.028145157917956277,6.771428571427743e-05,500,262500000,0.001240502779149001,5.078796276201399e-07 +0.003 2.356820377636626e-06,0.5439301410256411,500,390000000,1.0540443007681193e-07,2.5220572733358653e-05 +0.07 0.09330624726955027,3.210275229333553e-06,500,1362500000,0.004397909453968927,4.854026928225435e-08 +0.09 0.04242396142433262,3.3104599405770117e-07,500,5392000000,0.0047706014350106084,7.835544019815783e-09 +0.001 8.007557321019628e-08,0.8161107885243768,500,7651000000,3.5810991888278188e-09,4.428876639908826e-06 +0.1 0.02612321764864141,1.5356470271342852e-07,500,9292500000,0.004222341481762964,4.065176285614761e-09 +0.0009 5.85463849870974e-08,0.8328619964891738,500,10254000000,2.6182845920077193e-09,3.684490756813379e-06 +0.0007 2.7829723626588102e-08,0.8673898085697025,500,20712500000,1.2446035128124707e-09,2.356564590995231e-06 +0.0005 1.0122197889987248e-08,0.9033639369422166,500,54680000000,4.526804949359123e-10,1.2635334274500818e-06 +0.3 0.003476022111850033,1.4731879787473781e-08,500,71274000000,0.0018163121669546821,4.5463567714636175e-10 diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n100_z.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n100_z.csv new file mode 100644 index 000000000..cedc1fe8c --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n100_z.csv @@ -0,0 +1,20 @@ +p p_l acceptance errors runs p_l_error acceptance_error +0.0045 1.3573076826600939e-05,0.07549517766497459,101,98500000,1.3510097562836812e-06,2.6619266297483295e-05 +0.004 9.457369520293033e-06,0.09315614096916303,100,113500000,9.457567508433822e-07,2.7281866041455697e-05 +0.0035 5.654685237202446e-06,0.11485035714285716,100,154000000,5.65426884725871e-07,2.569296136458228e-05 +0.0055 3.196532440667811e-05,0.04964860317460319,100,63000000,3.1967511119253596e-06,2.7366883990034952e-05 +0.005 2.4567795632771825e-05,0.06122878195488722,100,66500000,2.4563436613968633e-06,2.9399968854571018e-05 +0.003 3.2596582814900336e-06,0.1416752101616627,100,216500000,3.259938793913312e-07,2.369975248477873e-05 +0.0065 6.368380048029067e-05,0.032715958333333316,100,48000000,6.3679583678746175e-06,2.5676523163057322e-05 +0.006 4.008180761851039e-05,0.04026288709677416,100,62000000,4.006975106797245e-06,2.4965068182267546e-05 +0.0075 0.00013786540461655192,0.021533117647058824,101,34000000,1.3721601282817423e-05,2.4893563124688387e-05 +0.007 8.587741385749338e-05,0.026480409090909075,100,44000000,8.584838836919335e-06,2.420518212044271e-05 +0.008 0.00012611105279930666,0.017428000000000006,100,45500000,1.2610134398132381e-05,1.9399934754620094e-05 +0.0085 0.0001451553649005154,0.01419868041237113,100,48500000,1.4517444092436165e-05,1.6988217801175462e-05 +0.009 0.0001907700370466462,0.011509161290322582,102,46500000,1.8878406715073358e-05,1.564161838608225e-05 +0.0095 0.00027551103425869173,0.009290025316455697,101,39500000,2.7396978397177037e-05,1.526452057904983e-05 +0.01 0.00031472483572281414,0.007583166666666673,100,42000000,3.143020470306398e-05,1.338590432220208e-05 +0.0025 1.3021529151473805e-06,0.17477571331058023,100,439500000,1.3019992368073743e-07,1.8115365563653318e-05 +0.002 8.034466296474356e-07,0.21564181975736574,100,577000000,8.035704197588435e-08,1.7121263160666823e-05 +0.0015 2.2843480567621631e-07,0.26607329626253384,100,1645500000,2.2841861834897323e-08,1.089376610472284e-05 +0.001 5.591894993621767e-08,0.32829813159585275,100,5448500000,5.59122292874432e-09,6.3618585111570534e-06 diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n50.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n50.csv new file mode 100644 index 000000000..b51f60ac3 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n50.csv @@ -0,0 +1,18 @@ +p p_l acceptance errors runs p_l_error acceptance_error +0.0035 1.5629615702318374e-07,0.11485806606822266,50,2785000000,2.2104503601247943e-08,6.041914956975274e-06 +0.004 2.675827576250103e-07,0.0931278590286425,50,2007500000,3.783218442121689e-08,6.4861212459856e-06 +0.003 7.340905106041707e-08,0.14168500270439022,50,4807000000,1.0381874786483958e-08,5.0297712117440816e-06 +0.005 6.587037349691292e-07,0.061233870915691734,50,1239500000,9.315921004558004e-08,6.810065632844989e-06 +0.0045 3.845754510138509e-07,0.07550478235635526,50,1723000000,5.437018700670401e-08,6.3649782765250135e-06 +0.0055 9.369180174916529e-07,0.04966576476057654,50,1075500000,1.3243928302398234e-07,6.624628728056182e-06 +0.006 1.4470001584741443e-06,0.04026431450203839,50,858500000,2.0459907718438362e-07,6.709124123984448e-06 +0.0025 3.84397786882249e-08,0.17478542256265475,50,7441500000,5.43635217858893e-09,4.402565307141466e-06 +0.0065 1.742268418397229e-06,0.03267085000000007,50,880000000,2.4617026939954625e-07,5.9927480379013065e-06 +0.007 2.5695715618854345e-06,0.026499185034013606,50,735000000,3.632200988075673e-07,5.9243505601818925e-06 +0.0075 3.4389083299547123e-06,0.021498023668639052,50,676000000,4.864485760908777e-07,5.578363029883245e-06 +0.008 4.710767639800748e-06,0.0174482077493817,50,606500000,6.671968760736622e-07,5.316645887060986e-06 +0.009 9.437897446141872e-06,0.011501715835140999,50,461000000,1.3341473504038595e-06,4.96613834708669e-06 +0.0085 4.7947891619421245e-06,0.01417058983050848,50,737500000,6.773431454939097e-07,4.3522500262120755e-06 +0.0095 1.3296113182756149e-05,0.009340152119700738,50,401000000,1.884127565032174e-06,4.8036025752503285e-06 +0.01 9.743927863013015e-06,0.007573344574780064,50,682000000,1.3735006470877545e-06,3.319715615742008e-06 +0.002 1.5469142513658964e-08,0.2156401324790587,50,14983500000,2.1880723888434886e-09,3.3598186859801094e-06 diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d5_n250_z.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d5_n250_z.csv new file mode 100644 index 000000000..091ffa384 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d5_n250_z.csv @@ -0,0 +1,16 @@ +p p_l acceptance errors runs p_l_error acceptance_error +0.01 0.0009778274050677425,0.098837,290,3000000,5.739819842372078e-05,0.00017230616881102467 +0.009 0.0007090423594105948,0.12409171428571428,308,3500000,4.0390260596630766e-05,0.00017622466239867703 +0.007 0.00040357336913175447,0.19681057142857145,278,3500000,2.4199999909641746e-05,0.00021251969347570767 +0.005 0.00012578466322879397,0.3131226153846154,256,6500000,7.860906558908823e-06,0.00018190312008120976 +0.03 0.025467282832721788,0.0011004444444444469,253,9000000,0.0015830119811089235,1.1051563320630446e-05 +0.003 2.7590035087361427e-05,0.49757318918918914,254,18500000,1.7312340507761101e-06,0.00011624626947557744 +0.05 0.09041813314890233,1.691076923075781e-05,252,162500000,0.005470667260195092,3.225903165759399e-07 +0.001 1.0981197493133006e-06,0.7922804852686305,251,288500000,6.931260549084407e-08,2.3883898692334507e-05 +0.0009 7.279800614410727e-07,0.8108509539551356,250,423500000,4.6042867258437486e-08,1.9030311025356355e-05 +0.0007 3.520090167132161e-07,0.849549428229666,250,836000000,2.2262777860745065e-08,1.2364828825952747e-05 +0.07 0.04229661627069819,5.234635774484799e-07,250,2546500000,0.005512558976492087,1.433742900874978e-08 +0.0005 1.3526549225632763e-07,0.8900454312545167,250,2076500000,8.555027776688416e-09,6.865098291511959e-06 +0.0003 2.8770993251443568e-08,0.9324939543893578,250,9318000000,1.8196717627525266e-09,2.599159873361169e-06 +0.09 0.0059512258231450964,4.5653017658426775e-08,250,20612000000,0.0025073343497520307,1.4882458082542598e-09 +0.1 0.003377781402492907,2.0470578639921255e-08,250,36784500000,0.00211438254336325,7.459893484157298e-10 diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d5_n500_2.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d5_n500_2.csv new file mode 100644 index 000000000..c299eac2e --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d5_n500_2.csv @@ -0,0 +1,15 @@ +p p_l acceptance errors runs p_l_error acceptance_error +0.01 9.866330769887207e-05,0.09860619417475726,501,51500000,4.407585006423178e-06,4.1543756939907155e-05 +0.009 7.107868247437325e-05,0.12412936842105263,503,57000000,3.169418209390482e-06,4.36736839780926e-05 +0.007 3.2537643646738084e-05,0.19699447435897444,500,78000000,1.455163055405479e-06,4.50338407557919e-05 +0.03 0.0035457334783736234,0.0010925813953488372,500,129000000,0.00015832881955495329,2.9086714264424753e-06 +0.005 1.0803671027990734e-05,0.3128853131313131,502,148500000,4.822003419231253e-07,3.804906401535613e-05 +0.003 2.3999166656689416e-06,0.4976432157330151,501,419500000,1.0721919276735499e-07,2.4411765933953025e-05 +0.05 0.027620167597544997,1.7164898746374388e-05,500,1037000000,0.0012283471570248246,1.2865525129676879e-07 +0.07 0.02927296202306218,5.349272071482121e-07,500,7487000000,0.002663671338258735,8.452658261264776e-09 +0.001 9.175767817534946e-08,0.7922410119220732,500,6878000000,4.103566179324987e-09,4.891899038906775e-06 +0.0009 6.321772138813842e-08,0.8109010898093065,500,9754000000,2.827118989114016e-09,3.9649441969164225e-06 +0.0007 2.762634545429089e-08,0.8495549571441898,500,21304000000,1.2354790833427618e-09,2.4493683607975084e-06 +0.09 0.006827750320336813,4.5853926412855893e-08,500,36420000000,0.002015082671084253,1.1220656931890295e-09 +0.0005 1.0252811904476834e-08,0.8900551751339285,500,54789500000,4.5852641455932803e-10,1.3364330037574505e-06 +0.1 0.003476578654087435,1.9499681079471632e-08,500,71334500000,0.0015781788535898355,5.228341410372749e-10 diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d7_n100_z.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d7_n100_z.csv new file mode 100644 index 000000000..fca2e0458 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d7_n100_z.csv @@ -0,0 +1,20 @@ +p p_l acceptance errors runs p_l_error acceptance_error +0.003 1.6353205408596861e-06,0.21004745578231285,101,294000000,1.6273040783660753e-07,2.375666910314864e-05 +0.0025 8.578457087211598e-07,0.27239435981308435,100,428000000,8.577949108943518e-08,2.1519154288609316e-05 +0.0035 2.905027060840175e-06,0.1619982870588233,100,212500000,2.9049574929349506e-07,2.527540930477502e-05 +0.004 5.143052299257098e-06,0.12498345980707389,100,155500000,5.144200478883155e-07,2.651973657822248e-05 +0.002 4.543109852144457e-07,0.35326880417335454,100,623000000,4.543388275600683e-08,1.9150077057763258e-05 +0.0045 1.0127194308976122e-05,0.09638287804878044,100,102500000,1.0124661082979137e-06,2.914944150706491e-05 +0.0015 1.027460847753464e-07,0.45813480348317204,100,2124500000,1.0274426936159529e-08,1.0809706535675973e-05 +0.005 1.3653283038461288e-05,0.07438920812182741,100,98500000,1.3650309512562874e-06,2.6439367248016373e-05 +0.0055 1.7081363413858337e-05,0.05739366666666663,100,102000000,1.7081479562523264e-06,2.303016642622943e-05 +0.006 3.206600305612109e-05,0.04426473758865249,100,70500000,3.2054716939174546e-06,2.4496452368669627e-05 +0.0065 4.308124858656152e-05,0.03414388235294117,100,68000000,4.307486039703069e-06,2.2022073702514164e-05 +0.007 5.708847259091935e-05,0.02633772932330828,100,66500000,5.709023453392754e-06,1.9637333378454107e-05 +0.0075 6.153210199459431e-05,0.0203528198757764,101,80500000,6.128120253501175e-06,1.573798766954389e-05 +0.008 7.200858443054991e-05,0.015718259887005676,100,88500000,7.194533378227276e-06,1.322179171646422e-05 +0.0085 0.00010359286784963502,0.012124968553459122,100,79500000,1.0366175500805244e-05,1.2274611365089499e-05 +0.009 0.00013530322890710302,0.009380886075949358,100,79000000,1.3511053732828062e-05,1.0845803629018605e-05 +0.0095 0.00016198553117793902,0.007234292397660815,100,85500000,1.6181614407888447e-05,9.165124215469314e-06 +0.01 0.00021558354467736613,0.005581523809523803,101,84000000,2.1440995808471576e-05,8.128704577787699e-06 +0.001 2.0670905502746648e-08,0.5942447387298809,100,8141000000,2.067084337457061e-09,5.442217258126517e-06 diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d7_n50.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d7_n50.csv new file mode 100644 index 000000000..c1f11f3e9 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d7_n50.csv @@ -0,0 +1,19 @@ +p p_l acceptance errors runs p_l_error acceptance_error +0.003 5.581531044934655e-08,0.21005382690278057,50,4263500000,7.894565410598742e-09,6.238510569144442e-06 +0.0025 3.09235031377766e-08,0.2724012753159238,50,5935000000,4.373502777885096e-09,5.778833359729731e-06 +0.0035 1.0959906196456912e-07,0.1619983526904631,50,2815500000,1.5501378824893388e-08,6.943844225036534e-06 +0.004 1.6215409021088684e-07,0.12494724893660145,50,2468500000,2.2928941368595758e-08,6.655242744891259e-06 +0.002 1.3034382205317407e-08,0.3532516295818731,50,10858000000,1.8434366488522054e-09,4.58706442575362e-06 +0.0045 2.7749964138669766e-07,0.09640374478330654,50,1869000000,3.924456774961247e-08,6.826993866373717e-06 +0.0015 3.3447093947298544e-09,0.45815411957170493,50,32641500000,4.729207202250708e-10,2.757773740241302e-06 +0.005 5.900969780670109e-07,0.07435519175076784,50,1139500000,8.34543066723393e-08,7.771783055161378e-06 +0.0055 7.601132403839991e-07,0.057362219512195056,50,1148000000,1.074372951922989e-07,6.863007137752974e-06 +0.006 9.708548916500824e-07,0.0442639965606191,50,1163000000,1.3732884949269628e-07,6.0312096843983316e-06 +0.0065 1.529459685268571e-06,0.03415583795086254,50,956500000,2.1636834615033673e-07,5.872777059156254e-06 +0.007 2.5526981775950828e-06,0.02636876902356897,50,742500000,3.6108215258533955e-07,5.880225040214863e-06 +0.0075 2.763367878589058e-06,0.020343047725996617,50,890500000,3.9056541335994514e-07,4.730728883827416e-06 +0.008 3.8772513177591825e-06,0.015717927007299303,50,822000000,5.478070178448924e-07,4.338319297647003e-06 +0.0085 4.489260194474157e-06,0.012126884531590425,50,918000000,6.350244575083712e-07,3.612466794767582e-06 +0.009 6.1086658480480524e-06,0.009363507727532907,50,873500000,8.642136406651013e-07,3.2587045952170578e-06 +0.0095 7.438530933592207e-06,0.007227393451422449,50,931500000,1.0511378939840536e-06,2.7753918710550012e-06 +0.01 8.79373304173127e-06,0.005584056918547608,50,1019000000,1.2431476658628543e-06,2.3343816758439952e-06 From 1b6df838458b1e2bbcf6aff8578f0366911ed55c Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 20 Aug 2025 17:03:51 +0200 Subject: [PATCH 127/156] correct false initialization of fault set arrays --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 35206fe98..a0536dd72 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -145,10 +145,13 @@ def _ref_based_init( penalty_cnots: list[tuple[int, int]] | None = None, guide_by_x: bool = True, ) -> None: - self.ref_x_fs = ref_x_fs or np.empty((0,), dtype=np.int8) - self.ref_z_fs = ref_z_fs or np.empty((0,), dtype=np.int8) - self.ref_x_1fs = ref_x_1fs or np.empty((0,), dtype=np.int8) - self.ref_z_1fs = ref_z_1fs or np.empty((0,), dtype=np.int8) + def _default_array(arr: npt.NDArray[np.int8] | None) -> npt.NDArray[np.int8]: + return arr if arr is not None else np.empty((0,), dtype=np.int8) + + self.ref_x_fs = _default_array(ref_x_fs) + self.ref_z_fs = _default_array(ref_z_fs) + self.ref_x_1fs = _default_array(ref_x_1fs) + self.ref_z_1fs = _default_array(ref_z_1fs) self.guide_by_x = guide_by_x self.failed_cnots: list[tuple[int, int]] = ( penalty_cnots or [] From 902d76c3a92956b7dd8d47d1d30613ae7535dae8 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 20 Aug 2025 17:13:22 +0200 Subject: [PATCH 128/156] TEMPORARILY remove standard form features to pass CI --- src/mqt/qecc/circuit_synthesis/__init__.py | 2 - src/mqt/qecc/circuit_synthesis/state_prep.py | 341 ------------------- 2 files changed, 343 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/__init__.py b/src/mqt/qecc/circuit_synthesis/__init__.py index 5c7af9e06..779bb93f7 100644 --- a/src/mqt/qecc/circuit_synthesis/__init__.py +++ b/src/mqt/qecc/circuit_synthesis/__init__.py @@ -25,7 +25,6 @@ heuristic_verification_circuit, heuristic_verification_stabilizers, naive_verification_circuit, - standard_form_prep_circuit, ) from .state_prep_det import DeterministicVerification, DeterministicVerificationHelper @@ -54,5 +53,4 @@ "heuristic_verification_stabilizers", "naive_verification_circuit", "qiskit_to_stim_circuit", - "standard_form_prep_circuit", ] diff --git a/src/mqt/qecc/circuit_synthesis/state_prep.py b/src/mqt/qecc/circuit_synthesis/state_prep.py index 9fc843ba8..4aad53127 100644 --- a/src/mqt/qecc/circuit_synthesis/state_prep.py +++ b/src/mqt/qecc/circuit_synthesis/state_prep.py @@ -24,7 +24,6 @@ from .faults import PureFaultSet, coset_leader, product_fault_set from .synthesis_utils import ( EliminationCNOTSynthesizer, - build_css_circuit_from_cnot_list, iterative_search_with_timeout, measure_flagged, odd_overlap, @@ -345,346 +344,6 @@ def gate_optimal_prep_circuit( return FaultyStatePrepCircuit(circ, code.x_distance // 2, code.z_distance // 2) -def iter_cyclic_combinations(lists): - """Generator that yields one combination of cyclic permutations for each list. - Each list in 'lists' is rotated by an offset given by its counter. - """ - n = len(lists) - # counters to track the rotation index for each list - counters = [0] * n - # store the lengths of each list so we know when to reset a counter - lengths = [len(lst) for lst in lists] - - while True: - # Yield the current combination based on counters. - current = [lst[i:] + lst[:i] for lst, i in zip(lists, counters)] - yield current - - # Now update the counters (like an odometer) - for pos in reversed(range(n)): - counters[pos] += 1 # increment the current counter - if counters[pos] < lengths[pos]: - # Successfully incremented without overflow; - # we can break out and yield the next combination on the next iteration. - break - else: - # Reset this counter and move to the next (more significant) counter. - counters[pos] = 0 - else: - # If we have reset all counters, then we've exhausted all combinations. - break - - -def _permute_commuting_cnots( - trgt_order: dict[int, list[int]], ctrl_order, trgt_perm: dict[int, list[int]], ctrl_perm: dict[int, list[int]] -) -> list[tuple[int, int]]: - """Permute CNOTs according to the given permutations. - - Args: - trgt_order: The target order of the CNOTs. - ctrl_order: The control order of the CNOTs. - trgt_perm: The target permutation. - ctrl_perm: The control permutation. - - Returns: - The CNOTs in correct order. - """ - n = len(trgt_order) + len(ctrl_order) - - orders = [None for _ in range(n)] - for ctrl, trgts in trgt_order.items(): - perm = trgt_perm[ctrl] - orders[ctrl] = [trgts[perm[i]] for i in range(len(trgts))] - for trgt, ctrls in ctrl_order.items(): - perm = ctrl_perm[trgt] - orders[trgt] = [ctrls[perm[i]] for i in range(len(ctrls))] - - [0 for _ in range(n)] - done = [False for _ in range(n)] - cnots = [] - - stack = [] - while not all(done): - if len(stack) == 0: - for i in range(n): - if not done[i]: - stack.append(i) - break - - q1 = stack[-1] - q2 = orders[q1][0] - - if q2 in stack: # conflict -> resolve via cycles - q1_idx = orders[q2].index(q1) - orders[q2] = orders[q2][q1_idx:] + orders[q2][:q1_idx] - # unroll stack to q2 - stack = stack[: stack.index(q2) + 1] - - if orders[q2][0] == q1: - if q1 in trgt_order: - cnots.append((q1, q2)) - else: - cnots.append((q2, q1)) - orders[q1].remove(q2) - orders[q2].remove(q1) - done[q1] = len(orders[q1]) == 0 - done[q2] = len(orders[q2]) == 0 - stack.pop() - else: - stack.append(q2) - - return cnots - - -def _canonical_permutation(w: int) -> list[int]: - """Return canonical ft5 permutation for weight w.""" - pi = list(range(w)) - pi[0], pi[-1] = pi[-1], pi[0] - - # if w <= 5: - # return list(range(w)) - # offset = w // 2 - # pi = list(range(w)) - # if w % 2 == 1: - # pi.remove(offset) - # for i in range(offset): - # if i % 2 == 0: - # swap_idx = (i + w // 2) % len(pi) - # pi[i], pi[swap_idx] = (pi[swap_idx], pi[i]) - # else: - # pi[i] - - # if w % 2 == 1: - # pi = pi[:offset] + [offset] + pi[offset:] - - return pi - - -def find_swapping_permutation(lists: list[list[int]]) -> dict[int, int]: - """Given a list of lists of integers, finds an involution π (a permutation - composed solely of 2-cycles and fixed points) with the property that for - every list xs, π swaps one of the first three elements with one of the - last three elements. - - Parameters: - lists (list of list of int): The input lists (each assumed to have 7 integers). - - Returns: - dict or None: A dictionary representing the permutation π, where each key maps - to its image under π, or None if no such permutation exists. - """ - # Step 1: Compute candidate pairs for each list. - list_candidates = [] - lists = [lst for lst in lists if len(lst) > 4] - for xs in lists: - cand = set() - for i in range(3): # first three elements - for j in range(len(xs) - 3, len(xs)): # last three elements - # Use sorted tuple to represent an unordered pair - if i == j: - continue - pair = tuple(sorted((xs[i], xs[j]))) - cand.add(pair) - list_candidates.append(cand) - - # Step 2: Compute the global candidate set (union of all candidate pairs). - global_candidates = set() - for cand in list_candidates: - global_candidates |= cand - candidate_edges = list(global_candidates) - - # Collect the full set of numbers (the domain for our permutation). - global_numbers = set() - for xs in lists: - global_numbers |= set(xs) - - # Step 3: Search for a matching (set of disjoint candidate pairs) such that - # for every list at least one of its candidate pairs is in the matching. - best_matching = None - - def backtrack(i, current_matching, used) -> None: - nonlocal best_matching - # If all candidate edges have been considered, - # check if current matching "covers" every list. - if i == len(candidate_edges): - for cand in list_candidates: - if not any(edge in current_matching for edge in cand): - return - best_matching = current_matching.copy() - return - - # Option 1: Skip the current candidate edge. - backtrack(i + 1, current_matching, used) - if best_matching is not None: - return # solution found - - # Option 2: Try to include candidate_edges[i] if neither number is used yet. - edge = candidate_edges[i] - a, b = edge - if a not in used and b not in used: - current_matching.add(edge) - used.add(a) - used.add(b) - backtrack(i + 1, current_matching, used) - if best_matching is not None: - return - current_matching.remove(edge) - used.remove(a) - used.remove(b) - - backtrack(0, set(), set()) - - # Step 4: If a matching was found, build the permutation π. - if best_matching is None: - return None - pi = {x: x for x in global_numbers} # initially, all elements are fixed - for a, b in best_matching: - pi[a] = b - pi[b] = a - return pi - - -def random_steane_type_prep_circuits( - code: CSSCode, zero_state: bool = True -) -> tuple[QuantumCircuit, QuantumCircuit, QuantumCircuit, QuantumCircuit]: - """Return four circuits in permuted standard form that prepare the +1 eigenstate of the code w.r.t. the Z or X basis that can implement Steane-type FTSP. - - Args: - code: The CSS code to prepare the state for. - zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. - - Returns: A tuple of four state preparation circuits for the code. - """ - trgt_order = _standard_form_cnots(code, zero_state) - c1 = [(x, y) for x, ys in trgt_order.items() for y in ys] - - # obtain three random permutations of the cnots - n = code.n - p1 = np.random.permutation(len(c1)) - p2 = np.random.permutation(len(c1)) - p3 = np.random.permutation(len(c1)) - c2 = [c1[i] for i in p1] - c3 = [c1[i] for i in p2] - c4 = [c1[i] for i in p3] - ctrls = trgt_order.keys() - - qc1 = build_css_circuit_from_cnot_list(n, c1, ctrls) - qc2 = build_css_circuit_from_cnot_list(n, c2, ctrls) - qc3 = build_css_circuit_from_cnot_list(n, c3, ctrls) - qc4 = build_css_circuit_from_cnot_list(n, c4, ctrls) - - return qc1, qc2, qc3, qc4, [p1, p2, p3] - - -def canonical_steane_type_prep_circuits( - code: CSSCode, zero_state: bool = True -) -> tuple[QuantumCircuit, QuantumCircuit, QuantumCircuit, QuantumCircuit]: - """Return four circuits in standard form that prepare the +1 eigenstate of the code w.r.t. the Z or X basis that can implement Steane-type FTSP. - - Args: - code: The CSS code to prepare the state for. - zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. - - Returns: A tuple of four state preparation circuits for the code. - """ - n = code.n - trgt_order = _standard_form_cnots(code, zero_state) - ctrls = list(trgt_order.keys()) - trgts = [trgt for trgt in range(n) if trgt not in ctrls] - ctrl_order = {trgt: [] for trgt in trgts} - for ctrl, ctrl_trgts in trgt_order.items(): - for trgt in ctrl_trgts: - ctrl_order[trgt].append(ctrl) - for trgt in trgts: - ctrl_order[trgt].sort() - - id_trgt = {ctrl: list(range(len(trgt_order[ctrl]))) for ctrl in ctrls} - id_ctrl = {trgt: list(range(len(ctrl_order[trgt]))) for trgt in trgts} - - pi_trgt = {ctrl: _canonical_permutation(len(trgt_order[ctrl])) for ctrl in trgt_order} - pi_ctrl = {trgt: _canonical_permutation(len(ctrl_order[trgt])) for trgt in trgts} - - c1 = _permute_commuting_cnots(trgt_order, ctrl_order, id_trgt, id_ctrl) - c2 = _permute_commuting_cnots(trgt_order, ctrl_order, pi_trgt, id_ctrl) - c3 = _permute_commuting_cnots(trgt_order, ctrl_order, id_trgt, pi_ctrl) - - # collect cnots in c3 with same target into groups - c3_groups = defaultdict(list) - for cnot in c3: - c3_groups[cnot[1]].append(cnot[0]) - - # we need to find a permutation that fulfills the following for all groups of targets: - # - map the first three elements into the second half - # - map the last element into the first half - # No conflicts should occur - lists = list(trgt_order.values()) - - pi_swaps = find_swapping_permutation(lists) - - pi = [] - for x in trgts: - if x in pi_swaps: - pi.append(pi_swaps[x]) - else: - pi.append(x) - # apply pi - # use pi to order c3_groups - c4 = [] - for x in pi: - c4.extend([(y, x) for y in c3_groups[x]]) - - qc1 = build_css_circuit_from_cnot_list(n, c1, ctrls) - qc2 = build_css_circuit_from_cnot_list(n, c2, ctrls) - qc3 = build_css_circuit_from_cnot_list(n, c3, ctrls) - qc4 = build_css_circuit_from_cnot_list(n, c4, ctrls) - - return (qc1, qc2, qc3, qc4) - - -def standard_form_prep_circuit(code: CSSCode, zero_state: bool = True) -> FaultyStatePrepCircuit: - """Return a circuit that prepares the +1 eigenstate of the code w.r.t. the Z or X basis using the circuit's standard form. - - Note that no depth optimization like Steane's latin rectangle method is performed. - - Args: - code: The CSS code to prepare the state for. - zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. - - Returns: A state preparation circuit for the code. - """ - h = code.Hx.copy() if zero_state else code.Hz.copy() - _h_red, _rk, _, _pivots = mod2.row_echelon(h, full=True) - cnots = _standard_form_cnots(code, zero_state) - qc = QuantumCircuit(code.n) - cnots = _standard_form_cnots(code, zero_state) - - for pivot, trgts in cnots: - qc.h(pivot) - qc.cx(pivot, trgts) - return FaultyStatePrepCircuit(qc, code.x_distance // 2, code.z_distance // 2) - - -def _standard_form_cnots(code: CSSCode, zero_state: bool = True) -> dict[int, list[int]]: - """Return the cnots that prepare the +1 eigenstate of the code w.r.t. the Z or X basis using the circuit's standard form. - - Args: - code: The CSS code to prepare the state for. - zero_state: If True, prepare the +1 eigenstate of the Z basis. If False, prepare the +1 eigenstate of the X basis. - - Returns: A list of ctrl, targets tuples - """ - h = code.Hx.copy() if zero_state else code.Hz.copy() - h_red, _rk, _, pivots = mod2.row_echelon(h, full=True) - - cnots = {} - for i, pivot in enumerate(pivots): - trgts = list(np.where(h_red[i, :])[0]) - trgts.remove(pivot) - cnots[pivot] = trgts - - return cnots - - def gate_optimal_verification_stabilizers( fault_sets: list[PureFaultSet], stabs: npt.NDArray[np.int8], From c95e30fdf9e3b189f691c8cb822052850f34f376 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 20 Aug 2025 17:16:24 +0200 Subject: [PATCH 129/156] fix double initialisation due to wrong order --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index a0536dd72..ae02dd4b8 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -203,7 +203,6 @@ def fault_set_guided_synthesis( do not cause an overlap of the reference fault set and the fault set of the newly created circuit. """ - self._validate_inputs() self._ref_based_init( ref_x_fs=ref_x_fs, ref_z_fs=ref_z_fs, @@ -212,6 +211,7 @@ def fault_set_guided_synthesis( penalty_cnots=penalty_cnots, guide_by_x=guide_by_x, ) + self._validate_inputs() while not self.is_reduced(): costs_unused = self._mask_out_used_qubits() if self._reset_if_stuck(costs_unused): @@ -248,7 +248,7 @@ def is_reduced(self) -> bool: """Method decides if the Gaussian elimination has successfully ended. The matrix is considered reduced when the number of columns actually turned into - all-zeros matches the number of linearily depended columns. + all-zeros matches the number of linearly depended columns. """ return bool(len(np.where(np.all(self.matrix == 0, axis=0))[0]) == self.matrix.shape[1] - self.rank) From 871655e2639875e02b3dfcf4016e10f1a89d5031 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 20 Aug 2025 17:17:42 +0200 Subject: [PATCH 130/156] temp add unused code instance to pass test long-term: reconsider if the EliminationCNOTSynthesizer class needs the code instance. There might be situations where it is not necessary and hence should be avoided to require the code at initialization. --- test/python/circuit_synthesis/test_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/python/circuit_synthesis/test_utils.py b/test/python/circuit_synthesis/test_utils.py index f7e8f3c58..2cf76a0d2 100644 --- a/test/python/circuit_synthesis/test_utils.py +++ b/test/python/circuit_synthesis/test_utils.py @@ -162,7 +162,7 @@ def test_heuristic_gaussian_elimination(test_vals: MatrixTest, request) -> None: """Test heuristic Gaussian elimination method.""" fixture = request.getfixturevalue(test_vals) matrix = fixture.matrix - unused_code = CSSCode() + unused_code = CSSCode(n=1) ge_false = EliminationCNOTSynthesizer(matrix, code=unused_code, parallel_elimination=False) ge_true = EliminationCNOTSynthesizer(matrix, code=unused_code) ge_false.greedy_synthesis() From 690dde148b41728d4f8b8e27b38b8a30df618d02 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 20 Aug 2025 17:20:36 +0200 Subject: [PATCH 131/156] adapt fault set handling to new PureFaultSet class structure this might need bigger rethinking, so far I am handling the fault sets as initially only as numpy arrays should that stay like this or change? --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index ae02dd4b8..322d34c5e 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -498,9 +498,9 @@ def check_mutually_disjointness_spcs( x_fs = _spc.compute_fault_set() z_fs = _spc.compute_fault_set(x_errors=False) if x_error: - if _spc.code.check_fs_overlap(x_fs, px_fs): + if _spc.code.check_fs_overlap(x_fs.faults, px_fs): break - elif _spc.code.check_fs_overlap(z_fs, pz_fs, x_error=False): + elif _spc.code.check_fs_overlap(z_fs.faults, pz_fs, x_error=False): break # Stop checking if there's an overlap else: # No overlap found, so add pspc c_spcs.append(pspc) From 82edb70a4b022cf918db998b689c2396e0b6e245 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 20 Aug 2025 17:22:05 +0200 Subject: [PATCH 132/156] adapt method to new indexing of fault sets there is no zero fault set anymore. the 0 fault set element is now the single error fault sets which was before the '1' element in the list --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index 322d34c5e..d9506718c 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -526,7 +526,7 @@ def compute_fault_sets(level: int = 1) -> tuple[npt.NDArray[np.int8], npt.NDArra """Helper function to compute fault sets at a given level.""" spc.compute_fault_set(level) spc.compute_fault_set(level, x_errors=False) - return spc.x_fault_sets[level], spc.z_fault_sets[level] + return spc.x_fault_sets[level - 1].faults, spc.z_fault_sets[level - 1].faults def filter_fault_set(fault_set: npt.NDArray[np.int8], threshold: int) -> npt.NDArray[np.int8]: """Filter fault sets based on a sum threshold.""" From ea8382f547616deaf7470dd00f4a53790e548450 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 20 Aug 2025 17:33:23 +0200 Subject: [PATCH 133/156] Delete ecc_qiskit_wrapper.py Deleted as requested by comment in code review. --- src/mqt/qecc/ecc_qiskit_wrapper.py | 195 ----------------------------- 1 file changed, 195 deletions(-) delete mode 100644 src/mqt/qecc/ecc_qiskit_wrapper.py diff --git a/src/mqt/qecc/ecc_qiskit_wrapper.py b/src/mqt/qecc/ecc_qiskit_wrapper.py deleted file mode 100644 index 7ceffbba0..000000000 --- a/src/mqt/qecc/ecc_qiskit_wrapper.py +++ /dev/null @@ -1,195 +0,0 @@ -# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM -# All rights reserved. -# -# SPDX-License-Identifier: MIT -# -# Licensed under the MIT License - -"""Qiskit wrapper for the ECC Framework.""" - -from __future__ import annotations - -import argparse -import locale -import pathlib -from typing import TYPE_CHECKING - -from qiskit.qasm2 import dump, load, loads -from qiskit_aer import AerSimulator -from qiskit_aer.noise import ( - NoiseModel, - QuantumError, - amplitude_damping_error, - depolarizing_error, - pauli_error, -) - -from . import apply_ecc - -if TYPE_CHECKING: # pragma: no cover - from qiskit.result import Result - - -def compose_error(error: QuantumError, new_error: QuantumError) -> QuantumError: - """Compose two quantum errors.""" - return new_error if error is None else error.compose(new_error) - - -def create_noise_model(n_model: str, p_error: float) -> NoiseModel: - """Create a noise model for a given error rate and error model.""" - # Create an empty noise model - noise_model = NoiseModel() - error = None - for char in n_model: - if char == "B": - # Add a bit flip error channel - new_error = pauli_error([("X", p_error), ("I", 1 - p_error)]) - error = compose_error(error, new_error) - elif char == "D": - # Add a depolarization error channel - new_error = depolarizing_error(p_error, 1) - error = compose_error(error, new_error) - elif char == "A": - # simple amplitude damping error channel which mimics energy loss to the environment (T1-error) - new_error = amplitude_damping_error(p_error) - error = compose_error(error, new_error) - elif char == "P": - # Add a phase flip error channel - new_error = pauli_error([("Z", p_error), ("I", 1 - p_error)]) - error = compose_error(error, new_error) - - else: - raise ValueError("Unknown error type in noise model: " + char) - - assert error is not None - - # single qubit and multi qubit operations are treated the same at the moment - noise_model.add_all_qubit_quantum_error( - error, ["u1", "u2", "u3", "h", "id", "t", "tdg", "sdg", "rx", "ry", "rz", "s"] - ) - noise_model.add_all_qubit_quantum_error(error.tensor(error), ["cx", "swap"]) - noise_model.add_all_qubit_quantum_error(error.tensor(error).tensor(error), ["cswap"]) - - return noise_model - - -def print_simulation_results(result: Result, n_shots: int, threshold_probability: float = 0) -> None: - """Print the simulation results.""" - printed_results = 0 - summarized_counts: dict[str, int] = {} - result_counts = result.get_counts() - for result_id in result_counts: - sub_result = result_id.split(" ")[-1] - if sub_result not in summarized_counts: - summarized_counts[sub_result] = 0 - summarized_counts[sub_result] += result_counts[result_id] - - for result_id in sorted(summarized_counts.keys()): - # Print all results > threshold_probability - if summarized_counts[result_id] / n_shots > threshold_probability or printed_results == 0: - str(result_id) - printed_results += 1 - if printed_results == 1000: - break - - -def main() -> None: - """Run main function of the Qiskit wrapper for the ECC Framework.""" - parser = argparse.ArgumentParser(description="Qiskit wrapper for the ECC Framework") - parser.add_argument( - "-m", - type=str, - default="D", - help="Define the error_channels (e.g., -m APD), available errors channels are amplitude " - 'damping (A), phase flip (P), bit flip (B), and depolarization (D) (Default="D")', - ) - parser.add_argument( - "-p", - type=float, - default=0.001, - help="Set the noise probability (Default=0.001)", - ) - parser.add_argument( - "-n", - type=int, - default=2000, - help="Set the number of shots for the simulation (Default=2000)", - ) - parser.add_argument("-s", type=int, default=0, help="Set a seed (Default=0)") - parser.add_argument("-f", type=str, required=True, help="Path to a OpenQASM file") - parser.add_argument( - "-e", - type=str, - required=False, - default=None, - help="Export circuit with applied ECC as OpenQASM circuit instead of " - 'simulating it (e.g., -e "/path/to/new/openqasm_file") (Default=None)', - ) - parser.add_argument( - "-fs", - type=str, - default="stabilizer", - help='Specify a simulator (Default="stabilizer", which is fast but does not support "non-Clifford gates"', - ) - parser.add_argument( - "-ecc", - type=str, - default="Q7Steane", - help='Specify an ECC to be applied to the circuit. Currently available are "none", "Q3Shor", "Q5Laflamme", ' - '"Q7Steane", "Q9Shor", "Q9Surface", and "Q18Surface" (Default=Q7Steane)', - ) - parser.add_argument( - "-fq", - type=int, - default=100, - help="Specify after how many qubit usages error correction is applied to it (Default=100)", - ) - - args = parser.parse_args() - assert args is not None - error_channels = args.m - error_probability = args.p - number_of_shots = args.n - seed = args.s - open_qasm_file = args.f - - forced_simulator = None if args.fs.lower() == "none" else args.fs - - ecc = None if args.ecc.lower() == "none" else args.ecc - - ecc_frequency = args.fq - ecc_export_filename = args.e - if forced_simulator is not None and "stabilizer" in forced_simulator and "A" in error_channels: - pass - - # Creating the noise model - if error_probability > 0: - noise_model = create_noise_model(n_model=error_channels, p_error=error_probability) - else: - noise_model = NoiseModel() - - circ = load(open_qasm_file) - - if not any(gate.operation.name == "measure" for gate in circ.data): - circ.measure_all() - - # Initializing the quantum circuit - if ecc is not None: - # Applying error correction to the circuit - result = apply_ecc(circ, ecc, ecc_frequency) - circ = loads(result["circ"]) - - if ecc_export_filename is not None: - with pathlib.Path(ecc_export_filename).open("w", encoding=locale.getpreferredencoding(False)) as f: - dump(circ, f) - return - - # Setting the simulator backend to the requested one - simulator_backend = AerSimulator(method=forced_simulator, noise_model=noise_model) - - job_result = simulator_backend.run(circ, shots=number_of_shots, seed_simulator=seed).result() - - if job_result.status != "COMPLETED": - raise RuntimeError("Simulation exited with status: " + str(job_result.status)) - - print_simulation_results(job_result, number_of_shots) From f2714cfeabc4fcdeffef0f1f572dbbdcad671fe8 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 20 Aug 2025 17:41:38 +0200 Subject: [PATCH 134/156] fix mypy issues --- .../python/circuit_synthesis/test_gaussian_elimination.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/python/circuit_synthesis/test_gaussian_elimination.py b/test/python/circuit_synthesis/test_gaussian_elimination.py index d14072e53..726c36a4e 100644 --- a/test/python/circuit_synthesis/test_gaussian_elimination.py +++ b/test/python/circuit_synthesis/test_gaussian_elimination.py @@ -7,9 +7,13 @@ from __future__ import annotations +from typing import TYPE_CHECKING + import numpy as np import pytest +if TYPE_CHECKING: # pragma: no cover + import numpy.typing as npt from mqt.qecc.circuit_synthesis.synthesis_utils import CandidateAction, EliminationCNOTSynthesizer from mqt.qecc.codes.css_code import CSSCode @@ -265,8 +269,8 @@ def test_compute_cost_matrix_off_diagonal_logic(get_instance): col_1 = matrix[:, 1] # Manually calculate the expected value for just one cell. - xor_sum = np.sum((col_0 + col_1) % 2) - weight_col_1 = np.sum(col_1) + xor_sum: npt.NDArray[np.int8] = np.sum((col_0 + col_1) % 2) + weight_col_1: npt.NDArray[np.int8] = np.sum(col_1) expected_cost_0_1 = xor_sum - weight_col_1 cost_matrix = get_instance._compute_cost_matrix() From 0f92bb88646ac256bc14dc79ee598b5adcf77633 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 20 Aug 2025 18:07:37 +0200 Subject: [PATCH 135/156] add .qasm postfix to all circuit files to pass license hook --- .../{cc_4_8_8_d5_heuristic_0 => cc_4_8_8_d5_heuristic_0.qasm} | 0 .../{cc_4_8_8_d5_heuristic_1 => cc_4_8_8_d5_heuristic_1.qasm} | 0 .../{cc_4_8_8_d5_heuristic_2 => cc_4_8_8_d5_heuristic_2.qasm} | 0 .../{cc_4_8_8_d5_heuristic_3 => cc_4_8_8_d5_heuristic_3.qasm} | 0 .../{cc_4_8_8_heuristic_0 => cc_4_8_8_heuristic_0.qasm} | 0 .../{cc_4_8_8_heuristic_1 => cc_4_8_8_heuristic_1.qasm} | 0 .../{cc_4_8_8_heuristic_2 => cc_4_8_8_heuristic_2.qasm} | 0 .../{cc_4_8_8_heuristic_3 => cc_4_8_8_heuristic_3.qasm} | 0 .../{cc_4_8_8_d7_heuristic_0 => cc_4_8_8_d7_heuristic_0.qasm} | 0 .../{cc_4_8_8_d7_heuristic_1 => cc_4_8_8_d7_heuristic_1.qasm} | 0 .../{cc_4_8_8_d7_heuristic_2 => cc_4_8_8_d7_heuristic_2.qasm} | 0 .../{cc_4_8_8_d7_heuristic_3 => cc_4_8_8_d7_heuristic_3.qasm} | 0 .../{cc_4_8_8_d7_heuristic_0 => cc_4_8_8_d7_heuristic_0.qasm} | 0 .../{cc_4_8_8_d7_heuristic_1 => cc_4_8_8_d7_heuristic_1.qasm} | 0 .../{cc_4_8_8_d7_heuristic_2 => cc_4_8_8_d7_heuristic_2.qasm} | 0 .../{cc_4_8_8_d7_heuristic_3 => cc_4_8_8_d7_heuristic_3.qasm} | 0 .../{cc_6_6_6_d5_heuristic_0 => cc_6_6_6_d5_heuristic_0.qasm} | 0 .../{cc_6_6_6_d5_heuristic_1 => cc_6_6_6_d5_heuristic_1.qasm} | 0 .../{cc_6_6_6_d5_heuristic_2 => cc_6_6_6_d5_heuristic_2.qasm} | 0 .../{cc_6_6_6_d5_heuristic_3 => cc_6_6_6_d5_heuristic_3.qasm} | 0 .../{cc_6_6_6_heuristic_0 => cc_6_6_6_heuristic_0.qasm} | 0 .../{cc_6_6_6_heuristic_1 => cc_6_6_6_heuristic_1.qasm} | 0 .../{cc_6_6_6_heuristic_2 => cc_6_6_6_heuristic_2.qasm} | 0 .../{cc_6_6_6_d7_heuristic_0 => cc_6_6_6_d7_heuristic_0.qasm} | 0 .../{cc_6_6_6_d7_heuristic_1 => cc_6_6_6_d7_heuristic_1.qasm} | 0 .../{cc_6_6_6_d7_heuristic_2 => cc_6_6_6_d7_heuristic_2.qasm} | 0 .../{cc_6_6_6_d7_heuristic_3 => cc_6_6_6_d7_heuristic_3.qasm} | 0 27 files changed, 0 insertions(+), 0 deletions(-) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/{cc_4_8_8_d5_heuristic_0 => cc_4_8_8_d5_heuristic_0.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/{cc_4_8_8_d5_heuristic_1 => cc_4_8_8_d5_heuristic_1.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/{cc_4_8_8_d5_heuristic_2 => cc_4_8_8_d5_heuristic_2.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/{cc_4_8_8_d5_heuristic_3 => cc_4_8_8_d5_heuristic_3.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/{cc_4_8_8_heuristic_0 => cc_4_8_8_heuristic_0.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/{cc_4_8_8_heuristic_1 => cc_4_8_8_heuristic_1.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/{cc_4_8_8_heuristic_2 => cc_4_8_8_heuristic_2.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/{cc_4_8_8_heuristic_3 => cc_4_8_8_heuristic_3.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/{cc_4_8_8_d7_heuristic_0 => cc_4_8_8_d7_heuristic_0.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/{cc_4_8_8_d7_heuristic_1 => cc_4_8_8_d7_heuristic_1.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/{cc_4_8_8_d7_heuristic_2 => cc_4_8_8_d7_heuristic_2.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/{cc_4_8_8_d7_heuristic_3 => cc_4_8_8_d7_heuristic_3.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/{cc_4_8_8_d7_heuristic_0 => cc_4_8_8_d7_heuristic_0.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/{cc_4_8_8_d7_heuristic_1 => cc_4_8_8_d7_heuristic_1.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/{cc_4_8_8_d7_heuristic_2 => cc_4_8_8_d7_heuristic_2.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/{cc_4_8_8_d7_heuristic_3 => cc_4_8_8_d7_heuristic_3.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/{cc_6_6_6_d5_heuristic_0 => cc_6_6_6_d5_heuristic_0.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/{cc_6_6_6_d5_heuristic_1 => cc_6_6_6_d5_heuristic_1.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/{cc_6_6_6_d5_heuristic_2 => cc_6_6_6_d5_heuristic_2.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/{cc_6_6_6_d5_heuristic_3 => cc_6_6_6_d5_heuristic_3.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/{cc_6_6_6_heuristic_0 => cc_6_6_6_heuristic_0.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/{cc_6_6_6_heuristic_1 => cc_6_6_6_heuristic_1.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/{cc_6_6_6_heuristic_2 => cc_6_6_6_heuristic_2.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/{cc_6_6_6_d7_heuristic_0 => cc_6_6_6_d7_heuristic_0.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/{cc_6_6_6_d7_heuristic_1 => cc_6_6_6_d7_heuristic_1.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/{cc_6_6_6_d7_heuristic_2 => cc_6_6_6_d7_heuristic_2.qasm} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/{cc_6_6_6_d7_heuristic_3 => cc_6_6_6_d7_heuristic_3.qasm} (100%) diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_0 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_0.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_0 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_0.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_1.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_1 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_1.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_2.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_2 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_2.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_3 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_3.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_3 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5/cc_4_8_8_d5_heuristic_3.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_0 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_0.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_0 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_0.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_1.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_1 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_1.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_2.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_2 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_2.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_3 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_3.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_3 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d5_v1/cc_4_8_8_heuristic_3.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_0 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_0.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_0 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_0.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_1.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_1 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_1.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_2.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_2 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_2.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7/cc_4_8_8_d7_heuristic_3.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_0 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_0.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_0 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_0.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_1.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_1 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_1.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_2.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_2 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_2.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_3 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_3.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_3 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_4_8_8_d7_v1/cc_4_8_8_d7_heuristic_3.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_0 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_0.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_0 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_0.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_1.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_1 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_1.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_2.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_2 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_2.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_3 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_3.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_3 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5/cc_6_6_6_d5_heuristic_3.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_0 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_0.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_0 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_0.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_1.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_1 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_1.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_2.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_2 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d5_v1/cc_6_6_6_heuristic_2.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_0 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_0.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_0 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_0.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_1 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_1.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_1 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_1.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_2 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_2.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_2 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_2.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_3 b/scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_3.qasm similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_3 rename to scripts/ft_stateprep/eval_circ_mod/circuits/cc_6_6_6_d7/cc_6_6_6_d7_heuristic_3.qasm From 0fa238dbea05293f3e519ea4d9d55a545a07685d Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 20 Aug 2025 18:32:14 +0200 Subject: [PATCH 136/156] allow pickle despite security warnings only self created files are used here --- .../ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py index 72eda144c..7cc2364e7 100644 --- a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py +++ b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py @@ -5,6 +5,8 @@ # # Licensed under the MIT License +# ruff: noqa: S301, S403 + """Estimate logical error rate for CSS state preparation circuits for a given code and physical error rate.""" from __future__ import annotations From 6ec2d45914438737359b652ff5f5fcd26ec3f1e5 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Wed, 20 Aug 2025 18:39:58 +0200 Subject: [PATCH 137/156] temporarily allow testing of private methods this should be discussed again, if we want to keep the tests or only test api functions here. further changes: allow for scenario parameter as this help readability and add module docstring. --- test/python/circuit_synthesis/test_gaussian_elimination.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/python/circuit_synthesis/test_gaussian_elimination.py b/test/python/circuit_synthesis/test_gaussian_elimination.py index 726c36a4e..f66225da4 100644 --- a/test/python/circuit_synthesis/test_gaussian_elimination.py +++ b/test/python/circuit_synthesis/test_gaussian_elimination.py @@ -5,6 +5,10 @@ # # Licensed under the MIT License +# ruff: noqa: SLF001 + +"""Test implementations of EliminationCNOTSynthesizer class.""" + from __future__ import annotations from typing import TYPE_CHECKING @@ -109,7 +113,7 @@ def test_mask_out_used_qubits(get_instance): def test_reset_if_stuck( get_instance, monkeypatch, - scenario, + scenario, # noqa: ARG001 initial_used_cols, costs_are_positive, expected_return, From 5d1ca346f38eae471898b68443d8b9790fa259d9 Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Thu, 21 Aug 2025 13:07:59 +0200 Subject: [PATCH 138/156] fix error using variable prior to initialization --- .../eval_circ_mod/estimate_logical_error_rate.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py index 7cc2364e7..167002d18 100644 --- a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py +++ b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py @@ -49,6 +49,7 @@ def main() -> None: args = parser.parse_args() code_name = args.code + decoder = None if "surface" in code_name: d = args.distance code = CSSCode.from_code_name("surface", d) @@ -59,7 +60,7 @@ def main() -> None: lut_path = (Path("__file__") / "../../eval/luts/decoder_488_7.pickle").resolve() if lut_path.exists(): with lut_path.open("rb") as f: - lut = pickle.load(f) + decoder = pickle.load(f) else: msg = "LUT file not found." raise ValueError(msg) @@ -101,7 +102,7 @@ def main() -> None: check_circuit=None if args.x_errors else heuristic_prep_circuit(code, zero_state=False).circ, p=args.p_error, p_idle=args.p_idle_factor * args.p_error, - decoder=lut if code_name == "cc_4_8_8_d7" else None, + decoder=decoder, ) if args.x_errors: res = sim.logical_error_rate(min_errors=args.n_errors) From 873d805c0202a107f5ea8851a9025f51dd51928a Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Thu, 21 Aug 2025 13:09:59 +0200 Subject: [PATCH 139/156] remove commented out code --- .../eval_circ_mod/estimate_logical_error_rate.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py index 167002d18..fbdffa62c 100644 --- a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py +++ b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py @@ -81,12 +81,6 @@ def main() -> None: prefix = (Path(__file__) / "../circuits/").resolve() circ_file_core = f"{code_name}_heuristic_" - # check if file exists - # if not (prefix / code_name / circ_file).exists(): - # # create circuit - # # NOTE: error message for missing circuits - # pass - # else: circuits = [] # load circuit from file for _id in [0, 1, 2, 3]: From 59743f6235c531cb00b37168b5c362324fbe5e8c Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Thu, 21 Aug 2025 13:13:15 +0200 Subject: [PATCH 140/156] fix edge case of wrong error type parsed --- scripts/ft_stateprep/canonical_steane/estimate_canonical.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/ft_stateprep/canonical_steane/estimate_canonical.py b/scripts/ft_stateprep/canonical_steane/estimate_canonical.py index 049253dcb..5e0e435ec 100644 --- a/scripts/ft_stateprep/canonical_steane/estimate_canonical.py +++ b/scripts/ft_stateprep/canonical_steane/estimate_canonical.py @@ -67,6 +67,9 @@ def main() -> None: p_l, r_a, num_logical_errors, total_shots, p_l_error, r_a_error = sim.secondary_logical_error_rate( min_errors=args.n_errors ) + else: + msg = "Error type should be either X or Z." + raise ValueError(msg) print( ";".join([ From 6fefe7a221088d9065ee015191f03e9e0732256a Mon Sep 17 00:00:00 2001 From: Erik Weilandt Date: Fri, 12 Sep 2025 10:30:04 +0200 Subject: [PATCH 141/156] fix bug that propagation matrix does not get updated --- src/mqt/qecc/circuit_synthesis/synthesis_utils.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py index d9506718c..fb5a24d86 100644 --- a/src/mqt/qecc/circuit_synthesis/synthesis_utils.py +++ b/src/mqt/qecc/circuit_synthesis/synthesis_utils.py @@ -264,10 +264,10 @@ def _get_candidate_action(self, i: int, j: int, costs: int) -> CandidateAction: def _cnot_is_valid_against_references(self, i: int, j: int) -> tuple[bool, dict[str, npt.NDArray[np.int8]]]: found_cnot: bool = False - new_x_error, _next_x_propagation_matrix = get_next_error( + new_x_error, next_x_propagation_matrix = get_next_error( propagation_matrix=self.x_propagation_matrix.copy(), cnot_gate=(int(i), int(j)) ) - new_z_error, _next_z_propagation_matrix = get_next_error( + new_z_error, next_z_propagation_matrix = get_next_error( propagation_matrix=self.z_propagation_matrix.copy(), cnot_gate=(int(i), int(j)), x_error=False ) @@ -301,6 +301,9 @@ def _cnot_is_valid_against_references(self, i: int, j: int) -> tuple[bool, dict[ found_cnot = not z_overlap if not found_cnot: self.overlapping_errors_z.add(new_z_error_tuple) + if found_cnot: + self.x_propagation_matrix = next_x_propagation_matrix + self.z_propagation_matrix = next_z_propagation_matrix return found_cnot, { "new_x_error": new_x_error, "new_z_error": new_z_error, From 81ff592c338da0153a91845e3571489188bac2d2 Mon Sep 17 00:00:00 2001 From: Erik Weilandt <48921674+inctechs@users.noreply.github.com> Date: Fri, 12 Sep 2025 10:42:11 +0200 Subject: [PATCH 142/156] add plus state simulation capability --- src/mqt/qecc/circuit_synthesis/simulation.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index 3adf9439a..7cf8dd68e 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -489,11 +489,17 @@ def __init__( combined.cx(self._data_range, self._first_ancilla_range) else: combined.cx(self._first_ancilla_range, self._data_range) - else: + elif zero_state: combined.cx(self._data_range, self._first_ancilla_range) combined.cx(self._second_ancilla_range, self._third_ancilla_range) combined.cx(self._second_ancilla_range, self._data_range) combined.h(self._second_ancilla_range) # second ancilla is measured in X basis + else: + combined.cx(self._first_ancilla_range, self._data_range) + combined.cx(self._third_ancilla_range, self._second_ancilla_range) + combined.cx(self._data_range, self._second_ancilla_range) + combined.h(self._first_ancilla_range) # first ancilla is measured in X basis + combined.h(self._third_ancilla_range) # third ancilla is measured in X basis combined.barrier() # need the barrier to retain order of measurements @@ -532,7 +538,7 @@ def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: qubit_to_meas = {q: i for i, q in enumerate(measured)} idx1 = [qubit_to_meas[q] for q in self.anc_1] anc_1 = samples[:, idx1] - check_anc_1 = (anc_1 @ self.z_checks.T) % 2 + check_anc_1 = anc_1 @ self.z_checks.T % 2 if self.zero_state else anc_1 @ self.x_checks.T % 2 if not self.has_one_ancilla: idx2 = [qubit_to_meas[q] for q in self.anc_2] @@ -540,8 +546,12 @@ def _filter_runs(self, samples: npt.NDArray[np.int8]) -> npt.NDArray[np.int8]: anc_2 = samples[:, idx2] anc_3 = samples[:, idx3] - check_anc_2 = (anc_2 @ self.x_checks.T) % 2 - check_anc_3 = (anc_3 @ self.z_checks.T) % 2 + if self.zero_state: + check_anc_2 = (anc_2 @ self.x_checks.T) % 2 + check_anc_3 = (anc_3 @ self.z_checks.T) % 2 + else: + check_anc_2 = (anc_2 @ self.z_checks.T) % 2 + check_anc_3 = (anc_3 @ self.x_checks.T) % 2 index_array = np.where(np.all(np.hstack((check_anc_1, check_anc_2, check_anc_3)) == 0, axis=1))[0] else: index_array = np.where(np.all(check_anc_1 == 0, axis=1))[0] From d677437fefe2f78013cf1b01933da0e2dc169402 Mon Sep 17 00:00:00 2001 From: Erik Weilandt <48921674+inctechs@users.noreply.github.com> Date: Wed, 17 Sep 2025 15:04:19 +0200 Subject: [PATCH 143/156] prepare simulations add circuits for rotated surface code d=5 and [[20,2,6]] code --- .../eval_circ_mod/check_matrix/eve_20_2_6.txt | 18 +++++++ .../eve_20_2_6/eve_20_2_6_heuristic_0.qasm | 52 ++++++++++++++++++ .../eve_20_2_6/eve_20_2_6_heuristic_1.qasm | 48 +++++++++++++++++ .../eve_20_2_6/eve_20_2_6_heuristic_2.qasm | 49 +++++++++++++++++ .../eve_20_2_6/eve_20_2_6_heuristic_3.qasm | 54 +++++++++++++++++++ .../rotated_surface_d5_heuristic_0.qasm | 43 +++++++++++++++ .../rotated_surface_d5_heuristic_1.qasm | 43 +++++++++++++++ .../rotated_surface_d5_heuristic_2.qasm | 43 +++++++++++++++ .../rotated_surface_d5_heuristic_3.qasm | 43 +++++++++++++++ .../estimate_logical_error_rate.py | 25 ++++----- 10 files changed, 406 insertions(+), 12 deletions(-) create mode 100644 scripts/ft_stateprep/eval_circ_mod/check_matrix/eve_20_2_6.txt create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/eve_20_2_6/eve_20_2_6_heuristic_0.qasm create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/eve_20_2_6/eve_20_2_6_heuristic_1.qasm create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/eve_20_2_6/eve_20_2_6_heuristic_2.qasm create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/eve_20_2_6/eve_20_2_6_heuristic_3.qasm create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/rotated_surface_d5/rotated_surface_d5_heuristic_0.qasm create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/rotated_surface_d5/rotated_surface_d5_heuristic_1.qasm create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/rotated_surface_d5/rotated_surface_d5_heuristic_2.qasm create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/rotated_surface_d5/rotated_surface_d5_heuristic_3.qasm diff --git a/scripts/ft_stateprep/eval_circ_mod/check_matrix/eve_20_2_6.txt b/scripts/ft_stateprep/eval_circ_mod/check_matrix/eve_20_2_6.txt new file mode 100644 index 000000000..76db61039 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/check_matrix/eve_20_2_6.txt @@ -0,0 +1,18 @@ +XIIIIIIIIXIXXIXXXXII +IXIIIIIIIXIIXXIIXXXX +IIXIIIIIIIXXIXXIXXXI +IIIXIIIIIIXIXXXXIXIX +IIIIXIIIIXXIXIIIXXXX +IIIIIXIIIXIXIIXXXXIX +IIIIIIXIIIXXIXIXXXXI +IIIIIIIXIXIXIIIIIIXI +IIIIIIIIXIXIXXXXXIIX +ZIIIIIIIIZIZZIZZZZII +IZIIIIIIIZIIZZIIZZZZ +IIZIIIIIIIZZIZZIZZZI +IIIZIIIIIIZIZZZZIZIZ +IIIIZIIIIZZIZIIIZZZZ +IIIIIZIIIZIZIIZZZZIZ +IIIIIIZIIIZZIZIZZZZI +IIIIIIIZIZIZIIIIIIZI +IIIIIIIIZIZIZZZZZIIZ diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/eve_20_2_6/eve_20_2_6_heuristic_0.qasm b/scripts/ft_stateprep/eval_circ_mod/circuits/eve_20_2_6/eve_20_2_6_heuristic_0.qasm new file mode 100644 index 000000000..afd1f0bdb --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/eve_20_2_6/eve_20_2_6_heuristic_0.qasm @@ -0,0 +1,52 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[20]; +h q[0]; +h q[1]; +h q[2]; +h q[3]; +h q[4]; +h q[5]; +h q[6]; +h q[7]; +h q[8]; +cx q[6],q[10]; +cx q[7],q[11]; +cx q[7],q[9]; +cx q[4],q[13]; +cx q[8],q[14]; +cx q[5],q[14]; +cx q[3],q[14]; +cx q[2],q[14]; +cx q[5],q[10]; +cx q[4],q[10]; +cx q[14],q[10]; +cx q[6],q[15]; +cx q[2],q[15]; +cx q[1],q[16]; +cx q[1],q[13]; +cx q[3],q[16]; +cx q[8],q[17]; +cx q[3],q[17]; +cx q[11],q[18]; +cx q[4],q[18]; +cx q[15],q[18]; +cx q[1],q[18]; +cx q[6],q[11]; +cx q[0],q[19]; +cx q[0],q[12]; +cx q[0],q[14]; +cx q[13],q[12]; +cx q[14],q[15]; +cx q[17],q[12]; +cx q[5],q[19]; +cx q[19],q[16]; +cx q[10],q[16]; +cx q[16],q[17]; +cx q[19],q[11]; +cx q[12],q[19]; +cx q[2],q[11]; +cx q[5],q[9]; +cx q[13],q[9]; +cx q[0],q[9]; +cx q[10],q[13]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/eve_20_2_6/eve_20_2_6_heuristic_1.qasm b/scripts/ft_stateprep/eval_circ_mod/circuits/eve_20_2_6/eve_20_2_6_heuristic_1.qasm new file mode 100644 index 000000000..8edc30c1a --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/eve_20_2_6/eve_20_2_6_heuristic_1.qasm @@ -0,0 +1,48 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[20]; +h q[1]; +h q[4]; +h q[6]; +h q[7]; +h q[8]; +h q[9]; +cx q[9],q[0]; +cx q[7],q[9]; +cx q[0],q[12]; +cx q[1],q[13]; +cx q[4],q[13]; +cx q[13],q[11]; +h q[14]; +cx q[14],q[2]; +cx q[6],q[15]; +cx q[2],q[15]; +cx q[15],q[11]; +h q[16]; +cx q[16],q[17]; +cx q[17],q[3]; +cx q[8],q[16]; +cx q[16],q[10]; +cx q[16],q[14]; +cx q[4],q[10]; +cx q[15],q[10]; +cx q[1],q[18]; +cx q[6],q[18]; +cx q[7],q[18]; +cx q[2],q[18]; +cx q[4],q[18]; +h q[19]; +cx q[19],q[5]; +cx q[13],q[19]; +cx q[16],q[19]; +cx q[5],q[12]; +cx q[12],q[17]; +cx q[11],q[17]; +cx q[12],q[14]; +cx q[14],q[15]; +cx q[17],q[16]; +cx q[19],q[12]; +cx q[5],q[9]; +cx q[13],q[9]; +cx q[10],q[13]; +cx q[9],q[11]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/eve_20_2_6/eve_20_2_6_heuristic_2.qasm b/scripts/ft_stateprep/eval_circ_mod/circuits/eve_20_2_6/eve_20_2_6_heuristic_2.qasm new file mode 100644 index 000000000..d6d612ae7 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/eve_20_2_6/eve_20_2_6_heuristic_2.qasm @@ -0,0 +1,49 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[20]; +h q[3]; +h q[6]; +h q[7]; +h q[9]; +cx q[9],q[4]; +h q[12]; +cx q[12],q[0]; +h q[13]; +cx q[13],q[10]; +cx q[13],q[11]; +h q[15]; +cx q[15],q[14]; +cx q[14],q[2]; +cx q[6],q[15]; +cx q[15],q[11]; +cx q[4],q[11]; +h q[16]; +cx q[16],q[17]; +cx q[16],q[8]; +cx q[17],q[10]; +cx q[0],q[17]; +cx q[15],q[17]; +cx q[3],q[10]; +cx q[3],q[16]; +cx q[7],q[18]; +cx q[13],q[18]; +cx q[13],q[1]; +cx q[4],q[13]; +h q[19]; +cx q[19],q[5]; +cx q[5],q[12]; +cx q[12],q[14]; +cx q[16],q[14]; +cx q[9],q[19]; +cx q[10],q[19]; +cx q[11],q[10]; +cx q[10],q[13]; +cx q[18],q[9]; +cx q[12],q[9]; +cx q[15],q[18]; +cx q[14],q[15]; +cx q[19],q[17]; +cx q[17],q[16]; +cx q[19],q[12]; +cx q[4],q[18]; +cx q[9],q[11]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/eve_20_2_6/eve_20_2_6_heuristic_3.qasm b/scripts/ft_stateprep/eval_circ_mod/circuits/eve_20_2_6/eve_20_2_6_heuristic_3.qasm new file mode 100644 index 000000000..ecb709500 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/eve_20_2_6/eve_20_2_6_heuristic_3.qasm @@ -0,0 +1,54 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[20]; +h q[2]; +h q[4]; +h q[5]; +h q[10]; +cx q[10],q[1]; +cx q[5],q[11]; +h q[12]; +h q[13]; +cx q[13],q[3]; +h q[15]; +cx q[3],q[16]; +h q[17]; +cx q[17],q[6]; +cx q[4],q[17]; +cx q[4],q[10]; +cx q[6],q[14]; +cx q[2],q[14]; +h q[18]; +cx q[18],q[9]; +cx q[18],q[7]; +cx q[2],q[18]; +cx q[10],q[18]; +cx q[4],q[9]; +cx q[7],q[11]; +cx q[15],q[19]; +cx q[12],q[15]; +cx q[12],q[0]; +cx q[19],q[8]; +cx q[1],q[19]; +cx q[5],q[15]; +cx q[5],q[19]; +cx q[3],q[19]; +cx q[4],q[19]; +cx q[5],q[12]; +cx q[12],q[9]; +cx q[19],q[12]; +cx q[6],q[15]; +cx q[15],q[17]; +cx q[3],q[15]; +cx q[6],q[18]; +cx q[8],q[13]; +cx q[1],q[13]; +cx q[1],q[9]; +cx q[14],q[13]; +cx q[13],q[17]; +cx q[13],q[10]; +cx q[14],q[11]; +cx q[0],q[11]; +cx q[15],q[14]; +cx q[8],q[16]; +cx q[17],q[16]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/rotated_surface_d5/rotated_surface_d5_heuristic_0.qasm b/scripts/ft_stateprep/eval_circ_mod/circuits/rotated_surface_d5/rotated_surface_d5_heuristic_0.qasm new file mode 100644 index 000000000..6a4a6d92c --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/rotated_surface_d5/rotated_surface_d5_heuristic_0.qasm @@ -0,0 +1,43 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[25]; +h q[0]; +h q[2]; +h q[4]; +h q[5]; +h q[6]; +cx q[2],q[8]; +h q[9]; +cx q[5],q[10]; +cx q[6],q[12]; +cx q[6],q[7]; +cx q[0],q[6]; +cx q[0],q[5]; +cx q[0],q[1]; +cx q[7],q[11]; +cx q[2],q[7]; +cx q[2],q[3]; +cx q[9],q[14]; +cx q[9],q[13]; +cx q[9],q[8]; +cx q[4],q[9]; +h q[15]; +cx q[15],q[16]; +cx q[15],q[10]; +cx q[16],q[11]; +h q[17]; +cx q[17],q[18]; +cx q[17],q[12]; +cx q[18],q[13]; +h q[19]; +cx q[19],q[14]; +h q[20]; +cx q[20],q[15]; +h q[21]; +cx q[21],q[22]; +cx q[21],q[16]; +cx q[22],q[17]; +h q[23]; +cx q[23],q[24]; +cx q[23],q[18]; +cx q[24],q[19]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/rotated_surface_d5/rotated_surface_d5_heuristic_1.qasm b/scripts/ft_stateprep/eval_circ_mod/circuits/rotated_surface_d5/rotated_surface_d5_heuristic_1.qasm new file mode 100644 index 000000000..6a4a6d92c --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/rotated_surface_d5/rotated_surface_d5_heuristic_1.qasm @@ -0,0 +1,43 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[25]; +h q[0]; +h q[2]; +h q[4]; +h q[5]; +h q[6]; +cx q[2],q[8]; +h q[9]; +cx q[5],q[10]; +cx q[6],q[12]; +cx q[6],q[7]; +cx q[0],q[6]; +cx q[0],q[5]; +cx q[0],q[1]; +cx q[7],q[11]; +cx q[2],q[7]; +cx q[2],q[3]; +cx q[9],q[14]; +cx q[9],q[13]; +cx q[9],q[8]; +cx q[4],q[9]; +h q[15]; +cx q[15],q[16]; +cx q[15],q[10]; +cx q[16],q[11]; +h q[17]; +cx q[17],q[18]; +cx q[17],q[12]; +cx q[18],q[13]; +h q[19]; +cx q[19],q[14]; +h q[20]; +cx q[20],q[15]; +h q[21]; +cx q[21],q[22]; +cx q[21],q[16]; +cx q[22],q[17]; +h q[23]; +cx q[23],q[24]; +cx q[23],q[18]; +cx q[24],q[19]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/rotated_surface_d5/rotated_surface_d5_heuristic_2.qasm b/scripts/ft_stateprep/eval_circ_mod/circuits/rotated_surface_d5/rotated_surface_d5_heuristic_2.qasm new file mode 100644 index 000000000..6a4a6d92c --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/rotated_surface_d5/rotated_surface_d5_heuristic_2.qasm @@ -0,0 +1,43 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[25]; +h q[0]; +h q[2]; +h q[4]; +h q[5]; +h q[6]; +cx q[2],q[8]; +h q[9]; +cx q[5],q[10]; +cx q[6],q[12]; +cx q[6],q[7]; +cx q[0],q[6]; +cx q[0],q[5]; +cx q[0],q[1]; +cx q[7],q[11]; +cx q[2],q[7]; +cx q[2],q[3]; +cx q[9],q[14]; +cx q[9],q[13]; +cx q[9],q[8]; +cx q[4],q[9]; +h q[15]; +cx q[15],q[16]; +cx q[15],q[10]; +cx q[16],q[11]; +h q[17]; +cx q[17],q[18]; +cx q[17],q[12]; +cx q[18],q[13]; +h q[19]; +cx q[19],q[14]; +h q[20]; +cx q[20],q[15]; +h q[21]; +cx q[21],q[22]; +cx q[21],q[16]; +cx q[22],q[17]; +h q[23]; +cx q[23],q[24]; +cx q[23],q[18]; +cx q[24],q[19]; diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/rotated_surface_d5/rotated_surface_d5_heuristic_3.qasm b/scripts/ft_stateprep/eval_circ_mod/circuits/rotated_surface_d5/rotated_surface_d5_heuristic_3.qasm new file mode 100644 index 000000000..6a4a6d92c --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/rotated_surface_d5/rotated_surface_d5_heuristic_3.qasm @@ -0,0 +1,43 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[25]; +h q[0]; +h q[2]; +h q[4]; +h q[5]; +h q[6]; +cx q[2],q[8]; +h q[9]; +cx q[5],q[10]; +cx q[6],q[12]; +cx q[6],q[7]; +cx q[0],q[6]; +cx q[0],q[5]; +cx q[0],q[1]; +cx q[7],q[11]; +cx q[2],q[7]; +cx q[2],q[3]; +cx q[9],q[14]; +cx q[9],q[13]; +cx q[9],q[8]; +cx q[4],q[9]; +h q[15]; +cx q[15],q[16]; +cx q[15],q[10]; +cx q[16],q[11]; +h q[17]; +cx q[17],q[18]; +cx q[17],q[12]; +cx q[18],q[13]; +h q[19]; +cx q[19],q[14]; +h q[20]; +cx q[20],q[15]; +h q[21]; +cx q[21],q[22]; +cx q[21],q[16]; +cx q[22],q[17]; +h q[23]; +cx q[23],q[24]; +cx q[23],q[18]; +cx q[24],q[19]; diff --git a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py index fbdffa62c..827e6cbd1 100644 --- a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py +++ b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py @@ -18,14 +18,14 @@ from qiskit import QuantumCircuit from mqt.qecc import CSSCode +from mqt.qecc.circuit_synthesis.noise import CircuitLevelNoiseIdlingParallel from mqt.qecc.circuit_synthesis.simulation import SteaneNDFTStatePrepSimulator -from mqt.qecc.circuit_synthesis.state_prep import heuristic_prep_circuit -from mqt.qecc.codes import HexagonalColorCode, SquareOctagonColorCode +from mqt.qecc.codes import HexagonalColorCode, RotatedSurfaceCode, SquareOctagonColorCode def main() -> None: """Run the logical error rate estimation for a given code and physical error rate.""" - available_codes = ["steane", "tetrahedral", "shor", "surface", "cc_4_8_8", "cc_6_6_6", "hamming", "carbon"] + available_codes = ["eve_20_2_6"] parser = argparse.ArgumentParser(description="Estimate logical error rate for CSS state preparation circuits") parser.add_argument( "code", @@ -52,7 +52,7 @@ def main() -> None: decoder = None if "surface" in code_name: d = args.distance - code = CSSCode.from_code_name("surface", d) + code = RotatedSurfaceCode(d) code_name = f"rotated_surface_d{d}" elif code_name == "cc_4_8_8_d7": d = 7 @@ -74,7 +74,9 @@ def main() -> None: d = 5 code = HexagonalColorCode(d) elif code_name in available_codes: - code = CSSCode.from_code_name(code_name) + prefix = (Path(__file__) / "../check_matrix/").resolve() + matrix_file = prefix / (code_name + ".txt") + code = CSSCode.from_file(matrix_file) else: raise ValueError("Code " + code_name + " not available. Available codes: " + ", ".join(available_codes)) @@ -85,7 +87,8 @@ def main() -> None: # load circuit from file for _id in [0, 1, 2, 3]: circ_file = circ_file_core + str(_id) - circuits.append(QuantumCircuit.from_qasm_file(prefix / code_name / circ_file)) + path = prefix / code_name / (circ_file + ".qasm") + circuits.append(QuantumCircuit.from_qasm_file(path)) sim = SteaneNDFTStatePrepSimulator( circ1=circuits[0], @@ -93,16 +96,14 @@ def main() -> None: code=code, circ3=circuits[2], circ4=circuits[3], - check_circuit=None if args.x_errors else heuristic_prep_circuit(code, zero_state=False).circ, - p=args.p_error, - p_idle=args.p_idle_factor * args.p_error, decoder=decoder, ) + p = args.p_error + noise = CircuitLevelNoiseIdlingParallel(p, p, p, p, p * args.p_idle_factor) if args.x_errors: - res = sim.logical_error_rate(min_errors=args.n_errors) + res = sim.logical_error_rate(noise=noise, min_errors=args.n_errors) else: - sim.set_p(args.p_error, args.p_idle_factor * args.p_error) - res = sim.secondary_logical_error_rate(min_errors=args.n_errors) + res = sim.secondary_logical_error_rate(noise=noise, p=p, min_errors=args.n_errors) print(",".join([str(x) for x in res])) From c1fafa2740e48b5744801c2b6930a0546b2efe62 Mon Sep 17 00:00:00 2001 From: Erik Weilandt <48921674+inctechs@users.noreply.github.com> Date: Wed, 17 Sep 2025 15:42:32 +0200 Subject: [PATCH 144/156] change probabilities --- .../eval_circ_mod/estimate_logical_error_rate.py | 2 +- scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py index 827e6cbd1..c1a96bb7f 100644 --- a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py +++ b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py @@ -99,7 +99,7 @@ def main() -> None: decoder=decoder, ) p = args.p_error - noise = CircuitLevelNoiseIdlingParallel(p, p, p, p, p * args.p_idle_factor) + noise = CircuitLevelNoiseIdlingParallel(p, p, p * 2 / 3, p, p * args.p_idle_factor) if args.x_errors: res = sim.logical_error_rate(noise=noise, min_errors=args.n_errors) else: diff --git a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh index b276d0797..a9068bb06 100755 --- a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh +++ b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh @@ -8,9 +8,10 @@ # Description: Estimate logical error rates for given code in parallel. Results are saved in a csv file described by the first argument. All other arguments are passed to the python script. -declare -a p=("0.5" "0.3" "0.1" "0.09" "0.07" "0.05" "0.03" "0.01" "0.009" "0.007" "0.005" "0.003" "0.001" "0.0009" "0.0007" "0.0005" "0.0003" "0.0001") +# declare -a p=("0.5" "0.3" "0.1" "0.09" "0.07" "0.05" "0.03" "0.01" "0.009" "0.007" "0.005" "0.003" "0.001" "0.0009" "0.0007" "0.0005" "0.0003" "0.0001") +declare -a p=("0.001" "0.003" "0.005") -echo "p p_l acceptance errors runs p_l_error acceptance_error" > "$1.csv" +echo "p p_l acceptance errors runs" > "$1.csv" run_and_write() { local res=$(python estimate_logical_error_rate.py ${@:2:$#-2} "-p" "${@: -1}") From 74a524f9cf256fbae551f978a40dfa062e4fd98d Mon Sep 17 00:00:00 2001 From: Erik Weilandt <48921674+inctechs@users.noreply.github.com> Date: Wed, 8 Oct 2025 12:47:42 +0200 Subject: [PATCH 145/156] add simulation results for 20,2,6 and rot surface code d5 --- .../ft_stateprep/eval_circ_mod/results/eve_20_2_6_n500.csv | 4 ++++ .../eval_circ_mod/results/rotated_surface_d5_n500.csv | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 scripts/ft_stateprep/eval_circ_mod/results/eve_20_2_6_n500.csv create mode 100644 scripts/ft_stateprep/eval_circ_mod/results/rotated_surface_d5_n500.csv diff --git a/scripts/ft_stateprep/eval_circ_mod/results/eve_20_2_6_n500.csv b/scripts/ft_stateprep/eval_circ_mod/results/eve_20_2_6_n500.csv new file mode 100644 index 000000000..19f394b52 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/results/eve_20_2_6_n500.csv @@ -0,0 +1,4 @@ +p p_l acceptance errors runs +0.005 9.92059717153481e-06,0.260845300207039,500,96600000 +0.003 2.139867560142971e-06,0.44602791523482266,500,261900000 +0.001 7.906034195883512e-08,0.7638020118357469,500,4140000000 diff --git a/scripts/ft_stateprep/eval_circ_mod/results/rotated_surface_d5_n500.csv b/scripts/ft_stateprep/eval_circ_mod/results/rotated_surface_d5_n500.csv new file mode 100644 index 000000000..daab4e6fd --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/results/rotated_surface_d5_n500.csv @@ -0,0 +1,4 @@ +p p_l acceptance errors runs +0.005 7.795083600558489e-06,0.27994052378873857,500,229100000 +0.003 1.5981376232359126e-06,0.4650167518953414,500,672700000 +0.001 6.58429316469888e-08,0.7743411262823141,500,9806600000 From cfe031a0acf12a4d16a71984165365c425a9aafd Mon Sep 17 00:00:00 2001 From: Erik Weilandt <48921674+inctechs@users.noreply.github.com> Date: Wed, 8 Oct 2025 13:09:03 +0200 Subject: [PATCH 146/156] change simulation propability --- src/mqt/qecc/circuit_synthesis/simulation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mqt/qecc/circuit_synthesis/simulation.py b/src/mqt/qecc/circuit_synthesis/simulation.py index ca9f387ed..4d3da979c 100644 --- a/src/mqt/qecc/circuit_synthesis/simulation.py +++ b/src/mqt/qecc/circuit_synthesis/simulation.py @@ -311,7 +311,7 @@ def plot_state_prep( # pragma: no cover if plot_primary: results = [ self.logical_error_rate( - CircuitLevelNoiseIdlingParallel(p, p, p, p, p * p_idle_factor, True), + CircuitLevelNoiseIdlingParallel(p, p, p, p * 2 / 3, p * p_idle_factor, True), min_errors=min_errors, ) for p in ps From c1d78ae9528d8a6527274aa161f990d273bedff4 Mon Sep 17 00:00:00 2001 From: Erik Weilandt <48921674+inctechs@users.noreply.github.com> Date: Tue, 28 Oct 2025 07:52:47 +0100 Subject: [PATCH 147/156] add (repaired) stim circuit and check matrices of QECCs Those are circuits from the Flag at Origin work that we compare against. --- .../check_matrix/flag_at_origin/cc_17_1_5.txt | 16 ++ .../check_matrix/flag_at_origin/cc_31_1_7.txt | 30 +++ .../flag_at_origin/eve_20_2_6.txt | 18 ++ .../flag_at_origin/rot_25_1_5.txt | 24 +++ .../circuits/flag_at_origin/cc_17_1_5.stim | 63 ++++++ .../circuits/flag_at_origin/cc_20_2_6.stim | 154 +++++++++++++ .../circuits/flag_at_origin/cc_31_1_7.stim | 202 ++++++++++++++++++ .../circuits/flag_at_origin/rot_25_1_5.stim | 75 +++++++ 8 files changed, 582 insertions(+) create mode 100644 scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/cc_17_1_5.txt create mode 100644 scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/cc_31_1_7.txt create mode 100644 scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/eve_20_2_6.txt create mode 100644 scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/rot_25_1_5.txt create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/cc_17_1_5.stim create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/cc_20_2_6.stim create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/cc_31_1_7.stim create mode 100644 scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/rot_25_1_5.stim diff --git a/scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/cc_17_1_5.txt b/scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/cc_17_1_5.txt new file mode 100644 index 000000000..d9515d0bf --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/cc_17_1_5.txt @@ -0,0 +1,16 @@ +ZZZZIIIIIIIIIIIII +IZIZIIZZIIIIIIIII +IIIIZIIIZIIIZZIII +IIIIZZIIZZIIIIIII +IIZZIZZIIZZIIIZZI +IIIIIIZZIIZZIIIII +IIIIIIIIZZIIIZZII +IIIIIIIIIIZZIIIZZ +XXXXIIIIIIIIIIIII +IXIXIIXXIIIIIIIII +IIIIXIIIXIIIXXIII +IIIIXXIIXXIIIIIII +IIXXIXXIIXXIIIXXI +IIIIIIXXIIXXIIIII +IIIIIIIIXXIIIXXII +IIIIIIIIIIXXIIIXX diff --git a/scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/cc_31_1_7.txt b/scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/cc_31_1_7.txt new file mode 100644 index 000000000..ea427be97 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/cc_31_1_7.txt @@ -0,0 +1,30 @@ +ZIZIZZIIIIIIIIIIIIIIIIIIIIIIIII +ZZZZIIIIIIIIIIIIIIIIIIIIIIIIIII +IIIIZZIIZZIIIIIIIIIIIIIIIIIIIII +IIZZIZZIIZZIIIZZIIIIIIIIIIIIIII +IIIIIIZZIIZZIIIIIIIIIIIIIIIIIII +IIIIIIIZIIIZIIIIZZIIIIIIIIIIIII +IIIIIIIIIIIIZIIIIIZIIIIIZZIIIII +IIIIIIIIIIIIZZIIIIZZIIIIIIIIIII +IIIIIIIIZZIIIZZIIIIZZIIIIIZZIII +IIIIIIIIIIIIIIZZIIIIZZIIIIIIIII +IIIIIIIIIIZZIIIZZIIIIZZIIIIIZZI +IIIIIIIIIIIIIIIIZZIIIIZZIIIIIII +IIIIIIIIIIIIIIIIIIZZIIIIIZZIIII +IIIIIIIIIIIIIIIIIIIIZZIIIIIZZII +IIIIIIIIIIIIIIIIIIIIIIZZIIIIIZZ +XIXIXXIIIIIIIIIIIIIIIIIIIIIIIII +XXXXIIIIIIIIIIIIIIIIIIIIIIIIIII +IIIIXXIIXXIIIIIIIIIIIIIIIIIIIII +IIXXIXXIIXXIIIXXIIIIIIIIIIIIIII +IIIIIIXXIIXXIIIIIIIIIIIIIIIIIII +IIIIIIIXIIIXIIIIXXIIIIIIIIIIIII +IIIIIIIIIIIIXIIIIIXIIIIIXXIIIII +IIIIIIIIIIIIXXIIIIXXIIIIIIIIIII +IIIIIIIIXXIIIXXIIIIXXIIIIIXXIII +IIIIIIIIIIIIIIXXIIIIXXIIIIIIIII +IIIIIIIIIIXXIIIXXIIIIXXIIIIIXXI +IIIIIIIIIIIIIIIIXXIIIIXXIIIIIII +IIIIIIIIIIIIIIIIIIXXIIIIIXXIIII +IIIIIIIIIIIIIIIIIIIIXXIIIIIXXII +IIIIIIIIIIIIIIIIIIIIIIXXIIIIIXX diff --git a/scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/eve_20_2_6.txt b/scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/eve_20_2_6.txt new file mode 100644 index 000000000..af215778f --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/eve_20_2_6.txt @@ -0,0 +1,18 @@ +ZZZZIIIIIIIIIIIIIIII +IIIIZZZZIIIIIIIIIIII +IIIIIIIIZZZZIIIIIIII +IIIIIIIIIIIIZZZZIIII +IIIIIIIIIIIIIIIIZZZZ +ZIIZIIZZIIZZZIIZIIII +IIIIZIIZIIZZIIZZZIIZ +ZIIZIIIIZIIZIIZZIIZZ +IIZZZIIZIIIIZIIZIIZZ +XXXXIIIIIIIIIIIIIIII +IIIIXXXXIIIIIIIIIIII +IIIIIIIIXXXXIIIIIIII +IIIIIIIIIIIIXXXXIIII +IIIIIIIIIIIIIIIIXXXX +XIIXIIXXIIXXXIIXIIII +IIIIXIIXIIXXIIXXXIIX +XIIXIIIIXIIXIIXXIIXX +IIXXXIIXIIIIXIIXIIXX diff --git a/scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/rot_25_1_5.txt b/scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/rot_25_1_5.txt new file mode 100644 index 000000000..6e4bb34ff --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/rot_25_1_5.txt @@ -0,0 +1,24 @@ +IIIIZIIIIZIIIIIIIIIIIIIII +IIIIIIIIIIIIIIZIIIIZIIIII +IIIIIIIIZZIIIZZIIIIIIIIII +IIIIIIIIIIIIIIIIIIZZIIIZZ +IIZZIIIZZIIIIIIIIIIIIIIII +IIIIIIIIIIIIZZIIIZZIIIIII +IIIIIIZZIIIZZIIIIIIIIIIII +IIIIIIIIIIIIIIIIZZIIIZZII +ZZIIIZZIIIIIIIIIIIIIIIIII +IIIIIIIIIIZZIIIZZIIIIIIII +IIIIIZIIIIZIIIIIIIIIIIIII +IIIIIIIIIIIIIIIZIIIIZIIII +XXIIIIIIIIIIIIIIIIIIIIIII +IIXXIIIIIIIIIIIIIIIIIIIII +IXXIIIXXIIIIIIIIIIIIIIIII +IIIXXIIIXXIIIIIIIIIIIIIII +IIIIIXXIIIXXIIIIIIIIIIIII +IIIIIIIXXIIIXXIIIIIIIIIII +IIIIIIIIIIIXXIIIXXIIIIIII +IIIIIIIIIIIIIXXIIIXXIIIII +IIIIIIIIIIIIIIIXXIIIXXIII +IIIIIIIIIIIIIIIIIXXIIIXXI +IIIIIIIIIIIIIIIIIIIIIXXII +IIIIIIIIIIIIIIIIIIIIIIIXX diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/cc_17_1_5.stim b/scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/cc_17_1_5.stim new file mode 100644 index 000000000..53079b8f0 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/cc_17_1_5.stim @@ -0,0 +1,63 @@ +H 3 4 6 8 14 15 16 18 20 21 22 23 27 29 33 35 37 +TICK +CX 21 2 3 31 4 32 33 5 6 34 35 7 8 36 37 9 22 10 23 13 14 24 15 25 16 26 27 17 18 28 29 19 20 30 +TICK +CX 21 1 23 12 +TICK +CX 21 0 1 28 23 11 +TICK +CX 1 30 21 31 23 32 +TICK +CX 12 30 21 36 27 31 +TICK +CX 21 2 12 28 29 30 +TICK +CX 21 25 27 28 +TICK +M 2 +CX 18 28 21 34 23 25 27 32 +TICK +CX 21 1 23 13 27 17 +H 18 +CX 35 25 +TICK +M 18 +CX 21 24 23 36 29 25 35 26 +TICK +M 1 13 17 +CX 21 0 15 25 23 34 29 26 37 36 +TICK +CX 8 36 23 12 +H 15 +CX 29 19 37 31 35 34 +TICK +M 0 15 +CX 35 7 +H 8 +CX 23 24 37 32 33 34 +TICK +M 8 12 19 +CX 6 34 37 9 23 11 22 32 33 30 +TICK +M 7 +CX 4 32 +H 6 +CX 20 30 22 31 33 26 +TICK +M 6 9 11 +CX 3 31 +H 4 +CX 33 5 16 26 +H 20 +CX 22 24 +TICK +M 4 20 +H 3 +CX 22 10 14 24 +H 16 +TICK +M 3 5 16 +H 14 +TICK +M 10 14 +TICK diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/cc_20_2_6.stim b/scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/cc_20_2_6.stim new file mode 100644 index 000000000..8bd194d9a --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/cc_20_2_6.stim @@ -0,0 +1,154 @@ +H 4 5 6 7 9 10 11 12 13 14 15 36 37 38 39 40 41 42 44 45 47 48 49 54 56 59 64 65 66 +TICK +CX 47 3 5 57 7 58 59 8 10 60 12 61 14 62 15 63 64 19 65 23 66 27 48 31 49 35 36 50 38 51 40 52 42 53 54 43 45 55 56 46 +TICK +CX 47 1 4 57 6 58 9 60 11 61 13 62 64 17 65 21 66 25 48 29 49 33 37 51 39 52 41 53 44 55 +TICK +CX 47 7 65 55 59 60 +TICK +CX 47 40 +TICK +CX 47 2 +TICK +CX 47 0 +TICK +CX 47 5 +TICK +CX 47 3 56 5 +TICK +CX 47 38 +TICK +M 3 +CX 47 10 +TICK +CX 47 2 48 10 +TICK +CX 48 40 47 50 +TICK +M 2 +CX 47 1 48 30 +TICK +CX 47 12 48 28 +TICK +M 1 +CX 47 0 48 7 59 12 +TICK +CX 48 31 +TICK +M 0 +CX 48 42 +TICK +M 31 +CX 66 42 48 45 +TICK +CX 48 30 56 45 66 61 +TICK +CX 48 14 66 26 56 58 +TICK +M 30 +CX 59 14 66 24 48 29 56 46 +TICK +CX 59 8 48 50 66 63 +TICK +M 29 46 +CX 66 27 48 28 65 63 +TICK +M 8 +CX 65 22 66 58 +TICK +M 27 28 +CX 7 58 65 20 66 62 +TICK +H 7 +CX 66 26 65 53 +TICK +M 7 +CX 65 23 66 52 +TICK +M 26 +CX 66 25 65 58 +TICK +M 23 +CX 6 58 65 38 66 57 +TICK +M 25 +H 6 +CX 65 22 66 24 64 57 +TICK +M 6 +CX 5 57 65 60 64 62 +TICK +M 22 24 +H 5 +CX 10 60 14 62 64 18 65 21 +TICK +M 5 +H 10 14 +CX 64 16 65 61 +TICK +M 10 14 21 +CX 12 61 65 20 64 60 +TICK +CX 9 60 +H 12 +CX 64 19 49 61 +TICK +M 12 20 +H 9 +CX 11 61 49 53 64 52 +TICK +M 9 19 +H 11 +CX 49 34 40 52 42 53 64 51 +TICK +M 11 +CX 64 18 49 32 +H 40 42 +TICK +M 40 42 +CX 49 62 64 55 +TICK +M 18 +CX 13 62 64 17 49 35 45 55 +TICK +H 13 45 +CX 49 55 64 63 +TICK +M 13 17 35 45 +CX 15 63 64 16 44 55 49 50 +TICK +H 15 +CX 49 34 36 50 +H 44 +TICK +M 15 16 44 +H 36 +CX 49 57 +TICK +M 34 36 +CX 4 57 49 33 +TICK +H 4 +CX 49 51 +TICK +M 4 33 +CX 49 32 38 51 +TICK +H 38 +CX 54 51 +TICK +M 32 38 +CX 37 51 54 52 +TICK +H 37 +CX 39 52 54 53 +TICK +M 37 +H 39 +CX 41 53 54 43 +TICK +M 39 +H 41 +TICK +M 41 43 +TICK diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/cc_31_1_7.stim b/scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/cc_31_1_7.stim new file mode 100644 index 000000000..65c1c74db --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/cc_31_1_7.stim @@ -0,0 +1,202 @@ +H 8 9 10 11 16 17 18 19 20 21 22 24 29 32 33 34 35 37 43 44 45 47 53 54 55 56 57 58 59 64 65 66 68 69 70 71 75 77 79 82 85 87 89 92 94 95 97 99 +TICK +CX 69 3 79 7 10 80 11 81 82 15 18 83 22 84 85 23 24 86 87 28 29 88 70 30 89 31 34 90 35 91 92 36 37 93 94 41 95 42 45 96 97 46 47 98 71 51 99 52 53 72 56 73 59 74 75 63 66 76 77 67 68 78 +TICK +CX 69 1 79 5 9 80 82 13 17 83 20 84 87 26 33 90 94 39 44 96 71 49 55 73 58 74 75 61 65 76 85 86 92 91 +TICK +CX 8 80 16 83 32 90 43 96 54 73 70 55 57 74 64 76 85 65 69 72 94 81 +TICK +CX 85 9 77 55 69 78 70 72 94 96 +TICK +CX 69 2 92 9 85 23 94 40 45 96 70 74 77 78 +TICK +M 23 +CX 69 0 70 30 94 38 +H 45 +CX 77 58 59 74 92 65 +TICK +M 30 45 +CX 92 36 +H 59 +CX 77 67 69 76 +TICK +M 59 67 36 +CX 69 3 66 76 +TICK +M 3 +H 66 +CX 69 83 +TICK +M 66 +CX 18 83 69 73 +TICK +CX 69 2 +H 18 +CX 56 73 +TICK +M 2 18 +H 56 +CX 69 80 94 73 +TICK +M 56 +CX 69 1 10 80 94 41 +TICK +M 1 41 +H 10 +CX 69 84 75 80 94 90 +TICK +M 10 +CX 69 0 75 33 34 90 94 84 +TICK +M 0 +CX 21 84 +H 34 +CX 94 40 75 62 +TICK +M 34 40 +CX 19 84 94 58 75 60 +TICK +CX 94 39 75 86 87 84 +TICK +M 39 +CX 22 84 75 63 87 96 94 88 +TICK +M 63 +CX 75 17 +H 22 +CX 87 27 94 38 95 88 97 96 +TICK +M 22 38 +CX 87 25 75 91 95 81 +TICK +CX 75 62 79 91 87 88 95 93 +TICK +M 62 +CX 87 28 29 88 35 91 95 42 75 44 +TICK +M 28 42 +H 29 35 +CX 75 61 87 74 +TICK +M 61 29 35 +CX 87 73 75 98 +TICK +CX 87 27 55 73 75 60 79 98 +TICK +M 60 27 +CX 79 6 +H 55 +CX 87 93 99 98 +TICK +M 55 +CX 79 4 87 26 47 98 82 93 +TICK +M 26 +CX 79 17 37 93 +H 47 +CX 82 73 87 90 +TICK +M 47 +CX 79 7 82 14 87 25 +H 37 +CX 54 73 +TICK +M 7 25 37 +CX 82 12 79 33 +H 54 +TICK +M 54 +CX 79 44 +TICK +CX 79 6 44 96 +TICK +M 6 +H 44 +CX 79 86 +TICK +M 44 +CX 79 5 24 86 +TICK +M 5 +H 24 +CX 79 76 +TICK +M 24 +CX 79 4 99 76 +TICK +M 4 +CX 65 76 99 80 +TICK +CX 9 80 99 52 +H 65 +CX 71 76 +TICK +M 65 52 +H 9 +CX 64 76 71 80 +TICK +M 9 +CX 8 80 71 50 +H 64 +TICK +M 64 +H 8 +CX 71 48 +TICK +M 8 +CX 71 84 +TICK +CX 71 51 97 84 +TICK +M 51 +CX 21 84 71 74 +TICK +H 21 +CX 58 74 71 83 89 84 +TICK +M 21 +CX 20 84 71 50 +H 58 +CX 82 74 97 83 +TICK +M 50 58 +CX 82 15 17 83 +H 20 +CX 97 46 57 74 71 78 +TICK +M 15 20 46 +H 17 +CX 71 49 +H 57 +CX 68 78 82 81 89 83 +TICK +M 49 57 17 +CX 11 81 16 83 +H 68 +CX 71 72 82 84 89 90 +TICK +M 68 +H 11 +CX 82 14 +H 16 +CX 19 84 89 31 33 90 71 48 53 72 +TICK +M 48 11 14 16 31 +H 19 33 53 +CX 82 96 +TICK +M 53 19 33 +CX 82 13 43 96 +TICK +M 13 +H 43 +CX 82 90 +TICK +M 43 +CX 82 12 32 90 +TICK +M 12 +H 32 +TICK +M 32 +TICK diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/rot_25_1_5.stim b/scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/rot_25_1_5.stim new file mode 100644 index 000000000..c439db46a --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/rot_25_1_5.stim @@ -0,0 +1,75 @@ +H 2 3 5 6 7 17 19 21 22 23 24 25 26 28 29 30 37 38 41 45 46 47 48 49 51 +TICK +CX 28 0 38 1 2 39 3 40 41 4 5 42 6 43 7 44 45 8 46 10 47 13 29 14 48 15 49 16 17 50 51 18 19 52 30 20 21 31 22 32 23 33 24 34 25 35 26 36 37 27 +TICK +CX 46 9 47 12 28 34 48 44 +TICK +CX 47 11 12 52 28 35 38 34 48 43 +TICK +CX 6 43 12 39 28 31 38 33 47 42 48 50 +TICK +CX 28 0 5 42 +H 6 +CX 48 15 23 33 30 31 38 39 47 50 +TICK +M 0 6 15 +CX 38 1 +H 5 +CX 47 13 30 20 +H 23 +CX 37 31 46 39 49 50 +TICK +M 1 5 13 20 23 +CX 49 16 37 32 47 35 46 50 +TICK +M 16 +CX 17 50 22 32 47 36 +TICK +CX 47 12 +H 17 22 +TICK +M 12 17 22 +CX 47 44 +TICK +CX 10 44 47 11 +TICK +M 11 +CX 10 40 45 44 +TICK +CX 7 44 46 10 45 40 +TICK +M 10 +H 7 +CX 45 39 41 40 46 52 +TICK +M 7 +CX 2 39 3 40 45 8 46 9 41 36 51 52 +TICK +M 8 9 +H 2 3 +CX 51 18 19 52 41 35 37 36 +TICK +M 2 3 18 +CX 41 4 +H 19 +CX 26 36 37 27 29 35 +TICK +M 4 19 27 +CX 25 35 +H 26 +CX 29 34 +TICK +M 26 +CX 24 34 +H 25 +CX 29 31 +TICK +M 25 +CX 29 14 21 31 +H 24 +TICK +M 14 24 +H 21 +TICK +M 21 +TICK From 8d6746c1f65173a1af16c83df7e1146f181fc81c Mon Sep 17 00:00:00 2001 From: Erik Weilandt <48921674+inctechs@users.noreply.github.com> Date: Tue, 28 Oct 2025 07:54:59 +0100 Subject: [PATCH 148/156] prepare simulation files for flag at origin sims --- .../estimate_logical_error_rate_fao.py | 75 +++++++++++++++++++ .../eval_circ_mod/run_eval_on_fao.sh | 24 ++++++ 2 files changed, 99 insertions(+) create mode 100644 scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate_fao.py create mode 100755 scripts/ft_stateprep/eval_circ_mod/run_eval_on_fao.sh diff --git a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate_fao.py b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate_fao.py new file mode 100644 index 000000000..a516ee3d3 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate_fao.py @@ -0,0 +1,75 @@ +# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# All rights reserved. +# +# SPDX-License-Identifier: MIT +# +# Licensed under the MIT License + +"""Estimate logical error rate for CSS state preparation circuits for a given code and physical error rate.""" + +from __future__ import annotations + +import argparse +from pathlib import Path + +import stim + +from mqt.qecc import CSSCode +from mqt.qecc.circuit_synthesis.noise import CircuitLevelNoiseIdlingParallel +from mqt.qecc.circuit_synthesis.simulation import VerificationNDFTStatePrepSimulator + + +def main() -> None: + """Run the logical error rate estimation for a given code and physical error rate.""" + available_codes = ["cc_17_1_5", "cc_20_2_6", "cc_25_1_5", "cc_31_1_7"] + parser = argparse.ArgumentParser(description="Estimate logical error rate for CSS state preparation circuits") + parser.add_argument( + "code", + type=str, + help="Code for which to estimate logical error rate. Available codes: " + ", ".join(available_codes), + ) + parser.add_argument("-p", "--p_error", type=float, help="Physical error rate") + parser.add_argument("-p_idle_factor", "--p_idle_factor", type=float, default=0.01, help="Idling error rate") + parser.add_argument("--zero_state", default=True, action="store_true", help="Synthesize logical |0> state.") + parser.add_argument( + "--plus_state", default=False, dest="zero_state", action="store_false", help="Synthesize logical |+> state." + ) + parser.add_argument("--x_errors", default=True, action="store_true", help="Calculate error rates for X-errors") + parser.add_argument( + "--z_errors", default=False, dest="x_errors", action="store_false", help="Calculate error rates for Z errors" + ) + parser.add_argument("-n", "--n_errors", type=int, default=500, help="Number of errors to sample") + + args = parser.parse_args() + code_name = args.code + check_matrix_path = (Path("__file__") / "../check_matrix/flag_at_origin/").resolve() + if not check_matrix_path.exists(): + msg = "Check matrix path does not exist." + raise ValueError(msg) + code = CSSCode.from_file(check_matrix_path / (code_name + ".txt")) + + prefix = (Path(__file__) / "../circuits/flag_at_origin/" / (code_name + ".stim")).resolve() + + with Path(prefix).open(encoding="utf-8") as f: + circuit_text = f.read() + + stim_circuit = stim.Circuit(circuit_text) + + sim = VerificationNDFTStatePrepSimulator( + state_prep_circ=stim_circuit, + code=code, + zero_state=args.zero_state, + ) + p = args.p_error + noise = CircuitLevelNoiseIdlingParallel(p, p, p * 2 / 3, p, p * args.p_idle_factor) + if args.x_errors: + print(f"Starting X error rate estimation with {args.n_errors} Errors...") + res = sim.logical_error_rate(noise=noise, min_errors=args.n_errors) + else: + res = sim.secondary_logical_error_rate(noise=noise, p=p, min_errors=args.n_errors) + + print(",".join([str(x) for x in res])) + + +if __name__ == "__main__": + main() diff --git a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_fao.sh b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_fao.sh new file mode 100755 index 000000000..a9068bb06 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_fao.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# All rights reserved. +# +# SPDX-License-Identifier: MIT +# +# Licensed under the MIT License + +# Description: Estimate logical error rates for given code in parallel. Results are saved in a csv file described by the first argument. All other arguments are passed to the python script. + +# declare -a p=("0.5" "0.3" "0.1" "0.09" "0.07" "0.05" "0.03" "0.01" "0.009" "0.007" "0.005" "0.003" "0.001" "0.0009" "0.0007" "0.0005" "0.0003" "0.0001") +declare -a p=("0.001" "0.003" "0.005") + +echo "p p_l acceptance errors runs" > "$1.csv" + +run_and_write() { + local res=$(python estimate_logical_error_rate.py ${@:2:$#-2} "-p" "${@: -1}") + local line="${@: -1} ${res}" + (flock -e 200 echo $line >> "$1.csv") 200>lock +} + +export -f run_and_write + +parallel --load 16 --link run_and_write $@ ::: ${p[@]} From bf08cc3bd8830b62ae87a3bd6ae732ababc7a21e Mon Sep 17 00:00:00 2001 From: Erik Weilandt <48921674+inctechs@users.noreply.github.com> Date: Tue, 28 Oct 2025 07:55:35 +0100 Subject: [PATCH 149/156] update mac bash script for 0.001 sims --- scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh index cda9257f0..bd534c372 100755 --- a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh +++ b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh @@ -9,9 +9,10 @@ # Description: Estimate logical error rates for given code in parallel. Results are saved in a csv file described by the first argument. All other arguments are passed to the python script. # declare -a p=("0.01" "0.009" "0.007" "0.005" "0.003" "0.001" "0.0009" "0.0007") -declare -a p=("0.003" "0.0025" "0.0035" "0.002" "0.004" "0.0015" "0.0045" "0.001" "0.005" "0.0055" "0.006" "0.0065" "0.007" "0.0075" "0.008" "0.0085" "0.009" "0.0095" "0.01") +# declare -a p=("0.003" "0.0025" "0.0035" "0.002" "0.004" "0.0015" "0.0045" "0.001" "0.005" "0.0055" "0.006" "0.0065" "0.007" "0.0075" "0.008" "0.0085" "0.009" "0.0095" "0.01") +declare -a p=("0.001") -echo "p p_l acceptance errors runs p_l_error acceptance_error" > "$1.csv" +echo "p p_l acceptance errors runs" > "$1.csv" run_and_write() { local res=$(python estimate_logical_error_rate.py ${@:2:$#-2} "-p" "${@: -1}") From ea8ac5e65a0cb8e35d8232081ad88228ad1e9865 Mon Sep 17 00:00:00 2001 From: Erik Weilandt <48921674+inctechs@users.noreply.github.com> Date: Tue, 28 Oct 2025 07:58:21 +0100 Subject: [PATCH 150/156] add 0.001 results for square octagon distance 7 code --- scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n10.csv | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n10.csv diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n10.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n10.csv new file mode 100644 index 000000000..37b95ea25 --- /dev/null +++ b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n10.csv @@ -0,0 +1,2 @@ +p p_l acceptance errors runs +0.001 1.3165880428483928e-09,0.672270784776989,10,11301300000 From d001d5064d111b55f7f38eb01e172cb49b0f3f9b Mon Sep 17 00:00:00 2001 From: Erik Weilandt <48921674+inctechs@users.noreply.github.com> Date: Sun, 23 Nov 2025 11:47:34 +0100 Subject: [PATCH 151/156] rename circuit and check matrix files for consitency --- .../check_matrix/flag_at_origin/{eve_20_2_6.txt => cc_20_2_6.txt} | 0 .../check_matrix/flag_at_origin/{rot_25_1_5.txt => cc_25_1_5.txt} | 0 .../circuits/flag_at_origin/{rot_25_1_5.stim => cc_25_1_5.stim} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/{eve_20_2_6.txt => cc_20_2_6.txt} (100%) rename scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/{rot_25_1_5.txt => cc_25_1_5.txt} (100%) rename scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/{rot_25_1_5.stim => cc_25_1_5.stim} (100%) diff --git a/scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/eve_20_2_6.txt b/scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/cc_20_2_6.txt similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/eve_20_2_6.txt rename to scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/cc_20_2_6.txt diff --git a/scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/rot_25_1_5.txt b/scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/cc_25_1_5.txt similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/rot_25_1_5.txt rename to scripts/ft_stateprep/eval_circ_mod/check_matrix/flag_at_origin/cc_25_1_5.txt diff --git a/scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/rot_25_1_5.stim b/scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/cc_25_1_5.stim similarity index 100% rename from scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/rot_25_1_5.stim rename to scripts/ft_stateprep/eval_circ_mod/circuits/flag_at_origin/cc_25_1_5.stim From 3013bffd1b46dbe90339b44390ad5a9b7b500549 Mon Sep 17 00:00:00 2001 From: Erik Weilandt <48921674+inctechs@users.noreply.github.com> Date: Sun, 23 Nov 2025 12:19:23 +0100 Subject: [PATCH 152/156] update fao simulation scripts to do remap of qubits --- .../estimate_logical_error_rate_fao.py | 173 ++++++++++++++---- .../eval_circ_mod/run_eval_on_fao.sh | 44 ++++- 2 files changed, 176 insertions(+), 41 deletions(-) diff --git a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate_fao.py b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate_fao.py index a516ee3d3..046355b8b 100644 --- a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate_fao.py +++ b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate_fao.py @@ -5,7 +5,7 @@ # # Licensed under the MIT License -"""Estimate logical error rate for CSS state preparation circuits for a given code and physical error rate.""" +"""Estimate logical error rates for CSS state preparation circuits.""" from __future__ import annotations @@ -15,60 +15,167 @@ import stim from mqt.qecc import CSSCode +from mqt.qecc.circuit_synthesis.circuit_utils import relabel_qubits from mqt.qecc.circuit_synthesis.noise import CircuitLevelNoiseIdlingParallel from mqt.qecc.circuit_synthesis.simulation import VerificationNDFTStatePrepSimulator +AVAILABLE_CODES: list[str] = [ + "cc_17_1_5", + "cc_20_2_6", + "cc_25_1_5", + "cc_31_1_7", +] + + +def parse_args() -> argparse.Namespace: + """Parse command-line arguments.""" + parser = argparse.ArgumentParser(description="Estimate logical error rate for a given code.") -def main() -> None: - """Run the logical error rate estimation for a given code and physical error rate.""" - available_codes = ["cc_17_1_5", "cc_20_2_6", "cc_25_1_5", "cc_31_1_7"] - parser = argparse.ArgumentParser(description="Estimate logical error rate for CSS state preparation circuits") parser.add_argument( "code", type=str, - help="Code for which to estimate logical error rate. Available codes: " + ", ".join(available_codes), + help="Code name. Available: " + ", ".join(AVAILABLE_CODES), + ) + parser.add_argument("-p", "--p_error", type=float, required=True, help="Physical error rate p.") + parser.add_argument( + "-p_idle_factor", + "--p_idle_factor", + type=float, + default=0.01, + help="Multiplier for idle error probability.", + ) + parser.add_argument("--zero_state", default=True, action="store_true", help="Prepare logical |0>.") + parser.add_argument( + "--plus_state", + default=False, + dest="zero_state", + action="store_false", + help="Prepare logical |+> instead.", ) - parser.add_argument("-p", "--p_error", type=float, help="Physical error rate") - parser.add_argument("-p_idle_factor", "--p_idle_factor", type=float, default=0.01, help="Idling error rate") - parser.add_argument("--zero_state", default=True, action="store_true", help="Synthesize logical |0> state.") + parser.add_argument("--x_errors", default=True, action="store_true", help="Compute X-error LER.") parser.add_argument( - "--plus_state", default=False, dest="zero_state", action="store_false", help="Synthesize logical |+> state." + "--z_errors", + default=False, + dest="x_errors", + action="store_false", + help="Compute Z-error LER.", ) - parser.add_argument("--x_errors", default=True, action="store_true", help="Calculate error rates for X-errors") parser.add_argument( - "--z_errors", default=False, dest="x_errors", action="store_false", help="Calculate error rates for Z errors" + "-n", + "--n_errors", + type=int, + default=500, + help="Minimum number of errors for Monte Carlo estimator.", + ) + parser.add_argument( + "--check-matrix-path", + type=Path, + default=Path(__file__).resolve().parent / "check_matrix" / "flag_at_origin", + ) + parser.add_argument( + "--circuits-path", + type=Path, + default=Path(__file__).resolve().parent / "circuits" / "flag_at_origin", + ) + + return parser.parse_args() + + +# --------------------------------------------------------------------------- +# Core simulation with remapping (your new requirement) +# --------------------------------------------------------------------------- +def run_simulation( + code_name: str, + p: float, + p_idle_factor: float, + min_errors: int, + zero_state: bool, + x_errors: bool, + check_matrix_path: Path, + circuits_path: Path, +) -> tuple[float, float, int, int]: + """Runs the simulation for a given code and returns (p_L, acceptance, errors, shots).""" + # Load code + code_file = check_matrix_path / f"{code_name}.txt" + if not code_file.exists(): + msg = f"Code file not found: {code_file}" + raise FileNotFoundError(msg) + code = CSSCode.from_file(str(code_file)) + + # Load circuit + circ_file = circuits_path / f"{code_name}.stim" + if not circ_file.exists(): + msg = f"Circuit file not found: {circ_file}" + raise FileNotFoundError(msg) + + circuit = stim.Circuit.from_file(str(circ_file)) + + # Build noise model + noise = CircuitLevelNoiseIdlingParallel( + p, + p, + p * 2 / 3, # same as before + p, + p * p_idle_factor, ) - parser.add_argument("-n", "--n_errors", type=int, default=500, help="Number of errors to sample") - args = parser.parse_args() - code_name = args.code - check_matrix_path = (Path("__file__") / "../check_matrix/flag_at_origin/").resolve() - if not check_matrix_path.exists(): - msg = "Check matrix path does not exist." - raise ValueError(msg) - code = CSSCode.from_file(check_matrix_path / (code_name + ".txt")) + # ---------------------------------------------------------------------- + # NEW: Apply noise & remap qubits (your colleague's fix) + # ---------------------------------------------------------------------- + noisy = noise.apply(circuit) - prefix = (Path(__file__) / "../circuits/flag_at_origin/" / (code_name + ".stim")).resolve() + n_measured = noisy.num_measurements + n_code = code.n - with Path(prefix).open(encoding="utf-8") as f: - circuit_text = f.read() + # mapping: measurement qubits go to the end; data qubits go to front + mapping = {i: i + n_code for i in range(n_measured)} | { + i: i - n_measured for i in range(n_measured, n_measured + n_code) + } - stim_circuit = stim.Circuit(circuit_text) + circuit_relabelled = relabel_qubits(circuit, mapping) + # Create simulator sim = VerificationNDFTStatePrepSimulator( - state_prep_circ=stim_circuit, + state_prep_circ=circuit_relabelled, code=code, - zero_state=args.zero_state, + zero_state=zero_state, ) - p = args.p_error - noise = CircuitLevelNoiseIdlingParallel(p, p, p * 2 / 3, p, p * args.p_idle_factor) - if args.x_errors: - print(f"Starting X error rate estimation with {args.n_errors} Errors...") - res = sim.logical_error_rate(noise=noise, min_errors=args.n_errors) + + # Run Monte-Carlo + if x_errors: + # returns: (p_L, acceptance_rate, num_errors, shots) + result = sim.logical_error_rate(noise=noise, min_errors=min_errors) else: - res = sim.secondary_logical_error_rate(noise=noise, p=p, min_errors=args.n_errors) + result = sim.secondary_logical_error_rate(noise=noise, p=p, min_errors=min_errors) + + return ( + float(result[0]), + float(result[1]), + int(result[2]), + int(result[3]), + ) + + +# --------------------------------------------------------------------------- +# Entry point (CSV output for bash) +# --------------------------------------------------------------------------- +def main() -> None: + """Main function to parse arguments and run the simulation.""" + args = parse_args() + + p_logical, acceptance, errors, shots = run_simulation( + code_name=args.code, + p=args.p_error, + p_idle_factor=args.p_idle_factor, + min_errors=args.n_errors, + zero_state=args.zero_state, + x_errors=args.x_errors, + check_matrix_path=args.check_matrix_path, + circuits_path=args.circuits_path, + ) - print(",".join([str(x) for x in res])) + # CSV-formatted output: p_L, acceptance, errors, shots + print(f"{p_logical},{acceptance},{errors},{shots}") if __name__ == "__main__": diff --git a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_fao.sh b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_fao.sh index a9068bb06..054185f61 100755 --- a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_fao.sh +++ b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_fao.sh @@ -6,19 +6,47 @@ # # Licensed under the MIT License -# Description: Estimate logical error rates for given code in parallel. Results are saved in a csv file described by the first argument. All other arguments are passed to the python script. +set -euo pipefail -# declare -a p=("0.5" "0.3" "0.1" "0.09" "0.07" "0.05" "0.03" "0.01" "0.009" "0.007" "0.005" "0.003" "0.001" "0.0009" "0.0007" "0.0005" "0.0003" "0.0001") -declare -a p=("0.001" "0.003" "0.005") +if [ "$#" -lt 1 ]; then + echo "Usage: $0 OUTPUT_PREFIX [extra python flags...]" + exit 1 +fi -echo "p p_l acceptance errors runs" > "$1.csv" +# First argument = output CSV file name (without .csv) +OUT="$1.csv" +shift 1 # remove output file name; remaining args are forwarded to python + +# Join remaining args into a single exported string +EXTRA_ARGS_STR="$*" +export EXTRA_ARGS_STR + +# arrays of jobs +CODES=("cc_17_1_5" "cc_20_2_6" "cc_25_1_5" "cc_31_1_7") +P_VALUES=("0.001") + +echo "code,p,p_logical,acceptance,errors,shots" > "$OUT" run_and_write() { - local res=$(python estimate_logical_error_rate.py ${@:2:$#-2} "-p" "${@: -1}") - local line="${@: -1} ${res}" - (flock -e 200 echo $line >> "$1.csv") 200>lock + # This function will be run by GNU parallel in a new shell. + # Reconstruct EXTRA_ARGS array locally from the exported string. + read -r -a EXTRA_ARR <<< "$EXTRA_ARGS_STR" + + local code="$1" + local p="$2" + + # call python with reconstructed array (handles multiple flags) + local result + result=$(python3 estimate_logical_error_rate_fao.py "$code" -p "$p" "${EXTRA_ARR[@]}") + + local line="$code,$p,$result" + + # append atomically + ( flock -e 200; echo "$line" >> "$OUT" ) 200>lockfile } export -f run_and_write +export OUT -parallel --load 16 --link run_and_write $@ ::: ${p[@]} +# Run parallel: Cartesian product of CODES x P_VALUES +parallel --jobs 2 run_and_write ::: "${CODES[@]}" ::: "${P_VALUES[@]}" From 5020d4863dc3e7dcd5be496fbb542ec56e68c6ca Mon Sep 17 00:00:00 2001 From: Erik Weilandt <48921674+inctechs@users.noreply.github.com> Date: Thu, 15 Jan 2026 14:39:40 +0100 Subject: [PATCH 153/156] fix CSV files (comma was missing) --- .../results/cc_4_8_8_d5_n250_z.csv | 32 ++++++++-------- .../results/cc_4_8_8_d5_n500.csv | 30 +++++++-------- .../eval_circ_mod/results/cc_4_8_8_d7_n10.csv | 2 - .../results/cc_4_8_8_d7_n100_z.csv | 38 +++++++++---------- .../eval_circ_mod/results/cc_4_8_8_d7_n50.csv | 35 ++++++++--------- .../results/cc_6_6_6_d5_n250_z.csv | 30 +++++++-------- .../results/cc_6_6_6_d5_n500_2.csv | 28 +++++++------- .../results/cc_6_6_6_d7_n100_z.csv | 38 +++++++++---------- .../eval_circ_mod/results/cc_6_6_6_d7_n50.csv | 37 +++++++++--------- 9 files changed, 135 insertions(+), 135 deletions(-) delete mode 100644 scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n10.csv diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d5_n250_z.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d5_n250_z.csv index cdd552cc8..736800910 100644 --- a/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d5_n250_z.csv +++ b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d5_n250_z.csv @@ -1,17 +1,17 @@ p p_l acceptance errors runs p_l_error acceptance_error -0.009 0.0007890339097207587,0.161573,255,2000000,4.9394323025686795e-05,0.0002602567632848376 -0.01 0.0011265701109701436,0.132713,299,2000000,6.511223632910568e-05,0.0002398960812841677 -0.007 0.00040734497233834896,0.24223566666666665,296,3000000,2.367080548162525e-05,0.00024735773585451916 -0.03 0.025298360285963748,0.002608749999999993,264,4000000,0.0015372192285635726,2.5504629106485224e-05 -0.005 0.00015490446723033228,0.3629295555555556,253,4500000,9.73824970047213e-06,0.00022667239858429193 -0.003 3.526640834883042e-05,0.5439522962962963,259,13500000,2.191420229100756e-06,0.00013555597330999815 -0.05 0.0940370801139355,6.871794871794202e-05,252,39000000,0.005638159819334154,1.3273573761953313e-06 -0.001 1.28694527985199e-06,0.8161162689075634,250,238000000,8.139828692263711e-08,2.51107215820172e-05 -0.07 0.15134538152610452,3.144578313229873e-06,250,415000000,0.009920757178871009,8.704753478938209e-08 -0.0009 9.236335175530411e-07,0.8328545476923083,250,325000000,5.8414865420648934e-08,2.069617951221164e-05 -0.0007 4.305385983106496e-07,0.8673773054518295,250,669500000,2.7228682928316697e-08,1.3108037055857542e-05 -0.09 0.04252726497288748,3.344909522863836e-07,250,2735500000,0.006670930060891094,1.105792793462423e-08 -0.0005 1.5508647826796515e-07,0.9033607671616706,250,1784500000,9.808397197275573e-09,6.994377580909208e-06 -0.1 0.023195458231954538,1.5201946471647367e-07,250,5137500000,0.005386166773271978,5.4396837178443764e-09 -0.0003 3.359863926833596e-08,0.9408375637880885,250,7909000000,2.1249206895028857e-09,2.6528919455898927e-06 -0.3 0.0037853775395813435,1.4865093136788645e-08,250,32559500000,0.0027913119551415313,6.75686046659029e-10 +0.009,0.0007890339097207587,0.161573,255,2000000,4.9394323025686795e-05,0.0002602567632848376 +0.01,0.0011265701109701436,0.132713,299,2000000,6.511223632910568e-05,0.0002398960812841677 +0.007,0.00040734497233834896,0.24223566666666665,296,3000000,2.367080548162525e-05,0.00024735773585451916 +0.03,0.025298360285963748,0.002608749999999993,264,4000000,0.0015372192285635726,2.5504629106485224e-05 +0.005,0.00015490446723033228,0.3629295555555556,253,4500000,9.73824970047213e-06,0.00022667239858429193 +0.003,3.526640834883042e-05,0.5439522962962963,259,13500000,2.191420229100756e-06,0.00013555597330999815 +0.05,0.0940370801139355,6.871794871794202e-05,252,39000000,0.005638159819334154,1.3273573761953313e-06 +0.001,1.28694527985199e-06,0.8161162689075634,250,238000000,8.139828692263711e-08,2.51107215820172e-05 +0.07,0.15134538152610452,3.144578313229873e-06,250,415000000,0.009920757178871009,8.704753478938209e-08 +0.0009,9.236335175530411e-07,0.8328545476923083,250,325000000,5.8414865420648934e-08,2.069617951221164e-05 +0.0007,4.305385983106496e-07,0.8673773054518295,250,669500000,2.7228682928316697e-08,1.3108037055857542e-05 +0.09,0.04252726497288748,3.344909522863836e-07,250,2735500000,0.006670930060891094,1.105792793462423e-08 +0.0005,1.5508647826796515e-07,0.9033607671616706,250,1784500000,9.808397197275573e-09,6.994377580909208e-06 +0.1,0.023195458231954538,1.5201946471647367e-07,250,5137500000,0.005386166773271978,5.4396837178443764e-09 +0.0003,3.359863926833596e-08,0.9408375637880885,250,7909000000,2.1249206895028857e-09,2.6528919455898927e-06 +0.3,0.0037853775395813435,1.4865093136788645e-08,250,32559500000,0.0027913119551415313,6.75686046659029e-10 diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d5_n500.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d5_n500.csv index 525414b34..a29d10852 100644 --- a/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d5_n500.csv +++ b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d5_n500.csv @@ -1,16 +1,16 @@ p p_l acceptance errors runs p_l_error acceptance_error -0.01 9.218831846556789e-05,0.13254195121951215,501,41000000,4.1185971923604335e-06,5.2955246264994925e-05 -0.009 7.262618113061721e-05,0.16196414117647068,500,42500000,3.2480816039759583e-06,5.651272800923366e-05 -0.03 0.003720151668562525,0.002588865384615384,501,52000000,0.00016592605586369122,7.0467711654614775e-06 -0.007 3.243637487425767e-05,0.24230985937500002,503,64000000,1.446217399192766e-06,5.3560099337197216e-05 -0.005 1.0898580634137458e-05,0.36273152569169953,500,126500000,4.873541742426324e-07,4.274729179976205e-05 -0.05 0.028145157917956277,6.771428571427743e-05,500,262500000,0.001240502779149001,5.078796276201399e-07 -0.003 2.356820377636626e-06,0.5439301410256411,500,390000000,1.0540443007681193e-07,2.5220572733358653e-05 -0.07 0.09330624726955027,3.210275229333553e-06,500,1362500000,0.004397909453968927,4.854026928225435e-08 -0.09 0.04242396142433262,3.3104599405770117e-07,500,5392000000,0.0047706014350106084,7.835544019815783e-09 -0.001 8.007557321019628e-08,0.8161107885243768,500,7651000000,3.5810991888278188e-09,4.428876639908826e-06 -0.1 0.02612321764864141,1.5356470271342852e-07,500,9292500000,0.004222341481762964,4.065176285614761e-09 -0.0009 5.85463849870974e-08,0.8328619964891738,500,10254000000,2.6182845920077193e-09,3.684490756813379e-06 -0.0007 2.7829723626588102e-08,0.8673898085697025,500,20712500000,1.2446035128124707e-09,2.356564590995231e-06 -0.0005 1.0122197889987248e-08,0.9033639369422166,500,54680000000,4.526804949359123e-10,1.2635334274500818e-06 -0.3 0.003476022111850033,1.4731879787473781e-08,500,71274000000,0.0018163121669546821,4.5463567714636175e-10 +0.01,9.218831846556789e-05,0.13254195121951215,501,41000000,4.1185971923604335e-06,5.2955246264994925e-05 +0.009,7.262618113061721e-05,0.16196414117647068,500,42500000,3.2480816039759583e-06,5.651272800923366e-05 +0.03,0.003720151668562525,0.002588865384615384,501,52000000,0.00016592605586369122,7.0467711654614775e-06 +0.007,3.243637487425767e-05,0.24230985937500002,503,64000000,1.446217399192766e-06,5.3560099337197216e-05 +0.005,1.0898580634137458e-05,0.36273152569169953,500,126500000,4.873541742426324e-07,4.274729179976205e-05 +0.05,0.028145157917956277,6.771428571427743e-05,500,262500000,0.001240502779149001,5.078796276201399e-07 +0.003,2.356820377636626e-06,0.5439301410256411,500,390000000,1.0540443007681193e-07,2.5220572733358653e-05 +0.07,0.09330624726955027,3.210275229333553e-06,500,1362500000,0.004397909453968927,4.854026928225435e-08 +0.09,0.04242396142433262,3.3104599405770117e-07,500,5392000000,0.0047706014350106084,7.835544019815783e-09 +0.001,8.007557321019628e-08,0.8161107885243768,500,7651000000,3.5810991888278188e-09,4.428876639908826e-06 +0.1,0.02612321764864141,1.5356470271342852e-07,500,9292500000,0.004222341481762964,4.065176285614761e-09 +0.0009,5.85463849870974e-08,0.8328619964891738,500,10254000000,2.6182845920077193e-09,3.684490756813379e-06 +0.0007,2.7829723626588102e-08,0.8673898085697025,500,20712500000,1.2446035128124707e-09,2.356564590995231e-06 +0.0005,1.0122197889987248e-08,0.9033639369422166,500,54680000000,4.526804949359123e-10,1.2635334274500818e-06 +0.3,0.003476022111850033,1.4731879787473781e-08,500,71274000000,0.0018163121669546821,4.5463567714636175e-10 diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n10.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n10.csv deleted file mode 100644 index 37b95ea25..000000000 --- a/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n10.csv +++ /dev/null @@ -1,2 +0,0 @@ -p p_l acceptance errors runs -0.001 1.3165880428483928e-09,0.672270784776989,10,11301300000 diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n100_z.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n100_z.csv index cedc1fe8c..85649d481 100644 --- a/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n100_z.csv +++ b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n100_z.csv @@ -1,20 +1,20 @@ p p_l acceptance errors runs p_l_error acceptance_error -0.0045 1.3573076826600939e-05,0.07549517766497459,101,98500000,1.3510097562836812e-06,2.6619266297483295e-05 -0.004 9.457369520293033e-06,0.09315614096916303,100,113500000,9.457567508433822e-07,2.7281866041455697e-05 -0.0035 5.654685237202446e-06,0.11485035714285716,100,154000000,5.65426884725871e-07,2.569296136458228e-05 -0.0055 3.196532440667811e-05,0.04964860317460319,100,63000000,3.1967511119253596e-06,2.7366883990034952e-05 -0.005 2.4567795632771825e-05,0.06122878195488722,100,66500000,2.4563436613968633e-06,2.9399968854571018e-05 -0.003 3.2596582814900336e-06,0.1416752101616627,100,216500000,3.259938793913312e-07,2.369975248477873e-05 -0.0065 6.368380048029067e-05,0.032715958333333316,100,48000000,6.3679583678746175e-06,2.5676523163057322e-05 -0.006 4.008180761851039e-05,0.04026288709677416,100,62000000,4.006975106797245e-06,2.4965068182267546e-05 -0.0075 0.00013786540461655192,0.021533117647058824,101,34000000,1.3721601282817423e-05,2.4893563124688387e-05 -0.007 8.587741385749338e-05,0.026480409090909075,100,44000000,8.584838836919335e-06,2.420518212044271e-05 -0.008 0.00012611105279930666,0.017428000000000006,100,45500000,1.2610134398132381e-05,1.9399934754620094e-05 -0.0085 0.0001451553649005154,0.01419868041237113,100,48500000,1.4517444092436165e-05,1.6988217801175462e-05 -0.009 0.0001907700370466462,0.011509161290322582,102,46500000,1.8878406715073358e-05,1.564161838608225e-05 -0.0095 0.00027551103425869173,0.009290025316455697,101,39500000,2.7396978397177037e-05,1.526452057904983e-05 -0.01 0.00031472483572281414,0.007583166666666673,100,42000000,3.143020470306398e-05,1.338590432220208e-05 -0.0025 1.3021529151473805e-06,0.17477571331058023,100,439500000,1.3019992368073743e-07,1.8115365563653318e-05 -0.002 8.034466296474356e-07,0.21564181975736574,100,577000000,8.035704197588435e-08,1.7121263160666823e-05 -0.0015 2.2843480567621631e-07,0.26607329626253384,100,1645500000,2.2841861834897323e-08,1.089376610472284e-05 -0.001 5.591894993621767e-08,0.32829813159585275,100,5448500000,5.59122292874432e-09,6.3618585111570534e-06 +0.0045,1.3573076826600939e-05,0.07549517766497459,101,98500000,1.3510097562836812e-06,2.6619266297483295e-05 +0.004,9.457369520293033e-06,0.09315614096916303,100,113500000,9.457567508433822e-07,2.7281866041455697e-05 +0.0035,5.654685237202446e-06,0.11485035714285716,100,154000000,5.65426884725871e-07,2.569296136458228e-05 +0.0055,3.196532440667811e-05,0.04964860317460319,100,63000000,3.1967511119253596e-06,2.7366883990034952e-05 +0.005,2.4567795632771825e-05,0.06122878195488722,100,66500000,2.4563436613968633e-06,2.9399968854571018e-05 +0.003,3.2596582814900336e-06,0.1416752101616627,100,216500000,3.259938793913312e-07,2.369975248477873e-05 +0.0065,6.368380048029067e-05,0.032715958333333316,100,48000000,6.3679583678746175e-06,2.5676523163057322e-05 +0.006,4.008180761851039e-05,0.04026288709677416,100,62000000,4.006975106797245e-06,2.4965068182267546e-05 +0.0075,0.00013786540461655192,0.021533117647058824,101,34000000,1.3721601282817423e-05,2.4893563124688387e-05 +0.007,8.587741385749338e-05,0.026480409090909075,100,44000000,8.584838836919335e-06,2.420518212044271e-05 +0.008,0.00012611105279930666,0.017428000000000006,100,45500000,1.2610134398132381e-05,1.9399934754620094e-05 +0.0085,0.0001451553649005154,0.01419868041237113,100,48500000,1.4517444092436165e-05,1.6988217801175462e-05 +0.009,0.0001907700370466462,0.011509161290322582,102,46500000,1.8878406715073358e-05,1.564161838608225e-05 +0.0095,0.00027551103425869173,0.009290025316455697,101,39500000,2.7396978397177037e-05,1.526452057904983e-05 +0.01,0.00031472483572281414,0.007583166666666673,100,42000000,3.143020470306398e-05,1.338590432220208e-05 +0.0025,1.3021529151473805e-06,0.17477571331058023,100,439500000,1.3019992368073743e-07,1.8115365563653318e-05 +0.002,8.034466296474356e-07,0.21564181975736574,100,577000000,8.035704197588435e-08,1.7121263160666823e-05 +0.0015,2.2843480567621631e-07,0.26607329626253384,100,1645500000,2.2841861834897323e-08,1.089376610472284e-05 +0.001,5.591894993621767e-08,0.32829813159585275,100,5448500000,5.59122292874432e-09,6.3618585111570534e-06 diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n50.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n50.csv index b51f60ac3..274d7d03e 100644 --- a/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n50.csv +++ b/scripts/ft_stateprep/eval_circ_mod/results/cc_4_8_8_d7_n50.csv @@ -1,18 +1,19 @@ p p_l acceptance errors runs p_l_error acceptance_error -0.0035 1.5629615702318374e-07,0.11485806606822266,50,2785000000,2.2104503601247943e-08,6.041914956975274e-06 -0.004 2.675827576250103e-07,0.0931278590286425,50,2007500000,3.783218442121689e-08,6.4861212459856e-06 -0.003 7.340905106041707e-08,0.14168500270439022,50,4807000000,1.0381874786483958e-08,5.0297712117440816e-06 -0.005 6.587037349691292e-07,0.061233870915691734,50,1239500000,9.315921004558004e-08,6.810065632844989e-06 -0.0045 3.845754510138509e-07,0.07550478235635526,50,1723000000,5.437018700670401e-08,6.3649782765250135e-06 -0.0055 9.369180174916529e-07,0.04966576476057654,50,1075500000,1.3243928302398234e-07,6.624628728056182e-06 -0.006 1.4470001584741443e-06,0.04026431450203839,50,858500000,2.0459907718438362e-07,6.709124123984448e-06 -0.0025 3.84397786882249e-08,0.17478542256265475,50,7441500000,5.43635217858893e-09,4.402565307141466e-06 -0.0065 1.742268418397229e-06,0.03267085000000007,50,880000000,2.4617026939954625e-07,5.9927480379013065e-06 -0.007 2.5695715618854345e-06,0.026499185034013606,50,735000000,3.632200988075673e-07,5.9243505601818925e-06 -0.0075 3.4389083299547123e-06,0.021498023668639052,50,676000000,4.864485760908777e-07,5.578363029883245e-06 -0.008 4.710767639800748e-06,0.0174482077493817,50,606500000,6.671968760736622e-07,5.316645887060986e-06 -0.009 9.437897446141872e-06,0.011501715835140999,50,461000000,1.3341473504038595e-06,4.96613834708669e-06 -0.0085 4.7947891619421245e-06,0.01417058983050848,50,737500000,6.773431454939097e-07,4.3522500262120755e-06 -0.0095 1.3296113182756149e-05,0.009340152119700738,50,401000000,1.884127565032174e-06,4.8036025752503285e-06 -0.01 9.743927863013015e-06,0.007573344574780064,50,682000000,1.3735006470877545e-06,3.319715615742008e-06 -0.002 1.5469142513658964e-08,0.2156401324790587,50,14983500000,2.1880723888434886e-09,3.3598186859801094e-06 +0.0035,1.5629615702318374e-07,0.229716,50,2785000000,2.2104503601247943e-08,6.041914956975274e-06 +0.004,2.675827576250103e-07,0.186256,50,2007500000,3.783218442121689e-08,6.4861212459856e-06 +0.003,7.340905106041707e-08,0.28337,50,4807000000,1.0381874786483958e-08,5.0297712117440816e-06 +0.005,6.587037349691292e-07,0.122468,50,1239500000,9.315921004558004e-08,6.810065632844989e-06 +0.0045,3.845754510138509e-07,0.15101,50,1723000000,5.437018700670401e-08,6.3649782765250135e-06 +0.0055,9.369180174916529e-07,0.0993315,50,1075500000,1.3243928302398234e-07,6.624628728056182e-06 +0.006,1.4470001584741443e-06,0.0805286,50,858500000,2.0459907718438362e-07,6.709124123984448e-06 +0.0025,3.84397786882249e-08,0.349571,50,7441500000,5.43635217858893e-09,4.402565307141466e-06 +0.0065,1.742268418397229e-06,0.0653417,50,880000000,2.4617026939954625e-07,5.9927480379013065e-06 +0.007,2.5695715618854345e-06,0.0529984,50,735000000,3.632200988075673e-07,5.9243505601818925e-06 +0.0075,3.4389083299547123e-06,0.042996,50,676000000,4.864485760908777e-07,5.578363029883245e-06 +0.008,4.710767639800748e-06,0.0348964,50,606500000,6.671968760736622e-07,5.316645887060986e-06 +0.009,9.437897446141872e-06,0.0230034,50,461000000,1.3341473504038595e-06,4.96613834708669e-06 +0.0085,4.7947891619421245e-06,0.0283412,50,737500000,6.773431454939097e-07,4.3522500262120755e-06 +0.0095,1.3296113182756149e-05,0.0186803,50,401000000,1.884127565032174e-06,4.8036025752503285e-06 +0.01,9.743927863013015e-06,0.0151467,50,682000000,1.3735006470877545e-06,3.319715615742008e-06 +0.002,1.5469142513658964e-08,0.43128,50,14983500000,2.1880723888434886e-09,3.3598186859801094e-06 +0.001,1.3165880428483928e-09,0.672270784776989,10,11301300000 diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d5_n250_z.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d5_n250_z.csv index 091ffa384..b34815298 100644 --- a/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d5_n250_z.csv +++ b/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d5_n250_z.csv @@ -1,16 +1,16 @@ p p_l acceptance errors runs p_l_error acceptance_error -0.01 0.0009778274050677425,0.098837,290,3000000,5.739819842372078e-05,0.00017230616881102467 -0.009 0.0007090423594105948,0.12409171428571428,308,3500000,4.0390260596630766e-05,0.00017622466239867703 -0.007 0.00040357336913175447,0.19681057142857145,278,3500000,2.4199999909641746e-05,0.00021251969347570767 -0.005 0.00012578466322879397,0.3131226153846154,256,6500000,7.860906558908823e-06,0.00018190312008120976 -0.03 0.025467282832721788,0.0011004444444444469,253,9000000,0.0015830119811089235,1.1051563320630446e-05 -0.003 2.7590035087361427e-05,0.49757318918918914,254,18500000,1.7312340507761101e-06,0.00011624626947557744 -0.05 0.09041813314890233,1.691076923075781e-05,252,162500000,0.005470667260195092,3.225903165759399e-07 -0.001 1.0981197493133006e-06,0.7922804852686305,251,288500000,6.931260549084407e-08,2.3883898692334507e-05 -0.0009 7.279800614410727e-07,0.8108509539551356,250,423500000,4.6042867258437486e-08,1.9030311025356355e-05 -0.0007 3.520090167132161e-07,0.849549428229666,250,836000000,2.2262777860745065e-08,1.2364828825952747e-05 -0.07 0.04229661627069819,5.234635774484799e-07,250,2546500000,0.005512558976492087,1.433742900874978e-08 -0.0005 1.3526549225632763e-07,0.8900454312545167,250,2076500000,8.555027776688416e-09,6.865098291511959e-06 -0.0003 2.8770993251443568e-08,0.9324939543893578,250,9318000000,1.8196717627525266e-09,2.599159873361169e-06 -0.09 0.0059512258231450964,4.5653017658426775e-08,250,20612000000,0.0025073343497520307,1.4882458082542598e-09 -0.1 0.003377781402492907,2.0470578639921255e-08,250,36784500000,0.00211438254336325,7.459893484157298e-10 +0.01,0.0009778274050677425,0.098837,290,3000000,5.739819842372078e-05,0.00017230616881102467 +0.009,0.0007090423594105948,0.12409171428571428,308,3500000,4.0390260596630766e-05,0.00017622466239867703 +0.007,0.00040357336913175447,0.19681057142857145,278,3500000,2.4199999909641746e-05,0.00021251969347570767 +0.005,0.00012578466322879397,0.3131226153846154,256,6500000,7.860906558908823e-06,0.00018190312008120976 +0.03,0.025467282832721788,0.0011004444444444469,253,9000000,0.0015830119811089235,1.1051563320630446e-05 +0.003,2.7590035087361427e-05,0.49757318918918914,254,18500000,1.7312340507761101e-06,0.00011624626947557744 +0.05,0.09041813314890233,1.691076923075781e-05,252,162500000,0.005470667260195092,3.225903165759399e-07 +0.001,1.0981197493133006e-06,0.7922804852686305,251,288500000,6.931260549084407e-08,2.3883898692334507e-05 +0.0009,7.279800614410727e-07,0.8108509539551356,250,423500000,4.6042867258437486e-08,1.9030311025356355e-05 +0.0007,3.520090167132161e-07,0.849549428229666,250,836000000,2.2262777860745065e-08,1.2364828825952747e-05 +0.07,0.04229661627069819,5.234635774484799e-07,250,2546500000,0.005512558976492087,1.433742900874978e-08 +0.0005,1.3526549225632763e-07,0.8900454312545167,250,2076500000,8.555027776688416e-09,6.865098291511959e-06 +0.0003,2.8770993251443568e-08,0.9324939543893578,250,9318000000,1.8196717627525266e-09,2.599159873361169e-06 +0.09,0.0059512258231450964,4.5653017658426775e-08,250,20612000000,0.0025073343497520307,1.4882458082542598e-09 +0.1,0.003377781402492907,2.0470578639921255e-08,250,36784500000,0.00211438254336325,7.459893484157298e-10 diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d5_n500_2.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d5_n500_2.csv index c299eac2e..cb43a2b37 100644 --- a/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d5_n500_2.csv +++ b/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d5_n500_2.csv @@ -1,15 +1,15 @@ p p_l acceptance errors runs p_l_error acceptance_error -0.01 9.866330769887207e-05,0.09860619417475726,501,51500000,4.407585006423178e-06,4.1543756939907155e-05 -0.009 7.107868247437325e-05,0.12412936842105263,503,57000000,3.169418209390482e-06,4.36736839780926e-05 -0.007 3.2537643646738084e-05,0.19699447435897444,500,78000000,1.455163055405479e-06,4.50338407557919e-05 -0.03 0.0035457334783736234,0.0010925813953488372,500,129000000,0.00015832881955495329,2.9086714264424753e-06 -0.005 1.0803671027990734e-05,0.3128853131313131,502,148500000,4.822003419231253e-07,3.804906401535613e-05 -0.003 2.3999166656689416e-06,0.4976432157330151,501,419500000,1.0721919276735499e-07,2.4411765933953025e-05 -0.05 0.027620167597544997,1.7164898746374388e-05,500,1037000000,0.0012283471570248246,1.2865525129676879e-07 -0.07 0.02927296202306218,5.349272071482121e-07,500,7487000000,0.002663671338258735,8.452658261264776e-09 -0.001 9.175767817534946e-08,0.7922410119220732,500,6878000000,4.103566179324987e-09,4.891899038906775e-06 -0.0009 6.321772138813842e-08,0.8109010898093065,500,9754000000,2.827118989114016e-09,3.9649441969164225e-06 -0.0007 2.762634545429089e-08,0.8495549571441898,500,21304000000,1.2354790833427618e-09,2.4493683607975084e-06 -0.09 0.006827750320336813,4.5853926412855893e-08,500,36420000000,0.002015082671084253,1.1220656931890295e-09 -0.0005 1.0252811904476834e-08,0.8900551751339285,500,54789500000,4.5852641455932803e-10,1.3364330037574505e-06 -0.1 0.003476578654087435,1.9499681079471632e-08,500,71334500000,0.0015781788535898355,5.228341410372749e-10 +0.01,9.866330769887207e-05,0.09860619417475726,501,51500000,4.407585006423178e-06,4.1543756939907155e-05 +0.009,7.107868247437325e-05,0.12412936842105263,503,57000000,3.169418209390482e-06,4.36736839780926e-05 +0.007,3.2537643646738084e-05,0.19699447435897444,500,78000000,1.455163055405479e-06,4.50338407557919e-05 +0.03,0.0035457334783736234,0.0010925813953488372,500,129000000,0.00015832881955495329,2.9086714264424753e-06 +0.005,1.0803671027990734e-05,0.3128853131313131,502,148500000,4.822003419231253e-07,3.804906401535613e-05 +0.003,2.3999166656689416e-06,0.4976432157330151,501,419500000,1.0721919276735499e-07,2.4411765933953025e-05 +0.05,0.027620167597544997,1.7164898746374388e-05,500,1037000000,0.0012283471570248246,1.2865525129676879e-07 +0.07,0.02927296202306218,5.349272071482121e-07,500,7487000000,0.002663671338258735,8.452658261264776e-09 +0.001,9.175767817534946e-08,0.7922410119220732,500,6878000000,4.103566179324987e-09,4.891899038906775e-06 +0.0009,6.321772138813842e-08,0.8109010898093065,500,9754000000,2.827118989114016e-09,3.9649441969164225e-06 +0.0007,2.762634545429089e-08,0.8495549571441898,500,21304000000,1.2354790833427618e-09,2.4493683607975084e-06 +0.09,0.006827750320336813,4.5853926412855893e-08,500,36420000000,0.002015082671084253,1.1220656931890295e-09 +0.0005,1.0252811904476834e-08,0.8900551751339285,500,54789500000,4.5852641455932803e-10,1.3364330037574505e-06 +0.1,0.003476578654087435,1.9499681079471632e-08,500,71334500000,0.0015781788535898355,5.228341410372749e-10 diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d7_n100_z.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d7_n100_z.csv index fca2e0458..ae20c2edc 100644 --- a/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d7_n100_z.csv +++ b/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d7_n100_z.csv @@ -1,20 +1,20 @@ p p_l acceptance errors runs p_l_error acceptance_error -0.003 1.6353205408596861e-06,0.21004745578231285,101,294000000,1.6273040783660753e-07,2.375666910314864e-05 -0.0025 8.578457087211598e-07,0.27239435981308435,100,428000000,8.577949108943518e-08,2.1519154288609316e-05 -0.0035 2.905027060840175e-06,0.1619982870588233,100,212500000,2.9049574929349506e-07,2.527540930477502e-05 -0.004 5.143052299257098e-06,0.12498345980707389,100,155500000,5.144200478883155e-07,2.651973657822248e-05 -0.002 4.543109852144457e-07,0.35326880417335454,100,623000000,4.543388275600683e-08,1.9150077057763258e-05 -0.0045 1.0127194308976122e-05,0.09638287804878044,100,102500000,1.0124661082979137e-06,2.914944150706491e-05 -0.0015 1.027460847753464e-07,0.45813480348317204,100,2124500000,1.0274426936159529e-08,1.0809706535675973e-05 -0.005 1.3653283038461288e-05,0.07438920812182741,100,98500000,1.3650309512562874e-06,2.6439367248016373e-05 -0.0055 1.7081363413858337e-05,0.05739366666666663,100,102000000,1.7081479562523264e-06,2.303016642622943e-05 -0.006 3.206600305612109e-05,0.04426473758865249,100,70500000,3.2054716939174546e-06,2.4496452368669627e-05 -0.0065 4.308124858656152e-05,0.03414388235294117,100,68000000,4.307486039703069e-06,2.2022073702514164e-05 -0.007 5.708847259091935e-05,0.02633772932330828,100,66500000,5.709023453392754e-06,1.9637333378454107e-05 -0.0075 6.153210199459431e-05,0.0203528198757764,101,80500000,6.128120253501175e-06,1.573798766954389e-05 -0.008 7.200858443054991e-05,0.015718259887005676,100,88500000,7.194533378227276e-06,1.322179171646422e-05 -0.0085 0.00010359286784963502,0.012124968553459122,100,79500000,1.0366175500805244e-05,1.2274611365089499e-05 -0.009 0.00013530322890710302,0.009380886075949358,100,79000000,1.3511053732828062e-05,1.0845803629018605e-05 -0.0095 0.00016198553117793902,0.007234292397660815,100,85500000,1.6181614407888447e-05,9.165124215469314e-06 -0.01 0.00021558354467736613,0.005581523809523803,101,84000000,2.1440995808471576e-05,8.128704577787699e-06 -0.001 2.0670905502746648e-08,0.5942447387298809,100,8141000000,2.067084337457061e-09,5.442217258126517e-06 +0.003,1.6353205408596861e-06,0.21004745578231285,101,294000000,1.6273040783660753e-07,2.375666910314864e-05 +0.0025,8.578457087211598e-07,0.27239435981308435,100,428000000,8.577949108943518e-08,2.1519154288609316e-05 +0.0035,2.905027060840175e-06,0.1619982870588233,100,212500000,2.9049574929349506e-07,2.527540930477502e-05 +0.004,5.143052299257098e-06,0.12498345980707389,100,155500000,5.144200478883155e-07,2.651973657822248e-05 +0.002,4.543109852144457e-07,0.35326880417335454,100,623000000,4.543388275600683e-08,1.9150077057763258e-05 +0.0045,1.0127194308976122e-05,0.09638287804878044,100,102500000,1.0124661082979137e-06,2.914944150706491e-05 +0.0015,1.027460847753464e-07,0.45813480348317204,100,2124500000,1.0274426936159529e-08,1.0809706535675973e-05 +0.005,1.3653283038461288e-05,0.07438920812182741,100,98500000,1.3650309512562874e-06,2.6439367248016373e-05 +0.0055,1.7081363413858337e-05,0.05739366666666663,100,102000000,1.7081479562523264e-06,2.303016642622943e-05 +0.006,3.206600305612109e-05,0.04426473758865249,100,70500000,3.2054716939174546e-06,2.4496452368669627e-05 +0.0065,4.308124858656152e-05,0.03414388235294117,100,68000000,4.307486039703069e-06,2.2022073702514164e-05 +0.007,5.708847259091935e-05,0.02633772932330828,100,66500000,5.709023453392754e-06,1.9637333378454107e-05 +0.0075,6.153210199459431e-05,0.0203528198757764,101,80500000,6.128120253501175e-06,1.573798766954389e-05 +0.008,7.200858443054991e-05,0.015718259887005676,100,88500000,7.194533378227276e-06,1.322179171646422e-05 +0.0085,0.00010359286784963502,0.012124968553459122,100,79500000,1.0366175500805244e-05,1.2274611365089499e-05 +0.009,0.00013530322890710302,0.009380886075949358,100,79000000,1.3511053732828062e-05,1.0845803629018605e-05 +0.0095,0.00016198553117793902,0.007234292397660815,100,85500000,1.6181614407888447e-05,9.165124215469314e-06 +0.01,0.00021558354467736613,0.005581523809523803,101,84000000,2.1440995808471576e-05,8.128704577787699e-06 +0.001,2.0670905502746648e-08,0.5942447387298809,100,8141000000,2.067084337457061e-09,5.442217258126517e-06 diff --git a/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d7_n50.csv b/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d7_n50.csv index c1f11f3e9..3b0c0308e 100644 --- a/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d7_n50.csv +++ b/scripts/ft_stateprep/eval_circ_mod/results/cc_6_6_6_d7_n50.csv @@ -1,19 +1,20 @@ p p_l acceptance errors runs p_l_error acceptance_error -0.003 5.581531044934655e-08,0.21005382690278057,50,4263500000,7.894565410598742e-09,6.238510569144442e-06 -0.0025 3.09235031377766e-08,0.2724012753159238,50,5935000000,4.373502777885096e-09,5.778833359729731e-06 -0.0035 1.0959906196456912e-07,0.1619983526904631,50,2815500000,1.5501378824893388e-08,6.943844225036534e-06 -0.004 1.6215409021088684e-07,0.12494724893660145,50,2468500000,2.2928941368595758e-08,6.655242744891259e-06 -0.002 1.3034382205317407e-08,0.3532516295818731,50,10858000000,1.8434366488522054e-09,4.58706442575362e-06 -0.0045 2.7749964138669766e-07,0.09640374478330654,50,1869000000,3.924456774961247e-08,6.826993866373717e-06 -0.0015 3.3447093947298544e-09,0.45815411957170493,50,32641500000,4.729207202250708e-10,2.757773740241302e-06 -0.005 5.900969780670109e-07,0.07435519175076784,50,1139500000,8.34543066723393e-08,7.771783055161378e-06 -0.0055 7.601132403839991e-07,0.057362219512195056,50,1148000000,1.074372951922989e-07,6.863007137752974e-06 -0.006 9.708548916500824e-07,0.0442639965606191,50,1163000000,1.3732884949269628e-07,6.0312096843983316e-06 -0.0065 1.529459685268571e-06,0.03415583795086254,50,956500000,2.1636834615033673e-07,5.872777059156254e-06 -0.007 2.5526981775950828e-06,0.02636876902356897,50,742500000,3.6108215258533955e-07,5.880225040214863e-06 -0.0075 2.763367878589058e-06,0.020343047725996617,50,890500000,3.9056541335994514e-07,4.730728883827416e-06 -0.008 3.8772513177591825e-06,0.015717927007299303,50,822000000,5.478070178448924e-07,4.338319297647003e-06 -0.0085 4.489260194474157e-06,0.012126884531590425,50,918000000,6.350244575083712e-07,3.612466794767582e-06 -0.009 6.1086658480480524e-06,0.009363507727532907,50,873500000,8.642136406651013e-07,3.2587045952170578e-06 -0.0095 7.438530933592207e-06,0.007227393451422449,50,931500000,1.0511378939840536e-06,2.7753918710550012e-06 -0.01 8.79373304173127e-06,0.005584056918547608,50,1019000000,1.2431476658628543e-06,2.3343816758439952e-06 +0.003,5.581531044934655e-08,0.21005382690278057,50,4263500000,7.894565410598742e-09,6.238510569144442e-06 +0.0025,3.09235031377766e-08,0.2724012753159238,50,5935000000,4.373502777885096e-09,5.778833359729731e-06 +0.0035,1.0959906196456912e-07,0.1619983526904631,50,2815500000,1.5501378824893388e-08,6.943844225036534e-06 +0.004,1.6215409021088684e-07,0.12494724893660145,50,2468500000,2.2928941368595758e-08,6.655242744891259e-06 +0.002,1.3034382205317407e-08,0.3532516295818731,50,10858000000,1.8434366488522054e-09,4.58706442575362e-06 +0.0045,2.7749964138669766e-07,0.09640374478330654,50,1869000000,3.924456774961247e-08,6.826993866373717e-06 +0.0015,3.3447093947298544e-09,0.45815411957170493,50,32641500000,4.729207202250708e-10,2.757773740241302e-06 +0.005,5.900969780670109e-07,0.07435519175076784,50,1139500000,8.34543066723393e-08,7.771783055161378e-06 +0.0055,7.601132403839991e-07,0.057362219512195056,50,1148000000,1.074372951922989e-07,6.863007137752974e-06 +0.006,9.708548916500824e-07,0.0442639965606191,50,1163000000,1.3732884949269628e-07,6.0312096843983316e-06 +0.0065,1.529459685268571e-06,0.03415583795086254,50,956500000,2.1636834615033673e-07,5.872777059156254e-06 +0.007,2.5526981775950828e-06,0.02636876902356897,50,742500000,3.6108215258533955e-07,5.880225040214863e-06 +0.0075,2.763367878589058e-06,0.020343047725996617,50,890500000,3.9056541335994514e-07,4.730728883827416e-06 +0.008,3.8772513177591825e-06,0.015717927007299303,50,822000000,5.478070178448924e-07,4.338319297647003e-06 +0.0085,4.489260194474157e-06,0.012126884531590425,50,918000000,6.350244575083712e-07,3.612466794767582e-06 +0.009,6.1086658480480524e-06,0.009363507727532907,50,873500000,8.642136406651013e-07,3.2587045952170578e-06 +0.0095,7.438530933592207e-06,0.007227393451422449,50,931500000,1.0511378939840536e-06,2.7753918710550012e-06 +0.01,8.79373304173127e-06,0.005584056918547608,50,1019000000,1.2431476658628543e-06,2.3343816758439952e-06 +0.001,6.070592256706501e-10,0.6122929354556778,10,26888500000 From e652cc357404a8b482933163ea86a832120baf74 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 15 Feb 2026 14:24:38 +0000 Subject: [PATCH 154/156] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/ft_stateprep/canonical_steane/estimate_canonical.py | 2 +- scripts/ft_stateprep/canonical_steane/run_parallel.sh | 2 +- .../eval_circ_mod/estimate_logical_error_rate.py | 6 +++--- .../eval_circ_mod/estimate_logical_error_rate_fao.py | 2 +- scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh | 2 +- scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_d7.sh | 2 +- scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh | 2 +- scripts/ft_stateprep/eval_circ_mod/run_eval_on_fao.sh | 2 +- tests/circuit_synthesis/test_gaussian_elimination.py | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/scripts/ft_stateprep/canonical_steane/estimate_canonical.py b/scripts/ft_stateprep/canonical_steane/estimate_canonical.py index 5e0e435ec..6e8e6cd53 100644 --- a/scripts/ft_stateprep/canonical_steane/estimate_canonical.py +++ b/scripts/ft_stateprep/canonical_steane/estimate_canonical.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# Copyright (c) 2023 - 2026 Chair for Design Automation, TUM # All rights reserved. # # SPDX-License-Identifier: MIT diff --git a/scripts/ft_stateprep/canonical_steane/run_parallel.sh b/scripts/ft_stateprep/canonical_steane/run_parallel.sh index aae969a31..eb773d6a0 100755 --- a/scripts/ft_stateprep/canonical_steane/run_parallel.sh +++ b/scripts/ft_stateprep/canonical_steane/run_parallel.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# Copyright (c) 2023 - 2026 Chair for Design Automation, TUM # All rights reserved. # # SPDX-License-Identifier: MIT diff --git a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py index c1a96bb7f..17626eaea 100644 --- a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py +++ b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# Copyright (c) 2023 - 2026 Chair for Design Automation, TUM # All rights reserved. # # SPDX-License-Identifier: MIT @@ -85,8 +85,8 @@ def main() -> None: circuits = [] # load circuit from file - for _id in [0, 1, 2, 3]: - circ_file = circ_file_core + str(_id) + for id_ in [0, 1, 2, 3]: + circ_file = circ_file_core + str(id_) path = prefix / code_name / (circ_file + ".qasm") circuits.append(QuantumCircuit.from_qasm_file(path)) diff --git a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate_fao.py b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate_fao.py index 046355b8b..0e1bbbade 100644 --- a/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate_fao.py +++ b/scripts/ft_stateprep/eval_circ_mod/estimate_logical_error_rate_fao.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# Copyright (c) 2023 - 2026 Chair for Design Automation, TUM # All rights reserved. # # SPDX-License-Identifier: MIT diff --git a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh index a9068bb06..0ad9c87ca 100755 --- a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh +++ b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# Copyright (c) 2023 - 2026 Chair for Design Automation, TUM # All rights reserved. # # SPDX-License-Identifier: MIT diff --git a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_d7.sh b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_d7.sh index 9e5329e3e..381611f4d 100755 --- a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_d7.sh +++ b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_d7.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# Copyright (c) 2023 - 2026 Chair for Design Automation, TUM # All rights reserved. # # SPDX-License-Identifier: MIT diff --git a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh index bd534c372..9505b690a 100755 --- a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh +++ b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_code_mac.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# Copyright (c) 2023 - 2026 Chair for Design Automation, TUM # All rights reserved. # # SPDX-License-Identifier: MIT diff --git a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_fao.sh b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_fao.sh index 054185f61..c16ad2fcf 100755 --- a/scripts/ft_stateprep/eval_circ_mod/run_eval_on_fao.sh +++ b/scripts/ft_stateprep/eval_circ_mod/run_eval_on_fao.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# Copyright (c) 2023 - 2026 Chair for Design Automation, TUM # All rights reserved. # # SPDX-License-Identifier: MIT diff --git a/tests/circuit_synthesis/test_gaussian_elimination.py b/tests/circuit_synthesis/test_gaussian_elimination.py index f66225da4..0de4d9b4e 100644 --- a/tests/circuit_synthesis/test_gaussian_elimination.py +++ b/tests/circuit_synthesis/test_gaussian_elimination.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM +# Copyright (c) 2023 - 2026 Chair for Design Automation, TUM # All rights reserved. # # SPDX-License-Identifier: MIT From 789ff50cf157144b26020855ca312796e8fe6dc6 Mon Sep 17 00:00:00 2001 From: Erik Weilandt <48921674+inctechs@users.noreply.github.com> Date: Fri, 20 Feb 2026 14:45:52 +0100 Subject: [PATCH 155/156] add draft for SteaneFTSP docs --- docs/SteaneFTSP.md | 207 +++++++++++++++++++++++++++++++++++++++++++++ docs/index.md | 1 + 2 files changed, 208 insertions(+) create mode 100644 docs/SteaneFTSP.md diff --git a/docs/SteaneFTSP.md b/docs/SteaneFTSP.md new file mode 100644 index 000000000..f092b2285 --- /dev/null +++ b/docs/SteaneFTSP.md @@ -0,0 +1,207 @@ +--- +file_format: mystnb +kernelspec: + name: python3 +mystnb: + number_source_lines: true +--- + +```{code-cell} ipython3 +:tags: [remove-cell] +%config InlineBackend.figure_formats = ['svg'] +``` + +# Steane-type Fault-Tolerant State Preparation + +This module provides automated synthesis for **Steane-type Fault-Tolerant State Preparation (FTSP)** circuits. This approach is particularly well-suited for quantum computing architectures that support a high degree of gate-level parallelism, such as trapped-ion and neutral atom quantum computers. + +Unlike other methods that rely on measuring stabilizers directly on the data qubits (flag-based or standard syndrome extraction), Steane-type preparation works by initializing separate logical ancilla states and interacting them with the data state via transversal CNOT gates to detect errors. + +## The Challenge: Error Cancellation + +The core principle of Steane-type error detection is to copy errors from a data block to an ancilla block using transversal CNOTs and then measure the ancilla to detect the error. + +However, if we consider more than just one error to occur under circuit level noise models, so errors can also happen on the ancilla qubits, then this approach can lead to a critical issue: **Error Cancellation**. +For example, if the data state and the ancilla state are prepared using the _exact same_ circuit structure, they suffer from identical propagated errors at identical locations error locations. + +When two identical errors meet at a transversal CNOT gate, they can cancel each other out on the target (ancilla) while remaining on the control (data). For example, if an X-error occurs on the $i$-th qubit of both the data and ancilla, the transversal CNOT interaction may result in no detectable syndrome on the ancilla. Consequently, the error on the data block goes undetected, breaking fault tolerance. + +### Solution: Structurally Distinct Circuits + +To ensure fault tolerance, we must break this symmetry. We need to prepare logical states using circuits that are **logically equivalent** (they prepare the same quantum state) but **structurally distinct** regarding error propagation. +In other words, we want to synthesize circuits in which errors propagate differently, so that no matter where an error occurs, we still get a detectable syndrome on the ancilla. + +#### Example: The Steane Code ($d=3$) + +To see all of the above in action, let's consider the Steane code, which is a $[[7,1,3]]$ CSS code. +Since the code distance is $d=3$, it can correct up to $t=1$ error. Therefore, we only focus on single errors in the circuit and how they propagate. +We can find a state preparation circuit for the logical $|0\rangle_L$ state using the QECC synthesis tools. This will be our reference circuit, and we can analyze its fault set to understand how errors propagate through it. + +```{code-cell} ipython3 +from mqt.qecc import CSSCode + +steane_code = CSSCode.from_code_name("Steane") +print(steane_code.stabs_as_pauli_strings()) +``` + +```{code-cell} ipython3 +from mqt.qecc.circuit_synthesis.state_prep import heuristic_prep_circuit + +steane_circ = heuristic_prep_circuit(steane_code) +steane_circ.circ.draw('mpl') +``` + +Errors propagate this circuit in a specific way, which we can analyze by extracting the fault set. +The fault set lists propagated errors which are the result of a errors within the circuit. +For example, a single X-error on $q_1$ just before the last CNOT gate will propagate to a weight two error on qubits $q_1$ and $q_5$. +Looking at the fault set of the circuit above, we can see this error listed here. + +```{code-cell} ipython3 +steane_circ.compute_fault_sets() +steane_circ.x_fault_sets[0].faults +``` + +Note that the fault set is reduced and ignores stabilizer-equivalent errors. Meaning that the propagated error on $q_0$ and $q_4$ is not listed, since it is equivalent to the error on $q_1$ and $q_5$ up to multiplication by the first stabilizer generator $XXIIXXI$. + +The bottom line is that the fault set above characterizes the error propagation of the given circuit. So if we were to synthesize a second circuit for the same logical state, that has a different fault set, we can be sure that no errors $E$ of weight up to $\text{wt}(E)=1$ can cancel each other out. + +For this, QECC provides a function called `heuristic_reference_prep_circuit` which takes a reference circuit and its fault set as input and tries to find a new circuit that avoids the same faults. + +```{code-cell} ipython3 +from mqt.qecc.circuit_synthesis.state_prep import heuristic_reference_prep_circuit + +steane_circ_alt = heuristic_reference_prep_circuit(steane_code, ref_x_fs=steane_circ.x_fault_sets[0].faults) +steane_circ_alt.circ.draw('mpl') + +``` + +```{code-cell} ipython3 +steane_circ_alt.compute_fault_sets() +steane_circ_alt.x_fault_sets[0].faults +``` + +The two fault sets are distinct also under multiplication by stabilizers. One can verify this by multiplying each of the propagated errors with the $X$ stabilizer generators of the Steane Code and ensuring that errors are not equivalent. + +## The 4-Circuit Protocol (Distance $\ge 5$) + +For higher-distance codes ($d \geq 5$), simply avoiding identical errors is not enough. We must ensure that the verification process itself does not introduce high-weight errors that go undetected. + +This module implements a constant-overhead protocol that uses **four specific circuits** to guarantee strict fault tolerance. This protocol is general and works even for codes without symmetries, such as the $[[17,1,5]]$ color code. + +### The Protocol Structure + +The protocol requires synthesizing four unique circuits ($C_1, C_2, C_3, C_4$) that interact in a specific sequence: + +1. **$C_1$ (Data Candidate):** The initial state we wish to prepare. +2. **$C_2$ (X-Verifier):** An ancilla used to detect X-errors on $C_1$. + - _Constraint:_ Must have a distinct X-fault set from $C_1$. +3. **$C_3$ (Z-Verifier):** An ancilla used to detect Z-errors on $C_1$. + - _Constraint:_ Must have a distinct Z-fault set from _both_ $C_1$ and $C_2$ (since Z-errors can propagate backward from ancilla to data). +4. **$C_4$ (Verifier of the Verifier):** An ancilla used to detect X-errors on $C_3$. + - _Constraint:_ Ensures that the Z-verification step ($C_3$) did not introduce undetectable X-errors. It must be distinct from the relevant faults of the previous chains. + +### Utility: Automated 4-Circuit Synthesis Wrapper + +While you can call the synthesis API manually for each step, you can use the following custom helper function in your workflow to automatically generate the full suite of 4 mutually distinct circuits based on the protocol rules. + +However, note that for codes with higher distance, the search space for circuits grows significantly, and hence the synthesis process might get stuck sometimes. +Therefore, this utility function is not guaranteed to always find a solution and might be more of a starting point for your own custom synthesis workflow. + +```{code-cell} ipython3 +import numpy as np +from mqt.qecc.circuit_synthesis import heuristic_prep_circuit +from mqt.qecc.circuit_synthesis.synthesis_utils import check_mutually_disjointness_spcs, get_fs_based_on_d + +def synthesize_four_ft_circuits(c1_circuit): + """ + Synthesizes the four distinct state preparation circuits required + for Steane-type Fault-Tolerant State Preparation. + + Args: + c1_circuit: The reference state preparation circuit (C1). + + Returns: + List of 4 circuits [C1, C2, C3, C4] satisfying t-distinctness constraints. + """ + # --------------------------------------------------------- + # Step 1: Analyze Reference Circuit (C1) + # --------------------------------------------------------- + c1_x_faults, c1_z_faults = get_fs_based_on_d(c1_circuit) + + # --------------------------------------------------------- + # Step 2: Synthesize X-Verifier (C2) + # Constraint: X-faults must be distinct from C1. + # --------------------------------------------------------- + c2_circuit = heuristic_reference_prep_circuit(c1_circuit.code, ref_x_fs=c1_x_faults) + #BUG: Distance is not properly initialized + c2_circuit.code.distance = c1_circuit.code.distance + c2_x_faults, c2_z_faults = get_fs_based_on_d(c2_circuit) + + # --------------------------------------------------------- + # Step 3: Synthesize Z-Verifier (C3) + # Constraint: Z-faults must be distinct from BOTH C1 and C2. + # --------------------------------------------------------- + # Combine Z-faults from C1 and C2 to avoid them simultaneously + if c1_z_faults.size and c2_z_faults.size: + combined_z_faults = np.unique(np.vstack((c1_z_faults, c2_z_faults), dtype=np.int8), axis=0) + elif c1_z_faults.size: + combined_z_faults = c1_z_faults + elif c2_z_faults.size: + combined_z_faults = c2_z_faults + else: + # If no Z-faults exist that require distinctness, fallback to reusing circuits + return [c1_circuit, c2_circuit, c1_circuit, c2_circuit] + + c3_circuit = heuristic_reference_prep_circuit(c1_circuit.code, ref_z_fs=combined_z_faults, guide_by_x=False) + #BUG: Distance is not properly initialized + c3_circuit.code.distance = c1_circuit.code.distance + c3_x_faults, c3_z_faults = get_fs_based_on_d(c3_circuit) + + # --------------------------------------------------------- + # Step 4: Synthesize Final Verifier (C4) + # Constraint: X-faults distinct from C3, Z-faults distinct from C1 & C2. + # --------------------------------------------------------- + c4_circuit = heuristic_reference_prep_circuit( + c1_circuit.code, + ref_x_fs=c3_x_faults, + ref_z_fs=combined_z_faults, + guide_by_x=False + ) + + return [c1_circuit, c2_circuit, c3_circuit, c4_circuit] +``` + +### Automated Synthesis with the $[[17,1,5]]$ Color Code + +The $[[17,1,5]]$ color code is a perfect candidate for this approach because it lacks the symmetries required by older manual construction methods. The QECC toolkit uses a "Fault-Set Guided Synthesis" algorithm to find these circuits automatically by backtracking whenever a constraint is violated. + +```{code-cell} ipython3 +from mqt.qecc.codes import SquareOctagonColorCode + +soc = SquareOctagonColorCode(5) +c1 = heuristic_prep_circuit(soc) +#BUG: Distance is not properly initialized +c1.code.distance = soc.distance +c1.code.x_distance = soc.distance +c1.code.z_distance = soc.distance +c1c2c3c4 = synthesize_four_ft_circuits(c1) + +``` + +## Simulation and Verification + +Once the four circuits are generated, they form a complete fault-tolerant gadget. The expected behavior is that the logical error rate should scale with $O(p^{\lceil d/2 \rceil})$, and the circuit should satisfy strict fault tolerance (no error of weight $t \le (d-1)/2$ leads to a logical failure). + +```{code-cell} ipython3 +from mqt.qecc.circuit_synthesis.simulation import SteaneNDFTStatePrepSimulator +simulation = SteaneNDFTStatePrepSimulator( + circ1=c1c2c3c4[0].circ.to_qiskit_circuit(), + circ2=c1c2c3c4[1].circ.to_qiskit_circuit(), + circ3=c1c2c3c4[2].circ.to_qiskit_circuit(), + circ4=c1c2c3c4[3].circ.to_qiskit_circuit(), + code=soc +) +ps = [0.007,0.006,0.005, 0.004, 0.003, 0.002, 0.001] +# simulation.plot_state_prep(ps, min_errors=10, p_idle_factor=0.01) + +``` diff --git a/docs/index.md b/docs/index.md index 7dbe169bb..44de8aaa0 100644 --- a/docs/index.md +++ b/docs/index.md @@ -28,6 +28,7 @@ self installation LightsOutDecoder StatePrep +SteaneFTSP CatStates CodeSwitching Encoders From 674ff962a76e31b0bff58b40a26b81e56cff9a17 Mon Sep 17 00:00:00 2001 From: Erik Weilandt <48921674+inctechs@users.noreply.github.com> Date: Thu, 12 Mar 2026 09:27:41 +0100 Subject: [PATCH 156/156] WIP: save work, add current tests --- .../test_gaussian_elimination.py | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/tests/circuit_synthesis/test_gaussian_elimination.py b/tests/circuit_synthesis/test_gaussian_elimination.py index 0de4d9b4e..271a0c6e2 100644 --- a/tests/circuit_synthesis/test_gaussian_elimination.py +++ b/tests/circuit_synthesis/test_gaussian_elimination.py @@ -280,3 +280,48 @@ def test_compute_cost_matrix_off_diagonal_logic(get_instance): cost_matrix = get_instance._compute_cost_matrix() assert cost_matrix[0, 1] == expected_cost_0_1 + + +def test_fault_set_guided_synthesis_validation_error(get_instance): + """Verify that providing a code without reference fault sets raises an error.""" + with pytest.raises(ValueError, match=r"Must provide either both a reference fault set and CSS code, or neither."): + # get_instance already has a CSSCode, but we provide no reference fault sets + get_instance.fault_set_guided_synthesis() + + +def test_fault_set_guided_synthesis_happy_path(get_instance): + """Verify that the synthesis successfully reduces the matrix with valid inputs.""" + # Create dummy reference fault sets for the 7-qubit Steane code + ref_x_fs = np.zeros((1, 7), dtype=np.int8) + ref_z_fs = np.zeros((1, 7), dtype=np.int8) + + get_instance.fault_set_guided_synthesis(ref_x_fs=ref_x_fs, ref_z_fs=ref_z_fs) + + assert get_instance.is_reduced() is True + assert len(get_instance.eliminations) > 0 + assert len(get_instance.used_cnots) > 0 + + +def test_fault_set_guided_synthesis_with_penalties(get_instance): + """Verify that the synthesis avoids CNOTs specified in penalty_cnots.""" + ref_x_fs = np.zeros((1, 7), dtype=np.int8) + ref_z_fs = np.zeros((1, 7), dtype=np.int8) + + # The greedy approach normally picks (0, 4) first for the Steane code. + # We penalize it to ensure the algorithm finds an alternative path. + penalties = [(0, 4)] + + get_instance.fault_set_guided_synthesis(ref_x_fs=ref_x_fs, ref_z_fs=ref_z_fs, penalty_cnots=penalties) + + assert get_instance.is_reduced() is True + assert (0, 4) not in get_instance.eliminations + + +def test_fault_set_guided_synthesis_guide_by_z(get_instance): + """Verify that the synthesis completes when guided by Z errors instead of X.""" + ref_x_fs = np.zeros((1, 7), dtype=np.int8) + ref_z_fs = np.zeros((1, 7), dtype=np.int8) + + get_instance.fault_set_guided_synthesis(ref_x_fs=ref_x_fs, ref_z_fs=ref_z_fs, guide_by_x=False) + + assert get_instance.is_reduced() is True