ABC3 Categories 26.09.20.3 — COMPLETE MODULE

This ZIP contains one top-level abc3cat folder and every file from the uploaded
20 September module, with the five existing files listed in CHANGES updated.
Use the ZIP itself; do not copy PHP from a document/browser preview.

INSTALL WITHOUT UNINSTALLING
1. Keep a backup of the current abc3cat directory outside protected/modules.
2. Upload and extract this ZIP into:
   /home/hub-school/public_html/protected/modules/
   Replace all matching files. Do not extract inside the existing abc3cat folder.
3. Check that these files are directly inside protected/modules/abc3cat:
   config.php, Module.php, module.json, controllers/BrowseController.php.
   There must not be an extra abc3cat/abc3cat directory.
4. From /home/hub-school/public_html, run:
   php protected/yii cache/flush-all
5. Reload /cat and /spaces with Ctrl+F5.

Do not disable/uninstall abc3cat or abc2cat during this file replacement.
No new database migrations are included. Module IDs, namespaces, configuration,
activation code, existing migrations and the abc2cat bridge are unchanged.

VERIFY THE TRANSFER
From /home/hub-school/public_html/protected/modules/abc3cat, run:
   sha256sum -c docs/SHA256SUMS-26.09.20.3.txt
Every entry should say OK. These checks include all 81 module files present in
the original upload (including PHP, JS, CSS, migration and module config files).
If a PHP file was truncated, escaped or otherwise altered during transfer, its
checksum will fail. Replace that file by extracting the ZIP again.

CHECK BEHAVIOR
Change a space's short description in Space Settings, save, then reload the
space directory and a category containing that space. Both should show the
saved description. Clearing it should leave it empty in both views. Name and
URL changes should also appear in category cards. Logo uses an emblem icon,
while Banner + Logo retains the image icon.

ROLLBACK
Use your own pre-install backup, or extract the embedded original module:
   docs/rollback/abc3cat-26.09.16.1-original.zip
into protected/modules, replacing matching files, then clear the cache.
The embedded archive matches the original uploaded abc3cat byte for byte.
It restores the original behavior, INCLUDING the original stale-description
bug. No database rollback is needed.
The forward/reverse patches record the five changed existing files. Additional
release documentation can be left in place; it is not executable module code.

VALIDATION
- All 57 PHP files passed PHP 8.5.10 syntax checks in a local WebAssembly runtime.
- The actual BrowseController category-loading method ran with Yii 2 from the
  supplied HumHub source and SQLite fixture data. Current/empty/NULL/multilingual
  descriptions and current names/URLs passed despite a stale card-profile row.
- The controller passed a PHP token check: no raw text outside PHP tags.
- Existing nested-set regression tests passed, including 1,200-level hierarchy.
- Every JavaScript file passed Node syntax checking. Image-cache and icon checks
  passed; fallback behavior was retained.
- The archive was extracted and compared byte for byte with the release source.
This is not a live test of your server, MariaDB database, theme or installed
third-party modules. Original HumHub minimum-version metadata is retained.
