Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
# Changelog

## [1.58.6.0] - 2026-06-28

## **gstack runs on Windows 11 under Smart App Control without OS bypass.**
## **Resolvers automatically detect binary execution blocks and fall back to source invocation via `bun run`.**

On Windows 11 with Smart App Control (SAC) enabled, the unsigned binaries bundled with gstack (`browse.exe`, `design.exe`, and `pdf.exe`) are blocked from executing by the OS safety policies. To support Windows developers without requiring them to permanently disable SAC or purchase developer certs, gstack now automatically detects execution failure during setup validation and falls back to invoking the TypeScript source directly via `bun run` (e.g. `bun run browse/src/cli.ts`). Since the `bun` interpreter itself is code-signed and trusted by Windows, it executes the skill logic successfully. Additionally, binary discovery shim paths are updated to prioritize `.exe` suffixes for compatibility under Git-Bash environment.

### Added
- Setup resolver detection of binary execution failure with `bun run` fallback for `browse`, `design`, and `make-pdf` skills.

### Changed
- Prioritized `.exe` executable searches in `browse/bin/find-browse` and resolver templates to ensure correct resolution on Windows under Git-Bash.

## [1.58.5.0] - 2026-06-21

## **A fresh install now lands on a concrete first move, not a dead end.**
Expand Down
8 changes: 8 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,14 @@ structures. Instead:
This applies to test commands, eval commands, deploy commands, and any other
project-specific behavior. The project owns its config; gstack reads it.

## Windows Smart App Control (SAC) & git-bash

On Windows 11 with Smart App Control (SAC) enabled, unsigned local binaries compiled by Bun (e.g. `browse.exe`, `design.exe`, `pdf.exe`) are blocked by the OS policy.
To resolve this without requiring irreversible OS changes (disabling SAC), gstack implements an automatic fallback:
- The setup check templates in `scripts/resolvers/` verify if the compiled binary can execute.
- If execution is blocked, they automatically fall back to invoking the TS files via `bun run` (e.g., `bun run browse/src/cli.ts`). Since `bun` itself is signed and trusted, it runs successfully.
- For Git-Bash support, binary resolution logic always prioritizes checking the `.exe` extension version over the extension-less paths.

## Writing SKILL templates

