sunholo 0.84.5__tar.gz → 0.84.7__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.
Files changed (155) hide show
  1. {sunholo-0.84.5 → sunholo-0.84.7}/PKG-INFO +2 -2
  2. {sunholo-0.84.5 → sunholo-0.84.7}/setup.py +1 -1
  3. sunholo-0.84.7/sunholo/genai/__init__.py +2 -0
  4. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/genai/process_funcs_cls.py +25 -23
  5. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo.egg-info/PKG-INFO +2 -2
  6. sunholo-0.84.5/sunholo/patches/langchain/__init__.py +0 -0
  7. {sunholo-0.84.5 → sunholo-0.84.7}/LICENSE.txt +0 -0
  8. {sunholo-0.84.5 → sunholo-0.84.7}/MANIFEST.in +0 -0
  9. {sunholo-0.84.5 → sunholo-0.84.7}/README.md +0 -0
  10. {sunholo-0.84.5 → sunholo-0.84.7}/setup.cfg +0 -0
  11. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/__init__.py +0 -0
  12. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/agents/__init__.py +0 -0
  13. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/agents/chat_history.py +0 -0
  14. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/agents/dispatch_to_qa.py +0 -0
  15. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/agents/fastapi/__init__.py +0 -0
  16. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/agents/fastapi/base.py +0 -0
  17. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/agents/fastapi/qna_routes.py +0 -0
  18. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/agents/flask/__init__.py +0 -0
  19. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/agents/flask/base.py +0 -0
  20. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/agents/flask/qna_routes.py +0 -0
  21. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/agents/flask/vac_routes.py +0 -0
  22. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/agents/langserve.py +0 -0
  23. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/agents/pubsub.py +0 -0
  24. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/agents/route.py +0 -0
  25. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/agents/special_commands.py +0 -0
  26. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/agents/swagger.py +0 -0
  27. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/archive/__init__.py +0 -0
  28. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/archive/archive.py +0 -0
  29. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/auth/__init__.py +0 -0
  30. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/auth/gcloud.py +0 -0
  31. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/auth/refresh.py +0 -0
  32. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/auth/run.py +0 -0
  33. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/azure/__init__.py +0 -0
  34. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/azure/auth.py +0 -0
  35. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/azure/blobs.py +0 -0
  36. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/azure/event_grid.py +0 -0
  37. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/bots/__init__.py +0 -0
  38. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/bots/discord.py +0 -0
  39. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/bots/github_webhook.py +0 -0
  40. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/bots/webapp.py +0 -0
  41. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/chunker/__init__.py +0 -0
  42. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/chunker/azure.py +0 -0
  43. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/chunker/doc_handling.py +0 -0
  44. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/chunker/encode_metadata.py +0 -0
  45. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/chunker/images.py +0 -0
  46. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/chunker/loaders.py +0 -0
  47. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/chunker/message_data.py +0 -0
  48. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/chunker/pdfs.py +0 -0
  49. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/chunker/process_chunker_data.py +0 -0
  50. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/chunker/publish.py +0 -0
  51. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/chunker/pubsub.py +0 -0
  52. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/chunker/splitter.py +0 -0
  53. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/cli/__init__.py +0 -0
  54. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/cli/chat_vac.py +0 -0
  55. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/cli/cli.py +0 -0
  56. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/cli/cli_init.py +0 -0
  57. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/cli/configs.py +0 -0
  58. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/cli/deploy.py +0 -0
  59. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/cli/embedder.py +0 -0
  60. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/cli/merge_texts.py +0 -0
  61. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/cli/run_proxy.py +0 -0
  62. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/cli/sun_rich.py +0 -0
  63. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/cli/swagger.py +0 -0
  64. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/cli/vertex.py +0 -0
  65. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/components/__init__.py +0 -0
  66. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/components/llm.py +0 -0
  67. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/components/retriever.py +0 -0
  68. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/components/vectorstore.py +0 -0
  69. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/custom_logging.py +0 -0
  70. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/database/__init__.py +0 -0
  71. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/database/alloydb.py +0 -0
  72. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/database/alloydb_client.py +0 -0
  73. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/database/database.py +0 -0
  74. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/database/lancedb.py +0 -0
  75. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/database/sql/sb/create_function.sql +0 -0
  76. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/database/sql/sb/create_function_time.sql +0 -0
  77. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/database/sql/sb/create_table.sql +0 -0
  78. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/database/sql/sb/delete_source_row.sql +0 -0
  79. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/database/sql/sb/return_sources.sql +0 -0
  80. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/database/sql/sb/setup.sql +0 -0
  81. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/database/static_dbs.py +0 -0
  82. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/database/uuid.py +0 -0
  83. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/discovery_engine/__init__.py +0 -0
  84. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/discovery_engine/chunker_handler.py +0 -0
  85. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/discovery_engine/create_new.py +0 -0
  86. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/discovery_engine/discovery_engine_client.py +0 -0
  87. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/discovery_engine/get_ai_search_chunks.py +0 -0
  88. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/embedder/__init__.py +0 -0
  89. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/embedder/embed_chunk.py +0 -0
  90. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/gcs/__init__.py +0 -0
  91. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/gcs/add_file.py +0 -0
  92. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/gcs/download_folder.py +0 -0
  93. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/gcs/download_url.py +0 -0
  94. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/gcs/metadata.py +0 -0
  95. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/genai/safety.py +0 -0
  96. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/invoke/__init__.py +0 -0
  97. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/invoke/async_class.py +0 -0
  98. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/invoke/direct_vac_func.py +0 -0
  99. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/invoke/invoke_vac_utils.py +0 -0
  100. {sunholo-0.84.5/sunholo/genai → sunholo-0.84.7/sunholo/langfuse}/__init__.py +0 -0
  101. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/langfuse/callback.py +0 -0
  102. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/langfuse/prompts.py +0 -0
  103. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/llamaindex/__init__.py +0 -0
  104. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/llamaindex/get_files.py +0 -0
  105. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/llamaindex/import_files.py +0 -0
  106. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/llamaindex/llamaindex_class.py +0 -0
  107. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/llamaindex/user_history.py +0 -0
  108. {sunholo-0.84.5/sunholo/langfuse → sunholo-0.84.7/sunholo/lookup}/__init__.py +0 -0
  109. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/lookup/model_lookup.yaml +0 -0
  110. {sunholo-0.84.5/sunholo/lookup → sunholo-0.84.7/sunholo/patches}/__init__.py +0 -0
  111. {sunholo-0.84.5/sunholo/patches → sunholo-0.84.7/sunholo/patches/langchain}/__init__.py +0 -0
  112. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/patches/langchain/lancedb.py +0 -0
  113. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/patches/langchain/vertexai.py +0 -0
  114. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/pubsub/__init__.py +0 -0
  115. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/pubsub/process_pubsub.py +0 -0
  116. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/pubsub/pubsub_manager.py +0 -0
  117. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/qna/__init__.py +0 -0
  118. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/qna/parsers.py +0 -0
  119. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/qna/retry.py +0 -0
  120. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/streaming/__init__.py +0 -0
  121. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/streaming/content_buffer.py +0 -0
  122. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/streaming/langserve.py +0 -0
  123. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/streaming/stream_lookup.py +0 -0
  124. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/streaming/streaming.py +0 -0
  125. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/summarise/__init__.py +0 -0
  126. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/summarise/summarise.py +0 -0
  127. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/tools/__init__.py +0 -0
  128. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/tools/web_browser.py +0 -0
  129. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/utils/__init__.py +0 -0
  130. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/utils/api_key.py +0 -0
  131. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/utils/big_context.py +0 -0
  132. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/utils/config.py +0 -0
  133. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/utils/config_class.py +0 -0
  134. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/utils/config_schema.py +0 -0
  135. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/utils/gcp.py +0 -0
  136. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/utils/gcp_project.py +0 -0
  137. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/utils/parsers.py +0 -0
  138. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/utils/timedelta.py +0 -0
  139. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/utils/user_ids.py +0 -0
  140. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/utils/version.py +0 -0
  141. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/vertex/__init__.py +0 -0
  142. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/vertex/extensions_call.py +0 -0
  143. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/vertex/extensions_class.py +0 -0
  144. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/vertex/genai_functions.py +0 -0
  145. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/vertex/init.py +0 -0
  146. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/vertex/memory_tools.py +0 -0
  147. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/vertex/safety.py +0 -0
  148. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo/vertex/type_dict_to_json.py +0 -0
  149. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo.egg-info/SOURCES.txt +0 -0
  150. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo.egg-info/dependency_links.txt +0 -0
  151. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo.egg-info/entry_points.txt +0 -0
  152. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo.egg-info/requires.txt +0 -0
  153. {sunholo-0.84.5 → sunholo-0.84.7}/sunholo.egg-info/top_level.txt +0 -0
  154. {sunholo-0.84.5 → sunholo-0.84.7}/tests/test_chat_history.py +0 -0
  155. {sunholo-0.84.5 → sunholo-0.84.7}/tests/test_config.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sunholo
