<!-- RUBY-BACKUP · part 20 -->
		const accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {

				geometry.setIndex( accessor );

			} );
			pending.push( accessor );

		}

		assignExtrasToUserData( geometry, primitiveDef );
		computeBounds( geometry, primitiveDef, parser );
		return Promise.all( pending ).then( function () {

			return primitiveDef.targets !== undefined ? addMorphTargets( geometry, primitiveDef.targets, parser ) : geometry;

		} );

	}
	/**
 * @param {BufferGeometry} geometry
 * @param {Number} drawMode
 * @return {BufferGeometry}
 */


	function toTrianglesDrawMode( geometry, drawMode ) {

		let index = geometry.getIndex(); // generate index if not present

		if ( index === null ) {

			const indices = [];
			const position = geometry.getAttribute( 'position' );

			if ( position !== undefined ) {

				for ( let i = 0; i < position.count; i ++ ) {

					indices.push( i );

				}

				geometry.setIndex( indices );
				index = geometry.getIndex();

			} else {

				console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );
				return geometry;

			}

		} //


		const numberOfTriangles = index.count - 2;
		const newIndices = [];

		if ( drawMode === THREE.TriangleFanDrawMode ) {

			// gl.TRIANGLE_FAN
			for ( let i = 1; i <= numberOfTriangles; i ++ ) {

				newIndices.push( index.getX( 0 ) );
				newIndices.push( index.getX( i ) );
				newIndices.push( index.getX( i + 1 ) );

			}

		} else {

			// gl.TRIANGLE_STRIP
			for ( let i = 0; i < numberOfTriangles; i ++ ) {

				if ( i % 2 === 0 ) {

					newIndices.push( index.getX( i ) );
					newIndices.push( index.getX( i + 1 ) );
					newIndices.push( index.getX( i + 2 ) );

				} else {

					newIndices.push( index.getX( i + 2 ) );
					newIndices.push( index.getX( i + 1 ) );
					newIndices.push( index.getX( i ) );

				}

			}

		}

		if ( newIndices.length / 3 !== numberOfTriangles ) {

			console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );

		} // build final geometry


		const newGeometry = geometry.clone();
		newGeometry.setIndex( newIndices );
		return newGeometry;

	}

	THREE.GLTFLoader = GLTFLoader;

} )();


===== FILE: public/ruby-backup/autoload.js =====
/* ============================================================================
   AUTOLOAD — the world wakes complete.
   The King: "We need all codes to properly load their activities on activation
   of the map loading."
   + "Playa 2.0 must become active and the map must become active — all of the
   codes that need to be active that have practical applications for building
   this world."

   On map load, this:
   1. AUTO-STAMPS every touch node (poll-and-wait for scene readiness)
   2. MAP ACTIVE — holomap opens, waypoints live (King's standing order)
   3. PLAYA 2.0 FIX STATION ACTIVE — auto-triggered, panel opens
   4. NODES — restores saved state from localStorage, or wires the 6
      significant blocks on first load (archway pair→portal, lever→switch,
      watchtower→sensor, playground→spring, foundation→anchor)
   5. SPANS — restores saved rope spans between roads/objects
   6. RIGGING — lifts already self-restore (ruby-lifts-v1); verified hooked
   7. AUTOSAVES node state every 20s + on beforeunload

   Manual codes: `save nodes` `forget nodes` `autoload`
   Key: ruby-nodes-v1
   ============================================================================ */
(function(){
  if(window.__autoload) return;
  window.__autoload = true;

  var KEY = 'ruby-nodes-v1';
  var POLL_MS = 700, MAX_POLLS = 60;
  var booted = false, polls = 0;

  function posKey(x, z){ return Math.round(x*10)/10 + ',' + Math.round(z*10)/10; }
  function status(m){ try{ if(typeof codeStatus==='function') codeStatus(m); }catch(e){} }

  /* ---------- significant-block defaults (first load) ---------- */
  var SIG_DEFAULTS = [
    {x:-40, z:0,  mode:'portal', link:{x:40, z:0}},
    {x:40,  z:0,  mode:'portal', link:{x:-40, z:0}},
    {x:0,   z:-40, mode:'switch'},
    {x:0,   z:35,  mode:'sensor'},
    {x:-25, z:40,  mode:'spring'},
    {x:0,   z:0,   mode:'anchor'}
  ];

  /* ---------- readiness: poll-and-wait, never a fixed timeout ---------- */
  function ready(){
    try{
      if(typeof window.scene === 'undefined') return false;
      if(typeof window.stampAllNodes !== 'function') return false;
      if(typeof window.solidifyNode !== 'function') return false;
      if(typeof window.listNodes !== 'function') return false;
      if(typeof window.nearestNode !== 'function') return false;
      if(typeof window.runLine !== 'function') return false;
      if(typeof window.__solidNodes === 'undefined') return false;
      return true;
    }catch(e){ return false; }
  }
  function poll(){
    polls++;
    if(ready()){ boot(); }
    else if(polls < MAX_POLLS){ setTimeout(poll, POLL_MS); }
  }

  /* ---------- resolve a saved position to a live n