<!-- RUBY-BACKUP · part 22 -->
rldPosOf(s.aObj), pb = worldPosOf(s.bObj);
        if(!pa || !pb) continue;
        arr.push({ax: Math.round(pa.x*10)/10, az: Math.round(pa.z*10)/10,
                  bx: Math.round(pb.x*10)/10, bz: Math.round(pb.z*10)/10,
                  mode: s.mode || 1});
      }
    }catch(e){}
    return arr;
  }

  /* ---------- save / load ---------- */
  window.saveNodes = function(loud){
    try{
      var d = window.__dumpNodes();
      try{ localStorage.setItem(KEY, JSON.stringify(d)); }catch(e){}
      if(loud !== false) status('nodes saved — ' + d.nodes.length + ' nodes, ' + d.portals.length + ' portals, ' + d.spans.length + ' spans');
      return d;
    }catch(e){ return null; }
  };
  window.loadNodesRaw = function(){
    try{ return JSON.parse(localStorage.getItem(KEY) || 'null'); }catch(e){ return null; }
  };
  window.forgetNodes = function(){
    try{ localStorage.removeItem(KEY); }catch(e){}
    status('node memory cleared — fresh start on next load');
    return 'forgotten';
  };

  /* ---------- restore ---------- */
  window.__restoreNodes = function(dump){
    var n = 0;
    try{
      if(!dump || !dump.nodes) return 0;
      var sns = window.__solidNodes || {};
      var idByPos = {};
      for(var i=0;i<dump.nodes.length;i++){
        var e = dump.nodes[i];
        var nid = resolve(e.x, e.z);
        if(!nid) continue;
        idByPos[posKey(e.x, e.z)] = nid;
        try{
          if(!sns[nid]) window.solidifyNode(nid);
          applyMode(nid, e);
          n++;
        }catch(ex){}
      }
      /* portal pairs */
      var pairs = dump.portals || [];
      for(var j=0;j<pairs.length;j++){
        try{
          var a = idByPos[posKey(pairs[j][0].x, pairs[j][0].z)];
          var b = idByPos[posKey(pairs[j][1].x, pairs[j][1].z)];
          if(a && b && typeof window.portalPair === 'function') window.portalPair(a, b);
        }catch(ex){}
      }
      /* network */
      if(dump.network && dump.network.connected && typeof window.connectAll === 'function'){
        try{ window.connectAll(); }catch(ex){}
      }
    }catch(e){}
    return n;
  };

  function restoreSpans(dump){
    try{
      var list = (dump && dump.spans) || [];
      if(!list.length || typeof window.__buildSpan !== 'function') return 0;
      var n = 0;
      for(var i=0;i<list.length;i++){
        try{
          var sp = list[i];
          var na = window.nearestNode(sp.ax, sp.az);
          var nb = window.nearestNode(sp.bx, sp.bz);
          if(!na || !nb) continue;
          var map = window.__nodeMap || {};
          var oA = map[na.id] && map[na.id].obj, oB = map[nb.id] && map[nb.id].obj;
          if(!oA || !oB || !oA.parent || !oB.parent) continue;
          var pa = worldPosOf(oA), pb = worldPosOf(oB);
          if(!pa || !pb) continue;
          window.__buildSpan({obj:oA, point:pa}, {obj:oB, point:pb});
          n++;
        }catch(ex){}
      }
      return n;
    }catch(e){ return 0; }
  }

  window.__restoreSpans = restoreSpans;

  /* ---------- first-load defaults: wire the significant blocks ---------- */
  function wireDefaults(){
    var n = 0, idByPos = {};
    try{
      var sns = window.__solidNodes || {};
      for(var i=0;i<SIG_DEFAULTS.length;i++){
        var e = SIG_DEFAULTS[i];
        var nid = resolve(e.x, e.z);
        if(!nid) continue;
        idByPos[posKey(e.x, e.z)] = nid;
        try{
          if(!sns[nid]) window.solidifyNode(nid);
          applyMode(nid, e);
          n++;
        }catch(ex){}
      }
      /* portal pair */
      var a = idByPos[posKey(-40, 0)], b = idByPos[posKey(40, 0)];
      if(a && b && typeof window.portalPair === 'function'){ try{ window.portalPair(a, b); }catch(ex){} }
    }catch(e){}
    return n;
  }

  /* ---------- Playa 2.0 Fix Station: auto-trigger ---------- */
  function activateFixStation(){
    try{
      if(typeof warpFixStation !== 'function') return;
      warpFixStation(); /* creates the 🙌 button (toggle-safe on fresh load) */
      setTimeout(function(){
        try{
          var btns = document.querySelectorAll('button');
          for(var i=0;i<btns.length;i++){
            if(btns[i].textContent === '🙌'){ btns[i].click(); break; }
          }
        }catch(e){}
      }, 900);
    }catch(e){}
  }

  /* ---------- boot sequence ---------- */
  function boot(){
    if(booted) return; booted = true;
    try{
      /* 1. AUTO-STAMP every node */
      var stamped = 0;
      try{ stamped = window.stampAllNodes(); }catch(e){}

      /* 2. MAP ACTIVE — the King's standing order */
      try{
        window._mapAutoOpen = true;
        if(typeof ensurePermanentMap === 'function') ensurePermanentMap();
      }catch(e){}

      /* 3. PLAYA 2.0 FIX STATION ACTIVE */
      activateFixStation();

      /* 4. NODES — restore saved, or wire significant-block defaults */
      var saved = window.loadNodesRaw();
      var nNodes = 0, nSpans = 0;
      if(saved && saved.nodes && saved.nodes.length){
        nNodes = win