3
- Version: 0.84.5
3
+ Version: 0.84.7
4
4
  Summary: Large Language Model DevOps - a package to help deploy LLMs to the Cloud.
5
5
  Home-page: https://github.com/sunholo-data/sunholo-py
6
- Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.84.5.tar.gz
6
+ Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.84.7.tar.gz
7
7
  Author: Holosun ApS
8
8
  Author-email: multivac@sunholo.com
9
9
  License: Apache License, Version 2.0
@@ -1,7 +1,7 @@
1
1
  from setuptools import setup, find_packages
2
2
 
3
3
  # Define your base version
4
- version = '0.84.5'
4
+ version = '0.84.7'
5
5
 
6
6
  setup(
7
7
  name='sunholo',
@@ -0,0 +1,2 @@
1
+ from .process_funcs_cls import GenAIFunctionProcessor
2
+ from .safety import genai_safety
@@ -28,24 +28,21 @@ class GenAIFunctionProcessor:
28
28
  funcs (dict): A dictionary of function names mapped to their implementations.
29
29
 
30
30
  Example usage:
31
- # Subclassing GenAIFunctionProcessor for a specific application (e.g., AlloyDB)
32
- class AlloyDBFunctionProcessor(GenAIFunctionProcessor):
33
- def construct_tools(self) -> dict:
34
- # Implement function mapping specific to AlloyDB
35
- ...
31
+ ```python
32
+ class AlloyDBFunctionProcessor(GenAIFunctionProcessor):
33
+ def construct_tools(self) -> dict:
34
+ ...
36
35
 
37
- # Creating an instance of the subclass and using it
38
- config = ConfigManager()
39
- alloydb_processor = AlloyDBFunctionProcessor(config)
36
+ config = ConfigManager()
37
+ alloydb_processor = AlloyDBFunctionProcessor(config)
40
38
 
41
- # Processing functions based on a generative AI response
42
- results = alloydb_processor.process_funcs(full_response)
39
+ results = alloydb_processor.process_funcs(full_response)
43
40
 
44
- # Getting the configured model
45
- alloydb_model = alloydb_processor.get_model(
46
- model_name="gemini-1.5-pro",
47
- system_instruction="You are a helpful AlloyDB agent that helps users search and extract documents from the database."
48
- )
41
+ alloydb_model = alloydb_processor.get_model(
42
+ model_name="gemini-1.5-pro",
43
+ system_instruction="You are a helpful AlloyDB agent that helps users search and extract documents from the database."
44
+ )
45
+ ```
49
46
  """
50
47
 
51
48
  def __init__(self, config: ConfigManager):
@@ -60,6 +57,7 @@ class GenAIFunctionProcessor:
60
57
 
61
58
  self.config = config
62
59
  self.funcs = self.construct_tools()
60
+ self.model_name = config.vacConfig("model") or "gemini-1.5-flash"
63
61
  self._validate_functions()
64
62
 
65
63
  def construct_tools(self) -> dict:
@@ -93,7 +91,7 @@ class GenAIFunctionProcessor:
93
91
  log.error(f"Function {func_name} is missing a docstring.")
94
92
  raise ValueError(f"Function {func_name} must have a docstring to be used as a genai tool.")
95
93
 
96
- def process_funcs(self, full_response, output_parts=True) -> list[Part] | str:
94
+ def process_funcs(self, full_response, output_parts=True) -> list['Part'] | str:
97
95
  """
98
96
  Processes the functions based on the full_response from the generative model.
99
97
 
@@ -109,7 +107,9 @@ class GenAIFunctionProcessor:
109
107
  list[Part] | str: A list of Part objects or a formatted string with the results.
110
108
 
111
109
  Example usage:
112
- results = alloydb_processor.process_funcs(full_response)
110
+ ```python
111
+ results = alloydb_processor.process_funcs(full_response)
112
+ ```
113
113
  """
114
114
  api_requests_and_responses = []
115
115
 
@@ -164,7 +164,7 @@ class GenAIFunctionProcessor:
164
164
 
165
165
  return strings
166
166
 
167
- def get_model(self, model_name: str, system_instruction: str, generation_config=None):
167
+ def get_model(self, system_instruction: str, generation_config=None, model_name: str=None):
168
168
  """
169
169
  Constructs and returns the generative AI model configured with the tools.
170
170
 
@@ -180,10 +180,12 @@ class GenAIFunctionProcessor:
180
180
  GenerativeModel: An instance of the GenerativeModel configured with the provided tools.
181
181
 
182
182
  Example usage:
183
- alloydb_model = alloydb_processor.get_model(
184
- model_name="gemini-1.5-pro",
185
- system_instruction="You are a helpful AlloyDB agent that helps users search and extract documents from the database."
186
- )
183
+ ```python
184
+ alloydb_model = alloydb_processor.get_model(
185
+ model_name="gemini-1.5-pro",
186
+ system_instruction="You are a helpful AlloyDB agent that helps users search and extract documents from the database."
187
+ )
188
+ ```
187
189
  """
188
190
  if generation_config is None:
189
191
  generation_config = {
@@ -196,7 +198,7 @@ class GenAIFunctionProcessor:
196
198
 
197
199
  try:
198
200
  model = genai.GenerativeModel(
199
- model_name=model_name,
201
+ model_name=model_name or self.model_name,
200
202
  tools=tools,
201
203
  generation_config=generation_config,
202
204
  safety_settings=genai_safety(),
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sunholo
3
- Version: 0.84.5
3
+ Version: 0.84.7
4
4
  Summary: Large Language Model DevOps - a package to help deploy LLMs to the Cloud.
5
5
  Home-page: https://github.com/sunholo-data/sunholo-py
6
- Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.84.5.tar.gz
6
+ Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.84.7.tar.gz
7
7
  Author: Holosun ApS
8
8
  Author-email: multivac@sunholo.com
9
9
  License: Apache License, Version 2.0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes