hyperquant 1.24__tar.gz → 1.25__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of hyperquant might be problematic. Click here for more details.
- {hyperquant-1.24 → hyperquant-1.25}/PKG-INFO +2 -2
- {hyperquant-1.24 → hyperquant-1.25}/pyproject.toml +5 -2
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/lighter.py +88 -10
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/models/lighter.py +59 -0
- {hyperquant-1.24 → hyperquant-1.25}/tests/test_lighter.py +73 -49
- {hyperquant-1.24 → hyperquant-1.25}/uv.lock +91 -95
- {hyperquant-1.24 → hyperquant-1.25}/.gitignore +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/.python-version +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/README.md +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/apis.json +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/data/alpine_smoke.log +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/data/logs/notikit.log +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/data/logs/test_order_sync.log +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/data/records_swap.csv +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/data/records_swapc.csv +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/doc/bitmart.md +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/doc/coinup.md +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/doc/lbank.md +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/pub.sh +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/requirements-dev.lock +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/requirements.lock +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/__init__.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/auth.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/bitget.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/bitmart.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/coinw.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/edgex.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/hyperliquid.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/lbank.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/lib/edgex_sign.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/lib/hpstore.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/lib/hyper_types.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/lib/util.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/models/bitget.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/models/bitmart.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/models/coinw.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/models/edgex.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/models/hyperliquid.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/models/lbank.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/models/ourbit.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/ourbit.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/broker/ws.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/core.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/datavison/_util.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/datavison/binance.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/datavison/coinglass.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/datavison/okx.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/db.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/draw.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/logkit.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/src/hyperquant/notikit.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/test.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/tests/test_bitget.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/tests/test_bitmart.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/tests/test_coinup.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/tests/test_coinw.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/tests/test_draw.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/tests/test_edgex.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/tests/test_lbank.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/tests/test_ourbit.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/tests/test_store.py +0 -0
- {hyperquant-1.24 → hyperquant-1.25}/tests/tmp.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hyperquant
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.25
|
|
4
4
|
Summary: A minimal yet hyper-efficient backtesting framework for quantitative trading
|
|
5
5
|
Project-URL: Homepage, https://github.com/yourusername/hyperquant
|
|
6
6
|
Project-URL: Issues, https://github.com/yourusername/hyperquant/issues
|
|
@@ -17,7 +17,7 @@ Requires-Dist: aiohttp>=3.10.4
|
|
|
17
17
|
Requires-Dist: colorama>=0.4.6
|
|
18
18
|
Requires-Dist: cryptography>=44.0.2
|
|
19
19
|
Requires-Dist: duckdb>=1.2.2
|
|
20
|
-
Requires-Dist: lighter-sdk
|
|
20
|
+
Requires-Dist: lighter-sdk
|
|
21
21
|
Requires-Dist: numpy>=1.21.0
|
|
22
22
|
Requires-Dist: pandas>=2.2.3
|
|
23
23
|
Requires-Dist: pybotters>=1.9.1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "hyperquant"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.25"
|
|
4
4
|
description = "A minimal yet hyper-efficient backtesting framework for quantitative trading"
|
|
5
5
|
authors = [
|
|
6
6
|
{ name = "MissinA", email = "1421329142@qq.com" }
|
|
@@ -14,7 +14,7 @@ dependencies = [
|
|
|
14
14
|
"numpy>=1.21.0", # Added numpy as a new dependency
|
|
15
15
|
"duckdb>=1.2.2",
|
|
16
16
|
"pybotters>=1.9.1",
|
|
17
|
-
"lighter-sdk
|
|
17
|
+
"lighter-sdk",
|
|
18
18
|
]
|
|
19
19
|
readme = "README.md"
|
|
20
20
|
requires-python = ">=3.11"
|
|
@@ -45,6 +45,9 @@ requires-python = ">=3.9"
|
|
|
45
45
|
[tool.hatch.build.targets.wheel]
|
|
46
46
|
packages = ["src/hyperquant"]
|
|
47
47
|
|
|
48
|
+
[tool.uv.sources]
|
|
49
|
+
lighter-sdk = { git = "https://github.com/elliottech/lighter-python.git" }
|
|
50
|
+
|
|
48
51
|
[dependency-groups]
|
|
49
52
|
dev = [
|
|
50
53
|
"twine>=6.1.0",
|
|
@@ -3,6 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import logging
|
|
5
5
|
import json
|
|
6
|
+
from decimal import Decimal, ROUND_DOWN, ROUND_HALF_UP
|
|
6
7
|
from typing import Any, Literal, Sequence
|
|
7
8
|
|
|
8
9
|
import pybotters
|
|
@@ -302,13 +303,39 @@ class Lighter:
|
|
|
302
303
|
await ws_app._event.wait()
|
|
303
304
|
return ws_app
|
|
304
305
|
|
|
305
|
-
|
|
306
|
+
|
|
307
|
+
async def sub_orders(
|
|
306
308
|
self,
|
|
307
|
-
account_ids: Sequence[int] | int,
|
|
309
|
+
account_ids: Sequence[int] | int = None,
|
|
308
310
|
) -> pybotters.ws.WebSocketApp:
|
|
309
|
-
"""Subscribe to
|
|
311
|
+
"""Subscribe to order updates via Account All Orders stream.
|
|
310
312
|
|
|
311
|
-
|
|
313
|
+
Channel per docs: "account_all_orders/{ACCOUNT_ID}" (requires auth).
|
|
314
|
+
Response carries an "orders" mapping of market_id -> [Order].
|
|
315
|
+
"""
|
|
316
|
+
if account_ids:
|
|
317
|
+
if isinstance(account_ids, int):
|
|
318
|
+
account_id_list = [str(account_ids)]
|
|
319
|
+
else:
|
|
320
|
+
account_id_list = [str(aid) for aid in account_ids]
|
|
321
|
+
else:
|
|
322
|
+
account_id_list = [self.account_index]
|
|
323
|
+
|
|
324
|
+
channels = [f"account_all_orders/{aid}" for aid in account_id_list]
|
|
325
|
+
send_payload = [
|
|
326
|
+
{"type": "subscribe", "channel": channel, "auth": self.auth}
|
|
327
|
+
for channel in channels
|
|
328
|
+
]
|
|
329
|
+
|
|
330
|
+
ws_app = self.client.ws_connect(
|
|
331
|
+
self.ws_url,
|
|
332
|
+
send_json=send_payload,
|
|
333
|
+
hdlr_json=self.store.onmessage,
|
|
334
|
+
)
|
|
335
|
+
await ws_app._event.wait()
|
|
336
|
+
return ws_app
|
|
337
|
+
|
|
338
|
+
|
|
312
339
|
|
|
313
340
|
async def sub_kline(
|
|
314
341
|
self,
|
|
@@ -441,30 +468,81 @@ class Lighter:
|
|
|
441
468
|
except KeyError as exc:
|
|
442
469
|
raise ValueError(f"Unsupported time_in_force: {time_in_force}") from exc
|
|
443
470
|
|
|
444
|
-
|
|
471
|
+
# Per WS/API docs, OrderExpiry can be 0 with ExpiredAt computed by signer.
|
|
472
|
+
# Use caller-provided value if given; otherwise default to 0 to avoid
|
|
473
|
+
# "OrderExpiry is invalid" errors on some markets.
|
|
474
|
+
expiry = order_expiry if order_expiry is not None else 0
|
|
445
475
|
nonce_value = nonce if nonce is not None else -1
|
|
446
476
|
api_key_idx = api_key_index if api_key_index is not None else self.api_key_index
|
|
447
477
|
|
|
478
|
+
# ----- Precision and min constraints handling -----
|
|
479
|
+
# Prefer explicitly supported decimals. Avoid using quote decimals to infer size.
|
|
448
480
|
price_decimals = (
|
|
449
481
|
detail.get("supported_price_decimals")
|
|
450
482
|
or detail.get("price_decimals")
|
|
451
|
-
or detail.get("quote_decimals")
|
|
452
483
|
or 0
|
|
453
484
|
)
|
|
454
485
|
size_decimals = (
|
|
455
486
|
detail.get("supported_size_decimals")
|
|
456
487
|
or detail.get("size_decimals")
|
|
457
|
-
or detail.get("supported_quote_decimals")
|
|
458
488
|
or 0
|
|
459
489
|
)
|
|
460
490
|
|
|
491
|
+
# Optional constraints provided by the API
|
|
492
|
+
# Strings like "10.000000" may be returned – normalize via Decimal for accuracy
|
|
493
|
+
def _to_decimal(v, default: str | int = 0):
|
|
494
|
+
try:
|
|
495
|
+
if v is None or v == "":
|
|
496
|
+
return Decimal(str(default))
|
|
497
|
+
return Decimal(str(v))
|
|
498
|
+
except Exception:
|
|
499
|
+
return Decimal(str(default))
|
|
500
|
+
|
|
501
|
+
min_base_amount = _to_decimal(detail.get("min_base_amount"), 0)
|
|
502
|
+
min_quote_amount = _to_decimal(detail.get("min_quote_amount"), 0)
|
|
503
|
+
order_quote_limit = _to_decimal(detail.get("order_quote_limit"), 0)
|
|
504
|
+
|
|
505
|
+
# Use Decimal for precise arithmetic and quantization
|
|
506
|
+
d_price = Decimal(str(price))
|
|
507
|
+
d_size = Decimal(str(base_amount))
|
|
508
|
+
quant_price = Decimal(1) / (Decimal(10) ** int(price_decimals)) if int(price_decimals) > 0 else Decimal(1)
|
|
509
|
+
quant_size = Decimal(1) / (Decimal(10) ** int(size_decimals)) if int(size_decimals) > 0 else Decimal(1)
|
|
510
|
+
|
|
511
|
+
# Round price/size to allowed decimals (half up to the nearest tick)
|
|
512
|
+
d_price = d_price.quantize(quant_price, rounding=ROUND_HALF_UP)
|
|
513
|
+
d_size = d_size.quantize(quant_size, rounding=ROUND_HALF_UP)
|
|
514
|
+
|
|
515
|
+
# Ensure minimum notional and minimum base constraints
|
|
516
|
+
# If violating, adjust size upward to the smallest valid amount respecting size tick
|
|
517
|
+
if min_quote_amount > 0:
|
|
518
|
+
notional = d_price * d_size
|
|
519
|
+
if notional < min_quote_amount:
|
|
520
|
+
# required size to reach min notional
|
|
521
|
+
required = (min_quote_amount / d_price).quantize(quant_size, rounding=ROUND_HALF_UP)
|
|
522
|
+
if required > d_size:
|
|
523
|
+
d_size = required
|
|
524
|
+
if min_base_amount > 0 and d_size < min_base_amount:
|
|
525
|
+
d_size = min_base_amount.quantize(quant_size, rounding=ROUND_HALF_UP)
|
|
526
|
+
|
|
527
|
+
# Respect optional maximum notional limit if provided (>0)
|
|
528
|
+
if order_quote_limit and order_quote_limit > 0:
|
|
529
|
+
notional = d_price * d_size
|
|
530
|
+
if notional > order_quote_limit:
|
|
531
|
+
# Reduce size down to the maximum allowed notional (floor to tick)
|
|
532
|
+
max_size = (order_quote_limit / d_price).quantize(quant_size, rounding=ROUND_DOWN)
|
|
533
|
+
if max_size <= 0:
|
|
534
|
+
raise ValueError("order would exceed order_quote_limit and cannot be reduced to a positive size")
|
|
535
|
+
d_size = max_size
|
|
536
|
+
|
|
537
|
+
# Convert to integer representation expected by signer
|
|
461
538
|
price_scale = 10 ** int(price_decimals)
|
|
462
539
|
size_scale = 10 ** int(size_decimals)
|
|
463
540
|
|
|
464
|
-
price_int = int(
|
|
465
|
-
base_amount_int = int(
|
|
541
|
+
price_int = int((d_price * price_scale).to_integral_value(rounding=ROUND_HALF_UP))
|
|
542
|
+
base_amount_int = int((d_size * size_scale).to_integral_value(rounding=ROUND_HALF_UP))
|
|
543
|
+
|
|
466
544
|
trigger_price_int = (
|
|
467
|
-
int(
|
|
545
|
+
int((Decimal(str(trigger_price)) * price_scale).to_integral_value(rounding=ROUND_HALF_UP))
|
|
468
546
|
if trigger_price is not None
|
|
469
547
|
else self.signer.NIL_TRIGGER_PRICE
|
|
470
548
|
)
|
|
@@ -220,6 +220,62 @@ class Orders(DataStore):
|
|
|
220
220
|
if items:
|
|
221
221
|
self._insert(items)
|
|
222
222
|
|
|
223
|
+
def _on_message(self, msg: dict[str, Any]) -> None:
|
|
224
|
+
"""Handle websocket incremental updates for orders.
|
|
225
|
+
|
|
226
|
+
For WS updates we should not clear-and-reinsert. Instead:
|
|
227
|
+
- For fully filled or cancelled orders => delete
|
|
228
|
+
- Otherwise => update/insert
|
|
229
|
+
"""
|
|
230
|
+
if not isinstance(msg, dict):
|
|
231
|
+
return
|
|
232
|
+
|
|
233
|
+
orders_obj = msg.get("orders")
|
|
234
|
+
if orders_obj is None:
|
|
235
|
+
account = msg.get("account")
|
|
236
|
+
if isinstance(account, dict):
|
|
237
|
+
orders_obj = account.get("orders")
|
|
238
|
+
if not orders_obj:
|
|
239
|
+
return
|
|
240
|
+
|
|
241
|
+
# Normalize orders to a flat list of dicts
|
|
242
|
+
if isinstance(orders_obj, dict):
|
|
243
|
+
raw_list: list[dict[str, Any]] = []
|
|
244
|
+
for _, lst in orders_obj.items():
|
|
245
|
+
if isinstance(lst, list):
|
|
246
|
+
raw_list.extend([o for o in lst if isinstance(o, dict)])
|
|
247
|
+
elif isinstance(orders_obj, list):
|
|
248
|
+
raw_list = [o for o in orders_obj if isinstance(o, dict)]
|
|
249
|
+
else:
|
|
250
|
+
return
|
|
251
|
+
|
|
252
|
+
def _is_terminal(order: dict[str, Any]) -> bool:
|
|
253
|
+
status = str(order.get("status", "")).lower()
|
|
254
|
+
if status in {"cancelled", "canceled", "executed", "filled", "closed", "done"}:
|
|
255
|
+
return True
|
|
256
|
+
rem = order.get("remaining_base_amount")
|
|
257
|
+
try:
|
|
258
|
+
return float(rem) <= 0 if rem is not None else False
|
|
259
|
+
except Exception:
|
|
260
|
+
return False
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
for entry in raw_list:
|
|
264
|
+
normalized = self._normalize(entry)
|
|
265
|
+
if normalized is None:
|
|
266
|
+
continue
|
|
267
|
+
# enrich with symbol if mapping is available
|
|
268
|
+
if self.id_to_symbol:
|
|
269
|
+
market_id = entry.get("market_index")
|
|
270
|
+
if market_id is not None:
|
|
271
|
+
symbol = self.id_to_symbol.get(str(market_id))
|
|
272
|
+
if symbol is not None:
|
|
273
|
+
normalized["symbol"] = symbol
|
|
274
|
+
|
|
275
|
+
self._update([normalized])
|
|
276
|
+
if _is_terminal(entry):
|
|
277
|
+
self._delete([normalized])
|
|
278
|
+
|
|
223
279
|
|
|
224
280
|
|
|
225
281
|
|
|
@@ -632,6 +688,9 @@ class LighterDataStore(DataStoreCollection):
|
|
|
632
688
|
elif msg_type in {"subscribed/account_all", "update/account_all"}:
|
|
633
689
|
self.accounts._on_message(msg)
|
|
634
690
|
self.positions._on_message(msg)
|
|
691
|
+
self.orders._on_message(msg)
|
|
692
|
+
elif msg_type in {"subscribed/account_all_orders", "update/account_all_orders"}:
|
|
693
|
+
self.orders._on_message(msg)
|
|
635
694
|
elif msg_type in {"subscribed/trade", "update/trade"}:
|
|
636
695
|
self.klines._on_message(msg)
|
|
637
696
|
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
import zlib
|
|
2
2
|
import pybotters
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
5
5
|
from hyperquant.broker.lighter import Lighter
|
|
6
6
|
import asyncio
|
|
7
|
-
|
|
8
|
-
import time
|
|
9
|
-
from dataclasses import dataclass
|
|
10
|
-
from typing import Any, Literal
|
|
11
|
-
from hyperquant.logkit import get_logger
|
|
7
|
+
|
|
12
8
|
|
|
13
9
|
apis = {
|
|
14
10
|
"l1_address": "0x5B3f0AdDfaf4c1d8729e266b22093545EFaE6c0e",
|
|
@@ -19,23 +15,12 @@ apis = {
|
|
|
19
15
|
async def test_update():
|
|
20
16
|
async with pybotters.Client() as client:
|
|
21
17
|
print("开始测试Lighter数据更新")
|
|
22
|
-
async with Lighter(client=client) as broker:
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
# print(broker.store.detail.find({'symbol': 'DOLO'}))
|
|
26
|
-
# print(broker.get_contract_id('BTC'))
|
|
27
|
-
# await broker.update('orders', symbol='DOLO')
|
|
28
|
-
# print(broker.store.orders.find())
|
|
29
|
-
# await broker.update('account')
|
|
30
|
-
# print(broker.store.accounts.find())
|
|
31
|
-
|
|
32
|
-
# await broker.update("positions")
|
|
18
|
+
async with Lighter(client=client, **apis) as broker:
|
|
19
|
+
# print(broker.store.detail.find())
|
|
20
|
+
# await broker.update('positions')
|
|
33
21
|
# print(broker.store.positions.find())
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
# print(broker.store.orders.get({"order_id": "21673573193672683"}))
|
|
37
|
-
# pass
|
|
38
|
-
|
|
22
|
+
await broker.update('account')
|
|
23
|
+
print(broker.store.accounts.find())
|
|
39
24
|
|
|
40
25
|
async def test_sub_book():
|
|
41
26
|
async with pybotters.Client() as client:
|
|
@@ -85,20 +70,44 @@ async def test_place():
|
|
|
85
70
|
async def test_place_cancel():
|
|
86
71
|
async with pybotters.Client() as client:
|
|
87
72
|
async with Lighter(client=client, **apis) as broker:
|
|
73
|
+
|
|
88
74
|
order = await broker.place_order(
|
|
89
75
|
symbol="DOLO",
|
|
90
|
-
base_amount=146.
|
|
91
|
-
price=0.
|
|
76
|
+
base_amount=146.3,
|
|
77
|
+
price=0.064,
|
|
92
78
|
is_ask=False,
|
|
93
79
|
order_type="limit",
|
|
94
|
-
client_order_index=
|
|
80
|
+
client_order_index=115,
|
|
95
81
|
)
|
|
96
82
|
print(order)
|
|
83
|
+
await broker.update("orders", symbol="DOLO")
|
|
84
|
+
print(broker.store.orders.find())
|
|
85
|
+
await asyncio.sleep(5)
|
|
97
86
|
|
|
98
|
-
res = await broker.cancel_order("DOLO", order_index=
|
|
87
|
+
res = await broker.cancel_order("DOLO", order_index=115)
|
|
99
88
|
print(res)
|
|
100
89
|
|
|
101
90
|
|
|
91
|
+
async def test_orders_stream():
|
|
92
|
+
async with pybotters.Client() as client:
|
|
93
|
+
async with Lighter(client=client, **apis) as broker:
|
|
94
|
+
await broker.sub_orders()
|
|
95
|
+
|
|
96
|
+
with broker.store.orders.watch() as stream:
|
|
97
|
+
async for change in stream:
|
|
98
|
+
print(f"Order {change.operation}:")
|
|
99
|
+
print(change.data)
|
|
100
|
+
|
|
101
|
+
async def test_orders_stream():
|
|
102
|
+
async with pybotters.Client() as client:
|
|
103
|
+
async with Lighter(client=client, **apis) as broker:
|
|
104
|
+
await broker.sub_orders()
|
|
105
|
+
|
|
106
|
+
with broker.store.orders.watch() as stream:
|
|
107
|
+
async for change in stream:
|
|
108
|
+
print(f"Order {change.operation}:")
|
|
109
|
+
print(change.data)
|
|
110
|
+
|
|
102
111
|
async def test_kline():
|
|
103
112
|
async with pybotters.Client() as client:
|
|
104
113
|
async with Lighter(
|
|
@@ -117,28 +126,6 @@ async def test_kline():
|
|
|
117
126
|
print(broker.store.klines.find())
|
|
118
127
|
|
|
119
128
|
|
|
120
|
-
async def test_front_ws():
|
|
121
|
-
msg_list = []
|
|
122
|
-
# await test_update()
|
|
123
|
-
def callback(msg, ws: pybotters.ClientWebSocketResponse = None):
|
|
124
|
-
# print("Received message:", msg)
|
|
125
|
-
# decompressed = zlib.decompress(msg, 16 + zlib.MAX_WBITS)
|
|
126
|
-
# text = decompressed.decode("utf-8")
|
|
127
|
-
# 数据存储到本地
|
|
128
|
-
# msg_list.append(msg)
|
|
129
|
-
print(msg)
|
|
130
|
-
|
|
131
|
-
async with pybotters.Client() as client:
|
|
132
|
-
client.ws_connect(
|
|
133
|
-
"wss://mainnet.zklighter.elliot.ai/stream",
|
|
134
|
-
send_json=[{"type": "subscribe", "channel": "trade/70"}],
|
|
135
|
-
hdlr_json=callback,
|
|
136
|
-
)
|
|
137
|
-
|
|
138
|
-
await asyncio.sleep(10000)
|
|
139
|
-
# with open("lighter_ws_msgs.json", "w") as f:
|
|
140
|
-
# f.write(str(msg_list))
|
|
141
|
-
|
|
142
129
|
async def test_sub_k():
|
|
143
130
|
async with pybotters.Client() as client:
|
|
144
131
|
async with Lighter(client=client) as br:
|
|
@@ -151,6 +138,43 @@ async def test_sub_k():
|
|
|
151
138
|
print(change.data)
|
|
152
139
|
|
|
153
140
|
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
# 小demo, 3秒未成交则撤单
|
|
144
|
+
async def test_sync_order():
|
|
145
|
+
async with pybotters.Client() as client:
|
|
146
|
+
async with Lighter(client=client, **apis) as broker:
|
|
147
|
+
await broker.sub_orders()
|
|
148
|
+
|
|
149
|
+
with broker.store.orders.watch() as stream:
|
|
150
|
+
|
|
151
|
+
await broker.place_order(
|
|
152
|
+
symbol="SOL",
|
|
153
|
+
base_amount=0.03,
|
|
154
|
+
price=155,
|
|
155
|
+
is_ask=False,
|
|
156
|
+
order_type="market",
|
|
157
|
+
time_in_force='ioc',
|
|
158
|
+
client_order_index=140,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
# 设置3秒超时
|
|
162
|
+
try:
|
|
163
|
+
async with asyncio.timeout(3):
|
|
164
|
+
async for change in stream:
|
|
165
|
+
if change.operation == 'delete':
|
|
166
|
+
data = change.source
|
|
167
|
+
if data['client_order_index'] == 140:
|
|
168
|
+
print("Order filled!")
|
|
169
|
+
break
|
|
170
|
+
|
|
171
|
+
except asyncio.TimeoutError:
|
|
172
|
+
print("Order not filled in time, cancelling...")
|
|
173
|
+
res = await broker.cancel_order("SOL", order_index=140)
|
|
174
|
+
print(res)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
|
|
154
178
|
if __name__ == "__main__":
|
|
155
179
|
import asyncio
|
|
156
180
|
|
|
@@ -913,7 +913,7 @@ wheels = [
|
|
|
913
913
|
|
|
914
914
|
[[package]]
|
|
915
915
|
name = "hyperquant"
|
|
916
|
-
version = "1.
|
|
916
|
+
version = "1.24"
|
|
917
917
|
source = { editable = "." }
|
|
918
918
|
dependencies = [
|
|
919
919
|
{ name = "aiohttp" },
|
|
@@ -938,7 +938,7 @@ requires-dist = [
|
|
|
938
938
|
{ name = "colorama", specifier = ">=0.4.6" },
|
|
939
939
|
{ name = "cryptography", specifier = ">=44.0.2" },
|
|
940
940
|
{ name = "duckdb", specifier = ">=1.2.2" },
|
|
941
|
-
{ name = "lighter-sdk",
|
|
941
|
+
{ name = "lighter-sdk", git = "https://github.com/elliottech/lighter-python.git" },
|
|
942
942
|
{ name = "numpy", specifier = ">=1.21.0" },
|
|
943
943
|
{ name = "pandas", specifier = ">=2.2.3" },
|
|
944
944
|
{ name = "pybotters", specifier = ">=1.9.1" },
|
|
@@ -1059,7 +1059,7 @@ wheels = [
|
|
|
1059
1059
|
[[package]]
|
|
1060
1060
|
name = "lighter-sdk"
|
|
1061
1061
|
version = "0.1.4"
|
|
1062
|
-
source = {
|
|
1062
|
+
source = { git = "https://github.com/elliottech/lighter-python.git#c9b8de6fd6864ede0fd7fb61d85ffb3614d178c9" }
|
|
1063
1063
|
dependencies = [
|
|
1064
1064
|
{ name = "aiohttp" },
|
|
1065
1065
|
{ name = "aiohttp-retry" },
|
|
@@ -1071,10 +1071,6 @@ dependencies = [
|
|
|
1071
1071
|
{ name = "urllib3" },
|
|
1072
1072
|
{ name = "websockets" },
|
|
1073
1073
|
]
|
|
1074
|
-
sdist = { url = "https://files.pythonhosted.org/packages/74/6c/ead90cbb3c9c826e40dbba60d64b5353194655bfca99bb2e282301a91a43/lighter_sdk-0.1.4.tar.gz", hash = "sha256:a5372a846d0771d59267b213d6fd88a47997a8281a1c68dc1ed4f58d7ee63c0c", size = 7348987 }
|
|
1075
|
-
wheels = [
|
|
1076
|
-
{ url = "https://files.pythonhosted.org/packages/b6/f5/d25b8572347b70aa7e24206ef922f6ef227bc8ef7b0200ab406c5eb61ccb/lighter_sdk-0.1.4-py3-none-any.whl", hash = "sha256:036fc74f2fb59d47f157fb92c4795fdcdee78ae610472c048a95efc611dc4731", size = 7545456 },
|
|
1077
|
-
]
|
|
1078
1074
|
|
|
1079
1075
|
[[package]]
|
|
1080
1076
|
name = "markdown-it-py"
|
|
@@ -1825,94 +1821,94 @@ wheels = [
|
|
|
1825
1821
|
|
|
1826
1822
|
[[package]]
|
|
1827
1823
|
name = "regex"
|
|
1828
|
-
version = "2025.
|
|
1829
|
-
source = { registry = "https://pypi.org/simple" }
|
|
1830
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1831
|
-
wheels = [
|
|
1832
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1833
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1834
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1835
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1836
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1837
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1838
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1839
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1840
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1841
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1842
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1843
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1844
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1845
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1846
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1847
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1848
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1849
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1850
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1851
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1852
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1853
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1854
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1855
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1856
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1857
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1858
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1859
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1860
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1861
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1862
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1863
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1864
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1865
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1866
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1867
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1868
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1869
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1870
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1871
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1872
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1873
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1874
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1875
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1876
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1877
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1878
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1879
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1880
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1881
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1882
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1883
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1884
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1885
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1886
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1887
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1888
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1889
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1890
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1891
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1892
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1893
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1894
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1895
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1896
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1897
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1898
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1899
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1900
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1901
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1902
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1903
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1904
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1905
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1906
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1907
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1908
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1909
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1910
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1911
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1912
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1913
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1914
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1915
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1824
|
+
version = "2025.11.3"
|
|
1825
|
+
source = { registry = "https://pypi.org/simple" }
|
|
1826
|
+
sdist = { url = "https://files.pythonhosted.org/packages/cc/a9/546676f25e573a4cf00fe8e119b78a37b6a8fe2dc95cda877b30889c9c45/regex-2025.11.3.tar.gz", hash = "sha256:1fedc720f9bb2494ce31a58a1631f9c82df6a09b49c19517ea5cc280b4541e01", size = 414669 }
|
|
1827
|
+
wheels = [
|
|
1828
|
+
{ url = "https://files.pythonhosted.org/packages/f7/90/4fb5056e5f03a7048abd2b11f598d464f0c167de4f2a51aa868c376b8c70/regex-2025.11.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eadade04221641516fa25139273505a1c19f9bf97589a05bc4cfcd8b4a618031", size = 488081 },
|
|
1829
|
+
{ url = "https://files.pythonhosted.org/packages/85/23/63e481293fac8b069d84fba0299b6666df720d875110efd0338406b5d360/regex-2025.11.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:feff9e54ec0dd3833d659257f5c3f5322a12eee58ffa360984b716f8b92983f4", size = 290554 },
|
|
1830
|
+
{ url = "https://files.pythonhosted.org/packages/2b/9d/b101d0262ea293a0066b4522dfb722eb6a8785a8c3e084396a5f2c431a46/regex-2025.11.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3b30bc921d50365775c09a7ed446359e5c0179e9e2512beec4a60cbcef6ddd50", size = 288407 },
|
|
1831
|
+
{ url = "https://files.pythonhosted.org/packages/0c/64/79241c8209d5b7e00577ec9dca35cd493cc6be35b7d147eda367d6179f6d/regex-2025.11.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f99be08cfead2020c7ca6e396c13543baea32343b7a9a5780c462e323bd8872f", size = 793418 },
|
|
1832
|
+
{ url = "https://files.pythonhosted.org/packages/3d/e2/23cd5d3573901ce8f9757c92ca4db4d09600b865919b6d3e7f69f03b1afd/regex-2025.11.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6dd329a1b61c0ee95ba95385fb0c07ea0d3fe1a21e1349fa2bec272636217118", size = 860448 },
|
|
1833
|
+
{ url = "https://files.pythonhosted.org/packages/2a/4c/aecf31beeaa416d0ae4ecb852148d38db35391aac19c687b5d56aedf3a8b/regex-2025.11.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c5238d32f3c5269d9e87be0cf096437b7622b6920f5eac4fd202468aaeb34d2", size = 907139 },
|
|
1834
|
+
{ url = "https://files.pythonhosted.org/packages/61/22/b8cb00df7d2b5e0875f60628594d44dba283e951b1ae17c12f99e332cc0a/regex-2025.11.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10483eefbfb0adb18ee9474498c9a32fcf4e594fbca0543bb94c48bac6183e2e", size = 800439 },
|
|
1835
|
+
{ url = "https://files.pythonhosted.org/packages/02/a8/c4b20330a5cdc7a8eb265f9ce593f389a6a88a0c5f280cf4d978f33966bc/regex-2025.11.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:78c2d02bb6e1da0720eedc0bad578049cad3f71050ef8cd065ecc87691bed2b0", size = 782965 },
|
|
1836
|
+
{ url = "https://files.pythonhosted.org/packages/b4/4c/ae3e52988ae74af4b04d2af32fee4e8077f26e51b62ec2d12d246876bea2/regex-2025.11.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e6b49cd2aad93a1790ce9cffb18964f6d3a4b0b3dbdbd5de094b65296fce6e58", size = 854398 },
|
|
1837
|
+
{ url = "https://files.pythonhosted.org/packages/06/d1/a8b9cf45874eda14b2e275157ce3b304c87e10fb38d9fc26a6e14eb18227/regex-2025.11.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:885b26aa3ee56433b630502dc3d36ba78d186a00cc535d3806e6bfd9ed3c70ab", size = 845897 },
|
|
1838
|
+
{ url = "https://files.pythonhosted.org/packages/ea/fe/1830eb0236be93d9b145e0bd8ab499f31602fe0999b1f19e99955aa8fe20/regex-2025.11.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ddd76a9f58e6a00f8772e72cff8ebcff78e022be95edf018766707c730593e1e", size = 788906 },
|
|
1839
|
+
{ url = "https://files.pythonhosted.org/packages/66/47/dc2577c1f95f188c1e13e2e69d8825a5ac582ac709942f8a03af42ed6e93/regex-2025.11.3-cp311-cp311-win32.whl", hash = "sha256:3e816cc9aac1cd3cc9a4ec4d860f06d40f994b5c7b4d03b93345f44e08cc68bf", size = 265812 },
|
|
1840
|
+
{ url = "https://files.pythonhosted.org/packages/50/1e/15f08b2f82a9bbb510621ec9042547b54d11e83cb620643ebb54e4eb7d71/regex-2025.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:087511f5c8b7dfbe3a03f5d5ad0c2a33861b1fc387f21f6f60825a44865a385a", size = 277737 },
|
|
1841
|
+
{ url = "https://files.pythonhosted.org/packages/f4/fc/6500eb39f5f76c5e47a398df82e6b535a5e345f839581012a418b16f9cc3/regex-2025.11.3-cp311-cp311-win_arm64.whl", hash = "sha256:1ff0d190c7f68ae7769cd0313fe45820ba07ffebfddfaa89cc1eb70827ba0ddc", size = 270290 },
|
|
1842
|
+
{ url = "https://files.pythonhosted.org/packages/e8/74/18f04cb53e58e3fb107439699bd8375cf5a835eec81084e0bddbd122e4c2/regex-2025.11.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bc8ab71e2e31b16e40868a40a69007bc305e1109bd4658eb6cad007e0bf67c41", size = 489312 },
|
|
1843
|
+
{ url = "https://files.pythonhosted.org/packages/78/3f/37fcdd0d2b1e78909108a876580485ea37c91e1acf66d3bb8e736348f441/regex-2025.11.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:22b29dda7e1f7062a52359fca6e58e548e28c6686f205e780b02ad8ef710de36", size = 291256 },
|
|
1844
|
+
{ url = "https://files.pythonhosted.org/packages/bf/26/0a575f58eb23b7ebd67a45fccbc02ac030b737b896b7e7a909ffe43ffd6a/regex-2025.11.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a91e4a29938bc1a082cc28fdea44be420bf2bebe2665343029723892eb073e1", size = 288921 },
|
|
1845
|
+
{ url = "https://files.pythonhosted.org/packages/ea/98/6a8dff667d1af907150432cf5abc05a17ccd32c72a3615410d5365ac167a/regex-2025.11.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08b884f4226602ad40c5d55f52bf91a9df30f513864e0054bad40c0e9cf1afb7", size = 798568 },
|
|
1846
|
+
{ url = "https://files.pythonhosted.org/packages/64/15/92c1db4fa4e12733dd5a526c2dd2b6edcbfe13257e135fc0f6c57f34c173/regex-2025.11.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3e0b11b2b2433d1c39c7c7a30e3f3d0aeeea44c2a8d0bae28f6b95f639927a69", size = 864165 },
|
|
1847
|
+
{ url = "https://files.pythonhosted.org/packages/f9/e7/3ad7da8cdee1ce66c7cd37ab5ab05c463a86ffeb52b1a25fe7bd9293b36c/regex-2025.11.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:87eb52a81ef58c7ba4d45c3ca74e12aa4b4e77816f72ca25258a85b3ea96cb48", size = 912182 },
|
|
1848
|
+
{ url = "https://files.pythonhosted.org/packages/84/bd/9ce9f629fcb714ffc2c3faf62b6766ecb7a585e1e885eb699bcf130a5209/regex-2025.11.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a12ab1f5c29b4e93db518f5e3872116b7e9b1646c9f9f426f777b50d44a09e8c", size = 803501 },
|
|
1849
|
+
{ url = "https://files.pythonhosted.org/packages/7c/0f/8dc2e4349d8e877283e6edd6c12bdcebc20f03744e86f197ab6e4492bf08/regex-2025.11.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7521684c8c7c4f6e88e35ec89680ee1aa8358d3f09d27dfbdf62c446f5d4c695", size = 787842 },
|
|
1850
|
+
{ url = "https://files.pythonhosted.org/packages/f9/73/cff02702960bc185164d5619c0c62a2f598a6abff6695d391b096237d4ab/regex-2025.11.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7fe6e5440584e94cc4b3f5f4d98a25e29ca12dccf8873679a635638349831b98", size = 858519 },
|
|
1851
|
+
{ url = "https://files.pythonhosted.org/packages/61/83/0e8d1ae71e15bc1dc36231c90b46ee35f9d52fab2e226b0e039e7ea9c10a/regex-2025.11.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8e026094aa12b43f4fd74576714e987803a315c76edb6b098b9809db5de58f74", size = 850611 },
|
|
1852
|
+
{ url = "https://files.pythonhosted.org/packages/c8/f5/70a5cdd781dcfaa12556f2955bf170cd603cb1c96a1827479f8faea2df97/regex-2025.11.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:435bbad13e57eb5606a68443af62bed3556de2f46deb9f7d4237bc2f1c9fb3a0", size = 789759 },
|
|
1853
|
+
{ url = "https://files.pythonhosted.org/packages/59/9b/7c29be7903c318488983e7d97abcf8ebd3830e4c956c4c540005fcfb0462/regex-2025.11.3-cp312-cp312-win32.whl", hash = "sha256:3839967cf4dc4b985e1570fd8d91078f0c519f30491c60f9ac42a8db039be204", size = 266194 },
|
|
1854
|
+
{ url = "https://files.pythonhosted.org/packages/1a/67/3b92df89f179d7c367be654ab5626ae311cb28f7d5c237b6bb976cd5fbbb/regex-2025.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:e721d1b46e25c481dc5ded6f4b3f66c897c58d2e8cfdf77bbced84339108b0b9", size = 277069 },
|
|
1855
|
+
{ url = "https://files.pythonhosted.org/packages/d7/55/85ba4c066fe5094d35b249c3ce8df0ba623cfd35afb22d6764f23a52a1c5/regex-2025.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:64350685ff08b1d3a6fff33f45a9ca183dc1d58bbfe4981604e70ec9801bbc26", size = 270330 },
|
|
1856
|
+
{ url = "https://files.pythonhosted.org/packages/e1/a7/dda24ebd49da46a197436ad96378f17df30ceb40e52e859fc42cac45b850/regex-2025.11.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c1e448051717a334891f2b9a620fe36776ebf3dd8ec46a0b877c8ae69575feb4", size = 489081 },
|
|
1857
|
+
{ url = "https://files.pythonhosted.org/packages/19/22/af2dc751aacf88089836aa088a1a11c4f21a04707eb1b0478e8e8fb32847/regex-2025.11.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9b5aca4d5dfd7fbfbfbdaf44850fcc7709a01146a797536a8f84952e940cca76", size = 291123 },
|
|
1858
|
+
{ url = "https://files.pythonhosted.org/packages/a3/88/1a3ea5672f4b0a84802ee9891b86743438e7c04eb0b8f8c4e16a42375327/regex-2025.11.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:04d2765516395cf7dda331a244a3282c0f5ae96075f728629287dfa6f76ba70a", size = 288814 },
|
|
1859
|
+
{ url = "https://files.pythonhosted.org/packages/fb/8c/f5987895bf42b8ddeea1b315c9fedcfe07cadee28b9c98cf50d00adcb14d/regex-2025.11.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d9903ca42bfeec4cebedba8022a7c97ad2aab22e09573ce9976ba01b65e4361", size = 798592 },
|
|
1860
|
+
{ url = "https://files.pythonhosted.org/packages/99/2a/6591ebeede78203fa77ee46a1c36649e02df9eaa77a033d1ccdf2fcd5d4e/regex-2025.11.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:639431bdc89d6429f6721625e8129413980ccd62e9d3f496be618a41d205f160", size = 864122 },
|
|
1861
|
+
{ url = "https://files.pythonhosted.org/packages/94/d6/be32a87cf28cf8ed064ff281cfbd49aefd90242a83e4b08b5a86b38e8eb4/regex-2025.11.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f117efad42068f9715677c8523ed2be1518116d1c49b1dd17987716695181efe", size = 912272 },
|
|
1862
|
+
{ url = "https://files.pythonhosted.org/packages/62/11/9bcef2d1445665b180ac7f230406ad80671f0fc2a6ffb93493b5dd8cd64c/regex-2025.11.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4aecb6f461316adf9f1f0f6a4a1a3d79e045f9b71ec76055a791affa3b285850", size = 803497 },
|
|
1863
|
+
{ url = "https://files.pythonhosted.org/packages/e5/a7/da0dc273d57f560399aa16d8a68ae7f9b57679476fc7ace46501d455fe84/regex-2025.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3b3a5f320136873cc5561098dfab677eea139521cb9a9e8db98b7e64aef44cbc", size = 787892 },
|
|
1864
|
+
{ url = "https://files.pythonhosted.org/packages/da/4b/732a0c5a9736a0b8d6d720d4945a2f1e6f38f87f48f3173559f53e8d5d82/regex-2025.11.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:75fa6f0056e7efb1f42a1c34e58be24072cb9e61a601340cc1196ae92326a4f9", size = 858462 },
|
|
1865
|
+
{ url = "https://files.pythonhosted.org/packages/0c/f5/a2a03df27dc4c2d0c769220f5110ba8c4084b0bfa9ab0f9b4fcfa3d2b0fc/regex-2025.11.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:dbe6095001465294f13f1adcd3311e50dd84e5a71525f20a10bd16689c61ce0b", size = 850528 },
|
|
1866
|
+
{ url = "https://files.pythonhosted.org/packages/d6/09/e1cd5bee3841c7f6eb37d95ca91cdee7100b8f88b81e41c2ef426910891a/regex-2025.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:454d9b4ae7881afbc25015b8627c16d88a597479b9dea82b8c6e7e2e07240dc7", size = 789866 },
|
|
1867
|
+
{ url = "https://files.pythonhosted.org/packages/eb/51/702f5ea74e2a9c13d855a6a85b7f80c30f9e72a95493260193c07f3f8d74/regex-2025.11.3-cp313-cp313-win32.whl", hash = "sha256:28ba4d69171fc6e9896337d4fc63a43660002b7da53fc15ac992abcf3410917c", size = 266189 },
|
|
1868
|
+
{ url = "https://files.pythonhosted.org/packages/8b/00/6e29bb314e271a743170e53649db0fdb8e8ff0b64b4f425f5602f4eb9014/regex-2025.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:bac4200befe50c670c405dc33af26dad5a3b6b255dd6c000d92fe4629f9ed6a5", size = 277054 },
|
|
1869
|
+
{ url = "https://files.pythonhosted.org/packages/25/f1/b156ff9f2ec9ac441710764dda95e4edaf5f36aca48246d1eea3f1fd96ec/regex-2025.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:2292cd5a90dab247f9abe892ac584cb24f0f54680c73fcb4a7493c66c2bf2467", size = 270325 },
|
|
1870
|
+
{ url = "https://files.pythonhosted.org/packages/20/28/fd0c63357caefe5680b8ea052131acbd7f456893b69cc2a90cc3e0dc90d4/regex-2025.11.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1eb1ebf6822b756c723e09f5186473d93236c06c579d2cc0671a722d2ab14281", size = 491984 },
|
|
1871
|
+
{ url = "https://files.pythonhosted.org/packages/df/ec/7014c15626ab46b902b3bcc4b28a7bae46d8f281fc7ea9c95e22fcaaa917/regex-2025.11.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1e00ec2970aab10dc5db34af535f21fcf32b4a31d99e34963419636e2f85ae39", size = 292673 },
|
|
1872
|
+
{ url = "https://files.pythonhosted.org/packages/23/ab/3b952ff7239f20d05f1f99e9e20188513905f218c81d52fb5e78d2bf7634/regex-2025.11.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a4cb042b615245d5ff9b3794f56be4138b5adc35a4166014d31d1814744148c7", size = 291029 },
|
|
1873
|
+
{ url = "https://files.pythonhosted.org/packages/21/7e/3dc2749fc684f455f162dcafb8a187b559e2614f3826877d3844a131f37b/regex-2025.11.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44f264d4bf02f3176467d90b294d59bf1db9fe53c141ff772f27a8b456b2a9ed", size = 807437 },
|
|
1874
|
+
{ url = "https://files.pythonhosted.org/packages/1b/0b/d529a85ab349c6a25d1ca783235b6e3eedf187247eab536797021f7126c6/regex-2025.11.3-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7be0277469bf3bd7a34a9c57c1b6a724532a0d235cd0dc4e7f4316f982c28b19", size = 873368 },
|
|
1875
|
+
{ url = "https://files.pythonhosted.org/packages/7d/18/2d868155f8c9e3e9d8f9e10c64e9a9f496bb8f7e037a88a8bed26b435af6/regex-2025.11.3-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0d31e08426ff4b5b650f68839f5af51a92a5b51abd8554a60c2fbc7c71f25d0b", size = 914921 },
|
|
1876
|
+
{ url = "https://files.pythonhosted.org/packages/2d/71/9d72ff0f354fa783fe2ba913c8734c3b433b86406117a8db4ea2bf1c7a2f/regex-2025.11.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e43586ce5bd28f9f285a6e729466841368c4a0353f6fd08d4ce4630843d3648a", size = 812708 },
|
|
1877
|
+
{ url = "https://files.pythonhosted.org/packages/e7/19/ce4bf7f5575c97f82b6e804ffb5c4e940c62609ab2a0d9538d47a7fdf7d4/regex-2025.11.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0f9397d561a4c16829d4e6ff75202c1c08b68a3bdbfe29dbfcdb31c9830907c6", size = 795472 },
|
|
1878
|
+
{ url = "https://files.pythonhosted.org/packages/03/86/fd1063a176ffb7b2315f9a1b08d17b18118b28d9df163132615b835a26ee/regex-2025.11.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:dd16e78eb18ffdb25ee33a0682d17912e8cc8a770e885aeee95020046128f1ce", size = 868341 },
|
|
1879
|
+
{ url = "https://files.pythonhosted.org/packages/12/43/103fb2e9811205e7386366501bc866a164a0430c79dd59eac886a2822950/regex-2025.11.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:ffcca5b9efe948ba0661e9df0fa50d2bc4b097c70b9810212d6b62f05d83b2dd", size = 854666 },
|
|
1880
|
+
{ url = "https://files.pythonhosted.org/packages/7d/22/e392e53f3869b75804762c7c848bd2dd2abf2b70fb0e526f58724638bd35/regex-2025.11.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c56b4d162ca2b43318ac671c65bd4d563e841a694ac70e1a976ac38fcf4ca1d2", size = 799473 },
|
|
1881
|
+
{ url = "https://files.pythonhosted.org/packages/4f/f9/8bd6b656592f925b6845fcbb4d57603a3ac2fb2373344ffa1ed70aa6820a/regex-2025.11.3-cp313-cp313t-win32.whl", hash = "sha256:9ddc42e68114e161e51e272f667d640f97e84a2b9ef14b7477c53aac20c2d59a", size = 268792 },
|
|
1882
|
+
{ url = "https://files.pythonhosted.org/packages/e5/87/0e7d603467775ff65cd2aeabf1b5b50cc1c3708556a8b849a2fa4dd1542b/regex-2025.11.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7a7c7fdf755032ffdd72c77e3d8096bdcb0eb92e89e17571a196f03d88b11b3c", size = 280214 },
|
|
1883
|
+
{ url = "https://files.pythonhosted.org/packages/8d/d0/2afc6f8e94e2b64bfb738a7c2b6387ac1699f09f032d363ed9447fd2bb57/regex-2025.11.3-cp313-cp313t-win_arm64.whl", hash = "sha256:df9eb838c44f570283712e7cff14c16329a9f0fb19ca492d21d4b7528ee6821e", size = 271469 },
|
|
1884
|
+
{ url = "https://files.pythonhosted.org/packages/31/e9/f6e13de7e0983837f7b6d238ad9458800a874bf37c264f7923e63409944c/regex-2025.11.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9697a52e57576c83139d7c6f213d64485d3df5bf84807c35fa409e6c970801c6", size = 489089 },
|
|
1885
|
+
{ url = "https://files.pythonhosted.org/packages/a3/5c/261f4a262f1fa65141c1b74b255988bd2fa020cc599e53b080667d591cfc/regex-2025.11.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e18bc3f73bd41243c9b38a6d9f2366cd0e0137a9aebe2d8ff76c5b67d4c0a3f4", size = 291059 },
|
|
1886
|
+
{ url = "https://files.pythonhosted.org/packages/8e/57/f14eeb7f072b0e9a5a090d1712741fd8f214ec193dba773cf5410108bb7d/regex-2025.11.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:61a08bcb0ec14ff4e0ed2044aad948d0659604f824cbd50b55e30b0ec6f09c73", size = 288900 },
|
|
1887
|
+
{ url = "https://files.pythonhosted.org/packages/3c/6b/1d650c45e99a9b327586739d926a1cd4e94666b1bd4af90428b36af66dc7/regex-2025.11.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9c30003b9347c24bcc210958c5d167b9e4f9be786cb380a7d32f14f9b84674f", size = 799010 },
|
|
1888
|
+
{ url = "https://files.pythonhosted.org/packages/99/ee/d66dcbc6b628ce4e3f7f0cbbb84603aa2fc0ffc878babc857726b8aab2e9/regex-2025.11.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4e1e592789704459900728d88d41a46fe3969b82ab62945560a31732ffc19a6d", size = 864893 },
|
|
1889
|
+
{ url = "https://files.pythonhosted.org/packages/bf/2d/f238229f1caba7ac87a6c4153d79947fb0261415827ae0f77c304260c7d3/regex-2025.11.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6538241f45eb5a25aa575dbba1069ad786f68a4f2773a29a2bd3dd1f9de787be", size = 911522 },
|
|
1890
|
+
{ url = "https://files.pythonhosted.org/packages/bd/3d/22a4eaba214a917c80e04f6025d26143690f0419511e0116508e24b11c9b/regex-2025.11.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce22519c989bb72a7e6b36a199384c53db7722fe669ba891da75907fe3587db", size = 803272 },
|
|
1891
|
+
{ url = "https://files.pythonhosted.org/packages/84/b1/03188f634a409353a84b5ef49754b97dbcc0c0f6fd6c8ede505a8960a0a4/regex-2025.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:66d559b21d3640203ab9075797a55165d79017520685fb407b9234d72ab63c62", size = 787958 },
|
|
1892
|
+
{ url = "https://files.pythonhosted.org/packages/99/6a/27d072f7fbf6fadd59c64d210305e1ff865cc3b78b526fd147db768c553b/regex-2025.11.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:669dcfb2e38f9e8c69507bace46f4889e3abbfd9b0c29719202883c0a603598f", size = 859289 },
|
|
1893
|
+
{ url = "https://files.pythonhosted.org/packages/9a/70/1b3878f648e0b6abe023172dacb02157e685564853cc363d9961bcccde4e/regex-2025.11.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:32f74f35ff0f25a5021373ac61442edcb150731fbaa28286bbc8bb1582c89d02", size = 850026 },
|
|
1894
|
+
{ url = "https://files.pythonhosted.org/packages/dd/d5/68e25559b526b8baab8e66839304ede68ff6727237a47727d240006bd0ff/regex-2025.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e6c7a21dffba883234baefe91bc3388e629779582038f75d2a5be918e250f0ed", size = 789499 },
|
|
1895
|
+
{ url = "https://files.pythonhosted.org/packages/fc/df/43971264857140a350910d4e33df725e8c94dd9dee8d2e4729fa0d63d49e/regex-2025.11.3-cp314-cp314-win32.whl", hash = "sha256:795ea137b1d809eb6836b43748b12634291c0ed55ad50a7d72d21edf1cd565c4", size = 271604 },
|
|
1896
|
+
{ url = "https://files.pythonhosted.org/packages/01/6f/9711b57dc6894a55faf80a4c1b5aa4f8649805cb9c7aef46f7d27e2b9206/regex-2025.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:9f95fbaa0ee1610ec0fc6b26668e9917a582ba80c52cc6d9ada15e30aa9ab9ad", size = 280320 },
|
|
1897
|
+
{ url = "https://files.pythonhosted.org/packages/f1/7e/f6eaa207d4377481f5e1775cdeb5a443b5a59b392d0065f3417d31d80f87/regex-2025.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:dfec44d532be4c07088c3de2876130ff0fbeeacaa89a137decbbb5f665855a0f", size = 273372 },
|
|
1898
|
+
{ url = "https://files.pythonhosted.org/packages/c3/06/49b198550ee0f5e4184271cee87ba4dfd9692c91ec55289e6282f0f86ccf/regex-2025.11.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ba0d8a5d7f04f73ee7d01d974d47c5834f8a1b0224390e4fe7c12a3a92a78ecc", size = 491985 },
|
|
1899
|
+
{ url = "https://files.pythonhosted.org/packages/ce/bf/abdafade008f0b1c9da10d934034cb670432d6cf6cbe38bbb53a1cfd6cf8/regex-2025.11.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:442d86cf1cfe4faabf97db7d901ef58347efd004934da045c745e7b5bd57ac49", size = 292669 },
|
|
1900
|
+
{ url = "https://files.pythonhosted.org/packages/f9/ef/0c357bb8edbd2ad8e273fcb9e1761bc37b8acbc6e1be050bebd6475f19c1/regex-2025.11.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fd0a5e563c756de210bb964789b5abe4f114dacae9104a47e1a649b910361536", size = 291030 },
|
|
1901
|
+
{ url = "https://files.pythonhosted.org/packages/79/06/edbb67257596649b8fb088d6aeacbcb248ac195714b18a65e018bf4c0b50/regex-2025.11.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf3490bcbb985a1ae97b2ce9ad1c0f06a852d5b19dde9b07bdf25bf224248c95", size = 807674 },
|
|
1902
|
+
{ url = "https://files.pythonhosted.org/packages/f4/d9/ad4deccfce0ea336296bd087f1a191543bb99ee1c53093dcd4c64d951d00/regex-2025.11.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3809988f0a8b8c9dcc0f92478d6501fac7200b9ec56aecf0ec21f4a2ec4b6009", size = 873451 },
|
|
1903
|
+
{ url = "https://files.pythonhosted.org/packages/13/75/a55a4724c56ef13e3e04acaab29df26582f6978c000ac9cd6810ad1f341f/regex-2025.11.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f4ff94e58e84aedb9c9fce66d4ef9f27a190285b451420f297c9a09f2b9abee9", size = 914980 },
|
|
1904
|
+
{ url = "https://files.pythonhosted.org/packages/67/1e/a1657ee15bd9116f70d4a530c736983eed997b361e20ecd8f5ca3759d5c5/regex-2025.11.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eb542fd347ce61e1321b0a6b945d5701528dca0cd9759c2e3bb8bd57e47964d", size = 812852 },
|
|
1905
|
+
{ url = "https://files.pythonhosted.org/packages/b8/6f/f7516dde5506a588a561d296b2d0044839de06035bb486b326065b4c101e/regex-2025.11.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d6c2d5919075a1f2e413c00b056ea0c2f065b3f5fe83c3d07d325ab92dce51d6", size = 795566 },
|
|
1906
|
+
{ url = "https://files.pythonhosted.org/packages/d9/dd/3d10b9e170cc16fb34cb2cef91513cf3df65f440b3366030631b2984a264/regex-2025.11.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3f8bf11a4827cc7ce5a53d4ef6cddd5ad25595d3c1435ef08f76825851343154", size = 868463 },
|
|
1907
|
+
{ url = "https://files.pythonhosted.org/packages/f5/8e/935e6beff1695aa9085ff83195daccd72acc82c81793df480f34569330de/regex-2025.11.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:22c12d837298651e5550ac1d964e4ff57c3f56965fc1812c90c9fb2028eaf267", size = 854694 },
|
|
1908
|
+
{ url = "https://files.pythonhosted.org/packages/92/12/10650181a040978b2f5720a6a74d44f841371a3d984c2083fc1752e4acf6/regex-2025.11.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:62ba394a3dda9ad41c7c780f60f6e4a70988741415ae96f6d1bf6c239cf01379", size = 799691 },
|
|
1909
|
+
{ url = "https://files.pythonhosted.org/packages/67/90/8f37138181c9a7690e7e4cb388debbd389342db3c7381d636d2875940752/regex-2025.11.3-cp314-cp314t-win32.whl", hash = "sha256:4bf146dca15cdd53224a1bf46d628bd7590e4a07fbb69e720d561aea43a32b38", size = 274583 },
|
|
1910
|
+
{ url = "https://files.pythonhosted.org/packages/8f/cd/867f5ec442d56beb56f5f854f40abcfc75e11d10b11fdb1869dd39c63aaf/regex-2025.11.3-cp314-cp314t-win_amd64.whl", hash = "sha256:adad1a1bcf1c9e76346e091d22d23ac54ef28e1365117d99521631078dfec9de", size = 284286 },
|
|
1911
|
+
{ url = "https://files.pythonhosted.org/packages/20/31/32c0c4610cbc070362bf1d2e4ea86d1ea29014d400a6d6c2486fcfd57766/regex-2025.11.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c54f768482cef41e219720013cd05933b6f971d9562544d691c68699bf2b6801", size = 274741 },
|
|
1916
1912
|
]
|
|
1917
1913
|
|
|
1918
1914
|
[[package]]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|