{
  "version": 3,
  "sources": ["/cdn/shop/t/19/assets/shape-sleuth-engine.js?x=31158"],
  "sourcesContent": ["/*! \u00A9 School House Learning Centre (shlc-tutor.co.uk). All rights reserved. Not licensed for reuse, redistribution, resale or derivative works. Enquiries: info@shlc-tutor.co.uk \u00B7 build SHLC-SSE-7Q4M2 */\n/* Shape Sleuth question engine. Generated by extract_engine.py, do not edit by hand.\n   Nine GL-style non-verbal reasoning generators; every question passes validateQ (five options, exactly one\n   right, no two options that draw the same). Source md5 f5ce60a341d77f133e4bafc8eef929e6. */\nwindow.SSEngine = (function(){\n'use strict';\n  /*! \u00A9 School House Learning Centre (shlc-tutor.co.uk). All rights reserved. Not licensed for reuse, redistribution, resale or derivative works. Enquiries: info@shlc-tutor.co.uk \u00B7 build SHLC-SSE-7Q4M2 */\n  /* host lock: only starts on our own hostnames; anywhere else it returns before the game is built.\n     Allowed: shlc-tutor.co.uk + subdomains, the store myshopify host (theme previews), localhost, file://. */\n  try { var __shlcH = String(location.hostname || '').toLowerCase();\n    if (!(/(^|\\.)shlc-tutor\\.co\\.uk$/.test(__shlcH) || __shlcH === 'c44a55-2.myshopify.com'\n          || __shlcH === 'localhost' || __shlcH === '127.0.0.1' || __shlcH === '')) return;\n  } catch (e) { return; }\n  try { (window.SHLC_BUILD = window.SHLC_BUILD || {})['SSE'] = 'SHLC-SSE-7Q4M2'; } catch (e) {}\n/* ================= utilities ================= */\nvar ri=function(n){return Math.floor(Math.random()*n);};\nvar pick=function(a){return a[ri(a.length)];};\nfunction shuffle(a){for(var i=a.length-1;i>0;i--){var j=ri(i+1);var t=a[i];a[i]=a[j];a[j]=t;}return a;}\nvar pickN=function(a,n){return shuffle(a.slice()).slice(0,n);};\nvar deep=function(o){return JSON.parse(JSON.stringify(o));};\nvar el=function(id){return document.getElementById(id);};\nfunction reducedMotion(){\n  try{return window.matchMedia&&window.matchMedia('(prefers-reduced-motion: reduce)').matches;}\n  catch(e){return false;}\n}\n\n/* ================= sound (WebAudio, no asset files) ================= */\nvar AC=null,muted=false;\nfunction audioCtx(){\n  var Ctor=window.AudioContext||window.webkitAudioContext;\n  if(!Ctor)return null;\n  if(!AC)AC=new Ctor();\n  if(AC.state==='suspended')AC.resume();\n  return AC;\n}\nfunction tone(freq,dur,delay,type,vol){\n  var ctx=audioCtx();if(!ctx)return;\n  var t0=ctx.currentTime+(delay||0);\n  var o=ctx.createOscillator(),g=ctx.createGain();\n  o.type=type||'sine';o.frequency.value=freq;\n  g.gain.setValueAtTime(0.0001,t0);\n  g.gain.exponentialRampToValueAtTime(vol||0.16,t0+0.015);\n  g.gain.exponentialRampToValueAtTime(0.0001,t0+dur);\n  o.connect(g);g.connect(ctx.destination);\n  o.start(t0);o.stop(t0+dur+0.05);\n}\nfunction sfx(kind){\n  if(muted)return;\n  try{\n    if(kind==='right'){tone(660,.12,0);tone(880,.16,.09);}\n    else if(kind==='streak'){tone(660,.1,0);tone(880,.1,.08);tone(1175,.2,.16);}\n    else if(kind==='wrong'){tone(196,.2,0,'square',.09);}\n    else if(kind==='click'){tone(520,.05,0,'sine',.07);}\n    else if(kind==='timeup'){tone(392,.14,0);tone(262,.24,.11);}\n    else if(kind==='end'){tone(523,.13,0);tone(659,.13,.1);tone(784,.13,.2);tone(1047,.3,.3);}\n  }catch(e){}\n}\n\n/* ================= symbol library =================\n   Covers the eight GL concept areas: shapes, counting (dots/lines),\n   pointing (arrow + rotation), shading AND line types (fills + outline\n   styles), order & position, rotation, reflection (chiral shapes + flip),\n   layering (overlapping pairs with a front/behind property). */\nvar INK='#1A2347';\nvar SHAPES=['circle','square','triangle','pentagon','hexagon','heptagon','octagon','star','star6','diamond','semicircle','quarter','crescent','ellipse','ring','cross','arrow','chevron','tshape','trapezium','kite','parallelogram','zshape','lshape','rtriangle'];\n/* side counts for \"dots equal sides\" relationship rules and the\n   gains-a-side morph chain */\nvar SIDES={triangle:3,rtriangle:3,square:4,diamond:4,trapezium:4,kite:4,parallelogram:4,pentagon:5,hexagon:6,heptagon:7,octagon:8};\nvar MORPH=['triangle','square','pentagon','hexagon','heptagon','octagon'];\n/* dice-style layouts for cells holding several copies of one shape */\nvar DICE={1:[[50,50]],2:[[32,34],[68,66]],3:[[28,28],[50,50],[72,72]],4:[[30,30],[70,30],[30,70],[70,70]],5:[[28,28],[72,28],[50,50],[28,72],[72,72]]};\n/* Shapes whose rotation reads clearly at 45/90-degree steps. Squares,\n   diamonds, circles and crosses are excluded: their symmetry makes some\n   rotations invisible (a diamond turned 45 degrees IS a square). */\nvar ROTSAFE=['triangle','semicircle','quarter','crescent','pentagon','arrow','chevron','tshape','trapezium','kite','lshape','rtriangle'];\n/* Shapes safe for QUARTER-turn rules. A triangle turned 90\u00B0 reads as a\n   30\u00B0 turn the other way (120\u00B0 symmetry), a pentagon turned 90\u00B0 reads\n   as 18\u00B0: the child sees something different from what the explanation\n   says. Quarter-turn rules stick to shapes with no rotational symmetry. */\nvar ROT90SAFE=['semicircle','quarter','crescent','arrow','chevron','tshape','trapezium','kite','lshape','rtriangle'];\n/* Chiral shapes: their mirror image cannot be produced by any rotation,\n   so reflection questions are only ever built from these. */\nvar CHIRAL=['lshape','rtriangle','parallelogram','zshape'];\n/* Named pools for the shape-property discriminators. Defined once here so a\n   new shape only has to be classified in one place. */\nvar CURVED=['circle','semicircle','quarter','crescent','ellipse','ring'];\nvar STRAIGHT=['triangle','square','pentagon','hexagon','heptagon','octagon','star','star6','diamond','cross',\n  'chevron','tshape','trapezium','kite','parallelogram','zshape','rtriangle','lshape'];\n/* Has at least one line of symmetry, so \"fold it in half\" works. Everything\n   chiral is excluded by definition. */\nvar SYMPOOL=['circle','square','triangle','pentagon','hexagon','heptagon','octagon','star','star6','diamond',\n  'semicircle','quarter','crescent','ellipse','ring','cross','arrow','chevron','tshape','trapezium','kite'];\n/* Side counts a child would actually arrive at by counting edges. Stars and\n   crescents are left out of the parity rule: nobody counts a star as 10. */\nvar EVENSIDES=['square','diamond','hexagon','octagon','cross','trapezium','kite','parallelogram'];\nvar ODDSIDES=['triangle','rtriangle','pentagon','heptagon'];\n/* Achiral shapes symmetric about the horizontal axis at rot 0: a\n   top-bottom flip renders identically, so ser() must not count it. */\nvar HSYM={circle:1,square:1,hexagon:1,diamond:1,cross:1,octagon:1,ellipse:1,ring:1,star6:1,crescent:1};\n/* Left-right symmetric at rot 0. Not every achiral shape is: a crescent bulges\n   one way and a quarter circle has its corner in one place, so an h-flip on\n   those two renders differently and ser() must keep them apart. */\nvar VSYM={circle:1,square:1,triangle:1,pentagon:1,hexagon:1,heptagon:1,octagon:1,star:1,star6:1,diamond:1,\n  semicircle:1,ellipse:1,ring:1,cross:1,arrow:1,chevron:1,tshape:1,trapezium:1,kite:1};\n/* Visual rotational symmetry per shape, used to normalise rotations when\n   comparing two specs, so \"different\" specs can never look identical. */\nvar SYM={circle:1,square:90,triangle:120,pentagon:72,hexagon:60,heptagon:360,octagon:45,star:72,star6:60,diamond:90,semicircle:360,quarter:360,crescent:360,ellipse:180,ring:1,cross:90,arrow:360,chevron:360,tshape:360,trapezium:360,kite:360,parallelogram:180,zshape:180,lshape:360,rtriangle:360};\nvar FILLPOOL={1:['black','white','grey'],2:['black','white','grey','hatch','dotfill','vstripe'],3:['black','white','grey','hatch','hatch2','dotfill','crossfill','vstripe','checker']};\nvar FILLMAP={black:INK,grey:'#a8b1bc',white:'#ffffff',hatch:'url(#nvrHatch)',hatch2:'url(#nvrHatch2)',dotfill:'url(#nvrDotsF)',crossfill:'url(#nvrCrossF)',vstripe:'url(#nvrVStripe)',checker:'url(#nvrChecker)'};\nvar FILLDESC={black:'solid black',grey:'grey',white:'white (outline only)',hatch:'shaded with \u2198 diagonal lines',hatch2:'shaded with \u2197 diagonal lines',dotfill:'dotted',crossfill:'criss-cross shaded',vstripe:'striped up and down',checker:'checked'};\n/* Outline styles: dashed and dotted lines vanish against a solid black\n   fill, so any generator using strokes keeps fills to white/grey. */\nvar STROKES=['solid','dash','dot'];\n/* dash: long strokes with a clear gap. dot: a zero-length stroke with a\n   round cap, which draws a true round dot rather than a short dash, so\n   dashed and dotted can never be mistaken for each other. */\nvar DASHMAP={solid:'',dash:'13 7',dot:'0.1 7'};\n/* A fixed dash length reads as three long dashes on a large shape and two stubs\n   on a small one. The pattern is scaled off the radius so every size shows the\n   same rhythm, which is what makes the line TYPE the thing a child notices. */\nfunction dashPat(kind,r){\n  if(!kind||kind==='solid')return '';\n  if(kind==='dot')return '0.1 '+Math.max(2.8,r*0.24).toFixed(1);\n  return Math.max(4.2,r*0.33).toFixed(1)+' '+Math.max(2.6,r*0.2).toFixed(1);\n}\nvar STROKEDESC={solid:'a solid outline',dash:'a dashed outline',dot:'a dotted outline'};\nvar STROKEFILLS=['white','grey'];\n/* 1 : 1.67 : 2.47 on the radius. The old 19/26/33 put small and medium\n   within 37% of each other, which is not a size difference a child can\n   call. Large still clears the 100-unit box: 37 + stroke = 88. */\nvar SIZER={s:15,m:25,l:34};\nvar SIZEDESC={s:'small',m:'medium',l:'large'};\nvar SHAPEDESC={circle:'circle',square:'square',triangle:'triangle',pentagon:'pentagon',hexagon:'hexagon',heptagon:'heptagon',octagon:'octagon',star:'five-pointed star',star6:'six-pointed star',diamond:'diamond',semicircle:'semicircle',quarter:'quarter circle',crescent:'crescent',ellipse:'oval',ring:'ring',cross:'cross',arrow:'arrow',chevron:'chevron',tshape:'T-shape',trapezium:'trapezium',kite:'kite',parallelogram:'parallelogram',zshape:'Z-shape',lshape:'L-shape',rtriangle:'right-angled triangle'};\nvar POS={c:[50,50],tl:[27,27],t:[50,27],tr:[73,27],r:[73,50],br:[73,73],b:[50,73],bl:[27,73],l:[27,50]};\nvar PERIM=['tl','t','tr','r','br','b','bl','l'];\n\n/* flip: false, 'h' (left-right mirror) or 'v' (top-bottom mirror).\n   copies: null or 2-5 identical small shapes laid out dice-style. */\nfunction baseSpec(){return {shape:'circle',fill:'white',size:'m',rot:0,dots:0,lines:0,pos:null,inner:null,stroke:'solid',flip:false,pair:null,copies:null};}\n\n/* A fill for an inner shape that stays visible against the outer fill */\nfunction innerFillFor(outer){\n  if(outer==='black')return pick(['white','grey']);\n  if(outer==='white')return pick(['black','grey']);\n  if(outer==='grey')return pick(['black','white']);\n  return pick(['black','white']);\n}\n\n/* Canonical serialisation. Rotation normalised by the shape's visual\n   symmetry so two specs that render identically always serialise\n   identically. This is what the uniqueness validation leans on. */\nfunction ser(s){\n  if(!s)return 'null';\n  var rot=((s.rot||0)%360+360)%360;\n  var sym=SYM[s.shape]||360;\n  if(sym>1)rot=rot%sym;else rot=0;\n  /* Flips on achiral shapes can render identically to the unflipped\n     shape: every achiral shape here is left-right symmetric at rot 0,\n     and the HSYM set is top-bottom symmetric too. Normalise those so\n     ser() never calls two identical renders different. (Generators only\n     combine flip with a nonzero rot on chiral shapes, so the rot 0\n     restriction is safe.) */\n  var flip=(s.flip==='v')?'v':(s.flip?'h':'0');\n  if(CHIRAL.indexOf(s.shape)<0&&rot===0){\n    if(flip==='h'&&VSYM[s.shape])flip='0';\n    if(flip==='v'&&HSYM[s.shape])flip='0';\n  }\n  return [s.shape,s.fill,s.size||'m','r'+rot,'d'+(s.dots||0),'l'+(s.lines||0),'p'+(s.pos||'c'),\n          'k'+(s.stroke||'solid'),'f'+flip,'n'+(s.copies||1),\n          s.pair?('pr['+s.pair.shape2+','+s.pair.fill2+','+s.pair.front+']'):'pr0',\n          s.inner?('in['+ser(s.inner)+']'):'in0'].join('|');\n}\n\n/* ================= SVG renderer ================= */\nfunction polyPts(n,r,start){\n  var p=[];\n  for(var i=0;i<n;i++){\n    var a=(start+i*360/n)*Math.PI/180;\n    p.push((50+r*Math.cos(a)).toFixed(1)+','+(50+r*Math.sin(a)).toFixed(1));\n  }\n  return p.join(' ');\n}\nfunction starPts(r){\n  var p=[];var r2=r*0.45;\n  for(var i=0;i<10;i++){\n    var rr=(i%2===0)?r:r2;\n    var a=(-90+i*36)*Math.PI/180;\n    p.push((50+rr*Math.cos(a)).toFixed(1)+','+(50+rr*Math.sin(a)).toFixed(1));\n  }\n  return p.join(' ');\n}\nfunction crossPts(r){\n  var w=r*0.36;var p=[];\n  var pts=[[-w,-r],[w,-r],[w,-w],[r,-w],[r,w],[w,w],[w,r],[-w,r],[-w,w],[-r,w],[-r,-w],[-w,-w]];\n  for(var i=0;i<pts.length;i++)p.push((50+pts[i][0]).toFixed(1)+','+(50+pts[i][1]).toFixed(1));\n  return p.join(' ');\n}\nfunction arrowPts(r){\n  /* points up at rot 0; rotation gives the eight compass directions */\n  var p=[];\n  var pts=[[0,-r],[0.58*r,-0.12*r],[0.24*r,-0.12*r],[0.24*r,r],[-0.24*r,r],[-0.24*r,-0.12*r],[-0.58*r,-0.12*r]];\n  for(var i=0;i<pts.length;i++)p.push((50+pts[i][0]).toFixed(1)+','+(50+pts[i][1]).toFixed(1));\n  return p.join(' ');\n}\nfunction lshapePts(r){\n  /* chiral L: its mirror image is a J, unreachable by rotation */\n  var pts=[[-r,-r],[-0.35*r,-r],[-0.35*r,0.4*r],[r,0.4*r],[r,r],[-r,r]];\n  var p=[];\n  for(var i=0;i<pts.length;i++)p.push((50+pts[i][0]).toFixed(1)+','+(50+pts[i][1]).toFixed(1));\n  return p.join(' ');\n}\nfunction rtrianglePts(r){\n  /* scalene right triangle: chiral, unlike the equilateral */\n  var pts=[[-r,-0.5*r],[-r,r],[r,r]];\n  var p=[];\n  for(var i=0;i<pts.length;i++)p.push((50+pts[i][0]).toFixed(1)+','+(50+pts[i][1]).toFixed(1));\n  return p.join(' ');\n}\nfunction star6Pts(r){\n  var p=[];var r2=r*0.55;\n  for(var i=0;i<12;i++){\n    var rr=(i%2===0)?r:r2;\n    var a=(-90+i*30)*Math.PI/180;\n    p.push((50+rr*Math.cos(a)).toFixed(1)+','+(50+rr*Math.sin(a)).toFixed(1));\n  }\n  return p.join(' ');\n}\nfunction chevronPts(r){\n  /* points up at rot 0, like the arrow but hollow-backed */\n  var pts=[[0,-r],[r,-0.05*r],[r,0.5*r],[0,-0.45*r],[-r,0.5*r],[-r,-0.05*r]];\n  return ptsStr(pts);\n}\nfunction tshapePts(r){\n  var w=r*0.34;\n  var pts=[[-r,-r],[r,-r],[r,-r+2*w],[w,-r+2*w],[w,r],[-w,r],[-w,-r+2*w],[-r,-r+2*w]];\n  return ptsStr(pts);\n}\nfunction trapeziumPts(r){\n  /* isosceles: symmetrical about the vertical axis, so it is achiral */\n  var pts=[[-0.5*r,-0.72*r],[0.5*r,-0.72*r],[r,0.72*r],[-r,0.72*r]];\n  return ptsStr(pts);\n}\nfunction kitePts(r){\n  /* the shoulders sit high and the tail runs long, so it cannot be mistaken\n     for the diamond, which is symmetrical about both axes */\n  var pts=[[0,-r],[0.8*r,-0.34*r],[0,r],[-0.8*r,-0.34*r]];\n  return ptsStr(pts);\n}\nfunction parallelogramPts(r){\n  /* chiral: its mirror leans the other way and no rotation gets there */\n  var pts=[[-0.55*r,-0.62*r],[r,-0.62*r],[0.55*r,0.62*r],[-r,0.62*r]];\n  return ptsStr(pts);\n}\nfunction zshapePts(r){\n  /* chiral: the mirror image is an S */\n  var w=r*0.3;\n  var pts=[[-r,-r],[r,-r],[r,-r+w],[-0.1*r,r-w],[r,r-w],[r,r],[-r,r],[-r,r-w],[0.1*r,-r+w],[-r,-r+w]];\n  return ptsStr(pts);\n}\nfunction ptsStr(pts){\n  var p=[];\n  for(var i=0;i<pts.length;i++)p.push((50+pts[i][0]).toFixed(1)+','+(50+pts[i][1]).toFixed(1));\n  return p.join(' ');\n}\nfunction shapeEl(shape,r,fill,stroke,sw,dash){\n  var f=' fill=\"'+fill+'\" stroke=\"'+stroke+'\" stroke-width=\"'+sw+'\" stroke-linejoin=\"round\"'\n    +(dash?' stroke-dasharray=\"'+dash+'\" stroke-linecap=\"round\"':'');\n  if(shape==='circle')return '<circle cx=\"50\" cy=\"50\" r=\"'+r+'\"'+f+'></circle>';\n  if(shape==='semicircle')return '<path d=\"M '+(50-r)+' '+(50+r*0.35)+' A '+r+' '+r+' 0 0 1 '+(50+r)+' '+(50+r*0.35)+' Z\"'+f+'></path>';\n  if(shape==='ellipse')return '<ellipse cx=\"50\" cy=\"50\" rx=\"'+r+'\" ry=\"'+(r*0.62).toFixed(1)+'\"'+f+'></ellipse>';\n  if(shape==='quarter'){\n    /* quarter disc with the corner bottom-left; achiral, since its mirror is\n       the same shape turned a quarter turn */\n    return '<path d=\"M '+(50-r*0.75)+' '+(50+r*0.75)+' L '+(50+r*0.85)+' '+(50+r*0.75)\n      +' A '+(r*1.6)+' '+(r*1.6)+' 0 0 0 '+(50-r*0.75)+' '+(50-r*0.85)+' Z\"'+f+'></path>';\n  }\n  if(shape==='crescent'){\n    /* outer arc left to right, inner arc back: chiral, the mirror faces the\n       other way and no rotation reproduces it */\n    return '<path d=\"M '+(50-r*0.15)+' '+(50-r)+' A '+r+' '+r+' 0 1 0 '+(50-r*0.15)+' '+(50+r)\n      +' A '+(r*1.15)+' '+(r*1.15)+' 0 1 1 '+(50-r*0.15)+' '+(50-r)+' Z\"'+f+'></path>';\n  }\n  if(shape==='ring'){\n    /* a hole, not a fill: evenodd keeps the middle empty whatever the fill is */\n    return '<path d=\"M 50 '+(50-r)+' A '+r+' '+r+' 0 1 0 50 '+(50+r)+' A '+r+' '+r+' 0 1 0 50 '+(50-r)\n      +' Z M 50 '+(50-r*0.52)+' A '+(r*0.52)+' '+(r*0.52)+' 0 1 1 50 '+(50+r*0.52)\n      +' A '+(r*0.52)+' '+(r*0.52)+' 0 1 1 50 '+(50-r*0.52)+' Z\" fill-rule=\"evenodd\"'+f+'></path>';\n  }\n  var pts;\n  if(shape==='square')pts=polyPts(4,r,45);\n  else if(shape==='triangle')pts=polyPts(3,r,-90);\n  else if(shape==='pentagon')pts=polyPts(5,r,-90);\n  else if(shape==='hexagon')pts=polyPts(6,r,0);\n  else if(shape==='heptagon')pts=polyPts(7,r,-90);\n  else if(shape==='octagon')pts=polyPts(8,r,-67.5);\n  else if(shape==='diamond')pts=polyPts(4,r,-90);\n  else if(shape==='star')pts=starPts(r);\n  else if(shape==='star6')pts=star6Pts(r);\n  else if(shape==='chevron')pts=chevronPts(r);\n  else if(shape==='tshape')pts=tshapePts(r);\n  else if(shape==='trapezium')pts=trapeziumPts(r);\n  else if(shape==='kite')pts=kitePts(r);\n  else if(shape==='parallelogram')pts=parallelogramPts(r);\n  else if(shape==='zshape')pts=zshapePts(r);\n  else if(shape==='arrow')pts=arrowPts(r);\n  else if(shape==='lshape')pts=lshapePts(r);\n  else if(shape==='rtriangle')pts=rtrianglePts(r);\n  else pts=crossPts(r);\n  return '<polygon points=\"'+pts+'\"'+f+'></polygon>';\n}\n/* Patterned fills are drawn on a white base first so the pattern always\n   reads black-on-white whatever sits behind the cell. */\nfunction shapeLayer(shape,r,fill,strokeCol,dash){\n  var out='';\n  var f=FILLMAP[fill]||'#ffffff';\n  if(fill==='hatch'||fill==='hatch2'||fill==='dotfill'||fill==='crossfill'||fill==='vstripe'||fill==='checker'){\n    out+=shapeEl(shape,r,'#ffffff','none',0,'');\n  }\n  /* a dashed or dotted line needs more weight than a solid one to read at all\n     at the small size, so the line TYPE is what the child notices */\n  out+=shapeEl(shape,r,f,strokeCol||INK,dash?3.4:2.6,dash||'');\n  return out;\n}\nfunction cellSVG(spec){\n  var r=SIZER[spec.size||'m'];\n  if(spec.pos&&spec.pos!=='c')r=SIZER.s;\n  var strokeKind=spec.stroke||'solid';\n  var dash=dashPat(strokeKind,r);\n  var body;\n  if(spec.copies&&spec.copies>=1){\n    /* several identical small shapes, dice layout; rotation, flip, inner\n       and pair do not combine with copies (generators keep them apart) */\n    var nC=Math.min(5,spec.copies);\n    var layout=DICE[nC];\n    body='';\n    for(var ci=0;ci<layout.length;ci++){\n      body+='<g transform=\"translate('+(layout[ci][0]-50)+' '+(layout[ci][1]-50)+')\">'+shapeLayer(spec.shape,13,spec.fill,INK,dashPat(strokeKind,13))+'</g>';\n    }\n    var ex2='';\n    if(spec.dots){\n      var sx2=50-(spec.dots-1)*5.5;\n      for(var di=0;di<spec.dots;di++){\n        ex2+='<circle cx=\"'+(sx2+di*11).toFixed(1)+'\" cy=\"110\" r=\"3.6\" fill=\"'+INK+'\"></circle>';\n      }\n    }\n    return '<svg viewBox=\"0 -20 100 140\" xmlns=\"http://www.w3.org/2000/svg\">'+body+ex2+'</svg>';\n  }\n  if(spec.pair){\n    /* layering: two overlapping shapes, the front one drawn last so its\n       fill covers the other's outline in the overlap */\n    var r2=Math.max(14,Math.round(r*0.85));\n    var main='<g transform=\"translate(-9 -7)\">'+shapeLayer(spec.shape,r2,spec.fill,INK,dashPat(strokeKind,r2))+'</g>';\n    var other='<g transform=\"translate(9 7)\">'+shapeLayer(spec.pair.shape2,r2,spec.pair.fill2,INK,'')+'</g>';\n    body=(spec.pair.front==='main')?(other+main):(main+other);\n  }else{\n    body=shapeLayer(spec.shape,r,spec.fill,INK,dash);\n    if(spec.inner){\n      var ir=Math.max(9,Math.round(r*0.48));\n      var istroke=(spec.fill==='black')?'#ffffff':INK;\n      body+=shapeLayer(spec.inner.shape,ir,spec.inner.fill,istroke,'');\n    }\n  }\n  var rot=spec.rot||0;\n  if(rot%360!==0)body='<g transform=\"rotate('+rot+' 50 50)\">'+body+'</g>';\n  if(spec.flip==='v')body='<g transform=\"translate(0 100) scale(1 -1)\">'+body+'</g>';\n  else if(spec.flip)body='<g transform=\"translate(100 0) scale(-1 1)\">'+body+'</g>';\n  var a=POS[spec.pos||'c'];\n  if(spec.pos&&spec.pos!=='c')body='<g transform=\"translate('+(a[0]-50)+' '+(a[1]-50)+')\">'+body+'</g>';\n  var extras='';\n  var i;\n  /* The count marks are annotations, not part of the figure. Each is drawn on a\n     white halo so a large outline passing behind can never make them hard to\n     count, which is the whole point of a counting rule. */\n  /* The count marks live OUTSIDE the figure's 100-unit box: lines in a band\n     above it, dots in a band below. Every cell uses the same extended viewBox\n     whether it carries marks or not, so all cells still draw at one scale and a\n     \"large\" shape with dots is exactly as large as one without. */\n  if(spec.lines){\n    for(i=0;i<spec.lines;i++){\n      var ly=(-16+i*5.4).toFixed(1);\n      extras+='<line x1=\"34\" y1=\"'+ly+'\" x2=\"66\" y2=\"'+ly+'\" stroke=\"'+INK+'\" stroke-width=\"2.8\" stroke-linecap=\"round\"></line>';\n    }\n  }\n  if(spec.dots){\n    var startX=50-(spec.dots-1)*5.5;\n    for(i=0;i<spec.dots;i++){\n      extras+='<circle cx=\"'+(startX+i*11).toFixed(1)+'\" cy=\"110\" r=\"3.6\" fill=\"'+INK+'\"></circle>';\n    }\n  }\n  return '<svg viewBox=\"0 -20 100 140\" xmlns=\"http://www.w3.org/2000/svg\">'+body+extras+'</svg>';\n}\n\n/* Fallback mutation used when a generator needs one more distinct\n   distractor: guaranteed to change the serialisation. Varies fill or\n   dot count, the two properties visible in every rendering branch. */\nfunction mutate(s){\n  if(ri(2)===0){\n    s.fill=pick(FILLPOOL[3].filter(function(x){return x!==s.fill;}));\n  }else{\n    s.dots=pick([0,1,2,3].filter(function(x){return x!==(s.dots||0);}));\n  }\n  return s;\n}\n\n/* ================= question generators =================\n   Each returns {type, prompt, options, correct, explain} or null.\n   validateQ() is the safety net: five options, exactly one right,\n   no two options that render the same. Generators are retried\n   until it passes, so an unsolvable or double-answer question\n   can never reach the screen. */\n\n/* ---- Type 1: Most Unlike (odd one out) ---- */\n/* Which spec properties each odd-one-out rule owns, so the diversity pass never\n   touches something the rule depends on, and never varies something the\n   renderer quietly ignores (a cell full of copies draws no size, lines,\n   stroke or inner shape). */\nvar OWNED_ODD={\n  shape:['shape'], fill:['fill'], size:['size'], dots:['dots'], lines:['lines'],\n  stroke:['stroke'],\n  copies:['copies','size','lines','stroke','inner'],\n  rot:['rot','shape'], flip:['flip','shape'], rotmirror:['rot','flip','shape'],\n  layer:['pair','size','lines'],\n  rel:['dots','lines'],\n  sidesdots:['shape','dots'],\n  copiesdots:['copies','dots','size','lines','stroke','inner'],\n  curved:['shape'], evensides:['shape'], symmetry:['shape']\n};\nfunction genOdd(diff){\n  var pool=FILLPOOL[diff];\n  var ruleProp;\n  /* Foundation used to be shape or fill only, so a ten-question session kept\n     asking the same two things. These five are all readable at Foundation. */\n  if(diff===1)ruleProp=pick(['shape','fill','size','dots','copies','curved']);\n  else if(diff===2)ruleProp=pick(['fill','size','dots','lines','stroke','copies','rot','flip','layer','curved']);\n  else ruleProp=pick(['rot','flip','layer','rel','sidesdots','copiesdots','evensides','symmetry','rotmirror']);\n\n  var b=baseSpec();\n  b.shape=(ruleProp==='rot')?pick(ROTSAFE):pick(SHAPES);\n  b.fill=pick(pool);\n  if(ruleProp==='stroke')b.fill=pick(STROKEFILLS);\n  if(ruleProp==='flip'){b.shape=pick(CHIRAL);b.rot=0;}\n  if(ruleProp==='rotmirror'){b.shape=pick(CHIRAL);b.rot=0;}\n\n  var shared,odd,explain;\n  var noiseCand=['fill','size','rot','shape','dots','lines'];\n  if(ruleProp==='shape'){\n    shared=b.shape;odd=pick(SHAPES.filter(function(s){return s!==shared;}));\n    explain='Four of the five are '+SHAPEDESC[shared]+'s. The odd one out is a different shape.';\n  }else if(ruleProp==='fill'){\n    shared=b.fill;odd=pick(pool.filter(function(f){return f!==shared;}));\n    explain='Four of the five are '+FILLDESC[shared]+'. One is shaded differently.';\n  }else if(ruleProp==='size'){\n    /* the odd size is always one step away, never small-vs-large */\n    shared=pick(['s','m','l']);\n    odd=(shared==='m')?pick(['s','l']):'m';\n    explain='Four of the five are the same size. One is not.';\n  }else if(ruleProp==='dots'){\n    shared=1+ri(3);odd=shared+(shared>=4?-1:(shared<=1?1:pick([-1,1])));\n    explain='Four of the five have '+shared+' dot'+(shared>1?'s':'')+'. One has a different number.';\n  }else if(ruleProp==='lines'){\n    shared=1+ri(3);odd=shared+(shared>=4?-1:(shared<=1?1:pick([-1,1])));\n    explain='Four of the five have '+shared+' line'+(shared>1?'s':'')+'. One has a different number.';\n  }else if(ruleProp==='stroke'){\n    shared=pick(STROKES);odd=pick(STROKES.filter(function(k){return k!==shared;}));\n    explain='Four of the five have '+STROKEDESC[shared]+'. One is drawn with a different line type.';\n    noiseCand=['fill','size','shape','dots'];\n  }else if(ruleProp==='copies'){\n    shared=2+ri(3);odd=shared+((shared>=4)?-1:((shared<=2)?1:pick([-1,1])));\n    explain='Four of the five hold '+shared+' shapes. One holds a different number.';\n    noiseCand=['fill','shape'];\n  }else if(ruleProp==='flip'){\n    shared=false;odd=pick(['h','v']);\n    explain='Four of the five face the same way. One is a mirror image.';\n    noiseCand=['fill','size','dots'];\n  }else if(ruleProp==='layer'){\n    shared='main';odd='other';\n    explain='In four of the five, the same shape sits in front. In one it is hiding behind.';\n    noiseCand=['fill','size','dots'];\n  }else if(ruleProp==='rel'){\n    /* relationship rule: dot count equals line count on the keepers.\n       Surface values vary, so the child must look past the numbers to\n       the link between them. */\n    shared=null;odd=null;\n    explain='In four of the five, the number of dots matches the number of lines. In one they differ.';\n    noiseCand=['fill','shape','size'];\n  }else if(ruleProp==='sidesdots'){\n    shared=null;odd=null;\n    explain='In four of the five, the number of dots equals the number of sides of the shape. In one it does not.';\n    noiseCand=['fill','size'];\n  }else if(ruleProp==='copiesdots'){\n    shared=null;odd=null;\n    explain='In four of the five, the number of shapes in the box matches the number of dots underneath. In one they differ.';\n    noiseCand=['fill','shape'];\n  }else if(ruleProp==='curved'){\n    shared=null;odd=null;\n    explain='Four shapes are made only of straight lines. The odd one out has a curved edge.';\n    noiseCand=['fill','size','dots'];\n  }else if(ruleProp==='evensides'){\n    shared=null;odd=null;\n    explain='Count the sides: four shapes have an even number. The odd one out has an odd number of sides.';\n    noiseCand=['fill','size','dots'];\n  }else if(ruleProp==='symmetry'){\n    shared=null;odd=null;\n    explain='Four shapes are symmetrical: fold them in half and the two sides match. The odd one out has no line of symmetry.';\n    noiseCand=['fill','size','dots'];\n  }else if(ruleProp==='rotmirror'){\n    shared=null;odd=null;\n    explain='Four are the same shape, just turned round different amounts. The odd one out is a mirror image: no amount of turning makes it match the others.';\n    noiseCand=['fill','size','dots'];\n  }else{\n    /* every card is the SAME shape, so the turn is actually visible;\n       the odd one is only 45 degrees further round: a deliberate near-miss */\n    shared=pick([0,45,90]);odd=shared+45;\n    explain='All five are the same shape and four are tilted exactly the same way. One has been given an extra turn.';\n    noiseCand=['fill','size','dots'];\n  }\n\n  var items=[],i;\n  for(i=0;i<5;i++)items.push(deep(b));\n  var oddIdx=ri(5);\n  if(ruleProp==='layer'){\n    /* the pair's overlay shape and fill stay constant; only the front\n       changes on the odd one */\n    var p2=pick(SHAPES.filter(function(s){return s!==b.shape;}));\n    var f2=pick(pool.filter(function(f){return f!==b.fill;}));\n    for(i=0;i<5;i++)items[i].pair={shape2:p2,fill2:f2,front:(i===oddIdx)?odd:shared};\n  }else if(ruleProp==='rel'){\n    /* keeper counts use each value twice so no keeper is a single-property\n       outlier; only the dots=lines relationship singles out the odd one */\n    var relVals=pickN([1,2,3],2);\n    var relAssign=shuffle([relVals[0],relVals[0],relVals[1],relVals[1]]);\n    var kIdx=0;\n    for(i=0;i<5;i++){\n      if(i===oddIdx)continue;\n      items[i].dots=relAssign[kIdx];\n      items[i].lines=relAssign[kIdx];\n      kIdx++;\n    }\n    items[oddIdx].dots=relVals[0];\n    items[oddIdx].lines=relVals[1];\n  }else if(ruleProp==='sidesdots'){\n    /* keepers: dot count equals the shape's side count, two shapes per\n       side count so neither the shapes nor the counts single anyone out */\n    var counts=pickN([3,4,5],2);\n    var sAssign=shuffle([counts[0],counts[0],counts[1],counts[1]]);\n    var sIdx2=0;\n    for(i=0;i<5;i++){\n      if(i===oddIdx)continue;\n      var cSides=sAssign[sIdx2];\n      items[i].shape=pick(SHAPES.filter(function(sh){return SIDES[sh]===cSides;}));\n      items[i].dots=cSides;\n      sIdx2++;\n    }\n    var oddSides=pick(counts);\n    items[oddIdx].shape=pick(SHAPES.filter(function(sh){return SIDES[sh]===oddSides;}));\n    items[oddIdx].dots=(oddSides===counts[0])?counts[1]:counts[0];\n  }else if(ruleProp==='copiesdots'){\n    /* keepers: copies count equals the dot count under the box, values\n       used twice each so neither count alone singles anyone out */\n    var cdVals=shuffle([2,3]);\n    var cdAssign=shuffle([cdVals[0],cdVals[0],cdVals[1],cdVals[1]]);\n    var cdIdx=0;\n    for(i=0;i<5;i++){\n      if(i===oddIdx)continue;\n      items[i].copies=cdAssign[cdIdx];\n      items[i].dots=cdAssign[cdIdx];\n      cdIdx++;\n    }\n    items[oddIdx].copies=cdVals[0];\n    items[oddIdx].dots=cdVals[1];\n  }else if(ruleProp==='curved'){\n    var straightP=pickN(STRAIGHT,4);\n    var sc=0;\n    for(i=0;i<5;i++){\n      if(i===oddIdx)continue;\n      items[i].shape=straightP[sc++];\n    }\n    items[oddIdx].shape=pick(CURVED);\n  }else if(ruleProp==='evensides'){\n    var evenP=pickN(EVENSIDES,4);\n    var ec=0;\n    for(i=0;i<5;i++){\n      if(i===oddIdx)continue;\n      items[i].shape=evenP[ec++];\n    }\n    items[oddIdx].shape=pick(ODDSIDES);\n  }else if(ruleProp==='symmetry'){\n    var symP=pickN(SYMPOOL,4);\n    var yc=0;\n    for(i=0;i<5;i++){\n      if(i===oddIdx)continue;\n      items[i].shape=symP[yc++];\n    }\n    items[oddIdx].shape=pick(CHIRAL);\n  }else if(ruleProp==='rotmirror'){\n    /* the classic GL trap: turn them all the same way in your head and\n       one of them still refuses to match */\n    var rotsM=shuffle([0,90,180,270]);\n    var mc=0;\n    for(i=0;i<5;i++){\n      if(i===oddIdx){\n        items[i].flip='h';\n        items[i].rot=pick([0,90,180,270]);\n      }else{\n        items[i].rot=rotsM[mc];mc++;\n      }\n    }\n  }else{\n    for(i=0;i<5;i++)items[i][ruleProp]=(i===oddIdx)?odd:shared;\n  }\n\n  /* Noise properties vary across all five. Two hard rules, and the second one\n     is why this is not the old \"use every value twice\" scheme:\n       1. no noise property may split 4-1, or it looks like the rule;\n       2. no two of the five may DRAW the same.\n     The old scheme forced every noise value to appear at least twice, which on\n     one noise property guarantees a duplicated pair, and that is exactly what\n     made Foundation questions look like they had the same picture twice. Values\n     used once are fine, because one-of-five cannot be read as \"four share it\". */\n  var ownedProps=OWNED_ODD[ruleProp]||[ruleProp];\n  var nonSolid=false;\n  for(i=0;i<5;i++)if(items[i].stroke&&items[i].stroke!=='solid')nonSolid=true;\n  var fillPool=(ruleProp==='stroke'||nonSolid)?STROKEFILLS.slice():pool.slice();\n  var shapePool=SHAPES.slice();\n  if(ruleProp==='rel')shapePool=SHAPES.filter(function(sh){return SIDES[sh];});\n  var candProps=['shape','fill','size','dots','lines'].filter(function(pr){\n    return ownedProps.indexOf(pr)<0;\n  });\n  function valuesFor(pr){\n    if(pr==='fill')return fillPool;\n    if(pr==='size')return ['s','m','l'];\n    if(pr==='dots')return [0,1,2,3];\n    if(pr==='lines')return [0,1,2,3];\n    return shapePool;\n  }\n  function splits4to1(vals){\n    var c={},k;\n    for(k=0;k<vals.length;k++)c[vals[k]]=(c[vals[k]]||0)+1;\n    for(k in c)if(c[k]===4)return true;\n    return false;\n  }\n  var before=items.map(function(it){return deep(it);});\n  var okDiverse=false,attempt,use,pr2,assigned,k2;\n  for(attempt=0;attempt<80&&!okDiverse;attempt++){\n    items=before.map(function(it){return deep(it);});\n    use=pickN(candProps,Math.min(3,candProps.length));\n    var bad=false;\n    for(pr2=0;pr2<use.length;pr2++){\n      var prop=use[pr2],vs=valuesFor(prop),col=[];\n      for(k2=0;k2<5;k2++)col.push(pick(vs));\n      if(splits4to1(col)){bad=true;break;}\n      for(k2=0;k2<5;k2++){\n        items[k2][prop]=col[k2];\n        if(prop==='fill'&&items[k2].stroke&&items[k2].stroke!=='solid'&&col[k2]==='black')items[k2].fill='grey';\n        if(prop==='shape'&&items[k2].inner)items[k2].inner.shape=col[k2];\n      }\n    }\n    if(bad)continue;\n    /* every option must draw differently from every other one */\n    var seenSvg={},dup=false;\n    for(k2=0;k2<5;k2++){\n      var sv=cellSVG(items[k2]);\n      if(seenSvg[sv]){dup=true;break;}\n      seenSvg[sv]=1;\n    }\n    if(!dup)okDiverse=true;\n  }\n  if(!okDiverse)return null;   /* make() retries rather than shipping twins */\n\n  return {type:'odd',prompt:{kind:'none'},options:items,correct:oddIdx,explain:explain,ruleKey:ruleProp};\n}\n\n/* ---- Type 2/3: Most Like (complete the set) ---- */\nfunction genLike(diff){\n  var pool=FILLPOOL[diff];\n  function consFill(){var f=pick(pool);return{key:'fill',apply:function(s){s.fill=f;if(s.inner)s.inner.fill=innerFillFor(f);},brk:function(s){s.fill=pick(pool.filter(function(x){return x!==f;}));if(s.inner)s.inner.fill=innerFillFor(s.fill);},desc:'is '+FILLDESC[f]};}\n  function consInner(){return{key:'inner',apply:function(s){s.inner={shape:s.shape,fill:innerFillFor(s.fill),size:'s'};},brk:function(s){if(ri(2)===0){s.inner=null;}else{s.inner={shape:pick(SHAPES.filter(function(x){return x!==s.shape;})),fill:innerFillFor(s.fill),size:'s'};}},desc:'has a smaller copy of itself inside'};}\n  function consDots(){var d=1+ri(3);return{key:'dots',apply:function(s){s.dots=d;},brk:function(s){s.dots=d+(d>=4?-1:(d<=1?1:pick([-1,1])));},desc:'has exactly '+d+' dot'+(d>1?'s':'')};}\n  function consLines(){var L=1+ri(3);return{key:'lines',apply:function(s){s.lines=L;},brk:function(s){s.lines=L+(L>=4?-1:(L<=1?1:pick([-1,1])));},desc:'has exactly '+L+' line'+(L>1?'s':'')};}\n  function consSize(){var z=pick(['s','l']);return{key:'size',apply:function(s){s.size=z;},brk:function(s){s.size=(z==='s')?pick(['m','l']):pick(['s','m']);},desc:'is '+SIZEDESC[z]};}\n\n  /* 8 distinct shapes: 3 references, 1 correct, 4 distractors, so every\n     option looks different and the child judges the rule, not the outline */\n  var shs=pickN(SHAPES,8);\n  var spare=SHAPES.filter(function(s){return shs.indexOf(s)<0;});\n\n  function consStroke(){\n    var S=pick(['dash','dot']);\n    return{key:'stroke',\n      apply:function(s){s.stroke=S;if(s.fill==='black')s.fill=pick(STROKEFILLS);},\n      brk:function(s){s.stroke=pick(STROKES.filter(function(k){return k!==S;}));},\n      desc:'has '+STROKEDESC[S]};\n  }\n  function consLayer(){\n    var P=pick(spare);\n    /* never black: a black pair on a black main renders as one\n       silhouette (the ink outline vanishes on black), which makes\n       front/behind unreadable and lets the front-flipped distractor\n       render identically to the correct option */\n    var F2=pick(FILLPOOL[3].filter(function(f){return f!=='black';}));\n    var FR=pick(['main','other']);\n    return{key:'layer',\n      apply:function(s){s.inner=null;s.pair={shape2:P,fill2:F2,front:FR};},\n      brk:function(s){s.pair={shape2:P,fill2:F2,front:(FR==='main')?'other':'main'};},\n      desc:(FR==='other')?('has a '+SHAPEDESC[P]+' sitting in front of it'):('has a '+SHAPEDESC[P]+' hiding behind it')};\n  }\n\n  function consRel(){\n    /* relationship constraint: dots match lines, but the count itself is\n       free to vary between options, so surface counting does not help */\n    return{key:'rel',\n      apply:function(s){var n=1+ri(3);s.dots=n;s.lines=n;},\n      brk:function(s){var n=1+ri(3);s.dots=n;s.lines=(n===3)?pick([1,2]):n+1;},\n      desc:'has the same number of dots as lines'};\n  }\n  function consCopies(){\n    var n=2+ri(3);\n    return{key:'copies',\n      apply:function(s){s.copies=n;},\n      brk:function(s){s.copies=n+((n>=4)?-1:((n<=2)?1:pick([-1,1])));},\n      desc:'holds exactly '+n+' shapes'};\n  }\n  /* shape-pool constraints, the discriminators real GL similarity\n     questions lean on: symmetry, side parity, straight-vs-curved */\n  function mkShapeCons(inPool,outPool,desc){\n    var seqI=shuffle(inPool.slice()),ki=0;\n    var seqO=shuffle(outPool.slice()),ko=0;\n    return{key:'shapepool',\n      apply:function(s){s.shape=seqI[ki++%seqI.length];},\n      brk:function(s){s.shape=seqO[ko++%seqO.length];},\n      desc:desc};\n  }\n  function consSym(){return mkShapeCons(SYMPOOL,CHIRAL,'is symmetrical: fold it in half and the two sides match');}\n  function consEven(){return mkShapeCons(EVENSIDES,ODDSIDES,'has an even number of sides');}\n  function consStraight(){return mkShapeCons(STRAIGHT,CURVED,'is made only of straight lines');}\n\n  var mks={fill:consFill,inner:consInner,dots:consDots,lines:consLines,size:consSize,stroke:consStroke,layer:consLayer,rel:consRel,copies:consCopies,sym:consSym,even:consEven,straight:consStraight};\n  /* dashed strokes vanish on black fills; layered pairs can't also hold\n     an inner shape; the relationship rule owns both counts; cells full\n     of copies ignore inner, layer, size and line overlays */\n  function badKeys(ks){\n    var nShapePool=['sym','even','straight'].filter(function(x){return ks.indexOf(x)>=0;}).length;\n    return (ks.indexOf('fill')>=0&&ks.indexOf('stroke')>=0)\n      ||(ks.indexOf('inner')>=0&&ks.indexOf('layer')>=0)\n      ||(ks.indexOf('rel')>=0&&(ks.indexOf('dots')>=0||ks.indexOf('lines')>=0))\n      ||(ks.indexOf('copies')>=0&&(ks.indexOf('inner')>=0||ks.indexOf('layer')>=0||ks.indexOf('size')>=0||ks.indexOf('lines')>=0||ks.indexOf('rel')>=0))\n      /* only one rule may own the shape choice, and the inner-copy rule\n         must know the final outer shape, so it can't share a question\n         with a shape-pool rule */\n      ||nShapePool>1\n      ||(nShapePool>0&&ks.indexOf('inner')>=0);\n  }\n  var keys;\n  if(diff===1){\n    keys=[pick(['fill','inner','dots','size','lines','copies'])];\n  }else{\n    /* Standard: two rules at once. Challenge: three, per real GL papers\n       where colour, size and count can all be constrained together. */\n    var wantN=(diff===3)?3:2;\n    var keyPool=(diff===3)?['fill','inner','dots','lines','size','stroke','layer','rel','copies','sym','even','straight']:['fill','inner','dots','lines','size','stroke','layer','copies','sym','even','straight'];\n    var tries=0;\n    do{\n      keys=pickN(keyPool,wantN);\n      tries++;\n    }while(tries<16&&badKeys(keys));\n    if(badKeys(keys))keys=(wantN===3)?['fill','size','dots']:['dots','size'];\n  }\n  var cons=keys.map(function(k){return mks[k]();});\n  var hasFillCons=keys.indexOf('fill')>=0;\n  var hasStrokeCons=keys.indexOf('stroke')>=0;\n\n  var fv=hasStrokeCons?STROKEFILLS.slice():pickN(pool,2); /* unconstrained fills vary so they can't be mistaken for the rule */\n  function freshSpec(shape,fillIdx){\n    var s=baseSpec();s.shape=shape;\n    if(!hasFillCons)s.fill=(fillIdx<2)?fv[fillIdx]:pick(fv);\n    cons.forEach(function(c){c.apply(s);});\n    return s;\n  }\n  var refs=[freshSpec(shs[0],0),freshSpec(shs[1],1),freshSpec(shs[2],2)];\n  var correct=freshSpec(shs[3],2);\n  var opts=[correct];\n  for(var i=0;i<4;i++){\n    var d=freshSpec(shs[4+i],2);\n    cons[i%cons.length].brk(d);\n    opts.push(d);\n  }\n  var correctIdx=ri(5);\n  var tmp=opts[0];opts[0]=opts[correctIdx];opts[correctIdx]=tmp;\n\n  /* Same fairness check as Most Like: if all three references happen to share a\n     property the answer does not, and a wrong option does share it, a child who\n     follows that property is punished for good reasoning. Rare here because\n     three references have to coincide, but not zero, so reject and redraw. */\n  var chkL=['shape','fill','size','dots','lines','stroke','copies'],pl,ol;\n  for(pl=0;pl<chkL.length;pl++){\n    var prL=chkL[pl];\n    var vL=function(x){return String(prL==='copies'?(x.copies||1):x[prL]);};\n    var allSame=true;\n    for(ol=1;ol<refs.length;ol++)if(vL(refs[ol])!==vL(refs[0])){allSame=false;break;}\n    if(!allSame)continue;\n    if(vL(opts[correctIdx])===vL(refs[0]))continue;\n    for(ol=0;ol<opts.length;ol++){\n      if(ol===correctIdx)continue;\n      if(vL(opts[ol])===vL(refs[0]))return null;\n    }\n  }\n\n  var explain='Every shape in the set '+cons.map(function(c){return c.desc;}).join(' and ')+'. Only one option does the same.';\n  return {type:'like',prompt:{kind:'row',cells:refs},options:opts,correct:correctIdx,explain:explain,ruleKey:keys.slice().sort().join('+')};\n}\n\n/* ---- Type 3b: MOST LIKE ----\n   Two example figures in a box, five options, pick the one that is most like\n   the pair. The point of difference from Complete the Set is the information:\n   only two examples, so every property they happen to share has to be tested,\n   and each distractor deliberately mimics one loud surface property of an\n   example while breaking the actual rule. Every rule carries an ok() predicate\n   so the build can prove exactly one option satisfies all of them. */\nfunction genMostLike(diff){\n  var pool=FILLPOOL[diff];\n  var strokeFillsOnly=false;\n\n  function rFill(){\n    var f=pick(pool);\n    return {key:'fill',owns:'fill',\n      apply:function(s){s.fill=f;if(s.inner)s.inner.fill=innerFillFor(f);},\n      brk:function(s){s.fill=pick(pool.filter(function(x){return x!==f;}));if(s.inner)s.inner.fill=innerFillFor(s.fill);},\n      ok:function(s){return s.fill===f;},\n      desc:'is '+FILLDESC[f]};\n  }\n  function rSize(){\n    var z=pick(['s','l']);\n    return {key:'size',owns:'size',\n      apply:function(s){s.size=z;},\n      brk:function(s){s.size=(z==='s')?pick(['m','l']):pick(['s','m']);},\n      ok:function(s){return s.size===z;},\n      desc:'is '+SIZEDESC[z]};\n  }\n  function rDots(){\n    var n=1+ri(3);\n    return {key:'dots',owns:'dots',\n      apply:function(s){s.dots=n;},\n      brk:function(s){s.dots=(n<=1)?1+n:n-1;},\n      ok:function(s){return s.dots===n;},\n      desc:'has '+n+' dot'+(n>1?'s':'')};\n  }\n  function rLines(){\n    var n=1+ri(3);\n    return {key:'lines',owns:'lines',\n      apply:function(s){s.lines=n;},\n      brk:function(s){s.lines=(n<=1)?1+n:n-1;},\n      ok:function(s){return s.lines===n;},\n      desc:'has '+n+' line'+(n>1?'s':'')};\n  }\n  function rStroke(){\n    var k=pick(['dash','dot']);\n    strokeFillsOnly=true;\n    return {key:'stroke',owns:'stroke',\n      apply:function(s){s.stroke=k;if(s.fill==='black')s.fill=pick(STROKEFILLS);},\n      brk:function(s){s.stroke=pick(STROKES.filter(function(x){return x!==k;}));},\n      ok:function(s){return s.stroke===k;},\n      desc:'has '+STROKEDESC[k]};\n  }\n  function rCopies(){\n    var n=2+ri(3);\n    return {key:'copies',owns:'copies',\n      apply:function(s){s.copies=n;s.inner=null;},\n      brk:function(s){s.copies=(n<=2)?n+1:n-1;},\n      ok:function(s){return (s.copies||1)===n;},\n      desc:'appears '+n+' times'};\n  }\n  function rInner(){\n    return {key:'inner',owns:'inner',\n      apply:function(s){s.inner={shape:s.shape,fill:innerFillFor(s.fill),size:'s'};},\n      brk:function(s){s.inner=(ri(2)===0)?null:{shape:pick(SHAPES.filter(function(x){return x!==s.shape;})),fill:innerFillFor(s.fill),size:'s'};},\n      ok:function(s){return !!(s.inner&&s.inner.shape===s.shape);},\n      desc:'has a smaller copy of itself inside'};\n  }\n  /* shape-property rules: these own the shape, so only one can be in play */\n  function rPool(key,inPool,outPool,desc){\n    var seqI=shuffle(inPool.slice()),ki=0,seqO=shuffle(outPool.slice()),ko=0;\n    return {key:key,owns:'shape',\n      apply:function(s){s.shape=seqI[ki++%seqI.length];},\n      brk:function(s){s.shape=seqO[ko++%seqO.length];},\n      ok:function(s){return inPool.indexOf(s.shape)>=0;},\n      desc:desc};\n  }\n  var mks={\n    fill:rFill,size:rSize,dots:rDots,lines:rLines,stroke:rStroke,copies:rCopies,inner:rInner,\n    curved:function(){return rPool('curved',CURVED,STRAIGHT,'has a curved edge');},\n    straight:function(){return rPool('straight',STRAIGHT,CURVED,'is made only of straight lines');},\n    sym:function(){return rPool('sym',SYMPOOL,CHIRAL,'is symmetrical: fold it in half and the two sides match');},\n    even:function(){return rPool('even',EVENSIDES,ODDSIDES,'has an even number of sides');}\n  };\n  function badKeys(ks){\n    var nShape=['curved','straight','sym','even'].filter(function(x){return ks.indexOf(x)>=0;}).length;\n    return nShape>1\n      ||(ks.indexOf('fill')>=0&&ks.indexOf('stroke')>=0)\n      ||(ks.indexOf('inner')>=0&&nShape>0)\n      ||(ks.indexOf('copies')>=0&&(ks.indexOf('inner')>=0||ks.indexOf('size')>=0||ks.indexOf('lines')>=0));\n  }\n  var keys,tries=0;\n  if(diff===1){\n    keys=[pick(['fill','size','dots','copies','curved','straight','even'])];\n  }else{\n    var want=(diff===3)?3:2;\n    var keyPool=(diff===3)\n      ? ['fill','size','dots','lines','stroke','copies','inner','curved','straight','sym','even']\n      : ['fill','size','dots','lines','stroke','copies','inner','curved','straight','even'];\n    do{ keys=pickN(keyPool,want); tries++; }while(tries<20&&badKeys(keys));\n    if(badKeys(keys))keys=(want===3)?['fill','size','dots']:['fill','dots'];\n  }\n  var rules=keys.map(function(k){return mks[k]();});\n  var owned={};\n  rules.forEach(function(r){owned[r.owns]=true;});\n\n  /* every property the rules do not own varies between the two examples, so a\n     child cannot read a coincidence as the rule */\n  var fillChoices=strokeFillsOnly?STROKEFILLS.slice():pool.slice();\n  var freeShapes=shuffle(SHAPES.slice());\n  var fsi=0;\n  function nextShape(){return freeShapes[fsi++%freeShapes.length];}\n  function build(shape){\n    var s=baseSpec();\n    s.shape=shape||nextShape();\n    if(!owned.fill)s.fill=pick(fillChoices);\n    if(!owned.size&&!owned.copies)s.size=pick(['s','m','l']);\n    if(!owned.dots)s.dots=ri(3);\n    if(!owned.lines&&!owned.copies)s.lines=ri(3);\n    if(!owned.stroke&&!owned.copies&&!strokeFillsOnly&&ri(3)===0)s.stroke=pick(STROKES);\n    rules.forEach(function(r){r.apply(s);});\n    if(s.stroke!=='solid'&&s.fill==='black')s.fill=pick(STROKEFILLS);\n    /* the copies renderer draws n small shapes and ignores size, lines, stroke\n       and inner: leave them at their defaults or two options serialise as\n       different and still draw identically */\n    if(s.copies){s.size='m';s.lines=0;s.stroke='solid';s.inner=null;}\n    return s;\n  }\n  function passes(s){return rules.every(function(r){return r.ok(s);});}\n\n  var refs=[build(),build()],rg=0;\n  while(cellSVG(refs[0])===cellSVG(refs[1])&&rg++<30)refs[1]=build();\n  if(cellSVG(refs[0])===cellSVG(refs[1]))return null;\n\n  /* The two examples must share NOTHING except the rule. If they happen to\n     share, say, a grey fill as well, a child who spots that and follows it can\n     land on a wrong answer that is also grey: they reasoned properly and were\n     punished for it. Measured at 43% of questions before this loop existed.\n     Every property the rules do not own is forced to differ between them. */\n  var freeProps=['shape','fill','size','dots','lines','stroke'].filter(function(pr){\n    return !owned[pr] && !(owned.copies&&(pr==='size'||pr==='lines'||pr==='stroke'));\n  });\n  freeProps.forEach(function(pr){\n    var tries=0;\n    while(String(refs[0][pr])===String(refs[1][pr])&&tries++<24){\n      if(pr==='shape'){\n        var sh=pick(SHAPES.filter(function(x){return x!==refs[0].shape;}));\n        refs[1].shape=sh;\n        if(refs[1].inner)refs[1].inner.shape=sh;\n      }\n      else if(pr==='fill')refs[1].fill=pick(fillChoices.filter(function(x){return x!==refs[0].fill;}));\n      else if(pr==='size')refs[1].size=pick(['s','m','l'].filter(function(x){return x!==refs[0].size;}));\n      else if(pr==='dots')refs[1].dots=pick([0,1,2,3].filter(function(x){return x!==refs[0].dots;}));\n      else if(pr==='lines')refs[1].lines=pick([0,1,2,3].filter(function(x){return x!==refs[0].lines;}));\n      else if(pr==='stroke')refs[1].stroke=pick(STROKES.filter(function(x){return x!==(refs[0].stroke||'solid');}));\n    }\n    if(refs[1].stroke&&refs[1].stroke!=='solid'&&refs[1].fill==='black')refs[1].fill=pick(STROKEFILLS);\n  });\n  /* the rules still have to hold on both examples after that shuffling */\n  rules.forEach(function(r){r.apply(refs[0]);r.apply(refs[1]);});\n  if(!passes(refs[0])||!passes(refs[1]))return null;\n  if(cellSVG(refs[0])===cellSVG(refs[1]))return null;\n  var refSvg=[cellSVG(refs[0]),cellSVG(refs[1])];\n  /* An answer that is a copy of one of the examples is not a question: the\n     child either picks it for the wrong reason, or is left with two answers that\n     look equally right. Nothing in the answer row may draw like an example. */\n  function isRefCopy(sp){var v=cellSVG(sp);return v===refSvg[0]||v===refSvg[1];}\n  var correct=build(),cg=0;\n  while(isRefCopy(correct)&&cg++<30)correct=build();\n  if(isRefCopy(correct))return null;\n  /* the correct answer must not be the easy surface match: give it an outline\n     the examples do not use, whenever the rules leave the shape free */\n  if(!owned.shape){\n    var used=[refs[0].shape,refs[1].shape];\n    var free=SHAPES.filter(function(x){return used.indexOf(x)<0;});\n    if(free.length){correct.shape=pick(free);if(correct.inner)correct.inner.shape=correct.shape;}\n  }\n\n  var opts=[correct],guard=0;\n  while(opts.length<5&&guard<200){\n    guard++;\n    var d=build(ri(2)===0?pick([refs[0].shape,refs[1].shape]):null);   /* half of them mimic an example's outline */\n    var brkRule=rules[(opts.length-1)%rules.length];\n    brkRule.brk(d);\n    if(passes(d))continue;                       /* a broken rule must really be broken */\n    if(isRefCopy(d))continue;                    /* and it must not be an example redrawn */\n    /* compared on the rendered SVG as well as the serialisation: ser() and the\n       renderer can disagree, and it is the drawing the child sees */\n    var sd=ser(d),vd=cellSVG(d),clash=false;\n    for(var j=0;j<opts.length;j++){\n      if(ser(opts[j])===sd||cellSVG(opts[j])===vd){clash=true;break;}\n    }\n    if(clash)continue;\n    opts.push(d);\n  }\n  if(opts.length<5)return null;                  /* make() retries, never ships a short list */\n  if(!passes(correct))return null;\n\n  var correctIdx=ri(5);\n  var tmp=opts[0];opts[0]=opts[correctIdx];opts[correctIdx]=tmp;\n\n  /* Last check, because forcing the examples apart cannot cover every pool: if\n     any property the examples still share leads to a wrong answer while the\n     right answer does not share it, that is a false trail. Reject and redraw. */\n  var chk=['shape','fill','size','dots','lines','stroke','copies'],ci2,pi,oi;\n  for(pi=0;pi<chk.length;pi++){\n    var prop2=chk[pi];\n    var vA=(prop2==='copies')?(refs[0].copies||1):refs[0][prop2];\n    var vB=(prop2==='copies')?(refs[1].copies||1):refs[1][prop2];\n    if(String(vA)!==String(vB))continue;\n    var vC=(prop2==='copies')?(opts[correctIdx].copies||1):opts[correctIdx][prop2];\n    if(String(vC)===String(vA))continue;          /* the answer shares it too: no trail */\n    for(oi=0;oi<opts.length;oi++){\n      if(oi===correctIdx)continue;\n      var vO=(prop2==='copies')?(opts[oi].copies||1):opts[oi][prop2];\n      if(String(vO)===String(vA))return null;     /* a wrong answer sits on the trail */\n    }\n  }\n\n  var descs=rules.map(function(r){return r.desc;});\n  var joined=(descs.length===1)?descs[0]:(descs.slice(0,-1).join(', ')+' and '+descs[descs.length-1]);\n  var howMany=(descs.length===1)?'one thing':((descs.length===2)?'two things':'three things');\n  var explain='Both shapes in the box share '+howMany+': each '+joined+'.<br>Only one of the five answers does the same. The others copy an outline or a shade instead.';\n  return {type:'mostlike',prompt:{kind:'pairbox',cells:refs},options:opts,correct:correctIdx,\n          explain:explain,ruleKey:keys.slice().sort().join('+')};\n}\n\n/* ---- Type 4: Series / Sequences ---- */\nfunction genSeries(diff){\n  var pool=FILLPOOL[diff];\n  function rotRule(){\n    var mag=(diff===3)?45:pick([45,90]);\n    var dir=pick([1,-1]);\n    var step=mag*dir;\n    var start=pick([0,45,90]);\n    return{key:'rot',rotsafe:true,rot90:(mag===90),set:function(s,i){s.rot=start+i*step;},desc:'the shape turns '+(mag===45?'45\u00B0':'a quarter turn')+(dir===1?' clockwise':' anticlockwise')};\n  }\n  function dotsRule(){var st=pick([0,1]);return{key:'dots',set:function(s,i){s.dots=st+i;},desc:'it gains one dot'};}\n  function fillRule(){var cyc=pickN(pool,(diff===1)?2:pick([2,3]));return{key:'fill',set:function(s,i){s.fill=cyc[i%cyc.length];},desc:'the shading repeats in a fixed pattern'};}\n  function sizeRule(){var cyc=shuffle(['s','m','l']);return{key:'size',set:function(s,i){s.size=cyc[i%3];},desc:'the size repeats in a fixed pattern'};}\n  function posRule(){\n    /* eight perimeter spots, so two spots = 90\u00B0: described in degrees or\n       as \"one space\", never \"three places\" (meaningless to a child) */\n    var st=ri(8);\n    var mag=pick([1,2]);\n    var dir=pick([1,-1]);\n    var word=(dir===1)?'clockwise':'anticlockwise';\n    return{key:'pos',set:function(s,i){s.pos=PERIM[((st+i*mag*dir)%8+8)%8];},desc:(mag===2)\n      ?('the shape moves 90\u00B0 (a quarter of the way) '+word+' around the box')\n      :('the shape moves one space '+word+' around the edge of the box')};\n  }\n  function strokeRule(){var cyc=shuffle(STROKES.slice());return{key:'stroke',set:function(s,i){s.stroke=cyc[i%3];},desc:'the outline style repeats in a fixed pattern'};}\n  function flipRule(){var st=ri(2);var axis=pick(['h','v']);return{key:'flip',chiral:true,set:function(s,i){s.flip=((st+i)%2===1)?axis:false;},desc:'the shape flips into its mirror image each step'};}\n  function morphRule(){\n    /* shape gains (or loses) one side each step along the chain\n       triangle, square, pentagon, hexagon, heptagon, octagon. The chain\n       is one longer than the sequence, so the starting shape varies. */\n    var dir=pick([1,-1]);\n    var st=(dir===1)?ri(2):(4+ri(2));\n    return{key:'shape',set:function(s,i){var idx=st+dir*i;s.shape=MORPH[Math.max(0,Math.min(5,idx))];},desc:'the shape '+(dir===1?'gains':'loses')+' one side each step'};\n  }\n  function copiesRule(){\n    return{key:'copies',set:function(s,i){s.copies=Math.max(1,Math.min(5,1+i));},desc:'one more shape appears'};\n  }\n  function stutterRotRule(){\n    /* interleaved pattern: the turn only happens every second step, the\n       classic \"rule applies every other image\" trap from hard GL papers.\n       Never used alone: two consecutive frames would look identical. */\n    var step=pick([45,90]);var st=pick([0,45,90]);var ph=ri(2);\n    return{key:'rot',rotsafe:true,rot90:(step===90),noSolo:true,set:function(s,i){s.rot=st+step*Math.floor((i+ph)/2);},desc:'the shape turns only on every second step'};\n  }\n  function stutterDotsRule(){\n    /* same trap on counting: a dot is added only every other step */\n    var st=pick([0,1]);var ph=ri(2);\n    return{key:'dots',noSolo:true,set:function(s,i){s.dots=st+Math.floor((i+ph)/2);},desc:'a dot is added only on every second step'};\n  }\n\n  /* incompatible pairs: pos shrinks the shape (hides size); a mirrored\n     rotation can be read as a different rotation (rot vs flip); dashes\n     vanish on the black/patterned fills a fill cycle can pick; the morph\n     chain is neither rotation-safe nor chiral; cells full of copies\n     ignore position, size, rotation and flips, and a second count rule\n     alongside copies is confusing rather than hard */\n  function badPair(a,b){\n    var k=[a.key,b.key];\n    function has(x){return k.indexOf(x)>=0;}\n    return (has('pos')&&has('size'))\n      ||(has('rot')&&has('flip'))\n      ||(has('fill')&&has('stroke'))\n      ||a.key===b.key\n      ||(has('copies')&&(has('pos')||has('size')||has('rot')||has('flip')||has('dots')))\n      ||(has('shape')&&(has('rot')||has('flip')));\n  }\n  function badSet(fs){\n    for(var x=0;x<fs.length;x++)for(var y=x+1;y<fs.length;y++)if(badPair(fs[x],fs[y]))return true;\n    return false;\n  }\n  var rules;\n  if(diff===1){\n    rules=[pick([rotRule,dotsRule,posRule,morphRule,copiesRule])()];\n  }else if(diff===2){\n    /* Standard: two rules, one time in three a third joins in */\n    var wantS=(ri(3)===0)?3:2;\n    var fs,tries=0;\n    do{\n      fs=pickN([rotRule,dotsRule,fillRule,sizeRule,posRule,strokeRule,flipRule,morphRule,copiesRule],wantS).map(function(f){return f();});\n      tries++;\n    }while(tries<12&&badSet(fs));\n    if(badSet(fs))fs=[rotRule(),dotsRule()];\n    rules=fs;\n  }else{\n    /* Challenge: three rules changing at once; half the time one of them\n       is an interleaved every-other-step rule (turn or dot) */\n    var fs3,tries3=0;\n    do{\n      fs3=pickN([rotRule,stutterRotRule,stutterDotsRule,dotsRule,fillRule,sizeRule,posRule,strokeRule,flipRule,morphRule,copiesRule],3).map(function(f){return f();});\n      tries3++;\n    }while(tries3<16&&badSet(fs3));\n    if(badSet(fs3))fs3=[rotRule(),dotsRule(),fillRule()];\n    if(!fs3.some(function(r){return r.noSolo;})&&ri(2)===0){\n      var stut=pick([stutterRotRule,stutterDotsRule])();\n      for(var sw=0;sw<3;sw++){\n        var trial=fs3.slice();trial[sw]=stut;\n        if(!badSet(trial)){fs3=trial;break;}\n      }\n    }\n    rules=fs3;\n  }\n  var needChiral=rules.some(function(r){return r.chiral;});\n  var needRot=rules.some(function(r){return r.rotsafe;});\n  var needRot90=rules.some(function(r){return r.rot90;});\n  var base=baseSpec();\n  base.shape=needChiral?pick(CHIRAL):(needRot90?pick(ROT90SAFE):(needRot?pick(ROTSAFE):pick(SHAPES)));\n  if(!rules.some(function(r){return r.key==='fill';}))base.fill=pick(pool);\n  if(rules.some(function(r){return r.key==='stroke';}))base.fill=pick(STROKEFILLS);\n\n  function frame(i){var s=deep(base);rules.forEach(function(r){r.set(s,i);});return s;}\n  var frames=[frame(0),frame(1),frame(2),frame(3),frame(4)];\n  var missing=1+ri(4);\n  var correct=frames[missing];\n\n  var cands=[frame(missing-1),frame(missing+1)];\n  if(rules.length>=2){\n    /* right idea, half-applied: one rule freezes while the rest step.\n       With three rules these near-misses are what make Challenge hard:\n       every distractor gets two of the three changes right. */\n    rules.forEach(function(r){\n      var pa=frame(missing);r.set(pa,missing-1);cands.push(pa);\n    });\n  }else{\n    cands.push(frame(missing+2));\n    cands.push(frame(Math.max(0,missing-2)));\n  }\n  var seen={};seen[ser(correct)]=true;\n  var distractors=[];\n  cands.forEach(function(c){\n    var k=ser(c);\n    if(!seen[k]&&distractors.length<4){seen[k]=true;distractors.push(c);}\n  });\n  var guard=0;\n  while(distractors.length<4&&guard<40){\n    guard++;\n    var m=mutate(deep(correct));\n    var k2=ser(m);\n    if(!seen[k2]){seen[k2]=true;distractors.push(m);}\n  }\n  if(distractors.length<4)return null;\n\n  var opts=distractors.slice();\n  var correctIdx=ri(5);\n  opts.splice(correctIdx,0,correct);\n\n  /* A cycling rule can land the missing step on a picture already drawn in the\n     sequence, and then the answer is sitting on screen to be copied. Reject it\n     and let makeQuestion draw another. */\n  var shownSvg={},fi;\n  for(fi=0;fi<frames.length;fi++)if(fi!==missing&&frames[fi])shownSvg[cellSVG(frames[fi])]=1;\n  if(shownSvg[cellSVG(correct)])return null;\n\n  var explain='Each step, '+rules.map(function(r){return r.desc;}).join(', and ')+'.';\n  return {type:'series',prompt:{kind:'series',cells:frames,missing:missing},options:opts,correct:correctIdx,explain:explain,ruleKey:rules.map(function(r){return r.key;}).sort().join('+')};\n}\n\n/* ---- Type 7: Analogies ---- */\nfunction genAnalogy(diff){\n  var pool=FILLPOOL[diff];\n  var TR={\n    rot:{pre:function(s){return ROT90SAFE.indexOf(s.shape)>=0;},ap:function(s){s.rot=(s.rot||0)+90;},desc:'is turned a quarter turn'},\n    invert:{pre:function(s){return s.fill==='black'||s.fill==='white';},ap:function(s){s.fill=(s.fill==='black')?'white':'black';if(s.inner){s.inner.fill=(s.fill==='black')?'white':'black';}},desc:'swaps black and white'},\n    shrink:{pre:function(s){return s.size==='l';},ap:function(s){s.size='s';},desc:'shrinks'},\n    addDot:{pre:function(s){return s.dots>=1&&s.dots<=3;},ap:function(s){s.dots+=1;},desc:'gains one dot'},\n    swap:{pre:function(s){return !!s.inner;},ap:function(s){var f=s.fill;s.fill=s.inner.fill;s.inner.fill=f;},desc:'swaps its outer and inner shading'},\n    loseInner:{pre:function(s){return !!s.inner;},ap:function(s){s.inner=null;},desc:'loses its inner shape'},\n    mirror:{pre:function(s){return CHIRAL.indexOf(s.shape)>=0&&!s.rot;},ap:function(s){s.flip=s.flip?false:'h';},desc:'is flipped left to right into its mirror image'},\n    mirrorV:{pre:function(s){return CHIRAL.indexOf(s.shape)>=0&&!s.rot;},ap:function(s){s.flip=s.flip?false:'v';},desc:'is flipped top to bottom into its mirror image'},\n    strokeT:{pre:function(s){return s.stroke==='solid'&&s.fill!=='black';},ap:function(s){s.stroke='dash';},desc:'has its outline turn dashed'},\n    frontSwap:{pre:function(s){return !!s.pair;},ap:function(s){s.pair.front=(s.pair.front==='main')?'other':'main';},desc:'swaps which shape sits in front'},\n    rot45:{pre:function(s){return ROTSAFE.indexOf(s.shape)>=0;},ap:function(s){s.rot=(s.rot||0)+45;},desc:'is turned 45 degrees'},\n    rot180:{pre:function(s){return ROT90SAFE.indexOf(s.shape)>=0;},ap:function(s){s.rot=(s.rot||0)+180;},desc:'is turned upside down (a half turn)'},\n    grow:{pre:function(s){return s.size==='s';},ap:function(s){s.size='l';},desc:'grows bigger'},\n    loseDot:{pre:function(s){return s.dots>=2;},ap:function(s){s.dots-=1;},desc:'loses one dot'},\n    swapShapes:{pre:function(s){return !!s.inner&&s.inner.shape!==s.shape;},ap:function(s){var t=s.shape;s.shape=s.inner.shape;s.inner.shape=t;},desc:'has its inner and outer shapes swap places'},\n    gainSide:{pre:function(s){return MORPH.indexOf(s.shape)>=0&&MORPH.indexOf(s.shape)<MORPH.length-1&&!s.rot&&!s.flip;},ap:function(s){s.shape=MORPH[MORPH.indexOf(s.shape)+1];},desc:'gains one side'}\n  };\n  /* ambiguous or unreadable pairings: swap/invert both rewrite fills;\n     invert can turn a dashed outline's fill black; mirror vs rot can be\n     misread as each other; layered pairs ignore rot/flip/inner */\n  var CONFLICTS=[['swap','invert'],['invert','strokeT'],['mirror','rot'],['mirror','rot45'],['rot','rot45'],\n                 ['mirrorV','rot'],['mirrorV','rot45'],['mirror','mirrorV'],\n                 ['frontSwap','rot'],['frontSwap','rot45'],['frontSwap','mirror'],['frontSwap','mirrorV'],\n                 ['frontSwap','swap'],['frontSwap','loseInner'],['frontSwap','swapShapes'],\n                 ['swapShapes','loseInner'],['swapShapes','mirror'],['swapShapes','mirrorV'],\n                 ['gainSide','rot'],['gainSide','rot45'],['gainSide','mirror'],['gainSide','mirrorV'],['gainSide','swapShapes'],\n                 ['rot180','rot'],['rot180','rot45'],['rot180','mirror'],['rot180','mirrorV'],\n                 ['rot180','frontSwap'],['rot180','gainSide'],\n                 ['grow','shrink'],['loseDot','addDot'],['swap','loseInner']];\n  function conflicted(keys){\n    return CONFLICTS.some(function(c){return keys.indexOf(c[0])>=0&&keys.indexOf(c[1])>=0;});\n  }\n  var tkeys;\n  if(diff===1)tkeys=[pick(['rot','invert','shrink','mirror','gainSide'])];\n  else if(diff===2){\n    /* Standard: two changes at once */\n    var tries2=0;\n    do{\n      tkeys=pickN(['rot','rot180','invert','addDot','loseDot','swap','loseInner','mirror','mirrorV','strokeT','frontSwap','swapShapes','gainSide','grow'],2);\n      tries2++;\n    }while(tries2<20&&conflicted(tkeys));\n    if(conflicted(tkeys))tkeys=['addDot','strokeT'];\n  }else{\n    /* Challenge: three changes at once (turn + shade + count and the\n       like), the compound transformations hard GL papers lean on */\n    var tries=0;\n    do{\n      tkeys=pickN(['rot','rot45','rot180','invert','addDot','loseDot','swap','strokeT','mirror','mirrorV','frontSwap','swapShapes','gainSide','grow'],3);\n      tries++;\n    }while(tries<20&&conflicted(tkeys));\n    if(conflicted(tkeys))tkeys=['rot','addDot','strokeT'];\n  }\n\n  function shapePoolFor(keys){\n    if(keys.indexOf('mirror')>=0||keys.indexOf('mirrorV')>=0)return CHIRAL;\n    if(keys.indexOf('gainSide')>=0)return MORPH.slice(0,MORPH.length-1);\n    if(keys.indexOf('rot')>=0||keys.indexOf('rot180')>=0)return ROT90SAFE;\n    if(keys.indexOf('rot45')>=0)return ROTSAFE;\n    return SHAPES;\n  }\n  var A=baseSpec();\n  A.shape=pick(shapePoolFor(tkeys));\n  A.fill=(tkeys.indexOf('invert')>=0)?pick(['black','white']):pick(pool);\n  if(tkeys.indexOf('strokeT')>=0&&A.fill==='black')A.fill=pick(STROKEFILLS);\n  if(tkeys.indexOf('shrink')>=0)A.size='l';\n  if(tkeys.indexOf('grow')>=0)A.size='s';\n  if(tkeys.indexOf('addDot')>=0)A.dots=1+ri(2);\n  if(tkeys.indexOf('loseDot')>=0)A.dots=2+ri(2);\n  if(tkeys.indexOf('swap')>=0||tkeys.indexOf('loseInner')>=0||tkeys.indexOf('swapShapes')>=0){\n    A.inner={shape:pick(SHAPES.filter(function(x){return x!==A.shape;})),fill:innerFillFor(A.fill),size:'s'};\n  }\n  if(tkeys.indexOf('frontSwap')>=0){\n    A.inner=null;\n    A.pair={shape2:pick(SHAPES.filter(function(x){return x!==A.shape;})),fill2:pick(pool.filter(function(x){return x!==A.fill;})),front:pick(['main','other'])};\n  }\n  function applyAll(s){tkeys.forEach(function(k){TR[k].ap(s);});return s;}\n  var B=applyAll(deep(A));\n  if(ser(B)===ser(A))return null;\n\n  var C=deep(A);\n  var cShapes=shapePoolFor(tkeys);\n  C.shape=pick(cShapes.filter(function(x){return x!==A.shape;}));\n  if(C.inner)C.inner.shape=pick(SHAPES.filter(function(x){return x!==C.shape;}));\n  if(C.pair)C.pair.shape2=pick(SHAPES.filter(function(x){return x!==C.shape&&x!==A.pair.shape2;}));\n  if(tkeys.indexOf('invert')<0){\n    var cfPool=(tkeys.indexOf('strokeT')>=0)?STROKEFILLS:pool;\n    var cfOpts=cfPool.filter(function(x){return x!==A.fill;});\n    if(cfOpts.length){\n      var nf=pick(cfOpts);\n      C.fill=nf;\n      if(C.inner)C.inner.fill=innerFillFor(nf);\n      if(C.pair&&C.pair.fill2===nf)C.pair.fill2=pick(pool.filter(function(x){return x!==nf;}));\n    }\n  }\n  if(!tkeys.every(function(k){return TR[k].pre(C);}))return null;\n  var correct=applyAll(deep(C));\n  if(ser(correct)===ser(C))return null;\n\n  var cands=[deep(C),deep(B)];\n  var otherK=pick(Object.keys(TR).filter(function(k){return tkeys.indexOf(k)<0&&TR[k].pre(C);}));\n  if(otherK){var w=deep(C);TR[otherK].ap(w);cands.push(w);}\n  if(tkeys.length>=2){\n    /* near-misses: all the changes applied except one */\n    tkeys.forEach(function(skipK){\n      var half=deep(C);\n      tkeys.forEach(function(k){if(k!==skipK)TR[k].ap(half);});\n      cands.push(half);\n    });\n  }else{\n    var over=deep(C);TR[tkeys[0]].ap(over);TR[tkeys[0]].ap(over);cands.push(over);\n  }\n\n  var seen={};seen[ser(correct)]=true;\n  var distractors=[];\n  cands.forEach(function(c){\n    var k=ser(c);\n    if(!seen[k]&&distractors.length<4){seen[k]=true;distractors.push(c);}\n  });\n  var guard=0;\n  while(distractors.length<4&&guard<40){\n    guard++;\n    var m=mutate(deep(correct));\n    var k2=ser(m);\n    if(!seen[k2]){seen[k2]=true;distractors.push(m);}\n  }\n  if(distractors.length<4)return null;\n\n  var opts=distractors.slice();\n  var correctIdx=ri(5);\n  opts.splice(correctIdx,0,correct);\n\n  var explain='The second shape '+tkeys.map(function(k){return TR[k].desc;}).join(' and ')+' compared with the first. The answer does the same to the third shape.';\n  return {type:'analogy',prompt:{kind:'analogy',cells:[A,B,C]},options:opts,correct:correctIdx,explain:explain,ruleKey:tkeys.slice().sort().join('+')};\n}\n\n/* ---- Type 8: Matrices ---- */\n/* Row-sequence matrices: every row applies the same left-to-right\n   change, each row starting from its own base shape and shading. The\n   cyclic Latin grids always leave a diagonal stripe a child can copy;\n   here the answer only comes from crossing the row's base with the\n   column's step, so the diagonal shortcut is dead. */\nfunction genMatrixRowseq(diff){\n  var pool=FILLPOOL[diff];\n  function rot90R(){return{key:'rot',rotsafe90:true,ap:function(s,c){s.rot=(s.rot||0)+90*c;},desc:'turns a quarter turn (90\u00B0)'};}\n  function rot45R(){return{key:'rot',rotsafe:true,ap:function(s,c){s.rot=(s.rot||0)+45*c;},desc:'turns 45\u00B0'};}\n  function dotsR(){var st=pick([0,1]);return{key:'dots',ap:function(s,c){s.dots=Math.max(0,st+c);},desc:'gains a dot'};}\n  function sizeR(){return{key:'size',ap:function(s,c){s.size=['s','m','l'][Math.max(0,Math.min(2,c))];},desc:'grows bigger'};}\n  function morphR(){return{key:'shape',morph:true,ap:function(s,c){s.shape=MORPH[Math.max(0,Math.min(5,MORPH.indexOf(s.shape)+c))];},desc:'gains one side'};}\n  var wantN=(diff===3)?2:1;\n  function bad(rs){\n    var ks=rs.map(function(r){return r.key;});\n    for(var x=0;x<ks.length;x++)for(var y=x+1;y<ks.length;y++)if(ks[x]===ks[y])return true;\n    /* morph chain shapes are not rotation-safe */\n    return ks.indexOf('rot')>=0&&ks.indexOf('shape')>=0;\n  }\n  var rules,tries=0;\n  do{\n    rules=pickN([rot90R,rot45R,dotsR,sizeR,morphR],wantN).map(function(f){return f();});\n    tries++;\n  }while(tries<12&&bad(rules));\n  if(bad(rules))rules=(wantN===2)?[rot90R(),dotsR()]:[dotsR()];\n  var hasMorph=rules.some(function(r){return r.morph;});\n  var needR90=rules.some(function(r){return r.rotsafe90;});\n  var needR=rules.some(function(r){return r.rotsafe;});\n  var shapePool=needR90?ROT90SAFE:(needR?ROTSAFE:SHAPES);\n  var rowFills=pickN(pool,3);\n  var rowShapes=hasMorph?null:pickN(shapePool,3);\n  var morphSt=ri(2);\n  function cellAt(r,c){\n    var s=baseSpec();\n    s.fill=rowFills[r];\n    s.shape=hasMorph?MORPH[morphSt+r]:rowShapes[r];\n    rules.forEach(function(ru){ru.ap(s,c);});\n    return s;\n  }\n  var cells=[];\n  for(var r2=0;r2<3;r2++)for(var c2=0;c2<3;c2++)cells.push(cellAt(r2,c2));\n  var blank=ri(9);\n  var br=Math.floor(blank/3),bc=blank%3;\n  var correct=cells[blank];\n  /* near-misses: right row but one step over/under, right step but the\n     wrong row's base, and the diagonal neighbour for diagonal-guessers */\n  var cands=[cellAt(br,bc-1),cellAt(br,bc+1),cellAt((br+1)%3,bc),cellAt((br+2)%3,bc),cellAt((br+1)%3,(bc+1)%3)];\n  var seen={};seen[ser(correct)]=true;\n  var distractors=[];\n  cands.forEach(function(c3){\n    var k=ser(c3);\n    if(!seen[k]&&distractors.length<4){seen[k]=true;distractors.push(c3);}\n  });\n  var guard=0;\n  while(distractors.length<4&&guard<40){\n    guard++;\n    var m=mutate(deep(correct));\n    var k2=ser(m);\n    if(!seen[k2]){seen[k2]=true;distractors.push(m);}\n  }\n  if(distractors.length<4)return null;\n  var opts=distractors.slice();\n  var correctIdx=ri(5);\n  opts.splice(correctIdx,0,deep(correct));\n  var explain='Across each row from left to right, the shape '+rules.map(function(r){return r.desc;}).join(' and ')\n    +'. Each row keeps its own '+(hasMorph?'shading':'shape and shading')+'.';\n  return {type:'matrix',prompt:{kind:'matrix',cells:cells,missing:blank},options:opts,correct:correctIdx,explain:explain,ruleKey:'rowseq+'+rules.map(function(r){return r.key;}).sort().join('+')};\n}\n\n/* ---- Matrix device 3: superimposition ----\n   Each row: shape on the left, shape in the middle, the two overlaid on the\n   right. A standard GL/CEM device the grid logics above cannot express, and it\n   reads instantly once seen. Fills stay light so both outlines survive the\n   overlap (a black pair renders as one silhouette). */\nfunction genMatrixSuper(diff){\n  var lightFills=['white','grey'];\n  var rows=[],r,c;\n  var shapePool=shuffle(SHAPES.filter(function(sh){return CURVED.indexOf(sh)<0;}));\n  for(r=0;r<3;r++)rows.push({a:shapePool[r*2],b:shapePool[r*2+1],fa:pick(lightFills),fb:pick(lightFills)});\n  function cellAt(r,c){\n    var s=baseSpec();\n    var row=rows[r];\n    if(c===0){s.shape=row.a;s.fill=row.fa;return s;}\n    if(c===1){s.shape=row.b;s.fill=row.fb;return s;}\n    s.shape=row.a;s.fill=row.fa;\n    s.pair={shape2:row.b,fill2:row.fb,front:'main'};\n    return s;\n  }\n  var cells=[];\n  for(r=0;r<3;r++)for(c=0;c<3;c++)cells.push(cellAt(r,c));\n  /* the blank is the combined cell: decomposing an overlay is a different and\n     much harder skill, kept out of this device */\n  var br=ri(3),blank=br*3+2;\n  var correct=cells[blank];\n  var other=rows[(br+1)%3],third=rows[(br+2)%3];\n  var d1=deep(correct);d1.pair={shape2:other.b,fill2:other.fb,front:'main'};      /* wrong partner */\n  var d2=deep(correct);d2.pair={shape2:rows[br].b,fill2:rows[br].fb,front:'other'};/* right pair, wrong one in front */\n  var d3=deep(correct);d3.pair=null;                                              /* only the first shape */\n  var d4=baseSpec();d4.shape=rows[br].b;d4.fill=rows[br].fb;                      /* only the second shape */\n  var opts=[d1,d2,d3,d4];\n  var correctIdx=ri(5);\n  opts.splice(correctIdx,0,deep(correct));\n  var seen={},oi;\n  for(oi=0;oi<opts.length;oi++){\n    var sv=cellSVG(opts[oi]);\n    if(seen[sv])return null;\n    seen[sv]=1;\n  }\n  return {type:'matrix',prompt:{kind:'matrix',cells:cells,missing:blank},options:opts,correct:correctIdx,\n    explain:'In each row the third square is the first two drawn on top of each other.<br>Check which shape is in front as well as which two shapes are used.',\n    ruleKey:'superimpose'};\n}\n\n/* ---- Matrix device 4: counts add across the row ----\n   The third square carries as many dots as the first two put together, so the\n   grid is arithmetic rather than positional. */\nfunction genMatrixAdd(diff){\n  var pool=FILLPOOL[diff];\n  var shapes=pickN(SHAPES,3),fills=pickN(pool,3);\n  var pairs=[],r,c;\n  for(r=0;r<3;r++){\n    /* b must not be twice a, or the row reads 1, 2, 3 and \"counting up\" fits as\n       well as \"adding\", which makes the rule ambiguous */\n    var a,b,guard=0;\n    do{ a=1+ri(3); b=1+ri(3); guard++; }while(guard<20&&(b===2*a||a+b>6));\n    pairs.push([a,b]);\n  }\n  function cellAt(r,c){\n    var s=baseSpec();\n    s.shape=shapes[r];s.fill=fills[r];\n    s.dots=(c===2)?(pairs[r][0]+pairs[r][1]):pairs[r][c];\n    return s;\n  }\n  var cells=[];\n  for(r=0;r<3;r++)for(c=0;c<3;c++)cells.push(cellAt(r,c));\n  var br=ri(3),blank=br*3+2;\n  var correct=cells[blank];\n  var total=pairs[br][0]+pairs[br][1];\n  var wrongCounts=[total-1,total+1,pairs[br][0],pairs[br][1]].filter(function(v,i,arr){\n    return v>=0&&v!==total&&arr.indexOf(v)===i;\n  });\n  while(wrongCounts.length<4)wrongCounts.push(total+wrongCounts.length+1);\n  var opts=wrongCounts.slice(0,4).map(function(n){var d=deep(correct);d.dots=n;return d;});\n  var correctIdx=ri(5);\n  opts.splice(correctIdx,0,deep(correct));\n  return {type:'matrix',prompt:{kind:'matrix',cells:cells,missing:blank},options:opts,correct:correctIdx,\n    explain:'In each row the dots on the third square are the dots on the first two added together.',\n    ruleKey:'addcount'};\n}\n\nfunction genMatrix(diff){\n  /* four devices from Standard up: row sequences, superimposition, adding\n     counts, and the positional grids below */\n  if(diff>=2){\n    var device=ri(4);\n    if(device===0)return genMatrixRowseq(diff);\n    if(device===1)return genMatrixSuper(diff);\n    if(device===2)return genMatrixAdd(diff);\n  }\n  var useDots=(diff===3);\n  /* Challenge swaps the shading dimension for outline styles or adds a\n     rotation dimension; fills stay white when strokes carry the pattern */\n  var variant=(diff===3)?pick(['fill','stroke','rot','size','copies']):pick(['fill','size']);\n  var S=(variant==='rot')?pickN(ROT90SAFE,3):pickN(SHAPES,3);\n  var F=(variant==='stroke')?['white','white','white']:pickN(FILLPOOL[diff],3);\n  var K=shuffle(STROKES.slice());\n  var R=shuffle([0,45,90]);\n  var D=shuffle([1,2,3]);\n  var Z=shuffle(['s','m','l']);\n  var CP=shuffle([2,3,4]);\n  /* the copies renderer ignores size, dots, stroke and inner, so that variant\n     cannot also carry the dots dimension */\n  if(variant==='copies')useDots=false;\n  /* Two grid logics. Latin: orthogonal squares, (r+c) and (r+2c) mod 3\n     make every row and column use each shape and each fill exactly once,\n     all nine combinations distinct. Rowcol (Foundation/Standard only):\n     constancy logic, the column fixes the shape and the row fixes the\n     shading, testing what does NOT change. */\n  var logic=(diff===3)?pick(['latin','diag']):pick(['latin','rowcol','diag']);\n  function secondDim(s,idx){\n    if(variant==='stroke')s.stroke=K[idx];\n    else if(variant==='rot')s.rot=R[idx];\n    else if(variant==='size')s.size=Z[idx];\n    else if(variant==='copies')s.copies=CP[idx];\n    else s.fill=F[idx];\n  }\n  function cellAt(r,c){\n    var s=baseSpec();\n    if(logic==='rowcol'){\n      s.shape=S[c];\n      secondDim(s,r);\n      return s;\n    }\n    if(logic==='diag'){\n      /* the shape runs along the diagonals: every diagonal holds one shape, and\n         the second property is fixed by the row */\n      s.shape=S[(r-c+3)%3];\n      secondDim(s,r);\n      if(useDots)s.dots=D[c];\n      return s;\n    }\n    s.shape=S[(r+c)%3];\n    secondDim(s,(r+2*c)%3);\n    if(useDots)s.dots=D[(2*r+c)%3];\n    return s;\n  }\n  var cells=[];\n  for(var r=0;r<3;r++)for(var c=0;c<3;c++)cells.push(cellAt(r,c));\n  var blank=ri(9);\n  var br=Math.floor(blank/3),bc=blank%3;\n  var correct=cells[blank];\n  var distractors=[];\n  if(diff===3){\n    /* Near-misses: the correct answer with exactly one dimension wrong.\n       Unlike row/column copies these combinations appear nowhere in the\n       grid, so spot-the-duplicate elimination stops working. */\n    var sIdx=(logic==='diag')?((br-bc+3)%3):((br+bc)%3);\n    var f2Idx=(logic==='diag')?br:((br+2*bc)%3);\n    var dIdx=(logic==='diag')?bc:((2*br+bc)%3);\n    function offBy(dim,alt){\n      var d=deep(correct);\n      if(dim==='shape')d.shape=S[(sIdx+alt)%3];\n      else if(dim==='two')secondDim(d,(f2Idx+alt)%3);\n      else d.dots=D[(dIdx+alt)%3];\n      return d;\n    }\n    distractors=[offBy('shape',1),offBy('two',1),offBy('dots',1),offBy('two',2)];\n  }else{\n    /* Classic traps: the four cells that share the blank's row or column */\n    for(var c2=0;c2<3;c2++)if(c2!==bc)distractors.push(deep(cells[br*3+c2]));\n    for(var r2=0;r2<3;r2++)if(r2!==br)distractors.push(deep(cells[r2*3+bc]));\n  }\n\n  var opts=distractors.slice();\n  var correctIdx=ri(5);\n  opts.splice(correctIdx,0,deep(correct));\n\n  var dimName=(variant==='stroke')?'outline style':((variant==='rot')?'rotation':((variant==='size')?'size':((variant==='copies')?'number of shapes':'shading')));\n  var explain;\n  if(logic==='rowcol'){\n    explain='Every square in a column keeps the same shape, and every square in a row keeps the same '+dimName+'. Find what stays fixed for the blank square.';\n  }else if(logic==='diag'){\n    explain='The shapes run along the diagonals: each diagonal line of squares holds one shape. The '+dimName+' is fixed by the row.';\n  }else{\n    explain='Across each row and down each column, every shape and every '+dimName+' appears exactly once'+(useDots?', and so does every number of dots':'')+'. '\n      +((diff===3)?'Each wrong option gets all but one property right, so check every property.':'The wrong options already appear in the blank square\u2019s row or column.');\n  }\n  return {type:'matrix',prompt:{kind:'matrix',cells:cells,missing:blank},options:opts,correct:correctIdx,explain:explain,ruleKey:logic+'+'+variant+(useDots?'+d':'')};\n}\n\n/* ---- Type 11: Horizontal Codes ---- */\nfunction genCodes(diff){\n  /* Foundation: two letters. Two properties with two values each would\n     only give four combinations, and five distinct answer options need\n     at least five, so one of the two properties carries three values\n     (six combinations, four references, test shape an unseen combo).\n     Standard/Challenge: three letters, eight combinations, five or six\n     references. */\n  var isFoundation=(diff===1);\n  var letterCount=isFoundation?2:3;\n  var pool=FILLPOOL[diff];\n  /* Which properties are coded, and in what order, is random per\n     question. A child can never learn \"first letter is always the\n     shape\": it might be rotation, size, dots, shading or outline in any\n     slot. Dashed outlines need white/grey fills to stay visible, and\n     rotation needs rotation-safe shapes. */\n  /* position renders the shape small, which would hide a size letter,\n     so those two are never coded together. Rotation and shape are never\n     coded together either: with the shape changing too, the child has\n     no way to know each different shape's starting orientation, so the\n     rotation letter becomes unreadable. */\n  function badNames(ns){\n    return (ns.indexOf('pos')>=0&&ns.indexOf('size')>=0)\n      ||(ns.indexOf('rot')>=0&&ns.indexOf('shape')>=0);\n  }\n  var names,nTries=0;\n  do{\n    names=pickN(['shape','fill','dots','stroke','size','rot','pos'],letterCount);\n    nTries++;\n  }while(nTries<20&&badNames(names));\n  if(badNames(names))names=['shape','fill','dots'].slice(0,letterCount);\n  var strokeCoded=names.indexOf('stroke')>=0;\n  var rotCoded=names.indexOf('rot')>=0;\n  var posCoded=names.indexOf('pos')>=0;\n  /* Foundation and Challenge give one property three values (Foundation\n     because two two-valued letters cannot fill five options, Challenge\n     for more simultaneous deduction, the thing that makes real GL codes\n     questions hard). White/grey only offers two fills, so fill stays\n     two-valued when outline is also coded. */\n  var threeVal=(diff===3||isFoundation)?pick(names.filter(function(n){return !(n==='fill'&&strokeCoded);})):null;\n  function nValsFor(n){return (n===threeVal)?3:2;}\n  function valsFor(n,count){\n    if(n==='shape')return pickN(rotCoded?ROT90SAFE:SHAPES,count);\n    if(n==='fill')return pickN(strokeCoded?STROKEFILLS:pool,count);\n    if(n==='dots')return pickN([1,2,3],count);\n    if(n==='stroke')return pickN(STROKES,count);\n    if(n==='size')return pickN(['s','m','l'],count);\n    if(n==='pos')return pickN(['t','b','l','r'],count);\n    return (count===3)?shuffle([0,45,90]):shuffle([0,90]);\n  }\n  var SETTERS={\n    shape:function(s,v){s.shape=v;},\n    fill:function(s,v){s.fill=v;},\n    dots:function(s,v){s.dots=v;},\n    stroke:function(s,v){s.stroke=v;},\n    size:function(s,v){s.size=v;},\n    rot:function(s,v){s.rot=v;},\n    pos:function(s,v){s.pos=v;}\n  };\n  var WHAT={shape:'the shape',fill:'the shading',dots:'the number of dots',stroke:'the outline style',size:'the size',rot:'the rotation',pos:'the position in the box'};\n  var LSLOTS=[['A','B','C'],['X','Y','Z'],['L','M','N']];\n  var props=names.map(function(n,slot){\n    var count=nValsFor(n);\n    return {name:n,letters:LSLOTS[slot].slice(0,count),vals:valsFor(n,count),set:SETTERS[n],what:WHAT[n]};\n  });\n  /* sensible constants for whatever is not coded */\n  var baseShape=rotCoded?pick(ROT90SAFE):pick(SHAPES);\n  var baseFill=strokeCoded?pick(STROKEFILLS):pick(pool);\n\n  var nRefs=(diff===3)?6:(isFoundation?4:5);\n  /* Standard/Challenge: every value appears at least twice across the\n     reference shapes, so each letter's meaning is learnable, never a\n     guess. Foundation relaxes this to at least once (decode by\n     elimination, exactly like real GL foundation papers): four\n     references out of six combinations, every value covered. */\n  function valuePattern(nVals){\n    if(nRefs===6)return shuffle((nVals===3)?[0,0,1,1,2,2]:[0,0,0,1,1,1]);\n    return shuffle([0,0,1,1,ri(2)]);\n  }\n  var assignments,forcedTest=null;\n  if(isFoundation){\n    var combos=[];\n    for(var ca=0;ca<props[0].vals.length;ca++)\n      for(var cb=0;cb<props[1].vals.length;cb++)combos.push([ca,cb]);\n    var okSet=null,cTries=0;\n    while(!okSet&&cTries<20){\n      cTries++;\n      shuffle(combos);\n      var cand=combos.slice(0,nRefs);\n      var covered=props.every(function(pr,pi){\n        var seenV={};\n        cand.forEach(function(c){seenV[c[pi]]=true;});\n        return Object.keys(seenV).length===pr.vals.length;\n      });\n      if(covered)okSet=cand;\n    }\n    if(!okSet)return null;\n    assignments=props.map(function(pr,pi){return okSet.map(function(c){return c[pi];});});\n    forcedTest=pick(combos.slice(nRefs));\n  }else{\n    assignments=props.map(function(pr){return valuePattern(pr.vals.length);});\n  }\n  function freshBase(){\n    var s=baseSpec();\n    s.shape=baseShape;\n    s.fill=baseFill;\n    return s;\n  }\n  var refs=[],codes=[],comboSeen={},i,p;\n  for(i=0;i<nRefs;i++){\n    var s=freshBase();var code='';var comboKey='';\n    for(p=0;p<props.length;p++){\n      var vi=assignments[p][i];\n      props[p].set(s,props[p].vals[vi]);\n      code+=props[p].letters[vi];\n      comboKey+=vi;\n    }\n    if(comboSeen[comboKey])return null; /* duplicate reference shape: reroll */\n    comboSeen[comboKey]=true;\n    refs.push(s);codes.push(code);\n  }\n  /* test shape: seen values only, but a combination not shown yet */\n  var testIdx=[],testKey='';\n  if(forcedTest){\n    testIdx=forcedTest.slice();\n    testKey=testIdx.join('');\n  }else{\n    var guard=0;\n    do{\n      testIdx=props.map(function(pr){return ri(pr.vals.length);});\n      testKey=testIdx.join('');\n      guard++;\n    }while(comboSeen[testKey]&&guard<30);\n    if(comboSeen[testKey])return null;\n  }\n  var test=freshBase();var correctCode='';\n  for(p=0;p<props.length;p++){\n    props[p].set(test,props[p].vals[testIdx[p]]);\n    correctCode+=props[p].letters[testIdx[p]];\n  }\n  /* Challenge red herring: size varies but is never coded. Reroll if the\n     sizes accidentally line up with a coded property, otherwise a child\n     could decode by size and reach a different, wrong answer. */\n  var herringOn=(diff===3&&names.indexOf('size')<0&&!posCoded);\n  if(herringOn){\n    var hGuard=0,mimics=true;\n    while(mimics&&hGuard<20){\n      hGuard++;\n      refs.forEach(function(r){r.size=pick(['s','m','l']);});\n      mimics=props.some(function(pr,pi){\n        for(var v=0;v<pr.vals.length;v++){\n          var sizesInGroup={};\n          for(var k=0;k<nRefs;k++)if(assignments[pi][k]===v)sizesInGroup[refs[k].size]=true;\n          if(Object.keys(sizesInGroup).length>1)return false;\n        }\n        return true;\n      });\n    }\n    if(mimics)refs.forEach(function(r){r.size='m';});\n    else test.size=pick(['s','m','l']);\n  }\n\n  /* distractors: one letter flipped per slot, then a double-flip */\n  function wrongLetter(pi){\n    var n=props[pi].vals.length;\n    return props[pi].letters[(testIdx[pi]+1+ri(n-1))%n];\n  }\n  var opts=[correctCode];\n  for(p=0;p<props.length;p++){\n    var wrong=correctCode.split('');\n    wrong[p]=wrongLetter(p);\n    opts.push(wrong.join(''));\n  }\n  var dbl=correctCode.split('');\n  dbl[0]=wrongLetter(0);\n  dbl[1]=wrongLetter(1);\n  opts.push(dbl.join(''));\n  var dedup=[],seen={};\n  for(i=0;i<opts.length;i++){\n    if(!seen[opts[i]]){seen[opts[i]]=true;dedup.push(opts[i]);}\n  }\n  /* fill remaining slots with every-letter-wrong codes; a three-valued\n     slot gives wrongLetter more than one choice, so retry a few times */\n  var fGuard=0;\n  while(dedup.length<5&&fGuard<20){\n    fGuard++;\n    var filler=props.map(function(pr,pi){return wrongLetter(pi);}).join('');\n    if(!seen[filler]){seen[filler]=true;dedup.push(filler);}\n  }\n  if(dedup.length<5)return null;\n  dedup=dedup.slice(0,5);\n  var correctIdx2=ri(5);\n  var t2=dedup[0];dedup[0]=dedup[correctIdx2];dedup[correctIdx2]=t2;\n  /* re-find where the correct code landed */\n  var correctAt=dedup.indexOf(correctCode);\n\n  var ordinals=['1st','2nd','3rd'];\n  var explain=props.map(function(pr,pi){return ordinals[pi]+' letter = '+pr.what;}).join('<br>')\n    +(herringOn?'<br>Size is a red herring here: it is not coded.':'');\n  /* GL sets codes both horizontally and vertically; six Challenge refs\n     stacked vertically run too tall, so vertical stays Foundation/Standard */\n  var vert=(diff<3&&ri(2)===1);\n  return {type:'codes',prompt:{kind:'codes',cells:refs,codes:codes,test:test,vert:vert},options:dedup,correct:correctAt,textOptions:true,explain:explain,ruleKey:names.slice().sort().join('+')};\n}\n\n/* ---- Type 5: Hidden Shapes ---- */\n/* Modelled on real GL-style hidden-shape questions: each option is ONE\n   composite line figure, a polygon fused into a network of extended\n   edges, vertex spurs and chords, not a pile of separate floating\n   outlines. The target's own edges run on into the clutter, so the\n   child has to trace the outline to find it. Wrong pictures are built\n   the same way around a look-alike: resized, tilted, mirrored or a\n   different shape. */\n/* Every one of these has vertex data in shapeV, which is what the hidden-figure\n   maths needs. Curved shapes cannot be targets: the composite is a line figure. */\nvar HIDE_TARGETS=['triangle','square','pentagon','hexagon','heptagon','octagon','diamond','cross',\n  'star','star6','trapezium','kite','parallelogram','chevron','tshape','zshape','arrow','rtriangle','lshape'];\n/* numeric vertex lists (same geometry as shapeEl's string versions) */\nfunction shapeV(shape,r){\n  function pv(n,start){\n    var p=[];\n    for(var i=0;i<n;i++){\n      var a=(start+i*360/n)*Math.PI/180;\n      p.push([r*Math.cos(a),r*Math.sin(a)]);\n    }\n    return p;\n  }\n  if(shape==='square')return pv(4,45);\n  if(shape==='triangle')return pv(3,-90);\n  if(shape==='pentagon')return pv(5,-90);\n  if(shape==='hexagon')return pv(6,0);\n  if(shape==='diamond')return pv(4,-90);\n  if(shape==='star'){\n    var p2=[];\n    for(var i2=0;i2<10;i2++){\n      var rr=(i2%2===0)?r:r*0.45;\n      var a2=(-90+i2*36)*Math.PI/180;\n      p2.push([rr*Math.cos(a2),rr*Math.sin(a2)]);\n    }\n    return p2;\n  }\n  if(shape==='cross'){\n    var w=r*0.36;\n    return [[-w,-r],[w,-r],[w,-w],[r,-w],[r,w],[w,w],[w,r],[-w,r],[-w,w],[-r,w],[-r,-w],[-w,-w]];\n  }\n  if(shape==='rtriangle')return [[-r,-0.5*r],[-r,r],[r,r]];\n  if(shape==='heptagon')return pv(7,-90);\n  if(shape==='octagon')return pv(8,-67.5);\n  if(shape==='star6'){\n    var p6=[];\n    for(var i6=0;i6<12;i6++){\n      var r6=(i6%2===0)?r:r*0.55;\n      var a6=(-90+i6*30)*Math.PI/180;\n      p6.push([r6*Math.cos(a6),r6*Math.sin(a6)]);\n    }\n    return p6;\n  }\n  if(shape==='trapezium')return [[-0.5*r,-0.72*r],[0.5*r,-0.72*r],[r,0.72*r],[-r,0.72*r]];\n  if(shape==='kite')return [[0,-r],[0.8*r,-0.34*r],[0,r],[-0.8*r,-0.34*r]];\n  if(shape==='parallelogram')return [[-0.55*r,-0.62*r],[r,-0.62*r],[0.55*r,0.62*r],[-r,0.62*r]];\n  if(shape==='chevron')return [[0,-r],[r,-0.05*r],[r,0.5*r],[0,-0.45*r],[-r,0.5*r],[-r,-0.05*r]];\n  if(shape==='tshape'){\n    var wT=r*0.34;\n    return [[-r,-r],[r,-r],[r,-r+2*wT],[wT,-r+2*wT],[wT,r],[-wT,r],[-wT,-r+2*wT],[-r,-r+2*wT]];\n  }\n  if(shape==='zshape'){\n    var wZ=r*0.3;\n    return [[-r,-r],[r,-r],[r,-r+wZ],[-0.1*r,r-wZ],[r,r-wZ],[r,r],[-r,r],[-r,r-wZ],[0.1*r,-r+wZ],[-r,-r+wZ]];\n  }\n  if(shape==='arrow')return [[0,-r],[0.58*r,-0.12*r],[0.24*r,-0.12*r],[0.24*r,r],[-0.24*r,r],[-0.24*r,-0.12*r],[-0.58*r,-0.12*r]];\n  return [[-r,-r],[-0.35*r,-r],[-0.35*r,0.4*r],[r,0.4*r],[r,r],[-r,r]];\n}\nfunction xformV(pts,rot,flip,cx,cy){\n  var a=rot*Math.PI/180,ca=Math.cos(a),sa=Math.sin(a);\n  return pts.map(function(p){\n    var x=flip?-p[0]:p[0],y=p[1];\n    return [cx+x*ca-y*sa,cy+x*sa+y*ca];\n  });\n}\nfunction genHidden(diff){\n  var allowRot=(diff===3);\n  var pool=HIDE_TARGETS.slice();\n  /* square and diamond are the same polygon 45\u00B0 apart: when rotation is\n     allowed, either as target would make the other an accidental match */\n  if(allowRot)pool=pool.filter(function(s){return s!=='square'&&s!=='diamond';});\n  var target=pick(pool);\n  /* the same polygon at a different angle: with rotation allowed either one as\n     target would make the other an accidental exact match */\n  var alias={square:['diamond'],diamond:['square']};\n  var tr=17;\n  function clamp(v){return Math.max(4,Math.min(96,v));}\n  function composite(shape,r,rot,flip){\n    var cx=40+ri(21),cy=40+ri(21);\n    var v=xformV(shapeV(shape,r),rot,flip,cx,cy);\n    var segs=[],ext=[];\n    var nLines=(diff===1)?5:((diff===2)?8:10);\n    for(var i=0;i<nLines;i++){\n      var vi=ri(v.length);\n      var p0=v[vi],p1=v[(vi+1)%v.length];\n      var sx,sy,ex,ey;\n      if(ri(3)===0){\n        /* continue an edge past its end, so the shape's own outline\n           runs on into the figure */\n        var dx=p1[0]-p0[0],dy=p1[1]-p0[1];\n        var len=Math.sqrt(dx*dx+dy*dy)||1;\n        var f=(12+ri(14))/len;\n        sx=p1[0];sy=p1[1];ex=p1[0]+dx*f;ey=p1[1]+dy*f;\n      }else{\n        /* spur out of a vertex */\n        var ang=ri(8)*45*Math.PI/180;\n        var L=14+ri(16);\n        sx=p0[0];sy=p0[1];ex=p0[0]+Math.cos(ang)*L;ey=p0[1]+Math.sin(ang)*L;\n      }\n      ex=clamp(ex);ey=clamp(ey);\n      segs.push([sx,sy,ex,ey]);\n      ext.push([ex,ey]);\n    }\n    /* join spur ends so the clutter closes into extra regions */\n    var joins=(diff===1)?2:3;\n    for(var j=0;j<joins&&ext.length>=2;j++){\n      var a3=pick(ext),b3=pick(ext);\n      if(a3!==b3)segs.push([a3[0],a3[1],b3[0],b3[1]]);\n    }\n    /* chords subdivide the shape itself, like the real papers */\n    if(v.length>=4){\n      /* chords cut across the target itself, which is what stops its outline\n         popping out of the picture as one intact shape */\n      var chords=(diff===1)?1:((diff===2)?2:3);\n      for(var ch=0;ch<chords;ch++){\n        var i1=ri(v.length);\n        var i3=(i1+2+ri(Math.max(1,v.length-3)))%v.length;\n        if(i3!==i1)segs.push([v[i1][0],v[i1][1],v[i3][0],v[i3][1]]);\n      }\n    }\n    var d2='<polygon points=\"'+v.map(function(p){return p[0].toFixed(1)+','+p[1].toFixed(1);}).join(' ')+'\" fill=\"none\" stroke=\"'+INK+'\" stroke-width=\"2\" stroke-linejoin=\"round\"></polygon>';\n    for(var s4=0;s4<segs.length;s4++){\n      d2+='<line x1=\"'+segs[s4][0].toFixed(1)+'\" y1=\"'+segs[s4][1].toFixed(1)+'\" x2=\"'+segs[s4][2].toFixed(1)+'\" y2=\"'+segs[s4][3].toFixed(1)+'\" stroke=\"'+INK+'\" stroke-width=\"2\" stroke-linecap=\"round\"></line>';\n    }\n    return '<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\">'+d2+'</svg>';\n  }\n  var others=pool.filter(function(s){return s!==target&&(alias[target]||[]).indexOf(s)<0;});\n  var chiralT=CHIRAL.indexOf(target)>=0;\n  /* A near miss is a shape a child could believe they had found: one side more,\n     one side fewer, or the same outline family. A wildly different shape is\n     eliminated at a glance and wastes an option. */\n  var NEARMISS={triangle:['rtriangle','kite','diamond'],rtriangle:['triangle','trapezium'],\n    square:['trapezium','parallelogram','pentagon'],diamond:['kite','triangle','square'],\n    pentagon:['hexagon','heptagon','square'],hexagon:['pentagon','heptagon'],\n    heptagon:['hexagon','octagon'],octagon:['heptagon','hexagon'],\n    cross:['tshape','zshape','lshape'],lshape:['zshape','tshape','cross'],\n    star:['star6','cross'],star6:['star','cross'],\n    trapezium:['parallelogram','kite','square'],kite:['diamond','trapezium'],\n    parallelogram:['trapezium','square'],chevron:['arrow','triangle'],\n    tshape:['cross','lshape'],zshape:['lshape','tshape'],arrow:['chevron','kite']};\n  function near(){\n    var n=(NEARMISS[target]||[]).filter(function(sh){return others.indexOf(sh)>=0;});\n    return n.length?pick(n):pick(others);\n  }\n  var decoys;\n  if(diff===1){\n    /* one look-alike shape, one a hair too small, one a hair too big, one tilted */\n    decoys=[\n      {s:near(),r:tr,rot:0,f:false},\n      {s:target,r:tr-3,rot:0,f:false},\n      {s:target,r:tr+4,rot:0,f:false},\n      {s:target,r:tr,rot:45,f:false}\n    ];\n  }else if(diff===2){\n    decoys=[\n      {s:near(),r:tr,rot:0,f:false},\n      {s:target,r:tr-2,rot:0,f:false},\n      {s:target,r:tr+3,rot:0,f:false},\n      chiralT?{s:target,r:tr,rot:0,f:true}:{s:target,r:tr,rot:20,f:false}\n    ];\n  }else{\n    /* rotation allowed, so a turned exact copy would BE the answer: the decoys\n       are copies a couple of units out, a mirror, and a near miss */\n    decoys=[\n      {s:near(),r:tr,rot:45*ri(8),f:false},\n      {s:target,r:tr-2,rot:45*ri(8),f:false},\n      {s:target,r:tr+2,rot:45*ri(8),f:false},\n      chiralT?{s:target,r:tr,rot:45*ri(8),f:true}:{s:near(),r:tr,rot:45*ri(8),f:false}\n    ];\n  }\n  var correctRot=allowRot?45*ri(8):0;\n  var opts=[composite(target,tr,correctRot,false)];\n  for(var d=0;d<4;d++)opts.push(composite(decoys[d].s,decoys[d].r,decoys[d].rot,decoys[d].f));\n  var correctIdx=ri(5);\n  var t0=opts[0];opts[0]=opts[correctIdx];opts[correctIdx]=t0;\n  var promptSvg='<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\">'+shapeEl(target,tr,'none',INK,2.6,'')+'</svg>';\n  var hint=allowRot\n    ?'One picture hides an exact copy of this shape: same size, but it may be turned round. Find it.'\n    :'One picture hides an exact copy of this shape: same size, same way up. Find it.';\n  var explain='The '+SHAPEDESC[target]+' is hiding in this picture at exactly the right size'\n    +(allowRot?'':' and the right way up')\n    +'.<br>The others are close but not exact: one copy slightly too small, one slightly too big, one tilted'\n    +(chiralT?', one flipped':'')+' and a look-alike shape. Check the size first.';\n  return {type:'hidden',prompt:{kind:'hidden',svg:promptSvg},options:opts,correct:correctIdx,rawSvg:true,explain:explain,hint:hint,ruleKey:'t:'+target};\n}\n\n/* ================= 3D nets engine (ported from page.3d-nets.liquid) ================= */\n/* ============================================================\n   1. VECTOR + ROTATION CORE\n   Cube frame: X=[1,0,0] right, Y=[0,1,0] front, Z=[0,0,1] top.\n   ============================================================ */\nfunction vNeg(v) { return [-v[0], -v[1], -v[2]]; }\nfunction vEq(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2]; }\nfunction vDot(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; }\nfunction vKey(v) { return v[0] + \",\" + v[1] + \",\" + v[2]; }\nfunction mApply(m, v) { return [vDot(m[0], v), vDot(m[1], v), vDot(m[2], v)]; }\nfunction mMul(a, b) {\n  var out = [[0,0,0],[0,0,0],[0,0,0]];\n  for (var i = 0; i < 3; i++) {\n    for (var j = 0; j < 3; j++) {\n      out[i][j] = a[i][0] * b[0][j] + a[i][1] * b[1][j] + a[i][2] * b[2][j];\n    }\n  }\n  return out;\n}\nfunction mKey(m) { return m.map(function (r) { return r.join(\",\"); }).join(\";\"); }\nvar ROT_X = [[1,0,0],[0,0,-1],[0,1,0]];\nvar ROT_Y = [[0,0,1],[0,1,0],[-1,0,0]];\nvar ROT_Z = [[0,-1,0],[1,0,0],[0,0,1]];\nvar IDENTITY = [[1,0,0],[0,1,0],[0,0,1]];\nvar ROTS24 = (function () {\n  var seen = {};\n  var list = [];\n  var queue = [IDENTITY];\n  seen[mKey(IDENTITY)] = true;\n  while (queue.length) {\n    var m = queue.shift();\n    list.push(m);\n    [ROT_X, ROT_Y, ROT_Z].forEach(function (g) {\n      var nm = mMul(g, m);\n      var k = mKey(nm);\n      if (!seen[k]) { seen[k] = true; queue.push(nm); }\n    });\n  }\n  return list; /* exactly 24 proper rotations of the cube */\n})();\n\n/* Canonical on-screen axes for each cube face, as seen from outside.\n   Invariant: R x D = n for every entry (verified analytically). */\nvar ROLE_AXES = {\n  top:    { n: [0,0,1],  R: [1,0,0],  D: [0,1,0]  },\n  bottom: { n: [0,0,-1], R: [1,0,0],  D: [0,-1,0] },\n  front:  { n: [0,1,0],  R: [1,0,0],  D: [0,0,-1] },\n  back:   { n: [0,-1,0], R: [-1,0,0], D: [0,0,-1] },\n  right:  { n: [1,0,0],  R: [0,-1,0], D: [0,0,-1] },\n  left:   { n: [-1,0,0], R: [0,1,0],  D: [0,0,-1] }\n};\nvar ROLE_BY_NKEY = {};\nObject.keys(ROLE_AXES).forEach(function (role) {\n  ROLE_BY_NKEY[vKey(ROLE_AXES[role].n)] = role;\n});\nvar VISIBLE_ROLES = [\"top\", \"front\", \"right\"];\n\n/* Clockwise quarter-turn angle that carries canonical axes (R,D)\n   onto glyph axes (gR,gD) within the face plane. */\nfunction axisAngle(R, D, gR) {\n  if (vEq(gR, R)) return 0;\n  if (vEq(gR, D)) return 90;\n  if (vEq(gR, vNeg(R))) return 180;\n  return 270;\n}\n\nfunction shuffleC(arr) {\n  var copy = arr.slice();\n  for (var i = copy.length - 1; i > 0; i--) {\n    var j = Math.floor(Math.random() * (i + 1));\n    var t = copy[i]; copy[i] = copy[j]; copy[j] = t;\n  }\n  return copy;\n}\nfunction choice(arr) { return arr[Math.floor(Math.random() * arr.length)]; }\nfunction esc(s) {\n  return String(s).replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\")\n    .replace(/\"/g, \"&quot;\").replace(/'/g, \"&#39;\");\n}\nfunction clamp(n, a, b) { return Math.max(a, Math.min(b, n)); }\n\n/* ============================================================\n   2. NETS + FOLDING ENGINE\n   Cells are [col,row] on a 5x5 grid; row increases downward.\n   Folding convention: the root cell stays flat with outward\n   normal +Z (cube TOP); every hinge folds away from the viewer,\n   so net-south becomes the cube FRONT. Face orientation is\n   {n,u,r}: outward normal, printed-down and printed-right in\n   cube coordinates. Invariant preserved by rolls: r x u = n.\n   ============================================================ */\nvar NET_DEFS = [\n  { id: \"A\", label: \"Long cross\",   cells: [[0,0],[0,1],[1,1],[1,2],[2,1],[3,1]] },\n  { id: \"B\", label: \"Offset cross\", cells: [[0,0],[0,1],[1,1],[2,1],[2,2],[3,1]] },\n  { id: \"C\", label: \"Four row\",     cells: [[0,1],[1,0],[1,1],[1,2],[1,3],[2,1]] },\n  { id: \"D\", label: \"T cross\",      cells: [[0,0],[0,1],[0,2],[1,1],[2,1],[3,1]] },\n  { id: \"E\", label: \"Hook cross\",   cells: [[0,1],[1,0],[1,1],[1,2],[1,3],[2,2]] },\n  { id: \"F\", label: \"Stair net\",    cells: [[0,0],[0,1],[1,1],[1,2],[2,2],[2,3]] },\n  { id: \"G\", label: \"Step row\",     cells: [[0,0],[0,1],[0,2],[1,2],[1,3],[1,4]] },\n  { id: \"H\", label: \"Bridge net\",   cells: [[0,0],[0,1],[1,1],[1,2],[1,3],[2,1]] },\n  { id: \"I\", label: \"Side hook\",    cells: [[0,0],[0,1],[1,1],[1,2],[1,3],[2,2]] },\n  { id: \"J\", label: \"Tall net\",     cells: [[0,0],[0,1],[1,1],[2,1],[3,1],[3,2]] },\n  { id: \"K\", label: \"Zig zag\",      cells: [[0,0],[0,1],[1,1],[1,2],[1,3],[2,3]] }\n];\nvar DIRS = [[1,0],[-1,0],[0,1],[0,-1]];\n\nfunction rollOrientation(o, dx, dy) {\n  if (dx === 1 && dy === 0)  return { n: o.r.slice(), u: o.u.slice(), r: vNeg(o.n) };\n  if (dx === -1 && dy === 0) return { n: vNeg(o.r),   u: o.u.slice(), r: o.n.slice() };\n  if (dx === 0 && dy === -1) return { n: vNeg(o.u),   u: o.n.slice(), r: o.r.slice() };\n  if (dx === 0 && dy === 1)  return { n: o.u.slice(), u: vNeg(o.n),   r: o.r.slice() };\n  return o;\n}\n\nvar FOLD_CACHE = {};\nfunction foldNet(netIdx) {\n  if (FOLD_CACHE[netIdx]) return FOLD_CACHE[netIdx];\n  var net = NETS[netIdx];\n  var cells = net.cells;\n  var byKey = {};\n  cells.forEach(function (c, i) { byKey[c[0] + \",\" + c[1]] = i; });\n  /* Root: the cell with the most direct neighbours (stable, deterministic). */\n  var rootIdx = 0, bestScore = -999;\n  cells.forEach(function (c, i) {\n    var nb = 0;\n    DIRS.forEach(function (d) {\n      if (byKey[(c[0] + d[0]) + \",\" + (c[1] + d[1])] !== undefined) nb++;\n    });\n    var score = nb * 10 - c[0] - c[1];\n    if (score > bestScore) { bestScore = score; rootIdx = i; }\n  });\n  var faces = cells.map(function () { return null; });\n  var parents = cells.map(function () { return null; });\n  var children = cells.map(function () { return []; });\n  faces[rootIdx] = { n: [0,0,1], u: [0,1,0], r: [1,0,0] };\n  var queue = [rootIdx];\n  while (queue.length) {\n    var cur = queue.shift();\n    var cc = cells[cur];\n    DIRS.forEach(function (d) {\n      var ni = byKey[(cc[0] + d[0]) + \",\" + (cc[1] + d[1])];\n      if (ni === undefined || faces[ni]) return;\n      faces[ni] = rollOrientation(faces[cur], d[0], d[1]);\n      parents[ni] = { idx: cur, dx: d[0], dy: d[1], depth: parents[cur] ? parents[cur].depth + 1 : 1 };\n      children[cur].push(ni);\n      queue.push(ni);\n    });\n  }\n  var byNormal = {};\n  var valid = true;\n  faces.forEach(function (f, i) {\n    if (!f) { valid = false; return; }\n    var k = vKey(f.n);\n    if (byNormal[k] !== undefined) valid = false;\n    byNormal[k] = i;\n  });\n  var opposite = faces.map(function (f) {\n    return f ? byNormal[vKey(vNeg(f.n))] : undefined;\n  });\n  var info = {\n    rootIdx: rootIdx, faces: faces, parents: parents, children: children,\n    byNormal: byNormal, opposite: opposite, valid: valid && Object.keys(byNormal).length === 6\n  };\n  FOLD_CACHE[netIdx] = info;\n  return info;\n}\n\n/* Keep only nets the engine proves fold into a genuine cube. */\nvar NETS = NET_DEFS;\nNETS = NET_DEFS.filter(function (_, i) {\n  FOLD_CACHE = {};\n  var probe = (function () {\n    var cells = NET_DEFS[i].cells;\n    var byKey = {};\n    cells.forEach(function (c, idx) { byKey[c[0] + \",\" + c[1]] = idx; });\n    var faces = cells.map(function () { return null; });\n    faces[0] = { n: [0,0,1], u: [0,1,0], r: [1,0,0] };\n    var queue = [0];\n    while (queue.length) {\n      var cur = queue.shift();\n      var cc = cells[cur];\n      DIRS.forEach(function (d) {\n        var ni = byKey[(cc[0] + d[0]) + \",\" + (cc[1] + d[1])];\n        if (ni === undefined || faces[ni]) return;\n        faces[ni] = rollOrientation(faces[cur], d[0], d[1]);\n        queue.push(ni);\n      });\n    }\n    var normals = {};\n    var ok = true;\n    faces.forEach(function (f) {\n      if (!f) { ok = false; return; }\n      if (normals[vKey(f.n)]) ok = false;\n      normals[vKey(f.n)] = true;\n    });\n    return ok && Object.keys(normals).length === 6;\n  })();\n  return probe;\n});\nFOLD_CACHE = {};\n\nfunction netBounds(netIdx) {\n  var cells = NETS[netIdx].cells;\n  var xs = cells.map(function (c) { return c[0]; });\n  var ys = cells.map(function (c) { return c[1]; });\n  var minX = Math.min.apply(null, xs), maxX = Math.max.apply(null, xs);\n  var minY = Math.min.apply(null, ys), maxY = Math.max.apply(null, ys);\n  return { minX: minX, minY: minY, cols: maxX - minX + 1, rows: maxY - minY + 1 };\n}\n\n/* ============================================================\n   3. SYMBOL REGISTRY\n   Every glyph lives in a 100x100 box centred on (50,50).\n   sym = rotational symmetry order (1 = none, 2 = 180deg-safe).\n   ============================================================ */\nvar NAVY = \"#1A2347\";\nfunction textGlyph(ch) {\n  return \"<text x='50' y='52' font-size='68' font-weight='900' font-family='DM Sans, Arial, sans-serif'\" +\n    \" text-anchor='middle' dominant-baseline='central' fill='\" + NAVY + \"'>\" + esc(ch) + \"</text>\";\n}\nvar THEME_GLYPHS = {\n  numbers: [\n    { id: \"n1\", sym: 1, name: \"the number 1\", svg: textGlyph(\"1\") },\n    { id: \"n2\", sym: 1, name: \"the number 2\", svg: textGlyph(\"2\") },\n    { id: \"n3\", sym: 1, name: \"the number 3\", svg: textGlyph(\"3\") },\n    { id: \"n4\", sym: 1, name: \"the number 4\", svg: textGlyph(\"4\") },\n    { id: \"n5\", sym: 1, name: \"the number 5\", svg: textGlyph(\"5\") },\n    { id: \"n7\", sym: 1, name: \"the number 7\", svg: textGlyph(\"7\") },\n    { id: \"n8\", sym: 2, name: \"the number 8\", svg: textGlyph(\"8\") }\n  ],\n  letters: [\n    { id: \"lF\", sym: 1, name: \"the letter F\", svg: textGlyph(\"F\") },\n    { id: \"lG\", sym: 1, name: \"the letter G\", svg: textGlyph(\"G\") },\n    { id: \"lL\", sym: 1, name: \"the letter L\", svg: textGlyph(\"L\") },\n    { id: \"lP\", sym: 1, name: \"the letter P\", svg: textGlyph(\"P\") },\n    { id: \"lR\", sym: 1, name: \"the letter R\", svg: textGlyph(\"R\") },\n    { id: \"lJ\", sym: 1, name: \"the letter J\", svg: textGlyph(\"J\") },\n    { id: \"lK\", sym: 1, name: \"the letter K\", svg: textGlyph(\"K\") },\n    { id: \"lE\", sym: 1, name: \"the letter E\", svg: textGlyph(\"E\") }\n  ],\n  squares: [\n    { id: \"s1\", sym: 1, name: \"the corner-linked squares\",\n      svg: \"<rect x='20' y='20' width='44' height='44' fill='none' stroke='\" + NAVY + \"' stroke-width='6'/><rect x='50' y='50' width='28' height='28' fill='\" + NAVY + \"'/>\" },\n    { id: \"s2\", sym: 1, name: \"the small square over the big square\",\n      svg: \"<rect x='36' y='34' width='44' height='44' fill='none' stroke='\" + NAVY + \"' stroke-width='6'/><rect x='20' y='20' width='26' height='26' fill='\" + NAVY + \"'/>\" },\n    { id: \"s3\", sym: 1, name: \"the twin overlapping squares\",\n      svg: \"<rect x='16' y='20' width='40' height='40' fill='none' stroke='\" + NAVY + \"' stroke-width='6'/><rect x='44' y='40' width='40' height='40' fill='none' stroke='\" + NAVY + \"' stroke-width='6'/>\" },\n    { id: \"s4\", sym: 1, name: \"the boxed square on the top edge\",\n      svg: \"<rect x='22' y='22' width='56' height='56' fill='none' stroke='\" + NAVY + \"' stroke-width='6'/><rect x='38' y='22' width='24' height='24' fill='\" + NAVY + \"'/>\" },\n    { id: \"s5\", sym: 1, name: \"the diamond touching the right edge\",\n      svg: \"<rect x='20' y='20' width='60' height='60' fill='none' stroke='\" + NAVY + \"' stroke-width='6'/><polygon points='58,32 80,50 58,68 40,50' fill='\" + NAVY + \"'/>\" },\n    { id: \"s6\", sym: 1, name: \"the stepped squares\",\n      svg: \"<rect x='16' y='16' width='30' height='30' fill='none' stroke='\" + NAVY + \"' stroke-width='6'/><rect x='34' y='34' width='30' height='30' fill='none' stroke='\" + NAVY + \"' stroke-width='6'/><rect x='52' y='52' width='30' height='30' fill='\" + NAVY + \"'/>\" },\n    { id: \"s7\", sym: 1, name: \"the half-shaded square\",\n      svg: \"<rect x='20' y='20' width='60' height='60' fill='none' stroke='\" + NAVY + \"' stroke-width='6'/><path d='M20 20 L80 20 L20 80 Z' fill='\" + NAVY + \"'/>\" },\n    { id: \"s8\", sym: 1, name: \"the square with the corner dot\",\n      svg: \"<rect x='20' y='20' width='60' height='60' fill='none' stroke='\" + NAVY + \"' stroke-width='6'/><circle cx='35' cy='35' r='11' fill='\" + NAVY + \"'/>\" }\n  ],\n  shapes: [\n    { id: \"g1\", sym: 1, name: \"the star\",\n      svg: \"<path d='M50 12 L58.9 37.7 L86.1 38.3 L64.5 54.7 L72.3 80.7 L50 65.2 L27.7 80.7 L35.5 54.7 L13.9 38.3 L41.1 37.7 Z' fill='\" + NAVY + \"'/>\" },\n    { id: \"g2\", sym: 1, name: \"the crescent\",\n      svg: \"<path d='M62 14 A38 38 0 1 0 62 86 A30 30 0 1 1 62 14 Z' fill='\" + NAVY + \"'/>\" },\n    { id: \"g3\", sym: 1, name: \"the corner triangle\",\n      svg: \"<path d='M18 18 L82 82 L18 82 Z' fill='\" + NAVY + \"'/>\" },\n    { id: \"g4\", sym: 1, name: \"the kite\",\n      svg: \"<path d='M50 8 L76 44 L50 92 L24 44 Z' fill='none' stroke='\" + NAVY + \"' stroke-width='7' stroke-linejoin='round'/><circle cx='50' cy='38' r='8' fill='\" + NAVY + \"'/>\" },\n    { id: \"g5\", sym: 1, name: \"the semicircle\",\n      svg: \"<path d='M14 64 A36 36 0 0 1 86 64 Z' fill='\" + NAVY + \"'/>\" },\n    { id: \"g6\", sym: 1, name: \"the heart\",\n      svg: \"<path d='M50 84 C20 60 12 38 26 26 C36 18 48 22 50 32 C52 22 64 18 74 26 C88 38 80 60 50 84 Z' fill='\" + NAVY + \"'/>\" },\n    { id: \"g7\", sym: 1, name: \"the lightning bolt\",\n      svg: \"<path d='M56 8 L26 54 L46 54 L40 92 L74 40 L52 40 Z' fill='\" + NAVY + \"'/>\" },\n    { id: \"g8\", sym: 1, name: \"the flag\",\n      svg: \"<line x1='32' y1='14' x2='32' y2='88' stroke='\" + NAVY + \"' stroke-width='8' stroke-linecap='round'/><path d='M32 18 L78 30 L32 46 Z' fill='\" + NAVY + \"'/>\" }\n  ],\n  arrows: [\n    { id: \"a1\", sym: 1, name: \"the straight arrow\",\n      svg: \"<line x1='50' y1='84' x2='50' y2='34' stroke='\" + NAVY + \"' stroke-width='9' stroke-linecap='round'/><polygon points='50,10 30,42 70,42' fill='\" + NAVY + \"'/>\" },\n    { id: \"a2\", sym: 2, name: \"the double-headed arrow\",\n      svg: \"<line x1='32' y1='68' x2='68' y2='32' stroke='\" + NAVY + \"' stroke-width='9' stroke-linecap='round'/><polygon points='80,20 52,26 74,48' fill='\" + NAVY + \"'/><polygon points='20,80 48,74 26,52' fill='\" + NAVY + \"'/>\" },\n    { id: \"a3\", sym: 1, name: \"the bent arrow\",\n      svg: \"<path d='M28 82 L28 36 L58 36' fill='none' stroke='\" + NAVY + \"' stroke-width='9' stroke-linecap='round' stroke-linejoin='round'/><polygon points='84,36 54,20 54,52' fill='\" + NAVY + \"'/>\" },\n    { id: \"a4\", sym: 1, name: \"the curved arrow\",\n      svg: \"<path d='M74 62 A28 28 0 1 0 46 78' fill='none' stroke='\" + NAVY + \"' stroke-width='9' stroke-linecap='round'/><polygon points='42,94 62,72 32,64' fill='\" + NAVY + \"'/>\" },\n    { id: \"a5\", sym: 1, name: \"the corner arrow\",\n      svg: \"<line x1='28' y1='72' x2='58' y2='42' stroke='\" + NAVY + \"' stroke-width='9' stroke-linecap='round'/><polygon points='82,18 44,30 70,56' fill='\" + NAVY + \"'/>\" },\n    { id: \"a6\", sym: 1, name: \"the hook arrow\",\n      svg: \"<path d='M34 84 L34 40 A16 16 0 0 1 66 40 L66 50' fill='none' stroke='\" + NAVY + \"' stroke-width='9' stroke-linecap='round'/><polygon points='66,76 50,50 82,50' fill='\" + NAVY + \"'/>\" },\n    { id: \"a7\", sym: 1, name: \"the barred arrow\",\n      svg: \"<line x1='24' y1='28' x2='24' y2='72' stroke='\" + NAVY + \"' stroke-width='9' stroke-linecap='round'/><line x1='24' y1='50' x2='58' y2='50' stroke='\" + NAVY + \"' stroke-width='9' stroke-linecap='round'/><polygon points='84,50 54,34 54,66' fill='\" + NAVY + \"'/>\" },\n    { id: \"a8\", sym: 1, name: \"the zigzag arrow\",\n      svg: \"<path d='M30 86 L48 58 L36 50 L56 26' fill='none' stroke='\" + NAVY + \"' stroke-width='9' stroke-linecap='round' stroke-linejoin='round'/><polygon points='66,10 42,16 56,32' fill='\" + NAVY + \"'/>\" }\n  ],\n  dots: [\n    { id: \"d1\", sym: 1, name: \"the corner dot\",\n      svg: \"<circle cx='31' cy='31' r='14' fill='\" + NAVY + \"'/>\" },\n    { id: \"d2\", sym: 1, name: \"the big and small dots\",\n      svg: \"<circle cx='30' cy='32' r='14' fill='\" + NAVY + \"'/><circle cx='67' cy='66' r='8' fill='\" + NAVY + \"'/>\" },\n    { id: \"d3\", sym: 2, name: \"the three dots\",\n      svg: \"<circle cx='26' cy='26' r='10' fill='\" + NAVY + \"'/><circle cx='50' cy='50' r='10' fill='\" + NAVY + \"'/><circle cx='74' cy='74' r='10' fill='\" + NAVY + \"'/>\" },\n    { id: \"d4\", sym: 2, name: \"the diagonal stripe\",\n      svg: \"<line x1='20' y1='20' x2='80' y2='80' stroke='\" + NAVY + \"' stroke-width='12' stroke-linecap='round'/>\" },\n    { id: \"d5\", sym: 1, name: \"the quarter circle\",\n      svg: \"<path d='M22 22 L66 22 A44 44 0 0 1 22 66 Z' fill='\" + NAVY + \"'/>\" },\n    { id: \"d6\", sym: 1, name: \"the dot and line\",\n      svg: \"<line x1='24' y1='76' x2='76' y2='24' stroke='\" + NAVY + \"' stroke-width='8' stroke-linecap='round'/><circle cx='69' cy='69' r='10' fill='\" + NAVY + \"'/>\" },\n    { id: \"d7\", sym: 1, name: \"the three corner dots\",\n      svg: \"<circle cx='27' cy='27' r='10' fill='\" + NAVY + \"'/><circle cx='73' cy='27' r='10' fill='\" + NAVY + \"'/><circle cx='27' cy='73' r='10' fill='\" + NAVY + \"'/>\" },\n    { id: \"d8\", sym: 1, name: \"the T shape\",\n      svg: \"<line x1='26' y1='28' x2='74' y2='28' stroke='\" + NAVY + \"' stroke-width='10' stroke-linecap='round'/><line x1='50' y1='28' x2='50' y2='80' stroke='\" + NAVY + \"' stroke-width='10' stroke-linecap='round'/>\" }\n  ]\n};\n/* Every glyph carries its own pastel face colour, so a symbol keeps\n   its colour across nets, cubes, cards and the 3D fold - colour and\n   symbol always agree and colour is never the only cue. */\nvar PASTELS = [\"#fdeccc\", \"#d8e9fd\", \"#d9f4e4\", \"#ffe3d1\", \"#e9e3fc\", \"#fbdfee\"];\nvar PAIR_COLOURS = [\"#f47820\", \"#2d8cf0\", \"#1e7a4f\"];\nvar GLYPH_BY_ID = {};\nObject.keys(THEME_GLYPHS).forEach(function (t) {\n  THEME_GLYPHS[t].forEach(function (g, gi) {\n    g.fill = PASTELS[gi % PASTELS.length];\n    GLYPH_BY_ID[g.id] = g;\n  });\n});\nfunction glyphFill(gid) {\n  return GLYPH_BY_ID[gid] && GLYPH_BY_ID[gid].fill ? GLYPH_BY_ID[gid].fill : \"#ffffff\";\n}\nfunction glyphSym(gid) { return GLYPH_BY_ID[gid] ? GLYPH_BY_ID[gid].sym : 1; }\nfunction glyphName(gid) { return GLYPH_BY_ID[gid] ? GLYPH_BY_ID[gid].name : \"the symbol\"; }\nfunction rotNorm(rot, gid) {\n  var period = 360 / glyphSym(gid);\n  return (((rot % 360) + 360) % 360) % period;\n}\n\n/* ============================================================\n   4. CUBE MODEL + VIEW MATHS\n   A \"print\" is what is stamped on one net cell:\n     { g: glyphId, col: 1..3, row: 1..3, rho: 0|90|180|270 }\n   (col,row) is the 3x3 grid slot; rho is the printed rotation.\n   A cube model stores, for every face, the glyph identity plus\n   its axes and slot offset expressed in cube coordinates - so\n   rotating the whole cube is one matrix application and no\n   information about symbol orientation is ever lost.\n   ============================================================ */\nfunction glyphAxesFor(face, rho) {\n  var r = face.r, u = face.u;\n  if (rho === 0)   return { gR: r.slice(),  gD: u.slice() };\n  if (rho === 90)  return { gR: u.slice(),  gD: vNeg(r) };\n  if (rho === 180) return { gR: vNeg(r),    gD: vNeg(u) };\n  return { gR: vNeg(u), gD: r.slice() };\n}\nfunction cubeModel(netIdx, prints) {\n  var info = foldNet(netIdx);\n  var faces = info.faces.map(function (f, i) {\n    var p = prints[i];\n    var axes = glyphAxesFor(f, p.rho);\n    var px = p.col - 2, py = p.row - 2;\n    return {\n      faceIdx: i,\n      g: p.g,\n      n: f.n.slice(),\n      gR: axes.gR,\n      gD: axes.gD,\n      posVec: [px * f.r[0] + py * f.u[0], px * f.r[1] + py * f.u[1], px * f.r[2] + py * f.u[2]]\n    };\n  });\n  return { netIdx: netIdx, prints: prints, info: info, faces: faces };\n}\nfunction rotateCubeFaces(faces, m) {\n  return faces.map(function (f) {\n    return {\n      faceIdx: f.faceIdx, g: f.g,\n      n: mApply(m, f.n), gR: mApply(m, f.gR), gD: mApply(m, f.gD),\n      posVec: mApply(m, f.posVec)\n    };\n  });\n}\n/* The exact appearance of the three faces a correct isometric\n   drawing must show: top, front and right around one shared vertex. */\nfunction viewFromFaces(rotatedFaces) {\n  var view = {};\n  VISIBLE_ROLES.forEach(function (role) {\n    var ax = ROLE_AXES[role];\n    var face = null;\n    for (var i = 0; i < rotatedFaces.length; i++) {\n      if (vEq(rotatedFaces[i].n, ax.n)) { face = rotatedFaces[i]; break; }\n    }\n    view[role] = {\n      faceIdx: face.faceIdx,\n      g: face.g,\n      rot: axisAngle(ax.R, ax.D, face.gR),\n      col: vDot(face.posVec, ax.R) + 2,\n      row: vDot(face.posVec, ax.D) + 2\n    };\n  });\n  return view;\n}\nfunction viewFor(cube, m) { return viewFromFaces(rotateCubeFaces(cube.faces, m)); }\nfunction viewFaceSig(vf) {\n  return vf.g + \":\" + rotNorm(vf.rot, vf.g) + \":\" + vf.col + \",\" + vf.row;\n}\nfunction viewSig(view) {\n  return VISIBLE_ROLES.map(function (r) { return viewFaceSig(view[r]); }).join(\"|\");\n}\n/* Which three symbols are visible, ignoring orientation. Used to keep\n   cube options visually distinct (different corners of the cube). */\nfunction viewTrioKey(view) {\n  return VISIBLE_ROLES.map(function (r) { return view[r].g; }).sort().join(\"|\");\n}\n/* Brute-force ground truth: a drawn cube is makeable from this\n   net if and only if one of the 24 rotations reproduces it. */\nfunction canProduceView(cube, targetView) {\n  var target = viewSig(targetView);\n  for (var i = 0; i < ROTS24.length; i++) {\n    if (viewSig(viewFor(cube, ROTS24[i])) === target) return true;\n  }\n  return false;\n}\n/* Re-print a finished cube onto a different net shape. Solves the\n   printed rotation rho and slot (col,row) for every face so the new\n   net folds into the identical cube. Used to build guaranteed-valid\n   alternative nets. */\nfunction reprintCube(cube, m, targetNetIdx) {\n  var world = rotateCubeFaces(cube.faces, m);\n  var byN = {};\n  world.forEach(function (f) { byN[vKey(f.n)] = f; });\n  var info = foldNet(targetNetIdx);\n  var prints = info.faces.map(function (face) {\n    var src = byN[vKey(face.n)];\n    var rho;\n    if (vEq(src.gR, face.r)) rho = 0;\n    else if (vEq(src.gR, face.u)) rho = 90;\n    else if (vEq(src.gR, vNeg(face.r))) rho = 180;\n    else rho = 270;\n    return {\n      g: src.g,\n      col: vDot(src.posVec, face.r) + 2,\n      row: vDot(src.posVec, face.u) + 2,\n      rho: rho\n    };\n  });\n  return prints;\n}\nfunction printsSig(netIdx, prints) {\n  return netIdx + \"#\" + prints.map(function (p) {\n    return p.g + \":\" + rotNorm(p.rho, p.g) + \":\" + p.col + \",\" + p.row;\n  }).join(\"|\");\n}\n\n/* ============================================================\n   5. SVG RENDERERS\n   ============================================================ */\nfunction glyphSlotTransform(col, row, rot) {\n  var ox = col - 2, oy = row - 2;\n  var cx = 50 + ox * 29, cy = 50 + oy * 29;\n  var s = (ox === 0 && oy === 0) ? 0.7 : 0.42;\n  return \"translate(\" + cx + \" \" + cy + \") rotate(\" + rot + \") scale(\" + s + \") translate(-50 -50)\";\n}\nfunction glyphGroup(g, rot, col, row) {\n  var def = GLYPH_BY_ID[g];\n  if (!def) return \"\";\n  return \"<g transform='\" + glyphSlotTransform(col, row, rot) + \"'>\" + def.svg + \"</g>\";\n}\n/* Flat face card, 100x100. spec = {g,rot,col,row}; extra styling flags. */\nfunction faceCardSvg(spec, opts) {\n  opts = opts || {};\n  var w = opts.width || 84;\n  var fill = opts.fill || glyphFill(spec.g);\n  var out = \"<svg viewBox='0 0 100 100' width='\" + w + \"' height='\" + w + \"' role='img' aria-label='\" + esc(opts.label || \"face card\") + \"'>\";\n  out += \"<rect x='3' y='3' width='94' height='94' rx='8' fill='\" + fill + \"' stroke='\" + NAVY + \"' stroke-width='4'/>\";\n  out += glyphGroup(spec.g, spec.rot || 0, spec.col || 2, spec.row || 2);\n  out += \"</svg>\";\n  return out;\n}\n/* Whole net. prints[] aligned with NETS[netIdx].cells.\n   opts.highlightIdx marks one face: thick orange border + tinted\n   fill + dashed inner ring (colour is never the only cue). */\nfunction netSvg(netIdx, prints, opts) {\n  opts = opts || {};\n  var net = NETS[netIdx];\n  var b = netBounds(netIdx);\n  var W = b.cols * 100, H = b.rows * 100;\n  var wpx = opts.width || Math.min(320, b.cols * 78);\n  var out = \"<svg viewBox='0 0 \" + W + \" \" + H + \"' width='\" + wpx + \"' style='max-width:100%;height:auto;' role='img' aria-label='\" + esc(opts.label || \"cube net\") + \"'>\";\n  net.cells.forEach(function (c, i) {\n    var x = (c[0] - b.minX) * 100, y = (c[1] - b.minY) * 100;\n    var hl = opts.highlightIdx === i;\n    var p = prints[i];\n    out += \"<g transform='translate(\" + x + \" \" + y + \")'>\";\n    out += \"<rect x='3' y='3' width='94' height='94' rx='6' fill='\" + (p ? glyphFill(p.g) : \"#ffffff\") + \"' stroke='\" + (hl ? \"#f47820\" : NAVY) + \"' stroke-width='\" + (hl ? 8 : 4) + \"'/>\";\n    if (hl) {\n      out += \"<rect x='11' y='11' width='78' height='78' rx='4' fill='none' stroke='\" + NAVY + \"' stroke-width='3' stroke-dasharray='9 6'/>\";\n    }\n    if (p) out += glyphGroup(p.g, p.rho, p.col, p.row);\n    if (opts.pairs && typeof opts.pairs[i] !== \"undefined\") {\n      var pc = PAIR_COLOURS[opts.pairs[i] % 3];\n      out += \"<circle cx='82' cy='18' r='13' fill='#ffffff' stroke='\" + pc + \"' stroke-width='4'/>\";\n      out += \"<text x='82' y='19' font-size='16' font-weight='900' text-anchor='middle' dominant-baseline='central' fill='\" + pc + \"'>\" + (opts.pairs[i] + 1) + \"</text>\";\n    }\n    out += \"</g>\";\n  });\n  out += \"</svg>\";\n  return out;\n}\n/* Isometric cube. view = {top,front,right} each {g,rot,col,row} or\n   the string \"hidden\" behaviour via opts.hiddenRole. Faces are drawn\n   by mapping face-local (0..100)^2 through a real affine projection,\n   so symbols shear and rotate exactly as the folded geometry demands. */\nvar ISO_S = 52;\nfunction isoProject(p) {\n  return [\n    (p[0] - p[1]) * 0.866 * ISO_S,\n    (p[0] + p[1]) * 0.5 * ISO_S - p[2] * ISO_S\n  ];\n}\nfunction isoFaceMatrix(role) {\n  var ax = ROLE_AXES[role];\n  var c00 = [\n    ax.n[0] * 0.5 - ax.R[0] * 0.5 - ax.D[0] * 0.5,\n    ax.n[1] * 0.5 - ax.R[1] * 0.5 - ax.D[1] * 0.5,\n    ax.n[2] * 0.5 - ax.R[2] * 0.5 - ax.D[2] * 0.5\n  ];\n  var o = isoProject(c00);\n  var pr = isoProject(ax.R);\n  var pd = isoProject(ax.D);\n  return [pr[0] / 100, pr[1] / 100, pd[0] / 100, pd[1] / 100, o[0], o[1]];\n}\nvar ISO_MATRICES = { top: isoFaceMatrix(\"top\"), front: isoFaceMatrix(\"front\"), right: isoFaceMatrix(\"right\") };\nvar ISO_TINT = { top: \"\", front: \"rgba(16,25,54,0.05)\", right: \"rgba(16,25,54,0.12)\" };\nfunction isoCubeSvg(view, opts) {\n  opts = opts || {};\n  var w = opts.width || 150;\n  var out = \"<svg viewBox='-50 -58 100 116' width='\" + w + \"' height='\" + Math.round(w * 1.16) + \"' role='img' aria-label='\" + esc(opts.label || \"cube drawing\") + \"'>\";\n  VISIBLE_ROLES.forEach(function (role) {\n    var mtx = ISO_MATRICES[role];\n    var tf = \"matrix(\" + mtx.join(\" \") + \")\";\n    out += \"<g transform='\" + tf + \"'>\";\n    if (opts.hiddenRole === role) {\n      out += \"<rect x='2' y='2' width='96' height='96' fill='#fff8ea' stroke='\" + NAVY + \"' stroke-width='4' stroke-dasharray='10 7'/>\";\n      out += \"<text x='50' y='52' font-size='52' font-weight='900' text-anchor='middle' dominant-baseline='central' fill='\" + NAVY + \"'>?</text>\";\n    } else {\n      var vf = view[role];\n      out += \"<rect x='0' y='0' width='100' height='100' fill='\" + glyphFill(vf.g) + \"' stroke='\" + NAVY + \"' stroke-width='4'/>\";\n      if (ISO_TINT[role]) out += \"<rect x='0' y='0' width='100' height='100' fill='\" + ISO_TINT[role] + \"'/>\";\n      out += glyphGroup(vf.g, vf.rot, vf.col, vf.row);\n      if (opts.ringRole === role) {\n        out += \"<rect x='6' y='6' width='88' height='88' fill='none' stroke='#f47820' stroke-width='9'/>\";\n        out += \"<rect x='15' y='15' width='70' height='70' fill='none' stroke='\" + NAVY + \"' stroke-width='3' stroke-dasharray='9 6'/>\";\n      }\n    }\n    out += \"</g>\";\n  });\n  out += \"</svg>\";\n  return out;\n}\nfunction figureHtml(inner, caption) {\n  return \"<div class='cnt-figure'>\" + inner + (caption ? \"<span class='cnt-figcap'>\" + esc(caption) + \"</span>\" : \"\") + \"</div>\";\n}\n\n/* ============================================================\n   6. QUESTION FRAMEWORK\n   Every builder returns:\n   { typeId, prompt, stimulusHtml, options:[{html,sig,isCorrect,note}],\n     correctIdx, explanation, review:{netIdx,prints} }\n   finishQuestion() shuffles, validates and stamps the final object.\n   ============================================================ */\nvar TYPE_META = [\n  { id: \"opposite\",     label: \"Which face is opposite?\" },\n  { id: \"cannotTouch\",  label: \"Which face cannot touch?\" },\n  { id: \"canTouch\",     label: \"Which pair of faces can touch?\" },\n  { id: \"whichRole\",    label: \"Which face is top / front / right?\" },\n  { id: \"missingFace\",  label: \"Missing face on the cube\" },\n  { id: \"hiddenFace\",   label: \"Hidden face on the cube\" },\n  { id: \"cubeCanMake\",  label: \"Which cube can be made?\" },\n  { id: \"cubeCannot\",   label: \"Which cube cannot be made?\" },\n  { id: \"netCanMake\",   label: \"Which net makes the cube?\" },\n  { id: \"netCannot\",    label: \"Which net cannot make the cube?\" }\n];\nvar LETTERS4 = [\"A\", \"B\", \"C\", \"D\"];\nfunction typeLabel(id) {\n  for (var i = 0; i < TYPE_META.length; i++) if (TYPE_META[i].id === id) return TYPE_META[i].label;\n  return id;\n}\nfunction finishQuestion(q) {\n  var order = shuffleC(q.options.map(function (_, i) { return i; }));\n  var options = order.map(function (i) { return q.options[i]; });\n  var correctIdx = -1;\n  var correctCount = 0;\n  var sigs = {};\n  for (var i = 0; i < options.length; i++) {\n    var o = options[i];\n    if (!o || !o.html || !o.sig) return null;\n    if (sigs[o.sig]) return null;      /* duplicate / ambiguous option */\n    sigs[o.sig] = true;\n    if (o.isCorrect) { correctIdx = i; correctCount++; }\n  }\n  if (options.length !== 4 || correctCount !== 1) return null;\n  var notes = [];\n  options.forEach(function (o, i) {\n    if (o.note && !o.isCorrect) notes.push(\"Option \" + LETTERS4[i] + \": \" + o.note);\n  });\n  q.options = options;\n  q.correctIdx = correctIdx;\n  q.explanation = q.explanation + (notes.length ? \"\\n\" + notes.join(\"\\n\") : \"\");\n  return q;\n}\n/* Random printed layout for one net: 6 distinct glyphs, random\n   slots, random printed rotations (biased towards upright). */\nfunction glyphPool(theme) {\n  if (theme === \"mixed\") {\n    var all = [];\n    Object.keys(THEME_GLYPHS).forEach(function (t) { all = all.concat(THEME_GLYPHS[t]); });\n    return all;\n  }\n  return THEME_GLYPHS[theme] || THEME_GLYPHS.numbers;\n}\n/* Pick 6 glyphs with 6 different face colours (every pool covers all\n   six pastels, so this always succeeds). */\nfunction pickSixGlyphs(theme) {\n  var out = [], used = {};\n  shuffleC(glyphPool(theme)).forEach(function (g) {\n    if (out.length < 6 && !used[g.fill]) {\n      used[g.fill] = true;\n      out.push(g);\n    }\n  });\n  return out;\n}\nfunction randomPrints(theme) {\n  var pool = pickSixGlyphs(theme);\n  var slots = [[1,1],[2,1],[3,1],[1,2],[3,2],[1,3],[2,3],[3,3]];\n  return pool.map(function (g) {\n    var centre = Math.random() < 0.5;\n    var slot = centre ? [2,2] : choice(slots);\n    var rho = Math.random() < 0.45 ? 0 : choice([90, 180, 270]);\n    return { g: g.id, col: slot[0], row: slot[1], rho: rho };\n  });\n}\nfunction buildBase(theme) {\n  var netIdx = Math.floor(Math.random() * NETS.length);\n  var prints = randomPrints(theme);\n  var cube = cubeModel(netIdx, prints);\n  return { netIdx: netIdx, prints: prints, cube: cube, info: cube.info };\n}\nfunction faceRole(base, faceIdx) {\n  return ROLE_BY_NKEY[vKey(base.info.faces[faceIdx].n)];\n}\nfunction printCardHtml(base, faceIdx, w) {\n  var p = base.prints[faceIdx];\n  return faceCardSvg({ g: p.g, rot: p.rho, col: p.col, row: p.row },\n    { width: w || 84, label: glyphName(p.g) });\n}\n\n/* ---- Type 1: Which face is opposite? ---- */\nfunction buildOpposite(theme) {\n  var base = buildBase(theme);\n  var A = Math.floor(Math.random() * 6);\n  var opp = base.info.opposite[A];\n  var adjacents = [];\n  for (var i = 0; i < 6; i++) if (i !== A && i !== opp) adjacents.push(i);\n  var wrong = shuffleC(adjacents).slice(0, 3);\n  var nameA = glyphName(base.prints[A].g);\n  var options = [{\n    html: printCardHtml(base, opp), sig: \"f\" + opp, isCorrect: true, note: \"\"\n  }].concat(wrong.map(function (fi) {\n    return {\n      html: printCardHtml(base, fi), sig: \"f\" + fi, isCorrect: false,\n      note: glyphName(base.prints[fi].g) + \" folds next to \" + nameA + \", so it is a neighbour, not opposite.\"\n    };\n  }));\n  return finishQuestion({\n    typeId: \"opposite\",\n    prompt: \"The net folds into a cube. Which face ends up OPPOSITE the face with the orange border?\",\n    stimulusHtml: figureHtml(netSvg(base.netIdx, base.prints, { highlightIdx: A })),\n    options: options,\n    explanation: nameA + \" folds to the \" + faceRole(base, A) + \" and \" + glyphName(base.prints[opp].g) + \" to the \" + faceRole(base, opp) + \". Opposite faces sit one square apart in a straight line on the net.\",\n    review: { netIdx: base.netIdx, prints: base.prints }\n  });\n}\n\n/* ---- Type 2: Which face cannot touch? ---- */\nfunction buildCannotTouch(theme) {\n  var base = buildBase(theme);\n  var A = Math.floor(Math.random() * 6);\n  var opp = base.info.opposite[A];\n  var adjacents = [];\n  for (var i = 0; i < 6; i++) if (i !== A && i !== opp) adjacents.push(i);\n  var wrong = shuffleC(adjacents).slice(0, 3);\n  var nameA = glyphName(base.prints[A].g);\n  var options = [{\n    html: printCardHtml(base, opp), sig: \"f\" + opp, isCorrect: true, note: \"\"\n  }].concat(wrong.map(function (fi) {\n    return {\n      html: printCardHtml(base, fi), sig: \"f\" + fi, isCorrect: false,\n      note: glyphName(base.prints[fi].g) + \" ends up next to \" + nameA + \", so it CAN touch it.\"\n    };\n  }));\n  return finishQuestion({\n    typeId: \"cannotTouch\",\n    prompt: \"Which face can NEVER touch the face with the orange border once the net is folded?\",\n    stimulusHtml: figureHtml(netSvg(base.netIdx, base.prints, { highlightIdx: A })),\n    options: options,\n    explanation: \"A face touches its four neighbours but never its opposite. \" + nameA + \" folds to the \" + faceRole(base, A) + \" and \" + glyphName(base.prints[opp].g) + \" to the \" + faceRole(base, opp) + \".\",\n    review: { netIdx: base.netIdx, prints: base.prints }\n  });\n}\n\n/* ---- Type 3: Which pair of faces can touch? ---- */\nfunction pairOptionHtml(base, i, j) {\n  return \"<span class='cnt-pairopt'>\" + printCardHtml(base, i, 62) +\n    \"<span class='cnt-amp'>&amp;</span>\" + printCardHtml(base, j, 62) + \"</span>\";\n}\nfunction buildCanTouch(theme) {\n  var base = buildBase(theme);\n  var oppPairs = [];\n  var used = {};\n  for (var i = 0; i < 6; i++) {\n    var o = base.info.opposite[i];\n    var pk = Math.min(i, o) + \"-\" + Math.max(i, o);\n    if (!used[pk]) { used[pk] = true; oppPairs.push([Math.min(i, o), Math.max(i, o)]); }\n  }\n  var a = Math.floor(Math.random() * 6);\n  var others = [];\n  for (var k = 0; k < 6; k++) if (k !== a && k !== base.info.opposite[a]) others.push(k);\n  var b = choice(others);\n  var pair = [Math.min(a, b), Math.max(a, b)];\n  var options = [{\n    html: pairOptionHtml(base, pair[0], pair[1]),\n    sig: \"p\" + pair[0] + \"-\" + pair[1], isCorrect: true, note: \"\"\n  }].concat(oppPairs.map(function (pp) {\n    return {\n      html: pairOptionHtml(base, pp[0], pp[1]),\n      sig: \"p\" + pp[0] + \"-\" + pp[1], isCorrect: false,\n      note: glyphName(base.prints[pp[0]].g) + \" and \" + glyphName(base.prints[pp[1]].g) + \" are an opposite pair, so they never touch.\"\n    };\n  }));\n  return finishQuestion({\n    typeId: \"canTouch\",\n    prompt: \"Which pair of faces WILL touch along an edge when the net is folded?\",\n    stimulusHtml: figureHtml(netSvg(base.netIdx, base.prints, {})),\n    options: options,\n    explanation: glyphName(base.prints[pair[0]].g) + \" (\" + faceRole(base, pair[0]) + \") and \" + glyphName(base.prints[pair[1]].g) + \" (\" + faceRole(base, pair[1]) + \") share an edge. The other three pairs are opposite pairs and never meet.\",\n    review: { netIdx: base.netIdx, prints: base.prints }\n  });\n}\n\n/* ---- Type 4: Which face is top / front / right? ---- */\nfunction buildWhichRole(theme) {\n  var base = buildBase(theme);\n  var m = choice(ROTS24);\n  var view = viewFor(base.cube, m);\n  var role = choice(VISIBLE_ROLES);\n  var correctG = view[role].g;\n  var otherVisible = VISIBLE_ROLES.filter(function (r) { return r !== role; })\n    .map(function (r) { return view[r].g; });\n  var hidden = base.prints.map(function (p) { return p.g; }).filter(function (g) {\n    return g !== correctG && otherVisible.indexOf(g) === -1;\n  });\n  var wrongGs = otherVisible.concat(shuffleC(hidden)).slice(0, 3);\n  var options = [{\n    html: faceCardSvg({ g: correctG, rot: 0, col: 2, row: 2 }, { label: glyphName(correctG) }),\n    sig: \"g\" + correctG, isCorrect: true, note: \"\"\n  }].concat(wrongGs.map(function (g) {\n    return {\n      html: faceCardSvg({ g: g, rot: 0, col: 2, row: 2 }, { label: glyphName(g) }),\n      sig: \"g\" + g, isCorrect: false,\n      note: glyphName(g) + \" is on a different face of this cube, not the \" + role + \".\"\n    };\n  }));\n  return finishQuestion({\n    typeId: \"whichRole\",\n    prompt: \"Which symbol is on the \" + role.toUpperCase() + \" face of this cube?\",\n    stimulusHtml: figureHtml(isoCubeSvg(view, { width: 168 }), \"Top = lid, front = lower-left, right = lower-right\"),\n    options: options,\n    explanation: \"The \" + role + \" face shows \" + glyphName(correctG) + \". Symbols can look tilted on a 3D drawing, but the shape stays the same.\",\n    review: { netIdx: base.netIdx, prints: base.prints }\n  });\n}\n\n/* ---- Type 5: Missing face on the cube ---- */\nfunction buildMissingFace(theme) {\n  var base = buildBase(theme);\n  var m = choice(ROTS24);\n  var view = viewFor(base.cube, m);\n  var hideRole = choice(VISIBLE_ROLES);\n  var truth = view[hideRole];\n  var sym = glyphSym(truth.g);\n  var options = [{\n    html: faceCardSvg(truth, { label: glyphName(truth.g) }),\n    sig: \"d\" + viewFaceSig(truth), isCorrect: true, note: \"\"\n  }];\n  /* Distractor: right symbol, wrong turn (respecting glyph symmetry). */\n  var deltas = [90, 180, 270].filter(function (d) { return d % (360 / sym) !== 0; });\n  if (deltas.length) {\n    var d1 = {\n      g: truth.g, rot: (truth.rot + choice(deltas)) % 360,\n      col: truth.col, row: truth.row\n    };\n    options.push({\n      html: faceCardSvg(d1, { label: glyphName(truth.g) + \" turned wrongly\" }),\n      sig: \"d\" + viewFaceSig(d1), isCorrect: false,\n      note: \"the right symbol turned the wrong way.\"\n    });\n  }\n  /* Distractor: a symbol that is opposite one of the visible faces -\n     geometrically impossible in this position. */\n  var visRole = VISIBLE_ROLES.filter(function (r) { return r !== hideRole; })[Math.floor(Math.random() * 2)];\n  var oppOfVisible = base.info.opposite[view[visRole].faceIdx];\n  var d2 = { g: base.prints[oppOfVisible].g, rot: choice([0, 90, 180, 270]), col: truth.col, row: truth.row };\n  options.push({\n    html: faceCardSvg(d2, { label: glyphName(d2.g) }),\n    sig: \"d\" + viewFaceSig(d2), isCorrect: false,\n    note: glyphName(d2.g) + \" is opposite \" + glyphName(view[visRole].g) + \", so it can never sit beside it.\"\n  });\n  /* Distractor: right symbol, wrong slot (or another hidden face's symbol). */\n  if (truth.col !== 2 || truth.row !== 2) {\n    var d3 = { g: truth.g, rot: truth.rot, col: 4 - truth.col, row: 4 - truth.row };\n    options.push({\n      html: faceCardSvg(d3, { label: glyphName(truth.g) + \" in the wrong corner\" }),\n      sig: \"d\" + viewFaceSig(d3), isCorrect: false,\n      note: \"the right symbol in the wrong position.\"\n    });\n  } else {\n    var hiddenIdxs = [];\n    for (var i = 0; i < 6; i++) {\n      var isVis = VISIBLE_ROLES.some(function (r) { return view[r].faceIdx === i; });\n      if (!isVis && i !== oppOfVisible) hiddenIdxs.push(i);\n    }\n    var fi = choice(hiddenIdxs);\n    var d3b = { g: base.prints[fi].g, rot: choice([0, 90, 180, 270]), col: 2, row: 2 };\n    options.push({\n      html: faceCardSvg(d3b, { label: glyphName(d3b.g) }),\n      sig: \"d\" + viewFaceSig(d3b), isCorrect: false,\n      note: glyphName(d3b.g) + \" belongs on a different face.\"\n    });\n  }\n  if (options.length < 4) return null;\n  return finishQuestion({\n    typeId: \"missingFace\",\n    prompt: \"One face of this cube is missing. Which option completes it EXACTLY as it would appear?\",\n    stimulusHtml: figureHtml(netSvg(base.netIdx, base.prints, { width: 250 }), \"The net\") +\n      figureHtml(isoCubeSvg(view, { width: 168, hiddenRole: hideRole })),\n    options: options.slice(0, 4),\n    explanation: \"The two visible faces fix the cube's position, so the net forces \" + glyphName(truth.g) + \" here at exactly this angle.\",\n    review: { netIdx: base.netIdx, prints: base.prints }\n  });\n}\n\n/* ---- Type 6: Hidden face on the cube ---- */\nfunction buildHiddenFace(theme) {\n  var base = buildBase(theme);\n  var m = choice(ROTS24);\n  var view = viewFor(base.cube, m);\n  var role = choice(VISIBLE_ROLES);\n  var ringFace = view[role].faceIdx;\n  var oppIdx = base.info.opposite[ringFace];\n  var correctG = base.prints[oppIdx].g;\n  var wrongPool = [];\n  for (var i = 0; i < 6; i++) if (i !== ringFace && i !== oppIdx) wrongPool.push(base.prints[i].g);\n  var wrongGs = shuffleC(wrongPool).slice(0, 3);\n  var options = [{\n    html: faceCardSvg({ g: correctG, rot: 0, col: 2, row: 2 }, { label: glyphName(correctG) }),\n    sig: \"g\" + correctG, isCorrect: true, note: \"\"\n  }].concat(wrongGs.map(function (g) {\n    return {\n      html: faceCardSvg({ g: g, rot: 0, col: 2, row: 2 }, { label: glyphName(g) }),\n      sig: \"g\" + g, isCorrect: false,\n      note: glyphName(g) + \" is a neighbour of \" + glyphName(base.prints[ringFace].g) + \", not the face behind it.\"\n    };\n  }));\n  return finishQuestion({\n    typeId: \"hiddenFace\",\n    prompt: \"Which symbol is on the hidden face directly opposite the ringed face?\",\n    stimulusHtml: figureHtml(netSvg(base.netIdx, base.prints, { width: 250 }), \"The net\") +\n      figureHtml(isoCubeSvg(view, { width: 168, ringRole: role })),\n    options: options,\n    explanation: glyphName(base.prints[ringFace].g) + \" and \" + glyphName(correctG) + \" fold to the \" + faceRole(base, ringFace) + \" and \" + faceRole(base, oppIdx) + \": opposite faces, one square apart on the net.\",\n    review: { netIdx: base.netIdx, prints: base.prints }\n  });\n}\n\n/* ============================================================\n   7. DISTRACTOR MUTATION ENGINE (types 7-10)\n   Every distractor is built by deliberately breaking one rule,\n   then PROVED impossible against all 24 cube rotations before\n   it is allowed on screen. Nothing is trusted, everything is\n   re-checked; failures re-roll silently.\n   ============================================================ */\nfunction cloneView(view) {\n  var out = {};\n  VISIBLE_ROLES.forEach(function (r) {\n    var f = view[r];\n    out[r] = { faceIdx: f.faceIdx, g: f.g, rot: f.rot, col: f.col, row: f.row };\n  });\n  return out;\n}\nvar VIEW_MUTATORS = [\n  { kind: \"oppositeCollision\", apply: function (view, base) {\n      var roles = shuffleC(VISIBLE_ROLES);\n      var src = view[roles[0]], dst = roles[1];\n      var oppIdx = base.info.opposite[src.faceIdx];\n      var v = cloneView(view);\n      v[dst] = { faceIdx: -1, g: base.prints[oppIdx].g, rot: choice([0, 90, 180, 270]), col: v[dst].col, row: v[dst].row };\n      return { view: v, note: \"it shows \" + glyphName(src.g) + \" and \" + glyphName(base.prints[oppIdx].g) + \" touching, but they are opposite faces.\" };\n    } },\n  { kind: \"rotationDefect\", apply: function (view) {\n      var candidates = VISIBLE_ROLES.filter(function (r) { return glyphSym(view[r].g) < 4; });\n      if (!candidates.length) return null;\n      var role = choice(candidates);\n      var sym = glyphSym(view[role].g);\n      var deltas = [90, 180, 270].filter(function (d) { return d % (360 / sym) !== 0; });\n      if (!deltas.length) return null;\n      var v = cloneView(view);\n      v[role] = { faceIdx: -1, g: v[role].g, rot: (v[role].rot + choice(deltas)) % 360, col: v[role].col, row: v[role].row };\n      return { view: v, note: glyphName(view[role].g) + \" is twisted to an impossible angle.\" };\n    } },\n  { kind: \"chiralityFlip\", apply: function (view) {\n      var roles = shuffleC(VISIBLE_ROLES);\n      var v = cloneView(view);\n      var t = v[roles[0]];\n      v[roles[0]] = v[roles[1]];\n      v[roles[1]] = t;\n      return { view: v, note: \"the symbols are arranged as a mirror image, which no turn of the real cube can produce.\" };\n    } },\n  { kind: \"positionDefect\", apply: function (view) {\n      var candidates = VISIBLE_ROLES.filter(function (r) { return view[r].col !== 2 || view[r].row !== 2; });\n      if (!candidates.length) return null;\n      var role = choice(candidates);\n      var v = cloneView(view);\n      v[role] = { faceIdx: -1, g: v[role].g, rot: v[role].rot, col: 4 - v[role].col, row: 4 - v[role].row };\n      return { view: v, note: glyphName(view[role].g) + \" is in the wrong position on its face.\" };\n    } }\n];\nfunction makeInvalidView(base, seedView, bannedSigs) {\n  var order = shuffleC(VIEW_MUTATORS);\n  for (var mi = 0; mi < order.length; mi++) {\n    for (var t = 0; t < 24; t++) {\n      var res = order[mi].apply(cloneView(seedView), base);\n      if (!res) break;\n      var sig = viewSig(res.view);\n      if (bannedSigs[sig]) continue;\n      if (canProduceView(base.cube, res.view)) continue; /* accidentally still valid: reject */\n      bannedSigs[sig] = true;\n      return { view: res.view, sig: sig, note: res.note };\n    }\n  }\n  return null;\n}\nfunction clonePrints(prints) {\n  return prints.map(function (p) { return { g: p.g, col: p.col, row: p.row, rho: p.rho }; });\n}\nvar PRINT_MUTATORS = [\n  { kind: \"swap\", apply: function (prints) {\n      var i = Math.floor(Math.random() * 6);\n      var j = (i + 1 + Math.floor(Math.random() * 5)) % 6;\n      var out = clonePrints(prints);\n      var t = out[i]; out[i] = out[j]; out[j] = t;\n      return { prints: out, note: \"two symbols have swapped places.\" };\n    } },\n  { kind: \"rotate\", apply: function (prints) {\n      var candidates = [];\n      prints.forEach(function (p, i) { if (glyphSym(p.g) < 4) candidates.push(i); });\n      if (!candidates.length) return null;\n      var i = choice(candidates);\n      var sym = glyphSym(prints[i].g);\n      var deltas = [90, 180, 270].filter(function (d) { return d % (360 / sym) !== 0; });\n      if (!deltas.length) return null;\n      var out = clonePrints(prints);\n      out[i].rho = (out[i].rho + choice(deltas)) % 360;\n      return { prints: out, note: glyphName(prints[i].g) + \" is printed at the wrong angle.\" };\n    } },\n  { kind: \"move\", apply: function (prints) {\n      var candidates = [];\n      prints.forEach(function (p, i) { if (p.col !== 2 || p.row !== 2) candidates.push(i); });\n      if (!candidates.length) return null;\n      var i = choice(candidates);\n      var out = clonePrints(prints);\n      out[i].col = 4 - out[i].col;\n      out[i].row = 4 - out[i].row;\n      return { prints: out, note: glyphName(prints[i].g) + \" sits in the wrong position on its square.\" };\n    } }\n];\nfunction makeInvalidNet(targetView, preferredNetIdx, bannedSigs) {\n  for (var t = 0; t < 60; t++) {\n    var netIdx = t < 20 && preferredNetIdx !== null ? preferredNetIdx : Math.floor(Math.random() * NETS.length);\n    var seed = reprintCube(TARGET_CUBE_SCRATCH, choice(ROTS24), netIdx);\n    var mut = choice(PRINT_MUTATORS).apply(seed);\n    if (!mut) continue;\n    var sig = printsSig(netIdx, mut.prints);\n    if (bannedSigs[sig]) continue;\n    var cand = cubeModel(netIdx, mut.prints);\n    if (canProduceView(cand, targetView)) continue; /* still makeable: reject */\n    bannedSigs[sig] = true;\n    return { netIdx: netIdx, prints: mut.prints, sig: sig, note: mut.note };\n  }\n  return null;\n}\nvar TARGET_CUBE_SCRATCH = null; /* set by net-question builders before use */\n\n/* ---- Type 7: Which cube can be made? ---- */\nfunction buildCubeCanMake(theme) {\n  var base = buildBase(theme);\n  var correctView = viewFor(base.cube, choice(ROTS24));\n  var banned = {};\n  banned[viewSig(correctView)] = true;\n  var usedTrios = {};\n  usedTrios[viewTrioKey(correctView)] = true;\n  function freshSeed() {\n    var ms = shuffleC(ROTS24);\n    for (var j = 0; j < ms.length; j++) {\n      var cand = viewFor(base.cube, ms[j]);\n      if (!usedTrios[viewTrioKey(cand)]) return cand;\n    }\n    return viewFor(base.cube, choice(ROTS24));\n  }\n  var options = [{\n    html: isoCubeSvg(correctView, { width: 118 }),\n    sig: viewSig(correctView), isCorrect: true, note: \"\"\n  }];\n  for (var i = 0; i < 3; i++) {\n    var inv = makeInvalidView(base, freshSeed(), banned);\n    if (!inv) return null;\n    usedTrios[viewTrioKey(inv.view)] = true;\n    options.push({ html: isoCubeSvg(inv.view, { width: 118 }), sig: inv.sig, isCorrect: false, note: inv.note });\n  }\n  return finishQuestion({\n    typeId: \"cubeCanMake\",\n    prompt: \"Which cube CAN be made by folding this net?\",\n    stimulusHtml: figureHtml(netSvg(base.netIdx, base.prints, {})),\n    options: options,\n    explanation: \"Only one drawing matches the net: right symbols at the corner, each turned correctly, no opposite pair touching.\",\n    review: { netIdx: base.netIdx, prints: base.prints }\n  });\n}\n\n/* ---- Type 8: Which cube cannot be made? ---- */\nfunction buildCubeCannot(theme) {\n  var base = buildBase(theme);\n  var banned = {};\n  var usedTrios = {};\n  var valids = [];\n  var ms = shuffleC(ROTS24);\n  for (var i = 0; i < ms.length && valids.length < 3; i++) {\n    var v = viewFor(base.cube, ms[i]);\n    var sig = viewSig(v);\n    var trio = viewTrioKey(v);\n    if (banned[sig] || usedTrios[trio]) continue;\n    banned[sig] = true;\n    usedTrios[trio] = true;\n    valids.push({ view: v, sig: sig });\n  }\n  if (valids.length < 3) return null;\n  var seed = null;\n  var ms2 = shuffleC(ROTS24);\n  for (var k = 0; k < ms2.length && !seed; k++) {\n    var cand = viewFor(base.cube, ms2[k]);\n    if (!usedTrios[viewTrioKey(cand)]) seed = cand;\n  }\n  if (!seed) seed = viewFor(base.cube, choice(ROTS24));\n  var inv = makeInvalidView(base, seed, banned);\n  if (!inv) return null;\n  var options = valids.map(function (vv) {\n    return {\n      html: isoCubeSvg(vv.view, { width: 118 }), sig: vv.sig, isCorrect: false,\n      note: \"this is the same cube seen from a different angle.\"\n    };\n  });\n  options.push({ html: isoCubeSvg(inv.view, { width: 118 }), sig: inv.sig, isCorrect: true, note: \"\" });\n  return finishQuestion({\n    typeId: \"cubeCannot\",\n    prompt: \"Three of these cubes can be made by folding this net. Which cube CANNOT be made?\",\n    stimulusHtml: figureHtml(netSvg(base.netIdx, base.prints, {})),\n    options: options,\n    explanation: \"The impossible drawing: \" + inv.note + \" The other three are the same cube from different angles.\",\n    review: { netIdx: base.netIdx, prints: base.prints }\n  });\n}\n\n/* ---- Type 9: Which net makes the cube? ---- */\nfunction buildNetCanMake(theme) {\n  var base = buildBase(theme);\n  var targetView = viewFor(base.cube, choice(ROTS24));\n  TARGET_CUBE_SCRATCH = base.cube;\n  var correctNetIdx = Math.floor(Math.random() * NETS.length);\n  var correctPrints = reprintCube(base.cube, choice(ROTS24), correctNetIdx);\n  if (!canProduceView(cubeModel(correctNetIdx, correctPrints), targetView)) return null; /* engine self-check */\n  var banned = {};\n  banned[printsSig(correctNetIdx, correctPrints)] = true;\n  var options = [{\n    html: netSvg(correctNetIdx, correctPrints, { width: 168 }),\n    sig: printsSig(correctNetIdx, correctPrints), isCorrect: true, note: \"\"\n  }];\n  var otherNets = shuffleC(NETS.map(function (_, i) { return i; }));\n  for (var i = 0; i < 3; i++) {\n    var inv = makeInvalidNet(targetView, otherNets[i % otherNets.length], banned);\n    if (!inv) return null;\n    options.push({\n      html: netSvg(inv.netIdx, inv.prints, { width: 168 }),\n      sig: inv.sig, isCorrect: false, note: inv.note\n    });\n  }\n  return finishQuestion({\n    typeId: \"netCanMake\",\n    prompt: \"Which net folds up to make EXACTLY this cube?\",\n    stimulusHtml: figureHtml(isoCubeSvg(targetView, { width: 168 })),\n    options: options,\n    explanation: \"Check each visible symbol on each net: its neighbours and its turn must both match. Only one net passes.\",\n    review: { netIdx: correctNetIdx, prints: correctPrints }\n  });\n}\n\n/* ---- Type 10: Which net cannot make the cube? ---- */\nfunction buildNetCannot(theme) {\n  var base = buildBase(theme);\n  var targetView = viewFor(base.cube, choice(ROTS24));\n  TARGET_CUBE_SCRATCH = base.cube;\n  var banned = {};\n  var netOrder = shuffleC(NETS.map(function (_, i) { return i; }));\n  var valids = [];\n  for (var i = 0; i < netOrder.length && valids.length < 3; i++) {\n    var prints = reprintCube(base.cube, choice(ROTS24), netOrder[i]);\n    var sig = printsSig(netOrder[i], prints);\n    if (banned[sig]) continue;\n    if (!canProduceView(cubeModel(netOrder[i], prints), targetView)) continue; /* engine self-check */\n    banned[sig] = true;\n    valids.push({ netIdx: netOrder[i], prints: prints, sig: sig });\n  }\n  if (valids.length < 3) return null;\n  var inv = makeInvalidNet(targetView, null, banned);\n  if (!inv) return null;\n  var options = valids.map(function (vv) {\n    return {\n      html: netSvg(vv.netIdx, vv.prints, { width: 168 }), sig: vv.sig, isCorrect: false,\n      note: \"this net folds into exactly the cube shown.\"\n    };\n  });\n  options.push({\n    html: netSvg(inv.netIdx, inv.prints, { width: 168 }),\n    sig: inv.sig, isCorrect: true, note: \"\"\n  });\n  return finishQuestion({\n    typeId: \"netCannot\",\n    prompt: \"Three of these nets fold into the cube shown. Which net CANNOT make it?\",\n    stimulusHtml: figureHtml(isoCubeSvg(targetView, { width: 168 })),\n    options: options,\n    explanation: \"The odd one out fails because \" + inv.note + \" The other three fold into the same cube.\",\n    review: { netIdx: inv.netIdx, prints: inv.prints }\n  });\n}\n\n/* ============================================================\n   8. QUESTION FACTORY with runtime pre-validation interceptor.\n   A question only reaches the screen after finishQuestion() has\n   proved: 4 options, exactly 1 correct, no duplicates, nothing\n   empty. Failed builds are discarded and silently re-rolled.\n   ============================================================ */\nvar BUILDERS = {\n  opposite: buildOpposite,\n  cannotTouch: buildCannotTouch,\n  canTouch: buildCanTouch,\n  whichRole: buildWhichRole,\n  missingFace: buildMissingFace,\n  hiddenFace: buildHiddenFace,\n  cubeCanMake: buildCubeCanMake,\n  cubeCannot: buildCubeCannot,\n  netCanMake: buildNetCanMake,\n  netCannot: buildNetCannot\n};\nfunction makeNetsQuestion(typeId, theme) {\n  var q = null, tries;\n  for (tries = 0; tries < 40 && !q; tries++) {\n    try { q = BUILDERS[typeId](theme); } catch (e) { q = null; }\n  }\n  if (!q) {\n    /* graceful fallback: the opposite-face builder always converges */\n    for (tries = 0; tries < 40 && !q; tries++) {\n      try { q = buildOpposite(theme); } catch (e2) { q = null; }\n    }\n  }\n  return q;\n}\nvar lastTypeId = null;\nfunction pickTypeId(selected) {\n  if (selected !== \"mixed\") return selected;\n  var pool = TYPE_META.map(function (t) { return t.id; }).filter(function (id) { return id !== lastTypeId; });\n  return choice(pool);\n}\n\n/* ============================================================\n   9. INTERACTIVE FOLD ANIMATOR\n   Real CSS-3D hinge model: each net cell is a nested node that\n   rotates 90deg about its shared edge, staggered by tree depth,\n   so students watch the printed symbols travel into position.\n   ============================================================ */\nfunction face3dSvg(print, pairIdx) {\n  var out = \"<svg viewBox='0 0 100 100' aria-hidden='true'>\";\n  out += \"<rect x='0' y='0' width='100' height='100' fill='\" + glyphFill(print.g) + \"'/>\";\n  out += glyphGroup(print.g, print.rho, print.col, print.row);\n  if (typeof pairIdx === \"number\") {\n    var pc = PAIR_COLOURS[pairIdx % 3];\n    out += \"<circle cx='81' cy='19' r='14' fill='#ffffff' stroke='\" + pc + \"' stroke-width='5'/>\";\n    out += \"<text x='81' y='20' font-size='18' font-weight='900' text-anchor='middle' dominant-baseline='central' fill='\" + pc + \"'>\" + (pairIdx + 1) + \"</text>\";\n  }\n  return out + \"</svg>\";\n}\nfunction smoother(t) {\n  t = clamp(t, 0, 1);\n  return t * t * t * (t * (t * 6 - 15) + 10);\n}\nfunction mountFoldViewer(container, netIdx, prints) {\n  if (container.dataset.foldMounted === \"true\") return;\n  container.dataset.foldMounted = \"true\";\n  var info = foldNet(netIdx);\n  var F = parseFloat(getComputedStyle(document.querySelector('.ss')||document.body).getPropertyValue(\"--cnt-face3d\")) || 54;\n  var stage = document.createElement(\"div\");\n  stage.className = \"cnt-fold-stage\";\n  stage.innerHTML =\n    \"<div class='cnt-fold-pill'>&#8635; Drag to rotate</div>\" +\n    \"<div class='cnt-fold-scene'><div class='cnt-fold-model'></div></div>\" +\n    \"<div class='cnt-fold-controls'><label>Flat</label>\" +\n    \"<input class='cnt-fold-range' type='range' min='0' max='100' value='0' aria-label='Fold the net into a cube'>\" +\n    \"<label>Cube</label></div>\";\n  container.appendChild(stage);\n  var model = stage.querySelector(\".cnt-fold-model\");\n  var range = stage.querySelector(\".cnt-fold-range\");\n  var view = { fold: 0, rotX: -28, rotY: 36, dragging: false, lastX: 0, lastY: 0 };\n  function makeNode(faceIdx) {\n    var node = document.createElement(\"div\");\n    node.className = \"cnt-node\";\n    var parent = info.parents[faceIdx];\n    if (!parent) {\n      node.classList.add(\"cnt-node-root\");\n    } else {\n      node.dataset.dx = String(parent.dx);\n      node.dataset.dy = String(parent.dy);\n      node.dataset.depth = String(parent.depth);\n      if (parent.dx === 1)  { node.style.left = F + \"px\";  node.style.top = \"0px\";   node.style.transformOrigin = \"left center\"; }\n      if (parent.dx === -1) { node.style.left = -F + \"px\"; node.style.top = \"0px\";   node.style.transformOrigin = \"right center\"; }\n      if (parent.dy === 1)  { node.style.left = \"0px\";     node.style.top = F + \"px\";  node.style.transformOrigin = \"center top\"; }\n      if (parent.dy === -1) { node.style.left = \"0px\";     node.style.top = -F + \"px\"; node.style.transformOrigin = \"center bottom\"; }\n    }\n    var face = document.createElement(\"div\");\n    face.className = \"cnt-3dface\";\n    face.innerHTML = face3dSvg(prints[faceIdx]);\n    node.appendChild(face);\n    info.children[faceIdx].forEach(function (childIdx) {\n      node.appendChild(makeNode(childIdx));\n    });\n    return node;\n  }\n  model.appendChild(makeNode(info.rootIdx));\n  function applyNodeFold(node) {\n    if (node.dataset.dx !== undefined) {\n      var dx = Number(node.dataset.dx), dy = Number(node.dataset.dy);\n      var depth = Number(node.dataset.depth || 0);\n      var delay = Math.min(0.38, depth * 0.075);\n      var t = smoother(clamp((view.fold / 100 - delay) / (1 - delay), 0, 1));\n      var tf = \"\";\n      if (dx === 1)  tf = \"rotateY(\" + (90 * t) + \"deg)\";\n      if (dx === -1) tf = \"rotateY(\" + (-90 * t) + \"deg)\";\n      if (dy === 1)  tf = \"rotateX(\" + (-90 * t) + \"deg)\";\n      if (dy === -1) tf = \"rotateX(\" + (90 * t) + \"deg)\";\n      node.style.transform = tf;\n    }\n    Array.prototype.forEach.call(node.children, function (child) {\n      if (child.classList && child.classList.contains(\"cnt-node\")) applyNodeFold(child);\n    });\n  }\n  function applyAll() {\n    model.style.transform = \"rotateX(\" + view.rotX + \"deg) rotateY(\" + view.rotY + \"deg)\";\n    var rootNode = model.querySelector(\".cnt-node-root\");\n    if (rootNode) applyNodeFold(rootNode);\n  }\n  range.addEventListener(\"input\", function () {\n    view.fold = clamp(Number(range.value), 0, 100);\n    applyAll();\n  });\n  stage.addEventListener(\"pointerdown\", function (e) {\n    if (e.target.closest(\"input, button\")) return;\n    view.dragging = true; view.lastX = e.clientX; view.lastY = e.clientY;\n    try { stage.setPointerCapture(e.pointerId); } catch (err) {}\n  });\n  stage.addEventListener(\"pointermove\", function (e) {\n    if (!view.dragging) return;\n    view.rotY += (e.clientX - view.lastX) * 0.55;\n    view.rotX -= (e.clientY - view.lastY) * 0.55;\n    view.lastX = e.clientX; view.lastY = e.clientY;\n    applyAll();\n  });\n  stage.addEventListener(\"pointerup\", function () { view.dragging = false; });\n  stage.addEventListener(\"pointercancel\", function () { view.dragging = false; });\n  applyAll();\n  /* gentle welcome animation so students see it move */\n  var start = null;\n  function intro(ts) {\n    if (start === null) start = ts;\n    var p = clamp((ts - start) / 2600, 0, 1);\n    view.fold = 100 * smoother(p);\n    range.value = String(Math.round(view.fold));\n    applyAll();\n    if (p < 1) requestAnimationFrame(intro);\n  }\n  requestAnimationFrame(intro);\n}\n\n/* ================= nets question adapter =================\n   Wraps the ported cube-nets engine as an eighth Shape Sleuth\n   question type. Sub-types are grouped by difficulty and the\n   glyph themes get simpler at Foundation, busier at Challenge. */\nvar NETS_SUBS={1:['opposite','cannotTouch','canTouch'],2:['whichRole','hiddenFace','missingFace','cubeCanMake'],3:['cubeCannot','netCanMake','netCannot']};\nvar NETS_THEMES={1:['numbers','letters','dots'],2:['shapes','arrows','dots'],3:['squares','shapes','arrows','mixed']};\nfunction genNets(diff){\n  var sub=pick(NETS_SUBS[diff]);\n  var q=makeNetsQuestion(sub,pick(NETS_THEMES[diff]));\n  if(!q)return null;\n  return {\n    type:'nets',\n    prompt:{kind:'html',html:'<div class=\"nvr-netstim\">'+q.stimulusHtml+'</div>'},\n    options:q.options,\n    correct:q.correctIdx,\n    htmlOptions:true,\n    hint:q.prompt,\n    explain:String(q.explanation||'').replace(/\\n/g,'<br>'),\n    review:q.review,\n    ruleKey:sub\n  };\n}\n\n/* ================= validation ================= */\nfunction validateQ(q){\n  if(!q||!q.options)return false;\n  if(q.htmlOptions){\n    /* nets questions: four options, already engine-proven; re-check the\n       basics so a bad build can still never reach the screen */\n    if(q.options.length!==4)return false;\n    if(q.correct<0||q.correct>3)return false;\n    var sh={},ih,sg;\n    for(ih=0;ih<4;ih++){\n      if(!q.options[ih]||!q.options[ih].html)return false;\n      sg=q.options[ih].sig||q.options[ih].html;\n      if(sh[sg])return false;\n      sh[sg]=true;\n    }\n    return true;\n  }\n  if(q.options.length!==5)return false;\n  if(q.correct<0||q.correct>4)return false;\n  if(q.rawSvg){\n    var sr={},ir;\n    for(ir=0;ir<5;ir++){\n      if(sr[q.options[ir]])return false;\n      sr[q.options[ir]]=true;\n    }\n    return true;\n  }\n  if(q.textOptions){\n    var s0={},i0;\n    for(i0=0;i0<5;i0++){\n      if(s0[q.options[i0]])return false;\n      s0[q.options[i0]]=true;\n    }\n    return true;\n  }\n  var sers=q.options.map(ser);\n  if(q.type==='odd'){\n    /* the four keepers may match each other, but the odd one must be\n       unique or the question has no single answer */\n    var c=sers[q.correct],n=0;\n    for(var j=0;j<5;j++)if(sers[j]===c)n++;\n    return n===1;\n  }\n  var seen={};\n  for(var k=0;k<5;k++){\n    if(seen[sers[k]])return false;\n    seen[sers[k]]=true;\n  }\n  return true;\n}\nfunction makeQuestion(type,diff){\n  var gen=TYPES[type].gen;\n  for(var a=0;a<40;a++){\n    var q=null;\n    try{q=gen(diff);}catch(e){q=null;}\n    if(q&&validateQ(q))return q;\n  }\n  /* forty failures in a row is effectively impossible; fall back to the\n     most reliable generator so the session never stalls */\n  for(var b=0;b<40;b++){\n    var q2=genMatrix(diff);\n    if(q2&&validateQ(q2))return q2;\n  }\n  return null;\n}\n\n/* ================= type registry ================= */\nvar TYPES={\n  odd:{name:'ODD ONE OUT',hint:'Four of these shapes share something. Find the one that does not belong.',gen:genOdd,time:30000},\n  mostlike:{name:'MOST LIKE',hint:'The two shapes in the box share one hidden thing. Pick the answer that is most like them.',gen:genMostLike,time:32000},\n  like:{name:'COMPLETE THE SET',hint:'The shapes on top all follow the same hidden rule. Pick the option that follows it too.',gen:genLike,time:35000},\n  hidden:{name:'HIDDEN SHAPES',hint:'One picture hides an exact copy of this shape. Find it.',gen:genHidden,time:35000},\n  series:{name:'SEQUENCES',hint:'The pattern changes step by step. Find the shape that belongs in the empty box.',gen:genSeries,time:40000},\n  analogy:{name:'ANALOGIES',hint:'The first two shapes are linked. Complete the second pair in the same way.',gen:genAnalogy,time:40000},\n  matrix:{name:'MATRICES',hint:'The grid follows a pattern across rows and columns. Work out what belongs in the empty square.',gen:genMatrix,time:45000},\n  codes:{name:'CODES',hint:'Work out what each letter stands for, then find the code for the test shape.',gen:genCodes,time:55000},\n  nets:{name:'3D + NETS',hint:'Fold the net in your head, then answer the question about the cube.',gen:genNets,time:45000}\n};\nvar ORDER=['odd','mostlike','like','hidden','series','analogy','matrix','codes','nets'];\n/* one short attack-method tip per type, shown once per session the\n   first time the type comes up; deliberately two sentences or less */\nvar STRATS={\n  odd:'Check one thing at a time. Shape, shading, size, count, turn. Four will match and one will not.',\n  mostlike:'Only two shapes to go on, so list everything they share: shape, shading, size, count, outline. The rule is the one thing on that list that an answer can match.',\n  like:'Work out what ALL the example shapes share. Then test each answer against that one rule.',\n  hidden:'Trace the outline of the target shape with your eyes. It must be exactly the same size, so check size first.',\n  series:'Say what changes from box to box. A turn? An extra dot? New shading? Check one change at a time.',\n  analogy:'Say the change out loud, like \"it turned and went black\". Then do exactly the same to the third shape.',\n  matrix:'Read across the row, then down the column. The answer must fit both patterns at once.',\n  codes:'Take one letter position at a time. Find two shapes that share a letter and spot what else they share.',\n  nets:'Faces one square apart in a straight line end up opposite each other. Opposite faces can never touch.'\n};\n\n\nreturn { SYM: SYM, SIDES: SIDES, SHAPES: SHAPES, MORPH: MORPH, FILLPOOL: FILLPOOL, baseSpec: baseSpec, TYPES: TYPES, ORDER: ORDER, STRATS: STRATS, makeQuestion: makeQuestion, validateQ: validateQ, ser: ser, cellSVG: cellSVG, mountFoldViewer: mountFoldViewer };\n})();\n\n/* ===== HIDDEN SHAPES v2: the generator rebuilt from real papers (2026-09-15) =====\n   Appended to the engine asset by extract_engine.py, replaces TYPES.hidden.gen.\n\n   Modelled on two references: CGP 11+ GL 10-Minute Tests (framed figures: an outer shape divided by lines, the\n   target hidden as parts of longer lines, every option equally busy) and 11plusforparents figure recognition\n   (tidy compositions of a few whole shapes, the five options one family). Three construction types:\n     framed       an outer frame (square, diamond, triangle, trapezium, pentagon, hexagon, parallelogram, rectangle)\n                  with the target's sides run on to the frame as chords, plus a few more chords and spokes\n     grid         a rectangle frame with horizontal and vertical lines; the target is an orthogonal shape whose\n                  sides lie on those lines (CGP question 14 d, 11plusforparents row 2)\n     composition  the target plus one or two whole shapes laid over it, no frame (11plusforparents rows 1, 3, 4)\n     twin         the target and a slightly bigger or smaller copy of itself, offset, with connectors between matching\n                  corners (11plusforparents row 1 c, GPT's nested or twin outlines)\n   Types come from a shuffled ten-question bag per level (GPT round 1, hidden-v2/gpt/round1-report.md), targets are\n   the irregular ones real papers use, and the readability numbers are GPT's. Every answer picture is proved to hold exactly one copy of the target and every decoy none, by the exact-copy\n   checker (a copy = every side covered by drawn lines, every corner on a line end or a crossing). */\n(function(E){\n'use strict';\nif (!E) return;\nvar INK = '#1A2347';\nvar EPS = 0.7;\nvar STROKE = 2.6;\n\n/* ---------- small helpers ---------- */\nfunction ri(n){ return Math.floor(Math.random() * n); }\nfunction rnd(a, b){ return a + ri(b - a + 1); }\nfunction pick(a){ return a[ri(a.length)]; }\nfunction fx(n){ return String(Math.round(n * 100) / 100); }\nfunction snap(n){ return Math.round(n * 2) / 2; }\nfunction merge(a, b){ var o = {}, k; for (k in a) o[k] = a[k]; for (k in b) o[k] = b[k]; return o; }\nfunction shuffled(a){ a = a.slice(); for (var i = a.length - 1; i > 0; i--){ var j = ri(i + 1), t = a[i]; a[i] = a[j]; a[j] = t; } return a; }\nfunction len(g){ return Math.hypot(g[2] - g[0], g[3] - g[1]); }\nfunction dist(a, b){ return Math.hypot(a[0] - b[0], a[1] - b[1]); }\nfunction centreOf(v){ var x = 0, y = 0; v.forEach(function(p){ x += p[0]; y += p[1]; }); return [x / v.length, y / v.length]; }\nfunction bboxV(v){\n  var xs = v.map(function(p){ return p[0]; }), ys = v.map(function(p){ return p[1]; });\n  var x0 = Math.min.apply(null, xs), x1 = Math.max.apply(null, xs), y0 = Math.min.apply(null, ys), y1 = Math.max.apply(null, ys);\n  return { x0: x0, x1: x1, y0: y0, y1: y1, w: x1 - x0, h: y1 - y0 };\n}\nfunction bboxS(segs){\n  var v = [];\n  segs.forEach(function(g){ v.push([g[0], g[1]], [g[2], g[3]]); });\n  return bboxV(v);\n}\nfunction polySegs(v){ var s = []; for (var i = 0; i < v.length; i++){ var a = v[i], b = v[(i + 1) % v.length]; s.push([a[0], a[1], b[0], b[1]]); } return s; }\nfunction xformV(pts, rot, flip, cx, cy, scale){\n  var a = (rot * Math.PI) / 180, ca = Math.cos(a), sa = Math.sin(a), k = scale || 1;\n  return pts.map(function(p){ var x = (flip ? -p[0] : p[0]) * k, y = p[1] * k; return [cx + x * ca - y * sa, cy + x * sa + y * ca]; });\n}\n/* ---------- geometry ---------- */\nfunction pointOnSeg(px, py, g, eps){\n  var vx = g[2] - g[0], vy = g[3] - g[1], L2 = vx * vx + vy * vy;\n  if (L2 < 1e-9) return false;\n  var t = ((px - g[0]) * vx + (py - g[1]) * vy) / L2;\n  if (t < -eps / Math.sqrt(L2) || t > 1 + eps / Math.sqrt(L2)) return false;\n  t = Math.max(0, Math.min(1, t));\n  return Math.hypot(px - (g[0] + vx * t), py - (g[1] + vy * t)) <= eps;\n}\nfunction crossing(a, b){\n  var r1 = a[2] - a[0], r2 = a[3] - a[1], s1 = b[2] - b[0], s2 = b[3] - b[1], den = r1 * s2 - r2 * s1;\n  if (Math.abs(den) < 1e-9) return null;\n  var t = ((b[0] - a[0]) * s2 - (b[1] - a[1]) * s1) / den, u = ((b[0] - a[0]) * r2 - (b[1] - a[1]) * r1) / den;\n  return (t >= -0.001 && t <= 1.001 && u >= -0.001 && u <= 1.001) ? [t, u] : null;\n}\n/* every endpoint, and every place two lines cross */\nfunction nodesOf(segs){\n  var pts = [], seen = {};\n  var add = function(x, y){ var k = Math.round(x * 4) + ',' + Math.round(y * 4); if (seen[k]) return; seen[k] = true; pts.push([x, y]); };\n  segs.forEach(function(g){ add(g[0], g[1]); add(g[2], g[3]); });\n  for (var i = 0; i < segs.length; i++) for (var j = i + 1; j < segs.length; j++){\n    var x = crossing(segs[i], segs[j]);\n    if (x) add(segs[i][0] + (segs[i][2] - segs[i][0]) * x[0], segs[i][1] + (segs[i][3] - segs[i][1]) * x[0]);\n  }\n  return pts;\n}\nfunction turnsOntoItself(v, deg){\n  var c = centreOf(v), rad = 0;\n  v.forEach(function(q){ rad = Math.max(rad, dist(q, c)); });\n  var tol = Math.max(0.35, rad * 0.02), a = (deg * Math.PI) / 180, co = Math.cos(a), si = Math.sin(a);\n  return v.every(function(q){\n    var x = c[0] + (q[0] - c[0]) * co - (q[1] - c[1]) * si, y = c[1] + (q[0] - c[0]) * si + (q[1] - c[1]) * co;\n    return v.some(function(w){ return Math.hypot(w[0] - x, w[1] - y) < tol; });\n  });\n}\nfunction rotOrder(v){ for (var k = 12; k > 1; k--) if (turnsOntoItself(v, 360 / k)) return k; return 1; }\nfunction symTurns(v){ var k = rotOrder(v), out = []; for (var i = 0; i < k; i++) out.push((360 / k) * i); return out; }\n/* how many exact copies of shape (vertex list, any position) the segments contain; allowRot lets it be turned */\nfunction copiesIn(segs, shape, allowRot, eps){\n  var E0 = EPS; if (eps != null) EPS = eps;\n  try { return copiesIn0(segs, shape, allowRot); } finally { EPS = E0; }\n}\nfunction copiesIn0(segs, shape, allowRot){\n  var nodes = nodesOf(segs), n = shape.length;\n  var e0 = dist(shape[0], shape[1]);\n  var sym = allowRot ? null : symTurns(shape);\n  var covered = function(a, b){\n    for (var k = 0; k < segs.length; k++) if (pointOnSeg(a[0], a[1], segs[k], EPS) && pointOnSeg(b[0], b[1], segs[k], EPS)) return true;\n    return unionCovered(segs, a, b);\n  };\n  var hits = [];\n  for (var i = 0; i < nodes.length; i++) for (var j = 0; j < nodes.length; j++){\n    if (i === j) continue;\n    var A = nodes[i], B = nodes[j], d = dist(A, B);\n    if (Math.abs(d - e0) > EPS) continue;\n    var ang = Math.atan2(B[1] - A[1], B[0] - A[0]) - Math.atan2(shape[1][1] - shape[0][1], shape[1][0] - shape[0][0]);\n    if (sym){\n      var deg = ((ang * 180) / Math.PI % 360 + 360) % 360;\n      if (!sym.some(function(t){ var dd = Math.abs(deg - t); return Math.min(dd, 360 - dd) < 3; })) continue;\n    }\n    var c = Math.cos(ang), s = Math.sin(ang);\n    var put = shape.map(function(q){ var dx = q[0] - shape[0][0], dy = q[1] - shape[0][1]; return [A[0] + dx * c - dy * s, A[1] + dx * s + dy * c]; });\n    var ok = true;\n    for (var k2 = 0; k2 < n && ok; k2++) if (!covered(put[k2], put[(k2 + 1) % n])) ok = false;\n    if (!ok) continue;\n    var m = centreOf(put);\n    if (!hits.some(function(h){ return dist(h, m) < 1.2; })) hits.push(m);\n  }\n  return hits.length;\n}\n/* every point along a-b (1 unit steps) lies within EPS of some drawn line: two lines meeting end to end, or a line\n   bridging a gap, still draw the side for the eye */\nfunction unionCovered(segs, a, b){\n  var L = dist(a, b), n = Math.max(2, Math.ceil(L));\n  /* only lines lying along a-b can cover any of it: both ends of the side within EPS of the line's line */\n  var ux = (b[0] - a[0]) / L, uy = (b[1] - a[1]) / L, along = [];\n  for (var k0 = 0; k0 < segs.length; k0++){\n    var g = segs[k0], lg = len(g);\n    if (lg < 1e-6) continue;\n    var vx = (g[2] - g[0]) / lg, vy = (g[3] - g[1]) / lg;\n    if (Math.abs(ux * vy - uy * vx) > 0.08) continue;\n    if (Math.abs((a[0] - g[0]) * vy - (a[1] - g[1]) * vx) > EPS || Math.abs((b[0] - g[0]) * vy - (b[1] - g[1]) * vx) > EPS) continue;\n    along.push(g);\n  }\n  if (!along.length) return false;\n  for (var i = 0; i <= n; i++){\n    var t = i / n, px = a[0] + (b[0] - a[0]) * t, py = a[1] + (b[1] - a[1]) * t, hit = false;\n    for (var k = 0; k < along.length && !hit; k++) if (pointOnSeg(px, py, along[k], EPS)) hit = true;\n    if (!hit) return false;\n  }\n  return true;\n}\n/* the longest stretch of a-b (0.5 unit steps) with no line under it, in units */\nfunction longestGap(segs, a, b){\n  var L = dist(a, b), n = Math.max(2, Math.ceil(L * 2)), run = 0, best = 0;\n  for (var i = 0; i <= n; i++){\n    var t = i / n, px = a[0] + (b[0] - a[0]) * t, py = a[1] + (b[1] - a[1]) * t, hit = false;\n    for (var k = 0; k < segs.length && !hit; k++) if (pointOnSeg(px, py, segs[k], 1.0)) hit = true;\n    run = hit ? 0 : run + 1;\n    best = Math.max(best, run);\n  }\n  return best / 2;\n}\nfunction isChiralV(v){\n  var m = xformV(v, 0, true, 0, 0);\n  for (var deg = 0; deg < 360; deg += 1){\n    var t = xformV(m, deg, false, 0, 0);\n    if (t.every(function(p){ return v.some(function(q){ return dist(p, q) < 0.6; }); })) return false;\n  }\n  return true;\n}\nfunction pointInPoly(p, poly){\n  var inside = false;\n  for (var i = 0, j = poly.length - 1; i < poly.length; j = i++){\n    var xi = poly[i][0], yi = poly[i][1], xj = poly[j][0], yj = poly[j][1];\n    if ((yi > p[1]) !== (yj > p[1]) && p[0] < ((xj - xi) * (p[1] - yi)) / (yj - yi) + xi) inside = !inside;\n  }\n  return inside;\n}\nfunction distToSeg(p, g){\n  var vx = g[2] - g[0], vy = g[3] - g[1], L2 = vx * vx + vy * vy;\n  var t = L2 < 1e-9 ? 0 : Math.max(0, Math.min(1, ((p[0] - g[0]) * vx + (p[1] - g[1]) * vy) / L2));\n  return Math.hypot(p[0] - (g[0] + vx * t), p[1] - (g[1] + vy * t));\n}\nfunction distToPoly(p, poly){ var d = 1e9; polySegs(poly).forEach(function(g){ d = Math.min(d, distToSeg(p, g)); }); return d; }\n/* where the infinite line through a,b leaves a convex polygon: [tmin, tmax] in the line's parameter (a=0, b=1) */\nfunction lineThroughPoly(a, b, poly){\n  var ts = [];\n  polySegs(poly).forEach(function(e){\n    var r1 = b[0] - a[0], r2 = b[1] - a[1], s1 = e[2] - e[0], s2 = e[3] - e[1], den = r1 * s2 - r2 * s1;\n    if (Math.abs(den) < 1e-9) return;\n    var t = ((e[0] - a[0]) * s2 - (e[1] - a[1]) * s1) / den, u = ((e[0] - a[0]) * r2 - (e[1] - a[1]) * r1) / den;\n    if (u >= -0.0005 && u <= 1.0005) ts.push(t);\n  });\n  if (ts.length < 2) return null;\n  return [Math.min.apply(null, ts), Math.max.apply(null, ts)];\n}\nfunction pt(a, b, t){ return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t]; }\n\n/* ---------- catalogues ---------- */\n/* Targets in unit-ish boxes. Irregular ones matter: real papers hide scalene triangles, parallelograms, odd\n   quadrilaterals and L shapes. Every interior angle is at least 28 degrees so extended sides cross readably.\n   orth: sides are all horizontal or vertical (grid type). name: how the answer line names it. */\nvar TARGETS = {\n  /* level 1 */\n  scalene:    { v: [[0, 0.24], [1, 0], [0.58, 1]], name: 'triangle' },\n  rtriangle:  { v: [[0, 0], [0, 1], [0.8, 1]], name: 'right-angled triangle' },\n  trapezium:  { v: [[0.14, 0], [0.76, 0], [1, 1], [0, 1]], name: 'trapezium' },\n  parallelogram: { v: [[0.18, 0], [1, 0], [0.82, 1], [0, 1]], name: 'parallelogram' },\n  pointed:    { v: [[0.47, 0], [1, 0.38], [0.65, 1], [0, 0.58]], name: 'four-sided shape' },\n  quad:       { v: [[0, 0.18], [0.72, 0], [1, 0.76], [0.2, 1]], name: 'four-sided shape' },\n  rect:       { v: [[0, 0], [1, 0], [1, 0.62], [0, 0.62]], name: 'rectangle', orth: true },\n  /* level 2 */\n  triangle2:  { v: [[0, 0.18], [1, 0], [0.31, 1]], name: 'triangle' },\n  sloping:    { v: [[0.12, 0], [0.88, 0.12], [1, 1], [0.24, 0.88]], name: 'four-sided shape' },\n  quad2:      { v: [[0, 0.08], [1, 0.28], [0.83, 1], [0.17, 0.8]], name: 'four-sided shape' },\n  lshape:     { v: [[0, 0], [0.38, 0], [0.38, 0.62], [1, 0.62], [1, 1], [0, 1]], name: 'L shape', orth: true },\n  pentagon:   { v: [[0.22, 0], [0.78, 0.1], [1, 0.55], [0.69, 1], [0, 0.84]], name: 'pentagon' },\n  house:      { v: [[0.5, 0], [1, 0.38], [1, 1], [0, 1], [0, 0.38]], name: 'house shape' },\n  arrowhead:  { v: [[0, 0], [0.66, 0], [1, 0.5], [0.66, 1], [0, 1]], name: 'arrow shape' },\n  tshape:     { v: [[0, 0], [1, 0], [1, 0.38], [0.68, 0.38], [0.68, 1], [0.32, 1], [0.32, 0.38], [0, 0.38]], name: 'T shape', orth: true },\n  step:       { v: [[0, 0], [0.5, 0], [0.5, 0.5], [1, 0.5], [1, 1], [0, 1]], name: 'step shape', orth: true },\n  /* level 3 */\n  pentagon3:  { v: [[0.28, 0], [0.8, 0.18], [1, 0.7], [0.52, 1], [0, 0.62]], name: 'pentagon' },\n  arrow:      { v: [[0.3, 0], [1, 0.5], [0.3, 1], [0.45, 0.68], [0, 0.68], [0, 0.32], [0.45, 0.32]], name: 'arrow' },\n  lshape3:    { v: [[0, 0], [0.36, 0], [0.36, 0.66], [1, 0.66], [1, 1], [0, 1]], name: 'L shape', orth: true },\n  chevron:    { v: [[0, 0.12], [0.5, 0], [1, 0.12], [0.68, 0.5], [1, 0.88], [0.5, 1], [0, 0.88], [0.32, 0.5]], name: 'chevron' },\n  cross:      { v: [[0.34, 0], [0.66, 0], [0.66, 0.34], [1, 0.34], [1, 0.66], [0.66, 0.66], [0.66, 1], [0.34, 1], [0.34, 0.66], [0, 0.66], [0, 0.34], [0.34, 0.34]], name: 'cross', orth: true }\n};\n/* frames sit inside the 0..100 box with an 8 unit margin */\nvar FRAMES = {\n  square:   [[13, 13], [87, 13], [87, 87], [13, 87]],\n  rect:     [[8, 20], [92, 20], [92, 80], [8, 80]],\n  tallrect: [[20, 8], [80, 8], [80, 92], [20, 92]],\n  diamond:  [[50, 8], [92, 50], [50, 92], [8, 50]],\n  triangle: [[50, 8], [92, 90], [8, 90]],\n  vtriangle: [[8, 10], [92, 10], [50, 92]],\n  trapezium: [[26, 12], [74, 12], [92, 88], [8, 88]],\n  pentagon: [[50, 8], [92, 39], [77, 92], [23, 92], [8, 39]],\n  hexagon:  [[29, 10], [71, 10], [92, 50], [71, 90], [29, 90], [8, 50]],\n  parallelogram: [[23, 14], [92, 14], [77, 86], [8, 86]]\n};\nfunction polyArea(v){ var a = 0; for (var i = 0; i < v.length; i++){ var p = v[i], q = v[(i + 1) % v.length]; a += p[0] * q[1] - q[0] * p[1]; } return Math.abs(a) / 2; }\nvar AREA = {};\nfor (var fk in FRAMES) AREA[fk] = polyArea(FRAMES[fk]);\nvar ROOMY = ['square', 'rect', 'tallrect', 'diamond', 'hexagon', 'pentagon', 'parallelogram'];\nvar FRAME_NAMES = ['square', 'rect', 'tallrect', 'diamond', 'triangle', 'vtriangle', 'trapezium', 'pentagon', 'hexagon', 'parallelogram'];\n/* overlay shapes for compositions: whole simple outlines laid over the target */\nvar OVERLAYS = ['scalene', 'rtriangle', 'rect', 'parallelogram', 'trapezium', 'pointed', 'triangle2'];\n\n/* the level ladder */\n/* bag entries: type, whether a target corner touches the frame, whether the mirror decoy is used (GPT round 2:\n   touches scheduled 0/2/3 of 10, mirror at most a few per bag). sameFrame: how often all five pictures share one\n   frame (a ruler for size); the CGP reference varies frames per option, so it falls as the levels rise. */\nfunction bagOf(list){ return list.map(function(e){ var b = e.split('+'); return { t: b[0], touch: b.indexOf('touch') > 0, mirror: b.indexOf('mirror') > 0 }; }); }\nvar LEVELS = {\n  1: { targets: ['scalene', 'rtriangle', 'trapezium', 'parallelogram', 'pointed', 'quad', 'rect', 'lshape'],\n       bag: bagOf(['composition', 'composition', 'composition', 'composition', 'framed', 'framed', 'framed', 'twin', 'twin', 'grid']),\n       rot: false, extras: [1, 2], ext: 0.35, sameFrame: 0.7, minLines: 8, compLines: 10, maxLines: 10, small: 0.82, big: 1.22, nudge: 6, decoys: ['small', 'big', 'turn', 'nudge'] },\n  2: { targets: ['triangle2', 'sloping', 'quad2', 'lshape', 'pentagon', 'house', 'arrowhead', 'tshape', 'step', 'trapezium', 'parallelogram', 'rtriangle'],\n       bag: bagOf(['composition', 'composition+mirror', 'framed', 'framed+touch', 'framed+mirror', 'grid', 'grid', 'grid+mirror', 'extended', 'extended+touch']),\n       rot: false, extras: [2, 3], ext: 0.6, sameFrame: 0.5, minLines: 9, compLines: 12, maxLines: 13, small: 0.84, big: 1.16, nudge: 7, decoys: ['small', 'big', 'turn', 'mirrorOrNudge'] },\n  3: { targets: ['pentagon3', 'arrow', 'lshape3', 'chevron', 'step', 'tshape', 'quad2', 'sloping', 'pentagon', 'arrowhead', 'triangle2'],\n       bag: bagOf(['framed', 'framed', 'framed+touch', 'grid', 'grid', 'grid+mirror', 'extended+touch', 'extended+touch+mirror', 'twin', 'twin']),\n       rot: true, extras: [3, 4], ext: 0.75, sameFrame: 0.3, minLines: 11, compLines: 14, maxLines: 15, small: 0.84, big: 1.16, nudge: 8, decoys: ['small', 'big', 'mirrorOrNudge', 'broken'] }\n};\n/* the shuffled ten-question bag per level: one type is taken per question made */\nvar BAGS = { 1: [], 2: [], 3: [] };\nfunction peekEntry(diff){ if (!BAGS[diff].length) BAGS[diff] = shuffled(LEVELS[diff].bag); return BAGS[diff][BAGS[diff].length - 1]; }\nfunction takeEntry(diff){ BAGS[diff].pop(); }\nvar WHY = {}, FWHY = {};\nfunction why(k){ WHY[k] = (WHY[k] || 0) + 1; }\nfunction fwhy(k){ FWHY[k] = (FWHY[k] || 0) + 1; return false; }\n\n/* ---------- target sizing and placement ---------- */\n/* the target's longer side of its box is SIZE units: 130 px cards make that 57 px, 95 px phone cards 42 px */\nvar SIZE = 38;\nfunction targetVerts(key, k){\n  var t = TARGETS[key], bb = bboxV(t.v), s = SIZE / Math.max(bb.w, bb.h), c = [(bb.x0 + bb.x1) / 2, (bb.y0 + bb.y1) / 2];\n  if (Math.min(bb.w, bb.h) * s < 24) s = 24 / Math.min(bb.w, bb.h);\n  s *= (k || 1);\n  return t.v.map(function(p){ return [(p[0] - c[0]) * s, (p[1] - c[1]) * s]; });\n}\n/* one corner moved 5 to 7 units, every side still at least 8 and the shape still simple */\nfunction nudged(v, d0){\n  for (var t = 0; t < 20; t++){\n    var k = ri(v.length), ang = Math.random() * Math.PI * 2, d = (d0 || 6) + Math.random() * 1.5;\n    var w = v.map(function(p, i){ return i === k ? [p[0] + Math.cos(ang) * d, p[1] + Math.sin(ang) * d] : p; });\n    var ok = w.every(function(p, i){ return dist(p, w[(i + 1) % w.length]) >= 8; });\n    if (ok && simplePoly(w)) return w;\n  }\n  return null;\n}\nfunction simplePoly(v){\n  var s = polySegs(v);\n  for (var i = 0; i < s.length; i++) for (var j = i + 2; j < s.length; j++){\n    if (i === 0 && j === s.length - 1) continue;\n    var x = crossing(s[i], s[j]);\n    if (x && x[0] > 0.01 && x[0] < 0.99 && x[1] > 0.01 && x[1] < 0.99) return false;\n  }\n  return true;\n}\n/* a turn a child can see: clear of every turn the shape repeats on */\nfunction visibleTurn(v, from, to){\n  var sym = symTurns(v), span = 360 / sym.length, out = [];\n  for (var d = from; d <= to; d += 5){ var m = d % span; if (m >= 18 && span - m >= 18) out.push(d); }\n  return out.length ? pick(out) : null;\n}\nfunction interiorAngles(v){\n  var out = [];\n  for (var i = 0; i < v.length; i++){\n    var a = v[(i + v.length - 1) % v.length], b = v[i], c = v[(i + 1) % v.length];\n    var a1 = Math.atan2(a[1] - b[1], a[0] - b[0]), a2 = Math.atan2(c[1] - b[1], c[0] - b[0]);\n    var d = Math.abs(a1 - a2) * 180 / Math.PI; if (d > 180) d = 360 - d;\n    out.push(d);\n  }\n  return out;\n}\n\n/* ---------- readability ---------- */\n/* can segment g join the picture without making it hard to read?\n   near-parallel lines closer than GAP over any shared stretch, crossings under ANG degrees, nodes closer than NODE\n   (but not the same node) and lines under MINLEN are all refused. Target sides (isSide) may meet each other at\n   their own angles, down to 26 degrees. */\nvar GAP = 7, GAP_GRID = 9, ANG = 28, ANG_SIDE = 28, NODE = 4.5, MINLEN = 10;\nvar gapNow = GAP;\nfunction segSegDist(a, b){\n  if (crossing(a, b)) return 0;\n  return Math.min(distToSeg([a[0], a[1]], b), distToSeg([a[2], a[3]], b), distToSeg([b[0], b[1]], a), distToSeg([b[2], b[3]], a));\n}\nfunction fits(segs, g, isSide){\n  var lg = len(g);\n  if (lg < (isSide ? 7 : MINLEN)) return fwhy('len');\n  if (g[0] < 3 || g[0] > 97 || g[2] < 3 || g[2] > 97 || g[1] < 3 || g[1] > 97 || g[3] < 3 || g[3] > 97) return fwhy('box');\n  var ux = (g[2] - g[0]) / lg, uy = (g[3] - g[1]) / lg;\n  for (var i = 0; i < segs.length; i++){\n    var a = segs[i].g, la = len(a);\n    var vx = (a[2] - a[0]) / la, vy = (a[3] - a[1]) / la, sin = Math.abs(ux * vy - uy * vx);\n    if (sin < Math.sin(12 * Math.PI / 180)){\n      var d0 = Math.abs((a[0] - g[0]) * uy - (a[1] - g[1]) * ux), d1 = Math.abs((a[2] - g[0]) * uy - (a[3] - g[1]) * ux);\n      var t1 = (a[0] - g[0]) * ux + (a[1] - g[1]) * uy, t2 = (a[2] - g[0]) * ux + (a[3] - g[1]) * uy;\n      var over = Math.min(lg, Math.max(t1, t2)) - Math.max(0, Math.min(t1, t2));\n      if (Math.min(d0, d1) < gapNow && over > -1.5){\n        /* collinear is fine: mergeSegs draws it as one longer line, which is the hiding trick itself */\n        if (Math.max(d0, d1) >= 0.35) return fwhy(isSide ? 'gap-side' : 'gap');\n      }\n      continue;\n    }\n    var x = crossing(g, a);\n    if (x && x[0] > 0.02 && x[0] < 0.98 && x[1] > 0.02 && x[1] < 0.98){\n      var minA = (isSide && segs[i].side) ? ANG_SIDE : ANG;\n      if (sin < Math.sin(minA * Math.PI / 180)) return fwhy(isSide ? 'ang-side' : 'ang');\n    }\n    /* a line that stops just short of another, or runs past a corner without touching it, reads as a slip */\n    var sd = segSegDist(g, a);\n    if (sd > 0.5 && sd < gapNow * 0.7) return fwhy(isSide ? ('near-side' + (segs[i].frame ? '-frame' : '')) : 'near');\n  }\n  /* node spacing: only the nodes the new line adds (its ends and its crossings) need checking, against the\n     picture's existing nodes (cached per picture) and each other */\n  var have = cachedNodes(segs), fresh = [[g[0], g[1]], [g[2], g[3]]];\n  for (var i2 = 0; i2 < segs.length; i2++){\n    var x2 = crossing(g, segs[i2].g);\n    if (x2) fresh.push([g[0] + (g[2] - g[0]) * x2[0], g[1] + (g[3] - g[1]) * x2[0]]);\n  }\n  for (var p = 0; p < fresh.length; p++){\n    for (var q = 0; q < have.length; q++){ var dd = dist(fresh[p], have[q]); if (dd > 0.3 && dd < NODE) return fwhy(isSide ? 'node-side' : 'node'); }\n    for (var q2 = p + 1; q2 < fresh.length; q2++){ var d2 = dist(fresh[p], fresh[q2]); if (d2 > 0.3 && d2 < NODE) return fwhy(isSide ? 'node-side' : 'node'); }\n  }\n  return true;\n}\n/* the nodes of a picture under construction, recomputed only when a line was added */\nfunction cachedNodes(segs){\n  if (segs._nodes && segs._n === segs.length) return segs._nodes;\n  segs._nodes = nodesOf(segs.map(function(s){ return s.g; }));\n  segs._n = segs.length;\n  return segs._nodes;\n}\nfunction tryAdd(segs, make, tries, tag){\n  for (var t = 0; t < (tries || 14); t++){\n    var gs = make();\n    if (!gs) continue;\n    var trial = segs.slice(), ok = true;\n    for (var k = 0; k < gs.length && ok; k++){ if (fits(trial, gs[k], false)) trial.push({ g: gs[k], tag: tag }); else ok = false; }\n    if (ok){ Array.prototype.push.apply(segs, trial.slice(segs.length)); return true; }\n  }\n  return false;\n}\n/* merge collinear overlapping or touching segments so a line is drawn once */\nfunction mergeSegs(segs){\n  var out = segs.map(function(g){ return g.slice(); }), changed = true;\n  while (changed){\n    changed = false;\n    for (var i = 0; i < out.length && !changed; i++) for (var j = i + 1; j < out.length && !changed; j++){\n      var a = out[i], b = out[j], la = len(a), ux = (a[2] - a[0]) / la, uy = (a[3] - a[1]) / la;\n      var lb = len(b), vx = (b[2] - b[0]) / lb, vy = (b[3] - b[1]) / lb;\n      if (Math.abs(ux * vy - uy * vx) > 0.01) continue;\n      var d0 = Math.abs((b[0] - a[0]) * uy - (b[1] - a[1]) * ux), d1 = Math.abs((b[2] - a[0]) * uy - (b[3] - a[1]) * ux);\n      if (d0 > 0.3 || d1 > 0.3) continue;\n      var t1 = (b[0] - a[0]) * ux + (b[1] - a[1]) * uy, t2 = (b[2] - a[0]) * ux + (b[3] - a[1]) * uy;\n      var lo = Math.min(t1, t2), hi = Math.max(t1, t2);\n      if (hi < -0.3 || lo > la + 0.3) continue;\n      var nlo = Math.min(0, lo), nhi = Math.max(la, hi);\n      out[i] = [a[0] + ux * nlo, a[1] + uy * nlo, a[0] + ux * nhi, a[1] + uy * nhi].concat(a[4] || b[4] ? [a[4] || b[4]] : []);\n      out.splice(j, 1);\n      changed = true;\n    }\n  }\n  return out;\n}\n\n/* ---------- placement inside a frame ---------- */\n/* place v (centred on 0,0) inside frame with every corner at least m from the frame; touch: one corner exactly on\n   the frame (a real paper trick: the target shares the frame's edge) */\nfunction placeIn(v, frame, m, touch, rot){\n  for (var t = 0; t < 90; t++){\n    var w = xformV(v, rot || 0, false, snap(22 + Math.random() * 56), snap(22 + Math.random() * 56));\n    if (!w.every(function(p){ return pointInPoly(p, frame) && distToPoly(p, frame) >= m; })) continue;\n    if (touch){\n      /* slide towards a random frame edge until one corner meets it */\n      var e = pick(polySegs(frame)), ex = e[2] - e[0], ey = e[3] - e[1], el = Math.hypot(ex, ey), nx = ey / el, ny = -ex / el;\n      /* outward normal: the side of the edge away from the frame centre */\n      var fc = centreOf(frame);\n      if ((fc[0] - e[0]) * nx + (fc[1] - e[1]) * ny > 0){ nx = -nx; ny = -ny; }\n      var best = 1e9;\n      w.forEach(function(p){ best = Math.min(best, (e[0] - p[0]) * nx + (e[1] - p[1]) * ny); });\n      if (best < 0 || best > 40) continue;\n      w = w.map(function(p){ return [p[0] + nx * best, p[1] + ny * best]; });\n      /* the checker's tolerance covers the frame edge; corners are left exact */\n      /* the touching corner must land on the edge itself, well inside its ends */\n      var touching = w.filter(function(p){ return distToSeg(p, e) < 0.3; });\n      if (!touching.length) continue;\n      var tp = touching[0], te = ((tp[0] - e[0]) * ex + (tp[1] - e[1]) * ey) / (el * el);\n      if (te < 0.15 || te > 0.85) continue;\n      var ti = w.indexOf(tp), pa = w[(ti + w.length - 1) % w.length], pb = w[(ti + 1) % w.length], shallow = false;\n      [pa, pb].forEach(function(q){ var qx = q[0] - tp[0], qy = q[1] - tp[1], ql = Math.hypot(qx, qy); if (Math.abs(qx * ey - qy * ex) / (ql * el) < Math.sin(20 * Math.PI / 180)) shallow = true; });\n      if (shallow) continue;\n      if (!w.every(function(p){ return distToPoly(p, frame) < 0.35 || (pointInPoly(p, frame) && distToPoly(p, frame) >= m); })) continue;\n    }\n    return w;\n  }\n  return null;\n}\n/* place v anywhere in the box (composition) */\nfunction placeFree(v, rot, tight){\n  for (var t = 0; t < 30; t++){\n    var w = tight ? xformV(v, rot || 0, false, snap(45 + Math.random() * 10), snap(45 + Math.random() * 10)) : xformV(v, rot || 0, false, snap(34 + Math.random() * 32), snap(34 + Math.random() * 32));\n    if (w.every(function(p){ return p[0] >= 12 && p[0] <= 88 && p[1] >= 12 && p[1] <= 88; })) return w;\n  }\n  return null;\n}\n\n/* ---------- picture builders ---------- */\n/* Each builder draws the target's sides (some run on to the frame), then adds C.extras more lines using the\n   family's rule, and returns plain segments. C = the question's shared recipe so all five pictures match. */\nfunction drawSides(segs, v, frame, C, orth){\n  var n = v.length, i;\n  var extend = {};\n  var k = Math.round(n * C.ext);\n  shuffled(v.map(function(_, i){ return i; })).slice(0, k).forEach(function(i){ extend[i] = true; });\n  for (i = 0; i < n; i++){\n    var a = v[i], b = v[(i + 1) % n], g = [a[0], a[1], b[0], b[1]];\n    var choices = [g];\n    if (extend[i] && frame){\n      var tt = lineThroughPoly(a, b, frame);\n      if (tt){\n        var P = pt(a, b, tt[0]), Q = pt(a, b, tt[1]);\n        var both = [snap(P[0]), snap(P[1]), snap(Q[0]), snap(Q[1])], one1 = [snap(P[0]), snap(P[1]), b[0], b[1]], one2 = [a[0], a[1], snap(Q[0]), snap(Q[1])];\n        var opts = C.ext >= 1 ? [both, one1, one2] : (Math.random() < 0.5 ? [both, one1, one2] : [one1, one2, both]);\n        /* keep the corner covered: a snapped end must still run through a and b */\n        opts = opts.filter(function(g2){ return pointOnSeg(a[0], a[1], g2, 0.3) && pointOnSeg(b[0], b[1], g2, 0.3); });\n        choices = opts.concat([g]);\n      }\n    }\n    var placed = false;\n    for (var ci = 0; ci < choices.length && !placed; ci++){\n      if (fits(segs, choices[ci], true)){ segs.push({ g: choices[ci], side: true }); placed = true; }\n    }\n    if (!placed) return false;\n  }\n  return true;\n}\nfunction frameEdgePoint(frame){\n  var e = pick(polySegs(frame)), t = 0.15 + Math.random() * 0.7;\n  return [snap(e[0] + (e[2] - e[0]) * t), snap(e[1] + (e[3] - e[1]) * t)];\n}\nfunction buildFramed(v, frame, C){\n  var segs = [];\n  polySegs(frame).forEach(function(g){ segs.push({ g: g, frame: true }); });\n  if (!drawSides(segs, v, frame, C)){ why('framed-sides'); return null; }\n  if (!framedExtras(segs, v, frame, C)){ why('framed-extras'); return null; }\n  return segs.map(function(s){ return s.g; });\n}\nfunction framedExtras(segs, v, frame, C){\n  var c = centreOf(v), got = 0;\n  for (var i = 0; i < C.extras; i++){\n    var kinds = [C.kinds[i]].concat(['chord', 'spoke'].filter(function(k){ return k !== C.kinds[i]; }));\n    for (var kk = 0; kk < kinds.length; kk++){\n      var kind = kinds[kk];\n      if (tryAdd(segs, function(){\n        if (kind === 'spoke'){\n          /* a target corner joined to a frame corner or edge */\n          var a = pick(v), b = Math.random() < 0.5 ? pick(frame) : frameEdgePoint(frame);\n          return [[a[0], a[1], b[0], b[1]]];\n        }\n        /* a chord across the frame, passing through or near the target */\n        var p = frameEdgePoint(frame), q = frameEdgePoint(frame);\n        if (dist(p, q) < 30) return null;\n        if (kind === 'through' && distToSeg(c, [p[0], p[1], q[0], q[1]]) > 12) return null;\n        return [[p[0], p[1], q[0], q[1]]];\n      }, 24, kind)){ got++; break; }\n    }\n  }\n  return got >= Math.min(1, C.extras);\n}\n/* grid: rectangle frame, horizontal and vertical lines only */\nfunction buildGrid(v, frame, C){\n  gapNow = GAP_GRID;\n  try { return buildGrid0(v, frame, C); } finally { gapNow = GAP; }\n}\nfunction buildGrid0(v, frame, C){\n  var segs = [];\n  polySegs(frame).forEach(function(g){ segs.push({ g: g, frame: true }); });\n  if (!drawSides(segs, v, frame, C, true)){ why('grid-sides'); return null; }\n  var bb = bboxV(frame), i;\n  for (i = 0; i < C.extras; i++){\n    var ok = tryAdd(segs, function(){\n      var horiz = Math.random() < 0.5;\n      var lines = segs.map(function(s){ return s.g; });\n      /* a line from the frame to the frame, or stopping at an existing crossing line (a real grid look) */\n      if (horiz){\n        var y = snap(bb.y0 + 6 + Math.random() * (bb.h - 12));\n        var x0 = bb.x0, x1 = bb.x1;\n        if (Math.random() < 0.5){\n          var stops = lines.filter(function(g){ return Math.abs(g[0] - g[2]) < 0.01 && Math.min(g[1], g[3]) < y && Math.max(g[1], g[3]) > y; }).map(function(g){ return g[0]; });\n          if (stops.length){ var s = pick(stops); if (Math.random() < 0.5) x1 = s; else x0 = s; }\n        }\n        return [[x0, y, x1, y]];\n      }\n      var x = snap(bb.x0 + 6 + Math.random() * (bb.w - 12));\n      var y0 = bb.y0, y1 = bb.y1;\n      if (Math.random() < 0.5){\n        var stops2 = lines.filter(function(g){ return Math.abs(g[1] - g[3]) < 0.01 && Math.min(g[0], g[2]) < x && Math.max(g[0], g[2]) > x; }).map(function(g){ return g[1]; });\n        if (stops2.length){ var s2 = pick(stops2); if (Math.random() < 0.5) y1 = s2; else y0 = s2; }\n      }\n      return [[x, y0, x, y1]];\n    }, 30, 'grid');\n    if (!ok){ why('grid-extra'); return null; }\n  }\n  return segs.map(function(s){ return s.g; });\n}\n/* composition (11plusforparents rows 1, 3, 4): NO side of the target is drawn on its own. Whole shapes are built\n   whose sides run along the target's sides past its corners: a corner shape at every other corner (a triangle or\n   quadrilateral with that corner, its two sides along the target's two sides, extended), and a side shape (a triangle\n   or a quadrilateral on the line of a side) for any side still uncovered. The target is the region they make.\n   The same recipe (which corners, which shapes) is shared by all five pictures of a question. */\nfunction extendPt(from, to, e){ return [to[0] + (to[0] - from[0]) * e, to[1] + (to[1] - from[1]) * e]; }\nfunction cornerShape(v, i, R, k){\n  var n = v.length, B = v[i], A = v[(i + n - 1) % n], Cc = v[(i + 1) % n];\n  var P = extendPt(B, A, R.e1 * k), Q = extendPt(B, Cc, R.e2 * k);\n  if (R.kind === 'tri') return [B, P, Q];\n  /* a kite: the far corner sits between P and Q, short of the full parallelogram, so the shape stays compact */\n  var Rr = [B[0] + (P[0] - B[0]) * R.ra + (Q[0] - B[0]) * R.rb, B[1] + (P[1] - B[1]) * R.ra + (Q[1] - B[1]) * R.rb];\n  return [B, P, Rr, Q];\n}\nfunction sideShape(v, i, R, k){\n  var n = v.length, A = v[i], B = v[(i + 1) % n], L = dist(A, B);\n  var P = extendPt(B, A, R.e1 * k), Q = extendPt(A, B, R.e2 * k);\n  /* the third corner sits on the side of the line away from the target's middle, so the shape crosses the target */\n  var c = centreOf(v), ux = (B[0] - A[0]) / L, uy = (B[1] - A[1]) / L, nx = uy, ny = -ux;\n  if ((c[0] - A[0]) * nx + (c[1] - A[1]) * ny > 0){ nx = -nx; ny = -ny; }\n  var h = L * R.h, mid = pt(P, Q, R.m);\n  if (R.kind === 'tri') return [P, Q, [mid[0] + nx * h, mid[1] + ny * h]];\n  return [P, Q, [Q[0] + nx * h, Q[1] + ny * h], [P[0] + nx * h, P[1] + ny * h]];\n}\nfunction compRecipe(v, C){\n  var n = v.length, corners = [], i;\n  /* every other corner, starting anywhere: each corner shape covers two sides */\n  var start = ri(n);\n  for (i = 0; i < n; i += 2) corners.push((start + i) % n);\n  if (n % 2 === 1) corners.pop();\n  var covered = {};\n  corners.forEach(function(k){ covered[(k + n - 1) % n] = true; covered[k] = true; });\n  var sides = [];\n  for (i = 0; i < n; i++) if (!covered[i]) sides.push(i);\n  var mk = function(kind){ var ra = 0.6 + Math.random() * 0.3, rb = Math.max(1.25 - ra, 0.6 + Math.random() * 0.3); return { kind: kind, e1: 0.2 + Math.random() * 0.2, e2: 0.2 + Math.random() * 0.2, ra: ra, rb: rb, h: 0.3 + Math.random() * 0.2, m: 0.3 + Math.random() * 0.4 }; };\n  var first = Math.random() < 0.5 ? 'tri' : 'quad';\n  return { corners: corners, sides: sides, shapes: corners.map(function(_, j){ return mk(j % 2 === 0 ? first : (first === 'tri' ? 'quad' : 'tri')); }), sideShapes: sides.map(function(){ return mk(Math.random() < 0.5 ? 'tri' : 'quad'); }) };\n}\n/* the same family (corners, kinds) with fresh numbers, so a decoy that collides can try again */\nfunction rerollRecipe(R){\n  var mk = function(r){ var ra = 0.6 + Math.random() * 0.3, rb = Math.max(1.25 - ra, 0.6 + Math.random() * 0.3); return { kind: r.kind, e1: 0.2 + Math.random() * 0.2, e2: 0.2 + Math.random() * 0.2, ra: ra, rb: rb, h: 0.3 + Math.random() * 0.2, m: 0.3 + Math.random() * 0.4 }; };\n  return { corners: R.corners, sides: R.sides, shapes: R.shapes.map(mk), sideShapes: R.sideShapes.map(mk) };\n}\nfunction buildComposition(v, C){\n  var segs = [], R = C.recipe, i, k = C.compScale || 1;\n  var add = function(poly){\n    if (!poly.every(function(p){ return p[0] >= 4 && p[0] <= 96 && p[1] >= 4 && p[1] <= 96; })) return false;\n    var gs = polySegs(poly), trial = segs.slice();\n    for (var k = 0; k < gs.length; k++){ if (!fits(trial, gs[k], true)) return false; trial.push({ g: gs[k], side: true }); }\n    Array.prototype.push.apply(segs, trial.slice(segs.length));\n    return true;\n  };\n  for (i = 0; i < R.corners.length; i++) if (!add(cornerShape(v, R.corners[i], R.shapes[i], k))){ why('comp-corner'); return null; }\n  for (i = 0; i < R.sides.length; i++) if (!add(sideShape(v, R.sides[i], R.sideShapes[i], k))){ why('comp-side'); return null; }\n  var all = [];\n  segs.forEach(function(s){ all.push([s.g[0], s.g[1]], [s.g[2], s.g[3]]); });\n  for (i = 0; i < C.extras; i++){\n    if (!tryAdd(segs, function(){ var a = pick(all), b = pick(all); if (a === b || dist(a, b) < 12) return null; return [[a[0], a[1], b[0], b[1]]]; }, 24, 'join')){ why('comp-join'); return null; }\n  }\n  return segs.map(function(s){ return s.g; });\n}\n/* twin: the target and a second outline of itself, the way real papers pair shapes: flipped over one of its sides\n   (they share that side), flipped at a corner (they share the corner), or a half-size copy nested inside it with\n   connectors between matching corners. A flipped copy is only allowed when the checker still finds one copy. */\nfunction twinOf(v, mode, i){\n  var n = v.length, a = v[i], b = v[(i + 1) % n];\n  if (mode === 'nested'){\n    /* the partner is a bigger copy around the target (square in a square), so the picture keeps its footprint */\n    var c = centreOf(v), kk = 1.5 + Math.random() * 0.15;\n    return v.map(function(p){ return [c[0] + (p[0] - c[0]) * kk, c[1] + (p[1] - c[1]) * kk]; });\n  }\n  /* reflect across the line through a and b (mode side) or across the line through a at right angles to ab (corner) */\n  var ux = (b[0] - a[0]) / dist(a, b), uy = (b[1] - a[1]) / dist(a, b);\n  if (mode === 'corner'){ var t = ux; ux = -uy; uy = t; }\n  return v.map(function(p){\n    var dx = p[0] - a[0], dy = p[1] - a[1], along = dx * ux + dy * uy, across = dx * uy - dy * ux;\n    /* mirror: keep the along part, flip the across part (n = (uy, -ux)) */\n    return [a[0] + along * ux - across * uy, a[1] + along * uy + across * ux];\n  });\n}\nfunction twinPieces(segs, v, C){\n  var n = v.length, modes = C.twinModes || ['side', 'side', 'corner', 'nested'];\n  var order = shuffled(v.map(function(_, i){ return i; }));\n  for (var m = 0; m < 3; m++){\n    var mode = pick(modes);\n    for (var j = 0; j < n; j++){\n      var w = twinOf(v, mode, order[j]);\n      if (!w.every(function(p){ return p[0] >= 6 && p[0] <= 94 && p[1] >= 6 && p[1] <= 94; })) continue;\n      var trial = segs.slice(), ok = true, gs = polySegs(w);\n      for (var k = 0; k < gs.length && ok; k++){ if (fits(trial, gs[k], true)) trial.push({ g: gs[k], twin: true }); else ok = false; }\n      if (!ok) continue;\n      if (mode === 'nested'){\n        /* connectors between matching corners: at least one must fit */\n        var got = 0, co = shuffled(v.map(function(_, i){ return i; }));\n        for (var q = 0; q < co.length && got < C.extras; q++){\n          var g = [v[co[q]][0], v[co[q]][1], w[co[q]][0], w[co[q]][1]];\n          if (fits(trial, g, false)){ trial.push({ g: g, tag: 'link' }); got++; }\n        }\n        if (!got) continue;\n      } else if (C.extras > 1 && Math.random() < 0.5){\n        /* one joining line between two corners of the pair */\n        var all = v.concat(w);\n        tryAdd(trial, function(){ var p1 = pick(all), p2 = pick(all); if (p1 === p2) return null; return [[p1[0], p1[1], p2[0], p2[1]]]; }, 12, 'join');\n      }\n      return trial;\n    }\n  }\n  return null;\n}\nfunction buildTwin(v, C){\n  var segs = [];\n  if (!drawSides(segs, v, null, C)){ why('twin-sides'); return null; }\n  var out = twinPieces(segs, v, C);\n  if (!out){ why('twin-copy'); return null; }\n  return out.map(function(s){ return s.g; });\n}\nfunction build(type, v, frame, C){\n  var segs = type === 'grid' ? buildGrid(v, frame, C) : type === 'composition' ? buildComposition(v, C) : type === 'twin' ? buildTwin(v, C) : buildFramed(v, frame, C);\n  return segs ? mergeSegs(segs) : null;\n}\n/* a broken decoy: built like the answer, but one target side has a clear gap in it (or is left out when short) */\nfunction buildBroken(type, v, frame, C){\n  var n = v.length, skip = C.skip, segs = [];\n  if (frame) polySegs(frame).forEach(function(g){ segs.push({ g: g, frame: true }); });\n  var extend = {}, k = Math.round(n * C.ext);\n  shuffled(v.map(function(_, i){ return i; })).slice(0, k).forEach(function(i){ extend[i] = true; });\n  for (var i = 0; i < n; i++){\n    var a = v[i], b = v[(i + 1) % n], g = [a[0], a[1], b[0], b[1]];\n    if (extend[i] && frame){\n      var tt = lineThroughPoly(a, b, frame);\n      if (tt){ var p0 = pt(a, b, tt[0]), p1 = pt(a, b, tt[1]); var g2 = [snap(p0[0]), snap(p0[1]), snap(p1[0]), snap(p1[1])]; if (pointOnSeg(a[0], a[1], g2, 0.3) && pointOnSeg(b[0], b[1], g2, 0.3)) g = g2; }\n    }\n    if (i === skip){\n      /* a 9 unit gap in the middle of the side: two pieces, each still at least 8 long, or no side at all */\n      var L = dist(a, b), mid = pt(a, b, 0.5), ux = (b[0] - a[0]) / L, uy = (b[1] - a[1]) / L;\n      var m1 = [mid[0] - ux * 3.25, mid[1] - uy * 3.25], m2 = [mid[0] + ux * 3.25, mid[1] + uy * 3.25];\n      var ga = [g[0], g[1], m1[0], m1[1], 'butt'], gb = [m2[0], m2[1], g[2], g[3], 'butt'];\n      if (len(ga) >= 10 && len(gb) >= 10 && fits(segs, ga, true)){ segs.push({ g: ga, side: true }); if (fits(segs, gb, true)) segs.push({ g: gb, side: true }); }\n      continue;\n    }\n    if (!fits(segs, g, true)) return null;\n    segs.push({ g: g, side: true });\n  }\n  var rest = type === 'grid' ? buildGridExtras(segs, frame, C) : type === 'twin' ? buildTwinExtras(segs, v, C) : buildFramedExtras(segs, v, frame, C);\n  return rest ? mergeSegs(rest) : null;\n}\nfunction buildFramedExtras(segs, v, frame, C){\n  return framedExtras(segs, v, frame, C) ? segs.map(function(s){ return s.g; }) : null;\n}\nfunction buildGridExtras(segs, frame, C){\n  var bb = bboxV(frame);\n  for (var i = 0; i < C.extras; i++){\n    if (!tryAdd(segs, function(){\n      var horiz = Math.random() < 0.5;\n      if (horiz){ var y = snap(bb.y0 + 6 + Math.random() * (bb.h - 12)); return [[bb.x0, y, bb.x1, y]]; }\n      var x = snap(bb.x0 + 6 + Math.random() * (bb.w - 12)); return [[x, bb.y0, x, bb.y1]];\n    }, 30, 'grid')) return null;\n  }\n  return segs.map(function(s){ return s.g; });\n}\nfunction buildTwinExtras(segs, v, C){\n  var out = twinPieces(segs, v, C);\n  return out ? out.map(function(s){ return s.g; }) : null;\n}\n/* five different frames per question, so no picture stands out by its frame */\nfunction frameDeck(type){\n  if (type === 'composition' || type === 'twin') return [null, null, null, null, null];\n  if (type === 'grid') return shuffled(['rect', 'square', 'tallrect', 'rect', 'square']);\n  return shuffled(FRAME_NAMES).slice(0, 5);\n}\n/* joining lines between existing line ends until a picture has at least min lines; null when it cannot */\nfunction padLines(segs, min){\n  if (segs.length >= min) return segs;\n  var objs = segs.map(function(g){ return { g: g }; }), ends = [];\n  segs.forEach(function(g){ ends.push([g[0], g[1]], [g[2], g[3]]); });\n  for (var guard = 0; objs.length < min && guard < 6; guard++){\n    if (!tryAdd(objs, function(){ var a = pick(ends), b = pick(ends); if (a === b || dist(a, b) < 12) return null; return [[a[0], a[1], b[0], b[1]]]; }, 30, 'pad')) return null;\n    var merged = mergeSegs(objs.map(function(o){ return o.g; }));\n    if (merged.length < objs.length) objs = merged.map(function(g){ return { g: g }; });\n  }\n  return objs.length >= min ? objs.map(function(o){ return o.g; }) : null;\n}\n/* frameless pictures are centred, so the five sit alike in their cards */\nfunction centred(segs){\n  var bb = bboxS(segs), dx = snap(50 - (bb.x0 + bb.x1) / 2), dy = snap(50 - (bb.y0 + bb.y1) / 2);\n  return segs.map(function(g){ return [g[0] + dx, g[1] + dy, g[2] + dx, g[3] + dy].concat(g[4] ? [g[4]] : []); });\n}\nfunction shiftV(v, segs0, segs1){\n  var b0 = bboxS(segs0), b1 = bboxS(segs1);\n  return v.map(function(p){ return [p[0] + (b1.x0 - b0.x0), p[1] + (b1.y0 - b0.y0)]; });\n}\n\n/* ---------- SVG ---------- */\nfunction segsSvg(segs, extra){\n  var h = '';\n  for (var i = 0; i < segs.length; i++) h += '<line x1=\"' + fx(segs[i][0]) + '\" y1=\"' + fx(segs[i][1]) + '\" x2=\"' + fx(segs[i][2]) + '\" y2=\"' + fx(segs[i][3]) + '\" stroke=\"' + INK + '\" stroke-width=\"' + STROKE + '\" stroke-linecap=\"' + (segs[i][4] === 'butt' ? 'butt' : 'round') + '\"></line>';\n  return '<svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\">' + h + (extra || '') + '</svg>';\n}\n\n/* ---------- the question ---------- */\nfunction genHidden(diff){\n  var L = LEVELS[diff] || LEVELS[1];\n  var entry = peekEntry(diff), kind0 = entry.t;\n  /* extended = framed with every side run on to the frame */\n  var type = kind0 === 'extended' ? 'framed' : kind0;\n  var pool = L.targets.filter(function(k){\n    if (type === 'grid') return TARGETS[k].orth;\n    if (type === 'composition') return TARGETS[k].v.length <= 4;\n    if (type === 'twin') return TARGETS[k].v.length * 2 + 1 <= L.compLines + 2;\n    return true;\n  });\n  if (!pool.length) pool = L.targets.slice();\n  var key = pick(pool), tV = targetVerts(key), chiral = isChiralV(tV);\n  var frameless = type === 'composition' || type === 'twin';\n  var C = { ext: kind0 === 'extended' ? 1 : (frameless ? Math.min(L.ext, 0.34) : L.ext), extras: rnd(L.extras[0], L.extras[1]), rot: L.rot, kinds: [], overlays: [] };\n  /* the line budget: the target's sides, the frame, then extras only while the picture stays readable */\n  var budget = (frameless ? L.compLines : L.maxLines) - tV.length - (frameless ? 0 : 4);\n  if (type === 'composition'){\n    C.recipe = compRecipe(tV, C);\n    var shapeLines = 0;\n    C.recipe.shapes.concat(C.recipe.sideShapes).forEach(function(r){ shapeLines += r.kind === 'tri' ? 3 : 4; });\n    C.extras = Math.max(0, Math.min(2, L.compLines - shapeLines));\n  } else if (type === 'twin'){\n    C.extras = Math.max(1, Math.min(2, budget - tV.length));\n    /* with turns allowed, a flipped copy of a shape that is its own mirror image is a turned copy: nest instead */\n    C.twinModes = (L.rot && !chiral) ? ['nested'] : (L.rot ? ['side', 'corner', 'nested'] : ['side', 'side', 'corner', 'nested']);\n  } else C.extras = Math.max(1, Math.min(C.extras, budget));\n  for (var i = 0; i < C.extras; i++) C.kinds.push(pick(diff === 1 ? ['chord', 'spoke'] : ['chord', 'through', 'spoke']));\n  var margin = GAP + 0.5;\n  var rot = L.rot ? (type === 'grid' ? pick([90, 180, 270]) : (visibleTurn(tV, 20, 340) || 0)) : 0;\n  var touch = !frameless && entry.touch;\n  /* the right picture */\n  var ans = null, ansV = null, ansFrame = null, ansSlot = -1, deck = frameDeck(type);\n  if (!frameless && Math.random() < L.sameFrame){\n    var bigV = targetVerts(key, L.big), cands = shuffled(type === 'grid' ? ['rect', 'square', 'tallrect'] : ROOMY);\n    for (var ci = 0; ci < cands.length; ci++){\n      if (placeIn(bigV, FRAMES[cands[ci]], margin, false, L.rot ? 45 : 0) || placeIn(bigV, FRAMES[cands[ci]], margin, false, 0)){ deck = [cands[ci], cands[ci], cands[ci], cands[ci], cands[ci]]; break; }\n    }\n  }\n  var tries = type === 'composition' ? 90 : 30;\n  for (var t = 0; t < tries && !ans; t++){\n    var slot0 = t % 5, fname = deck[slot0], frame = fname ? FRAMES[fname] : null;\n    var v = frame ? placeIn(tV, frame, margin, touch, rot) : placeFree(tV, rot, type === 'composition');\n    if (!v){ why('place-answer'); continue; }\n    if (type === 'composition' && t) C.recipe = rerollRecipe(C.recipe);\n    var s = build(type, v, frame, C);\n    if (!s) continue;\n    s = padLines(s, type === 'twin' ? L.minLines - 1 : L.minLines);\n    if (!s){ why('answer-pad'); continue; }\n    if (s.length > (frameless ? L.compLines : L.maxLines)){ why('answer-cap'); continue; }\n    if (frameless){ var s2 = centred(s); v = shiftV(v, s, s2); s = s2; var fb = bboxS(s); if (Math.max(fb.w, fb.h) < 50){ why('answer-footprint'); continue; } }\n    if (copiesIn(s, tV, L.rot) !== 1){ why('answer-copies'); continue; }\n    /* no near copy beside the real one either, at the decoys' looser tolerance: a grid line under a unit off the\n       target's can draw a second L or step shape 0.7 units away that reads as a second copy (seed 1172) */\n    if (copiesIn(s, tV, L.rot, 1.2) !== 1){ why('answer-near'); continue; }\n    ans = s; ansV = v; ansFrame = fname; ansSlot = slot0;\n  }\n  if (!ans){ why('answer'); return null; }\n  var nAns = ans.length, used = {}, ansBB = bboxS(ans);\n  if (ansSlot >= 0) used[ansSlot] = true;\n  var figs = [{ segs: ans, right: true }];\n  for (var d = 0; d < L.decoys.length; d++){\n    var kind = L.decoys[d];\n    if (kind === 'mirrorOrNudge') kind = (chiral && entry.mirror) ? 'mirror' : 'nudge';\n    if (kind === 'turn'){\n      var canTurn = type === 'grid' ? (symTurns(tV).length < 4) : (visibleTurn(tV, 40, 90) != null);\n      if (!canTurn) kind = 'nudge';\n    }\n    var got = null;\n    for (var u = 0; u < (type === 'composition' ? 140 : 60) && !got; u++){\n      var dV = null, dRot = L.rot ? 5 * ri(72) : 0;\n      if (type === 'grid' && L.rot) dRot = pick([0, 90, 180, 270]);\n      if (kind === 'small') dV = targetVerts(key, L.small);\n      else if (kind === 'big') dV = targetVerts(key, L.big);\n      else if (kind === 'mirror') dV = xformV(tV, 0, true, 0, 0);\n      else if (kind === 'turn'){ dRot = type === 'grid' ? pick([90, 180, 270]) : pick(diff === 1 ? [60, 90] : [45, 90]); if (!(type === 'grid') && !turnShows(tV, dRot)) dRot = visibleTurn(tV, 40, 90) || 60; dV = tV; }\n      else if (kind === 'nudge') dV = nudged(tV, L.nudge);\n      else if (kind === 'broken') dV = tV;\n      if (!dV){ why('dv-' + kind); continue; }\n      var fname2 = null, frame2 = null, w = null, slot = -1;\n      if (frameless) w = placeFree(dV, dRot, type === 'composition');\n      else {\n        var order = [0, 1, 2, 3, 4].sort(function(x, y){ return (used[x] ? 1 : 0) - (used[y] ? 1 : 0) || AREA[deck[y]] - AREA[deck[x]]; });\n        for (var fi = 0; fi < 5 && !w; fi++){ var sl = order[fi]; if (used[sl] && fi < 4) continue; fname2 = deck[sl]; frame2 = FRAMES[fname2]; w = placeIn(dV, frame2, margin, touch, dRot); if (w) slot = sl; }\n      }\n      if (!w){ why('place-' + kind); continue; }\n      var C2 = C;\n      if (kind === 'broken' && type === 'composition') kind = 'nudge';\n      if (type === 'composition'){ C2 = merge(C2, { recipe: rerollRecipe(C.recipe) }); }\n      if (type === 'composition' && (kind === 'small' || kind === 'big')){ var kk = kind === 'small' ? L.small : L.big; C2 = merge(C2, { compScale: 1 / (kk * kk) }); }\n      if (kind === 'broken') C2 = merge(C, { skip: ri(w.length) });\n      /* a flipped twin of the mirror decoy would be the target itself */\n      if (kind === 'mirror' && type === 'twin') C2 = merge(C2, { twinModes: ['nested'] });\n      var ds = kind === 'broken' ? buildBroken(type, w, frame2, C2) : build(type, w, frame2, C2);\n      if (!ds){ why('build-' + kind); continue; }\n      ds = padLines(ds, type === 'twin' ? L.minLines - 1 : L.minLines);\n      if (!ds){ why('pad-' + kind); continue; }\n      if (ds.length > (frameless ? L.compLines : L.maxLines)){ why('cap-' + kind); continue; }\n      if (kind === 'broken'){\n        var sk = C2.skip, ga = w[sk], gb = w[(sk + 1) % w.length];\n        if (longestGap(ds, ga, gb) < 4){ why('gap-broken'); continue; }\n      }\n      if (frameless) ds = centred(ds);\n      if (copiesIn(ds, tV, L.rot, 1.2) !== 0){ why('copies-' + kind); continue; }\n      if (Math.abs(ds.length - nAns) > 1){ why('count-' + kind); continue; }\n      if (frameless){\n        /* the same overall footprint, so no picture stands out by its size */\n        var bb = bboxS(ds), tol = (type === 'twin' || kind === 'turn') ? 14 : 8;\n        if (Math.abs(bb.w - ansBB.w) > tol || Math.abs(bb.h - ansBB.h) > tol){ why('size-' + kind); continue; }\n      }\n      got = ds;\n      if (slot >= 0) used[slot] = true;\n    }\n    if (!got){ why('decoy-' + kind); return null; }\n    figs.push({ segs: got, right: false, why: kind });\n  }\n  figs = shuffled(figs);\n  var correct = 0;\n  figs.forEach(function(f, k){ if (f.right) correct = k; });\n  var name = TARGETS[key].name;\n  /* the answer trace: the target outline in orange with corner dots, no fill, nothing the picture does not draw */\n  var trace = '<polygon points=\"' + ansV.map(function(p){ return fx(p[0]) + ',' + fx(p[1]); }).join(' ') + '\" fill=\"none\" stroke=\"#F47820\" stroke-width=\"3.4\" stroke-linejoin=\"round\"></polygon>' +\n    ansV.map(function(p){ return '<circle cx=\"' + fx(p[0]) + '\" cy=\"' + fx(p[1]) + '\" r=\"2.4\" fill=\"#F47820\" stroke=\"#FFFFFF\" stroke-width=\"1\"></circle>'; }).join('');\n  takeEntry(diff);\n  return {\n    type: 'hidden',\n    prompt: { kind: 'hidden', svg: segsSvg(polySegs(xformV(tV, 0, false, 50, 50))) },\n    options: figs.map(function(f){ return segsSvg(f.segs); }),\n    revealSvg: segsSvg(ans, trace),\n    decoyKinds: figs.map(function(f){ return f.right ? 'answer' : f.why; }),\n    figures: figs.map(function(f){ return f.segs; }),\n    targetV: ansV,\n    build: kind0,\n    frame: ansFrame,\n    correct: correct,\n    rawSvg: true,\n    hint: L.rot ? 'One picture hides an exact copy of this shape: same size, but it may be turned round. Find it.' : 'One picture hides an exact copy of this shape: same size, same way up. Find it.',\n    explain: 'The ' + name + ' is hiding in ' + 'ABCDE'.charAt(correct) + ' at exactly the right size' + (L.rot ? '.' : ' and the right way up.') +\n      '<br>Trace all ' + tV.length + ' sides.',\n    ruleKey: 't:' + key\n  };\n}\n/* does a turn by deg leave the shape looking different? */\nfunction turnShows(v, deg){\n  var sym = symTurns(v), span = 360 / sym.length, m = deg % span;\n  return m >= 18 && span - m >= 18;\n}\n\nif (E.TYPES && E.TYPES.hidden) E.TYPES.hidden.gen = genHidden;\nE.hidden = { genHidden: genHidden, fits: fits, WHY: WHY, FWHY: FWHY, LEVELS: LEVELS, TARGETS: TARGETS, FRAMES: FRAMES, targetVerts: targetVerts, xformV: xformV, polySegs: polySegs, nodesOf: nodesOf, copiesIn: copiesIn, symTurns: symTurns, rotOrder: rotOrder, isChiralV: isChiralV, segsSvg: segsSvg, pointOnSeg: pointOnSeg, mergeSegs: mergeSegs, unionCovered: unionCovered, longestGap: longestGap, interiorAngles: interiorAngles, ri: ri, pick: pick, fx: fx, INK: INK, STROKE: STROKE, BAGS: BAGS };\n})(window.SSEngine);\n\n/* ===== MATRICES (built by matrix-work/build_matrix.py from matrix-checker.js + matrix-gen.js, do not edit) ===== */\n(function(){\n/* ===== MATRICES: the \"one fair answer\" checker =====\n   Reads a finished 3 by 3 question the way a child can: one property at a time (shape, shading, size, turn, dots,\n   place ...), trying every rule family below on the eight visible cells. A family that fits the visible cells is a\n   READING and predicts the gap. The question passes only when, for every property:\n   - all readings that match an option pick the same options (no second rule leads to a different card),\n   - a property with no reading at all does not vary across the options (nothing to guess),\n   and exactly one option survives every property, and it is the marked answer.\n   A reading has to be something a child could SEE: a turn or a move must visibly change the line, and \"these two cells\n   match\" needs a full line where they match while the third cell differs. When the grid reads as \"the first two drawn\n   together make the third\", shape, shading and layering are checked as that one picture rule instead. */\nfunction mxChecker(E){\n  'use strict';\n  var ROWS = [[0, 1, 2], [3, 4, 5], [6, 7, 8]], COLS = [[0, 3, 6], [1, 4, 7], [2, 5, 8]];\n  var DIAG = [[0, 4, 8], [1, 5, 6], [2, 3, 7]], ANTI = [[0, 5, 7], [1, 3, 8], [2, 4, 6]];\n  var ALL = [[0, 1, 2, 3, 4, 5, 6, 7, 8]];\n  var PERIM = ['tl', 't', 'tr', 'r', 'br', 'b', 'bl', 'l'];\n  var PROPS = ['shape', 'fill', 'size', 'rot', 'flip', 'dots', 'lines', 'stroke', 'copies', 'pair', 'inner', 'pos'];\n  var NUMERIC = { size: 1, dots: 1, lines: 1, copies: 1 };\n\n  /* what a child can see in one cell; rotation and flips come from ser(), so looks-identical means equal. Properties\n     the renderer ignores are 'na': copies draw no size, turn or flip, and a shape moved off centre is always small. */\n  function feats(s){\n    var f = E.ser(s).split('|'), many = !!s.copies, off = !!(s.pos && s.pos !== 'c');\n    return {\n      shape: s.shape, fill: s.fill,\n      size: (many || off) ? 'na' : ({ s: 0, m: 1, l: 2 })[s.size || 'm'],\n      rot: many ? 'na' : +f[3].slice(1), flip: many ? 'na' : f[8].slice(1),\n      dots: s.dots || 0, lines: s.lines || 0, stroke: s.stroke || 'solid', copies: s.copies || 1,\n      pair: s.pair ? [s.pair.shape2, s.pair.fill2, s.pair.front].join(',') : '-',\n      inner: s.inner ? E.ser(s.inner) : '-', pos: s.pos || 'c', posIdx: off ? PERIM.indexOf(s.pos) : 'na',\n      sym: E.SYM[s.shape] || 360, sides: E.SIDES[s.shape] || 0, shadeIdx: ({ white: 1, grey: 2, black: 3 })[s.fill] || 0\n    };\n  }\n  function others(L, b){ return L.filter(function(i){ return i !== b; }); }\n  function holder(lines, b){ for (var g = 0; g < lines.length; g++) if (lines[g].indexOf(b) >= 0) return lines[g]; return null; }\n\n  /* every line holds one value */\n  function same(lines){\n    return function(G, b, p){\n      var want;\n      for (var g = 0; g < lines.length; g++){\n        var vis = others(lines[g], b);\n        for (var k = 1; k < vis.length; k++) if (G[vis[k]][p] !== G[vis[0]][p]) return null;\n        if (lines[g].indexOf(b) >= 0) want = G[vis[0]][p];\n      }\n      return function(f){ return f[p] === want; };\n    };\n  }\n  /* each full line uses the same three different values, in any order */\n  function perm(lines){\n    return function(G, b, p){\n      var set = null, bl = holder(lines, b);\n      for (var g = 0; g < 3; g++){\n        if (lines[g] === bl) continue;\n        var v = lines[g].map(function(i){ return String(G[i][p]); });\n        if (v[0] === v[1] || v[1] === v[2] || v[0] === v[2]) return null;\n        var key = v.slice().sort().join('|');\n        if (set === null) set = key; else if (key !== set) return null;\n      }\n      var S = set.split('|'), seen = others(bl, b).map(function(i){ return String(G[i][p]); });\n      if (seen[0] === seen[1] || S.indexOf(seen[0]) < 0 || S.indexOf(seen[1]) < 0) return null;\n      var left = S.filter(function(x){ return seen.indexOf(x) < 0; })[0];\n      return function(f){ return String(f[p]) === left; };\n    };\n  }\n  /* two places along every line match, like a row whose ends match; a full line has to show them matching while its\n     third cell is different, or the \"match\" is just a line of identical cells */\n  function copy(lines, j, k){\n    var o = 3 - j - k;\n    return function(G, b, p){\n      var bl = holder(lines, b), at = bl.indexOf(b), seen = false;\n      if (at !== j && at !== k) return null;\n      for (var g = 0; g < 3; g++){\n        if (lines[g] === bl) continue;\n        var L = lines[g];\n        if (G[L[j]][p] !== G[L[k]][p]) return null;\n        if (G[L[o]][p] !== G[L[j]][p]) seen = true;\n      }\n      if (!seen) return null;\n      var src = G[bl[at === j ? k : j]][p];\n      return function(f){ return f[p] === src; };\n    };\n  }\n  /* numbers: every line goes up or down in equal steps (one step for every line, or each line its own). With a key the\n     number is read from another feature (sides of a polygon, darkness of plain shading), 0 meaning it has none. */\n  function step(lines, shared, key, min){\n    return function(G, b, p){\n      var q = key || p, d = null, bl = holder(lines, b);\n      for (var g = 0; g < 3; g++){\n        if (lines[g] === bl) continue;\n        var x = G[lines[g][0]][q], y = G[lines[g][1]][q], z = G[lines[g][2]][q];\n        if (typeof x !== 'number' || typeof y !== 'number' || typeof z !== 'number') return null;\n        if ((key && !(x && y && z)) || y - x !== z - y || y === x) return null;\n        if (shared){ if (d === null) d = y - x; else if (d !== y - x) return null; }\n      }\n      var at = bl.indexOf(b), pv = [0, 1, 2].filter(function(c){ return c !== at; });\n      var v0 = G[bl[pv[0]]][q], v1 = G[bl[pv[1]]][q];\n      if (typeof v0 !== 'number' || typeof v1 !== 'number' || (key && !(v0 && v1))) return null;\n      var dd = (v1 - v0) / (pv[1] - pv[0]);\n      if (shared ? dd !== d : (dd === 0 || dd !== Math.round(dd))) return null;\n      var want = v0 + dd * (at - pv[0]);\n      if (want < (min == null ? 0 : min)) return null;\n      return function(f){ return f[q] === want; };\n    };\n  }\n  /* numbers: one place along every line is the other two added together (t = a + c) */\n  function sum(lines, a, c, t){\n    return function(G, b, p){\n      var bl = holder(lines, b);\n      for (var g = 0; g < 3; g++){\n        if (lines[g] === bl) continue;\n        var L = lines[g];\n        if (typeof G[L[t]][p] !== 'number' || G[L[t]][p] !== G[L[a]][p] + G[L[c]][p]) return null;\n      }\n      var at = bl.indexOf(b), want;\n      if (at === t) want = G[bl[a]][p] + G[bl[c]][p];\n      else want = G[bl[t]][p] - G[bl[at === a ? c : a]][p];\n      if (!(want >= 0)) return null;\n      return function(f){ return f[p] === want; };\n    };\n  }\n  /* numbers: the third place along every line is the difference of the first two, either way round */\n  function absdiff(lines){\n    return function(G, b, p){\n      var bl = holder(lines, b);\n      for (var g = 0; g < 3; g++){\n        if (lines[g] === bl) continue;\n        var L = lines[g], x = G[L[0]][p], y = G[L[1]][p], z = G[L[2]][p];\n        if (typeof x !== 'number' || typeof y !== 'number' || x === y || z !== Math.abs(x - y)) return null;\n      }\n      var at = bl.indexOf(b), vis = others(bl, b).map(function(i){ return G[i][p]; }), ok = [];\n      if (typeof vis[0] !== 'number' || typeof vis[1] !== 'number') return null;\n      if (at === 2) ok.push(Math.abs(vis[0] - vis[1]));\n      else { ok.push(vis[0] + vis[1]); if (vis[0] - vis[1] > 0) ok.push(vis[0] - vis[1]); }\n      return function(f){ return ok.indexOf(f[p]) >= 0; };\n    };\n  }\n  /* numbers that go round: one more each step and back to the smallest after the biggest (4 5 1). Only a reading when a\n     line visibly wraps, since the smallest and biggest values have to be on show to be known. */\n  function wrap(lines, d, key){\n    return function(G, b, p){\n      var q = key || p, lo = Infinity, hi = -Infinity, wrapped = false, i, g, c;\n      for (i = 0; i < 9; i++){\n        if (i === b) continue;\n        var v = G[i][q];\n        if (typeof v !== 'number' || (key && !v)) return null;\n        if (v < lo) lo = v;\n        if (v > hi) hi = v;\n      }\n      var m = hi - lo + 1;\n      if (m < 3) return null;\n      function fits(L, extra){\n        for (var a = 0; a < m; a++){\n          var good = true;\n          for (var k = 0; k < 3 && good; k++){\n            var f = L[k] === b ? extra : G[L[k]];\n            if (!f) continue;\n            if (typeof f[q] !== 'number' || ((a + d * k) % m + m) % m + lo !== f[q]) good = false;\n          }\n          if (good) return true;\n        }\n        return false;\n      }\n      for (g = 0; g < 3; g++){\n        if (!fits(lines[g], null)) return null;\n        for (c = 0; c < 2; c++){\n          var x = lines[g][c], y = lines[g][c + 1];\n          if (x !== b && y !== b && G[y][q] - G[x][q] !== d) wrapped = true;\n        }\n      }\n      if (!wrapped) return null;\n      var bl = holder(lines, b);\n      return function(f){ return fits(bl, f); };\n    };\n  }\n  /* numbers: every line adds up to the same total */\n  function total(lines){\n    return function(G, b, p){\n      var T = null, bl = holder(lines, b);\n      for (var g = 0; g < 3; g++){\n        if (lines[g] === bl) continue;\n        var s = 0;\n        for (var c = 0; c < 3; c++){ var v = G[lines[g][c]][p]; if (typeof v !== 'number') return null; s += v; }\n        if (T === null) T = s; else if (T !== s) return null;\n      }\n      var want = T, vis = others(bl, b);\n      for (var k = 0; k < vis.length; k++){ if (typeof G[vis[k]][p] !== 'number') return null; want -= G[vis[k]][p]; }\n      if (want < 0) return null;\n      return function(f){ return f[p] === want; };\n    };\n  }\n  /* turns and moves: every line steps round by the same amount (angles on each shape's own symmetry, places round the\n     eight spots of the cell). Only a reading when the stepping shows. */\n  function modstep(lines, d, key, modOf, starts){\n    var flat = same(lines);\n    return function(G, b, p){\n      if (flat(G, b, key)) return null;\n      function fits(L, extra){\n        for (var si = 0; si < starts.length; si++){\n          var a = starts[si], good = true;\n          for (var c = 0; c < 3 && good; c++){\n            var f = L[c] === b ? extra : G[L[c]];\n            if (!f) continue;\n            var m = modOf(f), v = f[key];\n            if (typeof v !== 'number' || m <= 1 || ((a + d * c - v) % m + m) % m !== 0) good = false;\n          }\n          if (good) return true;\n        }\n        return false;\n      }\n      var bl = holder(lines, b);\n      for (var g = 0; g < 3; g++) if (!fits(lines[g], null)) return null;\n      return function(f){ return fits(bl, f); };\n    };\n  }\n  /* the picture rule: along every row the third cell is the first two drawn together, the first one in front */\n  function overlayRead(G, b){\n    var bl = holder(ROWS, b), at = bl.indexOf(b), front = null, g;\n    function single(f){ return f.pair === '-'; }\n    for (g = 0; g < 3; g++){\n      var L = ROWS[g];\n      if (L === bl) continue;\n      var a = G[L[0]], m = G[L[1]], t = G[L[2]];\n      if (!single(a) || !single(m) || single(t)) return null;\n      var pr = t.pair.split(',');\n      if (t.shape !== a.shape || t.fill !== a.fill || pr[0] !== m.shape || pr[1] !== m.fill) return null;\n      if (front === null) front = pr[2]; else if (front !== pr[2]) return null;\n    }\n    var want;\n    if (at === 2){\n      var a2 = G[bl[0]], m2 = G[bl[1]];\n      if (!single(a2) || !single(m2)) return null;\n      want = { shape: a2.shape, fill: a2.fill, pair: [m2.shape, m2.fill, front].join(',') };\n    } else {\n      var t2 = G[bl[2]], o = G[bl[at === 0 ? 1 : 0]];\n      if (single(t2) || !single(o)) return null;\n      var p2 = t2.pair.split(',');\n      if (p2[2] !== front) return null;\n      if (at === 0){\n        if (p2[0] !== o.shape || p2[1] !== o.fill) return null;\n        want = { shape: t2.shape, fill: t2.fill, pair: '-' };\n      } else {\n        if (t2.shape !== o.shape || t2.fill !== o.fill) return null;\n        want = { shape: p2[0], fill: p2[1], pair: '-' };\n      }\n    }\n    return function(f){ return f.shape === want.shape && f.fill === want.fill && f.pair === want.pair; };\n  }\n\n  var FAM = [];\n  function add(name, fn, only){ FAM.push({ name: name, fn: fn, only: only || null }); }\n  add('same in every cell', same(ALL));\n  add('same along each row', same(ROWS)); add('same down each column', same(COLS));\n  add('same along each diagonal', same(DIAG)); add('same along each other diagonal', same(ANTI));\n  add('each row uses the same three', perm(ROWS)); add('each column uses the same three', perm(COLS));\n  [[0, 1], [0, 2], [1, 2]].forEach(function(jk){\n    add('rows repeat cells ' + (jk[0] + 1) + ' and ' + (jk[1] + 1), copy(ROWS, jk[0], jk[1]));\n    add('columns repeat cells ' + (jk[0] + 1) + ' and ' + (jk[1] + 1), copy(COLS, jk[0], jk[1]));\n  });\n  add('rows change by one step', step(ROWS, true), NUMERIC); add('columns change by one step', step(COLS, true), NUMERIC);\n  add('each row changes by its own step', step(ROWS, false), NUMERIC); add('each column changes by its own step', step(COLS, false), NUMERIC);\n  add('rows gain sides', step(ROWS, true, 'sides', 3), { shape: 1 }); add('columns gain sides', step(COLS, true, 'sides', 3), { shape: 1 });\n  add('rows get darker or lighter', step(ROWS, true, 'shadeIdx', 1), { fill: 1 }); add('columns get darker or lighter', step(COLS, true, 'shadeIdx', 1), { fill: 1 });\n  [1, -1, 2, -2].forEach(function(d){\n    add('rows count round ' + d, wrap(ROWS, d), NUMERIC); add('columns count round ' + d, wrap(COLS, d), NUMERIC);\n    add('rows go round the sides ' + d, wrap(ROWS, d, 'sides'), { shape: 1 }); add('columns go round the sides ' + d, wrap(COLS, d, 'sides'), { shape: 1 });\n  });\n  add('rows: third = first + second', sum(ROWS, 0, 1, 2), NUMERIC); add('columns: third = first + second', sum(COLS, 0, 1, 2), NUMERIC);\n  add('rows: third = first - second', sum(ROWS, 1, 2, 0), NUMERIC); add('columns: third = first - second', sum(COLS, 1, 2, 0), NUMERIC);\n  add('rows: second = first + third', sum(ROWS, 0, 2, 1), NUMERIC); add('columns: second = first + third', sum(COLS, 0, 2, 1), NUMERIC);\n  add('rows: third = difference', absdiff(ROWS), NUMERIC); add('columns: third = difference', absdiff(COLS), NUMERIC);\n  add('rows add to the same total', total(ROWS), NUMERIC); add('columns add to the same total', total(COLS), NUMERIC);\n  var ANGLES = [0, 45, 90, 135, 180, 225, 270, 315], SPOTS = [0, 1, 2, 3, 4, 5, 6, 7];\n  function symOf(f){ return f.sym; }\n  function eight(){ return 8; }\n  [45, 90, 135, 180, 225, 270, 315].forEach(function(d){\n    add('rows turn ' + d, modstep(ROWS, d, 'rot', symOf, ANGLES), { rot: 1 });\n    add('columns turn ' + d, modstep(COLS, d, 'rot', symOf, ANGLES), { rot: 1 });\n  });\n  [1, 2, 3, 5, 6, 7].forEach(function(d){\n    add('rows move ' + d, modstep(ROWS, d, 'posIdx', eight, SPOTS), { pos: 1 });\n    add('columns move ' + d, modstep(COLS, d, 'posIdx', eight, SPOTS), { pos: 1 });\n  });\n\n  function check(q){\n    if (!q || !q.prompt || q.prompt.kind !== 'matrix' || q.prompt.cells.length !== 9) return { ok: false, why: 'not a 3 by 3 matrix' };\n    var b = q.prompt.missing;\n    var G = q.prompt.cells.map(function(s, i){ return i === b ? null : feats(s); });\n    var O = q.options.map(feats), alive = O.map(function(){ return true; }), readings = {}, skip = {};\n    var ov = overlayRead(G, b);\n    if (ov){\n      readings.picture = ['the first two make the third'];\n      for (var k0 = 0; k0 < O.length; k0++) if (!ov(O[k0])) alive[k0] = false;\n      skip = { shape: 1, fill: 1, pair: 1 };\n    }\n    for (var pi = 0; pi < PROPS.length; pi++){\n      var p = PROPS[pi], got = [], sets = {};\n      if (skip[p]) continue;\n      for (var fi = 0; fi < FAM.length; fi++){\n        var F = FAM[fi];\n        if (F.only && !F.only[p]) continue;\n        var acc = F.fn(G, b, p);\n        if (!acc) continue;\n        var ids = [];\n        for (var k = 0; k < O.length; k++) if (acc(O[k])) ids.push(k);\n        got.push(F.name);\n        if (ids.length && !sets[ids.join(',')]) sets[ids.join(',')] = F.name;\n      }\n      readings[p] = got;\n      var keys = Object.keys(sets);\n      if (!got.length){\n        for (var k2 = 1; k2 < O.length; k2++){\n          if (String(O[k2][p]) !== String(O[0][p])) return { ok: false, why: 'no rule for ' + p + ' but the options differ', prop: p, readings: readings };\n        }\n        continue;\n      }\n      if (!keys.length) return { ok: false, why: 'no option fits ' + p, prop: p, readings: readings };\n      if (keys.length > 1) return { ok: false, why: 'two readings of ' + p + ': ' + keys.map(function(x){ return sets[x]; }).join(' / '), prop: p, readings: readings };\n      var keep = keys[0].split(',').map(Number);\n      for (var k3 = 0; k3 < O.length; k3++) if (keep.indexOf(k3) < 0) alive[k3] = false;\n    }\n    var left = [];\n    for (var k4 = 0; k4 < alive.length; k4++) if (alive[k4]) left.push(k4);\n    if (left.length !== 1) return { ok: false, why: left.length + ' options fit every property', readings: readings };\n    if (left[0] !== q.correct) return { ok: false, why: 'the checker picks a different option', readings: readings };\n    return { ok: true, readings: readings };\n  }\n  return { check: check, feats: feats, PROPS: PROPS, FAM: FAM };\n}\n\n/* ===== MATRICES: rebuilt from the GPT review (matrix-work/matrix-critique.md) =====\n   Appended to the engine asset after the hidden shapes block; replaces TYPES.matrix.gen.\n   Level 1 has two rules (one change and one thing kept), level 2 two changes, level 3 three. A rule owns one property\n   and gives its value in every cell: kept along each row or down each column, each value once per row, the same along\n   each diagonal, a steady step across or down (dots, shading, size, sides, a quarter turn, a move round the cell, one\n   more shape), the ends of each row matching, the first two dot counts added, or the first two shapes drawn together.\n   Steps start from a different place in each row, so the grid never uses every combination of two properties and a\n   wrong card can be new without being odd.\n   The gap visits all nine cells in turn and the answer all five letters. The wrong options are near misses (one or two\n   rules broken, or a neighbouring cell) picked so no shortcut works: at most one is already in the grid, the answer is\n   never the one card most like the others or least like them, no card has a feature drawn nowhere else, and every\n   rule is broken by at least one card. The checker then proves every reading of the grid picks the same card. */\n(function(E){\n'use strict';\nif (!E || !E.TYPES || !E.TYPES.matrix || !E.SYM || !E.baseSpec || typeof mxChecker !== 'function') return;\n\nvar ri = function(n){ return Math.floor(Math.random() * n); };\nvar pick = function(a){ return a[ri(a.length)]; };\nfunction shuffled(a){ a = a.slice(); for (var i = a.length - 1; i > 0; i--){ var j = ri(i + 1), t = a[i]; a[i] = a[j]; a[j] = t; } return a; }\nfunction pickN(a, n){ return shuffled(a).slice(0, n); }\nfunction deep(o){ return JSON.parse(JSON.stringify(o)); }\nfunction range(n){ var out = []; for (var i = 0; i < n; i++) out.push(i); return out; }\nvar WHY = {};\nfunction why(k){ WHY[k] = (WHY[k] || 0) + 1; }\nvar MX = mxChecker(E);\n\n/* ---- what grids are drawn from ---- */\nvar PLAIN = ['circle', 'square', 'triangle', 'pentagon', 'hexagon', 'star', 'diamond', 'cross', 'semicircle', 'arrow',\n  'kite', 'trapezium', 'ring', 'tshape', 'lshape', 'parallelogram', 'chevron'];\n/* no symmetry at all, so every quarter turn visibly changes the drawing */\nvar TURNY = ['arrow', 'kite', 'tshape', 'lshape', 'rtriangle', 'semicircle', 'chevron', 'trapezium'];\n/* their mirror image is a different drawing that no turn can make */\nvar CHIRALS = ['lshape', 'rtriangle', 'parallelogram', 'zshape'];\n/* small shapes that stay clear when moved into a corner */\nvar SMALL = ['circle', 'square', 'triangle', 'star', 'cross', 'diamond', 'hexagon'];\nvar OVERLAYS = ['square', 'triangle', 'pentagon', 'hexagon', 'diamond', 'cross', 'kite', 'trapezium', 'parallelogram', 'rtriangle', 'tshape', 'star'];\n/* never two of these in one grid: they are told apart by a detail a child can miss on a phone */\nvar ALIKE = [['square', 'diamond', 'kite'], ['circle', 'ellipse', 'ring'], ['pentagon', 'hexagon', 'heptagon', 'octagon'],\n  ['star', 'star6'], ['triangle', 'rtriangle'], ['trapezium', 'parallelogram'], ['semicircle', 'quarter', 'crescent'],\n  ['arrow', 'chevron'], ['tshape', 'cross'], ['lshape', 'zshape']];\nvar SHADES = ['white', 'grey', 'black'], SIZES = ['s', 'm', 'l'], LIGHT = ['white', 'grey'];\n/* dotted, striped and checked fills look alike in a small cell (GPT round 2), so every level uses these four */\nvar FILLS = { 2: ['white', 'grey', 'black', 'hatch'], 3: ['white', 'grey', 'black', 'hatch'] };\nvar PERIM = ['tl', 't', 'tr', 'r', 'br', 'b', 'bl', 'l'], SPOTS = range(8), CORNERS = [0, 2, 4, 6], ANG = [0, 90, 180, 270];\n\nfunction unlike(pool, n){\n  for (var t = 0; t < 150; t++){\n    var got = pickN(pool, n), ok = true;\n    for (var g = 0; g < ALIKE.length && ok; g++){\n      var hits = 0;\n      for (var k = 0; k < got.length; k++) if (ALIKE[g].indexOf(got[k]) >= 0) hits++;\n      if (hits > 1) ok = false;\n    }\n    if (ok) return got;\n  }\n  return null;\n}\n\n/* ---- properties: rules work in codes, the setter draws them ---- */\nvar PROP = {\n  shape:  { set: function(s, v){ s.shape = v; } },\n  sides:  { set: function(s, v){ s.shape = E.MORPH[v - 3]; }, lo: 3, hi: 8 },\n  fill:   { set: function(s, v){ s.fill = v; } },\n  shade:  { set: function(s, v){ s.fill = SHADES[v]; }, lo: 0, hi: 2 },\n  size:   { set: function(s, v){ s.size = SIZES[v]; }, lo: 0, hi: 2 },\n  rot:    { set: function(s, v){ s.rot = v; }, mod: 360, unit: 90 },\n  flip:   { set: function(s, v){ s.flip = v ? 'h' : false; }, lo: 0, hi: 1 },\n  pos:    { set: function(s, v){ s.pos = PERIM[v]; }, mod: 8, unit: 2 },\n  dots:   { set: function(s, v){ s.dots = v; }, lo: 1, hi: 5 },\n  copies: { set: function(s, v){ s.copies = v; }, lo: 1, hi: 4 },\n  ov:     { set: function(s, v){ var p = v.split('|'); s.shape = p[0]; s.fill = p[1]; if (p.length > 2) s.pair = { shape2: p[2], fill2: p[3], front: 'main' }; } }\n};\n\n/* ---- rules: the code for a property in row r, column c ---- */\nfunction R(prop, kind, at, extra){ var o = { prop: prop, kind: kind, at: at }; for (var k in extra || {}) o[k] = extra[k]; return o; }\nfunction rowKeep(prop, vals, only){ return R(prop, 'row', function(r){ return vals[r]; }, only ? { only: only } : null); }\nfunction colKeep(prop, vals){ return R(prop, 'col', function(r, c){ return vals[c]; }, { vals: vals }); }\nfunction latin(prop, vals, other){ return R(prop, 'latin', function(r, c){ return vals[other ? (r + 2 * c) % 3 : (r + c) % 3]; }); }\nfunction diag(prop, vals){ return R(prop, 'diag', function(r, c){ return vals[(r - c + 3) % 3]; }); }\nfunction across(prop, starts, step){ return R(prop, 'across', function(r, c){ return starts[r] + step * c; }, { step: step }); }\nfunction down(prop, starts, step){ return R(prop, 'down', function(r, c){ return starts[c] + step * r; }, { step: step }); }\nfunction addAcross(prop, pairs){ return R(prop, 'add', function(r, c){ return c < 2 ? pairs[r][c] : pairs[r][0] + pairs[r][1]; }); }\nfunction addDown(prop, pairs){ return R(prop, 'adddown', function(r, c){ return r < 2 ? pairs[c][r] : pairs[c][0] + pairs[c][1]; }); }\nfunction ends(prop, pair){ return R(prop, 'ends', function(r, c){ return pair[c === 1 ? 1 : 0]; }); }\nfunction overlay(rows){\n  return R('ov', 'overlay', function(r, c){\n    var w = rows[r];\n    return c === 0 ? w.a + '|' + w.fa : c === 1 ? w.b + '|' + w.fb : [w.a, w.fa, w.b, w.fb].join('|');\n  }, { rows: rows });\n}\n\n/* the child's words: at most six words a line, every rule gets one, things kept together share a line */\nvar NAME = { shape: 'shape', sides: 'shape', fill: 'shading', shade: 'shading', size: 'size', rot: 'direction', flip: 'flip', dots: 'dot count', copies: 'number of shapes', pos: 'place' };\nfunction sayChange(ru){\n  var n = Math.abs(ru.step), up = ru.step > 0, where = ru.kind === 'down' ? ' down each column' : ' across each row';\n  switch (ru.prop){\n    case 'dots': return (n === 1 ? (up ? 'One more dot' : 'One dot fewer') : (up ? 'Two more dots' : 'Two dots fewer')) + where;\n    case 'shade': return (up ? 'Darker' : 'Lighter') + ' shading' + where;\n    case 'size': return (up ? 'Bigger' : 'Smaller') + ' shape' + where;\n    case 'sides': return (up ? 'One more side' : 'One side fewer') + where;\n    case 'rot': return 'Quarter turn ' + (up ? 'clockwise' : 'anticlockwise') + where;\n    case 'copies': return (up ? 'One more copy' : 'One copy fewer') + where;\n    case 'pos': return 'Moves one ' + (n === 2 ? 'corner' : 'place') + ' ' + (up ? 'clockwise' : 'anticlockwise') + ' each step';\n  }\n  return 'The ' + NAME[ru.prop] + ' changes' + where;\n}\nfunction ruleLines(rules){\n  var out = [], rowK = [], colK = [];\n  rules.forEach(function(ru){\n    switch (ru.kind){\n      case 'row': rowK.push(ru); break;\n      case 'col': colK.push(ru); break;\n      case 'across': case 'down': out.push(sayChange(ru)); break;\n      case 'latin': out.push('Each row has every ' + NAME[ru.prop] + ' once'); break;\n      case 'diag': out.push('Each row shifts the shapes right'); break;\n      case 'add': out.push('Add the first two dot counts'); break;\n      case 'adddown': out.push('Add the top two dot counts'); break;\n      case 'ends': out.push('Row ends share the same ' + NAME[ru.prop]); break;\n      case 'overlay': out.push('The first two make the third'); break;\n    }\n  });\n  function keeps(list, rows){\n    if (!list.length) return;\n    if (list.length === 1 && list[0].prop === 'flip'){ out.push('Middle column shapes are flipped'); return; }\n    var names = list.map(function(ru){ return NAME[ru.prop]; });\n    out.push(list.length === 1 ? 'Same ' + names[0] + (rows ? ' along each row' : ' down each column')\n      : (rows ? 'Rows keep ' : 'Columns keep ') + names.join(' and '));\n  }\n  keeps(rowK, true);\n  keeps(colK, false);\n  return out;\n}\nfunction teachOf(rules){\n  return rules.map(function(ru){ return { dir: /^(col|down|adddown)$/.test(ru.kind) ? 'col' : 'row', kind: ru.kind, prop: ru.prop }; });\n}\n\n/* ---- grids ---- */\nfunction specFrom(p, k){\n  var s = E.baseSpec(), key;\n  for (key in p.base) s[key] = p.base[key];\n  for (var i = 0; i < p.rules.length; i++) PROP[p.rules[i].prop].set(s, k[p.rules[i].prop]);\n  return s;\n}\nfunction makeGrid(p){\n  var codes = [], cells = [];\n  for (var r = 0; r < 3; r++) for (var c = 0; c < 3; c++){\n    var k = {};\n    for (var i = 0; i < p.rules.length; i++){\n      var ru = p.rules[i], v = ru.at(r, c), P = PROP[ru.prop];\n      if (P.mod) v = ((v % P.mod) + P.mod) % P.mod;\n      k[ru.prop] = v;\n    }\n    codes.push(k);\n    cells.push(specFrom(p, k));\n  }\n  return { codes: codes, cells: cells };\n}\n\n/* ---- near misses ---- */\nfunction ovWrongs(ru, b, v){\n  var rows = ru.rows, br = Math.floor(b / 3), bc = b % 3, w = rows[br], o1 = rows[(br + 1) % 3], o2 = rows[(br + 2) % 3], out = [];\n  function other(f){ return f === 'white' ? 'grey' : 'white'; }\n  function put(x){ if (x !== v && out.indexOf(x) < 0) out.push(x); }\n  if (bc === 2){\n    put([w.a, w.fa, o1.b, o1.fb].join('|'));\n    put([o2.a, o2.fa, w.b, w.fb].join('|'));\n    put([w.a, other(w.fa), w.b, w.fb].join('|'));\n    put([w.a, w.fa, w.b, other(w.fb)].join('|'));\n    put(w.a + '|' + w.fa);\n    put(w.b + '|' + w.fb);\n  } else {\n    var s = bc === 0 ? w.a : w.b, f = bc === 0 ? w.fa : w.fb;\n    put(s + '|' + other(f));\n    put(bc === 0 ? w.b + '|' + w.fb : w.a + '|' + w.fa);\n    put((bc === 0 ? o1.a : o1.b) + '|' + f);\n    put((bc === 0 ? o2.a : o2.b) + '|' + other(f));\n    put([w.a, w.fa, w.b, w.fb].join('|'));\n  }\n  return out;\n}\n/* plausible wrong codes for one rule at the gap: codes the grid uses, and one step either side */\nfunction wrongs(ru, codes, b, v){\n  if (ru.prop === 'ov') return ovWrongs(ru, b, v);\n  var P = PROP[ru.prop], out = [];\n  function put(x){\n    if (P.mod) x = ((x % P.mod) + P.mod) % P.mod;\n    if (x === v || out.indexOf(x) >= 0) return;\n    if (P.lo != null && (x < P.lo || x > P.hi)) return;\n    if (ru.only && ru.only.indexOf(x) < 0) return;\n    out.push(x);\n  }\n  for (var i = 0; i < 9; i++) if (i !== b) put(codes[i][ru.prop]);\n  if (P.mod || P.lo != null){ var st = Math.abs(ru.step || P.unit || 1); put(v + st); put(v - st); }\n  return out;\n}\nfunction candidates(p, g, b){\n  var v = g.codes[b], out = [], seen = {}, i, j;\n  seen[E.ser(g.cells[b])] = 1;\n  function put(k, tag){\n    var s = specFrom(p, k), key = E.ser(s);\n    if (seen[key]) return;\n    seen[key] = 1;\n    out.push({ spec: s, codes: k, tag: tag, ser: key });\n  }\n  var W = p.rules.map(function(ru){ return wrongs(ru, g.codes, b, v[ru.prop]); });\n  for (i = 0; i < p.rules.length; i++){\n    W[i].forEach(function(w){ var k = deep(v); k[p.rules[i].prop] = w; put(k, 'wrong ' + p.rules[i].prop); });\n  }\n  for (i = 0; i < p.rules.length; i++) for (j = i + 1; j < p.rules.length; j++){\n    W[i].forEach(function(wi){ W[j].forEach(function(wj){\n      var k = deep(v); k[p.rules[i].prop] = wi; k[p.rules[j].prop] = wj; put(k, 'wrong ' + p.rules[i].prop + ' and ' + p.rules[j].prop);\n    }); });\n  }\n  var br = Math.floor(b / 3), bc = b % 3;\n  for (var t = 0; t < 9; t++) if (t !== b && (Math.floor(t / 3) === br || t % 3 === bc)) put(deep(g.codes[t]), 'neighbour');\n  return out;\n}\n\n/* ---- four wrong options that leave no shortcut ---- */\nfunction fieldsOf(s){ return E.ser(s).split('|').slice(0, 11); }\nfunction chooseSets(p, g, b, pool, id){\n  var cells = g.cells, aCodes = g.codes[b], vis = [], visSer = {}, i;\n  for (i = 0; i < 9; i++) if (i !== b){ vis.push(fieldsOf(cells[i])); visSer[E.ser(cells[i])] = 1; }\n  var aSvg = E.cellSVG(cells[b]), aF = fieldsOf(cells[b]);\n  pool = pool.filter(function(c){\n    c.svg = E.cellSVG(c.spec); c.f = fieldsOf(c.spec); c.inGrid = !!visSer[c.ser];\n    /* every feature on this card is drawn somewhere in the grid: it survives \"cross out copies and anything new\" */\n    c.seenOnly = c.f.every(function(val, jj){ for (var a = 0; a < vis.length; a++) if (vis[a][jj] === val) return true; return false; });\n    return c.svg !== aSvg;\n  });\n  if (pool.length < 4){ why(id + ': fewer than 4 near misses'); return []; }\n  var sets = [], safe = 0;\n  for (var t = 0; t < 700 && safe < 4; t++){\n    var set = pickN(pool, 4), svgs = {}, dup = false, inGrid = 0;\n    svgs[aSvg] = 1;\n    for (i = 0; i < 4; i++){ if (svgs[set[i].svg]) dup = true; svgs[set[i].svg] = 1; if (set[i].inGrid) inGrid++; }\n    if (dup || inGrid > 1) continue;\n    /* every rule must be broken by at least one card, or that rule is never tested */\n    var untested = p.rules.some(function(ru){ return !set.some(function(c){ return c.codes[ru.prop] !== aCodes[ru.prop]; }); });\n    if (untested) continue;\n    /* and each rule's right value must be on a wrong card too, so the answer is never the only card showing it */\n    var alone = p.rules.some(function(ru){ return !set.some(function(c){ return c.codes[ru.prop] === aCodes[ru.prop]; }); });\n    if (alone) continue;\n    var F = [aF].concat(set.map(function(c){ return c.f; }));\n    /* no card may carry something drawn nowhere else (it would mark itself out) */\n    var lone = F.some(function(f, k){\n      return f.some(function(val, jj){\n        for (var a = 0; a < vis.length; a++) if (vis[a][jj] === val) return false;\n        for (var m = 0; m < F.length; m++) if (m !== k && F[m][jj] === val) return false;\n        return true;\n      });\n    });\n    if (lone) continue;\n    /* the answer must not be the one card most like the other four, or the one least like them; sets where it sits\n       strictly between the most and least typical cards are used first */\n    var score = F.map(function(f, k){\n      var n = 0;\n      for (var jj = 0; jj < f.length; jj++) for (var m = 0; m < F.length; m++) if (m !== k && F[m][jj] === f[jj]) n++;\n      return n;\n    });\n    var hi = Math.max.apply(null, score), lo = Math.min.apply(null, score);\n    var nHi = score.filter(function(x){ return x === hi; }).length, nLo = score.filter(function(x){ return x === lo; }).length;\n    if ((score[0] === hi && nHi === 1) || (score[0] === lo && nLo === 1)) continue;\n    /* what guessing pays: tied for most typical wins 1 in nHi, tied for least typical (a rarer habit) half that */\n    set.risk = (score[0] === hi ? 1 / nHi : 0) + (score[0] === lo ? 0.5 / nLo : 0);\n    set.keep = 0;\n    for (i = 0; i < 4; i++) if (!set[i].inGrid && set[i].seenOnly) set.keep++;\n    /* three believable new cards are plenty; past that, one copied neighbour (the classic trap) is worth more */\n    set.keep = Math.min(set.keep, 3) + (inGrid === 1 ? 0.6 : 0);\n    if (!set.risk) safe++;\n    if (sets.length < 14) sets.push(set);\n  }\n  /* lowest guessing pay-off first, then the most believable new cards, so crossing out copies and odd features\n     leaves the most to think about */\n  sets.sort(function(x, y){ return (x.risk - y.risk) || (y.keep - x.keep); });\n  if (!sets.length) why(id + ': no option set passed the shortcut tests');\n  return sets;\n}\n\n/* ---- the gap visits every cell and the answer every letter, one bag per level ---- */\nvar BAG = {};\nfunction fromBag(key, n){ if (!BAG[key] || !BAG[key].length) BAG[key] = shuffled(range(n)); return BAG[key].pop(); }\nfunction pickWeighted(list){\n  var total = 0, i;\n  for (i = 0; i < list.length; i++) total += list[i].w;\n  var x = Math.random() * total;\n  for (i = 0; i < list.length; i++){ x -= list[i].w; if (x < 0) return list[i]; }\n  return list[list.length - 1];\n}\n\n/* ---- rule helpers ---- */\nfunction same3(v){ return [v, v, v]; }\n/* three start codes whose two further steps stay in range: all different when there is room, never all the same */\nfunction starts3(lo, hi, st){\n  var ok = [], v;\n  for (v = lo; v <= hi; v++) if (v + 2 * st >= lo && v + 2 * st <= hi) ok.push(v);\n  if (ok.length >= 3) return pickN(ok, 3);\n  var out;\n  do { out = [pick(ok), pick(ok), pick(ok)]; } while (out[0] === out[1] && out[1] === out[2]);\n  return out;\n}\nfunction addPairs(){ var out = []; for (var r = 0; r < 3; r++){ var a = 1 + ri(3), b = 1 + ri(Math.min(3, 5 - a)); out.push([a, b]); } return out; }\nfunction ovRows(){\n  var sh = unlike(OVERLAYS, 6);\n  /* one white and one grey in every picture, so two bare outlines never sit on top of each other */\n  return sh && [0, 1, 2].map(function(r){ var f = shuffled(LIGHT); return { a: sh[2 * r], b: sh[2 * r + 1], fa: f[0], fb: f[1] }; });\n}\n\n/* ---- question families: w = share of the level (from the GPT spec), make() = rules and fixed properties ---- */\nvar FAMILIES = {\n  1: [\n    /* axis progression, 45 */\n    { id: 'dots across', w: 25, make: function(){ var sh = unlike(PLAIN, 3), st = pick([1, 1, -1]);\n      return sh && { rules: [rowKeep('shape', sh), across('dots', starts3(1, 5, st), st)], base: { fill: pick(LIGHT) } }; } },\n    { id: 'dots across, row size', w: 10, make: function(){ var st = pick([1, 1, -1]);\n      return { rules: [rowKeep('size', shuffled([0, 1, 2])), across('dots', starts3(1, 5, st), st)], base: { shape: pick(PLAIN), fill: pick(SHADES) } }; } },\n    { id: 'sides across', w: 10, make: function(){\n      return { rules: [rowKeep('fill', shuffled(SHADES)), across('sides', starts3(3, 6, 1), 1)] }; } },\n    /* turn sequence, 25 */\n    { id: 'turn across', w: 25, make: function(){ var sh = unlike(TURNY, 3);\n      return sh && { rules: [rowKeep('shape', sh), across('rot', pickN(ANG, 3), pick([90, -90]))], base: { fill: pick(LIGHT) } }; } },\n    /* movement, 30 */\n    { id: 'move across', w: 30, make: function(){ var sh = unlike(SMALL, 3);\n      return sh && { rules: [rowKeep('shape', sh), across('pos', pickN(CORNERS, 3), pick([2, -2]))], base: { fill: pick(['black', 'grey']) } }; } }\n  ],\n  2: [\n    /* two-axis sequence, 30 */\n    { id: 'dots across, darker down', w: 10, make: function(){ var st = pick([1, -1]);\n      return { rules: [across('dots', starts3(1, 5, st), st), down('shade', same3(0), 1)], base: { shape: pick(PLAIN) } }; } },\n    { id: 'sides across, bigger down', w: 10, make: function(){\n      return { rules: [across('sides', starts3(3, 6, 1), 1), down('size', same3(0), 1)], base: { fill: pick(SHADES) } }; } },\n    { id: 'turn across, dots down', w: 10, make: function(){\n      return { rules: [across('rot', pickN(ANG, 3), pick([90, -90])), down('dots', starts3(1, 5, 1), 1)], base: { shape: pick(TURNY), fill: pick(LIGHT) } }; } },\n    /* adding plus a column rule, 25 */\n    { id: 'add, turn by column', w: 13, make: function(){ var sh = unlike(TURNY, 3);\n      return sh && { rules: [addAcross('dots', addPairs()), colKeep('rot', pickN(ANG, 3)), rowKeep('shape', sh)], base: { fill: pick(LIGHT) } }; } },\n    { id: 'add down, row shading', w: 12, make: function(){\n      return { rules: [addDown('dots', addPairs()), rowKeep('fill', shuffled(SHADES))], base: { shape: pick(PLAIN) } }; } },\n    /* movement or mirror plus a count, 20 */\n    { id: 'move across, dots down', w: 10, make: function(){\n      return { rules: [across('pos', pickN(CORNERS, 3), pick([2, -2])), down('dots', starts3(1, 5, 1), 1)], base: { shape: pick(SMALL), fill: pick(['black', 'grey']) } }; } },\n    { id: 'middle flipped, dots across', w: 10, make: function(){ var sh = unlike(CHIRALS, 3);\n      return sh && { rules: [colKeep('flip', [0, 1, 0]), across('dots', starts3(1, 5, 1), 1), rowKeep('shape', sh)], base: { fill: pick(LIGHT) } }; } },\n    /* overlay plus one more rule, 15 */\n    { id: 'first two together, dots down', w: 15, make: function(){ var rows = ovRows();\n      return rows && { rules: [overlay(rows), down('dots', starts3(1, 5, 1), 1)] }; } },\n    /* distribution, 10 */\n    { id: 'each shape once, dots across', w: 10, make: function(){ var sh = unlike(PLAIN, 3), st = pick([1, -1]);\n      return sh && { rules: [latin('shape', sh), across('dots', starts3(1, 5, st), st)], base: { fill: pick(FILLS[2]) } }; } }\n  ],\n  3: [\n    /* three properties: progression, Latin, diagonal, 30 */\n    { id: 'each shape and shading once, dots down', w: 10, make: function(){ var sh = unlike(PLAIN, 3);\n      return sh && { rules: [latin('shape', sh), latin('fill', pickN(FILLS[3], 3), true), down('dots', starts3(1, 5, 1), 1)] }; } },\n    { id: 'sides across, bigger down, row ends', w: 10, make: function(){\n      return { rules: [across('sides', starts3(3, 6, 1), 1), down('size', same3(0), 1), ends('fill', pickN(SHADES, 2))] }; } },\n    { id: 'diagonal shape, row shading, dots across', w: 10, make: function(){ var sh = unlike(PLAIN, 3), st = pick([1, -1]);\n      return sh && { rules: [diag('shape', sh), rowKeep('fill', pickN(FILLS[3], 3)), across('dots', starts3(1, 5, st), st)] }; } },\n    /* adding plus two rules, 25 */\n    { id: 'add, turn down, each shading once', w: 13, make: function(){\n      return { rules: [addAcross('dots', addPairs()), down('rot', pickN(ANG, 3), pick([90, -90])), latin('fill', pickN(FILLS[3], 3))], base: { shape: pick(TURNY) } }; } },\n    { id: 'add down, darker across, each shape once', w: 12, make: function(){ var sh = unlike(PLAIN, 3);\n      return sh && { rules: [addDown('dots', addPairs()), across('shade', same3(0), 1), latin('shape', sh)] }; } },\n    /* movement or turning plus two rules, 20 */\n    { id: 'move across, each shading once, dots down', w: 10, make: function(){\n      var st = pick([2, -2, 1, -1]);\n      return { rules: [across('pos', pickN(Math.abs(st) === 2 ? CORNERS : SPOTS, 3), st), latin('fill', shuffled(SHADES)), down('dots', starts3(1, 5, 1), 1)], base: { shape: pick(SMALL) } }; } },\n    { id: 'turn across, row ends, dots down', w: 10, make: function(){\n      return { rules: [across('rot', pickN(ANG, 3), pick([90, -90])), ends('fill', pickN(FILLS[3], 2)), down('dots', starts3(1, 5, 1), 1)], base: { shape: pick(TURNY) } }; } },\n    /* overlay plus two rules, 15 */\n    { id: 'first two together, dots down, row size', w: 15, make: function(){ var rows = ovRows();\n      return rows && { rules: [overlay(rows), down('dots', starts3(1, 5, 1), 1), rowKeep('size', shuffled([1, 2, pick([1, 2])]), [1, 2])] }; } },\n    /* copies and counting, 10 */\n    { id: 'more shapes across, each shading once, row shape', w: 10, make: function(){ var sh = unlike(PLAIN, 3), st = pick([1, -1]);\n      return sh && { rules: [across('copies', starts3(1, 4, st), st), latin('fill', shuffled(SHADES)), rowKeep('shape', sh)] }; } }\n  ]\n};\n\nfunction assemble(p, g, b, set, letter){\n  var wrong = shuffled(set), opts = [], k = 0;\n  for (var i = 0; i < 5; i++){\n    if (i === letter) opts.push({ spec: deep(g.cells[b]), tag: 'answer' });\n    else { opts.push({ spec: deep(wrong[k].spec), tag: wrong[k].tag }); k++; }\n  }\n  return {\n    type: 'matrix',\n    prompt: { kind: 'matrix', cells: g.cells.map(deep), missing: b },\n    options: opts.map(function(o){ return o.spec; }),\n    correct: letter,\n    explain: ruleLines(p.rules).join('. ') + '.',\n    teach: teachOf(p.rules),\n    decoyKinds: opts.map(function(o){ return o.tag; }),\n    ruleKey: p.key\n  };\n}\n\nfunction genMatrix(diff){\n  var L = diff <= 1 ? 1 : diff === 2 ? 2 : 3;\n  var b = fromBag('gap' + L, 9), letter = fromBag('letter' + L, 5);\n  for (var tries = 0; tries < 16; tries++){\n    var fam = pickWeighted(FAMILIES[L]), made = fam.make();\n    if (!made){ why(fam.id + ': no plan'); continue; }\n    var p = { key: fam.id, rules: made.rules, base: made.base || {} };\n    var g = makeGrid(p), ans = E.cellSVG(g.cells[b]), copied = false;\n    for (var i = 0; i < 9 && !copied; i++) if (i !== b && E.cellSVG(g.cells[i]) === ans) copied = true;\n    if (copied){ why(fam.id + ': answer already drawn in the grid'); continue; }\n    var sets = chooseSets(p, g, b, candidates(p, g, b), fam.id);\n    for (var s = 0; s < sets.length; s++){\n      var q = assemble(p, g, b, sets[s], letter);\n      var res = MX.check(q);\n      if (res.ok) return q;\n      why(fam.id + ': ' + res.why);\n    }\n  }\n  return null;\n}\n\nE.TYPES.matrix.gen = genMatrix;\nE.mx = MX;\nE.matrix = { genMatrix: genMatrix, WHY: WHY, FAMILIES: FAMILIES, ruleLines: ruleLines, check: MX.check };\n})(window.SSEngine);\n\n})();\n\n/* ===== QUESTION QUALITY (2026-10-04) =====\n   From the GPT review (vocab-features-port/gpt-review/PLAN.md) and its shortcut audit. Appended to the engine by\n   extract_engine.py after hidden.js and matrix.js, like them it works on the engine's exports only: each wrapped\n   generator is called as before, then its question is checked (and for codes, its options rebuilt), and a question\n   that fails a check is thrown away and made again. Nothing here edits a generator in place.\n   Checks, by PLAN item:\n     1  odd one out: no child-visible feature may single out a card other than the answer\n     2  codes: the answer's letter is never the majority in any slot; letter sets drawn fresh per question\n     4  sequences, analogies, complete the set, most like: the \"most typical card\" is not the answer\n     5  complete the set, most like: no wrong card matches every feature the examples share\n     6  nets faces drawn white with navy symbols\n     8  shapes that move round the box drawn over the box's nine spots\n     7  the heptagon only where it reads (never small, never beside an octagon); 45 degree turns only on shapes that\n        read the same\n   tests/shortcut-audit.mjs measures every one of these. */\n(function(E){\n'use strict';\nif (!E || !E.TYPES) return;\nvar CURVED = ['circle', 'semicircle', 'quarter', 'crescent', 'ellipse', 'ring'];\nvar CHIRAL = ['lshape', 'rtriangle', 'parallelogram', 'zshape'];\n/* a turn of 45 degrees keeps these readable as the same shape (PLAN 7); everything else turns in quarters */\nvar ALLOW45 = ['arrow', 'tshape', 'kite', 'trapezium', 'semicircle', 'crescent'];\nfunction rnd(n){ return Math.floor(Math.random() * n); }\nfunction shuffle(a){ for (var i = a.length - 1; i > 0; i--){ var j = rnd(i + 1), t = a[i]; a[i] = a[j]; a[j] = t; } return a; }\nfunction isSpec(s){ return !!(s && typeof s === 'object' && typeof s.shape === 'string'); }\n/* every shape spec a question draws: prompt cells, the test shape, spec options */\nfunction specsIn(q){\n  var out = [], P = q.prompt || {};\n  (P.cells || []).forEach(function(c){ if (isSpec(c)) out.push(c); });\n  if (isSpec(P.test)) out.push(P.test);\n  (q.options || []).forEach(function(o){ if (isSpec(o)) out.push(o); });\n  return out;\n}\n/* what a child can read off one card: the raw properties and the presence features */\nfunction feats(s){\n  var f = E.ser(s).split('|'), sides = E.SIDES[s.shape];\n  return {\n    shape: f[0], fill: f[1], size: f[2], rot: f[3], dots: f[4], lines: f[5], pos: f[6], stroke: f[7], flip: f[8], copies: f[9], pair: f[10], inner: f.slice(11).join('|'),\n    hasDots: (s.dots || 0) > 0 ? 'y' : 'n', hasLines: (s.lines || 0) > 0 ? 'y' : 'n', curved: CURVED.indexOf(s.shape) >= 0 ? 'y' : 'n',\n    hasInner: s.inner ? 'y' : 'n', dark: s.fill === 'black' ? 'y' : 'n', patterned: /hatch|dot|cross|stripe|checker/.test(s.fill) ? 'y' : 'n',\n    symmetric: CHIRAL.indexOf(s.shape) >= 0 ? 'n' : 'y', parity: sides ? (sides % 2 ? 'odd' : 'even') : '-'\n  };\n}\nvar KEYS = ['shape', 'fill', 'size', 'rot', 'dots', 'lines', 'pos', 'stroke', 'flip', 'copies', 'pair', 'inner', 'hasDots', 'hasLines', 'curved', 'hasInner', 'dark', 'patterned', 'symmetric', 'parity'];\n/* features on which exactly one card differs and the other four agree: [feature, card] */\nfunction loneSplits(F){\n  var out = [];\n  KEYS.forEach(function(k){\n    var c = {};\n    F.forEach(function(f){ c[f[k]] = (c[f[k]] || 0) + 1; });\n    var ks = Object.keys(c);\n    if (ks.length === 2 && (c[ks[0]] === 1 || c[ks[1]] === 1)){ var v = c[ks[0]] === 1 ? ks[0] : ks[1]; out.push([k, F.map(function(f){ return f[k]; }).indexOf(v)]); }\n  });\n  return out;\n}\nfunction mode(vals){ var c = {}, best = null, n = 0, tie = false; vals.forEach(function(v){ c[v] = (c[v] || 0) + 1; }); for (var k in c){ if (c[k] > n){ best = k; n = c[k]; tie = false; } else if (c[k] === n) tie = true; } return tie ? null : best; }\n/* the card that holds the majority value on the most features (one card, or -1 for a tie) */\nfunction typical(F){\n  var score = F.map(function(){ return 0; });\n  KEYS.forEach(function(k){ var m = mode(F.map(function(f){ return f[k]; })); if (m == null) return; F.forEach(function(f, i){ if (f[k] === m) score[i]++; }); });\n  var top = Math.max.apply(null, score), w = [];\n  score.forEach(function(s, i){ if (s === top) w.push(i); });\n  return w.length === 1 ? w[0] : -1;\n}\n/* PLAN 7: the shape vocabulary every wrapped type may draw. The heptagon was read as an octagon when drawn small or\n   next to one. Banning it outright would delete whole rules (every five-step side count passes through seven, and\n   \"even number of sides\" needs four odd-sided shapes), so it stays only where it can be read: medium or large, not\n   as small copies, an inner shape or an overlay, and never in the same question as an octagon. */\nfunction heptOk(q){\n  var all = specsIn(q), has = function(n){ return all.some(function(s){ return s.shape === n || (s.inner && s.inner.shape === n) || (s.pair && s.pair.shape2 === n); }); };\n  if (!has('heptagon')) return true;\n  if (has('octagon')) return false;\n  return all.every(function(s){\n    if ((s.inner && s.inner.shape === 'heptagon') || (s.pair && s.pair.shape2 === 'heptagon')) return false;\n    return s.shape !== 'heptagon' || ((s.size === 'm' || s.size === 'l') && !(s.copies >= 2) && !(s.pos && s.pos !== 'c'));\n  });\n}\nfunction vocabOk(q){\n  if (!heptOk(q)) return false;\n  return specsIn(q).every(function(s){\n    var r = (((s.rot || 0) % 360) + 360) % 360;\n    return r % 90 === 0 || ALLOW45.indexOf(s.shape) >= 0;\n  });\n}\n/* PLAN 1: the answer is the only card any feature singles out */\nfunction oddOk(q){\n  return loneSplits(q.options.map(feats)).every(function(x){ return x[1] === q.correct; });\n}\n/* PLAN 4: picking the card that looks most like the others does not find the answer */\nfunction notTypical(q){ return typical(q.options.map(feats)) !== q.correct; }\n/* PLAN 5: no wrong card matches every feature the examples all share (presence features included) */\nfunction noFalseTrail(q){\n  var R = q.prompt.cells.map(feats), F = q.options.map(feats);\n  var shared = KEYS.filter(function(k){ return R.every(function(f){ return f[k] === R[0][k]; }); });\n  return F.every(function(f, i){ return i === q.correct || !shared.every(function(k){ return f[k] === R[0][k]; }); });\n}\n/* PLAN 2: codes. The five codes are rebuilt so that in every slot the answer's letter is never the strict majority\n   (it was the per-slot vote in every Level 2 and 3 question), every distractor letter is one the examples use, and\n   the closest such set to the answer is kept so the distractors stay near misses. Then each slot's letters are\n   swapped for a fresh random set, so slot 1 is no longer always A, B or C. The answer, the examples and what each\n   letter means are unchanged: only which letters spell it. */\nvar LETTERS = 'ABCDEFGHJKLMNPRSTUVWXYZ';\nfunction rebuildCodes(q){\n  var P = q.prompt, ans = String(q.options[q.correct]), L = ans.length, refs = P.codes.map(String), k, i;\n  if (refs.some(function(c){ return c.length !== L; })) return null;\n  var slot = [];\n  for (k = 0; k < L; k++){ var u = {}; refs.forEach(function(c){ u[c[k]] = 1; }); if (!u[ans[k]]) return null; slot.push(Object.keys(u)); }\n  var best = null, bestD = 1e9;\n  for (var t = 0; t < 400; t++){\n    var set = {}, codes = [];\n    set[ans] = 1;\n    for (i = 0; i < 4; i++){\n      var c = '', tries = 0;\n      do { c = ''; for (k = 0; k < L; k++) c += slot[k][rnd(slot[k].length)]; } while (set[c] && ++tries < 30);\n      if (set[c]) break;\n      set[c] = 1; codes.push(c);\n    }\n    if (codes.length < 4) continue;\n    var all = codes.concat([ans]), ok = true;\n    for (k = 0; k < L && ok; k++){ var m = mode(all.map(function(x){ return x[k]; })); if (m === ans[k]) ok = false; }\n    if (!ok) continue;\n    var d = 0;\n    codes.forEach(function(x){ for (k = 0; k < L; k++) if (x[k] !== ans[k]) d++; });\n    if (d < bestD){ best = codes; bestD = d; }\n  }\n  if (!best) return null;\n  /* fresh letters for each slot, never shared between slots */\n  var pool = shuffle(LETTERS.split('')), map = [];\n  for (k = 0; k < L; k++){ var mk = {}; slot[k].forEach(function(l){ mk[l] = pool.pop(); }); map.push(mk); }\n  var spell = function(c){ var o = ''; for (var j = 0; j < L; j++) o += map[j][c[j]]; return o; };\n  var opts = best.slice(), out = [];\n  for (i = 0; i < 5; i++) out.push(i === q.correct ? spell(ans) : spell(opts.shift()));\n  q.options = out;\n  P.codes = refs.map(spell);\n  return q;\n}\n/* each wrapped generator: make, (fix), check; a question that fails is made again, up to 30 times per call, so the\n   engine's own retry never falls back to another question type */\nfunction wrap(type, checks, fix){\n  var T = E.TYPES[type];\n  if (!T || !T.gen) return;\n  var orig = T.gen;\n  T.gen = function(diff){\n    for (var a = 0; a < 30; a++){\n      var q = null;\n      try { q = orig(diff); } catch (e) { q = null; }\n      if (q && fix) q = fix(q, diff);\n      if (q && q.type === type && checks.every(function(c){ return c(q, diff); })) return q;\n    }\n    return null;\n  };\n}\nwrap('odd', [vocabOk, oddOk]);\nwrap('codes', [vocabOk], rebuildCodes);\nwrap('series', [vocabOk, notTypical]);\nwrap('analogy', [vocabOk, notTypical]);\nwrap('like', [vocabOk, notTypical, noFalseTrail]);\nwrap('mostlike', [vocabOk, notTypical, noFalseTrail]);\n/* PLAN 6: nets faces in the exam style, white with navy symbols (the pastel colours were not exam style). Only the\n   drawn html changes: the generator's own logic, which uses the colours to keep faces distinct, is untouched */\nvar PASTEL = /fill='#(?:fdeccc|d8e9fd|d9f4e4|ffe3d1|e9e3fc|fbdfee)'/g;\nfunction whiteFaces(q){\n  if (q.prompt && typeof q.prompt.html === 'string') q.prompt.html = q.prompt.html.replace(PASTEL, \"fill='#ffffff'\");\n  (q.options || []).forEach(function(o){ if (o && typeof o.html === 'string') o.html = o.html.replace(PASTEL, \"fill='#ffffff'\"); });\n  return q;\n}\nwrap('nets', [], whiteFaces);\n/* PLAN 8: a shape that moves round the box gets the box's nine spots drawn faintly under it, so the move can be\n   judged. Only the drawing changes; the engine's own checks keep their own copy of cellSVG. */\nvar cell0 = E.cellSVG, SPOTS = [27, 50, 73];\nE.cellSVG = function(spec){\n  var svg = cell0(spec);\n  if (!spec || !spec.pos || spec.pos === 'c') return svg;\n  var g = '<g class=\"nvr-spots\" fill=\"#C6D4EA\">';\n  SPOTS.forEach(function(y){ SPOTS.forEach(function(x){ g += '<circle cx=\"' + x + '\" cy=\"' + y + '\" r=\"2.6\"></circle>'; }); });\n  return svg.replace(/^(<svg[^>]*>)/, '$1' + g + '</g>');\n};\nE.quality = { heptOk: heptOk, feats: feats, loneSplits: loneSplits, typical: typical, vocabOk: vocabOk, oddOk: oddOk, notTypical: notTypical, noFalseTrail: noFalseTrail, KEYS: KEYS };\n})(window.SSEngine);\n"],
  "mappings": "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",
  "names": ["d", "tries", "fs", "r", "c", "s", "clamp", "i", "o", "x", "k", "g", "f"]
}
