flowcept 0.9.16__tar.gz → 0.9.17__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.
- {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/create-release-n-publish.yml +2 -2
- {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/run-llm-tests.yml +1 -1
- {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/run-tests-all-dbs.yml +1 -1
- {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/run-tests-kafka.yml +1 -1
- {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/run-tests-py313.yml +1 -1
- {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/run-tests-simple.yml +1 -1
- {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/run-tests.yml +1 -1
- {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/run_examples.sh +2 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/PKG-INFO +3 -2
- {flowcept-0.9.16 → flowcept-0.9.17}/README.md +1 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/index.rst +18 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/prov_query.rst +2 -2
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/publications/README.md +33 -15
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_complex/llm_main_example.py +18 -3
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_complex/llm_test_runner.py +1 -1
- {flowcept-0.9.16 → flowcept-0.9.17}/pyproject.toml +1 -1
- {flowcept-0.9.16 → flowcept-0.9.17}/resources/sample_settings.yaml +1 -1
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/interception_event_handler.py +5 -2
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/mlflow_interceptor.py +4 -3
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/tensorboard/tensorboard_interceptor.py +6 -1
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/version.py +1 -1
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/adapters/test_file_observer.py +11 -7
- {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/checks.yml +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/run-tests-in-container.yml +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/.github/workflows/version_bumper.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/.gitignore +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/.readthedocs.yaml +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/CONTRIBUTING.md +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/LICENSE +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/Makefile +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/deployment/Dockerfile +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/deployment/compose-grafana.yml +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/deployment/compose-kafka.yml +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/deployment/compose-mofka.yml +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/deployment/compose-mongo.yml +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/deployment/compose.yml +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/api-reference.rst +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/architecture.rst +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/cli-reference.rst +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/conf.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/contributing.rst +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/img/PROV-AGENT.svg +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/img/architecture-diagram.png +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/img/flowcept-logo-dark.png +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/img/flowcept-logo.png +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/large_data.rst +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/prov_capture.rst +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/prov_storage.rst +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/quick_start.rst +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/schemas.rst +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/setup.rst +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/task_schema.rst +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/telemetry_capture.rst +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/docs/workflow_schema.rst +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/agents/a2a/README.md +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/agents/a2a/agent1.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/agents/a2a/agent2.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/agents/aec_agent_context_manager.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/agents/aec_agent_mock.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/agents/aec_prompts.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/agents/opt_driver_mock.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/consumers/ping_pong_example.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/consumers/simple_consumer.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/consumers/simple_publisher.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/convergence_loop_example.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/dask_example.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/distributed_consumer_example.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/instrumented_loop_example.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/instrumented_simple_example.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_complex/README.md +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_complex/custom_provenance_id_mapping.yaml +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_complex/llm_dataprep.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_complex/llm_model.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_tutorial/README.md +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_tutorial/analysis.ipynb +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_tutorial/llm_dataprep.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_tutorial/llm_model.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/llm_tutorial/llm_train_campaign.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/mlflow_example.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/mqtt_example.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/single_layer_perceptron_example.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/start_here.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/tensorboard_example.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/unmanaged/main.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/examples/unmanaged/simple_task.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/notebooks/analytics.ipynb +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/notebooks/dask.ipynb +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/notebooks/dask_from_CLI.ipynb +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/notebooks/mlflow.ipynb +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/notebooks/reset_dask_nb_exec_counts.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/notebooks/tensorboard.ipynb +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/resources/mofka/bedrock_setup.sh +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/resources/mofka/consumer.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/resources/mofka/mofka-requirements.yaml +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/resources/mofka/mofka_config.json +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/resources/ontology/catalog-v001.xml +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/resources/ontology/prov_agent.owl +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/resources/simple_redis_consumer.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/agent_client.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/agents_utils.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/dynamic_schema_tracker.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/flowcept_agent.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/flowcept_ctx_manager.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/gui/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/gui/agent_gui.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/gui/audio_utils.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/gui/gui_utils.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/llms/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/llms/claude_gcp.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/llms/gemini25.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/prompts/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/prompts/general_prompts.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/prompts/in_memory_query_prompts.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/tools/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/tools/general_tools.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/tools/in_memory_queries/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/tools/in_memory_queries/in_memory_queries_tools.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/agents/tools/in_memory_queries/pandas_agent_utils.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/analytics/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/analytics/analytics_utils.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/analytics/data_augmentation.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/analytics/plot.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/cli.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/autoflush_buffer.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/docdb_dao/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/docdb_dao/docdb_dao_base.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/docdb_dao/lmdb_dao.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/docdb_dao/mongodb_dao.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/keyvalue_dao.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/mq_dao_base.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/mq_dao_kafka.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/mq_dao_mofka.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/mq_dao/mq_dao_redis.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/daos/redis_conn.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/base_settings_dataclasses.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/task_object.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/telemetry.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/flowcept_dataclasses/workflow_object.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/flowcept_logger.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/query_utils.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/settings_factory.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/task_data_preprocess.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/utils.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/commons/vocabulary.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/configs.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_api/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_api/db_api.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_api/flowcept_controller.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_api/task_query_api.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/app.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/resources/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/resources/query_rsrc.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowcept_webserver/resources/task_messages_rsrc.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/base_interceptor.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/brokers/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/brokers/mqtt_interceptor.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/dask/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/dask/dask_dataclasses.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/dask/dask_interceptor.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/dask/dask_plugins.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/instrumentation_interceptor.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/interceptor_state_manager.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/mlflow_dao.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/mlflow_dataclasses.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/tensorboard/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/tensorboard/tensorboard_dataclasses.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/agent/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/agent/base_agent_context_manager.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/base_consumer.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/consumer_utils.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/consumers/document_inserter.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/telemetry_capture.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/instrumentation/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_agent_task.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_decorator.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_loop.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_task.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/instrumentation/flowcept_torch.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/instrumentation/task_capture.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/adapters/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/adapters/dask_test_utils.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/adapters/test_broker.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/adapters/test_dask.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/adapters/test_dask_with_context_mgmt.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/adapters/test_mlflow.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/adapters/test_tensorboard.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/api/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/api/db_api_test.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/api/flowcept_api_test.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/api/sample_data.json +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/api/sample_data_with_telemetry_and_rai.json +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/api/task_query_api_test.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/doc_db_inserter/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/doc_db_inserter/doc_db_inserter_test.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/instrumentation_tests/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/instrumentation_tests/flowcept_explicit_tasks.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/instrumentation_tests/flowcept_loop_test.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/instrumentation_tests/flowcept_task_decorator_test.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/instrumentation_tests/ml_tests/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/instrumentation_tests/ml_tests/dl_trainer.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/instrumentation_tests/ml_tests/ml_decorator_dask_test.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/instrumentation_tests/ml_tests/ml_decorator_test.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/misc_tests/__init__.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/misc_tests/log_test.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/misc_tests/singleton_test.py +0 -0
- {flowcept-0.9.16 → flowcept-0.9.17}/tests/misc_tests/telemetry_test.py +0 -0
|
@@ -68,7 +68,9 @@ run_test() {
|
|
|
68
68
|
echo "Ok, ran $test_path."
|
|
69
69
|
if grep -iq "error" output.log; then
|
|
70
70
|
echo "Test $test_path failed! See output.log for details."
|
|
71
|
+
echo "[BEGIN] Content of output.log"
|
|
71
72
|
cat output.log
|
|
73
|
+
echo "[END] Content of output.log"
|
|
72
74
|
exit 1
|
|
73
75
|
fi
|
|
74
76
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flowcept
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.17
|
|
4
4
|
Summary: Capture and query workflow provenance data using data observability
|
|
5
5
|
Author: Oak Ridge National Laboratory
|
|
6
6
|
License-Expression: MIT
|
|
@@ -9,7 +9,7 @@ Keywords: agentic-ai,agentic-workflows,ai,big-data,dask,data-analytics,data-inte
|
|
|
9
9
|
Classifier: License :: OSI Approved :: MIT License
|
|
10
10
|
Classifier: Operating System :: OS Independent
|
|
11
11
|
Classifier: Programming Language :: Python :: 3
|
|
12
|
-
Requires-Python: >=3.
|
|
12
|
+
Requires-Python: >=3.11
|
|
13
13
|
Requires-Dist: msgpack
|
|
14
14
|
Requires-Dist: numpy
|
|
15
15
|
Requires-Dist: omegaconf
|
|
@@ -169,6 +169,7 @@ Flowcept captures and queries workflow provenance at runtime with minimal code c
|
|
|
169
169
|
|
|
170
170
|
|
|
171
171
|
[](https://flowcept.readthedocs.io/)
|
|
172
|
+
[](https://workflowscommunity.slack.com/archives/C06L5GYJKQS)
|
|
172
173
|
[](https://github.com/ORNL/flowcept/actions/workflows/create-release-n-publish.yml)
|
|
173
174
|
[](https://pypi.org/project/flowcept)
|
|
174
175
|
[](https://github.com/ORNL/flowcept/actions/workflows/run-tests.yml)
|
|
@@ -20,6 +20,7 @@ Flowcept captures and queries workflow provenance at runtime with minimal code c
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
[](https://flowcept.readthedocs.io/)
|
|
23
|
+
[](https://workflowscommunity.slack.com/archives/C06L5GYJKQS)
|
|
23
24
|
[](https://github.com/ORNL/flowcept/actions/workflows/create-release-n-publish.yml)
|
|
24
25
|
[](https://pypi.org/project/flowcept)
|
|
25
26
|
[](https://github.com/ORNL/flowcept/actions/workflows/run-tests.yml)
|
|
@@ -18,6 +18,12 @@ Flowcept
|
|
|
18
18
|
html[data-theme="auto"] .logo-light { display: none; }
|
|
19
19
|
html[data-theme="auto"] .logo-dark { display: inline; }
|
|
20
20
|
}
|
|
21
|
+
|
|
22
|
+
.hero { text-align: center; margin: 1.25rem 0 0.25rem; }
|
|
23
|
+
.hero h1 { font-size: 2rem; line-height: 1.2; margin: 0; }
|
|
24
|
+
.tagline { text-align: center; font-size: 1.05rem; max-width: 60rem; margin: 0.25rem auto 1.25rem; }
|
|
25
|
+
|
|
26
|
+
|
|
21
27
|
</style>
|
|
22
28
|
|
|
23
29
|
<p align="center">
|
|
@@ -32,6 +38,18 @@ Flowcept
|
|
|
32
38
|
:align: center
|
|
33
39
|
:width: 120px
|
|
34
40
|
|
|
41
|
+
.. raw:: html
|
|
42
|
+
|
|
43
|
+
<div class="hero">
|
|
44
|
+
<h4>Lightweight Distributed Workflow Provenance</h4>
|
|
45
|
+
</div>
|
|
46
|
+
<p class=\\"tagline\\">
|
|
47
|
+
Flowcept captures and queries workflow provenance at runtime with minimal code changes and low overhead.
|
|
48
|
+
It unifies data from diverse tools and workflows across the Edge–Cloud–HPC continuum and provides ML-aware capture,
|
|
49
|
+
MCP agents provenance, telemetry, extensible adapters, and flexible storage.
|
|
50
|
+
</p>
|
|
51
|
+
|
|
52
|
+
|
|
35
53
|
.. toctree::
|
|
36
54
|
:maxdepth: 2
|
|
37
55
|
:caption: Contents:
|
|
@@ -142,8 +142,8 @@ Deleting a buffer file
|
|
|
142
142
|
.. code-block:: python
|
|
143
143
|
|
|
144
144
|
from flowcept import Flowcept
|
|
145
|
-
Flowcept.delete_buffer_file()
|
|
146
|
-
Flowcept.delete_buffer_file(
|
|
145
|
+
Flowcept.delete_buffer_file() # deletes default path from settings
|
|
146
|
+
Flowcept.delete_buffer_file("my_buffer.jsonl")
|
|
147
147
|
|
|
148
148
|
Notes
|
|
149
149
|
^^^^^
|
|
@@ -7,48 +7,66 @@ Bibtex is available below.
|
|
|
7
7
|
|
|
8
8
|
**Towards Lightweight Data Integration using Multi-workflow Provenance and Data Observability**
|
|
9
9
|
R. Souza, T. J. Skluzacek, S. R. Wilkinson, M. Ziatdinov, and R. Ferreira da Silva,
|
|
10
|
-
*IEEE International Conference on e-Science*, Limassol, Cyprus, 2023.
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
*IEEE International Conference on e-Science*, Limassol, Cyprus, 2023. <br/>
|
|
11
|
+
**About**: Introduces Flowcept’s lightweight runtime provenance and data observability architecture and shows minimal-intrusion capture across heterogeneous workflows. <br/>
|
|
12
|
+
[[doi]](https://doi.org/10.1109/e-Science58273.2023.10254822)
|
|
13
|
+
[[pdf]](https://arxiv.org/pdf/2308.09004.pdf)
|
|
14
14
|
---
|
|
15
15
|
|
|
16
16
|
**PROV-AGENT: Unified Provenance for Tracking AI Agent Interactions in Agentic Workflows**
|
|
17
17
|
R. Souza, A. Gueroudji, S. DeWitt, D. Rosendo, T. Ghosal, R. Ross, P. Balaprakash, and R. Ferreira da Silva,
|
|
18
|
-
*IEEE International Conference on e-Science*, Chicago, USA., 2025.
|
|
19
|
-
|
|
18
|
+
*IEEE International Conference on e-Science*, Chicago, USA., 2025. <br/>
|
|
19
|
+
**About**: Defines agentic provenance and a unified provenance model and tooling to capture, link, and query AI-agent interactions within agentic workflows. </br>
|
|
20
|
+
[[doi]](https://doi.org/10.1109/eScience65000.2025.00093)
|
|
21
|
+
[[pdf]](https://arxiv.org/pdf/2508.02866)
|
|
22
|
+
[[html]](https://arxiv.org/html/2508.02866v3) <br/>
|
|
23
|
+
|
|
20
24
|
|
|
21
25
|
---
|
|
22
26
|
|
|
23
27
|
**Workflow Provenance in the Computing Continuum for Responsible, Trustworthy, and Energy-Efficient AI**
|
|
24
28
|
R. Souza, S. Caino-Lores, M. Coletti, T. J. Skluzacek, A. Costan, F. Suter, M. Mattoso, and R. Ferreira da Silva,
|
|
25
|
-
*IEEE International Conference on e-Science*, Osaka, Japan, 2024.
|
|
26
|
-
|
|
27
|
-
|
|
29
|
+
*IEEE International Conference on e-Science*, Osaka, Japan, 2024. <br/>
|
|
30
|
+
**About**: Explains how end-to-end provenance across edge, cloud, and HPC supports responsible, trustworthy, and energy-aware AI workflows. <br/>
|
|
31
|
+
[[doi]](https://doi.org/10.1109/e-Science62913.2024.10678731)
|
|
32
|
+
[[pdf]](https://hal.science/hal-04902079v1/document) <br/>
|
|
33
|
+
|
|
28
34
|
|
|
29
35
|
---
|
|
30
36
|
|
|
31
37
|
**LLM Agents for Interactive Workflow Provenance: Reference Architecture and Evaluation Methodology**
|
|
32
38
|
R. Souza, T. Poteet, B. Etz, D. Rosendo, A. Gueroudji, W. Shin, P. Balaprakash, and R. Ferreira da Silva,
|
|
33
39
|
*Workflows in Support of Large-Scale Science (WORKS) co-located with the ACM/IEEE International Conference for High Performance Computing, Networking, Storage, and Analysis (SC)*, St. Louis, USA, 2025.
|
|
34
|
-
|
|
40
|
+
**About**: Presents a reference architecture and evaluation method for LLM agents that query and act on large-scale provenance databases. </br>
|
|
41
|
+
[[doi]](https://doi.org/10.1145/3731599.3767582)
|
|
42
|
+
[[pdf]](https://arxiv.org/pdf/2509.13978)
|
|
43
|
+
[[html]](https://arxiv.org/html/2509.13978)
|
|
35
44
|
|
|
36
45
|
|
|
46
|
+
---
|
|
47
|
+
|
|
37
48
|
### Papers that used Flowcept
|
|
38
49
|
|
|
39
50
|
|
|
40
51
|
**Toward a Persistent Event-Streaming System for High-Performance Computing Applications**
|
|
41
52
|
M. Dorier, A. Gueroudji, V. Hayot-Sasson, H. Nguyen, S. Ockerman, R. Souza, T. Bicer, H. Pan, P. Carns, K. Chard, and others
|
|
42
|
-
*Frontiers in High Performance Computing*, 2025.
|
|
43
|
-
|
|
44
|
-
|
|
53
|
+
*Frontiers in High Performance Computing*, 2025. <br/>
|
|
54
|
+
**About**: Demonstrates Flowcept generating high-volume provenance that is persistently streamed with Mofka for HPC applications. <br/>
|
|
55
|
+
[[doi]](https://doi.org/10.3389/fhpcp.2025.1638203)
|
|
56
|
+
[[pdf]](https://web.cels.anl.gov/~woz/papers/Mofka_2025.pdf)
|
|
57
|
+
[[html]](https://www.frontiersin.org/journals/high-performance-computing/articles/10.3389/fhpcp.2025.1638203/full)
|
|
58
|
+
<br/>
|
|
59
|
+
|
|
45
60
|
|
|
46
61
|
---
|
|
47
62
|
|
|
48
63
|
**AI Agents for Enabling Autonomous Experiments at ORNL’s HPC and Manufacturing User Facilities**
|
|
49
64
|
D. Rosendo, S. DeWitt, R. Souza, P. Austria, T. Ghosal, M. McDonnell, R. Miller, T. Skluzacek, J. Haley, B. Turcksin, and others
|
|
50
|
-
*Extreme-Scale Experiment-in-the-Loop Computing (XLOOP) co-located with the ACM/IEEE International Conference for High Performance Computing, Networking, Storage, and Analysis (SC)*, 2025.
|
|
51
|
-
|
|
65
|
+
*Extreme-Scale Experiment-in-the-Loop Computing (XLOOP) co-located with the ACM/IEEE International Conference for High Performance Computing, Networking, Storage, and Analysis (SC)*, 2025. <br/>
|
|
66
|
+
**About**: Leverages Flowcept’s agentic provenance to coordinate multi-agent experiments and connect agents with HPC simulations through a shared provenance stream. <br/>
|
|
67
|
+
[[doi]](https://doi.org/10.1145/3731599.3767592)
|
|
68
|
+
[[pdf]](https://rafaelsilva.com/files/publications/rosendo2025xloop.pdf)
|
|
69
|
+
[[html]](https://camps.aptaracorp.com/ACM_PMS/PMS/ACM/SCWORKSHOPS25/253/0b09762d-8e84-11f0-957d-16ffd757ba29/OUT/scworkshops25-253.html)
|
|
52
70
|
|
|
53
71
|
---
|
|
54
72
|
|
|
@@ -123,6 +123,13 @@ def search_workflow(ntokens, dataset_ref, train_data_path, val_data_path, test_d
|
|
|
123
123
|
|
|
124
124
|
def start_dask(scheduler_file=None, start_dask_cluster=False, with_flowcept=True):
|
|
125
125
|
from distributed import Client
|
|
126
|
+
try:
|
|
127
|
+
# Downgrading eventual dask comm errors in the logs
|
|
128
|
+
import logging
|
|
129
|
+
logging.getLogger("distributed.worker").setLevel(logging.WARNING)
|
|
130
|
+
logging.getLogger("distributed.comm").setLevel(logging.WARNING)
|
|
131
|
+
except:
|
|
132
|
+
pass
|
|
126
133
|
|
|
127
134
|
if start_dask_cluster:
|
|
128
135
|
import subprocess
|
|
@@ -196,9 +203,17 @@ def close_dask(client, cluster, scheduler_file=None, start_dask_cluster=False, _
|
|
|
196
203
|
print("Flowcept consumer closed.")
|
|
197
204
|
else:
|
|
198
205
|
print("Closing dask...")
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
206
|
+
try:
|
|
207
|
+
client.close()
|
|
208
|
+
cluster.close()
|
|
209
|
+
print("Dask closed.")
|
|
210
|
+
except Exception as e:
|
|
211
|
+
print(f"Some exception when closing dask: {e}")
|
|
212
|
+
try:
|
|
213
|
+
import logging
|
|
214
|
+
logging.getLogger("distributed.worker").setLevel(logging.WARNING)
|
|
215
|
+
except:
|
|
216
|
+
pass
|
|
202
217
|
if _flowcept:
|
|
203
218
|
print("Now closing flowcept consumer...")
|
|
204
219
|
_flowcept.stop()
|
|
@@ -67,7 +67,7 @@ def all():
|
|
|
67
67
|
try:
|
|
68
68
|
success = run_test(max_runs=3, config=config)
|
|
69
69
|
if not success:
|
|
70
|
-
write_log(str(i) + "--> " + str(config))
|
|
70
|
+
write_log("GOT ERROR! " + str(i) + "--> " + str(config))
|
|
71
71
|
sys.exit(1)
|
|
72
72
|
except Exception as e:
|
|
73
73
|
write_exception(f"\n\n!!!!!!##### ERROR for combination {config}\n", e)
|
|
@@ -5,7 +5,7 @@ build-backend = "hatchling.build"
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "flowcept"
|
|
7
7
|
dynamic = ["version"]
|
|
8
|
-
requires-python = ">=3.
|
|
8
|
+
requires-python = ">=3.11"
|
|
9
9
|
|
|
10
10
|
authors = [{name = "Oak Ridge National Laboratory"}]
|
|
11
11
|
description = "Capture and query workflow provenance data using data observability"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
flowcept_version: 0.9.
|
|
1
|
+
flowcept_version: 0.9.17 # Version of the Flowcept package. This setting file is compatible with this version.
|
|
2
2
|
|
|
3
3
|
project:
|
|
4
4
|
debug: true # Toggle debug mode. This will add a property `debug: true` to all saved data, making it easier to retrieve/delete them later.
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
"""Event handler module."""
|
|
2
2
|
|
|
3
|
+
from pathlib import Path
|
|
3
4
|
from watchdog.events import FileSystemEventHandler
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
class InterceptionEventHandler(FileSystemEventHandler):
|
|
7
8
|
"""Event handler class."""
|
|
8
9
|
|
|
9
|
-
def __init__(self, interceptor_instance, callback_function):
|
|
10
|
+
def __init__(self, interceptor_instance, file_path_to_watch, callback_function):
|
|
10
11
|
super().__init__()
|
|
12
|
+
self.file_path_to_watch = file_path_to_watch
|
|
11
13
|
self.callback_function = callback_function
|
|
12
14
|
self.interceptor_instance = interceptor_instance
|
|
13
15
|
|
|
14
16
|
def on_modified(self, event):
|
|
15
17
|
"""Get on modified."""
|
|
16
|
-
|
|
18
|
+
if Path(event.src_path).resolve() == Path(self.file_path_to_watch).resolve():
|
|
19
|
+
self.callback_function(self.interceptor_instance)
|
{flowcept-0.9.16 → flowcept-0.9.17}/src/flowcept/flowceptor/adapters/mlflow/mlflow_interceptor.py
RENAMED
|
@@ -84,7 +84,7 @@ class MLFlowInterceptor(BaseInterceptor):
|
|
|
84
84
|
def observe(self):
|
|
85
85
|
"""Observe it."""
|
|
86
86
|
self.logger.debug("Observing")
|
|
87
|
-
event_handler = InterceptionEventHandler(self, self.__class__.callback)
|
|
87
|
+
event_handler = InterceptionEventHandler(self, self.settings.file_path, self.__class__.callback)
|
|
88
88
|
while not os.path.isfile(self.settings.file_path):
|
|
89
89
|
self.logger.warning(
|
|
90
90
|
f"I can't watch the file {self.settings.file_path},"
|
|
@@ -95,6 +95,7 @@ class MLFlowInterceptor(BaseInterceptor):
|
|
|
95
95
|
sleep(self.settings.watch_interval_sec)
|
|
96
96
|
|
|
97
97
|
self._observer = PollingObserver()
|
|
98
|
-
|
|
98
|
+
watch_dir = os.path.dirname(self.settings.file_path) or "."
|
|
99
|
+
self._observer.schedule(event_handler, watch_dir, recursive=True)
|
|
99
100
|
self._observer.start()
|
|
100
|
-
self.logger.info(f"Watching {self.settings.file_path}")
|
|
101
|
+
self.logger.info(f"Watching directory {watch_dir} with file {self.settings.file_path} ")
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""Tensorboard interceptor module."""
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
|
+
from pathlib import Path
|
|
4
5
|
from time import sleep
|
|
5
6
|
|
|
6
7
|
from tbparse import SummaryReader
|
|
@@ -29,6 +30,8 @@ class TensorboardInterceptor(BaseInterceptor):
|
|
|
29
30
|
def __init__(self, plugin_key="tensorboard"):
|
|
30
31
|
super().__init__(plugin_key)
|
|
31
32
|
self._observer: PollingObserver = None
|
|
33
|
+
if not Path(self.settings.file_path).is_dir():
|
|
34
|
+
raise Exception("Tensorboard Observer must observe directories.")
|
|
32
35
|
self.state_manager = InterceptorStateManager(self.settings)
|
|
33
36
|
self.state_manager.reset()
|
|
34
37
|
self.log_metrics = set(self.settings.log_metrics)
|
|
@@ -108,13 +111,15 @@ class TensorboardInterceptor(BaseInterceptor):
|
|
|
108
111
|
|
|
109
112
|
def observe(self):
|
|
110
113
|
"""Observe it."""
|
|
111
|
-
|
|
114
|
+
self.logger.debug("Observing")
|
|
115
|
+
event_handler = InterceptionEventHandler(self, self.settings.file_path, self.__class__.callback)
|
|
112
116
|
while not os.path.isdir(self.settings.file_path):
|
|
113
117
|
self.logger.debug(f"I can't watch the file {self.settings.file_path}, as it does not exist.")
|
|
114
118
|
self.logger.debug(f"\tI will sleep for {self.settings.watch_interval_sec} s to see if it appears.")
|
|
115
119
|
sleep(self.settings.watch_interval_sec)
|
|
116
120
|
|
|
117
121
|
self._observer = PollingObserver()
|
|
122
|
+
|
|
118
123
|
self._observer.schedule(event_handler, self.settings.file_path, recursive=True)
|
|
119
124
|
self._observer.start()
|
|
120
125
|
self.logger.debug(f"Watching {self.settings.file_path}")
|
|
@@ -13,22 +13,26 @@ class TestFileObserver(unittest.TestCase):
|
|
|
13
13
|
self.test_file_name = self.test_file.name
|
|
14
14
|
self.test_file.close()
|
|
15
15
|
|
|
16
|
+
time.sleep(1.1)
|
|
17
|
+
|
|
16
18
|
# Thread event to signal that the callback was called
|
|
17
19
|
self.callback_called_event = threading.Event()
|
|
18
20
|
|
|
19
21
|
# Define the callback function to be triggered on modification
|
|
20
|
-
def callback(
|
|
21
|
-
if
|
|
22
|
-
print(f"Callback triggered for {
|
|
22
|
+
def callback(event):
|
|
23
|
+
if not event.is_directory and event.src_path == self.test_file_name:
|
|
24
|
+
print(f"Callback triggered for {event.src_path}")
|
|
23
25
|
self.callback_called_event.set()
|
|
24
26
|
|
|
27
|
+
watch_dir = os.path.dirname(self.test_file_name) or "."
|
|
28
|
+
|
|
25
29
|
# Create an event handler and bind it to the callback
|
|
26
30
|
self.event_handler = FileSystemEventHandler()
|
|
27
|
-
self.event_handler.on_modified = lambda event: callback(event
|
|
31
|
+
self.event_handler.on_modified = lambda event: callback(event)
|
|
28
32
|
|
|
29
33
|
# Set up watchdog observer
|
|
30
34
|
self.observer = PollingObserver()
|
|
31
|
-
self.observer.schedule(self.event_handler, path=
|
|
35
|
+
self.observer.schedule(self.event_handler, path=watch_dir, recursive=False)
|
|
32
36
|
self.observer.start()
|
|
33
37
|
|
|
34
38
|
def tearDown(self):
|
|
@@ -44,10 +48,10 @@ class TestFileObserver(unittest.TestCase):
|
|
|
44
48
|
f.flush()
|
|
45
49
|
os.fsync(f.fileno()) # Ensure file system updates
|
|
46
50
|
|
|
47
|
-
# Add a
|
|
51
|
+
# Add a delay to ensure the observer catches the event
|
|
48
52
|
time.sleep(2)
|
|
49
53
|
|
|
50
|
-
# Wait for the callback to be called
|
|
54
|
+
# Wait for the callback to be called
|
|
51
55
|
callback_triggered = self.callback_called_event.wait(timeout=10)
|
|
52
56
|
|
|
53
57
|
# Assert that the callback was called
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|