feature-flow-cli 0.1.5__tar.gz → 0.1.6__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.
- {feature_flow_cli-0.1.5/feature_flow_cli.egg-info → feature_flow_cli-0.1.6}/PKG-INFO +3 -1
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/README.md +2 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow/__init__.py +1 -1
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow/command.py +1 -1
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow/install.py +75 -5
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6/feature_flow_cli.egg-info}/PKG-INFO +3 -1
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/install.py +1 -1
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/install.sh +1 -1
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/LICENSE +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/MANIFEST.in +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/adapters/codex/feature-flow/SKILL.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/adapters/codex/feature-flow/agents/openai.yaml +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/agents/feature-planner.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/agents/plan-reviewer.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/agents/ticket-builder.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/agents/ticket-reviewer.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow/__main__.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow/checks.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow/cli.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow/conductor.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow/floorguard.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow/gate.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow/git.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow/prompts.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow/released.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow/state.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow/status.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow/suggest.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow/tickets.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow/view.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow_cli.egg-info/SOURCES.txt +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow_cli.egg-info/dependency_links.txt +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow_cli.egg-info/entry_points.txt +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow_cli.egg-info/top_level.txt +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/guides/brief.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/guides/build.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/guides/plan-review.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/guides/plan.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/guides/review.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/guides/show.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/guides/templates/commands.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/guides/templates/learnings.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/guides/templates/map.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/guides/templates/spec.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/guides/templates/ticket.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/guides/templates/ui-mockup.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/pyproject.toml +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/scripts/floor-guard.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/scripts/flow-status.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/scripts/flow-view.html +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/scripts/flow-view.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/scripts/flow.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/scripts/gate.py +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/setup.cfg +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/skills/architect-review/SKILL.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/skills/automation-design/SKILL.md +0 -0
- {feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/skills/feature-flow/SKILL.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: feature-flow-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.6
|
|
4
4
|
Summary: A ticket-graph workflow for coding agents: installs the feature-flow skill into a repo
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
Project-URL: Homepage, https://github.com/hamilton-sky/feature-flow
|
|
@@ -55,6 +55,8 @@ The package puts a `feature-flow` command on your PATH with `install`, `status <
|
|
|
55
55
|
|
|
56
56
|
The installer lists what it wrote in `.feature-flow/installed.txt`, with each file's hash in `.feature-flow/installed.sha256`. Commit those files (`git add --pathspec-from-file=.feature-flow/installed.txt`); until you do, the flow does not count them as uncommitted changes. Installing a newer version over an older one updates every file nobody edited since it was installed, and keeps (and names) the ones you changed; `--force` replaces those too.
|
|
57
57
|
|
|
58
|
+
To keep the install out of git, so only your plans and tickets get committed, install with `--private`. It lists the installed files in `.git/info/exclude`, which git reads like `.gitignore` but never commits, and later installs keep that list up to date. If you already committed the install, it prints the `git rm --cached` command that untracks it and keeps the files. Every clone then needs its own install.
|
|
59
|
+
|
|
58
60
|
Then, in your repo, in the agent:
|
|
59
61
|
|
|
60
62
|
| | Claude Code | Codex |
|
|
@@ -36,6 +36,8 @@ The package puts a `feature-flow` command on your PATH with `install`, `status <
|
|
|
36
36
|
|
|
37
37
|
The installer lists what it wrote in `.feature-flow/installed.txt`, with each file's hash in `.feature-flow/installed.sha256`. Commit those files (`git add --pathspec-from-file=.feature-flow/installed.txt`); until you do, the flow does not count them as uncommitted changes. Installing a newer version over an older one updates every file nobody edited since it was installed, and keeps (and names) the ones you changed; `--force` replaces those too.
|
|
38
38
|
|
|
39
|
+
To keep the install out of git, so only your plans and tickets get committed, install with `--private`. It lists the installed files in `.git/info/exclude`, which git reads like `.gitignore` but never commits, and later installs keep that list up to date. If you already committed the install, it prints the `git rm --cached` command that untracks it and keeps the files. Every clone then needs its own install.
|
|
40
|
+
|
|
39
41
|
Then, in your repo, in the agent:
|
|
40
42
|
|
|
41
43
|
| | Claude Code | Codex |
|
|
@@ -12,7 +12,7 @@ from pathlib import Path
|
|
|
12
12
|
from feature_flow import __version__, cli, install, status, suggest, view
|
|
13
13
|
|
|
14
14
|
USAGE = """\
|
|
15
|
-
usage: feature-flow install [target-repo] [--agent claude|codex|all] [--user] [--force] [--dry-run]
|
|
15
|
+
usage: feature-flow install [target-repo] [--agent claude|codex|all] [--user] [--private] [--force] [--dry-run]
|
|
16
16
|
feature-flow status <feature> [--next | --counts | --check | --mermaid [plain] | --json]
|
|
17
17
|
feature-flow view <feature> [--watch] [--no-open] [--out FILE]
|
|
18
18
|
feature-flow reset <feature> [NN]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""The installer, ported from install.sh with the same report and exit codes.
|
|
2
2
|
|
|
3
|
-
usage: python3 install.py [target-repo] [--agent claude|codex|all] [--user] [--force] [--dry-run]
|
|
3
|
+
usage: python3 install.py [target-repo] [--agent claude|codex|all] [--user] [--private] [--force] [--dry-run]
|
|
4
4
|
copies the feature-flow skill, its roles, scripts and guides into a repo so the flow works there.
|
|
5
5
|
a file that already exists and differs is kept and reported, unless --force is given or nobody
|
|
6
6
|
edited it since an earlier feature-flow install wrote it (then it is updated).
|
|
@@ -23,7 +23,7 @@ from feature_flow.released import RELEASED
|
|
|
23
23
|
|
|
24
24
|
# the help text
|
|
25
25
|
USAGE = """\
|
|
26
|
-
usage: python3 install.py [target-repo] [--agent claude|codex|all] [--user] [--force] [--dry-run]
|
|
26
|
+
usage: python3 install.py [target-repo] [--agent claude|codex|all] [--user] [--private] [--force] [--dry-run]
|
|
27
27
|
copies the feature-flow skill, its roles, scripts and guides into a repo so the flow works there.
|
|
28
28
|
--agent claude (default)
|
|
29
29
|
skills go to <target>/.claude/skills/ (or ~/.claude/skills/ with --user)
|
|
@@ -36,6 +36,8 @@ copies the feature-flow skill, its roles, scripts and guides into a repo so the
|
|
|
36
36
|
(always: the skill and scripts/flow.py read them from the repo)
|
|
37
37
|
a file that already exists and differs is kept and reported, unless --force is given or it is
|
|
38
38
|
still exactly what an earlier feature-flow install wrote (then it is updated).
|
|
39
|
+
--private keeps the install out of git: its paths go into .git/info/exclude, which is never
|
|
40
|
+
committed, so only the plans and tickets are. Later installs keep that list up to date.
|
|
39
41
|
nothing is ever deleted. CLAUDE_HOME overrides ~/.claude and AGENTS_HOME overrides ~/.agents for --user.
|
|
40
42
|
"""
|
|
41
43
|
|
|
@@ -52,6 +54,9 @@ INSTALLED = ".feature-flow/installed.txt"
|
|
|
52
54
|
HASHES = ".feature-flow/installed.sha256"
|
|
53
55
|
# the same record for a --user install, in ~/.claude and ~/.agents, paths relative to that folder
|
|
54
56
|
USER_HASHES = "feature-flow.sha256"
|
|
57
|
+
# the lines a --private install keeps in .git/info/exclude, between these two markers
|
|
58
|
+
EXCLUDE_BEGIN = "# feature-flow install (--private): kept out of git"
|
|
59
|
+
EXCLUDE_END = "# end of feature-flow install"
|
|
55
60
|
|
|
56
61
|
|
|
57
62
|
def _sha256(data):
|
|
@@ -167,13 +172,14 @@ def _logical_cwd():
|
|
|
167
172
|
|
|
168
173
|
|
|
169
174
|
class Installer:
|
|
170
|
-
def __init__(self, here, target, agent, user_level, force, dry, out):
|
|
175
|
+
def __init__(self, here, target, agent, user_level, force, dry, out, private=False):
|
|
171
176
|
self.here = here
|
|
172
177
|
self.target = target
|
|
173
178
|
self.agent = agent
|
|
174
179
|
self.force = force
|
|
175
180
|
self.dry = dry
|
|
176
181
|
self.out = out
|
|
182
|
+
self.private = private
|
|
177
183
|
if user_level:
|
|
178
184
|
home = os.environ.get("HOME", "")
|
|
179
185
|
self.claude_dir = os.environ.get("CLAUDE_HOME") or home + "/.claude"
|
|
@@ -340,6 +346,50 @@ class Installer:
|
|
|
340
346
|
os.replace(tmp, path)
|
|
341
347
|
return True
|
|
342
348
|
|
|
349
|
+
def exclude_file(self):
|
|
350
|
+
"""The repo's .git/info/exclude (a worktree's shared one too), or None outside a git repo."""
|
|
351
|
+
try:
|
|
352
|
+
r = subprocess.run(["git", "-C", self.target, "rev-parse", "--git-path", "info/exclude"],
|
|
353
|
+
stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, universal_newlines=True)
|
|
354
|
+
except OSError:
|
|
355
|
+
return None
|
|
356
|
+
path = r.stdout.strip()
|
|
357
|
+
if r.returncode != 0 or not path:
|
|
358
|
+
return None
|
|
359
|
+
return os.path.normpath(os.path.join(self.target, path))
|
|
360
|
+
|
|
361
|
+
def excluded(self):
|
|
362
|
+
"""An earlier --private install left its block in .git/info/exclude: keep the install private."""
|
|
363
|
+
path = self.exclude_file()
|
|
364
|
+
return path is not None and EXCLUDE_BEGIN in _read_text(path).splitlines()
|
|
365
|
+
|
|
366
|
+
def write_exclude(self, path):
|
|
367
|
+
"""Put every in-repo file of the install between the markers in .git/info/exclude, keeping the
|
|
368
|
+
user's own lines. True when the file changed."""
|
|
369
|
+
try:
|
|
370
|
+
with open(path, encoding="utf-8") as f:
|
|
371
|
+
lines = f.read().splitlines()
|
|
372
|
+
except (OSError, UnicodeDecodeError):
|
|
373
|
+
lines = []
|
|
374
|
+
if EXCLUDE_BEGIN in lines and EXCLUDE_END in lines[lines.index(EXCLUDE_BEGIN):]:
|
|
375
|
+
start = lines.index(EXCLUDE_BEGIN)
|
|
376
|
+
end = lines.index(EXCLUDE_END, start)
|
|
377
|
+
del lines[start:end + 1]
|
|
378
|
+
names = [n.strip() for n in _read_text(self.target + "/" + INSTALLED).splitlines()]
|
|
379
|
+
block = ["/.feature-flow/"] + ["/" + n for n in names if n and not n.startswith(".feature-flow/")]
|
|
380
|
+
text = "\n".join(lines + [EXCLUDE_BEGIN] + block + [EXCLUDE_END]) + "\n"
|
|
381
|
+
return self._write(path, text)
|
|
382
|
+
|
|
383
|
+
def tracked_installed(self):
|
|
384
|
+
"""The installed files git already tracks: an exclude line does not untrack them."""
|
|
385
|
+
try:
|
|
386
|
+
r = subprocess.run(["git", "-C", self.target, "ls-files", "-z", "--full-name"],
|
|
387
|
+
stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, universal_newlines=True)
|
|
388
|
+
except OSError:
|
|
389
|
+
return []
|
|
390
|
+
names = set(_read_text(self.target + "/" + INSTALLED).splitlines())
|
|
391
|
+
return [n for n in r.stdout.split("\0") if n in names]
|
|
392
|
+
|
|
343
393
|
def report_leftovers(self, dirs):
|
|
344
394
|
"""A skill folder this installer does not own but that drives the flow (it runs the ticket
|
|
345
395
|
scripts or ends a review with a verdict) is left from an earlier version: named once, never deleted."""
|
|
@@ -391,6 +441,16 @@ class Installer:
|
|
|
391
441
|
git = 127
|
|
392
442
|
if git != 0:
|
|
393
443
|
self.out("note: %s is not a git repository, and the flow needs one" % self.target)
|
|
444
|
+
elif self.private or self.excluded():
|
|
445
|
+
self.private = True
|
|
446
|
+
exclude = self.exclude_file()
|
|
447
|
+
if exclude and self.write_exclude(exclude):
|
|
448
|
+
self.out("kept out of git: the install is listed in " + os.path.relpath(exclude, self.target)
|
|
449
|
+
.replace(os.sep, "/") + ", which is never committed")
|
|
450
|
+
if self.tracked_installed():
|
|
451
|
+
self.out("note: git still tracks the install from before. untrack it, keeping the files: "
|
|
452
|
+
"git rm -r -q --cached --ignore-unmatch --pathspec-from-file=%s"
|
|
453
|
+
' && git commit -m "chore: stop tracking feature-flow"' % INSTALLED)
|
|
394
454
|
elif self.added or self.updated or listed:
|
|
395
455
|
git_c = ""
|
|
396
456
|
if os.path.realpath(self.target) != os.path.realpath(os.getcwd()):
|
|
@@ -406,9 +466,17 @@ class Installer:
|
|
|
406
466
|
return 0
|
|
407
467
|
|
|
408
468
|
|
|
469
|
+
def _read_text(path):
|
|
470
|
+
data = _read(path)
|
|
471
|
+
try:
|
|
472
|
+
return data.decode("utf-8") if data is not None else ""
|
|
473
|
+
except UnicodeDecodeError:
|
|
474
|
+
return ""
|
|
475
|
+
|
|
476
|
+
|
|
409
477
|
def parse(argv):
|
|
410
478
|
"""The options, read in order like the bash case statement. Returns a dict, or None for --help."""
|
|
411
|
-
opts = {"target": "", "agent": "claude", "user": False, "force": False, "dry": False}
|
|
479
|
+
opts = {"target": "", "agent": "claude", "user": False, "private": False, "force": False, "dry": False}
|
|
412
480
|
i = 0
|
|
413
481
|
while i < len(argv):
|
|
414
482
|
a = argv[i]
|
|
@@ -421,6 +489,8 @@ def parse(argv):
|
|
|
421
489
|
opts["agent"] = a[len("--agent="):]
|
|
422
490
|
elif a == "--user":
|
|
423
491
|
opts["user"] = True
|
|
492
|
+
elif a == "--private":
|
|
493
|
+
opts["private"] = True
|
|
424
494
|
elif a == "--force":
|
|
425
495
|
opts["force"] = True
|
|
426
496
|
elif a == "--dry-run":
|
|
@@ -455,7 +525,7 @@ def run(argv, here, out, err):
|
|
|
455
525
|
return 2
|
|
456
526
|
target = os.path.normpath(os.path.join(_logical_cwd(), target))
|
|
457
527
|
installer = Installer(os.path.abspath(str(here)), target, opts["agent"], opts["user"],
|
|
458
|
-
opts["force"], opts["dry"], out)
|
|
528
|
+
opts["force"], opts["dry"], out, opts["private"])
|
|
459
529
|
return installer.run()
|
|
460
530
|
|
|
461
531
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: feature-flow-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.6
|
|
4
4
|
Summary: A ticket-graph workflow for coding agents: installs the feature-flow skill into a repo
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
Project-URL: Homepage, https://github.com/hamilton-sky/feature-flow
|
|
@@ -55,6 +55,8 @@ The package puts a `feature-flow` command on your PATH with `install`, `status <
|
|
|
55
55
|
|
|
56
56
|
The installer lists what it wrote in `.feature-flow/installed.txt`, with each file's hash in `.feature-flow/installed.sha256`. Commit those files (`git add --pathspec-from-file=.feature-flow/installed.txt`); until you do, the flow does not count them as uncommitted changes. Installing a newer version over an older one updates every file nobody edited since it was installed, and keeps (and names) the ones you changed; `--force` replaces those too.
|
|
57
57
|
|
|
58
|
+
To keep the install out of git, so only your plans and tickets get committed, install with `--private`. It lists the installed files in `.git/info/exclude`, which git reads like `.gitignore` but never commits, and later installs keep that list up to date. If you already committed the install, it prints the `git rm --cached` command that untracks it and keeps the files. Every clone then needs its own install.
|
|
59
|
+
|
|
58
60
|
Then, in your repo, in the agent:
|
|
59
61
|
|
|
60
62
|
| | Claude Code | Codex |
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""The feature-flow installer. usage: python3 install.py [target-repo] [--agent claude|codex|all] [--user] [--force] [--dry-run]"""
|
|
2
|
+
"""The feature-flow installer. usage: python3 install.py [target-repo] [--agent claude|codex|all] [--user] [--private] [--force] [--dry-run]"""
|
|
3
3
|
import sys
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
# usage: bash install.sh [target-repo] [--agent claude|codex|all] [--user] [--force] [--dry-run]
|
|
2
|
+
# usage: bash install.sh [target-repo] [--agent claude|codex|all] [--user] [--private] [--force] [--dry-run]
|
|
3
3
|
# runs the Python installer next to this file; python3 install.py --help says what it does.
|
|
4
4
|
exec python3 "$(dirname "$0")/install.py" "$@"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/adapters/codex/feature-flow/agents/openai.yaml
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
|
{feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow_cli.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{feature_flow_cli-0.1.5 → feature_flow_cli-0.1.6}/feature_flow_cli.egg-info/entry_points.txt
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
|