imt-ring 1.3.4__tar.gz → 1.3.5__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.
- {imt_ring-1.3.4 → imt_ring-1.3.5}/PKG-INFO +1 -1
- {imt_ring-1.3.4 → imt_ring-1.3.5}/pyproject.toml +1 -1
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/imt_ring.egg-info/PKG-INFO +1 -1
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/_random.py +34 -19
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/custom_joints/suntay.py +19 -7
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/generator/batch.py +3 -1
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/jcalc.py +2 -2
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/base.py +9 -1
- {imt_ring-1.3.4 → imt_ring-1.3.5}/readme.md +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/setup.cfg +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/imt_ring.egg-info/SOURCES.txt +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/imt_ring.egg-info/dependency_links.txt +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/imt_ring.egg-info/requires.txt +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/imt_ring.egg-info/top_level.txt +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/__init__.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algebra.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/__init__.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/custom_joints/__init__.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/custom_joints/rr_imp_joint.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/custom_joints/rr_joint.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/dynamics.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/generator/__init__.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/generator/base.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/generator/motion_artifacts.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/generator/pd_control.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/generator/randomize.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/generator/transforms.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/generator/types.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/kinematics.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/algorithms/sensors.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/__init__.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/branched.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/exclude/knee_trans_dof.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/exclude/standard_sys.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/exclude/standard_sys_rr_imp.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/inv_pendulum.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/knee_flexible_imus.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/spherical_stiff.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/symmetric.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/test_all_1.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/test_all_2.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/test_ang0_pos0.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/test_control.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/test_double_pendulum.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/test_free.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/test_kinematics.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/test_morph_system/four_seg_seg1.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/test_morph_system/four_seg_seg3.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/test_randomize_position.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/test_sensors.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples/test_three_seg_seg2.xml +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/examples.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/test_examples.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/xml/__init__.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/xml/abstract.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/xml/from_xml.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/xml/test_from_xml.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/xml/test_to_xml.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/io/xml/to_xml.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/maths.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/ml/__init__.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/ml/base.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/ml/callbacks.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/ml/ml_utils.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/ml/optimizer.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/ml/params/0x13e3518065c21cd8.pickle +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/ml/ringnet.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/ml/train.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/ml/training_loop.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/rendering/__init__.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/rendering/base_render.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/rendering/mujoco_render.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/rendering/vispy_render.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/rendering/vispy_visuals.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/sim2real/__init__.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/sim2real/sim2real.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/spatial.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/sys_composer/__init__.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/sys_composer/delete_sys.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/sys_composer/inject_sys.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/sys_composer/morph_sys.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/utils/__init__.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/utils/batchsize.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/utils/colab.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/utils/hdf5.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/utils/normalizer.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/utils/path.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/src/ring/utils/utils.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_algebra.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_base.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_custom_joints.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_dynamics.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_generator.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_jcalc.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_jit.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_kinematics.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_maths.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_ml_utils.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_motion_artifacts.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_pd_control.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_random.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_randomize.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_rcmg.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_render.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_sensors.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_sim2real.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_sys_composer.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_train.py +0 -0
- {imt_ring-1.3.4 → imt_ring-1.3.5}/tests/test_utils.py +0 -0
@@ -4,6 +4,7 @@ import warnings
|
|
4
4
|
import jax
|
5
5
|
from jax import random
|
6
6
|
import jax.numpy as jnp
|
7
|
+
|
7
8
|
from ring import maths
|
8
9
|
|
9
10
|
Float = jax.Array
|
@@ -40,20 +41,20 @@ def random_angle_over_time(
|
|
40
41
|
def body_fn_outer(val):
|
41
42
|
i, t, phi, key_t, key_ang, ANG = val
|
42
43
|
|
43
|
-
key_t,
|
44
|
-
|
45
|
-
|
46
|
-
key_ang, consume = random.split(key_ang)
|
47
|
-
phi = _resolve_range_of_motion(
|
44
|
+
key_t, consume_t = random.split(key_t)
|
45
|
+
key_ang, consume_ang = random.split(key_ang)
|
46
|
+
dt, phi = _resolve_range_of_motion(
|
48
47
|
range_of_motion,
|
49
48
|
range_of_motion_method,
|
50
49
|
_to_float(dang_min, t),
|
51
50
|
_to_float(dang_max, t),
|
52
51
|
_to_float(delta_ang_min, t),
|
53
52
|
_to_float(delta_ang_max, t),
|
54
|
-
|
53
|
+
t_min,
|
54
|
+
_to_float(t_max, t),
|
55
55
|
phi,
|
56
|
-
|
56
|
+
consume_t,
|
57
|
+
consume_ang,
|
57
58
|
max_iter,
|
58
59
|
)
|
59
60
|
t += dt
|
@@ -246,12 +247,14 @@ def _resolve_range_of_motion(
|
|
246
247
|
dang_max,
|
247
248
|
delta_ang_min,
|
248
249
|
delta_ang_max,
|
249
|
-
|
250
|
+
t_min,
|
251
|
+
t_max,
|
250
252
|
prev_phi,
|
251
|
-
|
253
|
+
key_t,
|
254
|
+
key_ang,
|
252
255
|
max_iter,
|
253
256
|
):
|
254
|
-
def _next_phi(key):
|
257
|
+
def _next_phi(key, dt):
|
255
258
|
key, consume = random.split(key)
|
256
259
|
|
257
260
|
if range_of_motion:
|
@@ -294,21 +297,33 @@ def _resolve_range_of_motion(
|
|
294
297
|
return prev_phi + sign * dphi
|
295
298
|
|
296
299
|
def body_fn(val):
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
300
|
+
key_t, key_ang, _, _, i = val
|
301
|
+
|
302
|
+
key_t, consume_t = jax.random.split(key_t)
|
303
|
+
dt = jax.random.uniform(consume_t, minval=t_min, maxval=t_max)
|
304
|
+
|
305
|
+
key_ang, consume_ang = jax.random.split(key_ang)
|
306
|
+
next_phi = _next_phi(consume_ang, dt)
|
307
|
+
|
308
|
+
return key_t, key_ang, dt, next_phi, i + 1
|
301
309
|
|
302
310
|
def cond_fn(val):
|
303
|
-
_, next_phi, i = val
|
311
|
+
*_, dt, next_phi, i = val
|
304
312
|
delta_phi = jnp.abs(next_phi - prev_phi)
|
305
|
-
#
|
306
|
-
|
313
|
+
# delta_ang is in bounds
|
314
|
+
cond_delta_ang = (delta_phi >= delta_ang_min) & (delta_phi <= delta_ang_max)
|
315
|
+
# dang is in bounds
|
316
|
+
dang = delta_phi / dt
|
317
|
+
cond_dang = (dang >= dang_min) & (dang <= dang_max)
|
318
|
+
|
319
|
+
break_if_true1 = jnp.logical_and(cond_delta_ang, cond_dang)
|
320
|
+
# break out of loop
|
307
321
|
break_if_true2 = i > max_iter
|
308
322
|
return (i == 0) | (jnp.logical_not(break_if_true1 | break_if_true2))
|
309
323
|
|
310
|
-
|
311
|
-
|
324
|
+
init_val = (key_t, key_ang, 1.0, prev_phi, 0)
|
325
|
+
*_, dt, next_phi, _ = jax.lax.while_loop(cond_fn, body_fn, init_val)
|
326
|
+
return dt, next_phi
|
312
327
|
|
313
328
|
|
314
329
|
def cosInterpolate(x, xp, fp):
|
@@ -296,11 +296,17 @@ def register_suntay(sconfig: SuntayConfig, name: str = "suntay"):
|
|
296
296
|
def Polynomial_DrawnFnPair(
|
297
297
|
order: int = 2,
|
298
298
|
center: bool = False,
|
299
|
-
|
299
|
+
flexion_center_deg: Optional[float] = None,
|
300
300
|
include_bias: bool = True,
|
301
|
+
enable_scale_delta: bool = True,
|
301
302
|
) -> DrawnFnPairFactory:
|
302
303
|
assert not (order == 0 and not include_bias)
|
303
304
|
|
305
|
+
flexion_center = (
|
306
|
+
jnp.deg2rad(flexion_center_deg) if flexion_center_deg is not None else None
|
307
|
+
)
|
308
|
+
del flexion_center_deg
|
309
|
+
|
304
310
|
# because 0-th order is also counted
|
305
311
|
order += 1
|
306
312
|
powers = jnp.arange(order) if include_bias else jnp.arange(1, order)
|
@@ -316,13 +322,18 @@ def Polynomial_DrawnFnPair(
|
|
316
322
|
|
317
323
|
if flexion_center is None:
|
318
324
|
flexion_center = (flexion_mn + flexion_mx) / 2
|
325
|
+
|
326
|
+
if (order - 1) == 0:
|
327
|
+
method = "clip"
|
328
|
+
minval, maxval = mn, mx
|
319
329
|
else:
|
320
|
-
|
330
|
+
method = "minmax"
|
331
|
+
minval, maxval = -1.0, 1.0
|
321
332
|
|
322
333
|
def init(key):
|
323
334
|
c1, c2, c3 = jax.random.split(key, 3)
|
324
335
|
poly_factors = jax.random.uniform(
|
325
|
-
c1, shape=(len(powers),), minval
|
336
|
+
c1, shape=(len(powers),), minval=minval, maxval=maxval
|
326
337
|
)
|
327
338
|
q0 = jax.random.uniform(c2, minval=flexion_mn, maxval=flexion_mx)
|
328
339
|
values = jax.vmap(_apply_poly_factors, in_axes=(None, 0))(
|
@@ -330,16 +341,17 @@ def Polynomial_DrawnFnPair(
|
|
330
341
|
)
|
331
342
|
eps = 1e-6
|
332
343
|
amin, amax = jnp.min(values), jnp.max(values) + eps
|
333
|
-
|
334
|
-
|
335
|
-
|
344
|
+
if enable_scale_delta:
|
345
|
+
delta = amax - amin
|
346
|
+
scale_delta = jnp.clip(jax.random.normal(c3) + 0.5, 1.0)
|
347
|
+
amax = amin + delta * scale_delta
|
336
348
|
return amin, amax, poly_factors, q0
|
337
349
|
|
338
350
|
def _apply(params, q):
|
339
351
|
amin, amax, poly_factors, q0 = params
|
340
352
|
q = q - q0
|
341
353
|
value = _apply_poly_factors(poly_factors, q)
|
342
|
-
return restrict(value, mn, mx, amin, amax)
|
354
|
+
return restrict(value, mn, mx, amin, amax, method=method)
|
343
355
|
|
344
356
|
if center:
|
345
357
|
|
@@ -97,8 +97,10 @@ def batch_generators_eager_to_list(
|
|
97
97
|
for _ in range(n_calls):
|
98
98
|
key, consume = jax.random.split(key)
|
99
99
|
sample = gen_jit(consume)
|
100
|
-
# converts also to numpy
|
100
|
+
# converts also to numpy; but with np.array.flags.writeable = False
|
101
101
|
sample = jax.device_get(sample)
|
102
|
+
# this then sets this flag to True
|
103
|
+
sample = jax.tree_map(np.array, sample)
|
102
104
|
data.extend([jax.tree_map(lambda a: a[i], sample) for i in range(size)])
|
103
105
|
|
104
106
|
return data
|
@@ -424,14 +424,14 @@ def _draw_rxyz(
|
|
424
424
|
# TODO, delete these args and pass a modifified `config` with `replace` instead
|
425
425
|
enable_range_of_motion: bool = True,
|
426
426
|
free_spherical: bool = False,
|
427
|
+
# how often it should try to fullfill the dang_min/max and delta_ang_min/max conds
|
428
|
+
max_iter: int = 5,
|
427
429
|
) -> jax.Array:
|
428
430
|
key_value, consume = jax.random.split(key_value)
|
429
431
|
ANG_0 = jax.random.uniform(consume, minval=config.ang0_min, maxval=config.ang0_max)
|
430
432
|
# `random_angle_over_time` always returns wrapped angles, thus it would be
|
431
433
|
# inconsistent to allow an initial value that is not wrapped
|
432
434
|
ANG_0 = maths.wrap_to_pi(ANG_0)
|
433
|
-
# only used for `delta_ang_min_max` logic
|
434
|
-
max_iter = 5
|
435
435
|
return _random.random_angle_over_time(
|
436
436
|
key_t,
|
437
437
|
key_value,
|
@@ -573,6 +573,8 @@ class System(_Base):
|
|
573
573
|
new_zero: Optional[jax.Array] = None,
|
574
574
|
):
|
575
575
|
"By default damping, stiffness are set to zero."
|
576
|
+
from ring.algorithms import get_joint_model
|
577
|
+
|
576
578
|
q_size, qd_size = Q_WIDTHS[new_joint_type], QD_WIDTHS[new_joint_type]
|
577
579
|
|
578
580
|
def logic_unfreeze_to_spherical(link_name, olt, ola, old, ols, olz):
|
@@ -594,7 +596,13 @@ class System(_Base):
|
|
594
596
|
|
595
597
|
return nlt, nla, nld, nls, nlz
|
596
598
|
|
597
|
-
|
599
|
+
sys = _update_sys_if_replace_joint_type(self, logic_unfreeze_to_spherical)
|
600
|
+
|
601
|
+
jm = get_joint_model(new_joint_type)
|
602
|
+
if jm.init_joint_params is not None:
|
603
|
+
sys = sys.from_str(sys.to_str())
|
604
|
+
|
605
|
+
return sys
|
598
606
|
|
599
607
|
def findall_imus(self) -> list[str]:
|
600
608
|
return [name for name in self.link_names if name[:3] == "imu"]
|
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
|
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
|
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
|