sunholo 0.104.1__tar.gz → 0.104.3__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 (164) hide show
  1. {sunholo-0.104.1 → sunholo-0.104.3}/PKG-INFO +2 -2
  2. {sunholo-0.104.1 → sunholo-0.104.3}/setup.py +1 -1
  3. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/agents/flask/vac_routes.py +26 -15
  4. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo.egg-info/PKG-INFO +2 -2
  5. {sunholo-0.104.1 → sunholo-0.104.3}/LICENSE.txt +0 -0
  6. {sunholo-0.104.1 → sunholo-0.104.3}/MANIFEST.in +0 -0
  7. {sunholo-0.104.1 → sunholo-0.104.3}/README.md +0 -0
  8. {sunholo-0.104.1 → sunholo-0.104.3}/setup.cfg +0 -0
  9. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/__init__.py +0 -0
  10. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/agents/__init__.py +0 -0
  11. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/agents/chat_history.py +0 -0
  12. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/agents/dispatch_to_qa.py +0 -0
  13. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/agents/fastapi/__init__.py +0 -0
  14. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/agents/fastapi/base.py +0 -0
  15. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/agents/fastapi/qna_routes.py +0 -0
  16. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/agents/flask/__init__.py +0 -0
  17. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/agents/flask/base.py +0 -0
  18. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/agents/flask/qna_routes.py +0 -0
  19. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/agents/langserve.py +0 -0
  20. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/agents/pubsub.py +0 -0
  21. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/agents/route.py +0 -0
  22. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/agents/special_commands.py +0 -0
  23. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/agents/swagger.py +0 -0
  24. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/archive/__init__.py +0 -0
  25. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/archive/archive.py +0 -0
  26. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/auth/__init__.py +0 -0
  27. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/auth/gcloud.py +0 -0
  28. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/auth/refresh.py +0 -0
  29. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/auth/run.py +0 -0
  30. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/azure/__init__.py +0 -0
  31. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/azure/auth.py +0 -0
  32. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/azure/blobs.py +0 -0
  33. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/azure/event_grid.py +0 -0
  34. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/bots/__init__.py +0 -0
  35. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/bots/discord.py +0 -0
  36. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/bots/github_webhook.py +0 -0
  37. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/bots/webapp.py +0 -0
  38. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/chunker/__init__.py +0 -0
  39. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/chunker/azure.py +0 -0
  40. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/chunker/doc_handling.py +0 -0
  41. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/chunker/encode_metadata.py +0 -0
  42. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/chunker/images.py +0 -0
  43. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/chunker/loaders.py +0 -0
  44. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/chunker/message_data.py +0 -0
  45. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/chunker/pdfs.py +0 -0
  46. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/chunker/process_chunker_data.py +0 -0
  47. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/chunker/publish.py +0 -0
  48. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/chunker/pubsub.py +0 -0
  49. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/chunker/splitter.py +0 -0
  50. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/cli/__init__.py +0 -0
  51. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/cli/chat_vac.py +0 -0
  52. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/cli/cli.py +0 -0
  53. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/cli/cli_init.py +0 -0
  54. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/cli/configs.py +0 -0
  55. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/cli/deploy.py +0 -0
  56. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/cli/embedder.py +0 -0
  57. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/cli/merge_texts.py +0 -0
  58. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/cli/run_proxy.py +0 -0
  59. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/cli/sun_rich.py +0 -0
  60. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/cli/swagger.py +0 -0
  61. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/cli/vertex.py +0 -0
  62. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/components/__init__.py +0 -0
  63. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/components/llm.py +0 -0
  64. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/components/retriever.py +0 -0
  65. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/components/vectorstore.py +0 -0
  66. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/custom_logging.py +0 -0
  67. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/database/__init__.py +0 -0
  68. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/database/alloydb.py +0 -0
  69. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/database/alloydb_client.py +0 -0
  70. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/database/database.py +0 -0
  71. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/database/lancedb.py +0 -0
  72. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/database/sql/sb/create_function.sql +0 -0
  73. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/database/sql/sb/create_function_time.sql +0 -0
  74. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/database/sql/sb/create_table.sql +0 -0
  75. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/database/sql/sb/delete_source_row.sql +0 -0
  76. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/database/sql/sb/return_sources.sql +0 -0
  77. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/database/sql/sb/setup.sql +0 -0
  78. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/database/static_dbs.py +0 -0
  79. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/database/uuid.py +0 -0
  80. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/discovery_engine/__init__.py +0 -0
  81. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/discovery_engine/chunker_handler.py +0 -0
  82. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/discovery_engine/create_new.py +0 -0
  83. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/discovery_engine/discovery_engine_client.py +0 -0
  84. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/discovery_engine/get_ai_search_chunks.py +0 -0
  85. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/embedder/__init__.py +0 -0
  86. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/embedder/embed_chunk.py +0 -0
  87. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/excel/__init__.py +0 -0
  88. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/excel/plugin.py +0 -0
  89. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/gcs/__init__.py +0 -0
  90. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/gcs/add_file.py +0 -0
  91. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/gcs/download_folder.py +0 -0
  92. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/gcs/download_url.py +0 -0
  93. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/gcs/extract_and_sign.py +0 -0
  94. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/gcs/metadata.py +0 -0
  95. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/genai/__init__.py +0 -0
  96. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/genai/images.py +0 -0
  97. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/genai/init.py +0 -0
  98. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/genai/process_funcs_cls.py +0 -0
  99. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/genai/safety.py +0 -0
  100. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/invoke/__init__.py +0 -0
  101. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/invoke/async_class.py +0 -0
  102. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/invoke/direct_vac_func.py +0 -0
  103. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/invoke/invoke_vac_utils.py +0 -0
  104. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/langfuse/__init__.py +0 -0
  105. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/langfuse/callback.py +0 -0
  106. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/langfuse/evals.py +0 -0
  107. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/langfuse/prompts.py +0 -0
  108. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/llamaindex/__init__.py +0 -0
  109. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/llamaindex/get_files.py +0 -0
  110. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/llamaindex/import_files.py +0 -0
  111. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/llamaindex/llamaindex_class.py +0 -0
  112. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/llamaindex/user_history.py +0 -0
  113. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/lookup/__init__.py +0 -0
  114. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/lookup/model_lookup.yaml +0 -0
  115. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/patches/__init__.py +0 -0
  116. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/patches/langchain/__init__.py +0 -0
  117. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/patches/langchain/lancedb.py +0 -0
  118. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/patches/langchain/vertexai.py +0 -0
  119. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/pubsub/__init__.py +0 -0
  120. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/pubsub/process_pubsub.py +0 -0
  121. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/pubsub/pubsub_manager.py +0 -0
  122. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/qna/__init__.py +0 -0
  123. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/qna/parsers.py +0 -0
  124. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/qna/retry.py +0 -0
  125. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/streaming/__init__.py +0 -0
  126. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/streaming/content_buffer.py +0 -0
  127. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/streaming/langserve.py +0 -0
  128. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/streaming/stream_lookup.py +0 -0
  129. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/streaming/streaming.py +0 -0
  130. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/summarise/__init__.py +0 -0
  131. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/summarise/summarise.py +0 -0
  132. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/terraform/__init__.py +0 -0
  133. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/terraform/tfvars_editor.py +0 -0
  134. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/tools/__init__.py +0 -0
  135. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/tools/web_browser.py +0 -0
  136. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/utils/__init__.py +0 -0
  137. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/utils/api_key.py +0 -0
  138. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/utils/big_context.py +0 -0
  139. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/utils/config.py +0 -0
  140. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/utils/config_class.py +0 -0
  141. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/utils/config_schema.py +0 -0
  142. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/utils/gcp.py +0 -0
  143. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/utils/gcp_project.py +0 -0
  144. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/utils/mime.py +0 -0
  145. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/utils/parsers.py +0 -0
  146. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/utils/timedelta.py +0 -0
  147. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/utils/user_ids.py +0 -0
  148. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/utils/version.py +0 -0
  149. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/vertex/__init__.py +0 -0
  150. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/vertex/extensions_call.py +0 -0
  151. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/vertex/extensions_class.py +0 -0
  152. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/vertex/genai_functions.py +0 -0
  153. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/vertex/init.py +0 -0
  154. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/vertex/memory_tools.py +0 -0
  155. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/vertex/safety.py +0 -0
  156. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo/vertex/type_dict_to_json.py +0 -0
  157. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo.egg-info/SOURCES.txt +0 -0
  158. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo.egg-info/dependency_links.txt +0 -0
  159. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo.egg-info/entry_points.txt +0 -0
  160. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo.egg-info/requires.txt +0 -0
  161. {sunholo-0.104.1 → sunholo-0.104.3}/sunholo.egg-info/top_level.txt +0 -0
  162. {sunholo-0.104.1 → sunholo-0.104.3}/tests/test_async.py +0 -0
  163. {sunholo-0.104.1 → sunholo-0.104.3}/tests/test_chat_history.py +0 -0
  164. {sunholo-0.104.1 → sunholo-0.104.3}/tests/test_config.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sunholo
