sciveo 0.1.68__tar.gz → 0.1.70__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 (169) hide show
  1. {sciveo-0.1.68 → sciveo-0.1.70}/PKG-INFO +1 -1
  2. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/capture/motion_detection.py +12 -5
  3. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/capture/readers.py +6 -1
  4. sciveo-0.1.70/sciveo/version.py +2 -0
  5. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo.egg-info/PKG-INFO +1 -1
  6. sciveo-0.1.68/sciveo/version.py +0 -2
  7. {sciveo-0.1.68 → sciveo-0.1.70}/README.md +0 -0
  8. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/__init__.py +0 -0
  9. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/api/__init__.py +0 -0
  10. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/api/base.py +0 -0
  11. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/api/predictors.py +0 -0
  12. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/api/server.py +0 -0
  13. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/api/upload.py +0 -0
  14. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/cli.py +0 -0
  15. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/common/__init__.py +0 -0
  16. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/common/configuration.py +0 -0
  17. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/common/model.py +0 -0
  18. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/common/optimizers.py +0 -0
  19. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/common/sampling.py +0 -0
  20. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/content/__init__.py +0 -0
  21. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/content/dataset.py +0 -0
  22. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/content/experiment.py +0 -0
  23. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/content/project.py +0 -0
  24. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/content/runner.py +0 -0
  25. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/__init__.py +0 -0
  26. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/capture/__init__.py +0 -0
  27. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/capture/cam.py +0 -0
  28. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/capture/nvr.py +0 -0
  29. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/ml/__init__.py +0 -0
  30. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/ml/base.py +0 -0
  31. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/ml/encoders/__init__.py +0 -0
  32. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/ml/encoders/base.py +0 -0
  33. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/ml/encoders/normalizer.py +0 -0
  34. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/ml/nlp/__init__.py +0 -0
  35. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/ml/nlp/search.py +0 -0
  36. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/ml/time_series/__init__.py +0 -0
  37. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/ml/time_series/dataset.py +0 -0
  38. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/ml/time_series/predictor.py +0 -0
  39. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/ml/time_series/trainer.py +0 -0
  40. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/ml/time_series/window_generator.py +0 -0
  41. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/__init__.py +0 -0
  42. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/base.py +0 -0
  43. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/job_daemon.py +0 -0
  44. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/layouts/__init__.py +0 -0
  45. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/layouts/base.py +0 -0
  46. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/pipeline.py +0 -0
  47. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/postprocessors/__init__.py +0 -0
  48. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/postprocessors/base.py +0 -0
  49. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/postprocessors/default.py +0 -0
  50. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/__init__.py +0 -0
  51. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/audio/__init__.py +0 -0
  52. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/audio/audio.py +0 -0
  53. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/audio/audio_extractor_process.py +0 -0
  54. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/aws.py +0 -0
  55. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/base.py +0 -0
  56. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/file/__init__.py +0 -0
  57. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/file/archive.py +0 -0
  58. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/image/__init__.py +0 -0
  59. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/image/album.py +0 -0
  60. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/image/album_in_image.py +0 -0
  61. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/image/depth_esimation.py +0 -0
  62. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/image/embeddings.py +0 -0
  63. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/image/filters.py +0 -0
  64. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/image/generators.py +0 -0
  65. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/image/histogram.py +0 -0
  66. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/image/mask.py +0 -0
  67. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/image/object_detection.py +0 -0
  68. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/image/resize.py +0 -0
  69. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/image/segmentation.py +0 -0
  70. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/image/watermark.py +0 -0
  71. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/media_info.py +0 -0
  72. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/nlp/__init__.py +0 -0
  73. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/nlp/address.py +0 -0
  74. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/qr.py +0 -0
  75. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/sci/__init__.py +0 -0
  76. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/sci/base.py +0 -0
  77. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/sci/dataset.py +0 -0
  78. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/sci/time_series/__init__.py +0 -0
  79. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/sci/time_series/predictor.py +0 -0
  80. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/sci/time_series/trainer.py +0 -0
  81. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/tpu_base.py +0 -0
  82. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/video/__init__.py +0 -0
  83. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/video/generators.py +0 -0
  84. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/video/motion_detection.py +0 -0
  85. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/video/resize.py +0 -0
  86. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/video/video_album.py +0 -0
  87. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/video/video_frames.py +0 -0
  88. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/processors/video/video_resample.py +0 -0
  89. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/queues.py +0 -0
  90. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/server.py +0 -0
  91. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/web/__init__.py +0 -0
  92. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/pipelines/web/server.py +0 -0
  93. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/tools/__init__.py +0 -0
  94. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/media/tools/video_interactive.py +0 -0
  95. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/__init__.py +0 -0
  96. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/base.py +0 -0
  97. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/dataset/__init__.py +0 -0
  98. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/dataset/object_detection.py +0 -0
  99. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/evaluation/__init__.py +0 -0
  100. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/evaluation/markdown.py +0 -0
  101. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/evaluation/object_detection.py +0 -0
  102. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/images/__init__.py +0 -0
  103. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/images/base.py +0 -0
  104. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/images/description.py +0 -0
  105. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/images/embeddings.py +0 -0
  106. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/images/object_detection.py +0 -0
  107. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/images/tools.py +0 -0
  108. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/images/transformers.py +0 -0
  109. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/nlp/__init__.py +0 -0
  110. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/nlp/embeddings.py +0 -0
  111. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/nlp/tokenizers/__init__.py +0 -0
  112. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/nlp/tokenizers/bpe.py +0 -0
  113. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/video/__init__.py +0 -0
  114. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/ml/video/description.py +0 -0
  115. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/monitoring/__init__.py +0 -0
  116. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/monitoring/monitor.py +0 -0
  117. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/monitoring/start.py +0 -0
  118. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/monitoring/watchdog/__init__.py +0 -0
  119. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/monitoring/watchdog/base.py +0 -0
  120. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/monitoring/watchdog/process.py +0 -0
  121. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/network/__init__.py +0 -0
  122. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/network/camera.py +0 -0
  123. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/network/sniffer.py +0 -0
  124. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/network/tools.py +0 -0
  125. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/__init__.py +0 -0
  126. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/array.py +0 -0
  127. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/aws/__init__.py +0 -0
  128. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/aws/priority_queue.py +0 -0
  129. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/aws/s3.py +0 -0
  130. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/common.py +0 -0
  131. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/complexity.py +0 -0
  132. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/compress.py +0 -0
  133. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/configuration.py +0 -0
  134. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/crypto.py +0 -0
  135. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/daemon.py +0 -0
  136. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/draw/__init__.py +0 -0
  137. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/draw/contours.py +0 -0
  138. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/formating.py +0 -0
  139. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/hardware.py +0 -0
  140. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/http.py +0 -0
  141. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/logger.py +0 -0
  142. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/os.py +0 -0
  143. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/queue.py +0 -0
  144. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/random.py +0 -0
  145. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/remote.py +0 -0
  146. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/simple_counter.py +0 -0
  147. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/synchronized.py +0 -0
  148. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/timers.py +0 -0
  149. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/tools/totp.py +0 -0
  150. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/web/__init__.py +0 -0
  151. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo/web/common.py +0 -0
  152. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo.egg-info/SOURCES.txt +0 -0
  153. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo.egg-info/dependency_links.txt +0 -0
  154. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo.egg-info/entry_points.txt +0 -0
  155. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo.egg-info/requires.txt +0 -0
  156. {sciveo-0.1.68 → sciveo-0.1.70}/sciveo.egg-info/top_level.txt +0 -0
  157. {sciveo-0.1.68 → sciveo-0.1.70}/setup.cfg +0 -0
  158. {sciveo-0.1.68 → sciveo-0.1.70}/setup.py +0 -0
  159. {sciveo-0.1.68 → sciveo-0.1.70}/test/test_complexity.py +0 -0
  160. {sciveo-0.1.68 → sciveo-0.1.70}/test/test_compress.py +0 -0
  161. {sciveo-0.1.68 → sciveo-0.1.70}/test/test_configuration.py +0 -0
  162. {sciveo-0.1.68 → sciveo-0.1.70}/test/test_crypto.py +0 -0
  163. {sciveo-0.1.68 → sciveo-0.1.70}/test/test_eval_markdown.py +0 -0
  164. {sciveo-0.1.68 → sciveo-0.1.70}/test/test_ml_datasets.py +0 -0
  165. {sciveo-0.1.68 → sciveo-0.1.70}/test/test_monitoring.py +0 -0
  166. {sciveo-0.1.68 → sciveo-0.1.70}/test/test_runner.py +0 -0
  167. {sciveo-0.1.68 → sciveo-0.1.70}/test/test_sampling.py +0 -0
  168. {sciveo-0.1.68 → sciveo-0.1.70}/test/test_tokenizers.py +0 -0
  169. {sciveo-0.1.68 → sciveo-0.1.70}/test/test_totp.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sciveo
3
- Version: 0.1.68
3
+ Version: 0.1.70
4
4
  Description-Content-Type: text/markdown
5
5
  Provides-Extra: mon
6
6
  Provides-Extra: net
@@ -109,9 +109,16 @@ class MotionDetectorDaemon(DaemonBase):
109
109
  def on_motion(self, source_id, file_name, file_path, configuration):
110
110
  debug("MOTION", source_id, file_name, configuration)
111
111
  if "dst" in self.configuration:
112
- dst_file_path = os.path.join(self.configuration["dst"], file_name)
113
- shutil.copy(file_path, dst_file_path)
114
- debug("CP", file_path, "=>", dst_file_path)
112
+ file_name_split = file_name.split("___")
113
+ if len(file_name_split) >= 3:
114
+ cam_id = file_name_split[0]
115
+ video_date = file_name_split[1]
116
+ video_file_name = file_name_split[2]
117
+ video_base_path = os.path.join(self.configuration["dst"], cam_id, video_date)
118
+ dst_file_path = os.path.join(video_base_path, video_file_name)
119
+ os.makedirs(video_base_path, exist_ok=True)
120
+ shutil.copy(file_path, dst_file_path)
121
+ debug("CP", file_path, "=>", dst_file_path)
115
122
 
116
123
  def run(self):
