mons-rules 0.4.7 → 0.4.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- var Qi=Object.defineProperty;var i=(e,n)=>Qi(e,"name",{value:n,configurable:!0});var h=Object.freeze({White:"white",Black:"black"}),E=Object.freeze({Classic:"Classic",SwappedManaRows:"SwappedManaRows",OffsetArcManaRows:"OffsetArcManaRows",CenterSpokeManaRows:"CenterSpokeManaRows",AlternatingManaRows:"AlternatingManaRows",InnerWedgeManaRows:"InnerWedgeManaRows",OuterWedgeManaRows:"OuterWedgeManaRows",BentCenterManaRows:"BentCenterManaRows",OuterEdgeManaRows:"OuterEdgeManaRows",SplitFlankManaRows:"SplitFlankManaRows",ForwardBridgeManaRows:"ForwardBridgeManaRows",CornerChainManaRows:"CornerChainManaRows"}),M=Object.freeze({Demon:"demon",Drainer:"drainer",Angel:"angel",Spirit:"spirit",Mystic:"mystic"}),A=Object.freeze({Potion:"potion",Bomb:"bomb",BombOrPotion:"bomb-or-potion"}),X=Object.freeze({SelectPotion:"select-potion",SelectBomb:"select-bomb"});var jo=Object.freeze({[h.White]:0,[h.Black]:1});function He(e){return jo[e]}i(He,"colorId");var ze=Object.freeze({[M.Demon]:0,[M.Drainer]:1,[M.Angel]:2,[M.Spirit]:3,[M.Mystic]:4}),Oe=Object.freeze({MonMove:"mon-move",ManaMove:"mana-move",Action:"action",Potion:"potion"}),$o=Object.freeze({[X.SelectPotion]:0,[X.SelectBomb]:1}),O=Object.freeze({MonMove:"mon-move",ManaMove:"mana-move",MysticAction:"mystic-action",DemonAction:"demon-action",DemonAdditionalStep:"demon-additional-step",SpiritTargetCapture:"spirit-target-capture",SpiritTargetMove:"spirit-target-move",SelectConsumable:"select-consumable",BombAttack:"bomb-attack"}),Qn=4,Mn=Object.freeze({kind:"supermana"});function Sn(e){return e===h.Black?h.White:h.Black}i(Sn,"otherColor");function Vn(e,n,t){if(!Number.isInteger(t)||t<0||t>2)throw new RangeError("mon cooldown must be an integer from 0 through 2");return Object.freeze({kind:e,color:n,cooldown:t})}i(Vn,"createMon");function Go(e,n){return e.kind===n.kind&&e.color===n.color&&e.cooldown===n.cooldown}i(Go,"monEquals");function Ie(e){return e.cooldown>0}i(Ie,"isMonFainted");function Gr(e){return Vn(e.kind,e.color,2)}i(Gr,"faintMon");function Kr(e){return e.cooldown>0?Vn(e.kind,e.color,e.cooldown-1):Le(e)}i(Kr,"decreaseMonCooldown");function Yn(e){return Object.freeze({kind:"regular",color:e})}i(Yn,"regularMana");function Ur(e,n){return e.kind==="supermana"?n.kind==="supermana":n.kind==="regular"&&e.color===n.color}i(Ur,"manaEquals");function qo(e,n){return e||!n?2:1}i(qo,"manaScoreForOwnership");function jr(e,n){return qo(e.kind==="supermana",e.kind==="regular"&&e.color===n)}i(jr,"manaScore");function Fe(e){return Object.freeze({kind:"mon",mon:Le(e)})}i(Fe,"monItem");function Ze(e){return Object.freeze({kind:"mana",mana:Xn(e)})}i(Ze,"manaItem");function Zn(e,n){return Object.freeze({kind:"mon-with-mana",mon:Le(e),mana:Xn(n)})}i(Zn,"monWithManaItem");function pt(e,n){return Object.freeze({kind:"mon-with-consumable",mon:Le(e),consumable:n})}i(pt,"monWithConsumableItem");function bt(e){return Object.freeze({kind:"consumable",consumable:e})}i(bt,"consumableItem");function Le(e){return Object.isFrozen(e)?e:Vn(e.kind,e.color,e.cooldown)}i(Le,"immutableMon");function Xn(e){return e.kind==="supermana"?Mn:Object.isFrozen(e)?e:Yn(e.color)}i(Xn,"immutableMana");function Dn(e){switch(e.kind){case"mon":return Object.isFrozen(e)&&Object.isFrozen(e.mon)?e:Fe(e.mon);case"mana":return Object.isFrozen(e)&&Object.isFrozen(e.mana)?e:Ze(e.mana);case"mon-with-mana":return Object.isFrozen(e)&&Object.isFrozen(e.mon)&&Object.isFrozen(e.mana)?e:Zn(e.mon,e.mana);case"mon-with-consumable":return Object.isFrozen(e)&&Object.isFrozen(e.mon)?e:pt(e.mon,e.consumable);case"consumable":return Object.isFrozen(e)?e:bt(e.consumable)}}i(Dn,"immutableItem");function W(e){return{i:e.i,j:e.j}}i(W,"copyLocation");function Yi(e){switch(e.kind){case"takeback":return{kind:"takeback"};case"location":return{kind:"location",location:W(e.location)};case"modifier":return{kind:"modifier",modifier:e.modifier}}}i(Yi,"copyInput");function Jn(e){let n=Yi(e.input);return e.actorMonItem===void 0?{input:n,kind:e.kind}:{input:n,kind:e.kind,actorMonItem:Dn(e.actorMonItem)}}i(Jn,"copyNextInput");function Un(e){switch(e.kind){case"mon-move":return{kind:"mon-move",item:Dn(e.item),from:W(e.from),to:W(e.to)};case"mana-move":return{kind:"mana-move",mana:Xn(e.mana),from:W(e.from),to:W(e.to)};case"mana-scored":return{kind:"mana-scored",mana:Xn(e.mana),at:W(e.at)};case"mystic-action":return{kind:"mystic-action",mystic:Le(e.mystic),from:W(e.from),to:W(e.to)};case"demon-action":return{kind:"demon-action",demon:Le(e.demon),from:W(e.from),to:W(e.to)};case"demon-additional-step":return{kind:"demon-additional-step",demon:Le(e.demon),from:W(e.from),to:W(e.to)};case"spirit-target-move":return{kind:"spirit-target-move",item:Dn(e.item),from:W(e.from),to:W(e.to),by:W(e.by)};case"pickup-bomb":return{kind:"pickup-bomb",by:Le(e.by),at:W(e.at)};case"pickup-potion":return{kind:"pickup-potion",by:Dn(e.by),at:W(e.at)};case"use-potion":return{kind:"use-potion",from:W(e.from),to:W(e.to)};case"pickup-mana":return{kind:"pickup-mana",mana:Xn(e.mana),by:Le(e.by),at:W(e.at)};case"mon-fainted":return{kind:"mon-fainted",mon:Le(e.mon),from:W(e.from),to:W(e.to)};case"mana-dropped":return{kind:"mana-dropped",mana:Xn(e.mana),at:W(e.at)};case"supermana-back-to-base":return{kind:"supermana-back-to-base",from:W(e.from),to:W(e.to)};case"bomb-attack":return{kind:"bomb-attack",by:Le(e.by),from:W(e.from),to:W(e.to)};case"mon-awake":return{kind:"mon-awake",mon:Le(e.mon),at:W(e.at)};case"bomb-explosion":return{kind:"bomb-explosion",at:W(e.at)};case"next-turn":return{kind:"next-turn",color:e.color};case"game-over":return{kind:"game-over",winner:e.winner};case"takeback":return{kind:"takeback"}}}i(Un,"copyEvent");function Ho(e){switch(e.kind){case"invalid-input":return{kind:"invalid-input"};case"locations-to-start-from":return{kind:"locations-to-start-from",locations:e.locations.map(W)};case"next-input-options":return{kind:"next-input-options",nextInputs:e.nextInputs.map(Jn)};case"events":return{kind:"events",events:e.events.map(Un)}}}i(Ho,"copyOutput");function $(e){switch(e.kind){case"mon":case"mon-with-mana":case"mon-with-consumable":return e.mon;case"mana":case"consumable":return}}i($,"itemMon");function $r(e){let n=$(e);return n===void 0||!Ie(n)}i($r,"isSpiritTargetAllowed");function In(e){switch(e.kind){case"mana":case"mon-with-mana":return e.mana;case"mon":case"mon-with-consumable":case"consumable":return}}i(In,"itemMana");function zo(e){switch(e.kind){case"mon-with-consumable":case"consumable":return e.consumable;case"mon":case"mana":case"mon-with-mana":return}}i(zo,"itemConsumable");function qr(e,n){switch(e.kind){case"mon":return n.kind==="mon"&&Go(e.mon,n.mon);case"mana":return n.kind==="mana"&&Ur(e.mana,n.mana);case"mon-with-mana":return n.kind==="mon-with-mana"&&Go(e.mon,n.mon)&&Ur(e.mana,n.mana);case"mon-with-consumable":return n.kind==="mon-with-consumable"&&Go(e.mon,n.mon)&&e.consumable===n.consumable;case"consumable":return n.kind==="consumable"&&e.consumable===n.consumable}}i(qr,"itemEquals");function Ko(e){return`${e.kind}:${e.color}:${e.cooldown}`}i(Ko,"monKey");function Wr(e){return e.kind==="supermana"?"s":`r:${e.color}`}i(Wr,"manaKey");function Xt(e){switch(e.kind){case"mon":return`m:${Ko(e.mon)}`;case"mana":return`a:${Wr(e.mana)}`;case"mon-with-mana":return`mm:${Ko(e.mon)}:${Wr(e.mana)}`;case"mon-with-consumable":return`mc:${Ko(e.mon)}:${e.consumable}`;case"consumable":return`c:${e.consumable}`}}i(Xt,"itemKey");function Xo(e){switch(e.kind){case"takeback":return"t";case"location":return`l:${e.location.i}:${e.location.j}`;case"modifier":return`m:${e.modifier}`}}i(Xo,"inputKey");function Hr(e){return e.map(Xo).join(";")}i(Hr,"inputChainKey");function yt(e,n){switch(e.kind){case"takeback":return n.kind==="takeback";case"location":return n.kind==="location"&&e.location.i===n.location.i&&e.location.j===n.location.j;case"modifier":return n.kind==="modifier"&&e.modifier===n.modifier}}i(yt,"inputEquals");function B(e){return`${e.i},${e.j}`}i(B,"locationFen");var Qt=48,Zi=57,Ji=44,es=59,ns=108,ts=109,os=122,rs=112,as=98;function is(e){switch(e){case X.SelectPotion:return"p";case X.SelectBomb:return"b"}}i(is,"modifierFen");function ss(e){switch(e.kind){case"takeback":return"z";case"location":return`l${B(e.location)}`;case"modifier":return`m${is(e.modifier)}`}}i(ss,"inputFen");function zr(e,n,t){if(n>=t)return;let o=e.charCodeAt(n);if(!(o<Qt||o>Zi))return o===Qt+1&&n+1<t&&e.charCodeAt(n+1)===Qt?10:o-Qt}i(zr,"parseCoordinate");function Xr(e,n){return e+(n===10?2:1)}i(Xr,"coordinateEnd");function cs(e,n,t){let o=zr(e,n,t);if(o===void 0)return;let r=Xr(n,o);if(r>=t||e.charCodeAt(r)!==Ji)return;let a=r+1,s=zr(e,a,t);if(!(s===void 0||Xr(a,s)!==t))return{i:o,j:s}}i(cs,"parseLocation");function us(e,n,t){switch(e.charCodeAt(n)){case ns:{let o=cs(e,n+1,t);return o===void 0?void 0:{kind:"location",location:o}}case ts:return t!==n+2?void 0:e.charCodeAt(n+1)===rs?{kind:"modifier",modifier:X.SelectPotion}:e.charCodeAt(n+1)===as?{kind:"modifier",modifier:X.SelectBomb}:void 0;case os:return t===n+1?{kind:"takeback"}:void 0;default:return}}i(us,"parseInputFenRange");function et(e){return e.map(ss).join(";")}i(et,"inputArrayFen");function ht(e){if(typeof e!="string")throw new TypeError("input FEN must be a string");if(e==="")return[];let n=[],t=0;for(let o=0;o<=e.length;o+=1){if(o<e.length&&e.charCodeAt(o)!==es)continue;if(n.length===Qn)return;let r=us(e,t,o);if(r===void 0)return;n.push(r),t=o+1}return n}i(ht,"parseInputArrayFen");var Qr=Math.trunc(5.5),ls=10;function Z(e,n){return{i:e,j:n}}i(Z,"location");function kt(e,n){return e.i===n.i&&e.j===n.j}i(kt,"locationEquals");function un(e){return Number.isInteger(e.i)&&Number.isInteger(e.j)&&e.i>=0&&e.i<11&&e.j>=0&&e.j<11}i(un,"isValidLocation");function Wn(e){if(!un(e))throw new RangeError(`board location must use integer coordinates from 0 to ${ls}`)}i(Wn,"assertValidLocation");function oe(e){return Wn(e),e.i*11+e.j}i(oe,"locationIndex");function nt(e){if(!Number.isInteger(e)||e<0||e>=121)throw new RangeError("board location index must be an integer from 0 to 120");return Z(Math.trunc(e/11),e%11)}i(nt,"fromLocationIndex");function Yr(e,n){return Z(Math.trunc((e.i+n.i)/2),Math.trunc((e.j+n.j)/2))}i(Yr,"locationBetween");function Zr(e,n){return Math.max(Math.abs(n.i-e.i),Math.abs(n.j-e.j))}i(Zr,"locationDistance");function Jr(e,n){let t=[];for(let o=e.i-n;o<=e.i+n;o+=1)for(let r=e.j-n;r<=e.j+n;r+=1){let a=Z(o,r);un(a)&&!kt(a,e)&&t.push(a)}return t}i(Jr,"nearbyLocationsFor");function ea(e,n){let t=[];for(let[o,r]of n){let a=Z(e.i+o,e.j+r);un(a)&&t.push(a)}return t}i(ea,"directionalReachabilityFor");function ds(e){let n=[];for(let t=-2;t<=2;t+=1)for(let o=-2;o<=2;o+=1){if(Math.max(Math.abs(t),Math.abs(o))!==2)continue;let r=Z(e.i+t,e.j+o);un(r)&&n.push(r)}return n}i(ds,"spiritReachabilityFor");function Mt(e){return Object.freeze(Array.from({length:121},(n,t)=>Object.freeze(e(nt(t)).map(o=>Object.freeze(o)))))}i(Mt,"buildCache");var ms=Mt(e=>Jr(e,1)),fs=Mt(e=>Jr(e,3)),ps=Mt(e=>ea(e,[[-2,-2],[2,2],[-2,2],[2,-2]])),bs=Mt(e=>ea(e,[[-2,0],[2,0],[0,2],[0,-2]])),ys=Mt(ds);function St(e,n){return un(n)?e[oe(n)]??[]:[]}i(St,"cachedLocations");function Be(e){return St(ms,e)}i(Be,"nearbyLocations");function Yt(e){return St(fs,e)}i(Yt,"bombReachableLocations");function Zt(e){return St(ps,e)}i(Zt,"mysticReachableLocations");function Jt(e){return St(bs,e)}i(Jt,"demonReachableLocations");function eo(e){return St(ys,e)}i(eo,"spiritReachableLocations");var Qo=Object.freeze(Array.from({length:121},(e,n)=>Object.freeze(nt(n))));var na=Object.freeze({includeManaStartsWithPotionAction:!1}),Yo=Object.freeze({includeManaStartsWithPotionAction:!0});function xe(e,n,t){return t===void 0?{input:e,kind:n}:{input:e,kind:n,actorMonItem:t}}i(xe,"nextInput");function ta(e){let n=[],t;for(let o of e)o.kind!==t&&(n.push(o),t=o.kind);return n}i(ta,"firstOptionFromEachKindGroup");function Zo(e,n){return e!==void 0&&Zr(e,n)===1}i(Zo,"isLocationGuardedByAngelLocation");function oa(e,n,t,o){if(t!==void 0){for(let a of e)if(kt(a,t))return o(t)?[xe({kind:"location",location:t},n)]:[];return[]}let r=[];for(let a of e)o(a)&&r.push(xe({kind:"location",location:a},n));return r}i(oa,"nextInputsFromLocations");var It=new RangeError("fast workspace allocation failed");function At(e){return e===It}i(At,"isFastWorkspaceAllocationFailure");function Re(e){throw e instanceof RangeError?It:e}i(Re,"rethrowFastWorkspaceAllocation");var ln=E.Classic,Ae=5,ee=5,An=1,_e=1,Gn=Object.freeze([E.Classic,E.SwappedManaRows,E.OffsetArcManaRows,E.CenterSpokeManaRows,E.AlternatingManaRows,E.InnerWedgeManaRows,E.OuterWedgeManaRows,E.BentCenterManaRows,E.OuterEdgeManaRows,E.SplitFlankManaRows,E.ForwardBridgeManaRows,E.CornerChainManaRows]),ia=Object.freeze({[E.Classic]:0,[E.SwappedManaRows]:1,[E.OffsetArcManaRows]:2,[E.CenterSpokeManaRows]:3,[E.AlternatingManaRows]:4,[E.InnerWedgeManaRows]:5,[E.OuterWedgeManaRows]:6,[E.BentCenterManaRows]:7,[E.OuterEdgeManaRows]:8,[E.SplitFlankManaRows]:9,[E.ForwardBridgeManaRows]:10,[E.CornerChainManaRows]:11}),hs=new Map(Gn.map(e=>[ia[e],e]));function sa(e){return ia[e]}i(sa,"gameVariantId");function Q(...e){return Object.freeze(e.map(([n,t])=>Object.freeze(Z(n,t))))}i(Q,"locations");function De(e,n){return Object.freeze({[h.Black]:e,[h.White]:n})}i(De,"manaLayout");var ks=Object.freeze({[E.Classic]:De(Q([3,4],[3,6],[4,3],[4,5],[4,7]),Q([7,4],[7,6],[6,3],[6,5],[6,7])),[E.SwappedManaRows]:De(Q([3,3],[3,5],[3,7],[4,4],[4,6]),Q([7,3],[7,5],[7,7],[6,4],[6,6])),[E.OffsetArcManaRows]:De(Q([3,4],[3,6],[4,2],[4,5],[4,8]),Q([6,2],[6,5],[6,8],[7,4],[7,6])),[E.CenterSpokeManaRows]:De(Q([3,5],[4,2],[4,4],[4,6],[4,8]),Q([6,2],[6,4],[6,6],[6,8],[7,5])),[E.AlternatingManaRows]:De(Q([4,1],[4,3],[4,5],[4,7],[4,9]),Q([6,1],[6,3],[6,5],[6,7],[6,9])),[E.InnerWedgeManaRows]:De(Q([3,4],[3,6],[4,4],[4,5],[4,6]),Q([6,4],[6,5],[6,6],[7,4],[7,6])),[E.OuterWedgeManaRows]:De(Q([3,4],[3,5],[3,6],[4,3],[4,7]),Q([6,3],[6,7],[7,4],[7,5],[7,6])),[E.BentCenterManaRows]:De(Q([3,5],[4,4],[4,5],[4,6],[5,3]),Q([5,7],[6,4],[6,5],[6,6],[7,5])),[E.OuterEdgeManaRows]:De(Q([4,0],[4,1],[4,9],[4,10],[5,1]),Q([5,9],[6,0],[6,1],[6,9],[6,10])),[E.SplitFlankManaRows]:De(Q([3,4],[3,6],[4,2],[4,3],[5,2]),Q([5,8],[6,7],[6,8],[7,4],[7,6])),[E.ForwardBridgeManaRows]:De(Q([3,4],[3,6],[4,3],[4,5],[5,4]),Q([5,6],[6,5],[6,7],[7,4],[7,6])),[E.CornerChainManaRows]:De(Q([3,5],[3,6],[4,6],[4,7],[5,7]),Q([5,3],[6,3],[6,4],[7,4],[7,5]))}),ca=Object.freeze({kind:"regular"}),ra=Object.freeze({kind:"consumable-base"}),Ms=Object.freeze({kind:"supermana-base"}),Ct=Object.freeze(Z(5,5)),gt=Q([0,3],[0,4],[0,5],[0,6],[0,7],[10,3],[10,4],[10,5],[10,6],[10,7]);function ua(e){return Number.isSafeInteger(e)?hs.get(e):void 0}i(ua,"gameVariantFromId");function aa(e,n){return ks[e][n]}i(aa,"manaBaseLocations");function Ss(e){let n=Array.from({length:121}).fill(ca),t=i((o,r)=>{n[oe(o)]=Object.freeze(r)},"put");t(Z(0,0),{kind:"mana-pool",color:h.Black}),t(Z(0,10),{kind:"mana-pool",color:h.Black}),t(Z(10,0),{kind:"mana-pool",color:h.White}),t(Z(10,10),{kind:"mana-pool",color:h.White}),t(Z(0,3),{kind:"mon-base",monKind:M.Mystic,color:h.Black}),t(Z(0,4),{kind:"mon-base",monKind:M.Spirit,color:h.Black}),t(Z(0,5),{kind:"mon-base",monKind:M.Drainer,color:h.Black}),t(Z(0,6),{kind:"mon-base",monKind:M.Angel,color:h.Black}),t(Z(0,7),{kind:"mon-base",monKind:M.Demon,color:h.Black}),t(Z(10,3),{kind:"mon-base",monKind:M.Demon,color:h.White}),t(Z(10,4),{kind:"mon-base",monKind:M.Angel,color:h.White}),t(Z(10,5),{kind:"mon-base",monKind:M.Drainer,color:h.White}),t(Z(10,6),{kind:"mon-base",monKind:M.Spirit,color:h.White}),t(Z(10,7),{kind:"mon-base",monKind:M.Mystic,color:h.White});for(let o of aa(e,h.Black))t(o,{kind:"mana-base",color:h.Black});for(let o of aa(e,h.White))t(o,{kind:"mana-base",color:h.White});return t(Z(5,0),ra),t(Z(5,10),ra),t(Ct,Ms),Object.freeze(n)}i(Ss,"buildSquares");var Is=new Map(Gn.map(e=>[e,Ss(e)]));function no(e){let n=Is.get(e);if(n===void 0)throw new TypeError(`unsupported game variant: ${e}`);return n}i(no,"squaresForVariant");function Jo(e,n){return Wn(e),no(n)[oe(e)]??ca}i(Jo,"squareAtForVariant");function As(e){return Jo(e,ln)}i(As,"squareAt");function Cs(e){switch(e.kind){case"mon-base":return Fe(Vn(e.monKind,e.color,0));case"mana-base":return Ze(Yn(e.color));case"supermana-base":return Ze(Mn);case"consumable-base":return bt(A.BombOrPotion);case"regular":case"mana-pool":return}}i(Cs,"initialItemForSquare");function gs(e){return Object.freeze(no(e).map(Cs))}i(gs,"buildInitialItems");var Es=new Map(Gn.map(e=>[e,gs(e)]));function la(e){let n=Es.get(e);if(n===void 0)throw new TypeError(`unsupported game variant: ${e}`);return[...n]}i(la,"initialItemsForVariant");function da(e,n){for(let t of gt){let o=As(t);if(o.kind==="mon-base"&&o.monKind===e&&o.color===n)return t}throw new Error("Expected at least one base for the given mon")}i(da,"monBase");var Ce=Object.keys(jo).length,dn=Object.keys(ze).length,Et=Ce*dn,J=1,fe=2,H=3,vt=1,Tt=2,be=3,ge=1,fa=2,Ee=3,wt=ze[M.Demon],he=ze[M.Drainer],Ot=ze[M.Angel],to=ze[M.Spirit],oo=ze[M.Mystic],vs=0,Ts=1,Je=2,ws=3,pa=5,ce=7,tt=oe(Ct);function G(e){return e&3}i(G,"cellOccupancy");function re(e){return e>>2&7}i(re,"cellMonKind");function me(e){return e>>5&1}i(me,"cellMonColor");function ae(e){return e>>6&3}i(ae,"cellCooldown");function x(e){return e>>8&3}i(x,"cellMana");function N(e){return e>>10&3}i(N,"cellConsumable");function ot(e){let n=N(e);return n===0||n===ge}i(ot,"damagingAttackCanComplete");function rt(e,n,t,o,r){return H|e<<2|n<<5|t<<6|o<<8|r<<10}i(rt,"makeMonCell");function Cn(e){return J|e<<8}i(Cn,"makeManaCell");function ba(e){return fe|e<<10}i(ba,"makeConsumableCell");function Ve(e,n){return qo(e===be,e-1===n)}i(Ve,"manaScoreValue");function ie(e,n){return e*Ce+n}i(ie,"monId");function at(e){return e!==Je&&e<ce}i(at,"squareIsRegularForMovement");function en(e){return e>=pa&&e<ce}i(en,"squareIsPool");function ro(e){return Math.trunc((e-ce)/Ce)}i(ro,"squareMonBaseKind");function ao(e){return(e-ce)%Ce}i(ao,"squareMonBaseColor");function w(e,n){return e[n]??0}i(w,"u8");function g(e,n){return e[n]??0}i(g,"u16");function d(e,n){return e[n]??0}i(d,"i32");function ke(e,n){let t=e[n];if(t===void 0)throw new RangeError("automove search slot index out of range");return t}i(ke,"at");function io(e,n,t){return rt(ze[e.kind],He(e.color),e.cooldown,n,t)}i(io,"fastMonCellFromMon");function Os(e){let n=new Uint8Array(121),t=no(e);for(let o=0;o<121;o+=1){let r=t[o];if(r!==void 0)switch(r.kind){case"regular":n[o]=vs;break;case"consumable-base":n[o]=Ts;break;case"supermana-base":n[o]=Je;break;case"mana-base":n[o]=ws+He(r.color);break;case"mana-pool":n[o]=pa+He(r.color);break;case"mon-base":n[o]=ce+ie(ze[r.monKind],He(r.color));break}}return n}i(Os,"buildSquares");var xs=new Map(Gn.map(e=>[e,Os(e)]));function so(e){let n=xs.get(e);if(n===void 0)throw new TypeError(`unsupported game variant: ${e}`);try{return n.slice()}catch(t){Re(t)}}i(so,"fastSquaresForVariant");var co=(()=>{let e=new Int32Array(Et).fill(-1),n=so(ke(Gn,0));for(let t of gt){let o=oe(t),r=w(n,o);r>=ce&&(e[r-ce]=o)}return e})();function xt(e){let n=[],t=new Int32Array(121),o=new Int32Array(121);for(let r=0;r<121;r+=1){o[r]=n.length;let a=e(nt(r)).map(oe).sort((s,u)=>s-u);n.push(...a),t[r]=a.length}return{list:new Int32Array(n),starts:o,counts:t}}i(xt,"buildOffsetTable");var ue=xt(Be),gn=xt(Zt),En=xt(Jt),uo=xt(eo),lo=xt(Yt),Rs=(()=>{let e=new Uint8Array(14641);for(let n=0;n<121;n+=1){let t=Math.trunc(n/11),o=n%11;for(let r=0;r<121;r+=1){let a=Math.trunc(r/11),s=r%11;e[n*121+r]=Math.max(Math.abs(t-a),Math.abs(o-s))}}return e})();function Me(e,n){return w(Rs,e*121+n)}i(Me,"chebyshev");function _s(e,n){let t=Math.trunc(e/11),o=e%11,r=Math.trunc(n/11),a=n%11;return Math.trunc((t+r)/2)*11+Math.trunc((o+a)/2)}i(_s,"midpointCompute");var Ns=(()=>{let e=new Uint8Array(14641);for(let n=0;n<121;n+=1)for(let t=0;t<121;t+=1)e[n*121+t]=_s(n,t);return e})();function mo(e,n){return w(Ns,e*121+n)}i(mo,"midpoint");var ma=(()=>{let e=[],n=so(ke(Gn,0));for(let t=0;t<121;t+=1)en(w(n,t))&&e.push(t);return new Int32Array(e)})(),ya=(()=>{let e=new Uint8Array(121*Ce);for(let n=0;n<121;n+=1){let t=Math.trunc(n/11),o=n%11,r=Math.min(o,10-o);for(let a=0;a<Ce;a+=1){let s=a===0?10:0,u=Math.abs(s-t);e[a*121+n]=u>r?u:r}}return e})(),ha=(()=>{let e=new Uint8Array(121);for(let n=0;n<121;n+=1)e[n]=Math.abs(Qr-Math.trunc(n/11));return e})(),nn=(()=>{let e=new Uint8Array(121);for(let n=0;n<121;n+=1){let t=99;for(let o=0;o<ma.length;o+=1){let r=Me(n,d(ma,o));r<t&&(t=r)}e[n]=t}return e})();function Ps(e){let n=e>>>0;return()=>(n^=n<<13,n>>>=0,n^=n>>>17,n^=n<<5,n>>>=0,n|0)}i(Ps,"xorshift");function vn(e,n){let t=new Int32Array(n);for(let o=0;o<n;o+=1)t[o]=e();return t}i(vn,"randomTable");var Tn=Ps(49734321),ka=3,fo=1+Et*ka,Ls=vn(Tn,121*fo),Fs=vn(Tn,121*fo),Bs=vn(Tn,484),Ds=vn(Tn,484),Vs=vn(Tn,484),Us=vn(Tn,484),Ma=2048,po=vn(Tn,Ma),er=vn(Tn,Ma);function Sa(e){return G(e)!==H?0:1+ie(re(e),me(e))*ka+ae(e)}i(Sa,"monSlot");function bo(e,n){return n===0?0:d(Ls,e*fo+Sa(n))^d(Bs,e*4+x(n))^d(Vs,e*4+N(n))}i(bo,"cellHashLo");function yo(e,n){return n===0?0:d(Fs,e*fo+Sa(n))^d(Ds,e*4+x(n))^d(Us,e*4+N(n))}i(yo,"cellHashHi");function nr(e,n){return e>=Ae?h.White:n>=Ae?h.Black:void 0}i(nr,"winnerForScores");function ho(e){return nr(e.whiteScore,e.blackScore)}i(ho,"winnerForState");function it(e){return e.turnNumber===1}i(it,"isFirstTurnState");function ko(e){return e.activeColor===h.White?e.whitePotionsCount:e.blackPotionsCount}i(ko,"currentPlayerPotions");function mn(e){return e<ee}i(mn,"canMoveMonForCounts");function Ia(e){return mn(e.monsMovesCount)}i(Ia,"canPlayerMoveMon");function wn(e,n){return!e&&n<An}i(wn,"canMoveManaForCounts");function Aa(e){return wn(it(e),e.manaMovesCount)}i(Aa,"canPlayerMoveMana");function Mo(e,n,t){return!e&&(t>0||n<_e)}i(Mo,"canUseActionForCounts");function Ca(e){return Mo(it(e),e.actionsUsedCount,ko(e))}i(Ca,"canPlayerUseAction");function ga(e,n){if(n===void 0)return!0;let t=$(e);switch(n.kind){case"mon":return t!==void 0?!1:e.kind==="mana"?n.mon.kind===M.Drainer&&!Ie(n.mon):e.kind==="consumable"&&e.consumable===A.BombOrPotion;case"mana":return t?.kind===M.Drainer&&!Ie(t);case"mon-with-mana":case"mon-with-consumable":return e.kind==="consumable"&&e.consumable===A.BombOrPotion;case"consumable":return n.consumable===A.BombOrPotion&&t!==void 0}}i(ga,"spiritDestinationItemAllowed");function tr(e,n,t,o,r,a,s){if(!wn(e,t))return!1;let u=mn(n);return!u&&!Mo(e,o,r)||!a||s&&!u&&o>=_e&&r>0}i(tr,"shouldSuggestRegularManaStartsFromScalars");function Ea(e,n,t){return tr(it(e),e.monsMovesCount,e.manaMovesCount,e.actionsUsedCount,ko(e),n,t)}i(Ea,"shouldSuggestRegularManaStarts");function or(e,n,t,o){return e?!mn(n):wn(e,t)?!mn(n)&&!o:!0}i(or,"shouldAdvanceTurnForCounts");function Kn(e){switch(e.kind){case"regular":case"consumable-base":case"mana-base":case"mana-pool":return!0;case"supermana-base":case"mon-base":return!1}}i(Kn,"regularSquareForMovement");function rr(e,n){let t=e.get(n),o=e.squareAt(n);return t?.kind==="mon"?Kn(o)&&t.mon.kind===M.Drainer:t!==void 0?!1:Kn(o)}i(rr,"regularManaMoveDestinationAllowed");function Ws(e){for(let n of e.board.allFreeRegularManaLocations(e.activeColor))for(let t of Be(n))if(rr(e.board,t))return!0;return!1}i(Ws,"hasMovableFreeRegularMana");function va(e){let n=it(e),o=!(!n&&wn(n,e.manaMovesCount)&&!mn(e.monsMovesCount))||Ws(e);return or(n,e.monsMovesCount,e.manaMovesCount,o)}i(va,"shouldAdvanceTurn");var tn=0,Io=1,cr=2,Xe=3,On=4,ur=5,Se=127,on=0,fn=1,$n=2,lr=3,dr=-2,Ta=16;function ye(e,n,t,o,r){return e|n<<3|t<<10|o<<17|r<<24}i(ye,"encodeMove");function st(e){return e&7}i(st,"moveType");function Qe(e){return e>>3&127}i(Qe,"moveFrom");function Ne(e){return e>>10&127}i(Ne,"moveTo");function ct(e){return e>>17&127}i(ct,"moveAux");function Rt(e){return e>>24&3}i(Rt,"moveModifier");function ar(e,n,t){if(e.length!==n)throw new RangeError(`fast position ${t} length must be ${n}`)}i(ar,"validateArrayLength");var ir=class{static{i(this,"MutableFastPosition")}cells=new Uint16Array(121);squares=new Uint8Array(121);monLocations=new Int32Array(Et).fill(-1);freeMana=new Int32Array(Ce);manaIndices=new Int32Array(Ta);manaCount=0;whiteScore=0;blackScore=0;active=0;monsMoves=0;manaMoves=0;actionsUsed=0;potions=new Int32Array(Ce);firstTurn=!1;hashLo=0;hashHi=0;copyFrom(n){let t=n;this.cells.set(t.cells),this.squares=t.squares;let o=this.monLocations,r=t.monLocations;for(let u=0;u<Et;u+=1)o[u]=d(r,u);this.freeMana[0]=d(t.freeMana,0),this.freeMana[1]=d(t.freeMana,1);let a=this.manaIndices,s=t.manaIndices;for(let u=0;u<Ta;u+=1)a[u]=d(s,u);this.manaCount=t.manaCount,this.whiteScore=t.whiteScore,this.blackScore=t.blackScore,this.active=t.active,this.monsMoves=t.monsMoves,this.manaMoves=t.manaMoves,this.actionsUsed=t.actionsUsed,this.potions[0]=d(t.potions,0),this.potions[1]=d(t.potions,1),this.firstTurn=t.firstTurn,this.hashLo=t.hashLo,this.hashHi=t.hashHi}reset(n){ar(n.cells,121,"cells"),ar(n.squares,121,"squares"),ar(n.potions,Ce,"potions");let t;try{t=new Uint8Array(n.squares)}catch(f){Re(f)}let o=0;for(let f=0;f<121;f+=1){let p=g(n.cells,f);if(!(p===0||G(p)!==J)&&(o+=1,o>this.manaIndices.length))throw new RangeError("fast mana index capacity exceeded")}let r=n.whiteScore,a=n.blackScore,s=n.active,u=n.monsMoves,c=n.manaMoves,l=n.actionsUsed,m=n.firstTurn;this.cells.set(n.cells),this.squares=t,this.whiteScore=r,this.blackScore=a,this.active=s,this.monsMoves=u,this.manaMoves=c,this.actionsUsed=l,this.potions.set(n.potions),this.firstTurn=m,this.rebuildDerived()}rebuildDerived(){this.monLocations.fill(-1),this.freeMana[0]=0,this.freeMana[1]=0,this.manaIndices.fill(0),this.manaCount=0;let n=0,t=0;for(let o=0;o<121;o+=1){let r=g(this.cells,o);if(r===0)continue;n^=bo(o,r),t^=yo(o,r);let a=G(r);if(a===H)this.monLocations[ie(re(r),me(r))]=o;else if(a===J){let s=x(r);(s===1||s===2)&&(this.freeMana[s-1]=d(this.freeMana,s-1)+1),this.manaIndices[this.manaCount]=o,this.manaCount+=1}}this.hashLo=n,this.hashHi=t}},Ao=ir;function _t(e,n,t){let o=d(e.monLocations,ie(Ot,n));if(o<0)return!1;let r=g(e.cells,o);return G(r)===H&&re(r)===Ot&&me(r)===n&&ae(r)===0&&Me(o,t)===1}i(_t,"awakeAngelGuards");function Gs(e,n){let t=e.manaCount;for(let o=0;o<t;o+=1)if(d(e.manaIndices,o)===n){for(let r=o+1;r<t;r+=1)e.manaIndices[r-1]=d(e.manaIndices,r);e.manaIndices[t-1]=0,e.manaCount=t-1;return}throw new RangeError(`missing fast mana index: ${n}`)}i(Gs,"removeManaIndex");function Ks(e,n){let t=e.manaCount;if(t>=e.manaIndices.length)throw new RangeError("fast mana index capacity exceeded");let o=t;for(;o>0&&d(e.manaIndices,o-1)>n;)e.manaIndices[o]=d(e.manaIndices,o-1),o-=1;e.manaIndices[o]=n,e.manaCount=t+1}i(Ks,"insertManaIndex");function K(e,n,t){let o=g(e.cells,n);if(o!==t){if(o!==0){e.hashLo^=bo(n,o),e.hashHi^=yo(n,o);let r=G(o);if(r===H){let a=ie(re(o),me(o));d(e.monLocations,a)===n&&(e.monLocations[a]=-1)}else if(r===J){let a=x(o);(a===1||a===2)&&(e.freeMana[a-1]=d(e.freeMana,a-1)-1),Gs(e,n)}}if(e.cells[n]=t,t!==0){e.hashLo^=bo(n,t),e.hashHi^=yo(n,t);let r=G(t);if(r===H)e.monLocations[ie(re(t),me(t))]=n;else if(r===J){let a=x(t);(a===1||a===2)&&(e.freeMana[a-1]=d(e.freeMana,a-1)+1),Ks(e,n)}}}}i(K,"setCell");function So(e){return rt(re(e),me(e),ae(e),0,0)}i(So,"plainMonCell");function jn(e,n,t){return rt(re(e),me(e),ae(e),n,t)}i(jn,"carryingMonCell");function wa(e,n){e.potions[n]=d(e.potions,n)+1}i(wa,"addPotion");function sr(e,n,t,o){if(x(n)===0&&N(n)===0&&o===fn){K(e,t,jn(n,0,ge));return}K(e,t,n),wa(e,me(n))}i(sr,"collectConsumableAt");function js(e,n){e.active===0?e.whiteScore+=n:e.blackScore+=n}i(js,"addScore");function mr(e){if(e.actionsUsed<_e){e.actionsUsed+=1;return}e.potions[e.active]=d(e.potions,e.active)-1}i(mr,"consumeAction");function Oa(e,n){let t=re(n),o=me(n),r=d(co,ie(t,o));K(e,r,rt(t,o,2,0,0))}i(Oa,"faintMonAt");function $s(e){let n=g(e.cells,tt);G(n)===H&&x(n)===0&&N(n)===0?K(e,tt,jn(n,be,0)):K(e,tt,Cn(be))}i($s,"supermanaBackToBase");function qs(e,n,t){let o=x(n);if(o===be?$s(e):o!==0&&K(e,t,Cn(o)),N(n)===ge){let r=d(co,ie(re(n),me(n)));t!==r&&K(e,t,0)}}i(qs,"releaseFaintedCarry");function fr(e,n,t){Oa(e,n),qs(e,n,t)}i(fr,"faintTargetAndReleaseCarry");function pr(e,n,t){js(e,Ve(t,e.active));let o=g(e.cells,n);G(o)===H?K(e,n,So(o)):K(e,n,0)}i(pr,"scoreCarriedManaAt");function Hs(e,n){let t=Qe(n),o=Ne(n),r=g(e.cells,t),a=g(e.cells,o),s=x(r);if(e.monsMoves+=1,K(e,t,0),K(e,o,r),a!==0){let u=G(a);u===J?(s!==0&&K(e,t,Cn(s)),K(e,o,jn(r,x(a),0))):u===fe&&N(a)===Ee&&sr(e,r,o,Rt(n))}s!==0&&en(w(e.squares,o))&&pr(e,o,s)}i(Hs,"applyMonMove");function zs(e,n){let t=Qe(n),o=Ne(n),r=x(g(e.cells,t)),a=g(e.cells,o);e.manaMoves+=1,K(e,t,0),K(e,o,Cn(r)),a!==0&&K(e,o,jn(a,r,0)),en(w(e.squares,o))&&pr(e,o,r)}i(zs,"applyManaMove");function Xs(e,n){let t=Ne(n),o=g(e.cells,t);mr(e),K(e,t,0),fr(e,o,t)}i(Xs,"applyMysticAction");function Qs(e,n){let t=Qe(n),o=Ne(n),r=Rt(n),a=r===lr?Se:ct(n),s=g(e.cells,t),u=g(e.cells,o),c=d(co,ie(re(s),me(s))),l=N(u)!==ge||a===Se||a===c;return K(e,t,0),a===Se?K(e,o,So(s)):K(e,o,0),mr(e),u!==0&&(fr(e,u,o),N(u)===ge&&Oa(e,s)),a!==Se&&(r===fn?K(e,a,jn(s,0,ge)):(K(e,a,So(s)),r===$n&&wa(e,me(s)))),l}i(Qs,"applyDemonAction");function Ys(e,n){let t=Qe(n),o=Ne(n),r=g(e.cells,t),a=g(e.cells,o);K(e,o,0),K(e,t,So(r)),fr(e,a,o)}i(Ys,"applyBombAttack");function Zs(e,n){let t=Ne(n),o=ct(n),r=Rt(n),a=g(e.cells,t),s=g(e.cells,o),u=x(a);if(mr(e),K(e,t,0),K(e,o,a),s!==0){let c=G(a);if(c===H){let l=G(s);l===J?(u!==0&&K(e,t,Cn(u)),K(e,o,jn(a,x(s),0))):l===fe&&sr(e,a,o,r)}else c===J?K(e,o,jn(s,u,0)):c===fe&&sr(e,s,o,r)}u!==0&&en(w(e.squares,o))&&pr(e,o,u)}i(Zs,"applySpiritAction");function br(e){let n=nr(e.whiteScore,e.blackScore);return n===void 0?-1:He(n)}i(br,"positionWinner");function xa(e){return Mo(e.firstTurn,e.actionsUsed,d(e.potions,e.active))}i(xa,"canUseAction");function Ra(e,n){return d(e.freeMana,e.active)===0?!1:tr(e.firstTurn,e.monsMoves,e.manaMoves,e.actionsUsed,d(e.potions,e.active),n!==0,!0)}i(Ra,"manaStartsAllowed");function ut(e,n){if(!at(w(e.squares,n)))return!1;let t=g(e.cells,n);return t===0||G(t)===H&&re(t)===he&&x(t)===0&&N(t)===0}i(ut,"manaMoveAllowed");function Js(e){let n=e.active+1;for(let t=0;t<e.manaCount;t+=1){let o=d(e.manaIndices,t),r=g(e.cells,o);if(G(r)!==J||x(r)!==n)continue;let a=d(ue.starts,o),s=d(ue.counts,o);for(let u=0;u<s;u+=1){let c=d(ue.list,a+u);if(ut(e,c))return!0}}return!1}i(Js,"hasMovableFreeRegularMana");function ec(e){let t=!(!e.firstTurn&&wn(e.firstTurn,e.manaMoves)&&!mn(e.monsMoves))||d(e.freeMana,e.active)!==0&&Js(e);return or(e.firstTurn,e.monsMoves,e.manaMoves,t)}i(ec,"shouldAdvanceTurn");function nc(e){e.active^=1,e.firstTurn=!1,e.actionsUsed=0,e.manaMoves=0,e.monsMoves=0;let n=e.active;for(let t=0;t<dn;t+=1){let o=d(e.monLocations,ie(t,n));if(o<0)continue;let r=g(e.cells,o),a=ae(r);a===0||x(r)!==0||N(r)!==0||K(e,o,rt(re(r),me(r),a-1,x(r),N(r)))}}i(nc,"advanceTurn");function _a(e,n){let t=e,o=st(n),r=!0;switch(o){case tn:Hs(t,n);break;case Io:zs(t,n);break;case cr:Xs(t,n);break;case Xe:r=Qs(t,n);break;case On:Zs(t,n);break;case ur:Ys(t,n);break;default:throw new RangeError(`unsupported fast move type: ${o}`)}let a=br(t);return a===-1&&ec(t)&&nc(t),r?a:dr}i(_a,"applyFastMove");function Na(e){switch(e){case A.Bomb:return ge;case A.Potion:return fa;case A.BombOrPotion:return Ee}}i(Na,"consumableCode");function Pa(e){return e.kind==="supermana"?be:He(e.color)===0?vt:Tt}i(Pa,"manaCode");var La=2147483647;function Fa(e,n,t){if(!Number.isSafeInteger(t)||t<0||n.whitePotionsCount>La-t||n.blackPotionsCount>La-t||n.turnNumber>Number.MAX_SAFE_INTEGER-t)return!1;let o;try{o=new Uint8Array(e.monLocations.length)}catch(a){if(a instanceof RangeError)return!1;throw a}let r=0;for(let a of n.board.items){if(a===void 0)continue;if(In(a)!==void 0&&(r+=1,r>e.manaIndices.length))return!1;let s=$(a);if(s===void 0)continue;let u=ie(ze[s.kind],He(s.color));if(o[u]!==0)return!1;o[u]=1}try{tc(e,n)}catch(a){if(At(a))return!1;throw a}return!0}i(Fa,"tryLoadPosition");function tc(e,n){let t;try{t=new Uint16Array(121)}catch(r){Re(r)}let o=n.board.items;for(let r=0;r<121;r+=1){let a=o[r];if(a!==void 0)switch(a.kind){case"mon":t[r]=io(a.mon,0,0);break;case"mana":t[r]=Cn(Pa(a.mana));break;case"mon-with-mana":t[r]=io(a.mon,Pa(a.mana),0);break;case"mon-with-consumable":t[r]=io(a.mon,0,Na(a.consumable));break;case"consumable":t[r]=ba(Na(a.consumable));break}}e.reset({cells:t,squares:so(n.variant()),whiteScore:n.whiteScore,blackScore:n.blackScore,active:He(n.activeColor),monsMoves:n.monsMovesCount,manaMoves:n.manaMovesCount,actionsUsed:n.actionsUsedCount,potions:[n.whitePotionsCount,n.blackPotionsCount],firstTurn:n.isFirstTurn()})}i(tc,"loadPosition");function Co(e){return{kind:"location",location:nt(e)}}i(Co,"locationInput");function oc(e){return{kind:"modifier",modifier:e===fn?X.SelectBomb:X.SelectPotion}}i(oc,"modifierInput");function Ba(e){let n=st(e),t=[Co(Qe(e)),Co(Ne(e))];n===On?t.push(Co(ct(e))):n===Xe&&ct(e)!==Se&&t.push(Co(ct(e)));let o=Rt(e);return(o===fn||o===$n)&&(n===tn||n===Xe||n===On)&&t.push(oc(o)),t}i(Ba,"moveToInputs");var go=1e6,rc=-2147483648,ac=2147483647,ic=["scoreUnit","potion","bomb","activeMon","faintMon","faintDrainer","faintCooldownStep","drainerCloseToMana","drainerCloseToOwnPool","drainerCloseToSupermana","carrierCloseToPool","carrierPointBonus","carrierScoresThisTurn","carrierScoresNextTurn","winningCarrier","drainerPickupScoresThisTurn","manaToOwnerPool","manaPointsAttraction","manaDrainerControl","supermanaDrainerControl","monCloseToCenter","spiritCloseToEnemy","spiritOnOwnBase","angelCloseToDrainer","angelGuardingDrainer","attackerCloseToEnemyDrainer","drainerThreatImmediate","drainerThreatWalk","carrierThreatFactor","manaToNearestPool","manaStepQueue1","manaStepQueue2","manaStepQueue3","manaStepQueue4","manaStepQueue5","manaStepWinThreat","drainerTripTurn1","drainerTripTurn2","drainerTripTurn3","drainerTripTurn4","supermanaCarrier","scoreShape10","scoreShape20","scoreShape21","scoreShape30","scoreShape31","scoreShape32","tripGradient","raceHalfTurn","threatMoverScaleSpare","threatMoverScaleFew","tripTwoPointScale"];function yr(e){if(typeof e!="object"||e===null||Array.isArray(e))throw new TypeError("fast evaluation weights must be an object");let n=e,t={scoreUnit:0,potion:0,bomb:0,activeMon:0,faintMon:0,faintDrainer:0,faintCooldownStep:0,drainerCloseToMana:0,drainerCloseToOwnPool:0,drainerCloseToSupermana:0,carrierCloseToPool:0,carrierPointBonus:0,carrierScoresThisTurn:0,carrierScoresNextTurn:0,winningCarrier:0,drainerPickupScoresThisTurn:0,manaToOwnerPool:0,manaPointsAttraction:0,manaDrainerControl:0,supermanaDrainerControl:0,monCloseToCenter:0,spiritCloseToEnemy:0,spiritOnOwnBase:0,angelCloseToDrainer:0,angelGuardingDrainer:0,attackerCloseToEnemyDrainer:0,drainerThreatImmediate:0,drainerThreatWalk:0,carrierThreatFactor:0,manaToNearestPool:0,manaStepQueue1:0,manaStepQueue2:0,manaStepQueue3:0,manaStepQueue4:0,manaStepQueue5:0,manaStepWinThreat:0,drainerTripTurn1:0,drainerTripTurn2:0,drainerTripTurn3:0,drainerTripTurn4:0,supermanaCarrier:0,scoreShape10:0,scoreShape20:0,scoreShape21:0,scoreShape30:0,scoreShape31:0,scoreShape32:0,tripGradient:0,raceHalfTurn:0,threatMoverScaleSpare:0,threatMoverScaleFew:0,tripTwoPointScale:0};for(let o of ic){let r=n[o];if(typeof r!="number")throw new TypeError(`weights.${o} must be a number`);if(!Number.isSafeInteger(r)||r<-go||r>go)throw new RangeError(`weights.${o} must be a safe integer from -${go} through ${go}`);t[o]=r}return Object.freeze(t)}i(yr,"normalizeEvalWeights");var Rn=yr({scoreUnit:12e3,potion:240,bomb:1200,activeMon:45,faintMon:520,faintDrainer:900,faintCooldownStep:80,drainerCloseToMana:330,drainerCloseToOwnPool:280,drainerCloseToSupermana:180,carrierCloseToPool:1600,carrierPointBonus:420,carrierScoresThisTurn:900,carrierScoresNextTurn:700,winningCarrier:8e3,drainerPickupScoresThisTurn:420,manaToOwnerPool:170,manaPointsAttraction:350,manaDrainerControl:26,supermanaDrainerControl:40,monCloseToCenter:210,spiritCloseToEnemy:200,spiritOnOwnBase:180,angelCloseToDrainer:150,angelGuardingDrainer:260,attackerCloseToEnemyDrainer:150,drainerThreatImmediate:2100,drainerThreatWalk:720,carrierThreatFactor:2,manaToNearestPool:0,manaStepQueue1:3600,manaStepQueue2:2500,manaStepQueue3:1050,manaStepQueue4:800,manaStepQueue5:800,manaStepWinThreat:8e3,drainerTripTurn1:4200,drainerTripTurn2:2200,drainerTripTurn3:1e3,drainerTripTurn4:400,supermanaCarrier:4e3,scoreShape10:-6824,scoreShape20:-6978,scoreShape21:-3085,scoreShape30:-8259,scoreShape31:-4275,scoreShape32:-1052,tripGradient:400,raceHalfTurn:900,threatMoverScaleSpare:25,threatMoverScaleFew:55,tripTwoPointScale:290}),pe=99,ve=Math.max(pe+1,11),Da=3,Ue=Ae+2,Eo=ee+1,hr=0,Ka=1,kr=2,xn=3,ja=3,$a=Eo,bn=6,Va=bn*2+1,Nt=6,Mr=2,Ua=12;function pn(e){let n=_n(ve);for(let t=0;t<ve;t+=1)n[t]=Math.trunc(e/(t+1));return n}i(pn,"distanceTable");function sc(e){let n=_n(ve),t=e.manaToNearestPool;for(let o=0;o<ve;o+=1){let r=o<=1?e.manaStepQueue1:o===2?e.manaStepQueue2:o===3?e.manaStepQueue3:o===4?e.manaStepQueue4:e.manaStepQueue5;n[o]=r+Math.trunc(t/(o+1))}return n}i(sc,"manaStepQueueTable");function cc(e){let n=_n(Ue*Ue),t=new Set,o=i((r,a,s)=>{if(r===a)throw new RangeError("score shape cells must be off the diagonal");let u=r*Ue+a,c=a*Ue+r;if(t.has(u)||t.has(c))throw new RangeError("score shape cells must be written once");t.add(u),t.add(c),n[u]=s,n[c]=-s},"set");o(1,0,e.scoreShape10),o(2,0,e.scoreShape20),o(2,1,e.scoreShape21),o(3,0,e.scoreShape30),o(3,1,e.scoreShape31),o(3,2,e.scoreShape32);for(let r=0;r+1<Ue;r+=1)for(let a=0;a<Ue;a+=1)if(e.scoreUnit+d(n,(r+1)*Ue+a)-d(n,r*Ue+a)<0)throw new RangeError("score shape corrections must keep the score monotone");return n}i(cc,"scoreShapeTable");function qa(e){let n=_n(ve);for(let t=0;t<ve;t+=1){let o=1+Math.ceil(t/ee);n[t]=o<=1?e.drainerTripTurn1:o===2?e.drainerTripTurn2:o===3?e.drainerTripTurn3:e.drainerTripTurn4}return n}i(qa,"drainerTripTable");function uc(e){let n=qa(e);for(let t=0;t<ve;t+=1)n[t]=Xa(d(n,t),e.tripTwoPointScale,"two-point trip");return n}i(uc,"twoPointTripTable");function lc(e){let n=_n(Va);for(let t=0;t<Va;t+=1)n[t]=(t-bn)*e;return n}i(lc,"raceTable");function dc(e){let n=_n(ve);for(let t=0;t<ve;t+=1){let o=t>Ua?Ua:t;n[t]=o*e}return n}i(dc,"tripStepTable");function mc(e){let n=_n(Da*ve);for(let t=0;t<Da;t+=1){let o=t*ve;for(let r=0;r<ve;r+=1)n[o+r]=Math.trunc(t*e/(r+1))}return n}i(mc,"manaPointsAttractionTable");function Ha(e,n){return n===hr?100:n===kr?e.threatMoverScaleSpare:e.threatMoverScaleFew}i(Ha,"moverScale");function za(e,n,t){let o=e*n;if(!Number.isSafeInteger(o))throw new RangeError(`${t} derived value requires a safe integer product`);return Math.trunc(o/100)}i(za,"scaledSafeInteger");function Xa(e,n,t){let o=za(e,n,t);if(o<rc||o>ac)throw new RangeError(`${t} derived value must fit a signed 32-bit integer`);return o}i(Xa,"scaledInt32");function fc(e){let n=_n(2*xn);for(let t=0;t<2;t+=1){let o=t===1?e.carrierThreatFactor:1;for(let r=0;r<xn;r+=1)n[t*xn+r]=Xa(e.drainerThreatImmediate*o,Ha(e,r),"immediate threat")}return n}i(fc,"threatImmediateTable");function pc(e){let n=bc(2*xn*Eo);for(let t=0;t<2;t+=1){let o=t===1?e.carrierThreatFactor:1;for(let r=0;r<xn;r+=1){let a=Ha(e,r),s=(t*xn+r)*Eo;for(let u=0;u<Eo;u+=1)n[s+u]=za(Math.trunc(e.drainerThreatWalk*o*(ee+1-u)/ee),a,"walking threat")}}return n}i(pc,"threatWalkTable");function _n(e){try{return new Int32Array(e)}catch(n){Re(n)}}i(_n,"createInt32Table");function bc(e){try{return new Float64Array(e)}catch(n){Re(n)}}i(bc,"createFloat64Table");function yc(e,n){let t=bn*Math.abs(e.raceHalfTurn);if(t===0)return;let o=Ae-Mr;for(let r=0;r<o;r+=1){let a=e.scoreUnit+d(n,o*Ue+r)-d(n,(o-1)*Ue+r);if(t>a)throw new RangeError("race correction must not outweigh the point that opens the endgame band")}}i(yc,"assertRaceStaysMonotone");function Qa(e){let n=cc(e);return yc(e,n),{weights:e,manaPointsAttraction:mc(e.manaPointsAttraction),manaToOwnerPool:pn(e.manaToOwnerPool),manaToNearestPool:sc(e),scoreShape:n,drainerTrip:qa(e),drainerTripTwoPoint:uc(e),race:lc(e.raceHalfTurn),tripStep:dc(e.tripGradient),carrierCloseToPool:pn(e.carrierCloseToPool),drainerCloseToMana:pn(e.drainerCloseToMana),drainerCloseToOwnPool:pn(e.drainerCloseToOwnPool),drainerCloseToSupermana:pn(e.drainerCloseToSupermana),angelCloseToDrainer:pn(e.angelCloseToDrainer),spiritCloseToEnemy:pn(e.spiritCloseToEnemy),monCloseToCenter:pn(e.monCloseToCenter),attackerCloseToEnemyDrainer:pn(e.attackerCloseToEnemyDrainer),threatImmediate:fc(e),threatWalk:pc(e)}}i(Qa,"createEvalTables");var vo=Qa(Rn),Wa=new WeakMap;function Ya(e){if(e===Rn)return Rn;if(!Object.isFrozen(e))return yr(e);let n=Wa.get(e);return n===void 0&&(n=yr(e),Wa.set(e,n)),n}i(Ya,"memoizedNormalizedEvalWeights");var Ga=new WeakMap;function Za(e){if(e===Rn)return vo;let n=Ga.get(e);return n===void 0&&(n=Qa(e),Ga.set(e,n)),n}i(Za,"memoizedEvalTables");var yn=1e6;function Ja(e,n){return w(ya,n*121+e)}i(Ja,"ownPoolDistance");var ei=Int32Array.of(0,10,110,120);function hc(e,n){for(let t=0;t<ei.length;t+=1){let o=d(ei,t);if(Me(n,o)===1&&ut(e,o))return!0}return!1}i(hc,"hasAdjacentScoringPool");function ni(e,n,t,o){return d(n,t>o?t-o:0)-d(e.tripStep,t)}i(ni,"tripValue");function kc(e){return w(ha,e)}i(kc,"centerDistance");var Sr=new WeakMap,Pt,lt;function Mc(e,n){if(e?.length!==n.length)return!1;for(let t=0;t<n.length;t+=1)if(w(e,t)!==w(n,t))return!1;return!0}i(Mc,"sameSquareContent");function Sc(e){try{let n=new Uint8Array(14641).fill(pe),t=new Int32Array(121),o=new Int32Array(121),r=[],a=[];for(let s=0;s<121;s+=1){let u=d(gn.starts,s),c=d(gn.counts,s);for(let f=0;f<121;f+=1){let p=pe;for(let b=0;b<c;b+=1){let y=d(gn.list,u+b);if(w(e,y)>=ce)continue;let C=Me(f,y);C<p&&(p=C)}n[s*121+f]=p}t[s]=r.length;let l=d(En.starts,s),m=d(En.counts,s);for(let f=0;f<m;f+=1){let p=d(En.list,l+f);if(w(e,p)>=ce)continue;let b=mo(s,p),y=w(e,b);y===Je||y>=ce||(r.push(p),a.push(b))}o[s]=r.length-d(t,s)}return{mysticSteps:n,demonStarts:t,demonCounts:o,demonOrigins:new Int32Array(r),demonBetween:new Int32Array(a)}}catch(n){Re(n)}}i(Sc,"buildAttackTables");function Ic(e){if(e===Pt&&lt!==void 0)return lt;let n=Sr.get(e);if(n!==void 0)return Pt=e,lt=n,n;if(lt!==void 0&&Mc(Pt,e)){let o=lt;return Sr.set(e,o),Pt=e,o}let t=Sc(e);return Sr.set(e,t),Pt=e,lt=t,t}i(Ic,"attackTablesFor");function Ac(e,n,t,o){if(!ot(g(e.cells,n)))return pe;let r=t^1,a=pe,s=Ic(e.squares);for(let u=0;u<dn;u+=1){let c=d(e.monLocations,ie(u,r));if(c<0)continue;let l=g(e.cells,c);if(G(l)!==H)continue;if(N(l)===ge){let p=Me(c,n)-3,b=p<0?0:p;if(b===0)return 0;b<a&&(a=b);continue}if(ae(l)!==0||N(l)!==0||o||x(l)!==0)continue;if(u===oo){let p=w(s.mysticSteps,n*121+c);if(p===0)return 0;p<a&&(a=p);continue}if(u!==wt)continue;let m=d(s.demonStarts,n),f=d(s.demonCounts,n);for(let p=0;p<f;p+=1){let b=d(s.demonBetween,m+p);if(b!==c&&g(e.cells,b)!==0)continue;let y=Me(c,d(s.demonOrigins,m+p));if(y===0)return 0;y<a&&(a=y)}}return a}i(Ac,"estimatedAttackSteps");function ti(e,n,t=0){let o=n.weights,r=(e.whiteScore-e.blackScore)*o.scoreUnit+d(n.scoreShape,e.whiteScore*Ue+e.blackScore)+(d(e.potions,0)-d(e.potions,1))*o.potion,a=d(e.monLocations,ie(he,0)),s=d(e.monLocations,ie(he,1)),u=a>=0&&ae(g(e.cells,a))===0,c=s>=0&&ae(g(e.cells,s))===0,l=pe,m=pe,f=pe,p=pe,b=pe,y=pe,C=ee-e.monsMoves,I=t!==0,_=Ae-e.whiteScore,P=Ae-e.blackScore,F=0,D=Nt,L=Nt,V=Nt,U=Nt,le=!1,Ge=!1;if(I){if(a>=0){let S=g(e.cells,a);le=ae(S)<=1&&x(S)===0&&N(S)===0}if(s>=0){let S=g(e.cells,s);Ge=ae(S)<=1&&x(S)===0&&N(S)===0}}let Te=0,sn=0,cn=!1,Pe=!1,Fn=0,de=0,we=0,Ke=0;for(let S=0;S<e.manaCount;S+=1){let v=d(e.manaIndices,S),je=g(e.cells,v);if(G(je)!==J)continue;let j=x(je),z=u?Me(a,v):pe,ne=c?Me(s,v):pe;z<l&&(l=z),ne<m&&(m=ne);let se=w(nn,v);if(u){let T=z+se;j===vt&&T<f?f=T:j!==vt&&T<b&&(b=T)}if(c){let T=ne+se;j===Tt&&T<p?p=T:j!==Tt&&T<y&&(y=T)}if(I){let T=!1;if(j!==be&&se<=1&&hc(e,v)&&(T=!0,j-1===0?Fn<2&&(Fn+=1):de<2&&(de+=1)),le&&(u?z:Me(a,v))+se<=ee){let te=Ve(j,0);te>Te?(Te=te,cn=T&&j-1===0):te===Te&&!(T&&j-1===0)&&(cn=!1)}if(Ge&&(c?ne:Me(s,v))+se<=ee){let te=Ve(j,1);te>sn?(sn=te,Pe=T&&j-1===1):te===sn&&!(T&&j-1===1)&&(Pe=!1)}}let $e=ne-z;if($e>4&&($e=4),$e<-4&&($e=-4),o.manaPointsAttraction!==0){let T=n.manaPointsAttraction;u&&(r+=d(T,Ve(j,0)*ve+z)),c&&(r-=d(T,Ve(j,1)*ve+ne))}if(j===be)r+=o.supermanaDrainerControl*$e;else{let T=j-1,R=T===0?1:-1;r+=R*d(n.manaToOwnerPool,Ja(v,T)),r+=R*d(n.manaToNearestPool,se),r+=o.manaDrainerControl*$e,se<=2&&(T===0?_:P)<=1&&(F|=T===0?1:2),T===0?se<D&&(D=se):se<L&&(L=se)}}F!==0&&(r+=o.manaStepWinThreat*(((F&1)===0?0:1)-((F&2)===0?0:1)));for(let S=0;S<Ce;S+=1){let v=S===0?1:-1,je=S^1;for(let j=0;j<dn;j+=1){let z=d(e.monLocations,ie(j,S));if(z<0)continue;let ne=g(e.cells,z);if(G(ne)!==H)continue;let se=ae(ne);se!==0&&(r-=v*((j===he?o.faintDrainer:o.faintMon)+o.faintCooldownStep*se));let $e=w(e.squares,z);se===0&&$e<ce&&(r+=v*o.activeMon);let T=x(ne);if(T!==0){let R=Ve(T,S),te=w(nn,z);r+=v*(d(n.carrierCloseToPool,te)+R*o.carrierPointBonus),T===be&&(r+=v*o.supermanaCarrier),S===e.active&&te<=C?r+=v*o.carrierScoresThisTurn*R:S!==e.active&&te<=ee&&(r+=v*o.carrierScoresNextTurn*R,I&&(S===0?R>we&&(we=R):R>Ke&&(Ke=R)));let qe=S===0?e.whiteScore:e.blackScore;R>=Ae-qe&&(r+=v*o.winningCarrier)}else N(ne)===ge&&(r+=v*o.bomb);if(se===0)if(j===he){let R=0,te=S===0?l:m,qe=S===0?f:p,Bn=S===0?b:y,$t=qe<Bn?qe:Bn,qt=S===e.active?C:ee,Fr=n.drainerTrip,Ht=T!==0?w(nn,z):N(ne)!==0?pe:qe;T===0&&N(ne)===0&&Bn<pe&&(qe>=pe||ni(n,n.drainerTripTwoPoint,Bn,qt)>ni(n,n.drainerTrip,qe,qt))&&(Fr=n.drainerTripTwoPoint,Ht=Bn),R-=d(n.tripStep,Ht);let Br=Ht>qt?Ht-qt:0,zt=1+((Br+ee-1)/ee|0);S===0?zt<V&&(V=zt):zt<U&&(U=zt),R+=d(Fr,Br),R+=d(n.drainerCloseToMana,te),R+=d(n.drainerCloseToOwnPool,Ja(z,S)),R+=d(n.drainerCloseToSupermana,Me(z,tt)),T===0&&N(ne)===0&&S===e.active&&$t<=C&&(R+=o.drainerPickupScoresThisTurn),r+=v*R;let Dr=_t(e,S,z),Wo=Ac(e,z,S,Dr),zi=T!==0,Xi=S!==e.active||C===0?hr:C>=ja?kr:Ka,Vr=(zi?xn:0)+Xi;Wo===0?r-=v*d(n.threatImmediate,Vr):Wo<=ee&&(r-=v*(n.threatWalk[Vr*$a+Wo]??0)),Dr&&(r+=v*o.angelGuardingDrainer)}else if(j===Ot){let R=S===0?a:s;R>=0&&(r+=v*d(n.angelCloseToDrainer,Me(z,R)))}else if(j===to){let R=pe;for(let te=0;te<dn;te+=1){let qe=d(e.monLocations,ie(te,je));if(qe<0)continue;let Bn=g(e.cells,qe);if(ae(Bn)!==0)continue;let $t=Me(z,qe);$t<R&&(R=$t)}r+=v*d(n.spiritCloseToEnemy,R),$e>=ce&&(r-=v*o.spiritOnOwnBase)}else{r+=v*d(n.monCloseToCenter,kc(z));let R=je===0?a:s,te=je===0?u:c;R>=0&&te&&(r+=v*d(n.attackerCloseToEnemyDrainer,Me(z,R)))}}}if(o.raceHalfTurn!==0&&(_<P?_:P)<=Mr){let S=e.manaMoves>0?1:0,v=D+(e.active===0?S:0),je=L+(e.active===1?S:0),j=V<v?V:v,ne=(U<je?U:je)*2+(e.active===1?0:1)-(j*2+(e.active===0?0:1)),se=ne>bn?bn:ne<-bn?-bn:ne;r+=d(n.race,se+bn)}if(I){let S=e.active^1,v=S===0?1:-1,je=S===0?Te:sn,j=S===0?we:Ke,z=S===0?Fn:de,ne=z>0,se=S===0?cn:Pe,$e=z>=2||z===1&&!se,T=je;T>0&&$e&&(T+=1);let R=j;R>0&&ne&&(R+=1),R>T&&(T=R),ne&&T<1&&(T=1);let te=S===0?e.whiteScore:e.blackScore;T>0&&te+T>=Ae&&(r+=v*t)}return r}i(ti,"evaluateWithTables");var hn=704,To=1073741824;function Bt(e,n){return n?e+To:e}i(Bt,"encodeGeneratedMoves");function Lt(e){return e>=To?e-To:e}i(Lt,"generatedMoveCount");function Ft(e){return e>=To}i(Ft,"generatedMovesHadRawStartOption");function Ir(e,n){return G(e)===H&&me(e)!==n&&ae(e)===0}i(Ir,"isEnemyAwakeMon");function Ar(e){let n=131072;return x(e)!==0&&(n+=1<<20),re(e)===he&&(n+=1<<19),n}i(Ar,"damagingAttackKey");function Cc(e,n,t){let o=g(e.cells,t),r=w(e.squares,t),a=G(n),s=a===H,u=x(n),c=N(n),l=o===0?-1:G(o),m=l===H&&(x(o)!==0||N(o)!==0);if(l===H)if(m){if(a!==fe||c!==Ee)return 0}else{if(s)return 0;if(a===J){if(re(o)!==he||ae(o)!==0)return 0}else if(c!==Ee)return 0}else if(l===J){if(!s||re(n)!==he||ae(n)!==0)return 0}else if(l===fe&&(N(o)!==Ee||!s))return 0;if(r>=ce){if(!s||ro(r)!==re(n)||ao(r)!==me(n)||u!==0||c!==0)return 0}else if(r===Je){let f=l===J&&x(o)===be,p=s&&re(n)===he;if(!(u===be||u===0&&p&&(o===0||f)||p&&f))return 0}return o===0?1:s?u===0&&c===0?l===fe?N(o)===Ee?2:0:1:u!==0?l===fe?N(o)===Ee?1:0:1:l!==fe||N(o)!==Ee?0:1:a===J?l!==H||m?0:1:l!==H?0:m?c===Ee?1:0:2}i(Cc,"spiritDestinationOptionCount");function gc(e,n,t,o,r,a){let s=r,u=!1,c=re(t),l=me(t),m=x(t),f=N(t),p=e.active,b=w(nn,n),y=c===he?1024:0,C=d(ue.starts,n),I=d(ue.counts,n);for(let _=0;_<I;_+=1){let P=d(ue.list,C+_),F=g(e.cells,P),D=w(e.squares,P),L=F===0?-1:G(F),V;if(m!==0)L===H?V=!1:L===J||L===fe?V=!0:V=at(D)||D===Je&&m===be;else if(f!==0)L===fe?V=!0:L===-1?V=at(D):V=!1;else{let le;L===H?le=!1:L===J?le=c===he:le=!0,le?D>=ce?V=ro(D)===c&&ao(D)===l:D===Je?V=c===he&&(F===0||L===J&&x(F)===be):V=!0:V=!1}if(!V||(u=!0,L===fe&&N(F)!==Ee))continue;let U=0;m!==0&&en(D)&&(U+=(1<<21)+Ve(m,p)*(1<<18)),F!==0&&(L===J?U+=65536+Ve(x(F),p)*512:L===fe&&(U+=16384)),m!==0?U+=(b-w(nn,P))*2048+4096:U+=y,L===fe&&N(F)===Ee&&m===0&&f===0?(a[s]=U,o[s]=ye(tn,n,P,Se,fn),s+=1,a[s]=U,o[s]=ye(tn,n,P,Se,$n),s+=1):(a[s]=U,o[s]=ye(tn,n,P,Se,on),s+=1)}return Bt(s,u)}i(gc,"generateMonMoves");function Ec(e,n,t,o,r){let a=e.active,s=o,u=!1,c=d(gn.starts,n),l=d(gn.counts,n);for(let m=0;m<l;m+=1){let f=d(gn.list,c+m),p=g(e.cells,f);Ir(p,a)&&(_t(e,a^1,f)||(u=!0,ot(p)&&(r[s]=Ar(p),t[s]=ye(cr,n,f,Se,on),s+=1)))}return Bt(s,u)}i(Ec,"generateMysticMoves");function vc(e,n,t,o,r){let a=e.active,s=o,u=!1,c=wt,l=a,m=d(En.starts,n),f=d(En.counts,n);for(let p=0;p<f;p+=1){let b=d(En.list,m+p),y=g(e.cells,b);if(!Ir(y,a)||_t(e,a^1,b))continue;let C=mo(n,b);if(g(e.cells,C)!==0)continue;let I=w(e.squares,C);if(I===Je||I>=ce||(u=!0,!ot(y)))continue;let _=Ar(y),P=w(e.squares,b),F=x(y);if(!(!(N(y)===ge)&&(F!==0&&F!==be||P===Je||P>=ce))){r[s]=_,t[s]=ye(Xe,n,b,Se,on),s+=1;continue}let V=s,U=d(ue.starts,b),le=d(ue.counts,b);for(let Ge=0;Ge<le;Ge+=1){let Te=d(ue.list,U+Ge),sn=g(e.cells,Te),cn=sn===0?-1:G(sn);if(cn!==-1&&cn!==fe)continue;let Pe=w(e.squares,Te);(at(Pe)||Pe>=ce&&ro(Pe)===c&&ao(Pe)===l)&&(cn===fe?N(sn)===Ee?(r[s]=_,t[s]=ye(Xe,n,b,Te,fn),s+=1,r[s]=_,t[s]=ye(Xe,n,b,Te,$n),s+=1):(r[s]=_,t[s]=ye(Xe,n,b,Te,lr),s+=1):(r[s]=_,t[s]=ye(Xe,n,b,Te,on),s+=1))}s===V&&(r[s]=_,t[s]=ye(Xe,n,b,Se,on),s+=1)}return Bt(s,u)}i(vc,"generateDemonMoves");function Tc(e,n,t,o,r){let a=o,s=!1,u=e.active,c=d(uo.starts,n),l=d(uo.counts,n);for(let m=0;m<l;m+=1){let f=d(uo.list,c+m),p=g(e.cells,f);if(p===0||G(p)===H&&ae(p)!==0)continue;s=!0;let b=x(p),y=G(p)===J,C=w(nn,f),I=(1<<21)+Ve(b,u)*(1<<18),_=d(ue.starts,f),P=d(ue.counts,f);for(let F=0;F<P;F+=1){let D=d(ue.list,_+F),L=Cc(e,p,D);if(L===0)continue;let V=0;b!==0&&en(w(e.squares,D))?V+=8192+I:y&&wc(e,D,C,u)&&(V+=40960),L===2?(r[a]=V,t[a]=ye(On,n,f,D,fn),a+=1,r[a]=V,t[a]=ye(On,n,f,D,$n),a+=1):(r[a]=V,t[a]=ye(On,n,f,D,on),a+=1)}}return Bt(a,s)}i(Tc,"generateSpiritMoves");function wc(e,n,t,o){if(w(nn,n)<t)return!0;let r=g(e.cells,n);return G(r)===H&&re(r)===he&&me(r)===o&&ae(r)===0}i(wc,"advancesMana");function Oc(e,n,t,o,r){let a=e.active,s=o,u=!1,c=d(lo.starts,n),l=d(lo.counts,n);for(let m=0;m<l;m+=1){let f=d(lo.list,c+m),p=g(e.cells,f);Ir(p,a)&&(u=!0,ot(p)&&(r[s]=Ar(p),t[s]=ye(ur,n,f,Se,on),s+=1))}return Bt(s,u)}i(Oc,"generateBombMoves");function xc(e,n,t,o,r){let a=o,s=d(ue.starts,n),u=d(ue.counts,n);for(let c=0;c<u;c+=1){let l=d(ue.list,s+c),m=w(e.squares,l);ut(e,l)&&(r[a]=en(m)?(1<<21)+(1<<18):16,t[a]=ye(Io,n,l,Se,on),a+=1)}return a}i(xc,"generateManaMoves");function Rc(e,n,t,o,r){let a=o;if(w(nn,n)!==1)return a;let s=d(ue.starts,n),u=d(ue.counts,n);for(let c=0;c<u;c+=1){let l=d(ue.list,s+c),m=w(e.squares,l);!en(m)||!ut(e,l)||(r[a]=(1<<21)+(1<<18),t[a]=ye(Io,n,l,Se,on),a+=1)}return a}i(Rc,"generateWinningManaMoves");var _c=new Int32Array(hn);function Cr(e,n,t=_c){let o=e.active,r=mn(e.monsMoves),a=xa(e),s=0,u=0;for(let c=0;c<dn;c+=1){let l=d(e.monLocations,ie(c,o));if(l<0)continue;let m=g(e.cells,l);if(G(m)!==H)continue;let f=!1,p=x(m),b=N(m),y=p!==0||b!==0;if(!(!y&&ae(m)!==0)){if(r){let C=gc(e,l,m,n,s,t);s=Lt(C),f||=Ft(C)}if(y){if(b===ge){let C=Oc(e,l,n,s,t);s=Lt(C),f||=Ft(C)}}else if(w(e.squares,l)<ce&&a){if(c===oo){let I=Ec(e,l,n,s,t);s=Lt(I),f||=Ft(I)}else if(c===wt){let I=vc(e,l,n,s,t);s=Lt(I),f||=Ft(I)}else if(c===to){let I=Tc(e,l,n,s,t);s=Lt(I),f||=Ft(I)}}f&&(u+=1)}}if(Ra(e,u)){let c=o+1;for(let l=0;l<e.manaCount;l+=1){let m=d(e.manaIndices,l),f=g(e.cells,m);G(f)===J&&x(f)===c&&(s=xc(e,m,n,s,t))}}else if(d(e.freeMana,o)!==0&&wn(e.firstTurn,e.manaMoves)&&(o===0?e.whiteScore:e.blackScore)+1>=Ae){let c=o+1;for(let l=0;l<e.manaCount;l+=1){let m=d(e.manaIndices,l),f=g(e.cells,m);G(f)===J&&x(f)===c&&(s=Rc(e,m,n,s,t))}}if(s>n.length)throw new RangeError(`fast move buffer capacity exceeded: generated ${s} moves for ${n.length} slots`);return s}i(Cr,"generateMoves");var rn=48,wo=rn-2,Nn=yn-rn-1,Oo=Object.freeze({lateMoveReduction:!0,lateMoveIndex:3,lateMoveDeepIndex:8,moveCountPruning:!0,moveCountDepth:3,moveCountBase:4,moveCountFactor:5,futilityMargin:900,aspirationDelta:0,aspirationMinDepth:3,winsNextTurnThreat:0}),oi=new WeakMap;function ii(e){if(!(Object.isFrozen(e)&&(e.tuning===void 0||Object.isFrozen(e.tuning))))return ri(e);let t=oi.get(e);return t===void 0&&(t=ri(e),oi.set(e,t)),t}i(ii,"memoizedSearchLimits");function ri(e){if(typeof e!="object"||e===null||Array.isArray(e))throw new TypeError("fast search limits must be an object");let n=e,t=n.maxDepth;if(!Number.isSafeInteger(t)||t<0||t>wo)throw new RangeError(`maxDepth must be a safe integer from 0 through ${wo}`);let o=n.maxNodes;if(!Number.isSafeInteger(o)||o<0)throw new RangeError("maxNodes must be a nonnegative safe integer");let r=n.tuning;return Object.freeze({maxDepth:t,maxNodes:o,tuning:r===void 0?Oo:Nc(r)})}i(ri,"normalizeSearchLimits");function Nc(e){if(typeof e!="object"||e===null||Array.isArray(e))throw new TypeError("fast search tuning must be an object");let n=e;return Object.freeze({lateMoveReduction:ai(n,"lateMoveReduction"),lateMoveIndex:kn(n,"lateMoveIndex",hn),lateMoveDeepIndex:kn(n,"lateMoveDeepIndex",hn),moveCountPruning:ai(n,"moveCountPruning"),moveCountDepth:kn(n,"moveCountDepth",wo),moveCountBase:kn(n,"moveCountBase",hn),moveCountFactor:kn(n,"moveCountFactor",hn),futilityMargin:kn(n,"futilityMargin",Nn),aspirationDelta:kn(n,"aspirationDelta",Nn),aspirationMinDepth:kn(n,"aspirationMinDepth",wo),winsNextTurnThreat:kn(n,"winsNextTurnThreat",Nn)})}i(Nc,"normalizeSearchTuning");function ai(e,n){let t=e[n];if(typeof t!="boolean")throw new TypeError(`tuning.${n} must be a boolean`);return t}i(ai,"normalizedTuningBoolean");function kn(e,n,t){let o=e[n];if(typeof o!="number")throw new TypeError(`tuning.${n} must be a number`);if(!Number.isSafeInteger(o)||o<0||o>t)throw new RangeError(`tuning.${n} must be a safe integer from 0 through ${t}`);return o}i(kn,"normalizedTuningInteger");var qn=1<<20,Dt=new Int32Array(0);function Vt(e){try{return new Int32Array(e)}catch(n){Re(n)}}i(Vt,"allocateTranspositionPart");var xo=class{static{i(this,"TranspositionTable")}keyLo=Dt;keyHi=Dt;score=Dt;info=Dt;move=Dt;entries=0;generation=1;mask=0;deactivate(){this.mask=0}prepare(n){if(this.keyLo.length!==0)return this.mask=qn-1,!0;if(n())return!1;let t=Vt(qn);if(n())return!1;let o=Vt(qn);if(n())return!1;let r=Vt(qn);if(n())return!1;let a=Vt(qn);if(n())return!1;let s=Vt(qn);return n()?!1:(this.keyLo=t,this.keyHi=o,this.score=r,this.info=a,this.move=s,this.entries=0,this.generation=1,this.mask=qn-1,!0)}clear(){this.keyLo.fill(0),this.keyHi.fill(0),this.score.fill(0),this.info.fill(0),this.move.fill(0),this.entries=0,this.generation=1}};var Pc=16,Ut=1<<Pc,Lc=Ut-1,Fc=1<<30,si=0,ci=1,ui=2,Bc=3,li=4194303,Dc=2047,Vc=32768,Uc=1<<28,Wc=1<<24,Gc=1<<23,Pn=yn*2,di=i(()=>!1,"NO_TIMEOUT"),bi=Ce,yi=ee+1,hi=An+1,ki=_e+1,Mi=2,gr=4,Kc=bi*yi*hi*ki*Mi*gr*gr;if(po.length!==er.length||po.length<Kc)throw new RangeError("fast scalar hash table is too small for the configured state space");function jc(e,n){if(e===n)return!0;if(e?.length!==n.length)return!1;for(let t=0;t<n.length;t+=1)if(w(e,t)!==w(n,t))return!1;return!0}i(jc,"sameSquares");var Ro=class{static{i(this,"FastSearcher")}#e=[];#n=[];#t=[];#o;#r=new Int32Array(rn*2);#a=new Int32Array(Ce*121*121);#y=new Int32Array(rn+1);#s=new Int32Array(Ut);#h=new Int32Array(Ut);#b=new Int32Array(Ut);#d=new Float64Array(Ut);#c=0;#k;#M=0;#S;#m=vo;#C=Oo;#g=0;#f=0;#E=0;#u=!1;#v=!1;#i=0;#I=di;constructor(){this.#o=new xo;for(let n=0;n<=rn;n+=1)this.#e.push(new Ao),this.#n.push(new Int32Array(hn)),this.#t.push(new Int32Array(hn))}get root(){return ke(this.#e,0)}get size(){return this.#o.entries}search(n,t,o=Rn){let r=ii(n),a=Ya(o);if(this.#v=!1,this.#i=0,br(this.root)!==-1)return{move:0,score:0,depth:0,nodes:0,supported:!0};this.#m=Za(a);let s=r.tuning;this.#C=s,this.#g=s.winsNextTurnThreat;let u=!jc(this.#S,this.root.squares);(a!==this.#k||s.winsNextTurnThreat!==this.#M||u)&&(this.#k=a,this.#M=s.winsNextTurnThreat,this.#S=this.root.squares,this.#c>=Fc&&(this.#c=0,this.#b.fill(0)),this.#c+=1),this.#f=0,this.#E=r.maxNodes,this.#u=!1,this.#I=t,this.#o.deactivate();try{this.#r.fill(0),this.#a.fill(0);let c=0,l=0,m=0;for(let f=1;f<=r.maxDepth;f+=1){if(f===2){if(this.#f>=this.#E||!this.#o.prepare(this.#I)){this.#u=!0;break}this.#N()}let p=-Pn,b=Pn;s.aspirationDelta>0&&m>0&&f>=s.aspirationMinDepth&&(p=l-s.aspirationDelta,b=l+s.aspirationDelta);let y=this.#w(f,c,p,b),C=0;for(;!this.#l()&&y.move!==0&&(y.score<=p||y.score>=b)&&(p>-Pn||b<Pn);){C+=1;let I=s.aspirationDelta*(1<<C);y.score<=p&&(p=C>=2?-Pn:y.score-I),y.score>=b&&(b=C>=2?Pn:y.score+I),y=this.#w(f,y.move,p,b)}if(y.move===0)break;if(this.#l()){m===0&&(c=y.move,l=y.score);break}if(c=y.move,l=y.score,m=f,!y.selective&&l>=yn-rn)break}return{move:c,score:l,depth:m,nodes:this.#f,supported:!this.#v}}finally{this.#o.deactivate(),this.#m=vo,this.#C=Oo,this.#g=0,this.#I=di}}#N(){this.#o.generation+=1,this.#o.generation>li&&this.#o.clear()}#w(n,t,o,r){let a=ke(this.#e,0),s=ke(this.#n,0),u=Cr(a,s,ke(this.#t,0));if(u===0)return{move:0,score:0,selective:!1};this.#R(a,s,u,0,t);let c=ke(this.#t,0),l=o,m=0,f=-Pn,p=!1;for(let b=0;b<u;b+=1){this.#_(s,c,b,u);let y=d(s,b),C,I=this.#i,_;if(b===0?(C=this.#p(a,y,0,n-1,l,r),_=this.#i!==I):(C=this.#p(a,y,0,n-1,l,l+1),_=this.#i!==I,C>l&&!this.#l()&&(I=this.#i,C=this.#p(a,y,0,n-1,l,r),_=this.#i!==I)),this.#l()||(C>f&&(f=C,m=y,p=_,C>l&&(l=C)),l>=r))break}return m===0&&(m=d(s,0),f=0,p=!0),{move:m,score:f,selective:p}}#p(n,t,o,r,a,s){let u=ke(this.#e,o+1);u.copyFrom(n),this.#y[o]=t;let c=_a(u,t);return c===dr?(this.#v=!0,this.#u=!0,0):c!==-1?c===n.active?yn-o:-(yn-o):u.active===n.active?this.#O(r,o+1,a,s):-this.#O(r,o+1,-s,-a)}#O(n,t,o,r){if(!this.#T())return 0;let a=ke(this.#e,t);if(t>=rn-2)return this.#A(a);if(n<=0)return this.#A(a);let s=o,u=this.#P(a,t),c=mi(a),l=fi(a,c,u),m=pi(a,c,u),f=this.#o,p=(l^m*3)&f.mask,b=0,y=d(f.info,p),C=d(f.keyLo,p)===l&&d(f.keyHi,p)===m&&(y>>>8&li)===f.generation;if(C&&(b=d(f.move,p),(y>>2&63)>=n)){let we=d(f.score,p),Ke=y&3;if(Ke===si||Ke===ci&&we>=r||Ke===ui&&we<=s)return we}let I=this.#C,_=ke(this.#n,t),P=Cr(a,_,ke(this.#t,t));if(P===0)return this.#A(a,l,m);u!==0&&(P=this.#L(_,P,u,t)),this.#R(a,_,P,t,b);let F=ke(this.#t,t),D=P;if(I.moveCountPruning&&n<=I.moveCountDepth){let de=I.moveCountBase+I.moveCountFactor*n;de<D&&(D=de)}let L=n<=2;if(L&&!this.#T()||this.#l())return 0;let V=!1,U=!1,le=-Pn,Ge=0,Te=this.#i;for(let de=0;de<P;de+=1){this.#_(_,F,de,P);let we=d(_,de),Ke=d(F,de)>=Vc;if(!Ke&&Ge!==0){let v=de>=D;if(!v&&L&&(V||(U=this.#x(a,l,m)+I.futilityMargin*n<=o,V=!0),v=U),v){this.#i+=1;break}}let S;if(de===0)S=this.#p(a,we,t,n-1,s,r);else{let v=0;I.lateMoveReduction&&!Ke&&n>=3&&de>=I.lateMoveIndex&&(v=de>=I.lateMoveDeepIndex?2:1,v>=n&&(v=n-1)),S=this.#p(a,we,t,n-1-v,s,s+1),!this.#l()&&S>s&&(v>0||S<r)&&(S=this.#p(a,we,t,n-1,s,r))}if(this.#l())return 0;if(S>le&&(le=S,Ge=we),S>s&&(s=S),s>=r){this.#F(a,we,t,n,Ke);break}}if(Ge===0)return this.#A(a);let cn=this.#i!==Te?Bc:le>=r?ci:le<=o?ui:si,Pe=le,Fn=n;if(Pe<yn-rn&&Pe>-yn+rn){let de=y>>2&63;(!C||Fn>=de)&&(y===0&&d(f.info,p)===0&&(f.entries+=1),f.keyLo[p]=l,f.keyHi[p]=m,f.score[p]=Pe,f.info[p]=f.generation<<8|Fn<<2|cn,f.move[p]=Ge)}return le}#P(n,t){if(t===0)return 0;let o=d(this.#y,t-1);return st(o)===tn&&ke(this.#e,t-1).active===n.active?o:0}#L(n,t,o,r){let a=Qe(o),s=Ne(o),u=ke(this.#t,r),c=0;for(let l=0;l<t;l+=1){let m=d(n,l);if(st(m)===tn&&m<o){let f=Qe(m),p=Ne(m);if(f!==a&&f!==s&&p!==a&&p!==s)continue}n[c]=m,u[c]=d(u,l),c+=1}return c===0?t:c}#l(){return this.#u}#T(){return this.#u?!1:this.#f>=this.#E?(this.#u=!0,!1):(this.#f+=1,(this.#f&Dc)===0&&this.#I()?(this.#u=!0,!1):!0)}#x(n,t,o){let r=t,a=o;if(r===void 0||a===void 0){let l=mi(n);r=fi(n,l),a=pi(n,l)}let s=(r^a*3)&Lc,u;d(this.#b,s)===this.#c&&d(this.#s,s)===r&&d(this.#h,s)===a?u=this.#d[s]??0:(u=ti(n,this.#m,this.#g),this.#s[s]=r,this.#h[s]=a,this.#d[s]=u,this.#b[s]=this.#c);let c=n.active===0?u:-u;return c>Nn?Nn:c<-Nn?-Nn:c}#A(n,t,o){return this.#T()?this.#x(n,t,o):0}#F(n,t,o,r,a){if(a)return;let s=o*2;d(this.#r,s)!==t&&(this.#r[s+1]=d(this.#r,s),this.#r[s]=t);let u=n.active*121*121+Qe(t)*121+Ne(t),c=d(this.#a,u)+r*r;this.#a[u]=c>1<<20?1<<20:c}#R(n,t,o,r,a){let s=ke(this.#t,r),u=d(this.#r,r*2),c=d(this.#r,r*2+1),l=n.active*121*121;for(let m=0;m<o;m+=1){let f=d(t,m),p=d(s,m);if(f===a)p+=Uc;else if(f===u)p+=Wc;else if(f===c)p+=Gc;else{let b=d(this.#a,l+Qe(f)*121+Ne(f));p+=b>8191?8191:b}s[m]=p}}#_(n,t,o,r){let a=o,s=d(t,o);for(let c=o+1;c<r;c+=1){let l=d(t,c);l>s&&(s=l,a=c)}if(a===o)return;let u=d(n,o);n[o]=d(n,a),n[a]=u,t[a]=d(t,o),t[o]=s}};function mi(e){let n=d(e.potions,0),t=d(e.potions,1),o=n>2?3:n,a=t>2?3:t;return a=o+gr*a,a=(e.firstTurn?1:0)+Mi*a,a=e.actionsUsed+ki*a,a=e.manaMoves+hi*a,a=e.monsMoves+yi*a,e.active+bi*a}i(mi,"scalarIndex");function fi(e,n,t=0){return e.hashLo^d(po,n)^e.whiteScore*2654435761^e.blackScore*2135587861^d(e.potions,0)^Math.imul(t,668265261)}i(fi,"stateKeyLo");function pi(e,n,t=0){return e.hashHi^d(er,n)^e.whiteScore*2246822507^e.blackScore*3266489909^d(e.potions,1)^Math.imul(t,374761393)}i(pi,"stateKeyHi");var $c=Object.freeze({lateMoveReduction:!0,lateMoveIndex:2,lateMoveDeepIndex:6,moveCountPruning:!0,moveCountDepth:3,moveCountBase:7,moveCountFactor:7,futilityMargin:900,aspirationDelta:600,aspirationMinDepth:2,winsNextTurnThreat:0}),qc=Object.freeze({lateMoveReduction:!0,lateMoveIndex:2,lateMoveDeepIndex:6,moveCountPruning:!0,moveCountDepth:3,moveCountBase:7,moveCountFactor:7,futilityMargin:900,aspirationDelta:600,aspirationMinDepth:2,winsNextTurnThreat:2500}),Hc=Object.freeze({lateMoveReduction:!0,lateMoveIndex:3,lateMoveDeepIndex:8,moveCountPruning:!0,moveCountDepth:3,moveCountBase:4,moveCountFactor:5,futilityMargin:900,aspirationDelta:0,aspirationMinDepth:3,winsNextTurnThreat:0}),zc=Object.freeze({fast:Object.freeze({budgetMs:50,limits:Object.freeze({maxDepth:40,maxNodes:38400,tuning:qc})}),normal:Object.freeze({budgetMs:150,limits:Object.freeze({maxDepth:40,maxNodes:184e3,tuning:$c})}),pro:Object.freeze({budgetMs:650,limits:Object.freeze({maxDepth:40,maxNodes:2e6,tuning:Hc})})});function Xc(){return globalThis.performance.now()}i(Xc,"systemClock");function Si(e){let n=e();if(!Number.isFinite(n))throw new RangeError("automove clock must return a finite number");return n}i(Si,"readClock");function Qc(){return globalThis.WeakRef}i(Qc,"weakRefConstructor");var Er=class{static{i(this,"FastSearcherPool")}#e;run(n){let t=Qc(),o=t===void 0?void 0:this.#e?.deref();if(o===void 0)try{o=new Ro}catch(r){if(r instanceof RangeError)return It;throw r}this.#e=void 0;try{return n(o)}catch(r){if(At(r))return It;throw r}finally{t!==void 0&&(this.#e??=new t(o))}}},Yc=new Er;function vr(e,n,t=Xc){let o=zc[n],r=Si(t)+o.budgetMs,a=!1,s=i(()=>a?!0:(a=Si(t)>=r,a),"deadlineReached");if(e.winnerColor()!==void 0||s())return{kind:"fallback"};let u;try{u=new Ao}catch(l){if(l instanceof RangeError)return{kind:"fallback"};throw l}if(!Fa(u,e,o.limits.maxDepth)||s())return{kind:"fallback"};let c=Yc.run(l=>{if(!s()&&(l.root.copyFrom(u),!s()))return l.search(o.limits,s,Rn)});return c===void 0||At(c)||!c.supported||c.move===0?{kind:"fallback"}:{kind:"selected",inputs:Ba(c.move)}}i(vr,"selectPackedInputs");function Ii(e){switch(e.kind){case"takeback":return 0;case"location":return 1;case"modifier":return 2}}i(Ii,"inputTag");function Zc(e,n){let t=Ii(e)-Ii(n);return t!==0?t:e.kind==="location"&&n.kind==="location"?e.location.i-n.location.i||e.location.j-n.location.j:e.kind==="modifier"&&n.kind==="modifier"?$o[e.modifier]-$o[n.modifier]:0}i(Zc,"compareInputs");function Jc(e){switch(e.kind){case"invalid-input":case"events":return;case"locations-to-start-from":return e.locations.map(n=>({kind:"location",location:n}));case"next-input-options":return e.nextInputs.map(({input:n})=>n)}}i(Jc,"nextInputs");function Tr(e,n){let t=e.fork().processInput(n,!1,!1);return t.kind==="events"?t:void 0}i(Tr,"applyInputs");function Ai(e){let n=e.fork(),t=[],o=i(()=>{let r=t.length===0?n.processInputWithStartOptions(t,!0,!1,Yo):n.inspectInputGrammar(t,Yo);if(r.kind==="invalid-input")return!1;if(r.kind==="events")return t.length>0&&Tr(n,t)!==void 0;if(t.length===Qn)return!1;let a=Jc(r)?.sort(Zc);if(a===void 0||a.length===0)return!1;for(let s of a){if(t.push(s),o())return!0;t.pop()}return!1},"findCompletion");return o()?t:[]}i(Ai,"deterministicLegalFallbackInputs");function Ci(e,n,t){let o=e.fen(),r=t===void 0?vr(e,n):vr(e,n,t),a=r.kind==="selected"?r.inputs:Ai(e),s=Tr(e,a);if(s===void 0&&r.kind==="selected"&&(a=Ai(e),s=Tr(e,a)),e.fen()!==o)throw new Error("automove suggestion mutated its source game");return s===void 0?{output:{kind:"invalid-input"},inputFen:""}:{output:s,inputFen:et(a)}}i(Ci,"suggestMove");function Wt(e){return e===h.White?"w":"b"}i(Wt,"colorFen");function We(e){if(!Number.isInteger(e.cooldown)||e.cooldown<0||e.cooldown>2)throw new RangeError("mon cooldown must be an integer from 0 through 2");let n=(()=>{switch(e.kind){case M.Demon:return"e";case M.Drainer:return"d";case M.Angel:return"a";case M.Spirit:return"s";case M.Mystic:return"y"}})();return`${e.color===h.White?n.toUpperCase():n}${e.cooldown}`}i(We,"monFen");function eu(e,n){let t,o;switch(e.charCodeAt(n)){case 69:t=h.White,o=M.Demon;break;case 101:t=h.Black,o=M.Demon;break;case 68:t=h.White,o=M.Drainer;break;case 100:t=h.Black,o=M.Drainer;break;case 65:t=h.White,o=M.Angel;break;case 97:t=h.Black,o=M.Angel;break;case 83:t=h.White,o=M.Spirit;break;case 115:t=h.Black,o=M.Spirit;break;case 89:t=h.White,o=M.Mystic;break;case 121:t=h.Black,o=M.Mystic;break;default:return}let r=e.charCodeAt(n+1);return r<48||r>50?void 0:Vn(o,t,r-48)}i(eu,"parseMonFenAt");function Hn(e){return e.kind==="supermana"?"U":e.color===h.White?"M":"m"}i(Hn,"manaFen");function gi(e){switch(e){case 77:return Yn(h.White);case 109:return Yn(h.Black);case 85:return Mn;default:return}}i(gi,"parseManaCode");function Ei(e){switch(e){case A.Potion:return"P";case A.Bomb:return"B";case A.BombOrPotion:return"Q"}}i(Ei,"consumableFen");function vi(e){switch(e){case 80:return A.Potion;case 66:return A.Bomb;case 81:return A.BombOrPotion;default:return}}i(vi,"parseConsumableCode");function dt(e){switch(e.kind){case"mon":return`${We(e.mon)}x`;case"mana":return`xx${Hn(e.mana)}`;case"mon-with-mana":return`${We(e.mon)}${Hn(e.mana)}`;case"mon-with-consumable":return`${We(e.mon)}${Ei(e.consumable)}`;case"consumable":return`xx${Ei(e.consumable)}`}}i(dt,"itemFen");function Ti(e,n){let t=e.charCodeAt(n),o=e.charCodeAt(n+2);if(t===120){if(e.charCodeAt(n+1)!==120)return;let u=gi(o);if(u!==void 0)return Ze(u);let c=vi(o);return c===void 0?void 0:bt(c)}let r=eu(e,n);if(r===void 0)return;let a=gi(o);if(a!==void 0)return Zn(r,a);let s=vi(o);return s!==void 0?pt(r,s):o===120?Fe(r):void 0}i(Ti,"parseItemFenAt");function nu(e){switch(e.kind){case"mon-move":return`mm ${dt(e.item)} ${B(e.from)} ${B(e.to)}`;case"mana-move":return`mma ${Hn(e.mana)} ${B(e.from)} ${B(e.to)}`;case"mana-scored":return`ms ${Hn(e.mana)} ${B(e.at)}`;case"mystic-action":return`ma ${We(e.mystic)} ${B(e.from)} ${B(e.to)}`;case"demon-action":return`da ${We(e.demon)} ${B(e.from)} ${B(e.to)}`;case"demon-additional-step":return`das ${We(e.demon)} ${B(e.from)} ${B(e.to)}`;case"spirit-target-move":return`stm ${dt(e.item)} ${B(e.from)} ${B(e.to)} ${B(e.by)}`;case"pickup-bomb":return`pb ${We(e.by)} ${B(e.at)}`;case"pickup-potion":return`pp ${dt(e.by)} ${B(e.at)}`;case"use-potion":return`up ${B(e.from)} ${B(e.to)}`;case"pickup-mana":return`pm ${Hn(e.mana)} ${We(e.by)} ${B(e.at)}`;case"mon-fainted":return`mf ${We(e.mon)} ${B(e.from)} ${B(e.to)}`;case"mana-dropped":return`md ${Hn(e.mana)} ${B(e.at)}`;case"supermana-back-to-base":return`sb ${B(e.from)} ${B(e.to)}`;case"bomb-attack":return`ba ${We(e.by)} ${B(e.from)} ${B(e.to)}`;case"mon-awake":return`maw ${We(e.mon)} ${B(e.at)}`;case"bomb-explosion":return`be ${B(e.at)}`;case"next-turn":return`nt ${Wt(e.color)}`;case"game-over":return`go ${Wt(e.winner)}`;case"takeback":return"z"}}i(nu,"eventFen");function wi(e){return e.map(nu).join(" ")}i(wi,"eventArrayFen");function Oi(e){return e===void 0?void 0:{i:e.i,j:e.j}}i(Oi,"detachedLocation");function wr(e){let n=new Array(e.length);for(let t=0;t<e.length;t+=1){let o=e[t];o!==void 0&&(n[t]={i:o.i,j:o.j})}return n}i(wr,"detachedLocations");function zn(e){let n=e;return n===h.White?0:n===h.Black?1:void 0}i(zn,"boardColorIndex");var mt=class{constructor(n=ln,t,o,r=!1){this.variant=n;if(o!==void 0){this.storage=o;return}let a=t??la(n);if(a.length!==121)throw new RangeError(`board requires exactly ${121} item slots`);this.storage={itemSlots:t===void 0||r?[...a]:a.map(s=>s===void 0?void 0:Dn(s)),occupiedEntries:void 0,categoryDerived:void 0}}variant;static{i(this,"Board")}storage;get items(){return[...this.storage.itemSlots]}static fromItems(n,t){return new Ln(t,n)}fork(){let n=new Ln(this.variant,this.storage.itemSlots,void 0,!0);return n.storage.occupiedEntries=this.storage.occupiedEntries,n.storage.categoryDerived=this.storage.categoryDerived,n}get(n){if(un(n))return this.storage.itemSlots[oe(n)]}itemAtIndex(n){return this.storage.itemSlots[n]}squareAt(n){return Wn(n),Jo(n,this.variant)}allMonsBases(){return gt}supermanaBase(){return Ct}allMonsLocations(n){let t=zn(n);return t===void 0?[]:wr(this.getCategoryDerived().monsLocations[t])}allFreeRegularManaLocations(n){let t=zn(n);return t===void 0?[]:wr(this.getCategoryDerived().freeRegularManaLocations[t])}base(n){return da(n.kind,n.color)}faintedMonsLocations(n){let t=zn(n);return t===void 0?[]:wr(this.getCategoryDerived().faintedMonsLocations[t])}findMana(n){let t=zn(n);if(t!==void 0)return Oi(this.getCategoryDerived().freeRegularManaLocations[t][0])}findAwakeAngel(n){let t=zn(n);if(t!==void 0)return Oi(this.getCategoryDerived().awakeAngelLocations[t])}itemsEqual(n){for(let t=0;t<121;t+=1){let o=this.storage.itemSlots[t],r=n.storage.itemSlots[t];if(o===void 0||r===void 0){if(o!==r)return!1}else if(!qr(o,r))return!1}return!0}getOccupiedEntries(){if(this.storage.occupiedEntries!==void 0)return this.storage.occupiedEntries;let n=[];for(let t=0;t<121;t+=1){let o=this.storage.itemSlots[t],r=Qo[t];o!==void 0&&r!==void 0&&n.push([r,o])}return this.storage.occupiedEntries=n,n}getCategoryDerived(){if(this.storage.categoryDerived!==void 0)return this.storage.categoryDerived;let n=[],t=[],o=[],r=[],a=[],s=[],u,c;for(let m=0;m<121;m+=1){let f=this.storage.itemSlots[m];if(f!==void 0){let p=Qo[m];if(p!==void 0){let b=$(f);if(b!==void 0){let y=zn(b.color);if(y===void 0)continue;(y===0?n:t).push(p),f.kind==="mon"&&Ie(b)?(y===0?a:s).push(p):b.kind===M.Angel&&!Ie(b)&&(y===0&&u===void 0?u=p:y===1&&c===void 0&&(c=p))}else if(f.kind==="mana"&&f.mana.kind==="regular"){let y=zn(f.mana.color);y!==void 0&&(y===0?o:r).push(p)}}}}let l={monsLocations:[n,t],freeRegularManaLocations:[o,r],faintedMonsLocations:[a,s],awakeAngelLocations:[u,c]};return this.storage.categoryDerived=l,l}entries(){return this.getOccupiedEntries().values()}},Ln=class extends mt{static{i(this,"MutableBoard")}#e;delete(n){Wn(n),this.storage.itemSlots[oe(n)]=void 0,this.storage.occupiedEntries=void 0,this.storage.categoryDerived=void 0}set(n,t){Wn(n),this.storage.itemSlots[oe(n)]=Dn(t),this.storage.occupiedEntries=void 0,this.storage.categoryDerived=void 0}readonlyView(){return this.#e??=new mt(this.variant,void 0,this.storage),this.#e}};var xi=Ae+1,tu=Object.freeze(["","n01","n02","n03","n04","n05","n06","n07","n08","n09","n10","n11"]);function ou(e){let n="",t=0;for(let o=0;o<11;o+=1){o>0&&(n+="/");let r=t+11,a=0;for(;t<r;){let s=e.itemAtIndex(t);if(t+=1,s===void 0){a+=1;continue}a>0&&(n+=Ri(a),a=0),n+=dt(s)}a>0&&(n+=Ri(a))}return n}i(ou,"boardFen");function ru(e,n,t,o){let r=new Array(121).fill(void 0),a=n;for(let s=0;s<11;s+=1){let u=0,c=!1;for(;a<t&&e.charCodeAt(a)!==47;){if(e.charCodeAt(a)===110){if(c||a+2>=t)return;let m=e.charCodeAt(a+1)-48,f=e.charCodeAt(a+2)-48;if(m<0||m>9||f<0||f>9)return;let p=m*10+f;if(p<1||u+p>11)return;u+=p,a+=3,c=!0;continue}if(a+2>=t||u>=11)return;let l=Ti(e,a);if(l===void 0)return;r[s*11+u]=l,u+=1,a+=3,c=!1}if(u!==11)return;if(s<10){if(e.charCodeAt(a)!==47)return;a+=1}}if(a===t)return new Ln(o,r,void 0,!0)}i(ru,"parseBoardFenRange");function _i(e){let n=`${e.whiteScore} ${e.blackScore} ${Wt(e.activeColor)} ${e.actionsUsedCount} ${e.manaMovesCount} ${e.monsMovesCount} ${e.whitePotionsCount} ${e.blackPotionsCount} ${e.turnNumber} ${ou(e.board)}`,t=e.board.variant;return t===ln?n:`${n} ${sa(t)}`}i(_i,"gameFen");function Ni(e){let n=0,t=i(_=>{let P=n,F=0,D=!1;for(;n<e.length;){let L=e.charCodeAt(n);if(L===32)break;if(L<48||L>57)return-1;if(n===P)D=L===48;else if(D)return-1;if(F=F*10+(L-48),!Number.isSafeInteger(F))return-1;n+=1}if(n===P)return-1;if(_){if(n>=e.length)return-1;n+=1}else if(n!==e.length)return-1;return F},"readInteger"),o=t(!0),r=t(!0),a=e.charCodeAt(n),s=a===119?h.White:a===98?h.Black:void 0;if(s===void 0||e.charCodeAt(n+1)!==32)return;n+=2;let u=t(!0),c=t(!0),l=t(!0),m=t(!0),f=t(!0),p=t(!0);if(o<0||r<0||u<0||c<0||l<0||m<0||f<0||p<0||o>xi||r>xi||u>_e||c>An||l>ee||p<1)return;let b=n;for(;n<e.length&&e.charCodeAt(n)!==32;)n+=1;let y=n,C=ln;if(n<e.length){n+=1;let _=t(!1),P=ua(_);if(P===void 0||P===ln)return;C=P}let I=ru(e,b,y,C);if(I!==void 0)return{board:I,whiteScore:o,blackScore:r,activeColor:s,actionsUsedCount:u,manaMovesCount:c,monsMovesCount:l,whitePotionsCount:m,blackPotionsCount:f,turnNumber:p}}i(Ni,"parseGameFen");function Ri(e){return tu[e]??""}i(Ri,"emptyRunFen");function Pi(e){return{whiteScore:e.whiteScore,blackScore:e.blackScore,activeColor:e.activeColor,actionsUsedCount:e.actionsUsedCount,manaMovesCount:e.manaMovesCount,monsMovesCount:e.monsMovesCount,whitePotionsCount:e.whitePotionsCount,blackPotionsCount:e.blackPotionsCount}}i(Pi,"copyRulesCounters");function _o(e,n,t,o){let r=e[n]+t;return o&&!Number.isSafeInteger(r)?!1:(e[n]=r,!0)}i(_o,"addCounter");function Or(e,n,t,o){if(e.actionsUsedCount<_e)return e.actionsUsedCount+=1,{valid:!0};let r=e.activeColor===h.White?"whitePotionsCount":"blackPotionsCount";return o&&e[r]<=0?{valid:!1}:(e[r]-=1,{valid:!0,potionUse:{from:n,to:t}})}i(Or,"consumeAction");function xr(e,n,t,o){switch(n.kind){case"mon-move":return{valid:_o(e,"monsMovesCount",1,o)};case"mana-move":return{valid:_o(e,"manaMovesCount",1,o)};case"mana-scored":{let r=e.activeColor===h.White?"whiteScore":"blackScore";return{valid:_o(e,r,jr(n.mana,e.activeColor),o)}}case"mystic-action":return Or(e,n.from,n.to,o);case"demon-action":{let a=t.find(s=>s.kind==="demon-additional-step")?.to??n.to;return Or(e,a,a,o)}case"spirit-target-move":return Or(e,n.by,n.to,o);case"pickup-potion":{let r=$(n.by);if(r===void 0)return{valid:!0};let a=r.color===h.White?"whitePotionsCount":"blackPotionsCount";return{valid:_o(e,a,1,o)}}case"demon-additional-step":case"pickup-bomb":case"use-potion":case"pickup-mana":case"mon-fainted":case"mana-dropped":case"supermana-back-to-base":case"bomb-attack":case"mon-awake":case"bomb-explosion":case"next-turn":case"game-over":case"takeback":return{valid:!0}}}i(xr,"projectEventCounters");function Rr(e,n){let t=Pi(e);for(let r of n)if(!xr(t,r,n,!0).valid)return!1;if(e.turnNumber<Number.MAX_SAFE_INTEGER)return!0;let o={...e,board:e.board.fork(),turnNumber:Number.MAX_SAFE_INTEGER-1};return!No(o,n).turnAdvanced}i(Rr,"canApplyRulesEvents");function au(e,n,t,o){let r=xr(e,n,t,!1);switch(r.valid&&r.potionUse!==void 0&&o.push({kind:"use-potion",...r.potionUse}),n.kind){case"mon-move":e.board.delete(n.from),e.board.set(n.to,n.item);break;case"mana-move":e.board.delete(n.from),e.board.set(n.to,Ze(n.mana));break;case"mana-scored":{let a=e.board.get(n.at);if(a!==void 0){let s=$(a);s===void 0?e.board.delete(n.at):e.board.set(n.at,Fe(s))}break}case"mystic-action":e.board.delete(n.to);break;case"demon-action":{e.board.delete(n.from),t.find(s=>s.kind==="demon-additional-step")?.to===void 0?e.board.set(n.to,Fe(n.demon)):e.board.delete(n.to);break}case"demon-additional-step":e.board.set(n.to,Fe(n.demon));break;case"spirit-target-move":e.board.delete(n.from),e.board.set(n.to,n.item);break;case"pickup-bomb":e.board.set(n.at,pt(n.by,A.Bomb));break;case"pickup-potion":{if($(n.by)===void 0)break;e.board.set(n.at,n.by);break}case"pickup-mana":e.board.set(n.at,Zn(n.by,n.mana));break;case"mon-fainted":e.board.set(n.to,Fe(Gr(n.mon)));break;case"mana-dropped":e.board.set(n.at,Ze(n.mana));break;case"supermana-back-to-base":{let a=e.board.get(n.to);e.board.set(n.to,a?.kind==="mon"?Zn(a.mon,Mn):Ze(Mn));break}case"bomb-attack":e.board.delete(n.to),e.board.set(n.from,Fe(n.by));break;case"bomb-explosion":{let a=e.board.get(n.at),s=a===void 0?void 0:$(a);(s===void 0||!Ie(s)||!kt(e.board.base(s),n.at))&&e.board.delete(n.at);break}case"mon-awake":case"game-over":case"next-turn":case"takeback":case"use-potion":break}}i(au,"applyEvent");function iu(e,n){e.activeColor=Sn(e.activeColor),e.turnNumber+=1,e.actionsUsedCount=0,e.manaMovesCount=0,e.monsMovesCount=0,n.push({kind:"next-turn",color:e.activeColor});for(let t of e.board.faintedMonsLocations(e.activeColor)){let o=e.board.get(t),r=o===void 0?void 0:$(o);if(r===void 0)continue;let a=Kr(r);Ie(a)||n.push({kind:"mon-awake",mon:a,at:t}),e.board.set(t,Fe(a))}}i(iu,"advanceTurn");function No(e,n){let t=[];for(let a of n)au(e,a,n,t);let o=ho(e),r=!1;return o!==void 0?t.push({kind:"game-over",winner:o}):va(e)&&(iu(e,t),r=!0),{events:[...n,...t],turnAdvanced:r,winner:o}}i(No,"applyRulesEvents");var Gt=Symbol("cache-miss"),Bi=Symbol("cached-undefined"),Po=Object.freeze({completionViability:16384,secondInputOptions:4096,secondStage:8192,thirdStage:8192});function su(e){return e===void 0?void 0:[e[0].map(Un),e[1].map(Jn)]}i(su,"copyStageResult");function Li(e){return e===void 0?Bi:[e[0].map(Un),e[1].map(Jn)]}i(Li,"storeStageResult");function Fi(e){return e===Bi?void 0:su(e)}i(Fi,"copyStoredStageResult");function Lo(e,n,t,o){e.size>=o&&!e.has(n)&&e.clear(),e.set(n,t)}i(Lo,"setBounded");var Fo=class{static{i(this,"RulesQueryCache")}#e;#n;#t;#o;#r;invalidate(){this.#e=void 0,this.#n=void 0,this.#t=void 0,this.#o=void 0,this.#r=void 0}getStartSuggestion(n){let t=this.#e?.[n];return t===void 0?void 0:Ho(t)}setStartSuggestion(n,t){(this.#e??=new Array(4))[n]=Ho(t)}getCompletionViability(n){return this.#n?.get(n)}setCompletionViability(n,t){Lo(this.#n??=new Map,n,t,Po.completionViability)}getSecondInputOptions(n){let t=this.#t?.get(n);return t===void 0?void 0:t.map(Jn)}setSecondInputOptions(n,t){Lo(this.#t??=new Map,n,t.map(Jn),Po.secondInputOptions)}lookupSecondStage(n){let t=this.#o?.get(n);return t===void 0?Gt:Fi(t)}setSecondStage(n,t){Lo(this.#o??=new Map,n,Li(t),Po.secondStage)}lookupThirdStage(n){let t=this.#r?.get(n);return t===void 0?Gt:Fi(t)}setThirdStage(n,t){Lo(this.#r??=new Map,n,Li(t),Po.thirdStage)}};function Kt(e){return e.map(n=>({fen:n.fen,color:n.color,events:n.events.map(Un)}))}i(Kt,"copyTrackingEntries");var Bo=class e{static{i(this,"GameHistory")}#e=[];#n=[];#t=!0;#o;#r=!0;constructor(n=!1){this.#o=n}get takebackFens(){return[...this.#e]}get trackingEntries(){return Kt(this.#n)}get movesVerified(){return this.#t}get verboseTrackingEnabled(){return this.#o}get eventApplicationTrackingEnabled(){return this.#r||this.#o}copy(){let n=new e(this.#o);return n.#e=[...this.#e],n.#n=Kt(this.#n),n.#t=this.#t,n.#r=this.#r,n}fork(){let n=new e(!1);return n.#t=this.#t,n.#r=!1,n}resetForLoadedFen(){this.#a()}resetForBoardReplacement(){this.#a()}#a(){this.#e=[],this.#n=[],this.#t=!1}replace(n){n.takebackFens!==void 0&&(this.#e=[...n.takebackFens]),n.trackingEntries!==void 0&&(this.#n=Kt(n.trackingEntries)),n.movesVerified!==void 0&&(this.#t=n.movesVerified),n.verboseTrackingEnabled!==void 0&&(this.#o=n.verboseTrackingEnabled,n.verboseTrackingEnabled||(this.#n=[]))}setTakebackTracking(n){this.#r=n,n||(this.#e=[])}setVerboseTracking(n){this.#o=n,n||(this.#n=[])}canTakeback(n,t){return this.#r&&this.#e.length>1&&n===t}prepareTakeback(n,t){if(!this.canTakeback(n,t))return;let o=this.#e[this.#e.length-2];if(o!==void 0)return{previousFen:o,takebackFens:this.#e.slice(0,-1),trackingEntries:Kt(this.#n.slice(0,-1))}}commitTakeback(n){this.#e=[...n.takebackFens],this.#n=Kt(n.trackingEntries)}beginEventApplication(n,t){if(!this.#r||this.#e.length!==0)return;let o=n();this.#e.push(o),this.#o&&this.#n.length===0&&this.#n.push({fen:o,color:t,events:[]})}completeEventApplication(n){let t,o=i(()=>t??=n.snapshotFen(),"snapshotFen");this.#r&&(n.winner!==void 0?this.#e=[]:n.turnAdvanced?this.#e=[o()]:this.#e.push(o())),this.#o&&this.#n.push({fen:o(),color:n.color,events:n.events.map(Un)})}};function Di(e,n,t,o){let r=e.board.squareAt(n),a=[];switch(t.kind){case"mon":{let s=t.mon;if(s.color!==e.activeColor||Ie(s))break;if(e.playerCanMoveMon()&&a.push(...e.nextInputsFromLocations(Be(n),O.MonMove,o,u=>{let c=e.board.get(u),l=e.board.squareAt(u),m;switch(c?.kind){case"mon":case"mon-with-mana":case"mon-with-consumable":m=!1;break;case"mana":m=s.kind===M.Drainer;break;case"consumable":case void 0:m=!0;break}if(!m)return!1;switch(l.kind){case"regular":case"consumable-base":case"mana-base":case"mana-pool":return!0;case"supermana-base":return s.kind===M.Drainer&&(c===void 0||c.kind==="mana"&&c.mana.kind==="supermana");case"mon-base":return l.monKind===s.kind&&l.color===s.color}})),r.kind!=="mon-base"&&e.playerCanUseAction())switch(s.kind){case M.Angel:case M.Drainer:break;case M.Mystic:{let u=e.board.findAwakeAngel(Sn(e.activeColor));a.push(...e.nextInputsFromLocations(Zt(n),O.MysticAction,o,c=>{let l=e.board.get(c);if(l===void 0||Zo(u,c))return!1;let m=$(l);return m!==void 0&&s.color!==m.color&&!Ie(m)}));break}case M.Demon:{let u=e.board.findAwakeAngel(Sn(e.activeColor));a.push(...e.nextInputsFromLocations(Jt(n),O.DemonAction,o,c=>{let l=e.board.get(c),m=Yr(n,c),f=e.board.squareAt(m);if(l===void 0||Zo(u,c)||e.board.get(m)!==void 0||f.kind==="supermana-base"||f.kind==="mon-base")return!1;let p=$(l);return p!==void 0&&s.color!==p.color&&!Ie(p)}));break}case M.Spirit:a.push(...e.nextInputsFromLocations(eo(n),O.SpiritTargetCapture,o,u=>{let c=e.board.get(u);return c===void 0?!1:$r(c)}));break}break}case"mana":t.mana.kind==="regular"&&t.mana.color===e.activeColor&&e.playerCanMoveMana()&&a.push(...e.nextInputsFromLocations(Be(n),O.ManaMove,o,s=>rr(e.board,s)));break;case"mon-with-mana":t.mon.color===e.activeColor&&e.playerCanMoveMon()&&a.push(...e.nextInputsFromLocations(Be(n),O.MonMove,o,s=>{let u=e.board.get(s),c=e.board.squareAt(s);switch(u?.kind){case"mon":case"mon-with-mana":case"mon-with-consumable":return!1;case"mana":case"consumable":return!0;case void 0:return Kn(c)?!0:c.kind==="supermana-base"&&t.mana.kind==="supermana"}}));break;case"mon-with-consumable":{let s=t.mon;if(s.color!==e.activeColor)break;e.playerCanMoveMon()&&a.push(...e.nextInputsFromLocations(Be(n),O.MonMove,o,u=>{let c=e.board.get(u),l=e.board.squareAt(u);switch(c?.kind){case"mon":case"mana":case"mon-with-mana":case"mon-with-consumable":return!1;case"consumable":return!0;case void 0:return Kn(l)}})),t.consumable===A.Bomb&&a.push(...e.nextInputsFromLocations(Yt(n),O.BombAttack,o,u=>{let c=e.board.get(u),l=c===void 0?void 0:$(c);return l!==void 0&&s.color!==l.color&&!Ie(l)}));break}case"consumable":break}return a}i(Di,"generateSecondInputOptions");function Vi(e,n,t,o,r){let a=[],s=[],u=e.board.squareAt(r),c=e.board.get(r);switch(n){case O.MonMove:{let l=$(t);if(l===void 0)return;if(s.push({kind:"mon-move",item:t,from:o,to:r}),c!==void 0)switch(c.kind){case"mon":case"mon-with-mana":case"mon-with-consumable":return;case"mana":{let m=In(t);m!==void 0&&s.push({kind:"mana-dropped",mana:m,at:o}),s.push({kind:"pickup-mana",mana:c.mana,by:l,at:r});break}case"consumable":switch(c.consumable){case A.Bomb:case A.Potion:return;case A.BombOrPotion:zo(t)!==void 0||In(t)!==void 0?s.push({kind:"pickup-potion",by:t,at:r}):(a.push(xe({kind:"modifier",modifier:X.SelectBomb},O.SelectConsumable,t)),a.push(xe({kind:"modifier",modifier:X.SelectPotion},O.SelectConsumable,t)));break}break}if(u.kind==="mana-pool"){let m=In(t);m!==void 0&&s.push({kind:"mana-scored",mana:m,at:r})}break}case O.ManaMove:{if(t.kind!=="mana")return;let l=t.mana;if(s.push({kind:"mana-move",mana:l,from:o,to:r}),c!==void 0){if(c.kind!=="mon")return;s.push({kind:"pickup-mana",mana:l,by:c.mon,at:r})}switch(u.kind){case"regular":case"mana-base":case"consumable-base":break;case"mana-pool":s.push({kind:"mana-scored",mana:l,at:r});break;case"mon-base":case"supermana-base":return}break}case O.MysticAction:{if(t.kind!=="mon")return;if(s.push({kind:"mystic-action",mystic:t.mon,from:o,to:r}),c!==void 0){let l=$(c);if(l===void 0)return;if(s.push({kind:"mon-fainted",mon:l,from:r,to:e.board.base(l)}),c.kind==="mon-with-mana"&&(c.mana.kind==="regular"?s.push({kind:"mana-dropped",mana:c.mana,at:r}):s.push({kind:"supermana-back-to-base",from:r,to:e.board.supermanaBase()})),c.kind==="mon-with-consumable")switch(c.consumable){case A.Bomb:s.push({kind:"bomb-explosion",at:r});break;case A.Potion:case A.BombOrPotion:return}}break}case O.DemonAction:{if(t.kind!=="mon")return;let l=t.mon;s.push({kind:"demon-action",demon:l,from:o,to:r});let m=!1,f=!1;if(c!==void 0){let p=$(c);if(p===void 0)return;if(s.push({kind:"mon-fainted",mon:p,from:r,to:e.board.base(p)}),c.kind==="mon-with-mana"&&(c.mana.kind==="regular"?(m=!0,s.push({kind:"mana-dropped",mana:c.mana,at:r})):s.push({kind:"supermana-back-to-base",from:r,to:e.board.supermanaBase()})),c.kind==="mon-with-consumable")switch(c.consumable){case A.Bomb:f=!0,s.push({kind:"bomb-explosion",at:r}),s.push({kind:"mon-fainted",mon:l,from:r,to:e.board.base(l)});break;case A.Potion:case A.BombOrPotion:return}}if(!f&&(u.kind==="supermana-base"||u.kind==="mon-base")&&(m=!0),m)for(let p of Be(r)){let b=e.board.get(p),y=e.board.squareAt(p);b!==void 0&&b.kind!=="consumable"||(Kn(y)?a.push(xe({kind:"location",location:p},O.DemonAdditionalStep)):y.kind==="mon-base"&&y.monKind===l.kind&&y.color===l.color&&a.push(xe({kind:"location",location:p},O.DemonAdditionalStep)))}break}case O.SpiritTargetCapture:{if(c===void 0)return;let l=$(c),m=In(c);a.push(...e.nextInputsFromLocations(Be(r),O.SpiritTargetMove,void 0,f=>{let p=e.board.get(f),b=e.board.squareAt(f);if(!ga(c,p))return!1;switch(b.kind){case"regular":case"consumable-base":case"mana-base":case"mana-pool":return!0;case"supermana-base":{let y=p?.kind==="mana"&&p.mana.kind==="supermana";return m?.kind==="supermana"||m===void 0&&l?.kind===M.Drainer&&(p===void 0||y)||l?.kind===M.Drainer&&y}case"mon-base":return l?.kind===b.monKind&&l.color===b.color&&m===void 0&&zo(c)===void 0}}));break}case O.BombAttack:{let l=$(t);if(l===void 0)return;if(s.push({kind:"bomb-attack",by:l,from:o,to:r}),c!==void 0){let m=$(c);if(m===void 0)return;if(s.push({kind:"mon-fainted",mon:m,from:r,to:e.board.base(m)}),c.kind==="mon-with-mana"&&(c.mana.kind==="regular"?s.push({kind:"mana-dropped",mana:c.mana,at:r}):s.push({kind:"supermana-back-to-base",from:r,to:e.board.supermanaBase()})),c.kind==="mon-with-consumable")switch(c.consumable){case A.Bomb:s.push({kind:"bomb-explosion",at:r});break;case A.Potion:case A.BombOrPotion:return}}break}case O.DemonAdditionalStep:case O.SpiritTargetMove:case O.SelectConsumable:break}return[s,a]}i(Vi,"compileSecondInput");function Ui(e,n,t,o,r){let a=e.get(r),s=[],u=[];switch(n.kind){case O.SpiritTargetMove:{if(n.input.kind!=="location"||a===void 0)return;let c=n.input.location,l=e.get(c),m=e.squareAt(c);if(u.push({kind:"spirit-target-move",item:a,from:r,to:c,by:o}),l!==void 0)switch(a.kind){case"mon":switch(l.kind){case"mon":case"mon-with-mana":case"mon-with-consumable":return;case"mana":u.push({kind:"pickup-mana",mana:l.mana,by:a.mon,at:c});break;case"consumable":switch(l.consumable){case A.Potion:case A.Bomb:return;case A.BombOrPotion:s.push(xe({kind:"modifier",modifier:X.SelectBomb},O.SelectConsumable,a)),s.push(xe({kind:"modifier",modifier:X.SelectPotion},O.SelectConsumable,a));break}break}break;case"mana":if(l.kind!=="mon")return;u.push({kind:"pickup-mana",mana:a.mana,by:l.mon,at:c});break;case"mon-with-mana":switch(l.kind){case"mon":case"mon-with-mana":case"mon-with-consumable":return;case"mana":u.push({kind:"mana-dropped",mana:a.mana,at:r}),u.push({kind:"pickup-mana",mana:l.mana,by:a.mon,at:c});break;case"consumable":switch(l.consumable){case A.Potion:case A.Bomb:return;case A.BombOrPotion:u.push({kind:"pickup-potion",by:a,at:c});break}break}break;case"mon-with-consumable":if(l.kind!=="consumable"||l.consumable!==A.BombOrPotion)return;u.push({kind:"pickup-potion",by:a,at:c});break;case"consumable":switch(l.kind){case"mana":case"consumable":return;case"mon":s.push(xe({kind:"modifier",modifier:X.SelectBomb},O.SelectConsumable,l)),s.push(xe({kind:"modifier",modifier:X.SelectPotion},O.SelectConsumable,l));break;case"mon-with-mana":case"mon-with-consumable":switch(a.consumable){case A.Potion:case A.Bomb:return;case A.BombOrPotion:u.push({kind:"pickup-potion",by:l,at:c});break}break}break}if(m.kind==="mana-pool"){let f=In(a);f!==void 0&&u.push({kind:"mana-scored",mana:f,at:c})}break}case O.DemonAdditionalStep:{if(n.input.kind!=="location")return;let c=$(t);if(c===void 0)return;let l=n.input.location;u.push({kind:"demon-additional-step",demon:c,from:r,to:l});let m=e.get(l);if(m?.kind==="consumable")switch(m.consumable){case A.Potion:case A.Bomb:return;case A.BombOrPotion:s.push(xe({kind:"modifier",modifier:X.SelectBomb},O.SelectConsumable,t)),s.push(xe({kind:"modifier",modifier:X.SelectPotion},O.SelectConsumable,t));break}break}case O.SelectConsumable:{if(n.input.kind!=="modifier")return;let c=$(t);if(c===void 0)return;switch(n.input.modifier){case X.SelectBomb:u.push({kind:"pickup-bomb",by:c,at:r});break;case X.SelectPotion:u.push({kind:"pickup-potion",by:t,at:r});break}break}case O.MonMove:case O.ManaMove:case O.MysticAction:case O.DemonAction:case O.SpiritTargetCapture:case O.BombAttack:return}return[u,s]}i(Ui,"compileThirdInput");function Wi(e,n,t){if(e.kind!=="modifier"||n.input.kind!=="location")return;let r=t.find(s=>yt(s.input,e))?.actorMonItem,a=r===void 0?void 0:$(r);if(!(r===void 0||a===void 0))switch(e.modifier){case X.SelectBomb:return{kind:"pickup-bomb",by:a,at:n.input.location};case X.SelectPotion:return{kind:"pickup-potion",by:r,at:n.input.location}}}i(Wi,"compileFourthInput");function Gi(e,n,t){let o=[],r=Array.from({length:121},()=>!1),a=i(s=>{let u=t([{kind:"location",location:s}]);if(u.kind!=="next-input-options"||u.nextInputs.length===0)return;let c=oe(s);r[c]||(r[c]=!0,o.push(s))},"addWhenValid");for(let s of e.board.allMonsLocations(e.activeColor))a(s);if(Ea(e,o.length!==0,n.includeManaStartsWithPotionAction))for(let s of e.board.allFreeRegularManaLocations(e.activeColor))a(s);return o.length===0?{kind:"invalid-input"}:{kind:"locations-to-start-from",locations:o}}i(Gi,"suggestedInputToStartWith");function Ki(e,n,t,o,r,a){let s=n[0];if(s?.kind!=="location")return{kind:"invalid-input"};let u=s.location,c=e.board().get(u);if(c===void 0)return{kind:"invalid-input"};let l=n[1];if(l!==void 0&&l.kind!=="location")return{kind:"invalid-input"};let m=a&&e.requiresCounterCapacityFiltering(),f=e.secondInputOptions(u,c,t,t?void 0:l?.location);if(l===void 0){let U=o&&!m?ta(f):f,le=e.applicableInputOptions(n,U,r,m,o);return le.length===0?{kind:"invalid-input"}:{kind:"next-input-options",nextInputs:le}}let p=l.location,b=f.find(U=>yt(U.input,l));if(b===void 0)return{kind:"invalid-input"};let y=n[2],C=e.processSecondInput(b.kind,c,u,p,t),I=C?.[0]??[],_=C?.[1]??[];if(y===void 0){if(_.length!==0){let U=e.applicableInputOptions(n,_,r,m,o);return U.length===0?{kind:"invalid-input"}:{kind:"next-input-options",nextInputs:U}}return I.length===0?{kind:"invalid-input"}:e.resolveEvents(I,t)}let P=_.find(U=>yt(U.input,y));if(P===void 0)return{kind:"invalid-input"};let F=n[3],D=e.processThirdInput(P,c,u,p,t);I.push(...D?.[0]??[]);let L=D?.[1]??[];if(F===void 0){if(L.length!==0){let U=e.applicableInputOptions(n,L,r,m,o);return U.length===0?{kind:"invalid-input"}:{kind:"next-input-options",nextInputs:U}}return I.length===0?{kind:"invalid-input"}:e.resolveEvents(I,t)}let V=Wi(F,P,L);return V===void 0?{kind:"invalid-input"}:(I.push(V),e.resolveEvents(I,t))}i(Ki,"dispatchStagedInput");var Ye=class e{static{i(this,"MonsGame")}#e;#n;#t;#o;constructor(n=!1,t=ln,o){let r=o===void 0?new Ln(t):o.fork();this.#e={board:r,whiteScore:0,blackScore:0,activeColor:h.White,actionsUsedCount:0,manaMovesCount:0,monsMovesCount:0,whitePotionsCount:0,blackPotionsCount:0,turnNumber:1},this.#n=new Bo(n),this.#t=new Fo,this.#o={board:i(()=>this.board,"board"),requiresCounterCapacityFiltering:i(()=>this.#h(),"requiresCounterCapacityFiltering"),secondInputOptions:i((...a)=>this.#c(...a),"secondInputOptions"),processSecondInput:i((...a)=>this.#k(...a),"processSecondInput"),processThirdInput:i((...a)=>this.#M(...a),"processThirdInput"),applicableInputOptions:i((...a)=>this.#b(...a),"applicableInputOptions"),resolveEvents:i((...a)=>this.#S(...a),"resolveEvents")}}get board(){return this.#e.board.readonlyView()}get whiteScore(){return this.#e.whiteScore}get blackScore(){return this.#e.blackScore}get activeColor(){return this.#e.activeColor}get actionsUsedCount(){return this.#e.actionsUsedCount}get manaMovesCount(){return this.#e.manaMovesCount}get monsMovesCount(){return this.#e.monsMovesCount}get whitePotionsCount(){return this.#e.whitePotionsCount}get blackPotionsCount(){return this.#e.blackPotionsCount}get turnNumber(){return this.#e.turnNumber}get takebackFens(){return this.#n.takebackFens}get isMovesVerified(){return this.#n.movesVerified}get withVerboseTracking(){return this.#n.verboseTrackingEnabled}get verboseTrackingEntities(){return this.#n.trackingEntries}replaceHistory(n){this.#n.replace(n)}#r(n){this.#e.whiteScore=n.whiteScore,this.#e.blackScore=n.blackScore,this.#e.activeColor=n.activeColor,this.#e.actionsUsedCount=n.actionsUsedCount,this.#e.manaMovesCount=n.manaMovesCount,this.#e.monsMovesCount=n.monsMovesCount,this.#e.whitePotionsCount=n.whitePotionsCount,this.#e.blackPotionsCount=n.blackPotionsCount,this.#e.turnNumber=n.turnNumber}static#a(n,t){return new e(n,t.variant,t)}static newSimulationState(n){let t=e.#a(!1,n.board);return t.#r(n),t.#n.setTakebackTracking(!1),t}static fromFen(n,t=!1){let o=Ni(n);if(o===void 0)return;let r=e.#a(t,o.board);return r.#r(o),r.#n.resetForLoadedFen(),r}fen(){return _i(this)}copy(){let n=e.#a(this.withVerboseTracking,this.board);return n.#r(this),n.#n=this.#n.copy(),n}fork(){let n=e.#a(!1,this.board);return n.#r(this),n.#n=this.#n.fork(),n}variant(){return this.board.variant}replaceBoardItems(n){let t=Array.from({length:121},()=>{});for(let[r,a]of n)t[oe(r)]=a;let o=mt.fromItems(t,this.variant());this.#e.board=o,this.#n.resetForBoardReplacement(),this.invalidateProcessInputCache()}setTakebackHistoryTracking(n){this.#n.setTakebackTracking(n),this.invalidateProcessInputCache()}invalidateProcessInputCache(){this.#t.invalidate()}setVerboseTracking(n){this.#n.setVerboseTracking(n)}#y(n){let t=n.board.fork();this.#e.board=t,this.#r(n),this.invalidateProcessInputCache()}canTakeback(n){return this.#n.canTakeback(this.activeColor,n)}processInput(n,t,o){return this.processInputWithStartOptions(n,t,o,void 0)}processInputWithStartOptions(n,t,o,r){return this.#s(n,t,o,r??na)}inspectInputGrammar(n,t){return this.#s(n,!0,!1,t,!1)}#s(n,t,o,r,a=!0){if(n.length>Qn||this.winnerColor()!==void 0)return{kind:"invalid-input"};if(n.length===0){let u=(a?2:0)|(r.includeManaStartsWithPotionAction?1:0),c=this.#t.getStartSuggestion(u);if(c!==void 0)return c;let l=Gi(this,r,m=>this.#s(m,!0,!0,r,a));return this.#t.setStartSuggestion(u,l),l}let s=n[0];if(n.length===1&&s?.kind==="takeback"){let u=this.#n.prepareTakeback(this.activeColor,this.activeColor);if(u===void 0)return{kind:"invalid-input"};let c=e.fromFen(u.previousFen,!1);return c===void 0?{kind:"invalid-input"}:t?{kind:"events",events:[{kind:"takeback"}]}:(this.#y(c),this.#n.commitTakeback(u),{kind:"events",events:[{kind:"takeback"}]})}return Ki(this.#o,n,t,o,r,a)}#h(){return this.turnNumber===Number.MAX_SAFE_INTEGER||this.whitePotionsCount===Number.MAX_SAFE_INTEGER||this.blackPotionsCount===Number.MAX_SAFE_INTEGER}#b(n,t,o,r,a){if(!r)return t;let s=i(c=>this.#d([...n,c.input],o),"applicable");if(!a)return t.filter(s);let u=t.find(s);return u===void 0?[]:[u]}#d(n,t){let o=`${t.includeManaStartsWithPotionAction?1:0}|${Hr(n)}`,r=this.#t.getCompletionViability(o);if(r!==void 0)return r;let a=this.#s(n,!0,!1,t,!1),s=(()=>{switch(a.kind){case"invalid-input":return!1;case"events":return Rr(this.#e,a.events);case"locations-to-start-from":return a.locations.some(u=>this.#d([...n,{kind:"location",location:u}],t));case"next-input-options":return a.nextInputs.some(u=>this.#d([...n,u.input],t))}})();return this.#t.setCompletionViability(o,s),s}#c(n,t,o,r){let a=String(oe(n)),s=this.#t.getSecondInputOptions(a);if(s!==void 0)return s;let u=Di(this,n,t,r);return o&&this.#t.setSecondInputOptions(a,u),u}#k(n,t,o,r,a){let s=`${n}|${Xt(t)}|${oe(o)}|${oe(r)}`,u=this.#t.lookupSecondStage(s);if(u!==Gt)return u;let c=Vi(this,n,t,o,r);return a&&this.#t.setSecondStage(s,c),c}#M(n,t,o,r,a){let s=`${Xo(n.input)}|${n.kind}|${n.actorMonItem===void 0?"":Xt(n.actorMonItem)}|${Xt(t)}|${oe(o)}|${oe(r)}`,u=this.#t.lookupThirdStage(s);if(u!==Gt)return u;let c=Ui(this.board,n,t,o,r);return a&&this.#t.setThirdStage(s,c),c}#S(n,t){if(t)return{kind:"events",events:n};let o=this.applyAndAddResultingEvents(n);return o===void 0?{kind:"invalid-input"}:{kind:"events",events:o}}applyAndAddResultingEvents(n){return this.#m(n,this.#n.eventApplicationTrackingEnabled)}forkAndApplyEventsForSimulation(n){let t=this.fork(),o=t.#m(n,!1);return o===void 0?void 0:{game:t,events:o}}#m(n,t){if(!Rr(this.#e,n))return;if(this.invalidateProcessInputCache(),!t)return No(this.#e,n).events;let o=i(()=>this.fen(),"snapshotFen");this.#n.beginEventApplication(o,this.activeColor);let r=No(this.#e,n);return this.#n.completeEventApplication({snapshotFen:o,color:this.activeColor,events:r.events,turnAdvanced:r.turnAdvanced,winner:r.winner}),r.events}nextInputsFromLocations(n,t,o,r){return oa(n,t,o,r)}availableMoveKinds(){let n=new Map;return n.set(Oe.MonMove,ee-this.monsMovesCount),n.set(Oe.Action,0),n.set(Oe.Potion,0),n.set(Oe.ManaMove,0),this.turnNumber===1||(n.set(Oe.Action,_e-this.actionsUsedCount),n.set(Oe.Potion,this.playerPotionsCount()),n.set(Oe.ManaMove,An-this.manaMovesCount)),n}winnerColor(){return ho(this)}isLaterThan(n){return this.variant()!==n.variant()?!1:this.turnNumber>n.turnNumber?!0:this.turnNumber!==n.turnNumber?!1:this.playerPotionsCount()<n.playerPotionsCount()||this.actionsUsedCount>n.actionsUsedCount||this.manaMovesCount>n.manaMovesCount||this.monsMovesCount>n.monsMovesCount||this.board.faintedMonsLocations(Sn(this.activeColor)).length>n.board.faintedMonsLocations(Sn(n.activeColor)).length}isFirstTurn(){return it(this)}playerPotionsCount(){return ko(this)}playerCanMoveMon(){return Ia(this)}playerCanMoveMana(){return Aa(this)}playerCanUseAction(){return Ca(this)}};function Do(e){let n={i:e.row,j:e.column};if(!Number.isInteger(e.row)||!Number.isInteger(e.column)||!un(n))throw new RangeError(`position must contain integer row and column values from 0 through ${10}`);return n}i(Do,"toEnginePosition");function Y(e){return{row:e.i,column:e.j}}i(Y,"fromEnginePosition");function an(e){return{kind:e.kind,color:e.color,cooldown:e.cooldown}}i(an,"fromEngineMon");function jt(e){return e.kind==="supermana"?{kind:"supermana"}:{kind:"regular",color:e.color}}i(jt,"fromEngineMana");function ft(e){switch(e.kind){case"mon":return{kind:"mon",mon:an(e.mon)};case"mana":return{kind:"mana",mana:jt(e.mana)};case"mon-with-mana":return{kind:"mon",mon:an(e.mon),carrying:{kind:"mana",mana:jt(e.mana)}};case"mon-with-consumable":return{kind:"mon",mon:an(e.mon),carrying:{kind:"consumable",consumable:e.consumable}};case"consumable":return{kind:"consumable",consumable:e.consumable}}}i(ft,"fromEngineItem");function ji(e){switch(e.kind){case"regular":case"consumable-base":case"supermana-base":return{kind:e.kind};case"mana-base":case"mana-pool":return{kind:e.kind,color:e.color};case"mon-base":return{kind:e.kind,color:e.color,monKind:e.monKind}}}i(ji,"fromEngineSquare");function _r(e){switch(e.kind){case"takeback":return{kind:"takeback"};case"position":return{kind:"location",location:Do(e.position)};case"modifier":return{kind:"modifier",modifier:e.modifier}}}i(_r,"toEngineInput");function Nr(e){switch(e.kind){case"takeback":return{kind:"takeback"};case"location":return{kind:"position",position:Y(e.location)};case"modifier":return{kind:"modifier",modifier:e.modifier}}}i(Nr,"fromEngineInput");function cu(e){let n=Nr(e.input),t=e.actorMonItem===void 0?{}:{actor:ft(e.actorMonItem)};if(e.kind==="select-consumable"){if(n.kind!=="modifier")throw new Error("consumable selection requires a modifier input");return{action:e.kind,input:n,...t}}if(n.kind!=="position")throw new Error(`${e.kind} requires a position input`);switch(e.kind){case"mon-move":case"mana-move":case"mystic-action":case"demon-action":case"demon-additional-step":case"spirit-target-capture":case"spirit-target-move":case"bomb-attack":return{action:e.kind,input:n,...t}}}i(cu,"fromEngineInputOption");function Vo(e){switch(e.kind){case"mon-move":return{kind:e.kind,item:ft(e.item),from:Y(e.from),to:Y(e.to)};case"mana-move":return{kind:e.kind,mana:jt(e.mana),from:Y(e.from),to:Y(e.to)};case"mana-scored":case"mana-dropped":return{kind:e.kind,mana:jt(e.mana),at:Y(e.at)};case"mystic-action":return{kind:e.kind,mystic:an(e.mystic),from:Y(e.from),to:Y(e.to)};case"demon-action":case"demon-additional-step":return{kind:e.kind,demon:an(e.demon),from:Y(e.from),to:Y(e.to)};case"spirit-target-move":return{kind:e.kind,item:ft(e.item),from:Y(e.from),to:Y(e.to),by:Y(e.by)};case"pickup-bomb":return{kind:e.kind,by:an(e.by),at:Y(e.at)};case"pickup-potion":return{kind:e.kind,by:ft(e.by),at:Y(e.at)};case"use-potion":case"supermana-back-to-base":return{kind:e.kind,from:Y(e.from),to:Y(e.to)};case"pickup-mana":return{kind:e.kind,mana:jt(e.mana),by:an(e.by),at:Y(e.at)};case"mon-fainted":return{kind:e.kind,mon:an(e.mon),from:Y(e.from),to:Y(e.to)};case"bomb-attack":return{kind:e.kind,by:an(e.by),from:Y(e.from),to:Y(e.to)};case"mon-awake":return{kind:e.kind,mon:an(e.mon),at:Y(e.at)};case"bomb-explosion":return{kind:e.kind,at:Y(e.at)};case"next-turn":return{kind:e.kind,color:e.color};case"game-over":return{kind:e.kind,winner:e.winner};case"takeback":return{kind:e.kind}}}i(Vo,"fromEngineEvent");function Pr(e,n){switch(e.kind){case"invalid-input":return{kind:"invalid",inputFen:n};case"locations-to-start-from":return{kind:"awaiting-start",inputFen:n,positions:e.locations.map(Y)};case"next-input-options":return{kind:"awaiting-input",inputFen:n,options:e.nextInputs.map(cu)};case"events":return{kind:"complete",inputFen:n,events:e.events.map(Vo)}}}i(Pr,"fromEngineOutput");function $i(e){return{monMoves:e.get(Oe.MonMove)??0,manaMoves:e.get(Oe.ManaMove)??0,actions:e.get(Oe.Action)??0,potions:e.get(Oe.Potion)??0}}i($i,"availableMoveCountsFromEngine");function uu(e){if(e!=="")return ht(e)}i(uu,"parseReplayMove");function Uo(e,n,t,o){let r=0,a=0;for(;r<n.length||a<t.length;){let s=e.activeColor===h.White,l=(s?n:t)[s?r:a];if(l===void 0)return{status:"missing-move",whiteMovesProcessed:r,blackMovesProcessed:a};let m=uu(l);if(m===void 0)return{status:"invalid-move",whiteMovesProcessed:r,blackMovesProcessed:a};let f=e.processInput(m,!1,!1);if(f.kind!=="events"||f.events.length===0)return{status:"invalid-move",whiteMovesProcessed:r,blackMovesProcessed:a};s?r+=1:a+=1;let p={whiteMovesProcessed:r,blackMovesProcessed:a};if(o?.(e,p)===!1)return{status:"stopped",...p}}return{status:"complete",whiteMovesProcessed:r,blackMovesProcessed:a}}i(Uo,"replayInterleavedMoves");var Lr=class e{static{i(this,"Game")}#e;constructor(n={}){let{variant:t=E.Classic}=n;if(!du(t))throw new TypeError(`unsupported game variant: ${String(t)}`);this.#e=new Ye(!0,t)}static#n(n){let t=new e({variant:n.variant()});return t.#e=n,t}static fromFen(n){let t=Ye.fromFen(n,!0);if(t?.fen()===n)return e.#n(t)}get variant(){return this.#e.variant()}get activeColor(){return this.#e.activeColor}get turnNumber(){return this.#e.turnNumber}get scores(){return{[h.White]:this.#e.whiteScore,[h.Black]:this.#e.blackScore}}get potions(){return{[h.White]:this.#e.whitePotionsCount,[h.Black]:this.#e.blackPotionsCount}}get winner(){return this.#e.winnerColor()}get historyVerified(){return this.#e.isMovesVerified}get takebackFens(){return[...this.#e.takebackFens]}get trackingEntries(){return this.#e.verboseTrackingEntities.map(n=>({fen:n.fen,color:n.color,events:n.events.map(Vo),eventsFen:wi(n.events)}))}toFen(){return this.#e.fen()}preview(n){let t=n.map(_r);return this.#t(t,et(t))}play(n){let t=n.map(_r);return this.#o(t,et(t))}playFen(n){let t=ht(n);return t===void 0?{kind:"invalid",inputFen:n}:this.#o(t,et(t))}#t(n,t){let o=n.length===1&&n[0]?.kind==="takeback"?this.#e.copy():this.#e.fork();return Pr(o.processInput(n,!1,!1),t)}#o(n,t){let o=Pr(this.#e.processInput(n,!1,!1),t);return o.kind==="complete"?o:{kind:"invalid",inputFen:t}}itemAt(n){let t=this.#e.board.get(Do(n));return t===void 0?void 0:ft(t)}squareAt(n){return ji(this.#e.board.squareAt(Do(n)))}contentPositions(){let n=new Map;for(let[t]of this.#e.board.entries())n.set(qi(t.i,t.j),{row:t.i,column:t.j});for(let t of this.#e.board.allMonsBases())n.set(qi(t.i,t.j),{row:t.i,column:t.j});return[...n.values()].sort((t,o)=>t.row-o.row||t.column-o.column)}canTakeback(n){if(!lu(n))throw new TypeError(`unsupported color: ${String(n)}`);return this.#e.canTakeback(n)}takeback(){return this.play([{kind:"takeback"}])}previousTurn(n){let t=this.#e.verboseTrackingEntities;if(t.length<=1)return;let o=t.slice(0,-1),r=o[o.length-1],a=Ye.fromFen(r?.fen??this.#e.fen(),!0);if(a===void 0)return;let s=n.lastIndexOf(a.fen());if(n.length>0&&s<0)return;let u=s<0?[]:n.slice(0,s+1);if(!u.some(c=>{let l=Ye.fromFen(c,!1);return l?.fen()!==c||l.variant()!==a.variant()}))return a.replaceHistory({takebackFens:u,trackingEntries:o,verboseTrackingEnabled:!0,movesVerified:this.#e.isMovesVerified}),e.#n(a)}verifyHistory(n){let t=new Ye(!0,this.#e.variant());return Uo(t,n.white,n.black).status!=="complete"||t.fen()!==this.#e.fen()?!1:(this.#e.replaceHistory({takebackFens:t.takebackFens,trackingEntries:t.verboseTrackingEntities,movesVerified:!0}),!0)}isLaterThan(n){return this.#e.isLaterThan(n.#e)}availableMoveCounts(){return $i(this.#e.availableMoveKinds())}suggestMove(n){if(!mu(n))throw new TypeError(`unsupported automove preference: ${String(n)}`);let t=Ci(this.#e,n);if(t.output.kind!=="events")return;let o=ht(t.inputFen);if(o!==void 0)return{inputs:o.map(Nr),inputFen:t.inputFen,events:t.output.events.map(Vo)}}};function lu(e){return e===h.White||e===h.Black}i(lu,"isColor");function du(e){return Object.values(E).includes(e)}i(du,"isGameVariant");function mu(e){return e==="fast"||e==="normal"||e==="pro"}i(mu,"isAutomovePreference");function qi(e,n){return`${e},${n}`}i(qi,"positionKey");function fu(e){let n=Hi(e.white.fen),t=Hi(e.black.fen);if(n===void 0||t===void 0)return n===void 0&&t===void 0?{kind:"invalid"}:{kind:"winner",winner:n===void 0?h.Black:h.White};if(n.variant()!==t.variant())return{kind:"invalid"};let o=n.fen(),r=t.fen();if(n.winnerColor()===void 0&&t.winnerColor()===void 0)return{kind:"ongoing"};let a=new Ye(!1,n.variant()),s;return Uo(a,e.white.moves,e.black.moves,(u,{whiteMovesProcessed:c,blackMovesProcessed:l})=>{let m=u.winnerColor();if(m===void 0)return!0;let f=m===h.White?c===e.white.moves.length:l===e.black.moves.length,p=m===h.White?o:r;return s=f&&p===u.fen()?{kind:"winner",winner:m}:{kind:"invalid"},!1}),s??{kind:"invalid"}}i(fu,"resolveMatch");function Hi(e){let n=Ye.fromFen(e,!1);return n?.fen()===e?n:void 0}i(Hi,"submittedGame");export{h as Color,A as Consumable,Lr as Game,E as GameVariant,X as Modifier,M as MonKind,fu as resolveMatch};
1
+ var es=Object.defineProperty;var i=(e,n)=>es(e,"name",{value:n,configurable:!0});var h=Object.freeze({White:"white",Black:"black"}),E=Object.freeze({Classic:"Classic",SwappedManaRows:"SwappedManaRows",OffsetArcManaRows:"OffsetArcManaRows",CenterSpokeManaRows:"CenterSpokeManaRows",AlternatingManaRows:"AlternatingManaRows",InnerWedgeManaRows:"InnerWedgeManaRows",OuterWedgeManaRows:"OuterWedgeManaRows",BentCenterManaRows:"BentCenterManaRows",OuterEdgeManaRows:"OuterEdgeManaRows",SplitFlankManaRows:"SplitFlankManaRows",ForwardBridgeManaRows:"ForwardBridgeManaRows",CornerChainManaRows:"CornerChainManaRows"}),M=Object.freeze({Demon:"demon",Drainer:"drainer",Angel:"angel",Spirit:"spirit",Mystic:"mystic"}),A=Object.freeze({Potion:"potion",Bomb:"bomb",BombOrPotion:"bomb-or-potion"}),X=Object.freeze({SelectPotion:"select-potion",SelectBomb:"select-bomb"});var $o=Object.freeze({[h.White]:0,[h.Black]:1});function ze(e){return $o[e]}i(ze,"colorId");var Xe=Object.freeze({[M.Demon]:0,[M.Drainer]:1,[M.Angel]:2,[M.Spirit]:3,[M.Mystic]:4}),xe=Object.freeze({MonMove:"mon-move",ManaMove:"mana-move",Action:"action",Potion:"potion"}),qo=Object.freeze({[X.SelectPotion]:0,[X.SelectBomb]:1}),O=Object.freeze({MonMove:"mon-move",ManaMove:"mana-move",MysticAction:"mystic-action",DemonAction:"demon-action",DemonAdditionalStep:"demon-additional-step",SpiritTargetCapture:"spirit-target-capture",SpiritTargetMove:"spirit-target-move",SelectConsumable:"select-consumable",BombAttack:"bomb-attack"}),Qn=4,Mn=Object.freeze({kind:"supermana"});function Sn(e){return e===h.Black?h.White:h.Black}i(Sn,"otherColor");function Vn(e,n,t){if(!Number.isInteger(t)||t<0||t>2)throw new RangeError("mon cooldown must be an integer from 0 through 2");return Object.freeze({kind:e,color:n,cooldown:t})}i(Vn,"createMon");function Ko(e,n){return e.kind===n.kind&&e.color===n.color&&e.cooldown===n.cooldown}i(Ko,"monEquals");function Ae(e){return e.cooldown>0}i(Ae,"isMonFainted");function Kr(e){return Vn(e.kind,e.color,2)}i(Kr,"faintMon");function jr(e){return e.cooldown>0?Vn(e.kind,e.color,e.cooldown-1):Le(e)}i(jr,"decreaseMonCooldown");function Yn(e){return Object.freeze({kind:"regular",color:e})}i(Yn,"regularMana");function Wr(e,n){return e.kind==="supermana"?n.kind==="supermana":n.kind==="regular"&&e.color===n.color}i(Wr,"manaEquals");function Ho(e,n){return e||!n?2:1}i(Ho,"manaScoreForOwnership");function $r(e,n){return Ho(e.kind==="supermana",e.kind==="regular"&&e.color===n)}i($r,"manaScore");function Fe(e){return Object.freeze({kind:"mon",mon:Le(e)})}i(Fe,"monItem");function Ze(e){return Object.freeze({kind:"mana",mana:Xn(e)})}i(Ze,"manaItem");function Zn(e,n){return Object.freeze({kind:"mon-with-mana",mon:Le(e),mana:Xn(n)})}i(Zn,"monWithManaItem");function pt(e,n){return Object.freeze({kind:"mon-with-consumable",mon:Le(e),consumable:n})}i(pt,"monWithConsumableItem");function bt(e){return Object.freeze({kind:"consumable",consumable:e})}i(bt,"consumableItem");function Le(e){return Object.isFrozen(e)?e:Vn(e.kind,e.color,e.cooldown)}i(Le,"immutableMon");function Xn(e){return e.kind==="supermana"?Mn:Object.isFrozen(e)?e:Yn(e.color)}i(Xn,"immutableMana");function Dn(e){switch(e.kind){case"mon":return Object.isFrozen(e)&&Object.isFrozen(e.mon)?e:Fe(e.mon);case"mana":return Object.isFrozen(e)&&Object.isFrozen(e.mana)?e:Ze(e.mana);case"mon-with-mana":return Object.isFrozen(e)&&Object.isFrozen(e.mon)&&Object.isFrozen(e.mana)?e:Zn(e.mon,e.mana);case"mon-with-consumable":return Object.isFrozen(e)&&Object.isFrozen(e.mon)?e:pt(e.mon,e.consumable);case"consumable":return Object.isFrozen(e)?e:bt(e.consumable)}}i(Dn,"immutableItem");function W(e){return{i:e.i,j:e.j}}i(W,"copyLocation");function ns(e){switch(e.kind){case"takeback":return{kind:"takeback"};case"location":return{kind:"location",location:W(e.location)};case"modifier":return{kind:"modifier",modifier:e.modifier}}}i(ns,"copyInput");function Jn(e){let n=ns(e.input);return e.actorMonItem===void 0?{input:n,kind:e.kind}:{input:n,kind:e.kind,actorMonItem:Dn(e.actorMonItem)}}i(Jn,"copyNextInput");function Un(e){switch(e.kind){case"mon-move":return{kind:"mon-move",item:Dn(e.item),from:W(e.from),to:W(e.to)};case"mana-move":return{kind:"mana-move",mana:Xn(e.mana),from:W(e.from),to:W(e.to)};case"mana-scored":return{kind:"mana-scored",mana:Xn(e.mana),at:W(e.at)};case"mystic-action":return{kind:"mystic-action",mystic:Le(e.mystic),from:W(e.from),to:W(e.to)};case"demon-action":return{kind:"demon-action",demon:Le(e.demon),from:W(e.from),to:W(e.to)};case"demon-additional-step":return{kind:"demon-additional-step",demon:Le(e.demon),from:W(e.from),to:W(e.to)};case"spirit-target-move":return{kind:"spirit-target-move",item:Dn(e.item),from:W(e.from),to:W(e.to),by:W(e.by)};case"pickup-bomb":return{kind:"pickup-bomb",by:Le(e.by),at:W(e.at)};case"pickup-potion":return{kind:"pickup-potion",by:Dn(e.by),at:W(e.at)};case"use-potion":return{kind:"use-potion",from:W(e.from),to:W(e.to)};case"pickup-mana":return{kind:"pickup-mana",mana:Xn(e.mana),by:Le(e.by),at:W(e.at)};case"mon-fainted":return{kind:"mon-fainted",mon:Le(e.mon),from:W(e.from),to:W(e.to)};case"mana-dropped":return{kind:"mana-dropped",mana:Xn(e.mana),at:W(e.at)};case"supermana-back-to-base":return{kind:"supermana-back-to-base",from:W(e.from),to:W(e.to)};case"bomb-attack":return{kind:"bomb-attack",by:Le(e.by),from:W(e.from),to:W(e.to)};case"mon-awake":return{kind:"mon-awake",mon:Le(e.mon),at:W(e.at)};case"bomb-explosion":return{kind:"bomb-explosion",at:W(e.at)};case"next-turn":return{kind:"next-turn",color:e.color};case"game-over":return{kind:"game-over",winner:e.winner};case"takeback":return{kind:"takeback"}}}i(Un,"copyEvent");function zo(e){switch(e.kind){case"invalid-input":return{kind:"invalid-input"};case"locations-to-start-from":return{kind:"locations-to-start-from",locations:e.locations.map(W)};case"next-input-options":return{kind:"next-input-options",nextInputs:e.nextInputs.map(Jn)};case"events":return{kind:"events",events:e.events.map(Un)}}}i(zo,"copyOutput");function $(e){switch(e.kind){case"mon":case"mon-with-mana":case"mon-with-consumable":return e.mon;case"mana":case"consumable":return}}i($,"itemMon");function qr(e){let n=$(e);return n===void 0||!Ae(n)}i(qr,"isSpiritTargetAllowed");function In(e){switch(e.kind){case"mana":case"mon-with-mana":return e.mana;case"mon":case"mon-with-consumable":case"consumable":return}}i(In,"itemMana");function Xo(e){switch(e.kind){case"mon-with-consumable":case"consumable":return e.consumable;case"mon":case"mana":case"mon-with-mana":return}}i(Xo,"itemConsumable");function Hr(e,n){switch(e.kind){case"mon":return n.kind==="mon"&&Ko(e.mon,n.mon);case"mana":return n.kind==="mana"&&Wr(e.mana,n.mana);case"mon-with-mana":return n.kind==="mon-with-mana"&&Ko(e.mon,n.mon)&&Wr(e.mana,n.mana);case"mon-with-consumable":return n.kind==="mon-with-consumable"&&Ko(e.mon,n.mon)&&e.consumable===n.consumable;case"consumable":return n.kind==="consumable"&&e.consumable===n.consumable}}i(Hr,"itemEquals");function jo(e){return`${e.kind}:${e.color}:${e.cooldown}`}i(jo,"monKey");function Gr(e){return e.kind==="supermana"?"s":`r:${e.color}`}i(Gr,"manaKey");function Xt(e){switch(e.kind){case"mon":return`m:${jo(e.mon)}`;case"mana":return`a:${Gr(e.mana)}`;case"mon-with-mana":return`mm:${jo(e.mon)}:${Gr(e.mana)}`;case"mon-with-consumable":return`mc:${jo(e.mon)}:${e.consumable}`;case"consumable":return`c:${e.consumable}`}}i(Xt,"itemKey");function Qo(e){switch(e.kind){case"takeback":return"t";case"location":return`l:${e.location.i}:${e.location.j}`;case"modifier":return`m:${e.modifier}`}}i(Qo,"inputKey");function zr(e){return e.map(Qo).join(";")}i(zr,"inputChainKey");function yt(e,n){switch(e.kind){case"takeback":return n.kind==="takeback";case"location":return n.kind==="location"&&e.location.i===n.location.i&&e.location.j===n.location.j;case"modifier":return n.kind==="modifier"&&e.modifier===n.modifier}}i(yt,"inputEquals");function B(e){return`${e.i},${e.j}`}i(B,"locationFen");var Qt=48,ts=57,os=44,rs=59,as=108,is=109,ss=122,cs=112,us=98;function ls(e){switch(e){case X.SelectPotion:return"p";case X.SelectBomb:return"b"}}i(ls,"modifierFen");function ds(e){switch(e.kind){case"takeback":return"z";case"location":return`l${B(e.location)}`;case"modifier":return`m${ls(e.modifier)}`}}i(ds,"inputFen");function Xr(e,n,t){if(n>=t)return;let o=e.charCodeAt(n);if(!(o<Qt||o>ts))return o===Qt+1&&n+1<t&&e.charCodeAt(n+1)===Qt?10:o-Qt}i(Xr,"parseCoordinate");function Qr(e,n){return e+(n===10?2:1)}i(Qr,"coordinateEnd");function ms(e,n,t){let o=Xr(e,n,t);if(o===void 0)return;let r=Qr(n,o);if(r>=t||e.charCodeAt(r)!==os)return;let a=r+1,s=Xr(e,a,t);if(!(s===void 0||Qr(a,s)!==t))return{i:o,j:s}}i(ms,"parseLocation");function fs(e,n,t){switch(e.charCodeAt(n)){case as:{let o=ms(e,n+1,t);return o===void 0?void 0:{kind:"location",location:o}}case is:return t!==n+2?void 0:e.charCodeAt(n+1)===cs?{kind:"modifier",modifier:X.SelectPotion}:e.charCodeAt(n+1)===us?{kind:"modifier",modifier:X.SelectBomb}:void 0;case ss:return t===n+1?{kind:"takeback"}:void 0;default:return}}i(fs,"parseInputFenRange");function et(e){return e.map(ds).join(";")}i(et,"inputArrayFen");function ht(e){if(typeof e!="string")throw new TypeError("input FEN must be a string");if(e==="")return[];let n=[],t=0;for(let o=0;o<=e.length;o+=1){if(o<e.length&&e.charCodeAt(o)!==rs)continue;if(n.length===Qn)return;let r=fs(e,t,o);if(r===void 0)return;n.push(r),t=o+1}return n}i(ht,"parseInputArrayFen");var Yr=Math.trunc(5.5),ps=10;function Z(e,n){return{i:e,j:n}}i(Z,"location");function kt(e,n){return e.i===n.i&&e.j===n.j}i(kt,"locationEquals");function un(e){return Number.isInteger(e.i)&&Number.isInteger(e.j)&&e.i>=0&&e.i<11&&e.j>=0&&e.j<11}i(un,"isValidLocation");function Wn(e){if(!un(e))throw new RangeError(`board location must use integer coordinates from 0 to ${ps}`)}i(Wn,"assertValidLocation");function re(e){return Wn(e),e.i*11+e.j}i(re,"locationIndex");function nt(e){if(!Number.isInteger(e)||e<0||e>=121)throw new RangeError("board location index must be an integer from 0 to 120");return Z(Math.trunc(e/11),e%11)}i(nt,"fromLocationIndex");function Zr(e,n){return Z(Math.trunc((e.i+n.i)/2),Math.trunc((e.j+n.j)/2))}i(Zr,"locationBetween");function Jr(e,n){return Math.max(Math.abs(n.i-e.i),Math.abs(n.j-e.j))}i(Jr,"locationDistance");function ea(e,n){let t=[];for(let o=e.i-n;o<=e.i+n;o+=1)for(let r=e.j-n;r<=e.j+n;r+=1){let a=Z(o,r);un(a)&&!kt(a,e)&&t.push(a)}return t}i(ea,"nearbyLocationsFor");function na(e,n){let t=[];for(let[o,r]of n){let a=Z(e.i+o,e.j+r);un(a)&&t.push(a)}return t}i(na,"directionalReachabilityFor");function bs(e){let n=[];for(let t=-2;t<=2;t+=1)for(let o=-2;o<=2;o+=1){if(Math.max(Math.abs(t),Math.abs(o))!==2)continue;let r=Z(e.i+t,e.j+o);un(r)&&n.push(r)}return n}i(bs,"spiritReachabilityFor");function Mt(e){return Object.freeze(Array.from({length:121},(n,t)=>Object.freeze(e(nt(t)).map(o=>Object.freeze(o)))))}i(Mt,"buildCache");var ys=Mt(e=>ea(e,1)),hs=Mt(e=>ea(e,3)),ks=Mt(e=>na(e,[[-2,-2],[2,2],[-2,2],[2,-2]])),Ms=Mt(e=>na(e,[[-2,0],[2,0],[0,2],[0,-2]])),Ss=Mt(bs);function St(e,n){return un(n)?e[re(n)]??[]:[]}i(St,"cachedLocations");function Be(e){return St(ys,e)}i(Be,"nearbyLocations");function Yt(e){return St(hs,e)}i(Yt,"bombReachableLocations");function Zt(e){return St(ks,e)}i(Zt,"mysticReachableLocations");function Jt(e){return St(Ms,e)}i(Jt,"demonReachableLocations");function eo(e){return St(Ss,e)}i(eo,"spiritReachableLocations");var Yo=Object.freeze(Array.from({length:121},(e,n)=>Object.freeze(nt(n))));var ta=Object.freeze({includeManaStartsWithPotionAction:!1}),Zo=Object.freeze({includeManaStartsWithPotionAction:!0});function Re(e,n,t){return t===void 0?{input:e,kind:n}:{input:e,kind:n,actorMonItem:t}}i(Re,"nextInput");function oa(e){let n=[],t;for(let o of e)o.kind!==t&&(n.push(o),t=o.kind);return n}i(oa,"firstOptionFromEachKindGroup");function Jo(e,n){return e!==void 0&&Jr(e,n)===1}i(Jo,"isLocationGuardedByAngelLocation");function ra(e,n,t,o){if(t!==void 0){for(let a of e)if(kt(a,t))return o(t)?[Re({kind:"location",location:t},n)]:[];return[]}let r=[];for(let a of e)o(a)&&r.push(Re({kind:"location",location:a},n));return r}i(ra,"nextInputsFromLocations");var It=new RangeError("fast workspace allocation failed");function At(e){return e===It}i(At,"isFastWorkspaceAllocationFailure");function _e(e){throw e instanceof RangeError?It:e}i(_e,"rethrowFastWorkspaceAllocation");var ln=E.Classic,Ce=5,ee=5,An=1,Ne=1,Gn=Object.freeze([E.Classic,E.SwappedManaRows,E.OffsetArcManaRows,E.CenterSpokeManaRows,E.AlternatingManaRows,E.InnerWedgeManaRows,E.OuterWedgeManaRows,E.BentCenterManaRows,E.OuterEdgeManaRows,E.SplitFlankManaRows,E.ForwardBridgeManaRows,E.CornerChainManaRows]),sa=Object.freeze({[E.Classic]:0,[E.SwappedManaRows]:1,[E.OffsetArcManaRows]:2,[E.CenterSpokeManaRows]:3,[E.AlternatingManaRows]:4,[E.InnerWedgeManaRows]:5,[E.OuterWedgeManaRows]:6,[E.BentCenterManaRows]:7,[E.OuterEdgeManaRows]:8,[E.SplitFlankManaRows]:9,[E.ForwardBridgeManaRows]:10,[E.CornerChainManaRows]:11}),Is=new Map(Gn.map(e=>[sa[e],e]));function ca(e){return sa[e]}i(ca,"gameVariantId");function Q(...e){return Object.freeze(e.map(([n,t])=>Object.freeze(Z(n,t))))}i(Q,"locations");function De(e,n){return Object.freeze({[h.Black]:e,[h.White]:n})}i(De,"manaLayout");var As=Object.freeze({[E.Classic]:De(Q([3,4],[3,6],[4,3],[4,5],[4,7]),Q([7,4],[7,6],[6,3],[6,5],[6,7])),[E.SwappedManaRows]:De(Q([3,3],[3,5],[3,7],[4,4],[4,6]),Q([7,3],[7,5],[7,7],[6,4],[6,6])),[E.OffsetArcManaRows]:De(Q([3,4],[3,6],[4,2],[4,5],[4,8]),Q([6,2],[6,5],[6,8],[7,4],[7,6])),[E.CenterSpokeManaRows]:De(Q([3,5],[4,2],[4,4],[4,6],[4,8]),Q([6,2],[6,4],[6,6],[6,8],[7,5])),[E.AlternatingManaRows]:De(Q([4,1],[4,3],[4,5],[4,7],[4,9]),Q([6,1],[6,3],[6,5],[6,7],[6,9])),[E.InnerWedgeManaRows]:De(Q([3,4],[3,6],[4,4],[4,5],[4,6]),Q([6,4],[6,5],[6,6],[7,4],[7,6])),[E.OuterWedgeManaRows]:De(Q([3,4],[3,5],[3,6],[4,3],[4,7]),Q([6,3],[6,7],[7,4],[7,5],[7,6])),[E.BentCenterManaRows]:De(Q([3,5],[4,4],[4,5],[4,6],[5,3]),Q([5,7],[6,4],[6,5],[6,6],[7,5])),[E.OuterEdgeManaRows]:De(Q([4,0],[4,1],[4,9],[4,10],[5,1]),Q([5,9],[6,0],[6,1],[6,9],[6,10])),[E.SplitFlankManaRows]:De(Q([3,4],[3,6],[4,2],[4,3],[5,2]),Q([5,8],[6,7],[6,8],[7,4],[7,6])),[E.ForwardBridgeManaRows]:De(Q([3,4],[3,6],[4,3],[4,5],[5,4]),Q([5,6],[6,5],[6,7],[7,4],[7,6])),[E.CornerChainManaRows]:De(Q([3,5],[3,6],[4,6],[4,7],[5,7]),Q([5,3],[6,3],[6,4],[7,4],[7,5]))}),ua=Object.freeze({kind:"regular"}),aa=Object.freeze({kind:"consumable-base"}),Cs=Object.freeze({kind:"supermana-base"}),Ct=Object.freeze(Z(5,5)),gt=Q([0,3],[0,4],[0,5],[0,6],[0,7],[10,3],[10,4],[10,5],[10,6],[10,7]);function la(e){return Number.isSafeInteger(e)?Is.get(e):void 0}i(la,"gameVariantFromId");function ia(e,n){return As[e][n]}i(ia,"manaBaseLocations");function gs(e){let n=Array.from({length:121}).fill(ua),t=i((o,r)=>{n[re(o)]=Object.freeze(r)},"put");t(Z(0,0),{kind:"mana-pool",color:h.Black}),t(Z(0,10),{kind:"mana-pool",color:h.Black}),t(Z(10,0),{kind:"mana-pool",color:h.White}),t(Z(10,10),{kind:"mana-pool",color:h.White}),t(Z(0,3),{kind:"mon-base",monKind:M.Mystic,color:h.Black}),t(Z(0,4),{kind:"mon-base",monKind:M.Spirit,color:h.Black}),t(Z(0,5),{kind:"mon-base",monKind:M.Drainer,color:h.Black}),t(Z(0,6),{kind:"mon-base",monKind:M.Angel,color:h.Black}),t(Z(0,7),{kind:"mon-base",monKind:M.Demon,color:h.Black}),t(Z(10,3),{kind:"mon-base",monKind:M.Demon,color:h.White}),t(Z(10,4),{kind:"mon-base",monKind:M.Angel,color:h.White}),t(Z(10,5),{kind:"mon-base",monKind:M.Drainer,color:h.White}),t(Z(10,6),{kind:"mon-base",monKind:M.Spirit,color:h.White}),t(Z(10,7),{kind:"mon-base",monKind:M.Mystic,color:h.White});for(let o of ia(e,h.Black))t(o,{kind:"mana-base",color:h.Black});for(let o of ia(e,h.White))t(o,{kind:"mana-base",color:h.White});return t(Z(5,0),aa),t(Z(5,10),aa),t(Ct,Cs),Object.freeze(n)}i(gs,"buildSquares");var Es=new Map(Gn.map(e=>[e,gs(e)]));function no(e){let n=Es.get(e);if(n===void 0)throw new TypeError(`unsupported game variant: ${e}`);return n}i(no,"squaresForVariant");function er(e,n){return Wn(e),no(n)[re(e)]??ua}i(er,"squareAtForVariant");function vs(e){return er(e,ln)}i(vs,"squareAt");function Ts(e){switch(e.kind){case"mon-base":return Fe(Vn(e.monKind,e.color,0));case"mana-base":return Ze(Yn(e.color));case"supermana-base":return Ze(Mn);case"consumable-base":return bt(A.BombOrPotion);case"regular":case"mana-pool":return}}i(Ts,"initialItemForSquare");function ws(e){return Object.freeze(no(e).map(Ts))}i(ws,"buildInitialItems");var Os=new Map(Gn.map(e=>[e,ws(e)]));function da(e){let n=Os.get(e);if(n===void 0)throw new TypeError(`unsupported game variant: ${e}`);return[...n]}i(da,"initialItemsForVariant");function ma(e,n){for(let t of gt){let o=vs(t);if(o.kind==="mon-base"&&o.monKind===e&&o.color===n)return t}throw new Error("Expected at least one base for the given mon")}i(ma,"monBase");var ge=Object.keys($o).length,dn=Object.keys(Xe).length,Et=ge*dn,J=1,pe=2,H=3,vt=1,Tt=2,ye=3,Ee=1,pa=2,ve=3,wt=Xe[M.Demon],ke=Xe[M.Drainer],Ot=Xe[M.Angel],to=Xe[M.Spirit],oo=Xe[M.Mystic],xs=0,Rs=1,Je=2,_s=3,ba=5,ue=7,tt=re(Ct);function G(e){return e&3}i(G,"cellOccupancy");function ae(e){return e>>2&7}i(ae,"cellMonKind");function fe(e){return e>>5&1}i(fe,"cellMonColor");function ie(e){return e>>6&3}i(ie,"cellCooldown");function R(e){return e>>8&3}i(R,"cellMana");function N(e){return e>>10&3}i(N,"cellConsumable");function ot(e){let n=N(e);return n===0||n===Ee}i(ot,"damagingAttackCanComplete");function rt(e,n,t,o,r){return H|e<<2|n<<5|t<<6|o<<8|r<<10}i(rt,"makeMonCell");function Cn(e){return J|e<<8}i(Cn,"makeManaCell");function ya(e){return pe|e<<10}i(ya,"makeConsumableCell");function Ve(e,n){return Ho(e===ye,e-1===n)}i(Ve,"manaScoreValue");function se(e,n){return e*ge+n}i(se,"monId");function at(e){return e!==Je&&e<ue}i(at,"squareIsRegularForMovement");function en(e){return e>=ba&&e<ue}i(en,"squareIsPool");function ro(e){return Math.trunc((e-ue)/ge)}i(ro,"squareMonBaseKind");function ao(e){return(e-ue)%ge}i(ao,"squareMonBaseColor");function w(e,n){return e[n]??0}i(w,"u8");function g(e,n){return e[n]??0}i(g,"u16");function d(e,n){return e[n]??0}i(d,"i32");function Me(e,n){let t=e[n];if(t===void 0)throw new RangeError("automove search slot index out of range");return t}i(Me,"at");function io(e,n,t){return rt(Xe[e.kind],ze(e.color),e.cooldown,n,t)}i(io,"fastMonCellFromMon");function Ns(e){let n=new Uint8Array(121),t=no(e);for(let o=0;o<121;o+=1){let r=t[o];if(r!==void 0)switch(r.kind){case"regular":n[o]=xs;break;case"consumable-base":n[o]=Rs;break;case"supermana-base":n[o]=Je;break;case"mana-base":n[o]=_s+ze(r.color);break;case"mana-pool":n[o]=ba+ze(r.color);break;case"mon-base":n[o]=ue+se(Xe[r.monKind],ze(r.color));break}}return n}i(Ns,"buildSquares");var Ps=new Map(Gn.map(e=>[e,Ns(e)]));function so(e){let n=Ps.get(e);if(n===void 0)throw new TypeError(`unsupported game variant: ${e}`);try{return n.slice()}catch(t){_e(t)}}i(so,"fastSquaresForVariant");var co=(()=>{let e=new Int32Array(Et).fill(-1),n=so(Me(Gn,0));for(let t of gt){let o=re(t),r=w(n,o);r>=ue&&(e[r-ue]=o)}return e})();function xt(e){let n=[],t=new Int32Array(121),o=new Int32Array(121);for(let r=0;r<121;r+=1){o[r]=n.length;let a=e(nt(r)).map(re).sort((s,u)=>s-u);n.push(...a),t[r]=a.length}return{list:new Int32Array(n),starts:o,counts:t}}i(xt,"buildOffsetTable");var le=xt(Be),gn=xt(Zt),En=xt(Jt),uo=xt(eo),lo=xt(Yt),Ls=(()=>{let e=new Uint8Array(14641);for(let n=0;n<121;n+=1){let t=Math.trunc(n/11),o=n%11;for(let r=0;r<121;r+=1){let a=Math.trunc(r/11),s=r%11;e[n*121+r]=Math.max(Math.abs(t-a),Math.abs(o-s))}}return e})();function Se(e,n){return w(Ls,e*121+n)}i(Se,"chebyshev");function Fs(e,n){let t=Math.trunc(e/11),o=e%11,r=Math.trunc(n/11),a=n%11;return Math.trunc((t+r)/2)*11+Math.trunc((o+a)/2)}i(Fs,"midpointCompute");var Bs=(()=>{let e=new Uint8Array(14641);for(let n=0;n<121;n+=1)for(let t=0;t<121;t+=1)e[n*121+t]=Fs(n,t);return e})();function mo(e,n){return w(Bs,e*121+n)}i(mo,"midpoint");var fa=(()=>{let e=[],n=so(Me(Gn,0));for(let t=0;t<121;t+=1)en(w(n,t))&&e.push(t);return new Int32Array(e)})(),ha=(()=>{let e=new Uint8Array(121*ge);for(let n=0;n<121;n+=1){let t=Math.trunc(n/11),o=n%11,r=Math.min(o,10-o);for(let a=0;a<ge;a+=1){let s=a===0?10:0,u=Math.abs(s-t);e[a*121+n]=u>r?u:r}}return e})(),ka=(()=>{let e=new Uint8Array(121);for(let n=0;n<121;n+=1)e[n]=Math.abs(Yr-Math.trunc(n/11));return e})(),nn=(()=>{let e=new Uint8Array(121);for(let n=0;n<121;n+=1){let t=99;for(let o=0;o<fa.length;o+=1){let r=Se(n,d(fa,o));r<t&&(t=r)}e[n]=t}return e})();function Ds(e){let n=e>>>0;return()=>(n^=n<<13,n>>>=0,n^=n>>>17,n^=n<<5,n>>>=0,n|0)}i(Ds,"xorshift");function vn(e,n){let t=new Int32Array(n);for(let o=0;o<n;o+=1)t[o]=e();return t}i(vn,"randomTable");var Tn=Ds(49734321),Ma=3,fo=1+Et*Ma,Vs=vn(Tn,121*fo),Us=vn(Tn,121*fo),Ws=vn(Tn,484),Gs=vn(Tn,484),Ks=vn(Tn,484),js=vn(Tn,484),Sa=2048,po=vn(Tn,Sa),nr=vn(Tn,Sa);function Ia(e){return G(e)!==H?0:1+se(ae(e),fe(e))*Ma+ie(e)}i(Ia,"monSlot");function bo(e,n){return n===0?0:d(Vs,e*fo+Ia(n))^d(Ws,e*4+R(n))^d(Ks,e*4+N(n))}i(bo,"cellHashLo");function yo(e,n){return n===0?0:d(Us,e*fo+Ia(n))^d(Gs,e*4+R(n))^d(js,e*4+N(n))}i(yo,"cellHashHi");function tr(e,n){return e>=Ce?h.White:n>=Ce?h.Black:void 0}i(tr,"winnerForScores");function ho(e){return tr(e.whiteScore,e.blackScore)}i(ho,"winnerForState");function it(e){return e.turnNumber===1}i(it,"isFirstTurnState");function ko(e){return e.activeColor===h.White?e.whitePotionsCount:e.blackPotionsCount}i(ko,"currentPlayerPotions");function mn(e){return e<ee}i(mn,"canMoveMonForCounts");function Aa(e){return mn(e.monsMovesCount)}i(Aa,"canPlayerMoveMon");function wn(e,n){return!e&&n<An}i(wn,"canMoveManaForCounts");function Ca(e){return wn(it(e),e.manaMovesCount)}i(Ca,"canPlayerMoveMana");function Mo(e,n,t){return!e&&(t>0||n<Ne)}i(Mo,"canUseActionForCounts");function ga(e){return Mo(it(e),e.actionsUsedCount,ko(e))}i(ga,"canPlayerUseAction");function Ea(e,n){if(n===void 0)return!0;let t=$(e);switch(n.kind){case"mon":return t!==void 0?!1:e.kind==="mana"?n.mon.kind===M.Drainer&&!Ae(n.mon):e.kind==="consumable"&&e.consumable===A.BombOrPotion;case"mana":return t?.kind===M.Drainer&&!Ae(t);case"mon-with-mana":case"mon-with-consumable":return e.kind==="consumable"&&e.consumable===A.BombOrPotion;case"consumable":return n.consumable===A.BombOrPotion&&t!==void 0}}i(Ea,"spiritDestinationItemAllowed");function or(e,n,t,o,r,a,s){if(!wn(e,t))return!1;let u=mn(n);return!u&&!Mo(e,o,r)||!a||s&&!u&&o>=Ne&&r>0}i(or,"shouldSuggestRegularManaStartsFromScalars");function va(e,n,t){return or(it(e),e.monsMovesCount,e.manaMovesCount,e.actionsUsedCount,ko(e),n,t)}i(va,"shouldSuggestRegularManaStarts");function rr(e,n,t,o){return e?!mn(n):wn(e,t)?!mn(n)&&!o:!0}i(rr,"shouldAdvanceTurnForCounts");function Kn(e){switch(e.kind){case"regular":case"consumable-base":case"mana-base":case"mana-pool":return!0;case"supermana-base":case"mon-base":return!1}}i(Kn,"regularSquareForMovement");function ar(e,n){let t=e.get(n),o=e.squareAt(n);return t?.kind==="mon"?Kn(o)&&t.mon.kind===M.Drainer:t!==void 0?!1:Kn(o)}i(ar,"regularManaMoveDestinationAllowed");function $s(e){for(let n of e.board.allFreeRegularManaLocations(e.activeColor))for(let t of Be(n))if(ar(e.board,t))return!0;return!1}i($s,"hasMovableFreeRegularMana");function Ta(e){let n=it(e),o=!(!n&&wn(n,e.manaMovesCount)&&!mn(e.monsMovesCount))||$s(e);return rr(n,e.monsMovesCount,e.manaMovesCount,o)}i(Ta,"shouldAdvanceTurn");var tn=0,Io=1,ur=2,Qe=3,On=4,lr=5,Ie=127,on=0,fn=1,$n=2,dr=3,Ao=-2,wa=16;function he(e,n,t,o,r){return e|n<<3|t<<10|o<<17|r<<24}i(he,"encodeMove");function st(e){return e&7}i(st,"moveType");function Ue(e){return e>>3&127}i(Ue,"moveFrom");function we(e){return e>>10&127}i(we,"moveTo");function ct(e){return e>>17&127}i(ct,"moveAux");function Rt(e){return e>>24&3}i(Rt,"moveModifier");function ir(e,n,t){if(e.length!==n)throw new RangeError(`fast position ${t} length must be ${n}`)}i(ir,"validateArrayLength");var sr=class{static{i(this,"MutableFastPosition")}cells=new Uint16Array(121);squares=new Uint8Array(121);monLocations=new Int32Array(Et).fill(-1);freeMana=new Int32Array(ge);manaIndices=new Int32Array(wa);manaCount=0;whiteScore=0;blackScore=0;active=0;monsMoves=0;manaMoves=0;actionsUsed=0;potions=new Int32Array(ge);firstTurn=!1;hashLo=0;hashHi=0;copyFrom(n){let t=n;this.cells.set(t.cells),this.squares=t.squares;let o=this.monLocations,r=t.monLocations;for(let u=0;u<Et;u+=1)o[u]=r[u]??0;this.freeMana[0]=t.freeMana[0]??0,this.freeMana[1]=t.freeMana[1]??0;let a=this.manaIndices,s=t.manaIndices;for(let u=0;u<wa;u+=1)a[u]=s[u]??0;this.manaCount=t.manaCount,this.whiteScore=t.whiteScore,this.blackScore=t.blackScore,this.active=t.active,this.monsMoves=t.monsMoves,this.manaMoves=t.manaMoves,this.actionsUsed=t.actionsUsed,this.potions[0]=t.potions[0]??0,this.potions[1]=t.potions[1]??0,this.firstTurn=t.firstTurn,this.hashLo=t.hashLo,this.hashHi=t.hashHi}reset(n){ir(n.cells,121,"cells"),ir(n.squares,121,"squares"),ir(n.potions,ge,"potions");let t;try{t=new Uint8Array(n.squares)}catch(p){_e(p)}let o=0;for(let p=0;p<121;p+=1){let f=g(n.cells,p);if(!(f===0||G(f)!==J)&&(o+=1,o>this.manaIndices.length))throw new RangeError("fast mana index capacity exceeded")}let r=n.whiteScore,a=n.blackScore,s=n.active,u=n.monsMoves,c=n.manaMoves,l=n.actionsUsed,m=n.firstTurn;this.cells.set(n.cells),this.squares=t,this.whiteScore=r,this.blackScore=a,this.active=s,this.monsMoves=u,this.manaMoves=c,this.actionsUsed=l,this.potions.set(n.potions),this.firstTurn=m,this.rebuildDerived()}rebuildDerived(){this.monLocations.fill(-1),this.freeMana[0]=0,this.freeMana[1]=0,this.manaIndices.fill(0),this.manaCount=0;let n=0,t=0;for(let o=0;o<121;o+=1){let r=g(this.cells,o);if(r===0)continue;n^=bo(o,r),t^=yo(o,r);let a=G(r);if(a===H)this.monLocations[se(ae(r),fe(r))]=o;else if(a===J){let s=R(r);(s===1||s===2)&&(this.freeMana[s-1]=d(this.freeMana,s-1)+1),this.manaIndices[this.manaCount]=o,this.manaCount+=1}}this.hashLo=n,this.hashHi=t}},Co=sr;function _t(e,n,t){let o=d(e.monLocations,se(Ot,n));if(o<0)return!1;let r=g(e.cells,o);return G(r)===H&&ae(r)===Ot&&fe(r)===n&&ie(r)===0&&Se(o,t)===1}i(_t,"awakeAngelGuards");function qs(e,n){let t=e.manaCount;for(let o=0;o<t;o+=1)if(d(e.manaIndices,o)===n){for(let r=o+1;r<t;r+=1)e.manaIndices[r-1]=d(e.manaIndices,r);e.manaIndices[t-1]=0,e.manaCount=t-1;return}throw new RangeError(`missing fast mana index: ${n}`)}i(qs,"removeManaIndex");function Hs(e,n){let t=e.manaCount;if(t>=e.manaIndices.length)throw new RangeError("fast mana index capacity exceeded");let o=t;for(;o>0&&d(e.manaIndices,o-1)>n;)e.manaIndices[o]=d(e.manaIndices,o-1),o-=1;e.manaIndices[o]=n,e.manaCount=t+1}i(Hs,"insertManaIndex");function K(e,n,t){let o=g(e.cells,n);if(o!==t){if(o!==0){e.hashLo^=bo(n,o),e.hashHi^=yo(n,o);let r=G(o);if(r===H){let a=se(ae(o),fe(o));d(e.monLocations,a)===n&&(e.monLocations[a]=-1)}else if(r===J){let a=R(o);(a===1||a===2)&&(e.freeMana[a-1]=d(e.freeMana,a-1)-1),qs(e,n)}}if(e.cells[n]=t,t!==0){e.hashLo^=bo(n,t),e.hashHi^=yo(n,t);let r=G(t);if(r===H)e.monLocations[se(ae(t),fe(t))]=n;else if(r===J){let a=R(t);(a===1||a===2)&&(e.freeMana[a-1]=d(e.freeMana,a-1)+1),Hs(e,n)}}}}i(K,"setCell");function So(e){return rt(ae(e),fe(e),ie(e),0,0)}i(So,"plainMonCell");function jn(e,n,t){return rt(ae(e),fe(e),ie(e),n,t)}i(jn,"carryingMonCell");function Oa(e,n){e.potions[n]=d(e.potions,n)+1}i(Oa,"addPotion");function cr(e,n,t,o){if(R(n)===0&&N(n)===0&&o===fn){K(e,t,jn(n,0,Ee));return}K(e,t,n),Oa(e,fe(n))}i(cr,"collectConsumableAt");function zs(e,n){e.active===0?e.whiteScore+=n:e.blackScore+=n}i(zs,"addScore");function mr(e){if(e.actionsUsed<Ne){e.actionsUsed+=1;return}e.potions[e.active]=d(e.potions,e.active)-1}i(mr,"consumeAction");function xa(e,n){let t=ae(n),o=fe(n),r=d(co,se(t,o));K(e,r,rt(t,o,2,0,0))}i(xa,"faintMonAt");function Xs(e){let n=g(e.cells,tt);G(n)===H&&R(n)===0&&N(n)===0?K(e,tt,jn(n,ye,0)):K(e,tt,Cn(ye))}i(Xs,"supermanaBackToBase");function Qs(e,n,t){let o=R(n);if(o===ye?Xs(e):o!==0&&K(e,t,Cn(o)),N(n)===Ee){let r=d(co,se(ae(n),fe(n)));t!==r&&K(e,t,0)}}i(Qs,"releaseFaintedCarry");function fr(e,n,t){xa(e,n),Qs(e,n,t)}i(fr,"faintTargetAndReleaseCarry");function pr(e,n,t){zs(e,Ve(t,e.active));let o=g(e.cells,n);G(o)===H?K(e,n,So(o)):K(e,n,0)}i(pr,"scoreCarriedManaAt");function Ys(e,n){let t=Ue(n),o=we(n),r=g(e.cells,t),a=g(e.cells,o),s=R(r);if(e.monsMoves+=1,K(e,t,0),K(e,o,r),a!==0){let u=G(a);u===J?(s!==0&&K(e,t,Cn(s)),K(e,o,jn(r,R(a),0))):u===pe&&N(a)===ve&&cr(e,r,o,Rt(n))}s!==0&&en(w(e.squares,o))&&pr(e,o,s)}i(Ys,"applyMonMove");function Zs(e,n){let t=Ue(n),o=we(n),r=R(g(e.cells,t)),a=g(e.cells,o);e.manaMoves+=1,K(e,t,0),K(e,o,Cn(r)),a!==0&&K(e,o,jn(a,r,0)),en(w(e.squares,o))&&pr(e,o,r)}i(Zs,"applyManaMove");function Js(e,n){let t=we(n),o=g(e.cells,t);mr(e),K(e,t,0),fr(e,o,t)}i(Js,"applyMysticAction");function ec(e,n){let t=Ue(n),o=we(n),r=Rt(n),a=r===dr?Ie:ct(n),s=g(e.cells,t),u=g(e.cells,o),c=d(co,se(ae(s),fe(s))),l=N(u)!==Ee||a===Ie||a===c;return K(e,t,0),a===Ie?K(e,o,So(s)):K(e,o,0),mr(e),u!==0&&(fr(e,u,o),N(u)===Ee&&xa(e,s)),a!==Ie&&(r===fn?K(e,a,jn(s,0,Ee)):(K(e,a,So(s)),r===$n&&Oa(e,fe(s)))),l}i(ec,"applyDemonAction");function nc(e,n){let t=Ue(n),o=we(n),r=g(e.cells,t),a=g(e.cells,o);K(e,o,0),K(e,t,So(r)),fr(e,a,o)}i(nc,"applyBombAttack");function tc(e,n){let t=we(n),o=ct(n),r=Rt(n),a=g(e.cells,t),s=g(e.cells,o),u=R(a);if(mr(e),K(e,t,0),K(e,o,a),s!==0){let c=G(a);if(c===H){let l=G(s);l===J?(u!==0&&K(e,t,Cn(u)),K(e,o,jn(a,R(s),0))):l===pe&&cr(e,a,o,r)}else c===J?K(e,o,jn(s,u,0)):c===pe&&cr(e,s,o,r)}u!==0&&en(w(e.squares,o))&&pr(e,o,u)}i(tc,"applySpiritAction");function br(e){let n=tr(e.whiteScore,e.blackScore);return n===void 0?-1:ze(n)}i(br,"positionWinner");function Ra(e){return Mo(e.firstTurn,e.actionsUsed,d(e.potions,e.active))}i(Ra,"canUseAction");function _a(e,n){return d(e.freeMana,e.active)===0?!1:or(e.firstTurn,e.monsMoves,e.manaMoves,e.actionsUsed,d(e.potions,e.active),n!==0,!0)}i(_a,"manaStartsAllowed");function ut(e,n){if(!at(w(e.squares,n)))return!1;let t=g(e.cells,n);return t===0||G(t)===H&&ae(t)===ke&&R(t)===0&&N(t)===0}i(ut,"manaMoveAllowed");function oc(e){let n=e.active+1;for(let t=0;t<e.manaCount;t+=1){let o=d(e.manaIndices,t),r=g(e.cells,o);if(G(r)!==J||R(r)!==n)continue;let a=d(le.starts,o),s=d(le.counts,o);for(let u=0;u<s;u+=1){let c=d(le.list,a+u);if(ut(e,c))return!0}}return!1}i(oc,"hasMovableFreeRegularMana");function rc(e){let t=!(!e.firstTurn&&wn(e.firstTurn,e.manaMoves)&&!mn(e.monsMoves))||d(e.freeMana,e.active)!==0&&oc(e);return rr(e.firstTurn,e.monsMoves,e.manaMoves,t)}i(rc,"shouldAdvanceTurn");function ac(e){e.active^=1,e.firstTurn=!1,e.actionsUsed=0,e.manaMoves=0,e.monsMoves=0;let n=e.active;for(let t=0;t<dn;t+=1){let o=d(e.monLocations,se(t,n));if(o<0)continue;let r=g(e.cells,o),a=ie(r);a===0||R(r)!==0||N(r)!==0||K(e,o,rt(ae(r),fe(r),a-1,R(r),N(r)))}}i(ac,"advanceTurn");function Na(e,n){let t=e,o=st(n),r=!0;switch(o){case tn:Ys(t,n);break;case Io:Zs(t,n);break;case ur:Js(t,n);break;case Qe:r=ec(t,n);break;case On:tc(t,n);break;case lr:nc(t,n);break;default:throw new RangeError(`unsupported fast move type: ${o}`)}let a=br(t);return a===-1&&rc(t)&&ac(t),r?a:Ao}i(Na,"applyFastMove");function Pa(e){switch(e){case A.Bomb:return Ee;case A.Potion:return pa;case A.BombOrPotion:return ve}}i(Pa,"consumableCode");function La(e){return e.kind==="supermana"?ye:ze(e.color)===0?vt:Tt}i(La,"manaCode");var Fa=2147483647;function Ba(e,n,t){if(!Number.isSafeInteger(t)||t<0||n.whitePotionsCount>Fa-t||n.blackPotionsCount>Fa-t||n.turnNumber>Number.MAX_SAFE_INTEGER-t)return!1;let o;try{o=new Uint8Array(e.monLocations.length)}catch(a){if(a instanceof RangeError)return!1;throw a}let r=0;for(let a of n.board.items){if(a===void 0)continue;if(In(a)!==void 0&&(r+=1,r>e.manaIndices.length))return!1;let s=$(a);if(s===void 0)continue;let u=se(Xe[s.kind],ze(s.color));if(o[u]!==0)return!1;o[u]=1}try{ic(e,n)}catch(a){if(At(a))return!1;throw a}return!0}i(Ba,"tryLoadPosition");function ic(e,n){let t;try{t=new Uint16Array(121)}catch(r){_e(r)}let o=n.board.items;for(let r=0;r<121;r+=1){let a=o[r];if(a!==void 0)switch(a.kind){case"mon":t[r]=io(a.mon,0,0);break;case"mana":t[r]=Cn(La(a.mana));break;case"mon-with-mana":t[r]=io(a.mon,La(a.mana),0);break;case"mon-with-consumable":t[r]=io(a.mon,0,Pa(a.consumable));break;case"consumable":t[r]=ya(Pa(a.consumable));break}}e.reset({cells:t,squares:so(n.variant()),whiteScore:n.whiteScore,blackScore:n.blackScore,active:ze(n.activeColor),monsMoves:n.monsMovesCount,manaMoves:n.manaMovesCount,actionsUsed:n.actionsUsedCount,potions:[n.whitePotionsCount,n.blackPotionsCount],firstTurn:n.isFirstTurn()})}i(ic,"loadPosition");function go(e){return{kind:"location",location:nt(e)}}i(go,"locationInput");function sc(e){return{kind:"modifier",modifier:e===fn?X.SelectBomb:X.SelectPotion}}i(sc,"modifierInput");function Da(e){let n=st(e),t=[go(Ue(e)),go(we(e))];n===On?t.push(go(ct(e))):n===Qe&&ct(e)!==Ie&&t.push(go(ct(e)));let o=Rt(e);return(o===fn||o===$n)&&(n===tn||n===Qe||n===On)&&t.push(sc(o)),t}i(Da,"moveToInputs");var Eo=1e6,cc=-2147483648,uc=2147483647,lc=["scoreUnit","potion","bomb","activeMon","faintMon","faintDrainer","faintCooldownStep","drainerCloseToMana","drainerCloseToOwnPool","drainerCloseToSupermana","carrierCloseToPool","carrierPointBonus","carrierScoresThisTurn","carrierScoresNextTurn","winningCarrier","drainerPickupScoresThisTurn","manaToOwnerPool","manaPointsAttraction","manaDrainerControl","supermanaDrainerControl","monCloseToCenter","spiritCloseToEnemy","spiritOnOwnBase","angelCloseToDrainer","angelGuardingDrainer","attackerCloseToEnemyDrainer","drainerThreatImmediate","drainerThreatWalk","carrierThreatFactor","manaToNearestPool","manaStepQueue1","manaStepQueue2","manaStepQueue3","manaStepQueue4","manaStepQueue5","manaStepWinThreat","drainerTripTurn1","drainerTripTurn2","drainerTripTurn3","drainerTripTurn4","supermanaCarrier","scoreShape10","scoreShape20","scoreShape21","scoreShape30","scoreShape31","scoreShape32","tripGradient","raceHalfTurn","threatMoverScaleSpare","threatMoverScaleFew","tripTwoPointScale"];function yr(e){if(typeof e!="object"||e===null||Array.isArray(e))throw new TypeError("fast evaluation weights must be an object");let n=e,t={scoreUnit:0,potion:0,bomb:0,activeMon:0,faintMon:0,faintDrainer:0,faintCooldownStep:0,drainerCloseToMana:0,drainerCloseToOwnPool:0,drainerCloseToSupermana:0,carrierCloseToPool:0,carrierPointBonus:0,carrierScoresThisTurn:0,carrierScoresNextTurn:0,winningCarrier:0,drainerPickupScoresThisTurn:0,manaToOwnerPool:0,manaPointsAttraction:0,manaDrainerControl:0,supermanaDrainerControl:0,monCloseToCenter:0,spiritCloseToEnemy:0,spiritOnOwnBase:0,angelCloseToDrainer:0,angelGuardingDrainer:0,attackerCloseToEnemyDrainer:0,drainerThreatImmediate:0,drainerThreatWalk:0,carrierThreatFactor:0,manaToNearestPool:0,manaStepQueue1:0,manaStepQueue2:0,manaStepQueue3:0,manaStepQueue4:0,manaStepQueue5:0,manaStepWinThreat:0,drainerTripTurn1:0,drainerTripTurn2:0,drainerTripTurn3:0,drainerTripTurn4:0,supermanaCarrier:0,scoreShape10:0,scoreShape20:0,scoreShape21:0,scoreShape30:0,scoreShape31:0,scoreShape32:0,tripGradient:0,raceHalfTurn:0,threatMoverScaleSpare:0,threatMoverScaleFew:0,tripTwoPointScale:0};for(let o of lc){let r=n[o];if(typeof r!="number")throw new TypeError(`weights.${o} must be a number`);if(!Number.isSafeInteger(r)||r<-Eo||r>Eo)throw new RangeError(`weights.${o} must be a safe integer from -${Eo} through ${Eo}`);t[o]=r}return Object.freeze(t)}i(yr,"normalizeEvalWeights");var Rn=yr({scoreUnit:12e3,potion:240,bomb:1200,activeMon:45,faintMon:520,faintDrainer:900,faintCooldownStep:80,drainerCloseToMana:330,drainerCloseToOwnPool:280,drainerCloseToSupermana:180,carrierCloseToPool:1600,carrierPointBonus:420,carrierScoresThisTurn:900,carrierScoresNextTurn:700,winningCarrier:8e3,drainerPickupScoresThisTurn:420,manaToOwnerPool:170,manaPointsAttraction:350,manaDrainerControl:26,supermanaDrainerControl:40,monCloseToCenter:210,spiritCloseToEnemy:200,spiritOnOwnBase:180,angelCloseToDrainer:150,angelGuardingDrainer:260,attackerCloseToEnemyDrainer:150,drainerThreatImmediate:2100,drainerThreatWalk:720,carrierThreatFactor:2,manaToNearestPool:0,manaStepQueue1:3600,manaStepQueue2:2500,manaStepQueue3:1050,manaStepQueue4:800,manaStepQueue5:800,manaStepWinThreat:8e3,drainerTripTurn1:4200,drainerTripTurn2:2200,drainerTripTurn3:1e3,drainerTripTurn4:400,supermanaCarrier:4e3,scoreShape10:-6824,scoreShape20:-6978,scoreShape21:-3085,scoreShape30:-8259,scoreShape31:-4275,scoreShape32:-1052,tripGradient:400,raceHalfTurn:900,threatMoverScaleSpare:25,threatMoverScaleFew:55,tripTwoPointScale:290}),be=99,Te=Math.max(be+1,11),Va=3,We=Ce+2,vo=ee+1,hr=0,ja=1,kr=2,xn=3,$a=3,qa=vo,bn=6,Ua=bn*2+1,Nt=6,Mr=2,Wa=12;function pn(e){let n=_n(Te);for(let t=0;t<Te;t+=1)n[t]=Math.trunc(e/(t+1));return n}i(pn,"distanceTable");function dc(e){let n=_n(Te),t=e.manaToNearestPool;for(let o=0;o<Te;o+=1){let r=o<=1?e.manaStepQueue1:o===2?e.manaStepQueue2:o===3?e.manaStepQueue3:o===4?e.manaStepQueue4:e.manaStepQueue5;n[o]=r+Math.trunc(t/(o+1))}return n}i(dc,"manaStepQueueTable");function mc(e){let n=_n(We*We),t=new Set,o=i((r,a,s)=>{if(r===a)throw new RangeError("score shape cells must be off the diagonal");let u=r*We+a,c=a*We+r;if(t.has(u)||t.has(c))throw new RangeError("score shape cells must be written once");t.add(u),t.add(c),n[u]=s,n[c]=-s},"set");o(1,0,e.scoreShape10),o(2,0,e.scoreShape20),o(2,1,e.scoreShape21),o(3,0,e.scoreShape30),o(3,1,e.scoreShape31),o(3,2,e.scoreShape32);for(let r=0;r+1<We;r+=1)for(let a=0;a<We;a+=1)if(e.scoreUnit+d(n,(r+1)*We+a)-d(n,r*We+a)<0)throw new RangeError("score shape corrections must keep the score monotone");return n}i(mc,"scoreShapeTable");function Ha(e){let n=_n(Te);for(let t=0;t<Te;t+=1){let o=1+Math.ceil(t/ee);n[t]=o<=1?e.drainerTripTurn1:o===2?e.drainerTripTurn2:o===3?e.drainerTripTurn3:e.drainerTripTurn4}return n}i(Ha,"drainerTripTable");function fc(e){let n=Ha(e);for(let t=0;t<Te;t+=1)n[t]=Qa(d(n,t),e.tripTwoPointScale,"two-point trip");return n}i(fc,"twoPointTripTable");function pc(e){let n=_n(Ua);for(let t=0;t<Ua;t+=1)n[t]=(t-bn)*e;return n}i(pc,"raceTable");function bc(e){let n=_n(Te);for(let t=0;t<Te;t+=1){let o=t>Wa?Wa:t;n[t]=o*e}return n}i(bc,"tripStepTable");function yc(e){let n=_n(Va*Te);for(let t=0;t<Va;t+=1){let o=t*Te;for(let r=0;r<Te;r+=1)n[o+r]=Math.trunc(t*e/(r+1))}return n}i(yc,"manaPointsAttractionTable");function za(e,n){return n===hr?100:n===kr?e.threatMoverScaleSpare:e.threatMoverScaleFew}i(za,"moverScale");function Xa(e,n,t){let o=e*n;if(!Number.isSafeInteger(o))throw new RangeError(`${t} derived value requires a safe integer product`);return Math.trunc(o/100)}i(Xa,"scaledSafeInteger");function Qa(e,n,t){let o=Xa(e,n,t);if(o<cc||o>uc)throw new RangeError(`${t} derived value must fit a signed 32-bit integer`);return o}i(Qa,"scaledInt32");function hc(e){let n=_n(2*xn);for(let t=0;t<2;t+=1){let o=t===1?e.carrierThreatFactor:1;for(let r=0;r<xn;r+=1)n[t*xn+r]=Qa(e.drainerThreatImmediate*o,za(e,r),"immediate threat")}return n}i(hc,"threatImmediateTable");function kc(e){let n=Mc(2*xn*vo);for(let t=0;t<2;t+=1){let o=t===1?e.carrierThreatFactor:1;for(let r=0;r<xn;r+=1){let a=za(e,r),s=(t*xn+r)*vo;for(let u=0;u<vo;u+=1)n[s+u]=Xa(Math.trunc(e.drainerThreatWalk*o*(ee+1-u)/ee),a,"walking threat")}}return n}i(kc,"threatWalkTable");function _n(e){try{return new Int32Array(e)}catch(n){_e(n)}}i(_n,"createInt32Table");function Mc(e){try{return new Float64Array(e)}catch(n){_e(n)}}i(Mc,"createFloat64Table");function Sc(e,n){let t=bn*Math.abs(e.raceHalfTurn);if(t===0)return;let o=Ce-Mr;for(let r=0;r<o;r+=1){let a=e.scoreUnit+d(n,o*We+r)-d(n,(o-1)*We+r);if(t>a)throw new RangeError("race correction must not outweigh the point that opens the endgame band")}}i(Sc,"assertRaceStaysMonotone");function Ya(e){let n=mc(e);return Sc(e,n),{weights:e,manaPointsAttraction:yc(e.manaPointsAttraction),manaToOwnerPool:pn(e.manaToOwnerPool),manaToNearestPool:dc(e),scoreShape:n,drainerTrip:Ha(e),drainerTripTwoPoint:fc(e),race:pc(e.raceHalfTurn),tripStep:bc(e.tripGradient),carrierCloseToPool:pn(e.carrierCloseToPool),drainerCloseToMana:pn(e.drainerCloseToMana),drainerCloseToOwnPool:pn(e.drainerCloseToOwnPool),drainerCloseToSupermana:pn(e.drainerCloseToSupermana),angelCloseToDrainer:pn(e.angelCloseToDrainer),spiritCloseToEnemy:pn(e.spiritCloseToEnemy),monCloseToCenter:pn(e.monCloseToCenter),attackerCloseToEnemyDrainer:pn(e.attackerCloseToEnemyDrainer),threatImmediate:hc(e),threatWalk:kc(e)}}i(Ya,"createEvalTables");var To=Ya(Rn),Ga=new WeakMap;function Za(e){if(e===Rn)return Rn;if(!Object.isFrozen(e))return yr(e);let n=Ga.get(e);return n===void 0&&(n=yr(e),Ga.set(e,n)),n}i(Za,"memoizedNormalizedEvalWeights");var Ka=new WeakMap;function Ja(e){if(e===Rn)return To;let n=Ka.get(e);return n===void 0&&(n=Ya(e),Ka.set(e,n)),n}i(Ja,"memoizedEvalTables");var yn=1e6;function ei(e,n){return w(ha,n*121+e)}i(ei,"ownPoolDistance");var ni=Int32Array.of(0,10,110,120);function Ic(e,n){for(let t=0;t<ni.length;t+=1){let o=d(ni,t);if(Se(n,o)===1&&ut(e,o))return!0}return!1}i(Ic,"hasAdjacentScoringPool");function ti(e,n,t,o){return d(n,t>o?t-o:0)-d(e.tripStep,t)}i(ti,"tripValue");function Ac(e){return w(ka,e)}i(Ac,"centerDistance");var Sr=new WeakMap,Pt,lt;function Cc(e,n){if(e?.length!==n.length)return!1;for(let t=0;t<n.length;t+=1)if(w(e,t)!==w(n,t))return!1;return!0}i(Cc,"sameSquareContent");function gc(e){try{let n=new Uint8Array(14641).fill(be),t=new Int32Array(121),o=new Int32Array(121),r=[],a=[];for(let s=0;s<121;s+=1){let u=d(gn.starts,s),c=d(gn.counts,s);for(let p=0;p<121;p+=1){let f=be;for(let b=0;b<c;b+=1){let y=d(gn.list,u+b);if(w(e,y)>=ue)continue;let I=Se(p,y);I<f&&(f=I)}n[s*121+p]=f}t[s]=r.length;let l=d(En.starts,s),m=d(En.counts,s);for(let p=0;p<m;p+=1){let f=d(En.list,l+p);if(w(e,f)>=ue)continue;let b=mo(s,f),y=w(e,b);y===Je||y>=ue||(r.push(f),a.push(b))}o[s]=r.length-d(t,s)}return{mysticSteps:n,demonStarts:t,demonCounts:o,demonOrigins:new Int32Array(r),demonBetween:new Int32Array(a)}}catch(n){_e(n)}}i(gc,"buildAttackTables");function Ec(e){if(e===Pt&&lt!==void 0)return lt;let n=Sr.get(e);if(n!==void 0)return Pt=e,lt=n,n;if(lt!==void 0&&Cc(Pt,e)){let o=lt;return Sr.set(e,o),Pt=e,o}let t=gc(e);return Sr.set(e,t),Pt=e,lt=t,t}i(Ec,"attackTablesFor");function vc(e,n,t,o){if(!ot(g(e.cells,n)))return be;let r=t^1,a=be,s=Ec(e.squares);for(let u=0;u<dn;u+=1){let c=d(e.monLocations,se(u,r));if(c<0)continue;let l=g(e.cells,c);if(G(l)!==H)continue;if(N(l)===Ee){let f=Se(c,n)-3,b=f<0?0:f;if(b===0)return 0;b<a&&(a=b);continue}if(ie(l)!==0||N(l)!==0||o||R(l)!==0)continue;if(u===oo){let f=w(s.mysticSteps,n*121+c);if(f===0)return 0;f<a&&(a=f);continue}if(u!==wt)continue;let m=d(s.demonStarts,n),p=d(s.demonCounts,n);for(let f=0;f<p;f+=1){let b=d(s.demonBetween,m+f);if(b!==c&&g(e.cells,b)!==0)continue;let y=Se(c,d(s.demonOrigins,m+f));if(y===0)return 0;y<a&&(a=y)}}return a}i(vc,"estimatedAttackSteps");function oi(e,n,t=0){let o=n.weights,r=(e.whiteScore-e.blackScore)*o.scoreUnit+d(n.scoreShape,e.whiteScore*We+e.blackScore)+(d(e.potions,0)-d(e.potions,1))*o.potion,a=d(e.monLocations,se(ke,0)),s=d(e.monLocations,se(ke,1)),u=a>=0&&ie(g(e.cells,a))===0,c=s>=0&&ie(g(e.cells,s))===0,l=be,m=be,p=be,f=be,b=be,y=be,I=ee-e.monsMoves,S=t!==0,P=Ce-e.whiteScore,x=Ce-e.blackScore,F=0,D=Nt,L=Nt,V=Nt,U=Nt,de=!1,Ke=!1;if(S){if(a>=0){let C=g(e.cells,a);de=ie(C)<=1&&R(C)===0&&N(C)===0}if(s>=0){let C=g(e.cells,s);Ke=ie(C)<=1&&R(C)===0&&N(C)===0}}let Oe=0,sn=0,cn=!1,Pe=!1,Fn=0,me=0,je=0,$e=0;for(let C=0;C<e.manaCount;C+=1){let v=d(e.manaIndices,C),ne=g(e.cells,v);if(G(ne)!==J)continue;let j=R(ne),z=u?Se(a,v):be,te=c?Se(s,v):be;z<l&&(l=z),te<m&&(m=te);let ce=w(nn,v);if(u){let T=z+ce;j===vt&&T<p?p=T:j!==vt&&T<b&&(b=T)}if(c){let T=te+ce;j===Tt&&T<f?f=T:j!==Tt&&T<y&&(y=T)}if(S){let T=!1;if(j!==ye&&ce<=1&&Ic(e,v)&&(T=!0,j-1===0?Fn<2&&(Fn+=1):me<2&&(me+=1)),de&&(u?z:Se(a,v))+ce<=ee){let oe=Ve(j,0);oe>Oe?(Oe=oe,cn=T&&j-1===0):oe===Oe&&!(T&&j-1===0)&&(cn=!1)}if(Ke&&(c?te:Se(s,v))+ce<=ee){let oe=Ve(j,1);oe>sn?(sn=oe,Pe=T&&j-1===1):oe===sn&&!(T&&j-1===1)&&(Pe=!1)}}let qe=te-z;if(qe>4&&(qe=4),qe<-4&&(qe=-4),o.manaPointsAttraction!==0){let T=n.manaPointsAttraction;u&&(r+=d(T,Ve(j,0)*Te+z)),c&&(r-=d(T,Ve(j,1)*Te+te))}if(j===ye)r+=o.supermanaDrainerControl*qe;else{let T=j-1,_=T===0?1:-1;r+=_*d(n.manaToOwnerPool,ei(v,T)),r+=_*d(n.manaToNearestPool,ce),r+=o.manaDrainerControl*qe,ce<=2&&(T===0?P:x)<=1&&(F|=T===0?1:2),T===0?ce<D&&(D=ce):ce<L&&(L=ce)}}F!==0&&(r+=o.manaStepWinThreat*(((F&1)===0?0:1)-((F&2)===0?0:1)));for(let C=0;C<ge;C+=1){let v=C===0?1:-1,ne=C^1;for(let j=0;j<dn;j+=1){let z=d(e.monLocations,se(j,C));if(z<0)continue;let te=g(e.cells,z);if(G(te)!==H)continue;let ce=ie(te);ce!==0&&(r-=v*((j===ke?o.faintDrainer:o.faintMon)+o.faintCooldownStep*ce));let qe=w(e.squares,z);ce===0&&qe<ue&&(r+=v*o.activeMon);let T=R(te);if(T!==0){let _=Ve(T,C),oe=w(nn,z);r+=v*(d(n.carrierCloseToPool,oe)+_*o.carrierPointBonus),T===ye&&(r+=v*o.supermanaCarrier),C===e.active&&oe<=I?r+=v*o.carrierScoresThisTurn*_:C!==e.active&&oe<=ee&&(r+=v*o.carrierScoresNextTurn*_,S&&(C===0?_>je&&(je=_):_>$e&&($e=_)));let He=C===0?e.whiteScore:e.blackScore;_>=Ce-He&&(r+=v*o.winningCarrier)}else N(te)===Ee&&(r+=v*o.bomb);if(ce===0)if(j===ke){let _=0,oe=C===0?l:m,He=C===0?p:f,Bn=C===0?b:y,$t=He<Bn?He:Bn,qt=C===e.active?I:ee,Br=n.drainerTrip,Ht=T!==0?w(nn,z):N(te)!==0?be:He;T===0&&N(te)===0&&Bn<be&&(He>=be||ti(n,n.drainerTripTwoPoint,Bn,qt)>ti(n,n.drainerTrip,He,qt))&&(Br=n.drainerTripTwoPoint,Ht=Bn),_-=d(n.tripStep,Ht);let Dr=Ht>qt?Ht-qt:0,zt=1+((Dr+ee-1)/ee|0);C===0?zt<V&&(V=zt):zt<U&&(U=zt),_+=d(Br,Dr),_+=d(n.drainerCloseToMana,oe),_+=d(n.drainerCloseToOwnPool,ei(z,C)),_+=d(n.drainerCloseToSupermana,Se(z,tt)),T===0&&N(te)===0&&C===e.active&&$t<=I&&(_+=o.drainerPickupScoresThisTurn),r+=v*_;let Vr=_t(e,C,z),Go=vc(e,z,C,Vr),Zi=T!==0,Ji=C!==e.active||I===0?hr:I>=$a?kr:ja,Ur=(Zi?xn:0)+Ji;Go===0?r-=v*d(n.threatImmediate,Ur):Go<=ee&&(r-=v*(n.threatWalk[Ur*qa+Go]??0)),Vr&&(r+=v*o.angelGuardingDrainer)}else if(j===Ot){let _=C===0?a:s;_>=0&&(r+=v*d(n.angelCloseToDrainer,Se(z,_)))}else if(j===to){let _=be;for(let oe=0;oe<dn;oe+=1){let He=d(e.monLocations,se(oe,ne));if(He<0)continue;let Bn=g(e.cells,He);if(ie(Bn)!==0)continue;let $t=Se(z,He);$t<_&&(_=$t)}r+=v*d(n.spiritCloseToEnemy,_),qe>=ue&&(r-=v*o.spiritOnOwnBase)}else{r+=v*d(n.monCloseToCenter,Ac(z));let _=ne===0?a:s,oe=ne===0?u:c;_>=0&&oe&&(r+=v*d(n.attackerCloseToEnemyDrainer,Se(z,_)))}}}if(o.raceHalfTurn!==0&&(P<x?P:x)<=Mr){let C=e.manaMoves>0?1:0,v=D+(e.active===0?C:0),ne=L+(e.active===1?C:0),j=V<v?V:v,te=(U<ne?U:ne)*2+(e.active===1?0:1)-(j*2+(e.active===0?0:1)),ce=te>bn?bn:te<-bn?-bn:te;r+=d(n.race,ce+bn)}if(S){let C=e.active^1,v=C===0?1:-1,ne=C===0?Oe:sn,j=C===0?je:$e,z=C===0?Fn:me,te=z>0,ce=C===0?cn:Pe,qe=z>=2||z===1&&!ce,T=ne;T>0&&qe&&(T+=1);let _=j;_>0&&te&&(_+=1),_>T&&(T=_),te&&T<1&&(T=1);let oe=C===0?e.whiteScore:e.blackScore;T>0&&oe+T>=Ce&&(r+=v*t)}return r}i(oi,"evaluateWithTables");var hn=704,wo=1073741824;function Bt(e,n){return n?e+wo:e}i(Bt,"encodeGeneratedMoves");function Lt(e){return e>=wo?e-wo:e}i(Lt,"generatedMoveCount");function Ft(e){return e>=wo}i(Ft,"generatedMovesHadRawStartOption");function Ir(e,n){return G(e)===H&&fe(e)!==n&&ie(e)===0}i(Ir,"isEnemyAwakeMon");function Ar(e){let n=131072;return R(e)!==0&&(n+=1<<20),ae(e)===ke&&(n+=1<<19),n}i(Ar,"damagingAttackKey");function Tc(e,n,t){let o=g(e.cells,t),r=w(e.squares,t),a=G(n),s=a===H,u=R(n),c=N(n),l=o===0?-1:G(o),m=l===H&&(R(o)!==0||N(o)!==0);if(l===H)if(m){if(a!==pe||c!==ve)return 0}else{if(s)return 0;if(a===J){if(ae(o)!==ke||ie(o)!==0)return 0}else if(c!==ve)return 0}else if(l===J){if(!s||ae(n)!==ke||ie(n)!==0)return 0}else if(l===pe&&(N(o)!==ve||!s))return 0;if(r>=ue){if(!s||ro(r)!==ae(n)||ao(r)!==fe(n)||u!==0||c!==0)return 0}else if(r===Je){let p=l===J&&R(o)===ye,f=s&&ae(n)===ke;if(!(u===ye||u===0&&f&&(o===0||p)||f&&p))return 0}return o===0?1:s?u===0&&c===0?l===pe?N(o)===ve?2:0:1:u!==0?l===pe?N(o)===ve?1:0:1:l!==pe||N(o)!==ve?0:1:a===J?l!==H||m?0:1:l!==H?0:m?c===ve?1:0:2}i(Tc,"spiritDestinationOptionCount");function wc(e,n,t,o,r,a){let s=r,u=!1,c=ae(t),l=fe(t),m=R(t),p=N(t),f=e.active,b=w(nn,n),y=c===ke?1024:0,I=d(le.starts,n),S=d(le.counts,n);for(let P=0;P<S;P+=1){let x=d(le.list,I+P),F=g(e.cells,x),D=w(e.squares,x),L=F===0?-1:G(F),V;if(m!==0)L===H?V=!1:L===J||L===pe?V=!0:V=at(D)||D===Je&&m===ye;else if(p!==0)L===pe?V=!0:L===-1?V=at(D):V=!1;else{let de;L===H?de=!1:L===J?de=c===ke:de=!0,de?D>=ue?V=ro(D)===c&&ao(D)===l:D===Je?V=c===ke&&(F===0||L===J&&R(F)===ye):V=!0:V=!1}if(!V||(u=!0,L===pe&&N(F)!==ve))continue;let U=0;m!==0&&en(D)&&(U+=(1<<21)+Ve(m,f)*(1<<18)),F!==0&&(L===J?U+=65536+Ve(R(F),f)*512:L===pe&&(U+=16384)),m!==0?U+=(b-w(nn,x))*2048+4096:U+=y,L===pe&&N(F)===ve&&m===0&&p===0?(a[s]=U,o[s]=he(tn,n,x,Ie,fn),s+=1,a[s]=U,o[s]=he(tn,n,x,Ie,$n),s+=1):(a[s]=U,o[s]=he(tn,n,x,Ie,on),s+=1)}return Bt(s,u)}i(wc,"generateMonMoves");function Oc(e,n,t,o,r){let a=e.active,s=o,u=!1,c=d(gn.starts,n),l=d(gn.counts,n);for(let m=0;m<l;m+=1){let p=d(gn.list,c+m),f=g(e.cells,p);Ir(f,a)&&(_t(e,a^1,p)||(u=!0,ot(f)&&(r[s]=Ar(f),t[s]=he(ur,n,p,Ie,on),s+=1)))}return Bt(s,u)}i(Oc,"generateMysticMoves");function xc(e,n,t,o,r){let a=e.active,s=o,u=!1,c=wt,l=a,m=d(En.starts,n),p=d(En.counts,n);for(let f=0;f<p;f+=1){let b=d(En.list,m+f),y=g(e.cells,b);if(!Ir(y,a)||_t(e,a^1,b))continue;let I=mo(n,b);if(g(e.cells,I)!==0)continue;let S=w(e.squares,I);if(S===Je||S>=ue||(u=!0,!ot(y)))continue;let P=Ar(y),x=w(e.squares,b),F=R(y);if(!(!(N(y)===Ee)&&(F!==0&&F!==ye||x===Je||x>=ue))){r[s]=P,t[s]=he(Qe,n,b,Ie,on),s+=1;continue}let V=s,U=d(le.starts,b),de=d(le.counts,b);for(let Ke=0;Ke<de;Ke+=1){let Oe=d(le.list,U+Ke),sn=g(e.cells,Oe),cn=sn===0?-1:G(sn);if(cn!==-1&&cn!==pe)continue;let Pe=w(e.squares,Oe);(at(Pe)||Pe>=ue&&ro(Pe)===c&&ao(Pe)===l)&&(cn===pe?N(sn)===ve?(r[s]=P,t[s]=he(Qe,n,b,Oe,fn),s+=1,r[s]=P,t[s]=he(Qe,n,b,Oe,$n),s+=1):(r[s]=P,t[s]=he(Qe,n,b,Oe,dr),s+=1):(r[s]=P,t[s]=he(Qe,n,b,Oe,on),s+=1))}s===V&&(r[s]=P,t[s]=he(Qe,n,b,Ie,on),s+=1)}return Bt(s,u)}i(xc,"generateDemonMoves");function Rc(e,n,t,o,r){let a=o,s=!1,u=e.active,c=d(uo.starts,n),l=d(uo.counts,n);for(let m=0;m<l;m+=1){let p=d(uo.list,c+m),f=g(e.cells,p);if(f===0||G(f)===H&&ie(f)!==0)continue;s=!0;let b=R(f),y=G(f)===J,I=w(nn,p),S=(1<<21)+Ve(b,u)*(1<<18),P=d(le.starts,p),x=d(le.counts,p);for(let F=0;F<x;F+=1){let D=d(le.list,P+F),L=Tc(e,f,D);if(L===0)continue;let V=0;b!==0&&en(w(e.squares,D))?V+=8192+S:y&&_c(e,D,I,u)&&(V+=40960),L===2?(r[a]=V,t[a]=he(On,n,p,D,fn),a+=1,r[a]=V,t[a]=he(On,n,p,D,$n),a+=1):(r[a]=V,t[a]=he(On,n,p,D,on),a+=1)}}return Bt(a,s)}i(Rc,"generateSpiritMoves");function _c(e,n,t,o){if(w(nn,n)<t)return!0;let r=g(e.cells,n);return G(r)===H&&ae(r)===ke&&fe(r)===o&&ie(r)===0}i(_c,"advancesMana");function Nc(e,n,t,o,r){let a=e.active,s=o,u=!1,c=d(lo.starts,n),l=d(lo.counts,n);for(let m=0;m<l;m+=1){let p=d(lo.list,c+m),f=g(e.cells,p);Ir(f,a)&&(u=!0,ot(f)&&(r[s]=Ar(f),t[s]=he(lr,n,p,Ie,on),s+=1))}return Bt(s,u)}i(Nc,"generateBombMoves");function Pc(e,n,t,o,r){let a=o,s=d(le.starts,n),u=d(le.counts,n);for(let c=0;c<u;c+=1){let l=d(le.list,s+c),m=w(e.squares,l);ut(e,l)&&(r[a]=en(m)?(1<<21)+(1<<18):16,t[a]=he(Io,n,l,Ie,on),a+=1)}return a}i(Pc,"generateManaMoves");function Lc(e,n,t,o,r){let a=o;if(w(nn,n)!==1)return a;let s=d(le.starts,n),u=d(le.counts,n);for(let c=0;c<u;c+=1){let l=d(le.list,s+c),m=w(e.squares,l);!en(m)||!ut(e,l)||(r[a]=(1<<21)+(1<<18),t[a]=he(Io,n,l,Ie,on),a+=1)}return a}i(Lc,"generateWinningManaMoves");var Fc=new Int32Array(hn);function Cr(e,n,t=Fc){let o=e.active,r=mn(e.monsMoves),a=Ra(e),s=0,u=0;for(let c=0;c<dn;c+=1){let l=d(e.monLocations,se(c,o));if(l<0)continue;let m=g(e.cells,l);if(G(m)!==H)continue;let p=!1,f=R(m),b=N(m),y=f!==0||b!==0;if(!(!y&&ie(m)!==0)){if(r){let I=wc(e,l,m,n,s,t);s=Lt(I),p||=Ft(I)}if(y){if(b===Ee){let I=Nc(e,l,n,s,t);s=Lt(I),p||=Ft(I)}}else if(w(e.squares,l)<ue&&a){if(c===oo){let S=Oc(e,l,n,s,t);s=Lt(S),p||=Ft(S)}else if(c===wt){let S=xc(e,l,n,s,t);s=Lt(S),p||=Ft(S)}else if(c===to){let S=Rc(e,l,n,s,t);s=Lt(S),p||=Ft(S)}}p&&(u+=1)}}if(_a(e,u)){let c=o+1;for(let l=0;l<e.manaCount;l+=1){let m=d(e.manaIndices,l),p=g(e.cells,m);G(p)===J&&R(p)===c&&(s=Pc(e,m,n,s,t))}}else if(d(e.freeMana,o)!==0&&wn(e.firstTurn,e.manaMoves)&&(o===0?e.whiteScore:e.blackScore)+1>=Ce){let c=o+1;for(let l=0;l<e.manaCount;l+=1){let m=d(e.manaIndices,l),p=g(e.cells,m);G(p)===J&&R(p)===c&&(s=Lc(e,m,n,s,t))}}if(s>n.length)throw new RangeError(`fast move buffer capacity exceeded: generated ${s} moves for ${n.length} slots`);return s}i(Cr,"generateMoves");var rn=48,Oo=rn-2,Nn=yn-rn-1,xo=Object.freeze({lateMoveReduction:!0,lateMoveIndex:3,lateMoveDeepIndex:8,moveCountPruning:!0,moveCountDepth:3,moveCountBase:4,moveCountFactor:5,futilityMargin:900,aspirationDelta:0,aspirationMinDepth:3,winsNextTurnThreat:0}),ri=new WeakMap;function si(e){if(!(Object.isFrozen(e)&&(e.tuning===void 0||Object.isFrozen(e.tuning))))return ai(e);let t=ri.get(e);return t===void 0&&(t=ai(e),ri.set(e,t)),t}i(si,"memoizedSearchLimits");function ai(e){if(typeof e!="object"||e===null||Array.isArray(e))throw new TypeError("fast search limits must be an object");let n=e,t=n.maxDepth;if(!Number.isSafeInteger(t)||t<0||t>Oo)throw new RangeError(`maxDepth must be a safe integer from 0 through ${Oo}`);let o=n.maxNodes;if(!Number.isSafeInteger(o)||o<0)throw new RangeError("maxNodes must be a nonnegative safe integer");let r=n.tuning;return Object.freeze({maxDepth:t,maxNodes:o,tuning:r===void 0?xo:Bc(r)})}i(ai,"normalizeSearchLimits");function Bc(e){if(typeof e!="object"||e===null||Array.isArray(e))throw new TypeError("fast search tuning must be an object");let n=e;return Object.freeze({lateMoveReduction:ii(n,"lateMoveReduction"),lateMoveIndex:kn(n,"lateMoveIndex",hn),lateMoveDeepIndex:kn(n,"lateMoveDeepIndex",hn),moveCountPruning:ii(n,"moveCountPruning"),moveCountDepth:kn(n,"moveCountDepth",Oo),moveCountBase:kn(n,"moveCountBase",hn),moveCountFactor:kn(n,"moveCountFactor",hn),futilityMargin:kn(n,"futilityMargin",Nn),aspirationDelta:kn(n,"aspirationDelta",Nn),aspirationMinDepth:kn(n,"aspirationMinDepth",Oo),winsNextTurnThreat:kn(n,"winsNextTurnThreat",Nn)})}i(Bc,"normalizeSearchTuning");function ii(e,n){let t=e[n];if(typeof t!="boolean")throw new TypeError(`tuning.${n} must be a boolean`);return t}i(ii,"normalizedTuningBoolean");function kn(e,n,t){let o=e[n];if(typeof o!="number")throw new TypeError(`tuning.${n} must be a number`);if(!Number.isSafeInteger(o)||o<0||o>t)throw new RangeError(`tuning.${n} must be a safe integer from 0 through ${t}`);return o}i(kn,"normalizedTuningInteger");var qn=1<<20,Dt=new Int32Array(0);function Vt(e){try{return new Int32Array(e)}catch(n){_e(n)}}i(Vt,"allocateTranspositionPart");var Ro=class{static{i(this,"TranspositionTable")}keyLo=Dt;keyHi=Dt;score=Dt;info=Dt;move=Dt;entries=0;generation=1;mask=0;deactivate(){this.mask=0}prepare(n){if(this.keyLo.length!==0)return this.mask=qn-1,!0;if(n())return!1;let t=Vt(qn);if(n())return!1;let o=Vt(qn);if(n())return!1;let r=Vt(qn);if(n())return!1;let a=Vt(qn);if(n())return!1;let s=Vt(qn);return n()?!1:(this.keyLo=t,this.keyHi=o,this.score=r,this.info=a,this.move=s,this.entries=0,this.generation=1,this.mask=qn-1,!0)}clear(){this.keyLo.fill(0),this.keyHi.fill(0),this.score.fill(0),this.info.fill(0),this.move.fill(0),this.entries=0,this.generation=1}};var Dc=16,Ut=1<<Dc,Vc=Ut-1,Uc=1<<30,ci=0,ui=1,li=2,Wc=3,di=4194303,Gc=2047,Kc=32768,mi=1<<28,fi=1<<24,pi=1<<23,Pn=yn*2,bi=i(()=>!1,"NO_TIMEOUT"),Mi=ge,Si=ee+1,Ii=An+1,Ai=Ne+1,Ci=2,gr=4,jc=Mi*Si*Ii*Ai*Ci*gr*gr;if(po.length!==nr.length||po.length<jc)throw new RangeError("fast scalar hash table is too small for the configured state space");function $c(e,n){if(e===n)return!0;if(e?.length!==n.length)return!1;for(let t=0;t<n.length;t+=1)if(w(e,t)!==w(n,t))return!1;return!0}i($c,"sameSquares");function Er(e,n,t,o,r,a,s,u,c){if(o===0){for(let f=0;f<t;f+=1){let b=d(e,f),y=d(n,f);if(b===r)y+=mi;else if(b===a)y+=fi;else if(b===s)y+=pi;else{let I=d(u,c+Ue(b)*121+we(b));y+=I>8191?8191:I}n[f]=y}return t}let l=Ue(o),m=we(o),p=0;for(let f=0;f<t;f+=1){let b=d(e,f);if(st(b)===tn&&b<o){let I=Ue(b),S=we(b);if(I!==l&&I!==m&&S!==l&&S!==m)continue}let y=d(n,f);if(b===r)y+=mi;else if(b===a)y+=fi;else if(b===s)y+=pi;else{let I=d(u,c+Ue(b)*121+we(b));y+=I>8191?8191:I}p!==f&&(e[p]=b),n[p]=y,p+=1}return p===0?Er(e,n,t,0,r,a,s,u,c):p}i(Er,"orderMoves");var _o=class{static{i(this,"FastSearcher")}#e=[];#n=[];#t=[];#o;#r=new Int32Array(rn*2);#a=new Int32Array(ge*121*121);#y=new Int32Array(rn+1);#s=new Int32Array(Ut);#h=new Int32Array(Ut);#b=new Int32Array(Ut);#d=new Float64Array(Ut);#c=0;#k;#M=0;#S;#m=To;#C=xo;#g=0;#f=0;#E=0;#u=!1;#v=!1;#i=0;#I=bi;constructor(){this.#o=new Ro;for(let n=0;n<=rn;n+=1)this.#e.push(new Co),this.#n.push(new Int32Array(hn)),this.#t.push(new Int32Array(hn))}get root(){return Me(this.#e,0)}get size(){return this.#o.entries}search(n,t,o=Rn){let r=si(n),a=Za(o);if(this.#v=!1,this.#i=0,br(this.root)!==-1)return{move:0,score:0,depth:0,nodes:0,supported:!0};this.#m=Ja(a);let s=r.tuning;this.#C=s,this.#g=s.winsNextTurnThreat;let u=!$c(this.#S,this.root.squares);(a!==this.#k||s.winsNextTurnThreat!==this.#M||u)&&(this.#k=a,this.#M=s.winsNextTurnThreat,this.#S=this.root.squares,this.#c>=Uc&&(this.#c=0,this.#b.fill(0)),this.#c+=1),this.#f=0,this.#E=r.maxNodes,this.#u=!1,this.#I=t,this.#o.deactivate();try{this.#r.fill(0),this.#a.fill(0);let c=0,l=0,m=0;for(let p=1;p<=r.maxDepth;p+=1){if(p===2){if(this.#f>=this.#E||!this.#o.prepare(this.#I)){this.#u=!0;break}this.#N()}let f=-Pn,b=Pn;s.aspirationDelta>0&&m>0&&p>=s.aspirationMinDepth&&(f=l-s.aspirationDelta,b=l+s.aspirationDelta);let y=this.#w(p,c,f,b),I=0;for(;!this.#l()&&y.move!==0&&(y.score<=f||y.score>=b)&&(f>-Pn||b<Pn);){I+=1;let S=s.aspirationDelta*(1<<I);y.score<=f&&(f=I>=2?-Pn:y.score-S),y.score>=b&&(b=I>=2?Pn:y.score+S),y=this.#w(p,y.move,f,b)}if(y.move===0)break;if(this.#l()){m===0&&(c=y.move,l=y.score);break}if(c=y.move,l=y.score,m=p,!y.selective&&l>=yn-rn)break}return{move:c,score:l,depth:m,nodes:this.#f,supported:!this.#v}}finally{this.#o.deactivate(),this.#m=To,this.#C=xo,this.#g=0,this.#I=bi}}#N(){this.#o.generation+=1,this.#o.generation>di&&this.#o.clear()}#w(n,t,o,r){let a=Me(this.#e,0),s=Me(this.#n,0),u=Cr(a,s,Me(this.#t,0));if(u===0)return{move:0,score:0,selective:!1};Er(s,Me(this.#t,0),u,0,t,d(this.#r,0),d(this.#r,1),this.#a,a.active*121*121);let c=Me(this.#t,0),l=o,m=0,p=-Pn,f=!1;for(let b=0;b<u;b+=1){this.#_(s,c,b,u);let y=d(s,b),I=this.#O(a,y,0),S,P=this.#i,x;if(b===0?(S=this.#p(a,I,0,n-1,l,r),x=this.#i!==P):(S=this.#p(a,I,0,n-1,l,l+1),x=this.#i!==P,S>l&&!this.#l()&&(P=this.#i,S=this.#p(a,I,0,n-1,l,r),x=this.#i!==P)),this.#l()||(S>p&&(p=S,m=y,f=x,S>l&&(l=S)),l>=r))break}return m===0&&(m=d(s,0),p=0,f=!0),{move:m,score:p,selective:f}}#O(n,t,o){let r=Me(this.#e,o+1);r.copyFrom(n),this.#y[o]=t;let a=Na(r,t);return a===Ao&&(this.#v=!0,this.#u=!0),a}#p(n,t,o,r,a,s){let u=Me(this.#e,o+1);return t===Ao?0:t!==-1?t===n.active?yn-o:-(yn-o):u.active===n.active?this.#x(r,o+1,a,s):-this.#x(r,o+1,-s,-a)}#x(n,t,o,r){if(!this.#T())return 0;let a=Me(this.#e,t);if(t>=rn-2)return this.#A(a);if(n<=0)return this.#A(a);let s=o,u=this.#P(a,t),c=yi(a),l=hi(a,c,u),m=ki(a,c,u),p=this.#o,f=(l^m*3)&p.mask,b=0,y=d(p.info,f),I=d(p.keyLo,f)===l&&d(p.keyHi,f)===m&&(y>>>8&di)===p.generation;if(I&&(b=d(p.move,f),(y>>2&63)>=n)){let je=d(p.score,f),$e=y&3;if($e===ci||$e===ui&&je>=r||$e===li&&je<=s)return je}let S=this.#C,P=Me(this.#n,t),x=Cr(a,P,Me(this.#t,t));if(x===0)return this.#A(a,l,m);let F=Me(this.#t,t);x=Er(P,F,x,u,b,d(this.#r,t*2),d(this.#r,t*2+1),this.#a,a.active*121*121);let D=x;if(S.moveCountPruning&&n<=S.moveCountDepth){let me=S.moveCountBase+S.moveCountFactor*n;me<D&&(D=me)}let L=n<=2;if(L&&!this.#T()||this.#l())return 0;let V=!1,U=!1,de=-Pn,Ke=0,Oe=this.#i;for(let me=0;me<x;me+=1){this.#_(P,F,me,x);let je=d(P,me),$e=d(F,me)>=Kc;if(!$e&&Ke!==0){let ne=me>=D;if(!ne&&L&&(V||(U=this.#R(a,l,m)+S.futilityMargin*n<=o,V=!0),ne=U),ne){this.#i+=1;break}}let C=this.#O(a,je,t),v;if(me===0)v=this.#p(a,C,t,n-1,s,r);else{let ne=0;S.lateMoveReduction&&!$e&&n>=3&&me>=S.lateMoveIndex&&(ne=me>=S.lateMoveDeepIndex?2:1,ne>=n&&(ne=n-1)),v=this.#p(a,C,t,n-1-ne,s,s+1),!this.#l()&&v>s&&(ne>0||v<r)&&(v=this.#p(a,C,t,n-1,s,r))}if(this.#l())return 0;if(v>de&&(de=v,Ke=je),v>s&&(s=v),s>=r){this.#L(a,je,t,n,$e);break}}if(Ke===0)return this.#A(a);let cn=this.#i!==Oe?Wc:de>=r?ui:de<=o?li:ci,Pe=de,Fn=n;if(Pe<yn-rn&&Pe>-yn+rn){let me=y>>2&63;(!I||Fn>=me)&&(y===0&&d(p.info,f)===0&&(p.entries+=1),p.keyLo[f]=l,p.keyHi[f]=m,p.score[f]=Pe,p.info[f]=p.generation<<8|Fn<<2|cn,p.move[f]=Ke)}return de}#P(n,t){if(t===0)return 0;let o=d(this.#y,t-1);return st(o)===tn&&Me(this.#e,t-1).active===n.active?o:0}#l(){return this.#u}#T(){return this.#u?!1:this.#f>=this.#E?(this.#u=!0,!1):(this.#f+=1,(this.#f&Gc)===0&&this.#I()?(this.#u=!0,!1):!0)}#R(n,t,o){let r=t,a=o;if(r===void 0||a===void 0){let l=yi(n);r=hi(n,l),a=ki(n,l)}let s=(r^a*3)&Vc,u;d(this.#b,s)===this.#c&&d(this.#s,s)===r&&d(this.#h,s)===a?u=this.#d[s]??0:(u=oi(n,this.#m,this.#g),this.#s[s]=r,this.#h[s]=a,this.#d[s]=u,this.#b[s]=this.#c);let c=n.active===0?u:-u;return c>Nn?Nn:c<-Nn?-Nn:c}#A(n,t,o){return this.#T()?this.#R(n,t,o):0}#L(n,t,o,r,a){if(a)return;let s=o*2;d(this.#r,s)!==t&&(this.#r[s+1]=d(this.#r,s),this.#r[s]=t);let u=n.active*121*121+Ue(t)*121+we(t),c=d(this.#a,u)+r*r;this.#a[u]=c>1<<20?1<<20:c}#_(n,t,o,r){let a=o,s=d(t,o);for(let c=o+1;c<r;c+=1){let l=d(t,c);l>s&&(s=l,a=c)}if(a===o)return;let u=d(n,o);n[o]=d(n,a),n[a]=u,t[a]=d(t,o),t[o]=s}};function yi(e){let n=d(e.potions,0),t=d(e.potions,1),o=n>2?3:n,a=t>2?3:t;return a=o+gr*a,a=(e.firstTurn?1:0)+Ci*a,a=e.actionsUsed+Ai*a,a=e.manaMoves+Ii*a,a=e.monsMoves+Si*a,e.active+Mi*a}i(yi,"scalarIndex");function hi(e,n,t=0){return e.hashLo^d(po,n)^e.whiteScore*2654435761^e.blackScore*2135587861^d(e.potions,0)^Math.imul(t,668265261)}i(hi,"stateKeyLo");function ki(e,n,t=0){return e.hashHi^d(nr,n)^e.whiteScore*2246822507^e.blackScore*3266489909^d(e.potions,1)^Math.imul(t,374761393)}i(ki,"stateKeyHi");var qc=Object.freeze({lateMoveReduction:!0,lateMoveIndex:2,lateMoveDeepIndex:6,moveCountPruning:!0,moveCountDepth:3,moveCountBase:7,moveCountFactor:7,futilityMargin:900,aspirationDelta:600,aspirationMinDepth:2,winsNextTurnThreat:0}),Hc=Object.freeze({lateMoveReduction:!0,lateMoveIndex:2,lateMoveDeepIndex:6,moveCountPruning:!0,moveCountDepth:3,moveCountBase:7,moveCountFactor:7,futilityMargin:900,aspirationDelta:600,aspirationMinDepth:2,winsNextTurnThreat:2500}),zc=Object.freeze({lateMoveReduction:!0,lateMoveIndex:3,lateMoveDeepIndex:8,moveCountPruning:!0,moveCountDepth:3,moveCountBase:4,moveCountFactor:5,futilityMargin:900,aspirationDelta:0,aspirationMinDepth:3,winsNextTurnThreat:0}),Xc=Object.freeze({fast:Object.freeze({budgetMs:50,limits:Object.freeze({maxDepth:40,maxNodes:38400,tuning:Hc})}),normal:Object.freeze({budgetMs:150,limits:Object.freeze({maxDepth:40,maxNodes:184e3,tuning:qc})}),pro:Object.freeze({budgetMs:650,limits:Object.freeze({maxDepth:40,maxNodes:2e6,tuning:zc})})});function Qc(){return globalThis.performance.now()}i(Qc,"systemClock");function gi(e){let n=e();if(!Number.isFinite(n))throw new RangeError("automove clock must return a finite number");return n}i(gi,"readClock");function Yc(){return globalThis.WeakRef}i(Yc,"weakRefConstructor");var vr=class{static{i(this,"FastSearcherPool")}#e;run(n){let t=Yc(),o=t===void 0?void 0:this.#e?.deref();if(o===void 0)try{o=new _o}catch(r){if(r instanceof RangeError)return It;throw r}this.#e=void 0;try{return n(o)}catch(r){if(At(r))return It;throw r}finally{t!==void 0&&(this.#e??=new t(o))}}},Zc=new vr;function Tr(e,n,t=Qc){let o=Xc[n],r=gi(t)+o.budgetMs,a=!1,s=i(()=>a?!0:(a=gi(t)>=r,a),"deadlineReached");if(e.winnerColor()!==void 0||s())return{kind:"fallback"};let u;try{u=new Co}catch(l){if(l instanceof RangeError)return{kind:"fallback"};throw l}if(!Ba(u,e,o.limits.maxDepth)||s())return{kind:"fallback"};let c=Zc.run(l=>{if(!s()&&(l.root.copyFrom(u),!s()))return l.search(o.limits,s,Rn)});return c===void 0||At(c)||!c.supported||c.move===0?{kind:"fallback"}:{kind:"selected",inputs:Da(c.move)}}i(Tr,"selectPackedInputs");function Ei(e){switch(e.kind){case"takeback":return 0;case"location":return 1;case"modifier":return 2}}i(Ei,"inputTag");function Jc(e,n){let t=Ei(e)-Ei(n);return t!==0?t:e.kind==="location"&&n.kind==="location"?e.location.i-n.location.i||e.location.j-n.location.j:e.kind==="modifier"&&n.kind==="modifier"?qo[e.modifier]-qo[n.modifier]:0}i(Jc,"compareInputs");function eu(e){switch(e.kind){case"invalid-input":case"events":return;case"locations-to-start-from":return e.locations.map(n=>({kind:"location",location:n}));case"next-input-options":return e.nextInputs.map(({input:n})=>n)}}i(eu,"nextInputs");function wr(e,n){let t=e.fork().processInput(n,!1,!1);return t.kind==="events"?t:void 0}i(wr,"applyInputs");function vi(e){let n=e.fork(),t=[],o=i(()=>{let r=t.length===0?n.processInputWithStartOptions(t,!0,!1,Zo):n.inspectInputGrammar(t,Zo);if(r.kind==="invalid-input")return!1;if(r.kind==="events")return t.length>0&&wr(n,t)!==void 0;if(t.length===Qn)return!1;let a=eu(r)?.sort(Jc);if(a===void 0||a.length===0)return!1;for(let s of a){if(t.push(s),o())return!0;t.pop()}return!1},"findCompletion");return o()?t:[]}i(vi,"deterministicLegalFallbackInputs");function Ti(e,n,t){let o=e.fen(),r=t===void 0?Tr(e,n):Tr(e,n,t),a=r.kind==="selected"?r.inputs:vi(e),s=wr(e,a);if(s===void 0&&r.kind==="selected"&&(a=vi(e),s=wr(e,a)),e.fen()!==o)throw new Error("automove suggestion mutated its source game");return s===void 0?{output:{kind:"invalid-input"},inputFen:""}:{output:s,inputFen:et(a)}}i(Ti,"suggestMove");function Wt(e){return e===h.White?"w":"b"}i(Wt,"colorFen");function Ge(e){if(!Number.isInteger(e.cooldown)||e.cooldown<0||e.cooldown>2)throw new RangeError("mon cooldown must be an integer from 0 through 2");let n=(()=>{switch(e.kind){case M.Demon:return"e";case M.Drainer:return"d";case M.Angel:return"a";case M.Spirit:return"s";case M.Mystic:return"y"}})();return`${e.color===h.White?n.toUpperCase():n}${e.cooldown}`}i(Ge,"monFen");function nu(e,n){let t,o;switch(e.charCodeAt(n)){case 69:t=h.White,o=M.Demon;break;case 101:t=h.Black,o=M.Demon;break;case 68:t=h.White,o=M.Drainer;break;case 100:t=h.Black,o=M.Drainer;break;case 65:t=h.White,o=M.Angel;break;case 97:t=h.Black,o=M.Angel;break;case 83:t=h.White,o=M.Spirit;break;case 115:t=h.Black,o=M.Spirit;break;case 89:t=h.White,o=M.Mystic;break;case 121:t=h.Black,o=M.Mystic;break;default:return}let r=e.charCodeAt(n+1);return r<48||r>50?void 0:Vn(o,t,r-48)}i(nu,"parseMonFenAt");function Hn(e){return e.kind==="supermana"?"U":e.color===h.White?"M":"m"}i(Hn,"manaFen");function wi(e){switch(e){case 77:return Yn(h.White);case 109:return Yn(h.Black);case 85:return Mn;default:return}}i(wi,"parseManaCode");function Oi(e){switch(e){case A.Potion:return"P";case A.Bomb:return"B";case A.BombOrPotion:return"Q"}}i(Oi,"consumableFen");function xi(e){switch(e){case 80:return A.Potion;case 66:return A.Bomb;case 81:return A.BombOrPotion;default:return}}i(xi,"parseConsumableCode");function dt(e){switch(e.kind){case"mon":return`${Ge(e.mon)}x`;case"mana":return`xx${Hn(e.mana)}`;case"mon-with-mana":return`${Ge(e.mon)}${Hn(e.mana)}`;case"mon-with-consumable":return`${Ge(e.mon)}${Oi(e.consumable)}`;case"consumable":return`xx${Oi(e.consumable)}`}}i(dt,"itemFen");function Ri(e,n){let t=e.charCodeAt(n),o=e.charCodeAt(n+2);if(t===120){if(e.charCodeAt(n+1)!==120)return;let u=wi(o);if(u!==void 0)return Ze(u);let c=xi(o);return c===void 0?void 0:bt(c)}let r=nu(e,n);if(r===void 0)return;let a=wi(o);if(a!==void 0)return Zn(r,a);let s=xi(o);return s!==void 0?pt(r,s):o===120?Fe(r):void 0}i(Ri,"parseItemFenAt");function tu(e){switch(e.kind){case"mon-move":return`mm ${dt(e.item)} ${B(e.from)} ${B(e.to)}`;case"mana-move":return`mma ${Hn(e.mana)} ${B(e.from)} ${B(e.to)}`;case"mana-scored":return`ms ${Hn(e.mana)} ${B(e.at)}`;case"mystic-action":return`ma ${Ge(e.mystic)} ${B(e.from)} ${B(e.to)}`;case"demon-action":return`da ${Ge(e.demon)} ${B(e.from)} ${B(e.to)}`;case"demon-additional-step":return`das ${Ge(e.demon)} ${B(e.from)} ${B(e.to)}`;case"spirit-target-move":return`stm ${dt(e.item)} ${B(e.from)} ${B(e.to)} ${B(e.by)}`;case"pickup-bomb":return`pb ${Ge(e.by)} ${B(e.at)}`;case"pickup-potion":return`pp ${dt(e.by)} ${B(e.at)}`;case"use-potion":return`up ${B(e.from)} ${B(e.to)}`;case"pickup-mana":return`pm ${Hn(e.mana)} ${Ge(e.by)} ${B(e.at)}`;case"mon-fainted":return`mf ${Ge(e.mon)} ${B(e.from)} ${B(e.to)}`;case"mana-dropped":return`md ${Hn(e.mana)} ${B(e.at)}`;case"supermana-back-to-base":return`sb ${B(e.from)} ${B(e.to)}`;case"bomb-attack":return`ba ${Ge(e.by)} ${B(e.from)} ${B(e.to)}`;case"mon-awake":return`maw ${Ge(e.mon)} ${B(e.at)}`;case"bomb-explosion":return`be ${B(e.at)}`;case"next-turn":return`nt ${Wt(e.color)}`;case"game-over":return`go ${Wt(e.winner)}`;case"takeback":return"z"}}i(tu,"eventFen");function _i(e){return e.map(tu).join(" ")}i(_i,"eventArrayFen");function Ni(e){return e===void 0?void 0:{i:e.i,j:e.j}}i(Ni,"detachedLocation");function Or(e){let n=new Array(e.length);for(let t=0;t<e.length;t+=1){let o=e[t];o!==void 0&&(n[t]={i:o.i,j:o.j})}return n}i(Or,"detachedLocations");function zn(e){let n=e;return n===h.White?0:n===h.Black?1:void 0}i(zn,"boardColorIndex");var mt=class{constructor(n=ln,t,o,r=!1){this.variant=n;if(o!==void 0){this.storage=o;return}let a=t??da(n);if(a.length!==121)throw new RangeError(`board requires exactly ${121} item slots`);this.storage={itemSlots:t===void 0||r?[...a]:a.map(s=>s===void 0?void 0:Dn(s)),occupiedEntries:void 0,categoryDerived:void 0}}variant;static{i(this,"Board")}storage;get items(){return[...this.storage.itemSlots]}static fromItems(n,t){return new Ln(t,n)}fork(){let n=new Ln(this.variant,this.storage.itemSlots,void 0,!0);return n.storage.occupiedEntries=this.storage.occupiedEntries,n.storage.categoryDerived=this.storage.categoryDerived,n}get(n){if(un(n))return this.storage.itemSlots[re(n)]}itemAtIndex(n){return this.storage.itemSlots[n]}squareAt(n){return Wn(n),er(n,this.variant)}allMonsBases(){return gt}supermanaBase(){return Ct}allMonsLocations(n){let t=zn(n);return t===void 0?[]:Or(this.getCategoryDerived().monsLocations[t])}allFreeRegularManaLocations(n){let t=zn(n);return t===void 0?[]:Or(this.getCategoryDerived().freeRegularManaLocations[t])}base(n){return ma(n.kind,n.color)}faintedMonsLocations(n){let t=zn(n);return t===void 0?[]:Or(this.getCategoryDerived().faintedMonsLocations[t])}findMana(n){let t=zn(n);if(t!==void 0)return Ni(this.getCategoryDerived().freeRegularManaLocations[t][0])}findAwakeAngel(n){let t=zn(n);if(t!==void 0)return Ni(this.getCategoryDerived().awakeAngelLocations[t])}itemsEqual(n){for(let t=0;t<121;t+=1){let o=this.storage.itemSlots[t],r=n.storage.itemSlots[t];if(o===void 0||r===void 0){if(o!==r)return!1}else if(!Hr(o,r))return!1}return!0}getOccupiedEntries(){if(this.storage.occupiedEntries!==void 0)return this.storage.occupiedEntries;let n=[];for(let t=0;t<121;t+=1){let o=this.storage.itemSlots[t],r=Yo[t];o!==void 0&&r!==void 0&&n.push([r,o])}return this.storage.occupiedEntries=n,n}getCategoryDerived(){if(this.storage.categoryDerived!==void 0)return this.storage.categoryDerived;let n=[],t=[],o=[],r=[],a=[],s=[],u,c;for(let m=0;m<121;m+=1){let p=this.storage.itemSlots[m];if(p!==void 0){let f=Yo[m];if(f!==void 0){let b=$(p);if(b!==void 0){let y=zn(b.color);if(y===void 0)continue;(y===0?n:t).push(f),p.kind==="mon"&&Ae(b)?(y===0?a:s).push(f):b.kind===M.Angel&&!Ae(b)&&(y===0&&u===void 0?u=f:y===1&&c===void 0&&(c=f))}else if(p.kind==="mana"&&p.mana.kind==="regular"){let y=zn(p.mana.color);y!==void 0&&(y===0?o:r).push(f)}}}}let l={monsLocations:[n,t],freeRegularManaLocations:[o,r],faintedMonsLocations:[a,s],awakeAngelLocations:[u,c]};return this.storage.categoryDerived=l,l}entries(){return this.getOccupiedEntries().values()}},Ln=class extends mt{static{i(this,"MutableBoard")}#e;delete(n){Wn(n),this.storage.itemSlots[re(n)]=void 0,this.storage.occupiedEntries=void 0,this.storage.categoryDerived=void 0}set(n,t){Wn(n),this.storage.itemSlots[re(n)]=Dn(t),this.storage.occupiedEntries=void 0,this.storage.categoryDerived=void 0}readonlyView(){return this.#e??=new mt(this.variant,void 0,this.storage),this.#e}};var Pi=Ce+1,ou=Object.freeze(["","n01","n02","n03","n04","n05","n06","n07","n08","n09","n10","n11"]);function ru(e){let n="",t=0;for(let o=0;o<11;o+=1){o>0&&(n+="/");let r=t+11,a=0;for(;t<r;){let s=e.itemAtIndex(t);if(t+=1,s===void 0){a+=1;continue}a>0&&(n+=Li(a),a=0),n+=dt(s)}a>0&&(n+=Li(a))}return n}i(ru,"boardFen");function au(e,n,t,o){let r=new Array(121).fill(void 0),a=n;for(let s=0;s<11;s+=1){let u=0,c=!1;for(;a<t&&e.charCodeAt(a)!==47;){if(e.charCodeAt(a)===110){if(c||a+2>=t)return;let m=e.charCodeAt(a+1)-48,p=e.charCodeAt(a+2)-48;if(m<0||m>9||p<0||p>9)return;let f=m*10+p;if(f<1||u+f>11)return;u+=f,a+=3,c=!0;continue}if(a+2>=t||u>=11)return;let l=Ri(e,a);if(l===void 0)return;r[s*11+u]=l,u+=1,a+=3,c=!1}if(u!==11)return;if(s<10){if(e.charCodeAt(a)!==47)return;a+=1}}if(a===t)return new Ln(o,r,void 0,!0)}i(au,"parseBoardFenRange");function Fi(e){let n=`${e.whiteScore} ${e.blackScore} ${Wt(e.activeColor)} ${e.actionsUsedCount} ${e.manaMovesCount} ${e.monsMovesCount} ${e.whitePotionsCount} ${e.blackPotionsCount} ${e.turnNumber} ${ru(e.board)}`,t=e.board.variant;return t===ln?n:`${n} ${ca(t)}`}i(Fi,"gameFen");function Bi(e){let n=0,t=i(P=>{let x=n,F=0,D=!1;for(;n<e.length;){let L=e.charCodeAt(n);if(L===32)break;if(L<48||L>57)return-1;if(n===x)D=L===48;else if(D)return-1;if(F=F*10+(L-48),!Number.isSafeInteger(F))return-1;n+=1}if(n===x)return-1;if(P){if(n>=e.length)return-1;n+=1}else if(n!==e.length)return-1;return F},"readInteger"),o=t(!0),r=t(!0),a=e.charCodeAt(n),s=a===119?h.White:a===98?h.Black:void 0;if(s===void 0||e.charCodeAt(n+1)!==32)return;n+=2;let u=t(!0),c=t(!0),l=t(!0),m=t(!0),p=t(!0),f=t(!0);if(o<0||r<0||u<0||c<0||l<0||m<0||p<0||f<0||o>Pi||r>Pi||u>Ne||c>An||l>ee||f<1)return;let b=n;for(;n<e.length&&e.charCodeAt(n)!==32;)n+=1;let y=n,I=ln;if(n<e.length){n+=1;let P=t(!1),x=la(P);if(x===void 0||x===ln)return;I=x}let S=au(e,b,y,I);if(S!==void 0)return{board:S,whiteScore:o,blackScore:r,activeColor:s,actionsUsedCount:u,manaMovesCount:c,monsMovesCount:l,whitePotionsCount:m,blackPotionsCount:p,turnNumber:f}}i(Bi,"parseGameFen");function Li(e){return ou[e]??""}i(Li,"emptyRunFen");function Di(e){return{whiteScore:e.whiteScore,blackScore:e.blackScore,activeColor:e.activeColor,actionsUsedCount:e.actionsUsedCount,manaMovesCount:e.manaMovesCount,monsMovesCount:e.monsMovesCount,whitePotionsCount:e.whitePotionsCount,blackPotionsCount:e.blackPotionsCount}}i(Di,"copyRulesCounters");function No(e,n,t,o){let r=e[n]+t;return o&&!Number.isSafeInteger(r)?!1:(e[n]=r,!0)}i(No,"addCounter");function xr(e,n,t,o){if(e.actionsUsedCount<Ne)return e.actionsUsedCount+=1,{valid:!0};let r=e.activeColor===h.White?"whitePotionsCount":"blackPotionsCount";return o&&e[r]<=0?{valid:!1}:(e[r]-=1,{valid:!0,potionUse:{from:n,to:t}})}i(xr,"consumeAction");function Rr(e,n,t,o){switch(n.kind){case"mon-move":return{valid:No(e,"monsMovesCount",1,o)};case"mana-move":return{valid:No(e,"manaMovesCount",1,o)};case"mana-scored":{let r=e.activeColor===h.White?"whiteScore":"blackScore";return{valid:No(e,r,$r(n.mana,e.activeColor),o)}}case"mystic-action":return xr(e,n.from,n.to,o);case"demon-action":{let a=t.find(s=>s.kind==="demon-additional-step")?.to??n.to;return xr(e,a,a,o)}case"spirit-target-move":return xr(e,n.by,n.to,o);case"pickup-potion":{let r=$(n.by);if(r===void 0)return{valid:!0};let a=r.color===h.White?"whitePotionsCount":"blackPotionsCount";return{valid:No(e,a,1,o)}}case"demon-additional-step":case"pickup-bomb":case"use-potion":case"pickup-mana":case"mon-fainted":case"mana-dropped":case"supermana-back-to-base":case"bomb-attack":case"mon-awake":case"bomb-explosion":case"next-turn":case"game-over":case"takeback":return{valid:!0}}}i(Rr,"projectEventCounters");function _r(e,n){let t=Di(e);for(let r of n)if(!Rr(t,r,n,!0).valid)return!1;if(e.turnNumber<Number.MAX_SAFE_INTEGER)return!0;let o={...e,board:e.board.fork(),turnNumber:Number.MAX_SAFE_INTEGER-1};return!Po(o,n).turnAdvanced}i(_r,"canApplyRulesEvents");function iu(e,n,t,o){let r=Rr(e,n,t,!1);switch(r.valid&&r.potionUse!==void 0&&o.push({kind:"use-potion",...r.potionUse}),n.kind){case"mon-move":e.board.delete(n.from),e.board.set(n.to,n.item);break;case"mana-move":e.board.delete(n.from),e.board.set(n.to,Ze(n.mana));break;case"mana-scored":{let a=e.board.get(n.at);if(a!==void 0){let s=$(a);s===void 0?e.board.delete(n.at):e.board.set(n.at,Fe(s))}break}case"mystic-action":e.board.delete(n.to);break;case"demon-action":{e.board.delete(n.from),t.find(s=>s.kind==="demon-additional-step")?.to===void 0?e.board.set(n.to,Fe(n.demon)):e.board.delete(n.to);break}case"demon-additional-step":e.board.set(n.to,Fe(n.demon));break;case"spirit-target-move":e.board.delete(n.from),e.board.set(n.to,n.item);break;case"pickup-bomb":e.board.set(n.at,pt(n.by,A.Bomb));break;case"pickup-potion":{if($(n.by)===void 0)break;e.board.set(n.at,n.by);break}case"pickup-mana":e.board.set(n.at,Zn(n.by,n.mana));break;case"mon-fainted":e.board.set(n.to,Fe(Kr(n.mon)));break;case"mana-dropped":e.board.set(n.at,Ze(n.mana));break;case"supermana-back-to-base":{let a=e.board.get(n.to);e.board.set(n.to,a?.kind==="mon"?Zn(a.mon,Mn):Ze(Mn));break}case"bomb-attack":e.board.delete(n.to),e.board.set(n.from,Fe(n.by));break;case"bomb-explosion":{let a=e.board.get(n.at),s=a===void 0?void 0:$(a);(s===void 0||!Ae(s)||!kt(e.board.base(s),n.at))&&e.board.delete(n.at);break}case"mon-awake":case"game-over":case"next-turn":case"takeback":case"use-potion":break}}i(iu,"applyEvent");function su(e,n){e.activeColor=Sn(e.activeColor),e.turnNumber+=1,e.actionsUsedCount=0,e.manaMovesCount=0,e.monsMovesCount=0,n.push({kind:"next-turn",color:e.activeColor});for(let t of e.board.faintedMonsLocations(e.activeColor)){let o=e.board.get(t),r=o===void 0?void 0:$(o);if(r===void 0)continue;let a=jr(r);Ae(a)||n.push({kind:"mon-awake",mon:a,at:t}),e.board.set(t,Fe(a))}}i(su,"advanceTurn");function Po(e,n){let t=[];for(let a of n)iu(e,a,n,t);let o=ho(e),r=!1;return o!==void 0?t.push({kind:"game-over",winner:o}):Ta(e)&&(su(e,t),r=!0),{events:[...n,...t],turnAdvanced:r,winner:o}}i(Po,"applyRulesEvents");var Gt=Symbol("cache-miss"),Wi=Symbol("cached-undefined"),Lo=Object.freeze({completionViability:16384,secondInputOptions:4096,secondStage:8192,thirdStage:8192});function cu(e){return e===void 0?void 0:[e[0].map(Un),e[1].map(Jn)]}i(cu,"copyStageResult");function Vi(e){return e===void 0?Wi:[e[0].map(Un),e[1].map(Jn)]}i(Vi,"storeStageResult");function Ui(e){return e===Wi?void 0:cu(e)}i(Ui,"copyStoredStageResult");function Fo(e,n,t,o){e.size>=o&&!e.has(n)&&e.clear(),e.set(n,t)}i(Fo,"setBounded");var Bo=class{static{i(this,"RulesQueryCache")}#e;#n;#t;#o;#r;invalidate(){this.#e=void 0,this.#n=void 0,this.#t=void 0,this.#o=void 0,this.#r=void 0}getStartSuggestion(n){let t=this.#e?.[n];return t===void 0?void 0:zo(t)}setStartSuggestion(n,t){(this.#e??=new Array(4))[n]=zo(t)}getCompletionViability(n){return this.#n?.get(n)}setCompletionViability(n,t){Fo(this.#n??=new Map,n,t,Lo.completionViability)}getSecondInputOptions(n){let t=this.#t?.get(n);return t===void 0?void 0:t.map(Jn)}setSecondInputOptions(n,t){Fo(this.#t??=new Map,n,t.map(Jn),Lo.secondInputOptions)}lookupSecondStage(n){let t=this.#o?.get(n);return t===void 0?Gt:Ui(t)}setSecondStage(n,t){Fo(this.#o??=new Map,n,Vi(t),Lo.secondStage)}lookupThirdStage(n){let t=this.#r?.get(n);return t===void 0?Gt:Ui(t)}setThirdStage(n,t){Fo(this.#r??=new Map,n,Vi(t),Lo.thirdStage)}};function Kt(e){return e.map(n=>({fen:n.fen,color:n.color,events:n.events.map(Un)}))}i(Kt,"copyTrackingEntries");var Do=class e{static{i(this,"GameHistory")}#e=[];#n=[];#t=!0;#o;#r=!0;constructor(n=!1){this.#o=n}get takebackFens(){return[...this.#e]}get trackingEntries(){return Kt(this.#n)}get movesVerified(){return this.#t}get verboseTrackingEnabled(){return this.#o}get eventApplicationTrackingEnabled(){return this.#r||this.#o}copy(){let n=new e(this.#o);return n.#e=[...this.#e],n.#n=Kt(this.#n),n.#t=this.#t,n.#r=this.#r,n}fork(){let n=new e(!1);return n.#t=this.#t,n.#r=!1,n}resetForLoadedFen(){this.#a()}resetForBoardReplacement(){this.#a()}#a(){this.#e=[],this.#n=[],this.#t=!1}replace(n){n.takebackFens!==void 0&&(this.#e=[...n.takebackFens]),n.trackingEntries!==void 0&&(this.#n=Kt(n.trackingEntries)),n.movesVerified!==void 0&&(this.#t=n.movesVerified),n.verboseTrackingEnabled!==void 0&&(this.#o=n.verboseTrackingEnabled,n.verboseTrackingEnabled||(this.#n=[]))}setTakebackTracking(n){this.#r=n,n||(this.#e=[])}setVerboseTracking(n){this.#o=n,n||(this.#n=[])}canTakeback(n,t){return this.#r&&this.#e.length>1&&n===t}prepareTakeback(n,t){if(!this.canTakeback(n,t))return;let o=this.#e[this.#e.length-2];if(o!==void 0)return{previousFen:o,takebackFens:this.#e.slice(0,-1),trackingEntries:Kt(this.#n.slice(0,-1))}}commitTakeback(n){this.#e=[...n.takebackFens],this.#n=Kt(n.trackingEntries)}beginEventApplication(n,t){if(!this.#r||this.#e.length!==0)return;let o=n();this.#e.push(o),this.#o&&this.#n.length===0&&this.#n.push({fen:o,color:t,events:[]})}completeEventApplication(n){let t,o=i(()=>t??=n.snapshotFen(),"snapshotFen");this.#r&&(n.winner!==void 0?this.#e=[]:n.turnAdvanced?this.#e=[o()]:this.#e.push(o())),this.#o&&this.#n.push({fen:o(),color:n.color,events:n.events.map(Un)})}};function Gi(e,n,t,o){let r=e.board.squareAt(n),a=[];switch(t.kind){case"mon":{let s=t.mon;if(s.color!==e.activeColor||Ae(s))break;if(e.playerCanMoveMon()&&a.push(...e.nextInputsFromLocations(Be(n),O.MonMove,o,u=>{let c=e.board.get(u),l=e.board.squareAt(u),m;switch(c?.kind){case"mon":case"mon-with-mana":case"mon-with-consumable":m=!1;break;case"mana":m=s.kind===M.Drainer;break;case"consumable":case void 0:m=!0;break}if(!m)return!1;switch(l.kind){case"regular":case"consumable-base":case"mana-base":case"mana-pool":return!0;case"supermana-base":return s.kind===M.Drainer&&(c===void 0||c.kind==="mana"&&c.mana.kind==="supermana");case"mon-base":return l.monKind===s.kind&&l.color===s.color}})),r.kind!=="mon-base"&&e.playerCanUseAction())switch(s.kind){case M.Angel:case M.Drainer:break;case M.Mystic:{let u=e.board.findAwakeAngel(Sn(e.activeColor));a.push(...e.nextInputsFromLocations(Zt(n),O.MysticAction,o,c=>{let l=e.board.get(c);if(l===void 0||Jo(u,c))return!1;let m=$(l);return m!==void 0&&s.color!==m.color&&!Ae(m)}));break}case M.Demon:{let u=e.board.findAwakeAngel(Sn(e.activeColor));a.push(...e.nextInputsFromLocations(Jt(n),O.DemonAction,o,c=>{let l=e.board.get(c),m=Zr(n,c),p=e.board.squareAt(m);if(l===void 0||Jo(u,c)||e.board.get(m)!==void 0||p.kind==="supermana-base"||p.kind==="mon-base")return!1;let f=$(l);return f!==void 0&&s.color!==f.color&&!Ae(f)}));break}case M.Spirit:a.push(...e.nextInputsFromLocations(eo(n),O.SpiritTargetCapture,o,u=>{let c=e.board.get(u);return c===void 0?!1:qr(c)}));break}break}case"mana":t.mana.kind==="regular"&&t.mana.color===e.activeColor&&e.playerCanMoveMana()&&a.push(...e.nextInputsFromLocations(Be(n),O.ManaMove,o,s=>ar(e.board,s)));break;case"mon-with-mana":t.mon.color===e.activeColor&&e.playerCanMoveMon()&&a.push(...e.nextInputsFromLocations(Be(n),O.MonMove,o,s=>{let u=e.board.get(s),c=e.board.squareAt(s);switch(u?.kind){case"mon":case"mon-with-mana":case"mon-with-consumable":return!1;case"mana":case"consumable":return!0;case void 0:return Kn(c)?!0:c.kind==="supermana-base"&&t.mana.kind==="supermana"}}));break;case"mon-with-consumable":{let s=t.mon;if(s.color!==e.activeColor)break;e.playerCanMoveMon()&&a.push(...e.nextInputsFromLocations(Be(n),O.MonMove,o,u=>{let c=e.board.get(u),l=e.board.squareAt(u);switch(c?.kind){case"mon":case"mana":case"mon-with-mana":case"mon-with-consumable":return!1;case"consumable":return!0;case void 0:return Kn(l)}})),t.consumable===A.Bomb&&a.push(...e.nextInputsFromLocations(Yt(n),O.BombAttack,o,u=>{let c=e.board.get(u),l=c===void 0?void 0:$(c);return l!==void 0&&s.color!==l.color&&!Ae(l)}));break}case"consumable":break}return a}i(Gi,"generateSecondInputOptions");function Ki(e,n,t,o,r){let a=[],s=[],u=e.board.squareAt(r),c=e.board.get(r);switch(n){case O.MonMove:{let l=$(t);if(l===void 0)return;if(s.push({kind:"mon-move",item:t,from:o,to:r}),c!==void 0)switch(c.kind){case"mon":case"mon-with-mana":case"mon-with-consumable":return;case"mana":{let m=In(t);m!==void 0&&s.push({kind:"mana-dropped",mana:m,at:o}),s.push({kind:"pickup-mana",mana:c.mana,by:l,at:r});break}case"consumable":switch(c.consumable){case A.Bomb:case A.Potion:return;case A.BombOrPotion:Xo(t)!==void 0||In(t)!==void 0?s.push({kind:"pickup-potion",by:t,at:r}):(a.push(Re({kind:"modifier",modifier:X.SelectBomb},O.SelectConsumable,t)),a.push(Re({kind:"modifier",modifier:X.SelectPotion},O.SelectConsumable,t)));break}break}if(u.kind==="mana-pool"){let m=In(t);m!==void 0&&s.push({kind:"mana-scored",mana:m,at:r})}break}case O.ManaMove:{if(t.kind!=="mana")return;let l=t.mana;if(s.push({kind:"mana-move",mana:l,from:o,to:r}),c!==void 0){if(c.kind!=="mon")return;s.push({kind:"pickup-mana",mana:l,by:c.mon,at:r})}switch(u.kind){case"regular":case"mana-base":case"consumable-base":break;case"mana-pool":s.push({kind:"mana-scored",mana:l,at:r});break;case"mon-base":case"supermana-base":return}break}case O.MysticAction:{if(t.kind!=="mon")return;if(s.push({kind:"mystic-action",mystic:t.mon,from:o,to:r}),c!==void 0){let l=$(c);if(l===void 0)return;if(s.push({kind:"mon-fainted",mon:l,from:r,to:e.board.base(l)}),c.kind==="mon-with-mana"&&(c.mana.kind==="regular"?s.push({kind:"mana-dropped",mana:c.mana,at:r}):s.push({kind:"supermana-back-to-base",from:r,to:e.board.supermanaBase()})),c.kind==="mon-with-consumable")switch(c.consumable){case A.Bomb:s.push({kind:"bomb-explosion",at:r});break;case A.Potion:case A.BombOrPotion:return}}break}case O.DemonAction:{if(t.kind!=="mon")return;let l=t.mon;s.push({kind:"demon-action",demon:l,from:o,to:r});let m=!1,p=!1;if(c!==void 0){let f=$(c);if(f===void 0)return;if(s.push({kind:"mon-fainted",mon:f,from:r,to:e.board.base(f)}),c.kind==="mon-with-mana"&&(c.mana.kind==="regular"?(m=!0,s.push({kind:"mana-dropped",mana:c.mana,at:r})):s.push({kind:"supermana-back-to-base",from:r,to:e.board.supermanaBase()})),c.kind==="mon-with-consumable")switch(c.consumable){case A.Bomb:p=!0,s.push({kind:"bomb-explosion",at:r}),s.push({kind:"mon-fainted",mon:l,from:r,to:e.board.base(l)});break;case A.Potion:case A.BombOrPotion:return}}if(!p&&(u.kind==="supermana-base"||u.kind==="mon-base")&&(m=!0),m)for(let f of Be(r)){let b=e.board.get(f),y=e.board.squareAt(f);b!==void 0&&b.kind!=="consumable"||(Kn(y)?a.push(Re({kind:"location",location:f},O.DemonAdditionalStep)):y.kind==="mon-base"&&y.monKind===l.kind&&y.color===l.color&&a.push(Re({kind:"location",location:f},O.DemonAdditionalStep)))}break}case O.SpiritTargetCapture:{if(c===void 0)return;let l=$(c),m=In(c);a.push(...e.nextInputsFromLocations(Be(r),O.SpiritTargetMove,void 0,p=>{let f=e.board.get(p),b=e.board.squareAt(p);if(!Ea(c,f))return!1;switch(b.kind){case"regular":case"consumable-base":case"mana-base":case"mana-pool":return!0;case"supermana-base":{let y=f?.kind==="mana"&&f.mana.kind==="supermana";return m?.kind==="supermana"||m===void 0&&l?.kind===M.Drainer&&(f===void 0||y)||l?.kind===M.Drainer&&y}case"mon-base":return l?.kind===b.monKind&&l.color===b.color&&m===void 0&&Xo(c)===void 0}}));break}case O.BombAttack:{let l=$(t);if(l===void 0)return;if(s.push({kind:"bomb-attack",by:l,from:o,to:r}),c!==void 0){let m=$(c);if(m===void 0)return;if(s.push({kind:"mon-fainted",mon:m,from:r,to:e.board.base(m)}),c.kind==="mon-with-mana"&&(c.mana.kind==="regular"?s.push({kind:"mana-dropped",mana:c.mana,at:r}):s.push({kind:"supermana-back-to-base",from:r,to:e.board.supermanaBase()})),c.kind==="mon-with-consumable")switch(c.consumable){case A.Bomb:s.push({kind:"bomb-explosion",at:r});break;case A.Potion:case A.BombOrPotion:return}}break}case O.DemonAdditionalStep:case O.SpiritTargetMove:case O.SelectConsumable:break}return[s,a]}i(Ki,"compileSecondInput");function ji(e,n,t,o,r){let a=e.get(r),s=[],u=[];switch(n.kind){case O.SpiritTargetMove:{if(n.input.kind!=="location"||a===void 0)return;let c=n.input.location,l=e.get(c),m=e.squareAt(c);if(u.push({kind:"spirit-target-move",item:a,from:r,to:c,by:o}),l!==void 0)switch(a.kind){case"mon":switch(l.kind){case"mon":case"mon-with-mana":case"mon-with-consumable":return;case"mana":u.push({kind:"pickup-mana",mana:l.mana,by:a.mon,at:c});break;case"consumable":switch(l.consumable){case A.Potion:case A.Bomb:return;case A.BombOrPotion:s.push(Re({kind:"modifier",modifier:X.SelectBomb},O.SelectConsumable,a)),s.push(Re({kind:"modifier",modifier:X.SelectPotion},O.SelectConsumable,a));break}break}break;case"mana":if(l.kind!=="mon")return;u.push({kind:"pickup-mana",mana:a.mana,by:l.mon,at:c});break;case"mon-with-mana":switch(l.kind){case"mon":case"mon-with-mana":case"mon-with-consumable":return;case"mana":u.push({kind:"mana-dropped",mana:a.mana,at:r}),u.push({kind:"pickup-mana",mana:l.mana,by:a.mon,at:c});break;case"consumable":switch(l.consumable){case A.Potion:case A.Bomb:return;case A.BombOrPotion:u.push({kind:"pickup-potion",by:a,at:c});break}break}break;case"mon-with-consumable":if(l.kind!=="consumable"||l.consumable!==A.BombOrPotion)return;u.push({kind:"pickup-potion",by:a,at:c});break;case"consumable":switch(l.kind){case"mana":case"consumable":return;case"mon":s.push(Re({kind:"modifier",modifier:X.SelectBomb},O.SelectConsumable,l)),s.push(Re({kind:"modifier",modifier:X.SelectPotion},O.SelectConsumable,l));break;case"mon-with-mana":case"mon-with-consumable":switch(a.consumable){case A.Potion:case A.Bomb:return;case A.BombOrPotion:u.push({kind:"pickup-potion",by:l,at:c});break}break}break}if(m.kind==="mana-pool"){let p=In(a);p!==void 0&&u.push({kind:"mana-scored",mana:p,at:c})}break}case O.DemonAdditionalStep:{if(n.input.kind!=="location")return;let c=$(t);if(c===void 0)return;let l=n.input.location;u.push({kind:"demon-additional-step",demon:c,from:r,to:l});let m=e.get(l);if(m?.kind==="consumable")switch(m.consumable){case A.Potion:case A.Bomb:return;case A.BombOrPotion:s.push(Re({kind:"modifier",modifier:X.SelectBomb},O.SelectConsumable,t)),s.push(Re({kind:"modifier",modifier:X.SelectPotion},O.SelectConsumable,t));break}break}case O.SelectConsumable:{if(n.input.kind!=="modifier")return;let c=$(t);if(c===void 0)return;switch(n.input.modifier){case X.SelectBomb:u.push({kind:"pickup-bomb",by:c,at:r});break;case X.SelectPotion:u.push({kind:"pickup-potion",by:t,at:r});break}break}case O.MonMove:case O.ManaMove:case O.MysticAction:case O.DemonAction:case O.SpiritTargetCapture:case O.BombAttack:return}return[u,s]}i(ji,"compileThirdInput");function $i(e,n,t){if(e.kind!=="modifier"||n.input.kind!=="location")return;let r=t.find(s=>yt(s.input,e))?.actorMonItem,a=r===void 0?void 0:$(r);if(!(r===void 0||a===void 0))switch(e.modifier){case X.SelectBomb:return{kind:"pickup-bomb",by:a,at:n.input.location};case X.SelectPotion:return{kind:"pickup-potion",by:r,at:n.input.location}}}i($i,"compileFourthInput");function qi(e,n,t){let o=[],r=Array.from({length:121},()=>!1),a=i(s=>{let u=t([{kind:"location",location:s}]);if(u.kind!=="next-input-options"||u.nextInputs.length===0)return;let c=re(s);r[c]||(r[c]=!0,o.push(s))},"addWhenValid");for(let s of e.board.allMonsLocations(e.activeColor))a(s);if(va(e,o.length!==0,n.includeManaStartsWithPotionAction))for(let s of e.board.allFreeRegularManaLocations(e.activeColor))a(s);return o.length===0?{kind:"invalid-input"}:{kind:"locations-to-start-from",locations:o}}i(qi,"suggestedInputToStartWith");function Hi(e,n,t,o,r,a){let s=n[0];if(s?.kind!=="location")return{kind:"invalid-input"};let u=s.location,c=e.board().get(u);if(c===void 0)return{kind:"invalid-input"};let l=n[1];if(l!==void 0&&l.kind!=="location")return{kind:"invalid-input"};let m=a&&e.requiresCounterCapacityFiltering(),p=e.secondInputOptions(u,c,t,t?void 0:l?.location);if(l===void 0){let U=o&&!m?oa(p):p,de=e.applicableInputOptions(n,U,r,m,o);return de.length===0?{kind:"invalid-input"}:{kind:"next-input-options",nextInputs:de}}let f=l.location,b=p.find(U=>yt(U.input,l));if(b===void 0)return{kind:"invalid-input"};let y=n[2],I=e.processSecondInput(b.kind,c,u,f,t),S=I?.[0]??[],P=I?.[1]??[];if(y===void 0){if(P.length!==0){let U=e.applicableInputOptions(n,P,r,m,o);return U.length===0?{kind:"invalid-input"}:{kind:"next-input-options",nextInputs:U}}return S.length===0?{kind:"invalid-input"}:e.resolveEvents(S,t)}let x=P.find(U=>yt(U.input,y));if(x===void 0)return{kind:"invalid-input"};let F=n[3],D=e.processThirdInput(x,c,u,f,t);S.push(...D?.[0]??[]);let L=D?.[1]??[];if(F===void 0){if(L.length!==0){let U=e.applicableInputOptions(n,L,r,m,o);return U.length===0?{kind:"invalid-input"}:{kind:"next-input-options",nextInputs:U}}return S.length===0?{kind:"invalid-input"}:e.resolveEvents(S,t)}let V=$i(F,x,L);return V===void 0?{kind:"invalid-input"}:(S.push(V),e.resolveEvents(S,t))}i(Hi,"dispatchStagedInput");var Ye=class e{static{i(this,"MonsGame")}#e;#n;#t;#o;constructor(n=!1,t=ln,o){let r=o===void 0?new Ln(t):o.fork();this.#e={board:r,whiteScore:0,blackScore:0,activeColor:h.White,actionsUsedCount:0,manaMovesCount:0,monsMovesCount:0,whitePotionsCount:0,blackPotionsCount:0,turnNumber:1},this.#n=new Do(n),this.#t=new Bo,this.#o={board:i(()=>this.board,"board"),requiresCounterCapacityFiltering:i(()=>this.#h(),"requiresCounterCapacityFiltering"),secondInputOptions:i((...a)=>this.#c(...a),"secondInputOptions"),processSecondInput:i((...a)=>this.#k(...a),"processSecondInput"),processThirdInput:i((...a)=>this.#M(...a),"processThirdInput"),applicableInputOptions:i((...a)=>this.#b(...a),"applicableInputOptions"),resolveEvents:i((...a)=>this.#S(...a),"resolveEvents")}}get board(){return this.#e.board.readonlyView()}get whiteScore(){return this.#e.whiteScore}get blackScore(){return this.#e.blackScore}get activeColor(){return this.#e.activeColor}get actionsUsedCount(){return this.#e.actionsUsedCount}get manaMovesCount(){return this.#e.manaMovesCount}get monsMovesCount(){return this.#e.monsMovesCount}get whitePotionsCount(){return this.#e.whitePotionsCount}get blackPotionsCount(){return this.#e.blackPotionsCount}get turnNumber(){return this.#e.turnNumber}get takebackFens(){return this.#n.takebackFens}get isMovesVerified(){return this.#n.movesVerified}get withVerboseTracking(){return this.#n.verboseTrackingEnabled}get verboseTrackingEntities(){return this.#n.trackingEntries}replaceHistory(n){this.#n.replace(n)}#r(n){this.#e.whiteScore=n.whiteScore,this.#e.blackScore=n.blackScore,this.#e.activeColor=n.activeColor,this.#e.actionsUsedCount=n.actionsUsedCount,this.#e.manaMovesCount=n.manaMovesCount,this.#e.monsMovesCount=n.monsMovesCount,this.#e.whitePotionsCount=n.whitePotionsCount,this.#e.blackPotionsCount=n.blackPotionsCount,this.#e.turnNumber=n.turnNumber}static#a(n,t){return new e(n,t.variant,t)}static newSimulationState(n){let t=e.#a(!1,n.board);return t.#r(n),t.#n.setTakebackTracking(!1),t}static fromFen(n,t=!1){let o=Bi(n);if(o===void 0)return;let r=e.#a(t,o.board);return r.#r(o),r.#n.resetForLoadedFen(),r}fen(){return Fi(this)}copy(){let n=e.#a(this.withVerboseTracking,this.board);return n.#r(this),n.#n=this.#n.copy(),n}fork(){let n=e.#a(!1,this.board);return n.#r(this),n.#n=this.#n.fork(),n}variant(){return this.board.variant}replaceBoardItems(n){let t=Array.from({length:121},()=>{});for(let[r,a]of n)t[re(r)]=a;let o=mt.fromItems(t,this.variant());this.#e.board=o,this.#n.resetForBoardReplacement(),this.invalidateProcessInputCache()}setTakebackHistoryTracking(n){this.#n.setTakebackTracking(n),this.invalidateProcessInputCache()}invalidateProcessInputCache(){this.#t.invalidate()}setVerboseTracking(n){this.#n.setVerboseTracking(n)}#y(n){let t=n.board.fork();this.#e.board=t,this.#r(n),this.invalidateProcessInputCache()}canTakeback(n){return this.#n.canTakeback(this.activeColor,n)}processInput(n,t,o){return this.processInputWithStartOptions(n,t,o,void 0)}processInputWithStartOptions(n,t,o,r){return this.#s(n,t,o,r??ta)}inspectInputGrammar(n,t){return this.#s(n,!0,!1,t,!1)}#s(n,t,o,r,a=!0){if(n.length>Qn||this.winnerColor()!==void 0)return{kind:"invalid-input"};if(n.length===0){let u=(a?2:0)|(r.includeManaStartsWithPotionAction?1:0),c=this.#t.getStartSuggestion(u);if(c!==void 0)return c;let l=qi(this,r,m=>this.#s(m,!0,!0,r,a));return this.#t.setStartSuggestion(u,l),l}let s=n[0];if(n.length===1&&s?.kind==="takeback"){let u=this.#n.prepareTakeback(this.activeColor,this.activeColor);if(u===void 0)return{kind:"invalid-input"};let c=e.fromFen(u.previousFen,!1);return c===void 0?{kind:"invalid-input"}:t?{kind:"events",events:[{kind:"takeback"}]}:(this.#y(c),this.#n.commitTakeback(u),{kind:"events",events:[{kind:"takeback"}]})}return Hi(this.#o,n,t,o,r,a)}#h(){return this.turnNumber===Number.MAX_SAFE_INTEGER||this.whitePotionsCount===Number.MAX_SAFE_INTEGER||this.blackPotionsCount===Number.MAX_SAFE_INTEGER}#b(n,t,o,r,a){if(!r)return t;let s=i(c=>this.#d([...n,c.input],o),"applicable");if(!a)return t.filter(s);let u=t.find(s);return u===void 0?[]:[u]}#d(n,t){let o=`${t.includeManaStartsWithPotionAction?1:0}|${zr(n)}`,r=this.#t.getCompletionViability(o);if(r!==void 0)return r;let a=this.#s(n,!0,!1,t,!1),s=(()=>{switch(a.kind){case"invalid-input":return!1;case"events":return _r(this.#e,a.events);case"locations-to-start-from":return a.locations.some(u=>this.#d([...n,{kind:"location",location:u}],t));case"next-input-options":return a.nextInputs.some(u=>this.#d([...n,u.input],t))}})();return this.#t.setCompletionViability(o,s),s}#c(n,t,o,r){let a=String(re(n)),s=this.#t.getSecondInputOptions(a);if(s!==void 0)return s;let u=Gi(this,n,t,r);return o&&this.#t.setSecondInputOptions(a,u),u}#k(n,t,o,r,a){let s=`${n}|${Xt(t)}|${re(o)}|${re(r)}`,u=this.#t.lookupSecondStage(s);if(u!==Gt)return u;let c=Ki(this,n,t,o,r);return a&&this.#t.setSecondStage(s,c),c}#M(n,t,o,r,a){let s=`${Qo(n.input)}|${n.kind}|${n.actorMonItem===void 0?"":Xt(n.actorMonItem)}|${Xt(t)}|${re(o)}|${re(r)}`,u=this.#t.lookupThirdStage(s);if(u!==Gt)return u;let c=ji(this.board,n,t,o,r);return a&&this.#t.setThirdStage(s,c),c}#S(n,t){if(t)return{kind:"events",events:n};let o=this.applyAndAddResultingEvents(n);return o===void 0?{kind:"invalid-input"}:{kind:"events",events:o}}applyAndAddResultingEvents(n){return this.#m(n,this.#n.eventApplicationTrackingEnabled)}forkAndApplyEventsForSimulation(n){let t=this.fork(),o=t.#m(n,!1);return o===void 0?void 0:{game:t,events:o}}#m(n,t){if(!_r(this.#e,n))return;if(this.invalidateProcessInputCache(),!t)return Po(this.#e,n).events;let o=i(()=>this.fen(),"snapshotFen");this.#n.beginEventApplication(o,this.activeColor);let r=Po(this.#e,n);return this.#n.completeEventApplication({snapshotFen:o,color:this.activeColor,events:r.events,turnAdvanced:r.turnAdvanced,winner:r.winner}),r.events}nextInputsFromLocations(n,t,o,r){return ra(n,t,o,r)}availableMoveKinds(){let n=new Map;return n.set(xe.MonMove,ee-this.monsMovesCount),n.set(xe.Action,0),n.set(xe.Potion,0),n.set(xe.ManaMove,0),this.turnNumber===1||(n.set(xe.Action,Ne-this.actionsUsedCount),n.set(xe.Potion,this.playerPotionsCount()),n.set(xe.ManaMove,An-this.manaMovesCount)),n}winnerColor(){return ho(this)}isLaterThan(n){return this.variant()!==n.variant()?!1:this.turnNumber>n.turnNumber?!0:this.turnNumber!==n.turnNumber?!1:this.playerPotionsCount()<n.playerPotionsCount()||this.actionsUsedCount>n.actionsUsedCount||this.manaMovesCount>n.manaMovesCount||this.monsMovesCount>n.monsMovesCount||this.board.faintedMonsLocations(Sn(this.activeColor)).length>n.board.faintedMonsLocations(Sn(n.activeColor)).length}isFirstTurn(){return it(this)}playerPotionsCount(){return ko(this)}playerCanMoveMon(){return Aa(this)}playerCanMoveMana(){return Ca(this)}playerCanUseAction(){return ga(this)}};function Vo(e){let n={i:e.row,j:e.column};if(!Number.isInteger(e.row)||!Number.isInteger(e.column)||!un(n))throw new RangeError(`position must contain integer row and column values from 0 through ${10}`);return n}i(Vo,"toEnginePosition");function Y(e){return{row:e.i,column:e.j}}i(Y,"fromEnginePosition");function an(e){return{kind:e.kind,color:e.color,cooldown:e.cooldown}}i(an,"fromEngineMon");function jt(e){return e.kind==="supermana"?{kind:"supermana"}:{kind:"regular",color:e.color}}i(jt,"fromEngineMana");function ft(e){switch(e.kind){case"mon":return{kind:"mon",mon:an(e.mon)};case"mana":return{kind:"mana",mana:jt(e.mana)};case"mon-with-mana":return{kind:"mon",mon:an(e.mon),carrying:{kind:"mana",mana:jt(e.mana)}};case"mon-with-consumable":return{kind:"mon",mon:an(e.mon),carrying:{kind:"consumable",consumable:e.consumable}};case"consumable":return{kind:"consumable",consumable:e.consumable}}}i(ft,"fromEngineItem");function zi(e){switch(e.kind){case"regular":case"consumable-base":case"supermana-base":return{kind:e.kind};case"mana-base":case"mana-pool":return{kind:e.kind,color:e.color};case"mon-base":return{kind:e.kind,color:e.color,monKind:e.monKind}}}i(zi,"fromEngineSquare");function Nr(e){switch(e.kind){case"takeback":return{kind:"takeback"};case"position":return{kind:"location",location:Vo(e.position)};case"modifier":return{kind:"modifier",modifier:e.modifier}}}i(Nr,"toEngineInput");function Pr(e){switch(e.kind){case"takeback":return{kind:"takeback"};case"location":return{kind:"position",position:Y(e.location)};case"modifier":return{kind:"modifier",modifier:e.modifier}}}i(Pr,"fromEngineInput");function uu(e){let n=Pr(e.input),t=e.actorMonItem===void 0?{}:{actor:ft(e.actorMonItem)};if(e.kind==="select-consumable"){if(n.kind!=="modifier")throw new Error("consumable selection requires a modifier input");return{action:e.kind,input:n,...t}}if(n.kind!=="position")throw new Error(`${e.kind} requires a position input`);switch(e.kind){case"mon-move":case"mana-move":case"mystic-action":case"demon-action":case"demon-additional-step":case"spirit-target-capture":case"spirit-target-move":case"bomb-attack":return{action:e.kind,input:n,...t}}}i(uu,"fromEngineInputOption");function Uo(e){switch(e.kind){case"mon-move":return{kind:e.kind,item:ft(e.item),from:Y(e.from),to:Y(e.to)};case"mana-move":return{kind:e.kind,mana:jt(e.mana),from:Y(e.from),to:Y(e.to)};case"mana-scored":case"mana-dropped":return{kind:e.kind,mana:jt(e.mana),at:Y(e.at)};case"mystic-action":return{kind:e.kind,mystic:an(e.mystic),from:Y(e.from),to:Y(e.to)};case"demon-action":case"demon-additional-step":return{kind:e.kind,demon:an(e.demon),from:Y(e.from),to:Y(e.to)};case"spirit-target-move":return{kind:e.kind,item:ft(e.item),from:Y(e.from),to:Y(e.to),by:Y(e.by)};case"pickup-bomb":return{kind:e.kind,by:an(e.by),at:Y(e.at)};case"pickup-potion":return{kind:e.kind,by:ft(e.by),at:Y(e.at)};case"use-potion":case"supermana-back-to-base":return{kind:e.kind,from:Y(e.from),to:Y(e.to)};case"pickup-mana":return{kind:e.kind,mana:jt(e.mana),by:an(e.by),at:Y(e.at)};case"mon-fainted":return{kind:e.kind,mon:an(e.mon),from:Y(e.from),to:Y(e.to)};case"bomb-attack":return{kind:e.kind,by:an(e.by),from:Y(e.from),to:Y(e.to)};case"mon-awake":return{kind:e.kind,mon:an(e.mon),at:Y(e.at)};case"bomb-explosion":return{kind:e.kind,at:Y(e.at)};case"next-turn":return{kind:e.kind,color:e.color};case"game-over":return{kind:e.kind,winner:e.winner};case"takeback":return{kind:e.kind}}}i(Uo,"fromEngineEvent");function Lr(e,n){switch(e.kind){case"invalid-input":return{kind:"invalid",inputFen:n};case"locations-to-start-from":return{kind:"awaiting-start",inputFen:n,positions:e.locations.map(Y)};case"next-input-options":return{kind:"awaiting-input",inputFen:n,options:e.nextInputs.map(uu)};case"events":return{kind:"complete",inputFen:n,events:e.events.map(Uo)}}}i(Lr,"fromEngineOutput");function Xi(e){return{monMoves:e.get(xe.MonMove)??0,manaMoves:e.get(xe.ManaMove)??0,actions:e.get(xe.Action)??0,potions:e.get(xe.Potion)??0}}i(Xi,"availableMoveCountsFromEngine");function lu(e){if(e!=="")return ht(e)}i(lu,"parseReplayMove");function Wo(e,n,t,o){let r=0,a=0;for(;r<n.length||a<t.length;){let s=e.activeColor===h.White,l=(s?n:t)[s?r:a];if(l===void 0)return{status:"missing-move",whiteMovesProcessed:r,blackMovesProcessed:a};let m=lu(l);if(m===void 0)return{status:"invalid-move",whiteMovesProcessed:r,blackMovesProcessed:a};let p=e.processInput(m,!1,!1);if(p.kind!=="events"||p.events.length===0)return{status:"invalid-move",whiteMovesProcessed:r,blackMovesProcessed:a};s?r+=1:a+=1;let f={whiteMovesProcessed:r,blackMovesProcessed:a};if(o?.(e,f)===!1)return{status:"stopped",...f}}return{status:"complete",whiteMovesProcessed:r,blackMovesProcessed:a}}i(Wo,"replayInterleavedMoves");var Fr=class e{static{i(this,"Game")}#e;constructor(n={}){let{variant:t=E.Classic}=n;if(!mu(t))throw new TypeError(`unsupported game variant: ${String(t)}`);this.#e=new Ye(!0,t)}static#n(n){let t=new e({variant:n.variant()});return t.#e=n,t}static fromFen(n){let t=Ye.fromFen(n,!0);if(t?.fen()===n)return e.#n(t)}get variant(){return this.#e.variant()}get activeColor(){return this.#e.activeColor}get turnNumber(){return this.#e.turnNumber}get scores(){return{[h.White]:this.#e.whiteScore,[h.Black]:this.#e.blackScore}}get potions(){return{[h.White]:this.#e.whitePotionsCount,[h.Black]:this.#e.blackPotionsCount}}get winner(){return this.#e.winnerColor()}get historyVerified(){return this.#e.isMovesVerified}get takebackFens(){return[...this.#e.takebackFens]}get trackingEntries(){return this.#e.verboseTrackingEntities.map(n=>({fen:n.fen,color:n.color,events:n.events.map(Uo),eventsFen:_i(n.events)}))}toFen(){return this.#e.fen()}preview(n){let t=n.map(Nr);return this.#t(t,et(t))}play(n){let t=n.map(Nr);return this.#o(t,et(t))}playFen(n){let t=ht(n);return t===void 0?{kind:"invalid",inputFen:n}:this.#o(t,et(t))}#t(n,t){let o=n.length===1&&n[0]?.kind==="takeback"?this.#e.copy():this.#e.fork();return Lr(o.processInput(n,!1,!1),t)}#o(n,t){let o=Lr(this.#e.processInput(n,!1,!1),t);return o.kind==="complete"?o:{kind:"invalid",inputFen:t}}itemAt(n){let t=this.#e.board.get(Vo(n));return t===void 0?void 0:ft(t)}squareAt(n){return zi(this.#e.board.squareAt(Vo(n)))}contentPositions(){let n=new Map;for(let[t]of this.#e.board.entries())n.set(Qi(t.i,t.j),{row:t.i,column:t.j});for(let t of this.#e.board.allMonsBases())n.set(Qi(t.i,t.j),{row:t.i,column:t.j});return[...n.values()].sort((t,o)=>t.row-o.row||t.column-o.column)}canTakeback(n){if(!du(n))throw new TypeError(`unsupported color: ${String(n)}`);return this.#e.canTakeback(n)}takeback(){return this.play([{kind:"takeback"}])}previousTurn(n){let t=this.#e.verboseTrackingEntities;if(t.length<=1)return;let o=t.slice(0,-1),r=o[o.length-1],a=Ye.fromFen(r?.fen??this.#e.fen(),!0);if(a===void 0)return;let s=n.lastIndexOf(a.fen());if(n.length>0&&s<0)return;let u=s<0?[]:n.slice(0,s+1);if(!u.some(c=>{let l=Ye.fromFen(c,!1);return l?.fen()!==c||l.variant()!==a.variant()}))return a.replaceHistory({takebackFens:u,trackingEntries:o,verboseTrackingEnabled:!0,movesVerified:this.#e.isMovesVerified}),e.#n(a)}verifyHistory(n){let t=new Ye(!0,this.#e.variant());return Wo(t,n.white,n.black).status!=="complete"||t.fen()!==this.#e.fen()?!1:(this.#e.replaceHistory({takebackFens:t.takebackFens,trackingEntries:t.verboseTrackingEntities,movesVerified:!0}),!0)}isLaterThan(n){return this.#e.isLaterThan(n.#e)}availableMoveCounts(){return Xi(this.#e.availableMoveKinds())}suggestMove(n){if(!fu(n))throw new TypeError(`unsupported automove preference: ${String(n)}`);let t=Ti(this.#e,n);if(t.output.kind!=="events")return;let o=ht(t.inputFen);if(o!==void 0)return{inputs:o.map(Pr),inputFen:t.inputFen,events:t.output.events.map(Uo)}}};function du(e){return e===h.White||e===h.Black}i(du,"isColor");function mu(e){return Object.values(E).includes(e)}i(mu,"isGameVariant");function fu(e){return e==="fast"||e==="normal"||e==="pro"}i(fu,"isAutomovePreference");function Qi(e,n){return`${e},${n}`}i(Qi,"positionKey");function pu(e){let n=Yi(e.white.fen),t=Yi(e.black.fen);if(n===void 0||t===void 0)return n===void 0&&t===void 0?{kind:"invalid"}:{kind:"winner",winner:n===void 0?h.Black:h.White};if(n.variant()!==t.variant())return{kind:"invalid"};let o=n.fen(),r=t.fen();if(n.winnerColor()===void 0&&t.winnerColor()===void 0)return{kind:"ongoing"};let a=new Ye(!1,n.variant()),s;return Wo(a,e.white.moves,e.black.moves,(u,{whiteMovesProcessed:c,blackMovesProcessed:l})=>{let m=u.winnerColor();if(m===void 0)return!0;let p=m===h.White?c===e.white.moves.length:l===e.black.moves.length,f=m===h.White?o:r;return s=p&&f===u.fen()?{kind:"winner",winner:m}:{kind:"invalid"},!1}),s??{kind:"invalid"}}i(pu,"resolveMatch");function Yi(e){let n=Ye.fromFen(e,!1);return n?.fen()===e?n:void 0}i(Yi,"submittedGame");export{h as Color,A as Consumable,Fr as Game,E as GameVariant,X as Modifier,M as MonKind,pu as resolveMatch};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mons-rules",
3
- "version": "0.4.7",
3
+ "version": "0.4.8",
4
4
  "description": "TypeScript rules engine for Super Metal Mons",
5
5
  "type": "module",
6
6
  "license": "CC0-1.0",