LASD Super Puma (N951LB) corresponding source - GTLA, 2026-09-20

This archive is everything needed to rebuild, and to change, the 3D model of the
Los Angeles County Sheriff's Department rescue helicopter "Air Rescue 5", an
Aerospatiale (Eurocopter) AS332L1 Super Puma, registration N951LB, that
gtla.live shows on its map.

SOURCE. FlightGear "Aerospatiale AS332-L1", https://github.com/FGMEMBERS/as332
(GitHub master snapshot, commit 0e2bc460253ef90c7c05330b2ba9d977ad572166,
downloaded as flightgear-as332.zip, SHA-256 1b037e5428af7a4c9bdd47781dc51bee2af9a02fd6754d4a9fb502614444e600).

AUTHORS, as credited in the upstream as332-set.xml: HB-GRAL (AS-332), Melchior
Franz (XML/NASAL from BO105), Maik Justus (FDM). The upstream README.txt also
thanks Heiko Schulz for help with the flight model.

LICENCE. GNU General Public License, version 2. The upstream README.txt says
"GNU/GPL 2" and as332-set.xml says "<license>GPL v2</license>"; neither offers
"any later version", so this is GPL v2 only. The upstream download carries no
copy of the licence, so COPYING here is the unmodified text of the GPL v2 as
published by the Free Software Foundation. GTLA's conversion, paint and
animation changes are distributed on the same terms. No warranty. The aircraft
name, markings and registration identify the aircraft shown and imply no
endorsement by its operator.

LAYOUT. Paths are the ones the scripts expect, relative to this folder:
  outputs/SuperPuma-family/source/as332-master/Models/as332.ac
        upstream mesh, the one file build.py converts
  outputs/SuperPuma-family/source/as332-master/Models/dummy.png
        upstream texture build.py loads for three small body parts
  outputs/SuperPuma-family/source/as332-master/README.txt, as332-set.xml
        upstream notices: authors and licence
  outputs/SuperPuma-family/*.py, *.mjs
        our AC3D reader, paint, build, finalize and check scripts
  outputs/SuperPuma-family/README.md
        the builder's notes, written while the model was still under review
  outputs/SuperPuma-family/aircraft/N951LB/
        config.json (identity and build settings), wiring.json (map settings;
        see PACKED SETTINGS FILES below),
        geometry-build.json (what build.py produced, part by part),
        references/faa-n951lb.txt (FAA registry record), and the two side paint
        sheets we drew, textures/port.png and textures/starboard.png

Those two upstream files are the only ones the build reads. as332.ac also names
blades.png, main_disc.png and halo_*.png, but build.py repaints the rotor blades
with its own colours and leaves out the spinning-blur discs and light halos, so
those files are never opened. The simulator runtime (Nasal scripts, sounds,
instruments, flight model) is not used by a geometry conversion.

REBUILD. Blender 5.2, Python 3 with Pillow, Node 22 or later. Unzip to a folder
whose path has no spaces (finalize.mjs and verify.mjs find their files through a
URL path). Then:
  npm install                  # in this folder; package.json pins the versions
  cd outputs/SuperPuma-family/
  python3 texture.py           # optional: redraws the two paint sheets (see FONT)
  blender --background --factory-startup --python build.py -- N951LB
  node finalize.mjs N951LB     # compresses, validates, writes standard + mobile
  node verify.mjs              # checks rotor, tail rotor and beacon animation
build.py converts the mesh, paints it, adds the hoist and boarding steps, and
writes aircraft/N951LB/N951LB.blend, exports/raw.glb, geometry-build.json and
three review renders. The .blend is an output of build.py, never an input:
every published file is made from the upstream mesh, these scripts and the two
paint sheets alone. build.py, finalize.mjs and verify.mjs also carry a CH-53E
branch (they are shared with GTLA's CH-53E family); it does nothing for
N951LB, whose config says AS332L1.

We rebuilt from this archive on 2026-09-20 (Blender 5.2.0, Pillow 12.3.0,
Node 24). The paint sheets came out identical, byte for byte. The finished
models matched the published ones in every byte but one detail: the order in
which the triangles of two small spheres (the rescue hoist drum and the tail
beacon) are listed. Blender lists those in a different order every time it
runs, even twice in a row from the same files, so a fresh build will not have
the same SHA-256 as the published one. The shape is the same.

FONT. texture.py loads /System/Library/Fonts/Supplemental/Arial Bold.ttf, a
proprietary macOS font that is not included. Put any bold font you have in that
one line, or skip texture.py and use the paint sheets already provided.

IDENTITY. build.py and finalize.mjs refuse to run unless config.json marks the
identity as checked and the saved FAA record still matches its SHA-256. That
record is included.

PACKED SETTINGS FILES. config.json and wiring.json here are copies of our own
with our internal review notes taken out: the record of the go-ahead to commit
the files, the flag that recorded whether public use had been approved, the
review-stage build status, and the review notes about approval and deployment
(one note, "HD not generated", is kept without its approval remark). Those
notes were about our review, not the model. None of the scripts here reads
them, and package-source.py refuses to pack if one ever does, so the build
works exactly as before. Every setting the scripts read is the same as in our
build inputs, and our build inputs themselves are unchanged.

NOT INCLUDED, on purpose: the reference photograph and saved photo page (they
guided the paint and are not part of the model), the proprietary font, the
Blender .blend master and raw.glb (both written by build.py), the review renders
and reports, the downloaded upstream zip itself (the files the build uses are
included exactly as they came out of it), and the simulator runtime.

FGUK AS532 COUGAR. We also downloaded the FGUK AS532 Cougar package
(fguk-as532.zip). Nothing from it is used: no script opens it, none of its mesh
or textures is in this model, and its licence.txt is CC BY-NC-SA 4.0. It is not
included.

PUBLISHED FILES. The GLBs are not duplicated here. They are served at
https://gtla.live/models/n951lb-as332l1.glb and
https://gtla.live/models/mobile/n951lb-as332l1.glb (there is no HD version). Their
SHA-256 values are in SHA256SUMS-published.txt. The served copies carry a
JSON-only attribution and provenance stamp; their geometry, textures and
animation are byte-identical to the build output.
