calkit-python 0.41.19__py3-none-any.whl → 0.41.20__py3-none-any.whl
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.
- calkit/cli/main/core.py +20 -3
- calkit/dvc/zip.py +17 -0
- calkit/tests/cli/main/test_core.py +23 -0
- calkit/tests/dvc/test_zip.py +25 -0
- {calkit_python-0.41.19.dist-info → calkit_python-0.41.20.dist-info}/METADATA +2 -2
- {calkit_python-0.41.19.dist-info → calkit_python-0.41.20.dist-info}/RECORD +24 -24
- {calkit_python-0.41.19.data → calkit_python-0.41.20.data}/data/etc/jupyter/jupyter_server_config.d/calkit.json +0 -0
- {calkit_python-0.41.19.data → calkit_python-0.41.20.data}/data/share/jupyter/labextensions/calkit/install.json +0 -0
- {calkit_python-0.41.19.data → calkit_python-0.41.20.data}/data/share/jupyter/labextensions/calkit/package.json +0 -0
- {calkit_python-0.41.19.data → calkit_python-0.41.20.data}/data/share/jupyter/labextensions/calkit/schemas/calkit/package.json.orig +0 -0
- {calkit_python-0.41.19.data → calkit_python-0.41.20.data}/data/share/jupyter/labextensions/calkit/schemas/calkit/plugin.json +0 -0
- {calkit_python-0.41.19.data → calkit_python-0.41.20.data}/data/share/jupyter/labextensions/calkit/static/502.9a2c5772a15466e923ef.js +0 -0
- {calkit_python-0.41.19.data → calkit_python-0.41.20.data}/data/share/jupyter/labextensions/calkit/static/695.2c41003a452d43d2b358.js +0 -0
- {calkit_python-0.41.19.data → calkit_python-0.41.20.data}/data/share/jupyter/labextensions/calkit/static/867.a42a046aa5108f54f8fb.js +0 -0
- {calkit_python-0.41.19.data → calkit_python-0.41.20.data}/data/share/jupyter/labextensions/calkit/static/909.e3f9cc3408834a7fdcc3.js +0 -0
- {calkit_python-0.41.19.data → calkit_python-0.41.20.data}/data/share/jupyter/labextensions/calkit/static/946.050af2abf7845cfbdbd2.js +0 -0
- {calkit_python-0.41.19.data → calkit_python-0.41.20.data}/data/share/jupyter/labextensions/calkit/static/946.050af2abf7845cfbdbd2.js.LICENSE.txt +0 -0
- {calkit_python-0.41.19.data → calkit_python-0.41.20.data}/data/share/jupyter/labextensions/calkit/static/b2f1c3efe70cb539d121.png +0 -0
- {calkit_python-0.41.19.data → calkit_python-0.41.20.data}/data/share/jupyter/labextensions/calkit/static/remoteEntry.ac9035764d5b2adbb542.js +0 -0
- {calkit_python-0.41.19.data → calkit_python-0.41.20.data}/data/share/jupyter/labextensions/calkit/static/style.js +0 -0
- {calkit_python-0.41.19.data → calkit_python-0.41.20.data}/data/share/jupyter/labextensions/calkit/static/third-party-licenses.json +0 -0
- {calkit_python-0.41.19.dist-info → calkit_python-0.41.20.dist-info}/WHEEL +0 -0
- {calkit_python-0.41.19.dist-info → calkit_python-0.41.20.dist-info}/entry_points.txt +0 -0
- {calkit_python-0.41.19.dist-info → calkit_python-0.41.20.dist-info}/licenses/LICENSE +0 -0
calkit/cli/main/core.py
CHANGED
|
@@ -179,11 +179,26 @@ def init(
|
|
|
179
179
|
typer.Option(
|
|
180
180
|
"--force",
|
|
181
181
|
"-f",
|
|
182
|
-
help="
|
|
182
|
+
help="Re-initialize even if the project is already initialized.",
|
|
183
183
|
),
|
|
184
184
|
] = False,
|
|
185
185
|
):
|
|
186
186
|
"""Initialize the current working directory."""
|
|
187
|
+
import git
|
|
188
|
+
from git.exc import InvalidGitRepositoryError
|
|
189
|
+
|
|
190
|
+
def _project_is_initialized() -> bool:
|
|
191
|
+
try:
|
|
192
|
+
git.Repo(".", search_parent_directories=False)
|
|
193
|
+
except InvalidGitRepositoryError:
|
|
194
|
+
return False
|
|
195
|
+
return os.path.isfile(".dvc/config") and os.path.isfile("calkit.yaml")
|
|
196
|
+
|
|
197
|
+
if _project_is_initialized() and not force:
|
|
198
|
+
raise_error(
|
|
199
|
+
"This project is already initialized. "
|
|
200
|
+
"Use --force to re-initialize."
|
|
201
|
+
)
|
|
187
202
|
subprocess.run(["git", "init"])
|
|
188
203
|
result = calkit.dvc.run_dvc_command(
|
|
189
204
|
["init"] + (["--force"] if force else [])
|
|
@@ -197,13 +212,15 @@ def init(
|
|
|
197
212
|
# Commit the newly created .dvc directory
|
|
198
213
|
repo = calkit.git.get_repo()
|
|
199
214
|
repo.git.add(".dvc")
|
|
200
|
-
|
|
215
|
+
if calkit.git.get_staged_files(repo=repo):
|
|
216
|
+
repo.git.commit("-m", "Initialize DVC")
|
|
201
217
|
# Create an empty calkit.yaml if one doesn't already exist
|
|
202
218
|
if not os.path.isfile("calkit.yaml"):
|
|
203
219
|
with open("calkit.yaml", "w"):
|
|
204
220
|
pass
|
|
205
221
|
repo.git.add("calkit.yaml")
|
|
206
|
-
|
|
222
|
+
if calkit.git.get_staged_files(repo=repo):
|
|
223
|
+
repo.git.commit("-m", "Initialize Calkit")
|
|
207
224
|
# TODO: Initialize `dvc.yaml`
|
|
208
225
|
# TODO: Add a sane .gitignore file
|
|
209
226
|
# TODO: Add a sane LICENSE file?
|
calkit/dvc/zip.py
CHANGED
|
@@ -499,6 +499,23 @@ def _sync_one(
|
|
|
499
499
|
# pipeline output that hasn't been produced yet on a fresh run)
|
|
500
500
|
if workspace_hash is None and zip_hash is None:
|
|
501
501
|
return None
|
|
502
|
+
# Workspace doesn't exist with no prior sync record while syncing to-zip —
|
|
503
|
+
# there's nothing to push into the zip (e.g., the zip was pulled but
|
|
504
|
+
# never unzipped into the workspace)
|
|
505
|
+
if (
|
|
506
|
+
workspace_hash is None
|
|
507
|
+
and last_sync_record is None
|
|
508
|
+
and direction == "to-zip"
|
|
509
|
+
):
|
|
510
|
+
return None
|
|
511
|
+
# Zip doesn't exist with no prior sync record while syncing to-workspace —
|
|
512
|
+
# there's nothing to pull into the workspace
|
|
513
|
+
if (
|
|
514
|
+
zip_hash is None
|
|
515
|
+
and last_sync_record is None
|
|
516
|
+
and direction == "to-workspace"
|
|
517
|
+
):
|
|
518
|
+
return None
|
|
502
519
|
# Deletion + change on the other side is a conflict
|
|
503
520
|
if workspace_deleted and zip_changed and direction == "both":
|
|
504
521
|
raise RuntimeError(
|
|
@@ -60,6 +60,16 @@ def test_init(tmp_dir):
|
|
|
60
60
|
subprocess.check_call(["calkit", "init"])
|
|
61
61
|
assert os.path.isfile("calkit.yaml")
|
|
62
62
|
assert calkit.load_calkit_info() == {}
|
|
63
|
+
# Already initialized: init without --force fails and does not clobber
|
|
64
|
+
result = subprocess.run(
|
|
65
|
+
["calkit", "init"],
|
|
66
|
+
capture_output=True,
|
|
67
|
+
text=True,
|
|
68
|
+
)
|
|
69
|
+
assert result.returncode != 0
|
|
70
|
+
assert "already initialized" in result.stderr.lower()
|
|
71
|
+
assert "use --force" in result.stderr.lower()
|
|
72
|
+
assert calkit.load_calkit_info() == {}
|
|
63
73
|
# init must not clobber a pre-existing calkit.yaml
|
|
64
74
|
os.makedirs("sub")
|
|
65
75
|
ck_info = {"name": "test-project"}
|
|
@@ -67,6 +77,19 @@ def test_init(tmp_dir):
|
|
|
67
77
|
calkit.ryaml.dump(ck_info, f)
|
|
68
78
|
subprocess.check_call(["calkit", "init"], cwd="sub")
|
|
69
79
|
assert calkit.load_calkit_info(wdir="sub") == ck_info
|
|
80
|
+
# Fully initialized project blocks init without --force
|
|
81
|
+
result = subprocess.run(
|
|
82
|
+
["calkit", "init"],
|
|
83
|
+
cwd="sub",
|
|
84
|
+
capture_output=True,
|
|
85
|
+
text=True,
|
|
86
|
+
)
|
|
87
|
+
assert result.returncode != 0
|
|
88
|
+
assert "already initialized" in result.stderr.lower()
|
|
89
|
+
assert calkit.load_calkit_info(wdir="sub") == ck_info
|
|
90
|
+
# --force allows re-initialization without clobbering calkit.yaml
|
|
91
|
+
subprocess.check_call(["calkit", "init", "--force"], cwd="sub")
|
|
92
|
+
assert calkit.load_calkit_info(wdir="sub") == ck_info
|
|
70
93
|
|
|
71
94
|
|
|
72
95
|
@skipif_windows_docker
|
calkit/tests/dvc/test_zip.py
CHANGED
|
@@ -303,3 +303,28 @@ def test_sync_one(tmp_dir, monkeypatch):
|
|
|
303
303
|
assert result is not None
|
|
304
304
|
assert (src7 / "a.txt").read_text() == "hello"
|
|
305
305
|
assert get_sync_record(str(src7.as_posix())) is not None
|
|
306
|
+
# Zip exists but workspace was never unzipped (no sync record) with
|
|
307
|
+
# direction=to-zip: nothing to push, skip without error
|
|
308
|
+
src8 = tmp_dir / "src8"
|
|
309
|
+
src8.mkdir()
|
|
310
|
+
(src8 / "a.txt").write_text("hello")
|
|
311
|
+
zip_out8 = str(tmp_dir / calkit.dvc.zip.ZIPS_DIR / "src8.zip")
|
|
312
|
+
zip_(str(src8), zip_out8)
|
|
313
|
+
shutil.rmtree(str(src8))
|
|
314
|
+
write_zip_path_map({str(src8.as_posix()): zip_out8})
|
|
315
|
+
result = sync_one(str(src8), zip_out8, direction="to-zip")
|
|
316
|
+
assert result is None
|
|
317
|
+
assert os.path.isfile(zip_out8)
|
|
318
|
+
assert not os.path.exists(str(src8))
|
|
319
|
+
# Workspace exists but zip was never created (no sync record) with
|
|
320
|
+
# direction=to-workspace: nothing to pull, skip without error
|
|
321
|
+
src9 = tmp_dir / "src9"
|
|
322
|
+
src9.mkdir()
|
|
323
|
+
(src9 / "a.txt").write_text("hello")
|
|
324
|
+
zip_out9 = str(tmp_dir / calkit.dvc.zip.ZIPS_DIR / "src9.zip")
|
|
325
|
+
write_zip_path_map({str(src9.as_posix()): zip_out9})
|
|
326
|
+
result = sync_one(str(src9), zip_out9, direction="to-workspace")
|
|
327
|
+
assert result is None
|
|
328
|
+
assert not os.path.exists(zip_out9)
|
|
329
|
+
assert get_sync_record(str(src9.as_posix())) is None
|
|
330
|
+
assert (src9 / "a.txt").read_text() == "hello"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: calkit-python
|
|
3
|
-
Version: 0.41.
|
|
3
|
+
Version: 0.41.20
|
|
4
4
|
Summary: Reproducibility simplified.
|
|
5
5
|
Project-URL: Homepage, https://calkit.org
|
|
6
6
|
Project-URL: Issues, https://github.com/calkit/calkit/issues
|
|
@@ -26,7 +26,7 @@ Requires-Dist: arithmeval
|
|
|
26
26
|
Requires-Dist: bibtexparser
|
|
27
27
|
Requires-Dist: checksumdir
|
|
28
28
|
Requires-Dist: docx2pdf
|
|
29
|
-
Requires-Dist: dvc==3.67.1
|
|
29
|
+
Requires-Dist: dvc[all]==3.67.1
|
|
30
30
|
Requires-Dist: fastapi
|
|
31
31
|
Requires-Dist: fsspec>=2026.4.0
|
|
32
32
|
Requires-Dist: gitpython
|
|
@@ -47,11 +47,11 @@ calkit/cli/overleaf.py,sha256=bS-SkYsSqqhC9YsP-NCzpYJCGS3820w18w_s8JOFihg,25216
|
|
|
47
47
|
calkit/cli/scheduler.py,sha256=OWJpW57G6Ebs5FTZ_nf2PpEG9QNd6WPe0mb3TmbVTyE,42402
|
|
48
48
|
calkit/cli/update.py,sha256=5Jjo-5uRTxd5UWHvOETPYFWtJJRr81qmKmsibthkLPk,43501
|
|
49
49
|
calkit/cli/main/__init__.py,sha256=qu1POZPyqs33ZKfasOxv_Wc-EzVcEgK3Dt_vwFL8Bi8,65
|
|
50
|
-
calkit/cli/main/core.py,sha256=
|
|
50
|
+
calkit/cli/main/core.py,sha256=lPLVIEUHOYhvHVt2kncB4Y5Jt3D7KDFBY44F5bTFtXY,124496
|
|
51
51
|
calkit/cli/main/xr.py,sha256=Bug5qJuiIq0tusmdu30t-ZdyaT_Sy5RwPSTiHvCtIqE,25600
|
|
52
52
|
calkit/dvc/__init__.py,sha256=-B6tilCb_jw7QFmJ2srILez24wDhNKUzIBhZUMt01dE,381
|
|
53
53
|
calkit/dvc/core.py,sha256=p42i_uCzgZD6ClGnLOn88zaiGTwrdSG09quL8Hb8Aas,30908
|
|
54
|
-
calkit/dvc/zip.py,sha256=
|
|
54
|
+
calkit/dvc/zip.py,sha256=nf4EzOyc5nI_OA3M6S7wwZpL7N4EQz9yCf8FbnPjlxM,21857
|
|
55
55
|
calkit/jupyterlab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
56
56
|
calkit/jupyterlab/routes.py,sha256=jnNd289CpNQFY6am5p3qaiL_Tcnkd6J_vDVdjIXlb1A,51465
|
|
57
57
|
calkit/models/__init__.py,sha256=vGYF4MZBGzDk1BPBzpp1bRb59RCJ2Bj2kzHuVVRacug,120
|
|
@@ -106,13 +106,13 @@ calkit/tests/cli/test_overleaf.py,sha256=Y-ud4kZHh3nhyoZlXrtMfx61z-GPNytUpfDHMad
|
|
|
106
106
|
calkit/tests/cli/test_scheduler.py,sha256=mE0KLwcb9gozOnylTLsaL_xYGAptlD9hB8ZiKpPhmcc,17934
|
|
107
107
|
calkit/tests/cli/test_update.py,sha256=bwRF0kpqbCVxNvGH777LHFX3oUP2DyN3XXUBDCEKNoc,6356
|
|
108
108
|
calkit/tests/cli/main/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
109
|
-
calkit/tests/cli/main/test_core.py,sha256=
|
|
109
|
+
calkit/tests/cli/main/test_core.py,sha256=kDB0e-13jkx5-1wYAFgzIwzt2A10r_1eExYFf8v6sd4,66919
|
|
110
110
|
calkit/tests/cli/main/test_lock.py,sha256=1iX8iSbGtr4O9OkaAi4d3gP3_QzNl6Rr6HLtbEpS6iU,9847
|
|
111
111
|
calkit/tests/cli/main/test_subprojects.py,sha256=ZR2ZQvZ4XZOi-iW8nlZEYu_2CUyUWoc0MABmnFrF9DQ,12730
|
|
112
112
|
calkit/tests/cli/main/test_xr.py,sha256=shk8LHS33bZpr_iAW5eA5sMD3nQDKm8fIwXlE6dA2uI,22527
|
|
113
113
|
calkit/tests/dvc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
114
114
|
calkit/tests/dvc/test_core.py,sha256=ywXBEyw1XpoSuu1EnMbFl-ebbdEJjpaBEPG157_3RBY,12914
|
|
115
|
-
calkit/tests/dvc/test_zip.py,sha256=
|
|
115
|
+
calkit/tests/dvc/test_zip.py,sha256=UjluBZYTnw5nisHELz42VRPDk88b0TvDx4QJNVaR-iA,12369
|
|
116
116
|
calkit/tests/jupyterlab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
117
117
|
calkit/tests/jupyterlab/conftest.py,sha256=Xsh5Zwg0fdqEFPkHDgG7oCHhHJj6WuZLWbmsl7ATABA,207
|
|
118
118
|
calkit/tests/jupyterlab/test_routes.py,sha256=TEEyoHiKnzzKOkQsJcMPKdqpKFQ25yBCvVSquqe9nsE,408
|
|
@@ -123,23 +123,23 @@ calkit/tests/models/test_pipeline.py,sha256=9F0g6ij7vc8c2hIRIVTHpT0I-JHXC6i2NRB2
|
|
|
123
123
|
calkit/agent_skills/add-pipeline-stage/SKILL.md,sha256=kpYYb-rJsS4B9p1Ub3gL21irCG5ZZ4DvWZpdJeEwPZk,3772
|
|
124
124
|
calkit/agent_skills/conventions/SKILL.md,sha256=nAM2FjSMk6ED56Dr5zh2bL_dhfzDra-h2ZgzHU7ruS4,9524
|
|
125
125
|
calkit/agent_skills/create-pipeline/SKILL.md,sha256=2FGw1iDQVRk5FUq79GP3lPdgvgof2Wi1O9O-abGGtgs,5422
|
|
126
|
-
calkit_python-0.41.
|
|
127
|
-
calkit_python-0.41.
|
|
128
|
-
calkit_python-0.41.
|
|
129
|
-
calkit_python-0.41.
|
|
130
|
-
calkit_python-0.41.
|
|
131
|
-
calkit_python-0.41.
|
|
132
|
-
calkit_python-0.41.
|
|
133
|
-
calkit_python-0.41.
|
|
134
|
-
calkit_python-0.41.
|
|
135
|
-
calkit_python-0.41.
|
|
136
|
-
calkit_python-0.41.
|
|
137
|
-
calkit_python-0.41.
|
|
138
|
-
calkit_python-0.41.
|
|
139
|
-
calkit_python-0.41.
|
|
140
|
-
calkit_python-0.41.
|
|
141
|
-
calkit_python-0.41.
|
|
142
|
-
calkit_python-0.41.
|
|
143
|
-
calkit_python-0.41.
|
|
144
|
-
calkit_python-0.41.
|
|
145
|
-
calkit_python-0.41.
|
|
126
|
+
calkit_python-0.41.20.data/data/etc/jupyter/jupyter_server_config.d/calkit.json,sha256=CWrZP--JDGz8fsvbAlKr_duTL1vDriGT48SL1YCtkY0,81
|
|
127
|
+
calkit_python-0.41.20.data/data/share/jupyter/labextensions/calkit/package.json,sha256=39PQEWOzw0qtqD7Kep3OPbUR113vI7CG5TeD84v7clM,6224
|
|
128
|
+
calkit_python-0.41.20.data/data/share/jupyter/labextensions/calkit/schemas/calkit/package.json.orig,sha256=NBG3t7gFYb6_2J-yPU29qS7Ck9pYgm8-wC5Q1LrzQeI,6082
|
|
129
|
+
calkit_python-0.41.20.data/data/share/jupyter/labextensions/calkit/schemas/calkit/plugin.json,sha256=YSpIrwpwB-lQBk9Mwv-npedWTOOZreO6nlWZhqlWyGI,840
|
|
130
|
+
calkit_python-0.41.20.data/data/share/jupyter/labextensions/calkit/static/502.9a2c5772a15466e923ef.js,sha256=mixXcqFUZukj7_jQVxHTavsYl7cdZv83sEe4phJgkh0,59893
|
|
131
|
+
calkit_python-0.41.20.data/data/share/jupyter/labextensions/calkit/static/695.2c41003a452d43d2b358.js,sha256=LEEAOkUtQ9KzWEHn-QFv5yGi70B-sBOnrvztzHr0Shw,223
|
|
132
|
+
calkit_python-0.41.20.data/data/share/jupyter/labextensions/calkit/static/867.a42a046aa5108f54f8fb.js,sha256=pCoEaqUQj1T4-zAc9SUd__9ZGm7uL2wHQve2xwL89NI,8156
|
|
133
|
+
calkit_python-0.41.20.data/data/share/jupyter/labextensions/calkit/static/909.e3f9cc3408834a7fdcc3.js,sha256=4_nMNAiDSn_cw7UjIHEwone4fizrvqrqSgbwUWvjmoU,114571
|
|
134
|
+
calkit_python-0.41.20.data/data/share/jupyter/labextensions/calkit/static/946.050af2abf7845cfbdbd2.js,sha256=n_a0yu_gE7l6fauyoXXv9BZ7ZEYt2387mTfs7CbLcs4,51939
|
|
135
|
+
calkit_python-0.41.20.data/data/share/jupyter/labextensions/calkit/static/946.050af2abf7845cfbdbd2.js.LICENSE.txt,sha256=eNJ8gc9n9IF8nW1d9sI9niuHstYzjNz5vqXx9UgWSPc,249
|
|
136
|
+
calkit_python-0.41.20.data/data/share/jupyter/labextensions/calkit/static/b2f1c3efe70cb539d121.png,sha256=svHD7-cMtTnRITFwugwsVaB9nZ-h8A61ose8z32HiRE,24850
|
|
137
|
+
calkit_python-0.41.20.data/data/share/jupyter/labextensions/calkit/static/remoteEntry.ac9035764d5b2adbb542.js,sha256=rJA1dk1bKtu1QkURrp5HEC2WCxzZppPV1SCYz-35GTc,8737
|
|
138
|
+
calkit_python-0.41.20.data/data/share/jupyter/labextensions/calkit/static/style.js,sha256=r89Jlk5v1drcwhCpv9FnC3Jig_JH4k24kZNIvxh6Htk,149
|
|
139
|
+
calkit_python-0.41.20.data/data/share/jupyter/labextensions/calkit/static/third-party-licenses.json,sha256=2BGdItLJwO3fAopLl4eJvp26TEwuscYC0-yFaF-LaLU,13683
|
|
140
|
+
calkit_python-0.41.20.data/data/share/jupyter/labextensions/calkit/install.json,sha256=DK9d8G-q-rMVlcT3rAeGIyo3REWKw6FySBZceLU9yaw,187
|
|
141
|
+
calkit_python-0.41.20.dist-info/METADATA,sha256=kNDMzEEG3WA9MQu9EOFf8G2oaCTjymyEfA3KFAIQtDA,12442
|
|
142
|
+
calkit_python-0.41.20.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
|
|
143
|
+
calkit_python-0.41.20.dist-info/entry_points.txt,sha256=2iQBBzjTAOdk66CwS-f3ecXXW5DjUqkG1KBRj8mHI1I,133
|
|
144
|
+
calkit_python-0.41.20.dist-info/licenses/LICENSE,sha256=9ZamCaSUTZk9rcrnf-sWFKLOHr3ws-S_dgKMegW4nw8,1056
|
|
145
|
+
calkit_python-0.41.20.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|