@betorigami/game-calculations 2.0.1 → 2.0.3
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 +11 -11
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var Ie=Object.create;var{getPrototypeOf:Ae,defineProperty:L,getOwnPropertyNames:X,getOwnPropertyDescriptor:Ge}=Object,Z=Object.prototype.hasOwnProperty;var w=(t,e,r)=>{r=t!=null?Ie(Ae(t)):{};let i=e||!t||!t.__esModule?L(r,"default",{value:t,enumerable:!0}):r;for(let o of X(t))if(!Z.call(i,o))L(i,o,{get:()=>t[o],enumerable:!0});return i},Q=new WeakMap,be=(t)=>{var e=Q.get(t),r;if(e)return e;if(e=L({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function")X(t).map((i)=>!Z.call(e,i)&&L(e,i,{get:()=>t[i],enumerable:!(r=Ge(t,i))||r.enumerable}));return Q.set(t,e),e};var _e=(t,e)=>{for(var r in e)L(t,r,{get:e[r],enumerable:!0,configurable:!0,set:(i)=>e[r]=()=>i})};var xe={};_e(xe,{WheelSegments:()=>x,WheelRiskLevel:()=>C,Wheel:()=>ye,VALID_SUITS:()=>re,VALID_RANKS:()=>ie,VALID_EUROPEAN_STREETS:()=>q,VALID_EUROPEAN_STRAIGHTS:()=>T,VALID_EUROPEAN_SPLITS:()=>U,VALID_EUROPEAN_DOUBLE_STREETS:()=>Y,VALID_EUROPEAN_CORNERS:()=>$,VALID_AMERICAN_STREETS:()=>F,VALID_AMERICAN_STRAIGHTS:()=>g,VALID_AMERICAN_SPLITS:()=>z,VALID_AMERICAN_DOUBLE_STREETS:()=>J,VALID_AMERICAN_CORNERS:()=>j,Roulette:()=>we,RollType:()=>ee,PlinkoRiskLevel:()=>V,Plinko:()=>he,Parity:()=>A,OrigamiGame:()=>B,Mines:()=>fe,Limbo:()=>Re,KenoRiskLevel:()=>pe,Keno:()=>de,Half:()=>b,Game:()=>u,Dozen:()=>O,DiceDirection:()=>ue,Dice:()=>ce,DiamondsResultType:()=>se,Diamonds:()=>ae,Column:()=>_,Color:()=>G,BaccaratOutcome:()=>oe,Baccarat:()=>ne,AdvancedDice:()=>te,AMERICAN_BASKET:()=>D});module.exports=be(xe);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 f=require("big.js"),Oe=(t,e)=>e>=t.lower&&e<=t.upper,Me=(t)=>t.upper-t.lower+1,W=(t,e)=>e>t.lower&&e<t.upper,N=(t)=>t.upper-t.lower-1,ee;((i)=>{i.ROLL_BETWEEN="ROLL_BETWEEN";i.ROLL_OUTSIDE="ROLL_OUTSIDE";i.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(ee||={});var y={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(y),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 f.Big(0);let i=N(t),o=f.Big(i).div(y.effectiveRange).mul(100);return f.Big(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(Oe(t,e))return f.Big(0);let i=y.effectiveRange-Me(t),o=f.Big(i).div(y.effectiveRange).mul(100);return f.Big(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!W(t,r)&&!W(e,r))return f.Big(0);let o=N(t)+N(e),n=f.Big(o).div(y.effectiveRange).mul(100);return f.Big(100-i).div(n)}}var E=w(require("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),p=[],m=0;for(let c of n.slice(0,2)){let d=this.mapRandomValueToCard(c),k=this.mapRandomValueToCardValue(c);p.push(d),m=(m+k)%10}let h=[],a=0;for(let c of s.slice(0,2)){let d=this.mapRandomValueToCard(c),k=this.mapRandomValueToCardValue(c);h.push(d),a=(a+k)%10}if(!this.isNaturalWin(m,a)){let c=this.shouldDrawThirdPlayerCard(m),d=null;if(c)d=this.mapRandomValueToCardValue(n[2]),p.push(this.mapRandomValueToCard(n[2])),m=(m+d)%10;if(this.shouldDrawThirdBankerCard(a,d))h.push(this.mapRandomValueToCard(s[2])),a=(a+this.mapRandomValueToCardValue(s[2]))%10}let R;if(m===a)R="TIE";else R=m>a?"PLAYER_WIN":"BANKER_WIN";let v=new E.default(0).add(e.playerBets.reduce((c,d)=>c.add(d.amount),new E.default(0))).add(e.tieBets.reduce((c,d)=>c.add(d.amount),new E.default(0))).add(e.bankerBets.reduce((c,d)=>c.add(d.amount),new E.default(0))),M=new E.default(0).add(e.playerBets.filter((c)=>R==="PLAYER_WIN").reduce((c,d)=>c.add(d.amount.mul(2)),new E.default(0))).add(e.tieBets.filter((c)=>R==="TIE").reduce((c,d)=>c.add(d.amount.mul(8)),new E.default(0))).add(e.bankerBets.filter((c)=>R==="BANKER_WIN").reduce((c,d)=>c.add(d.amount.mul(1.95)),new E.default(0)));return{isFinished:!0,payoutMultiplier:v.gt(0)?M.div(v):new E.default(0),outputs:{playerCards:p,playerHandValue:m,bankerCards:h,bankerHandValue:a,gameOutcome:R,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}}var le=w(require("big.js")),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 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},Ke={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class ae 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:le.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=Ke[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 ue;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(ue||={});class ce extends u{constructor(){super("DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:0,max:1e4}),o=i.min,p=i.max-o+1-1,m=r.direction==="ABOVE"?p-r.selectedValue:r.selectedValue,h=new K.default(m).div(p).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?i.value>r.selectedValue:i.value<r.selectedValue)?new K.default(100-e).div(h):new K.default(0),outputs:{result:i.values},randomValues:i}}}var P=w(require("big.js"));var pe;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(pe||={});var Te={[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??Te}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.default(this.multipliers[r.selectedNumbers.length][r.riskLevel][o.length]??0):new P.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 S=w(require("big.js"));var me=(t,e)=>{return t.gt(e)?t:e};var Be=(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 S.default(16777216),s=new S.default(1),p=new S.default(1e6),m=i.value,h=new S.default(m-1).div(o),a=(100-e)/100,R=n.div(h.mul(n).plus(1)).mul(a),v=me(s,Be(R,p));return{isFinished:!0,payoutMultiplier:v.gte(r.targetMultiplier)?new S.default(r.targetMultiplier):new S.default(0),outputs:{randomMultiplier:v,result:i.values},randomValues:i}}}var I=w(require("big.js"));var H=(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}),p=s.values.some((M)=>r.selectedTiles.includes(M)),m=r.hasCashedOut||p,h=(100-e)/100,a=new I.default(H(25-r.minesCount,r.selectedTiles.length)).div(new I.default(H(25,r.selectedTiles.length))),v=r.hasCashedOut&&!p?new I.default(h).div(a):new I.default(0);return{isFinished:m,payoutMultiplier:v,outputs:{result:s.values},randomValues:s}}}var Ee=require("big.js");var V;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(V||={});var De=[{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??De}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((p,m)=>p+m,0);return{isFinished:!0,payoutMultiplier:new Ee.Big(this.multipliers.find((p)=>p.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 T=[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,...T],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]],q=[[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]],F=[[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]],$=[[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 G;((r)=>{r.RED="RED";r.BLACK="BLACK"})(G||={});var b;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(b||={});var _;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(_||={});var O;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(O||={});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),p=n.gt(0)?s.div(n):new l.Big(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:p,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(G).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(b).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(O).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return T.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 q.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 $.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),p=n.gt(0)?s.div(n):new l.Big(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:p,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(G).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(b).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(O).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 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 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.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 we 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 Le=require("big.js");var C;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(C||={});var x;((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"})(x||={});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(x).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(C).includes(e.riskLevel))throw new Error("Invalid risk level");let i=t.getRandomInt({min:0,max:e.segments-1}),o=this.multipliers.find((p)=>p.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 Le.Big(n),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){let e=Object.values(x).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(C);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 Me=Object.create;var{getPrototypeOf:ke,defineProperty:L,getOwnPropertyNames:X,getOwnPropertyDescriptor:Ke}=Object,Z=Object.prototype.hasOwnProperty;var S=(t,e,r)=>{r=t!=null?Me(ke(t)):{};let i=e||!t||!t.__esModule?L(r,"default",{value:t,enumerable:!0}):r;for(let o of X(t))if(!Z.call(i,o))L(i,o,{get:()=>t[o],enumerable:!0});return i},Q=new WeakMap,Te=(t)=>{var e=Q.get(t),r;if(e)return e;if(e=L({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function")X(t).map((i)=>!Z.call(e,i)&&L(e,i,{get:()=>t[i],enumerable:!(r=Ke(t,i))||r.enumerable}));return Q.set(t,e),e};var De=(t,e)=>{for(var r in e)L(t,r,{get:e[r],enumerable:!0,configurable:!0,set:(i)=>e[r]=()=>i})};var ze={};De(ze,{calculateRouletteBetAmount:()=>ge,calculateBaccaratBetAmount:()=>se,WheelSegments:()=>C,WheelRiskLevel:()=>x,Wheel:()=>Ge,VALID_SUITS:()=>re,VALID_RANKS:()=>ie,VALID_EUROPEAN_STREETS:()=>q,VALID_EUROPEAN_STRAIGHTS:()=>T,VALID_EUROPEAN_SPLITS:()=>U,VALID_EUROPEAN_DOUBLE_STREETS:()=>Y,VALID_EUROPEAN_CORNERS:()=>$,VALID_AMERICAN_STREETS:()=>F,VALID_AMERICAN_STRAIGHTS:()=>g,VALID_AMERICAN_SPLITS:()=>z,VALID_AMERICAN_DOUBLE_STREETS:()=>J,VALID_AMERICAN_CORNERS:()=>j,Roulette:()=>Ae,RollType:()=>ee,PlinkoRiskLevel:()=>V,Plinko:()=>Se,Parity:()=>A,OrigamiGame:()=>d,Mines:()=>he,Limbo:()=>Ee,KenoRiskLevel:()=>me,Keno:()=>Be,Half:()=>G,Game:()=>a,Dozen:()=>O,DiceDirection:()=>pe,Dice:()=>de,DiamondsResultType:()=>ae,Diamonds:()=>ce,Column:()=>_,Color:()=>b,BaccaratOutcome:()=>oe,BaccaratBetType:()=>ne,Baccarat:()=>le,AdvancedDice:()=>te,AMERICAN_BASKET:()=>D});module.exports=Te(ze);var d;((u)=>{u.DICE="DICE";u.MINES="MINES";u.KENO="KENO";u.LIMBO="LIMBO";u.ADVANCED_DICE="ADVANCED_DICE";u.BACCARAT="BACCARAT";u.DIAMONDS="DIAMONDS";u.PLINKO="PLINKO";u.ROULETTE="ROULETTE";u.WHEEL="WHEEL"})(d||={});class a{gameId;constructor(t){this.gameId=t}getGameResult(t){return this.determineGameResult(t)}}var B=require("big.js"),xe=(t,e)=>e>=t.lower&&e<=t.upper,Ce=(t)=>t.upper-t.lower+1,W=(t,e)=>e>t.lower&&e<t.upper,N=(t)=>t.upper-t.lower-1,ee;((i)=>{i.ROLL_BETWEEN="ROLL_BETWEEN";i.ROLL_OUTSIDE="ROLL_OUTSIDE";i.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(ee||={});var y={min:0,max:1e4,effectiveRange:10001};class te extends a{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt(y),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 B.Big(0);let i=N(t),o=B.Big(i).div(y.effectiveRange).mul(100);return B.Big(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(xe(t,e))return B.Big(0);let i=y.effectiveRange-Ce(t),o=B.Big(i).div(y.effectiveRange).mul(100);return B.Big(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!W(t,r)&&!W(e,r))return B.Big(0);let o=N(t)+N(e),n=B.Big(o).div(y.effectiveRange).mul(100);return B.Big(100-i).div(n)}}var w=S(require("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||={});var ne;((i)=>{i.PLAYER="PLAYER";i.TIE="TIE";i.BANKER="BANKER"})(ne||={});var We={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},se=(t)=>{return new w.default(0).add(t.bets.reduce((r,i)=>r.add(i.amount),new w.default(0)))};class le extends a{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),l=o.slice(3,6),c=[],p=0;for(let m of n.slice(0,2)){let f=this.mapRandomValueToCard(m),k=this.mapRandomValueToCardValue(m);c.push(f),p=(p+k)%10}let R=[],u=0;for(let m of l.slice(0,2)){let f=this.mapRandomValueToCard(m),k=this.mapRandomValueToCardValue(m);R.push(f),u=(u+k)%10}if(!this.isNaturalWin(p,u)){let m=this.shouldDrawThirdPlayerCard(p),f=null;if(m)f=this.mapRandomValueToCardValue(n[2]),c.push(this.mapRandomValueToCard(n[2])),p=(p+f)%10;if(this.shouldDrawThirdBankerCard(u,f))R.push(this.mapRandomValueToCard(l[2])),u=(u+this.mapRandomValueToCardValue(l[2]))%10}let E;if(p===u)E="TIE";else E=p>u?"PLAYER_WIN":"BANKER_WIN";let h=se(e),{betType:M,multiplier:_e}=We[E],Oe=new w.default(0).add(e.bets.filter((m)=>m.type===M).reduce((m,f)=>m.add(f.amount.mul(_e)),new w.default(0)));return{isFinished:!0,payoutMultiplier:h.gt(0)?Oe.div(h):new w.default(0),outputs:{playerCards:c,playerHandValue:p,bankerCards:R,bankerHandValue:u,gameOutcome:E,result:i.values},randomValues:i}}validateGameInputs(t){if(t.bets.length===0)throw new Error("Must place at least a single bet.");if(!t.bets.every((e)=>e.amount.gte(0)))throw new Error("Invalid 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}}var ue=S(require("big.js")),ae;((l)=>{l.PAIR="PAIR";l.TWO_PAIR="TWO_PAIR";l.THREE_OF_A_KIND="THREE_OF_A_KIND";l.FULL_HOUSE="FULL_HOUSE";l.FOUR_OF_A_KIND="FOUR_OF_A_KIND";l.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(ae||={});var Ne={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},Pe={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class ce extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ne}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:ue.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=Pe[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=S(require("big.js"));var pe;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(pe||={});class de extends a{constructor(){super("DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:0,max:1e4}),o=i.min,c=i.max-o+1-1,p=r.direction==="ABOVE"?c-r.selectedValue:r.selectedValue,R=new K.default(p).div(c).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?i.value>r.selectedValue:i.value<r.selectedValue)?new K.default(100-e).div(R):new K.default(0),outputs:{result:i.values},randomValues:i}}}var P=S(require("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 He={[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 Be extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??He}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 l of r.selectedNumbers){if(l%1!==0)throw new Error("Only integers can be selected");if(l<0||l>39)throw new Error("Invalid number selected")}let i=t.getUniqueRandomInts({min:0,max:39,count:10}),o=r.selectedNumbers.filter((l)=>i.values.includes(l));return{isFinished:!0,payoutMultiplier:o.length>0?new P.default(this.multipliers[r.selectedNumbers.length][r.riskLevel][o.length]??0):new P.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 v=S(require("big.js"));var Re=(t,e)=>{return t.gt(e)?t:e};var fe=(t,e)=>{return t.lt(e)?t:e};class Ee extends a{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:1,max:4294967295}),o=i.max,n=new v.default(16777216),l=new v.default(1),c=new v.default(1e6),p=i.value,R=new v.default(p-1).div(o),u=(100-e)/100,E=n.div(R.mul(n).plus(1)).mul(u),h=Re(l,fe(E,c));return{isFinished:!0,payoutMultiplier:h.gte(r.targetMultiplier)?new v.default(r.targetMultiplier):new v.default(0),outputs:{randomMultiplier:h,result:i.values},randomValues:i}}}var I=S(require("big.js"));var H=(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 a{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 l=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),c=l.values.some((M)=>r.selectedTiles.includes(M)),p=r.hasCashedOut||c,R=(100-e)/100,u=new I.default(H(25-r.minesCount,r.selectedTiles.length)).div(new I.default(H(25,r.selectedTiles.length))),h=r.hasCashedOut&&!c?new I.default(R).div(u):new I.default(0);return{isFinished:p,payoutMultiplier:h,outputs:{result:l.values},randomValues:l}}}var ve=require("big.js");var V;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(V||={});var Ve=[{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 Se extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ve}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((c,p)=>c+p,0);return{isFinished:!0,payoutMultiplier:new ve.Big(this.multipliers.find((c)=>c.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 s=require("big.js");var T=[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,...T],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]],q=[[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]],F=[[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]],$=[[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 b;((r)=>{r.RED="RED";r.BLACK="BLACK"})(b||={});var G;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(G||={});var _;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(_||={});var O;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(O||={});var we=(t)=>{return new s.Big(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0)))},Le=(t)=>{return new s.Big(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.basketBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new s.Big(0)))},ge=(t)=>{return t.type==="european"?we(t.inputs):Le(t.inputs)};class ye extends a{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=we(e),l=this.calculateTotalPayoutAmount(o),c=n.gt(0)?l.div(n):new s.Big(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:c,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(b).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(O).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return T.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 q.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 $.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,l])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&l===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}calculateTotalPayoutAmount(t){return new s.Big(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new s.Big(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new s.Big(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new s.Big(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new s.Big(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new s.Big(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s.Big(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s.Big(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s.Big(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new s.Big(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new s.Big(0)))}}class Ie extends a{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=Le(e),l=this.calculateTotalPayoutAmount(o),c=n.gt(0)?l.div(n):new s.Big(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:c,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(b).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(O).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 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 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,l])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&l===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}calculateTotalPayoutAmount(t){return new s.Big(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new s.Big(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new s.Big(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new s.Big(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new s.Big(0))).add(t.winningBets.basketBets.reduce((e,r)=>e.plus(r.amount.mul(7)),new s.Big(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new s.Big(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s.Big(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s.Big(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s.Big(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new s.Big(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new s.Big(0)))}}class Ae extends a{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new ye,this.americanGame=new Ie}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 be=require("big.js");var x;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(x||={});var C;((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"})(C||={});var Ue=[{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 Ge extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ue}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(C).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(x).includes(e.riskLevel))throw new Error("Invalid risk level");let i=t.getRandomInt({min:0,max:e.segments-1}),o=this.multipliers.find((c)=>c.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 be.Big(n),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){let e=Object.values(C).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(x);for(let o of i){let n=t.find((l)=>l.segments===r&&l.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.`)}}}}
|
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;
|
|
@@ -98,19 +98,12 @@ export declare class AdvancedDice extends Game<AdvancedDiceInputs> {
|
|
|
98
98
|
private calculateRollOutsidePayoutMultiplier;
|
|
99
99
|
private calculateRollBetweenTwoPayoutMultiplier;
|
|
100
100
|
}
|
|
101
|
-
export interface
|
|
102
|
-
amount: Big$1;
|
|
103
|
-
}
|
|
104
|
-
export interface TieBet {
|
|
105
|
-
amount: Big$1;
|
|
106
|
-
}
|
|
107
|
-
export interface BankerBet {
|
|
101
|
+
export interface Bet {
|
|
108
102
|
amount: Big$1;
|
|
103
|
+
type: BaccaratBetType;
|
|
109
104
|
}
|
|
110
105
|
export interface BaccaratGameInputs {
|
|
111
|
-
|
|
112
|
-
tieBets: TieBet[];
|
|
113
|
-
bankerBets: BankerBet[];
|
|
106
|
+
bets: Bet[];
|
|
114
107
|
}
|
|
115
108
|
export declare const VALID_SUITS: readonly [
|
|
116
109
|
"Clubs",
|
|
@@ -144,6 +137,11 @@ export declare enum BaccaratOutcome {
|
|
|
144
137
|
TIE = "TIE",
|
|
145
138
|
BANKER_WIN = "BANKER_WIN"
|
|
146
139
|
}
|
|
140
|
+
export declare enum BaccaratBetType {
|
|
141
|
+
PLAYER = "PLAYER",
|
|
142
|
+
TIE = "TIE",
|
|
143
|
+
BANKER = "BANKER"
|
|
144
|
+
}
|
|
147
145
|
export interface BaccaratGameOutputs {
|
|
148
146
|
playerCards: Card[];
|
|
149
147
|
playerHandValue: number;
|
|
@@ -151,6 +149,7 @@ export interface BaccaratGameOutputs {
|
|
|
151
149
|
bankerHandValue: number;
|
|
152
150
|
gameOutcome: BaccaratOutcome;
|
|
153
151
|
}
|
|
152
|
+
export declare const calculateBaccaratBetAmount: (gameInputs: BaccaratGameInputs) => Big$1;
|
|
154
153
|
export declare class Baccarat extends Game<BaccaratGameInputs, BaccaratGameOutputs> {
|
|
155
154
|
constructor();
|
|
156
155
|
protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<BaccaratGameInputs>): GameResult<BaccaratGameOutputs>;
|
|
@@ -1571,6 +1570,7 @@ export type RouletteGameOutputs = {
|
|
|
1571
1570
|
type: "american";
|
|
1572
1571
|
betOutcomes: AmericanRouletteBetOutcomes;
|
|
1573
1572
|
};
|
|
1573
|
+
export declare const calculateRouletteBetAmount: (inputs: RouletteGameInputs) => Big$1.Big;
|
|
1574
1574
|
export declare class Roulette extends Game<RouletteGameInputs, RouletteGameOutputs> {
|
|
1575
1575
|
private readonly europeanGame;
|
|
1576
1576
|
private readonly americanGame;
|
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 E}from"big.js";var Z=(t,e)=>e>=t.lower&&e<=t.upper,ee=(t)=>t.upper-t.lower+1,M=(t,e)=>e>t.lower&&e<t.upper,k=(t)=>t.upper-t.lower-1,te;((i)=>{i.ROLL_BETWEEN="ROLL_BETWEEN";i.ROLL_OUTSIDE="ROLL_OUTSIDE";i.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(te||={});var w={min:0,max:1e4,effectiveRange:10001};class re 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(!M(t,e))return E(0);let i=k(t),o=E(i).div(w.effectiveRange).mul(100);return E(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(Z(t,e))return E(0);let i=w.effectiveRange-ee(t),o=E(i).div(w.effectiveRange).mul(100);return E(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!M(t,r)&&!M(e,r))return E(0);let o=k(t)+k(e),n=E(o).div(w.effectiveRange).mul(100);return E(100-i).div(n)}}import h from"big.js";var ie=["Clubs","Diamonds","Hearts","Spades"],oe=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],ne;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(ne||={});class le 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),p=[],m=0;for(let c of n.slice(0,2)){let d=this.mapRandomValueToCard(c),y=this.mapRandomValueToCardValue(c);p.push(d),m=(m+y)%10}let f=[],a=0;for(let c of s.slice(0,2)){let d=this.mapRandomValueToCard(c),y=this.mapRandomValueToCardValue(c);f.push(d),a=(a+y)%10}if(!this.isNaturalWin(m,a)){let c=this.shouldDrawThirdPlayerCard(m),d=null;if(c)d=this.mapRandomValueToCardValue(n[2]),p.push(this.mapRandomValueToCard(n[2])),m=(m+d)%10;if(this.shouldDrawThirdBankerCard(a,d))f.push(this.mapRandomValueToCard(s[2])),a=(a+this.mapRandomValueToCardValue(s[2]))%10}let R;if(m===a)R="TIE";else R=m>a?"PLAYER_WIN":"BANKER_WIN";let v=new h(0).add(e.playerBets.reduce((c,d)=>c.add(d.amount),new h(0))).add(e.tieBets.reduce((c,d)=>c.add(d.amount),new h(0))).add(e.bankerBets.reduce((c,d)=>c.add(d.amount),new h(0))),L=new h(0).add(e.playerBets.filter((c)=>R==="PLAYER_WIN").reduce((c,d)=>c.add(d.amount.mul(2)),new h(0))).add(e.tieBets.filter((c)=>R==="TIE").reduce((c,d)=>c.add(d.amount.mul(8)),new h(0))).add(e.bankerBets.filter((c)=>R==="BANKER_WIN").reduce((c,d)=>c.add(d.amount.mul(1.95)),new h(0)));return{isFinished:!0,payoutMultiplier:v.gt(0)?L.div(v):new h(0),outputs:{playerCards:p,playerHandValue:m,bankerCards:f,bankerHandValue:a,gameOutcome:R,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=ie[Math.floor(t/13)],r=oe[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 se from"big.js";var ae;((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"})(ae||={});var ue={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},ce={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class pe extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??ue}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:se(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=ce[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 me extends u{constructor(){super("DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:0,max:1e4}),o=i.min,p=i.max-o+1-1,m=r.direction==="ABOVE"?p-r.selectedValue:r.selectedValue,f=new K(m).div(p).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?i.value>r.selectedValue:i.value<r.selectedValue)?new K(100-e).div(f):new K(0),outputs:{result:i.values},randomValues:i}}}import N from"big.js";var Be;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(Be||={});var Re={[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??Re}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 N(this.multipliers[r.selectedNumbers.length][r.riskLevel][o.length]??0):new N(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 S from"big.js";var P=(t,e)=>{return t.gt(e)?t:e};var H=(t,e)=>{return t.lt(e)?t:e};class Ee 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 S(16777216),s=new S(1),p=new S(1e6),m=i.value,f=new S(m-1).div(o),a=(100-e)/100,R=n.div(f.mul(n).plus(1)).mul(a),v=P(s,H(R,p));return{isFinished:!0,payoutMultiplier:v.gte(r.targetMultiplier)?new S(r.targetMultiplier):new S(0),outputs:{randomMultiplier:v,result:i.values},randomValues:i}}}import I from"big.js";var T=(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}),p=s.values.some((L)=>r.selectedTiles.includes(L)),m=r.hasCashedOut||p,f=(100-e)/100,a=new I(T(25-r.minesCount,r.selectedTiles.length)).div(new I(T(25,r.selectedTiles.length))),v=r.hasCashedOut&&!p?new I(f).div(a):new I(0);return{isFinished:m,payoutMultiplier:v,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 we 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((p,m)=>p+m,0);return{isFinished:!0,payoutMultiplier:new ve(this.multipliers.find((p)=>p.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 D=[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,...D],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]],q=[[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]],F=[[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]],$=[[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 G;((r)=>{r.RED="RED";r.BLACK="BLACK"})(G||={});var b;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(b||={});var _;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(_||={});var O;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(O||={});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),p=n.gt(0)?s.div(n):new l(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:p,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(G).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(b).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(O).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return D.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 q.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 $.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),p=n.gt(0)?s.div(n):new l(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:p,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(G).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(b).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(O).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 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 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(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 Le 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 x;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(x||={});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 Ie=[{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 Ae extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ie}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(x).includes(e.riskLevel))throw new Error("Invalid risk level");let i=t.getRandomInt({min:0,max:e.segments-1}),o=this.multipliers.find((p)=>p.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(x);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,x as WheelRiskLevel,Ae as Wheel,ie as VALID_SUITS,oe as VALID_RANKS,q as VALID_EUROPEAN_STREETS,D as VALID_EUROPEAN_STRAIGHTS,U as VALID_EUROPEAN_SPLITS,Y as VALID_EUROPEAN_DOUBLE_STREETS,$ as VALID_EUROPEAN_CORNERS,F 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,Le as Roulette,te as RollType,V as PlinkoRiskLevel,we as Plinko,A as Parity,B as OrigamiGame,he as Mines,Ee as Limbo,Be as KenoRiskLevel,fe as Keno,b as Half,u as Game,O as Dozen,de as DiceDirection,me as Dice,ae as DiamondsResultType,pe as Diamonds,_ as Column,G as Color,ne as BaccaratOutcome,le as Baccarat,re as AdvancedDice,C as AMERICAN_BASKET};
|
|
1
|
+
var m;((u)=>{u.DICE="DICE";u.MINES="MINES";u.KENO="KENO";u.LIMBO="LIMBO";u.ADVANCED_DICE="ADVANCED_DICE";u.BACCARAT="BACCARAT";u.DIAMONDS="DIAMONDS";u.PLINKO="PLINKO";u.ROULETTE="ROULETTE";u.WHEEL="WHEEL"})(m||={});class a{gameId;constructor(t){this.gameId=t}getGameResult(t){return this.determineGameResult(t)}}import{Big as f}from"big.js";var ie=(t,e)=>e>=t.lower&&e<=t.upper,oe=(t)=>t.upper-t.lower+1,M=(t,e)=>e>t.lower&&e<t.upper,k=(t)=>t.upper-t.lower-1,ne;((i)=>{i.ROLL_BETWEEN="ROLL_BETWEEN";i.ROLL_OUTSIDE="ROLL_OUTSIDE";i.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(ne||={});var S={min:0,max:1e4,effectiveRange:10001};class se extends a{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt(S),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(!M(t,e))return f(0);let i=k(t),o=f(i).div(S.effectiveRange).mul(100);return f(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(ie(t,e))return f(0);let i=S.effectiveRange-oe(t),o=f(i).div(S.effectiveRange).mul(100);return f(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!M(t,r)&&!M(e,r))return f(0);let o=k(t)+k(e),n=f(o).div(S.effectiveRange).mul(100);return f(100-i).div(n)}}import w from"big.js";var le=["Clubs","Diamonds","Hearts","Spades"],ue=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],ae;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(ae||={});var ce;((i)=>{i.PLAYER="PLAYER";i.TIE="TIE";i.BANKER="BANKER"})(ce||={});var pe={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},de=(t)=>{return new w(0).add(t.bets.reduce((r,i)=>r.add(i.amount),new w(0)))};class me extends a{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),l=o.slice(3,6),c=[],p=0;for(let d of n.slice(0,2)){let R=this.mapRandomValueToCard(d),y=this.mapRandomValueToCardValue(d);c.push(R),p=(p+y)%10}let B=[],u=0;for(let d of l.slice(0,2)){let R=this.mapRandomValueToCard(d),y=this.mapRandomValueToCardValue(d);B.push(R),u=(u+y)%10}if(!this.isNaturalWin(p,u)){let d=this.shouldDrawThirdPlayerCard(p),R=null;if(d)R=this.mapRandomValueToCardValue(n[2]),c.push(this.mapRandomValueToCard(n[2])),p=(p+R)%10;if(this.shouldDrawThirdBankerCard(u,R))B.push(this.mapRandomValueToCard(l[2])),u=(u+this.mapRandomValueToCardValue(l[2]))%10}let E;if(p===u)E="TIE";else E=p>u?"PLAYER_WIN":"BANKER_WIN";let h=de(e),{betType:L,multiplier:te}=pe[E],re=new w(0).add(e.bets.filter((d)=>d.type===L).reduce((d,R)=>d.add(R.amount.mul(te)),new w(0)));return{isFinished:!0,payoutMultiplier:h.gt(0)?re.div(h):new w(0),outputs:{playerCards:c,playerHandValue:p,bankerCards:B,bankerHandValue:u,gameOutcome:E,result:i.values},randomValues:i}}validateGameInputs(t){if(t.bets.length===0)throw new Error("Must place at least a single bet.");if(!t.bets.every((e)=>e.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(t){let e=le[Math.floor(t/13)],r=ue[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 Be from"big.js";var Re;((l)=>{l.PAIR="PAIR";l.TWO_PAIR="TWO_PAIR";l.THREE_OF_A_KIND="THREE_OF_A_KIND";l.FULL_HOUSE="FULL_HOUSE";l.FOUR_OF_A_KIND="FOUR_OF_A_KIND";l.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(Re||={});var fe={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},Ee={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class he extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??fe}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:Be(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=Ee[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 ve;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(ve||={});class Se extends a{constructor(){super("DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:0,max:1e4}),o=i.min,c=i.max-o+1-1,p=r.direction==="ABOVE"?c-r.selectedValue:r.selectedValue,B=new K(p).div(c).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?i.value>r.selectedValue:i.value<r.selectedValue)?new K(100-e).div(B):new K(0),outputs:{result:i.values},randomValues:i}}}import N from"big.js";var we;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(we||={});var Le={[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 ye extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Le}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 l of r.selectedNumbers){if(l%1!==0)throw new Error("Only integers can be selected");if(l<0||l>39)throw new Error("Invalid number selected")}let i=t.getUniqueRandomInts({min:0,max:39,count:10}),o=r.selectedNumbers.filter((l)=>i.values.includes(l));return{isFinished:!0,payoutMultiplier:o.length>0?new N(this.multipliers[r.selectedNumbers.length][r.riskLevel][o.length]??0):new N(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 v from"big.js";var P=(t,e)=>{return t.gt(e)?t:e};var H=(t,e)=>{return t.lt(e)?t:e};class Ie extends a{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:1,max:4294967295}),o=i.max,n=new v(16777216),l=new v(1),c=new v(1e6),p=i.value,B=new v(p-1).div(o),u=(100-e)/100,E=n.div(B.mul(n).plus(1)).mul(u),h=P(l,H(E,c));return{isFinished:!0,payoutMultiplier:h.gte(r.targetMultiplier)?new v(r.targetMultiplier):new v(0),outputs:{randomMultiplier:h,result:i.values},randomValues:i}}}import I from"big.js";var T=(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 Ae extends a{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 l=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),c=l.values.some((L)=>r.selectedTiles.includes(L)),p=r.hasCashedOut||c,B=(100-e)/100,u=new I(T(25-r.minesCount,r.selectedTiles.length)).div(new I(T(25,r.selectedTiles.length))),h=r.hasCashedOut&&!c?new I(B).div(u):new I(0);return{isFinished:p,payoutMultiplier:h,outputs:{result:l.values},randomValues:l}}}import{Big as be}from"big.js";var V;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(V||={});var Ge=[{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 _e extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ge}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((c,p)=>c+p,0);return{isFinished:!0,payoutMultiplier:new be(this.multipliers.find((c)=>c.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 s}from"big.js";var D=[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,...D],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]],q=[[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]],F=[[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]],$=[[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]],x=[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 b;((r)=>{r.RED="RED";r.BLACK="BLACK"})(b||={});var G;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(G||={});var _;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(_||={});var O;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(O||={});var Q=(t)=>{return new s(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new s(0)))},X=(t)=>{return new s(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.basketBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new s(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new s(0)))},Rt=(t)=>{return t.type==="european"?Q(t.inputs):X(t.inputs)};class Z extends a{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=Q(e),l=this.calculateTotalPayoutAmount(o),c=n.gt(0)?l.div(n):new s(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:c,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(b).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(O).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return D.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 q.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 $.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,l])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&l===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}calculateTotalPayoutAmount(t){return new s(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new s(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new s(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new s(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new s(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new s(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new s(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new s(0)))}}class ee extends a{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=X(e),l=this.calculateTotalPayoutAmount(o),c=n.gt(0)?l.div(n):new s(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:c,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(b).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(O).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 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 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,l])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&l===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)=>x.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)=>!x.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}calculateTotalPayoutAmount(t){return new s(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new s(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new s(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new s(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new s(0))).add(t.winningBets.basketBets.reduce((e,r)=>e.plus(r.amount.mul(7)),new s(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new s(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new s(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new s(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new s(0)))}}class Oe extends a{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new Z,this.americanGame=new ee}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 Me}from"big.js";var C;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(C||={});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 ke=[{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 Ke extends a{multiplierOverrides;get multipliers(){return this.multiplierOverrides??ke}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(C).includes(e.riskLevel))throw new Error("Invalid risk level");let i=t.getRandomInt({min:0,max:e.segments-1}),o=this.multipliers.find((c)=>c.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 Me(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(C);for(let o of i){let n=t.find((l)=>l.segments===r&&l.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{Rt as calculateRouletteBetAmount,de as calculateBaccaratBetAmount,W as WheelSegments,C as WheelRiskLevel,Ke as Wheel,le as VALID_SUITS,ue as VALID_RANKS,q as VALID_EUROPEAN_STREETS,D as VALID_EUROPEAN_STRAIGHTS,U as VALID_EUROPEAN_SPLITS,Y as VALID_EUROPEAN_DOUBLE_STREETS,$ as VALID_EUROPEAN_CORNERS,F 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,Oe as Roulette,ne as RollType,V as PlinkoRiskLevel,_e as Plinko,A as Parity,m as OrigamiGame,Ae as Mines,Ie as Limbo,we as KenoRiskLevel,ye as Keno,G as Half,a as Game,O as Dozen,ve as DiceDirection,Se as Dice,Re as DiamondsResultType,he as Diamonds,_ as Column,b as Color,ae as BaccaratOutcome,ce as BaccaratBetType,me as Baccarat,se as AdvancedDice,x as AMERICAN_BASKET};
|