codext 1.15.9__tar.gz → 1.15.10__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.
Files changed (127) hide show
  1. {codext-1.15.9 → codext-1.15.10}/.github/workflows/python-package.yml +2 -1
  2. {codext-1.15.9 → codext-1.15.10}/PKG-INFO +1 -1
  3. {codext-1.15.9 → codext-1.15.10}/docs/coverage.svg +1 -1
  4. {codext-1.15.9 → codext-1.15.10}/requirements.txt +1 -1
  5. codext-1.15.10/src/codext/VERSION.txt +1 -0
  6. {codext-1.15.9 → codext-1.15.10}/src/codext/__common__.py +11 -9
  7. {codext-1.15.9 → codext-1.15.10}/src/codext/hashing/__init__.py +9 -8
  8. {codext-1.15.9 → codext-1.15.10}/src/codext/hashing/blake.py +1 -1
  9. {codext-1.15.9 → codext-1.15.10}/src/codext/hashing/checksums.py +1 -1
  10. {codext-1.15.9 → codext-1.15.10}/src/codext/hashing/crypt.py +1 -1
  11. {codext-1.15.9 → codext-1.15.10}/src/codext/hashing/md.py +1 -2
  12. codext-1.15.10/src/codext/hashing/mmh3.py +18 -0
  13. {codext-1.15.9 → codext-1.15.10}/src/codext/hashing/sha.py +1 -1
  14. {codext-1.15.9 → codext-1.15.10}/src/codext/hashing/shake.py +1 -1
  15. {codext-1.15.9 → codext-1.15.10}/src/codext.egg-info/PKG-INFO +1 -1
  16. {codext-1.15.9 → codext-1.15.10}/src/codext.egg-info/SOURCES.txt +1 -0
  17. codext-1.15.9/src/codext/VERSION.txt +0 -1
  18. {codext-1.15.9 → codext-1.15.10}/.coveragerc +0 -0
  19. {codext-1.15.9 → codext-1.15.10}/.gitignore +0 -0
  20. {codext-1.15.9 → codext-1.15.10}/.readthedocs.yml +0 -0
  21. {codext-1.15.9 → codext-1.15.10}/LICENSE +0 -0
  22. {codext-1.15.9 → codext-1.15.10}/README.md +0 -0
  23. {codext-1.15.9 → codext-1.15.10}/docs/mkdocs.yml +0 -0
  24. {codext-1.15.9 → codext-1.15.10}/docs/pages/cli.md +0 -0
  25. {codext-1.15.9 → codext-1.15.10}/docs/pages/css/extra.css +0 -0
  26. {codext-1.15.9 → codext-1.15.10}/docs/pages/demos/using-bases.gif +0 -0
  27. {codext-1.15.9 → codext-1.15.10}/docs/pages/demos/using-codext.gif +0 -0
  28. {codext-1.15.9 → codext-1.15.10}/docs/pages/demos/using-debase.gif +0 -0
  29. {codext-1.15.9 → codext-1.15.10}/docs/pages/enc/base.md +0 -0
  30. {codext-1.15.9 → codext-1.15.10}/docs/pages/enc/binary.md +0 -0
  31. {codext-1.15.9 → codext-1.15.10}/docs/pages/enc/common.md +0 -0
  32. {codext-1.15.9 → codext-1.15.10}/docs/pages/enc/compressions.md +0 -0
  33. {codext-1.15.9 → codext-1.15.10}/docs/pages/enc/crypto.md +0 -0
  34. {codext-1.15.9 → codext-1.15.10}/docs/pages/enc/hashing.md +0 -0
  35. {codext-1.15.9 → codext-1.15.10}/docs/pages/enc/languages.md +0 -0
  36. {codext-1.15.9 → codext-1.15.10}/docs/pages/enc/others.md +0 -0
  37. {codext-1.15.9 → codext-1.15.10}/docs/pages/enc/stegano.md +0 -0
  38. {codext-1.15.9 → codext-1.15.10}/docs/pages/enc/web.md +0 -0
  39. {codext-1.15.9 → codext-1.15.10}/docs/pages/features.md +0 -0
  40. {codext-1.15.9 → codext-1.15.10}/docs/pages/guessing.md +0 -0
  41. {codext-1.15.9 → codext-1.15.10}/docs/pages/howto.md +0 -0
  42. {codext-1.15.9 → codext-1.15.10}/docs/pages/img/banner.png +0 -0
  43. {codext-1.15.9 → codext-1.15.10}/docs/pages/img/icon.png +0 -0
  44. {codext-1.15.9 → codext-1.15.10}/docs/pages/img/logo.png +0 -0
  45. {codext-1.15.9 → codext-1.15.10}/docs/pages/index.md +0 -0
  46. {codext-1.15.9 → codext-1.15.10}/docs/pages/manipulations.md +0 -0
  47. {codext-1.15.9 → codext-1.15.10}/docs/requirements.txt +0 -0
  48. {codext-1.15.9 → codext-1.15.10}/pyproject.toml +0 -0
  49. {codext-1.15.9 → codext-1.15.10}/pytest.ini +0 -0
  50. {codext-1.15.9 → codext-1.15.10}/setup.cfg +0 -0
  51. {codext-1.15.9 → codext-1.15.10}/src/codext/__info__.py +0 -0
  52. {codext-1.15.9 → codext-1.15.10}/src/codext/__init__.py +0 -0
  53. {codext-1.15.9 → codext-1.15.10}/src/codext/base/__init__.py +0 -0
  54. {codext-1.15.9 → codext-1.15.10}/src/codext/base/_base.py +0 -0
  55. {codext-1.15.9 → codext-1.15.10}/src/codext/base/_base2n.py +0 -0
  56. {codext-1.15.9 → codext-1.15.10}/src/codext/base/base100.py +0 -0
  57. {codext-1.15.9 → codext-1.15.10}/src/codext/base/base122.py +0 -0
  58. {codext-1.15.9 → codext-1.15.10}/src/codext/base/base45.py +0 -0
  59. {codext-1.15.9 → codext-1.15.10}/src/codext/base/base85.py +0 -0
  60. {codext-1.15.9 → codext-1.15.10}/src/codext/base/base91.py +0 -0
  61. {codext-1.15.9 → codext-1.15.10}/src/codext/base/baseN.py +0 -0
  62. {codext-1.15.9 → codext-1.15.10}/src/codext/binary/__init__.py +0 -0
  63. {codext-1.15.9 → codext-1.15.10}/src/codext/binary/baudot.py +0 -0
  64. {codext-1.15.9 → codext-1.15.10}/src/codext/binary/bcd.py +0 -0
  65. {codext-1.15.9 → codext-1.15.10}/src/codext/binary/excess3.py +0 -0
  66. {codext-1.15.9 → codext-1.15.10}/src/codext/binary/gray.py +0 -0
  67. {codext-1.15.9 → codext-1.15.10}/src/codext/binary/manchester.py +0 -0
  68. {codext-1.15.9 → codext-1.15.10}/src/codext/binary/rotate.py +0 -0
  69. {codext-1.15.9 → codext-1.15.10}/src/codext/common/__init__.py +0 -0
  70. {codext-1.15.9 → codext-1.15.10}/src/codext/common/a1z26.py +0 -0
  71. {codext-1.15.9 → codext-1.15.10}/src/codext/common/cases.py +0 -0
  72. {codext-1.15.9 → codext-1.15.10}/src/codext/common/dummy.py +0 -0
  73. {codext-1.15.9 → codext-1.15.10}/src/codext/common/octal.py +0 -0
  74. {codext-1.15.9 → codext-1.15.10}/src/codext/common/ordinal.py +0 -0
  75. {codext-1.15.9 → codext-1.15.10}/src/codext/compressions/__init__.py +0 -0
  76. {codext-1.15.9 → codext-1.15.10}/src/codext/compressions/gzipp.py +0 -0
  77. {codext-1.15.9 → codext-1.15.10}/src/codext/compressions/lz77.py +0 -0
  78. {codext-1.15.9 → codext-1.15.10}/src/codext/compressions/lz78.py +0 -0
  79. {codext-1.15.9 → codext-1.15.10}/src/codext/compressions/pkzip.py +0 -0
  80. {codext-1.15.9 → codext-1.15.10}/src/codext/crypto/__init__.py +0 -0
  81. {codext-1.15.9 → codext-1.15.10}/src/codext/crypto/affine.py +0 -0
  82. {codext-1.15.9 → codext-1.15.10}/src/codext/crypto/atbash.py +0 -0
  83. {codext-1.15.9 → codext-1.15.10}/src/codext/crypto/bacon.py +0 -0
  84. {codext-1.15.9 → codext-1.15.10}/src/codext/crypto/barbie.py +0 -0
  85. {codext-1.15.9 → codext-1.15.10}/src/codext/crypto/citrix.py +0 -0
  86. {codext-1.15.9 → codext-1.15.10}/src/codext/crypto/railfence.py +0 -0
  87. {codext-1.15.9 → codext-1.15.10}/src/codext/crypto/rot.py +0 -0
  88. {codext-1.15.9 → codext-1.15.10}/src/codext/crypto/scytale.py +0 -0
  89. {codext-1.15.9 → codext-1.15.10}/src/codext/crypto/shift.py +0 -0
  90. {codext-1.15.9 → codext-1.15.10}/src/codext/crypto/xor.py +0 -0
  91. {codext-1.15.9 → codext-1.15.10}/src/codext/languages/__init__.py +0 -0
  92. {codext-1.15.9 → codext-1.15.10}/src/codext/languages/braille.py +0 -0
  93. {codext-1.15.9 → codext-1.15.10}/src/codext/languages/galactic.py +0 -0
  94. {codext-1.15.9 → codext-1.15.10}/src/codext/languages/ipsum.py +0 -0
  95. {codext-1.15.9 → codext-1.15.10}/src/codext/languages/leetspeak.py +0 -0
  96. {codext-1.15.9 → codext-1.15.10}/src/codext/languages/morse.py +0 -0
  97. {codext-1.15.9 → codext-1.15.10}/src/codext/languages/navajo.py +0 -0
  98. {codext-1.15.9 → codext-1.15.10}/src/codext/languages/radio.py +0 -0
  99. {codext-1.15.9 → codext-1.15.10}/src/codext/languages/southpark.py +0 -0
  100. {codext-1.15.9 → codext-1.15.10}/src/codext/languages/tap.py +0 -0
  101. {codext-1.15.9 → codext-1.15.10}/src/codext/languages/tomtom.py +0 -0
  102. {codext-1.15.9 → codext-1.15.10}/src/codext/macros.json +0 -0
  103. {codext-1.15.9 → codext-1.15.10}/src/codext/others/__init__.py +0 -0
  104. {codext-1.15.9 → codext-1.15.10}/src/codext/others/dna.py +0 -0
  105. {codext-1.15.9 → codext-1.15.10}/src/codext/others/kbshift.py +0 -0
  106. {codext-1.15.9 → codext-1.15.10}/src/codext/others/letters.py +0 -0
  107. {codext-1.15.9 → codext-1.15.10}/src/codext/others/markdown.py +0 -0
  108. {codext-1.15.9 → codext-1.15.10}/src/codext/others/uuencode.py +0 -0
  109. {codext-1.15.9 → codext-1.15.10}/src/codext/stegano/__init__.py +0 -0
  110. {codext-1.15.9 → codext-1.15.10}/src/codext/stegano/hexagram.py +0 -0
  111. {codext-1.15.9 → codext-1.15.10}/src/codext/stegano/klopf.py +0 -0
  112. {codext-1.15.9 → codext-1.15.10}/src/codext/stegano/resistor.py +0 -0
  113. {codext-1.15.9 → codext-1.15.10}/src/codext/stegano/rick.py +0 -0
  114. {codext-1.15.9 → codext-1.15.10}/src/codext/stegano/sms.py +0 -0
  115. {codext-1.15.9 → codext-1.15.10}/src/codext/stegano/whitespace.py +0 -0
  116. {codext-1.15.9 → codext-1.15.10}/src/codext/web/__init__.py +0 -0
  117. {codext-1.15.9 → codext-1.15.10}/src/codext/web/html.py +0 -0
  118. {codext-1.15.9 → codext-1.15.10}/src/codext/web/url.py +0 -0
  119. {codext-1.15.9 → codext-1.15.10}/src/codext.egg-info/dependency_links.txt +0 -0
  120. {codext-1.15.9 → codext-1.15.10}/src/codext.egg-info/entry_points.txt +0 -0
  121. {codext-1.15.9 → codext-1.15.10}/src/codext.egg-info/requires.txt +0 -0
  122. {codext-1.15.9 → codext-1.15.10}/src/codext.egg-info/top_level.txt +0 -0
  123. {codext-1.15.9 → codext-1.15.10}/tests/__init__.py +0 -0
  124. {codext-1.15.9 → codext-1.15.10}/tests/test_base.py +0 -0
  125. {codext-1.15.9 → codext-1.15.10}/tests/test_common.py +0 -0
  126. {codext-1.15.9 → codext-1.15.10}/tests/test_generated.py +0 -0
  127. {codext-1.15.9 → codext-1.15.10}/tests/test_manual.py +0 -0