3
- Version: 0.104.1
3
+ Version: 0.104.3
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.104.1.tar.gz
6
+ Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.104.3.tar.gz
7
7
  Author: Holosun ApS
8
8
  Author-email: multivac@sunholo.com
9
9
  License: Apache License, Version 2.0
@@ -1,6 +1,6 @@
1
1
  from setuptools import setup, find_packages
2
2
 
3
- version = '0.104.1'
3
+ version = '0.104.3'
4
4
 
5
5
  setup(
6
6
  name='sunholo',
@@ -63,8 +63,7 @@ if __name__ == "__main__":
63
63
  self.vac_interpreter = vac_interpreter or partial(self.vac_interpreter_default)
64
64
  self.additional_routes = additional_routes if additional_routes is not None else []
65
65
  self.register_routes()
66
- self.register_additional_routes()
67
- self.register_after_request()
66
+
68
67
 
69
68
  def vac_interpreter_default(self, question: str, vector_name: str, chat_history=[], **kwargs):
70
69
  # Create a callback that does nothing for streaming if you don't want intermediate outputs
@@ -97,21 +96,44 @@ if __name__ == "__main__":
97
96
  self.app.route("/health", methods=['GET'])(self.health)
98
97
 
99
98
  # Streaming VAC
100
- self.app.route('/vac/streaming/<vector_name>', methods=['POST'])(self.handle_stream_vac)
99
+ self.app.route('/vac/streaming/<vector_name>',
100
+ methods=['POST'],
101
+ provide_automatic_options=False)(self.handle_stream_vac)
101
102
 
102
103
  # Static VAC
103
- self.app.route('/vac/<vector_name>', methods=['POST'])(self.handle_process_vac)
104
+ self.app.route('/vac/<vector_name>',
105
+ methods=['POST'],
106
+ provide_automatic_options=False)(self.handle_process_vac)
104
107
 
105
108
  # Authentication middleware
106
109
  self.app.before_request(self.check_authentication)
107
110
 
111
+ # Handle OPTIONS requests explicitly
112
+ self.app.route('/vac/streaming/<vector_name>', methods=['OPTIONS'])(self.handle_options)
113
+ self.app.route('/vac/<vector_name>', methods=['OPTIONS'])(self.handle_options)
114
+
108
115
  # OpenAI health endpoint
109
116
  self.app.route('/openai/health', methods=['GET', 'POST'])(self.openai_health_endpoint)
110
117
 
111
118
  # OpenAI compatible endpoint
112
119
  self.app.route('/openai/v1/chat/completions', methods=['POST'])(self.handle_openai_compatible_endpoint)
113
120
  self.app.route('/openai/v1/chat/completions/<vector_name>', methods=['POST'])(self.handle_openai_compatible_endpoint)
121
+
122
+ self.register_additional_routes()
123
+
124
+ def handle_options(self, **kwargs):
125
+ response = Response(status=200)
126
+ response.headers.add('Access-Control-Allow-Origin', '*')
114
127
 
128
+ # Reflect the request's `Access-Control-Request-Headers`
129
+ request_headers = request.headers.get('Access-Control-Request-Headers', '')
130
+ response.headers.add('Access-Control-Allow-Headers', request_headers)
131
+
132
+ # Specify allowed methods
133
+ response.headers.add('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
134
+ log.info(f'OPTION Request headers: {request_headers}')
135
+
136
+ return response
115
137
 
116
138
  def register_additional_routes(self):
117
139
  """
@@ -152,17 +174,6 @@ if __name__ == "__main__":
152
174
  for route in self.additional_routes:
153
175
  self.app.route(route["rule"], methods=route["methods"])(route["handler"])
154
176
 
155
- def register_after_request(self):
156
- """
157
- Register after_request to add CORS headers.
158
- """
159
- @self.app.after_request
160
- def add_cors_headers(response):
161
- response.headers.add('Access-Control-Allow-Origin', '*')
162
- response.headers.add('Access-Control-Allow-Headers', 'Content-Type, Authorization, x-api-key')
163
- response.headers.add('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE, OPTIONS')
164
- return response
165
-
166
177
  def home(self):
167
178
  return jsonify("OK")
168
179
 
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sunholo
3
- Version: 0.104.1
3
+ Version: 0.104.3
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.104.1.tar.gz
6
+ Download-URL: https://github.com/sunholo-data/sunholo-py/archive/refs/tags/v0.104.3.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