diff --git a/fastlane_bot/bot.py b/fastlane_bot/bot.py index d8a1e478a..6595daaff 100644 --- a/fastlane_bot/bot.py +++ b/fastlane_bot/bot.py @@ -55,7 +55,7 @@ from typing import Generator, List, Dict, Tuple, Any, Callable from typing import Optional -from arb_optimizer import ConstantProductCurve as CPC +from arb_optimizer import CurveContainer, ConstantProductCurve as CPC from fastlane_bot.config import Config from fastlane_bot.helpers import ( diff --git a/fastlane_bot/modes/pairwise_multi_all.py b/fastlane_bot/modes/pairwise_multi_all.py index f32a5b2a5..36e944df5 100644 --- a/fastlane_bot/modes/pairwise_multi_all.py +++ b/fastlane_bot/modes/pairwise_multi_all.py @@ -13,7 +13,7 @@ import pandas as pd -from arb_optimizer import PairOptimizer +from arb_optimizer import CurveContainer, PairOptimizer from fastlane_bot.modes.base_pairwise import ArbitrageFinderPairwiseBase diff --git a/fastlane_bot/tools/curves/__init__.py b/fastlane_bot/tools/curves/__init__.py deleted file mode 100644 index b8e3726e4..000000000 --- a/fastlane_bot/tools/curves/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -""" -bonding curve management and analysis - ---- -(c) Copyright Bprotocol foundation 2023-24. -Licensed under MIT -""" -from .simplepair import SimplePair -Pair = SimplePair -# TODO-RELEASE-202405: clean up Pair/SimplePair before final release - -from .curvebase import CurveBase -from .curvebase import AttrDict -from .cpc import ConstantProductCurve -from .cpc import T -from .curvecontainer import CurveContainer -from .cpcinverter import CPCInverter - diff --git a/fastlane_bot/tools/curves/cpc.py b/fastlane_bot/tools/curves/cpc.py deleted file mode 100644 index c4545f4f9..000000000 --- a/fastlane_bot/tools/curves/cpc.py +++ /dev/null @@ -1,1525 +0,0 @@ -""" -representing a levered constant product curve - ---- -(c) Copyright Bprotocol foundation 2023. -Licensed under MIT -""" -__VERSION__ = "4.0-beta1" -__DATE__ = "04/May/2024" - -from math import sqrt -import numpy as np -import json -from matplotlib import pyplot as plt -from hashlib import md5 as digest -from dataclasses import field, asdict - -from .simplepair import SimplePair as Pair -from .curvebase import CurveBase, AttrDict, DAttrDict, dataclass_ -from . import tokenscale as ts - -AD = DAttrDict - -TOKENIDS = AttrDict( - NATIVE_ETH="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", - WETH="0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - ETH="0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - WBTC="0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", - BTC="0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", - USDC="0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - USDT="0xdAC17F958D2ee523a2206206994597C13D831ec7", - DAI="0x6B175474E89094C44Da98b954EedeAC495271d0F", - LINK="0x514910771AF9Ca656af840dff83E8264EcF986CA", - BNT="0x1F573D6Fb3F13d689FF844B4cE37794d79a7FF1C", - HEX="0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39", - UNI="0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", - FRAX="0x3432B6A60D23Ca0dFCa7761B7ab56459D9C964D0", - ICHI="0x903bEF1736CDdf2A537176cf3C64579C3867A881", - - -) -T = TOKENIDS - - -@dataclass_ -class ConstantProductCurve(CurveBase): - """ - represents a, potentially levered, constant product curve - - :k: pool invariant k (see NOTE2 below) - :x: (virtual) pool state x (virtual number of base tokens for sale) - :x_act: actual pool state x (actual number of base tokens for sale) - :y_act: actual pool state y (actual number of quote tokens for sale) - :alpha: weight factor alpha of token x (default = 0.5; see NOTE3 below) - :eta: portfolio weight factor eta (default = 1; see NOTE3 below) - :pair: token pair in slash notation ("TKNB/TKNQ"); TKNB is on the x-axis, TKNQ on the y-axis - :cid: unique id (optional) - :fee: fee (optional); eg 0.01 for 1% - :descr: description (optional; eg. "UniV3 0.1%") - :constr: which (alternative) constructor was used (optional; user should not set) - :params: additional parameters (optional) - - NOTE1: always use the alternative constructors ``from_xx`` rather then the - canonical one; if you insist on using the canonical one then keep in mind - that the order of the parameters may change in future versions, so you - MUST use keyword arguments - - NOTE2: This class implements two distinct types of constant product curves: - (1) the standard constant product curve xy=k - (2) the weighted constant product curve x^al y^1-al = k^al - Note that the case alpha=0.5 is equivalent to the standard constant product curve - xy=k, including the value of k - - NOTE3: There are two different ways of specifying the weights of the tokens - (1) alpha: the weight of the x token (equal weight = 0.5), such that x^al y^1-al = k^al - (2) eta = alpha / (1-alpha): the relative weight (equal weight = 1; x overweight > 1) - """ - - __VERSION__ = __VERSION__ - __DATE__ = __DATE__ - - k: float - x: float - x_act: float = None - y_act: float = None - alpha: float = None - pair: str = None - cid: str = None - fee: float = None - descr: str = None - constr: str = field(default=None, repr=True, compare=False, hash=False) - params: AttrDict = field(default=None, repr=True, compare=False, hash=False) - - def __post_init__(self): - - if self.alpha is None: - super().__setattr__("_is_symmetric", True) - super().__setattr__("alpha", 0.5) - else: - super().__setattr__("_is_symmetric", self.alpha == 0.5) - #print(f"[ConstantProductCurve] _is_symmetric = {self._is_symmetric}") - assert self.alpha > 0, f"alpha must be > 0 [{self.alpha}]" - assert self.alpha < 1, f"alpha must be < 1 [{self.alpha}]" - - - if self.constr is None: - super().__setattr__("constr", "default") - - super().__setattr__("cid", str(self.cid)) - - if self.params is None: - super().__setattr__("params", AttrDict()) - elif isinstance(self.params, str): - data = json.loads(self.params.replace("'", '"')) - super().__setattr__("params", AttrDict(data)) - elif isinstance(self.params, dict): - super().__setattr__("params", AttrDict(self.params)) - - if self.x_act is None: - super().__setattr__("x_act", self.x) # required because class frozen - - if self.y_act is None: - super().__setattr__("y_act", self.y) # ditto - - if self.pair is None: - super().__setattr__("pair", "TKNB/TKNQ") - - super().__setattr__("pairo", Pair(self.pair)) - - if self.isbigger(big=self.x_act, small=self.x): - print(f"[ConstantProductCurve] x_act > x in {self.cid}", self.x_act, self.x) - - if self.isbigger(big=self.y_act, small=self.y): - print(f"[ConstantProductCurve] y_act > y in {self.cid}", self.y_act, self.y) - - - - self.set_tokenscale(self.TOKENSCALE) - - def P(self, pstr, defaultval=None): - """ - convenience function to access parameters - - :pstr: parameter name as colon separated string (eg "exchange") (1) - :defaultval: default value if parameter not found - :returns: parameter value or defaultval* - - NOTE1: ``CC.pstr("exchange")`` is equivalent to ``CC.params["exchange"]`` if defined - ``CC.pstr("a:b")`` is equivalent to ``CC.params["a"]["b"]`` if defined - """ - fieldl = pstr.strip().split(":") - val = self.params - for field in fieldl: - try: - val = val[field] - except KeyError: - return defaultval - return val - - @property - def cid0(self): - "short cid [last 8 characters]" - return self.cid[-8:] - - @property - def eta(self): - "portfolio weight factor eta = alpha / (1-alpha)" - return self.alpha / (1 - self.alpha) - - def is_constant_product(self): - "True iff alpha == 0.5 (deprecated; use `is_symmetric`)" - return self.is_symmetric() - - def is_symmetric(self): - "True iff alpha == 0.5" - return self._is_symmetric - - def is_asymmetric(self): - "True iff alpha != 0.5" - return not self.is_symmetric() - - def is_levered(self): - "True iff x!=x_act or y!=y_act" - return not self.is_unlevered() - - def is_unlevered(self): - "True iff x==x_act and y==y_act" - return self.x == self.x_act and self.y == self.y_act - - TOKENSCALE = ts.TokenScale1Data - # default token scale object is the trivial scale (everything one) - # change this to a different scale object be creating a derived class - - def set_tokenscale(self, tokenscale): - """sets the tokenscale object (returns self)""" - # print("setting tokenscale", self.cid, tokenscale) - super().__setattr__("tokenscale", tokenscale) - return self - - @property - def scalex(self): - """returns the scale of the x-axis token""" - return self.tokenscale.scale(self.tknx) - - @property - def scaley(self): - """returns the scale of the y-axis token""" - return self.tokenscale.scale(self.tkny) - - def scale(self, tkn): - """returns the scale of tkn""" - return self.tokenscale.scale(tkn) - - def asdict(self): - "returns a dict representation of the curve" - return asdict(self) - - @classmethod - def fromdict(cls, d): - "returns a curve from a dict representation" - return cls(**d) - - from_dict = fromdict # DEPRECATED (use fromdict) - - def setcid(self, cid): - """sets the curve id [can only be done once]""" - assert self.cid is None, "cid can only be set once" - super().__setattr__("cid", cid) - return self - - class CPCValidationError(ValueError): pass - - @classmethod - def from_kx( - cls, - k, - x, - *, - x_act=None, - y_act=None, - pair=None, - cid=None, - fee=None, - descr=None, - params=None, - ): - "constructor: from k,x (and x_act, y_act)" - return cls( - k=k, - x=x, - x_act=x_act, - y_act=y_act, - pair=pair, - cid=cid, - fee=fee, - descr=descr, - constr="kx", - params=params, - ) - - @classmethod - def from_ky( - cls, - k, - y, - *, - x_act=None, - y_act=None, - pair=None, - cid=None, - fee=None, - descr=None, - params=None, - ): - "constructor: from k,y (and x_act, y_act)" - return cls( - k=k, - x=k / y, - x_act=x_act, - y_act=y_act, - pair=pair, - cid=cid, - fee=fee, - descr=descr, - constr="ky", - params=params, - ) - - @classmethod - def from_xy( - cls, - x, - y, - *, - x_act=None, - y_act=None, - pair=None, - cid=None, - fee=None, - descr=None, - params=None, - ): - "constructor: from x,y (and x_act, y_act)" - return cls( - k=x * y, - x=x, - x_act=x_act, - y_act=y_act, - pair=pair, - cid=cid, - fee=fee, - descr=descr, - constr="xy", - params=params, - ) - - @classmethod - def from_xyal( - cls, - x, - y, - *, - alpha=None, - eta=None, - x_act=None, - y_act=None, - pair=None, - cid=None, - fee=None, - descr=None, - params=None, - ): - "constructor: from x,y,alpha/eta (and x_act, y_act)" - if not alpha is None and not eta is None: - raise ValueError(f"at most one of alpha and eta must be given [{alpha}, {eta}]") - if not eta is None: - alpha = eta / (eta + 1) - if alpha is None: - alpha = 0.5 - assert alpha > 0, f"alpha must be > 0 [{alpha}]" - eta_inv = (1-alpha) / alpha - k = x * (y**eta_inv) - #print(f"[from_xyal] eta_inv = {eta_inv}") - #print(f"[from_xyal] x={x}, y={y}, k = {k}") - if not alpha == 0.5: - assert x_act is None, f"currently not allowing levered curves for alpha != 0.5 [alpha={alpha}, x_act={x_act}]" - assert y_act is None, f"currently not allowing levered curves for alpha != 0.5 [alpha={alpha}, x_act={y_act}]" - return cls( - #k=(x**alpha * y**(1-alpha))**(1/alpha), - k=k, - x=x, - alpha=alpha, - x_act=x_act, - y_act=y_act, - pair=pair, - cid=cid, - fee=fee, - descr=descr, - constr="xyal", - params=params, - ) - - - @classmethod - def from_pk( - cls, - p, - k, - *, - x_act=None, - y_act=None, - pair=None, - cid=None, - fee=None, - descr=None, - params=None, - ): - "constructor: from k,p (and x_act, y_act)" - return cls( - k=k, - x=sqrt(k / p), - x_act=x_act, - y_act=y_act, - pair=pair, - cid=cid, - fee=fee, - descr=descr, - constr="pk", - params=params, - ) - - @classmethod - def from_px( - cls, - p, - x, - x_act=None, - y_act=None, - pair=None, - cid=None, - fee=None, - descr=None, - params=None, - ): - "constructor: from x,p (and x_act, y_act)" - return cls( - k=x * x * p, - x=x, - x_act=x_act, - y_act=y_act, - pair=pair, - cid=cid, - fee=fee, - descr=descr, - constr="px", - params=params, - ) - - @classmethod - def from_py( - cls, - p, - y, - x_act=None, - y_act=None, - pair=None, - cid=None, - fee=None, - descr=None, - params=None, - ): - "constructor: from y,p (and x_act, y_act)" - return cls( - k=y * y / p, - x=y / p, - x_act=x_act, - y_act=y_act, - pair=pair, - cid=cid, - fee=fee, - descr=descr, - constr="py", - params=params, - ) - - @classmethod - def from_pkpp( - cls, - p, - k, - p_min=None, - p_max=None, - *, - pair=None, - cid=None, - fee=None, - descr=None, - constr=None, - params=None, - ): - "constructor: from k, p, p_min, p_max (default for last two is p)" - if p_min is None: - p_min = p - if p_max is None: - p_max = p - x0 = sqrt(k / p) - y0 = sqrt(k * p) - xa = x0 - sqrt(k / p_max) - ya = y0 - sqrt(k * p_min) - constr = constr or "pkpp" - return cls( - k=k, - x=x0, - x_act=xa, - y_act=ya, - pair=pair, - cid=cid, - fee=fee, - descr=descr, - constr="pkpp", - params=params, - ) - - @classmethod - def from_univ2( - cls, - *, - liq_tknb=None, - liq_tknq=None, - k=None, - pair=None, - fee=None, - cid=None, - descr=None, - params=None, - ): - """ - constructor: from Uniswap V2 pool (see class docstring for other parameters) - - :liq_tknb: current pool liquidity in tknb (base token of the pair; "x") (1) - :liq_tknq: current pool liquidity in tknq (quote token of the pair; "y") (1) - :k: uniswap liquidity parameter k = xy (1) - - NOTE 1: exactly one of k, liq_tknb, liq_tknq must be None; all other parameters - must not be None; a reminder that x is TKNB and y is TKNQ and pair is "TKNB/TKNQ" - """ - assert not pair is None, "pair must not be None" - assert not cid is None, "cid must not be None" - assert not descr is None, "descr must not be None" - assert not fee is None, "fee must not be None" - - x = liq_tknb - y = liq_tknq - if k is None: - assert x is not None and y is not None, "k is not provided, so both liquidities must be" - k = x * y - elif x is None: - assert y is not None, "k is provided, so must provide exactly one liquidity" - x = k / y - elif y is None: - y = k / x - else: - assert False, "exactly one of k and the liquidities must be None" - - return cls( - k=k, - x=x, - x_act=x, - y_act=y, - pair=pair, - cid=cid, - fee=fee, - descr=descr, - constr="uv2", - params=params, - ) - - @classmethod - def from_univ3(cls, Pmarg, uniL, uniPa, uniPb, pair, cid, fee, descr, params=None): - """ - constructor: from Uniswap V3 pool (see class docstring for other parameters) - - :Pmarg: current pool marginal price - :uniL: uniswap liquidity parameter (uniL**2 == L**2 == k) - :uniPa: uniswap price range lower bound Pa (Pa < P < Pb) - :uniPb: uniswap price range upper bound Pb (Pa < P < Pb) - """ - - P = Pmarg - assert uniPa < uniPb, f"uniPa < uniPb required ({uniPa}, {uniPb})" - assert ( - uniPa <= P <= uniPb - ), f"uniPa < Pmarg < uniPb required ({uniPa}, {P}, {uniPb})" - if params is None: - params = AttrDict(L=uniL) - else: - params = AttrDict({**params, "L": uniL}) - k = uniL * uniL - return cls.from_pkpp( - p=P, - k=k, - p_min=uniPa, - p_max=uniPb, - pair=pair, - cid=cid, - fee=fee, - descr=descr, - constr="uv3", - params=params, - ) - - SOLIDLY_PRICE_SPREAD = 0.06 # 0.06 gives pretty good results for m=2.6 - @classmethod - def from_solidly( - cls, - *, - k=None, - x=None, - y=None, - price_spread=None, - pair=None, - fee=None, - cid=None, - descr=None, - params=None, - as_list=True, - ): - """ - constructor: from a Solidly curve (see class docstring for other parameters)* - - :k: Solidly pool constant, x^3 y + x y^3 = k* - :x: current pool liquidity in token x* - :y: current pool liquidity in token y* - :price_spread: price spread to use for converting constant price -> constant product - :as_list: if True (default) returns a list of curves, otherwise a single curve - (see note below and note that as_list=False is deprecated) - - exactly 2 out of those three must be given; the third one is calculated - - The Solidly curve is NOT a constant product curve, as it follows the equation - - x^3 y + x y^3 = k - - where k is the pool invariant. This curve is a stable swap curve in the it is - very flat in the middle, at a unity price (see the `invariants` module and the - associated tests and notebooks). In fact, in the range - - 1/2.6 < y/x < 2.6 - - we find that the prices is essentially unity, and we therefore approximate it - was an (almost) constant price curve, ie a constant product curve with a very - large invariant k, and we will set the x_act and y_act parameters so that the - curve only covers the above range. - - IMPORTANT: IF as_list is True (default) THEN THE RESULT IS RETURNED AS A LIST - CURRENTLY CONTAINING A SINGLE CURVE, NOT THE CURVE ITSELF. This is because we - may in the future a list of curves, with additional curves matching the function - in the wings. IT IS RECOMMENDED THAT ANY CODE IMPLEMENTING THIS FUNCTION USES - as_list = True, AS IN THE FUTURE as_list = FALSE will raise an exception. - """ - # rename the solidly parameters to avoid name confusion - solidly_x = x - solidly_y = y - solidly_k = k - del x, y, k - price_spread = price_spread or cls.SOLIDLY_PRICE_SPREAD - #print([_ for _ in [solidly_x, solidly_y, solidly_k] if not _ is None]) - assert len([_ for _ in [solidly_x, solidly_y, solidly_k] if not _ is None]) == 2, f"exactly 2 out of k,x,y must be given (x={solidly_x}, y={solidly_y}, k={solidly_x})" - if solidly_k is None: - solidly_k = solidly_x**3 * solidly_y + solidly_x * solidly_y**3 - # NOTE: this is currently the only implemented version, and it should be - # enough for our purposes; the other two can be implemented using the - # y(x) function from the invariants module (note that y(x) and x(y) are - # the same as the function is symmetric). We do not want to implement it - # at the moment as we do not think we need it, and we want to avoid this - # external dependency for the time being. - elif solidly_x is None: - raise NotImplementedError("providing k, y not implemented yet") - elif solidly_y is None: - raise NotImplementedError("providing k, x not implemented yet") - else: - raise ValueError(f"should never get here") - # kbar = (k/2)**(1/4) is the equivalent of kbar = sqrt(k) for constant product - # center of the curve is (xy_c, xy_c) = (kbar, kbar) - # we are looking for the intersects of y=mx for m=2.6 and m=1/2.6 (linear segment) - # we know that within that range, x-y = const, so we can analytically solve for x and y - # specifically, we have y = 2 xy_c - x = mx - # therefore x = 2 xy_c / (m+1) - solidly_kbar = (solidly_k/2)**(1/4) - solidly_xyc = solidly_kbar - solidly_xmin = 2 * solidly_xyc / (2.6 + 1) - solidly_xmax = 2 * solidly_xyc / (1/2.6 + 1) - solidly_xrange = solidly_xmax - solidly_xmin - # print(f"[from_solidly] k = {solidly_k}, kbar = {solidly_kbar}, xy_c = {xy_c}") - # print(f"[from_solidly] x_min = {solidly_xmin}, x_max = {solidly_xmax}, x_range = {x_range}") - - # the curve has a unity price, which we spread to 1+price_spread at x_min, - # and 1-price_spread at x_max; we set x_range = x_max - x_min and we get - # the following equations - # k/x0**2 = (1+price_spread) - # k/(x0+xrange)**2 = 1/(1+price_spread) - # solving this fo k, x0 we get - # k = (1+price_spread)*xrange**2 / price_spread**2 - # x0 = xrange / price_spread - cpc_k = (1+price_spread)*solidly_xrange**2 / price_spread**2 - cpc_x0 = solidly_xrange / price_spread - - # finally we need to see where in the range we are; we look at - # del_x = x - x_min - # and we must have - # del_x > 0 - # del_x < x_range - # for the approximation to be valid; we recall that x_min ~ cpc_x0, therefore - # x = cpc_x0 + del_x - # Also, x_act is the x that is left to the right of the range, therefore - # x_act = x_range - del_x - # Finally, y_act is the amount of y that trades use from our current position - # back to x=x_min; we slightly approximate this by ignoring the price spread - # (which in any case is not real!) and assuming unity price, so del_y ~ del_y - # y_act = del_y = del_x - solidly_delx = solidly_x - solidly_xmin - if solidly_delx < 0 or solidly_delx > solidly_xrange: - if as_list: - #print(f"[cpc::from_solidly] x={solidly_x} is outside the range [{solidly_xmin}, {solidly_xmax}] and as_list=True") - return [] - else: - raise ValueError(f"x={solidly_x} is outside the range [{solidly_xmin}, {solidly_xmax}] and as_list=False") - - # now deal with the params, ie add the s_xxx parameters for solidly - params0 = dict(s_x = solidly_x, s_y = solidly_y, s_k = solidly_k, s_kbar = solidly_kbar, s_cpck=cpc_k, s_cpcx0 = cpc_x0, - s_xmin = solidly_xmin, s_xmax = solidly_xmax, s_price_spread = price_spread) - if params is None: - params = AttrDict(params0) - else: - params = AttrDict({**params, **params0}) - - result = cls( - k=cpc_k, - x=cpc_x0+solidly_delx, # del_x = x - xmin - # x_act=solidly_xrange-solidly_delx, - # y_act=solidly_delx, - x_act=solidly_delx, - y_act=solidly_xrange-solidly_delx, - pair=pair, - cid=cid, - fee=fee, - descr=descr, - constr="solidly", - params=params, - ) - if as_list: - return [result] - else: - print("[cpc::from_solidly] returning curve directly is deprecated; prepare to accept a list of curves in the future") - return result - - # minimun range width (pa/pb-1) for carbon curves and sqrt thereof - CARBON_MIN_RANGEWIDTH = 1e-6 - - @classmethod - def from_carbon( - cls, - *, - yint=None, - y=None, - pa=None, - pb=None, - A=None, - B=None, - pair=None, - tkny=None, - fee=None, - cid=None, - descr=None, - params=None, - isdydx=True, - minrw=None, - ): - """ - constructor: from a single Carbon order (see class docstring for other parameters) (1) - - :yint: current pool y-intercept (also known as z) - :y: current pool liquidity in token y - :pa: carbon price range left bound (higher price in dy/dx) - :pb: carbon price range right bound (lower price in dy/dx) - :A: alternative to pa, pb: A = sqrt(pa) - sqrt(pb) in dy/dy - :B: alternative to pa, pb: B = sqrt(pb) in dy/dy - :tkny: token y - :isdydx: if True prices in dy/dx, if False in quote direction of the pair - :minrw: minimum perc width (pa/pb-1) of range (default CARBON_MIN_RANGEWIDTH) - - NOTE 1: that ALL parameters are mandatory, except that EITHER pa, bp OR A, B - must be given but not both; we do not correct for incorrect assignment of - pa and pb, so if pa <= pb IN THE DY/DX DIRECTION, MEANING THAT THE NUMBERS - ENTERED MAY SHOW THE OPPOSITE RELATIONSHIP, then an exception will be raised - """ - assert not yint is None, "yint must not be None" - assert not y is None, "y must not be None" - assert not pair is None, "pair must not be None" - assert not tkny is None, "tkny must not be None" - - if minrw is None: - minrw = cls.CARBON_MIN_RANGEWIDTH - - assert y <= yint, "y must be <= yint" - assert y >= 0, "y must be >= 0" - - if A is None or B is None: - # A,B is None, so we look at prices and isdydx - # print("[from_carbon] A, B:", A, B, pa, pb) - assert A is None and B is None, "A or B is None, so both must be None" - assert pa is not None and pb is not None, "A,B is None, so pa,pb must not" - - if pa is None or pb is None: - # pa,pb is None, so we look at A,B and isdydx must be True - # print("[from_carbon] pa, pb:", A, B, pa, pb) - assert pa is None and pb is None, "pa or pb is None, so both must be None" - assert A is not None and B is not None, "pa,pb is None, so A,B must not" - assert isdydx is True, "we look at A,B so isdydx must be True" - assert ( - A >= 0 - ), "A must be non-negative" # we only check for this one as it is a difference - - assert not ( - A is not None and B is not None and pa is not None and pb is not None - ), "either A,B or pa,pb must be None" - - tknb, tknq = pair.split("/") - assert tkny in (tknb, tknq), f"tkny must be in pair ({tkny}, {pair})" - tknx = tknb if tkny == tknq else tknq - - if A is None or B is None: - # A,B is None, so we look at prices and isdydx - - # pair quote direction is tknq per tknb; dy/dx is tkny per tknx - # therefore, dy/dx equals pair quote direction if tkny == tknq, otherwise reverse - if not isdydx: - if not tkny == tknq: - pa, pb = 1 / pa, 1 / pb - - # small and zero-width ranges are extended for numerical stability - pa0, pb0 = pa, pb - if pa/pb-1 < minrw: - pa = pb = sqrt(pa*pb) - assert pa == pb, "just making sure" - if pa == pb: - # pa *= 1.0000001 - # pb /= 1.0000001 - rw_multiplier = sqrt(1+minrw) - pa *= rw_multiplier - pb /= rw_multiplier - - # validation - if not pa/pb - 1 >= minrw*0.99: - raise cls.CPCValidationError(f"pa > pb required ({pa}, {pb}, {pa/pb-1}, {minrw})") - - # finally set A, B - A = sqrt(pa) - sqrt(pb) - B = sqrt(pb) - A0 = A if pa0 != pb0 else 0 - else: - pb0 = B * B # B = sqrt(pb), A = sqrt(pa) - sqrt(pb) - pa0 = (A+B) * (A+B) # A+B = sqrt(pa) - A0 = A - if A/B < 1e-7: - A = B*1e-7 - - # set some intermediate parameters (see handwritten notes in repo) - # yasym = yint * B / A - kappa = yint**2 / A**2 - yasym_times_A = yint * B - kappa_times_A = yint**2 / A - - params0 = dict(y=y, yint=yint, A=A0, B=B, pa=pa0, pb=pb0, minrw=minrw) - if params is None: - params = AttrDict(params0) - else: - params = AttrDict({**params, **params0}) - - # finally instantiate the pool - - return cls( - k=kappa, - x=kappa_times_A / (y * A + yasym_times_A) if y * A + yasym_times_A != 0 else 1e99, - #x=kappa / (y + yasym) if y + yasym != 0 else 0, - x_act=0, - y_act=y, - pair=f"{tknx}/{tkny}", - cid=cid, - fee=fee, - descr=descr, - constr="carb", - params=params, - ) - - - def execute(self, dx=None, dy=None, *, ignorebounds=False, verbose=False): - """ - executes a transaction in the pool, returning a new curve object - - :dx: amount of token x to be +added to/-removed from the pool (1) - :dy: amount of token y to be +added to/-removed from the pool (1) - :ignorebounds: if True, ignore bounds on x_act, y_act - :returns: new curve object - - NOTE1: at least one of ``dx, dy`` must be None - """ - assert self.is_constant_product(), "only implemented for constant product curves" - - if not dx is None and not dy is None: - raise ValueError(f"either dx or dy must be None dx={dx} dy={dy}") - - if dx is None and dy is None: - dx = 0 - - if not dx is None: - if not dx >= -self.x_act: - if not ignorebounds: - raise ValueError( - f"dx must be >= -x_act (dx={dx}, x_act={self.x_act} {self.tknx} [{self.cid}: {self.pair}])" - ) - newx = self.x + dx - newy = self.k / newx - - else: - if not dy >= -self.y_act: - if not ignorebounds: - raise ValueError( - f"dy must be >= -y_act (dy={dy}, y_act={self.y_act} {self.tkny} [{self.cid}: {self.pair}])" - ) - newy = self.y + dy - newx = self.k / newy - - if verbose: - if dx is None: - dx = newx - self.x - if dy is None: - dy = newy - self.y - print( - f"{self.pair} dx={dx:.2f} {self.tknx} dy={dy:.2f} {self.tkny} | x:{self.x:.1f}->{newx:.1f} xa:{self.x_act:.1f}->{self.x_act+newx-self.x:.1f} ya:{self.y_act:.1f}->{self.y_act+newy-self.y:.1f} k={self.k:.1f}" - ) - - return self.__class__( - k=self.k, - x=newx, - x_act=self.x_act + newx - self.x, - y_act=self.y_act + newy - self.y, - pair=self.pair, - cid=f"{self.cid}-x", - fee=self.fee, - descr=f"{self.descr} [dx={dx}]", - params={**self.params, "traded": {"dx": dx, "dy": dy}}, - ) - - @property - def tknb(self): - "base token" - return self.pair.split("/")[0] - - tknx = tknb - - @property - def tknq(self): - "quote token" - return self.pair.split("/")[1] - - tkny = tknq - - @property - def tknbp(self): - """prettified base token""" - return Pair.n(self.tknb) - - tknxp = tknbp - - @property - def tknqp(self): - """prettified quote token""" - return Pair.n(self.tknq) - - tknyp = tknqp - - @property - def pairp(self): - """prettified pair""" - return f"{self.tknbp}/{self.tknqp}" - - def description(self): - "description of the pool" - assert self.is_constant_product(), "only implemented for constant product curves" - - s = "" - s += f"cid = {self.cid0} [{self.cid}]\n" - s += f"primary = {Pair.n(self.pairo.primary)} [{self.pairo.primary}]\n" - s += f"pp = {self.pp:,.6f} {self.pairo.pp_convention}\n" - s += f"pair = {Pair.n(self.pair)} [{self.pair}]\n" - s += f"tknx = {self.x_act:20,.6f} {self.tknx:10} [virtual: {self.x:20,.3f}]\n" - s += f"tkny = {self.y_act:20,.6f} {self.tkny:10} [virtual: {self.y:20,.3f}]\n" - s += f"p = {self.p} [min={self.p_min}, max={self.p_max}] {self.tknq} per {self.tknb}\n" - s += f"fee = {self.fee}\n" - s += f"descr = {self.descr}\n" - return s - - @property - def y(self): - "(virtual) pool state x (virtual number of base tokens for sale)" - - if self.k == 0: - return 0 - if self.is_constant_product(): - return self.k / self.x - return (self.k / self.x)**(self.eta) - - @property - def p(self): - "pool price (in dy/dx)" - if self.is_constant_product(): - return self.y / self.x - - return self.eta * self.y / self.x - - def buysell(self, *, verbose=False, withprice=False): - """ - returns b (buy primary tknb), s (sells primary tknb) or bs (buys and sells) - """ - b,s = ("b", "s") if not verbose else ("buy-", "sell-") - xa, ya = (self.x_act, self.y_act) if self.pairo.isprimary else (self.y_act, self.x_act) - result = b if ya > 0 else "" - result += s if xa > 0 else "" - if verbose: - result += f"{self.pairo.primary_tknb}" - if withprice: - result += f" @ {self.primaryp(withconvention=True)}" - return result - if withprice: - return result, self.primaryp() - else: - return result - - def buy(self): - """returns 'b' if the curve buys the primary token, '' otherwise""" - return self.buysell(verbose=False, withprice=False).replace("s", "") - - def sell(self): - """returns 's' if the curve sells the primary token, '' otherwise""" - return self.buysell(verbose=False, withprice=False).replace("b", "") - - ITM_THRESHOLDPC = 0.01 - @classmethod - def itm0(cls, bsp1, bsp2, *, thresholdpc=None): - """ - whether or not two positions are in the money against each other - - :bsp1: first position ("bs", price) [from buysell] - :bsp2: ditto second position - :thresholdpc: in-the-money threshold in percent (default: ITM_THRESHOLD) - """ - if thresholdpc is None: - thresholdpc = cls.ITM_THRESHOLDPC - bs1, p1 = bsp1 - bs2, p2 = bsp2 - - # if prices are equal (within threshold), positions are not in the money - if abs(p2/p1-1) < thresholdpc: - return False - if bs1 == "bs" and bs2 == "bs": - return True - - if p2 > p1: - # if p2 > p1: amm1 must sell and amm2 must buy - return "s" in bs1 and "b" in bs2 - else: - # if p1 < p2: amm1 must buy and amm2 must sell - return "b" in bs1 and "s" in bs2 - - def itm(self, other, *, thresholdpc=None, aggr=True): - """ - like itm0, but self against another curve object - - :other: other curve object, or iterable thereof - :thresholdpc: in-the-money threshold in percent (default: ITM_THRESHOLD) - :aggr: if True, and an iterable is passed, True iff one is in the money - """ - assert self.is_constant_product(), "only implemented for constant product curves" - - try: - itm_t = tuple(self.itm(o) for o in other) - if not aggr: - return itm_t - return np.any(itm_t) - except: - pass - bss = self.buysell(verbose=False, withprice=True) - bso = other.buysell(verbose=False, withprice=True) - return self.itm0(bss, bso, thresholdpc=thresholdpc) - - - def tvl(self, tkn=None, *, mult=1.0, incltkn=False, raiseonerror=True): - """ - total value locked in the curve, expressed in the token tkn (default: tknq) - - :tkn: the token in which the tvl is expressed (tknb or tknq) - :mult: multiplier applied to the tvl (eg to convert ETH to USD) - :incltkn: if True, returns a tuple (tvl, tkn, mult) - :raiseonerror: if True, raises ValueError if tkn is not tknb or tknq - :returns: tvl (in tkn) or (tvl, tkn, mult) if incltkn is True - """ - if tkn is None: - tkn = self.tknq - if not tkn in {self.tknb, self.tknq}: - if raiseonerror: - raise ValueError(f"tkn must be {self.tknb} or {self.tknq}") - return None - - tvl_tknq = (self.p * self.x_act + self.y_act) * mult - if tkn == self.tknq: - return tvl_tknq if not incltkn else (tvl_tknq, self.tknq, mult) - tvl_tknb = tvl_tknq / self.p - return tvl_tknb if not incltkn else (tvl_tknb, self.tknb, mult) - - def p_convention(self): - """price convention for p (dy/dx)""" - return f"{self.tknyp} per {self.tknxp}" - - @property - def primary(self): - "alias for self.pairo.primary" - return self.pairo.primary - - @property - def isprimary(self): - "alias for self.pairo.isprimary" - return self.pairo.isprimary - - def primaryp(self, *, withconvention=False): - "pool price in the native quote of the curve Pair object" - price = self.pairo.pp(self.p) - if not withconvention: - return price - return f"{price:.2f} {self.pairo.pp_convention}" - - @property - def pp(self): - """alias for self.primaryp()""" - return self.primaryp() - - @property - def kbar(self): - """ - kbar is pool invariant the scales linearly with the pool size - - kbar = sqrt(k) for constant product - kbar = k^alpha for general curves - """ - if self.is_constant_product(): - return sqrt(self.k) - return self.k**self.alpha - - def invariant(self, xvec=None, *, include_target=False): - """ - returns the actual invariant of the curve (eg x*y for constant product) - - :xvec: vector of x values (default: current) - :include_target: if True, the target invariant returned in addition to the actual invariant - :returns: invariant, or (invariant, target) - """ - if xvec is None: - xvec = {self.tknx: self.x, self.tkny: self.y} - x,y = xvec[self.tknx], xvec[self.tkny] - if self.is_constant_product(): - invariant = sqrt(x * y) - else: - invariant = x**self.alpha * y**(1-self.alpha) - if not include_target: - return invariant - return (invariant, self.kbar) - - @property - def x_min(self): - "minimum (virtual) x value" - if self.is_unlevered(): - return 0 - assert self.is_constant_product(), "only implemented for constant product curves" - - return self.x - self.x_act - - @property - def at_xmin(self): - """True iff x is at x_min""" - if self.x_min == 0: - return False - return abs(self.x / self.x_min - 1) < 1e-6 - - at_ymax = at_xmin - - @property - def at_xmax(self): - """True iff x is at x_max""" - if self.x_max is None: - return False - return abs(self.x / self.x_max - 1) < 1e-6 - - at_ymin = at_xmax - - @property - def at_boundary(self): - """True iff x is at either x_min or x_max""" - return self.at_xmin or self.at_xmax - - @property - def y_min(self): - "minimum (virtual) y value" - if self.is_unlevered(): - return 0 - assert self.is_constant_product(), "only implemented for constant product curves" - - return self.y - self.y_act - - @property - def x_max(self): - "maximum (virtual) x value" - if self.is_unlevered(): - return None - assert self.is_constant_product(), "only implemented for constant product curves" - - if self.y_min > 0: - return self.k / self.y_min - else: - return None - - @property - def y_max(self): - "maximum (virtual) y value" - if self.is_unlevered(): - return None - assert self.is_constant_product(), "only implemented for constant product curves" - - if self.x_min > 0: - return self.k / self.x_min - else: - return None - - @property - def p_max(self): - "maximum pool price (in dy/dx; None if unlimited) = y_max/x_min" - if self.is_unlevered(): - return None - assert self.is_constant_product(), "only implemented for constant product curves" - - if not self.x_min is None and self.x_min > 0: - return self.y_max / self.x_min - else: - return None - - def p_max_primary(self, swap=True): - "p_max in the native quote of the curve Pair object (swap=True: p_min)" - if self.is_unlevered(): - return None - p = self.p_max if not (swap and not self.isprimary) else self.p_min - if p is None: return None - return p if self.isprimary else 1/p - - @property - def p_min(self): - "minimum pool price (in dy/dx; None if unlimited) = y_min/x_max" - if self.is_unlevered(): - return 0 - assert self.is_constant_product(), "only implemented for constant product curves" - - if not self.x_max is None and self.x_max > 0: - return self.y_min / self.x_max - else: - return None - - def p_min_primary(self, swap=True): - "p_min in the native quote of the curve Pair object (swap=True: p_max)" - if self.is_unlevered(): - return 0 - p = self.p_min if not (swap and not self.isprimary) else self.p_max - if p is None: return None - return p if self.isprimary else 1/p - - def format(self, *, heading=False, formatid=None): - """returns info about the curve as a formatted string""" - assert self.is_constant_product(), "only implemented for constant product curves" - - if formatid is None: - formatid = 0 - assert formatid in [0], "only formatid in [0] is supported" - c = self - cid = str(c.cid)[-10:] - if heading: - s = f"{'CID':>12} {'PAIR':>10}" - s += f"{'xact':>20} {'tknx':>5} {'yact':>20} {'tkny':>5}" - s += f"{'price':>10} {'inverse':>10}" - s += "\n" + "=" * len(s) - return s - s = f"{cid:>12} {c.pairp:>10}" - s += f"{c.x_act:20,.3f} {c.tknxp:>5} {c.y_act:20,.3f} {c.tknyp:>5}" - s += f"{c.p:10,.2f} {1/c.p:10,.2f}" - return s - - def xyfromp_f(self, p=None, *, ignorebounds=False, withunits=False): - r""" - returns x,y,p for a given marginal price p (stuck at the boundaries if ignorebounds=False) - - :p: marginal price (in dy/dx) - :ignorebounds: if True, ignore x_act and y_act; if False, return the x,y values where - x_act and y_act are at zero (i.e. the pool is empty in this direction) - :withunits: if False, return x,y,p; if True, also return tknx, tkny, pair - - - $$ - x(p) = \left( \frac{\eta}{p} \right) ^ {1-\alpha} k^\alpha - y(p) = \left( \frac{p}{\eta} \right) ^ \alpha k^\alpha - $$ - """ - if p is None: - p = self.p - - if self.is_constant_product(): - sqrt_p = sqrt(p) - sqrt_k = self.kbar - x = sqrt_k / sqrt_p - y = sqrt_k * sqrt_p - else: - eta = self.eta - alpha = self.alpha - x = (eta/p)**(1-alpha) * self.kbar - y = (p/eta)**alpha * self.kbar - - if not ignorebounds: - if not self.x_min is None: - if x < self.x_min: - x = self.x_min - if not self.x_max is None: - if x > self.x_max: - x = self.x_max - if not self.y_min is None: - if y < self.y_min: - y = self.y_min - if not self.y_max is None: - if y > self.y_max: - y = self.y_max - - if withunits: - return x, y, p, self.tknxp, self.tknyp, self.pairp - - return x, y, p - - def xvecfrompvec_f(self, pvec, *, ignorebounds=False): - """ - alternative API to xyfromp_f - - :pvec: a dict containing all prices; the dict must contain the keys - for tknx and for tkny and the associated value must be the respective - price in any numeraire (only the ratio is used) - :returns: token amounts as dict {tknx: x, tkny: y} - """ - assert self.tknx in pvec, f"pvec must contain price for {self.tknx} [{pvec.keys()}]" - assert self.tkny in pvec, f"pvec must contain price for {self.tkny} [{pvec.keys()}]" - p = pvec[self.tknx] / pvec[self.tkny] - x, y, _ = self.xyfromp_f(p, ignorebounds=ignorebounds) - return {self.tknx: x, self.tkny: y} - - def dxdyfromp_f(self, p=None, *, ignorebounds=False, withunits=False): - """like xyfromp_f, but returns dx,dy,p instead of x,y,p""" - x, y, p = self.xyfromp_f(p, ignorebounds=ignorebounds) - dx = x - self.x - dy = y - self.y - if withunits: - return dx, dy, p, self.tknxp, self.tknyp, self.pairp - return dx, dy, p - - def dxvecfrompvec_f(self, pvec, *, ignorebounds=False): - """ - alternative API to dxdyfromp_f - - :pvec: a dict containing all prices; the dict must contain the keys - for tknx and for tkny and the associated value must be the respective - price in any numeraire (only the ratio is used) - :returns: token difference amounts as dict {tknx: dx, tkny: dy} - """ - assert self.tknx in pvec, f"pvec must contain price for {self.tknx} [{pvec.keys()}]" - assert self.tkny in pvec, f"pvec must contain price for {self.tkny} [{pvec.keys()}]" - p = pvec[self.tknx] / pvec[self.tkny] - dx, dy, _ = self.dxdyfromp_f(p, ignorebounds=ignorebounds) - return {self.tknx: dx, self.tkny: dy} - - def yfromx_f(self, x, *, ignorebounds=False): - "y value for given x value (if in range; None otherwise)" - if self.is_constant_product(): - y = self.k / x - else: - y = (self.k / x) ** self.eta - - if ignorebounds: - return y - if not self.inrange(y, self.y_min, self.y_max): - return None - return y - - def xfromy_f(self, y, *, ignorebounds=False): - "x value for given y value (if in range; None otherwise)" - if self.is_constant_product(): - x = self.k / y - else: - x = self.k / (y ** (1/self.eta)) - if ignorebounds: - return x - if not self.inrange(x, self.x_min, self.x_max): - return None - return x - - def dyfromdx_f(self, dx, *, ignorebounds=False): - "dy value for given dx value (if in range; None otherwise)" - y = self.yfromx_f(self.x + dx, ignorebounds=ignorebounds) - if y is None: - return None - return y - self.y - - def dxfromdy_f(self, dy, *, ignorebounds=False): - "dx value for given dy value (if in range; None otherwise)" - x = self.xfromy_f(self.y + dy, ignorebounds=ignorebounds) - if x is None: - return None - return x - self.x - - @property - def dy_min(self): - """minimum (=max negative) possible dy value of this pool (=-y_act)""" - return -self.y_act - - @property - def dx_min(self): - """minimum (=max negative) possible dx value of this pool (=-x_act)""" - return -self.x_act - - @property - def dy_max(self): - """maximum dy value of this pool (=dy(dx_min))""" - if self.x_act < self.x: - return self.dyfromdx_f(self.dx_min) - else: - return None - - @property - def dx_max(self): - """maximum dx value of this pool (=dx(dy_min))""" - if self.y_act < self.y: - return self.dxfromdy_f(self.dy_min) - else: - return None - - @staticmethod - def inrange(v, minv=None, maxv=None): - "True if minv <= v <= maxv; None means no boundary" - if not minv is None: - if v < minv: - return False - if not maxv is None: - if v > maxv: - return False - return True - - EPS = 1e-6 - - def isequal(self, x, y): - "returns True if x and y are equal within EPS" - if x == 0: - return abs(y) < self.EPS - return abs(y / x - 1) < self.EPS - - def isbigger(self, small, big): - "returns True if small is bigger than big within EPS (small, big > 0)" - if small == 0: - return big > self.EPS - return big / small > 1 + self.EPS - - def plot(self, xmin=None, xmax=None, steps=None, *, xvals=None, func=None, show=False, title=None, xlabel=None, ylabel=None, grid=True, **params): - """ - plots the curve associated with this pool - - :xmin, xmax, steps: x range (args for np.linspace) - :xvals: x values (alternative to xmin, xmax, steps) - :func: function to plot (default: dyfrpmdx_f) - :show: if True, call plt.show() - :title: plot title - :xlabel, ylabel: axis labels - :grid: if True [False], [do not] show grid; None: ignore - :params: additional kwargs passed to plt.plot - """ - if xvals is None: - assert not xmin is None, "xmin must not be None if xv is None" - assert not xmax is None, "xmin must not be None if xv is None" - x_v = np.linspace(xmin, xmax, steps) if steps else np.linspace(xmin, xmax) - else: - assert xmin is None, "xmin must be None if xv is not None" - assert xmax is None, "xmax must be None if xv is not None" - assert steps is None, "steps must be None if xv is not None" - x_v = xvals - - xlabel = xlabel or (f"dx [{self.tknx}]" if not func else "x") - ylabel = ylabel or (f"dy [{self.tkny}]" if not func else "y") - func = func or self.dyfromdx_f - #print("moo", self.cid, self.cid is None, 'self.cid' if self.cid else 'NO') - title = title or f"Invariance curve {self.pairp} {self.cid if (self.cid and not self.cid=='None') else ''}" - - y_v = [func(xx) for xx in x_v] - result = plt.plot(x_v, y_v, **params) - plt.title(title) - plt.xlabel(xlabel) - plt.ylabel(ylabel) - if not grid is None: - plt.grid(grid) - if show: - plt.show() - return result - - @staticmethod - def digest(datastr, len=4): - """returns a digest of a string of a certain length""" - return digest(str(datastr).encode()).hexdigest()[:len] - - - -class AF: - """aggregator functions (for pivot tables)""" - - @staticmethod - def range(x): - return np.max(x) - np.min(x) - - @staticmethod - def rangepc(x): - mx = np.max(x) - if mx == 0: - return 0 - return (mx - np.min(x)) / mx - - @classmethod - def rangepc100(cls, x): - return cls.rangepc(x) * 100 - - @staticmethod - def sdpc(x): - return np.std(x) / np.mean(x) - - @classmethod - def sdpc100(cls, x): - return cls.sdpc(x) * 100 - - @staticmethod - def first(x): - return x.iloc[0] - - @staticmethod - def herfindahl(x): - return np.sum(x**2) / np.sum(x) ** 2 - - @classmethod - def herfindahlN(cls, x): - return 1 / cls.herfindahl(x) - - diff --git a/fastlane_bot/tools/curves/cpcinverter.py b/fastlane_bot/tools/curves/cpcinverter.py deleted file mode 100644 index d4ba3cf1a..000000000 --- a/fastlane_bot/tools/curves/cpcinverter.py +++ /dev/null @@ -1,209 +0,0 @@ -""" -adaptor class inverting the pair of a ConstantProductCurve - ---- -(c) Copyright Bprotocol foundation 2023. -Licensed under MIT -""" -from dataclasses import dataclass -import time - -from .simplepair import SimplePair as Pair -from .curvebase import DAttrDict -from .cpc import ConstantProductCurve - -AD = DAttrDict - - -__VERSION__ = "1.0" -__DATE__ = "04/May/2024" - -@dataclass -class CPCInverter: - """ - adaptor class the allows for reverse-pair functions to be used as if they were of the same pair - """ - - curve: ConstantProductCurve - - @classmethod - def wrap(cls, curves, *, asgenerator=False): - """ - wraps an iterable of curves in CPCInverters if needed and returns a tuple (or generator) - - NOTE: only curves with ``c.pairo.isprimary == False`` are wrapped, the other ones are included - as they are; this ensures that for all returned curves that correspond to the same actual - pair, the primary pair is the same - """ - result = (cls(c) if not c.pairo.isprimary else c for c in curves) - if asgenerator: - return result - return tuple(result) - - @classmethod - def unwrap(cls, wrapped_curves, *, asgenerator=False): - """ - unwraps an iterable of curves from CPCInverters if needed and returns a tuple (or generator) - """ - result = (c.curve if isinstance(c, cls) else c for c in wrapped_curves) - if asgenerator: - return result - return tuple(result) - - @property - def cid(self): - return self.curve.cid - - @property - def tknxp(self): - return self.curve.tknyp - - @property - def tknyp(self): - return self.curve.tknxp - - @property - def tknx(self): - return self.curve.tkny - - @property - def tkny(self): - return self.curve.tknx - - @property - def tknb(self): - return self.curve.tknq - - @property - def tknq(self): - return self.curve.tknb - - @property - def tknbp(self): - return self.curve.tknqp - - @property - def tknqp(self): - return self.curve.tknbp - - @property - def p(self): - return 1 / self.curve.p - - def P(self, *args, **kwargs): - return self.curve.P(*args, **kwargs) - - @property - def fee(self): - return self.curve.fee - - def p_convention(self): - """price convention for p (dy/dx)""" - return f"{self.tknyp} per {self.tknxp}" - - @property - def x(self): - return self.curve.y - - @property - def y(self): - return self.curve.x - - @property - def k(self): - return self.curve.k - - @property - def pair(self): - return f"{self.tknb}/{self.tknq}" - - @property - def primary(self): - "alias for self.pairo.primary [pair]" - return self.pairo.primary - - @property - def pairp(self): - "prety pair (without the -xxx part)" - return f"{self.tknbp}/{self.tknqp}" - - @property - def primaryp(self): - "pretty primary pair (without the -xxx part)" - tokens = self.primary.split("/") - tokens = [t.split("-")[0] for t in tokens] - return "/".join(tokens) - - @property - def x_min(self): - return self.curve.y_min - - @property - def x_max(self): - return self.curve.y_max - - @property - def y_min(self): - return self.curve.x_min - - @property - def y_max(self): - return self.curve.x_max - - @property - def x_act(self): - return self.curve.y_act - - @property - def p_min(self): - return 1 / self.curve.p_max - - @property - def p_max(self): - return 1 / self.curve.p_min - - @property - def y_act(self): - return self.curve.x_act - - @property - def pairo(self): - return Pair.from_tokens(tknb=self.tknb, tknq=self.tknq) - - def yfromx_f(self, x, *, ignorebounds=False): - return self.curve.xfromy_f(x, ignorebounds=ignorebounds) - - def xfromy_f(self, y, *, ignorebounds=False): - return self.curve.yfromx_f(y, ignorebounds=ignorebounds) - - def dyfromdx_f(self, dx, *, ignorebounds=False): - return self.curve.dxfromdy_f(dx, ignorebounds=ignorebounds) - - def dxfromdy_f(self, dy, *, ignorebounds=False): - return self.curve.dyfromdx_f(dy, ignorebounds=ignorebounds) - - def xyfromp_f(self, p=None, *, ignorebounds=False, withunits=False): - r = self.curve.xyfromp_f( - 1 / p if not p is None else None, ignorebounds=ignorebounds, withunits=False - ) - if withunits: - return (r[1], r[0], 1 / r[2], self.tknxp, self.tknyp, self.pairp) - return (r[1], r[0], 1 / r[2]) - - def dxdyfromp_f(self, p=None, *, ignorebounds=False, withunits=False): - r = self.curve.dxdyfromp_f( - 1 / p if not p is None else None, ignorebounds=ignorebounds, withunits=False - ) - if withunits: - return (r[1], r[0], 1 / r[2], self.tknxp, self.tknyp, self.pairp) - return (r[1], r[0], 1 / r[2]) - - def execute(self, dx=None, dy=None, *, ignorebounds=False, verbose=False): - """returns a new curve object that is then again wrapped in a CPCInverter""" - curve = self.curve.execute( - dx=dy, dy=dx, ignorebounds=ignorebounds, verbose=verbose - ) - return CPCInverter(curve) - - - diff --git a/fastlane_bot/tools/curves/curvecontainer.py b/fastlane_bot/tools/curves/curvecontainer.py deleted file mode 100644 index 8f7400833..000000000 --- a/fastlane_bot/tools/curves/curvecontainer.py +++ /dev/null @@ -1,1152 +0,0 @@ -""" -representing a collection of bonding curves - ---- -(c) Copyright Bprotocol foundation 2023. -Licensed under MIT -""" -__VERSION__ = "4.0-beta1" -__DATE__ = "04/May/2024" - -from .simplepair import SimplePair as Pair -from . import tokenscale as ts -from .params import Params -from .curvebase import DAttrDict -from .cpc import ConstantProductCurve, T -from .cpcinverter import CPCInverter - -from dataclasses import dataclass, field -import random -from math import sqrt -import numpy as np -import pandas as pd -import json -from matplotlib import pyplot as plt -import itertools as it -import collections as cl -import time - - -AD = DAttrDict - -@dataclass -class CurveContainer: - """ - container for ConstantProductCurve objects (use += to add items) - - :curves: an iterable of CPC curves, possibly wrapped in CPCInverter objects - CPCInverter objects are unwrapped automatically, the resulting - list will ALWAYS be curves, possibly with inverted=True - :tokenscale: a TokenScaleBase object (or None, in which case the default) - this object contains indicative prices for the tokens which are - sometimes useful for numerical stability reasons; the default token - scale is unity across all tokens - """ - - __VERSION__ = __VERSION__ - __DATE__ = __DATE__ - Pair = Pair - - curves: list = field(default_factory=list) - tokenscale: ts.TokenScaleBase = field(default=None, repr=False) - - def __post_init__(self): - - if self.tokenscale is None: - self.tokenscale = self.TOKENSCALE - # print("[CurveContainer] tokenscale =", self.tokenscale) - - # ensure that the curves are in a list (they can be provided as any - # iterable, e.g. a generator); also unwraps CPCInverter objects - # if need be - self.curves = [c for c in CPCInverter.unwrap(self.curves)] - - for i, c in enumerate(self.curves): - if c.cid is None: - # print("[__post_init__] setting cid", i) - c.setcid(i) - else: - # print("[__post_init__] cid already set", c.cid) - pass - c.set_tokenscale(self.tokenscale) - - self.curves_by_cid = {c.cid: c for c in self.curves} - self.curveix_by_curve = {c: i for i, c in enumerate(self.curves)} - # self.curves_by_primary_pair = {c.pairo.primary: c for c in self.curves} - self.curves_by_primary_pair = {} - for c in self.curves: - try: - self.curves_by_primary_pair[c.pairo.primary].append(c) - except KeyError: - self.curves_by_primary_pair[c.pairo.primary] = [c] - - TOKENSCALE = ts.TokenScale1Data - # default token scale object is the trivial scale (everything one) - # change this to a different scale object be creating a derived class - - def scale(self, tkn): - """returns the scale of tkn""" - return self.tokenscale.scale(tkn) - - def as_dicts(self): - """returns list of dictionaries representing the curves""" - return [c.asdict() for c in self.curves] - asdicts = as_dicts # legacy name - - def as_json(self): - """as_dicts as JSON string""" - return json.dumps(self.as_dicts()) - - def as_repr(self): - """returns a string representation of the container""" - return ",\n".join([repr(c) for c in self.curves])+"," - - def as_df(self): - """returns pandas dataframe representing the curves""" - return pd.DataFrame.from_dict(self.asdicts()).set_index("cid") - asdf = as_df # legacy name - - @classmethod - def from_dicts(cls, dicts, *, tokenscale=None): - """alternative constructor: creates a container from a list of dictionaries""" - return cls( - [ConstantProductCurve.from_dict(d) for d in dicts], tokenscale=tokenscale - ) - - @classmethod - def from_df(cls, df, *, tokenscale=None): - "alternative constructor: creates a container from a dataframe representation" - if "cid" in df.columns: - df = df.set_index("cid") - return cls.from_dicts( - df.reset_index().to_dict("records"), tokenscale=tokenscale - ) - - def add(self, item): - """ - adds one or multiple ConstantProductCurves (+= operator is also supported) - - :item: item can be the following types: - :ConstantProductCurve: a single curve is added - :CPCInverter: the curve underlying the inverter is added - :Iterable: all items in the iterable are added one by one - """ - - # unwrap iterables... - try: - for c in item: - self.add(c) - return self - except TypeError: - pass - - # ...and CPCInverter objects - if isinstance(item, CPCInverter): - item = item.curve - - # at this point, item must be a ConstantProductCurve object - assert isinstance( - item, ConstantProductCurve - ), f"item must be a ConstantProductCurve object {item}" - - if item.cid is None: - # print("[add] setting cid to", len(self)) - item.setcid(len(self)) - else: - pass - # print("[add] item.cid =", item.cid) - self.curves_by_cid[item.cid] = item - self.curveix_by_curve[item] = len(self) - self.curves += [item] - # print("[add] ", self.curves_by_primary_pair) - try: - self.curves_by_primary_pair[item.pairo.primary].append(item) - except KeyError: - self.curves_by_primary_pair[item.pairo.primary] = [item] - return self - - def price(self, tknb, tknq): - """returns price of tknb in tknq (tknb per tknq)""" - pairo = Pair.from_tokens(tknb, tknq) - curves = self.curves_by_primary_pair.get(pairo.primary, None) - if curves is None: - return None - pp = sum(c.pp for c in curves) / len(curves) - return pp if pairo.isprimary else 1 / pp - - PR_TUPLE = "tuple" - PR_DICT = "dict" - PR_DF = "df" - def prices(self, result=None, *, inclpair=None, primary=None): - """ - returns tuple or dictionary of the prices of all curves in the container - - :primary: if True (default), returns the price quoted in the convention of the primary pair - :inclpair: if True, includes the pair in the dictionary - :result: what result to return (PR_TUPLE, PR_DICT, PR_DF) - """ - if primary is None: primary = True - if inclpair is None: inclpair = True - if result is None: result = self.PR_DICT - price_g = (( - c.cid, - c.primaryp() if primary else c.p, - c.pairo.primary if primary else c.pair - ) for c in self.curves - ) - - if result == self.PR_TUPLE: - if inclpair: - return tuple(price_g) - else: - return tuple(r[1] for r in price_g) - - if result == self.PR_DICT: - if inclpair: - return {r[0]: (r[1], r[2]) for r in price_g} - else: - return {r[0]: r[1] for r in price_g} - - if result == self.PR_DF: - df = pd.DataFrame.from_records(price_g, columns=["cid", "price", "pair"]) - df = df.set_index("cid") - return df - raise ValueError(f"unknown result type {result}") - - def __iadd__(self, other): - """alias for self.add""" - return self.add(other) - - def __iter__(self): - return iter(self.curves) - - def __len__(self): - return len(self.curves) - - def __getitem__(self, key): - return self.curves[key] - - def __contains__(self, curve): - return curve in self.curveix_by_curve - - def tknys(self, curves=None): - """returns set of all base tokens (tkny) used by the curves""" - if curves is None: - curves = self.curves - return {c.tkny for c in curves} - - def tknyl(self, curves=None): - """returns list of all base tokens (tkny) used by the curves""" - if curves is None: - curves = self.curves - return [c.tkny for c in curves] - - def tknxs(self, curves=None): - """returns set of all quote tokens (tknx) used by the curves""" - if curves is None: - curves = self.curves - return {c.tknx for c in curves} - - def tknxl(self, curves=None): - """returns set of all quote tokens (tknx) used by the curves""" - if curves is None: - curves = self.curves - return [c.tknx for c in curves] - - def tkns(self, curves=None): - """returns set of all tokens used by the curves""" - return self.tknxs(curves).union(self.tknys(curves)) - - tokens = tkns - - def tokens_s(self, curves=None): - """returns set of all tokens used by the curves as a string""" - return ",".join(sorted(self.tokens(curves))) - - def token_count(self, asdict=False): - """ - counts the number of times each token appears in the curves - """ - tokens_l = (c.pair for c in self) - tokens_l = (t.split("/") for t in tokens_l) - tokens_l = (t for t in it.chain.from_iterable(tokens_l)) - tokens_l = list(cl.Counter([t for t in tokens_l]).items()) - tokens_l = sorted(tokens_l, key=lambda x: x[1], reverse=True) - if not asdict: - return tokens_l - return dict(tokens_l) - - def pairs(self, *, standardize=True): - """ - returns set of all pairs used by the curves - - :standardize: if False, the pairs are returned as they are in the curves; eg if we have curves - for both ETH/USDT and USDT/ETH, both pairs will be returned; if True, only the - canonical pair will be returned - """ - if standardize: - return {c.pairo.primary for c in self} - else: - return {c.pair for c in self} - - def cids(self, *, asset=False): - """returns list of all curve ids (as tuple, or set if asset=True)""" - if asset: - return set(c.cid for c in self) - return tuple(c.cid for c in self) - - @staticmethod - def pairset(pairs): - """converts string, list or set of pairs into a set of pairs""" - if isinstance(pairs, str): - pairs = (p.strip() for p in pairs.split(",")) - return set(pairs) - - def make_symmetric(self, df): - """converts df into upper triangular matrix by adding the lower triangle""" - df = df.copy() - fields = df.index.union(df.columns) - df = df.reindex(index=fields, columns=fields) - df = df + df.T - df = df.fillna(0).astype(int) - return df - - FP_ANY = "any" - FP_ALL = "all" - - def filter_pairs(self, pairs=None, *, anyall=FP_ALL, **conditions): - """ - filters the pairs according to the target conditions(s) - - :pairs: list of pairs to filter; if None, all pairs are used - :anyall: how conditions are combined (FP_ANY or FP_ALL) - :conditions: determines the filtering condition; all or any must be met (1, 2) - - - NOTE1: an arbitrary differentiator can be appended to the condition using "_" - (eg onein_1, onein_2, onein_3, ...) allowing to specify multiple conditions - of the same type - - NOTE2: see table below for conditions - - ========= ======================================== - Condition Description - ========= ======================================== - bothin both tokens must be in the list - onein at least one token must be in the list - notin none of the tokens must be in the list - contains alias for onein - tknbin tknb must be in the list - tknbnotin tknb must not be in the list - tknqin tknq must be in the list - tknqnotin tknq must not be in the list - ========= ======================================== - - """ - if pairs is None: - pairs = self.pairs() - if not conditions: - return pairs - pairs = self.Pair.wrap(pairs) - results = [] - for condition in conditions: - cpairs = self.pairset(conditions[condition]) - condition0 = condition.split("_")[0] - # print(f"condition: {condition} | {condition0} [{conditions[condition]}]") - if condition0 == "bothin": - results += [ - {str(p) for p in pairs if p.tknb in cpairs and p.tknq in cpairs} - ] - elif condition0 == "contains" or condition0 == "onein": - results += [ - {str(p) for p in pairs if p.tknb in cpairs or p.tknq in cpairs} - ] - elif condition0 == "notin": - results += [ - { - str(p) - for p in pairs - if p.tknb not in cpairs and p.tknq not in cpairs - } - ] - elif condition0 == "tknbin": - results += [{str(p) for p in pairs if p.tknb in cpairs}] - elif condition0 == "tknbnotin": - results += [{str(p) for p in pairs if p.tknb not in cpairs}] - elif condition0 == "tknqin": - results += [{str(p) for p in pairs if p.tknq in cpairs}] - elif condition0 == "tknqnotin": - results += [{str(p) for p in pairs if p.tknq not in cpairs}] - else: - raise ValueError(f"unknown condition {condition}") - - # print(f"results: {results}") - if anyall == self.FP_ANY: - # print(f"anyall = {anyall}: union") - return set.union(*results) - elif anyall == self.FP_ALL: - # print(f"anyall = {anyall}: intersection") - return set.intersection(*results) - else: - raise ValueError(f"unknown anyall {anyall}") - - def fp(self, pairs=None, **conditions): - """alias for filter_pairs (for interactive use)""" - return self.filter_pairs(pairs, **conditions) - - def fpb(self, bothin, pairs=None, *, anyall=FP_ALL, **conditions): - """alias for filter_pairs bothin (for interactive use)""" - return self.filter_pairs( - pairs=pairs, bothin=bothin, anyall=anyall, **conditions - ) - - def fpo(self, onein, pairs=None, *, anyall=FP_ALL, **conditions): - """alias for filter_pairs onein (for interactive use)""" - return self.filter_pairs(pairs=pairs, onein=onein, anyall=anyall, **conditions) - - @classmethod - def _record(cls, c=None): - """returns the record (or headings, if none) for the pair c""" - if not c is None: - p = cls.Pair(c.pair) - return ( - c.tknx, - c.tkny, - c.tknb, - c.tknq, - p.pair, - p.primary, - p.isprimary, - c.p, - p.pp(c.p), - c.x, - c.x_act, - c.y, - c.y_act, - c.cid, - ) - else: - return ( - "tknx", - "tkny", - "tknb", - "tknq", - "pair", - "primary", - "isprimary", - "p", - "pp", - "x", - "xa", - "y", - "ya", - "cid", - ) - - AT_LIST = "list" - AT_LISTDF = "listdf" - AT_VOLUMES = "volumes" - AT_VOLUMESAGG = "vaggr" - AT_VOLSAGG = "vaggr" - AT_PIVOTXY = "pivotxy" - AT_PIVOTXYS = "pivotxys" - AT_PIVOTBQ = "pivotbq" - AT_PIVOTBQS = "pivotbqs" - AT_PRICES = "prices" - AT_MAX = "max" - AT_MIN = "min" - AT_SD = "std" - AT_SDPC = "stdpc" - AT_PRICELIST = "pricelist" - AT_PRICELISTAGG = "plaggr" - AT_PLAGG = "plaggr" - - def pairs_analysis(self, *, target=AT_PIVOTBQ, pretty=False, pairs=None, **params): - """ - returns a dataframe with the analysis of the pairs according to the analysis target - - :target: :AT_LIST: list of pairs and associated data - :AT_LISTDF: ditto but as a dataframe - :AT_VOLUMES: list of volume per token and curve - :AT_VOLSAGG: ditto but also aggregated by curve - :AT_PIVOTXY: pivot table number of pairs tknx/tkny - :AT_PIVOTBQ: ditto but with tknb/tknq - :AT_PIVOTXYS: above anlysis but symmetric matrix (1) - :AT_PIVOTBQS: ditto - :AT_PRICES: average prices per (directed) pair - :AT_MAX: ditto max - :AT_MIN: ditto min - :AT_SD: ditto price standard deviation - :AT_SDPC: ditto percentage standard deviation - :AT_PRICELIST: list of prices per curve - :AT_PLAGG: list of prices aggregated by pair - :pretty: in some cases, returns a prettier but less useful result - :pairs: list of pairs to analyze; if None, all pairs - :params: kwargs that some of the analysis targets may use - - NOTE1: eg ETH/USDC would appear in ETH/USDC and in USDC/ETH - """ - record = self._record - cols = self._record() - - if pairs is None: - pairs = self.pairs() - curvedata = (record(c) for c in self.bypairs(pairs)) - if target == self.AT_LIST: - return tuple(curvedata) - df = pd.DataFrame(curvedata, columns=cols) - if target == self.AT_LISTDF: - return df - - if target == self.AT_VOLUMES or target == self.AT_VOLSAGG: - dfb = ( - df[["tknb", "cid", "x", "xa"]] - .copy() - .rename(columns={"tknb": "tkn", "x": "amtv", "xa": "amt"}) - ) - dfq = ( - df[["tknq", "cid", "y", "ya"]] - .copy() - .rename(columns={"tknq": "tkn", "y": "amtv", "ya": "amt"}) - ) - df1 = pd.concat([dfb, dfq], axis=0) - df1 = df1.sort_values(["tkn", "cid"]) - if target == self.AT_VOLUMES: - df1 = df1.set_index(["tkn", "cid"]) - df1["lvg"] = df1["amtv"] / df1["amt"] - return df1 - df1["n"] = (1,) * len(df1) - # df1 = df1.groupby(["tkn"]).sum() - df1 = df1.pivot_table( - index="tkn", - values=["amtv", "amt", "n"], - aggfunc={ - "amtv": ["sum", AF.herfindahl, AF.herfindahlN], - "amt": ["sum", AF.herfindahl, AF.herfindahlN], - "n": "count", - }, - ) - price_eth = ( - self.price(tknb=t, tknq=T.ETH) if t != T.ETH else 1 for t in df1.index - ) - df1["price_eth"] = tuple(price_eth) - df1["amtv_eth"] = df1[("amtv", "sum")] * df1["price_eth"] - df1["amt_eth"] = df1[("amt", "sum")] * df1["price_eth"] - df1["lvg"] = df1["amtv_eth"] / df1["amt_eth"] - return df1 - - if target == self.AT_PIVOTXY or target == self.AT_PIVOTXYS: - pivot = ( - df.pivot_table( - index="tknx", columns="tkny", values="tknb", aggfunc="count" - ) - .fillna(0) - .astype(int) - ) - if target == self.AT_PIVOTXY: - return pivot - return self.make_symmetric(pivot) - - if target == self.AT_PIVOTBQ or target == self.AT_PIVOTBQS: - pivot = ( - df.pivot_table( - index="tknb", columns="tknq", values="tknx", aggfunc="count" - ) - .fillna(0) - .astype(int) - ) - if target == self.AT_PIVOTBQ: - if pretty: - return pivot.replace(0, "") - return pivot - pivot = self.make_symmetric(pivot) - if pretty: - return pivot.replace(0, "") - return pivot - - if target == self.AT_PRICES: - pivot = df.pivot_table( - index="tknb", columns="tknq", values="p", aggfunc="mean" - ) - pivot = pivot.fillna(0).astype(float) - if pretty: - return pivot.replace(0, "") - return pivot - - if target == self.AT_MAX: - pivot = df.pivot_table( - index="tknb", columns="tknq", values="p", aggfunc=np.max - ) - pivot = pivot.fillna(0).astype(float) - if pretty: - return pivot.replace(0, "") - return pivot - - if target == self.AT_MIN: - pivot = df.pivot_table( - index="tknb", columns="tknq", values="p", aggfunc=np.min - ) - pivot = pivot.fillna(0).astype(float) - if pretty: - return pivot.replace(0, "") - return pivot - - if target == self.AT_SD: - pivot = df.pivot_table( - index="tknb", columns="tknq", values="p", aggfunc=np.std - ) - pivot = pivot.fillna(0).astype(float) - if pretty: - return pivot.replace(0, "") - return pivot - - if target == self.AT_SDPC: - pivot = df.pivot_table( - index="tknb", columns="tknq", values="p", aggfunc=AF.sdpc - ) - if pretty: - return pivot.replace(0, "") - return pivot - - if target == self.AT_PRICELIST: - pivot = df.pivot_table( - index=["tknb", "tknq", "cid"], - values=["primary", "pair", "pp", "p"], - aggfunc={ - "primary": AF.first, - "pair": AF.first, - "pp": "mean", - "p": "mean", - }, - ) - return pivot - - if target == self.AT_PRICELISTAGG: # AT_PLAGG - aggfs = [ - "mean", - "count", - AF.sdpc100, - min, - max, - AF.rangepc100, - AF.herfindahl, - ] - pivot = df.pivot_table( - index=["tknb", "tknq"], - values=["primary", "pair", "pp"], - aggfunc={"primary": AF.first, "pp": aggfs}, - ) - return pivot - - raise ValueError(f"unknown target {target}") - - def _convert(self, generator, *, asgenerator=None, ascc=None): - """takes a generator and returns a tuple, generator or CC object""" - if asgenerator is None: - asgenerator = False - if ascc is None: - ascc = True - if asgenerator: - return generator - if ascc: - return self.__class__(generator, tokenscale=self.tokenscale) - return tuple(generator) - - def curveix(self, curve): - """returns index of curve in container""" - return self.curveix_by_curve.get(curve, None) - - def bycid(self, cid): - """returns curve by cid""" - return self.curves_by_cid.get(cid, None) - - def bycids(self, include=None, *, endswith=None, exclude=None, asgenerator=None, ascc=None): - """ - returns curves by cids (as tuple, generator or CC object) - - :include: list of cids to include, if None all cids are included - :endswith: alternative to include, include all cids that end with this string - :exclude: list of cids to exclude, if None no cids are excluded - exclude beats include - :returns: tuple, generator or container object (default) - """ - if not include is None and not endswith is None: - raise ValueError(f"include and endswith cannot be used together") - if exclude is None: - exclude = set() - if include is None and endswith is None: - result = (c for c in self if not c.cid in exclude) - else: - if not include is None: - result = (self.curves_by_cid[cid] for cid in include if not cid in exclude) - else: - result = (c for c in self if c.cid.endswith(endswith) and not c.cid in exclude) - return self._convert(result, asgenerator=asgenerator, ascc=ascc) - - def bycid0(self, cid0, **kwargs): - """alias for bycids(endswith=cid0)""" - return self.bycids(endswith=cid0, **kwargs) - - def bypair(self, pair, *, directed=False, asgenerator=None, ascc=None): - """returns all curves by (possibly directed) pair (as tuple, genator or CC object)""" - result = (c for c in self if c.pair == pair) - if not directed: - pairr = "/".join(pair.split("/")[::-1]) - result = it.chain(result, (c for c in self if c.pair == pairr)) - return self._convert(result, asgenerator=asgenerator, ascc=ascc) - - def bp(self, pair, *, directed=False, asgenerator=None, ascc=None): - """alias for bypair by with directed=False for interactive use""" - return self.bypair(pair, directed=directed, asgenerator=asgenerator, ascc=ascc) - - def bypairs(self, pairs=None, *, directed=False, asgenerator=None, ascc=None): - """ - returns all curves by (possibly directed) pairs (as tuple, generator or CC object) - - :pairs: set, list or comma-separated string of pairs; if None all pairs are included - :directed: if True, pair direction is important (eg ETH/USDC will not return USDC/ETH - pairs); if False, pair direction is ignored and both will be returned - :returns: tuple, generator or container object (default) - """ - if isinstance(pairs, str): - pairs = set(pairs.split(",")) - if pairs is None: - result = (c for c in self) - else: - pairs = set(pairs) - if not directed: - rpairs = set(f"{q}/{b}" for b, q in (p.split("/") for p in pairs)) - # print("[CC] bypairs: adding reverse pairs", rpairs) - pairs = pairs.union(rpairs) - result = (c for c in self if c.pair in pairs) - return self._convert(result, asgenerator=asgenerator, ascc=ascc) - - def byparams(self, *, _asgenerator=None, _ascc=None, _inv=False, **params): - """ - returns all curves by params (as tuple, generator or CC object) - - :_inv: if True, returns all curves that do NOT match the params - :params: keyword arguments in the form param=value - :returns: tuple, generator or container object (default) - """ - if not params: - raise ValueError(f"no params given {params}") - - params_t = tuple(params.items()) - if len(params_t) > 1: - raise NotImplementedError(f"currently only one param allowed {params}") - - pname, pvalue = params_t[0] - if _inv: - result = (c for c in self if c.P(pname) != pvalue) - else: - result = (c for c in self if c.P(pname) == pvalue) - return self._convert(result, asgenerator=_asgenerator, ascc=_ascc) - - def copy(self): - """returns a copy of the container""" - return self.bypairs(ascc=True) - - def bytknx(self, tknx, *, asgenerator=None, ascc=None): - """returns all curves by quote token tknx (tknq) (as tuple, generator or CC object)""" - result = (c for c in self if c.tknx == tknx) - return self._convert(result, asgenerator=asgenerator, ascc=ascc) - - bytknq = bytknx - - def bytknxs(self, tknxs=None, *, asgenerator=None, ascc=None): - """returns all curves by quote token tknx (tknq) (as tuple, generator or CC object)""" - if tknxs is None: - return self.curves - if isinstance(tknxs, str): - tknxs = set(t.strip() for t in tknxs.split(",")) - tknxs = set(tknxs) - result = (c for c in self if c.tknx in tknxs) - return self._convert(result, asgenerator=asgenerator, ascc=ascc) - - bytknxs = bytknxs - - def bytkny(self, tkny, *, asgenerator=None, ascc=None): - """returns all curves by base token tkny (tknb) (as tuple, generator or CC object)""" - result = (c for c in self if c.tkny == tkny) - return self._convert(result, asgenerator=asgenerator, ascc=ascc) - - bytknb = bytkny - - def bytknys(self, tknys=None, *, asgenerator=None, ascc=None): - """returns all curves by quote token tkny (tknb) (as tuple, generator or CC object)""" - if tknys is None: - return self.curves - if isinstance(tknys, str): - tknys = set(t.strip() for t in tknys.split(",")) - tknys = set(tknys) - result = (c for c in self if c.tkny in tknys) - return self._convert(result, asgenerator=asgenerator, ascc=ascc) - - bytknys = bytknys - - @staticmethod - def u(minx, maxx): - """helper: returns uniform random var""" - return random.uniform(minx, maxx) - - @staticmethod - def u1(): - """helper: returns uniform [0,1] random var""" - return random.uniform(0, 1) - - @dataclass - class xystatsd: - mean: any - minv: any - maxv: any - sdev: any - - def xystats(self, curves=None): - """calculates mean, min, max, stdev of x and y""" - if curves is None: - curves = self.curves - tknx = {c.tknq for c in curves} - tkny = {c.tknb for c in curves} - assert len(tknx) != 0 and len(tkny) != 0, f"no curves found {tknx} {tkny}" - assert ( - len(tknx) == 1 and len(tkny) == 1 - ), f"all curves must have same tknq and tknb {tknx} {tkny}" - x = [c.x for c in curves] - y = [c.y for c in curves] - return ( - self.xystatsd(np.mean(x), np.min(x), np.max(x), np.std(x)), - self.xystatsd(np.mean(y), np.min(y), np.max(y), np.std(y)), - ) - - PE_PAIR = "pair" - PE_CURVES = "curves" - PE_DATA = "data" - - def price_estimate( - self, *, tknq=None, tknb=None, pair=None, result=None, raiseonerror=True, verbose=False - ): - """ - calculates price estimate in the reference token as base token - - :tknq: quote token to calculate price for - :tknb: base token to calculate price for - :pair: alternative to tknq, tknb: pair to calculate price for - :raiseonerror: if True, raise exception if no price can be calculated - :result: what to return - :PE_PAIR: slashpair - :PE_CURVES: curves - :PE_DATA: prices, weights - :verbose: whether to print some progress - :returns: price (quote per base) - """ - assert tknq is not None and tknb is not None or pair is not None, ( - f"must specify tknq, tknb or pair [{tknq}, {tknb}, {pair}]" - ) - assert not (not tknb is None and not pair is None), f"must not specify both tknq, tknb and pair [{tknq}, {tknb}, {pair}]" - - if not pair is None: - tknb, tknq = pair.split("/") - if tknq == tknb: - return 1 - if result == self.PE_PAIR: - return f"{tknb}/{tknq}" - crvs = ( - c for c in self if not c.at_boundary and c.tknq == tknq and c.tknb == tknb - ) - rcrvs = ( - c for c in self if not c.at_boundary and c.tknb == tknq and c.tknq == tknb - ) - crvs = ((c, c.p, c.k) for c in crvs) - rcrvs = ((c, 1 / c.p, c.k) for c in rcrvs) - acurves = it.chain(crvs, rcrvs) - if result == self.PE_CURVES: - # return dict(curves=tuple(crvs), rcurves=tuple(rcrvs)) - return tuple(acurves) - data = tuple((r[1], sqrt(r[2])) for r in acurves) - if verbose: - print(f"[price_estimate] {tknq}/{tknb} {len(data)} curves") - if not len(data) > 0: - if raiseonerror: - raise ValueError(f"no curves found for {tknq}/{tknb}") - return None - prices, weights = zip(*data) - prices, weights = np.array(prices), np.array(weights) - if result == self.PE_DATA: - return prices, weights - return float(np.average(prices, weights=weights)) - - TRIANGTOKENS = f"{T.USDT}, {T.USDC}, {T.DAI}, {T.BNT}, {T.ETH}, {T.WBTC}" - - def price_estimates( - self, - *, - tknqs=None, - tknbs=None, - triangulate=True, - unwrapsingle=True, - pairs=False, - stopatfirst=True, - raiseonerror=True, - verbose=False, - ): - """ - calculates prices estimates in the reference token as base token - - :tknqs: list of quote tokens to calculate prices for - :tknbs: list of base tokens to calculate prices for - :triangulate: tokens used as intermediate token for triangulation; if True, a standard - token list is used; if None or False, no triangulation - :unwrapsingle: if there is only one quote token, a 1-d array is returned - :pairs: if True, returns the slashpairs instead of the prices - :raiseonerror: if True, raise exception if no price can be calculated - :stopatfirst: it True, stop at first triangulation match - :verbose: if True, print some progress - :return: np.array of prices (quote outer, base inner; quote per base) - """ - # NOTE: this code is relatively slow to compute, on the order of a few seconds - # for go through the entire token list; the likely reason is that it keeps reestablishing - # the CurveContainer objects whenever price_estimate is called; there may be a way to - # speed this up by smartly computing the container objects once and storing them - # in a dictionary the is then passed to price_estimate. - start_time = time.time() - assert not tknqs is None, "tknqs must be set" - assert not tknbs is None, "tknbs must be set" - if isinstance(tknqs, str): - tknqs = [t.strip() for t in tknqs.split(",")] - if isinstance(tknbs, str): - tknbs = [t.strip() for t in tknbs.split(",")] - if verbose: - print(f"[price_estimates] tknqs [{len(tknqs)}] = {tknqs} , tknbs [{len(tknbs)}] = {tknbs} ") - resulttp = self.PE_PAIR if pairs else None - result = np.array( - [ - [ - self.price_estimate(tknb=b, tknq=q, raiseonerror=False, result=resulttp, verbose=verbose) - for b in tknbs - ] - for q in tknqs - ] - ) - #print(f"[price_estimates] PAIRS [{time.time()-start_time:.2f}s]") - flattened = result.flatten() - nmissing = len([r for r in flattened if r is None]) - if verbose: - print(f"[price_estimates] pair estimates: {len(flattened)-nmissing} found, {nmissing} missing") - if nmissing > 0 and not triangulate: - print(f"[price_estimates] {nmissing} missing pairs may be triangulated, but triangulation disabled [{triangulate}]") - if nmissing == 0 and triangulate: - print(f"[price_estimates] no missing pairs, triangulation not needed") - - if triangulate and nmissing > 0: - if triangulate is True: - triangulate = self.TRIANGTOKENS - if isinstance(triangulate, str): - triangulate = [t.strip() for t in triangulate.split(",")] - if verbose: - print("[price_estimates] triangulation tokens", triangulate) - for ib, b in enumerate(tknbs): - #print(f"TOKENB={b:22} [{time.time()-start_time:.4f}s]") - for iq, q in enumerate(tknqs): - #print(f" TOKENQ={q:21} [{time.time()-start_time:.4f}s]") - if result[iq][ib] is None: - result1 = [] - for tkn in triangulate: - #print(f" TKN={tkn:23} [{time.time()-start_time:.4f}s]") - #print(f"[price_estimates] triangulating tknb={b} tknq={q} via {tkn}") - b_tkn = self.price_estimate(tknb=b, tknq=tkn, raiseonerror=False) - q_tkn = self.price_estimate(tknb=q, tknq=tkn, raiseonerror=False) - #print(f"[price_estimates] triangulating {b}/{tkn} = {b_tkn}, {q}/{tkn} = {q_tkn}") - if not b_tkn is None and not q_tkn is None: - if verbose: - print(f"[price_estimates] triangulated {b}/{q} via {tkn} [={b_tkn/q_tkn}]") - result1 += [b_tkn / q_tkn] - if stopatfirst: - #print(f"[price_estimates] stop at first") - break - # else: - # print(f"[price_estimates] continue {stopatfirst}") - result2 = np.mean(result1) if len(result1) > 0 else None - #print(f"[price_estimates] final result {b}/{q} = {result2} [{len(result1)}]") - result[iq][ib] = result2 - - flattened = result.flatten() - nmissing = len([r for r in flattened if r is None]) - if verbose: - if nmissing > 0: - missing = { - f"{b}/{q}" - for ib, b in enumerate(tknbs) - for iq, q in enumerate(tknqs) - if result[iq][ib] is None - } - print(f"[price_estimates] after triangulation {nmissing} missing", missing) - else: - print("[price_estimates] no missing pairs after triangulation") - if raiseonerror: - missing = { - f"{b}/{q}" - for ib, b in enumerate(tknbs) - for iq, q in enumerate(tknqs) - if result[iq][ib] is None - } - # print("[price_estimates] result", result) - if not len(missing) == 0: - raise ValueError(f"no price found for {len(missing)} pairs", missing, result) - - #print(f"[price_estimates] DONE [{time.time()-start_time:.2f}s]") - if unwrapsingle and len(tknqs) == 1: - result = result[0] - return result - - @dataclass - class TokenTableEntry: - """ - associates a single token with the curves on which they appear - """ - - x: list - y: list - - def __repr__(self): - return f"TTE(x={self.x}, y={self.y})" - - def __len__(self): - return len(self.x) + len(self.y) - - def tokentable(self, curves=None): - """returns dict associating tokens with the curves on which they appeay""" - - if curves is None: - curves = self.curves - - r = ( - ( - tkn, - self.TokenTableEntry( - x=[i for i, c in enumerate(curves) if c.tknb == tkn], - y=[i for i, c in enumerate(curves) if c.tknq == tkn], - ), - ) - for tkn in self.tkns() - ) - r = {r[0]: r[1] for r in r if len(r[1]) > 0} - return r - - Params = Params - PLOTPARAMS = Params( - printline="pair = {c.pairp}", # print line before plotting; {pair} is replaced - title="{c.pairp}", # plot title; {pair} and {c} are replaced - xlabel="{c.tknxp}", # x axis label; ditto - ylabel="{c.tknyp}", # y axis label; ditto - label="[{c.cid}-{p.exchange}]: p={c.p:.1f}, 1/p={pinv:.1f}, k={c.k:.1f}", # label for legend; ditto - marker="*", # marker for plot - plotf=dict( - color="lightgrey", linestyle="dotted" - ), # additional kwargs for plot of the _f_ull curve - plotr=dict(color="grey"), # ditto for the _r_ange - plotm=dict(), # dittto for the _m_arker - grid=True, # plot grid if True - legend=True, # plot legend if True - show=True, # finish with plt.show() if True - xlim=None, # x axis limits (as tuple) - ylim=None, # y axis limits (as tuple) - npoints=500, # number of points to plot - ) - - def plot(self, *, pairs=None, directed=False, curves=None, params=None): - """ - plots the curves in curvelist or all curves if None - - :pairs: list of pairs to plot - :curves: list of curves to plot - :directed: if True, only plot pairs provided; otherwise plot reverse pairs as well - :params: plot parameters, as params struct (see PLOTPARAMS) - """ - p = Params.construct(params, defaults=self.PLOTPARAMS.params) - - if pairs is None: - pairs = self.pairs() - - if isinstance(pairs, str): - pairs = [pairs] # necessary, lest we get a set of chars - - pairs = set(pairs) - - if not directed: - rpairs = set(f"{q}/{b}" for b, q in (p.split("/") for p in pairs)) - # print("[CC] plot: adding reverse pairs", rpairs) - pairs = pairs.union(rpairs) - - assert curves is None, "restricting curves not implemented yet" - - for pair in pairs: - # pairp = Pair.prettify_pair(pair) - curves = self.bypair(pair, directed=True, ascc=False) - # print("plot", pair, [c.pair for c in curves]) - if len(curves) == 0: - continue - if p.printline: - print(p.printline.format(c=curves[0], p=curves[0].params)) - statx, staty = self.xystats(curves) - #print(f"[CC::plot] stats x={statx}, y={staty}") - xr = np.linspace(0.0000001, statx.maxv * 1.2, int(p.npoints)) - for i, c in enumerate(curves): - # plotf is the full curve - plt.plot( - xr, [c.yfromx_f(x_, ignorebounds=True) for x_ in xr], **p.plotf - ) - # plotr is the curve with bounds - plt.plot(xr, [c.yfromx_f(x_) for x_ in xr], **p.plotr) - - plt.gca().set_prop_cycle(None) - for c in curves: - # plotm are the markers - label = ( - None - if not p.label - else p.label.format(c=c, p=AD(dct=c.params), pinv=1 / c.p) - ) - plt.plot(c.x, c.y, marker=p.marker, label=label, **p.plotm) - - plt.title(p.title.format(c=c, p=c.params)) - if p.xlim: - plt.xlim(p.xlim) - if p.ylim: - plt.ylim(p.ylim) - else: - plt.ylim((0, staty.maxv * 2)) - plt.xlabel(p.xlabel.format(c=c, p=c.params)) - plt.ylabel(p.ylabel.format(c=c, p=c.params)) - - if p.legend: - if isinstance(p.legend, dict): - plt.legend(**p.legend) - else: - plt.legend() - - if p.grid: - if isinstance(p.grid, dict): - plt.grid(**p.grid) - else: - plt.grid(True) - - if p.show: - if isinstance(p.show, dict): - plt.show(**p.show) - else: - plt.show() - - def format(self, *, heading=True, formatid=None): - """ - returns the results in the given (printable) format - - see help(CurveContainer.print_formatted) for details - """ - assert len(self.curves) > 0, "no curves to print" - s = "\n".join(c.format(formatid=formatid) for c in self.curves) - if heading: - s = f"{self.curves[0].format(heading=True, formatid=formatid)}\n{s}" - return s - - diff --git a/fastlane_bot/tools/testing.py b/fastlane_bot/tools/testing.py deleted file mode 100644 index 1b4e1d625..000000000 --- a/fastlane_bot/tools/testing.py +++ /dev/null @@ -1,177 +0,0 @@ -""" -Testing utilities for the fastlane_bot package - -USAGE - - from fastlane_bot.testing import * - -NOTE: this class is not part of the API of the Carbon protocol, and you must expect breaking -changes even in minor version updates. Use at your own risk. - ---- -(c) Copyright Bprotocol foundation 2023. -Licensed under MIT -""" -__VERSION__ = "1.3" -__DATE__ = "15/Jan/2024" - -import math as m -import numpy as np -import pandas as pd -from matplotlib import pyplot as plt -import os -import sys -from decimal import Decimal -import time -from itertools import zip_longest - - -def iseq(arg0, *args, eps=1e-6): - """checks whether all arguments are equal to arg0, within tolerance eps if numeric""" - if not args: - raise ValueError("Must provide at least one arg", args) - try: - arg0+1 - isnumeric = True - except: - isnumeric = False - #if isinstance(arg0, int) or isinstance(arg0, float): - if isnumeric: - # numeric testing - if arg0 == 0: - for arg in args: - if abs(arg) > eps: - return False - return True - for arg in args: - if abs(arg/arg0-1) > eps: - return False - return True - else: - for arg in args: - if not arg == arg0: - return False - return True - -def raises(func, *args, **kwargs): - """ - returns exception message if func(*args, **kwargs) raises, else False - - USAGE - - assert raises(func, 1, 3, three=3), "func(1, 2, three=3) should raise" - """ - try: - func(*args, **kwargs) - return False - except Exception as e: - return str(e) - - -import re as _re - -class VersionRequirementNotMetError(RuntimeError): pass - -def _split_version_str(vstr): - """splits version mumber string into tuple (int, int, int, ...)""" - m = _re.match(r"^([0-9\.]*)", vstr.strip()) - if m is None: - raise ValueError("Invalid version number string", vstr) - vlst = tuple(int(x) for x in m.group(0).split(".")) - return vlst - -def require(required, actual, raiseonfail=True, printmsg=True): - """ - checks whether required version is smaller or equal actual version - - :required: the required version, eg "1.2.1" - :actual: the actual version, eg "1.3-beta2" - :raiseonfail: if True, raises VersionRequirementNotMetError if requirements are not met - :printmsg: if True, prints message - :returns: True if requirements are met, False else* - - *note: "1.3-beta1" MEETS the requirement "1.3"! - """ - rl, al = _split_version_str(required), _split_version_str(actual) - #print(f"required={rl}, actual={al}") - - result = _require_version(rl,al) - if printmsg: - m1 = "" if result else "NOT " - print(f"Version = {actual} [requirements >= {required} is {m1}met]") - if not raiseonfail: - return result - if not result: - raise VersionRequirementNotMetError(f"Version requirements not met (required = {rl}, actual = {al})", required, actual) - -def _require_version(rl, al): - """ - checks whether required version is smaller or equal actual version - - :rl: the required version eg (1,2,1) - :al: the actual version, eg (1,3) - :returns: True if requirements are met, False else* - """ - for r,a in zip_longest(rl, al, fillvalue=0): - #print(f"r={r}, a={a}") - if r > a: - return False - elif r < a: - return True - return True - -class Timer(): - """ - times functions calls; timer as arg, kwargs; timer1/2 have 1/2 args respectively - - - USAGE - Timer.t(func, *args, *kwargs, N=100_000) - Timer.t1(func, args, N=100_000) - Timer.t2(func, arg1, arg2, N=100_000) - - Note: the default value for N can be changed by using a derived class, eg: - - class MyTimer(Timer): - N = 1_000_000 - MyTimer.t(func, *args, *kwargs) - """ - N = 1_000_000 - - @classmethod - def timer(cls, func, *args, N=None, **kwargs): - """times the calls to func; func is called with args and kwargs; returns time in msec per 1m calls""" - if N is None: - N = cls.N - start_time = time.time() - for _ in range(N): - func(*args, **kwargs) - end_time = time.time() - return (end_time - start_time)/N*1_000_000*1000 - - @classmethod - def timer1(cls, func, arg, N=None): - """times the calls to func; func is called with arg; returns time in msec per 1m calls""" - if N is None: - N = cls.N - start_time = time.time() - for _ in range(N): - func(arg) - end_time = time.time() - return (end_time - start_time)/N*1_000_000*1000 - - @classmethod - def timer2(cls, func, arg1, arg2, N=None): - """times the calls to func; func is called with arg1, arg2; returns time in msec per 1m calls""" - if N is None: - N = cls.N - start_time = time.time() - for _ in range(N): - func(arg1, arg2) - end_time = time.time() - return (end_time - start_time)/N*1_000_000*1000 -timer = Timer.timer -timer1 = Timer.timer1 -timer2 = Timer.timer2 - -print("imported m, np, pd, plt, os, sys, decimal; defined iseq, raises, require, Timer") diff --git a/poetry.lock b/poetry.lock index 4a524f1b8..a7f425b2b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,87 +2,87 @@ [[package]] name = "aiohttp" -version = "3.9.3" +version = "3.9.5" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:939677b61f9d72a4fa2a042a5eee2a99a24001a67c13da113b2e30396567db54"}, - {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f5cd333fcf7590a18334c90f8c9147c837a6ec8a178e88d90a9b96ea03194cc"}, - {file = "aiohttp-3.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82e6aa28dd46374f72093eda8bcd142f7771ee1eb9d1e223ff0fa7177a96b4a5"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f56455b0c2c7cc3b0c584815264461d07b177f903a04481dfc33e08a89f0c26b"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bca77a198bb6e69795ef2f09a5f4c12758487f83f33d63acde5f0d4919815768"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e083c285857b78ee21a96ba1eb1b5339733c3563f72980728ca2b08b53826ca5"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab40e6251c3873d86ea9b30a1ac6d7478c09277b32e14745d0d3c6e76e3c7e29"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df822ee7feaaeffb99c1a9e5e608800bd8eda6e5f18f5cfb0dc7eeb2eaa6bbec"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:acef0899fea7492145d2bbaaaec7b345c87753168589cc7faf0afec9afe9b747"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cd73265a9e5ea618014802ab01babf1940cecb90c9762d8b9e7d2cc1e1969ec6"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a78ed8a53a1221393d9637c01870248a6f4ea5b214a59a92a36f18151739452c"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6b0e029353361f1746bac2e4cc19b32f972ec03f0f943b390c4ab3371840aabf"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7cf5c9458e1e90e3c390c2639f1017a0379a99a94fdfad3a1fd966a2874bba52"}, - {file = "aiohttp-3.9.3-cp310-cp310-win32.whl", hash = "sha256:3e59c23c52765951b69ec45ddbbc9403a8761ee6f57253250c6e1536cacc758b"}, - {file = "aiohttp-3.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:055ce4f74b82551678291473f66dc9fb9048a50d8324278751926ff0ae7715e5"}, - {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6b88f9386ff1ad91ace19d2a1c0225896e28815ee09fc6a8932fded8cda97c3d"}, - {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c46956ed82961e31557b6857a5ca153c67e5476972e5f7190015018760938da2"}, - {file = "aiohttp-3.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:07b837ef0d2f252f96009e9b8435ec1fef68ef8b1461933253d318748ec1acdc"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad46e6f620574b3b4801c68255492e0159d1712271cc99d8bdf35f2043ec266"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ed3e046ea7b14938112ccd53d91c1539af3e6679b222f9469981e3dac7ba1ce"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:039df344b45ae0b34ac885ab5b53940b174530d4dd8a14ed8b0e2155b9dddccb"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7943c414d3a8d9235f5f15c22ace69787c140c80b718dcd57caaade95f7cd93b"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84871a243359bb42c12728f04d181a389718710129b36b6aad0fc4655a7647d4"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5eafe2c065df5401ba06821b9a054d9cb2848867f3c59801b5d07a0be3a380ae"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9d3c9b50f19704552f23b4eaea1fc082fdd82c63429a6506446cbd8737823da3"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:f033d80bc6283092613882dfe40419c6a6a1527e04fc69350e87a9df02bbc283"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2c895a656dd7e061b2fd6bb77d971cc38f2afc277229ce7dd3552de8313a483e"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1f5a71d25cd8106eab05f8704cd9167b6e5187bcdf8f090a66c6d88b634802b4"}, - {file = "aiohttp-3.9.3-cp311-cp311-win32.whl", hash = "sha256:50fca156d718f8ced687a373f9e140c1bb765ca16e3d6f4fe116e3df7c05b2c5"}, - {file = "aiohttp-3.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:5fe9ce6c09668063b8447f85d43b8d1c4e5d3d7e92c63173e6180b2ac5d46dd8"}, - {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:38a19bc3b686ad55804ae931012f78f7a534cce165d089a2059f658f6c91fa60"}, - {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:770d015888c2a598b377bd2f663adfd947d78c0124cfe7b959e1ef39f5b13869"}, - {file = "aiohttp-3.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee43080e75fc92bf36219926c8e6de497f9b247301bbf88c5c7593d931426679"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52df73f14ed99cee84865b95a3d9e044f226320a87af208f068ecc33e0c35b96"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc9b311743a78043b26ffaeeb9715dc360335e5517832f5a8e339f8a43581e4d"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b955ed993491f1a5da7f92e98d5dad3c1e14dc175f74517c4e610b1f2456fb11"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:504b6981675ace64c28bf4a05a508af5cde526e36492c98916127f5a02354d53"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6fe5571784af92b6bc2fda8d1925cccdf24642d49546d3144948a6a1ed58ca5"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ba39e9c8627edc56544c8628cc180d88605df3892beeb2b94c9bc857774848ca"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e5e46b578c0e9db71d04c4b506a2121c0cb371dd89af17a0586ff6769d4c58c1"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:938a9653e1e0c592053f815f7028e41a3062e902095e5a7dc84617c87267ebd5"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:c3452ea726c76e92f3b9fae4b34a151981a9ec0a4847a627c43d71a15ac32aa6"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff30218887e62209942f91ac1be902cc80cddb86bf00fbc6783b7a43b2bea26f"}, - {file = "aiohttp-3.9.3-cp312-cp312-win32.whl", hash = "sha256:38f307b41e0bea3294a9a2a87833191e4bcf89bb0365e83a8be3a58b31fb7f38"}, - {file = "aiohttp-3.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:b791a3143681a520c0a17e26ae7465f1b6f99461a28019d1a2f425236e6eedb5"}, - {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ed621426d961df79aa3b963ac7af0d40392956ffa9be022024cd16297b30c8c"}, - {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7f46acd6a194287b7e41e87957bfe2ad1ad88318d447caf5b090012f2c5bb528"}, - {file = "aiohttp-3.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feeb18a801aacb098220e2c3eea59a512362eb408d4afd0c242044c33ad6d542"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f734e38fd8666f53da904c52a23ce517f1b07722118d750405af7e4123933511"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b40670ec7e2156d8e57f70aec34a7216407848dfe6c693ef131ddf6e76feb672"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdd215b7b7fd4a53994f238d0f46b7ba4ac4c0adb12452beee724ddd0743ae5d"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:017a21b0df49039c8f46ca0971b3a7fdc1f56741ab1240cb90ca408049766168"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99abf0bba688259a496f966211c49a514e65afa9b3073a1fcee08856e04425b"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:648056db9a9fa565d3fa851880f99f45e3f9a771dd3ff3bb0c048ea83fb28194"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8aacb477dc26797ee089721536a292a664846489c49d3ef9725f992449eda5a8"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:522a11c934ea660ff8953eda090dcd2154d367dec1ae3c540aff9f8a5c109ab4"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5bce0dc147ca85caa5d33debc4f4d65e8e8b5c97c7f9f660f215fa74fc49a321"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b4af9f25b49a7be47c0972139e59ec0e8285c371049df1a63b6ca81fdd216a2"}, - {file = "aiohttp-3.9.3-cp38-cp38-win32.whl", hash = "sha256:298abd678033b8571995650ccee753d9458dfa0377be4dba91e4491da3f2be63"}, - {file = "aiohttp-3.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:69361bfdca5468c0488d7017b9b1e5ce769d40b46a9f4a2eed26b78619e9396c"}, - {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0fa43c32d1643f518491d9d3a730f85f5bbaedcbd7fbcae27435bb8b7a061b29"}, - {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:835a55b7ca49468aaaac0b217092dfdff370e6c215c9224c52f30daaa735c1c1"}, - {file = "aiohttp-3.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06a9b2c8837d9a94fae16c6223acc14b4dfdff216ab9b7202e07a9a09541168f"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abf151955990d23f84205286938796c55ff11bbfb4ccfada8c9c83ae6b3c89a3"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59c26c95975f26e662ca78fdf543d4eeaef70e533a672b4113dd888bd2423caa"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f95511dd5d0e05fd9728bac4096319f80615aaef4acbecb35a990afebe953b0e"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:595f105710293e76b9dc09f52e0dd896bd064a79346234b521f6b968ffdd8e58"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7c8b816c2b5af5c8a436df44ca08258fc1a13b449393a91484225fcb7545533"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f1088fa100bf46e7b398ffd9904f4808a0612e1d966b4aa43baa535d1b6341eb"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f59dfe57bb1ec82ac0698ebfcdb7bcd0e99c255bd637ff613760d5f33e7c81b3"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:361a1026c9dd4aba0109e4040e2aecf9884f5cfe1b1b1bd3d09419c205e2e53d"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:363afe77cfcbe3a36353d8ea133e904b108feea505aa4792dad6585a8192c55a"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e2c45c208c62e955e8256949eb225bd8b66a4c9b6865729a786f2aa79b72e9d"}, - {file = "aiohttp-3.9.3-cp39-cp39-win32.whl", hash = "sha256:f7217af2e14da0856e082e96ff637f14ae45c10a5714b63c77f26d8884cf1051"}, - {file = "aiohttp-3.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:27468897f628c627230dba07ec65dc8d0db566923c48f29e084ce382119802bc"}, - {file = "aiohttp-3.9.3.tar.gz", hash = "sha256:90842933e5d1ff760fae6caca4b2b3edba53ba8f4b71e95dacf2818a2aca06f7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, + {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, + {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, + {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, + {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, + {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, ] [package.dependencies] @@ -137,6 +137,7 @@ files = [] develop = false [package.dependencies] +cvxpy = "^1.3.1" matplotlib = "^3.7.1" networkx = "^3.0" pandas = "^1.5.2" @@ -439,95 +440,96 @@ files = [ [[package]] name = "ckzg" -version = "1.0.0" +version = "1.0.1" description = "Python bindings for C-KZG-4844" optional = false python-versions = "*" files = [ - {file = "ckzg-1.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f40731759b608d74b240fe776853b7b081100d8fc06ac35e22fd0db760b7bcaa"}, - {file = "ckzg-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8b5d08189ffda2f869711c4149dc41012f73656bc20606f69b174d15488f6ed1"}, - {file = "ckzg-1.0.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c37af3d01a4b0c3f0a4f51cd0b85df44e30d3686f90c2a7cc84530e4e9d7a00e"}, - {file = "ckzg-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1272db9cf5cdd6f564b3de48dae4646d9e04aa10432c0f278ca7c752cf6a333c"}, - {file = "ckzg-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5a464900627b66848f4187dd415bea5edf78f3918927bd27461749e75730459"}, - {file = "ckzg-1.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e1d4abc0d58cb04678915ef7c4236834e58774ef692194b9bca15f837a0aaff8"}, - {file = "ckzg-1.0.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9205a6ea38c5e030f6f719b8f8ea6207423378e0339d45db81c946a0818d0f31"}, - {file = "ckzg-1.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9d8c45cd427f34682add5715360b358ffc2cbd9533372470eae12cbb74960042"}, - {file = "ckzg-1.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:91868e2aa17497ea864bb9408269176d961ba56d89543af292556549b18a03b7"}, - {file = "ckzg-1.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cffc3a23ccc967fd7993a9839aa0c133579bfcfd9f124c1ad8916a21c40ed594"}, - {file = "ckzg-1.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9936e5adf2030fc2747aaadc0cbfee6b5a06507e2b74e70998ac4e37cd7203a6"}, - {file = "ckzg-1.0.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a8d97acb5f84cf2c4db0c962ce3aefa2819b10c5b6b9dccf55e83f2a999676"}, - {file = "ckzg-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a49bd5dcf288a40df063f7ebd88476fa96a5d22dcbafc843193964993f36e26"}, - {file = "ckzg-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1495b5bb9016160a71d5f2727b935cb532d5578b7d29b280f0531b50c5ef1ee"}, - {file = "ckzg-1.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ad39d0549237d136e32263a71182833e26fab8fe8ab62db4d6161b9a7f74623e"}, - {file = "ckzg-1.0.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d5a838b4de4cc0b01a84531a115cf19aa508049c20256e493a2cca98cf806e3e"}, - {file = "ckzg-1.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dfadf8aab3f5a9a94796ba2b688f3679d1d681afe92dfa223da7d4f751fe487d"}, - {file = "ckzg-1.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:6aff64ce8eae856bb5684c76f8e07d4ac31ff07ad46a24bf62c9ea2104975bc9"}, - {file = "ckzg-1.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7b1eed4e35a3fb35f867770eee12018098bd261fa66b768f75b343e0198ff258"}, - {file = "ckzg-1.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3d7f609e943880303ea3f60b0426c9b53a596c74bb09ceed00c917618b519373"}, - {file = "ckzg-1.0.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f8c422673236ea67608c434956181b050039b2f57b1006503eeec574b1af8467"}, - {file = "ckzg-1.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9321226e65868e66edbe18301b8f76f3298d316e6d3a1261371c7fdbc913816"}, - {file = "ckzg-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f6fd5bc8c2362483c61adbd00188f7448c968807f00ee067666355c63cf45e0"}, - {file = "ckzg-1.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:be79e3c4a735f5bf4c71cc07a89500448555f2d4f4f765da5867194c7e46ec5c"}, - {file = "ckzg-1.0.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2896c108425b64f6b741cc389beee2b8467a41f8d4f901f4a4ecc037311dc681"}, - {file = "ckzg-1.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fd3f0db4cf514054c386d1a38f9a144725b5109379dd9d2c1b4b0736119f848e"}, - {file = "ckzg-1.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:7a864097cb88be5b7aeff6103bf03d7dfb1c6dda6c8ef82378838ce32e158a15"}, - {file = "ckzg-1.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0404db8ded404b36617d60d678d5671652798952571ae4993d4d379ef6563f4f"}, - {file = "ckzg-1.0.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3aee88b228a9ca81d677d57d8d3f6ee483165d8b3955ea408bda674d0f9b4ee5"}, - {file = "ckzg-1.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef6b4d15188803602afc56e113fc588617219a6316789766fc95e0fa010a93ab"}, - {file = "ckzg-1.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ae6d24e83af8c097b62fdc2183378b9f2d8253fa14ccfc07d075a579f98d876"}, - {file = "ckzg-1.0.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8facda4eafc451bb5f6019a2b779f1b6da7f91322aef0eab1f1d9f542220de1c"}, - {file = "ckzg-1.0.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:4f552fa3b654bc376fcb73e975d521eacff324dba111fa2f0c80c84ad586a0b1"}, - {file = "ckzg-1.0.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:851b7eaca0034b51b6867623b0fae2260466126d8fc669646890464812afd932"}, - {file = "ckzg-1.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:df63d78d9a3d1ffcf32ccb262512c780de42798543affc1209f6fd0cddac49b4"}, - {file = "ckzg-1.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3aefd29f6d339358904ed88e5a642e5bf338fd85151a982a040d4352ae95e53f"}, - {file = "ckzg-1.0.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f2bbbcd24f5ac7f29a0f3f3f51d8934764f5d579e63601a415ace4dad0c2785"}, - {file = "ckzg-1.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ed54765a3067f20786a0c6ee24a8440cfedfe39c5865744c99f605e6ec4249"}, - {file = "ckzg-1.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5101500009a8851843b5aab44bc320b281cfe46ffbbab35f29fa763dc2ac4a2"}, - {file = "ckzg-1.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a35e0f027749a131a5086dcb3f094ec424280cdf7708c24e0c45421a0e9bebf"}, - {file = "ckzg-1.0.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:71860eda6019cc57b197037427ad4078466de232a768fa7c77c7094585689a8d"}, - {file = "ckzg-1.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87729a2e861093d9ee4667dcf047a0073644da7f9de5b9c269821e3c9c3f7164"}, - {file = "ckzg-1.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1d1bd47cfa82f92f14ec77fffee6480b03144f414861fc6664190e89d3aa542d"}, - {file = "ckzg-1.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4644e6e0d66d4a36dc37c2ef64807d1db39bf76b10a933b2f7fbb0b4ee9d991"}, - {file = "ckzg-1.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:96d88c6ea2fd49ecfa16767d05a2d056f1bd1a42b0cf10ab99fb4f88fefab5d7"}, - {file = "ckzg-1.0.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c921b9172aa155ede173abe9d3495c04a55b1afde317339443451e889b531891"}, - {file = "ckzg-1.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a09cce801a20929d49337bd0f1df6d079d5a2ebaa58f58ab8649c706485c759"}, - {file = "ckzg-1.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a02d21ceda0c3bec82342f050de5b22eb4a928be00913fa8992ab0f717095f8"}, - {file = "ckzg-1.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bf751e989a428be569e27010c98192451af4c729d5c27a6e0132647fe93b6e84"}, - {file = "ckzg-1.0.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:37192e9fcbced22e64cd00785ea082bd22254ce7d9cfdfd5364683bea8e1d043"}, - {file = "ckzg-1.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:54808ba5b3692ff31713de6d57c30c21060f11916d2e233f5554fcc85790fcda"}, - {file = "ckzg-1.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:d3b343a4a26d5994bdb39216f5b03bf2345bb6e37ae90fcf7181df37c244217a"}, - {file = "ckzg-1.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:481dfd101acc8a473146b35e61c11cee2ef41210b77775f306c4f1f7f8bdbf28"}, - {file = "ckzg-1.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bd392f3ae05a851f9aa1fc114b565cb7e6744cec39790af56af2adf9dd400f3d"}, - {file = "ckzg-1.0.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2ca50b9d0e947d3b5530dacf25cc00391d041e861751c4872eba4a4567a2efe"}, - {file = "ckzg-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91dafec4f72e30176fb9861d0e2ed46cd506f6837ed70066f2136378f5cd84df"}, - {file = "ckzg-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c72b07d5cac293d7e49a5510d56163f18cdbf9c7a6c6446422964d5667097c2"}, - {file = "ckzg-1.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:67144d1b545cdd6cb5af38ed2c03b234a24f72b6021ea095b70f0cfe11181bd6"}, - {file = "ckzg-1.0.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43935d730a9ee13ca264455356bdd01055c55c241508f5682d67265379b29dcf"}, - {file = "ckzg-1.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5911419a785c732f0f5edcda89ecc489e7880191b8c0147f629025cb910f913"}, - {file = "ckzg-1.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:8a00c295c5657162c24b162ca9a030fbfbc6930e0782378ce3e3d64b14cf470e"}, - {file = "ckzg-1.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8d272107d63500ba9c62adef39f01835390ee467c2583fd96c78f05773d87b0d"}, - {file = "ckzg-1.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:52bfcad99cc0f5611c3a7e452de4d7fa66ce020327c1c1de425b84b20794687b"}, - {file = "ckzg-1.0.0-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ae70915d41702d33775d9b81c106b2bff5aa7981f82b06e0c5892daa921ff55"}, - {file = "ckzg-1.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5deaae9151215d1fad3934fa423a87ee752345f665448a30f58bf5c3177c4623"}, - {file = "ckzg-1.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f7e8861174fe26e6bb0f13655aa1f07fd7c3300852748b0f6e47b998153b56b"}, - {file = "ckzg-1.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dc6c211e16ef7750b2579346eaa05e4f1e7f1726effa55c2cb42354603800b01"}, - {file = "ckzg-1.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d392ef8281f306a0377f4e5fe816e03e4dce2754a4b2ab209b16d9628b7a0bac"}, - {file = "ckzg-1.0.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52cbe279f5d3ec9dd7745de8e796383ba201302606edaa9838b5dd5a34218241"}, - {file = "ckzg-1.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a5d3367cee7ebb48131acc78ca3fb0565e3af3fd8fa8eb4ca25bb88577692c4"}, - {file = "ckzg-1.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55e8c6d8df9dc1bdd3862114e239c292f9bdd92d67055ca4e0e7503826e6524f"}, - {file = "ckzg-1.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b040396df453b51cd5f1461bec9b942173b95ca181c7f65caa10c0204cb6144a"}, - {file = "ckzg-1.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7951c53321136aabdab64dc389c92ffeda5859d59304b97092e893a6b09e9722"}, - {file = "ckzg-1.0.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:56256067d31eb6eed1a42c9f3038936aeb7decee322aa13a3224b51cfa3e8026"}, - {file = "ckzg-1.0.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c166f254ce3434dd0d56ef64788fc9637d60721f4e7e126b15a847abb9a44962"}, - {file = "ckzg-1.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab02c7ad64fb8616a430b05ad2f8fa4f3fc0a22e3dd4ea7a5d5fa4362534bb21"}, - {file = "ckzg-1.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63bb5e6bc4822c732270c70ef12522b0215775ff61cae04fb54983973aef32e3"}, - {file = "ckzg-1.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:409f1f18dbc92df5ddbf1ff0d154dc2280a495ec929a4fa27abc69eeacf31ff0"}, - {file = "ckzg-1.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2eceae0ef7189d47bd89fd9efd9d8f54c5b06bc92c435ec00c62815363cd9d79"}, - {file = "ckzg-1.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e189c00a0030d1a593b020264d7f9b30fa0b980d108923f353c565c206a99147"}, - {file = "ckzg-1.0.0-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36735543ce3aec4730e7128690265ef90781d28e9b56c039c72b6b2ce9b06839"}, - {file = "ckzg-1.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fef5f276e24f4bdd19e28ddcc5212e9b6c8514d3c7426bd443c9221f348c176f"}, - {file = "ckzg-1.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d02164a0d84e55965c14132f6d43cc367be3d12eb318f79ba2f262dac47665c2"}, - {file = "ckzg-1.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:88fafab3493a12d5212374889783352bb4b59dddc9e61c86d063358eff6da7bb"}, + {file = "ckzg-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:061c2c282d74f711fa62425c35be62188fdd20acca4a5eb2b988c7d6fd756412"}, + {file = "ckzg-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a61bd0a3ed521bef3c60e97ba26419d9c77517ce5d31995cde50808455788a0e"}, + {file = "ckzg-1.0.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73f0a70ff967c9783b126ff19f1af578ede241199a07c2f81b728cbf5a985590"}, + {file = "ckzg-1.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8184550ccb9b434ba18444fee9f446ce04e187298c0d52e6f007d0dd8d795f9f"}, + {file = "ckzg-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb2b144e3af0b0e0757af2c794dc68831216a7ad6a546201465106902e27a168"}, + {file = "ckzg-1.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ed016c4604426f797eef4002a72140b263cd617248da91840e267057d0166db3"}, + {file = "ckzg-1.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:07b0e5c317bdd474da6ebedb505926fb10afc49bc5ae438921259398753e0a5b"}, + {file = "ckzg-1.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:179ef0e1d2019eef9d144b6f2ad68bb12603fd98c8a5a0a94115327b8d783146"}, + {file = "ckzg-1.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:f82cc4ec0ac1061267c08fdc07e1a9cf72e8e698498e315dcb3b31e7d5151ce4"}, + {file = "ckzg-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f465b674cdb40f44248501ec4c01d38d1cc01a637550a43b7b6b32636f395daa"}, + {file = "ckzg-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d15fe7db9487496ca5d5d9d92e069f7a69d5044e14aebccf21a8082c3388784d"}, + {file = "ckzg-1.0.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efdf2dfb7017688e151154c301e1fd8604311ddbcfc9cb898a80012a05615ced"}, + {file = "ckzg-1.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7818f2f86dd4fb02ab73b9a8b1bb72b24beed77b2c3987b0f56edc0b3239eb0"}, + {file = "ckzg-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb32f3f7db41c32e5a3acf47ddec77a529b031bd69c1121595e51321477b7da"}, + {file = "ckzg-1.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1300f0eedc57031f2277e54efd92a284373fb9baa82b846d2680793f3b0ce4cd"}, + {file = "ckzg-1.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d8bc93a0b84888ad17ae818ea8c8264a93f2af573de41a999a3b0958b636ab1d"}, + {file = "ckzg-1.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3ba82d321e3350beacf36cf0ae692dd021b77642e9a184ab58349c21db4e09d2"}, + {file = "ckzg-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:844233a223c87f1fd47caee11c276ea370c11eb5a89ad1925c0ed50930341b51"}, + {file = "ckzg-1.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:64af945ad8582adb42b3b00a3bebe4c1953a06a8ce92a221d0575170848fd653"}, + {file = "ckzg-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f7550b78e9f569c4f97a39c0ff437836c3878c93f64a83fa75e0f5998c19ccba"}, + {file = "ckzg-1.0.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2958b3d495e6cb64e8fb55d44023f155eb07b43c5eebee9f29eedf5e262b84fc"}, + {file = "ckzg-1.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a06035732d834a0629f5c23b06906326fe3c4e0660120efec5889d0dacbc26c1"}, + {file = "ckzg-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17206a1ed383cea5b6f3518f2b242c9031ca73c07471a85476848d02663e4a11"}, + {file = "ckzg-1.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0c5323e8c7f477ffd94074b28ccde68dac4bab991cc360ec9c1eb0f147dd564e"}, + {file = "ckzg-1.0.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8acce33a1c7b005cfa37207ac70a9bcfb19238568093ef2fda8a182bc556cd6e"}, + {file = "ckzg-1.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:06ecf4fa1a9262cb7535b55a9590ce74bda158e2e8fc8c541823aecb978524cc"}, + {file = "ckzg-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:17aa0f9a1131302947cd828e245237e545c36c66acf7e413586d6cb51c826bdc"}, + {file = "ckzg-1.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:52b1954799e912f73201eb013e597f3e526ab4b38d99b7700035f18f818bccfd"}, + {file = "ckzg-1.0.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:394ef239a19ef896bf433778cd3153d9b992747c24155aabe9ff2005f3fb8c32"}, + {file = "ckzg-1.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2116d4b21b93e4067ff5df3b328112e48cbadefb00a21d3bb490355bb416acb0"}, + {file = "ckzg-1.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4b0d0d527725fa7f4b9abffbfe6233eb681d1279ece8f3b40920b0d0e29e5d3"}, + {file = "ckzg-1.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8c7d27941e7082b92448684cab9d24b4f50df8807680396ca598770ea646520a"}, + {file = "ckzg-1.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:f5a1a1f58b010b8d53e5337bbd01b4c0ac8ad2c34b89631a3de8f3aa8a714388"}, + {file = "ckzg-1.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:f4bcae2a8d849ce6439abea0389d9184dc0a9c8ab5f88d7947e1b65434912406"}, + {file = "ckzg-1.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:bd415f5e5a0ecf5157a16ee6390122170816bff4f72cb97428c514c3fce94f40"}, + {file = "ckzg-1.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5f2c3c289ba83834e7e9727c260ef4ae5e4aff389945b498034454ef1e0d2b27"}, + {file = "ckzg-1.0.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9a2d01cbbb9106a23f4c23275015a1ca041379a385e84d21bad789fe493eb35"}, + {file = "ckzg-1.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef7a743fbf10663bf54e4fa7a63f986c163770bd2d14423ba255d91c65ceae2b"}, + {file = "ckzg-1.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e967482a04edcabecf6dbad04f1ef9ea9d5142a08f4001177f9149ce0e2ae81"}, + {file = "ckzg-1.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9fc1196a44de1fccc4c275af70133cebce5ff16b1442b9989e162e3ae4534be3"}, + {file = "ckzg-1.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:62c5e0f1b31c8e9eb7b8db05c4ae14310acf41deb5909ac1e72d7a799ca61d13"}, + {file = "ckzg-1.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4361ee4bc719d375d50e13de399976d42e13b1d7084defbd8914d7943cbc1b04"}, + {file = "ckzg-1.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:1c284dddc6a9269a3916b0654236aa5e713d2266bd119457e33d7b37c2416bbb"}, + {file = "ckzg-1.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:32e03048be386d262d71ddeb2dcc5e9aeca1de23126f5566d6a445e59f912d25"}, + {file = "ckzg-1.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:543c154c0d56a5c348d2b17e5b9925c38378d8d0dbb830fb6a894c622c86da7b"}, + {file = "ckzg-1.0.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f58595cdbfcbb9c4fce36171688e56c4bdb804e7724c6c41ec71278042bf50a"}, + {file = "ckzg-1.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fb1bacf6f8d1419dc26f3b6185e377a8a357707468d0ca96d1ca2a847a2df68"}, + {file = "ckzg-1.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:976b9347ae15b52948eed8891a4f94ff46faa4d7c5e5746780d41069da8a6fe5"}, + {file = "ckzg-1.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8b809e5f1806583f53c9f3ae6c2ae86e90551393015ec29cfcdedf3261d66251"}, + {file = "ckzg-1.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:53db1fa73aaeadeb085eea5bd55676226d7dcdef26c711a6219f7d3a89f229ae"}, + {file = "ckzg-1.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e9541dabc6c84b7fdfb305dab53e181c7c804943e92e8de2ff93ed1aa29f597f"}, + {file = "ckzg-1.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:79e7fa188b89ccf7c19b3c46f28961738dbf019580880b276fee3bc11fdfbb37"}, + {file = "ckzg-1.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:36e3864064f9f6ece4c79de70c9fc2d6de20cf4a6cc8527919494ab914fe9f04"}, + {file = "ckzg-1.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f8bd094d510425b7a8f05135b2784ab1e48e93cf9c61e21585e7245b713a872"}, + {file = "ckzg-1.0.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48ec2376c89be53eaafda436fb1bca086f44fc44aa9856f8f288c29aaa85c6ad"}, + {file = "ckzg-1.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f928d42bb856dacc15ad78d5adeb9922d088ec3aa8bb56249cccc2bdf8418966"}, + {file = "ckzg-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e320d567eca502bec2b64f12c48ce9c8566712c456f39c49414ba19e0f49f76b"}, + {file = "ckzg-1.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5844b792a621563230e9f1b15e2bf4733aff3c3e8f080843a12e6ba33ddd1b20"}, + {file = "ckzg-1.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:cd0fa7a7e792c24fb463f0bd41a65156413ec088276e61cf6d72e7be62812b2d"}, + {file = "ckzg-1.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b9d91e4f652fc1c648252cd305b6f247eaadba72f35d49b68376ae5f3ab2d9"}, + {file = "ckzg-1.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:622a801cf1fa5b4cb6619bfed279f5a9d45d59525513678343c64a79cb34f224"}, + {file = "ckzg-1.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a35342cc99afbbced9896588e74843f1e700a3161a4ef4a48a2ea8831831857"}, + {file = "ckzg-1.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a31e53b35a8233a0f152eee529fcfc25ab5af36db64d9984e9536f3f8399fdbf"}, + {file = "ckzg-1.0.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ab8407bf837a248fdda958bd4bba49be5b7be425883d1ee1abe9b6fef2967f8"}, + {file = "ckzg-1.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79cbc0eb43de4eca8b7dc8c736322830a33a77eeb8040cfa9ab2b9a6a0ca9856"}, + {file = "ckzg-1.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:730fbe18f174362f801373798bc71d1b9d337c2c9c7da3ec5d8470864f9ee5a7"}, + {file = "ckzg-1.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:898f21dadd1f6f27b1e329bde0b33ce68c5f61f9ae4ee6fb7088c9a7c1494227"}, + {file = "ckzg-1.0.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:91f1e7e5453f47e6562c022a7e541735ad20b667e662b981de4a17344c2187b3"}, + {file = "ckzg-1.0.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd31a799f0353d95b3ffcfca5627cd2437129458fbf327bce15761abe9c55a9e"}, + {file = "ckzg-1.0.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:208a61131984a3dab545d3360d006d11ab2f815669d1169a93d03a3cc56fd9ac"}, + {file = "ckzg-1.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d47cdd945c117784a063901b392dc9f4ec009812ced5d344cdcd1887eb573768"}, + {file = "ckzg-1.0.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:367227f187072b24c1bfd0e9e5305b9bf75ddf6a01755b96dde79653ef468787"}, + {file = "ckzg-1.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0b68147b7617f1a3f8044ed31671ff2e7186840d09a0a3b71bb56b8d20499f06"}, + {file = "ckzg-1.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b4b4cf32774f6b7f84e38b5fee8a0d69855279f42cf2bbd2056584d9ee3cbccd"}, + {file = "ckzg-1.0.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc100f52dc2c3e7016a36fa6232e4c63ef650dc1e4e198ca2da797d615bfec4f"}, + {file = "ckzg-1.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86a5a005518ca8c436a56602eb090d11857c03e44e4f7c8ae40cd9f1ad6eac1a"}, + {file = "ckzg-1.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb05bd0ee8fcc779ed6600276b81306e76f4150a6e01f70bee8fa661b990ab4f"}, + {file = "ckzg-1.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b9ddd4a32ecaa8806bfa0d43c41bd2471098f875eb6c28e5970a065e5a8f5d68"}, + {file = "ckzg-1.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2f015641c33f0617b2732c7e5db5e132a349d668b41f8685942c4506059f9905"}, + {file = "ckzg-1.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:83c3d2514439375925925f16624fa388fc532ef43ee3cd0868d5d54432cd47a8"}, + {file = "ckzg-1.0.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:789a65cebd3cf5b100b8957a9a9b207b13f47bfe60b74921a91c2c7f82883a05"}, + {file = "ckzg-1.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f640cc5211beaf3d9f4bbf7054d96cf3434069ac5baa9ac09827ccbe913733bb"}, + {file = "ckzg-1.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:436168fe6a3c901cc8b57f44116efcc33126e3b2220f6b0bb2cf5774ec4413a9"}, + {file = "ckzg-1.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d8c138e8f320e1b24febdef26f086b8b3a1a889c1eb4a933dea608eead347048"}, + {file = "ckzg-1.0.1.tar.gz", hash = "sha256:c114565de7d838d40ede39255f4477245824b42bde7b181a7ca1e8f5defad490"}, ] [[package]] @@ -697,32 +699,37 @@ test-no-images = ["pytest", "pytest-cov", "wurlitzer"] [[package]] name = "cvxpy" -version = "1.4.2" +version = "1.4.3" description = "A domain-specific language for modeling convex optimization problems in Python." optional = false python-versions = ">=3.8" files = [ - {file = "cvxpy-1.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:06231c0b2a65f7c8ba32c2772576c24e93e1ca964444b90c6bad366b9c0a5bdc"}, - {file = "cvxpy-1.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f257971b007261d53ec7f50618f0c6a511387dd7df6cd686d2647c3fa91da0eb"}, - {file = "cvxpy-1.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38c2191d4142baac206ac590ba9e5cb1c6e025ac95d0a746692c9cf8d1afd46e"}, - {file = "cvxpy-1.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9d006f76925127cd42b80e2d98c950a8339f8204b4c23fa25af83d895e95fa"}, - {file = "cvxpy-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:2a09ebd8f7a8b6b5d026d03295daee0780e2f6847fbe6f207e9764045ffbbfc9"}, - {file = "cvxpy-1.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:079fe6aeaeec2ddf6163ff8ca6510afd5c2b66ea391605791a77b51e534b935e"}, - {file = "cvxpy-1.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8419dffcadefc16e6fcbe8a088068c29edb1f28ea90582f075a96f21ae7ff11"}, - {file = "cvxpy-1.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6551ef3b325d707e98f920dd120ebaa968f3ac3484c21f8567f2081967d26f0"}, - {file = "cvxpy-1.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fea513f4bf83491a1c9e5366faa4ca9fc21ec9522c30bcd55e49de9bb85fe9a2"}, - {file = "cvxpy-1.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:78560a02607d16fbb26db6306e7ce6d8e4fcda49cf04578d199ac050c2e74daa"}, - {file = "cvxpy-1.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9817cf8da86641e2d322911844e86b8e7b1d93d9b2d57ae6d33e84be430e1e04"}, - {file = "cvxpy-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:32999d550a923c9448d973ef9d3ab75d73e1bdf56102fc32fe7ccb5e0cb5d7a3"}, - {file = "cvxpy-1.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213b465450f4254226e6c18c70e25e911ae2c60176621f1bc2d9a0eb874288db"}, - {file = "cvxpy-1.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec30efa81d1f79f668b0fa6e8ac654047db7a3e844ab16022e1b5dcf52177192"}, - {file = "cvxpy-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:779c19be964f7a586337fd4d017c7a0202bf845e08b04a174850f962b45b2a00"}, - {file = "cvxpy-1.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bb1d6af8406efa1de0408d0a76c248da3185cade49f45c443239772830b7d6bb"}, - {file = "cvxpy-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:63102885fdfd3eae716c042ee7aad9439d0b71ba22e5432c85f0e35056fcb159"}, - {file = "cvxpy-1.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20015b82117c0253ca803c4e174010067bda0eedb539503ba58b98e00acdd0f2"}, - {file = "cvxpy-1.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f73ff4f0e7bff1e438dc2b02490d7a8e1027c421057a7971b4ca4982c28d60"}, - {file = "cvxpy-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b7cfc6be34b288acade31b58a1e88b119487165d0ed877db9decf7fd676502f6"}, - {file = "cvxpy-1.4.2.tar.gz", hash = "sha256:0a386a5788dbd78b7b20dd071524ec636c8fa72b3628e69f1abc714c8f9811e5"}, + {file = "cvxpy-1.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f4dc744a6f38328b0511cd57cfd81a517c0568d3b6e994d6dda3f309a1ce47cf"}, + {file = "cvxpy-1.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c32199a26d889e74d70bc39f0369680cb7d2625e7c47c42483ca166d37122c2"}, + {file = "cvxpy-1.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a4fed75c1714409fd5125269935a68bc3f57c522623a5d7eab68623a19f3a6f"}, + {file = "cvxpy-1.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8198e390490a0543caad428fc0d8a5c0914052c22630277d00bfdc7a770c4b11"}, + {file = "cvxpy-1.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:bea83a4a829d7197c307badbbe2f05d6e7aed85ed63badd800b89534b33b38de"}, + {file = "cvxpy-1.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:443313eca702750a7a2878e841de23cc5111085f4069e842d027ebc5c98c10ac"}, + {file = "cvxpy-1.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9ae3d4ec202dc446206d8c6eae83353827842dc0e232f4e4f0d588fb2d59705a"}, + {file = "cvxpy-1.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f8ee4d0d1ecb2e09e41a31192ea103c7c1f626204925fb7f6590d11471cb357"}, + {file = "cvxpy-1.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeb6f60608d4716ced43105cbeb0df2a787583f51bfbf9465fea5c435f8456ca"}, + {file = "cvxpy-1.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:243d0315140a7572cd4ec2e9bf13c1e407627d78dc5f9491abfa9adc64569268"}, + {file = "cvxpy-1.4.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:69ee039b43e425ffc0cb5581c2befee571bee2b007d5a119fa17695f908d861e"}, + {file = "cvxpy-1.4.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:502c590099a4faeee28247a3d139d618a94ec6d2986dc7cc0db2ac614660ddc5"}, + {file = "cvxpy-1.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57a803bb786ab43da0c0a4fbbb0b2438fd13a4b38b68f8f16474a214a78b0823"}, + {file = "cvxpy-1.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:331cc160e66b7271b734b8ad0b65456d32445e00c397c35b7f2b105091ecfa84"}, + {file = "cvxpy-1.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:4b4d46fd521b755a6abd57384b2355db28d7165a6d90118278ebd7553e4ba70b"}, + {file = "cvxpy-1.4.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:80dde991c27d4e3b91597a00b85d460a9db03b484ba6a3b940647e324ad30110"}, + {file = "cvxpy-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:06091d3278c65ef996306b5a85a7848055331ef390262f2cf354811f43ddea68"}, + {file = "cvxpy-1.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e16bf04f75266c61ee469a0a3b1364c1e1e87d47dc47fedcdc43435c74dd97f3"}, + {file = "cvxpy-1.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14882db05fa36cab94262b7e9574c43f87301ab025daefdabaa7659f2623e731"}, + {file = "cvxpy-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:f094da24c46e6b0b936369463d483755eafbb13fd6a8d8d1ca962987d02eb014"}, + {file = "cvxpy-1.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b8d652877989ddc28099a367fb7a4bb771d54895e3e1167c835ee3f91606bd13"}, + {file = "cvxpy-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25d3ac5953effaa5c72ab8d261dbe94d8a1947de0324a7e30053ef3b0cee853e"}, + {file = "cvxpy-1.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d612c7bdff73a730c11d6094540705ca9c8312d9ebb6af75c09337123dd66b2"}, + {file = "cvxpy-1.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1475fd4c4778067d5ec03b35fe714d6a4074e1e213262a8bddbd9b638e004419"}, + {file = "cvxpy-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:8d30081ef5e906cc6352fc6760f462a6dfcb5150a5a26e21da942b6ae0759293"}, + {file = "cvxpy-1.4.3.tar.gz", hash = "sha256:b1b078c8c05923ad128e7d814b0be1c337ac05262a78b757a8e6f957648ad953"}, ] [package.dependencies] @@ -1010,13 +1017,13 @@ test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "eth-keyfile" -version = "0.8.0" +version = "0.8.1" description = "eth-keyfile: A library for handling the encrypted keyfiles used to store ethereum private keys" optional = false -python-versions = ">=3.8, <4" +python-versions = "<4,>=3.8" files = [ - {file = "eth-keyfile-0.8.0.tar.gz", hash = "sha256:02e3c2e564c7403b92db3fef8ecae3d21123b15787daecd5b643a57369c530f9"}, - {file = "eth_keyfile-0.8.0-py3-none-any.whl", hash = "sha256:9e09f5bc97c8309876c06bdea7a94f0051c25ba3109b5df37afb815418322efe"}, + {file = "eth_keyfile-0.8.1-py3-none-any.whl", hash = "sha256:65387378b82fe7e86d7cb9f8d98e6d639142661b2f6f490629da09fddbef6d64"}, + {file = "eth_keyfile-0.8.1.tar.gz", hash = "sha256:9708bc31f386b52cca0969238ff35b1ac72bd7a7186f2a84b86110d3c973bec1"}, ] [package.dependencies] @@ -1031,13 +1038,13 @@ test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "eth-keys" -version = "0.5.0" +version = "0.5.1" description = "eth-keys: Common API for Ethereum key operations" optional = false -python-versions = ">=3.8, <4" +python-versions = "<4,>=3.8" files = [ - {file = "eth-keys-0.5.0.tar.gz", hash = "sha256:a0abccb83f3d84322591a2c047a1e3aa52ea86b185fa3e82ce311d120ca2791e"}, - {file = "eth_keys-0.5.0-py3-none-any.whl", hash = "sha256:b2bed3ff3bcede68cc0cd4458c7147baaeaac1211a1efdb6ca019f9d3d989f2b"}, + {file = "eth_keys-0.5.1-py3-none-any.whl", hash = "sha256:ad13d920a2217a49bed3a1a7f54fb0980f53caf86d3bbab2139fd3330a17b97e"}, + {file = "eth_keys-0.5.1.tar.gz", hash = "sha256:2b587e4bbb9ac2195215a7ab0c0fb16042b17d4ec50240ed670bbb8f53da7a48"}, ] [package.dependencies] @@ -1046,9 +1053,9 @@ eth-utils = ">=2" [package.extras] coincurve = ["coincurve (>=12.0.0)"] -dev = ["asn1tools (>=0.146.2)", "build (>=0.9.0)", "bumpversion (>=0.5.3)", "coincurve (>=12.0.0)", "eth-hash[pysha3]", "factory-boy (>=3.0.1)", "hypothesis (>=5.10.3,<6)", "ipython", "pre-commit (>=3.4.0)", "pyasn1 (>=0.4.5)", "pytest (>=7.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +dev = ["asn1tools (>=0.146.2)", "build (>=0.9.0)", "bumpversion (>=0.5.3)", "coincurve (>=12.0.0)", "eth-hash[pysha3]", "factory-boy (>=3.0.1)", "hypothesis (>=5.10.3)", "ipython", "pre-commit (>=3.4.0)", "pyasn1 (>=0.4.5)", "pytest (>=7.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] docs = ["towncrier (>=21,<22)"] -test = ["asn1tools (>=0.146.2)", "eth-hash[pysha3]", "factory-boy (>=3.0.1)", "hypothesis (>=5.10.3,<6)", "pyasn1 (>=0.4.5)", "pytest (>=7.0.0)"] +test = ["asn1tools (>=0.146.2)", "eth-hash[pysha3]", "factory-boy (>=3.0.1)", "hypothesis (>=5.10.3)", "pyasn1 (>=0.4.5)", "pytest (>=7.0.0)"] [[package]] name = "eth-rlp" @@ -1074,13 +1081,13 @@ test = ["eth-hash[pycryptodome]", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "eth-typing" -version = "4.1.0" +version = "4.2.2" description = "eth-typing: Common type annotations for ethereum python packages" optional = false python-versions = "<4,>=3.8" files = [ - {file = "eth-typing-4.1.0.tar.gz", hash = "sha256:ed52b0c6b049240fd810bc87c8857c7ea39370f060f70b9ca3876285269f2938"}, - {file = "eth_typing-4.1.0-py3-none-any.whl", hash = "sha256:1f1b16bf37bfe0be730731fd24c7398e931a2b45a8feebf82df2e77a611a23be"}, + {file = "eth_typing-4.2.2-py3-none-any.whl", hash = "sha256:2d23c44b78b1740ee881aa5c440a05a5e311ca44d1defa18a334e733df46ff3f"}, + {file = "eth_typing-4.2.2.tar.gz", hash = "sha256:051ab9783e350668487ffc635b19666e7ca4d6c7e572800ed3961cbe0a937772"}, ] [package.extras] @@ -1348,24 +1355,24 @@ files = [ [[package]] name = "joblib" -version = "1.4.0" +version = "1.4.2" description = "Lightweight pipelining with Python functions" optional = false python-versions = ">=3.8" files = [ - {file = "joblib-1.4.0-py3-none-any.whl", hash = "sha256:42942470d4062537be4d54c83511186da1fc14ba354961a2114da91efa9a4ed7"}, - {file = "joblib-1.4.0.tar.gz", hash = "sha256:1eb0dc091919cd384490de890cb5dfd538410a6d4b3b54eef09fb8c50b409b1c"}, + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, ] [[package]] name = "jsonschema" -version = "4.21.1" +version = "4.22.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, - {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, + {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, + {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, ] [package.dependencies] @@ -1417,13 +1424,13 @@ test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout" [[package]] name = "jupytext" -version = "1.16.1" +version = "1.16.2" description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" optional = false python-versions = ">=3.8" files = [ - {file = "jupytext-1.16.1-py3-none-any.whl", hash = "sha256:796ec4f68ada663569e5d38d4ef03738a01284bfe21c943c485bc36433898bd0"}, - {file = "jupytext-1.16.1.tar.gz", hash = "sha256:68c7b68685e870e80e60fda8286fbd6269e9c74dc1df4316df6fe46eabc94c99"}, + {file = "jupytext-1.16.2-py3-none-any.whl", hash = "sha256:197a43fef31dca612b68b311e01b8abd54441c7e637810b16b6cb8f2ab66065e"}, + {file = "jupytext-1.16.2.tar.gz", hash = "sha256:8627dd9becbbebd79cc4a4ed4727d89d78e606b4b464eab72357b3b029023a14"}, ] [package.dependencies] @@ -1432,16 +1439,16 @@ mdit-py-plugins = "*" nbformat = "*" packaging = "*" pyyaml = "*" -toml = "*" +tomli = {version = "*", markers = "python_version < \"3.11\""} [package.extras] -dev = ["jupytext[test-cov,test-external]"] +dev = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (<0.4.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] docs = ["myst-parser", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] test = ["pytest", "pytest-randomly", "pytest-xdist"] -test-cov = ["jupytext[test-integration]", "pytest-cov (>=2.6.1)"] -test-external = ["autopep8", "black", "flake8", "gitpython", "isort", "jupyter-fs (<0.4.0)", "jupytext[test-integration]", "pre-commit", "sphinx-gallery (<0.8)"] -test-functional = ["jupytext[test]"] -test-integration = ["ipykernel", "jupyter-server (!=2.11)", "jupytext[test-functional]", "nbconvert"] +test-cov = ["ipykernel", "jupyter-server (!=2.11)", "nbconvert", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist"] +test-external = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (<0.4.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] +test-functional = ["pytest", "pytest-randomly", "pytest-xdist"] +test-integration = ["ipykernel", "jupyter-server (!=2.11)", "nbconvert", "pytest", "pytest-randomly", "pytest-xdist"] test-ui = ["calysto-bash"] [[package]] @@ -2177,28 +2184,29 @@ files = [ [[package]] name = "platformdirs" -version = "4.2.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.2.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, - {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, + {file = "platformdirs-4.2.1-py3-none-any.whl", hash = "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"}, + {file = "platformdirs-4.2.1.tar.gz", hash = "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] [[package]] name = "pluggy" -version = "1.4.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, - {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] @@ -2545,30 +2553,33 @@ files = [ [[package]] name = "qdldl" -version = "0.1.7.post1" +version = "0.1.7.post2" description = "QDLDL, a free LDL factorization routine." optional = false python-versions = "*" files = [ - {file = "qdldl-0.1.7.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:77311b7446be609cbdf23cc7e9f7494d2106b697cb874ba93692c08854c166aa"}, - {file = "qdldl-0.1.7.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:716493b517bfd8abcbaf954a55203b4a9b48339ed098e70055c80093d9ab89b2"}, - {file = "qdldl-0.1.7.post1-cp310-cp310-win_amd64.whl", hash = "sha256:22f470b9d5d80c2207ae5dc6f3a1de7b5f0bff65769356da8aec184993b4a4b5"}, - {file = "qdldl-0.1.7.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db90a7b17c0f7109cad8024eb18ea86d3632c15603c44c4c2e4dd56afaff4a84"}, - {file = "qdldl-0.1.7.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f5949df82e9b4a543047c510d895cddd8ff2887450d256c660a109e4652df9"}, - {file = "qdldl-0.1.7.post1-cp311-cp311-win_amd64.whl", hash = "sha256:ea5657a8a675efa32a8280cf85043b9b4749bf39f1903e3011cb4bd70427d807"}, - {file = "qdldl-0.1.7.post1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a129221d17a3835ba52b8fb11586549f47bd16dbffc54eeea04e669568cc35fc"}, - {file = "qdldl-0.1.7.post1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:298c97c18126f47fb20911d3e96f1a8198da9db7b6bb33b99fb92beef7f430aa"}, - {file = "qdldl-0.1.7.post1-cp36-cp36m-win_amd64.whl", hash = "sha256:9a390f123e6d0478c42f3a9de0eca34a0510cb3f20a5019210dc7f8388e026de"}, - {file = "qdldl-0.1.7.post1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:76ed3fa56083215ac28bbd53251c367da11292a4e493117f7e716c2112ed7e2a"}, - {file = "qdldl-0.1.7.post1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d022563209f80ae230e364b402e0691b2f082080bbf32d8ae9d7b40a3e431519"}, - {file = "qdldl-0.1.7.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:30bf5f9302e3fde81a81ebcd6d877f442d0c9369c9e23a38026f740f948d78c3"}, - {file = "qdldl-0.1.7.post1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3ffbd4c6da97f8a8bbd16bf2f1e3571b88cf0612fc2103efe9c39106abb02f2e"}, - {file = "qdldl-0.1.7.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1659265e24b50a61c7c7e030f4b2962859c1263793f6d55a266a0434fc64fd"}, - {file = "qdldl-0.1.7.post1-cp38-cp38-win_amd64.whl", hash = "sha256:ff1ef3f0aa4cbe0bfd6937eb9742aefb9a13bdeda2f732f2aaa140d0883e6c40"}, - {file = "qdldl-0.1.7.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17ef229fe87651a858ee50951a78b67e58b267997af8da16518bf19287101d86"}, - {file = "qdldl-0.1.7.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a8f3847ee2a7836362b8d5a9708dc2f4b9ed3b9a5ad4473e7d8c1ef58c3db1"}, - {file = "qdldl-0.1.7.post1-cp39-cp39-win_amd64.whl", hash = "sha256:9cfbe199187f2480d628d208c8df5aea8639fca98a3ed55b8cf01379aa93ba28"}, - {file = "qdldl-0.1.7.post1.tar.gz", hash = "sha256:798d88c16e02536ae65c71f06b64e3fbf31b74d7e47bc10ff9816768632b3a64"}, + {file = "qdldl-0.1.7.post2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c8d39035a64fbe4dc8d73501a444374787c087b202e875f6f0cd7e7ca166e25"}, + {file = "qdldl-0.1.7.post2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f93cd0b3338ef53efa512168d32991bff00b292d6eaf5e35427ca84622158132"}, + {file = "qdldl-0.1.7.post2-cp310-cp310-win_amd64.whl", hash = "sha256:02d6b531fe669f8894f97f697da88fe3f1c3af0c7ef12f260bf1d20e8e70f0dc"}, + {file = "qdldl-0.1.7.post2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:25180228613c66a5af7d6a648920fb71122e1ed58daf09621ed6b939b7f9aa04"}, + {file = "qdldl-0.1.7.post2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa5cf2125dea734f8977df22859b3826fae8960b35caf75cf5b16306ff1d1dc3"}, + {file = "qdldl-0.1.7.post2-cp311-cp311-win_amd64.whl", hash = "sha256:f14cda7c484dbe78e333bb52849031081d37e7e3bf961ed7bb77ed11489f16f6"}, + {file = "qdldl-0.1.7.post2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:90982ca5069077cfb8ba9ea7422c6e2a80a3af89266252d1e7a51ea5e87c8188"}, + {file = "qdldl-0.1.7.post2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e5572de51c7c86b6f30cd1b5a88dd5459d48e1c3432b1a04c2f4ad669f6e827"}, + {file = "qdldl-0.1.7.post2-cp312-cp312-win_amd64.whl", hash = "sha256:a612a4dfd94f977c5c9a4389363d4c661f54a6df59c75d462adb93922d92b45f"}, + {file = "qdldl-0.1.7.post2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:97929fd925833306e3c625c92813ac0dea9a53e6b9f680e2c5da9f0c1c641b19"}, + {file = "qdldl-0.1.7.post2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b833a64ee32d1e14a3acd59c3e62ea1dae551e6bf3265e42cb4197c4353ea02"}, + {file = "qdldl-0.1.7.post2-cp36-cp36m-win_amd64.whl", hash = "sha256:f686923c983f62fc7ccc7ebda6fd6ed5f623d299c211933896c7d396c88bb012"}, + {file = "qdldl-0.1.7.post2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8206013ec1fb4c6a396aeb0ef0c68f07d85eb5c22fe7e31cb8307f05787878b9"}, + {file = "qdldl-0.1.7.post2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24e01593cd46c86f5812f1362987bc8ab1080c493f4c7e436e144d2c10481b81"}, + {file = "qdldl-0.1.7.post2-cp37-cp37m-win_amd64.whl", hash = "sha256:06c2157ea1c2f691c956d92895722777eaf8c9ebf9c2c1af4a0b947eccc8b31e"}, + {file = "qdldl-0.1.7.post2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:77547f9e58522b2445b846ab6f0fd09a689f9fb2c0e72d44d14f631054d7dd55"}, + {file = "qdldl-0.1.7.post2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19825b998202dcd2579182a0a46350bdd95421ec65fd7579326083dc9f1c4d37"}, + {file = "qdldl-0.1.7.post2-cp38-cp38-win_amd64.whl", hash = "sha256:4c08e68cf7c051c0ce9c3846cda60a9c10aa53eb6b240998362dd6fd9410779b"}, + {file = "qdldl-0.1.7.post2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:edf202648cb0377fd78dd1e59816ccd92fabdee676eb3a7b618c66b393634d10"}, + {file = "qdldl-0.1.7.post2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22bc364e665ea8a2f8f661dbd22321ff365663b33b9ceaf429b94c2661cd11ac"}, + {file = "qdldl-0.1.7.post2-cp39-cp39-win_amd64.whl", hash = "sha256:b7dec0fba6204e83aa4b5e71e84ea2e89cfebeef5b47b70443f8cf9fa12a9752"}, + {file = "qdldl-0.1.7.post2.tar.gz", hash = "sha256:4b1539a5ec10cc757afd7156d7deb4006007cad86d774c9f0fdc3e34415557d3"}, ] [package.dependencies] @@ -2577,13 +2588,13 @@ scipy = ">=0.13.2" [[package]] name = "referencing" -version = "0.34.0" +version = "0.35.1" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.34.0-py3-none-any.whl", hash = "sha256:d53ae300ceddd3169f1ffa9caf2cb7b769e92657e4fafb23d34b93679116dfd4"}, - {file = "referencing-0.34.0.tar.gz", hash = "sha256:5773bd84ef41799a5a8ca72dc34590c041eb01bf9aa02632b4a973fb0181a844"}, + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, ] [package.dependencies] @@ -2592,104 +2603,90 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2023.12.25" +version = "2024.4.28" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, - {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, - {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, - {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, - {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, - {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, - {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, - {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, - {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, - {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, - {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, - {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, - {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, - {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, - {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, + {file = "regex-2024.4.28-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd196d056b40af073d95a2879678585f0b74ad35190fac04ca67954c582c6b61"}, + {file = "regex-2024.4.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8bb381f777351bd534462f63e1c6afb10a7caa9fa2a421ae22c26e796fe31b1f"}, + {file = "regex-2024.4.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:47af45b6153522733aa6e92543938e97a70ce0900649ba626cf5aad290b737b6"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99d6a550425cc51c656331af0e2b1651e90eaaa23fb4acde577cf15068e2e20f"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf29304a8011feb58913c382902fde3395957a47645bf848eea695839aa101b7"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:92da587eee39a52c91aebea8b850e4e4f095fe5928d415cb7ed656b3460ae79a"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6277d426e2f31bdbacb377d17a7475e32b2d7d1f02faaecc48d8e370c6a3ff31"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28e1f28d07220c0f3da0e8fcd5a115bbb53f8b55cecf9bec0c946eb9a059a94c"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aaa179975a64790c1f2701ac562b5eeb733946eeb036b5bcca05c8d928a62f10"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6f435946b7bf7a1b438b4e6b149b947c837cb23c704e780c19ba3e6855dbbdd3"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:19d6c11bf35a6ad077eb23852827f91c804eeb71ecb85db4ee1386825b9dc4db"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:fdae0120cddc839eb8e3c15faa8ad541cc6d906d3eb24d82fb041cfe2807bc1e"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e672cf9caaf669053121f1766d659a8813bd547edef6e009205378faf45c67b8"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f57515750d07e14743db55d59759893fdb21d2668f39e549a7d6cad5d70f9fea"}, + {file = "regex-2024.4.28-cp310-cp310-win32.whl", hash = "sha256:a1409c4eccb6981c7baabc8888d3550df518add6e06fe74fa1d9312c1838652d"}, + {file = "regex-2024.4.28-cp310-cp310-win_amd64.whl", hash = "sha256:1f687a28640f763f23f8a9801fe9e1b37338bb1ca5d564ddd41619458f1f22d1"}, + {file = "regex-2024.4.28-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84077821c85f222362b72fdc44f7a3a13587a013a45cf14534df1cbbdc9a6796"}, + {file = "regex-2024.4.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b45d4503de8f4f3dc02f1d28a9b039e5504a02cc18906cfe744c11def942e9eb"}, + {file = "regex-2024.4.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:457c2cd5a646dd4ed536c92b535d73548fb8e216ebee602aa9f48e068fc393f3"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b51739ddfd013c6f657b55a508de8b9ea78b56d22b236052c3a85a675102dc6"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:459226445c7d7454981c4c0ce0ad1a72e1e751c3e417f305722bbcee6697e06a"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:670fa596984b08a4a769491cbdf22350431970d0112e03d7e4eeaecaafcd0fec"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe00f4fe11c8a521b173e6324d862ee7ee3412bf7107570c9b564fe1119b56fb"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36f392dc7763fe7924575475736bddf9ab9f7a66b920932d0ea50c2ded2f5636"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:23a412b7b1a7063f81a742463f38821097b6a37ce1e5b89dd8e871d14dbfd86b"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f1d6e4b7b2ae3a6a9df53efbf199e4bfcff0959dbdb5fd9ced34d4407348e39a"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:499334ad139557de97cbc4347ee921c0e2b5e9c0f009859e74f3f77918339257"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:0940038bec2fe9e26b203d636c44d31dd8766abc1fe66262da6484bd82461ccf"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:66372c2a01782c5fe8e04bff4a2a0121a9897e19223d9eab30c54c50b2ebeb7f"}, + {file = "regex-2024.4.28-cp311-cp311-win32.whl", hash = "sha256:c77d10ec3c1cf328b2f501ca32583625987ea0f23a0c2a49b37a39ee5c4c4630"}, + {file = "regex-2024.4.28-cp311-cp311-win_amd64.whl", hash = "sha256:fc0916c4295c64d6890a46e02d4482bb5ccf33bf1a824c0eaa9e83b148291f90"}, + {file = "regex-2024.4.28-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:08a1749f04fee2811c7617fdd46d2e46d09106fa8f475c884b65c01326eb15c5"}, + {file = "regex-2024.4.28-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b8eb28995771c087a73338f695a08c9abfdf723d185e57b97f6175c5051ff1ae"}, + {file = "regex-2024.4.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd7ef715ccb8040954d44cfeff17e6b8e9f79c8019daae2fd30a8806ef5435c0"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb0315a2b26fde4005a7c401707c5352df274460f2f85b209cf6024271373013"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2fc053228a6bd3a17a9b0a3f15c3ab3cf95727b00557e92e1cfe094b88cc662"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fe9739a686dc44733d52d6e4f7b9c77b285e49edf8570754b322bca6b85b4cc"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74fcf77d979364f9b69fcf8200849ca29a374973dc193a7317698aa37d8b01c"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:965fd0cf4694d76f6564896b422724ec7b959ef927a7cb187fc6b3f4e4f59833"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2fef0b38c34ae675fcbb1b5db760d40c3fc3612cfa186e9e50df5782cac02bcd"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bc365ce25f6c7c5ed70e4bc674f9137f52b7dd6a125037f9132a7be52b8a252f"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ac69b394764bb857429b031d29d9604842bc4cbfd964d764b1af1868eeebc4f0"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:144a1fc54765f5c5c36d6d4b073299832aa1ec6a746a6452c3ee7b46b3d3b11d"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2630ca4e152c221072fd4a56d4622b5ada876f668ecd24d5ab62544ae6793ed6"}, + {file = "regex-2024.4.28-cp312-cp312-win32.whl", hash = "sha256:7f3502f03b4da52bbe8ba962621daa846f38489cae5c4a7b5d738f15f6443d17"}, + {file = "regex-2024.4.28-cp312-cp312-win_amd64.whl", hash = "sha256:0dd3f69098511e71880fb00f5815db9ed0ef62c05775395968299cb400aeab82"}, + {file = "regex-2024.4.28-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:374f690e1dd0dbdcddea4a5c9bdd97632cf656c69113f7cd6a361f2a67221cb6"}, + {file = "regex-2024.4.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f87ae6b96374db20f180eab083aafe419b194e96e4f282c40191e71980c666"}, + {file = "regex-2024.4.28-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5dbc1bcc7413eebe5f18196e22804a3be1bfdfc7e2afd415e12c068624d48247"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f85151ec5a232335f1be022b09fbbe459042ea1951d8a48fef251223fc67eee1"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57ba112e5530530fd175ed550373eb263db4ca98b5f00694d73b18b9a02e7185"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:224803b74aab56aa7be313f92a8d9911dcade37e5f167db62a738d0c85fdac4b"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54a047b607fd2d2d52a05e6ad294602f1e0dec2291152b745870afc47c1397"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a2a512d623f1f2d01d881513af9fc6a7c46e5cfffb7dc50c38ce959f9246c94"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c06bf3f38f0707592898428636cbb75d0a846651b053a1cf748763e3063a6925"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1031a5e7b048ee371ab3653aad3030ecfad6ee9ecdc85f0242c57751a05b0ac4"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d7a353ebfa7154c871a35caca7bfd8f9e18666829a1dc187115b80e35a29393e"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7e76b9cfbf5ced1aca15a0e5b6f229344d9b3123439ffce552b11faab0114a02"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5ce479ecc068bc2a74cb98dd8dba99e070d1b2f4a8371a7dfe631f85db70fe6e"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7d77b6f63f806578c604dca209280e4c54f0fa9a8128bb8d2cc5fb6f99da4150"}, + {file = "regex-2024.4.28-cp38-cp38-win32.whl", hash = "sha256:d84308f097d7a513359757c69707ad339da799e53b7393819ec2ea36bc4beb58"}, + {file = "regex-2024.4.28-cp38-cp38-win_amd64.whl", hash = "sha256:2cc1b87bba1dd1a898e664a31012725e48af826bf3971e786c53e32e02adae6c"}, + {file = "regex-2024.4.28-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7413167c507a768eafb5424413c5b2f515c606be5bb4ef8c5dee43925aa5718b"}, + {file = "regex-2024.4.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:108e2dcf0b53a7c4ab8986842a8edcb8ab2e59919a74ff51c296772e8e74d0ae"}, + {file = "regex-2024.4.28-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f1c5742c31ba7d72f2dedf7968998730664b45e38827637e0f04a2ac7de2f5f1"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecc6148228c9ae25ce403eade13a0961de1cb016bdb35c6eafd8e7b87ad028b1"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7d893c8cf0e2429b823ef1a1d360a25950ed11f0e2a9df2b5198821832e1947"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4290035b169578ffbbfa50d904d26bec16a94526071ebec3dadbebf67a26b25e"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a22ae1cfd82e4ffa2066eb3390777dc79468f866f0625261a93e44cdf6482b"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd24fd140b69f0b0bcc9165c397e9b2e89ecbeda83303abf2a072609f60239e2"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:39fb166d2196413bead229cd64a2ffd6ec78ebab83fff7d2701103cf9f4dfd26"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9301cc6db4d83d2c0719f7fcda37229691745168bf6ae849bea2e85fc769175d"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c3d389e8d76a49923683123730c33e9553063d9041658f23897f0b396b2386f"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:99ef6289b62042500d581170d06e17f5353b111a15aa6b25b05b91c6886df8fc"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b91d529b47798c016d4b4c1d06cc826ac40d196da54f0de3c519f5a297c5076a"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:43548ad74ea50456e1c68d3c67fff3de64c6edb85bcd511d1136f9b5376fc9d1"}, + {file = "regex-2024.4.28-cp39-cp39-win32.whl", hash = "sha256:05d9b6578a22db7dedb4df81451f360395828b04f4513980b6bd7a1412c679cc"}, + {file = "regex-2024.4.28-cp39-cp39-win_amd64.whl", hash = "sha256:3986217ec830c2109875be740531feb8ddafe0dfa49767cdcd072ed7e8927962"}, + {file = "regex-2024.4.28.tar.gz", hash = "sha256:83ab366777ea45d58f72593adf35d36ca911ea8bd838483c1823b883a121b0e4"}, ] [[package]] @@ -2715,130 +2712,130 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rlp" -version = "4.0.0" +version = "4.0.1" description = "rlp: A package for Recursive Length Prefix encoding and decoding" optional = false -python-versions = ">=3.8, <4" +python-versions = "<4,>=3.8" files = [ - {file = "rlp-4.0.0-py3-none-any.whl", hash = "sha256:1747fd933e054e6d25abfe591be92e19a4193a56c93981c05bd0f84dfe279f14"}, - {file = "rlp-4.0.0.tar.gz", hash = "sha256:61a5541f86e4684ab145cb849a5929d2ced8222930a570b3941cf4af16b72a78"}, + {file = "rlp-4.0.1-py3-none-any.whl", hash = "sha256:ff6846c3c27b97ee0492373aa074a7c3046aadd973320f4fffa7ac45564b0258"}, + {file = "rlp-4.0.1.tar.gz", hash = "sha256:bcefb11013dfadf8902642337923bd0c786dc8a27cb4c21da6e154e52869ecb1"}, ] [package.dependencies] eth-utils = ">=2" [package.extras] -dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "hypothesis (==5.19.0)", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] -docs = ["sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] -rust-backend = ["rusty-rlp (>=0.2.1,<0.3)"] +dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "hypothesis (==5.19.0)", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +rust-backend = ["rusty-rlp (>=0.2.1)"] test = ["hypothesis (==5.19.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "rpds-py" -version = "0.18.0" +version = "0.18.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, - {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, - {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, - {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, - {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, - {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, - {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, - {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, - {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, - {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, - {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, - {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, - {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, + {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, + {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, + {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, + {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, + {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, + {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, + {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, + {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, + {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, + {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, + {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, ] [[package]] @@ -2950,6 +2947,17 @@ files = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + [[package]] name = "toolz" version = "0.12.1" @@ -2963,13 +2971,13 @@ files = [ [[package]] name = "tqdm" -version = "4.66.2" +version = "4.66.4" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, - {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, + {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, + {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, ] [package.dependencies] @@ -2983,18 +2991,18 @@ telegram = ["requests"] [[package]] name = "traitlets" -version = "5.14.2" +version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.14.2-py3-none-any.whl", hash = "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80"}, - {file = "traitlets-5.14.2.tar.gz", hash = "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9"}, + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.1)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "typing-extensions" @@ -3026,21 +3034,21 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "web3" -version = "6.16.0" +version = "6.18.0" description = "web3.py" optional = false python-versions = ">=3.7.2" files = [ - {file = "web3-6.16.0-py3-none-any.whl", hash = "sha256:50e96cc447823444510ee659586b264ebc7ddbfc74cccb720d042146aa404348"}, - {file = "web3-6.16.0.tar.gz", hash = "sha256:b10c93476c106acc44b8428e47c61c385b7d0885e82cdc24049d27f521833552"}, + {file = "web3-6.18.0-py3-none-any.whl", hash = "sha256:86484a3d390a0a024002d1c1b79af27034488c470ea07693ff0f5bf109d3540b"}, + {file = "web3-6.18.0.tar.gz", hash = "sha256:2e626a4bf151171f5dc8ad7f30c373f0416dc2aca9d8d102a63578a2413efa26"}, ] [package.dependencies] aiohttp = ">=3.7.4.post0" eth-abi = ">=4.0.0" -eth-account = ">=0.8.0" +eth-account = ">=0.8.0,<0.13" eth-hash = {version = ">=0.5.1", extras = ["pycryptodome"]} -eth-typing = ">=3.0.0" +eth-typing = ">=3.0.0,<4.2.0 || >4.2.0" eth-utils = ">=2.1.0" hexbytes = ">=0.1.0,<0.4.0" jsonschema = ">=4.0.0" @@ -3053,11 +3061,10 @@ typing-extensions = ">=4.0.1" websockets = ">=10.0.0" [package.extras] -dev = ["black (>=22.1.0)", "build (>=0.9.0)", "bumpversion", "eth-tester[py-evm] (==v0.9.1-b.2)", "flake8 (==3.8.3)", "flaky (>=3.7.0)", "hypothesis (>=3.31.2)", "importlib-metadata (<5.0)", "ipfshttpclient (==0.8.0a2)", "isort (>=5.11.0)", "mypy (==1.4.1)", "py-geth (>=3.14.0)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.18.1,<0.23)", "pytest-mock (>=1.10)", "pytest-watch (>=4.2)", "pytest-xdist (>=1.29)", "setuptools (>=38.6.0)", "sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=3.18.0)", "tqdm (>4.32)", "twine (>=1.13)", "types-protobuf (==3.19.13)", "types-requests (>=2.26.1)", "types-setuptools (>=57.4.4)", "when-changed (>=0.3.0)"] +dev = ["build (>=0.9.0)", "bumpversion", "eth-tester[py-evm] (>=0.11.0b1,<0.12.0b1)", "eth-tester[py-evm] (>=0.9.0b1,<0.10.0b1)", "flaky (>=3.7.0)", "hypothesis (>=3.31.2)", "importlib-metadata (<5.0)", "ipfshttpclient (==0.8.0a2)", "pre-commit (>=2.21.0)", "py-geth (>=3.14.0)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.21.2,<0.23)", "pytest-mock (>=1.10)", "pytest-watch (>=4.2)", "pytest-xdist (>=1.29)", "setuptools (>=38.6.0)", "sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=3.18.0)", "tqdm (>4.32)", "twine (>=1.13)", "when-changed (>=0.3.0)"] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] ipfs = ["ipfshttpclient (==0.8.0a2)"] -linter = ["black (>=22.1.0)", "flake8 (==3.8.3)", "isort (>=5.11.0)", "mypy (==1.4.1)", "types-protobuf (==3.19.13)", "types-requests (>=2.26.1)", "types-setuptools (>=57.4.4)"] -tester = ["eth-tester[py-evm] (==v0.9.1-b.2)", "py-geth (>=3.14.0)"] +tester = ["eth-tester[py-evm] (>=0.11.0b1,<0.12.0b1)", "eth-tester[py-evm] (>=0.9.0b1,<0.10.0b1)", "py-geth (>=3.14.0)"] [[package]] name = "websockets"