@@ -31,6 +31,7 @@ jobs:
31
31
  python -m pip install --upgrade pip
32
32
  python -m pip install pytest pytest-cov coverage
33
33
  pip install -r requirements.txt
34
+ pip install tinyscript>=1.31
34
35
  pip install .
35
36
  - name: Test ${{ env.package }} with pytest
36
37
  run: |
@@ -45,7 +46,7 @@ jobs:
45
46
  - name: Set up Python ${{ matrix.python-version }}
46
47
  uses: actions/setup-python@v4
47
48
  with:
48
- python-version: "3.12"
49
+ python-version: "3.13"
49
50
  - name: Install ${{ env.package }}
50
51
  run: |
51
52
  python -m pip install --upgrade pip
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codext
3
- Version: 1.15.9
3
+ Version: 1.15.10
4
4
  Summary: Native codecs extension
5
5
  Author-email: Alexandre D'Hondt <alexandre.dhondt@gmail.com>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="114" height="20" role="img" aria-label="coverage: 98.90%"><title>coverage: 98.90%</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="114" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="53" height="20" fill="#4c1"/><rect width="114" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="315" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">coverage</text><text x="315" y="140" transform="scale(.1)" fill="#fff" textLength="510">coverage</text><text aria-hidden="true" x="865" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="430">98.90%</text><text x="865" y="140" transform="scale(.1)" fill="#fff" textLength="430">98.90%</text></g></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="114" height="20" role="img" aria-label="coverage: 99.04%"><title>coverage: 99.04%</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="114" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="53" height="20" fill="#4c1"/><rect width="114" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="315" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">coverage</text><text x="315" y="140" transform="scale(.1)" fill="#fff" textLength="510">coverage</text><text aria-hidden="true" x="865" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="430">99.04%</text><text x="865" y="140" transform="scale(.1)" fill="#fff" textLength="430">99.04%</text></g></svg>
@@ -1,2 +1,2 @@
1
- markdown2>=2.5.4
2
1
  legacycrypt; python_version >= '3.13'
2
+ markdown2>=2.5.4
@@ -0,0 +1 @@
1
+ 1.15.10
@@ -6,7 +6,6 @@ import json
6
6
  import os
7
7
  import random
8
8
  import re
9
- import sre_parse
10
9
  import sys
11
10
  from encodings.aliases import aliases as ALIASES
12
11
  from functools import reduce, update_wrapper, wraps
@@ -37,8 +36,12 @@ try: # Python3
37
36
  from importlib import reload
38
37
  except ImportError:
39
38
  pass
39
+ try:
40
+ import re._parser as sre_parse
41
+ except ImportError:
42
+ import sre_parse
40
43
 
41
- # from Python 3.11, it seems that 'sre_parse' is not bound to 're' anymore
44
+ # from Python 3.11, 'sre_parse' is bound as '_parser' ; monkey-patch it for backward-compatibility
42
45
  re.sre_parse = sre_parse
43
46
 
44
47
 
@@ -870,10 +873,9 @@ def handle_error(ename, errors, sep="", repl_char="?", repl_minlen=1, decode=Fal
870
873
  :param output: output, as decoded up to the position of the error
871
874
  """
872
875
  if errors == "strict":
873
- msg = "'%s' codec can't %scode %s '%s' in %s %d"
874
- token = ensure_str(token)
875
- token = token[:7] + "..." if len(token) > 10 else token
876
- err = getattr(builtins, exc)(msg % (eename or ename, ["en", "de"][decode], kind, token, item, position))
876
+ token = f"{token[:7]}..." if len(token := ensure_str(token)) > 10 else token
877
+ err = getattr(builtins, exc)(f"'{eename or ename}' codec can't {['en','de'][decode]}code {kind} '{token}' "
878
+ f"in {item} {position}")
877
879
  err.output = output
878
880
  err.__cause__ = err
879
881
  raise err
@@ -1264,8 +1266,8 @@ def __guess(prev_input, input, stop_func, depth, max_depth, min_depth, encodings
1264
1266
  if not stop and (show or debug) and found not in result:
1265
1267
  s = repr(input)
1266
1268
  s = s[2:-1] if s.startswith("b'") and s.endswith("'") else s
1267
- s = "[+] {', '.join(found)}: {s}"
1268
- print(s if len(s) <= 80 else s[:77] + "...")
1269
+ s = f"[+] {', '.join(found)}: {s}"
1270
+ print(s if len(s) <= 80 else f"{s[:77]}...")
1269
1271
  result[found] = input
1270
1272
  if depth >= max_depth or len(result) > 0 and stop:
1271
1273
  return
@@ -1275,7 +1277,7 @@ def __guess(prev_input, input, stop_func, depth, max_depth, min_depth, encodings
1275
1277
  if len(result) > 0 and stop:
1276
1278
  return
1277
1279
  if debug:
1278
- print(f"[*] Depth %0{len(str(max_depth))}d/%d: {encoding}" % (depth+1, max_depth))
1280
+ print(f"[*] Depth {depth+1:0{len(str(max_depth))}}/{max_depth}: {encoding}")
1279
1281
  __guess(input, new_input, stop_func, depth+1, max_depth, min_depth, encodings, result, found + (encoding, ),
1280
1282
  stop, show, scoring_heuristic, extended, debug)
1281
1283
 
@@ -1,8 +1,9 @@
1
- # -*- coding: UTF-8 -*-
2
- from .blake import *
3
- from .checksums import *
4
- from .crypt import *
5
- from .md import *
6
- from .sha import *
7
- from .shake import *
8
-
1
+ # -*- coding: UTF-8 -*-
2
+ from .blake import *
3
+ from .checksums import *
4
+ from .crypt import *
5
+ from .md import *
6
+ from .mmh3 import *
7
+ from .sha import *
8
+ from .shake import *
9
+
@@ -1,5 +1,5 @@
1
1
  # -*- coding: UTF-8 -*-
2
- """Case Codecs - string hashing with blake.
2
+ """Blake2 Codecs - string hashing with blake.
3
3
 
4
4
  These are codecs for hashing strings, for use with other codecs in encoding chains.
5
5
 
@@ -1,5 +1,5 @@
1
1
  # -*- coding: UTF-8 -*-
2
- """Case Codecs - string common checksums.
2
+ """Checksum Codecs - string common checksums.
3
3
 
4
4
  These are codecs for hashing strings, for use with other codecs in encoding chains.
5
5
 
@@ -1,5 +1,5 @@
1
1
  # -*- coding: UTF-8 -*-
2
- """Case Codecs - string hashing with Unix's Crypt.
2
+ """Crypt Hashing Codec - string hashing with Unix's Crypt.
3
3
 
4
4
  These are codecs for hashing strings, for use with other codecs in encoding chains.
5
5
 
@@ -1,5 +1,5 @@
1
1
  # -*- coding: UTF-8 -*-
2
- """Case Codecs - string hashing with Message Digest (MD).
2
+ """MD Hashing Codecs - string hashing with Message Digest (MD).
3
3
 
4
4
  These are codecs for hashing strings, for use with other codecs in encoding chains.
5
5
 
@@ -56,4 +56,3 @@ add("md2", lambda s, error="strict": (md2(s), len(s)), guess=None)
56
56
  add("md5", lambda s, error="strict": (hashlib.new("md5", b(s)).hexdigest(), len(s)), guess=None)
57
57
  if "md4" in hashlib.algorithms_available:
58
58
  add("md4", lambda s, error="strict": (hashlib.new("md4", b(s)).hexdigest(), len(s)), guess=None)
59
-
@@ -0,0 +1,18 @@
1
+ # -*- coding: UTF-8 -*-
2
+ """MMH3 Codecs - string hashing with MurmurHash3.
3
+
4
+ These are codecs for hashing strings, for use with other codecs in encoding chains.
5
+
6
+ These codecs:
7
+ - transform strings from str to str
8
+ - transform strings from bytes to bytes
9
+ - transform file content from str to bytes (write)
10
+ """
11
+ from ..__common__ import *
12
+
13
+
14
+ if "mmh3_32" in hashlib.algorithms_available:
15
+ add("mmh3_32", lambda s, error="strict": (hashlib.mmh3_32(b(s)).hexdigest(), len(s)), guess=None)
16
+ if "mmh3_128" in hashlib.algorithms_available:
17
+ add("mmh3_128", lambda s, error="strict": (hashlib.mmh3_128(b(s)).hexdigest(), len(s)), guess=None)
18
+
@@ -1,5 +1,5 @@
1
1
  # -*- coding: UTF-8 -*-
2
- """Case Codecs - string hashing with Secure Hash Algorithms.
2
+ """SHA Hashing Codecs - string hashing with Secure Hash Algorithms.
3
3
 
4
4
  These are codecs for hashing strings, for use with other codecs in encoding chains.
5
5
 
@@ -1,5 +1,5 @@
1
1
  # -*- coding: UTF-8 -*-
2
- """Case Codecs - string hashing with SHAKE.
2
+ """Shake Hashing Codecs - string hashing with SHAKE.
3
3
 
4
4
  These are codecs for hashing strings, for use with other codecs in encoding chains.
5
5
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codext
3
- Version: 1.15.9
3
+ Version: 1.15.10
4
4
  Summary: Native codecs extension
5
5
  Author-email: Alexandre D'Hondt <alexandre.dhondt@gmail.com>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -87,6 +87,7 @@ src/codext/hashing/blake.py
87
87
  src/codext/hashing/checksums.py
88
88
  src/codext/hashing/crypt.py
89
89
  src/codext/hashing/md.py
90
+ src/codext/hashing/mmh3.py
90
91
  src/codext/hashing/sha.py
91
92
  src/codext/hashing/shake.py
92
93
  src/codext/languages/__init__.py
@@ -1 +0,0 @@
1
- 1.15.9
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