dungeoncoder 0.2.2__tar.gz → 0.2.4__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.
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/PKG-INFO +1 -1
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/__init__.py +1 -1
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/dungeoncoder.py +38 -10
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder.egg-info/PKG-INFO +1 -1
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/LICENSE.txt +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/README.md +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/__main__.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_api_config.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/__init__.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/__init__.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/game/__init__.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/game/get_statistics.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/game/get_version.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/__init__.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/ask_oracle.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/configure.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/drop.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/get_inventory.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/get_items_at_position.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/interact.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_abyss_in_front.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_at_goal.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_collision_in_front.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_enemy_in_front.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_facing_north.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_switch_in_front.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_torch_in_front.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/move.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/peek_item_value.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/pickup.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/read_item_value.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/sense_goal.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/set_pace.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/turn_left.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/level/__init__.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/level/load_level.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/level/reset_level.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/client.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/errors.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/__init__.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/api_error_response.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/api_error_response_status.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/boolean_result.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/boolean_result_status.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/configure_params.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/distance_param.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/name_param.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/nullable_integer_result.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/nullable_integer_result_status.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/nullable_string_result.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/nullable_string_result_status.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/pace_params.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/statistics.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/statistics_result.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/statistics_result_status.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/string_array_result.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/string_array_result_status.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/tiled_level.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/version_result.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/version_result_result.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/version_result_status.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/types.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/asciimap.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/generator.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/packs/gelaende.json +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/packs/items.json +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/packs/station.json +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/packs/studio.json +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/packs/tilesets.json +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/packs/werkstatt.json +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/replay.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/requirements.txt +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/sim.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/testing.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/trace.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/variants.py +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder.egg-info/SOURCES.txt +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder.egg-info/dependency_links.txt +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder.egg-info/requires.txt +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder.egg-info/top_level.txt +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/pyproject.toml +0 -0
- {dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dungeoncoder
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: Python API for Dungeon Coder: steer the hero from a script, in VS Code or in the built-in simulator
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
Project-URL: Homepage, https://github.com/mhobelsb/vsc_hm-dungeon-coder
|
|
@@ -79,6 +79,11 @@ DEFAULT_BASE_URL = _discover_base_url()
|
|
|
79
79
|
# after 5 s + step time (src/extension.ts), so the client waits a bit longer.
|
|
80
80
|
_STEP_SECONDS = 0.5
|
|
81
81
|
_ACTION_TIMEOUT_SLACK = 6.0
|
|
82
|
+
# Sensors, queries and loading a level: the game answers at once, but a busy machine (or a game tab
|
|
83
|
+
# that is briefly blocked) can delay the answer. With a 1 s limit such a call returned its default
|
|
84
|
+
# (False) and a program's view of the world silently went wrong (B25: a turn too many). Connecting
|
|
85
|
+
# stays quick, so a game that isn't running is reported at once.
|
|
86
|
+
_ANSWER_TIMEOUT = httpx.Timeout(10.0, connect=1.0)
|
|
82
87
|
|
|
83
88
|
|
|
84
89
|
def _extract_message(response) -> str:
|
|
@@ -125,7 +130,7 @@ def _check_version(base_url):
|
|
|
125
130
|
_version_checked = True
|
|
126
131
|
from . import __version__
|
|
127
132
|
try:
|
|
128
|
-
response = _get_version_api.sync_detailed(client=Client(base_url=base_url, timeout=
|
|
133
|
+
response = _get_version_api.sync_detailed(client=Client(base_url=base_url, timeout=_ANSWER_TIMEOUT))
|
|
129
134
|
except Exception:
|
|
130
135
|
return # no game running: loading the level says so
|
|
131
136
|
if response.status_code == 404:
|
|
@@ -202,7 +207,7 @@ class Hero:
|
|
|
202
207
|
|
|
203
208
|
def __init__(self, base_url: str = BASE_URL, index: int = 0):
|
|
204
209
|
self._base_url = base_url
|
|
205
|
-
self._client = Client(base_url=base_url, timeout=
|
|
210
|
+
self._client = Client(base_url=base_url, timeout=_ANSWER_TIMEOUT)
|
|
206
211
|
self._pace = 1.0
|
|
207
212
|
self._action_client = self._make_action_client()
|
|
208
213
|
self._index = index # which hero in a co-op level (0 = MainCharacter)
|
|
@@ -339,18 +344,37 @@ class Game:
|
|
|
339
344
|
"""
|
|
340
345
|
|
|
341
346
|
BASE_URL = DEFAULT_BASE_URL
|
|
342
|
-
|
|
343
|
-
|
|
347
|
+
SHOW_CALLS = None
|
|
348
|
+
"""True or False: the list of the program's last calls in the game's corner, for every level
|
|
349
|
+
loaded after this (level property show_calls); None: as the level says (off unless it says on)."""
|
|
350
|
+
SHOW_SENSING = None
|
|
351
|
+
"""True or False: the frames around the cells a sensor looked at, for every level loaded after
|
|
352
|
+
this (level property show_sensing); None: as the level says (on unless it says off)."""
|
|
353
|
+
|
|
354
|
+
def __init__(self, level_file, seed: int | None = None, show_calls: bool | None = None,
|
|
355
|
+
show_sensing: bool | None = None):
|
|
344
356
|
"""Loads the level. `seed` picks a variant of a level that has some (objects that may
|
|
345
|
-
lie anywhere in a region, see variants.py): the same seed, the same variant.
|
|
357
|
+
lie anywhere in a region, see variants.py): the same seed, the same variant.
|
|
358
|
+
`show_calls` and `show_sensing` (True or False) switch the list of the last calls and the
|
|
359
|
+
sensor frames on or off for this level; without them, Game.SHOW_CALLS and
|
|
360
|
+
Game.SHOW_SENSING decide, and if those are None, the level does."""
|
|
346
361
|
_check_version(self.BASE_URL)
|
|
347
362
|
if seed is not None and (type(seed) != int):
|
|
348
363
|
print("Error: seed must be a whole number.")
|
|
349
364
|
sys.exit(1)
|
|
365
|
+
display = {}
|
|
366
|
+
for name, value, default in (("show_calls", show_calls, self.SHOW_CALLS),
|
|
367
|
+
("show_sensing", show_sensing, self.SHOW_SENSING)):
|
|
368
|
+
chosen = value if value is not None else default
|
|
369
|
+
if chosen is not None and type(chosen) != bool:
|
|
370
|
+
print(f"Error: {name} must be True or False (or None: as the level says).")
|
|
371
|
+
sys.exit(1)
|
|
372
|
+
if chosen is not None:
|
|
373
|
+
display[name] = chosen
|
|
350
374
|
self.__level = self.Level(self.BASE_URL)
|
|
351
375
|
try:
|
|
352
376
|
trace.loading(level_file)
|
|
353
|
-
loaded = self.__level.load(level_file, seed)
|
|
377
|
+
loaded = self.__level.load(level_file, seed, display)
|
|
354
378
|
except FileNotFoundError:
|
|
355
379
|
print(f"Error: Level file '{level_file}' not found. "
|
|
356
380
|
f"Please check the path and that you opened the right folder in VS Code "
|
|
@@ -376,7 +400,8 @@ class Game:
|
|
|
376
400
|
"""The seed of this level (a generated level or a variant), or None."""
|
|
377
401
|
|
|
378
402
|
@classmethod
|
|
379
|
-
def generate(cls, seed: int | None = None, kind: str = "maze",
|
|
403
|
+
def generate(cls, seed: int | None = None, kind: str = "maze", show_calls: bool | None = None,
|
|
404
|
+
show_sensing: bool | None = None, **options) -> "Game":
|
|
380
405
|
"""Loads a generated level; the same seed always gives the same level.
|
|
381
406
|
Without a seed, a new level each time: its seed is printed and kept in game.seed.
|
|
382
407
|
|
|
@@ -396,7 +421,7 @@ class Game:
|
|
|
396
421
|
path = os.path.join(tempfile.mkdtemp(prefix="dungeoncoder-"), f"{kind}_{seed}.txt")
|
|
397
422
|
with open(path, "w", encoding="utf-8") as f:
|
|
398
423
|
f.write(text)
|
|
399
|
-
return cls(path)
|
|
424
|
+
return cls(path, show_calls=show_calls, show_sensing=show_sensing)
|
|
400
425
|
|
|
401
426
|
def get_hero(self):
|
|
402
427
|
return self.__hero
|
|
@@ -434,10 +459,10 @@ class Game:
|
|
|
434
459
|
A class to manage game levels.
|
|
435
460
|
"""
|
|
436
461
|
def __init__(self, base_url):
|
|
437
|
-
self._client = Client(base_url=base_url, timeout=
|
|
462
|
+
self._client = Client(base_url=base_url, timeout=_ANSWER_TIMEOUT)
|
|
438
463
|
self.seed = None
|
|
439
464
|
|
|
440
|
-
def load(self, filename, seed=None):
|
|
465
|
+
def load(self, filename, seed=None, display=None):
|
|
441
466
|
"""
|
|
442
467
|
Loads a level from a Tiled JSON file, or builds it from an ASCII map
|
|
443
468
|
(a file ending in .txt, see asciimap.py for the format).
|
|
@@ -469,6 +494,9 @@ class Game:
|
|
|
469
494
|
elif chosen:
|
|
470
495
|
print(f"Level variant {self.seed} (the same again: Game(\"{filename}\", seed={self.seed}))")
|
|
471
496
|
|
|
497
|
+
for name, value in (display or {}).items(): # show_calls, show_sensing from the program
|
|
498
|
+
properties = [p for p in level_data.get("properties", []) or [] if p.get("name") != name]
|
|
499
|
+
level_data["properties"] = properties + [{"name": name, "type": "bool", "value": value}]
|
|
472
500
|
# a refused level (e.g. a missing asset pack) prints the game's explanation
|
|
473
501
|
return _call(self._client, _load_level_api.sync_detailed, default=False,
|
|
474
502
|
explain_refusal=True, body=TiledLevel.from_dict(level_data))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dungeoncoder
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: Python API for Dungeon Coder: steer the hero from a script, in VS Code or in the built-in simulator
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
Project-URL: Homepage, https://github.com/mhobelsb/vsc_hm-dungeon-coder
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/game/get_statistics.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/get_items_at_position.py
RENAMED
|
File without changes
|
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_abyss_in_front.py
RENAMED
|
File without changes
|
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_collision_in_front.py
RENAMED
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_enemy_in_front.py
RENAMED
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_facing_north.py
RENAMED
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_switch_in_front.py
RENAMED
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/is_torch_in_front.py
RENAMED
|
File without changes
|
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/peek_item_value.py
RENAMED
|
File without changes
|
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/api/hero/read_item_value.py
RENAMED
|
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
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/api_error_response.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/boolean_result_status.py
RENAMED
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/configure_params.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/nullable_integer_result.py
RENAMED
|
File without changes
|
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/nullable_string_result.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/statistics_result.py
RENAMED
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/statistics_result_status.py
RENAMED
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/string_array_result.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/version_result_result.py
RENAMED
|
File without changes
|
{dungeoncoder-0.2.2 → dungeoncoder-0.2.4}/dungeoncoder/_generated/models/version_result_status.py
RENAMED
|
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
|