processforge 0.3.19__tar.gz → 0.3.20__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.
- {processforge-0.3.19/src/processforge.egg-info → processforge-0.3.20}/PKG-INFO +1 -1
- {processforge-0.3.19 → processforge-0.3.20}/pyproject.toml +1 -1
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/cli/run.py +19 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/state.py +35 -15
- {processforge-0.3.19 → processforge-0.3.20/src/processforge.egg-info}/PKG-INFO +1 -1
- {processforge-0.3.19 → processforge-0.3.20}/LICENSE +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/MANIFEST.in +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/README.md +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/flowsheets/closed-loop-chain.json +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/flowsheets/coupled/msre_coupled.json +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/flowsheets/custom/crimson/MUWS_HB.json +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/flowsheets/custom/simple_hyrdaulic_scheme.json +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/flowsheets/festim/hydrogen_transport_1d.json +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/flowsheets/festim/tds_tungsten.json +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/flowsheets/hydraulic-chain.json +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/flowsheets/openmc/msre_eigenvalue.json +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/setup.cfg +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/__init__.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/__main__.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/_schema.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/analysis/__init__.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/analysis/dof.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/api/__init__.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/api/serve.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/cli/__init__.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/cli/apply.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/cli/common.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/cli/diagram.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/cli/display.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/cli/export_fmu.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/cli/export_modelica.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/cli/init.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/cli/plan.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/cli/validate.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/compose.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/coupling.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/__init__.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/backends/__init__.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/backends/base.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/backends/casadi_backend.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/backends/pyomo_backend.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/backends/scipy_backend.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/flowsheet.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/jacobian.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/mixin.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/solver.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/stream_var.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/units/__init__.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/units/flash_eo.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/units/heater_eo.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/units/pipes_eo.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/units/pump_eo.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/units/strainer_eo.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/eo/units/valve_eo.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/flowsheet.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/fmu/__init__.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/fmu/_fmi_vars.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/fmu/builder.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/fmu/slave_template.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/lock.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/modelica/__init__.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/modelica/mo_writer.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/modelica/omc_runner.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/modelica/transpiler.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/modelica/unit_equations.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/output_collector.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/pcl/__init__.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/pcl/compiler.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/pcl/namespace.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/persistence/__init__.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/persistence/archive.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/persistence/artifact_store.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/provenance.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/__init__.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/base.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/base_jacobian_mixin.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/cantera_jacobian.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/cantera_provider.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/container_client.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/coolprop_provider.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/errors.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/festim_provider.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/jacobian_contributor.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/manager.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/modelica_jacobian.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/modelica_provider.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/openmc_provider.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/reference_state_registry.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/registry.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/quantity.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/result.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/result_schema.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/schemas/__init__.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/schemas/festim/festim_model.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/schemas/flowsheet_schema.json +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/schemas/openmc/openmc_model.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/simulate.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/solver.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/thermo.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/types.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/units/__init__.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/units/base.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/units/cstr.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/units/flash.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/units/heater.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/units/pfr.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/units/pipes.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/units/pump.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/units/registry.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/units/solver_unit.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/units/strainer.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/units/tank.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/units/valve.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/utils/__init__.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/utils/flowsheet_diagram.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/utils/mermaid_diagram.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/utils/s3_upload.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/utils/topology.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/utils/unit_consistency.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/utils/validate_flowsheet.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge/utils/validation.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge.egg-info/SOURCES.txt +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge.egg-info/dependency_links.txt +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge.egg-info/entry_points.txt +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge.egg-info/requires.txt +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/src/processforge.egg-info/top_level.txt +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/tests/test_cli.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/tests/test_container_client.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/tests/test_coupling.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/tests/test_festim_provider.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/tests/test_festim_schema.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/tests/test_init.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/tests/test_openmc_provider.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/tests/test_provider_errors.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/tests/test_providers.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/tests/test_result_zarr.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/tests/test_s3_upload.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/tests/test_state.py +0 -0
- {processforge-0.3.19 → processforge-0.3.20}/tests/test_types.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "processforge"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.20"
|
|
8
8
|
description = "A Python-based process simulation framework for chemical engineering applications."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "BSD-3-Clause"
|
|
@@ -102,6 +102,7 @@ def run(
|
|
|
102
102
|
raise SystemExit(1)
|
|
103
103
|
|
|
104
104
|
run_info = build_run_info(config, x0=x0, var_names=var_names)
|
|
105
|
+
snap_x, snap_vn, snap_backend, snap_ok = x0, var_names, "dynamic", True
|
|
105
106
|
else:
|
|
106
107
|
# Pass None so EOFlowsheet resolves backend from config (with scipy default).
|
|
107
108
|
fs = EOFlowsheet(config, backend=None)
|
|
@@ -117,6 +118,9 @@ def run(
|
|
|
117
118
|
logger.warning("Steady-state simulation did NOT converge. Results may be unreliable.")
|
|
118
119
|
|
|
119
120
|
run_info = build_run_info(config, x0=fs.x0, var_names=fs.var_names)
|
|
121
|
+
snap_x, snap_vn = fs.x_converged, fs.var_names
|
|
122
|
+
snap_backend = getattr(fs, "backend", "scipy")
|
|
123
|
+
snap_ok = bool(getattr(fs, "converged", False))
|
|
120
124
|
|
|
121
125
|
# Propagate run context to any containerized providers so their S3 uploads
|
|
122
126
|
# are keyed by the same run_id/flowsheet_hash as this archive run.
|
|
@@ -134,6 +138,21 @@ def run(
|
|
|
134
138
|
}
|
|
135
139
|
archive.save_run(manifest, stream_results=stream_results)
|
|
136
140
|
|
|
141
|
+
# Persist a StateManager snapshot so `pf plan` (and `pf apply`) can diff
|
|
142
|
+
# against this run as a baseline. Without it, `pf plan` always reports
|
|
143
|
+
# "No prior state found" and never surfaces flowsheet edits.
|
|
144
|
+
if (is_dynamic or snap_ok) and snap_x is not None:
|
|
145
|
+
try:
|
|
146
|
+
from .common import build_run_metadata, save_snapshot
|
|
147
|
+
|
|
148
|
+
meta = build_run_metadata(config, 1e-6, 50, snap_backend)
|
|
149
|
+
save_snapshot(
|
|
150
|
+
archive, config, snap_x, snap_vn,
|
|
151
|
+
metadata=meta, parent_snapshot_id=None, label="run state",
|
|
152
|
+
)
|
|
153
|
+
except Exception as e:
|
|
154
|
+
logger.warning(f"Failed to save state snapshot: {type(e).__name__}: {e}")
|
|
155
|
+
|
|
137
156
|
# Always persist a Zarr copy of the standardized outputs (fields + artifacts)
|
|
138
157
|
# inside the archive. Works for every provider (OpenMC, CoolProp, FESTIM,
|
|
139
158
|
# Cantera) and for both local and remote docker runs — remote artifacts
|
|
@@ -302,27 +302,47 @@ class StateManager:
|
|
|
302
302
|
if ov != nv:
|
|
303
303
|
changes.append(f"{key}: {ov!r} → {nv!r}")
|
|
304
304
|
|
|
305
|
-
# Parameter changes
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
changes.append(f"{k}: {ov} → {nv}")
|
|
312
|
-
|
|
313
|
-
# Nested "parameters" dict
|
|
314
|
-
old_params = old_cfg.get("parameters", {})
|
|
315
|
-
new_params = new_cfg.get("parameters", {})
|
|
316
|
-
for pk in set(old_params) | set(new_params):
|
|
317
|
-
ov, nv = old_params.get(pk), new_params.get(pk)
|
|
318
|
-
if ov != nv:
|
|
319
|
-
changes.append(f"parameters.{pk}: {ov} → {nv}")
|
|
305
|
+
# Parameter changes — recurse into nested dicts so leaf values
|
|
306
|
+
# (e.g. solver_config.batches) are reported individually rather
|
|
307
|
+
# than dumping the whole dict.
|
|
308
|
+
changes.extend(
|
|
309
|
+
StateManager._diff_params(old_cfg, new_cfg)
|
|
310
|
+
)
|
|
320
311
|
|
|
321
312
|
if changes:
|
|
322
313
|
modified[name] = {"type": new_cfg.get("type", "?"), "changes": changes}
|
|
323
314
|
|
|
324
315
|
return {"added": added, "removed": removed, "modified": modified}
|
|
325
316
|
|
|
317
|
+
# ------------------------------------------------------------------
|
|
318
|
+
# Structural-diff helpers
|
|
319
|
+
# ------------------------------------------------------------------
|
|
320
|
+
@staticmethod
|
|
321
|
+
def _diff_params(
|
|
322
|
+
old_cfg: dict, new_cfg: dict, prefix: str = "", skip: set | None = None
|
|
323
|
+
) -> list[str]:
|
|
324
|
+
"""Recursively collect changed scalar/leaf params between two dicts.
|
|
325
|
+
|
|
326
|
+
Nested dicts are descended (``solver_config.batches: 25 → 999``) so the
|
|
327
|
+
structural diff reports leaf-level changes instead of whole-dict blobs.
|
|
328
|
+
"""
|
|
329
|
+
if skip is None:
|
|
330
|
+
skip = {"type", "in", "out", "out_vap", "out_liq", "provider"}
|
|
331
|
+
all_keys = set(old_cfg) | set(new_cfg)
|
|
332
|
+
if not prefix:
|
|
333
|
+
all_keys -= skip
|
|
334
|
+
changes: list[str] = []
|
|
335
|
+
for k in all_keys:
|
|
336
|
+
ov, nv = old_cfg.get(k), new_cfg.get(k)
|
|
337
|
+
label = f"{prefix}{k}"
|
|
338
|
+
if isinstance(ov, dict) and isinstance(nv, dict):
|
|
339
|
+
changes.extend(
|
|
340
|
+
StateManager._diff_params(ov, nv, prefix=f"{label}.", skip=set())
|
|
341
|
+
)
|
|
342
|
+
elif ov != nv:
|
|
343
|
+
changes.append(f"{label}: {ov} → {nv}")
|
|
344
|
+
return changes
|
|
345
|
+
|
|
326
346
|
# ------------------------------------------------------------------
|
|
327
347
|
# State → stream dict conversion (for dynamic t=0 initialisation)
|
|
328
348
|
# ------------------------------------------------------------------
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/base_jacobian_mixin.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/jacobian_contributor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{processforge-0.3.19 → processforge-0.3.20}/src/processforge/providers/reference_state_registry.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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|