@betorigami/game-calculations 0.0.0-sha-13931c3-20251102233803 → 0.0.0-sha-1cccfe3-20251111222055
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 +1 -1
- package/dist/index.d.ts +29 -14
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var Le=Object.create;var{getPrototypeOf:be,defineProperty:y,getOwnPropertyNames:X,getOwnPropertyDescriptor:Ae}=Object,Z=Object.prototype.hasOwnProperty;var w=(t,e,r)=>{r=t!=null?Le(be(t)):{};let i=e||!t||!t.__esModule?y(r,"default",{value:t,enumerable:!0}):r;for(let o of X(t))if(!Z.call(i,o))y(i,o,{get:()=>t[o],enumerable:!0});return i},Q=new WeakMap,Ie=(t)=>{var e=Q.get(t),r;if(e)return e;if(e=y({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function")X(t).map((i)=>!Z.call(e,i)&&y(e,i,{get:()=>t[i],enumerable:!(r=Ae(t,i))||r.enumerable}));return Q.set(t,e),e};var _e=(t,e)=>{for(var r in e)y(t,r,{get:e[r],enumerable:!0,configurable:!0,set:(i)=>e[r]=()=>i})};var De={};_e(De,{WheelSegments:()=>T,WheelRiskLevel:()=>D,Wheel:()=>ye,VALID_SUITS:()=>te,VALID_RANKS:()=>re,VALID_EUROPEAN_STREETS:()=>F,VALID_EUROPEAN_STRAIGHTS:()=>x,VALID_EUROPEAN_SPLITS:()=>U,VALID_EUROPEAN_DOUBLE_STREETS:()=>Y,VALID_EUROPEAN_CORNERS:()=>q,VALID_AMERICAN_STREETS:()=>$,VALID_AMERICAN_STRAIGHTS:()=>g,VALID_AMERICAN_SPLITS:()=>z,VALID_AMERICAN_DOUBLE_STREETS:()=>J,VALID_AMERICAN_CORNERS:()=>j,Roulette:()=>Ee,PlinkoRiskLevel:()=>V,Plinko:()=>he,Parity:()=>A,OrigamiGame:()=>B,Mines:()=>fe,Limbo:()=>Be,KenoRiskLevel:()=>ce,Keno:()=>de,Half:()=>_,Game:()=>u,Dozen:()=>M,DiceDirection:()=>ae,Dice:()=>ue,DiamondsResultType:()=>le,Diamonds:()=>se,Column:()=>G,Color:()=>I,BaccaratOutcome:()=>ie,Baccarat:()=>oe,AdvancedDice:()=>ee,AMERICAN_BASKET:()=>C});module.exports=Ie(De);var B;((a)=>{a.DICE="DICE";a.MINES="MINES";a.KENO="KENO";a.LIMBO="LIMBO";a.ADVANCED_DICE="ADVANCED_DICE";a.BACCARAT="BACCARAT";a.DIAMONDS="DIAMONDS";a.PLINKO="PLINKO";a.ROULETTE="ROULETTE";a.WHEEL="WHEEL"})(B||={});class u{gameId;constructor(t){this.gameId=t}getGameResult(t){return this.determineGameResult(t)}}var R=require("big.js"),Ge=(t,e)=>e>=t.lower&&e<=t.upper,Me=(t)=>t.upper-t.lower+1,W=(t,e)=>e>t.lower&&e<t.upper,P=(t)=>t.upper-t.lower-1,L={min:0,max:1e4,effectiveRange:10001};class ee extends u{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt(L),o=i.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"roll-between":return this.calculateRollBetweenPayoutMultiplier(r.bounds,o,e);case"roll-outside":return this.calculateRollOutsidePayoutMultiplier(r.bounds,o,e);case"roll-between-two":return this.calculateRollBetweenTwoPayoutMultiplier(r.firstBounds,r.secondBounds,o,e)}})(),outputs:{result:i.values},randomValues:i}}calculateRollBetweenPayoutMultiplier(t,e,r){if(!W(t,e))return R.Big(0);let i=P(t),o=R.Big(i).div(L.effectiveRange).mul(100);return R.Big(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(Ge(t,e))return R.Big(0);let i=L.effectiveRange-Me(t),o=R.Big(i).div(L.effectiveRange).mul(100);return R.Big(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!W(t,r)&&!W(e,r))return R.Big(0);let o=P(t)+P(e),n=R.Big(o).div(L.effectiveRange).mul(100);return R.Big(100-i).div(n)}}var h=w(require("big.js"));var te=["Clubs","Diamonds","Hearts","Spades"],re=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],ie;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(ie||={});class oe extends u{constructor(){super("BACCARAT")}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(e);let i=t.getRandomIntsWithReplacement({min:0,max:51,count:6}),o=i.values,n=o.slice(0,3),s=o.slice(3,6),d=[],m=0;for(let c of n.slice(0,2)){let p=this.mapRandomValueToCard(c),O=this.mapRandomValueToCardValue(c);d.push(p),m=(m+O)%10}let v=[],a=0;for(let c of s.slice(0,2)){let p=this.mapRandomValueToCard(c),O=this.mapRandomValueToCardValue(c);v.push(p),a=(a+O)%10}if(!this.isNaturalWin(m,a)){let c=this.shouldDrawThirdPlayerCard(m),p=null;if(c)p=this.mapRandomValueToCardValue(n[2]),d.push(this.mapRandomValueToCard(n[2])),m=(m+p)%10;if(this.shouldDrawThirdBankerCard(a,p))v.push(this.mapRandomValueToCard(s[2])),a=(a+this.mapRandomValueToCardValue(s[2]))%10}let f;if(m===a)f="TIE";else f=m>a?"PLAYER_WIN":"BANKER_WIN";let S=new h.default(0).add(e.playerBets.reduce((c,p)=>c.add(p.amount),new h.default(0))).add(e.tieBets.reduce((c,p)=>c.add(p.amount),new h.default(0))).add(e.bankerBets.reduce((c,p)=>c.add(p.amount),new h.default(0))),k=new h.default(0).add(e.playerBets.filter((c)=>f==="PLAYER_WIN").reduce((c,p)=>c.add(p.amount.mul(2)),new h.default(0))).add(e.tieBets.filter((c)=>f==="TIE").reduce((c,p)=>c.add(p.amount.mul(8)),new h.default(0))).add(e.bankerBets.filter((c)=>f==="BANKER_WIN").reduce((c,p)=>c.add(p.amount.mul(1.95)),new h.default(0)));return{isFinished:!0,payoutMultiplier:S.gt(0)?k.div(S):new h.default(0),outputs:{playerCards:d,playerHandValue:m,bankerCards:v,bankerHandValue:a,gameOutcome:f,result:i.values},randomValues:i}}validateGameInputs(t){if(t.playerBets.length===0&&t.tieBets.length===0&&t.bankerBets.length===0)throw new Error("Must place at least a single bet.");if(!t.playerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid player bet.");if(!t.tieBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid tie bet.");if(!t.bankerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid banker bet.")}mapRandomValueToCard(t){let e=te[Math.floor(t/13)],r=re[t%13];return{suit:e,rank:r}}isNaturalWin(t,e){let r=[8,9];return r.includes(t)||r.includes(e)}mapRandomValueToCardValue(t){let e=t%13;if(e===0)return 1;if(e>=10)return 10;return e+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,e){if(e===null)return t<=5;if(t<=2)return!0;if(t===3)return e!==8;if(t===4)return[2,3,4,5,6,7].includes(e);if(t===5)return[4,5,6,7].includes(e);if(t===6)return[6,7].includes(e);return!1}}var ne=w(require("big.js")),le;((s)=>{s.PAIR="PAIR";s.TWO_PAIR="TWO_PAIR";s.THREE_OF_A_KIND="THREE_OF_A_KIND";s.FULL_HOUSE="FULL_HOUSE";s.FOUR_OF_A_KIND="FOUR_OF_A_KIND";s.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(le||={});var ke={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},Oe={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class se extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??ke}constructor(t){super("DIAMONDS");this.multiplierOverrides=t}determineGameResult({generator:t,edge:e}){let r=t.getRandomIntsWithReplacement({min:0,max:6,count:5});if(e!==1&&!this.multiplierOverrides)throw new Error("Use multiplier overrides if an edge of 1% is not desirable");let i=r.values,o=this.calculatePayoutMultiplier(i);return{isFinished:!0,payoutMultiplier:ne.default(o),outputs:{result:r.values},randomValues:r}}calculatePayoutMultiplier(t){let e=new Map;for(let o of t){let n=e.get(o)||0;e.set(o,n+1)}let r=[...e.values()].filter((o)=>o>1),i=this.classifyResult(r);return i===null?0:this.multipliers[i]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[e,r]=t;if(e===void 0)return null;if(r===void 0){let i=Oe[e];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${e}`);return i}return e===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}var K=w(require("big.js"));var ae;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(ae||={});class ue extends u{constructor(){super("DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:0,max:1e4}),o=i.min,d=i.max-o+1-1,m=r.direction==="ABOVE"?d-r.selectedValue:r.selectedValue,v=new K.default(m).div(d).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?i.value>r.selectedValue:i.value<r.selectedValue)?new K.default(100-e).div(v):new K.default(0),outputs:{result:i.values},randomValues:i}}}var H=w(require("big.js"));var ce;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(ce||={});var Ke={[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]}};class de extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ke}constructor(t){super("KENO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,edge:e,gameInputs:r}){if(e!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(r.selectedNumbers.length===0)throw new Error("No numbers selected");if(r.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let s of r.selectedNumbers){if(s%1!==0)throw new Error("Only integers can be selected");if(s<0||s>39)throw new Error("Invalid number selected")}let i=t.getUniqueRandomInts({min:0,max:39,count:10}),o=r.selectedNumbers.filter((s)=>i.values.includes(s));return{isFinished:!0,payoutMultiplier:o.length>0?new H.default(this.multipliers[r.selectedNumbers.length][r.riskLevel][o.length]??0):new H.default(0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){for(let[e,r]of Object.entries(t)){let i=Number(e);for(let[o,n]of Object.entries(r))if(n.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${o}. Expected ${i+1}, but got ${n.length}`)}}}var E=w(require("big.js"));var pe=(t,e)=>{return t.gt(e)?t:e};var me=(t,e)=>{return t.lt(e)?t:e};class Be extends u{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:1,max:4294967295}),o=i.max,n=new E.default(16777216),s=new E.default(1),d=new E.default(1e6),m=i.value,v=new E.default(m-1).div(o),a=(100-e)/100,f=n.div(v.mul(n).plus(1)).mul(a),S=pe(s,me(f,d));return{isFinished:!0,payoutMultiplier:S.gte(r.targetMultiplier)?new E.default(r.targetMultiplier):new E.default(0),outputs:{randomMultiplier:S,result:i.values},randomValues:i}}}var b=w(require("big.js"));var N=(t,e)=>{if(e<0||t<0||e>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(e>t-e)e=t-e;let r=1;for(let i=1;i<=e;i++)r=r*(t-i+1)/i;return r};class fe extends u{constructor(){super("MINES")}determineGameResult({generator:t,edge:e,gameInputs:r}){if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>25-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let s=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),d=s.values.some((k)=>r.selectedTiles.includes(k)),m=r.hasCashedOut||d,v=(100-e)/100,a=new b.default(N(25-r.minesCount,r.selectedTiles.length)).div(new b.default(N(25,r.selectedTiles.length))),S=r.hasCashedOut&&!d?new b.default(v).div(a):new b.default(0);return{isFinished:m,payoutMultiplier:S,outputs:{result:s.values},randomValues:s}}}var Re=require("big.js");var V;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(V||={});var xe=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[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"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}];class he extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??xe}constructor(t){super("PLINKO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(e.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(e.numberOfRows<8||e.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let i=t.getRandomIntsWithReplacement({min:0,max:1,count:e.numberOfRows}),n=i.values.reduce((d,m)=>d+m,0);return{isFinished:!0,payoutMultiplier:new Re.Big(this.multipliers.find((d)=>d.rows===e.numberOfRows)?.payout[e.riskLevel][n]??0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){for(let e of Array.from({length:9},(r,i)=>i+8)){if(!t.some((i)=>i.rows===e))throw new Error(`Multiplier overrides for ${e} rows is missing.`);let r=Object.values(V);for(let i of r){let o=t.find((n)=>n.rows===e&&n.payout[i]);if(!o)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level is missing.`);if(o.payout[i].length!==e+1)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level has an invalid length.`)}}}}var l=require("big.js");var x=[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],g=[37,...x],U=[[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]],z=[[0,1],[0,3],[0,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]],F=[[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]],$=[[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]],q=[[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]],j=[[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]],C=[0,1,2,3,37],Y=[[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]],J=[[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]],A;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(A||={});var I;((r)=>{r.RED="RED";r.BLACK="BLACK"})(I||={});var _;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(_||={});var G;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(G||={});var M;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(M||={});class ve extends u{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:e}){this.validateGameInputs(e);let r=t.getRandomInt({min:0,max:36}),i=r.value,o=this.determineBetOutcomes(e,i),n=this.calculateTotalBetAmount(e),s=this.calculateTotalPayoutAmount(o),d=n.gt(0)?s.div(n):new l.Big(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:d,isFinished:!0,randomValues:r}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(I).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return x.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return U.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return F.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return q.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return Y.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l.Big(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0)))}calculateTotalPayoutAmount(t){return new l.Big(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l.Big(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l.Big(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l.Big(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l.Big(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l.Big(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0)))}}class Se extends u{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:e}){this.validateGameInputs(e);let r=t.getRandomInt({min:0,max:37}),i=r.value,o=this.determineBetOutcomes(e,i),n=this.calculateTotalBetAmount(e),s=this.calculateTotalPayoutAmount(o),d=n.gt(0)?s.div(n):new l.Big(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:d,isFinished:!0,randomValues:r}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.basketBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid basket bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(I).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return g.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return z.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return $.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return j.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return J.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>C.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>!C.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0||e===37)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l.Big(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.basketBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0)))}calculateTotalPayoutAmount(t){return new l.Big(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l.Big(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l.Big(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l.Big(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l.Big(0))).add(t.winningBets.basketBets.reduce((e,r)=>e.plus(r.amount.mul(7)),new l.Big(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l.Big(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0)))}}class Ee extends u{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new ve,this.americanGame=new Se}determineGameResult(t){let{gameInputs:e,...r}=t;if(t.edge===2.7&&e.type==="european"){let i=this.europeanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:o,result:i.outputs.result}}}if(t.edge===5.3&&e.type==="american"){let i=this.americanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:o,result:i.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}var we=require("big.js");var D;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(D||={});var T;((n)=>{n[n.TEN=10]="TEN";n[n.TWENTY=20]="TWENTY";n[n.THIRTY=30]="THIRTY";n[n.FORTY=40]="FORTY";n[n.FIFTY=50]="FIFTY"})(T||={});var Ce=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}];class ye extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ce}constructor(t){super("WHEEL");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(!Object.values(T).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(D).includes(e.riskLevel))throw new Error("Invalid risk level");let i=t.getRandomInt({min:0,max:e.segments-1}),o=this.multipliers.find((d)=>d.segments===e.segments);if(o===void 0)throw new Error(`Multiplier not found for segment ${e.segments}`);let n=o.payout[e.riskLevel][i.value];if(n===void 0)throw new Error(`Payout not found for risk ${e.riskLevel} and value ${i.value}`);return{isFinished:!0,payoutMultiplier:new we.Big(n),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){let e=Object.values(T).filter((r)=>typeof r==="number");for(let r of e){if(!t.some((o)=>o.segments===r))throw new Error(`Multiplier overrides for ${r} segments is missing.`);let i=Object.values(D);for(let o of i){let n=t.find((s)=>s.segments===r&&s.payout[o]);if(!n)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level is missing.`);if(n.payout[o].length!==r)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level has an invalid length.`)}}}}
|
|
1
|
+
var Ve=Object.create;var{getPrototypeOf:Pe,defineProperty:w,getOwnPropertyNames:oe,getOwnPropertyDescriptor:We}=Object,ne=Object.prototype.hasOwnProperty;var K=(r,e,i)=>{i=r!=null?Ve(Pe(r)):{};let o=e||!r||!r.__esModule?w(i,"default",{value:r,enumerable:!0}):i;for(let n of oe(r))if(!ne.call(o,n))w(o,n,{get:()=>r[n],enumerable:!0});return o},ie=new WeakMap,He=(r)=>{var e=ie.get(r),i;if(e)return e;if(e=w({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")oe(r).map((o)=>!ne.call(e,o)&&w(e,o,{get:()=>r[o],enumerable:!(i=We(r,o))||i.enumerable}));return ie.set(r,e),e};var Ue=(r,e)=>{for(var i in e)w(r,i,{get:e[i],enumerable:!0,configurable:!0,set:(o)=>e[i]=()=>o})};var tr={};Ue(tr,{validateRouletteGameInputs:()=>or,calculateRouletteBetAmount:()=>ir,calculateBaccaratBetAmount:()=>pe,WheelSegments:()=>m,WheelRiskLevel:()=>U,Wheel:()=>De,VALID_SUITS:()=>se,VALID_RANKS:()=>ce,VALID_EUROPEAN_STREETS:()=>X,VALID_EUROPEAN_STRAIGHTS:()=>V,VALID_EUROPEAN_SPLITS:()=>J,VALID_EUROPEAN_DOUBLE_STREETS:()=>ee,VALID_EUROPEAN_CORNERS:()=>b,VALID_AMERICAN_STREETS:()=>Z,VALID_AMERICAN_STRAIGHTS:()=>z,VALID_AMERICAN_SPLITS:()=>Q,VALID_AMERICAN_DOUBLE_STREETS:()=>re,VALID_AMERICAN_CORNERS:()=>g,Roulette:()=>Oe,RollType:()=>te,PlinkoRiskLevel:()=>q,Plinko:()=>Ge,Parity:()=>B,OrigamiGame:()=>u,Mines:()=>ye,Limbo:()=>Ae,KenoRiskLevel:()=>he,Keno:()=>ve,Half:()=>y,GameErrorCode:()=>Ke,GameError:()=>c,Game:()=>d,Dozen:()=>G,DiceDirection:()=>Re,Dice:()=>Le,DiamondsResultType:()=>fe,Diamonds:()=>Se,Column:()=>M,Color:()=>A,BaccaratOutcome:()=>ae,BaccaratBetType:()=>de,Baccarat:()=>Ee,AdvancedDice:()=>le,AMERICAN_BASKET:()=>P});module.exports=He(tr);var u;((a)=>{a.DICE="DICE";a.MINES="MINES";a.KENO="KENO";a.LIMBO="LIMBO";a.ADVANCED_DICE="ADVANCED_DICE";a.BACCARAT="BACCARAT";a.DIAMONDS="DIAMONDS";a.PLINKO="PLINKO";a.ROULETTE="ROULETTE";a.WHEEL="WHEEL"})(u||={});class d{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}var S=require("big.js"),me=(r,e)=>e>=r.lower&&e<=r.upper,$e=(r)=>r.upper-r.lower+1,$=(r,e)=>e>r.lower&&e<r.upper,F=(r)=>r.upper-r.lower-1,te;((o)=>{o.ROLL_BETWEEN="ROLL_BETWEEN";o.ROLL_OUTSIDE="ROLL_OUTSIDE";o.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(te||={});var x={min:0,max:1e4,effectiveRange:10001};class le extends d{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:e,gameInputs:i}){let o=r.getRandomInt(x),n=o.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(i.mode){case"ROLL_BETWEEN":return this.calculateRollBetweenPayoutMultiplier(i.bounds,n,e);case"ROLL_OUTSIDE":return this.calculateRollOutsidePayoutMultiplier(i.bounds,n,e);case"ROLL_BETWEEN_TWO":return this.calculateRollBetweenTwoPayoutMultiplier(i.firstBounds,i.secondBounds,n,e)}})(),outputs:{result:o.values},randomValues:o}}calculateRollBetweenPayoutMultiplier(r,e,i){if(!$(r,e))return S.Big(0);let o=F(r),n=S.Big(o).div(x.effectiveRange).mul(100);return S.Big(100-i).div(n)}calculateRollOutsidePayoutMultiplier(r,e,i){if(me(r,e))return S.Big(0);let o=x.effectiveRange-$e(r),n=S.Big(o).div(x.effectiveRange).mul(100);return S.Big(100-i).div(n)}calculateRollBetweenTwoPayoutMultiplier(r,e,i,o){if(!$(r,i)&&!$(e,i))return S.Big(0);let n=F(r)+F(e),t=S.Big(n).div(x.effectiveRange).mul(100);return S.Big(100-o).div(t)}}var k=K(require("big.js"));var se=["Clubs","Diamonds","Hearts","Spades"],ce=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],ae;((o)=>{o.PLAYER_WIN="PLAYER_WIN";o.TIE="TIE";o.BANKER_WIN="BANKER_WIN"})(ae||={});var de;((o)=>{o.PLAYER="PLAYER";o.TIE="TIE";o.BANKER="BANKER"})(de||={});var Fe={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},pe=(r)=>{return new k.default(0).add(r.bets.reduce((i,o)=>i.add(o.amount),new k.default(0)))};class Ee extends d{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:e,edge:i}){if(i!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(e);let o=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),n=o.values,t=n.slice(0,3),s=n.slice(3,6),p=[],E=0;for(let f of t.slice(0,2)){let L=this.mapRandomValueToCard(f),C=this.mapRandomValueToCardValue(f);p.push(L),E=(E+C)%10}let R=[],a=0;for(let f of s.slice(0,2)){let L=this.mapRandomValueToCard(f),C=this.mapRandomValueToCardValue(f);R.push(L),a=(a+C)%10}if(!this.isNaturalWin(E,a)){let f=this.shouldDrawThirdPlayerCard(E),L=null;if(f)L=this.mapRandomValueToCardValue(t[2]),p.push(this.mapRandomValueToCard(t[2])),E=(E+L)%10;if(this.shouldDrawThirdBankerCard(a,L))R.push(this.mapRandomValueToCard(s[2])),a=(a+this.mapRandomValueToCardValue(s[2]))%10}let h;if(E===a)h="TIE";else h=E>a?"PLAYER_WIN":"BANKER_WIN";let v=pe(e),{betType:D,multiplier:Ce}=Fe[h],Ne=new k.default(0).add(e.bets.filter((f)=>f.type===D).reduce((f,L)=>f.add(L.amount.mul(Ce)),new k.default(0)));return{isFinished:!0,payoutMultiplier:v.gt(0)?Ne.div(v):new k.default(0),outputs:{playerCards:p,playerHandValue:E,bankerCards:R,bankerHandValue:a,gameOutcome:h,result:o.values},randomValues:o}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((e)=>e.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let e=se[Math.floor(r/13)],i=ce[r%13];return{suit:e,rank:i}}isNaturalWin(r,e){let i=[8,9];return i.includes(r)||i.includes(e)}mapRandomValueToCardValue(r){let e=r%13;if(e===0)return 1;if(e>=10)return 10;return e+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,e){if(e===null)return r<=5;if(r<=2)return!0;if(r===3)return e!==8;if(r===4)return[2,3,4,5,6,7].includes(e);if(r===5)return[4,5,6,7].includes(e);if(r===6)return[6,7].includes(e);return!1}}var ue=K(require("big.js")),fe;((s)=>{s.PAIR="PAIR";s.TWO_PAIR="TWO_PAIR";s.THREE_OF_A_KIND="THREE_OF_A_KIND";s.FULL_HOUSE="FULL_HOUSE";s.FOUR_OF_A_KIND="FOUR_OF_A_KIND";s.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(fe||={});var je={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},Ye={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Se extends d{multiplierOverrides;get multipliers(){return this.multiplierOverrides??je}constructor(r){super("DIAMONDS");this.multiplierOverrides=r}determineGameResult({generator:r,edge:e}){let i=r.getRandomIntsWithReplacement({min:0,max:6,count:5});if(e!==1&&!this.multiplierOverrides)throw new Error("Use multiplier overrides if an edge of 1% is not desirable");let o=i.values,n=this.calculatePayoutMultiplier(o);return{isFinished:!0,payoutMultiplier:ue.default(n),outputs:{result:i.values},randomValues:i}}calculatePayoutMultiplier(r){let e=new Map;for(let n of r){let t=e.get(n)||0;e.set(n,t+1)}let i=[...e.values()].filter((n)=>n>1),o=this.classifyResult(i);return o===null?0:this.multipliers[o]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[e,i]=r;if(e===void 0)return null;if(i===void 0){let o=Ye[e];if(o===void 0)throw new Error(`Unexpected single diamond repeat count: ${e}`);return o}return e===3||i===3?"FULL_HOUSE":"TWO_PAIR"}}var N=K(require("big.js"));var Re;((i)=>{i.ABOVE="ABOVE";i.BELOW="BELOW"})(Re||={});class Le extends d{constructor(){super("DICE")}determineGameResult({generator:r,edge:e,gameInputs:i}){let o=r.getRandomInt({min:0,max:1e4}),n=o.min,p=o.max-n+1-1,E=i.direction==="ABOVE"?p-i.selectedValue:i.selectedValue,R=new N.default(E).div(p).mul(100);return{isFinished:!0,payoutMultiplier:(i.direction==="ABOVE"?o.value>i.selectedValue:o.value<i.selectedValue)?new N.default(100-e).div(R):new N.default(0),outputs:{result:o.values},randomValues:o}}}var j=K(require("big.js"));var he;((n)=>{n.CLASSIC="CLASSIC";n.LOW_RISK="LOW_RISK";n.MEDIUM_RISK="MEDIUM_RISK";n.HIGH_RISK="HIGH_RISK"})(he||={});var qe={[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]}};class ve extends d{multiplierOverrides;get multipliers(){return this.multiplierOverrides??qe}constructor(r){super("KENO");this.multiplierOverrides=r;if(r)this.validateMultiplierOverrides(r)}determineGameResult({generator:r,edge:e,gameInputs:i}){if(e!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(i.selectedNumbers.length===0)throw new Error("No numbers selected");if(i.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let s of i.selectedNumbers){if(s%1!==0)throw new Error("Only integers can be selected");if(s<0||s>39)throw new Error("Invalid number selected")}let o=r.getUniqueRandomInts({min:0,max:39,count:10}),n=i.selectedNumbers.filter((s)=>o.values.includes(s));return{isFinished:!0,payoutMultiplier:n.length>0?new j.default(this.multipliers[i.selectedNumbers.length][i.riskLevel][n.length]??0):new j.default(0),outputs:{result:o.values},randomValues:o}}validateMultiplierOverrides(r){for(let[e,i]of Object.entries(r)){let o=Number(e);for(let[n,t]of Object.entries(i))if(t.length!==o+1)throw new Error(`Invalid count of multipliers for tiles ${o} and risk level ${n}. Expected ${o+1}, but got ${t.length}`)}}}var _=K(require("big.js"));var _e=(r,e)=>{return r.gt(e)?r:e};var Be=(r,e)=>{return r.lt(e)?r:e};class Ae extends d{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:e,gameInputs:i}){let o=r.getRandomInt({min:1,max:4294967295}),n=o.max,t=new _.default(16777216),s=new _.default(1),p=new _.default(1e6),E=o.value,R=new _.default(E-1).div(n),a=(100-e)/100,h=t.div(R.mul(t).plus(1)).mul(a),v=_e(s,Be(h,p));return{isFinished:!0,payoutMultiplier:v.gte(i.targetMultiplier)?new _.default(i.targetMultiplier):new _.default(0),outputs:{randomMultiplier:v,result:o.values},randomValues:o}}}var T=K(require("big.js"));var Y=(r,e)=>{if(e<0||r<0||e>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(e>r-e)e=r-e;let i=1;for(let o=1;o<=e;o++)i=i*(r-o+1)/o;return i};class ye extends d{constructor(){super("MINES")}determineGameResult({generator:r,edge:e,gameInputs:i}){if(i.minesCount<=0||i.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(i.selectedTiles.length>25-i.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let s=r.getUniqueRandomInts({min:1,max:25,count:i.minesCount}),p=s.values.some((D)=>i.selectedTiles.includes(D)),E=i.hasCashedOut||p,R=(100-e)/100,a=new T.default(Y(25-i.minesCount,i.selectedTiles.length)).div(new T.default(Y(25,i.selectedTiles.length))),v=i.hasCashedOut&&!p?new T.default(R).div(a):new T.default(0);return{isFinished:E,payoutMultiplier:v,outputs:{result:s.values},randomValues:s}}}var Me=require("big.js");var q;((o)=>{o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(q||={});var ze=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[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"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}];class Ge extends d{multiplierOverrides;get multipliers(){return this.multiplierOverrides??ze}constructor(r){super("PLINKO");this.multiplierOverrides=r;if(r)this.validateMultiplierOverrides(r)}determineGameResult({generator:r,gameInputs:e,edge:i}){if(i!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(e.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(e.numberOfRows<8||e.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let o=r.getRandomIntsWithReplacement({min:0,max:1,count:e.numberOfRows}),t=o.values.reduce((p,E)=>p+E,0);return{isFinished:!0,payoutMultiplier:new Me.Big(this.multipliers.find((p)=>p.rows===e.numberOfRows)?.payout[e.riskLevel][t]??0),outputs:{result:o.values},randomValues:o}}validateMultiplierOverrides(r){for(let e of Array.from({length:9},(i,o)=>o+8)){if(!r.some((o)=>o.rows===e))throw new Error(`Multiplier overrides for ${e} rows is missing.`);let i=Object.values(q);for(let o of i){let n=r.find((t)=>t.rows===e&&t.payout[o]);if(!n)throw new Error(`Multiplier overrides for ${e} rows and ${o} risk level is missing.`);if(n.payout[o].length!==e+1)throw new Error(`Multiplier overrides for ${e} rows and ${o} risk level has an invalid length.`)}}}}var l=require("big.js");var V=[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],z=[37,...V],J=[[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]],Q=[[0,1],[0,3],[0,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]],X=[[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]],Z=[[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]],b=[[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]],g=[[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]],P=[0,1,2,3,37],ee=[[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]],re=[[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]],B;((i)=>{i.EVEN="EVEN";i.ODD="ODD"})(B||={});var A;((i)=>{i.RED="RED";i.BLACK="BLACK"})(A||={});var y;((i)=>{i.LOW="LOW";i.HIGH="HIGH"})(y||={});var M;((o)=>{o.TOP="TOP";o.MIDDLE="MIDDLE";o.BOTTOM="BOTTOM"})(M||={});var G;((o)=>{o.FIRST="FIRST";o.SECOND="SECOND";o.THIRD="THIRD"})(G||={});var Ke;((e)=>e.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Ke||={});class c extends Error{static createValidationError(r){return new c("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof c}errorCode;constructor(r,e){super(e);this.errorCode=r}}var W=(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 c.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((e)=>e.amount.gte(0)&&O(e.value)))throw c.createValidationError("Invalid straight bet.");if(!r.splitBets.every((e)=>e.amount.gte(0)&&Je(e.values)))throw c.createValidationError("Invalid split bet.");if(!r.streetBets.every((e)=>e.amount.gte(0)&&Qe(e.values)))throw c.createValidationError("Invalid street bet.");if(!r.cornerBets.every((e)=>e.amount.gte(0)&&Xe(e.values)))throw c.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((e)=>e.amount.gte(0)&&Ze(e.values)))throw c.createValidationError("Invalid double street bet.");if(!r.parityBets.every((e)=>e.amount.gte(0)&&Object.values(B).includes(e.parity)))throw c.createValidationError("Invalid parity bet.");if(!r.colorBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.color)))throw c.createValidationError("Invalid color bet.");if(!r.halfBets.every((e)=>e.amount.gte(0)&&Object.values(y).includes(e.half)))throw c.createValidationError("Invalid half bet.");if(!r.columnBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.column)))throw c.createValidationError("Invalid column bet.");if(!r.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.dozen)))throw c.createValidationError("Invalid dozen bet.")},O=(r)=>{return V.includes(r)},Je=(r)=>{if(r.length!==2)return!1;if(!r.every(O))return!1;return J.some(([e,i])=>e===r[0]&&i===r[1])},Qe=(r)=>{if(r.length!==3)return!1;if(!r.every(O))return!1;return X.some(([e,i,o])=>e===r[0]&&i===r[1]&&o===r[2])},Xe=(r)=>{if(r.length!==4)return!1;if(!r.every(O))return!1;return b.some(([e,i,o,n])=>e===r[0]&&i===r[1]&&o===r[2]&&n===r[3])},Ze=(r)=>{if(r.length!==6)return!1;if(!r.every(O))return!1;return ee.some(([e,i,o,n,t,s])=>e===r[0]&&i===r[1]&&o===r[2]&&n===r[3]&&t===r[4]&&s===r[5])};var H=(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 c.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((e)=>e.amount.gte(0)&&I(e.value)))throw c.createValidationError("Invalid straight bet.");if(!r.splitBets.every((e)=>e.amount.gte(0)&&be(e.values)))throw c.createValidationError("Invalid split bet.");if(!r.streetBets.every((e)=>e.amount.gte(0)&&ge(e.values)))throw c.createValidationError("Invalid street bet.");if(!r.cornerBets.every((e)=>e.amount.gte(0)&&er(e.values)))throw c.createValidationError("Invalid corner bet.");if(!r.basketBets.every((e)=>e.amount.gte(0)))throw c.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((e)=>e.amount.gte(0)&&rr(e.values)))throw c.createValidationError("Invalid double street bet.");if(!r.parityBets.every((e)=>e.amount.gte(0)&&Object.values(B).includes(e.parity)))throw c.createValidationError("Invalid parity bet.");if(!r.colorBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.color)))throw c.createValidationError("Invalid color bet.");if(!r.halfBets.every((e)=>e.amount.gte(0)&&Object.values(y).includes(e.half)))throw c.createValidationError("Invalid half bet.");if(!r.columnBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.column)))throw c.createValidationError("Invalid column bet.");if(!r.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.dozen)))throw c.createValidationError("Invalid dozen bet.")},I=(r)=>{return z.includes(r)};function be(r){if(r.length!==2)return!1;if(!r.every(I))return!1;return Q.some(([e,i])=>e===r[0]&&i===r[1])}var ge=(r)=>{if(r.length!==3)return!1;if(!r.every(I))return!1;return Z.some(([e,i,o])=>e===r[0]&&i===r[1]&&o===r[2])},er=(r)=>{if(r.length!==4)return!1;if(!r.every(I))return!1;return g.some(([e,i,o,n])=>e===r[0]&&i===r[1]&&o===r[2]&&n===r[3])},rr=(r)=>{if(r.length!==6)return!1;if(!r.every(I))return!1;return re.some(([e,i,o,n,t,s])=>e===r[0]&&i===r[1]&&o===r[2]&&n===r[3]&&t===r[4]&&s===r[5])};var ke=(r)=>{return new l.Big(0).add(r.straightBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.splitBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.streetBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.cornerBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.doubleStreetBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.parityBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.colorBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.halfBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.columnBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.dozenBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0)))},we=(r)=>{return new l.Big(0).add(r.straightBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.splitBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.streetBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.cornerBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.basketBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.doubleStreetBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.parityBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.colorBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.halfBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.columnBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0))).add(r.dozenBets.reduce((e,i)=>e.plus(i.amount),new l.Big(0)))},ir=(r)=>{return r.type==="european"?ke(r.inputs):we(r.inputs)};class xe extends d{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:e}){W(e);let i=r.getRandomInt({min:0,max:36}),o=i.value,n=this.determineBetOutcomes(e,o),t=ke(e),s=this.calculateTotalPayoutAmount(n),p=t.gt(0)?s.div(t):new l.Big(0);return{outputs:{betOutcomes:n,result:i.values},payoutMultiplier:p,isFinished:!0,randomValues:i}}determineBetOutcomes(r,e){return{winningBets:{straightBets:r.straightBets.filter((i)=>i.value===e),splitBets:r.splitBets.filter((i)=>i.values.some((o)=>o===e)),streetBets:r.streetBets.filter((i)=>i.values.some((o)=>o===e)),cornerBets:r.cornerBets.filter((i)=>i.values.some((o)=>o===e)),doubleStreetBets:r.doubleStreetBets.filter((i)=>i.values.some((o)=>o===e)),parityBets:r.parityBets.filter((i)=>this.isWinningParityBet(i,e)),colorBets:r.colorBets.filter((i)=>this.isWinningColorBet(i,e)),halfBets:r.halfBets.filter((i)=>this.isWinningHalfBet(i,e)),columnBets:r.columnBets.filter((i)=>this.isWinningColumnBet(i,e)),dozenBets:r.dozenBets.filter((i)=>this.isWinningDozenBet(i,e))},losingBets:{straightBets:r.straightBets.filter((i)=>i.value!==e),splitBets:r.splitBets.filter((i)=>!i.values.some((o)=>o===e)),streetBets:r.streetBets.filter((i)=>!i.values.some((o)=>o===e)),cornerBets:r.cornerBets.filter((i)=>!i.values.some((o)=>o===e)),doubleStreetBets:r.doubleStreetBets.filter((i)=>!i.values.some((o)=>o===e)),parityBets:r.parityBets.filter((i)=>!this.isWinningParityBet(i,e)),colorBets:r.colorBets.filter((i)=>!this.isWinningColorBet(i,e)),halfBets:r.halfBets.filter((i)=>!this.isWinningHalfBet(i,e)),columnBets:r.columnBets.filter((i)=>!this.isWinningColumnBet(i,e)),dozenBets:r.dozenBets.filter((i)=>!this.isWinningDozenBet(i,e))}}}isWinningParityBet(r,e){if(e===0)return!1;let i=e%2===0?"EVEN":"ODD";return r.parity===i}isWinningColorBet(r,e){let i=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],o=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(i.includes(e)&&r.color==="RED")return!0;if(o.includes(e)&&r.color==="BLACK")return!0;return!1}isWinningHalfBet(r,e){if(e>0&&e<=18&&r.half==="LOW")return!0;if(e>18&&e<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(r,e){let i=[3,6,9,12,15,18,21,24,27,30,33,36],o=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(i.includes(e)&&r.column==="TOP")return!0;if(o.includes(e)&&r.column==="MIDDLE")return!0;if(n.includes(e)&&r.column==="BOTTOM")return!0;return!1}isWinningDozenBet(r,e){if(e>0&&e<=12&&r.dozen==="FIRST")return!0;if(e>12&&e<=24&&r.dozen==="SECOND")return!0;if(e>24&&e<=36&&r.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(r){return new l.Big(0).add(r.winningBets.straightBets.reduce((e,i)=>e.plus(i.amount.mul(36)),new l.Big(0))).add(r.winningBets.splitBets.reduce((e,i)=>e.plus(i.amount.mul(18)),new l.Big(0))).add(r.winningBets.streetBets.reduce((e,i)=>e.plus(i.amount.mul(12)),new l.Big(0))).add(r.winningBets.cornerBets.reduce((e,i)=>e.plus(i.amount.mul(9)),new l.Big(0))).add(r.winningBets.doubleStreetBets.reduce((e,i)=>e.plus(i.amount.mul(6)),new l.Big(0))).add(r.winningBets.parityBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l.Big(0))).add(r.winningBets.colorBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l.Big(0))).add(r.winningBets.halfBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l.Big(0))).add(r.winningBets.columnBets.reduce((e,i)=>e.plus(i.amount.mul(3)),new l.Big(0))).add(r.winningBets.dozenBets.reduce((e,i)=>e.plus(i.amount.mul(3)),new l.Big(0)))}}class Te extends d{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:e}){H(e);let i=r.getRandomInt({min:0,max:37}),o=i.value,n=this.determineBetOutcomes(e,o),t=we(e),s=this.calculateTotalPayoutAmount(n),p=t.gt(0)?s.div(t):new l.Big(0);return{outputs:{betOutcomes:n,result:i.values},payoutMultiplier:p,isFinished:!0,randomValues:i}}determineBetOutcomes(r,e){return{winningBets:{straightBets:r.straightBets.filter((i)=>i.value===e),splitBets:r.splitBets.filter((i)=>i.values.some((o)=>o===e)),streetBets:r.streetBets.filter((i)=>i.values.some((o)=>o===e)),cornerBets:r.cornerBets.filter((i)=>i.values.some((o)=>o===e)),basketBets:r.basketBets.filter((i)=>P.some((o)=>o===e)),doubleStreetBets:r.doubleStreetBets.filter((i)=>i.values.some((o)=>o===e)),parityBets:r.parityBets.filter((i)=>this.isWinningParityBet(i,e)),colorBets:r.colorBets.filter((i)=>this.isWinningColorBet(i,e)),halfBets:r.halfBets.filter((i)=>this.isWinningHalfBet(i,e)),columnBets:r.columnBets.filter((i)=>this.isWinningColumnBet(i,e)),dozenBets:r.dozenBets.filter((i)=>this.isWinningDozenBet(i,e))},losingBets:{straightBets:r.straightBets.filter((i)=>i.value!==e),splitBets:r.splitBets.filter((i)=>!i.values.some((o)=>o===e)),streetBets:r.streetBets.filter((i)=>!i.values.some((o)=>o===e)),cornerBets:r.cornerBets.filter((i)=>!i.values.some((o)=>o===e)),basketBets:r.basketBets.filter((i)=>!P.some((o)=>o===e)),doubleStreetBets:r.doubleStreetBets.filter((i)=>!i.values.some((o)=>o===e)),parityBets:r.parityBets.filter((i)=>!this.isWinningParityBet(i,e)),colorBets:r.colorBets.filter((i)=>!this.isWinningColorBet(i,e)),halfBets:r.halfBets.filter((i)=>!this.isWinningHalfBet(i,e)),columnBets:r.columnBets.filter((i)=>!this.isWinningColumnBet(i,e)),dozenBets:r.dozenBets.filter((i)=>!this.isWinningDozenBet(i,e))}}}isWinningParityBet(r,e){if(e===0||e===37)return!1;let i=e%2===0?"EVEN":"ODD";return r.parity===i}isWinningColorBet(r,e){let i=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],o=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(i.includes(e)&&r.color==="RED")return!0;if(o.includes(e)&&r.color==="BLACK")return!0;return!1}isWinningHalfBet(r,e){if(e>0&&e<=18&&r.half==="LOW")return!0;if(e>18&&e<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(r,e){let i=[3,6,9,12,15,18,21,24,27,30,33,36],o=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(i.includes(e)&&r.column==="TOP")return!0;if(o.includes(e)&&r.column==="MIDDLE")return!0;if(n.includes(e)&&r.column==="BOTTOM")return!0;return!1}isWinningDozenBet(r,e){if(e>0&&e<=12&&r.dozen==="FIRST")return!0;if(e>12&&e<=24&&r.dozen==="SECOND")return!0;if(e>24&&e<=36&&r.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(r){return new l.Big(0).add(r.winningBets.straightBets.reduce((e,i)=>e.plus(i.amount.mul(36)),new l.Big(0))).add(r.winningBets.splitBets.reduce((e,i)=>e.plus(i.amount.mul(18)),new l.Big(0))).add(r.winningBets.streetBets.reduce((e,i)=>e.plus(i.amount.mul(12)),new l.Big(0))).add(r.winningBets.cornerBets.reduce((e,i)=>e.plus(i.amount.mul(9)),new l.Big(0))).add(r.winningBets.basketBets.reduce((e,i)=>e.plus(i.amount.mul(7)),new l.Big(0))).add(r.winningBets.doubleStreetBets.reduce((e,i)=>e.plus(i.amount.mul(6)),new l.Big(0))).add(r.winningBets.parityBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l.Big(0))).add(r.winningBets.colorBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l.Big(0))).add(r.winningBets.halfBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l.Big(0))).add(r.winningBets.columnBets.reduce((e,i)=>e.plus(i.amount.mul(3)),new l.Big(0))).add(r.winningBets.dozenBets.reduce((e,i)=>e.plus(i.amount.mul(3)),new l.Big(0)))}}class Oe extends d{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new xe,this.americanGame=new Te}determineGameResult(r){let{gameInputs:e,...i}=r;if(r.edge===2.7&&e.type==="european"){let o=this.europeanGame.determineGameResult({...i,gameInputs:e.inputs}),{betOutcomes:n}=o.outputs;return{...o,outputs:{type:"european",betOutcomes:n,result:o.outputs.result}}}if(r.edge===5.3&&e.type==="american"){let o=this.americanGame.determineGameResult({...i,gameInputs:e.inputs}),{betOutcomes:n}=o.outputs;return{...o,outputs:{type:"american",betOutcomes:n,result:o.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}var or=(r)=>{if(r.type==="european")W(r.inputs);else H(r.inputs)};var Ie=require("big.js");var U;((o)=>{o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(U||={});var m;((t)=>{t[t.TEN=10]="TEN";t[t.TWENTY=20]="TWENTY";t[t.THIRTY=30]="THIRTY";t[t.FORTY=40]="FORTY";t[t.FIFTY=50]="FIFTY"})(m||={});var nr=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}];class De extends d{multiplierOverrides;get multipliers(){return this.multiplierOverrides??nr}constructor(r){super("WHEEL");this.multiplierOverrides=r;if(r)this.validateMultiplierOverrides(r)}determineGameResult({generator:r,gameInputs:e,edge:i}){if(i!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(!Object.values(m).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(U).includes(e.riskLevel))throw new Error("Invalid risk level");let o=r.getRandomInt({min:0,max:e.segments-1}),n=this.multipliers.find((p)=>p.segments===e.segments);if(n===void 0)throw new Error(`Multiplier not found for segment ${e.segments}`);let t=n.payout[e.riskLevel][o.value];if(t===void 0)throw new Error(`Payout not found for risk ${e.riskLevel} and value ${o.value}`);return{isFinished:!0,payoutMultiplier:new Ie.Big(t),outputs:{result:o.values},randomValues:o}}validateMultiplierOverrides(r){let e=Object.values(m).filter((i)=>typeof i==="number");for(let i of e){if(!r.some((n)=>n.segments===i))throw new Error(`Multiplier overrides for ${i} segments is missing.`);let o=Object.values(U);for(let n of o){let t=r.find((s)=>s.segments===i&&s.payout[n]);if(!t)throw new Error(`Multiplier overrides for ${i} segments and ${n} risk level is missing.`);if(t.payout[n].length!==i)throw new Error(`Multiplier overrides for ${i} segments and ${n} risk level has an invalid length.`)}}}}
|
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 } from 'big.js';
|
|
4
|
+
import { Big as Big$1, Big as Big$2 } from 'big.js';
|
|
5
5
|
|
|
6
6
|
export type Proof = {
|
|
7
7
|
proofHash: string;
|
|
@@ -72,16 +72,21 @@ export type Bounds = {
|
|
|
72
72
|
lower: number;
|
|
73
73
|
upper: number;
|
|
74
74
|
};
|
|
75
|
+
export declare enum RollType {
|
|
76
|
+
ROLL_BETWEEN = "ROLL_BETWEEN",
|
|
77
|
+
ROLL_OUTSIDE = "ROLL_OUTSIDE",
|
|
78
|
+
ROLL_BETWEEN_TWO = "ROLL_BETWEEN_TWO"
|
|
79
|
+
}
|
|
75
80
|
export type RollBetween = {
|
|
76
|
-
mode:
|
|
81
|
+
mode: RollType.ROLL_BETWEEN;
|
|
77
82
|
bounds: Bounds;
|
|
78
83
|
};
|
|
79
84
|
export type RollOutside = {
|
|
80
|
-
mode:
|
|
85
|
+
mode: RollType.ROLL_OUTSIDE;
|
|
81
86
|
bounds: Bounds;
|
|
82
87
|
};
|
|
83
88
|
export type RollBetweenTwo = {
|
|
84
|
-
mode:
|
|
89
|
+
mode: RollType.ROLL_BETWEEN_TWO;
|
|
85
90
|
firstBounds: Bounds;
|
|
86
91
|
secondBounds: Bounds;
|
|
87
92
|
};
|
|
@@ -93,19 +98,12 @@ export declare class AdvancedDice extends Game<AdvancedDiceInputs> {
|
|
|
93
98
|
private calculateRollOutsidePayoutMultiplier;
|
|
94
99
|
private calculateRollBetweenTwoPayoutMultiplier;
|
|
95
100
|
}
|
|
96
|
-
export interface
|
|
97
|
-
amount: Big$1;
|
|
98
|
-
}
|
|
99
|
-
export interface TieBet {
|
|
100
|
-
amount: Big$1;
|
|
101
|
-
}
|
|
102
|
-
export interface BankerBet {
|
|
101
|
+
export interface Bet {
|
|
103
102
|
amount: Big$1;
|
|
103
|
+
type: BaccaratBetType;
|
|
104
104
|
}
|
|
105
105
|
export interface BaccaratGameInputs {
|
|
106
|
-
|
|
107
|
-
tieBets: TieBet[];
|
|
108
|
-
bankerBets: BankerBet[];
|
|
106
|
+
bets: Bet[];
|
|
109
107
|
}
|
|
110
108
|
export declare const VALID_SUITS: readonly [
|
|
111
109
|
"Clubs",
|
|
@@ -139,6 +137,11 @@ export declare enum BaccaratOutcome {
|
|
|
139
137
|
TIE = "TIE",
|
|
140
138
|
BANKER_WIN = "BANKER_WIN"
|
|
141
139
|
}
|
|
140
|
+
export declare enum BaccaratBetType {
|
|
141
|
+
PLAYER = "PLAYER",
|
|
142
|
+
TIE = "TIE",
|
|
143
|
+
BANKER = "BANKER"
|
|
144
|
+
}
|
|
142
145
|
export interface BaccaratGameOutputs {
|
|
143
146
|
playerCards: Card[];
|
|
144
147
|
playerHandValue: number;
|
|
@@ -146,6 +149,7 @@ export interface BaccaratGameOutputs {
|
|
|
146
149
|
bankerHandValue: number;
|
|
147
150
|
gameOutcome: BaccaratOutcome;
|
|
148
151
|
}
|
|
152
|
+
export declare const calculateBaccaratBetAmount: (gameInputs: BaccaratGameInputs) => Big$1;
|
|
149
153
|
export declare class Baccarat extends Game<BaccaratGameInputs, BaccaratGameOutputs> {
|
|
150
154
|
constructor();
|
|
151
155
|
protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<BaccaratGameInputs>): GameResult<BaccaratGameOutputs>;
|
|
@@ -1566,12 +1570,14 @@ export type RouletteGameOutputs = {
|
|
|
1566
1570
|
type: "american";
|
|
1567
1571
|
betOutcomes: AmericanRouletteBetOutcomes;
|
|
1568
1572
|
};
|
|
1573
|
+
export declare const calculateRouletteBetAmount: (inputs: RouletteGameInputs) => Big$1.Big;
|
|
1569
1574
|
export declare class Roulette extends Game<RouletteGameInputs, RouletteGameOutputs> {
|
|
1570
1575
|
private readonly europeanGame;
|
|
1571
1576
|
private readonly americanGame;
|
|
1572
1577
|
constructor();
|
|
1573
1578
|
protected determineGameResult(request: GetGameResultRequest<RouletteGameInputs>): GameResult<RouletteGameOutputs>;
|
|
1574
1579
|
}
|
|
1580
|
+
export declare const validateRouletteGameInputs: (gameInputs: RouletteGameInputs) => void;
|
|
1575
1581
|
export declare enum WheelRiskLevel {
|
|
1576
1582
|
LOW_RISK = "LOW_RISK",
|
|
1577
1583
|
MEDIUM_RISK = "MEDIUM_RISK",
|
|
@@ -1599,5 +1605,14 @@ export declare class Wheel extends Game<WheelGameInputs> {
|
|
|
1599
1605
|
protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<WheelGameInputs>): GameResult;
|
|
1600
1606
|
private validateMultiplierOverrides;
|
|
1601
1607
|
}
|
|
1608
|
+
export declare enum GameErrorCode {
|
|
1609
|
+
INPUT_VALIDATION_ERROR = "INPUT_VALIDATION_ERROR"
|
|
1610
|
+
}
|
|
1611
|
+
export declare class GameError extends Error {
|
|
1612
|
+
static createValidationError(message: string): GameError;
|
|
1613
|
+
static isGameError(error: unknown): error is GameError;
|
|
1614
|
+
errorCode: GameErrorCode;
|
|
1615
|
+
constructor(errorCode: GameErrorCode, message?: string);
|
|
1616
|
+
}
|
|
1602
1617
|
|
|
1603
1618
|
export {};
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var B;((a)=>{a.DICE="DICE";a.MINES="MINES";a.KENO="KENO";a.LIMBO="LIMBO";a.ADVANCED_DICE="ADVANCED_DICE";a.BACCARAT="BACCARAT";a.DIAMONDS="DIAMONDS";a.PLINKO="PLINKO";a.ROULETTE="ROULETTE";a.WHEEL="WHEEL"})(B||={});class u{gameId;constructor(t){this.gameId=t}getGameResult(t){return this.determineGameResult(t)}}import{Big as h}from"big.js";var Z=(t,e)=>e>=t.lower&&e<=t.upper,ee=(t)=>t.upper-t.lower+1,k=(t,e)=>e>t.lower&&e<t.upper,O=(t)=>t.upper-t.lower-1,w={min:0,max:1e4,effectiveRange:10001};class te extends u{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt(w),o=i.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"roll-between":return this.calculateRollBetweenPayoutMultiplier(r.bounds,o,e);case"roll-outside":return this.calculateRollOutsidePayoutMultiplier(r.bounds,o,e);case"roll-between-two":return this.calculateRollBetweenTwoPayoutMultiplier(r.firstBounds,r.secondBounds,o,e)}})(),outputs:{result:i.values},randomValues:i}}calculateRollBetweenPayoutMultiplier(t,e,r){if(!k(t,e))return h(0);let i=O(t),o=h(i).div(w.effectiveRange).mul(100);return h(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(Z(t,e))return h(0);let i=w.effectiveRange-ee(t),o=h(i).div(w.effectiveRange).mul(100);return h(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!k(t,r)&&!k(e,r))return h(0);let o=O(t)+O(e),n=h(o).div(w.effectiveRange).mul(100);return h(100-i).div(n)}}import v from"big.js";var re=["Clubs","Diamonds","Hearts","Spades"],ie=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],oe;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(oe||={});class ne extends u{constructor(){super("BACCARAT")}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(e);let i=t.getRandomIntsWithReplacement({min:0,max:51,count:6}),o=i.values,n=o.slice(0,3),s=o.slice(3,6),d=[],m=0;for(let c of n.slice(0,2)){let p=this.mapRandomValueToCard(c),L=this.mapRandomValueToCardValue(c);d.push(p),m=(m+L)%10}let R=[],a=0;for(let c of s.slice(0,2)){let p=this.mapRandomValueToCard(c),L=this.mapRandomValueToCardValue(c);R.push(p),a=(a+L)%10}if(!this.isNaturalWin(m,a)){let c=this.shouldDrawThirdPlayerCard(m),p=null;if(c)p=this.mapRandomValueToCardValue(n[2]),d.push(this.mapRandomValueToCard(n[2])),m=(m+p)%10;if(this.shouldDrawThirdBankerCard(a,p))R.push(this.mapRandomValueToCard(s[2])),a=(a+this.mapRandomValueToCardValue(s[2]))%10}let f;if(m===a)f="TIE";else f=m>a?"PLAYER_WIN":"BANKER_WIN";let S=new v(0).add(e.playerBets.reduce((c,p)=>c.add(p.amount),new v(0))).add(e.tieBets.reduce((c,p)=>c.add(p.amount),new v(0))).add(e.bankerBets.reduce((c,p)=>c.add(p.amount),new v(0))),y=new v(0).add(e.playerBets.filter((c)=>f==="PLAYER_WIN").reduce((c,p)=>c.add(p.amount.mul(2)),new v(0))).add(e.tieBets.filter((c)=>f==="TIE").reduce((c,p)=>c.add(p.amount.mul(8)),new v(0))).add(e.bankerBets.filter((c)=>f==="BANKER_WIN").reduce((c,p)=>c.add(p.amount.mul(1.95)),new v(0)));return{isFinished:!0,payoutMultiplier:S.gt(0)?y.div(S):new v(0),outputs:{playerCards:d,playerHandValue:m,bankerCards:R,bankerHandValue:a,gameOutcome:f,result:i.values},randomValues:i}}validateGameInputs(t){if(t.playerBets.length===0&&t.tieBets.length===0&&t.bankerBets.length===0)throw new Error("Must place at least a single bet.");if(!t.playerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid player bet.");if(!t.tieBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid tie bet.");if(!t.bankerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid banker bet.")}mapRandomValueToCard(t){let e=re[Math.floor(t/13)],r=ie[t%13];return{suit:e,rank:r}}isNaturalWin(t,e){let r=[8,9];return r.includes(t)||r.includes(e)}mapRandomValueToCardValue(t){let e=t%13;if(e===0)return 1;if(e>=10)return 10;return e+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,e){if(e===null)return t<=5;if(t<=2)return!0;if(t===3)return e!==8;if(t===4)return[2,3,4,5,6,7].includes(e);if(t===5)return[4,5,6,7].includes(e);if(t===6)return[6,7].includes(e);return!1}}import le from"big.js";var se;((s)=>{s.PAIR="PAIR";s.TWO_PAIR="TWO_PAIR";s.THREE_OF_A_KIND="THREE_OF_A_KIND";s.FULL_HOUSE="FULL_HOUSE";s.FOUR_OF_A_KIND="FOUR_OF_A_KIND";s.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(se||={});var ae={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},ue={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class ce extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??ae}constructor(t){super("DIAMONDS");this.multiplierOverrides=t}determineGameResult({generator:t,edge:e}){let r=t.getRandomIntsWithReplacement({min:0,max:6,count:5});if(e!==1&&!this.multiplierOverrides)throw new Error("Use multiplier overrides if an edge of 1% is not desirable");let i=r.values,o=this.calculatePayoutMultiplier(i);return{isFinished:!0,payoutMultiplier:le(o),outputs:{result:r.values},randomValues:r}}calculatePayoutMultiplier(t){let e=new Map;for(let o of t){let n=e.get(o)||0;e.set(o,n+1)}let r=[...e.values()].filter((o)=>o>1),i=this.classifyResult(r);return i===null?0:this.multipliers[i]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[e,r]=t;if(e===void 0)return null;if(r===void 0){let i=ue[e];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${e}`);return i}return e===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}import K from"big.js";var de;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(de||={});class pe extends u{constructor(){super("DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:0,max:1e4}),o=i.min,d=i.max-o+1-1,m=r.direction==="ABOVE"?d-r.selectedValue:r.selectedValue,R=new K(m).div(d).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?i.value>r.selectedValue:i.value<r.selectedValue)?new K(100-e).div(R):new K(0),outputs:{result:i.values},randomValues:i}}}import P from"big.js";var me;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(me||={});var Be={[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]}};class fe extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Be}constructor(t){super("KENO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,edge:e,gameInputs:r}){if(e!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(r.selectedNumbers.length===0)throw new Error("No numbers selected");if(r.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let s of r.selectedNumbers){if(s%1!==0)throw new Error("Only integers can be selected");if(s<0||s>39)throw new Error("Invalid number selected")}let i=t.getUniqueRandomInts({min:0,max:39,count:10}),o=r.selectedNumbers.filter((s)=>i.values.includes(s));return{isFinished:!0,payoutMultiplier:o.length>0?new P(this.multipliers[r.selectedNumbers.length][r.riskLevel][o.length]??0):new P(0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){for(let[e,r]of Object.entries(t)){let i=Number(e);for(let[o,n]of Object.entries(r))if(n.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${o}. Expected ${i+1}, but got ${n.length}`)}}}import E from"big.js";var H=(t,e)=>{return t.gt(e)?t:e};var N=(t,e)=>{return t.lt(e)?t:e};class Re extends u{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:1,max:4294967295}),o=i.max,n=new E(16777216),s=new E(1),d=new E(1e6),m=i.value,R=new E(m-1).div(o),a=(100-e)/100,f=n.div(R.mul(n).plus(1)).mul(a),S=H(s,N(f,d));return{isFinished:!0,payoutMultiplier:S.gte(r.targetMultiplier)?new E(r.targetMultiplier):new E(0),outputs:{randomMultiplier:S,result:i.values},randomValues:i}}}import b from"big.js";var x=(t,e)=>{if(e<0||t<0||e>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(e>t-e)e=t-e;let r=1;for(let i=1;i<=e;i++)r=r*(t-i+1)/i;return r};class he extends u{constructor(){super("MINES")}determineGameResult({generator:t,edge:e,gameInputs:r}){if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>25-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let s=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),d=s.values.some((y)=>r.selectedTiles.includes(y)),m=r.hasCashedOut||d,R=(100-e)/100,a=new b(x(25-r.minesCount,r.selectedTiles.length)).div(new b(x(25,r.selectedTiles.length))),S=r.hasCashedOut&&!d?new b(R).div(a):new b(0);return{isFinished:m,payoutMultiplier:S,outputs:{result:s.values},randomValues:s}}}import{Big as ve}from"big.js";var V;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(V||={});var Se=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[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"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}];class Ee extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Se}constructor(t){super("PLINKO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(e.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(e.numberOfRows<8||e.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let i=t.getRandomIntsWithReplacement({min:0,max:1,count:e.numberOfRows}),n=i.values.reduce((d,m)=>d+m,0);return{isFinished:!0,payoutMultiplier:new ve(this.multipliers.find((d)=>d.rows===e.numberOfRows)?.payout[e.riskLevel][n]??0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){for(let e of Array.from({length:9},(r,i)=>i+8)){if(!t.some((i)=>i.rows===e))throw new Error(`Multiplier overrides for ${e} rows is missing.`);let r=Object.values(V);for(let i of r){let o=t.find((n)=>n.rows===e&&n.payout[i]);if(!o)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level is missing.`);if(o.payout[i].length!==e+1)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level has an invalid length.`)}}}}import{Big as l}from"big.js";var C=[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],g=[37,...C],U=[[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]],z=[[0,1],[0,3],[0,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]],F=[[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]],$=[[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]],q=[[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]],j=[[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]],D=[0,1,2,3,37],Y=[[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]],J=[[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]],A;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(A||={});var I;((r)=>{r.RED="RED";r.BLACK="BLACK"})(I||={});var _;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(_||={});var G;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(G||={});var M;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(M||={});class Q extends u{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:e}){this.validateGameInputs(e);let r=t.getRandomInt({min:0,max:36}),i=r.value,o=this.determineBetOutcomes(e,i),n=this.calculateTotalBetAmount(e),s=this.calculateTotalPayoutAmount(o),d=n.gt(0)?s.div(n):new l(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:d,isFinished:!0,randomValues:r}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(I).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return C.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return U.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return F.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return q.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return Y.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l(0)))}calculateTotalPayoutAmount(t){return new l(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0)))}}class X extends u{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:e}){this.validateGameInputs(e);let r=t.getRandomInt({min:0,max:37}),i=r.value,o=this.determineBetOutcomes(e,i),n=this.calculateTotalBetAmount(e),s=this.calculateTotalPayoutAmount(o),d=n.gt(0)?s.div(n):new l(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:d,isFinished:!0,randomValues:r}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.basketBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid basket bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(I).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return g.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return z.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return $.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return j.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return J.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>D.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>!D.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0||e===37)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.basketBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l(0)))}calculateTotalPayoutAmount(t){return new l(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l(0))).add(t.winningBets.basketBets.reduce((e,r)=>e.plus(r.amount.mul(7)),new l(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0)))}}class we extends u{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new Q,this.americanGame=new X}determineGameResult(t){let{gameInputs:e,...r}=t;if(t.edge===2.7&&e.type==="european"){let i=this.europeanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:o,result:i.outputs.result}}}if(t.edge===5.3&&e.type==="american"){let i=this.americanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:o,result:i.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}import{Big as ye}from"big.js";var T;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(T||={});var W;((n)=>{n[n.TEN=10]="TEN";n[n.TWENTY=20]="TWENTY";n[n.THIRTY=30]="THIRTY";n[n.FORTY=40]="FORTY";n[n.FIFTY=50]="FIFTY"})(W||={});var Le=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}];class be extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Le}constructor(t){super("WHEEL");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(!Object.values(W).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(T).includes(e.riskLevel))throw new Error("Invalid risk level");let i=t.getRandomInt({min:0,max:e.segments-1}),o=this.multipliers.find((d)=>d.segments===e.segments);if(o===void 0)throw new Error(`Multiplier not found for segment ${e.segments}`);let n=o.payout[e.riskLevel][i.value];if(n===void 0)throw new Error(`Payout not found for risk ${e.riskLevel} and value ${i.value}`);return{isFinished:!0,payoutMultiplier:new ye(n),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){let e=Object.values(W).filter((r)=>typeof r==="number");for(let r of e){if(!t.some((o)=>o.segments===r))throw new Error(`Multiplier overrides for ${r} segments is missing.`);let i=Object.values(T);for(let o of i){let n=t.find((s)=>s.segments===r&&s.payout[o]);if(!n)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level is missing.`);if(n.payout[o].length!==r)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level has an invalid length.`)}}}}export{W as WheelSegments,T as WheelRiskLevel,be as Wheel,re as VALID_SUITS,ie as VALID_RANKS,F as VALID_EUROPEAN_STREETS,C as VALID_EUROPEAN_STRAIGHTS,U as VALID_EUROPEAN_SPLITS,Y as VALID_EUROPEAN_DOUBLE_STREETS,q as VALID_EUROPEAN_CORNERS,$ as VALID_AMERICAN_STREETS,g as VALID_AMERICAN_STRAIGHTS,z as VALID_AMERICAN_SPLITS,J as VALID_AMERICAN_DOUBLE_STREETS,j as VALID_AMERICAN_CORNERS,we as Roulette,V as PlinkoRiskLevel,Ee as Plinko,A as Parity,B as OrigamiGame,he as Mines,Re as Limbo,me as KenoRiskLevel,fe as Keno,_ as Half,u as Game,M as Dozen,de as DiceDirection,pe as Dice,se as DiamondsResultType,ce as Diamonds,G as Column,I as Color,oe as BaccaratOutcome,ne as Baccarat,te as AdvancedDice,D as AMERICAN_BASKET};
|
|
1
|
+
var f;((a)=>{a.DICE="DICE";a.MINES="MINES";a.KENO="KENO";a.LIMBO="LIMBO";a.ADVANCED_DICE="ADVANCED_DICE";a.BACCARAT="BACCARAT";a.DIAMONDS="DIAMONDS";a.PLINKO="PLINKO";a.ROULETTE="ROULETTE";a.WHEEL="WHEEL"})(f||={});class d{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}import{Big as L}from"big.js";var ce=(r,e)=>e>=r.lower&&e<=r.upper,ae=(r)=>r.upper-r.lower+1,N=(r,e)=>e>r.lower&&e<r.upper,V=(r)=>r.upper-r.lower-1,de;((o)=>{o.ROLL_BETWEEN="ROLL_BETWEEN";o.ROLL_OUTSIDE="ROLL_OUTSIDE";o.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(de||={});var K={min:0,max:1e4,effectiveRange:10001};class pe extends d{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:e,gameInputs:i}){let o=r.getRandomInt(K),n=o.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(i.mode){case"ROLL_BETWEEN":return this.calculateRollBetweenPayoutMultiplier(i.bounds,n,e);case"ROLL_OUTSIDE":return this.calculateRollOutsidePayoutMultiplier(i.bounds,n,e);case"ROLL_BETWEEN_TWO":return this.calculateRollBetweenTwoPayoutMultiplier(i.firstBounds,i.secondBounds,n,e)}})(),outputs:{result:o.values},randomValues:o}}calculateRollBetweenPayoutMultiplier(r,e,i){if(!N(r,e))return L(0);let o=V(r),n=L(o).div(K.effectiveRange).mul(100);return L(100-i).div(n)}calculateRollOutsidePayoutMultiplier(r,e,i){if(ce(r,e))return L(0);let o=K.effectiveRange-ae(r),n=L(o).div(K.effectiveRange).mul(100);return L(100-i).div(n)}calculateRollBetweenTwoPayoutMultiplier(r,e,i,o){if(!N(r,i)&&!N(e,i))return L(0);let n=V(r)+V(e),t=L(n).div(K.effectiveRange).mul(100);return L(100-o).div(t)}}import k from"big.js";var Ee=["Clubs","Diamonds","Hearts","Spades"],ue=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],fe;((o)=>{o.PLAYER_WIN="PLAYER_WIN";o.TIE="TIE";o.BANKER_WIN="BANKER_WIN"})(fe||={});var Se;((o)=>{o.PLAYER="PLAYER";o.TIE="TIE";o.BANKER="BANKER"})(Se||={});var Re={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},Le=(r)=>{return new k(0).add(r.bets.reduce((i,o)=>i.add(o.amount),new k(0)))};class he extends d{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:e,edge:i}){if(i!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(e);let o=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),n=o.values,t=n.slice(0,3),s=n.slice(3,6),p=[],E=0;for(let u of t.slice(0,2)){let R=this.mapRandomValueToCard(u),O=this.mapRandomValueToCardValue(u);p.push(R),E=(E+O)%10}let S=[],a=0;for(let u of s.slice(0,2)){let R=this.mapRandomValueToCard(u),O=this.mapRandomValueToCardValue(u);S.push(R),a=(a+O)%10}if(!this.isNaturalWin(E,a)){let u=this.shouldDrawThirdPlayerCard(E),R=null;if(u)R=this.mapRandomValueToCardValue(t[2]),p.push(this.mapRandomValueToCard(t[2])),E=(E+R)%10;if(this.shouldDrawThirdBankerCard(a,R))S.push(this.mapRandomValueToCard(s[2])),a=(a+this.mapRandomValueToCardValue(s[2]))%10}let h;if(E===a)h="TIE";else h=E>a?"PLAYER_WIN":"BANKER_WIN";let v=Le(e),{betType:T,multiplier:le}=Re[h],se=new k(0).add(e.bets.filter((u)=>u.type===T).reduce((u,R)=>u.add(R.amount.mul(le)),new k(0)));return{isFinished:!0,payoutMultiplier:v.gt(0)?se.div(v):new k(0),outputs:{playerCards:p,playerHandValue:E,bankerCards:S,bankerHandValue:a,gameOutcome:h,result:o.values},randomValues:o}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((e)=>e.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let e=Ee[Math.floor(r/13)],i=ue[r%13];return{suit:e,rank:i}}isNaturalWin(r,e){let i=[8,9];return i.includes(r)||i.includes(e)}mapRandomValueToCardValue(r){let e=r%13;if(e===0)return 1;if(e>=10)return 10;return e+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,e){if(e===null)return r<=5;if(r<=2)return!0;if(r===3)return e!==8;if(r===4)return[2,3,4,5,6,7].includes(e);if(r===5)return[4,5,6,7].includes(e);if(r===6)return[6,7].includes(e);return!1}}import ve from"big.js";var _e;((s)=>{s.PAIR="PAIR";s.TWO_PAIR="TWO_PAIR";s.THREE_OF_A_KIND="THREE_OF_A_KIND";s.FULL_HOUSE="FULL_HOUSE";s.FOUR_OF_A_KIND="FOUR_OF_A_KIND";s.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(_e||={});var Be={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},Ae={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class ye extends d{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Be}constructor(r){super("DIAMONDS");this.multiplierOverrides=r}determineGameResult({generator:r,edge:e}){let i=r.getRandomIntsWithReplacement({min:0,max:6,count:5});if(e!==1&&!this.multiplierOverrides)throw new Error("Use multiplier overrides if an edge of 1% is not desirable");let o=i.values,n=this.calculatePayoutMultiplier(o);return{isFinished:!0,payoutMultiplier:ve(n),outputs:{result:i.values},randomValues:i}}calculatePayoutMultiplier(r){let e=new Map;for(let n of r){let t=e.get(n)||0;e.set(n,t+1)}let i=[...e.values()].filter((n)=>n>1),o=this.classifyResult(i);return o===null?0:this.multipliers[o]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[e,i]=r;if(e===void 0)return null;if(i===void 0){let o=Ae[e];if(o===void 0)throw new Error(`Unexpected single diamond repeat count: ${e}`);return o}return e===3||i===3?"FULL_HOUSE":"TWO_PAIR"}}import P from"big.js";var Me;((i)=>{i.ABOVE="ABOVE";i.BELOW="BELOW"})(Me||={});class Ge extends d{constructor(){super("DICE")}determineGameResult({generator:r,edge:e,gameInputs:i}){let o=r.getRandomInt({min:0,max:1e4}),n=o.min,p=o.max-n+1-1,E=i.direction==="ABOVE"?p-i.selectedValue:i.selectedValue,S=new P(E).div(p).mul(100);return{isFinished:!0,payoutMultiplier:(i.direction==="ABOVE"?o.value>i.selectedValue:o.value<i.selectedValue)?new P(100-e).div(S):new P(0),outputs:{result:o.values},randomValues:o}}}import F from"big.js";var Ke;((n)=>{n.CLASSIC="CLASSIC";n.LOW_RISK="LOW_RISK";n.MEDIUM_RISK="MEDIUM_RISK";n.HIGH_RISK="HIGH_RISK"})(Ke||={});var ke={[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]}};class we extends d{multiplierOverrides;get multipliers(){return this.multiplierOverrides??ke}constructor(r){super("KENO");this.multiplierOverrides=r;if(r)this.validateMultiplierOverrides(r)}determineGameResult({generator:r,edge:e,gameInputs:i}){if(e!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(i.selectedNumbers.length===0)throw new Error("No numbers selected");if(i.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let s of i.selectedNumbers){if(s%1!==0)throw new Error("Only integers can be selected");if(s<0||s>39)throw new Error("Invalid number selected")}let o=r.getUniqueRandomInts({min:0,max:39,count:10}),n=i.selectedNumbers.filter((s)=>o.values.includes(s));return{isFinished:!0,payoutMultiplier:n.length>0?new F(this.multipliers[i.selectedNumbers.length][i.riskLevel][n.length]??0):new F(0),outputs:{result:o.values},randomValues:o}}validateMultiplierOverrides(r){for(let[e,i]of Object.entries(r)){let o=Number(e);for(let[n,t]of Object.entries(i))if(t.length!==o+1)throw new Error(`Invalid count of multipliers for tiles ${o} and risk level ${n}. Expected ${o+1}, but got ${t.length}`)}}}import _ from"big.js";var j=(r,e)=>{return r.gt(e)?r:e};var Y=(r,e)=>{return r.lt(e)?r:e};class xe extends d{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:e,gameInputs:i}){let o=r.getRandomInt({min:1,max:4294967295}),n=o.max,t=new _(16777216),s=new _(1),p=new _(1e6),E=o.value,S=new _(E-1).div(n),a=(100-e)/100,h=t.div(S.mul(t).plus(1)).mul(a),v=j(s,Y(h,p));return{isFinished:!0,payoutMultiplier:v.gte(i.targetMultiplier)?new _(i.targetMultiplier):new _(0),outputs:{randomMultiplier:v,result:o.values},randomValues:o}}}import I from"big.js";var W=(r,e)=>{if(e<0||r<0||e>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(e>r-e)e=r-e;let i=1;for(let o=1;o<=e;o++)i=i*(r-o+1)/o;return i};class Te extends d{constructor(){super("MINES")}determineGameResult({generator:r,edge:e,gameInputs:i}){if(i.minesCount<=0||i.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(i.selectedTiles.length>25-i.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let s=r.getUniqueRandomInts({min:1,max:25,count:i.minesCount}),p=s.values.some((T)=>i.selectedTiles.includes(T)),E=i.hasCashedOut||p,S=(100-e)/100,a=new I(W(25-i.minesCount,i.selectedTiles.length)).div(new I(W(25,i.selectedTiles.length))),v=i.hasCashedOut&&!p?new I(S).div(a):new I(0);return{isFinished:E,payoutMultiplier:v,outputs:{result:s.values},randomValues:s}}}import{Big as Oe}from"big.js";var q;((o)=>{o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(q||={});var Ie=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[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"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}];class De extends d{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ie}constructor(r){super("PLINKO");this.multiplierOverrides=r;if(r)this.validateMultiplierOverrides(r)}determineGameResult({generator:r,gameInputs:e,edge:i}){if(i!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(e.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(e.numberOfRows<8||e.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let o=r.getRandomIntsWithReplacement({min:0,max:1,count:e.numberOfRows}),t=o.values.reduce((p,E)=>p+E,0);return{isFinished:!0,payoutMultiplier:new Oe(this.multipliers.find((p)=>p.rows===e.numberOfRows)?.payout[e.riskLevel][t]??0),outputs:{result:o.values},randomValues:o}}validateMultiplierOverrides(r){for(let e of Array.from({length:9},(i,o)=>o+8)){if(!r.some((o)=>o.rows===e))throw new Error(`Multiplier overrides for ${e} rows is missing.`);let i=Object.values(q);for(let o of i){let n=r.find((t)=>t.rows===e&&t.payout[o]);if(!n)throw new Error(`Multiplier overrides for ${e} rows and ${o} risk level is missing.`);if(n.payout[o].length!==e+1)throw new Error(`Multiplier overrides for ${e} rows and ${o} risk level has an invalid length.`)}}}}import{Big as l}from"big.js";var H=[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],z=[37,...H],J=[[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]],Q=[[0,1],[0,3],[0,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]],X=[[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]],Z=[[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]],b=[[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]],g=[[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]],U=[0,1,2,3,37],ee=[[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]],re=[[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]],B;((i)=>{i.EVEN="EVEN";i.ODD="ODD"})(B||={});var A;((i)=>{i.RED="RED";i.BLACK="BLACK"})(A||={});var y;((i)=>{i.LOW="LOW";i.HIGH="HIGH"})(y||={});var M;((o)=>{o.TOP="TOP";o.MIDDLE="MIDDLE";o.BOTTOM="BOTTOM"})(M||={});var G;((o)=>{o.FIRST="FIRST";o.SECOND="SECOND";o.THIRD="THIRD"})(G||={});var Ce;((e)=>e.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Ce||={});class c extends Error{static createValidationError(r){return new c("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof c}errorCode;constructor(r,e){super(e);this.errorCode=r}}var D=(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 c.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((e)=>e.amount.gte(0)&&w(e.value)))throw c.createValidationError("Invalid straight bet.");if(!r.splitBets.every((e)=>e.amount.gte(0)&&Ne(e.values)))throw c.createValidationError("Invalid split bet.");if(!r.streetBets.every((e)=>e.amount.gte(0)&&Ve(e.values)))throw c.createValidationError("Invalid street bet.");if(!r.cornerBets.every((e)=>e.amount.gte(0)&&Pe(e.values)))throw c.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((e)=>e.amount.gte(0)&&We(e.values)))throw c.createValidationError("Invalid double street bet.");if(!r.parityBets.every((e)=>e.amount.gte(0)&&Object.values(B).includes(e.parity)))throw c.createValidationError("Invalid parity bet.");if(!r.colorBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.color)))throw c.createValidationError("Invalid color bet.");if(!r.halfBets.every((e)=>e.amount.gte(0)&&Object.values(y).includes(e.half)))throw c.createValidationError("Invalid half bet.");if(!r.columnBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.column)))throw c.createValidationError("Invalid column bet.");if(!r.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.dozen)))throw c.createValidationError("Invalid dozen bet.")},w=(r)=>{return H.includes(r)},Ne=(r)=>{if(r.length!==2)return!1;if(!r.every(w))return!1;return J.some(([e,i])=>e===r[0]&&i===r[1])},Ve=(r)=>{if(r.length!==3)return!1;if(!r.every(w))return!1;return X.some(([e,i,o])=>e===r[0]&&i===r[1]&&o===r[2])},Pe=(r)=>{if(r.length!==4)return!1;if(!r.every(w))return!1;return b.some(([e,i,o,n])=>e===r[0]&&i===r[1]&&o===r[2]&&n===r[3])},We=(r)=>{if(r.length!==6)return!1;if(!r.every(w))return!1;return ee.some(([e,i,o,n,t,s])=>e===r[0]&&i===r[1]&&o===r[2]&&n===r[3]&&t===r[4]&&s===r[5])};var C=(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 c.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((e)=>e.amount.gte(0)&&x(e.value)))throw c.createValidationError("Invalid straight bet.");if(!r.splitBets.every((e)=>e.amount.gte(0)&&He(e.values)))throw c.createValidationError("Invalid split bet.");if(!r.streetBets.every((e)=>e.amount.gte(0)&&Ue(e.values)))throw c.createValidationError("Invalid street bet.");if(!r.cornerBets.every((e)=>e.amount.gte(0)&&me(e.values)))throw c.createValidationError("Invalid corner bet.");if(!r.basketBets.every((e)=>e.amount.gte(0)))throw c.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((e)=>e.amount.gte(0)&&$e(e.values)))throw c.createValidationError("Invalid double street bet.");if(!r.parityBets.every((e)=>e.amount.gte(0)&&Object.values(B).includes(e.parity)))throw c.createValidationError("Invalid parity bet.");if(!r.colorBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.color)))throw c.createValidationError("Invalid color bet.");if(!r.halfBets.every((e)=>e.amount.gte(0)&&Object.values(y).includes(e.half)))throw c.createValidationError("Invalid half bet.");if(!r.columnBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.column)))throw c.createValidationError("Invalid column bet.");if(!r.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.dozen)))throw c.createValidationError("Invalid dozen bet.")},x=(r)=>{return z.includes(r)};function He(r){if(r.length!==2)return!1;if(!r.every(x))return!1;return Q.some(([e,i])=>e===r[0]&&i===r[1])}var Ue=(r)=>{if(r.length!==3)return!1;if(!r.every(x))return!1;return Z.some(([e,i,o])=>e===r[0]&&i===r[1]&&o===r[2])},me=(r)=>{if(r.length!==4)return!1;if(!r.every(x))return!1;return g.some(([e,i,o,n])=>e===r[0]&&i===r[1]&&o===r[2]&&n===r[3])},$e=(r)=>{if(r.length!==6)return!1;if(!r.every(x))return!1;return re.some(([e,i,o,n,t,s])=>e===r[0]&&i===r[1]&&o===r[2]&&n===r[3]&&t===r[4]&&s===r[5])};var ie=(r)=>{return new l(0).add(r.straightBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.splitBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.streetBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.cornerBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.doubleStreetBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.parityBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.colorBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.halfBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.columnBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.dozenBets.reduce((e,i)=>e.plus(i.amount),new l(0)))},oe=(r)=>{return new l(0).add(r.straightBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.splitBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.streetBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.cornerBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.basketBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.doubleStreetBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.parityBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.colorBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.halfBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.columnBets.reduce((e,i)=>e.plus(i.amount),new l(0))).add(r.dozenBets.reduce((e,i)=>e.plus(i.amount),new l(0)))},Wr=(r)=>{return r.type==="european"?ie(r.inputs):oe(r.inputs)};class ne extends d{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:e}){D(e);let i=r.getRandomInt({min:0,max:36}),o=i.value,n=this.determineBetOutcomes(e,o),t=ie(e),s=this.calculateTotalPayoutAmount(n),p=t.gt(0)?s.div(t):new l(0);return{outputs:{betOutcomes:n,result:i.values},payoutMultiplier:p,isFinished:!0,randomValues:i}}determineBetOutcomes(r,e){return{winningBets:{straightBets:r.straightBets.filter((i)=>i.value===e),splitBets:r.splitBets.filter((i)=>i.values.some((o)=>o===e)),streetBets:r.streetBets.filter((i)=>i.values.some((o)=>o===e)),cornerBets:r.cornerBets.filter((i)=>i.values.some((o)=>o===e)),doubleStreetBets:r.doubleStreetBets.filter((i)=>i.values.some((o)=>o===e)),parityBets:r.parityBets.filter((i)=>this.isWinningParityBet(i,e)),colorBets:r.colorBets.filter((i)=>this.isWinningColorBet(i,e)),halfBets:r.halfBets.filter((i)=>this.isWinningHalfBet(i,e)),columnBets:r.columnBets.filter((i)=>this.isWinningColumnBet(i,e)),dozenBets:r.dozenBets.filter((i)=>this.isWinningDozenBet(i,e))},losingBets:{straightBets:r.straightBets.filter((i)=>i.value!==e),splitBets:r.splitBets.filter((i)=>!i.values.some((o)=>o===e)),streetBets:r.streetBets.filter((i)=>!i.values.some((o)=>o===e)),cornerBets:r.cornerBets.filter((i)=>!i.values.some((o)=>o===e)),doubleStreetBets:r.doubleStreetBets.filter((i)=>!i.values.some((o)=>o===e)),parityBets:r.parityBets.filter((i)=>!this.isWinningParityBet(i,e)),colorBets:r.colorBets.filter((i)=>!this.isWinningColorBet(i,e)),halfBets:r.halfBets.filter((i)=>!this.isWinningHalfBet(i,e)),columnBets:r.columnBets.filter((i)=>!this.isWinningColumnBet(i,e)),dozenBets:r.dozenBets.filter((i)=>!this.isWinningDozenBet(i,e))}}}isWinningParityBet(r,e){if(e===0)return!1;let i=e%2===0?"EVEN":"ODD";return r.parity===i}isWinningColorBet(r,e){let i=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],o=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(i.includes(e)&&r.color==="RED")return!0;if(o.includes(e)&&r.color==="BLACK")return!0;return!1}isWinningHalfBet(r,e){if(e>0&&e<=18&&r.half==="LOW")return!0;if(e>18&&e<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(r,e){let i=[3,6,9,12,15,18,21,24,27,30,33,36],o=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(i.includes(e)&&r.column==="TOP")return!0;if(o.includes(e)&&r.column==="MIDDLE")return!0;if(n.includes(e)&&r.column==="BOTTOM")return!0;return!1}isWinningDozenBet(r,e){if(e>0&&e<=12&&r.dozen==="FIRST")return!0;if(e>12&&e<=24&&r.dozen==="SECOND")return!0;if(e>24&&e<=36&&r.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(r){return new l(0).add(r.winningBets.straightBets.reduce((e,i)=>e.plus(i.amount.mul(36)),new l(0))).add(r.winningBets.splitBets.reduce((e,i)=>e.plus(i.amount.mul(18)),new l(0))).add(r.winningBets.streetBets.reduce((e,i)=>e.plus(i.amount.mul(12)),new l(0))).add(r.winningBets.cornerBets.reduce((e,i)=>e.plus(i.amount.mul(9)),new l(0))).add(r.winningBets.doubleStreetBets.reduce((e,i)=>e.plus(i.amount.mul(6)),new l(0))).add(r.winningBets.parityBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l(0))).add(r.winningBets.colorBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l(0))).add(r.winningBets.halfBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l(0))).add(r.winningBets.columnBets.reduce((e,i)=>e.plus(i.amount.mul(3)),new l(0))).add(r.winningBets.dozenBets.reduce((e,i)=>e.plus(i.amount.mul(3)),new l(0)))}}class te extends d{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:e}){C(e);let i=r.getRandomInt({min:0,max:37}),o=i.value,n=this.determineBetOutcomes(e,o),t=oe(e),s=this.calculateTotalPayoutAmount(n),p=t.gt(0)?s.div(t):new l(0);return{outputs:{betOutcomes:n,result:i.values},payoutMultiplier:p,isFinished:!0,randomValues:i}}determineBetOutcomes(r,e){return{winningBets:{straightBets:r.straightBets.filter((i)=>i.value===e),splitBets:r.splitBets.filter((i)=>i.values.some((o)=>o===e)),streetBets:r.streetBets.filter((i)=>i.values.some((o)=>o===e)),cornerBets:r.cornerBets.filter((i)=>i.values.some((o)=>o===e)),basketBets:r.basketBets.filter((i)=>U.some((o)=>o===e)),doubleStreetBets:r.doubleStreetBets.filter((i)=>i.values.some((o)=>o===e)),parityBets:r.parityBets.filter((i)=>this.isWinningParityBet(i,e)),colorBets:r.colorBets.filter((i)=>this.isWinningColorBet(i,e)),halfBets:r.halfBets.filter((i)=>this.isWinningHalfBet(i,e)),columnBets:r.columnBets.filter((i)=>this.isWinningColumnBet(i,e)),dozenBets:r.dozenBets.filter((i)=>this.isWinningDozenBet(i,e))},losingBets:{straightBets:r.straightBets.filter((i)=>i.value!==e),splitBets:r.splitBets.filter((i)=>!i.values.some((o)=>o===e)),streetBets:r.streetBets.filter((i)=>!i.values.some((o)=>o===e)),cornerBets:r.cornerBets.filter((i)=>!i.values.some((o)=>o===e)),basketBets:r.basketBets.filter((i)=>!U.some((o)=>o===e)),doubleStreetBets:r.doubleStreetBets.filter((i)=>!i.values.some((o)=>o===e)),parityBets:r.parityBets.filter((i)=>!this.isWinningParityBet(i,e)),colorBets:r.colorBets.filter((i)=>!this.isWinningColorBet(i,e)),halfBets:r.halfBets.filter((i)=>!this.isWinningHalfBet(i,e)),columnBets:r.columnBets.filter((i)=>!this.isWinningColumnBet(i,e)),dozenBets:r.dozenBets.filter((i)=>!this.isWinningDozenBet(i,e))}}}isWinningParityBet(r,e){if(e===0||e===37)return!1;let i=e%2===0?"EVEN":"ODD";return r.parity===i}isWinningColorBet(r,e){let i=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],o=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(i.includes(e)&&r.color==="RED")return!0;if(o.includes(e)&&r.color==="BLACK")return!0;return!1}isWinningHalfBet(r,e){if(e>0&&e<=18&&r.half==="LOW")return!0;if(e>18&&e<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(r,e){let i=[3,6,9,12,15,18,21,24,27,30,33,36],o=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(i.includes(e)&&r.column==="TOP")return!0;if(o.includes(e)&&r.column==="MIDDLE")return!0;if(n.includes(e)&&r.column==="BOTTOM")return!0;return!1}isWinningDozenBet(r,e){if(e>0&&e<=12&&r.dozen==="FIRST")return!0;if(e>12&&e<=24&&r.dozen==="SECOND")return!0;if(e>24&&e<=36&&r.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(r){return new l(0).add(r.winningBets.straightBets.reduce((e,i)=>e.plus(i.amount.mul(36)),new l(0))).add(r.winningBets.splitBets.reduce((e,i)=>e.plus(i.amount.mul(18)),new l(0))).add(r.winningBets.streetBets.reduce((e,i)=>e.plus(i.amount.mul(12)),new l(0))).add(r.winningBets.cornerBets.reduce((e,i)=>e.plus(i.amount.mul(9)),new l(0))).add(r.winningBets.basketBets.reduce((e,i)=>e.plus(i.amount.mul(7)),new l(0))).add(r.winningBets.doubleStreetBets.reduce((e,i)=>e.plus(i.amount.mul(6)),new l(0))).add(r.winningBets.parityBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l(0))).add(r.winningBets.colorBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l(0))).add(r.winningBets.halfBets.reduce((e,i)=>e.plus(i.amount.mul(2)),new l(0))).add(r.winningBets.columnBets.reduce((e,i)=>e.plus(i.amount.mul(3)),new l(0))).add(r.winningBets.dozenBets.reduce((e,i)=>e.plus(i.amount.mul(3)),new l(0)))}}class Fe extends d{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new ne,this.americanGame=new te}determineGameResult(r){let{gameInputs:e,...i}=r;if(r.edge===2.7&&e.type==="european"){let o=this.europeanGame.determineGameResult({...i,gameInputs:e.inputs}),{betOutcomes:n}=o.outputs;return{...o,outputs:{type:"european",betOutcomes:n,result:o.outputs.result}}}if(r.edge===5.3&&e.type==="american"){let o=this.americanGame.determineGameResult({...i,gameInputs:e.inputs}),{betOutcomes:n}=o.outputs;return{...o,outputs:{type:"american",betOutcomes:n,result:o.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}var $r=(r)=>{if(r.type==="european")D(r.inputs);else C(r.inputs)};import{Big as je}from"big.js";var m;((o)=>{o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(m||={});var $;((t)=>{t[t.TEN=10]="TEN";t[t.TWENTY=20]="TWENTY";t[t.THIRTY=30]="THIRTY";t[t.FORTY=40]="FORTY";t[t.FIFTY=50]="FIFTY"})($||={});var Ye=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}];class qe extends d{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ye}constructor(r){super("WHEEL");this.multiplierOverrides=r;if(r)this.validateMultiplierOverrides(r)}determineGameResult({generator:r,gameInputs:e,edge:i}){if(i!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(!Object.values($).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(m).includes(e.riskLevel))throw new Error("Invalid risk level");let o=r.getRandomInt({min:0,max:e.segments-1}),n=this.multipliers.find((p)=>p.segments===e.segments);if(n===void 0)throw new Error(`Multiplier not found for segment ${e.segments}`);let t=n.payout[e.riskLevel][o.value];if(t===void 0)throw new Error(`Payout not found for risk ${e.riskLevel} and value ${o.value}`);return{isFinished:!0,payoutMultiplier:new je(t),outputs:{result:o.values},randomValues:o}}validateMultiplierOverrides(r){let e=Object.values($).filter((i)=>typeof i==="number");for(let i of e){if(!r.some((n)=>n.segments===i))throw new Error(`Multiplier overrides for ${i} segments is missing.`);let o=Object.values(m);for(let n of o){let t=r.find((s)=>s.segments===i&&s.payout[n]);if(!t)throw new Error(`Multiplier overrides for ${i} segments and ${n} risk level is missing.`);if(t.payout[n].length!==i)throw new Error(`Multiplier overrides for ${i} segments and ${n} risk level has an invalid length.`)}}}}export{$r as validateRouletteGameInputs,Wr as calculateRouletteBetAmount,Le as calculateBaccaratBetAmount,$ as WheelSegments,m as WheelRiskLevel,qe as Wheel,Ee as VALID_SUITS,ue as VALID_RANKS,X as VALID_EUROPEAN_STREETS,H as VALID_EUROPEAN_STRAIGHTS,J as VALID_EUROPEAN_SPLITS,ee as VALID_EUROPEAN_DOUBLE_STREETS,b as VALID_EUROPEAN_CORNERS,Z as VALID_AMERICAN_STREETS,z as VALID_AMERICAN_STRAIGHTS,Q as VALID_AMERICAN_SPLITS,re as VALID_AMERICAN_DOUBLE_STREETS,g as VALID_AMERICAN_CORNERS,Fe as Roulette,de as RollType,q as PlinkoRiskLevel,De as Plinko,B as Parity,f as OrigamiGame,Te as Mines,xe as Limbo,Ke as KenoRiskLevel,we as Keno,y as Half,Ce as GameErrorCode,c as GameError,d as Game,G as Dozen,Me as DiceDirection,Ge as Dice,_e as DiamondsResultType,ye as Diamonds,M as Column,A as Color,fe as BaccaratOutcome,Se as BaccaratBetType,he as Baccarat,pe as AdvancedDice,U as AMERICAN_BASKET};
|