bluecellulab 2.6.20__tar.gz → 2.6.22__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.

Potentially problematic release.


This version of bluecellulab might be problematic. Click here for more details.

Files changed (102) hide show
  1. bluecellulab-2.6.22/CONTRIBUTING.rst +27 -0
  2. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/PKG-INFO +6 -1
  3. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/README.rst +5 -0
  4. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/cell/injector.py +1 -3
  5. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/cell/stimuli_generator.py +25 -7
  6. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/stimulus/circuit_stimulus_definitions.py +10 -3
  7. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab.egg-info/PKG-INFO +6 -1
  8. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab.egg-info/SOURCES.txt +2 -0
  9. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/docs/source/conf.py +4 -0
  10. bluecellulab-2.6.22/docs/source/contributing.rst +1 -0
  11. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/docs/source/index.rst +1 -0
  12. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/tox.ini +1 -1
  13. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/.compile_mod.sh +0 -0
  14. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/.gitattributes +0 -0
  15. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/.github/dependabot.yml +0 -0
  16. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/.github/workflows/release.yml +0 -0
  17. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/.github/workflows/test.yml +0 -0
  18. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/.gitignore +0 -0
  19. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/.gitlab-ci.yml +0 -0
  20. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/.readthedocs.yml +0 -0
  21. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/.zenodo.json +0 -0
  22. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/AUTHORS.txt +0 -0
  23. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/CHANGELOG.rst +0 -0
  24. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/LICENSE +0 -0
  25. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/MANIFEST.in +0 -0
  26. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/Makefile +0 -0
  27. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/__init__.py +0 -0
  28. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/analysis/__init__.py +0 -0
  29. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/analysis/inject_sequence.py +0 -0
  30. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/cell/__init__.py +0 -0
  31. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/cell/ballstick/__init__.py +0 -0
  32. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/cell/ballstick/emodel.hoc +0 -0
  33. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/cell/ballstick/morphology.asc +0 -0
  34. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/cell/cell_dict.py +0 -0
  35. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/cell/core.py +0 -0
  36. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/cell/plotting.py +0 -0
  37. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/cell/random.py +0 -0
  38. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/cell/recording.py +0 -0
  39. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/cell/section_distance.py +0 -0
  40. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/cell/serialized_sections.py +0 -0
  41. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/cell/sonata_proxy.py +0 -0
  42. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/cell/template.py +0 -0
  43. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/circuit/__init__.py +0 -0
  44. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/circuit/circuit_access/__init__.py +0 -0
  45. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/circuit/circuit_access/bluepy_circuit_access.py +0 -0
  46. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/circuit/circuit_access/definition.py +0 -0
  47. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/circuit/circuit_access/sonata_circuit_access.py +0 -0
  48. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/circuit/config/__init__.py +0 -0
  49. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/circuit/config/bluepy_simulation_config.py +0 -0
  50. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/circuit/config/definition.py +0 -0
  51. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/circuit/config/sections.py +0 -0
  52. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/circuit/config/sonata_simulation_config.py +0 -0
  53. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/circuit/format.py +0 -0
  54. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/circuit/iotools.py +0 -0
  55. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/circuit/node_id.py +0 -0
  56. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/circuit/simulation_access.py +0 -0
  57. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/circuit/synapse_properties.py +0 -0
  58. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/circuit/validate.py +0 -0
  59. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/circuit_simulation.py +0 -0
  60. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/connection.py +0 -0
  61. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/dendrogram.py +0 -0
  62. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/exceptions.py +0 -0
  63. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/graph.py +0 -0
  64. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/hoc/Cell.hoc +0 -0
  65. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/hoc/RNGSettings.hoc +0 -0
  66. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/hoc/TDistFunc.hoc +0 -0
  67. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/hoc/TStim.hoc +0 -0
  68. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/hoc/fileUtils.hoc +0 -0
  69. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/importer.py +0 -0
  70. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/neuron_interpreter.py +0 -0
  71. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/plotwindow.py +0 -0
  72. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/psection.py +0 -0
  73. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/psegment.py +0 -0
  74. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/rngsettings.py +0 -0
  75. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/simulation/__init__.py +0 -0
  76. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/simulation/neuron_globals.py +0 -0
  77. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/simulation/parallel.py +0 -0
  78. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/simulation/simulation.py +0 -0
  79. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/stimulus/__init__.py +0 -0
  80. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/stimulus/factory.py +0 -0
  81. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/synapse/__init__.py +0 -0
  82. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/synapse/synapse_factory.py +0 -0
  83. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/synapse/synapse_types.py +0 -0
  84. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/tools.py +0 -0
  85. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/type_aliases.py +0 -0
  86. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/utils.py +0 -0
  87. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab/verbosity.py +0 -0
  88. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab.egg-info/dependency_links.txt +0 -0
  89. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab.egg-info/requires.txt +0 -0
  90. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/bluecellulab.egg-info/top_level.txt +0 -0
  91. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/docs/Makefile +0 -0
  92. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/docs/images/voltage-readme.png +0 -0
  93. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/docs/make.bat +0 -0
  94. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/docs/requirements_docs.txt +0 -0
  95. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/docs/source/_static/.gitkeep +0 -0
  96. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/docs/source/api.rst +0 -0
  97. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/docs/source/changelog.rst +0 -0
  98. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/docs/source/compiling-mechanisms.rst +0 -0
  99. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/docs/source/list_of_stim.rst +0 -0
  100. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/docs/source/logo/BlueCelluLabBanner.jpg +0 -0
  101. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/pyproject.toml +0 -0
  102. {bluecellulab-2.6.20 → bluecellulab-2.6.22}/setup.cfg +0 -0
