@betorigami/game-calculations 4.0.9 → 4.0.10

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.
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- var zt=Object.create;var{getPrototypeOf:Jt,defineProperty:M,getOwnPropertyNames:er,getOwnPropertyDescriptor:qt}=Object,$r=Object.prototype.hasOwnProperty;var Z=(r,t,o)=>{o=r!=null?zt(Jt(r)):{};let c=t||!r||!r.__esModule?M(o,"default",{value:r,enumerable:!0}):o;for(let a of er(r))if(!$r.call(c,a))M(c,a,{get:()=>r[a],enumerable:!0});return c},Yr=new WeakMap,Xt=(r)=>{var t=Yr.get(r),o;if(t)return t;if(t=M({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")er(r).map((c)=>!$r.call(t,c)&&M(t,c,{get:()=>r[c],enumerable:!(o=qt(r,c))||o.enumerable}));return Yr.set(r,t),t};var Qt=(r,t)=>{for(var o in t)M(r,o,{get:t[o],enumerable:!0,configurable:!0,set:(c)=>t[o]=()=>c})};var jo={};Qt(jo,{validateRouletteGameInputs:()=>_o,validateAdvancedDiceInputs:()=>gt,rtp99Multipliers:()=>ht,rtp98Multipliers:()=>yt,rtp97Multipliers:()=>St,rtp96Multipliers:()=>Zt,rtp92Multipliers:()=>Tt,plinkoMultipliers:()=>Gr,kenoMultipliers:()=>Tr,isTileCount:()=>Zr,diamondsMultipliers:()=>nt,calculateRouletteBetAmount:()=>To,calculateBaccaratBetAmount:()=>gr,WheelSegments:()=>b,WheelRiskLevel:()=>m,Wheel:()=>$t,VALID_SUITS:()=>Lr,VALID_RANKS:()=>kr,VALID_EUROPEAN_STREETS:()=>jr,VALID_EUROPEAN_STRAIGHTS:()=>Ar,VALID_EUROPEAN_SPLITS:()=>Hr,VALID_EUROPEAN_DOUBLE_STREETS:()=>Mr,VALID_EUROPEAN_CORNERS:()=>mr,VALID_AMERICAN_STREETS:()=>Ur,VALID_AMERICAN_STRAIGHTS:()=>Nr,VALID_AMERICAN_SPLITS:()=>lr,VALID_AMERICAN_DOUBLE_STREETS:()=>Pr,VALID_AMERICAN_CORNERS:()=>br,TOP_COLUMN:()=>bt,TILE_COUNTS:()=>Dt,RouletteType:()=>ir,Roulette:()=>Rr,RollType:()=>Xr,RED_NUMBERS:()=>Pt,RANDOM_MIN_VALUE:()=>k,RANDOM_MAX_VALUE:()=>v,PlinkoRiskLevel:()=>wr,Plinko:()=>Ut,Parity:()=>G,PLINKO_ROW_COUNTS:()=>Eo,PAYOUT_MULTIPLIERS:()=>mt,OrigamiGame:()=>u,Mines:()=>lt,MIN_WIN_CHANCE:()=>Jr,MIDDLE_COLUMN:()=>Vt,MAX_WIN_CHANCE:()=>qr,Limbo:()=>Ht,KenoRiskLevel:()=>Sr,Keno:()=>wt,Half:()=>H,GameErrorCode:()=>zr,GameError:()=>i,Game:()=>B,EuropeanRoulette:()=>Ir,EUROPEAN_HOUSE_EDGE:()=>It,EFFECTIVE_RANGE:()=>Or,Dozen:()=>j,DiceDirection:()=>Ct,Dice:()=>ut,DiamondsResultType:()=>Bt,Diamonds:()=>xt,Column:()=>l,Color:()=>N,BlackjackOutcome:()=>s,BlackjackHand:()=>_,BlackjackAction:()=>R,Blackjack:()=>yr,BaccaratOutcome:()=>vr,BaccaratBetType:()=>Kr,Baccarat:()=>rt,BOTTOM_COLUMN:()=>Mt,BLACK_NUMBERS:()=>Ft,AmericanRoulette:()=>sr,AdvancedDice:()=>Wr,AMERICAN_HOUSE_EDGE:()=>st,AMERICAN_BASKET:()=>Vr});module.exports=Xt(jo);var u;((f)=>{f.DICE="DICE";f.MINES="MINES";f.KENO="KENO";f.LIMBO="LIMBO";f.ADVANCED_DICE="ADVANCED_DICE";f.BACCARAT="BACCARAT";f.DIAMONDS="DIAMONDS";f.PLINKO="PLINKO";f.ROULETTE="ROULETTE";f.WHEEL="WHEEL";f.BLACKJACK="BLACKJACK"})(u||={});class B{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}var L=require("big.js");var zr;((t)=>t.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(zr||={});class i extends Error{static createValidationError(r){return new i("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof i}errorCode;constructor(r,t){super(t);this.errorCode=r}}var k=0,v=1e4,Or=10001,Jr=0.01,qr=98,Wt=(r)=>{if(r<k)throw i.createValidationError(`Lower bound ${r} is below minimum allowed value ${k}`)},Lt=(r)=>{if(r>v)throw i.createValidationError(`Upper bound ${r} is above maximum allowed value ${v}`)},W=(r)=>{if(Wt(r.lower),Lt(r.upper),r.lower>=r.upper)throw i.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},kt=(r,t)=>{let[o,c]=r.lower<=t.lower?[r,t]:[t,r];if(o.upper>c.lower)throw i.createValidationError("Bounds must not overlap")},vt=(r,t)=>t>=r.lower&&t<=r.upper,Kt=(r)=>r.upper-r.lower+1,dr=(r,t)=>t>r.lower&&t<r.upper,pr=(r)=>r.upper-r.lower-1,Xr;((c)=>{c.ROLL_BETWEEN="ROLL_BETWEEN";c.ROLL_OUTSIDE="ROLL_OUTSIDE";c.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(Xr||={});var Qr=(r)=>{let o=(()=>{switch(r.mode){case"ROLL_BETWEEN":return W(r.bounds),pr(r.bounds);case"ROLL_OUTSIDE":return W(r.bounds),Or-Kt(r.bounds);case"ROLL_BETWEEN_TWO":return W(r.firstBounds),W(r.secondBounds),kt(r.firstBounds,r.secondBounds),pr(r.firstBounds)+pr(r.secondBounds)}})(),c=L.Big(o).div(Or).mul(100);if(c.lt(Jr))throw i.createValidationError("Win chance too low");if(c.gt(qr))throw i.createValidationError("Win chance too high");return c},gt=(r)=>{Qr(r)};class Wr extends B{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let c=Qr(o),a=r.getRandomInt({min:k,max:v}),A=a.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return dr(o.bounds,A);case"ROLL_OUTSIDE":return!vt(o.bounds,A);case"ROLL_BETWEEN_TWO":return dr(o.firstBounds,A)||dr(o.secondBounds,A)}})()?new L.Big(100-t).div(c):new L.Big(0),outputs:{result:a.values},randomValues:a}}}var T=Z(require("big.js"));var Lr=["Clubs","Diamonds","Hearts","Spades"],kr=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],vr;((c)=>{c.PLAYER_WIN="PLAYER_WIN";c.TIE="TIE";c.BANKER_WIN="BANKER_WIN"})(vr||={});var Kr;((c)=>{c.PLAYER="PLAYER";c.TIE="TIE";c.BANKER="BANKER"})(Kr||={});var ro={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},gr=(r)=>{return new T.default(0).add(r.bets.reduce((o,c)=>o.add(c.amount),new T.default(0)))};class rt extends B{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(t);let c=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),a=c.values,A=a.slice(0,3),E=a.slice(3,6),d=[],p=0;for(let x of A.slice(0,2)){let D=this.mapRandomValueToCard(x),Q=this.mapRandomValueToCardValue(x);d.push(D),p=(p+Q)%10}let O=[],n=0;for(let x of E.slice(0,2)){let D=this.mapRandomValueToCard(x),Q=this.mapRandomValueToCardValue(x);O.push(D),n=(n+Q)%10}if(!this.isNaturalWin(p,n)){let x=this.shouldDrawThirdPlayerCard(p),D=null;if(x)D=this.mapRandomValueToCardValue(A[2]),d.push(this.mapRandomValueToCard(A[2])),p=(p+D)%10;if(this.shouldDrawThirdBankerCard(n,D))O.push(this.mapRandomValueToCard(E[2])),n=(n+this.mapRandomValueToCardValue(E[2]))%10}let f;if(p===n)f="TIE";else f=p>n?"PLAYER_WIN":"BANKER_WIN";let C=gr(t),{betType:U,multiplier:X}=ro[f],V=new T.default(0);if(V=V.add(t.bets.filter((x)=>x.type===U).reduce((x,D)=>x.add(D.amount.mul(X)),new T.default(0))),f==="TIE")V=V.add(t.bets.filter((x)=>x.type==="PLAYER"||x.type==="BANKER").reduce((x,D)=>x.add(D.amount),new T.default(0)));return{isFinished:!0,payoutMultiplier:C.gt(0)?V.div(C):new T.default(0),outputs:{playerCards:d,playerHandValue:p,bankerCards:O,bankerHandValue:n,gameOutcome:f,result:c.values},randomValues:c}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((t)=>t.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let t=Lr[Math.floor(r/13)],o=kr[r%13];return{suit:t,rank:o}}isNaturalWin(r,t){let o=[8,9];return o.includes(r)||o.includes(t)}mapRandomValueToCardValue(r){let t=r%13;if(t===0)return 1;if(t>=10)return 10;return t+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,t){if(t===null)return r<=5;if(r<=2)return!0;if(r===3)return t!==8;if(r===4)return[2,3,4,5,6,7].includes(t);if(r===5)return[4,5,6,7].includes(t);if(r===6)return[6,7].includes(t);return!1}}var hr=Z(require("big.js")),cr=require("@betorigami/guard");var or=require("@betorigami/guard");var rr=require("@betorigami/guard");var Br=0,nr=51,K=Array.from({length:52},(r,t)=>t),tt=["Spades","Hearts","Diamonds","Clubs"],g=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],ot=["Jack","Queen","King"];class xr{value;constructor(r){let t=K[r];rr.Guard.againstNullOrUndefined(t,`Invalid card value: ${r}`),this.value=t}get suit(){let r=Math.floor(this.value/13),t=tt[r];return rr.Guard.againstNullOrUndefined(t,`Invalid suit index: ${r}`),t}get rank(){let r=this.value%13,t=g[r];return rr.Guard.againstNullOrUndefined(t,`Invalid rank index: ${r}`),t}serialise(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}var ct=2.5,at=2,At=1,it=0,Et=17,tr=21;var ft=63;var Cr=10,dt=10;class y extends xr{get numericRank(){if(ot.includes(this.rank))return dt;return g.indexOf(this.rank)+1}static fromValue(r){if(K.includes(r))return new y(r);throw new Error(`Invalid card value: ${r}`)}}class P{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((o,c)=>o+c.numericRank,0),r.some((o)=>o.rank==="Ace")&&this.hardHandValue+Cr<=tr)this.softHandValue=this.hardHandValue+Cr}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>tr}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===tr}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}serialise(){return this.cards.map((r)=>r.serialise())}}class _{cards;value;constructor(r){this.cards=r.map((t)=>y.fromValue(t)),this.value=new P(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.serialise()),value:this.highestHandValue}}}class F extends _{otherCards;upCard;holeCard;constructor(r,t,o=[]){super([r,t,...o]);this.otherCards=o;this.upCard=y.fromValue(r),this.holeCard=y.fromValue(t)}static withInitialDeal(r){return new F(r.upCard,r.holeCard)}addDrawnCards(r){return new F(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.serialise()],value:new P([this.upCard]).highestHandValue}}}class I extends _{static withInitialDeal(r){return new I(r)}addDrawnCards(r){return new I([...this.rawValues,...r])}}var s;((a)=>{a.WIN="WIN";a.LOSE="LOSE";a.PUSH="PUSH";a.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(s||={});var R;((c)=>{c.START="START";c.HIT="HIT";c.STAND="STAND"})(R||={});class h{deck;playerHand;dealerHand;outcome;constructor(r,t,o,c){this.deck=r;this.playerHand=t;this.dealerHand=o;this.outcome=c}get isFinished(){return this.outcome!==null}toDto(){return{playerHand:this.playerHand.toDto(),dealerHand:this.dealerHand.toDto(this.isFinished),outcome:this.outcome}}static start(r){let t=r.drawCard(),o=r.drawCard(),c=r.drawCard(),a=r.drawCard(),A=I.withInitialDeal([t.value,o.value]),E=F.withInitialDeal({upCard:c.value,holeCard:a.value}),d=A.isBlackjack,p=E.isBlackjack,O=null;if(d&&p)O="PUSH";else if(d)O="PLAYER_BLACKJACK";else if(p)O="LOSE";return new h(r,A,E,O)}applyAction(r){switch(r){case"HIT":return this.hit();case"STAND":return this.stand();case"START":throw new Error("START cannot be applied to an existing state.");default:throw or.Guard.againstNever(r,`Unknown action: ${r}`),new Error(`Unknown action: ${r}`)}}hit(){or.Guard.against(this.isFinished,"Cannot hit on a finished game.");let r=this.deck.drawCard(),t=this.playerHand.addDrawnCards([r.value]);if(t.isBusted)return new h(this.deck,t,this.dealerHand,"LOSE");if(t.highestHandValue===21)return new h(this.deck,t,this.dealerHand,null).stand();return new h(this.deck,t,this.dealerHand,null)}stand(){or.Guard.against(this.isFinished,"Cannot stand on a finished game.");let r=this.playDealerHand(),t=h.calculateOutcome(this.playerHand,r);return new h(this.deck,this.playerHand,r,t)}static calculateOutcome(r,t){if(r.isBusted)return"LOSE";if(t.isBusted)return"WIN";let o=r.highestHandValue,c=t.highestHandValue;if(o>c)return"WIN";if(o<c)return"LOSE";return"PUSH"}playDealerHand(){let r=this.dealerHand;while(r.highestHandValue<Et){let t=this.deck.drawCard();r=r.addDrawnCards([t.value])}return r}}var pt=require("@betorigami/guard");class ur{values;proofHash;proofString;index=0;constructor(r){let t=r.getRandomIntsWithReplacement({min:Br,max:nr,count:ft});this.values=t.values.map((o)=>new y(o)),this.proofHash=t.proofHash,this.proofString=t.proofString}drawCard(){return pt.Guard.against(this.index>=this.values.length,"Card drawer exhausted - pre-drawn values depleted"),this.values[this.index++]}getConsumedRandomValues(){return{values:this.values.slice(0,this.index).map((r)=>r.value),count:this.index,min:Br,max:nr,proofHash:this.proofHash,proofString:this.proofString}}}var Y=Z(require("big.js"));var Dr={PLAYER_BLACKJACK:Y.default(ct),WIN:Y.default(at),PUSH:Y.default(At),LOSE:Y.default(it)};class yr extends B{constructor(){super("BLACKJACK")}determineGameResult({generator:r,gameInputs:t}){let{previousActions:o,nextAction:c}=t,a=new ur(r);if(c==="START"){cr.Guard.against(o.length>0,"START action requires previousActions to be empty.");let f=h.start(a),C=f.isFinished,U=f.outcome!==null?Dr[f.outcome]:hr.default(0),X=a.getConsumedRandomValues();return{isFinished:C,payoutMultiplier:U,outputs:{action:c,state:f.toDto(),result:C?X.values:[]},randomValues:X}}cr.Guard.against(o[0]!=="START","previousActions must start with START.");let E=o.slice(1).reduce((f,C)=>f.applyAction(C),h.start(a));cr.Guard.against(E.isFinished,`Cannot process action "${c}" on a finished game with outcome "${E.outcome}".`);let d=E.applyAction(c),p=d.isFinished,O=d.outcome!==null?Dr[d.outcome]:hr.default(0),n=a.getConsumedRandomValues();return{isFinished:p,payoutMultiplier:O,outputs:{action:c,state:d.toDto(),result:p?n.values:[]},randomValues:n}}}var Ot=Z(require("big.js"));class S{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let t=this.multipliers.get(r);if(t===void 0)throw new Error(`Multipliers for ${r} not found`);return t}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,t])=>({edge:r,multipliers:t}))}}var Bt;((E)=>{E.PAIR="PAIR";E.TWO_PAIR="TWO_PAIR";E.THREE_OF_A_KIND="THREE_OF_A_KIND";E.FULL_HOUSE="FULL_HOUSE";E.FOUR_OF_A_KIND="FOUR_OF_A_KIND";E.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(Bt||={});var to={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},oo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},co={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},ao={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},Ao={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},nt=new S(new Map([[1,to],[2,oo],[3,co],[4,ao],[8,Ao]])),io={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class xt extends B{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:t}){let o=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),c=nt.getMultipliers(t),a=o.values,A=this.calculatePayoutMultiplier(c,a);return{isFinished:!0,payoutMultiplier:Ot.default(A),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(r,t){let o=new Map;for(let A of t){let E=o.get(A)||0;o.set(A,E+1)}let c=[...o.values()].filter((A)=>A>1),a=this.classifyResult(c);return a===null?0:r[a]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[t,o]=r;if(t===void 0)return null;if(o===void 0){let c=io[t];if(c===void 0)throw new Error(`Unexpected single diamond repeat count: ${t}`);return c}return t===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}var ar=Z(require("big.js"));var Ct;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(Ct||={});class ut extends B{constructor(){super("DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let c=r.getRandomInt({min:0,max:1e4}),a=c.min,d=c.max-a+1-1,p=o.direction==="ABOVE"?d-o.selectedValue:o.selectedValue,O=new ar.default(p).div(d).mul(100);return{isFinished:!0,payoutMultiplier:(o.direction==="ABOVE"?c.value>o.selectedValue:c.value<o.selectedValue)?new ar.default(100-t).div(O):new ar.default(0),outputs:{result:c.values},randomValues:c}}}var _t=Z(require("big.js"));var e=require("@betorigami/guard");var Sr;((a)=>{a.CLASSIC="CLASSIC";a.LOW_RISK="LOW_RISK";a.MEDIUM_RISK="MEDIUM_RISK";a.HIGH_RISK="HIGH_RISK"})(Sr||={});var Dt=[1,2,3,4,5,6,7,8,9,10],Zr=(r)=>{return Dt.includes(r)};var ht={[1]:{CLASSIC:[0,3.96],LOW_RISK:[0.7,1.85],MEDIUM_RISK:[0.4,2.75],HIGH_RISK:[0,3.96]},[2]:{CLASSIC:[0,1.9,4.5],LOW_RISK:[0,2,3.8],MEDIUM_RISK:[0,1.8,5.1],HIGH_RISK:[0,0,17.1]},[3]:{CLASSIC:[0,1,3.1,10.4],LOW_RISK:[0,1.1,1.38,26],MEDIUM_RISK:[0,0,2.8,50],HIGH_RISK:[0,0,0,81.5]},[4]:{CLASSIC:[0,0.8,1.8,5,22.5],LOW_RISK:[0,0,2.2,7.9,90],MEDIUM_RISK:[0,0,1.7,10,100],HIGH_RISK:[0,0,0,10,259]},[5]:{CLASSIC:[0,0.25,1.4,4.1,16.5,36],LOW_RISK:[0,0,1.5,4.2,13,300],MEDIUM_RISK:[0,0,1.4,4,14,390],HIGH_RISK:[0,0,0,4.5,48,450]},[6]:{CLASSIC:[0,0,1,3.68,7,16.5,40],LOW_RISK:[0,0,1.1,2,6.2,100,700],MEDIUM_RISK:[0,0,0,3,9,180,710],HIGH_RISK:[0,0,0,0,11,350,710]},[7]:{CLASSIC:[0,0,0.47,3,4.5,14,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,15,225,700],MEDIUM_RISK:[0,0,0,2,7,30,400,800],HIGH_RISK:[0,0,0,0,7,90,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,13,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,5.5,39,100,800],MEDIUM_RISK:[0,0,0,2,4,11,67,400,900],HIGH_RISK:[0,0,0,0,5,20,270,600,900]},[9]:{CLASSIC:[0,0,0,1.55,3,8,15,44,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,5,15,100,500,1000],HIGH_RISK:[0,0,0,0,4,11,56,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,4,7,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,8,13,63,500,800,1000]}},yt={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},St={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},Zt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},Tt={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},Tr=new S(new Map([[1,ht],[2,yt],[3,St],[4,Zt],[8,Tt]]));class wt extends B{constructor(){super("KENO")}determineGameResult({generator:r,edge:t,gameInputs:o}){e.Guard.againstEmptyArray(o.selectedNumbers,()=>i.createValidationError("No numbers selected")),e.Guard.against(o.selectedNumbers.length>10,()=>i.createValidationError("Maximum of 10 numbers can be selected"));for(let f of o.selectedNumbers)e.Guard.againstNonInteger(f,()=>i.createValidationError("Only integers can be selected")),e.Guard.against(f<0||f>39,()=>i.createValidationError("Invalid number selected"));let c=r.getUniqueRandomInts({min:0,max:39,count:10}),a=o.selectedNumbers.filter((f)=>c.values.includes(f)),A=o.selectedNumbers.length;if(!Zr(A))throw new Error(`Invalid tile count: ${A}`);let O=Tr.getMultipliers(t)[A][o.riskLevel][a.length];if(O===void 0)throw new Error(`No multiplier found for matching tile count ${a.length}`);return{isFinished:!0,payoutMultiplier:new _t.default(O),outputs:{result:c.values},randomValues:c}}}var w=Z(require("big.js"));var Gt=(r,t)=>{return r.gt(t)?r:t};var Nt=(r,t)=>{return r.lt(t)?r:t};class Ht extends B{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:t,gameInputs:o}){let c=r.getRandomInt({min:1,max:4294967295}),a=c.max,A=new w.default(16777216),E=new w.default(1),d=new w.default(1e6),p=c.value,O=new w.default(p-1).div(a),n=(100-t)/100,f=A.div(O.mul(A).plus(1)).mul(n),C=Gt(E,Nt(f,d));return{isFinished:!0,payoutMultiplier:C.gte(o.targetMultiplier)?new w.default(o.targetMultiplier):new w.default(0),outputs:{randomMultiplier:C,result:c.values},randomValues:c}}}var $=Z(require("big.js"));var _r=(r,t)=>{if(t<0||r<0||t>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(t>r-t)t=r-t;let o=1;for(let c=1;c<=t;c++)o=o*(r-c+1)/c;return o};class lt extends B{constructor(){super("MINES")}determineGameResult({generator:r,edge:t,gameInputs:o}){if(o.minesCount<=0||o.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(o.selectedTiles.length>25-o.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let E=r.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),d=E.values.some((U)=>o.selectedTiles.includes(U)),p=o.hasCashedOut||d,O=(100-t)/100,n=new $.default(_r(25-o.minesCount,o.selectedTiles.length)).div(new $.default(_r(25,o.selectedTiles.length))),C=o.hasCashedOut&&!d?new $.default(O).div(n):new $.default(0);return{isFinished:p,payoutMultiplier:C,outputs:{result:E.values},randomValues:E}}}var jt=require("big.js");var wr;((c)=>{c.LOW_RISK="LOW_RISK";c.MEDIUM_RISK="MEDIUM_RISK";c.HIGH_RISK="HIGH_RISK"})(wr||={});var Eo=[8,9,10,11,12,13,14,15,16],fo={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16]},MEDIUM_RISK:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},po={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},Oo={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},Bo={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},no={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},Gr=new S(new Map([[1,fo],[2,po],[3,Oo],[4,Bo],[8,no]]));class Ut extends B{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(t.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(t.numberOfRows<8||t.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let c=t.numberOfRows,E=Gr.getMultipliers(o)[t.riskLevel][c],d=r.getRandomIntsWithReplacement({min:0,max:1,count:t.numberOfRows}),O=d.values.reduce((f,C)=>f+C,0),n=E[O];if(n===void 0)throw new Error(`No payout found for end position ${O}`);return{isFinished:!0,payoutMultiplier:jt.Big(n),outputs:{result:d.values},randomValues:d}}}var q=require("big.js");var Ar=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],Nr=[37,...Ar],Hr=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],lr=[[0,1],[0,37],[3,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],jr=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],Ur=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],mr=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],br=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],Vr=[0,1,2,3,37],Mr=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],Pr=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],G;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(G||={});var N;((o)=>{o.RED="RED";o.BLACK="BLACK"})(N||={});var H;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(H||={});var l;((c)=>{c.TOP="TOP";c.MIDDLE="MIDDLE";c.BOTTOM="BOTTOM"})(l||={});var j;((c)=>{c.FIRST="FIRST";c.SECOND="SECOND";c.THIRD="THIRD"})(j||={});var ir;((o)=>{o.AMERICAN="AMERICAN";o.EUROPEAN="EUROPEAN"})(ir||={});var Er=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw i.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&z(t.value)))throw i.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&xo(t.values)))throw i.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&Co(t.values)))throw i.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&uo(t.values)))throw i.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&Do(t.values)))throw i.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(G).includes(t.parity)))throw i.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(N).includes(t.color)))throw i.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(H).includes(t.half)))throw i.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(l).includes(t.column)))throw i.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(j).includes(t.dozen)))throw i.createValidationError("Invalid dozen bet.")},z=(r)=>{return Ar.includes(r)},xo=(r)=>{if(r.length!==2)return!1;if(!r.every(z))return!1;return Hr.some(([t,o])=>t===r[0]&&o===r[1])},Co=(r)=>{if(r.length!==3)return!1;if(!r.every(z))return!1;return jr.some(([t,o,c])=>t===r[0]&&o===r[1]&&c===r[2])},uo=(r)=>{if(r.length!==4)return!1;if(!r.every(z))return!1;return mr.some(([t,o,c,a])=>t===r[0]&&o===r[1]&&c===r[2]&&a===r[3])},Do=(r)=>{if(r.length!==6)return!1;if(!r.every(z))return!1;return Mr.some(([t,o,c,a,A,E])=>t===r[0]&&o===r[1]&&c===r[2]&&a===r[3]&&A===r[4]&&E===r[5])};var fr=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.basketBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw i.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&J(t.value)))throw i.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&ho(t.values)))throw i.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&yo(t.values)))throw i.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&So(t.values)))throw i.createValidationError("Invalid corner bet.");if(!r.basketBets.every((t)=>t.amount.gte(0)))throw i.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&Zo(t.values)))throw i.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(G).includes(t.parity)))throw i.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(N).includes(t.color)))throw i.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(H).includes(t.half)))throw i.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(l).includes(t.column)))throw i.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(j).includes(t.dozen)))throw i.createValidationError("Invalid dozen bet.")},J=(r)=>{return Nr.includes(r)};function ho(r){if(r.length!==2)return!1;if(!r.every(J))return!1;return lr.some(([t,o])=>t===r[0]&&o===r[1])}var yo=(r)=>{if(r.length!==3)return!1;if(!r.every(J))return!1;return Ur.some(([t,o,c])=>t===r[0]&&o===r[1]&&c===r[2])},So=(r)=>{if(r.length!==4)return!1;if(!r.every(J))return!1;return br.some(([t,o,c,a])=>t===r[0]&&o===r[1]&&c===r[2]&&a===r[3])},Zo=(r)=>{if(r.length!==6)return!1;if(!r.every(J))return!1;return Pr.some(([t,o,c,a,A,E])=>t===r[0]&&o===r[1]&&c===r[2]&&a===r[3]&&A===r[4]&&E===r[5])};var mt={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},bt=[3,6,9,12,15,18,21,24,27,30,33,36],Vt=[2,5,8,11,14,17,20,23,26,29,32,35],Mt=[1,4,7,10,13,16,19,22,25,28,31,34],Pt=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],Ft=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],It=2.7,st=5.3;class Fr extends B{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:t}){this.validateInputs(t);let o=r.getRandomInt({min:0,max:this.maxNumber}),c=o.value,a=this.determineBetOutcomes(t,c),{payoutMultiplier:A}=this.getPayoutDetails(t,c);return{outputs:{betOutcomes:a,result:o.values},payoutMultiplier:A,isFinished:!0,randomValues:o}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,t){let o=this.determineBetOutcomes(r,t),c=this.getBetTotals(r),a=this.getBetTotals(o.winningBets),A=this.calculateTotalBetAmount(c),E=this.calculateTotalPayout(a);return{payoutMultiplier:A.gt(0)?E.div(A):new q.Big(0),payoutAmount:E}}determineBetOutcomes(r,t){let o={},c={};for(let a of Object.keys(r)){let A=r[a],E=this.betPredicates[a],{winning:d,losing:p}=this.partitionBets(A,E,t);o[a]=d,c[a]=p}return{winningBets:o,losingBets:c}}calculateTotalAmount(r){return r.reduce((t,o)=>t.plus(o.amount),new q.Big(0))}isWinningStraightBet(r,t){return r.value===t}isWinningSplitBet(r,t){return r.values.some((o)=>o===t)}isWinningStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningCornerBet(r,t){return r.values.some((o)=>o===t)}isWinningDoubleStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningColorBet(r,t){let o=r;return Pt.includes(t)&&o.color==="RED"||Ft.includes(t)&&o.color==="BLACK"}isWinningHalfBet(r,t){let o=r;if(t>0&&t<=18&&o.half==="LOW")return!0;if(t>18&&t<=36&&o.half==="HIGH")return!0;return!1}isWinningColumnBet(r,t){let o=r;return bt.includes(t)&&o.column==="TOP"||Vt.includes(t)&&o.column==="MIDDLE"||Mt.includes(t)&&o.column==="BOTTOM"}isWinningDozenBet(r,t){let o=r;if(t>0&&t<=12&&o.dozen==="FIRST")return!0;if(t>12&&t<=24&&o.dozen==="SECOND")return!0;if(t>24&&t<=36&&o.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,t){let o=r;if(t===0||t===37)return!1;let c=t%2===0?"EVEN":"ODD";return o.parity===c}getBetTotals(r){let t={};for(let o of Object.keys(r))t[o]=this.calculateTotalAmount(r[o]);return t}calculateTotalBetAmount(r){return Object.values(r).reduce((t,o)=>t.plus(o),new q.Big(0))}partitionBets(r,t,o){return{winning:r.filter((c)=>t(c,o)),losing:r.filter((c)=>!t(c,o))}}calculateTotalPayout(r){return Object.entries(r).reduce((t,[o,c])=>{let A=mt[o];return t.plus(c.mul(A||0))},new q.Big(0))}}class Ir extends Fr{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){Er(r)}}class sr extends Fr{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){fr(r)}isWinningBasketBet(r,t){return Vr.some((o)=>o===t)}}class Rr extends B{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new Ir,this.americanGame=new sr}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:t,...o}=r;if(r.edge===It&&t.type==="EUROPEAN"){let c=this.europeanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:a}=c.outputs;return{...c,outputs:{type:"european",betOutcomes:a,result:c.outputs.result}}}if(r.edge===st&&t.type==="AMERICAN"){let c=this.americanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:a}=c.outputs;return{...c,outputs:{type:"american",betOutcomes:a,result:c.outputs.result}}}throw i.createValidationError(`Attempted to play ${t.type} roulette on edge ${r.edge}`)}}var To=(r)=>{return new Rr().getBetAmount(r)};var _o=(r)=>{if(r.type==="EUROPEAN")Er(r.inputs);else fr(r.inputs)};var et=require("big.js");var m;((c)=>{c.LOW_RISK="LOW_RISK";c.MEDIUM_RISK="MEDIUM_RISK";c.HIGH_RISK="HIGH_RISK"})(m||={});var b;((A)=>{A[A.TEN=10]="TEN";A[A.TWENTY=20]="TWENTY";A[A.THIRTY=30]="THIRTY";A[A.FORTY=40]="FORTY";A[A.FIFTY=50]="FIFTY"})(b||={});var wo={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},Go={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},No={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},Ho={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},lo={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},Rt=new S(new Map([[1,wo],[2,Go],[3,No],[4,Ho],[8,lo]]));var Yt={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class $t extends B{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(!Object.values(b).includes(t.segments))throw new Error("Invalid segments value");if(!Object.values(m).includes(t.riskLevel))throw new Error("Invalid risk level");let a=Rt.getMultipliers(o)[t.riskLevel];if(a===void 0)throw new Error(`No multipliers found for risk level ${t.riskLevel}`);let A=a[t.segments];if(A===void 0)throw new Error(`No multipliers found for segment ${t.segments}`);let E=Yt[t.riskLevel];if(E===void 0)throw new Error(`No patterns found for risk level ${t.riskLevel}`);let d=E[t.segments];if(d===void 0)throw new Error(`No patterns found for segment ${t.segments}`);let p=r.getRandomInt({min:0,max:d.length-1}),O=d[p.value];if(O===void 0)throw new Error(`No pattern found for segment ${t.segments} and value ${p.value}`);let n=A[O];if(n===void 0)throw new Error(`No payout found for picked segment ${O}`);return{isFinished:!0,payoutMultiplier:new et.Big(n),outputs:{result:p.values},randomValues:p}}}
1
+ var kt=Object.create;var{getPrototypeOf:vt,defineProperty:V,getOwnPropertyNames:Xr,getOwnPropertyDescriptor:Kt}=Object,Qr=Object.prototype.hasOwnProperty;var y=(r,t,o)=>{o=r!=null?kt(vt(r)):{};let c=t||!r||!r.__esModule?V(o,"default",{value:r,enumerable:!0}):o;for(let a of Xr(r))if(!Qr.call(c,a))V(c,a,{get:()=>r[a],enumerable:!0});return c},qr=new WeakMap,gt=(r)=>{var t=qr.get(r),o;if(t)return t;if(t=V({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")Xr(r).map((c)=>!Qr.call(t,c)&&V(t,c,{get:()=>r[c],enumerable:!(o=Kt(r,c))||o.enumerable}));return qr.set(r,t),t};var ro=(r,t)=>{for(var o in t)V(r,o,{get:t[o],enumerable:!0,configurable:!0,set:(c)=>t[o]=()=>c})};var Vo={};ro(Vo,{validateRouletteGameInputs:()=>lo,validateAdvancedDiceInputs:()=>ao,rtp99Multipliers:()=>Ht,rtp98Multipliers:()=>lt,rtp97Multipliers:()=>jt,rtp96Multipliers:()=>mt,rtp92Multipliers:()=>Ut,plinkoMultipliers:()=>mr,nCr:()=>ir,kenoMultipliers:()=>Gr,isTileCount:()=>wr,hasDiceWon:()=>Nt,diamondsMultipliers:()=>St,calculateRouletteBetAmount:()=>Ho,calculateMultiplier:()=>b,calculateDiceWinChance:()=>Tt,calculateBaccaratBetAmount:()=>it,calculateAdvancedDiceWinChance:()=>Or,bigMin:()=>lr,bigMax:()=>Hr,advancedDiceIsWithinBoundsInclusive:()=>Kr,advancedDiceIsWithinBoundsExclusive:()=>k,advancedDiceGetInclusiveBoundsRange:()=>gr,advancedDiceGetExclusiveBoundsRange:()=>v,WheelSegments:()=>e,WheelRiskLevel:()=>U,Wheel:()=>Lt,VALID_SUITS:()=>ot,VALID_RANKS:()=>ct,VALID_EUROPEAN_STREETS:()=>Vr,VALID_EUROPEAN_STRAIGHTS:()=>Er,VALID_EUROPEAN_SPLITS:()=>er,VALID_EUROPEAN_DOUBLE_STREETS:()=>Rr,VALID_EUROPEAN_CORNERS:()=>sr,VALID_AMERICAN_STREETS:()=>br,VALID_AMERICAN_STRAIGHTS:()=>Ur,VALID_AMERICAN_SPLITS:()=>Mr,VALID_AMERICAN_DOUBLE_STREETS:()=>Ir,VALID_AMERICAN_CORNERS:()=>Pr,TOP_COLUMN:()=>Rt,TILE_COUNTS:()=>Gt,RouletteType:()=>dr,Roulette:()=>Jr,RollType:()=>rt,RED_NUMBERS:()=>$t,RANDOM_MIN_VALUE:()=>K,RANDOM_MAX_VALUE:()=>g,PlinkoRiskLevel:()=>jr,Plinko:()=>Pt,Parity:()=>w,PLINKO_ROW_COUNTS:()=>Oo,PAYOUT_MULTIPLIERS:()=>Ft,OrigamiGame:()=>C,Mines:()=>bt,MIN_WIN_CHANCE:()=>kr,MIDDLE_COLUMN:()=>It,MAX_WIN_CHANCE:()=>vr,Limbo:()=>Vt,KenoRiskLevel:()=>Nr,Keno:()=>Mt,Half:()=>H,GameErrorCode:()=>Wr,GameError:()=>i,Game:()=>B,EuropeanRoulette:()=>$r,EUROPEAN_HOUSE_EDGE:()=>Jt,EFFECTIVE_RANGE:()=>Br,Dozen:()=>j,DiceDirection:()=>_t,Dice:()=>wt,DiamondsResultType:()=>yt,Diamonds:()=>Zt,DICE_EFFECTIVE_RANGE:()=>_r,Column:()=>l,Color:()=>G,BlackjackOutcome:()=>R,BlackjackHand:()=>T,BlackjackAction:()=>I,Blackjack:()=>Zr,BaccaratOutcome:()=>at,BaccaratBetType:()=>At,Baccarat:()=>Et,BOTTOM_COLUMN:()=>Yt,BLACK_NUMBERS:()=>zt,AmericanRoulette:()=>zr,AdvancedDice:()=>tt,AMERICAN_HOUSE_EDGE:()=>qt,AMERICAN_BASKET:()=>Fr});module.exports=gt(Vo);var C;((d)=>{d.DICE="DICE";d.MINES="MINES";d.KENO="KENO";d.LIMBO="LIMBO";d.ADVANCED_DICE="ADVANCED_DICE";d.BACCARAT="BACCARAT";d.DIAMONDS="DIAMONDS";d.PLINKO="PLINKO";d.ROULETTE="ROULETTE";d.WHEEL="WHEEL";d.BLACKJACK="BLACKJACK"})(C||={});class B{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}var nr=require("big.js");var Wr;((t)=>t.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Wr||={});class i extends Error{static createValidationError(r){return new i("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof i}errorCode;constructor(r,t){super(t);this.errorCode=r}}var Lr=y(require("big.js")),b=(r,t)=>{return Lr.default(100-r).div(t)};var K=0,g=1e4,Br=10001,kr=0.01,vr=98,to=(r)=>{if(r<K)throw i.createValidationError(`Lower bound ${r} is below minimum allowed value ${K}`)},oo=(r)=>{if(r>g)throw i.createValidationError(`Upper bound ${r} is above maximum allowed value ${g}`)},L=(r)=>{if(to(r.lower),oo(r.upper),r.lower>=r.upper)throw i.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},co=(r,t)=>{let[o,c]=r.lower<=t.lower?[r,t]:[t,r];if(o.upper>c.lower)throw i.createValidationError("Bounds must not overlap")},Kr=(r,t)=>t>=r.lower&&t<=r.upper,gr=(r)=>r.upper-r.lower+1,k=(r,t)=>t>r.lower&&t<r.upper,v=(r)=>r.upper-r.lower-1,rt;((c)=>{c.ROLL_BETWEEN="ROLL_BETWEEN";c.ROLL_OUTSIDE="ROLL_OUTSIDE";c.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(rt||={});var Or=(r)=>{let o=(()=>{switch(r.mode){case"ROLL_BETWEEN":return L(r.bounds),v(r.bounds);case"ROLL_OUTSIDE":return L(r.bounds),Br-gr(r.bounds);case"ROLL_BETWEEN_TWO":return L(r.firstBounds),L(r.secondBounds),co(r.firstBounds,r.secondBounds),v(r.firstBounds)+v(r.secondBounds)}})(),c=nr.Big(o).div(Br).mul(100);if(c.lt(kr))throw i.createValidationError("Win chance too low");if(c.gt(vr))throw i.createValidationError("Win chance too high");return c},ao=(r)=>{Or(r)};class tt extends B{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let c=Or(o),a=r.getRandomInt({min:K,max:g}),A=a.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return k(o.bounds,A);case"ROLL_OUTSIDE":return!Kr(o.bounds,A);case"ROLL_BETWEEN_TWO":return k(o.firstBounds,A)||k(o.secondBounds,A)}})()?b(t,c):new nr.Big(0),outputs:{result:a.values},randomValues:a}}}var _=y(require("big.js"));var ot=["Clubs","Diamonds","Hearts","Spades"],ct=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],at;((c)=>{c.PLAYER_WIN="PLAYER_WIN";c.TIE="TIE";c.BANKER_WIN="BANKER_WIN"})(at||={});var At;((c)=>{c.PLAYER="PLAYER";c.TIE="TIE";c.BANKER="BANKER"})(At||={});var Ao={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},it=(r)=>{return new _.default(0).add(r.bets.reduce((o,c)=>o.add(c.amount),new _.default(0)))};class Et extends B{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(t);let c=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),a=c.values,A=a.slice(0,3),E=a.slice(3,6),f=[],p=0;for(let x of A.slice(0,2)){let D=this.mapRandomValueToCard(x),W=this.mapRandomValueToCardValue(x);f.push(D),p=(p+W)%10}let n=[],O=0;for(let x of E.slice(0,2)){let D=this.mapRandomValueToCard(x),W=this.mapRandomValueToCardValue(x);n.push(D),O=(O+W)%10}if(!this.isNaturalWin(p,O)){let x=this.shouldDrawThirdPlayerCard(p),D=null;if(x)D=this.mapRandomValueToCardValue(A[2]),f.push(this.mapRandomValueToCard(A[2])),p=(p+D)%10;if(this.shouldDrawThirdBankerCard(O,D))n.push(this.mapRandomValueToCard(E[2])),O=(O+this.mapRandomValueToCardValue(E[2]))%10}let d;if(p===O)d="TIE";else d=p>O?"PLAYER_WIN":"BANKER_WIN";let u=it(t),{betType:m,multiplier:Q}=Ao[d],M=new _.default(0);if(M=M.add(t.bets.filter((x)=>x.type===m).reduce((x,D)=>x.add(D.amount.mul(Q)),new _.default(0))),d==="TIE")M=M.add(t.bets.filter((x)=>x.type==="PLAYER"||x.type==="BANKER").reduce((x,D)=>x.add(D.amount),new _.default(0)));return{isFinished:!0,payoutMultiplier:u.gt(0)?M.div(u):new _.default(0),outputs:{playerCards:f,playerHandValue:p,bankerCards:n,bankerHandValue:O,gameOutcome:d,result:c.values},randomValues:c}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((t)=>t.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let t=ot[Math.floor(r/13)],o=ct[r%13];return{suit:t,rank:o}}isNaturalWin(r,t){let o=[8,9];return o.includes(r)||o.includes(t)}mapRandomValueToCardValue(r){let t=r%13;if(t===0)return 1;if(t>=10)return 10;return t+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,t){if(t===null)return r<=5;if(r<=2)return!0;if(r===3)return t!==8;if(r===4)return[2,3,4,5,6,7].includes(t);if(r===5)return[4,5,6,7].includes(t);if(r===6)return[6,7].includes(t);return!1}}var Sr=y(require("big.js")),Ar=require("@betorigami/guard");var ar=require("@betorigami/guard");var or=require("@betorigami/guard");var xr=0,ur=51,rr=Array.from({length:52},(r,t)=>t),dt=["Spades","Hearts","Diamonds","Clubs"],tr=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],ft=["Jack","Queen","King"];class Cr{value;constructor(r){let t=rr[r];or.Guard.againstNullOrUndefined(t,`Invalid card value: ${r}`),this.value=t}get suit(){let r=Math.floor(this.value/13),t=dt[r];return or.Guard.againstNullOrUndefined(t,`Invalid suit index: ${r}`),t}get rank(){let r=this.value%13,t=tr[r];return or.Guard.againstNullOrUndefined(t,`Invalid rank index: ${r}`),t}serialise(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}var pt=2.5,Bt=2,nt=1,Ot=0,xt=17,cr=21;var ut=63;var Dr=10,Ct=10;class S extends Cr{get numericRank(){if(ft.includes(this.rank))return Ct;return tr.indexOf(this.rank)+1}static fromValue(r){if(rr.includes(r))return new S(r);throw new Error(`Invalid card value: ${r}`)}}class s{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((o,c)=>o+c.numericRank,0),r.some((o)=>o.rank==="Ace")&&this.hardHandValue+Dr<=cr)this.softHandValue=this.hardHandValue+Dr}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>cr}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===cr}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}serialise(){return this.cards.map((r)=>r.serialise())}}class T{cards;value;constructor(r){this.cards=r.map((t)=>S.fromValue(t)),this.value=new s(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.serialise()),value:this.highestHandValue}}}class P extends T{otherCards;upCard;holeCard;constructor(r,t,o=[]){super([r,t,...o]);this.otherCards=o;this.upCard=S.fromValue(r),this.holeCard=S.fromValue(t)}static withInitialDeal(r){return new P(r.upCard,r.holeCard)}addDrawnCards(r){return new P(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.serialise()],value:new s([this.upCard]).highestHandValue}}}class F extends T{static withInitialDeal(r){return new F(r)}addDrawnCards(r){return new F([...this.rawValues,...r])}}var R;((a)=>{a.WIN="WIN";a.LOSE="LOSE";a.PUSH="PUSH";a.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(R||={});var I;((c)=>{c.START="START";c.HIT="HIT";c.STAND="STAND"})(I||={});class h{deck;playerHand;dealerHand;outcome;constructor(r,t,o,c){this.deck=r;this.playerHand=t;this.dealerHand=o;this.outcome=c}get isFinished(){return this.outcome!==null}toDto(){return{playerHand:this.playerHand.toDto(),dealerHand:this.dealerHand.toDto(this.isFinished),outcome:this.outcome}}static start(r){let t=r.drawCard(),o=r.drawCard(),c=r.drawCard(),a=r.drawCard(),A=F.withInitialDeal([t.value,o.value]),E=P.withInitialDeal({upCard:c.value,holeCard:a.value}),f=A.isBlackjack,p=E.isBlackjack,n=null;if(f&&p)n="PUSH";else if(f)n="PLAYER_BLACKJACK";else if(p)n="LOSE";return new h(r,A,E,n)}applyAction(r){switch(r){case"HIT":return this.hit();case"STAND":return this.stand();case"START":throw new Error("START cannot be applied to an existing state.");default:throw ar.Guard.againstNever(r,`Unknown action: ${r}`),new Error(`Unknown action: ${r}`)}}hit(){ar.Guard.against(this.isFinished,"Cannot hit on a finished game.");let r=this.deck.drawCard(),t=this.playerHand.addDrawnCards([r.value]);if(t.isBusted)return new h(this.deck,t,this.dealerHand,"LOSE");if(t.highestHandValue===21)return new h(this.deck,t,this.dealerHand,null).stand();return new h(this.deck,t,this.dealerHand,null)}stand(){ar.Guard.against(this.isFinished,"Cannot stand on a finished game.");let r=this.playDealerHand(),t=h.calculateOutcome(this.playerHand,r);return new h(this.deck,this.playerHand,r,t)}static calculateOutcome(r,t){if(r.isBusted)return"LOSE";if(t.isBusted)return"WIN";let o=r.highestHandValue,c=t.highestHandValue;if(o>c)return"WIN";if(o<c)return"LOSE";return"PUSH"}playDealerHand(){let r=this.dealerHand;while(r.highestHandValue<xt){let t=this.deck.drawCard();r=r.addDrawnCards([t.value])}return r}}var Dt=require("@betorigami/guard");class hr{values;proofHash;proofString;index=0;constructor(r){let t=r.getRandomIntsWithReplacement({min:xr,max:ur,count:ut});this.values=t.values.map((o)=>new S(o)),this.proofHash=t.proofHash,this.proofString=t.proofString}drawCard(){return Dt.Guard.against(this.index>=this.values.length,"Card drawer exhausted - pre-drawn values depleted"),this.values[this.index++]}getConsumedRandomValues(){return{values:this.values.slice(0,this.index).map((r)=>r.value),count:this.index,min:xr,max:ur,proofHash:this.proofHash,proofString:this.proofString}}}var Y=y(require("big.js"));var yr={PLAYER_BLACKJACK:Y.default(pt),WIN:Y.default(Bt),PUSH:Y.default(nt),LOSE:Y.default(Ot)};class Zr extends B{constructor(){super("BLACKJACK")}determineGameResult({generator:r,gameInputs:t}){let{previousActions:o,nextAction:c}=t,a=new hr(r);if(c==="START"){Ar.Guard.against(o.length>0,"START action requires previousActions to be empty.");let d=h.start(a),u=d.isFinished,m=d.outcome!==null?yr[d.outcome]:Sr.default(0),Q=a.getConsumedRandomValues();return{isFinished:u,payoutMultiplier:m,outputs:{action:c,state:d.toDto(),result:u?Q.values:[]},randomValues:Q}}Ar.Guard.against(o[0]!=="START","previousActions must start with START.");let E=o.slice(1).reduce((d,u)=>d.applyAction(u),h.start(a));Ar.Guard.against(E.isFinished,`Cannot process action "${c}" on a finished game with outcome "${E.outcome}".`);let f=E.applyAction(c),p=f.isFinished,n=f.outcome!==null?yr[f.outcome]:Sr.default(0),O=a.getConsumedRandomValues();return{isFinished:p,payoutMultiplier:n,outputs:{action:c,state:f.toDto(),result:p?O.values:[]},randomValues:O}}}var ht=y(require("big.js"));class Z{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let t=this.multipliers.get(r);if(t===void 0)throw new Error(`Multipliers for ${r} not found`);return t}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,t])=>({edge:r,multipliers:t}))}}var yt;((E)=>{E.PAIR="PAIR";E.TWO_PAIR="TWO_PAIR";E.THREE_OF_A_KIND="THREE_OF_A_KIND";E.FULL_HOUSE="FULL_HOUSE";E.FOUR_OF_A_KIND="FOUR_OF_A_KIND";E.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(yt||={});var io={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},Eo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},fo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},po={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},Bo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},St=new Z(new Map([[1,io],[2,Eo],[3,fo],[4,po],[8,Bo]])),no={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Zt extends B{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:t}){let o=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),c=St.getMultipliers(t),a=o.values,A=this.calculatePayoutMultiplier(c,a);return{isFinished:!0,payoutMultiplier:ht.default(A),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(r,t){let o=new Map;for(let A of t){let E=o.get(A)||0;o.set(A,E+1)}let c=[...o.values()].filter((A)=>A>1),a=this.classifyResult(c);return a===null?0:r[a]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[t,o]=r;if(t===void 0)return null;if(o===void 0){let c=no[t];if(c===void 0)throw new Error(`Unexpected single diamond repeat count: ${t}`);return c}return t===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}var Tr=y(require("big.js"));var _t;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(_t||={});var _r=1e4,Tt=(r)=>{let t=r.direction==="ABOVE"?_r-r.selectedValue:r.selectedValue;return new Tr.default(t).div(_r).mul(100)},Nt=(r,t)=>r.direction==="ABOVE"?t>r.selectedValue:t<r.selectedValue;class wt extends B{constructor(){super("DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let c=r.getRandomInt({min:0,max:1e4}),a=Tt(o);return{isFinished:!0,payoutMultiplier:Nt(o,c.value)?b(t,a):new Tr.default(0),outputs:{result:c.values},randomValues:c}}}var et=y(require("big.js"));var $=require("@betorigami/guard");var Nr;((a)=>{a.CLASSIC="CLASSIC";a.LOW_RISK="LOW_RISK";a.MEDIUM_RISK="MEDIUM_RISK";a.HIGH_RISK="HIGH_RISK"})(Nr||={});var Gt=[1,2,3,4,5,6,7,8,9,10],wr=(r)=>{return Gt.includes(r)};var Ht={[1]:{CLASSIC:[0,3.96],LOW_RISK:[0.7,1.85],MEDIUM_RISK:[0.4,2.75],HIGH_RISK:[0,3.96]},[2]:{CLASSIC:[0,1.9,4.5],LOW_RISK:[0,2,3.8],MEDIUM_RISK:[0,1.8,5.1],HIGH_RISK:[0,0,17.1]},[3]:{CLASSIC:[0,1,3.1,10.4],LOW_RISK:[0,1.1,1.38,26],MEDIUM_RISK:[0,0,2.8,50],HIGH_RISK:[0,0,0,81.5]},[4]:{CLASSIC:[0,0.8,1.8,5,22.5],LOW_RISK:[0,0,2.2,7.9,90],MEDIUM_RISK:[0,0,1.7,10,100],HIGH_RISK:[0,0,0,10,259]},[5]:{CLASSIC:[0,0.25,1.4,4.1,16.5,36],LOW_RISK:[0,0,1.5,4.2,13,300],MEDIUM_RISK:[0,0,1.4,4,14,390],HIGH_RISK:[0,0,0,4.5,48,450]},[6]:{CLASSIC:[0,0,1,3.68,7,16.5,40],LOW_RISK:[0,0,1.1,2,6.2,100,700],MEDIUM_RISK:[0,0,0,3,9,180,710],HIGH_RISK:[0,0,0,0,11,350,710]},[7]:{CLASSIC:[0,0,0.47,3,4.5,14,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,15,225,700],MEDIUM_RISK:[0,0,0,2,7,30,400,800],HIGH_RISK:[0,0,0,0,7,90,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,13,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,5.5,39,100,800],MEDIUM_RISK:[0,0,0,2,4,11,67,400,900],HIGH_RISK:[0,0,0,0,5,20,270,600,900]},[9]:{CLASSIC:[0,0,0,1.55,3,8,15,44,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,5,15,100,500,1000],HIGH_RISK:[0,0,0,0,4,11,56,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,4,7,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,8,13,63,500,800,1000]}},lt={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},jt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},mt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},Ut={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},Gr=new Z(new Map([[1,Ht],[2,lt],[3,jt],[4,mt],[8,Ut]]));class Mt extends B{constructor(){super("KENO")}determineGameResult({generator:r,edge:t,gameInputs:o}){$.Guard.againstEmptyArray(o.selectedNumbers,()=>i.createValidationError("No numbers selected")),$.Guard.against(o.selectedNumbers.length>10,()=>i.createValidationError("Maximum of 10 numbers can be selected"));for(let d of o.selectedNumbers)$.Guard.againstNonInteger(d,()=>i.createValidationError("Only integers can be selected")),$.Guard.against(d<0||d>39,()=>i.createValidationError("Invalid number selected"));let c=r.getUniqueRandomInts({min:0,max:39,count:10}),a=o.selectedNumbers.filter((d)=>c.values.includes(d)),A=o.selectedNumbers.length;if(!wr(A))throw new Error(`Invalid tile count: ${A}`);let n=Gr.getMultipliers(t)[A][o.riskLevel][a.length];if(n===void 0)throw new Error(`No multiplier found for matching tile count ${a.length}`);return{isFinished:!0,payoutMultiplier:new et.default(n),outputs:{result:c.values},randomValues:c}}}var N=y(require("big.js"));var Hr=(r,t)=>{return r.gt(t)?r:t};var lr=(r,t)=>{return r.lt(t)?r:t};class Vt extends B{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:t,gameInputs:o}){let c=r.getRandomInt({min:1,max:4294967295}),a=c.max,A=new N.default(16777216),E=new N.default(1),f=new N.default(1e6),p=c.value,n=new N.default(p-1).div(a),O=(100-t)/100,d=A.div(n.mul(A).plus(1)).mul(O),u=Hr(E,lr(d,f));return{isFinished:!0,payoutMultiplier:u.gte(o.targetMultiplier)?new N.default(o.targetMultiplier):new N.default(0),outputs:{randomMultiplier:u,result:c.values},randomValues:c}}}var z=y(require("big.js"));var ir=(r,t)=>{if(t<0||r<0||t>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(t>r-t)t=r-t;let o=1;for(let c=1;c<=t;c++)o=o*(r-c+1)/c;return o};class bt extends B{constructor(){super("MINES")}determineGameResult({generator:r,edge:t,gameInputs:o}){if(o.minesCount<=0||o.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(o.selectedTiles.length>25-o.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let E=r.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),f=E.values.some((m)=>o.selectedTiles.includes(m)),p=o.hasCashedOut||f,n=(100-t)/100,O=new z.default(ir(25-o.minesCount,o.selectedTiles.length)).div(new z.default(ir(25,o.selectedTiles.length))),u=o.hasCashedOut&&!f?new z.default(n).div(O):new z.default(0);return{isFinished:p,payoutMultiplier:u,outputs:{result:E.values},randomValues:E}}}var st=require("big.js");var jr;((c)=>{c.LOW_RISK="LOW_RISK";c.MEDIUM_RISK="MEDIUM_RISK";c.HIGH_RISK="HIGH_RISK"})(jr||={});var Oo=[8,9,10,11,12,13,14,15,16],xo={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16]},MEDIUM_RISK:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},uo={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},Co={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},Do={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},ho={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},mr=new Z(new Map([[1,xo],[2,uo],[3,Co],[4,Do],[8,ho]]));class Pt extends B{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(t.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(t.numberOfRows<8||t.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let c=t.numberOfRows,E=mr.getMultipliers(o)[t.riskLevel][c],f=r.getRandomIntsWithReplacement({min:0,max:1,count:t.numberOfRows}),n=f.values.reduce((d,u)=>d+u,0),O=E[n];if(O===void 0)throw new Error(`No payout found for end position ${n}`);return{isFinished:!0,payoutMultiplier:st.Big(O),outputs:{result:f.values},randomValues:f}}}var X=require("big.js");var Er=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],Ur=[37,...Er],er=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Mr=[[0,1],[0,37],[3,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Vr=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],br=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],sr=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],Pr=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],Fr=[0,1,2,3,37],Rr=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],Ir=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],w;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(w||={});var G;((o)=>{o.RED="RED";o.BLACK="BLACK"})(G||={});var H;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(H||={});var l;((c)=>{c.TOP="TOP";c.MIDDLE="MIDDLE";c.BOTTOM="BOTTOM"})(l||={});var j;((c)=>{c.FIRST="FIRST";c.SECOND="SECOND";c.THIRD="THIRD"})(j||={});var dr;((o)=>{o.AMERICAN="AMERICAN";o.EUROPEAN="EUROPEAN"})(dr||={});var fr=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw i.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&J(t.value)))throw i.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&yo(t.values)))throw i.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&So(t.values)))throw i.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&Zo(t.values)))throw i.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&_o(t.values)))throw i.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(w).includes(t.parity)))throw i.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(G).includes(t.color)))throw i.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(H).includes(t.half)))throw i.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(l).includes(t.column)))throw i.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(j).includes(t.dozen)))throw i.createValidationError("Invalid dozen bet.")},J=(r)=>{return Er.includes(r)},yo=(r)=>{if(r.length!==2)return!1;if(!r.every(J))return!1;return er.some(([t,o])=>t===r[0]&&o===r[1])},So=(r)=>{if(r.length!==3)return!1;if(!r.every(J))return!1;return Vr.some(([t,o,c])=>t===r[0]&&o===r[1]&&c===r[2])},Zo=(r)=>{if(r.length!==4)return!1;if(!r.every(J))return!1;return sr.some(([t,o,c,a])=>t===r[0]&&o===r[1]&&c===r[2]&&a===r[3])},_o=(r)=>{if(r.length!==6)return!1;if(!r.every(J))return!1;return Rr.some(([t,o,c,a,A,E])=>t===r[0]&&o===r[1]&&c===r[2]&&a===r[3]&&A===r[4]&&E===r[5])};var pr=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.basketBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw i.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&q(t.value)))throw i.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&To(t.values)))throw i.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&No(t.values)))throw i.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&wo(t.values)))throw i.createValidationError("Invalid corner bet.");if(!r.basketBets.every((t)=>t.amount.gte(0)))throw i.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&Go(t.values)))throw i.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(w).includes(t.parity)))throw i.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(G).includes(t.color)))throw i.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(H).includes(t.half)))throw i.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(l).includes(t.column)))throw i.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(j).includes(t.dozen)))throw i.createValidationError("Invalid dozen bet.")},q=(r)=>{return Ur.includes(r)};function To(r){if(r.length!==2)return!1;if(!r.every(q))return!1;return Mr.some(([t,o])=>t===r[0]&&o===r[1])}var No=(r)=>{if(r.length!==3)return!1;if(!r.every(q))return!1;return br.some(([t,o,c])=>t===r[0]&&o===r[1]&&c===r[2])},wo=(r)=>{if(r.length!==4)return!1;if(!r.every(q))return!1;return Pr.some(([t,o,c,a])=>t===r[0]&&o===r[1]&&c===r[2]&&a===r[3])},Go=(r)=>{if(r.length!==6)return!1;if(!r.every(q))return!1;return Ir.some(([t,o,c,a,A,E])=>t===r[0]&&o===r[1]&&c===r[2]&&a===r[3]&&A===r[4]&&E===r[5])};var Ft={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},Rt=[3,6,9,12,15,18,21,24,27,30,33,36],It=[2,5,8,11,14,17,20,23,26,29,32,35],Yt=[1,4,7,10,13,16,19,22,25,28,31,34],$t=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],zt=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],Jt=2.7,qt=5.3;class Yr extends B{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:t}){this.validateInputs(t);let o=r.getRandomInt({min:0,max:this.maxNumber}),c=o.value,a=this.determineBetOutcomes(t,c),{payoutMultiplier:A}=this.getPayoutDetails(t,c);return{outputs:{betOutcomes:a,result:o.values},payoutMultiplier:A,isFinished:!0,randomValues:o}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,t){let o=this.determineBetOutcomes(r,t),c=this.getBetTotals(r),a=this.getBetTotals(o.winningBets),A=this.calculateTotalBetAmount(c),E=this.calculateTotalPayout(a);return{payoutMultiplier:A.gt(0)?E.div(A):new X.Big(0),payoutAmount:E}}determineBetOutcomes(r,t){let o={},c={};for(let a of Object.keys(r)){let A=r[a],E=this.betPredicates[a],{winning:f,losing:p}=this.partitionBets(A,E,t);o[a]=f,c[a]=p}return{winningBets:o,losingBets:c}}calculateTotalAmount(r){return r.reduce((t,o)=>t.plus(o.amount),new X.Big(0))}isWinningStraightBet(r,t){return r.value===t}isWinningSplitBet(r,t){return r.values.some((o)=>o===t)}isWinningStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningCornerBet(r,t){return r.values.some((o)=>o===t)}isWinningDoubleStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningColorBet(r,t){let o=r;return $t.includes(t)&&o.color==="RED"||zt.includes(t)&&o.color==="BLACK"}isWinningHalfBet(r,t){let o=r;if(t>0&&t<=18&&o.half==="LOW")return!0;if(t>18&&t<=36&&o.half==="HIGH")return!0;return!1}isWinningColumnBet(r,t){let o=r;return Rt.includes(t)&&o.column==="TOP"||It.includes(t)&&o.column==="MIDDLE"||Yt.includes(t)&&o.column==="BOTTOM"}isWinningDozenBet(r,t){let o=r;if(t>0&&t<=12&&o.dozen==="FIRST")return!0;if(t>12&&t<=24&&o.dozen==="SECOND")return!0;if(t>24&&t<=36&&o.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,t){let o=r;if(t===0||t===37)return!1;let c=t%2===0?"EVEN":"ODD";return o.parity===c}getBetTotals(r){let t={};for(let o of Object.keys(r))t[o]=this.calculateTotalAmount(r[o]);return t}calculateTotalBetAmount(r){return Object.values(r).reduce((t,o)=>t.plus(o),new X.Big(0))}partitionBets(r,t,o){return{winning:r.filter((c)=>t(c,o)),losing:r.filter((c)=>!t(c,o))}}calculateTotalPayout(r){return Object.entries(r).reduce((t,[o,c])=>{let A=Ft[o];return t.plus(c.mul(A||0))},new X.Big(0))}}class $r extends Yr{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){fr(r)}}class zr extends Yr{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){pr(r)}isWinningBasketBet(r,t){return Fr.some((o)=>o===t)}}class Jr extends B{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new $r,this.americanGame=new zr}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:t,...o}=r;if(r.edge===Jt&&t.type==="EUROPEAN"){let c=this.europeanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:a}=c.outputs;return{...c,outputs:{type:"european",betOutcomes:a,result:c.outputs.result}}}if(r.edge===qt&&t.type==="AMERICAN"){let c=this.americanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:a}=c.outputs;return{...c,outputs:{type:"american",betOutcomes:a,result:c.outputs.result}}}throw i.createValidationError(`Attempted to play ${t.type} roulette on edge ${r.edge}`)}}var Ho=(r)=>{return new Jr().getBetAmount(r)};var lo=(r)=>{if(r.type==="EUROPEAN")fr(r.inputs);else pr(r.inputs)};var Wt=require("big.js");var U;((c)=>{c.LOW_RISK="LOW_RISK";c.MEDIUM_RISK="MEDIUM_RISK";c.HIGH_RISK="HIGH_RISK"})(U||={});var e;((A)=>{A[A.TEN=10]="TEN";A[A.TWENTY=20]="TWENTY";A[A.THIRTY=30]="THIRTY";A[A.FORTY=40]="FORTY";A[A.FIFTY=50]="FIFTY"})(e||={});var jo={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},mo={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},Uo={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},eo={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},Mo={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},Xt=new Z(new Map([[1,jo],[2,mo],[3,Uo],[4,eo],[8,Mo]]));var Qt={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class Lt extends B{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(!Object.values(e).includes(t.segments))throw new Error("Invalid segments value");if(!Object.values(U).includes(t.riskLevel))throw new Error("Invalid risk level");let a=Xt.getMultipliers(o)[t.riskLevel];if(a===void 0)throw new Error(`No multipliers found for risk level ${t.riskLevel}`);let A=a[t.segments];if(A===void 0)throw new Error(`No multipliers found for segment ${t.segments}`);let E=Qt[t.riskLevel];if(E===void 0)throw new Error(`No patterns found for risk level ${t.riskLevel}`);let f=E[t.segments];if(f===void 0)throw new Error(`No patterns found for segment ${t.segments}`);let p=r.getRandomInt({min:0,max:f.length-1}),n=f[p.value];if(n===void 0)throw new Error(`No pattern found for segment ${t.segments} and value ${p.value}`);let O=A[n];if(O===void 0)throw new Error(`No payout found for picked segment ${n}`);return{isFinished:!0,payoutMultiplier:new Wt.Big(O),outputs:{result:p.values},randomValues:p}}}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  // Generated by dts-bundle-generator v9.5.1
2
2
 
3
3
  import Big$1 from 'big.js';
4
- import { Big as Big$1, Big as Big$2 } from 'big.js';
4
+ import { Big as Big$1, Big as Big$2, Big as Big$3 } from 'big.js';
5
5
 
6
6
  export type Proof = {
7
7
  proofHash: string;
@@ -78,6 +78,10 @@ export declare const RANDOM_MAX_VALUE = 10000;
78
78
  export declare const EFFECTIVE_RANGE = 10001;
79
79
  export declare const MIN_WIN_CHANCE = 0.01;
80
80
  export declare const MAX_WIN_CHANCE = 98;
81
+ export declare const advancedDiceIsWithinBoundsInclusive: (bounds: Bounds, result: number) => boolean;
82
+ export declare const advancedDiceGetInclusiveBoundsRange: (bounds: Bounds) => number;
83
+ export declare const advancedDiceIsWithinBoundsExclusive: (bounds: Bounds, result: number) => boolean;
84
+ export declare const advancedDiceGetExclusiveBoundsRange: (bounds: Bounds) => number;
81
85
  export declare enum RollType {
82
86
  ROLL_BETWEEN = "ROLL_BETWEEN",
83
87
  ROLL_OUTSIDE = "ROLL_OUTSIDE",
@@ -97,6 +101,7 @@ export type RollBetweenTwo = {
97
101
  secondBounds: Bounds;
98
102
  };
99
103
  export type AdvancedDiceInputs = RollBetween | RollOutside | RollBetweenTwo;
104
+ export declare const calculateAdvancedDiceWinChance: (gameInputs: AdvancedDiceInputs) => Big$1.Big;
100
105
  export declare const validateAdvancedDiceInputs: (gameInputs: AdvancedDiceInputs) => void;
101
106
  export declare class AdvancedDice extends Game<AdvancedDiceInputs> {
102
107
  constructor();
@@ -296,6 +301,9 @@ export interface DiceGameInputs {
296
301
  direction: DiceDirection;
297
302
  selectedValue: number;
298
303
  }
304
+ export declare const DICE_EFFECTIVE_RANGE = 10000;
305
+ export declare const calculateDiceWinChance: (gameInputs: DiceGameInputs) => Big$1;
306
+ export declare const hasDiceWon: (gameInputs: DiceGameInputs, rolledValue: number) => boolean;
299
307
  export declare class Dice extends Game<DiceGameInputs> {
300
308
  constructor();
301
309
  protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<DiceGameInputs>): GameResult;
@@ -1806,5 +1814,9 @@ export declare class GameError extends Error {
1806
1814
  errorCode: GameErrorCode;
1807
1815
  constructor(errorCode: GameErrorCode, message?: string);
1808
1816
  }
1817
+ export declare const bigMin: (a: Big$1, b: Big$1) => Big$1;
1818
+ export declare const bigMax: (a: Big$1, b: Big$1) => Big$1;
1819
+ export declare const calculateMultiplier: (edge: number, winChance: Big$1) => Big$1.Big;
1820
+ export declare const nCr: (n: number, r: number) => number;
1809
1821
 
1810
1822
  export {};
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var u;((f)=>{f.DICE="DICE";f.MINES="MINES";f.KENO="KENO";f.LIMBO="LIMBO";f.ADVANCED_DICE="ADVANCED_DICE";f.BACCARAT="BACCARAT";f.DIAMONDS="DIAMONDS";f.PLINKO="PLINKO";f.ROULETTE="ROULETTE";f.WHEEL="WHEEL";f.BLACKJACK="BLACKJACK"})(u||={});class n{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}import{Big as rr}from"big.js";var Kr;((t)=>t.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Kr||={});class E extends Error{static createValidationError(r){return new E("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof E}errorCode;constructor(r,t){super(t);this.errorCode=r}}var tr=0,or=1e4,Dr=10001,gr=0.01,rt=98,tt=(r)=>{if(r<tr)throw E.createValidationError(`Lower bound ${r} is below minimum allowed value ${tr}`)},ot=(r)=>{if(r>or)throw E.createValidationError(`Upper bound ${r} is above maximum allowed value ${or}`)},Y=(r)=>{if(tt(r.lower),ot(r.upper),r.lower>=r.upper)throw E.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},ct=(r,t)=>{let[o,c]=r.lower<=t.lower?[r,t]:[t,r];if(o.upper>c.lower)throw E.createValidationError("Bounds must not overlap")},at=(r,t)=>t>=r.lower&&t<=r.upper,At=(r)=>r.upper-r.lower+1,K=(r,t)=>t>r.lower&&t<r.upper,g=(r)=>r.upper-r.lower-1,it;((c)=>{c.ROLL_BETWEEN="ROLL_BETWEEN";c.ROLL_OUTSIDE="ROLL_OUTSIDE";c.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(it||={});var hr=(r)=>{let o=(()=>{switch(r.mode){case"ROLL_BETWEEN":return Y(r.bounds),g(r.bounds);case"ROLL_OUTSIDE":return Y(r.bounds),Dr-At(r.bounds);case"ROLL_BETWEEN_TWO":return Y(r.firstBounds),Y(r.secondBounds),ct(r.firstBounds,r.secondBounds),g(r.firstBounds)+g(r.secondBounds)}})(),c=rr(o).div(Dr).mul(100);if(c.lt(gr))throw E.createValidationError("Win chance too low");if(c.gt(rt))throw E.createValidationError("Win chance too high");return c},_o=(r)=>{hr(r)};class Et extends n{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let c=hr(o),a=r.getRandomInt({min:tr,max:or}),A=a.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return K(o.bounds,A);case"ROLL_OUTSIDE":return!at(o.bounds,A);case"ROLL_BETWEEN_TWO":return K(o.firstBounds,A)||K(o.secondBounds,A)}})()?new rr(100-t).div(c):new rr(0),outputs:{result:a.values},randomValues:a}}}import T from"big.js";var ft=["Clubs","Diamonds","Hearts","Spades"],dt=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],pt;((c)=>{c.PLAYER_WIN="PLAYER_WIN";c.TIE="TIE";c.BANKER_WIN="BANKER_WIN"})(pt||={});var Ot;((c)=>{c.PLAYER="PLAYER";c.TIE="TIE";c.BANKER="BANKER"})(Ot||={});var Bt={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},nt=(r)=>{return new T(0).add(r.bets.reduce((o,c)=>o.add(c.amount),new T(0)))};class xt extends n{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(t);let c=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),a=c.values,A=a.slice(0,3),i=a.slice(3,6),d=[],p=0;for(let x of A.slice(0,2)){let D=this.mapRandomValueToCard(x),R=this.mapRandomValueToCardValue(x);d.push(D),p=(p+R)%10}let O=[],B=0;for(let x of i.slice(0,2)){let D=this.mapRandomValueToCard(x),R=this.mapRandomValueToCardValue(x);O.push(D),B=(B+R)%10}if(!this.isNaturalWin(p,B)){let x=this.shouldDrawThirdPlayerCard(p),D=null;if(x)D=this.mapRandomValueToCardValue(A[2]),d.push(this.mapRandomValueToCard(A[2])),p=(p+D)%10;if(this.shouldDrawThirdBankerCard(B,D))O.push(this.mapRandomValueToCard(i[2])),B=(B+this.mapRandomValueToCardValue(i[2]))%10}let f;if(p===B)f="TIE";else f=p>B?"PLAYER_WIN":"BANKER_WIN";let C=nt(t),{betType:Z,multiplier:s}=Bt[f],U=new T(0);if(U=U.add(t.bets.filter((x)=>x.type===Z).reduce((x,D)=>x.add(D.amount.mul(s)),new T(0))),f==="TIE")U=U.add(t.bets.filter((x)=>x.type==="PLAYER"||x.type==="BANKER").reduce((x,D)=>x.add(D.amount),new T(0)));return{isFinished:!0,payoutMultiplier:C.gt(0)?U.div(C):new T(0),outputs:{playerCards:d,playerHandValue:p,bankerCards:O,bankerHandValue:B,gameOutcome:f,result:c.values},randomValues:c}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((t)=>t.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let t=ft[Math.floor(r/13)],o=dt[r%13];return{suit:t,rank:o}}isNaturalWin(r,t){let o=[8,9];return o.includes(r)||o.includes(t)}mapRandomValueToCardValue(r){let t=r%13;if(t===0)return 1;if(t>=10)return 10;return t+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,t){if(t===null)return r<=5;if(r<=2)return!0;if(r===3)return t!==8;if(r===4)return[2,3,4,5,6,7].includes(t);if(r===5)return[4,5,6,7].includes(t);if(r===6)return[6,7].includes(t);return!1}}import lr from"big.js";import{Guard as Or}from"@betorigami/guard";import{Guard as fr}from"@betorigami/guard";import{Guard as Ar}from"@betorigami/guard";var cr=0,ar=51,e=Array.from({length:52},(r,t)=>t),yr=["Spades","Hearts","Diamonds","Clubs"],$=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],Sr=["Jack","Queen","King"];class ir{value;constructor(r){let t=e[r];Ar.againstNullOrUndefined(t,`Invalid card value: ${r}`),this.value=t}get suit(){let r=Math.floor(this.value/13),t=yr[r];return Ar.againstNullOrUndefined(t,`Invalid suit index: ${r}`),t}get rank(){let r=this.value%13,t=$[r];return Ar.againstNullOrUndefined(t,`Invalid rank index: ${r}`),t}serialise(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}var Zr=2.5,Tr=2,_r=1,wr=0,Gr=17,z=21;var Nr=63;var Er=10,Hr=10;class y extends ir{get numericRank(){if(Sr.includes(this.rank))return Hr;return $.indexOf(this.rank)+1}static fromValue(r){if(e.includes(r))return new y(r);throw new Error(`Invalid card value: ${r}`)}}class m{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((o,c)=>o+c.numericRank,0),r.some((o)=>o.rank==="Ace")&&this.hardHandValue+Er<=z)this.softHandValue=this.hardHandValue+Er}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>z}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===z}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}serialise(){return this.cards.map((r)=>r.serialise())}}class _{cards;value;constructor(r){this.cards=r.map((t)=>y.fromValue(t)),this.value=new m(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.serialise()),value:this.highestHandValue}}}class b extends _{otherCards;upCard;holeCard;constructor(r,t,o=[]){super([r,t,...o]);this.otherCards=o;this.upCard=y.fromValue(r),this.holeCard=y.fromValue(t)}static withInitialDeal(r){return new b(r.upCard,r.holeCard)}addDrawnCards(r){return new b(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.serialise()],value:new m([this.upCard]).highestHandValue}}}class V extends _{static withInitialDeal(r){return new V(r)}addDrawnCards(r){return new V([...this.rawValues,...r])}}var J;((a)=>{a.WIN="WIN";a.LOSE="LOSE";a.PUSH="PUSH";a.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(J||={});var q;((c)=>{c.START="START";c.HIT="HIT";c.STAND="STAND"})(q||={});class h{deck;playerHand;dealerHand;outcome;constructor(r,t,o,c){this.deck=r;this.playerHand=t;this.dealerHand=o;this.outcome=c}get isFinished(){return this.outcome!==null}toDto(){return{playerHand:this.playerHand.toDto(),dealerHand:this.dealerHand.toDto(this.isFinished),outcome:this.outcome}}static start(r){let t=r.drawCard(),o=r.drawCard(),c=r.drawCard(),a=r.drawCard(),A=V.withInitialDeal([t.value,o.value]),i=b.withInitialDeal({upCard:c.value,holeCard:a.value}),d=A.isBlackjack,p=i.isBlackjack,O=null;if(d&&p)O="PUSH";else if(d)O="PLAYER_BLACKJACK";else if(p)O="LOSE";return new h(r,A,i,O)}applyAction(r){switch(r){case"HIT":return this.hit();case"STAND":return this.stand();case"START":throw new Error("START cannot be applied to an existing state.");default:throw fr.againstNever(r,`Unknown action: ${r}`),new Error(`Unknown action: ${r}`)}}hit(){fr.against(this.isFinished,"Cannot hit on a finished game.");let r=this.deck.drawCard(),t=this.playerHand.addDrawnCards([r.value]);if(t.isBusted)return new h(this.deck,t,this.dealerHand,"LOSE");if(t.highestHandValue===21)return new h(this.deck,t,this.dealerHand,null).stand();return new h(this.deck,t,this.dealerHand,null)}stand(){fr.against(this.isFinished,"Cannot stand on a finished game.");let r=this.playDealerHand(),t=h.calculateOutcome(this.playerHand,r);return new h(this.deck,this.playerHand,r,t)}static calculateOutcome(r,t){if(r.isBusted)return"LOSE";if(t.isBusted)return"WIN";let o=r.highestHandValue,c=t.highestHandValue;if(o>c)return"WIN";if(o<c)return"LOSE";return"PUSH"}playDealerHand(){let r=this.dealerHand;while(r.highestHandValue<Gr){let t=this.deck.drawCard();r=r.addDrawnCards([t.value])}return r}}import{Guard as Ct}from"@betorigami/guard";class dr{values;proofHash;proofString;index=0;constructor(r){let t=r.getRandomIntsWithReplacement({min:cr,max:ar,count:Nr});this.values=t.values.map((o)=>new y(o)),this.proofHash=t.proofHash,this.proofString=t.proofString}drawCard(){return Ct.against(this.index>=this.values.length,"Card drawer exhausted - pre-drawn values depleted"),this.values[this.index++]}getConsumedRandomValues(){return{values:this.values.slice(0,this.index).map((r)=>r.value),count:this.index,min:cr,max:ar,proofHash:this.proofHash,proofString:this.proofString}}}import X from"big.js";var pr={PLAYER_BLACKJACK:X(Zr),WIN:X(Tr),PUSH:X(_r),LOSE:X(wr)};class jr extends n{constructor(){super("BLACKJACK")}determineGameResult({generator:r,gameInputs:t}){let{previousActions:o,nextAction:c}=t,a=new dr(r);if(c==="START"){Or.against(o.length>0,"START action requires previousActions to be empty.");let f=h.start(a),C=f.isFinished,Z=f.outcome!==null?pr[f.outcome]:lr(0),s=a.getConsumedRandomValues();return{isFinished:C,payoutMultiplier:Z,outputs:{action:c,state:f.toDto(),result:C?s.values:[]},randomValues:s}}Or.against(o[0]!=="START","previousActions must start with START.");let i=o.slice(1).reduce((f,C)=>f.applyAction(C),h.start(a));Or.against(i.isFinished,`Cannot process action "${c}" on a finished game with outcome "${i.outcome}".`);let d=i.applyAction(c),p=d.isFinished,O=d.outcome!==null?pr[d.outcome]:lr(0),B=a.getConsumedRandomValues();return{isFinished:p,payoutMultiplier:O,outputs:{action:c,state:d.toDto(),result:p?B.values:[]},randomValues:B}}}import ut from"big.js";class S{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let t=this.multipliers.get(r);if(t===void 0)throw new Error(`Multipliers for ${r} not found`);return t}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,t])=>({edge:r,multipliers:t}))}}var Dt;((i)=>{i.PAIR="PAIR";i.TWO_PAIR="TWO_PAIR";i.THREE_OF_A_KIND="THREE_OF_A_KIND";i.FULL_HOUSE="FULL_HOUSE";i.FOUR_OF_A_KIND="FOUR_OF_A_KIND";i.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(Dt||={});var ht={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},yt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},St={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},Zt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},Tt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},_t=new S(new Map([[1,ht],[2,yt],[3,St],[4,Zt],[8,Tt]])),wt={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Gt extends n{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:t}){let o=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),c=_t.getMultipliers(t),a=o.values,A=this.calculatePayoutMultiplier(c,a);return{isFinished:!0,payoutMultiplier:ut(A),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(r,t){let o=new Map;for(let A of t){let i=o.get(A)||0;o.set(A,i+1)}let c=[...o.values()].filter((A)=>A>1),a=this.classifyResult(c);return a===null?0:r[a]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[t,o]=r;if(t===void 0)return null;if(o===void 0){let c=wt[t];if(c===void 0)throw new Error(`Unexpected single diamond repeat count: ${t}`);return c}return t===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}import Br from"big.js";var Nt;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(Nt||={});class Ht extends n{constructor(){super("DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let c=r.getRandomInt({min:0,max:1e4}),a=c.min,d=c.max-a+1-1,p=o.direction==="ABOVE"?d-o.selectedValue:o.selectedValue,O=new Br(p).div(d).mul(100);return{isFinished:!0,payoutMultiplier:(o.direction==="ABOVE"?c.value>o.selectedValue:c.value<o.selectedValue)?new Br(100-t).div(O):new Br(0),outputs:{result:c.values},randomValues:c}}}import Mt from"big.js";import{Guard as Q}from"@betorigami/guard";var Ur;((a)=>{a.CLASSIC="CLASSIC";a.LOW_RISK="LOW_RISK";a.MEDIUM_RISK="MEDIUM_RISK";a.HIGH_RISK="HIGH_RISK"})(Ur||={});var lt=[1,2,3,4,5,6,7,8,9,10],mr=(r)=>{return lt.includes(r)};var jt={[1]:{CLASSIC:[0,3.96],LOW_RISK:[0.7,1.85],MEDIUM_RISK:[0.4,2.75],HIGH_RISK:[0,3.96]},[2]:{CLASSIC:[0,1.9,4.5],LOW_RISK:[0,2,3.8],MEDIUM_RISK:[0,1.8,5.1],HIGH_RISK:[0,0,17.1]},[3]:{CLASSIC:[0,1,3.1,10.4],LOW_RISK:[0,1.1,1.38,26],MEDIUM_RISK:[0,0,2.8,50],HIGH_RISK:[0,0,0,81.5]},[4]:{CLASSIC:[0,0.8,1.8,5,22.5],LOW_RISK:[0,0,2.2,7.9,90],MEDIUM_RISK:[0,0,1.7,10,100],HIGH_RISK:[0,0,0,10,259]},[5]:{CLASSIC:[0,0.25,1.4,4.1,16.5,36],LOW_RISK:[0,0,1.5,4.2,13,300],MEDIUM_RISK:[0,0,1.4,4,14,390],HIGH_RISK:[0,0,0,4.5,48,450]},[6]:{CLASSIC:[0,0,1,3.68,7,16.5,40],LOW_RISK:[0,0,1.1,2,6.2,100,700],MEDIUM_RISK:[0,0,0,3,9,180,710],HIGH_RISK:[0,0,0,0,11,350,710]},[7]:{CLASSIC:[0,0,0.47,3,4.5,14,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,15,225,700],MEDIUM_RISK:[0,0,0,2,7,30,400,800],HIGH_RISK:[0,0,0,0,7,90,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,13,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,5.5,39,100,800],MEDIUM_RISK:[0,0,0,2,4,11,67,400,900],HIGH_RISK:[0,0,0,0,5,20,270,600,900]},[9]:{CLASSIC:[0,0,0,1.55,3,8,15,44,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,5,15,100,500,1000],HIGH_RISK:[0,0,0,0,4,11,56,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,4,7,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,8,13,63,500,800,1000]}},Ut={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},mt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},bt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},Vt={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},br=new S(new Map([[1,jt],[2,Ut],[3,mt],[4,bt],[8,Vt]]));class Pt extends n{constructor(){super("KENO")}determineGameResult({generator:r,edge:t,gameInputs:o}){Q.againstEmptyArray(o.selectedNumbers,()=>E.createValidationError("No numbers selected")),Q.against(o.selectedNumbers.length>10,()=>E.createValidationError("Maximum of 10 numbers can be selected"));for(let f of o.selectedNumbers)Q.againstNonInteger(f,()=>E.createValidationError("Only integers can be selected")),Q.against(f<0||f>39,()=>E.createValidationError("Invalid number selected"));let c=r.getUniqueRandomInts({min:0,max:39,count:10}),a=o.selectedNumbers.filter((f)=>c.values.includes(f)),A=o.selectedNumbers.length;if(!mr(A))throw new Error(`Invalid tile count: ${A}`);let O=br.getMultipliers(t)[A][o.riskLevel][a.length];if(O===void 0)throw new Error(`No multiplier found for matching tile count ${a.length}`);return{isFinished:!0,payoutMultiplier:new Mt(O),outputs:{result:c.values},randomValues:c}}}import w from"big.js";var Vr=(r,t)=>{return r.gt(t)?r:t};var Mr=(r,t)=>{return r.lt(t)?r:t};class Ft extends n{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:t,gameInputs:o}){let c=r.getRandomInt({min:1,max:4294967295}),a=c.max,A=new w(16777216),i=new w(1),d=new w(1e6),p=c.value,O=new w(p-1).div(a),B=(100-t)/100,f=A.div(O.mul(A).plus(1)).mul(B),C=Vr(i,Mr(f,d));return{isFinished:!0,payoutMultiplier:C.gte(o.targetMultiplier)?new w(o.targetMultiplier):new w(0),outputs:{randomMultiplier:C,result:c.values},randomValues:c}}}import W from"big.js";var nr=(r,t)=>{if(t<0||r<0||t>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(t>r-t)t=r-t;let o=1;for(let c=1;c<=t;c++)o=o*(r-c+1)/c;return o};class It extends n{constructor(){super("MINES")}determineGameResult({generator:r,edge:t,gameInputs:o}){if(o.minesCount<=0||o.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(o.selectedTiles.length>25-o.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let i=r.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),d=i.values.some((Z)=>o.selectedTiles.includes(Z)),p=o.hasCashedOut||d,O=(100-t)/100,B=new W(nr(25-o.minesCount,o.selectedTiles.length)).div(new W(nr(25,o.selectedTiles.length))),C=o.hasCashedOut&&!d?new W(O).div(B):new W(0);return{isFinished:p,payoutMultiplier:C,outputs:{result:i.values},randomValues:i}}}import{Big as zt}from"big.js";var Pr;((c)=>{c.LOW_RISK="LOW_RISK";c.MEDIUM_RISK="MEDIUM_RISK";c.HIGH_RISK="HIGH_RISK"})(Pr||={});var da=[8,9,10,11,12,13,14,15,16],st={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16]},MEDIUM_RISK:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},Rt={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},Yt={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},et={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},$t={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},Fr=new S(new Map([[1,st],[2,Rt],[3,Yt],[4,et],[8,$t]]));class Jt extends n{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(t.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(t.numberOfRows<8||t.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let c=t.numberOfRows,i=Fr.getMultipliers(o)[t.riskLevel][c],d=r.getRandomIntsWithReplacement({min:0,max:1,count:t.numberOfRows}),O=d.values.reduce((f,C)=>f+C,0),B=i[O];if(B===void 0)throw new Error(`No payout found for end position ${O}`);return{isFinished:!0,payoutMultiplier:zt(B),outputs:{result:d.values},randomValues:d}}}import{Big as v}from"big.js";var xr=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],Ir=[37,...xr],sr=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Rr=[[0,1],[0,37],[3,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Yr=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],er=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],$r=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],zr=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],Jr=[0,1,2,3,37],qr=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],Xr=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],G;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(G||={});var N;((o)=>{o.RED="RED";o.BLACK="BLACK"})(N||={});var H;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(H||={});var l;((c)=>{c.TOP="TOP";c.MIDDLE="MIDDLE";c.BOTTOM="BOTTOM"})(l||={});var j;((c)=>{c.FIRST="FIRST";c.SECOND="SECOND";c.THIRD="THIRD"})(j||={});var Cr;((o)=>{o.AMERICAN="AMERICAN";o.EUROPEAN="EUROPEAN"})(Cr||={});var L=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw E.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&M(t.value)))throw E.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&qt(t.values)))throw E.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&Xt(t.values)))throw E.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&Qt(t.values)))throw E.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&Wt(t.values)))throw E.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(G).includes(t.parity)))throw E.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(N).includes(t.color)))throw E.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(H).includes(t.half)))throw E.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(l).includes(t.column)))throw E.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(j).includes(t.dozen)))throw E.createValidationError("Invalid dozen bet.")},M=(r)=>{return xr.includes(r)},qt=(r)=>{if(r.length!==2)return!1;if(!r.every(M))return!1;return sr.some(([t,o])=>t===r[0]&&o===r[1])},Xt=(r)=>{if(r.length!==3)return!1;if(!r.every(M))return!1;return Yr.some(([t,o,c])=>t===r[0]&&o===r[1]&&c===r[2])},Qt=(r)=>{if(r.length!==4)return!1;if(!r.every(M))return!1;return $r.some(([t,o,c,a])=>t===r[0]&&o===r[1]&&c===r[2]&&a===r[3])},Wt=(r)=>{if(r.length!==6)return!1;if(!r.every(M))return!1;return qr.some(([t,o,c,a,A,i])=>t===r[0]&&o===r[1]&&c===r[2]&&a===r[3]&&A===r[4]&&i===r[5])};var k=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.basketBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw E.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&P(t.value)))throw E.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&Lt(t.values)))throw E.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&kt(t.values)))throw E.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&vt(t.values)))throw E.createValidationError("Invalid corner bet.");if(!r.basketBets.every((t)=>t.amount.gte(0)))throw E.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&Kt(t.values)))throw E.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(G).includes(t.parity)))throw E.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(N).includes(t.color)))throw E.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(H).includes(t.half)))throw E.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(l).includes(t.column)))throw E.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(j).includes(t.dozen)))throw E.createValidationError("Invalid dozen bet.")},P=(r)=>{return Ir.includes(r)};function Lt(r){if(r.length!==2)return!1;if(!r.every(P))return!1;return Rr.some(([t,o])=>t===r[0]&&o===r[1])}var kt=(r)=>{if(r.length!==3)return!1;if(!r.every(P))return!1;return er.some(([t,o,c])=>t===r[0]&&o===r[1]&&c===r[2])},vt=(r)=>{if(r.length!==4)return!1;if(!r.every(P))return!1;return zr.some(([t,o,c,a])=>t===r[0]&&o===r[1]&&c===r[2]&&a===r[3])},Kt=(r)=>{if(r.length!==6)return!1;if(!r.every(P))return!1;return Xr.some(([t,o,c,a,A,i])=>t===r[0]&&o===r[1]&&c===r[2]&&a===r[3]&&A===r[4]&&i===r[5])};var gt={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},ro=[3,6,9,12,15,18,21,24,27,30,33,36],to=[2,5,8,11,14,17,20,23,26,29,32,35],oo=[1,4,7,10,13,16,19,22,25,28,31,34],co=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],ao=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],Ao=2.7,io=5.3;class ur extends n{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:t}){this.validateInputs(t);let o=r.getRandomInt({min:0,max:this.maxNumber}),c=o.value,a=this.determineBetOutcomes(t,c),{payoutMultiplier:A}=this.getPayoutDetails(t,c);return{outputs:{betOutcomes:a,result:o.values},payoutMultiplier:A,isFinished:!0,randomValues:o}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,t){let o=this.determineBetOutcomes(r,t),c=this.getBetTotals(r),a=this.getBetTotals(o.winningBets),A=this.calculateTotalBetAmount(c),i=this.calculateTotalPayout(a);return{payoutMultiplier:A.gt(0)?i.div(A):new v(0),payoutAmount:i}}determineBetOutcomes(r,t){let o={},c={};for(let a of Object.keys(r)){let A=r[a],i=this.betPredicates[a],{winning:d,losing:p}=this.partitionBets(A,i,t);o[a]=d,c[a]=p}return{winningBets:o,losingBets:c}}calculateTotalAmount(r){return r.reduce((t,o)=>t.plus(o.amount),new v(0))}isWinningStraightBet(r,t){return r.value===t}isWinningSplitBet(r,t){return r.values.some((o)=>o===t)}isWinningStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningCornerBet(r,t){return r.values.some((o)=>o===t)}isWinningDoubleStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningColorBet(r,t){let o=r;return co.includes(t)&&o.color==="RED"||ao.includes(t)&&o.color==="BLACK"}isWinningHalfBet(r,t){let o=r;if(t>0&&t<=18&&o.half==="LOW")return!0;if(t>18&&t<=36&&o.half==="HIGH")return!0;return!1}isWinningColumnBet(r,t){let o=r;return ro.includes(t)&&o.column==="TOP"||to.includes(t)&&o.column==="MIDDLE"||oo.includes(t)&&o.column==="BOTTOM"}isWinningDozenBet(r,t){let o=r;if(t>0&&t<=12&&o.dozen==="FIRST")return!0;if(t>12&&t<=24&&o.dozen==="SECOND")return!0;if(t>24&&t<=36&&o.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,t){let o=r;if(t===0||t===37)return!1;let c=t%2===0?"EVEN":"ODD";return o.parity===c}getBetTotals(r){let t={};for(let o of Object.keys(r))t[o]=this.calculateTotalAmount(r[o]);return t}calculateTotalBetAmount(r){return Object.values(r).reduce((t,o)=>t.plus(o),new v(0))}partitionBets(r,t,o){return{winning:r.filter((c)=>t(c,o)),losing:r.filter((c)=>!t(c,o))}}calculateTotalPayout(r){return Object.entries(r).reduce((t,[o,c])=>{let A=gt[o];return t.plus(c.mul(A||0))},new v(0))}}class Qr extends ur{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){L(r)}}class Wr extends ur{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){k(r)}isWinningBasketBet(r,t){return Jr.some((o)=>o===t)}}class Lr extends n{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new Qr,this.americanGame=new Wr}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:t,...o}=r;if(r.edge===Ao&&t.type==="EUROPEAN"){let c=this.europeanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:a}=c.outputs;return{...c,outputs:{type:"european",betOutcomes:a,result:c.outputs.result}}}if(r.edge===io&&t.type==="AMERICAN"){let c=this.americanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:a}=c.outputs;return{...c,outputs:{type:"american",betOutcomes:a,result:c.outputs.result}}}throw E.createValidationError(`Attempted to play ${t.type} roulette on edge ${r.edge}`)}}var ba=(r)=>{return new Lr().getBetAmount(r)};var Ia=(r)=>{if(r.type==="EUROPEAN")L(r.inputs);else k(r.inputs)};import{Big as no}from"big.js";var F;((c)=>{c.LOW_RISK="LOW_RISK";c.MEDIUM_RISK="MEDIUM_RISK";c.HIGH_RISK="HIGH_RISK"})(F||={});var I;((A)=>{A[A.TEN=10]="TEN";A[A.TWENTY=20]="TWENTY";A[A.THIRTY=30]="THIRTY";A[A.FORTY=40]="FORTY";A[A.FIFTY=50]="FIFTY"})(I||={});var Eo={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},fo={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},po={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},Oo={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},Bo={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},kr=new S(new Map([[1,Eo],[2,fo],[3,po],[4,Oo],[8,Bo]]));var vr={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class xo extends n{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(!Object.values(I).includes(t.segments))throw new Error("Invalid segments value");if(!Object.values(F).includes(t.riskLevel))throw new Error("Invalid risk level");let a=kr.getMultipliers(o)[t.riskLevel];if(a===void 0)throw new Error(`No multipliers found for risk level ${t.riskLevel}`);let A=a[t.segments];if(A===void 0)throw new Error(`No multipliers found for segment ${t.segments}`);let i=vr[t.riskLevel];if(i===void 0)throw new Error(`No patterns found for risk level ${t.riskLevel}`);let d=i[t.segments];if(d===void 0)throw new Error(`No patterns found for segment ${t.segments}`);let p=r.getRandomInt({min:0,max:d.length-1}),O=d[p.value];if(O===void 0)throw new Error(`No pattern found for segment ${t.segments} and value ${p.value}`);let B=A[O];if(B===void 0)throw new Error(`No payout found for picked segment ${O}`);return{isFinished:!0,payoutMultiplier:new no(B),outputs:{result:p.values},randomValues:p}}}export{Ia as validateRouletteGameInputs,_o as validateAdvancedDiceInputs,jt as rtp99Multipliers,Ut as rtp98Multipliers,mt as rtp97Multipliers,bt as rtp96Multipliers,Vt as rtp92Multipliers,Fr as plinkoMultipliers,br as kenoMultipliers,mr as isTileCount,_t as diamondsMultipliers,ba as calculateRouletteBetAmount,nt as calculateBaccaratBetAmount,I as WheelSegments,F as WheelRiskLevel,xo as Wheel,ft as VALID_SUITS,dt as VALID_RANKS,Yr as VALID_EUROPEAN_STREETS,xr as VALID_EUROPEAN_STRAIGHTS,sr as VALID_EUROPEAN_SPLITS,qr as VALID_EUROPEAN_DOUBLE_STREETS,$r as VALID_EUROPEAN_CORNERS,er as VALID_AMERICAN_STREETS,Ir as VALID_AMERICAN_STRAIGHTS,Rr as VALID_AMERICAN_SPLITS,Xr as VALID_AMERICAN_DOUBLE_STREETS,zr as VALID_AMERICAN_CORNERS,ro as TOP_COLUMN,lt as TILE_COUNTS,Cr as RouletteType,Lr as Roulette,it as RollType,co as RED_NUMBERS,tr as RANDOM_MIN_VALUE,or as RANDOM_MAX_VALUE,Pr as PlinkoRiskLevel,Jt as Plinko,G as Parity,da as PLINKO_ROW_COUNTS,gt as PAYOUT_MULTIPLIERS,u as OrigamiGame,It as Mines,gr as MIN_WIN_CHANCE,to as MIDDLE_COLUMN,rt as MAX_WIN_CHANCE,Ft as Limbo,Ur as KenoRiskLevel,Pt as Keno,H as Half,Kr as GameErrorCode,E as GameError,n as Game,Qr as EuropeanRoulette,Ao as EUROPEAN_HOUSE_EDGE,Dr as EFFECTIVE_RANGE,j as Dozen,Nt as DiceDirection,Ht as Dice,Dt as DiamondsResultType,Gt as Diamonds,l as Column,N as Color,J as BlackjackOutcome,_ as BlackjackHand,q as BlackjackAction,jr as Blackjack,pt as BaccaratOutcome,Ot as BaccaratBetType,xt as Baccarat,oo as BOTTOM_COLUMN,ao as BLACK_NUMBERS,Wr as AmericanRoulette,Et as AdvancedDice,io as AMERICAN_HOUSE_EDGE,Jr as AMERICAN_BASKET};
1
+ var C;((d)=>{d.DICE="DICE";d.MINES="MINES";d.KENO="KENO";d.LIMBO="LIMBO";d.ADVANCED_DICE="ADVANCED_DICE";d.BACCARAT="BACCARAT";d.DIAMONDS="DIAMONDS";d.PLINKO="PLINKO";d.ROULETTE="ROULETTE";d.WHEEL="WHEEL";d.BLACKJACK="BLACKJACK"})(C||={});class n{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}import{Big as Dr}from"big.js";var rt;((t)=>t.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(rt||={});class E extends Error{static createValidationError(r){return new E("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof E}errorCode;constructor(r,t){super(t);this.errorCode=r}}import tt from"big.js";var I=(r,t)=>{return tt(100-r).div(t)};var tr=0,or=1e4,Cr=10001,ot=0.01,ct=98,at=(r)=>{if(r<tr)throw E.createValidationError(`Lower bound ${r} is below minimum allowed value ${tr}`)},At=(r)=>{if(r>or)throw E.createValidationError(`Upper bound ${r} is above maximum allowed value ${or}`)},Y=(r)=>{if(at(r.lower),At(r.upper),r.lower>=r.upper)throw E.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},it=(r,t)=>{let[o,c]=r.lower<=t.lower?[r,t]:[t,r];if(o.upper>c.lower)throw E.createValidationError("Bounds must not overlap")},Et=(r,t)=>t>=r.lower&&t<=r.upper,dt=(r)=>r.upper-r.lower+1,g=(r,t)=>t>r.lower&&t<r.upper,rr=(r)=>r.upper-r.lower-1,ft;((c)=>{c.ROLL_BETWEEN="ROLL_BETWEEN";c.ROLL_OUTSIDE="ROLL_OUTSIDE";c.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(ft||={});var hr=(r)=>{let o=(()=>{switch(r.mode){case"ROLL_BETWEEN":return Y(r.bounds),rr(r.bounds);case"ROLL_OUTSIDE":return Y(r.bounds),Cr-dt(r.bounds);case"ROLL_BETWEEN_TWO":return Y(r.firstBounds),Y(r.secondBounds),it(r.firstBounds,r.secondBounds),rr(r.firstBounds)+rr(r.secondBounds)}})(),c=Dr(o).div(Cr).mul(100);if(c.lt(ot))throw E.createValidationError("Win chance too low");if(c.gt(ct))throw E.createValidationError("Win chance too high");return c},Uo=(r)=>{hr(r)};class pt extends n{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let c=hr(o),a=r.getRandomInt({min:tr,max:or}),A=a.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return g(o.bounds,A);case"ROLL_OUTSIDE":return!Et(o.bounds,A);case"ROLL_BETWEEN_TWO":return g(o.firstBounds,A)||g(o.secondBounds,A)}})()?I(t,c):new Dr(0),outputs:{result:a.values},randomValues:a}}}import _ from"big.js";var Bt=["Clubs","Diamonds","Hearts","Spades"],nt=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],Ot;((c)=>{c.PLAYER_WIN="PLAYER_WIN";c.TIE="TIE";c.BANKER_WIN="BANKER_WIN"})(Ot||={});var xt;((c)=>{c.PLAYER="PLAYER";c.TIE="TIE";c.BANKER="BANKER"})(xt||={});var ut={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},Ct=(r)=>{return new _(0).add(r.bets.reduce((o,c)=>o.add(c.amount),new _(0)))};class Dt extends n{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(t);let c=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),a=c.values,A=a.slice(0,3),i=a.slice(3,6),f=[],p=0;for(let x of A.slice(0,2)){let D=this.mapRandomValueToCard(x),R=this.mapRandomValueToCardValue(x);f.push(D),p=(p+R)%10}let B=[],O=0;for(let x of i.slice(0,2)){let D=this.mapRandomValueToCard(x),R=this.mapRandomValueToCardValue(x);B.push(D),O=(O+R)%10}if(!this.isNaturalWin(p,O)){let x=this.shouldDrawThirdPlayerCard(p),D=null;if(x)D=this.mapRandomValueToCardValue(A[2]),f.push(this.mapRandomValueToCard(A[2])),p=(p+D)%10;if(this.shouldDrawThirdBankerCard(O,D))B.push(this.mapRandomValueToCard(i[2])),O=(O+this.mapRandomValueToCardValue(i[2]))%10}let d;if(p===O)d="TIE";else d=p>O?"PLAYER_WIN":"BANKER_WIN";let u=Ct(t),{betType:Z,multiplier:F}=ut[d],m=new _(0);if(m=m.add(t.bets.filter((x)=>x.type===Z).reduce((x,D)=>x.add(D.amount.mul(F)),new _(0))),d==="TIE")m=m.add(t.bets.filter((x)=>x.type==="PLAYER"||x.type==="BANKER").reduce((x,D)=>x.add(D.amount),new _(0)));return{isFinished:!0,payoutMultiplier:u.gt(0)?m.div(u):new _(0),outputs:{playerCards:f,playerHandValue:p,bankerCards:B,bankerHandValue:O,gameOutcome:d,result:c.values},randomValues:c}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((t)=>t.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let t=Bt[Math.floor(r/13)],o=nt[r%13];return{suit:t,rank:o}}isNaturalWin(r,t){let o=[8,9];return o.includes(r)||o.includes(t)}mapRandomValueToCardValue(r){let t=r%13;if(t===0)return 1;if(t>=10)return 10;return t+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,t){if(t===null)return r<=5;if(r<=2)return!0;if(r===3)return t!==8;if(r===4)return[2,3,4,5,6,7].includes(t);if(r===5)return[4,5,6,7].includes(t);if(r===6)return[6,7].includes(t);return!1}}import lr from"big.js";import{Guard as Br}from"@betorigami/guard";import{Guard as dr}from"@betorigami/guard";import{Guard as Ar}from"@betorigami/guard";var cr=0,ar=51,$=Array.from({length:52},(r,t)=>t),yr=["Spades","Hearts","Diamonds","Clubs"],z=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],Sr=["Jack","Queen","King"];class ir{value;constructor(r){let t=$[r];Ar.againstNullOrUndefined(t,`Invalid card value: ${r}`),this.value=t}get suit(){let r=Math.floor(this.value/13),t=yr[r];return Ar.againstNullOrUndefined(t,`Invalid suit index: ${r}`),t}get rank(){let r=this.value%13,t=z[r];return Ar.againstNullOrUndefined(t,`Invalid rank index: ${r}`),t}serialise(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}var Zr=2.5,_r=2,Tr=1,Nr=0,wr=17,J=21;var Gr=63;var Er=10,Hr=10;class y extends ir{get numericRank(){if(Sr.includes(this.rank))return Hr;return z.indexOf(this.rank)+1}static fromValue(r){if($.includes(r))return new y(r);throw new Error(`Invalid card value: ${r}`)}}class U{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((o,c)=>o+c.numericRank,0),r.some((o)=>o.rank==="Ace")&&this.hardHandValue+Er<=J)this.softHandValue=this.hardHandValue+Er}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>J}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===J}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}serialise(){return this.cards.map((r)=>r.serialise())}}class T{cards;value;constructor(r){this.cards=r.map((t)=>y.fromValue(t)),this.value=new U(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.serialise()),value:this.highestHandValue}}}class e extends T{otherCards;upCard;holeCard;constructor(r,t,o=[]){super([r,t,...o]);this.otherCards=o;this.upCard=y.fromValue(r),this.holeCard=y.fromValue(t)}static withInitialDeal(r){return new e(r.upCard,r.holeCard)}addDrawnCards(r){return new e(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.serialise()],value:new U([this.upCard]).highestHandValue}}}class M extends T{static withInitialDeal(r){return new M(r)}addDrawnCards(r){return new M([...this.rawValues,...r])}}var q;((a)=>{a.WIN="WIN";a.LOSE="LOSE";a.PUSH="PUSH";a.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(q||={});var X;((c)=>{c.START="START";c.HIT="HIT";c.STAND="STAND"})(X||={});class h{deck;playerHand;dealerHand;outcome;constructor(r,t,o,c){this.deck=r;this.playerHand=t;this.dealerHand=o;this.outcome=c}get isFinished(){return this.outcome!==null}toDto(){return{playerHand:this.playerHand.toDto(),dealerHand:this.dealerHand.toDto(this.isFinished),outcome:this.outcome}}static start(r){let t=r.drawCard(),o=r.drawCard(),c=r.drawCard(),a=r.drawCard(),A=M.withInitialDeal([t.value,o.value]),i=e.withInitialDeal({upCard:c.value,holeCard:a.value}),f=A.isBlackjack,p=i.isBlackjack,B=null;if(f&&p)B="PUSH";else if(f)B="PLAYER_BLACKJACK";else if(p)B="LOSE";return new h(r,A,i,B)}applyAction(r){switch(r){case"HIT":return this.hit();case"STAND":return this.stand();case"START":throw new Error("START cannot be applied to an existing state.");default:throw dr.againstNever(r,`Unknown action: ${r}`),new Error(`Unknown action: ${r}`)}}hit(){dr.against(this.isFinished,"Cannot hit on a finished game.");let r=this.deck.drawCard(),t=this.playerHand.addDrawnCards([r.value]);if(t.isBusted)return new h(this.deck,t,this.dealerHand,"LOSE");if(t.highestHandValue===21)return new h(this.deck,t,this.dealerHand,null).stand();return new h(this.deck,t,this.dealerHand,null)}stand(){dr.against(this.isFinished,"Cannot stand on a finished game.");let r=this.playDealerHand(),t=h.calculateOutcome(this.playerHand,r);return new h(this.deck,this.playerHand,r,t)}static calculateOutcome(r,t){if(r.isBusted)return"LOSE";if(t.isBusted)return"WIN";let o=r.highestHandValue,c=t.highestHandValue;if(o>c)return"WIN";if(o<c)return"LOSE";return"PUSH"}playDealerHand(){let r=this.dealerHand;while(r.highestHandValue<wr){let t=this.deck.drawCard();r=r.addDrawnCards([t.value])}return r}}import{Guard as ht}from"@betorigami/guard";class fr{values;proofHash;proofString;index=0;constructor(r){let t=r.getRandomIntsWithReplacement({min:cr,max:ar,count:Gr});this.values=t.values.map((o)=>new y(o)),this.proofHash=t.proofHash,this.proofString=t.proofString}drawCard(){return ht.against(this.index>=this.values.length,"Card drawer exhausted - pre-drawn values depleted"),this.values[this.index++]}getConsumedRandomValues(){return{values:this.values.slice(0,this.index).map((r)=>r.value),count:this.index,min:cr,max:ar,proofHash:this.proofHash,proofString:this.proofString}}}import Q from"big.js";var pr={PLAYER_BLACKJACK:Q(Zr),WIN:Q(_r),PUSH:Q(Tr),LOSE:Q(Nr)};class jr extends n{constructor(){super("BLACKJACK")}determineGameResult({generator:r,gameInputs:t}){let{previousActions:o,nextAction:c}=t,a=new fr(r);if(c==="START"){Br.against(o.length>0,"START action requires previousActions to be empty.");let d=h.start(a),u=d.isFinished,Z=d.outcome!==null?pr[d.outcome]:lr(0),F=a.getConsumedRandomValues();return{isFinished:u,payoutMultiplier:Z,outputs:{action:c,state:d.toDto(),result:u?F.values:[]},randomValues:F}}Br.against(o[0]!=="START","previousActions must start with START.");let i=o.slice(1).reduce((d,u)=>d.applyAction(u),h.start(a));Br.against(i.isFinished,`Cannot process action "${c}" on a finished game with outcome "${i.outcome}".`);let f=i.applyAction(c),p=f.isFinished,B=f.outcome!==null?pr[f.outcome]:lr(0),O=a.getConsumedRandomValues();return{isFinished:p,payoutMultiplier:B,outputs:{action:c,state:f.toDto(),result:p?O.values:[]},randomValues:O}}}import yt from"big.js";class S{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let t=this.multipliers.get(r);if(t===void 0)throw new Error(`Multipliers for ${r} not found`);return t}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,t])=>({edge:r,multipliers:t}))}}var St;((i)=>{i.PAIR="PAIR";i.TWO_PAIR="TWO_PAIR";i.THREE_OF_A_KIND="THREE_OF_A_KIND";i.FULL_HOUSE="FULL_HOUSE";i.FOUR_OF_A_KIND="FOUR_OF_A_KIND";i.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(St||={});var Zt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},_t={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},Tt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},Nt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},wt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},Gt=new S(new Map([[1,Zt],[2,_t],[3,Tt],[4,Nt],[8,wt]])),Ht={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class lt extends n{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:t}){let o=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),c=Gt.getMultipliers(t),a=o.values,A=this.calculatePayoutMultiplier(c,a);return{isFinished:!0,payoutMultiplier:yt(A),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(r,t){let o=new Map;for(let A of t){let i=o.get(A)||0;o.set(A,i+1)}let c=[...o.values()].filter((A)=>A>1),a=this.classifyResult(c);return a===null?0:r[a]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[t,o]=r;if(t===void 0)return null;if(o===void 0){let c=Ht[t];if(c===void 0)throw new Error(`Unexpected single diamond repeat count: ${t}`);return c}return t===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}import Ur from"big.js";var jt;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(jt||={});var mr=1e4,mt=(r)=>{let t=r.direction==="ABOVE"?mr-r.selectedValue:r.selectedValue;return new Ur(t).div(mr).mul(100)},Ut=(r,t)=>r.direction==="ABOVE"?t>r.selectedValue:t<r.selectedValue;class et extends n{constructor(){super("DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let c=r.getRandomInt({min:0,max:1e4}),a=mt(o);return{isFinished:!0,payoutMultiplier:Ut(o,c.value)?I(t,a):new Ur(0),outputs:{result:c.values},randomValues:c}}}import Rt from"big.js";import{Guard as W}from"@betorigami/guard";var er;((a)=>{a.CLASSIC="CLASSIC";a.LOW_RISK="LOW_RISK";a.MEDIUM_RISK="MEDIUM_RISK";a.HIGH_RISK="HIGH_RISK"})(er||={});var Mt=[1,2,3,4,5,6,7,8,9,10],Mr=(r)=>{return Mt.includes(r)};var Vt={[1]:{CLASSIC:[0,3.96],LOW_RISK:[0.7,1.85],MEDIUM_RISK:[0.4,2.75],HIGH_RISK:[0,3.96]},[2]:{CLASSIC:[0,1.9,4.5],LOW_RISK:[0,2,3.8],MEDIUM_RISK:[0,1.8,5.1],HIGH_RISK:[0,0,17.1]},[3]:{CLASSIC:[0,1,3.1,10.4],LOW_RISK:[0,1.1,1.38,26],MEDIUM_RISK:[0,0,2.8,50],HIGH_RISK:[0,0,0,81.5]},[4]:{CLASSIC:[0,0.8,1.8,5,22.5],LOW_RISK:[0,0,2.2,7.9,90],MEDIUM_RISK:[0,0,1.7,10,100],HIGH_RISK:[0,0,0,10,259]},[5]:{CLASSIC:[0,0.25,1.4,4.1,16.5,36],LOW_RISK:[0,0,1.5,4.2,13,300],MEDIUM_RISK:[0,0,1.4,4,14,390],HIGH_RISK:[0,0,0,4.5,48,450]},[6]:{CLASSIC:[0,0,1,3.68,7,16.5,40],LOW_RISK:[0,0,1.1,2,6.2,100,700],MEDIUM_RISK:[0,0,0,3,9,180,710],HIGH_RISK:[0,0,0,0,11,350,710]},[7]:{CLASSIC:[0,0,0.47,3,4.5,14,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,15,225,700],MEDIUM_RISK:[0,0,0,2,7,30,400,800],HIGH_RISK:[0,0,0,0,7,90,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,13,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,5.5,39,100,800],MEDIUM_RISK:[0,0,0,2,4,11,67,400,900],HIGH_RISK:[0,0,0,0,5,20,270,600,900]},[9]:{CLASSIC:[0,0,0,1.55,3,8,15,44,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,5,15,100,500,1000],HIGH_RISK:[0,0,0,0,4,11,56,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,4,7,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,8,13,63,500,800,1000]}},bt={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},st={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},Pt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},Ft={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},Vr=new S(new Map([[1,Vt],[2,bt],[3,st],[4,Pt],[8,Ft]]));class It extends n{constructor(){super("KENO")}determineGameResult({generator:r,edge:t,gameInputs:o}){W.againstEmptyArray(o.selectedNumbers,()=>E.createValidationError("No numbers selected")),W.against(o.selectedNumbers.length>10,()=>E.createValidationError("Maximum of 10 numbers can be selected"));for(let d of o.selectedNumbers)W.againstNonInteger(d,()=>E.createValidationError("Only integers can be selected")),W.against(d<0||d>39,()=>E.createValidationError("Invalid number selected"));let c=r.getUniqueRandomInts({min:0,max:39,count:10}),a=o.selectedNumbers.filter((d)=>c.values.includes(d)),A=o.selectedNumbers.length;if(!Mr(A))throw new Error(`Invalid tile count: ${A}`);let B=Vr.getMultipliers(t)[A][o.riskLevel][a.length];if(B===void 0)throw new Error(`No multiplier found for matching tile count ${a.length}`);return{isFinished:!0,payoutMultiplier:new Rt(B),outputs:{result:c.values},randomValues:c}}}import N from"big.js";var br=(r,t)=>{return r.gt(t)?r:t};var sr=(r,t)=>{return r.lt(t)?r:t};class Yt extends n{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:t,gameInputs:o}){let c=r.getRandomInt({min:1,max:4294967295}),a=c.max,A=new N(16777216),i=new N(1),f=new N(1e6),p=c.value,B=new N(p-1).div(a),O=(100-t)/100,d=A.div(B.mul(A).plus(1)).mul(O),u=br(i,sr(d,f));return{isFinished:!0,payoutMultiplier:u.gte(o.targetMultiplier)?new N(o.targetMultiplier):new N(0),outputs:{randomMultiplier:u,result:c.values},randomValues:c}}}import L from"big.js";var nr=(r,t)=>{if(t<0||r<0||t>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(t>r-t)t=r-t;let o=1;for(let c=1;c<=t;c++)o=o*(r-c+1)/c;return o};class $t extends n{constructor(){super("MINES")}determineGameResult({generator:r,edge:t,gameInputs:o}){if(o.minesCount<=0||o.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(o.selectedTiles.length>25-o.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let i=r.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),f=i.values.some((Z)=>o.selectedTiles.includes(Z)),p=o.hasCashedOut||f,B=(100-t)/100,O=new L(nr(25-o.minesCount,o.selectedTiles.length)).div(new L(nr(25,o.selectedTiles.length))),u=o.hasCashedOut&&!f?new L(B).div(O):new L(0);return{isFinished:p,payoutMultiplier:u,outputs:{result:i.values},randomValues:i}}}import{Big as Wt}from"big.js";var Pr;((c)=>{c.LOW_RISK="LOW_RISK";c.MEDIUM_RISK="MEDIUM_RISK";c.HIGH_RISK="HIGH_RISK"})(Pr||={});var ha=[8,9,10,11,12,13,14,15,16],zt={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16]},MEDIUM_RISK:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},Jt={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},qt={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},Xt={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},Qt={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},Fr=new S(new Map([[1,zt],[2,Jt],[3,qt],[4,Xt],[8,Qt]]));class Lt extends n{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(t.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(t.numberOfRows<8||t.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let c=t.numberOfRows,i=Fr.getMultipliers(o)[t.riskLevel][c],f=r.getRandomIntsWithReplacement({min:0,max:1,count:t.numberOfRows}),B=f.values.reduce((d,u)=>d+u,0),O=i[B];if(O===void 0)throw new Error(`No payout found for end position ${B}`);return{isFinished:!0,payoutMultiplier:Wt(O),outputs:{result:f.values},randomValues:f}}}import{Big as K}from"big.js";var Or=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],Rr=[37,...Or],Ir=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Yr=[[0,1],[0,37],[3,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],$r=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],zr=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],Jr=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],qr=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],Xr=[0,1,2,3,37],Qr=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],Wr=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],w;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(w||={});var G;((o)=>{o.RED="RED";o.BLACK="BLACK"})(G||={});var H;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(H||={});var l;((c)=>{c.TOP="TOP";c.MIDDLE="MIDDLE";c.BOTTOM="BOTTOM"})(l||={});var j;((c)=>{c.FIRST="FIRST";c.SECOND="SECOND";c.THIRD="THIRD"})(j||={});var xr;((o)=>{o.AMERICAN="AMERICAN";o.EUROPEAN="EUROPEAN"})(xr||={});var k=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw E.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&V(t.value)))throw E.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&kt(t.values)))throw E.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&vt(t.values)))throw E.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&Kt(t.values)))throw E.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&gt(t.values)))throw E.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(w).includes(t.parity)))throw E.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(G).includes(t.color)))throw E.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(H).includes(t.half)))throw E.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(l).includes(t.column)))throw E.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(j).includes(t.dozen)))throw E.createValidationError("Invalid dozen bet.")},V=(r)=>{return Or.includes(r)},kt=(r)=>{if(r.length!==2)return!1;if(!r.every(V))return!1;return Ir.some(([t,o])=>t===r[0]&&o===r[1])},vt=(r)=>{if(r.length!==3)return!1;if(!r.every(V))return!1;return $r.some(([t,o,c])=>t===r[0]&&o===r[1]&&c===r[2])},Kt=(r)=>{if(r.length!==4)return!1;if(!r.every(V))return!1;return Jr.some(([t,o,c,a])=>t===r[0]&&o===r[1]&&c===r[2]&&a===r[3])},gt=(r)=>{if(r.length!==6)return!1;if(!r.every(V))return!1;return Qr.some(([t,o,c,a,A,i])=>t===r[0]&&o===r[1]&&c===r[2]&&a===r[3]&&A===r[4]&&i===r[5])};var v=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.basketBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw E.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&b(t.value)))throw E.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&ro(t.values)))throw E.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&to(t.values)))throw E.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&oo(t.values)))throw E.createValidationError("Invalid corner bet.");if(!r.basketBets.every((t)=>t.amount.gte(0)))throw E.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&co(t.values)))throw E.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(w).includes(t.parity)))throw E.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(G).includes(t.color)))throw E.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(H).includes(t.half)))throw E.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(l).includes(t.column)))throw E.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(j).includes(t.dozen)))throw E.createValidationError("Invalid dozen bet.")},b=(r)=>{return Rr.includes(r)};function ro(r){if(r.length!==2)return!1;if(!r.every(b))return!1;return Yr.some(([t,o])=>t===r[0]&&o===r[1])}var to=(r)=>{if(r.length!==3)return!1;if(!r.every(b))return!1;return zr.some(([t,o,c])=>t===r[0]&&o===r[1]&&c===r[2])},oo=(r)=>{if(r.length!==4)return!1;if(!r.every(b))return!1;return qr.some(([t,o,c,a])=>t===r[0]&&o===r[1]&&c===r[2]&&a===r[3])},co=(r)=>{if(r.length!==6)return!1;if(!r.every(b))return!1;return Wr.some(([t,o,c,a,A,i])=>t===r[0]&&o===r[1]&&c===r[2]&&a===r[3]&&A===r[4]&&i===r[5])};var ao={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},Ao=[3,6,9,12,15,18,21,24,27,30,33,36],io=[2,5,8,11,14,17,20,23,26,29,32,35],Eo=[1,4,7,10,13,16,19,22,25,28,31,34],fo=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],po=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],Bo=2.7,no=5.3;class ur extends n{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:t}){this.validateInputs(t);let o=r.getRandomInt({min:0,max:this.maxNumber}),c=o.value,a=this.determineBetOutcomes(t,c),{payoutMultiplier:A}=this.getPayoutDetails(t,c);return{outputs:{betOutcomes:a,result:o.values},payoutMultiplier:A,isFinished:!0,randomValues:o}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,t){let o=this.determineBetOutcomes(r,t),c=this.getBetTotals(r),a=this.getBetTotals(o.winningBets),A=this.calculateTotalBetAmount(c),i=this.calculateTotalPayout(a);return{payoutMultiplier:A.gt(0)?i.div(A):new K(0),payoutAmount:i}}determineBetOutcomes(r,t){let o={},c={};for(let a of Object.keys(r)){let A=r[a],i=this.betPredicates[a],{winning:f,losing:p}=this.partitionBets(A,i,t);o[a]=f,c[a]=p}return{winningBets:o,losingBets:c}}calculateTotalAmount(r){return r.reduce((t,o)=>t.plus(o.amount),new K(0))}isWinningStraightBet(r,t){return r.value===t}isWinningSplitBet(r,t){return r.values.some((o)=>o===t)}isWinningStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningCornerBet(r,t){return r.values.some((o)=>o===t)}isWinningDoubleStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningColorBet(r,t){let o=r;return fo.includes(t)&&o.color==="RED"||po.includes(t)&&o.color==="BLACK"}isWinningHalfBet(r,t){let o=r;if(t>0&&t<=18&&o.half==="LOW")return!0;if(t>18&&t<=36&&o.half==="HIGH")return!0;return!1}isWinningColumnBet(r,t){let o=r;return Ao.includes(t)&&o.column==="TOP"||io.includes(t)&&o.column==="MIDDLE"||Eo.includes(t)&&o.column==="BOTTOM"}isWinningDozenBet(r,t){let o=r;if(t>0&&t<=12&&o.dozen==="FIRST")return!0;if(t>12&&t<=24&&o.dozen==="SECOND")return!0;if(t>24&&t<=36&&o.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,t){let o=r;if(t===0||t===37)return!1;let c=t%2===0?"EVEN":"ODD";return o.parity===c}getBetTotals(r){let t={};for(let o of Object.keys(r))t[o]=this.calculateTotalAmount(r[o]);return t}calculateTotalBetAmount(r){return Object.values(r).reduce((t,o)=>t.plus(o),new K(0))}partitionBets(r,t,o){return{winning:r.filter((c)=>t(c,o)),losing:r.filter((c)=>!t(c,o))}}calculateTotalPayout(r){return Object.entries(r).reduce((t,[o,c])=>{let A=ao[o];return t.plus(c.mul(A||0))},new K(0))}}class Lr extends ur{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){k(r)}}class kr extends ur{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){v(r)}isWinningBasketBet(r,t){return Xr.some((o)=>o===t)}}class vr extends n{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new Lr,this.americanGame=new kr}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:t,...o}=r;if(r.edge===Bo&&t.type==="EUROPEAN"){let c=this.europeanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:a}=c.outputs;return{...c,outputs:{type:"european",betOutcomes:a,result:c.outputs.result}}}if(r.edge===no&&t.type==="AMERICAN"){let c=this.americanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:a}=c.outputs;return{...c,outputs:{type:"american",betOutcomes:a,result:c.outputs.result}}}throw E.createValidationError(`Attempted to play ${t.type} roulette on edge ${r.edge}`)}}var Ya=(r)=>{return new vr().getBetAmount(r)};var Xa=(r)=>{if(r.type==="EUROPEAN")k(r.inputs);else v(r.inputs)};import{Big as ho}from"big.js";var s;((c)=>{c.LOW_RISK="LOW_RISK";c.MEDIUM_RISK="MEDIUM_RISK";c.HIGH_RISK="HIGH_RISK"})(s||={});var P;((A)=>{A[A.TEN=10]="TEN";A[A.TWENTY=20]="TWENTY";A[A.THIRTY=30]="THIRTY";A[A.FORTY=40]="FORTY";A[A.FIFTY=50]="FIFTY"})(P||={});var Oo={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},xo={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},uo={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},Co={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},Do={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},Kr=new S(new Map([[1,Oo],[2,xo],[3,uo],[4,Co],[8,Do]]));var gr={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class yo extends n{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(!Object.values(P).includes(t.segments))throw new Error("Invalid segments value");if(!Object.values(s).includes(t.riskLevel))throw new Error("Invalid risk level");let a=Kr.getMultipliers(o)[t.riskLevel];if(a===void 0)throw new Error(`No multipliers found for risk level ${t.riskLevel}`);let A=a[t.segments];if(A===void 0)throw new Error(`No multipliers found for segment ${t.segments}`);let i=gr[t.riskLevel];if(i===void 0)throw new Error(`No patterns found for risk level ${t.riskLevel}`);let f=i[t.segments];if(f===void 0)throw new Error(`No patterns found for segment ${t.segments}`);let p=r.getRandomInt({min:0,max:f.length-1}),B=f[p.value];if(B===void 0)throw new Error(`No pattern found for segment ${t.segments} and value ${p.value}`);let O=A[B];if(O===void 0)throw new Error(`No payout found for picked segment ${B}`);return{isFinished:!0,payoutMultiplier:new ho(O),outputs:{result:p.values},randomValues:p}}}export{Xa as validateRouletteGameInputs,Uo as validateAdvancedDiceInputs,Vt as rtp99Multipliers,bt as rtp98Multipliers,st as rtp97Multipliers,Pt as rtp96Multipliers,Ft as rtp92Multipliers,Fr as plinkoMultipliers,nr as nCr,Vr as kenoMultipliers,Mr as isTileCount,Ut as hasDiceWon,Gt as diamondsMultipliers,Ya as calculateRouletteBetAmount,I as calculateMultiplier,mt as calculateDiceWinChance,Ct as calculateBaccaratBetAmount,hr as calculateAdvancedDiceWinChance,sr as bigMin,br as bigMax,Et as advancedDiceIsWithinBoundsInclusive,g as advancedDiceIsWithinBoundsExclusive,dt as advancedDiceGetInclusiveBoundsRange,rr as advancedDiceGetExclusiveBoundsRange,P as WheelSegments,s as WheelRiskLevel,yo as Wheel,Bt as VALID_SUITS,nt as VALID_RANKS,$r as VALID_EUROPEAN_STREETS,Or as VALID_EUROPEAN_STRAIGHTS,Ir as VALID_EUROPEAN_SPLITS,Qr as VALID_EUROPEAN_DOUBLE_STREETS,Jr as VALID_EUROPEAN_CORNERS,zr as VALID_AMERICAN_STREETS,Rr as VALID_AMERICAN_STRAIGHTS,Yr as VALID_AMERICAN_SPLITS,Wr as VALID_AMERICAN_DOUBLE_STREETS,qr as VALID_AMERICAN_CORNERS,Ao as TOP_COLUMN,Mt as TILE_COUNTS,xr as RouletteType,vr as Roulette,ft as RollType,fo as RED_NUMBERS,tr as RANDOM_MIN_VALUE,or as RANDOM_MAX_VALUE,Pr as PlinkoRiskLevel,Lt as Plinko,w as Parity,ha as PLINKO_ROW_COUNTS,ao as PAYOUT_MULTIPLIERS,C as OrigamiGame,$t as Mines,ot as MIN_WIN_CHANCE,io as MIDDLE_COLUMN,ct as MAX_WIN_CHANCE,Yt as Limbo,er as KenoRiskLevel,It as Keno,H as Half,rt as GameErrorCode,E as GameError,n as Game,Lr as EuropeanRoulette,Bo as EUROPEAN_HOUSE_EDGE,Cr as EFFECTIVE_RANGE,j as Dozen,jt as DiceDirection,et as Dice,St as DiamondsResultType,lt as Diamonds,mr as DICE_EFFECTIVE_RANGE,l as Column,G as Color,q as BlackjackOutcome,T as BlackjackHand,X as BlackjackAction,jr as Blackjack,Ot as BaccaratOutcome,xt as BaccaratBetType,Dt as Baccarat,Eo as BOTTOM_COLUMN,po as BLACK_NUMBERS,kr as AmericanRoulette,pt as AdvancedDice,no as AMERICAN_HOUSE_EDGE,Xr as AMERICAN_BASKET};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@betorigami/game-calculations",
3
- "version": "4.0.9",
3
+ "version": "4.0.10",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",
@@ -21,7 +21,8 @@
21
21
  "watch": "bun run --watch src/index.ts",
22
22
  "test": "bun test",
23
23
  "test:watch": "bun test --watch",
24
- "bundlemon": "bundlemon --subProject game-calculations"
24
+ "bundlemon": "bundlemon --subProject game-calculations",
25
+ "format": "biome format --write"
25
26
  },
26
27
  "devDependencies": {
27
28
  "@betorigami/provably-fair-rng": "^1.0.0",