meta-memcache 2.1.0__tar.gz → 2.2.0__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.
- {meta_memcache-2.1.0/src/meta_memcache.egg-info → meta_memcache-2.2.0}/PKG-INFO +2 -2
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/pyproject.toml +10 -2
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/__init__.py +1 -1
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/commands/high_level_commands.py +62 -65
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/executors/default.py +4 -2
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/routers/helpers.py +5 -3
- {meta_memcache-2.1.0 → meta_memcache-2.2.0/src/meta_memcache.egg-info}/PKG-INFO +2 -2
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache.egg-info/requires.txt +1 -1
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/LICENSE +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/README.md +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/setup.cfg +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/base/__init__.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/base/base_cache_client.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/base/base_serializer.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/cache_client.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/commands/__init__.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/commands/meta_commands.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/compression/__init__.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/compression/zstd_manager.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/configuration.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/connection/__init__.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/connection/memcache_socket.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/connection/pool.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/connection/providers.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/errors.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/events/__init__.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/events/write_failure_event.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/executors/__init__.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/extras/__init__.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/extras/client_wrapper.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/extras/migrating_cache_client.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/extras/probabilistic_hot_cache.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/interfaces/__init__.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/interfaces/cache_api.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/interfaces/commands.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/interfaces/executor.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/interfaces/high_level_commands.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/interfaces/meta_commands.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/interfaces/router.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/metrics/__init__.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/metrics/base.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/metrics/prometheus.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/protocol.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/py.typed +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/routers/__init__.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/routers/default.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/routers/ephemeral.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/routers/gutter.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/serializer.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/settings.py +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache.egg-info/SOURCES.txt +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache.egg-info/dependency_links.txt +0 -0
- {meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meta-memcache
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.0
|
|
4
4
|
Summary: Modern, pure python, memcache client with support for new meta commands.
|
|
5
5
|
Author-email: Guillermo Perez <bisho@revenuecat.com>
|
|
6
6
|
License: MIT License
|
|
@@ -11,7 +11,7 @@ License-File: LICENSE
|
|
|
11
11
|
Requires-Dist: uhashring<3,>=2.3
|
|
12
12
|
Requires-Dist: marisa-trie<1.3,>=1.2.1
|
|
13
13
|
Requires-Dist: zstandard<0.26,>=0.25.0
|
|
14
|
-
Requires-Dist: meta-memcache-socket<0.
|
|
14
|
+
Requires-Dist: meta-memcache-socket<0.4.0,>=0.3.0
|
|
15
15
|
Provides-Extra: metrics
|
|
16
16
|
Requires-Dist: prometheus-client>=0.17.1; extra == "metrics"
|
|
17
17
|
Dynamic: license-file
|
|
@@ -3,12 +3,12 @@ dependencies = [
|
|
|
3
3
|
"uhashring >= 2.3, < 3",
|
|
4
4
|
"marisa-trie >= 1.2.1, < 1.3",
|
|
5
5
|
"zstandard >= 0.25.0, < 0.26",
|
|
6
|
-
"meta-memcache-socket >= 0.
|
|
6
|
+
"meta-memcache-socket >= 0.3.0, < 0.4.0",
|
|
7
7
|
]
|
|
8
8
|
authors = [{ name = "Guillermo Perez", email = "bisho@revenuecat.com" }]
|
|
9
9
|
license = { text = "MIT License" }
|
|
10
10
|
name = "meta-memcache"
|
|
11
|
-
version = "2.
|
|
11
|
+
version = "2.2.0"
|
|
12
12
|
description = "Modern, pure python, memcache client with support for new meta commands."
|
|
13
13
|
readme = "README.md"
|
|
14
14
|
requires-python = ">=3.10"
|
|
@@ -39,3 +39,11 @@ line-length = 88
|
|
|
39
39
|
[tool.ruff.lint.per-file-ignores]
|
|
40
40
|
"tests/*.py" = ["E731"]
|
|
41
41
|
"src/meta_memcache/__init__.py" = ["F401"]
|
|
42
|
+
|
|
43
|
+
[dependency-groups]
|
|
44
|
+
dev = [
|
|
45
|
+
"prometheus-client>=0.24.1",
|
|
46
|
+
"pytest>=9.0.2",
|
|
47
|
+
"pytest-cov>=7.1.0",
|
|
48
|
+
"pytest-mock>=3.15.1",
|
|
49
|
+
]
|
{meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/commands/high_level_commands.py
RENAMED
|
@@ -77,6 +77,8 @@ class HighLevelCommandMixinWithMetaCommands(
|
|
|
77
77
|
no_reply: bool = False,
|
|
78
78
|
cas_token: Optional[int] = None,
|
|
79
79
|
return_value: bool = False,
|
|
80
|
+
initial_value: Optional[int] = None,
|
|
81
|
+
initial_ttl: Optional[int] = None,
|
|
80
82
|
) -> RequestFlags: ... # pragma: no cover
|
|
81
83
|
|
|
82
84
|
|
|
@@ -95,15 +97,17 @@ class HighLevelCommandsMixin:
|
|
|
95
97
|
Write a value using the specified `set_mode`
|
|
96
98
|
"""
|
|
97
99
|
key = key if isinstance(key, Key) else Key(key)
|
|
98
|
-
flags = RequestFlags(
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
100
|
+
flags = RequestFlags(
|
|
101
|
+
cache_ttl=ttl,
|
|
102
|
+
no_reply=no_reply,
|
|
103
|
+
cas_token=cas_token,
|
|
104
|
+
mark_stale=bool(
|
|
105
|
+
cas_token is not None
|
|
106
|
+
and stale_policy
|
|
107
|
+
and stale_policy.mark_stale_on_cas_mismatch
|
|
108
|
+
),
|
|
109
|
+
mode=set_mode.value if set_mode != SetMode.SET else None,
|
|
110
|
+
)
|
|
107
111
|
|
|
108
112
|
result = self.meta_set(
|
|
109
113
|
key=key,
|
|
@@ -141,9 +145,8 @@ class HighLevelCommandsMixin:
|
|
|
141
145
|
flags = RequestFlags(
|
|
142
146
|
cache_ttl=ttl,
|
|
143
147
|
mode=SetMode.ADD.value,
|
|
148
|
+
no_reply=no_reply,
|
|
144
149
|
)
|
|
145
|
-
if no_reply:
|
|
146
|
-
flags.no_reply = True
|
|
147
150
|
|
|
148
151
|
result = self.meta_set(
|
|
149
152
|
key=key,
|
|
@@ -169,14 +172,17 @@ class HighLevelCommandsMixin:
|
|
|
169
172
|
it exists or not, use invalidate() instead.
|
|
170
173
|
"""
|
|
171
174
|
key = key if isinstance(key, Key) else Key(key)
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
175
|
+
_stale_ttl = (
|
|
176
|
+
stale_policy.mark_stale_on_deletion_ttl
|
|
177
|
+
if stale_policy and stale_policy.mark_stale_on_deletion_ttl > 0
|
|
178
|
+
else None
|
|
179
|
+
)
|
|
180
|
+
flags = RequestFlags(
|
|
181
|
+
no_reply=no_reply,
|
|
182
|
+
cas_token=cas_token,
|
|
183
|
+
mark_stale=_stale_ttl is not None,
|
|
184
|
+
cache_ttl=_stale_ttl,
|
|
185
|
+
)
|
|
180
186
|
|
|
181
187
|
result = self.meta_delete(key=key, flags=flags)
|
|
182
188
|
|
|
@@ -193,14 +199,17 @@ class HighLevelCommandsMixin:
|
|
|
193
199
|
Returns true of the key deleted or it didn't exist anyway
|
|
194
200
|
"""
|
|
195
201
|
key = key if isinstance(key, Key) else Key(key)
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
202
|
+
_stale_ttl = (
|
|
203
|
+
stale_policy.mark_stale_on_deletion_ttl
|
|
204
|
+
if stale_policy and stale_policy.mark_stale_on_deletion_ttl > 0
|
|
205
|
+
else None
|
|
206
|
+
)
|
|
207
|
+
flags = RequestFlags(
|
|
208
|
+
no_reply=no_reply,
|
|
209
|
+
cas_token=cas_token,
|
|
210
|
+
mark_stale=_stale_ttl is not None,
|
|
211
|
+
cache_ttl=_stale_ttl,
|
|
212
|
+
)
|
|
204
213
|
|
|
205
214
|
result = self.meta_delete(key=key, flags=flags)
|
|
206
215
|
|
|
@@ -216,9 +225,7 @@ class HighLevelCommandsMixin:
|
|
|
216
225
|
Modify the TTL of a key without retrieving the value
|
|
217
226
|
"""
|
|
218
227
|
key = key if isinstance(key, Key) else Key(key)
|
|
219
|
-
flags = RequestFlags(cache_ttl=ttl)
|
|
220
|
-
if no_reply:
|
|
221
|
-
flags.no_reply = True
|
|
228
|
+
flags = RequestFlags(cache_ttl=ttl, no_reply=no_reply)
|
|
222
229
|
result = self.meta_get(key, flags=flags)
|
|
223
230
|
|
|
224
231
|
return isinstance(result, Success)
|
|
@@ -344,14 +351,11 @@ class HighLevelCommandsMixin:
|
|
|
344
351
|
recache_policy: Optional[RecachePolicy] = None,
|
|
345
352
|
return_cas_token: bool = False,
|
|
346
353
|
) -> Dict[Key, Optional[Value]]:
|
|
347
|
-
if return_cas_token
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
flags.recache_ttl = recache_policy.ttl
|
|
353
|
-
if touch_ttl is not None and touch_ttl >= 0:
|
|
354
|
-
flags.cache_ttl = touch_ttl
|
|
354
|
+
base = DEFAULT_GET_CAS_FLAGS if return_cas_token else DEFAULT_GET_FLAGS
|
|
355
|
+
flags = base.replace(
|
|
356
|
+
recache_ttl=recache_policy.ttl if recache_policy else None,
|
|
357
|
+
cache_ttl=touch_ttl if touch_ttl is not None and touch_ttl >= 0 else None,
|
|
358
|
+
)
|
|
355
359
|
|
|
356
360
|
results = self.meta_multiget(
|
|
357
361
|
keys=[key if isinstance(key, Key) else Key(key) for key in keys],
|
|
@@ -389,16 +393,12 @@ class HighLevelCommandsMixin:
|
|
|
389
393
|
return_cas_token: bool = False,
|
|
390
394
|
) -> Optional[Value]:
|
|
391
395
|
key = key if isinstance(key, Key) else Key(key)
|
|
392
|
-
if return_cas_token
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
if recache_policy:
|
|
399
|
-
flags.recache_ttl = recache_policy.ttl
|
|
400
|
-
if touch_ttl is not None and touch_ttl >= 0:
|
|
401
|
-
flags.cache_ttl = touch_ttl
|
|
396
|
+
base = DEFAULT_GET_CAS_FLAGS if return_cas_token else DEFAULT_GET_FLAGS
|
|
397
|
+
flags = base.replace(
|
|
398
|
+
vivify_on_miss_ttl=lease_policy.ttl if lease_policy else None,
|
|
399
|
+
recache_ttl=recache_policy.ttl if recache_policy else None,
|
|
400
|
+
cache_ttl=touch_ttl if touch_ttl is not None and touch_ttl >= 0 else None,
|
|
401
|
+
)
|
|
402
402
|
|
|
403
403
|
result = self.meta_get(key, flags=flags)
|
|
404
404
|
return self._process_get_result(key, result)
|
|
@@ -478,22 +478,19 @@ class HighLevelCommandsMixin:
|
|
|
478
478
|
no_reply: bool = False,
|
|
479
479
|
cas_token: Optional[int] = None,
|
|
480
480
|
return_value: bool = False,
|
|
481
|
+
initial_value: Optional[int] = None,
|
|
482
|
+
initial_ttl: Optional[int] = None,
|
|
481
483
|
) -> RequestFlags:
|
|
482
|
-
|
|
484
|
+
return RequestFlags(
|
|
483
485
|
ma_delta_value=abs(delta),
|
|
486
|
+
return_value=return_value,
|
|
487
|
+
no_reply=no_reply,
|
|
488
|
+
cache_ttl=refresh_ttl,
|
|
489
|
+
cas_token=cas_token,
|
|
490
|
+
mode=MA_MODE_DEC if delta < 0 else None,
|
|
491
|
+
ma_initial_value=abs(initial_value) if initial_value is not None else None,
|
|
492
|
+
vivify_on_miss_ttl=initial_ttl,
|
|
484
493
|
)
|
|
485
|
-
if return_value:
|
|
486
|
-
flags.return_value = True
|
|
487
|
-
if no_reply:
|
|
488
|
-
flags.no_reply = True
|
|
489
|
-
if refresh_ttl is not None:
|
|
490
|
-
flags.cache_ttl = refresh_ttl
|
|
491
|
-
if cas_token is not None:
|
|
492
|
-
flags.cas_token = cas_token
|
|
493
|
-
if delta < 0:
|
|
494
|
-
flags.mode = MA_MODE_DEC
|
|
495
|
-
|
|
496
|
-
return flags
|
|
497
494
|
|
|
498
495
|
def delta(
|
|
499
496
|
self: HighLevelCommandMixinWithMetaCommands,
|
|
@@ -537,9 +534,9 @@ class HighLevelCommandsMixin:
|
|
|
537
534
|
refresh_ttl=refresh_ttl,
|
|
538
535
|
no_reply=no_reply,
|
|
539
536
|
cas_token=cas_token,
|
|
537
|
+
initial_value=initial_value,
|
|
538
|
+
initial_ttl=initial_ttl,
|
|
540
539
|
)
|
|
541
|
-
flags.ma_initial_value = abs(initial_value)
|
|
542
|
-
flags.vivify_on_miss_ttl = initial_ttl
|
|
543
540
|
result = self.meta_arithmetic(key=key, flags=flags)
|
|
544
541
|
return isinstance(result, Success)
|
|
545
542
|
|
|
@@ -588,9 +585,9 @@ class HighLevelCommandsMixin:
|
|
|
588
585
|
delta=delta,
|
|
589
586
|
refresh_ttl=refresh_ttl,
|
|
590
587
|
cas_token=cas_token,
|
|
588
|
+
initial_value=initial_value,
|
|
589
|
+
initial_ttl=initial_ttl,
|
|
591
590
|
)
|
|
592
|
-
flags.ma_initial_value = abs(initial_value)
|
|
593
|
-
flags.vivify_on_miss_ttl = initial_ttl
|
|
594
591
|
result = self.meta_arithmetic(key=key, flags=flags)
|
|
595
592
|
if isinstance(result, Value):
|
|
596
593
|
if isinstance(result.value, str) and result.value.isnumeric():
|
|
@@ -45,8 +45,10 @@ class DefaultExecutor:
|
|
|
45
45
|
flags: Optional[RequestFlags],
|
|
46
46
|
) -> Tuple[Optional[bytes], RequestFlags]:
|
|
47
47
|
encoded_value = self._serializer.serialize(key, value.value)
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
if flags is None:
|
|
49
|
+
flags = RequestFlags(client_flag=encoded_value.encoding_id)
|
|
50
|
+
else:
|
|
51
|
+
flags = flags.replace(client_flag=encoded_value.encoding_id)
|
|
50
52
|
return encoded_value.data, flags
|
|
51
53
|
|
|
52
54
|
def _is_a_write_failure(
|
|
@@ -17,8 +17,10 @@ def adjust_flags_for_max_ttl(
|
|
|
17
17
|
Override TTLs > than `max_ttl`
|
|
18
18
|
"""
|
|
19
19
|
if flags:
|
|
20
|
-
flags
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
flags = flags.replace(
|
|
21
|
+
cache_ttl=_adjust_ttl(flags.cache_ttl, max_ttl),
|
|
22
|
+
recache_ttl=_adjust_ttl(flags.recache_ttl, max_ttl),
|
|
23
|
+
vivify_on_miss_ttl=_adjust_ttl(flags.vivify_on_miss_ttl, max_ttl),
|
|
24
|
+
)
|
|
23
25
|
|
|
24
26
|
return flags
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meta-memcache
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.0
|
|
4
4
|
Summary: Modern, pure python, memcache client with support for new meta commands.
|
|
5
5
|
Author-email: Guillermo Perez <bisho@revenuecat.com>
|
|
6
6
|
License: MIT License
|
|
@@ -11,7 +11,7 @@ License-File: LICENSE
|
|
|
11
11
|
Requires-Dist: uhashring<3,>=2.3
|
|
12
12
|
Requires-Dist: marisa-trie<1.3,>=1.2.1
|
|
13
13
|
Requires-Dist: zstandard<0.26,>=0.25.0
|
|
14
|
-
Requires-Dist: meta-memcache-socket<0.
|
|
14
|
+
Requires-Dist: meta-memcache-socket<0.4.0,>=0.3.0
|
|
15
15
|
Provides-Extra: metrics
|
|
16
16
|
Requires-Dist: prometheus-client>=0.17.1; extra == "metrics"
|
|
17
17
|
Dynamic: license-file
|
|
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
|
{meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/extras/migrating_cache_client.py
RENAMED
|
File without changes
|
{meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/extras/probabilistic_hot_cache.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meta_memcache-2.1.0 → meta_memcache-2.2.0}/src/meta_memcache/interfaces/high_level_commands.py
RENAMED
|
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
|