@@ -0,0 +1,27 @@
1
+ Contributing to BlueCelluLab
2
+ ============================
3
+
4
+ Thank you for taking the time to contribute!
5
+
6
+ Reporting Bugs and Suggesting Enhancements
7
+ ------------------------------------------
8
+
9
+ 1. Search existing `issues <https://github.com/BlueBrain/BlueCelluLab/issues>`_.
10
+ 2. Open a new issue with a clear title and detailed description.
11
+ 3. Include steps to reproduce, expected and actual behavior for bugs, or the current and expected behavior for enhancements.
12
+ 4. Attach any relevant screenshots or files.
13
+ 5. If applicable specify the versions of BlueCelluLab, Python and any relevant dependencies.
14
+
15
+ Pull Requests
16
+ -------------
17
+
18
+ 1. Fork the repository and create a new branch.
19
+ 2. Make your changes.
20
+ 3. Run `tox -e lint` to check the code format.
21
+ 4. Run the tests with `tox -e py3`.
22
+ 5. Add unit tests for the new code.
23
+ 6. If applicable add type hints and docstrings.
24
+ 7. If applicable update the documentation.
25
+ 8. Submit a pull request with a clear description.
26
+
27
+ Thank you for contributing to BlueCelluLab!
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bluecellulab
3
- Version: 2.6.20
3
+ Version: 2.6.22
4
4
  Summary: Biologically detailed neural network simulations and analysis.
5
5
  Author: Blue Brain Project, EPFL
6
6
  License: Apache2.0
@@ -146,6 +146,11 @@ Testing is set up using `tox`:
146
146
  tox -e py3 # runs the tests
147
147
  tox -e lint # runs the format checks
148
148
 
149
+ Contributing
150
+ ============
151
+
152
+ We welcome contributions to BlueCelluLab! Please see the `CONTRIBUTING.rst <https://github.com/BlueBrain/BlueCelluLab/blob/main/CONTRIBUTING.rst>`_ for guidelines on how to contribute.
153
+
149
154
  Funding & Acknowledgements
150
155
  ==========================
151
156
 
@@ -116,6 +116,11 @@ Testing is set up using `tox`:
116
116
  tox -e py3 # runs the tests
117
117
  tox -e lint # runs the format checks
118
118
 
119
+ Contributing
120
+ ============
121
+
122
+ We welcome contributions to BlueCelluLab! Please see the `CONTRIBUTING.rst <https://github.com/BlueBrain/BlueCelluLab/blob/main/CONTRIBUTING.rst>`_ for guidelines on how to contribute.
123
+
119
124
  Funding & Acknowledgements
120
125
  ==========================
121
126
 
@@ -360,17 +360,15 @@ class InjectableMixin:
360
360
  stimulus: RelativeShotNoise,
361
361
  shotnoise_stim_count=0):
362
362
  """Add a replay relative shot noise stimulus."""
363
- cv_square = stimulus.amp_cv**2
364
363
 
365
364
  stim_mode = stimulus.mode
