plain 0.8.0__tar.gz → 0.11.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.8.0 → plain-0.11.0}/PKG-INFO +1 -2
- {plain-0.8.0 → plain-0.11.0}/plain/cli/cli.py +1 -1
- {plain-0.8.0 → plain-0.11.0}/plain/http/request.py +3 -3
- {plain-0.8.0 → plain-0.11.0}/plain/runtime/__init__.py +11 -13
- {plain-0.8.0 → plain-0.11.0}/plain/runtime/global_settings.py +15 -13
- {plain-0.8.0 → plain-0.11.0}/plain/runtime/user_settings.py +1 -1
- {plain-0.8.0 → plain-0.11.0}/pyproject.toml +1 -2
- {plain-0.8.0 → plain-0.11.0}/LICENSE +0 -0
- {plain-0.8.0 → plain-0.11.0}/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/__main__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/assets/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/assets/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/assets/compile.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/assets/finders.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/assets/fingerprints.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/assets/urls.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/assets/views.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/cli/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/cli/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/cli/formatting.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/cli/packages.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/cli/print.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/cli/startup.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/csrf/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/csrf/middleware.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/csrf/views.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/debug.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/exceptions.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/forms/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/forms/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/forms/boundfield.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/forms/exceptions.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/forms/fields.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/forms/forms.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/http/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/http/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/http/cookie.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/http/multipartparser.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/http/response.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/files/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/files/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/files/base.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/files/locks.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/files/move.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/files/temp.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/files/uploadedfile.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/files/uploadhandler.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/files/utils.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/handlers/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/handlers/base.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/handlers/exception.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/handlers/wsgi.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/middleware/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/middleware/headers.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/middleware/https.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/internal/middleware/slash.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/json.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/logs/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/logs/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/logs/configure.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/logs/loggers.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/logs/utils.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/packages/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/packages/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/packages/config.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/packages/registry.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/paginator.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/preflight/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/preflight/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/preflight/files.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/preflight/messages.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/preflight/registry.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/preflight/security/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/preflight/security/base.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/preflight/security/csrf.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/preflight/urls.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/runtime/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/signals/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/signals/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/signals/dispatch/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/signals/dispatch/dispatcher.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/signals/dispatch/license.txt +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/signing.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/templates/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/templates/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/templates/core.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/templates/jinja/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/templates/jinja/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/templates/jinja/defaults.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/templates/jinja/extensions.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/templates/jinja/filters.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/templates/jinja/globals.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/test/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/test/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/test/client.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/urls/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/urls/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/urls/base.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/urls/conf.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/urls/converters.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/urls/exceptions.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/urls/resolvers.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/_os.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/cache.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/connection.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/crypto.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/datastructures.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/dateformat.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/dateparse.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/dates.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/deconstruct.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/decorators.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/deprecation.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/duration.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/email.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/encoding.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/functional.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/hashable.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/html.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/http.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/inspect.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/ipv6.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/itercompat.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/module_loading.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/regex_helper.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/safestring.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/termcolors.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/text.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/timesince.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/timezone.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/utils/tree.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/validators.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/views/README.md +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/views/__init__.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/views/base.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/views/csrf.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/views/errors.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/views/exceptions.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/views/forms.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/views/objects.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/views/redirect.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/views/templates.py +0 -0
- {plain-0.8.0 → plain-0.11.0}/plain/wsgi.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: plain
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.11.0
|
4
4
|
Summary: A web framework for building products with Python.
|
5
5
|
Author: Dave Gaeddert
|
6
6
|
Author-email: dave.gaeddert@dropseed.dev
|
@@ -11,7 +11,6 @@ Classifier: Programming Language :: Python :: 3.12
|
|
11
11
|
Classifier: Programming Language :: Python :: 3.13
|
12
12
|
Requires-Dist: click (>=8.0.0)
|
13
13
|
Requires-Dist: jinja2 (>=3.1.2,<4.0.0)
|
14
|
-
Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
|
15
14
|
Description-Content-Type: text/markdown
|
16
15
|
|
17
16
|
<!-- This file is compiled from plain/plain/README.md. Do not edit this file directly. -->
|
@@ -251,7 +251,7 @@ def preflight_checks(package_label, deploy, fail_level, databases):
|
|
251
251
|
msg = header + body + footer
|
252
252
|
click.echo(msg, err=True)
|
253
253
|
else:
|
254
|
-
click.
|
254
|
+
click.secho("✔ Preflight check identified no issues.", err=True, fg="green")
|
255
255
|
|
256
256
|
|
257
257
|
@plain_cli.command()
|
@@ -267,12 +267,12 @@ class HttpRequest:
|
|
267
267
|
|
268
268
|
@property
|
269
269
|
def scheme(self):
|
270
|
-
if settings.
|
270
|
+
if settings.HTTPS_PROXY_HEADER:
|
271
271
|
try:
|
272
|
-
header, secure_value = settings.
|
272
|
+
header, secure_value = settings.HTTPS_PROXY_HEADER
|
273
273
|
except ValueError:
|
274
274
|
raise ImproperlyConfigured(
|
275
|
-
"The
|
275
|
+
"The HTTPS_PROXY_HEADER setting must be a tuple containing "
|
276
276
|
"two values."
|
277
277
|
)
|
278
278
|
header_value = self.META.get(header)
|
@@ -1,10 +1,8 @@
|
|
1
1
|
import importlib.metadata
|
2
2
|
import sys
|
3
|
-
from
|
3
|
+
from importlib.metadata import entry_points
|
4
4
|
from pathlib import Path
|
5
5
|
|
6
|
-
from dotenv import load_dotenv
|
7
|
-
|
8
6
|
from .user_settings import Settings
|
9
7
|
|
10
8
|
try:
|
@@ -16,7 +14,6 @@ except importlib.metadata.PackageNotFoundError:
|
|
16
14
|
# Made available without setup or settings
|
17
15
|
APP_PATH = Path.cwd() / "app"
|
18
16
|
|
19
|
-
|
20
17
|
# from plain.runtime import settings
|
21
18
|
settings = Settings()
|
22
19
|
|
@@ -30,6 +27,11 @@ def setup():
|
|
30
27
|
Configure the settings (this happens as a side effect of accessing the
|
31
28
|
first setting), configure logging and populate the app registry.
|
32
29
|
"""
|
30
|
+
|
31
|
+
# Packages can hook into the setup process through an entrypoint.
|
32
|
+
for entry_point in entry_points().select(group="plain.setup"):
|
33
|
+
entry_point.load()()
|
34
|
+
|
33
35
|
from plain.logs import configure_logging
|
34
36
|
from plain.packages import packages
|
35
37
|
|
@@ -38,15 +40,11 @@ def setup():
|
|
38
40
|
"No app directory found. Are you sure you're in a Plain project?"
|
39
41
|
)
|
40
42
|
|
41
|
-
# Automatically put the
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
if app_env := environ.get("PLAIN_ENV", ""):
|
47
|
-
load_dotenv(f".env.{app_env}")
|
48
|
-
else:
|
49
|
-
load_dotenv(".env")
|
43
|
+
# Automatically put the project dir on the Python path
|
44
|
+
# which doesn't otherwise happen when you run `plain` commands.
|
45
|
+
# This makes "app.<module>" imports and relative imports work.
|
46
|
+
if APP_PATH.parent not in sys.path:
|
47
|
+
sys.path.insert(0, APP_PATH.parent.as_posix())
|
50
48
|
|
51
49
|
configure_logging(settings.LOGGING)
|
52
50
|
|
@@ -50,6 +50,20 @@ HTTPS_REDIRECT_ENABLED = True
|
|
50
50
|
HTTPS_REDIRECT_EXEMPT = []
|
51
51
|
HTTPS_REDIRECT_HOST = None
|
52
52
|
|
53
|
+
# If your Plain app is behind a proxy that sets a header to specify secure
|
54
|
+
# connections, AND that proxy ensures that user-submitted headers with the
|
55
|
+
# same name are ignored (so that people can't spoof it), set this value to
|
56
|
+
# a tuple of (header_name, header_value). For any requests that come in with
|
57
|
+
# that header/value, request.is_https() will return True.
|
58
|
+
# WARNING! Only set this if you fully understand what you're doing. Otherwise,
|
59
|
+
# you may be opening yourself up to a security risk.
|
60
|
+
HTTPS_PROXY_HEADER = None
|
61
|
+
|
62
|
+
# Whether to use the X-Forwarded-Host and X-Forwarded-Port headers
|
63
|
+
# when determining the host and port for the request.
|
64
|
+
USE_X_FORWARDED_HOST = False
|
65
|
+
USE_X_FORWARDED_PORT = False
|
66
|
+
|
53
67
|
# A secret key for this particular Plain installation. Used in secret-key
|
54
68
|
# hashing algorithms. Set this in your settings, or Plain will complain
|
55
69
|
# loudly.
|
@@ -59,7 +73,7 @@ SECRET_KEY: str
|
|
59
73
|
# secret key rotation.
|
60
74
|
SECRET_KEY_FALLBACKS: list[str] = []
|
61
75
|
|
62
|
-
ROOT_URLCONF = "urls"
|
76
|
+
ROOT_URLCONF = "app.urls"
|
63
77
|
|
64
78
|
# List of upload handler classes to be applied in order.
|
65
79
|
FILE_UPLOAD_HANDLERS = [
|
@@ -88,21 +102,9 @@ DATA_UPLOAD_MAX_NUMBER_FILES = 100
|
|
88
102
|
# (i.e. "/tmp" on *nix systems).
|
89
103
|
FILE_UPLOAD_TEMP_DIR = None
|
90
104
|
|
91
|
-
USE_X_FORWARDED_HOST = False
|
92
|
-
USE_X_FORWARDED_PORT = False
|
93
|
-
|
94
105
|
# User-defined overrides for error views by status code
|
95
106
|
HTTP_ERROR_VIEWS: dict[int] = {}
|
96
107
|
|
97
|
-
# If your Plain app is behind a proxy that sets a header to specify secure
|
98
|
-
# connections, AND that proxy ensures that user-submitted headers with the
|
99
|
-
# same name are ignored (so that people can't spoof it), set this value to
|
100
|
-
# a tuple of (header_name, header_value). For any requests that come in with
|
101
|
-
# that header/value, request.is_https() will return True.
|
102
|
-
# WARNING! Only set this if you fully understand what you're doing. Otherwise,
|
103
|
-
# you may be opening yourself up to a security risk.
|
104
|
-
SECURE_PROXY_SSL_HEADER = None
|
105
|
-
|
106
108
|
##############
|
107
109
|
# MIDDLEWARE #
|
108
110
|
##############
|
@@ -41,7 +41,7 @@ class Settings:
|
|
41
41
|
|
42
42
|
# Determine the settings module
|
43
43
|
if self._settings_module is None:
|
44
|
-
self._settings_module = os.environ.get(ENVIRONMENT_VARIABLE, "settings")
|
44
|
+
self._settings_module = os.environ.get(ENVIRONMENT_VARIABLE, "app.settings")
|
45
45
|
|
46
46
|
# First load the global settings from plain
|
47
47
|
self._load_module_settings(
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "plain"
|
3
|
-
version = "0.
|
3
|
+
version = "0.11.0"
|
4
4
|
description = "A web framework for building products with Python."
|
5
5
|
authors = ["Dave Gaeddert <dave.gaeddert@dropseed.dev>"]
|
6
6
|
readme = "README.md"
|
@@ -15,7 +15,6 @@ plain = "plain.cli:cli"
|
|
15
15
|
[tool.poetry.dependencies]
|
16
16
|
python = "^3.11"
|
17
17
|
jinja2 = "^3.1.2"
|
18
|
-
python-dotenv = "^1.0.0"
|
19
18
|
click = ">=8.0.0"
|
20
19
|
|
21
20
|
[tool.poetry.group.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
|