openrunner-sdk 2.19.2__tar.gz → 2.20.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.
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/PKG-INFO +1 -1
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/__init__.py +1 -1
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/install_commands.py +123 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/pyproject.toml +1 -1
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/.gitignore +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/=6.0 +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/=8.1 +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/README.md +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/CLAUDE.md +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/api_client.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/artifact.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/buffer.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/cache.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/cli.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/config.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/cost.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/dataset.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/environment.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/evaluation.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/feedback.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/git_info.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/guardrails.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/__init__.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/accelerate.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/anthropic_tracer.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/catboost.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/diffusers.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/fastai.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/forced_alignment.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/gladia.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/gymnasium.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/huggingface.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/hydra.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/ignite.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/jax.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/keras.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/langchain.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/lightgbm.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/lightning.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/llamaindex.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/openai_finetune.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/openai_tracer.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/optuna.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/pytorch.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/sb3.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/sklearn.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/tensorflow.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/trl.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/tts.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/ultralytics.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/voice_agent.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/whisper.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/xgboost.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/launch.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/mcp_server.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/media.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/migrate.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/model.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/offline.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/pii.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/plot.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/prompt.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/query_api.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/redact.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/run.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/scorers.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/sender.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/session.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/settings.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/summary.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/sweep.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/system_metrics.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/tensorboard.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/trace.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/transcript_formatter.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/wal.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/wandb_compat/__init__.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/wandb_compat/_shim.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/wer.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/__init__.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/conftest.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_alert.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_aliases.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_api_client.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_artifact.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_buffer.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_cache.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_class_scorers.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_cli.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_config.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_evaluation.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_finish.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_git_info.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_init.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_integration_fastai.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_integration_huggingface.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_integration_keras.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_integration_langchain.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_integration_lightning.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_integration_pytorch.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_integration_sklearn.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_integration_xgboost.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_launch.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_log.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_log_code.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_media.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_migrate.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_offline.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_offline_sync.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_pii.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_plot.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_query_api.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_resume.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_sdk_features.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_sender.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_summary.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_sweep.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_system_metrics.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_trace.py +0 -0
- {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_wandb_compat.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openrunner-sdk
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.20.0
|
|
4
4
|
Summary: OpenRunner SDK - W&B-compatible ML experiment tracking client
|
|
5
5
|
Project-URL: Homepage, https://github.com/jqueguiner/openrunner
|
|
6
6
|
Project-URL: Repository, https://github.com/jqueguiner/openrunner
|
|
@@ -120,7 +120,7 @@ launch.from_run = _launch_from_run # type: ignore[attr-defined]
|
|
|
120
120
|
# openrunner.trace.patch_openai() syntax
|
|
121
121
|
trace.patch_openai = _patch_openai # type: ignore[attr-defined]
|
|
122
122
|
|
|
123
|
-
__version__ = "2.
|
|
123
|
+
__version__ = "2.20.0"
|
|
124
124
|
|
|
125
125
|
logger = logging.getLogger("openrunner")
|
|
126
126
|
|
|
@@ -783,6 +783,127 @@ If NO_RUNS: tell user no training runs found in project.
|
|
|
783
783
|
If NO_METRICS: tell user runs exist but no metrics logged yet.
|
|
784
784
|
"""
|
|
785
785
|
|
|
786
|
+
STATUSLINE_CMD = """---
|
|
787
|
+
name: {prefix}statusline
|
|
788
|
+
description: Configure which metrics appear in the Claude Code footer
|
|
789
|
+
allowed-tools:
|
|
790
|
+
- Bash
|
|
791
|
+
- AskUserQuestion
|
|
792
|
+
---
|
|
793
|
+
<objective>
|
|
794
|
+
Configure which training metrics appear in the Claude Code statusline footer.
|
|
795
|
+
Fetches available metrics from the most recent run and lets the user pick.
|
|
796
|
+
</objective>
|
|
797
|
+
|
|
798
|
+
<process>
|
|
799
|
+
1. Fetch available metrics from the latest run in the configured project.
|
|
800
|
+
2. Present them to the user as a numbered list.
|
|
801
|
+
3. Ask which metric to use for the sparkline (primary).
|
|
802
|
+
4. Ask which additional metrics to show (comma-separated numbers).
|
|
803
|
+
5. Save to ~/.openrunner/statusline.json.
|
|
804
|
+
6. Confirm and show preview.
|
|
805
|
+
</process>
|
|
806
|
+
|
|
807
|
+
### Step 1: Fetch available metrics
|
|
808
|
+
|
|
809
|
+
```bash
|
|
810
|
+
python3 -c "
|
|
811
|
+
import sys, os, json
|
|
812
|
+
from pathlib import Path
|
|
813
|
+
for p in ([os.path.join(d, 'site-packages') for d in __import__('glob').glob(os.path.expanduser('~/.local/lib/python3.*/')) + __import__('glob').glob(os.path.expanduser('~/Library/Python/3.*/lib/python/'))]):
|
|
814
|
+
if os.path.isdir(p): sys.path.insert(0, p)
|
|
815
|
+
from openrunner.session import get_session_config
|
|
816
|
+
from openrunner.api_client import APIClient
|
|
817
|
+
|
|
818
|
+
config = get_session_config()
|
|
819
|
+
if not config.get('api_key'):
|
|
820
|
+
print('NOT_CONFIGURED'); sys.exit(1)
|
|
821
|
+
|
|
822
|
+
client = APIClient(base_url=config['base_url'], api_key=config['api_key'])
|
|
823
|
+
pname = config.get('project', '')
|
|
824
|
+
pid = None
|
|
825
|
+
for p in client.list_projects():
|
|
826
|
+
full = f'{{p.get(\"org_name\",\"\")}}/{{p.get(\"name\",\"\")}}'
|
|
827
|
+
if full.lower() == pname.lower() or (p.get('name') or '').lower() == pname.lower():
|
|
828
|
+
pid = p.get('id'); break
|
|
829
|
+
|
|
830
|
+
if not pid:
|
|
831
|
+
print('PROJECT_NOT_FOUND'); client.close(); sys.exit(1)
|
|
832
|
+
|
|
833
|
+
# Get latest run
|
|
834
|
+
resp = client._request('get', f'/projects/{{pid}}/runs', params={{'limit': 1, 'order': 'desc'}})
|
|
835
|
+
runs_data = resp.json()
|
|
836
|
+
runs = runs_data.get('runs', []) if isinstance(runs_data, dict) else runs_data
|
|
837
|
+
if not runs:
|
|
838
|
+
print('NO_RUNS'); client.close(); sys.exit(1)
|
|
839
|
+
|
|
840
|
+
rid = runs[0].get('id', '')
|
|
841
|
+
run_name = runs[0].get('display_name') or rid
|
|
842
|
+
|
|
843
|
+
# Get all metrics for this run
|
|
844
|
+
resp = client._request('get', f'/runs/{{rid}}/metrics', params={{'max_points': 10000}})
|
|
845
|
+
data = resp.json()
|
|
846
|
+
metrics = data.get('metrics', data) if isinstance(data, dict) else {{}}
|
|
847
|
+
if 'detail' in metrics:
|
|
848
|
+
metrics = {{}}
|
|
849
|
+
|
|
850
|
+
keys = sorted(metrics.keys())
|
|
851
|
+
if not keys:
|
|
852
|
+
print('NO_METRICS'); client.close(); sys.exit(1)
|
|
853
|
+
|
|
854
|
+
print(f'METRICS_FROM_RUN={{run_name}}')
|
|
855
|
+
for i, k in enumerate(keys, 1):
|
|
856
|
+
pts = metrics[k]
|
|
857
|
+
n = len(pts) if isinstance(pts, list) else 0
|
|
858
|
+
last = ''
|
|
859
|
+
if n > 0:
|
|
860
|
+
lp = pts[-1]
|
|
861
|
+
v = lp.get('value', lp) if isinstance(lp, dict) else lp
|
|
862
|
+
if isinstance(v, float):
|
|
863
|
+
last = f' (latest: {{v:.4f}}, {{n}} pts)'
|
|
864
|
+
else:
|
|
865
|
+
last = f' (latest: {{v}}, {{n}} pts)'
|
|
866
|
+
print(f' [{{i}}] {{k}}{{last}}')
|
|
867
|
+
|
|
868
|
+
# Also show current config if exists
|
|
869
|
+
cfg_path = Path.home() / '.openrunner' / 'statusline.json'
|
|
870
|
+
if cfg_path.exists():
|
|
871
|
+
cfg = json.loads(cfg_path.read_text())
|
|
872
|
+
print('\\nCURRENT_CONFIG: sparkline=%s metrics=%s' % (cfg.get('sparkline','auto'), cfg.get('metrics',[])))
|
|
873
|
+
else:
|
|
874
|
+
print('\\nCURRENT_CONFIG: not configured (auto-detect)')
|
|
875
|
+
|
|
876
|
+
client.close()
|
|
877
|
+
"
|
|
878
|
+
```
|
|
879
|
+
|
|
880
|
+
### Step 2: Ask the user
|
|
881
|
+
|
|
882
|
+
After showing the list, ask:
|
|
883
|
+
- "Which metric for the sparkline? (number or name)" — this is the primary one shown as a mini chart
|
|
884
|
+
- "Which additional metrics to display? (comma-separated numbers, or 'auto')"
|
|
885
|
+
|
|
886
|
+
### Step 3: Save config
|
|
887
|
+
|
|
888
|
+
```bash
|
|
889
|
+
python3 -c "
|
|
890
|
+
import json
|
|
891
|
+
from pathlib import Path
|
|
892
|
+
cfg_path = Path.home() / '.openrunner' / 'statusline.json'
|
|
893
|
+
cfg_path.parent.mkdir(parents=True, exist_ok=True)
|
|
894
|
+
cfg = {{'sparkline': 'SPARKLINE_KEY', 'metrics': METRICS_LIST}}
|
|
895
|
+
cfg_path.write_text(json.dumps(cfg, indent=2))
|
|
896
|
+
print(f'Saved: {{cfg_path}}')
|
|
897
|
+
print(f' Sparkline: {{cfg[\"sparkline\"]}}')
|
|
898
|
+
print(f' Metrics: {{cfg[\"metrics\"]}}')
|
|
899
|
+
print()
|
|
900
|
+
print('Footer will show on next statusline refresh (30s).')
|
|
901
|
+
"
|
|
902
|
+
```
|
|
903
|
+
|
|
904
|
+
Replace SPARKLINE_KEY with the user's chosen metric key and METRICS_LIST with the Python list of chosen keys.
|
|
905
|
+
"""
|
|
906
|
+
|
|
786
907
|
MCP_CMD = """---
|
|
787
908
|
name: {prefix}mcp
|
|
788
909
|
description: Register OpenRunner MCP server for native tool access
|
|
@@ -954,6 +1075,7 @@ def install_claude_code() -> list[str]:
|
|
|
954
1075
|
"update.md": UPDATE_CMD,
|
|
955
1076
|
"mcp.md": MCP_CMD,
|
|
956
1077
|
"plot-session-run.md": PLOT_SESSION_RUN_CMD,
|
|
1078
|
+
"statusline.md": STATUSLINE_CMD,
|
|
957
1079
|
}
|
|
958
1080
|
|
|
959
1081
|
files = []
|
|
@@ -1033,6 +1155,7 @@ def _install_all_commands_to_dir(cmd_dir: Path, prefix: str = "openrunner:") ->
|
|
|
1033
1155
|
"update.md": UPDATE_CMD,
|
|
1034
1156
|
"mcp.md": MCP_CMD,
|
|
1035
1157
|
"plot-session-run.md": PLOT_SESSION_RUN_CMD,
|
|
1158
|
+
"statusline.md": STATUSLINE_CMD,
|
|
1036
1159
|
}
|
|
1037
1160
|
|
|
1038
1161
|
files = []
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|