haliax 1.4.dev438__tar.gz → 1.4.dev441__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.
- {haliax-1.4.dev438 → haliax-1.4.dev441}/PKG-INFO +1 -1
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/api.md +31 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/__about__.py +1 -1
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/__init__.py +1 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/mup.py +1 -1
- haliax-1.4.dev441/src/haliax/tree.py +59 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/.agents/projects/api_parity.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/.coveragerc +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/.flake8 +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/.github/workflows/publish_dev.yaml +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/.github/workflows/run_pre_commit.yaml +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/.github/workflows/run_quick_levanter_tests.yaml +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/.github/workflows/run_tests.yaml +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/.gitignore +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/.playbooks/add-types.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/.playbooks/wrap-non-named.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/.pre-commit-config.yaml +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/.readthedocs.yaml +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/AGENTS.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/AUTHORS.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/CONTRIBUTING.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/CONTRIBUTORS.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/LICENSE +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/README.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/broadcasting.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/cheatsheet.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/css/material.css +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/css/mkdocstrings.css +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/faq.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/data_parallel_mesh.png +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/data_parallel_mesh_replicated.png +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/device_mesh_1d.png +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/device_mesh_1d_zero.png +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/device_mesh_2d.png +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/device_mesh_2d_batch_partitioned.png +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/device_mesh_2d_data_replicated.png +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/device_mesh_2d_data_replicated_mlp_partitioned.png +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/device_mesh_2d_intermediate_fully_partitioned.png +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/figures/device_mesh_2d_zero.png +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/fp8.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/index.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/indexing.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/matmul.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/nn.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/partitioning.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/primer.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/rearrange.ipynb +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/rearrange.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/requirements.txt +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/scan.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/state-dict.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/tutorial.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/typing.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/docs/vmap.md +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/etc/license_header.txt +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/mkdocs.yml +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/pyproject.toml +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/__init__.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/compile_utils.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/dot.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/einsum.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/fp8.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/parsing.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/rearrange.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/scan.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/state_dict.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/_src/util.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/axis.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/core.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/debug.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/fft.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/field.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/haxtyping.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/hof.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/jax_utils.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/__init__.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/activations.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/attention.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/conv.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/dropout.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/embedding.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/linear.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/loss.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/mlp.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/normalization.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/pool.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/nn/scan.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/ops.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/partitioning.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/poly.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/quantization.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/random.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/specialized_fns.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/state_dict.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/tree_util.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/types.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/util.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/src/haliax/wrap.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/core_test.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_attention.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_axis.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_bitwise_ops.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_conv.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_debug.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_dot.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_dtype_typing.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_einsum.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_fft.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_field.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_fp8.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_hof.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_int8.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_moe_linear.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_mup_coordinate_check.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_mup_embedding.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_mup_linear.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_namedarray_typing.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_nan_reductions.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_nn.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_ops.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_parsing.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_partitioning.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_poly_ops.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_pool.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_random.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_rearrange.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_scan.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_scatter_gather.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_specialized_fns.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_state_dict.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_tree_util.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_utils.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/tests/test_visualize_sharding.py +0 -0
- {haliax-1.4.dev438 → haliax-1.4.dev441}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: haliax
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.dev441
|
|
4
4
|
Summary: Named Tensors for Legible Deep Learning in JAX
|
|
5
5
|
Project-URL: Homepage, https://github.com/stanford-crfm/haliax
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/stanford-crfm/haliax/issues/
|
|
@@ -4,6 +4,37 @@ that we use names (either strings or [haliax.Axis][] objects) to specify axes in
|
|
|
4
4
|
arrays (see [haliax.zeros][] and [haliax.ones][]) as well as things like reductions (see [haliax.sum][] and
|
|
5
5
|
[haliax.mean][]).
|
|
6
6
|
|
|
7
|
+
## PyTree Helpers
|
|
8
|
+
|
|
9
|
+
PyTrees are the lingua franca for composing state in JAX ecosystems. Haliax provides drop-in replacements for the
|
|
10
|
+
[`jax.tree`][] helpers that are aware of [`NamedArray`][haliax.NamedArray] semantics. They preserve axis metadata across
|
|
11
|
+
transformations while interoperating with standard JAX containers, so you can use them anywhere you would have reached
|
|
12
|
+
for JAX's versions.
|
|
13
|
+
|
|
14
|
+
Use these helpers whenever you need to map, flatten, or rebuild PyTrees that might include `NamedArray` instances:
|
|
15
|
+
|
|
16
|
+
* [`haliax.tree.map`][] mirrors [`jax.tree.map`][] but forwards to Haliax's [`haliax.tree_util.tree_map`][] so axis names remain
|
|
17
|
+
intact.
|
|
18
|
+
* [`haliax.tree.scan_aware_map`][] descends into [`haliax.nn.Stacked`][haliax.nn.Stacked] modules so that each layer is
|
|
19
|
+
transformed individually, effectively treating them as if they were unrolled when applying
|
|
20
|
+
[`haliax.tree_util.scan_aware_tree_map`][].
|
|
21
|
+
* [`haliax.tree.flatten`][] / [`haliax.tree.unflatten`][] match the familiar flattening API while handling `NamedArray`
|
|
22
|
+
payloads safely.
|
|
23
|
+
* [`haliax.tree.leaves`][] and [`haliax.tree.structure`][] provide direct access to the leaves and PyTree structure.
|
|
24
|
+
|
|
25
|
+
All of these helpers accept the same `is_leaf` hook you might already use with JAX's utilities. They should be the first
|
|
26
|
+
tools you reach for when you need deterministic tree transforms that understand named axes.
|
|
27
|
+
|
|
28
|
+
::: haliax.tree.map
|
|
29
|
+
::: haliax.tree.scan_aware_map
|
|
30
|
+
::: haliax.tree.flatten
|
|
31
|
+
::: haliax.tree.unflatten
|
|
32
|
+
::: haliax.tree.leaves
|
|
33
|
+
::: haliax.tree.structure
|
|
34
|
+
|
|
35
|
+
[`jax.tree`]: https://jax.readthedocs.io/en/latest/_autosummary/jax.tree.html
|
|
36
|
+
[`jax.tree.map`]: https://jax.readthedocs.io/en/latest/_autosummary/jax.tree.map.html
|
|
37
|
+
|
|
7
38
|
## Axis Types
|
|
8
39
|
|
|
9
40
|
If you already speak NumPy or `jax.numpy`, think of Haliax as swapping positional axes (`axis=0`) for named axes
|
|
@@ -16,6 +16,7 @@ import haliax.nn as nn
|
|
|
16
16
|
import haliax.quantization as quantization
|
|
17
17
|
import haliax.random as random
|
|
18
18
|
import haliax.state_dict as state_dict
|
|
19
|
+
import haliax.tree as tree # noqa: F401
|
|
19
20
|
import haliax.tree_util as tree_util
|
|
20
21
|
import haliax.util as util
|
|
21
22
|
from .field import field
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Copyright 2025 The Levanter Authors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
"""Convenience wrappers for :mod:`haliax.tree_util` that mirror :mod:`jax.tree`."""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from typing import Any, Callable, Iterable, Sequence, TypeVar
|
|
10
|
+
|
|
11
|
+
from . import tree_util
|
|
12
|
+
|
|
13
|
+
T = TypeVar("T")
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def map(fn: Callable[..., T], tree: Any, *rest: Any, is_leaf: Callable[[Any], bool] | None = None) -> Any:
|
|
17
|
+
"""Alias for :func:`haliax.tree_util.tree_map` matching :func:`jax.tree.map`."""
|
|
18
|
+
|
|
19
|
+
return tree_util.tree_map(fn, tree, *rest, is_leaf=is_leaf)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def scan_aware_map(fn: Callable[..., T], tree: Any, *rest: Any, is_leaf: Callable[[Any], bool] | None = None) -> Any:
|
|
23
|
+
"""Alias for :func:`haliax.tree_util.scan_aware_tree_map` with :mod:`jax.tree` style naming."""
|
|
24
|
+
|
|
25
|
+
return tree_util.scan_aware_tree_map(fn, tree, *rest, is_leaf=is_leaf)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def flatten(tree: Any, *, is_leaf: Callable[[Any], bool] | None = None) -> tuple[Sequence[Any], Any]:
|
|
29
|
+
"""Alias for :func:`haliax.tree_util.tree_flatten` matching :func:`jax.tree.flatten`."""
|
|
30
|
+
|
|
31
|
+
return tree_util.tree_flatten(tree, is_leaf=is_leaf)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def unflatten(treedef: Any, leaves: Iterable[Any]) -> Any:
|
|
35
|
+
"""Alias for :func:`haliax.tree_util.tree_unflatten` matching :func:`jax.tree.unflatten`."""
|
|
36
|
+
|
|
37
|
+
return tree_util.tree_unflatten(treedef, leaves)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def leaves(tree: Any, *, is_leaf: Callable[[Any], bool] | None = None) -> Sequence[Any]:
|
|
41
|
+
"""Alias for :func:`haliax.tree_util.tree_leaves` matching :func:`jax.tree.leaves`."""
|
|
42
|
+
|
|
43
|
+
return tree_util.tree_leaves(tree, is_leaf=is_leaf)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def structure(tree: Any, *, is_leaf: Callable[[Any], bool] | None = None) -> Any:
|
|
47
|
+
"""Alias for :func:`haliax.tree_util.tree_structure` matching :func:`jax.tree.structure`."""
|
|
48
|
+
|
|
49
|
+
return tree_util.tree_structure(tree, is_leaf=is_leaf)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
__all__ = [
|
|
53
|
+
"map",
|
|
54
|
+
"scan_aware_map",
|
|
55
|
+
"flatten",
|
|
56
|
+
"unflatten",
|
|
57
|
+
"leaves",
|
|
58
|
+
"structure",
|
|
59
|
+
]
|
|
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
|
|
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
|