117
124
  while(self.is_running):
@@ -124,9 +131,9 @@ class MotionDetectorDaemon(DaemonBase):
124
131
  source_id = file_name_split[0]
125
132
 
126
133
  if source_id in self.configuration:
127
- configuration = self.configuration.get(source_id, { "threshold_motion": 5, "threshold_motion_hold": 8, "grid": [[0.0]] })
134
+ configuration = self.configuration.get(source_id, { "threshold_motion": 5, "threshold_motion_hold": 5, "grid": [[0.0]] })
128
135
  md = self.motion_detectors.get(source_id, VideoMotionDetector(source_id, configuration))
129
- motion = md(VideoReaderFFMPEG.read(file_path, resolution=360, RGB=False, gpu_id=0))
136
+ motion = md(VideoReaderFFMPEG.read(file_path, resolution=360, RGB=False, gpu_id=-1, framestep=5))
130
137
 
131
138
  if motion:
132
139
  self.on_motion(source_id, file_name, file_path, configuration)
@@ -43,7 +43,7 @@ class VideoReaderFFMPEG:
43
43
  return width, height
44
44
 
45
45
  @staticmethod
46
- def read(file_path, resolution=720, RGB=False, gpu_id=-1, timeout=30):
46
+ def read(file_path, resolution=720, RGB=False, gpu_id=-1, timeout=30, fps=None, framestep=None):
47
47
  timer_video_read = Timer()
48
48
  frames = []
49
49
 
@@ -81,6 +81,11 @@ class VideoReaderFFMPEG:
81
81
  if in_w != out_w or in_h != out_h:
82
82
  ffmpeg_input = ffmpeg_input.filter('scale', out_w, out_h)
83
83
 
84
+ if fps is not None:
85
+ ffmpeg_input = ffmpeg_input.filter('fps', fps=fps)
86
+ if framestep is not None:
87
+ ffmpeg_input = ffmpeg_input.filter('framestep', step=framestep)
88
+
84
89
  process = (
85
90
  ffmpeg_input
86
91
  .output('pipe:', format='rawvideo', pix_fmt=pix_fmt, vsync='vfr')
@@ -0,0 +1,2 @@
1
+
2
+ __version__ = '0.1.70'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sciveo
3
- Version: 0.1.68
3
+ Version: 0.1.70
4
4
  Description-Content-Type: text/markdown
5
5
  Provides-Extra: mon
6
6
  Provides-Extra: net
@@ -1,2 +0,0 @@
1
-
2
- __version__ = '0.1.68'
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes