pykalshi 0.1.0__tar.gz → 0.2.0__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.
- {pykalshi-0.1.0 → pykalshi-0.2.0}/PKG-INFO +8 -8
- {pykalshi-0.1.0 → pykalshi-0.2.0}/README.md +7 -7
- {pykalshi-0.1.0 → pykalshi-0.2.0}/pykalshi.egg-info/PKG-INFO +8 -8
- {pykalshi-0.1.0 → pykalshi-0.2.0}/pykalshi.egg-info/SOURCES.txt +15 -15
- pykalshi-0.2.0/pykalshi.egg-info/top_level.txt +1 -0
- {pykalshi-0.1.0 → pykalshi-0.2.0}/pyproject.toml +2 -2
- {pykalshi-0.1.0 → pykalshi-0.2.0}/tests/test_api_keys.py +1 -1
- {pykalshi-0.1.0 → pykalshi-0.2.0}/tests/test_client.py +1 -1
- {pykalshi-0.1.0 → pykalshi-0.2.0}/tests/test_feed.py +1 -1
- {pykalshi-0.1.0 → pykalshi-0.2.0}/tests/test_integration.py +2 -2
- {pykalshi-0.1.0 → pykalshi-0.2.0}/tests/test_markets.py +4 -4
- {pykalshi-0.1.0 → pykalshi-0.2.0}/tests/test_models.py +2 -2
- {pykalshi-0.1.0 → pykalshi-0.2.0}/tests/test_portfolio.py +10 -10
- {pykalshi-0.1.0 → pykalshi-0.2.0}/tests/test_series.py +3 -3
- {pykalshi-0.1.0 → pykalshi-0.2.0}/tests/test_workflow.py +1 -1
- pykalshi-0.1.0/pykalshi.egg-info/top_level.txt +0 -1
- {pykalshi-0.1.0 → pykalshi-0.2.0}/LICENSE +0 -0
- {pykalshi-0.1.0/kalshi_api → pykalshi-0.2.0/pykalshi}/__init__.py +0 -0
- {pykalshi-0.1.0/kalshi_api → pykalshi-0.2.0/pykalshi}/api_keys.py +0 -0
- {pykalshi-0.1.0/kalshi_api → pykalshi-0.2.0/pykalshi}/client.py +0 -0
- {pykalshi-0.1.0/kalshi_api → pykalshi-0.2.0/pykalshi}/enums.py +0 -0
- {pykalshi-0.1.0/kalshi_api → pykalshi-0.2.0/pykalshi}/events.py +0 -0
- {pykalshi-0.1.0/kalshi_api → pykalshi-0.2.0/pykalshi}/exceptions.py +0 -0
- {pykalshi-0.1.0/kalshi_api → pykalshi-0.2.0/pykalshi}/exchange.py +0 -0
- {pykalshi-0.1.0/kalshi_api → pykalshi-0.2.0/pykalshi}/feed.py +0 -0
- {pykalshi-0.1.0/kalshi_api → pykalshi-0.2.0/pykalshi}/markets.py +0 -0
- {pykalshi-0.1.0/kalshi_api → pykalshi-0.2.0/pykalshi}/models.py +0 -0
- {pykalshi-0.1.0/kalshi_api → pykalshi-0.2.0/pykalshi}/orderbook.py +0 -0
- {pykalshi-0.1.0/kalshi_api → pykalshi-0.2.0/pykalshi}/orders.py +0 -0
- {pykalshi-0.1.0/kalshi_api → pykalshi-0.2.0/pykalshi}/portfolio.py +0 -0
- {pykalshi-0.1.0/kalshi_api → pykalshi-0.2.0/pykalshi}/py.typed +0 -0
- {pykalshi-0.1.0/kalshi_api → pykalshi-0.2.0/pykalshi}/rate_limiter.py +0 -0
- {pykalshi-0.1.0 → pykalshi-0.2.0}/pykalshi.egg-info/dependency_links.txt +0 -0
- {pykalshi-0.1.0 → pykalshi-0.2.0}/pykalshi.egg-info/requires.txt +0 -0
- {pykalshi-0.1.0 → pykalshi-0.2.0}/setup.cfg +0 -0
- {pykalshi-0.1.0 → pykalshi-0.2.0}/tests/test_exchange.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pykalshi
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: A typed Python client for the Kalshi prediction markets API with WebSocket streaming, automatic retries, and ergonomic interfaces
|
|
5
5
|
Author-email: Arsh Koneru <arshkon@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -42,14 +42,14 @@ Requires-Dist: mypy>=1.0.0; extra == "dev"
|
|
|
42
42
|
Requires-Dist: types-requests>=2.31.0; extra == "dev"
|
|
43
43
|
Dynamic: license-file
|
|
44
44
|
|
|
45
|
-
#
|
|
45
|
+
# pykalshi
|
|
46
46
|
|
|
47
47
|
A typed Python client for the [Kalshi](https://kalshi.com) prediction markets API with WebSocket streaming, automatic retries, and ergonomic interfaces.
|
|
48
48
|
|
|
49
49
|
## Installation
|
|
50
50
|
|
|
51
51
|
```bash
|
|
52
|
-
pip install
|
|
52
|
+
pip install pykalshi
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
Create a `.env` file with your credentials from [kalshi.com](https://kalshi.com) → Account & Security → API Keys:
|
|
@@ -62,7 +62,7 @@ KALSHI_PRIVATE_KEY_PATH=/path/to/private-key.key
|
|
|
62
62
|
## Quick Start
|
|
63
63
|
|
|
64
64
|
```python
|
|
65
|
-
from
|
|
65
|
+
from pykalshi import KalshiClient, Action, Side
|
|
66
66
|
|
|
67
67
|
client = KalshiClient()
|
|
68
68
|
user = client.get_user()
|
|
@@ -118,7 +118,7 @@ trades = market.get_trades()
|
|
|
118
118
|
### Orders
|
|
119
119
|
|
|
120
120
|
```python
|
|
121
|
-
from
|
|
121
|
+
from pykalshi import Action, Side, OrderType
|
|
122
122
|
|
|
123
123
|
# Limit order (default)
|
|
124
124
|
order = user.place_order(market, Action.BUY, Side.YES, count=10, price=50)
|
|
@@ -134,7 +134,7 @@ order.cancel()
|
|
|
134
134
|
Subscribe to live market data via WebSocket:
|
|
135
135
|
|
|
136
136
|
```python
|
|
137
|
-
from
|
|
137
|
+
from pykalshi import Feed
|
|
138
138
|
|
|
139
139
|
async def main():
|
|
140
140
|
async with Feed(client) as feed:
|
|
@@ -148,7 +148,7 @@ async def main():
|
|
|
148
148
|
### Error Handling
|
|
149
149
|
|
|
150
150
|
```python
|
|
151
|
-
from
|
|
151
|
+
from pykalshi import InsufficientFundsError, RateLimitError, KalshiAPIError
|
|
152
152
|
|
|
153
153
|
try:
|
|
154
154
|
user.place_order(...)
|
|
@@ -162,7 +162,7 @@ except KalshiAPIError as e:
|
|
|
162
162
|
|
|
163
163
|
## Comparison with Official SDK
|
|
164
164
|
|
|
165
|
-
| Feature |
|
|
165
|
+
| Feature | pykalshi | kalshi-python (official) |
|
|
166
166
|
|---------|------------|--------------------------|
|
|
167
167
|
| WebSocket streaming | ✓ | — |
|
|
168
168
|
| Automatic retry with backoff | ✓ | — |
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
#
|
|
1
|
+
# pykalshi
|
|
2
2
|
|
|
3
3
|
A typed Python client for the [Kalshi](https://kalshi.com) prediction markets API with WebSocket streaming, automatic retries, and ergonomic interfaces.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
pip install
|
|
8
|
+
pip install pykalshi
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
Create a `.env` file with your credentials from [kalshi.com](https://kalshi.com) → Account & Security → API Keys:
|
|
@@ -18,7 +18,7 @@ KALSHI_PRIVATE_KEY_PATH=/path/to/private-key.key
|
|
|
18
18
|
## Quick Start
|
|
19
19
|
|
|
20
20
|
```python
|
|
21
|
-
from
|
|
21
|
+
from pykalshi import KalshiClient, Action, Side
|
|
22
22
|
|
|
23
23
|
client = KalshiClient()
|
|
24
24
|
user = client.get_user()
|
|
@@ -74,7 +74,7 @@ trades = market.get_trades()
|
|
|
74
74
|
### Orders
|
|
75
75
|
|
|
76
76
|
```python
|
|
77
|
-
from
|
|
77
|
+
from pykalshi import Action, Side, OrderType
|
|
78
78
|
|
|
79
79
|
# Limit order (default)
|
|
80
80
|
order = user.place_order(market, Action.BUY, Side.YES, count=10, price=50)
|
|
@@ -90,7 +90,7 @@ order.cancel()
|
|
|
90
90
|
Subscribe to live market data via WebSocket:
|
|
91
91
|
|
|
92
92
|
```python
|
|
93
|
-
from
|
|
93
|
+
from pykalshi import Feed
|
|
94
94
|
|
|
95
95
|
async def main():
|
|
96
96
|
async with Feed(client) as feed:
|
|
@@ -104,7 +104,7 @@ async def main():
|
|
|
104
104
|
### Error Handling
|
|
105
105
|
|
|
106
106
|
```python
|
|
107
|
-
from
|
|
107
|
+
from pykalshi import InsufficientFundsError, RateLimitError, KalshiAPIError
|
|
108
108
|
|
|
109
109
|
try:
|
|
110
110
|
user.place_order(...)
|
|
@@ -118,7 +118,7 @@ except KalshiAPIError as e:
|
|
|
118
118
|
|
|
119
119
|
## Comparison with Official SDK
|
|
120
120
|
|
|
121
|
-
| Feature |
|
|
121
|
+
| Feature | pykalshi | kalshi-python (official) |
|
|
122
122
|
|---------|------------|--------------------------|
|
|
123
123
|
| WebSocket streaming | ✓ | — |
|
|
124
124
|
| Automatic retry with backoff | ✓ | — |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pykalshi
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: A typed Python client for the Kalshi prediction markets API with WebSocket streaming, automatic retries, and ergonomic interfaces
|
|
5
5
|
Author-email: Arsh Koneru <arshkon@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -42,14 +42,14 @@ Requires-Dist: mypy>=1.0.0; extra == "dev"
|
|
|
42
42
|
Requires-Dist: types-requests>=2.31.0; extra == "dev"
|
|
43
43
|
Dynamic: license-file
|
|
44
44
|
|
|
45
|
-
#
|
|
45
|
+
# pykalshi
|
|
46
46
|
|
|
47
47
|
A typed Python client for the [Kalshi](https://kalshi.com) prediction markets API with WebSocket streaming, automatic retries, and ergonomic interfaces.
|
|
48
48
|
|
|
49
49
|
## Installation
|
|
50
50
|
|
|
51
51
|
```bash
|
|
52
|
-
pip install
|
|
52
|
+
pip install pykalshi
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
Create a `.env` file with your credentials from [kalshi.com](https://kalshi.com) → Account & Security → API Keys:
|
|
@@ -62,7 +62,7 @@ KALSHI_PRIVATE_KEY_PATH=/path/to/private-key.key
|
|
|
62
62
|
## Quick Start
|
|
63
63
|
|
|
64
64
|
```python
|
|
65
|
-
from
|
|
65
|
+
from pykalshi import KalshiClient, Action, Side
|
|
66
66
|
|
|
67
67
|
client = KalshiClient()
|
|
68
68
|
user = client.get_user()
|
|
@@ -118,7 +118,7 @@ trades = market.get_trades()
|
|
|
118
118
|
### Orders
|
|
119
119
|
|
|
120
120
|
```python
|
|
121
|
-
from
|
|
121
|
+
from pykalshi import Action, Side, OrderType
|
|
122
122
|
|
|
123
123
|
# Limit order (default)
|
|
124
124
|
order = user.place_order(market, Action.BUY, Side.YES, count=10, price=50)
|
|
@@ -134,7 +134,7 @@ order.cancel()
|
|
|
134
134
|
Subscribe to live market data via WebSocket:
|
|
135
135
|
|
|
136
136
|
```python
|
|
137
|
-
from
|
|
137
|
+
from pykalshi import Feed
|
|
138
138
|
|
|
139
139
|
async def main():
|
|
140
140
|
async with Feed(client) as feed:
|
|
@@ -148,7 +148,7 @@ async def main():
|
|
|
148
148
|
### Error Handling
|
|
149
149
|
|
|
150
150
|
```python
|
|
151
|
-
from
|
|
151
|
+
from pykalshi import InsufficientFundsError, RateLimitError, KalshiAPIError
|
|
152
152
|
|
|
153
153
|
try:
|
|
154
154
|
user.place_order(...)
|
|
@@ -162,7 +162,7 @@ except KalshiAPIError as e:
|
|
|
162
162
|
|
|
163
163
|
## Comparison with Official SDK
|
|
164
164
|
|
|
165
|
-
| Feature |
|
|
165
|
+
| Feature | pykalshi | kalshi-python (official) |
|
|
166
166
|
|---------|------------|--------------------------|
|
|
167
167
|
| WebSocket streaming | ✓ | — |
|
|
168
168
|
| Automatic retry with backoff | ✓ | — |
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
LICENSE
|
|
2
2
|
README.md
|
|
3
3
|
pyproject.toml
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
4
|
+
pykalshi/__init__.py
|
|
5
|
+
pykalshi/api_keys.py
|
|
6
|
+
pykalshi/client.py
|
|
7
|
+
pykalshi/enums.py
|
|
8
|
+
pykalshi/events.py
|
|
9
|
+
pykalshi/exceptions.py
|
|
10
|
+
pykalshi/exchange.py
|
|
11
|
+
pykalshi/feed.py
|
|
12
|
+
pykalshi/markets.py
|
|
13
|
+
pykalshi/models.py
|
|
14
|
+
pykalshi/orderbook.py
|
|
15
|
+
pykalshi/orders.py
|
|
16
|
+
pykalshi/portfolio.py
|
|
17
|
+
pykalshi/py.typed
|
|
18
|
+
pykalshi/rate_limiter.py
|
|
19
19
|
pykalshi.egg-info/PKG-INFO
|
|
20
20
|
pykalshi.egg-info/SOURCES.txt
|
|
21
21
|
pykalshi.egg-info/dependency_links.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pykalshi
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "pykalshi"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.2.0"
|
|
4
4
|
description = "A typed Python client for the Kalshi prediction markets API with WebSocket streaming, automatic retries, and ergonomic interfaces"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = {text = "MIT"}
|
|
@@ -73,7 +73,7 @@ requires = ["setuptools>=61.0"]
|
|
|
73
73
|
build-backend = "setuptools.build_meta"
|
|
74
74
|
|
|
75
75
|
[tool.setuptools]
|
|
76
|
-
packages = ["
|
|
76
|
+
packages = ["pykalshi"]
|
|
77
77
|
|
|
78
78
|
[tool.pytest.ini_options]
|
|
79
79
|
asyncio_mode = "auto"
|
|
@@ -147,7 +147,7 @@ class TestAPIKeyDelete:
|
|
|
147
147
|
|
|
148
148
|
def test_delete_nonexistent_key(self, client, mock_response):
|
|
149
149
|
"""Test deleting a non-existent key raises error."""
|
|
150
|
-
from
|
|
150
|
+
from pykalshi.exceptions import ResourceNotFoundError
|
|
151
151
|
|
|
152
152
|
client._session.request.return_value = mock_response(
|
|
153
153
|
{"message": "Key not found"}, status_code=404
|
|
@@ -7,8 +7,8 @@ Run with: pytest tests/test_integration.py -v
|
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
9
|
import pytest
|
|
10
|
-
from
|
|
11
|
-
from
|
|
10
|
+
from pykalshi import KalshiClient
|
|
11
|
+
from pykalshi.enums import MarketStatus
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
@pytest.fixture(scope="module")
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
import pytest
|
|
4
4
|
from unittest.mock import ANY
|
|
5
5
|
|
|
6
|
-
from
|
|
7
|
-
from
|
|
6
|
+
from pykalshi import Market, Event
|
|
7
|
+
from pykalshi.enums import MarketStatus, CandlestickPeriod
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class TestGetMarket:
|
|
@@ -34,7 +34,7 @@ class TestGetMarket:
|
|
|
34
34
|
|
|
35
35
|
def test_get_market_not_found(self, client, mock_response):
|
|
36
36
|
"""Test fetching non-existent market raises error."""
|
|
37
|
-
from
|
|
37
|
+
from pykalshi.exceptions import ResourceNotFoundError
|
|
38
38
|
|
|
39
39
|
client._session.request.return_value = mock_response(
|
|
40
40
|
{"message": "Market not found"}, status_code=404
|
|
@@ -403,7 +403,7 @@ class TestGetEvent:
|
|
|
403
403
|
|
|
404
404
|
def test_get_event_not_found(self, client, mock_response):
|
|
405
405
|
"""Test fetching non-existent event raises error."""
|
|
406
|
-
from
|
|
406
|
+
from pykalshi.exceptions import ResourceNotFoundError
|
|
407
407
|
|
|
408
408
|
client._session.request.return_value = mock_response(
|
|
409
409
|
{"message": "Event not found"}, status_code=404
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import pytest
|
|
2
|
-
from
|
|
2
|
+
from pykalshi.models import (
|
|
3
3
|
BalanceModel,
|
|
4
4
|
OrderModel,
|
|
5
5
|
MarketModel,
|
|
@@ -13,7 +13,7 @@ from kalshi_api.models import (
|
|
|
13
13
|
SeriesModel,
|
|
14
14
|
TradeModel,
|
|
15
15
|
)
|
|
16
|
-
from
|
|
16
|
+
from pykalshi.enums import Action, Side, OrderStatus
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
def test_balance_model_validation():
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import pytest
|
|
4
4
|
from unittest.mock import ANY
|
|
5
|
-
from
|
|
5
|
+
from pykalshi.enums import Action, Side, OrderStatus
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
def test_get_positions_workflow(client, mock_response):
|
|
@@ -182,7 +182,7 @@ def test_get_order_by_id(client, mock_response):
|
|
|
182
182
|
|
|
183
183
|
def test_get_order_not_found(client, mock_response):
|
|
184
184
|
"""Test that 404 raises ResourceNotFoundError."""
|
|
185
|
-
from
|
|
185
|
+
from pykalshi.exceptions import ResourceNotFoundError
|
|
186
186
|
|
|
187
187
|
client._session.request.return_value = mock_response(
|
|
188
188
|
{"message": "Order not found", "code": "not_found"}, status_code=404
|
|
@@ -225,8 +225,8 @@ def test_cancel_order(client, mock_response):
|
|
|
225
225
|
|
|
226
226
|
def test_order_cancel_delegates_to_portfolio(client, mock_response):
|
|
227
227
|
"""Test that Order.cancel() delegates to Portfolio.cancel_order()."""
|
|
228
|
-
from
|
|
229
|
-
from
|
|
228
|
+
from pykalshi.orders import Order
|
|
229
|
+
from pykalshi.models import OrderModel
|
|
230
230
|
|
|
231
231
|
# Initial order state
|
|
232
232
|
initial_model = OrderModel(
|
|
@@ -257,8 +257,8 @@ def test_order_cancel_delegates_to_portfolio(client, mock_response):
|
|
|
257
257
|
|
|
258
258
|
def test_order_amend(client, mock_response):
|
|
259
259
|
"""Test Order.amend() method."""
|
|
260
|
-
from
|
|
261
|
-
from
|
|
260
|
+
from pykalshi.orders import Order
|
|
261
|
+
from pykalshi.models import OrderModel
|
|
262
262
|
|
|
263
263
|
initial_model = OrderModel(
|
|
264
264
|
order_id="order-abc-123",
|
|
@@ -292,8 +292,8 @@ def test_order_amend(client, mock_response):
|
|
|
292
292
|
|
|
293
293
|
def test_order_decrease(client, mock_response):
|
|
294
294
|
"""Test Order.decrease() method."""
|
|
295
|
-
from
|
|
296
|
-
from
|
|
295
|
+
from pykalshi.orders import Order
|
|
296
|
+
from pykalshi.models import OrderModel
|
|
297
297
|
|
|
298
298
|
initial_model = OrderModel(
|
|
299
299
|
order_id="order-abc-123",
|
|
@@ -327,8 +327,8 @@ def test_order_decrease(client, mock_response):
|
|
|
327
327
|
|
|
328
328
|
def test_order_refresh(client, mock_response):
|
|
329
329
|
"""Test Order.refresh() method."""
|
|
330
|
-
from
|
|
331
|
-
from
|
|
330
|
+
from pykalshi.orders import Order
|
|
331
|
+
from pykalshi.models import OrderModel
|
|
332
332
|
|
|
333
333
|
initial_model = OrderModel(
|
|
334
334
|
order_id="order-abc-123",
|
|
@@ -4,8 +4,8 @@ import pytest
|
|
|
4
4
|
import json
|
|
5
5
|
from unittest.mock import ANY
|
|
6
6
|
|
|
7
|
-
from
|
|
8
|
-
from
|
|
7
|
+
from pykalshi import Series
|
|
8
|
+
from pykalshi.enums import CandlestickPeriod
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class TestGetSeries:
|
|
@@ -38,7 +38,7 @@ class TestGetSeries:
|
|
|
38
38
|
|
|
39
39
|
def test_get_series_not_found(self, client, mock_response):
|
|
40
40
|
"""Test fetching non-existent series raises error."""
|
|
41
|
-
from
|
|
41
|
+
from pykalshi.exceptions import ResourceNotFoundError
|
|
42
42
|
|
|
43
43
|
client._session.request.return_value = mock_response(
|
|
44
44
|
{"message": "Series not found"}, status_code=404
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
kalshi_api
|
|
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
|