SKILL.md.tmpl files are **prompt templates read by Claude**, not bash scripts.
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -468,7 +468,7 @@ Data is stored in [Supabase](https://supabase.com) (open source Firebase alterna

**Codex says "Skipped loading skill(s) due to invalid SKILL.md"?** Your Codex skill descriptions are stale. Fix: `cd ~/.codex/skills/gstack && git pull && ./setup --host codex` — or for repo-local installs: `cd "$(readlink -f .agents/skills/gstack)" && git pull && ./setup --host codex`

**Windows users:** gstack works on Windows 11 via Git Bash or WSL. Node.js is required in addition to Bun — Bun has a known bug with Playwright's pipe transport on Windows ([bun#4253](https://github.com/oven-sh/bun/issues/4253)). The browse server automatically falls back to Node.js. Make sure both `bun` and `node` are on your PATH.
**Windows users:** gstack works on Windows 11 via Git Bash or WSL. Node.js is required in addition to Bun — Bun has a known bug with Playwright's pipe transport on Windows ([bun#4253](https://github.com/oven-sh/bun/issues/4253)). The browse server automatically falls back to Node.js. Make sure both `bun` and `node` are on your PATH. Additionally, if Windows Smart App Control (SAC) blocks execution of local compiled binaries (`browse.exe`, `design.exe`, `pdf.exe`), setup resolvers automatically fall back to running the TypeScript sources directly via `bun run`.

On Windows without Developer Mode (MSYS2 / Git Bash), `setup` falls back to file copies instead of symlinks because `ln -snf` produces frozen copies that don't refresh on `git pull`. **Re-run `cd ~/.claude/skills/gstack && ./setup` after every `git pull`** so your skill files match the repo. `setup` prints a one-line note reminding you. Unix and WSL keep symlinks and don't need the re-run.

Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.58.5.0
1.58.6.0
27 changes: 24 additions & 3 deletions benchmark/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -540,9 +540,30 @@ Skills that run plan reviews (`/plan-*-review`, `/codex review`) include the EXI
```bash
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
B=""
[ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ] && B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
[ -z "$B" ] && B="$HOME/.claude/skills/gstack/browse/dist/browse"
if [ -x "$B" ]; then
if [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse.exe" ]; then
B="$_ROOT/.claude/skills/gstack/browse/dist/browse.exe"
elif [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ]; then
B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
elif [ -x "$HOME/.claude/skills/gstack/browse/dist/browse.exe" ]; then
B="$HOME/.claude/skills/gstack/browse/dist/browse.exe"
elif [ -x "$HOME/.claude/skills/gstack/browse/dist/browse" ]; then
B="$HOME/.claude/skills/gstack/browse/dist/browse"
fi
B_OK=0
if [ -n "$B" ] && [ -x "$B" ]; then
if "$B" status >/dev/null 2>&1; then
B_OK=1
else
if command -v bun >/dev/null 2>&1 && [ -f "$_ROOT/.claude/skills/gstack/browse/src/cli.ts" ]; then
B="bun run $_ROOT/.claude/skills/gstack/browse/src/cli.ts"
B_OK=1
elif command -v bun >/dev/null 2>&1 && [ -f "$HOME/.claude/skills/gstack/browse/src/cli.ts" ]; then
B="bun run $HOME/.claude/skills/gstack/browse/src/cli.ts"
B_OK=1
fi
fi
fi
if [ "$B_OK" -eq 1 ]; then
echo "READY: $B"
else
echo "NEEDS_SETUP"
Expand Down
27 changes: 24 additions & 3 deletions browse/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -543,9 +543,30 @@ State persists between calls (cookies, tabs, login sessions).
```bash
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
B=""
[ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ] && B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
[ -z "$B" ] && B="$HOME/.claude/skills/gstack/browse/dist/browse"
if [ -x "$B" ]; then
if [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse.exe" ]; then
B="$_ROOT/.claude/skills/gstack/browse/dist/browse.exe"
elif [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ]; then
B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
elif [ -x "$HOME/.claude/skills/gstack/browse/dist/browse.exe" ]; then
B="$HOME/.claude/skills/gstack/browse/dist/browse.exe"
elif [ -x "$HOME/.claude/skills/gstack/browse/dist/browse" ]; then
B="$HOME/.claude/skills/gstack/browse/dist/browse"
fi
B_OK=0
if [ -n "$B" ] && [ -x "$B" ]; then
if "$B" status >/dev/null 2>&1; then
B_OK=1
else
if command -v bun >/dev/null 2>&1 && [ -f "$_ROOT/.claude/skills/gstack/browse/src/cli.ts" ]; then
B="bun run $_ROOT/.claude/skills/gstack/browse/src/cli.ts"
B_OK=1
elif command -v bun >/dev/null 2>&1 && [ -f "$HOME/.claude/skills/gstack/browse/src/cli.ts" ]; then
B="bun run $HOME/.claude/skills/gstack/browse/src/cli.ts"
B_OK=1
fi
fi
fi
if [ "$B_OK" -eq 1 ]; then
echo "READY: $B"
else
echo "NEEDS_SETUP"
Expand Down
10 changes: 10 additions & 0 deletions browse/bin/find-browse
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,24 @@
DIR="$(cd "$(dirname "$0")/.." && pwd)/dist"
if test -x "$DIR/find-browse"; then
exec "$DIR/find-browse" "$@"
elif test -x "$DIR/find-browse.exe"; then
exec "$DIR/find-browse.exe" "$@"
fi
# Fallback: basic discovery with priority chain
ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
for MARKER in .codex .agents .claude; do
if [ -n "$ROOT" ] && test -x "$ROOT/$MARKER/skills/gstack/browse/dist/browse.exe"; then
echo "$ROOT/$MARKER/skills/gstack/browse/dist/browse.exe"
exit 0
fi
if [ -n "$ROOT" ] && test -x "$ROOT/$MARKER/skills/gstack/browse/dist/browse"; then
echo "$ROOT/$MARKER/skills/gstack/browse/dist/browse"
exit 0
fi
if test -x "$HOME/$MARKER/skills/gstack/browse/dist/browse.exe"; then
echo "$HOME/$MARKER/skills/gstack/browse/dist/browse.exe"
exit 0
fi
if test -x "$HOME/$MARKER/skills/gstack/browse/dist/browse"; then
echo "$HOME/$MARKER/skills/gstack/browse/dist/browse"
exit 0
Expand Down
27 changes: 24 additions & 3 deletions canary/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -783,9 +783,30 @@ Skills that run plan reviews (`/plan-*-review`, `/codex review`) include the EXI
```bash
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
B=""
[ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ] && B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
[ -z "$B" ] && B="$HOME/.claude/skills/gstack/browse/dist/browse"
if [ -x "$B" ]; then
if [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse.exe" ]; then
B="$_ROOT/.claude/skills/gstack/browse/dist/browse.exe"
elif [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ]; then
B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
elif [ -x "$HOME/.claude/skills/gstack/browse/dist/browse.exe" ]; then
B="$HOME/.claude/skills/gstack/browse/dist/browse.exe"
elif [ -x "$HOME/.claude/skills/gstack/browse/dist/browse" ]; then
B="$HOME/.claude/skills/gstack/browse/dist/browse"
fi
B_OK=0
if [ -n "$B" ] && [ -x "$B" ]; then
if "$B" status >/dev/null 2>&1; then
B_OK=1
else
if command -v bun >/dev/null 2>&1 && [ -f "$_ROOT/.claude/skills/gstack/browse/src/cli.ts" ]; then
B="bun run $_ROOT/.claude/skills/gstack/browse/src/cli.ts"
B_OK=1
elif command -v bun >/dev/null 2>&1 && [ -f "$HOME/.claude/skills/gstack/browse/src/cli.ts" ]; then
B="bun run $HOME/.claude/skills/gstack/browse/src/cli.ts"
B_OK=1
fi
fi
fi
if [ "$B_OK" -eq 1 ]; then
echo "READY: $B"
else
echo "NEEDS_SETUP"
Expand Down
81 changes: 72 additions & 9 deletions design-consultation/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -869,9 +869,30 @@ If the codebase is empty and purpose is unclear, say: *"I don't have a clear pic
```bash
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
B=""
[ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ] && B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
[ -z "$B" ] && B="$HOME/.claude/skills/gstack/browse/dist/browse"
if [ -x "$B" ]; then
if [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse.exe" ]; then
B="$_ROOT/.claude/skills/gstack/browse/dist/browse.exe"
elif [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ]; then
B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
elif [ -x "$HOME/.claude/skills/gstack/browse/dist/browse.exe" ]; then
B="$HOME/.claude/skills/gstack/browse/dist/browse.exe"
elif [ -x "$HOME/.claude/skills/gstack/browse/dist/browse" ]; then
B="$HOME/.claude/skills/gstack/browse/dist/browse"
fi
B_OK=0
if [ -n "$B" ] && [ -x "$B" ]; then
if "$B" status >/dev/null 2>&1; then
B_OK=1
else
if command -v bun >/dev/null 2>&1 && [ -f "$_ROOT/.claude/skills/gstack/browse/src/cli.ts" ]; then
B="bun run $_ROOT/.claude/skills/gstack/browse/src/cli.ts"
B_OK=1
elif command -v bun >/dev/null 2>&1 && [ -f "$HOME/.claude/skills/gstack/browse/src/cli.ts" ]; then
B="bun run $HOME/.claude/skills/gstack/browse/src/cli.ts"
B_OK=1
fi
fi
fi
if [ "$B_OK" -eq 1 ]; then
echo "READY: $B"
else
echo "NEEDS_SETUP"
Expand Down Expand Up @@ -909,17 +930,59 @@ If browse is not available, that's fine — visual research is optional. The ski
```bash
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
D=""
[ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/design/dist/design" ] && D="$_ROOT/.claude/skills/gstack/design/dist/design"
[ -z "$D" ] && D="$HOME/.claude/skills/gstack/design/dist/design"
if [ -x "$D" ]; then
if [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/design/dist/design.exe" ]; then
D="$_ROOT/.claude/skills/gstack/design/dist/design.exe"
elif [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/design/dist/design" ]; then
D="$_ROOT/.claude/skills/gstack/design/dist/design"
elif [ -x "$HOME/.claude/skills/gstack/design/dist/design.exe" ]; then
D="$HOME/.claude/skills/gstack/design/dist/design.exe"
elif [ -x "$HOME/.claude/skills/gstack/design/dist/design" ]; then
D="$HOME/.claude/skills/gstack/design/dist/design"
fi
D_OK=0
if [ -n "$D" ] && [ -x "$D" ]; then
if "$D" --help >/dev/null 2>&1; then
D_OK=1
else
if command -v bun >/dev/null 2>&1 && [ -f "$_ROOT/.claude/skills/gstack/design/src/cli.ts" ]; then
D="bun run $_ROOT/.claude/skills/gstack/design/src/cli.ts"
D_OK=1
elif command -v bun >/dev/null 2>&1 && [ -f "$HOME/.claude/skills/gstack/design/src/cli.ts" ]; then
D="bun run $HOME/.claude/skills/gstack/design/src/cli.ts"
D_OK=1
fi
fi
fi
if [ "$D_OK" -eq 1 ]; then
echo "DESIGN_READY: $D"
else
echo "DESIGN_NOT_AVAILABLE"
fi
B=""
[ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ] && B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
[ -z "$B" ] && B="$HOME/.claude/skills/gstack/browse/dist/browse"
if [ -x "$B" ]; then
if [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse.exe" ]; then
B="$_ROOT/.claude/skills/gstack/browse/dist/browse.exe"
elif [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ]; then
B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
elif [ -x "$HOME/.claude/skills/gstack/browse/dist/browse.exe" ]; then
B="$HOME/.claude/skills/gstack/browse/dist/browse.exe"
elif [ -x "$HOME/.claude/skills/gstack/browse/dist/browse" ]; then
B="$HOME/.claude/skills/gstack/browse/dist/browse"
fi
B_OK=0
if [ -n "$B" ] && [ -x "$B" ]; then
if "$B" status >/dev/null 2>&1; then
B_OK=1
else
if command -v bun >/dev/null 2>&1 && [ -f "$_ROOT/.claude/skills/gstack/browse/src/cli.ts" ]; then
B="bun run $_ROOT/.claude/skills/gstack/browse/src/cli.ts"
B_OK=1
elif command -v bun >/dev/null 2>&1 && [ -f "$HOME/.claude/skills/gstack/browse/src/cli.ts" ]; then
B="bun run $HOME/.claude/skills/gstack/browse/src/cli.ts"
B_OK=1
fi
fi
fi
if [ "$B_OK" -eq 1 ]; then
echo "BROWSE_READY: $B"
else
echo "BROWSE_NOT_AVAILABLE (will use 'open' to view comparison boards)"
Expand Down
81 changes: 72 additions & 9 deletions design-html/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -797,17 +797,59 @@ around obstacles.
```bash
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
D=""
[ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/design/dist/design" ] && D="$_ROOT/.claude/skills/gstack/design/dist/design"
[ -z "$D" ] && D="$HOME/.claude/skills/gstack/design/dist/design"
if [ -x "$D" ]; then
if [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/design/dist/design.exe" ]; then
D="$_ROOT/.claude/skills/gstack/design/dist/design.exe"
elif [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/design/dist/design" ]; then
D="$_ROOT/.claude/skills/gstack/design/dist/design"
elif [ -x "$HOME/.claude/skills/gstack/design/dist/design.exe" ]; then
D="$HOME/.claude/skills/gstack/design/dist/design.exe"
elif [ -x "$HOME/.claude/skills/gstack/design/dist/design" ]; then
D="$HOME/.claude/skills/gstack/design/dist/design"
fi
D_OK=0
if [ -n "$D" ] && [ -x "$D" ]; then
if "$D" --help >/dev/null 2>&1; then
D_OK=1
else
if command -v bun >/dev/null 2>&1 && [ -f "$_ROOT/.claude/skills/gstack/design/src/cli.ts" ]; then
D="bun run $_ROOT/.claude/skills/gstack/design/src/cli.ts"
D_OK=1
elif command -v bun >/dev/null 2>&1 && [ -f "$HOME/.claude/skills/gstack/design/src/cli.ts" ]; then
D="bun run $HOME/.claude/skills/gstack/design/src/cli.ts"
D_OK=1
fi
fi
fi
if [ "$D_OK" -eq 1 ]; then
echo "DESIGN_READY: $D"
else
echo "DESIGN_NOT_AVAILABLE"
fi
B=""
[ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ] && B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
[ -z "$B" ] && B="$HOME/.claude/skills/gstack/browse/dist/browse"
if [ -x "$B" ]; then
if [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse.exe" ]; then
B="$_ROOT/.claude/skills/gstack/browse/dist/browse.exe"
elif [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ]; then
B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
elif [ -x "$HOME/.claude/skills/gstack/browse/dist/browse.exe" ]; then
B="$HOME/.claude/skills/gstack/browse/dist/browse.exe"
elif [ -x "$HOME/.claude/skills/gstack/browse/dist/browse" ]; then
B="$HOME/.claude/skills/gstack/browse/dist/browse"
fi
B_OK=0
if [ -n "$B" ] && [ -x "$B" ]; then
if "$B" status >/dev/null 2>&1; then
B_OK=1
else
if command -v bun >/dev/null 2>&1 && [ -f "$_ROOT/.claude/skills/gstack/browse/src/cli.ts" ]; then
B="bun run $_ROOT/.claude/skills/gstack/browse/src/cli.ts"
B_OK=1
elif command -v bun >/dev/null 2>&1 && [ -f "$HOME/.claude/skills/gstack/browse/src/cli.ts" ]; then
B="bun run $HOME/.claude/skills/gstack/browse/src/cli.ts"
B_OK=1
fi
fi
fi
if [ "$B_OK" -eq 1 ]; then
echo "BROWSE_READY: $B"
else
echo "BROWSE_NOT_AVAILABLE (will use 'open' to view comparison boards)"
Expand Down Expand Up @@ -925,9 +967,30 @@ else a few taps away with an obvious path to get there.
```bash
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
B=""
[ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ] && B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
[ -z "$B" ] && B="$HOME/.claude/skills/gstack/browse/dist/browse"
if [ -x "$B" ]; then
if [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse.exe" ]; then
B="$_ROOT/.claude/skills/gstack/browse/dist/browse.exe"
elif [ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ]; then
B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
elif [ -x "$HOME/.claude/skills/gstack/browse/dist/browse.exe" ]; then
B="$HOME/.claude/skills/gstack/browse/dist/browse.exe"
elif [ -x "$HOME/.claude/skills/gstack/browse/dist/browse" ]; then
B="$HOME/.claude/skills/gstack/browse/dist/browse"
fi
B_OK=0
if [ -n "$B" ] && [ -x "$B" ]; then
if "$B" status >/dev/null 2>&1; then
B_OK=1
else
if command -v bun >/dev/null 2>&1 && [ -f "$_ROOT/.claude/skills/gstack/browse/src/cli.ts" ]; then
B="bun run $_ROOT/.claude/skills/gstack/browse/src/cli.ts"
B_OK=1
elif command -v bun >/dev/null 2>&1 && [ -f "$HOME/.claude/skills/gstack/browse/src/cli.ts" ]; then
B="bun run $HOME/.claude/skills/gstack/browse/src/cli.ts"
B_OK=1
fi
fi
fi
if [ "$B_OK" -eq 1 ]; then
echo "READY: $B"
else
echo "NEEDS_SETUP"
Expand Down
Loading
Loading