praisonAI 2.3.71__tar.gz → 2.3.72__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.
- {praisonai-2.3.71 → praisonai-2.3.72}/PKG-INFO +1 -1
- {praisonai-2.3.71 → praisonai-2.3.72}/PraisonAI.egg-info/PKG-INFO +1 -1
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/agent_scheduler.py +30 -25
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/main.py +5 -3
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/deploy.py +1 -1
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/scheduler/agent_scheduler.py +6 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/scheduler/daemon_manager.py +4 -5
- praisonai-2.3.72/praisonai/version.py +1 -0
- praisonai-2.3.71/praisonai/version.py +0 -1
- {praisonai-2.3.71 → praisonai-2.3.72}/PraisonAI.egg-info/SOURCES.txt +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/PraisonAI.egg-info/dependency_links.txt +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/PraisonAI.egg-info/entry_points.txt +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/PraisonAI.egg-info/requires.txt +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/PraisonAI.egg-info/top_level.txt +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/README.md +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/__init__.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/__main__.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/agent_scheduler.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/agents_generator.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/api/call.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/auto.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/chainlit_ui.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/__init__.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/__init__.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/at_mentions.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/auto_memory.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/autonomy_mode.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/base.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/cost_tracker.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/external_agents.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/fast_context.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/flow_display.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/git_integration.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/guardrail.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/handoff.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/image.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/interactive_tui.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/knowledge.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/mcp.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/message_queue.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/metrics.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/n8n.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/repo_map.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/router.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/sandbox_executor.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/session.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/slash_commands.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/telemetry.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/todo.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/tools.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/workflow.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/schedule_cli.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/__init__.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/agent_tools.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/diff/__init__.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/diff/diff_strategy.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/tools/__init__.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/tools/apply_diff.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/tools/execute_command.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/tools/list_files.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/tools/read_file.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/tools/search_replace.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/tools/write_file.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/utils/__init__.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/utils/file_utils.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/utils/ignore_utils.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/utils/text_utils.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/inbuilt_tools/__init__.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/inc/__init__.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/inc/config.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/inc/models.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/integrations/__init__.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/integrations/base.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/integrations/claude_code.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/integrations/codex_cli.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/integrations/cursor_cli.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/integrations/gemini_cli.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/profiler.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/scheduler/__init__.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/scheduler/base.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/scheduler/state_manager.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/scheduler/yaml_loader.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/scheduler.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/setup/__init__.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/setup/build.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/setup/post_install.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/setup/setup_conda_env.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/setup.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/test.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/train.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/train_vision.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/agents.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/callbacks.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/chat.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/code.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/colab.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/colab_chainlit.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/components/aicoder.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/context.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/database_config.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/db.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/realtime.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/realtimeclient/__init__.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/realtimeclient/tools.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/sql_alchemy.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/upload_vision.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/pyproject.toml +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/setup.cfg +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/tests/test.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_agents_playbook.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_approval_system.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_basic.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_cli_features.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_custom_tools_fix.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_double_api_fix.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_n8n_integration.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_phase2_refactor.py +0 -0
- {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_runner.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PraisonAI
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.72
|
|
4
4
|
Summary: PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human-agent collaboration.
|
|
5
5
|
Author: Mervin Praison
|
|
6
6
|
License: MIT
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PraisonAI
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.72
|
|
4
4
|
Summary: PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human-agent collaboration.
|
|
5
5
|
Author: Mervin Praison
|
|
6
6
|
License: MIT
|
|
@@ -508,7 +508,7 @@ class AgentSchedulerHandler:
|
|
|
508
508
|
return 1
|
|
509
509
|
|
|
510
510
|
@staticmethod
|
|
511
|
-
def handle_schedule_command(args, unknown_args=
|
|
511
|
+
def handle_schedule_command(args, unknown_args, daemon_mode=False) -> int:
|
|
512
512
|
"""
|
|
513
513
|
Handle the schedule command for running agents periodically.
|
|
514
514
|
|
|
@@ -583,7 +583,7 @@ class AgentSchedulerHandler:
|
|
|
583
583
|
role="Task Executor",
|
|
584
584
|
goal=task,
|
|
585
585
|
instructions=task,
|
|
586
|
-
verbose=
|
|
586
|
+
verbose=True # Enable verbose to see output in logs
|
|
587
587
|
)
|
|
588
588
|
|
|
589
589
|
# Create scheduler
|
|
@@ -612,33 +612,38 @@ class AgentSchedulerHandler:
|
|
|
612
612
|
print(f"{'='*60}\n")
|
|
613
613
|
|
|
614
614
|
# Start scheduler
|
|
615
|
-
print("⏰ Starting scheduler... (Press Ctrl+C to stop)\n")
|
|
616
615
|
if is_yaml_mode:
|
|
617
616
|
scheduler.start_from_yaml_config()
|
|
618
617
|
else:
|
|
619
|
-
scheduler.start(
|
|
620
|
-
schedule_expr=interval,
|
|
621
|
-
max_retries=max_retries,
|
|
622
|
-
run_immediately=True
|
|
623
|
-
)
|
|
618
|
+
scheduler.start(schedule_expr=interval, max_retries=max_retries, run_immediately=True)
|
|
624
619
|
|
|
625
|
-
#
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
#
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
620
|
+
# If daemon mode, block to keep process alive
|
|
621
|
+
if daemon_mode:
|
|
622
|
+
import time
|
|
623
|
+
try:
|
|
624
|
+
while scheduler.is_running:
|
|
625
|
+
time.sleep(1)
|
|
626
|
+
except KeyboardInterrupt:
|
|
627
|
+
scheduler.stop()
|
|
628
|
+
else:
|
|
629
|
+
# Foreground mode - wait for Ctrl+C
|
|
630
|
+
print("⏰ Starting scheduler... (Press Ctrl+C to stop)\n")
|
|
631
|
+
import time
|
|
632
|
+
try:
|
|
633
|
+
while scheduler.is_running:
|
|
634
|
+
time.sleep(1)
|
|
635
|
+
except KeyboardInterrupt:
|
|
636
|
+
print("\n\n🛑 Stopping scheduler...")
|
|
637
|
+
scheduler.stop()
|
|
638
|
+
|
|
639
|
+
# Display final stats
|
|
640
|
+
stats = scheduler.get_stats()
|
|
641
|
+
print("\n📊 Final Statistics:")
|
|
642
|
+
print(f" Total Executions: {stats['total_executions']}")
|
|
643
|
+
print(f" Successful: {stats['successful_executions']}")
|
|
644
|
+
print(f" Failed: {stats['failed_executions']}")
|
|
645
|
+
print(f" Success Rate: {stats['success_rate']:.1f}%")
|
|
646
|
+
print("\n✅ Agent stopped successfully\n")
|
|
642
647
|
|
|
643
648
|
return 0
|
|
644
649
|
|
|
@@ -239,8 +239,9 @@ class PraisonAI:
|
|
|
239
239
|
if subcommand in ['start', 'list', 'stop', 'logs', 'restart', 'delete', 'describe', 'save', 'stop-all', 'stats']:
|
|
240
240
|
exit_code = AgentSchedulerHandler.handle_daemon_command(subcommand, args, unknown_args[1:] if len(unknown_args) > 1 else [])
|
|
241
241
|
else:
|
|
242
|
-
# Legacy mode: direct scheduling (foreground)
|
|
243
|
-
|
|
242
|
+
# Legacy mode: direct scheduling (foreground) or daemon mode
|
|
243
|
+
daemon_mode = getattr(args, 'daemon', False)
|
|
244
|
+
exit_code = AgentSchedulerHandler.handle_schedule_command(args, unknown_args, daemon_mode=daemon_mode)
|
|
244
245
|
|
|
245
246
|
sys.exit(exit_code)
|
|
246
247
|
elif args.command.startswith("tests.test") or args.command.startswith("tests/test"): # Argument used for testing purposes
|
|
@@ -734,7 +735,8 @@ class PraisonAI:
|
|
|
734
735
|
parser.add_argument("--interval", dest="schedule_interval", type=str, help="Schedule interval (e.g., 'hourly', '*/30m', 'daily')")
|
|
735
736
|
parser.add_argument("--schedule-max-retries", dest="schedule_max_retries", type=int, help="Maximum retry attempts for scheduled execution")
|
|
736
737
|
parser.add_argument("--timeout", type=int, help="Maximum execution time per run in seconds")
|
|
737
|
-
parser.add_argument(
|
|
738
|
+
parser.add_argument('--max-cost', type=float, help='Maximum total cost budget in USD')
|
|
739
|
+
parser.add_argument('--daemon', action='store_true', help=argparse.SUPPRESS) # Hidden flag for daemon mode
|
|
738
740
|
|
|
739
741
|
# If we're in a test environment, parse with empty args to avoid pytest interference
|
|
740
742
|
if in_test_env:
|
|
@@ -57,7 +57,7 @@ class CloudDeployer:
|
|
|
57
57
|
file.write("FROM python:3.11-slim\n")
|
|
58
58
|
file.write("WORKDIR /app\n")
|
|
59
59
|
file.write("COPY . .\n")
|
|
60
|
-
file.write("RUN pip install flask praisonai==2.3.
|
|
60
|
+
file.write("RUN pip install flask praisonai==2.3.72 gunicorn markdown\n")
|
|
61
61
|
file.write("EXPOSE 8080\n")
|
|
62
62
|
file.write('CMD ["gunicorn", "-b", "0.0.0.0:8080", "api:app"]\n')
|
|
63
63
|
|
|
@@ -279,6 +279,9 @@ class AgentScheduler:
|
|
|
279
279
|
self.on_success(result)
|
|
280
280
|
except Exception as e:
|
|
281
281
|
logger.error(f"Callback error in on_success: {e}")
|
|
282
|
+
|
|
283
|
+
# Update state file after successful execution
|
|
284
|
+
self._update_state_if_daemon()
|
|
282
285
|
|
|
283
286
|
break
|
|
284
287
|
|
|
@@ -302,6 +305,9 @@ class AgentScheduler:
|
|
|
302
305
|
self.on_failure(f"Failed after {max_retries} attempts")
|
|
303
306
|
except Exception as e:
|
|
304
307
|
logger.error(f"Callback error in on_failure: {e}")
|
|
308
|
+
|
|
309
|
+
# Update state file even after failure
|
|
310
|
+
self._update_state_if_daemon()
|
|
305
311
|
|
|
306
312
|
def execute_once(self) -> Any:
|
|
307
313
|
"""
|
|
@@ -50,7 +50,7 @@ class DaemonManager:
|
|
|
50
50
|
"""
|
|
51
51
|
log_file = self.log_dir / f"{name}.log"
|
|
52
52
|
|
|
53
|
-
# Open log file
|
|
53
|
+
# Open log file - use original working approach
|
|
54
54
|
with open(log_file, 'a') as log:
|
|
55
55
|
log.flush()
|
|
56
56
|
|
|
@@ -89,16 +89,15 @@ class DaemonManager:
|
|
|
89
89
|
Returns:
|
|
90
90
|
Process ID
|
|
91
91
|
"""
|
|
92
|
-
# Build command - use
|
|
92
|
+
# Build command - use CLI without --daemon flag (original working approach)
|
|
93
93
|
command = [
|
|
94
94
|
sys.executable,
|
|
95
95
|
"-m",
|
|
96
96
|
"praisonai.cli.main",
|
|
97
97
|
"schedule",
|
|
98
|
-
|
|
98
|
+
task,
|
|
99
99
|
"--interval", interval,
|
|
100
|
-
"--max-retries", str(max_retries)
|
|
101
|
-
"--verbose" # Enable verbose to see output
|
|
100
|
+
"--max-retries", str(max_retries)
|
|
102
101
|
]
|
|
103
102
|
|
|
104
103
|
if timeout:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.3.72"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "2.3.71"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|