prediction-market-agent-tooling 0.37.0__tar.gz → 0.38.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.
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/PKG-INFO +2 -1
- prediction_market_agent_tooling-0.38.0/prediction_market_agent_tooling/abis/omen_thumbnailmapping.abi.json +52 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/gtypes.py +1 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/omen/omen_contracts.py +65 -1
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/web3_utils.py +22 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/pyproject.toml +2 -1
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/LICENSE +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/README.md +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/abis/erc20.abi.json +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/abis/omen_dxdao.abi.json +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/abis/omen_fpmm.abi.json +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/abis/omen_fpmm_conditionaltokens.abi.json +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/abis/omen_fpmm_factory.abi.json +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/abis/omen_kleros.abi.json +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/abis/omen_oracle.abi.json +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/abis/omen_realitio.abi.json +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/abis/wxdai.abi.json +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/benchmark/__init__.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/benchmark/agents.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/benchmark/benchmark.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/benchmark/utils.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/config.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/deploy/agent.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/deploy/agent_example.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/deploy/constants.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/deploy/gcp/deploy.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/deploy/gcp/kubernetes_models.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/deploy/gcp/utils.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/loggers.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/agent_market.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/categorize.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/data_models.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/manifold/__init__.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/manifold/api.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/manifold/data_models.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/manifold/manifold.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/manifold/utils.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/markets.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/omen/__init__.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/omen/data_models.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/omen/omen.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/omen/omen_resolving.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/omen/omen_subgraph_handler.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/polymarket/api.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/polymarket/data_models.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/polymarket/data_models_web.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/polymarket/polymarket.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/markets/polymarket/utils.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/monitor/langfuse/langfuse_wrapper.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/monitor/markets/manifold.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/monitor/markets/omen.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/monitor/markets/polymarket.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/monitor/monitor.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/monitor/monitor_app.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/monitor/monitor_settings.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/py.typed +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/balances.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/betting_strategies/kelly_criterion.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/betting_strategies/market_moving.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/betting_strategies/minimum_bet_to_win.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/betting_strategies/stretch_bet_between.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/cache.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/contract.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/costs.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/gnosis_rpc.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/google.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/hexbytes_custom.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/image_gen/image_gen.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/image_gen/market_thumbnail_gen.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/is_predictable.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/parallelism.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/safe.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/singleton.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/streamlit_user_login.py +0 -0
- {prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/prediction_market_agent_tooling/tools/utils.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: prediction-market-agent-tooling
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.38.0
|
4
4
|
Summary: Tools to benchmark, deploy and monitor prediction market agents.
|
5
5
|
Author: Gnosis
|
6
6
|
Requires-Python: >=3.10,<3.12
|
@@ -11,6 +11,7 @@ Provides-Extra: google
|
|
11
11
|
Provides-Extra: langchain
|
12
12
|
Provides-Extra: openai
|
13
13
|
Requires-Dist: autoflake (>=2.2.1,<3.0.0)
|
14
|
+
Requires-Dist: base58 (>=2.1.1,<3.0.0)
|
14
15
|
Requires-Dist: cron-validator (>=1.0.8,<2.0.0)
|
15
16
|
Requires-Dist: eth-account (>=0.8.0,<0.9.0)
|
16
17
|
Requires-Dist: eth-typing (>=3.0.0,<4.0.0)
|
@@ -0,0 +1,52 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"type": "function",
|
4
|
+
"name": "get",
|
5
|
+
"inputs": [
|
6
|
+
{
|
7
|
+
"name": "marketAddress",
|
8
|
+
"type": "address",
|
9
|
+
"internalType": "address"
|
10
|
+
}
|
11
|
+
],
|
12
|
+
"outputs": [
|
13
|
+
{
|
14
|
+
"name": "",
|
15
|
+
"type": "bytes32",
|
16
|
+
"internalType": "bytes32"
|
17
|
+
}
|
18
|
+
],
|
19
|
+
"stateMutability": "view"
|
20
|
+
},
|
21
|
+
{
|
22
|
+
"type": "function",
|
23
|
+
"name": "remove",
|
24
|
+
"inputs": [
|
25
|
+
{
|
26
|
+
"name": "marketAddress",
|
27
|
+
"type": "address",
|
28
|
+
"internalType": "address"
|
29
|
+
}
|
30
|
+
],
|
31
|
+
"outputs": [],
|
32
|
+
"stateMutability": "nonpayable"
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"type": "function",
|
36
|
+
"name": "set",
|
37
|
+
"inputs": [
|
38
|
+
{
|
39
|
+
"name": "marketAddress",
|
40
|
+
"type": "address",
|
41
|
+
"internalType": "address"
|
42
|
+
},
|
43
|
+
{
|
44
|
+
"name": "image_hash",
|
45
|
+
"type": "bytes32",
|
46
|
+
"internalType": "bytes32"
|
47
|
+
}
|
48
|
+
],
|
49
|
+
"outputs": [],
|
50
|
+
"stateMutability": "nonpayable"
|
51
|
+
}
|
52
|
+
]
|
@@ -34,6 +34,7 @@ Mana = NewType("Mana", float) # Manifold's "currency"
|
|
34
34
|
USDC = NewType("USDC", float)
|
35
35
|
DatetimeWithTimezone = NewType("DatetimeWithTimezone", datetime)
|
36
36
|
ChainID = NewType("ChainID", int)
|
37
|
+
IPFSCIDVersion0 = NewType("IPFSCIDVersion0", str)
|
37
38
|
|
38
39
|
|
39
40
|
def usd_type(amount: Union[str, int, float]) -> USD:
|
@@ -13,6 +13,7 @@ from prediction_market_agent_tooling.gtypes import (
|
|
13
13
|
HexAddress,
|
14
14
|
HexBytes,
|
15
15
|
HexStr,
|
16
|
+
IPFSCIDVersion0,
|
16
17
|
OmenOutcomeToken,
|
17
18
|
TxParams,
|
18
19
|
TxReceipt,
|
@@ -26,7 +27,12 @@ from prediction_market_agent_tooling.tools.contract import (
|
|
26
27
|
ContractOnGnosisChain,
|
27
28
|
abi_field_validator,
|
28
29
|
)
|
29
|
-
from prediction_market_agent_tooling.tools.web3_utils import
|
30
|
+
from prediction_market_agent_tooling.tools.web3_utils import (
|
31
|
+
ZERO_BYTES,
|
32
|
+
byte32_to_ipfscidv0,
|
33
|
+
ipfscidv0_to_byte32,
|
34
|
+
xdai_to_wei,
|
35
|
+
)
|
30
36
|
|
31
37
|
|
32
38
|
class OmenOracleContract(ContractOnGnosisChain):
|
@@ -610,3 +616,61 @@ class OmenRealitioContract(ContractOnGnosisChain):
|
|
610
616
|
web3: Web3 | None = None,
|
611
617
|
) -> TxReceipt:
|
612
618
|
return self.send(api_keys=api_keys, function_name="withdraw", web3=web3)
|
619
|
+
|
620
|
+
|
621
|
+
class OmenThumbnailMapping(ContractOnGnosisChain):
|
622
|
+
# Contract ABI taken from built https://github.com/gnosis/labs-contracts.
|
623
|
+
abi: ABI = abi_field_validator(
|
624
|
+
os.path.join(
|
625
|
+
os.path.dirname(os.path.realpath(__file__)),
|
626
|
+
"../../abis/omen_thumbnailmapping.abi.json",
|
627
|
+
)
|
628
|
+
)
|
629
|
+
address: ChecksumAddress = Web3.to_checksum_address(
|
630
|
+
"0x5D8B7B619EcdE05B8A94C0a0E99E0A0727A0e2e7"
|
631
|
+
)
|
632
|
+
|
633
|
+
def get(
|
634
|
+
self,
|
635
|
+
market_address: ChecksumAddress,
|
636
|
+
web3: Web3 | None = None,
|
637
|
+
) -> IPFSCIDVersion0 | None:
|
638
|
+
hash_bytes = HexBytes(
|
639
|
+
self.call("get", function_params=[market_address], web3=web3)
|
640
|
+
)
|
641
|
+
return byte32_to_ipfscidv0(hash_bytes) if hash_bytes != ZERO_BYTES else None
|
642
|
+
|
643
|
+
def get_url(
|
644
|
+
self,
|
645
|
+
market_address: ChecksumAddress,
|
646
|
+
web3: Web3 | None = None,
|
647
|
+
) -> str | None:
|
648
|
+
hash_ = self.get(market_address, web3)
|
649
|
+
return f"https://ipfs.io/ipfs/{hash_}" if hash_ is not None else None
|
650
|
+
|
651
|
+
def set(
|
652
|
+
self,
|
653
|
+
api_keys: APIKeys,
|
654
|
+
market_address: ChecksumAddress,
|
655
|
+
image_hash: IPFSCIDVersion0,
|
656
|
+
web3: Web3 | None = None,
|
657
|
+
) -> TxReceipt:
|
658
|
+
return self.send(
|
659
|
+
api_keys=api_keys,
|
660
|
+
function_name="set",
|
661
|
+
function_params=[market_address, ipfscidv0_to_byte32(image_hash)],
|
662
|
+
web3=web3,
|
663
|
+
)
|
664
|
+
|
665
|
+
def remove(
|
666
|
+
self,
|
667
|
+
api_keys: APIKeys,
|
668
|
+
market_address: ChecksumAddress,
|
669
|
+
web3: Web3 | None = None,
|
670
|
+
) -> TxReceipt:
|
671
|
+
return self.send(
|
672
|
+
api_keys=api_keys,
|
673
|
+
function_name="remove",
|
674
|
+
function_params=[market_address],
|
675
|
+
web3=web3,
|
676
|
+
)
|
@@ -1,5 +1,7 @@
|
|
1
|
+
import binascii
|
1
2
|
from typing import Any, Optional, TypeVar
|
2
3
|
|
4
|
+
import base58
|
3
5
|
import tenacity
|
4
6
|
from eth_account import Account
|
5
7
|
from eth_typing import URI
|
@@ -16,6 +18,7 @@ from prediction_market_agent_tooling.gtypes import (
|
|
16
18
|
HexAddress,
|
17
19
|
HexBytes,
|
18
20
|
HexStr,
|
21
|
+
IPFSCIDVersion0,
|
19
22
|
PrivateKey,
|
20
23
|
xDai,
|
21
24
|
xdai_type,
|
@@ -287,3 +290,22 @@ def send_xdai_to(
|
|
287
290
|
web3, tx_params_new, from_private_key, timeout
|
288
291
|
)
|
289
292
|
return receipt_tx
|
293
|
+
|
294
|
+
|
295
|
+
def ipfscidv0_to_byte32(cid: IPFSCIDVersion0) -> HexBytes:
|
296
|
+
"""
|
297
|
+
Convert ipfscidv0 to 32 bytes.
|
298
|
+
Modified from https://github.com/emg110/ipfs2bytes32/blob/main/python/ipfs2bytes32.py
|
299
|
+
"""
|
300
|
+
decoded = base58.b58decode(cid)
|
301
|
+
sliced_decoded = decoded[2:]
|
302
|
+
return HexBytes(binascii.b2a_hex(sliced_decoded).decode("utf-8"))
|
303
|
+
|
304
|
+
|
305
|
+
def byte32_to_ipfscidv0(hex: HexBytes) -> IPFSCIDVersion0:
|
306
|
+
"""
|
307
|
+
Convert 32 bytes hex to ipfscidv0.
|
308
|
+
Modified from https://github.com/emg110/ipfs2bytes32/blob/main/python/ipfs2bytes32.py
|
309
|
+
"""
|
310
|
+
completed_binary_str = b"\x12 " + hex
|
311
|
+
return IPFSCIDVersion0(base58.b58encode(completed_binary_str).decode("utf-8"))
|
{prediction_market_agent_tooling-0.37.0 → prediction_market_agent_tooling-0.38.0}/pyproject.toml
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "prediction-market-agent-tooling"
|
3
|
-
version = "0.
|
3
|
+
version = "0.38.0"
|
4
4
|
description = "Tools to benchmark, deploy and monitor prediction market agents."
|
5
5
|
authors = ["Gnosis"]
|
6
6
|
readme = "README.md"
|
@@ -42,6 +42,7 @@ prompt-toolkit = "^3.0.43"
|
|
42
42
|
safe-cli = "^1.0.0"
|
43
43
|
langfuse = "^2.27.1"
|
44
44
|
openai = { version = "^1.0.0", optional = true}
|
45
|
+
base58 = "^2.1.1"
|
45
46
|
|
46
47
|
[tool.poetry.extras]
|
47
48
|
openai = ["openai"]
|
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
|
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
|