366
365
  rel_prop = self.relativity_proportion(stim_mode)
367
366
 
368
367
  mean = stimulus.mean_percent / 100 * rel_prop
369
368
  sd = stimulus.sd_percent / 100 * rel_prop
370
- var = sd * sd
371
369
 
372
370
  rate, amp_mean, amp_var = get_relative_shotnoise_params(
373
- mean, var, stimulus.decay_time, stimulus.rise_time, cv_square)
371
+ mean, sd, stimulus.decay_time, stimulus.rise_time, stimulus.relative_skew)
374
372
 
375
373
  rng = self._get_shotnoise_step_rand(shotnoise_stim_count, stimulus.seed)
376
374
  tvec, svec = gen_shotnoise_signal(stimulus.decay_time, stimulus.rise_time, rate, amp_mean,
@@ -114,17 +114,35 @@ def gen_shotnoise_signal(tau_D, tau_R, rate, amp_mean, amp_var,
114
114
  return tvec, P
115
115
 
116
116
 
117
- def get_relative_shotnoise_params(mean, var, tau_D, tau_R, cv_square):
117
+ def get_relative_shotnoise_params(mean, sd, tau_D, tau_R, relative_skew):
118
118
  """Returns Rate, amp_mean and amp_var parameters."""
119
119
  # bi-exponential time to peak [ms]
120
120
  t_peak = math.log(tau_D / tau_R) / (1 / tau_R - 1 / tau_D)
121
121
  # bi-exponential peak height [1]
122
- x_peak = math.exp(-t_peak / tau_D) - math.exp(-t_peak / tau_R)
123
-
124
- rate_ms = (1 + cv_square) / 2 * (mean ** 2 / var) / (tau_D + tau_R)
125
- rate = rate_ms * 1000 # rate in 1 / s [Hz]
126
- amp_mean = mean * x_peak / rate_ms / (tau_D - tau_R)
127
- amp_var = cv_square * amp_mean ** 2
122
+ F_peak = math.exp(-t_peak / tau_D) - math.exp(-t_peak / tau_R)
123
+
124
+ # utility constants
125
+ Xi = (tau_D - tau_R) / F_peak
126
+ A = 1 / (tau_D + tau_R)
127
+ B = 1 / ((tau_D + 2 * tau_R) * (2 * tau_D + tau_R))
128
+
129
+ # skewness
130
+ skew_bnd_min = (8 / 3) * (B / A ** 2) * (sd / mean)
131
+ skew = (1 + relative_skew) * skew_bnd_min
132
+ if skew < skew_bnd_min or skew > 2 * skew_bnd_min:
133
+ raise ValueError("skewness out of bounds")
134
+
135
+ # cumulants
136
+ lambda2_1 = sd ** 2 / mean # lambda2 over lambda1
137
+ lambda3_2 = sd * skew # lambda3 over lambda2
138
+ theta1pk = 2 / (A * Xi) * lambda2_1 # = (1 + k) * theta
139
+ theta2pk = (3 * A) / (4 * B * Xi) * lambda3_2 # = (2 + k) * theta
140
+
141
+ # derived parameters
142
+ amp_mean = 2 * theta1pk - theta2pk # mean amplitude [nA or uS]
143
+ amp_var = amp_mean * (theta2pk - theta1pk) # variance of amplitude [nA^2 or uS^2]
144
+ rate_ms = mean / (amp_mean * Xi) # event rate in 1 / ms
145
+ rate = rate_ms * 1000 # event rate in 1 / s [Hz]
128
146
 
129
147
  return rate, amp_mean, amp_var
130
148
 
@@ -170,7 +170,7 @@ class Stimulus:
170
170
  decay_time=stimulus_entry["DecayTime"],
171
171
  mean_percent=stimulus_entry["MeanPercent"],
172
172
  sd_percent=stimulus_entry["SDPercent"],
173
- amp_cv=stimulus_entry["AmpCV"],
173
+ relative_skew=stimulus_entry.get("RelativeSkew", 0.5),
174
174
  seed=stimulus_entry.get("Seed", None),
175
175
  mode=mode,
176
176
  reversal=stimulus_entry.get("Reversal", 0.0)
@@ -269,7 +269,7 @@ class Stimulus:
269
269
  decay_time=stimulus_entry["decay_time"],
270
270
  mean_percent=stimulus_entry["mean_percent"],
271
271
  sd_percent=stimulus_entry["sd_percent"],
272
- amp_cv=stimulus_entry["amp_cv"],
272
+ relative_skew=stimulus_entry.get("RelativeSkew", 0.5),
273
273
  seed=stimulus_entry.get("random_seed", None),
274
274
  mode=ClampMode(stimulus_entry.get("input_type", "current_clamp").lower()),
275
275
  reversal=stimulus_entry.get("reversal", 0.0)
@@ -365,7 +365,7 @@ class RelativeShotNoise(Stimulus):
365
365
  decay_time: float
366
366
  mean_percent: float
367
367
  sd_percent: float
368
- amp_cv: float
368
+ relative_skew: float = 0.5
369
369
  dt: float = 0.25
370
370
  seed: Optional[int] = None
371
371
  mode: ClampMode = ClampMode.CURRENT
@@ -378,6 +378,13 @@ class RelativeShotNoise(Stimulus):
378
378
  raise ValueError("decay_time must be greater than rise_time")
379
379
  return v
380
380
 
381
+ @field_validator("relative_skew")
382
+ @classmethod
383
+ def relative_skew_in_range(cls, v):
384
+ if v < 0.0 or v > 1.0:
385
+ raise ValueError("relative skewness must be in [0,1]")
386
+ return v
387
+
381
388
 
382
389
  @dataclass(frozen=True, config=dict(extra="forbid"))
383
390
  class OrnsteinUhlenbeck(Stimulus):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bluecellulab
3
- Version: 2.6.20
3
+ Version: 2.6.22
4
4
  Summary: Biologically detailed neural network simulations and analysis.
5
5
  Author: Blue Brain Project, EPFL
6
6
  License: Apache2.0
@@ -146,6 +146,11 @@ Testing is set up using `tox`:
146
146
  tox -e py3 # runs the tests
147
147
  tox -e lint # runs the format checks
148
148
 
149
+ Contributing
150
+ ============
151
+
152
+ We welcome contributions to BlueCelluLab! Please see the `CONTRIBUTING.rst <https://github.com/BlueBrain/BlueCelluLab/blob/main/CONTRIBUTING.rst>`_ for guidelines on how to contribute.
153
+
149
154
  Funding & Acknowledgements
150
155
  ==========================
151
156
 
@@ -6,6 +6,7 @@
6
6
  .zenodo.json
7
7
  AUTHORS.txt
8
8
  CHANGELOG.rst
9
+ CONTRIBUTING.rst
9
10
  LICENSE
10
11
  MANIFEST.in
11
12
  Makefile
@@ -92,6 +93,7 @@ docs/source/api.rst
92
93
  docs/source/changelog.rst
93
94
  docs/source/compiling-mechanisms.rst
94
95
  docs/source/conf.py
96
+ docs/source/contributing.rst
95
97
  docs/source/index.rst
96
98
  docs/source/list_of_stim.rst
97
99
  docs/source/_static/.gitkeep
@@ -19,6 +19,10 @@ autosummary_mock_imports = [ # these modules are not publicly available
19
19
  'bluepy_configfile'
20
20
  ]
21
21
 
22
+ suppress_warnings = [
23
+ 'autosummary.import_cycle',
24
+ ]
25
+
22
26
  # -- Options for HTML output -------------------------------------------------
23
27
  # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
24
28
 
@@ -0,0 +1 @@
1
+ .. include:: ../../CONTRIBUTING.rst
@@ -17,5 +17,6 @@
17
17
  api.rst
18
18
  compiling-mechanisms.rst
19
19
  changelog
20
+ contributing
20
21
 
21
22
  .. |banner| image:: /logo/BlueCelluLabBanner.jpg
@@ -44,7 +44,7 @@ commands =
44
44
  ruff check . --select F541,F401 --per-file-ignores="__init__.py:F401"
45
45
  pycodestyle {[base]name} --ignore=E501,W504,W503
46
46
  pycodestyle tests --ignore=E501,W504,W503,E741
47
- mypy . --ignore-missing-imports --disable-error-code=call-overload # remove once pandas-stubs makes a release after 1.5.3.230321
47
+ mypy . --ignore-missing-imports --disable-error-code=call-overload # remove once pandas-stubs makes a release after 1.5.3.230321
48
48
  docformatter --check bluecellulab -r
49
49
 
50
50
  [testenv:examples]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes