plain 0.63.0__tar.gz → 0.64.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.
- {plain-0.63.0 → plain-0.64.0}/.gitignore +0 -2
- {plain-0.63.0 → plain-0.64.0}/PKG-INFO +1 -1
- {plain-0.63.0 → plain-0.64.0}/plain/CHANGELOG.md +12 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/formatting.py +12 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/upgrade.py +0 -1
- {plain-0.63.0 → plain-0.64.0}/plain/signing.py +6 -2
- {plain-0.63.0 → plain-0.64.0}/plain/utils/crypto.py +0 -5
- {plain-0.63.0 → plain-0.64.0}/pyproject.toml +2 -1
- {plain-0.63.0 → plain-0.64.0}/LICENSE +0 -0
- {plain-0.63.0 → plain-0.64.0}/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/AGENTS.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/__main__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/assets/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/assets/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/assets/compile.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/assets/finders.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/assets/fingerprints.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/assets/urls.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/assets/views.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/chores/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/chores/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/chores/registry.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/agent/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/agent/docs.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/agent/llmdocs.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/agent/md.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/agent/prompt.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/agent/request.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/build.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/changelog.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/chores.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/core.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/docs.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/install.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/output.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/preflight.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/print.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/registry.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/scaffold.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/settings.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/shell.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/startup.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/urls.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/cli/utils.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/csrf/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/csrf/middleware.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/csrf/views.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/debug.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/exceptions.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/forms/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/forms/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/forms/boundfield.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/forms/exceptions.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/forms/fields.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/forms/forms.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/http/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/http/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/http/cookie.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/http/multipartparser.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/http/request.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/http/response.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/internal/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/internal/files/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/internal/files/base.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/internal/files/locks.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/internal/files/move.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/internal/files/temp.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/internal/files/uploadedfile.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/internal/files/uploadhandler.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/internal/files/utils.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/internal/handlers/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/internal/handlers/base.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/internal/handlers/exception.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/internal/handlers/wsgi.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/internal/middleware/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/internal/middleware/headers.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/internal/middleware/https.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/internal/middleware/slash.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/json.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/logs/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/logs/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/logs/configure.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/logs/debug.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/logs/formatters.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/logs/loggers.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/logs/utils.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/packages/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/packages/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/packages/config.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/packages/registry.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/paginator.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/preflight/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/preflight/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/preflight/files.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/preflight/messages.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/preflight/registry.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/preflight/security.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/preflight/urls.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/runtime/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/runtime/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/runtime/global_settings.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/runtime/user_settings.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/runtime/utils.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/signals/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/signals/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/signals/dispatch/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/signals/dispatch/dispatcher.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/signals/dispatch/license.txt +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/templates/AGENTS.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/templates/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/templates/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/templates/core.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/templates/jinja/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/templates/jinja/environments.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/templates/jinja/extensions.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/templates/jinja/filters.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/templates/jinja/globals.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/test/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/test/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/test/client.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/test/encoding.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/test/exceptions.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/urls/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/urls/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/urls/converters.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/urls/exceptions.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/urls/patterns.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/urls/resolvers.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/urls/routers.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/urls/utils.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/cache.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/datastructures.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/dateparse.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/deconstruct.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/decorators.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/duration.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/encoding.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/functional.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/hashable.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/html.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/http.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/inspect.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/ipv6.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/itercompat.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/module_loading.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/regex_helper.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/safestring.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/text.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/timesince.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/timezone.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/utils/tree.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/validators.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/views/README.md +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/views/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/views/base.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/views/errors.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/views/exceptions.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/views/forms.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/views/objects.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/views/redirect.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/views/templates.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/plain/wsgi.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/tests/.gitignore +0 -0
- {plain-0.63.0 → plain-0.64.0}/tests/app/.gitignore +0 -0
- {plain-0.63.0 → plain-0.64.0}/tests/app/settings.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/tests/app/test/__init__.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/tests/app/test/default_settings.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/tests/app/urls.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/tests/conftest.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/tests/test_cli.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/tests/test_csrf.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/tests/test_logs.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/tests/test_runtime.py +0 -0
- {plain-0.63.0 → plain-0.64.0}/tests/test_wsgi.py +0 -0
@@ -1,5 +1,17 @@
|
|
1
1
|
# plain changelog
|
2
2
|
|
3
|
+
## [0.64.0](https://github.com/dropseed/plain/releases/plain@0.64.0) (2025-09-19)
|
4
|
+
|
5
|
+
### What's changed
|
6
|
+
|
7
|
+
- Added `plain-build` command as a standalone executable ([4b39ca4](https://github.com/dropseed/plain/commit/4b39ca4599))
|
8
|
+
- Removed `constant_time_compare` utility function in favor of `hmac.compare_digest` ([55f3f55](https://github.com/dropseed/plain/commit/55f3f5596d))
|
9
|
+
- CLI now forces colors in CI environments (GitHub Actions, GitLab CI, etc.) for better output visibility ([56f7d2b](https://github.com/dropseed/plain/commit/56f7d2b312))
|
10
|
+
|
11
|
+
### Upgrade instructions
|
12
|
+
|
13
|
+
- Replace any usage of `plain.utils.crypto.constant_time_compare` with `hmac.compare_digest` or `secrets.compare_digest`
|
14
|
+
|
3
15
|
## [0.63.0](https://github.com/dropseed/plain/releases/plain@0.63.0) (2025-09-12)
|
4
16
|
|
5
17
|
### What's changed
|
@@ -1,3 +1,5 @@
|
|
1
|
+
import os
|
2
|
+
|
1
3
|
import click
|
2
4
|
from click.formatting import iter_rows, measure_table, term_len, wrap_text
|
3
5
|
|
@@ -59,3 +61,13 @@ class PlainHelpFormatter(click.HelpFormatter):
|
|
59
61
|
|
60
62
|
class PlainContext(click.Context):
|
61
63
|
formatter_class = PlainHelpFormatter
|
64
|
+
|
65
|
+
def __init__(self, *args, **kwargs):
|
66
|
+
super().__init__(*args, **kwargs)
|
67
|
+
|
68
|
+
# Force colors in CI environments
|
69
|
+
if any(
|
70
|
+
os.getenv(var)
|
71
|
+
for var in ["CI", "FORCE_COLOR", "GITHUB_ACTIONS", "GITLAB_CI"]
|
72
|
+
) and not any(os.getenv(var) for var in ["NO_COLOR", "PYTEST_CURRENT_TEST"]):
|
73
|
+
self.color = True
|
@@ -153,7 +153,6 @@ def build_prompt(before_after: dict[str, tuple[str | None, str | None]]) -> str:
|
|
153
153
|
" - Process ALL packages before testing or validation",
|
154
154
|
" - After all packages are updated, run `uv run plain fix --unsafe-fixes` and `uv run plain pre-commit` to check results",
|
155
155
|
" - DO NOT commit any changes",
|
156
|
-
" - DO NOT run `plain migrate` with the `--no-backup` option",
|
157
156
|
" - Keep code changes minimal and focused - avoid unnecessary comments",
|
158
157
|
"",
|
159
158
|
"3. **Available tools:**",
|
@@ -35,12 +35,14 @@ These functions make use of all of them.
|
|
35
35
|
|
36
36
|
import base64
|
37
37
|
import datetime
|
38
|
+
import hmac
|
38
39
|
import json
|
39
40
|
import time
|
40
41
|
import zlib
|
41
42
|
|
42
43
|
from plain.runtime import settings
|
43
|
-
from plain.utils.crypto import
|
44
|
+
from plain.utils.crypto import salted_hmac
|
45
|
+
from plain.utils.encoding import force_bytes
|
44
46
|
from plain.utils.regex_helper import _lazy_re_compile
|
45
47
|
|
46
48
|
_SEP_UNSAFE = _lazy_re_compile(r"^[A-z0-9-_=]*$")
|
@@ -196,7 +198,9 @@ class Signer:
|
|
196
198
|
raise BadSignature(f'No "{self.sep}" found in value')
|
197
199
|
value, sig = signed_value.rsplit(self.sep, 1)
|
198
200
|
for key in [self.key, *self.fallback_keys]:
|
199
|
-
if
|
201
|
+
if hmac.compare_digest(
|
202
|
+
force_bytes(sig), force_bytes(self.signature(value, key))
|
203
|
+
):
|
200
204
|
return value
|
201
205
|
raise BadSignature(f'Signature "{sig}" does not match')
|
202
206
|
|
@@ -62,11 +62,6 @@ def get_random_string(length, allowed_chars=RANDOM_STRING_CHARS):
|
|
62
62
|
return "".join(secrets.choice(allowed_chars) for i in range(length))
|
63
63
|
|
64
64
|
|
65
|
-
def constant_time_compare(val1, val2):
|
66
|
-
"""Return True if the two strings are equal, False otherwise."""
|
67
|
-
return secrets.compare_digest(force_bytes(val1), force_bytes(val2))
|
68
|
-
|
69
|
-
|
70
65
|
def pbkdf2(password, salt, iterations, dklen=0, digest=None):
|
71
66
|
"""Return the hash of password using pbkdf2."""
|
72
67
|
if digest is None:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "plain"
|
3
|
-
version = "0.
|
3
|
+
version = "0.64.0"
|
4
4
|
description = "A web framework for building products with Python."
|
5
5
|
authors = [{name = "Dave Gaeddert", email = "dave.gaeddert@dropseed.dev"}]
|
6
6
|
readme = "README.md"
|
@@ -18,6 +18,7 @@ plain = "plain.cli.core:cli"
|
|
18
18
|
# Make this directly available without loading Plain,
|
19
19
|
# for use in upgrade scripts.
|
20
20
|
plain-changelog = "plain.cli.changelog:changelog"
|
21
|
+
plain-build = "plain.cli.build:build"
|
21
22
|
|
22
23
|
[tool.uv]
|
23
24
|
dev-dependencies = [
|
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
|
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
|
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
|