modal 1.1.1.dev24__tar.gz → 1.1.1.dev26__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.
Potentially problematic release.
This version of modal might be problematic. Click here for more details.
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/PKG-INFO +1 -1
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/__main__.py +2 -2
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_output.py +12 -4
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/_traceback.py +3 -2
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/cluster.py +2 -2
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/config.py +2 -2
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/dict.py +2 -2
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/entry_point.py +2 -2
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/import_refs.py +3 -3
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/network_file_system.py +6 -7
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/profile.py +2 -2
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/queues.py +3 -3
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/secret.py +2 -2
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/utils.py +3 -4
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/volume.py +5 -6
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/client.pyi +2 -2
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/container_process.py +2 -2
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/mount.py +1 -1
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/token_flow.py +3 -3
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_version/__init__.py +1 -1
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/LICENSE +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/README.md +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/__init__.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_clustered_functions.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_clustered_functions.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_container_entrypoint.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_functions.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_ipython.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_location.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_object.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_partial_function.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_pty.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_resolver.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_resources.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_runtime/__init__.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_runtime/asgi.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_runtime/execution_context.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_runtime/telemetry.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_serialization.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_traceback.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_tunnel.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_tunnel.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_type_manager.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/__init__.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/app_utils.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/async_utils.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/blob_utils.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/deprecation.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/docker_utils.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/function_utils.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/git_utils.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/hash_utils.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/http_utils.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/logger.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/mount_utils.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/name_utils.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/package_utils.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/shell_utils.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_utils/time_utils.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_vendor/__init__.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_vendor/tblib.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/_watcher.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/app.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/app.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/builder/2023.12.txt +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/builder/2024.04.txt +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/builder/2024.10.txt +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/builder/2025.06.txt +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/builder/README.md +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/builder/base-images.json +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/call_graph.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/__init__.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/_download.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/app.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/container.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/environment.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/launch.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/programs/__init__.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/programs/vscode.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/run.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cli/token.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/client.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cls.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/cls.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/config.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/container_process.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/dict.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/dict.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/environments.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/environments.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/exception.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/experimental/__init__.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/experimental/flash.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/experimental/flash.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/experimental/ipython.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/file_io.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/file_io.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/file_pattern_matcher.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/functions.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/functions.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/gpu.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/image.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/image.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/io_streams.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/io_streams.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/mount.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/network_file_system.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/network_file_system.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/object.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/object.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/output.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/parallel_map.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/parallel_map.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/partial_function.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/partial_function.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/proxy.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/proxy.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/py.typed +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/queue.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/queue.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/retries.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/runner.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/runner.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/running_app.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/sandbox.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/sandbox.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/schedule.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/scheduler_placement.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/secret.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/secret.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/serving.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/serving.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/snapshot.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/snapshot.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/stream_type.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/token_flow.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/volume.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal/volume.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal.egg-info/requires.txt +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal.egg-info/top_level.txt +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_docs/__init__.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_proto/__init__.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_proto/api.proto +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_proto/api_grpc.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_proto/api_pb2.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_proto/api_pb2.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_proto/modal_options_grpc.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_proto/options.proto +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_proto/options_grpc.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_proto/options_pb2.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_proto/options_pb2.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_proto/options_pb2_grpc.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_proto/options_pb2_grpc.pyi +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_proto/py.typed +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/modal_version/__main__.py +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/pyproject.toml +0 -0
- {modal-1.1.1.dev24 → modal-1.1.1.dev26}/setup.cfg +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Copyright Modal Labs 2022
|
|
2
2
|
import sys
|
|
3
3
|
|
|
4
|
+
from ._output import make_console
|
|
4
5
|
from ._traceback import reduce_traceback_to_user_code
|
|
5
6
|
from .cli._traceback import highlight_modal_warnings, setup_rich_traceback
|
|
6
7
|
from .cli.entry_point import entrypoint_cli
|
|
@@ -35,7 +36,6 @@ def main():
|
|
|
35
36
|
raise
|
|
36
37
|
|
|
37
38
|
from grpclib import GRPCError, Status
|
|
38
|
-
from rich.console import Console
|
|
39
39
|
from rich.panel import Panel
|
|
40
40
|
from rich.text import Text
|
|
41
41
|
|
|
@@ -68,7 +68,7 @@ def main():
|
|
|
68
68
|
if notes := getattr(exc, "__notes__", []):
|
|
69
69
|
content = f"{content}\n\nNote: {' '.join(notes)}"
|
|
70
70
|
|
|
71
|
-
console =
|
|
71
|
+
console = make_console(stderr=True)
|
|
72
72
|
panel = Panel(Text(content), title=title, title_align="left", border_style="red")
|
|
73
73
|
console.print(panel, highlight=False)
|
|
74
74
|
sys.exit(1)
|
|
@@ -4,7 +4,6 @@ from __future__ import annotations
|
|
|
4
4
|
import asyncio
|
|
5
5
|
import contextlib
|
|
6
6
|
import functools
|
|
7
|
-
import io
|
|
8
7
|
import platform
|
|
9
8
|
import re
|
|
10
9
|
import socket
|
|
@@ -46,6 +45,16 @@ else:
|
|
|
46
45
|
default_spinner = "dots"
|
|
47
46
|
|
|
48
47
|
|
|
48
|
+
def make_console(*, stderr: bool = False, highlight: bool = True) -> Console:
|
|
49
|
+
"""Create a rich Console tuned for Modal CLI output."""
|
|
50
|
+
return Console(
|
|
51
|
+
stderr=stderr,
|
|
52
|
+
highlight=highlight,
|
|
53
|
+
# CLI does not work with auto-detected Jupyter HTML display_data.
|
|
54
|
+
force_jupyter=False,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
|
|
49
58
|
class FunctionQueuingColumn(ProgressColumn):
|
|
50
59
|
"""Renders time elapsed, including task.completed as additional elapsed time."""
|
|
51
60
|
|
|
@@ -147,12 +156,11 @@ class OutputManager:
|
|
|
147
156
|
def __init__(
|
|
148
157
|
self,
|
|
149
158
|
*,
|
|
150
|
-
stdout: io.TextIOWrapper | None = None,
|
|
151
159
|
status_spinner_text: str = "Running app...",
|
|
152
160
|
show_timestamps: bool = False,
|
|
153
161
|
):
|
|
154
|
-
self._stdout =
|
|
155
|
-
self._console =
|
|
162
|
+
self._stdout = sys.stdout
|
|
163
|
+
self._console = make_console(highlight=False)
|
|
156
164
|
self._task_states = {}
|
|
157
165
|
self._task_progress_items = {}
|
|
158
166
|
self._current_render_group = None
|
|
@@ -6,12 +6,13 @@ import re
|
|
|
6
6
|
import warnings
|
|
7
7
|
from typing import Optional
|
|
8
8
|
|
|
9
|
-
from rich.console import
|
|
9
|
+
from rich.console import RenderResult, group
|
|
10
10
|
from rich.panel import Panel
|
|
11
11
|
from rich.syntax import Syntax
|
|
12
12
|
from rich.text import Text
|
|
13
13
|
from rich.traceback import PathHighlighter, Stack, Traceback, install
|
|
14
14
|
|
|
15
|
+
from .._output import make_console
|
|
15
16
|
from ..exception import DeprecationError, PendingDeprecationError, ServerWarning
|
|
16
17
|
|
|
17
18
|
|
|
@@ -193,7 +194,7 @@ def highlight_modal_warnings() -> None:
|
|
|
193
194
|
title=title,
|
|
194
195
|
title_align="left",
|
|
195
196
|
)
|
|
196
|
-
|
|
197
|
+
make_console().print(panel)
|
|
197
198
|
else:
|
|
198
199
|
base_showwarning(warning, category, filename, lineno, file=None, line=None)
|
|
199
200
|
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
from typing import Optional, Union
|
|
3
3
|
|
|
4
4
|
import typer
|
|
5
|
-
from rich.console import Console
|
|
6
5
|
from rich.text import Text
|
|
7
6
|
|
|
8
7
|
from modal._object import _get_environment_name
|
|
8
|
+
from modal._output import make_console
|
|
9
9
|
from modal._pty import get_pty_info
|
|
10
10
|
from modal._utils.async_utils import synchronizer
|
|
11
11
|
from modal._utils.time_utils import timestamp_to_local
|
|
@@ -62,7 +62,7 @@ async def shell(
|
|
|
62
62
|
if len(res.cluster.task_ids) <= rank:
|
|
63
63
|
raise typer.Abort(f"No node with rank {rank} in cluster {cluster_id}")
|
|
64
64
|
task_id = res.cluster.task_ids[rank]
|
|
65
|
-
console =
|
|
65
|
+
console = make_console()
|
|
66
66
|
is_main = "(main)" if rank == 0 else ""
|
|
67
67
|
console.print(
|
|
68
68
|
f"Opening shell to node {rank} {is_main} of cluster {cluster_id} (container {task_id})", style="green"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Copyright Modal Labs 2022
|
|
2
2
|
import typer
|
|
3
|
-
from rich.console import Console
|
|
4
3
|
|
|
4
|
+
from modal._output import make_console
|
|
5
5
|
from modal.config import _profile, _store_user_config, config
|
|
6
6
|
from modal.environments import Environment
|
|
7
7
|
|
|
@@ -24,7 +24,7 @@ def show(redact: bool = typer.Option(True, help="Redact the `token_secret` value
|
|
|
24
24
|
if redact and config_dict.get("token_secret"):
|
|
25
25
|
config_dict["token_secret"] = "***"
|
|
26
26
|
|
|
27
|
-
console =
|
|
27
|
+
console = make_console()
|
|
28
28
|
console.print(config_dict)
|
|
29
29
|
|
|
30
30
|
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
from typing import Optional
|
|
3
3
|
|
|
4
4
|
import typer
|
|
5
|
-
from rich.console import Console
|
|
6
5
|
from typer import Argument, Option, Typer
|
|
7
6
|
|
|
7
|
+
from modal._output import make_console
|
|
8
8
|
from modal._resolver import Resolver
|
|
9
9
|
from modal._utils.async_utils import synchronizer
|
|
10
10
|
from modal._utils.grpc_utils import retry_transient_errors
|
|
@@ -85,7 +85,7 @@ async def get(name: str, key: str, *, env: Optional[str] = ENV_OPTION):
|
|
|
85
85
|
Note: When using the CLI, keys are always interpreted as having a string type.
|
|
86
86
|
"""
|
|
87
87
|
d = _Dict.from_name(name, environment_name=env)
|
|
88
|
-
console =
|
|
88
|
+
console = make_console()
|
|
89
89
|
val = await d.get(key)
|
|
90
90
|
console.print(val)
|
|
91
91
|
|
|
@@ -3,9 +3,9 @@ import subprocess
|
|
|
3
3
|
from typing import Optional
|
|
4
4
|
|
|
5
5
|
import typer
|
|
6
|
-
from rich.console import Console
|
|
7
6
|
from rich.rule import Rule
|
|
8
7
|
|
|
8
|
+
from modal._output import make_console
|
|
9
9
|
from modal._utils.async_utils import synchronizer
|
|
10
10
|
|
|
11
11
|
from . import run
|
|
@@ -71,7 +71,7 @@ def check_path():
|
|
|
71
71
|
"You may need to give it permissions or use `[white]python -m modal[/white]` as a workaround.[/red]\n"
|
|
72
72
|
)
|
|
73
73
|
text += f"See more information here:\n\n[link={url}]{url}[/link]\n"
|
|
74
|
-
console =
|
|
74
|
+
console = make_console()
|
|
75
75
|
console.print(text)
|
|
76
76
|
console.print(Rule(style="white"))
|
|
77
77
|
|
|
@@ -19,9 +19,9 @@ from pathlib import Path
|
|
|
19
19
|
from typing import Optional, Union, cast
|
|
20
20
|
|
|
21
21
|
import click
|
|
22
|
-
from rich.console import Console
|
|
23
22
|
from rich.markdown import Markdown
|
|
24
23
|
|
|
24
|
+
from modal._output import make_console
|
|
25
25
|
from modal._utils.deprecation import deprecation_warning
|
|
26
26
|
from modal.app import App, LocalEntrypoint
|
|
27
27
|
from modal.cls import Cls
|
|
@@ -258,7 +258,7 @@ def import_app_from_ref(import_ref: ImportRef, base_cmd: str = "") -> App:
|
|
|
258
258
|
app = getattr(module, object_path)
|
|
259
259
|
|
|
260
260
|
if app is None:
|
|
261
|
-
error_console =
|
|
261
|
+
error_console = make_console(stderr=True)
|
|
262
262
|
error_console.print(f"[bold red]Could not find Modal app '{object_path}' in {import_path}.[/bold red]")
|
|
263
263
|
|
|
264
264
|
if not object_path:
|
|
@@ -282,7 +282,7 @@ def import_app_from_ref(import_ref: ImportRef, base_cmd: str = "") -> App:
|
|
|
282
282
|
def _show_function_ref_help(app_ref: ImportRef, base_cmd: str) -> None:
|
|
283
283
|
object_path = app_ref.object_path
|
|
284
284
|
import_path = app_ref.file_or_module
|
|
285
|
-
error_console =
|
|
285
|
+
error_console = make_console(stderr=True)
|
|
286
286
|
if object_path:
|
|
287
287
|
error_console.print(
|
|
288
288
|
f"[bold red]Could not find Modal function or local entrypoint"
|
|
@@ -7,14 +7,13 @@ from typing import Optional
|
|
|
7
7
|
import typer
|
|
8
8
|
from click import UsageError
|
|
9
9
|
from grpclib import GRPCError, Status
|
|
10
|
-
from rich.console import Console
|
|
11
10
|
from rich.syntax import Syntax
|
|
12
11
|
from rich.table import Table
|
|
13
12
|
from typer import Argument, Typer
|
|
14
13
|
|
|
15
14
|
import modal
|
|
16
15
|
from modal._location import display_location
|
|
17
|
-
from modal._output import OutputManager, ProgressHandler
|
|
16
|
+
from modal._output import OutputManager, ProgressHandler, make_console
|
|
18
17
|
from modal._utils.async_utils import synchronizer
|
|
19
18
|
from modal._utils.grpc_utils import retry_transient_errors
|
|
20
19
|
from modal._utils.time_utils import timestamp_to_local
|
|
@@ -66,7 +65,7 @@ def create(
|
|
|
66
65
|
):
|
|
67
66
|
ensure_env(env)
|
|
68
67
|
modal.NetworkFileSystem.create_deployed(name, environment_name=env)
|
|
69
|
-
console =
|
|
68
|
+
console = make_console()
|
|
70
69
|
console.print(f"Created volume '{name}'. \n\nCode example:\n")
|
|
71
70
|
usage = Syntax(gen_usage_code(name), "python")
|
|
72
71
|
console.print(usage)
|
|
@@ -93,7 +92,7 @@ async def ls(
|
|
|
93
92
|
raise
|
|
94
93
|
|
|
95
94
|
if sys.stdout.isatty():
|
|
96
|
-
console =
|
|
95
|
+
console = make_console()
|
|
97
96
|
console.print(f"Directory listing of '{path}' in '{volume_name}'")
|
|
98
97
|
table = Table()
|
|
99
98
|
|
|
@@ -131,7 +130,7 @@ async def put(
|
|
|
131
130
|
volume = _NetworkFileSystem.from_name(volume_name)
|
|
132
131
|
if remote_path.endswith("/"):
|
|
133
132
|
remote_path = remote_path + os.path.basename(local_path)
|
|
134
|
-
console =
|
|
133
|
+
console = make_console()
|
|
135
134
|
|
|
136
135
|
if Path(local_path).is_dir():
|
|
137
136
|
progress_handler = ProgressHandler(type="upload", console=console)
|
|
@@ -184,7 +183,7 @@ async def get(
|
|
|
184
183
|
ensure_env(env)
|
|
185
184
|
destination = Path(local_destination)
|
|
186
185
|
volume = _NetworkFileSystem.from_name(volume_name)
|
|
187
|
-
console =
|
|
186
|
+
console = make_console()
|
|
188
187
|
progress_handler = ProgressHandler(type="download", console=console)
|
|
189
188
|
with progress_handler.live:
|
|
190
189
|
await _volume_download(volume, remote_path, destination, force, progress_cb=progress_handler.progress)
|
|
@@ -203,7 +202,7 @@ async def rm(
|
|
|
203
202
|
):
|
|
204
203
|
ensure_env(env)
|
|
205
204
|
volume = _NetworkFileSystem.from_name(volume_name)
|
|
206
|
-
console =
|
|
205
|
+
console = make_console()
|
|
207
206
|
try:
|
|
208
207
|
await volume.remove_file(remote_path, recursive=recursive)
|
|
209
208
|
console.print(OutputManager.step_completed(f"{remote_path} was deleted successfully!"))
|
|
@@ -5,10 +5,10 @@ import os
|
|
|
5
5
|
from typing import Optional
|
|
6
6
|
|
|
7
7
|
import typer
|
|
8
|
-
from rich.console import Console
|
|
9
8
|
from rich.json import JSON
|
|
10
9
|
from rich.table import Table
|
|
11
10
|
|
|
11
|
+
from modal._output import make_console
|
|
12
12
|
from modal._utils.async_utils import synchronizer
|
|
13
13
|
from modal.config import Config, _lookup_workspace, _profile, config_profiles, config_set_active_profile
|
|
14
14
|
from modal.exception import AuthError
|
|
@@ -69,7 +69,7 @@ async def list_(json: Optional[bool] = False):
|
|
|
69
69
|
except AuthError:
|
|
70
70
|
env_based_workspace = "Unknown (authentication failure)"
|
|
71
71
|
|
|
72
|
-
console =
|
|
72
|
+
console = make_console()
|
|
73
73
|
highlight = "bold green" if env_based_workspace is None else "yellow"
|
|
74
74
|
if json:
|
|
75
75
|
json_data = []
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
from typing import Optional
|
|
3
3
|
|
|
4
4
|
import typer
|
|
5
|
-
from rich.console import Console
|
|
6
5
|
from typer import Argument, Option, Typer
|
|
7
6
|
|
|
7
|
+
from modal._output import make_console
|
|
8
8
|
from modal._resolver import Resolver
|
|
9
9
|
from modal._utils.async_utils import synchronizer
|
|
10
10
|
from modal._utils.grpc_utils import retry_transient_errors
|
|
@@ -108,7 +108,7 @@ async def peek(
|
|
|
108
108
|
):
|
|
109
109
|
"""Print the next N items in the queue or queue partition (without removal)."""
|
|
110
110
|
q = _Queue.from_name(name, environment_name=env)
|
|
111
|
-
console =
|
|
111
|
+
console = make_console()
|
|
112
112
|
i = 0
|
|
113
113
|
async for item in q.iterate(partition=partition):
|
|
114
114
|
console.print(item)
|
|
@@ -128,5 +128,5 @@ async def len(
|
|
|
128
128
|
):
|
|
129
129
|
"""Print the length of a queue partition or the total length of all partitions."""
|
|
130
130
|
q = _Queue.from_name(name, environment_name=env)
|
|
131
|
-
console =
|
|
131
|
+
console = make_console()
|
|
132
132
|
console.print(await q.len(partition=partition, total=total))
|
|
@@ -9,10 +9,10 @@ from typing import Optional
|
|
|
9
9
|
|
|
10
10
|
import click
|
|
11
11
|
import typer
|
|
12
|
-
from rich.console import Console
|
|
13
12
|
from rich.syntax import Syntax
|
|
14
13
|
from typer import Argument
|
|
15
14
|
|
|
15
|
+
from modal._output import make_console
|
|
16
16
|
from modal._utils.async_utils import synchronizer
|
|
17
17
|
from modal._utils.grpc_utils import retry_transient_errors
|
|
18
18
|
from modal._utils.time_utils import timestamp_to_local
|
|
@@ -117,7 +117,7 @@ modal secret create my-credentials username=john password="$PASSWORD"
|
|
|
117
117
|
await _Secret.create_deployed(secret_name, env_dict, overwrite=force)
|
|
118
118
|
|
|
119
119
|
# Print code sample
|
|
120
|
-
console =
|
|
120
|
+
console = make_console()
|
|
121
121
|
env_var_code = "\n ".join(f'os.getenv("{name}")' for name in env_dict.keys()) if env_dict else "..."
|
|
122
122
|
example_code = f"""
|
|
123
123
|
@app.function(secrets=[modal.Secret.from_name("{secret_name}")])
|
|
@@ -7,13 +7,12 @@ from typing import Optional, Union
|
|
|
7
7
|
import typer
|
|
8
8
|
from click import UsageError
|
|
9
9
|
from grpclib import GRPCError, Status
|
|
10
|
-
from rich.console import Console
|
|
11
10
|
from rich.table import Column, Table
|
|
12
11
|
from rich.text import Text
|
|
13
12
|
|
|
14
13
|
from modal_proto import api_pb2
|
|
15
14
|
|
|
16
|
-
from .._output import OutputManager, get_app_logs_loop
|
|
15
|
+
from .._output import OutputManager, get_app_logs_loop, make_console
|
|
17
16
|
from .._utils.async_utils import synchronizer
|
|
18
17
|
from ..client import _Client
|
|
19
18
|
from ..environments import ensure_env
|
|
@@ -66,7 +65,7 @@ def _plain(text: Union[Text, str]) -> str:
|
|
|
66
65
|
|
|
67
66
|
|
|
68
67
|
def is_tty() -> bool:
|
|
69
|
-
return
|
|
68
|
+
return make_console().is_terminal
|
|
70
69
|
|
|
71
70
|
|
|
72
71
|
def display_table(
|
|
@@ -78,7 +77,7 @@ def display_table(
|
|
|
78
77
|
def col_to_str(col: Union[Column, str]) -> str:
|
|
79
78
|
return str(col.header) if isinstance(col, Column) else col
|
|
80
79
|
|
|
81
|
-
console =
|
|
80
|
+
console = make_console()
|
|
82
81
|
if json:
|
|
83
82
|
json_data = [{col_to_str(col): _plain(row[i]) for i, col in enumerate(columns)} for row in rows]
|
|
84
83
|
console.print_json(dumps(json_data))
|
|
@@ -7,12 +7,11 @@ from typing import Optional
|
|
|
7
7
|
import typer
|
|
8
8
|
from click import UsageError
|
|
9
9
|
from grpclib import GRPCError, Status
|
|
10
|
-
from rich.console import Console
|
|
11
10
|
from rich.syntax import Syntax
|
|
12
11
|
from typer import Argument, Option, Typer
|
|
13
12
|
|
|
14
13
|
import modal
|
|
15
|
-
from modal._output import OutputManager, ProgressHandler
|
|
14
|
+
from modal._output import OutputManager, ProgressHandler, make_console
|
|
16
15
|
from modal._utils.async_utils import synchronizer
|
|
17
16
|
from modal._utils.grpc_utils import retry_transient_errors
|
|
18
17
|
from modal._utils.time_utils import timestamp_to_local
|
|
@@ -64,7 +63,7 @@ def some_func():
|
|
|
64
63
|
os.listdir("/my_vol")
|
|
65
64
|
"""
|
|
66
65
|
|
|
67
|
-
console =
|
|
66
|
+
console = make_console()
|
|
68
67
|
console.print(f"Created Volume '{name}' in environment '{env_name}'. \n\nCode example:\n")
|
|
69
68
|
usage = Syntax(usage_code, "python")
|
|
70
69
|
console.print(usage)
|
|
@@ -96,7 +95,7 @@ async def get(
|
|
|
96
95
|
ensure_env(env)
|
|
97
96
|
destination = Path(local_destination)
|
|
98
97
|
volume = _Volume.from_name(volume_name, environment_name=env)
|
|
99
|
-
console =
|
|
98
|
+
console = make_console()
|
|
100
99
|
progress_handler = ProgressHandler(type="download", console=console)
|
|
101
100
|
with progress_handler.live:
|
|
102
101
|
await _volume_download(volume, remote_path, destination, force, progress_cb=progress_handler.progress)
|
|
@@ -197,7 +196,7 @@ async def put(
|
|
|
197
196
|
|
|
198
197
|
if remote_path.endswith("/"):
|
|
199
198
|
remote_path = remote_path + os.path.basename(local_path)
|
|
200
|
-
console =
|
|
199
|
+
console = make_console()
|
|
201
200
|
progress_handler = ProgressHandler(type="upload", console=console)
|
|
202
201
|
|
|
203
202
|
if Path(local_path).is_dir():
|
|
@@ -245,7 +244,7 @@ async def rm(
|
|
|
245
244
|
):
|
|
246
245
|
ensure_env(env)
|
|
247
246
|
volume = _Volume.from_name(volume_name, environment_name=env)
|
|
248
|
-
console =
|
|
247
|
+
console = make_console()
|
|
249
248
|
try:
|
|
250
249
|
await volume.remove_file(remote_path, recursive=recursive)
|
|
251
250
|
console.print(OutputManager.step_completed(f"{remote_path} was deleted successfully!"))
|
|
@@ -33,7 +33,7 @@ class _Client:
|
|
|
33
33
|
server_url: str,
|
|
34
34
|
client_type: int,
|
|
35
35
|
credentials: typing.Optional[tuple[str, str]],
|
|
36
|
-
version: str = "1.1.1.
|
|
36
|
+
version: str = "1.1.1.dev26",
|
|
37
37
|
):
|
|
38
38
|
"""mdmd:hidden
|
|
39
39
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -164,7 +164,7 @@ class Client:
|
|
|
164
164
|
server_url: str,
|
|
165
165
|
client_type: int,
|
|
166
166
|
credentials: typing.Optional[tuple[str, str]],
|
|
167
|
-
version: str = "1.1.1.
|
|
167
|
+
version: str = "1.1.1.dev26",
|
|
168
168
|
):
|
|
169
169
|
"""mdmd:hidden
|
|
170
170
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -144,9 +144,9 @@ class _ContainerProcess(Generic[T]):
|
|
|
144
144
|
print("interactive exec is not currently supported on Windows.")
|
|
145
145
|
return
|
|
146
146
|
|
|
147
|
-
from
|
|
147
|
+
from ._output import make_console
|
|
148
148
|
|
|
149
|
-
console =
|
|
149
|
+
console = make_console()
|
|
150
150
|
|
|
151
151
|
connecting_status = console.status("Connecting...")
|
|
152
152
|
connecting_status.start()
|
|
@@ -882,7 +882,7 @@ async def _create_single_client_dependency_mount(
|
|
|
882
882
|
|
|
883
883
|
with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmpd:
|
|
884
884
|
print(f"📦 Building {mount_name}.")
|
|
885
|
-
requirements = os.path.join(os.path.dirname(__file__), f"
|
|
885
|
+
requirements = os.path.join(os.path.dirname(__file__), f"builder/{builder_version}.txt")
|
|
886
886
|
cmd = " ".join(
|
|
887
887
|
[
|
|
888
888
|
"uv",
|
|
@@ -6,11 +6,11 @@ from collections.abc import AsyncGenerator
|
|
|
6
6
|
from typing import Optional
|
|
7
7
|
|
|
8
8
|
import aiohttp.web
|
|
9
|
-
from rich.console import Console
|
|
10
9
|
from synchronicity.async_wrap import asynccontextmanager
|
|
11
10
|
|
|
12
11
|
from modal_proto import api_pb2
|
|
13
12
|
|
|
13
|
+
from ._output import make_console
|
|
14
14
|
from ._utils.async_utils import synchronize_api
|
|
15
15
|
from ._utils.http_utils import run_temporary_http_server
|
|
16
16
|
from .client import _Client
|
|
@@ -76,7 +76,7 @@ async def _new_token(
|
|
|
76
76
|
):
|
|
77
77
|
server_url = config.get("server_url", profile=profile)
|
|
78
78
|
|
|
79
|
-
console =
|
|
79
|
+
console = make_console()
|
|
80
80
|
|
|
81
81
|
result: Optional[api_pb2.TokenFlowWaitResponse] = None
|
|
82
82
|
async with _Client.anonymous(server_url) as client:
|
|
@@ -133,7 +133,7 @@ async def _set_token(
|
|
|
133
133
|
):
|
|
134
134
|
# TODO add server_url as a parameter for verification?
|
|
135
135
|
server_url = config.get("server_url", profile=profile)
|
|
136
|
-
console =
|
|
136
|
+
console = make_console()
|
|
137
137
|
if verify:
|
|
138
138
|
console.print(f"Verifying token against [blue]{server_url}[/blue]")
|
|
139
139
|
await _Client.verify(server_url, (token_id, token_secret))
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|