overtime-live-trading-utils 0.0.92 → 0.0.93

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/main.js CHANGED
@@ -1 +1 @@
1
- !function(e,_){"object"==typeof exports&&"object"==typeof module?module.exports=_():"function"==typeof define&&define.amd?define([],_):"object"==typeof exports?exports.thalesUtils=_():e.thalesUtils=_()}(this,(()=>(()=>{"use strict";var e={d:(_,a)=>{for(var r in a)e.o(a,r)&&!e.o(_,r)&&Object.defineProperty(_,r,{enumerable:!0,get:a[r]})},o:(e,_)=>Object.prototype.hasOwnProperty.call(e,_),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},_={};e.r(_),e.d(_,{ANYTIME_GOAL_SCORER:()=>D,ASIAN_HANDICAP:()=>B,ASIAN_HANDICAP_CARDS:()=>V,ASIAN_HANDICAP_CORNERS:()=>v,BOTH_TEAMS_TO_SCORE:()=>g,CORRECT_SCORE:()=>H,DRAW:()=>ca,DRAW_NO_BET:()=>b,EIGHTH_INNING_MONEYLINE_3_WAY:()=>ve,EIGHTH_INNING_RUN_LINE:()=>ge,EIGHTH_INNING_TOTAL_RUNS:()=>He,FIFTH_INNING_MONEYLINE_3_WAY:()=>me,FIFTH_INNING_RUN_LINE:()=>Ue,FIFTH_INNING_TOTAL_RUNS:()=>fe,FIRST_3_INNINGS_MONEYLINE:()=>re,FIRST_3_INNINGS_RUN_LINE:()=>te,FIRST_3_INNINGS_TEAM_TOTAL:()=>oe,FIRST_3_INNINGS_TOTAL_RUNS:()=>ne,FIRST_7_INNINGS_MONEYLINE:()=>Ee,FIRST_7_INNINGS_RUN_LINE:()=>ie,FIRST_7_INNINGS_TEAM_TOTAL:()=>Ae,FIRST_7_INNINGS_TOTAL_RUNS:()=>Ne,FIRST_BASKET_INCLUDING_FT:()=>V_,FIRST_GOAL_SCORER:()=>h,FIRST_HALF_ASIAN_HANDICAP:()=>T,FIRST_HALF_ASIAN_HANDICAP_CORNERS:()=>O,FIRST_HALF_BOTH_TEAMS_TO_SCORE:()=>d,FIRST_HALF_CORRECT_SCORE:()=>R,FIRST_HALF_DOUBLE_CHANCE:()=>N_,FIRST_HALF_MONEYLINE:()=>M,FIRST_HALF_MONEYLINE_3_WAY:()=>I_,FIRST_HALF_POINT_SPREAD:()=>S_,FIRST_HALF_RACE_TO_20_POINTS:()=>s_,FIRST_HALF_RACE_TO_25_POINTS:()=>L_,FIRST_HALF_RACE_TO_30_POINTS:()=>l_,FIRST_HALF_RACE_TO_35_POINTS:()=>T_,FIRST_HALF_RACE_TO_40_POINTS:()=>O_,FIRST_HALF_RACE_TO_45_POINTS:()=>d_,FIRST_HALF_RACE_TO_50_POINTS:()=>R_,FIRST_HALF_RACE_TO_55_POINTS:()=>M_,FIRST_HALF_RACE_TO_60_POINTS:()=>C_,FIRST_HALF_RUN_LINE:()=>Ie,FIRST_HALF_TEAM_TOTAL:()=>C,FIRST_HALF_TEAM_TOTAL_EXACT:()=>P,FIRST_HALF_TOTAL_CORNERS:()=>u,FIRST_HALF_TOTAL_GOALS:()=>c,FIRST_HALF_TOTAL_GOALS_ODD_EVEN:()=>p,FIRST_HALF_TOTAL_POINTS:()=>P_,FIRST_HALF_TOTAL_POINTS_ODD_EVEN:()=>u_,FIRST_HALF_TOTAL_RUNS:()=>Se,FIRST_INNING_MONEYLINE_3_WAY:()=>se,FIRST_INNING_RUN_LINE:()=>Le,FIRST_INNING_TOTAL_RUNS:()=>le,FIRST_INNING_TOTAL_RUNS_ODD_EVEN:()=>Te,FIRST_QUARTER_DOUBLE_CHANCE:()=>c_,FIRST_QUARTER_MONEYLINE:()=>p_,FIRST_QUARTER_MONEYLINE_3_WAY:()=>m_,FIRST_QUARTER_POINT_SPREAD:()=>U_,FIRST_QUARTER_RACE_TO_10_POINTS:()=>f_,FIRST_QUARTER_RACE_TO_15_POINTS:()=>G_,FIRST_QUARTER_RACE_TO_20_POINTS:()=>w_,FIRST_QUARTER_TEAM_TOTAL:()=>F_,FIRST_QUARTER_TOTAL_POINTS:()=>D_,FIRST_QUARTER_TOTAL_POINTS_ODD_EVEN:()=>B_,FIRST_TEAM_TO_SCORE:()=>Ye,FIRST_TEAM_TO_SCORE_3_WAY:()=>y,FOURTH_INNING_MONEYLINE_3_WAY:()=>ue,FOURTH_INNING_RUN_LINE:()=>ce,FOURTH_INNING_TOTAL_RUNS:()=>pe,GAME_SPREAD:()=>ta,GO_THE_DISTANCE:()=>X_,HALFTIME_FULLTIME:()=>ae,LAST_GOAL_SCORER:()=>Y,LAST_TEAM_TO_SCORE_3_WAY:()=>W,LEAGUES_NO_FORMAL_HOME_AWAY:()=>l,LIVE_TYPE_ID_BASE:()=>pa,League:()=>L,LeagueMap:()=>oa,METHOD_OF_ENDING:()=>q_,METHOD_OF_VICTORY:()=>j_,MIN_ODDS_FOR_DIFF_CHECKING:()=>ma,MONEYLINE:()=>k,MONEYLINE_TOTAL_ROUNDS:()=>$_,MULTIPLIER_100:()=>Ga,NINTH_INNING_MONEYLINE_3_WAY:()=>be,NINTH_INNING_RUN_LINE:()=>he,NINTH_INNING_TOTAL_RUNS:()=>ye,NO_RUNS_FIRST_INNING:()=>We,PLAYER_ASSISTS:()=>v_,PLAYER_BASES:()=>ke,PLAYER_BATTING_STRIKEOUTS:()=>Ke,PLAYER_BATTING_WALKS:()=>Qe,PLAYER_DOUBLES:()=>Xe,PLAYER_DOUBLE_DOUBLE:()=>g_,PLAYER_EARNED_RUNS:()=>je,PLAYER_GOALS:()=>K,PLAYER_HITS:()=>xe,PLAYER_HITS_ALLOWED:()=>Ze,PLAYER_HITS_RUNS_RBIS:()=>ze,PLAYER_HOME_RUNS:()=>Je,PLAYER_HOME_RUNS_YES_NO:()=>qe,PLAYER_MADE_THREES:()=>H_,PLAYER_OUTS:()=>$e,PLAYER_POINTS:()=>b_,PLAYER_POINTS_REBOUNDS_ASSISTS:()=>h_,PLAYER_RBIS:()=>e_,PLAYER_REBOUNDS:()=>y_,PLAYER_RUNS:()=>__,PLAYER_SIGNIFICANT_STRIKES:()=>x_,PLAYER_SINGLES:()=>a_,PLAYER_STOLEN_BASES:()=>r_,PLAYER_STRIKEOUTS:()=>t_,PLAYER_TAKEDOWNS:()=>z_,PLAYER_TO_RECORD_WIN:()=>o_,PLAYER_WALKS:()=>n_,POINT_SPREAD:()=>Y_,RACE_TO_20_POINTS:()=>W_,ROUND_BETTING:()=>Z_,RUN_LINE:()=>E_,SECOND_HALF_ASIAN_HANDICAP_CORNERS:()=>m,SECOND_HALF_BOTH_TEAMS_TO_SCORE:()=>U,SECOND_HALF_MONEYLINE:()=>f,SECOND_HALF_TOTAL_CORNERS:()=>G,SECOND_HALF_TOTAL_GOALS:()=>w,SECOND_HALF_TOTAL_GOALS_ODD_EVEN:()=>F,SECOND_INNING_MONEYLINE_3_WAY:()=>Oe,SECOND_INNING_RUN_LINE:()=>de,SECOND_INNING_TOTAL_RUNS:()=>Re,SEVENTH_INNING_MONEYLINE_3_WAY:()=>De,SEVENTH_INNING_RUN_LINE:()=>Be,SEVENTH_INNING_TOTAL_RUNS:()=>Ve,SIXTH_INNING_MONEYLINE_3_WAY:()=>Ge,SIXTH_INNING_RUN_LINE:()=>we,SIXTH_INNING_TOTAL_RUNS:()=>Fe,Sport:()=>s,TAG_CHILD_SPREAD:()=>Ua,TAG_CHILD_TOTALS:()=>fa,TEAM_CLEAN_SHEET:()=>Q,TEAM_TOTAL:()=>X,TEAM_TOTAL_CARD_POINTS:()=>j,TEAM_TOTAL_CORNERS:()=>x,TEAM_TOTAL_ODD_EVEN:()=>z,TEAM_TOTAL_POINTS_ODD_EVEN:()=>k_,TENNIS_ATP_GRAND_SLAM_SET_THRESHOLD:()=>Aa,TENNIS_GEMS_LIMIT:()=>Ia,TENNIS_MASTERS_SET_THRESHOLD:()=>Na,THIRD_INNING_MONEYLINE_3_WAY:()=>Me,THIRD_INNING_RUN_LINE:()=>Ce,THIRD_INNING_TOTAL_RUNS:()=>Pe,TOTAL_CARDS:()=>Z,TOTAL_CORNERS:()=>J,TOTAL_CORNERS_ODD_EVEN:()=>q,TOTAL_GAMES:()=>ra,TOTAL_GOALS:()=>$,TOTAL_GOALS_ODD_EVEN:()=>ee,TOTAL_POINTS:()=>K_,TOTAL_POINTS_ODD_EVEN:()=>Q_,TOTAL_ROUNDS:()=>J_,TOTAL_RUNS:()=>i_,TO_QUALIFY:()=>_e,VOLLEYBALL_FIFTH_SET_POINTS_LIMIT:()=>ia,VOLLEYBALL_POINTS_LIMIT:()=>Ea,VOLLEYBALL_SET_THRESHOLD:()=>na,WILL_A_POINT_BE_DEDUCTED:()=>ea,WILL_FIGHT_END_IN_FIRST_MINUTE:()=>_a,WILL_THERE_BE_OVERTIME:()=>A_,WINNING_ROUND:()=>aa,ZERO:()=>ua,adjustSpreadOnOdds:()=>Fa,allowGameSportWithPeriodConstraint:()=>Ta,allowGameSportWithResultConstraint:()=>da,allowSoccerGame:()=>Oa,calculateImpliedOddsDifference:()=>S,checkGameContraints:()=>la,checkOddsFromBookmakers:()=>I,createSpreadChildMarkets:()=>ja,createTotalChildMarkets:()=>xa,cutOddsCloseToValue:()=>Ya,extractOddsForGamePerProvider:()=>Ba,fetchResultInCurrentSet:()=>Ra,filterOddsByMarketNameBookmaker:()=>ba,filterOddsByMarketNameTeamNameBookmaker:()=>ga,formatSpreadOdds:()=>ha,gamesDatesMatching:()=>Pa,getBookmakersArray:()=>N,getLeagueSport:()=>Sa,getLeagueSpreadType:()=>sa,getLeagueTotalType:()=>La,getParentOdds:()=>Ha,getSpreadData:()=>Da,groupAndFormatSpreadOdds:()=>ya,groupOddsBySelectionAndPoints:()=>ka,processMarket:()=>Qa,processTotalOdds:()=>Wa,statusCodes:()=>wa,teamNamesMatching:()=>Ca}),"function"!=typeof Object.assign&&(Object.assign=function(e,_){if(null==e)throw new TypeError("Cannot convert undefined or null to object");for(var a=Object(e),r=1;r<arguments.length;r++){var t=arguments[r];if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(a[o]=t[o])}return a});var a=function(e){return parseFloat(e.toPrecision(12))};function r(e,_,a){return void 0===a||0==+a?Math[e](_):(_=+_,a=+a,isNaN(_)||"number"!=typeof a||a%1!=0?NaN:_<0?-r(e,-_,a):(_=_.toString().split("e"),+((_=(_=Math[e](+(_[0]+"e"+(_[1]?+_[1]-a:-a)))).toString().split("e"))[0]+"e"+(_[1]?+_[1]+a:a))))}var t,o,n={decimal:{from:function(e){if((e=parseFloat(e))<=1)throw new Error("Outside valid range.");return e},to:function(){return this.decimalValue}},moneyline:{from:function(e){return(e=parseFloat(e))>=0?e/100+1:100/-e+1},to:function(){return this.decimalValue>=2?a(100*(this.decimalValue-1)):a(-100/(this.decimalValue-1))}},hongKong:{from:function(e){if((e=parseFloat(e))<0)throw new Error("Outside valid range.");return e+1},to:function(){return a(this.decimalValue-1)}},impliedProbability:{from:function(e){if((e="string"==typeof e&&"%"==e.slice(-1)?parseFloat(e)/100:parseFloat(e))<=0||e>=1)throw new Error("Outside valid range");return 1/e},to:function(e){if(e.percentage){var _=a(100/this.decimalValue);return null!==e.precision&&(_=r("round",_,-e.precision)),_.toString()+"%"}return a(1/this.decimalValue)}},fractional:{from:function(e){var _,a=e.toString().split("/");if(e=parseFloat(a[0]),2===a.length)_=parseFloat(a[1]);else{if(1!==a.length)throw new Error("Invalid fraction");_=1}if(0===e||0===_||e/_<=0)throw new Error("Outside valid range");return 1+e/_},to:function(e){return function(e,_){for(var a,r=[0,1],t=[1,0],o=function(e){var _=null,a=e.toString().indexOf("E");-1==a&&(a=e.toString().indexOf("e"));var r=null,t=(_=-1==a?e.toString():e.toString().substring(0,a)).toString().indexOf(".");-1==t?r=_:0===t?r=_.substring(1,_.length):t<_.length&&(r=_.substring(0,t)+_.substring(t+1,_.length));var o=r,n=o.toString().length,E=e,i=E.toString().length;0===E&&(i=0);var A,N=n-i;for(A=N;A>0&&o%2==0;A--)o/=2;for(A=N;A>0&&o%5==0;A--)o/=5;return o}(e),n=e,E=Math.pow(10,-_)/2,i=2;i<1e3;i++){var A=Math.floor(n);if(r[i]=A*r[i-1]+r[i-2],Math.abs(r[i])>o)return;if(t[i]=A*t[i-1]+t[i-2],a=r[i]/t[i],Math.abs(a-e)<E||NaN==a)return r[i].toString()+"/"+t[i].toString();n=1/(n-A)}}(this.decimalValue-1,e.precision||12)}},malay:{from:function(e){if((e=parseFloat(e))<=-1||e>1)throw new Error("Outside valid range.");return e<0&&(e=-1/e),e+1},to:function(){return this.decimalValue<=2?a(this.decimalValue-1):a(-1/(this.decimalValue-1))}},indonesian:{from:function(e){if(0===(e=parseFloat(e)))throw new Error("Outside valid range.");return e>=1?e+1:-1/e+1},to:function(){return this.decimalValue<2?a(-1/(this.decimalValue-1)):a(this.decimalValue-1)}}},E=((o=function(e){if("number"!=typeof e||isNaN(e))throw new Error("Invalid odds");this.decimalValue=a(e)}).prototype=(t=function(){throw new Error("This constructor is private, please use the from* functions")}).prototype,t.from=function(e,_){if(!n.hasOwnProperty(e))throw new Error("Unknown format "+e+".");var a=n[e].from(_);return new o(a)},t);E.prototype.to=function(e,_){if(!n.hasOwnProperty(e))throw new Error("Unknown format "+e+".");_=Object.assign({precision:null,percentage:!1},_);var a=n[e].to.call(this,_);return"number"==typeof a&&null!==_.precision&&(a=r("round",a,-_.precision)),a};var i,A=E.from,N=function(e,_,a){var r=e.find((function(e){return Number(e.sportId)===Number(_)}));if(r){if(""==r.primaryBookmaker)return a;var t=[];return r.primaryBookmaker&&t.push(r.primaryBookmaker),r.secondaryBookmaker&&t.push(r.secondaryBookmaker),r.tertiaryBookmaker&&t.push(r.tertiaryBookmaker),t}return a},I=function(e,_,a,r,t){console.log("########## CHECK ODDS START ##########"),console.log("oddsMap: "+e),console.log("arrayOfBookmakers: "+_),console.log("isTwoPositionalSport: "+a),console.log("maxImpliedPercentageDifference: "+r),console.log("minOddsForDiffChecking: "+t),console.log("########## CHECK ODDS END ##########");var o=_.some((function(_){var r=e.get(_);return!!r&&(0===r.homeOdds||0===r.awayOdds||!a&&0===r.drawOdds||1===r.homeOdds||1===r.awayOdds||!a&&1===r.drawOdds)}));if(1==_.length){if(o)return[{homeOdds:0,awayOdds:0,drawOdds:0}];var n=_[0],E=e.get(n);return[{homeOdds:E.homeOdds,awayOdds:E.awayOdds,drawOdds:a?0:E.drawOdds}]}if(o)return[{homeOdds:0,awayOdds:0,drawOdds:0}];var i=e.get(_[0]),N=i.homeOdds,I=i.awayOdds,s=i.drawOdds;if(_.slice(1).some((function(_){var o=e[_];if(o){var n=o.homeOdds,E=o.awayOdds,i=o.drawOdds,L=A("decimal",N).to("impliedProbability"),l=A("decimal",I).to("impliedProbability"),T=a?0:A("decimal",s).to("impliedProbability"),O=A("decimal",n).to("impliedProbability"),d=A("decimal",E).to("impliedProbability"),R=a?0:A("decimal",i).to("impliedProbability"),M=S(L,O),C=S(l,d),P=a?0:S(T,R);if(M>r&&L>t&&O>t||C>r&&l>t&&d>t||!a&&P>r&&T>t&&R>t)return!0}return!1})))return console.log("Returning zero odds due to percentage difference"),[{homeOdds:0,awayOdds:0,drawOdds:0}];var L=[];return _.forEach((function(_){return L.push(e.get(_))})),null!=L[0]?L.map((function(e){return{homeOdds:e.homeOdds,awayOdds:e.awayOdds,drawOdds:a?0:e.drawOdds}})):(console.log("Returning zero odds cause no matching bookmakers have been found"),[{homeOdds:0,awayOdds:0,drawOdds:0}])},S=function(e,_){var a=Math.abs(e-_)/e*100;return console.log("% diff: "+a),a},s={SOCCER:"Soccer",FOOTBALL:"Football",BASKETBALL:"Basketball",BASEBALL:"Baseball",HOCKEY:"Hockey",FIGHTING:"Fighting",TENNIS:"Tennis",ESPORTS:"eSports",RUGBY:"Rugby",VOLLEYBALL:"Volleyball",HANDBALL:"Handball",WATERPOLO:"Waterpolo",CRICKET:"Cricket",MOTOSPORT:"Motosport",GOLF:"Golf",TABLE_TENNIS:"TableTennis",POLITICS:"Politics",EMPTY:""},L={NCAAF:1,NFL:2,MLB:3,NBA:4,NCAAB:5,NHL:6,UFC:7,WNBA:8,MLS:10,EPL:11,LIGUE_ONE:12,BUNDESLIGA:13,LA_LIGA:14,SERIE_A:15,UEFA_CL:16,UEFA_EL:17,FIFA_WC:18,J1_LEAGUE:19,IPL:20,T20_BLAST:21,IIHF_WORLD_CHAMPIONSHIP:33,COPA_AMERICA:44,COPA_LIBERTADORES:45,UEFA_EURO:50,EREDIVISIE:57,PRIMEIRA_LIGA:61,SUMMER_OLYMPICS_SOCCER_WOMEN:65,SUMMER_OLYMPICS_SOCCER:66,FIFA_WC_WOMEN:76,ENGLAND_CUP:132,FRANCE_CUP:134,SPAIN_CUP:138,ITALY_CUP:141,TENNIS_WTA:152,TENNIS_GS:153,TENNIS_MASTERS:156,SUMMER_OLYMPICS_TENNIS:158,GERMANY_CUP:209,LIGA_MX:230,BRAZIL_1:268,UEFA_EURO_U21:288,FIFA_WORLD_CUP_U20:296,SUMMER_OLYMPICS_HANDBALL_WOMEN:380,SUMMER_OLYMPICS_HANDBALL:381,EUROLEAGUE:399,SUMMER_OLYMPICS_BASKETBALL:406,SUMMER_OLYMPICS_BASKETBALL_WOMEN:407,FIBA_WORLD_CUP:409,FORMULA1:445,SUMMER_OLYMPICS_BEACH_VOLEYBALL_WOMEN:453,SUMMER_OLYMPICS_BEACH_VOLEYBALL:454,MOTOGP:497,SAUDI_PROFESSIONAL_LEAGUE:536,SUMMER_OLYMPICS_WATERPOLO:8881,SUMMER_OLYMPICS_VOLEYBALL_WOMEN:8893,SUMMER_OLYMPICS_VOLEYBALL:8894,SUMMER_OLYMPICS_TABLE_TENNIS:8910,BOXING:9196,SUMMER_OLYMPICS_RUGBY:9578,SUMMER_OLYMPICS_RUGBY_WOMEN:9588,SUMMER_OLYMPICS_HOCKEY_WOMEN:9698,SUMMER_OLYMPICS_HOCKEY:9699,UEFA_NATIONS_LEAGUE:9806,CONCACAF_NATIONS_LEAGUE:9821,CSGO:9977,DOTA2:9983,SUMMER_OLYMPICS_BASKETBALL_3X3:10071,SUMMER_OLYMPICS_BASKETBALL_3X3_WOMEN:10072,SUMMER_OLYMPICS_QUALIFICATION:10502,LOL:10138,CONMEBOL_WC_QUALIFICATIONS:10199,UEFA_CONFERENCE_LEAGUE:10216,NON_TITLE_BOXING:10595,UEFA_CHAMPIONS_LEAGUE_QUALIFICATION:10611,UEFA_EUROPA_LEAGUE_QUALIFICATION:10613,UEFA_CONFERENCE_LEAGUE_QUALIFICATION:10615,US_ELECTION:2e4,UEFA_SUPER_CUP:20001,BRAZIL_CUP:20002,ENGLAND_CHAMPIONSHIP:20011,GOLF_H2H:100021,GOLF_WINNER:100121,TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_1:15312,TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_2:15313,TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_3:15314,TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_4:15315,TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_5:15316,TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_6:15317,TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_7:15318,TENNIS_MASTERS_LIVE_MAPPING_V2_1:15622,TENNIS_MASTERS_LIVE_MAPPING_V2_2:15623,TENNIS_MASTERS_LIVE_MAPPING_V2_3:15624,TENNIS_MASTERS_LIVE_MAPPING_V2_4:15625,TENNIS_MASTERS_LIVE_MAPPING_V2_5:15626,TENNIS_MASTERS_LIVE_MAPPING_V2_6:15627,TENNIS_MASTERS_LIVE_MAPPING_V2_7:15628,TENNIS_MASTERS_LIVE_MAPPING_V2_8:15632,TENNIS_MASTERS_LIVE_MAPPING_V2_9:15633,TENNIS_MASTERS_LIVE_MAPPING_V2_10:15634,TENNIS_MASTERS_LIVE_MAPPING_V2_11:15635,TENNIS_MASTERS_LIVE_MAPPING_V2_12:15636,TENNIS_MASTERS_LIVE_MAPPING_V2_13:15637,TENNIS_MASTERS_LIVE_MAPPING_V2_14:15638,TENNIS_MASTERS_LIVE_MAPPING_V2_15:15641,TENNIS_MASTERS_LIVE_MAPPING_V2_16:15642,TENNIS_MASTERS_LIVE_MAPPING_V2_17:15643,TENNIS_MASTERS_LIVE_MAPPING_V2_18:15644,TENNIS_MASTERS_LIVE_MAPPING_V2_19:15645,TENNIS_MASTERS_LIVE_MAPPING_V2_20:15646,TENNIS_MASTERS_LIVE_MAPPING_V2_21:15647,TENNIS_MASTERS_LIVE_MAPPING_V2_22:15648,TENNIS_WTA_LIVE_MAPPING_V2_1:15322,TENNIS_WTA_LIVE_MAPPING_V2_2:15323,TENNIS_WTA_LIVE_MAPPING_V2_3:15324,TENNIS_WTA_LIVE_MAPPING_V2_4:15325,TENNIS_WTA_LIVE_MAPPING_V2_5:15326,TENNIS_WTA_LIVE_MAPPING_V2_6:15327,TENNIS_WTA_LIVE_MAPPING_V2_7:15328},l=[L.CSGO,L.DOTA2,L.LOL,L.TENNIS_GS,L.TENNIS_MASTERS,L.SUMMER_OLYMPICS_TENNIS,L.TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_1,L.TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_2,L.TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_3,L.TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_4,L.TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_5,L.TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_6,L.TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_7,L.TENNIS_MASTERS_LIVE_MAPPING_V2_1,L.TENNIS_MASTERS_LIVE_MAPPING_V2_2,L.TENNIS_MASTERS_LIVE_MAPPING_V2_3,L.TENNIS_MASTERS_LIVE_MAPPING_V2_4,L.TENNIS_MASTERS_LIVE_MAPPING_V2_5,L.TENNIS_MASTERS_LIVE_MAPPING_V2_6,L.TENNIS_MASTERS_LIVE_MAPPING_V2_7,L.TENNIS_MASTERS_LIVE_MAPPING_V2_8,L.TENNIS_MASTERS_LIVE_MAPPING_V2_9,L.TENNIS_MASTERS_LIVE_MAPPING_V2_10,L.TENNIS_MASTERS_LIVE_MAPPING_V2_11,L.TENNIS_MASTERS_LIVE_MAPPING_V2_12,L.TENNIS_MASTERS_LIVE_MAPPING_V2_13,L.TENNIS_MASTERS_LIVE_MAPPING_V2_14,L.TENNIS_MASTERS_LIVE_MAPPING_V2_15,L.TENNIS_MASTERS_LIVE_MAPPING_V2_16,L.TENNIS_MASTERS_LIVE_MAPPING_V2_17,L.TENNIS_MASTERS_LIVE_MAPPING_V2_18,L.TENNIS_MASTERS_LIVE_MAPPING_V2_19,L.TENNIS_MASTERS_LIVE_MAPPING_V2_20,L.TENNIS_MASTERS_LIVE_MAPPING_V2_21,L.TENNIS_MASTERS_LIVE_MAPPING_V2_22,L.TENNIS_WTA_LIVE_MAPPING_V2_1,L.TENNIS_WTA_LIVE_MAPPING_V2_2,L.TENNIS_WTA_LIVE_MAPPING_V2_3,L.TENNIS_WTA_LIVE_MAPPING_V2_4,L.TENNIS_WTA_LIVE_MAPPING_V2_5,L.TENNIS_WTA_LIVE_MAPPING_V2_6,L.TENNIS_WTA_LIVE_MAPPING_V2_7],T="1st Half Asian Handicap",O="1st Half Asian Handicap Corners",d="1st Half Both Teams To Score",R="1st Half Correct Score",M="1st Half Moneyline",C="1st Half Team Total",P="1st Half Team Total Exact",u="1st Half Total Corners",c="1st Half Total Goals",p="1st Half Total Goals Odd/Even",m="2nd Half Asian Handicap Corners",U="2nd Half Both Teams To Score",f="2nd Half Moneyline",G="2nd Half Total Corners",w="2nd Half Total Goals",F="2nd Half Total Goals Odd/Even",D="Anytime Goal Scorer",B="Asian Handicap",V="Asian Handicap Cards",v="Asian Handicap Corners",g="Both Teams To Score",H="Correct Score",b="Draw No Bet",h="First Goal Scorer",y="First Team To Score 3-Way",Y="Last Goal Scorer",W="Last Team To Score 3-Way",k="Moneyline",K="Player Goals",Q="Team Clean Sheet",X="Team Total",j="Team Total Card Points",x="Team Total Corners",z="Team Total Odd/Even",Z="Total Cards",J="Total Corners",q="Total Corners Odd/Even",$="Total Goals",ee="Total Goals Odd/Even",_e="To Qualify",ae="Halftime / Fulltime",re="1st 3 Innings Moneyline",te="1st 3 Innings Run Line",oe="1st 3 Innings Team Total",ne="1st 3 Innings Total Runs",Ee="1st 7 Innings Moneyline",ie="1st 7 Innings Run Line",Ae="1st 7 Innings Team Total",Ne="1st 7 Innings Total Runs",Ie="1st Half Run Line",Se="1st Half Total Runs",se="1st Inning Moneyline 3-Way",Le="1st Inning Run Line",le="1st Inning Total Runs",Te="1st Inning Total Runs Odd/Even",Oe="2nd Inning Moneyline 3-Way",de="2nd Inning Run Line",Re="2nd Inning Total Runs",Me="3rd Inning Moneyline 3-Way",Ce="3rd Inning Run Line",Pe="3rd Inning Total Runs",ue="4th Inning Moneyline 3-Way",ce="4th Inning Run Line",pe="4th Inning Total Runs",me="5th Inning Moneyline 3-Way",Ue="5th Inning Run Line",fe="5th Inning Total Runs",Ge="6th Inning Moneyline 3-Way",we="6th Inning Run Line",Fe="6th Inning Total Runs",De="7th Inning Moneyline 3-Way",Be="7th Inning Run Line",Ve="7th Inning Total Runs",ve="8th Inning Moneyline 3-Way",ge="8th Inning Run Line",He="8th Inning Total Runs",be="9th Inning Moneyline 3-Way",he="9th Inning Run Line",ye="9th Inning Total Runs",Ye="First Team To Score",We="No Runs First Inning",ke="Player Bases",Ke="Player Batting Strikeouts",Qe="Player Batting Walks",Xe="Player Doubles",je="Player Earned Runs",xe="Player Hits",ze="Player Hits + Runs + RBIs",Ze="Player Hits Allowed",Je="Player Home Runs",qe="Player Home Runs Yes/No",$e="Player Outs",e_="Player RBIs",__="Player Runs",a_="Player Singles",r_="Player Stolen Bases",t_="Player Strikeouts",o_="Player To Record Win",n_="Player Walks",E_="Run Line",i_="Total Runs",A_="Will There Be Overtime",N_="1st Half Double Chance",I_="1st Half Moneyline 3-Way",S_="1st Half Point Spread",s_="1st Half Race To 20 Points",L_="1st Half Race To 25 Points",l_="1st Half Race To 30 Points",T_="1st Half Race To 35 Points",O_="1st Half Race To 40 Points",d_="1st Half Race To 45 Points",R_="1st Half Race To 50 Points",M_="1st Half Race To 55 Points",C_="1st Half Race To 60 Points",P_="1st Half Total Points",u_="1st Half Total Points Odd/Even",c_="1st Quarter Double Chance",p_="1st Quarter Moneyline",m_="1st Quarter Moneyline 3-Way",U_="1st Quarter Point Spread",f_="1st Quarter Race To 10 Points",G_="1st Quarter Race To 15 Points",w_="1st Quarter Race To 20 Points",F_="1st Quarter Team Total",D_="1st Quarter Total Points",B_="1st Quarter Total Points Odd/Even",V_="First Basket Including FT",v_="Player Assists",g_="Player Double Double",H_="Player Made Threes",b_="Player Points",h_="Player Points + Rebounds + Assists",y_="Player Rebounds",Y_="Point Spread",W_="Race To 20 Points",k_="Team Total Points Odd/Even",K_="Total Points",Q_="Total Points Odd/Even",X_="Go The Distance",j_="Method of Victory",x_="Player Significant Strikes",z_="Player Takedowns",Z_="Round Betting",J_="Total Rounds",q_="Method Of Ending",$_="Moneyline + Total Rounds",ea="Will A Point Be Deducted",_a="Will Fight End In First Minute",aa="Winning Round",ra="Total Games",ta="Game Spread",oa=((i={})[L.NCAAF]={sport:s.FOOTBALL,id:L.NCAAF,isDrawAvailable:!1},i[L.NFL]={sport:s.FOOTBALL,id:L.NFL,isDrawAvailable:!1,spread:B,total:K_},i[L.MLB]={sport:s.BASEBALL,id:L.MLB,isDrawAvailable:!1,spread:E_,total:i_},i[L.NBA]={sport:s.BASKETBALL,id:L.NBA,isDrawAvailable:!1,spread:Y_,total:K_},i[L.NCAAB]={sport:s.BASKETBALL,id:L.NCAAB,isDrawAvailable:!1,spread:Y_,total:K_},i[L.NHL]={sport:s.HOCKEY,id:L.NHL,isDrawAvailable:!1},i[L.UFC]={sport:s.FIGHTING,id:L.UFC,isDrawAvailable:!1},i[L.WNBA]={sport:s.BASKETBALL,id:L.WNBA,isDrawAvailable:!1,spread:Y_,total:K_},i[L.MLS]={sport:s.SOCCER,id:L.MLS,isDrawAvailable:!0,spread:B,total:$},i[L.EPL]={sport:s.SOCCER,id:L.EPL,isDrawAvailable:!0,spread:B,total:$},i[L.LIGUE_ONE]={sport:s.SOCCER,id:L.LIGUE_ONE,isDrawAvailable:!0,spread:B,total:$},i[L.BUNDESLIGA]={sport:s.SOCCER,id:L.BUNDESLIGA,isDrawAvailable:!0,spread:B,total:$},i[L.LA_LIGA]={sport:s.SOCCER,id:L.LA_LIGA,isDrawAvailable:!0,spread:B,total:$},i[L.SERIE_A]={sport:s.SOCCER,id:L.SERIE_A,isDrawAvailable:!0,spread:B,total:$},i[L.UEFA_CL]={sport:s.SOCCER,id:L.UEFA_CL,isDrawAvailable:!0,spread:B,total:$},i[L.UEFA_EL]={sport:s.SOCCER,id:L.UEFA_EL,isDrawAvailable:!0,spread:B,total:$},i[L.FIFA_WC]={sport:s.SOCCER,id:L.FIFA_WC,isDrawAvailable:!0,spread:B,total:$},i[L.J1_LEAGUE]={sport:s.SOCCER,id:L.J1_LEAGUE,isDrawAvailable:!0,spread:B,total:$},i[L.IPL]={sport:s.CRICKET,id:L.IPL,isDrawAvailable:!1},i[L.T20_BLAST]={sport:s.CRICKET,id:L.T20_BLAST,isDrawAvailable:!1},i[L.IIHF_WORLD_CHAMPIONSHIP]={sport:s.HOCKEY,id:L.IIHF_WORLD_CHAMPIONSHIP,isDrawAvailable:!0},i[L.COPA_AMERICA]={sport:s.SOCCER,id:L.COPA_AMERICA,isDrawAvailable:!0,spread:B,total:$},i[L.COPA_LIBERTADORES]={sport:s.SOCCER,id:L.COPA_LIBERTADORES,isDrawAvailable:!0,spread:B,total:$},i[L.UEFA_EURO]={sport:s.SOCCER,id:L.UEFA_EURO,isDrawAvailable:!0,spread:B,total:$},i[L.EREDIVISIE]={sport:s.SOCCER,id:L.EREDIVISIE,isDrawAvailable:!0,spread:B,total:$},i[L.PRIMEIRA_LIGA]={sport:s.SOCCER,id:L.PRIMEIRA_LIGA,isDrawAvailable:!0,spread:B,total:$},i[L.SUMMER_OLYMPICS_SOCCER_WOMEN]={sport:s.SOCCER,id:L.SUMMER_OLYMPICS_SOCCER_WOMEN,isDrawAvailable:!0,spread:B,total:$},i[L.SUMMER_OLYMPICS_SOCCER]={sport:s.SOCCER,id:L.SUMMER_OLYMPICS_SOCCER,isDrawAvailable:!0,spread:B,total:$},i[L.FIFA_WC_WOMEN]={sport:s.SOCCER,id:L.FIFA_WC_WOMEN,isDrawAvailable:!0,spread:B,total:$},i[L.ENGLAND_CUP]={sport:s.SOCCER,id:L.ENGLAND_CUP,isDrawAvailable:!0,spread:B,total:$},i[L.FRANCE_CUP]={sport:s.SOCCER,id:L.FRANCE_CUP,isDrawAvailable:!0,spread:B,total:$},i[L.SPAIN_CUP]={sport:s.SOCCER,id:L.SPAIN_CUP,isDrawAvailable:!0,spread:B,total:$},i[L.ITALY_CUP]={sport:s.SOCCER,id:L.ITALY_CUP,isDrawAvailable:!0,spread:B,total:$},i[L.TENNIS_WTA]={sport:s.TENNIS,id:L.TENNIS_WTA,isDrawAvailable:!1,spread:ta,total:ra},i[L.TENNIS_GS]={sport:s.TENNIS,id:L.TENNIS_GS,isDrawAvailable:!1,spread:ta,total:ra},i[L.TENNIS_MASTERS]={sport:s.TENNIS,id:L.TENNIS_MASTERS,isDrawAvailable:!1,spread:ta,total:ra},i[L.SUMMER_OLYMPICS_TENNIS]={sport:s.TENNIS,id:L.SUMMER_OLYMPICS_TENNIS,isDrawAvailable:!1},i[L.GERMANY_CUP]={sport:s.SOCCER,id:L.GERMANY_CUP,isDrawAvailable:!0,spread:B,total:$},i[L.BRAZIL_1]={sport:s.SOCCER,id:L.BRAZIL_1,isDrawAvailable:!0,spread:B,total:$},i[L.UEFA_EURO_U21]={sport:s.SOCCER,id:L.UEFA_EURO_U21,isDrawAvailable:!0,spread:B,total:$},i[L.FIFA_WORLD_CUP_U20]={sport:s.SOCCER,id:L.FIFA_WORLD_CUP_U20,isDrawAvailable:!0,spread:B,total:$},i[L.SUMMER_OLYMPICS_HANDBALL_WOMEN]={sport:s.HANDBALL,id:L.SUMMER_OLYMPICS_HANDBALL_WOMEN,isDrawAvailable:!0},i[L.SUMMER_OLYMPICS_HANDBALL]={sport:s.HANDBALL,id:L.SUMMER_OLYMPICS_HANDBALL,isDrawAvailable:!0},i[L.EUROLEAGUE]={sport:s.BASKETBALL,id:L.EUROLEAGUE,isDrawAvailable:!1,spread:Y_,total:K_},i[L.SUMMER_OLYMPICS_BASKETBALL]={sport:s.BASKETBALL,id:L.SUMMER_OLYMPICS_BASKETBALL,isDrawAvailable:!1,spread:Y_,total:K_},i[L.SUMMER_OLYMPICS_BASKETBALL_WOMEN]={sport:s.BASKETBALL,id:L.SUMMER_OLYMPICS_BASKETBALL_WOMEN,isDrawAvailable:!1,spread:Y_,total:K_},i[L.FIBA_WORLD_CUP]={sport:s.BASKETBALL,id:L.FIBA_WORLD_CUP,isDrawAvailable:!1,spread:Y_,total:K_},i[L.FORMULA1]={sport:s.MOTOSPORT,id:L.FORMULA1,isDrawAvailable:!1},i[L.SUMMER_OLYMPICS_BEACH_VOLEYBALL_WOMEN]={sport:s.VOLLEYBALL,id:L.SUMMER_OLYMPICS_BEACH_VOLEYBALL_WOMEN,isDrawAvailable:!1},i[L.SUMMER_OLYMPICS_BEACH_VOLEYBALL]={sport:s.VOLLEYBALL,id:L.SUMMER_OLYMPICS_BEACH_VOLEYBALL,isDrawAvailable:!1},i[L.SUMMER_OLYMPICS_TABLE_TENNIS]={sport:s.TABLE_TENNIS,id:L.SUMMER_OLYMPICS_TABLE_TENNIS,isDrawAvailable:!1},i[L.MOTOGP]={sport:s.MOTOSPORT,id:L.MOTOGP,isDrawAvailable:!1},i[L.SAUDI_PROFESSIONAL_LEAGUE]={sport:s.SOCCER,id:L.SAUDI_PROFESSIONAL_LEAGUE,isDrawAvailable:!0,spread:B,total:$},i[L.SUMMER_OLYMPICS_WATERPOLO]={sport:s.WATERPOLO,id:L.SUMMER_OLYMPICS_WATERPOLO,isDrawAvailable:!0},i[L.SUMMER_OLYMPICS_VOLEYBALL_WOMEN]={sport:s.VOLLEYBALL,id:L.SUMMER_OLYMPICS_VOLEYBALL_WOMEN,isDrawAvailable:!1},i[L.SUMMER_OLYMPICS_VOLEYBALL]={sport:s.VOLLEYBALL,id:L.SUMMER_OLYMPICS_VOLEYBALL,isDrawAvailable:!1},i[L.BOXING]={sport:s.FIGHTING,id:L.BOXING,isDrawAvailable:!1},i[L.SUMMER_OLYMPICS_RUGBY]={sport:s.RUGBY,id:L.SUMMER_OLYMPICS_RUGBY,isDrawAvailable:!0},i[L.SUMMER_OLYMPICS_RUGBY_WOMEN]={sport:s.RUGBY,id:L.SUMMER_OLYMPICS_RUGBY_WOMEN,isDrawAvailable:!0},i[L.SUMMER_OLYMPICS_HOCKEY_WOMEN]={sport:s.HOCKEY,id:L.SUMMER_OLYMPICS_HOCKEY_WOMEN,isDrawAvailable:!0},i[L.SUMMER_OLYMPICS_HOCKEY]={sport:s.HOCKEY,id:L.SUMMER_OLYMPICS_HOCKEY,isDrawAvailable:!0},i[L.UEFA_NATIONS_LEAGUE]={sport:s.SOCCER,id:L.UEFA_NATIONS_LEAGUE,isDrawAvailable:!0,spread:B,total:$},i[L.CONCACAF_NATIONS_LEAGUE]={sport:s.SOCCER,id:L.CONCACAF_NATIONS_LEAGUE,isDrawAvailable:!0,spread:B,total:$},i[L.CSGO]={sport:s.ESPORTS,id:L.CSGO,isDrawAvailable:!1},i[L.DOTA2]={sport:s.ESPORTS,id:L.DOTA2,isDrawAvailable:!1},i[L.SUMMER_OLYMPICS_BASKETBALL_3X3]={sport:s.BASKETBALL,id:L.SUMMER_OLYMPICS_BASKETBALL_3X3,isDrawAvailable:!1},i[L.SUMMER_OLYMPICS_BASKETBALL_3X3_WOMEN]={sport:s.BASKETBALL,id:L.SUMMER_OLYMPICS_BASKETBALL_3X3_WOMEN,isDrawAvailable:!1},i[L.SUMMER_OLYMPICS_QUALIFICATION]={sport:s.BASKETBALL,id:L.SUMMER_OLYMPICS_QUALIFICATION,isDrawAvailable:!1,spread:Y_,total:K_},i[L.LOL]={sport:s.ESPORTS,id:L.LOL,isDrawAvailable:!1},i[L.CONMEBOL_WC_QUALIFICATIONS]={sport:s.SOCCER,id:L.CONMEBOL_WC_QUALIFICATIONS,isDrawAvailable:!0,spread:B,total:$},i[L.UEFA_CONFERENCE_LEAGUE]={sport:s.SOCCER,id:L.UEFA_CONFERENCE_LEAGUE,isDrawAvailable:!0,spread:B,total:$},i[L.NON_TITLE_BOXING]={sport:s.FIGHTING,id:L.NON_TITLE_BOXING,isDrawAvailable:!1},i[L.UEFA_CHAMPIONS_LEAGUE_QUALIFICATION]={sport:s.SOCCER,id:L.UEFA_CHAMPIONS_LEAGUE_QUALIFICATION,isDrawAvailable:!0,spread:B,total:$},i[L.UEFA_EUROPA_LEAGUE_QUALIFICATION]={sport:s.SOCCER,id:L.UEFA_EUROPA_LEAGUE_QUALIFICATION,isDrawAvailable:!0,spread:B,total:$},i[L.UEFA_CONFERENCE_LEAGUE_QUALIFICATION]={sport:s.SOCCER,id:L.UEFA_CONFERENCE_LEAGUE_QUALIFICATION,isDrawAvailable:!0,spread:B,total:$},i[L.US_ELECTION]={sport:s.POLITICS,id:L.US_ELECTION,isDrawAvailable:!1},i[L.UEFA_SUPER_CUP]={sport:s.SOCCER,id:L.UEFA_SUPER_CUP,isDrawAvailable:!0},i[L.BRAZIL_CUP]={sport:s.SOCCER,id:L.BRAZIL_CUP,isDrawAvailable:!0},i[L.ENGLAND_CHAMPIONSHIP]={sport:s.SOCCER,id:L.ENGLAND_CHAMPIONSHIP,isDrawAvailable:!0},i[L.GOLF_H2H]={sport:s.GOLF,id:L.GOLF_H2H,isDrawAvailable:!1},i[L.GOLF_WINNER]={sport:s.GOLF,id:L.GOLF_WINNER,isDrawAvailable:!1},i[L.LIGA_MX]={sport:s.SOCCER,id:L.LIGA_MX,isDrawAvailable:!0,spread:B,total:$},i),na=2,Ea=20,ia=10,Aa=2,Na=1,Ia=5,Sa=function(e){var _=oa[e];return _?_.sport:s.EMPTY},sa=function(e){var _=oa[e];return _?_.spread:void 0},La=function(e){var _=oa[e];return _?_.total:void 0},la=function(e,_,a){var r=e.score_home_total,t=e.score_away_total,o=e.clock,n=e.period,E=e.status,i=e.home_team,A=e.away_team,N=parseInt(n),I=Sa(_);return"completed"==E.toLowerCase()?{allow:!1,message:"Blocking game ".concat(i," - ").concat(A," because it is no longer live.")}:I===s.BASKETBALL?Ta(i,A,N,a.get(s.BASKETBALL)):I===s.HOCKEY?Ta(i,A,N,a.get(s.HOCKEY)):I===s.BASEBALL?Ta(i,A,N,a.get(s.BASEBALL)):I===s.SOCCER?Oa(i,A,o,n,a.get(s.SOCCER)):I===s.TENNIS?da(e,i,A,n,r,t,_,I):I===s.VOLLEYBALL?da(e,i,A,N,r,t,_,I):{allow:!0,message:"The sport ".concat(_," does not have constraint")}},Ta=function(e,_,a,r){return!Number.isNaN(a)&&a>=r?{allow:!1,message:"Blocking game ".concat(e," - ").concat(_," due to period: ").concat(a,". period")}:{allow:!0,message:""}},Oa=function(e,_,a,r,t){var o=Number(a);return!Number.isNaN(o)&&o>=t||Number.isNaN(o)&&"HALF"!=r?{allow:!1,message:"Blocking game ".concat(e," - ").concat(_," due to clock: ").concat(a,"min")}:{allow:!0,message:""}},da=function(e,_,a,r,t,o,n,E){var i=Number(r),A=Ra(i,e),N="atp"==e.league.toLowerCase(),I={home:t,away:o};return E==s.VOLLEYBALL?Ma(_,a,A,I,na,5==i?ia:Ea):n.toString().startsWith(L.TENNIS_GS)&&N?Ma(_,a,A,I,Aa,Ia):n.toString().startsWith(L.TENNIS_GS)&&!N||n.toString().startsWith(L.TENNIS_MASTERS)||n.toString().startsWith(L.SUMMER_OLYMPICS_TENNIS)||n.toString().startsWith(L.TENNIS_WTA)?Ma(_,a,A,I,Na,Ia):{allow:!0,message:"The sport ".concat(n," does not have result constraint")}},Ra=function(e,_){var a=0,r=0;switch(e){case 1:a=Number(_.score_home_period_1),r=Number(_.score_away_period_1);break;case 2:a=Number(_.score_home_period_2),r=Number(_.score_away_period_2);break;case 3:a=Number(_.score_home_period_3),r=Number(_.score_away_period_3);break;case 4:a=Number(_.score_home_period_4),r=Number(_.score_away_period_4);break;case 5:a=Number(_.score_home_period_5),r=Number(_.score_away_period_5)}return{home:a,away:r}},Ma=function(e,_,a,r,t,o){return Number(r.home)!=t&&Number(r.away)!=t||!(Number(r.home)==t&&a.home>=o||Number(r.away)==t&&a.away>=o)?{allow:!0,message:"",currentHomeGameScore:a.home,currentAwayGameScore:a.away}:{allow:!1,message:"Blocking game ".concat(e," - ").concat(_," due to current result: ").concat(r.home," - ").concat(r.away," (").concat(a.home," - ").concat(a.away,")")}},Ca=function(e,_,a,r,t,o){var n,E;if(l.includes(e)?(n=r.toLowerCase()==_.toLowerCase()||r.toLowerCase()==a.toLowerCase(),E=t.toLowerCase()==_.toLowerCase()||t.toLowerCase()==a.toLowerCase()):(n=r.toLowerCase()==_.toLowerCase(),E=t.toLowerCase()==a.toLowerCase()),!0!==n){var i=o.get(r.toLowerCase()),A=o.get(_.toLowerCase()),N=o.get(a.toLowerCase());if([i,A].some((function(e){return null==e})))return!1;n=l.includes(e)?i==A||i==N:i==A}if(!0!==E){var I=o.get(t.toLowerCase());if(A=o.get(_.toLowerCase()),[I,N=o.get(a.toLowerCase())].some((function(e){return null==e})))return!1;E=l.includes(e)&&I==A||I==N}return n&&E},Pa=function(e,_,a,r){var t;if(Sa(a)==s.TENNIS){var o=_.getTime(),n=e.getTime();t=Math.abs(n-o)<=Number(60*r*1e3)}else t=_.toUTCString()==e.toUTCString();return t},ua=0,ca="Draw",pa=1e5,ma=.2,Ua=10001,fa=10002,Ga=100,wa={OPEN:0,PAUSED:1,IN_PROGRESS:3,FINISHED:8,RESOLVED:10,CANCELED:255},Fa=function(e,_,a){if(e.some((function(e){return 0===e})))return e;var r=e.reduce((function(e,_){return e+_}),0);if(r<=1)return Array(e.length).fill(0);if(0===a){if(!(_>100*(r-1)))return e;a=_}var t=1+a/100,o=t/r,n=e.map((function(e){return e*o}));if(n.some((function(e){return e>=1})))return Array(e.length).fill(0);var E=n.reduce((function(e,_){return e+_}),0);if(E<1)return Array(e.length).fill(0);var i=t/E;return n.map((function(e){return e*i}))},Da=function(e,_,a,r){var t=e.find((function(e){return Number(e.typeId)===Number(a)&&Number(e.sportId)===Number(_)}));return t?{minSpread:t.minSpread?Number(t.minSpread):r,targetSpread:t.targetSpread?Number(t.targetSpread):0}:{minSpread:r,targetSpread:0}},Ba=function(e,_,a,r,t){var o=new Map;return e.forEach((function(e){var n,E,i=_.odds.filter((function(_){return _.sports_book_name.toLowerCase()==e.toLowerCase()})),A=r.get(a.homeTeam.toLowerCase()),N=r.get(a.awayTeam.toLowerCase()),I=0;null!=(n=null==A?i.find((function(e){var _=r.get(e.name.toLowerCase());return null==_?e.name.toLowerCase()==a.homeTeam.toLowerCase():_==a.homeTeam.toLowerCase()})):i.find((function(e){var _=r.get(e.name.toLowerCase());return null==_?e.name.toLowerCase()==A:_==A})))&&(I=n.price);var S=0;null!=(E=null==N?i.find((function(e){var _=r.get(e.name.toLowerCase());return null==_?e.name.toLowerCase()==a.awayTeam.toLowerCase():_==a.awayTeam.toLowerCase()})):i.find((function(e){var _=r.get(e.name.toLowerCase());return null==_?e.name.toLowerCase()==N:_==N})))&&(S=E.price);var s=0;if(t){var L=i.find((function(e){return"draw"==e.name.toLowerCase()}));null!=L&&(s=L.price)}o.set(e.toLowerCase(),{homeOdds:I,awayOdds:S,drawOdds:s})})),o},Va=function(e){return e===ua?0:va("decimal","impliedProbability",e)},va=function(e,_,a){try{return A(e,a).to(_)}catch(e){return 0}},ga=function(e,_,a,r,t){var o=new Map;return a.forEach((function(a){var n=0,E=e.filter((function(e){return e&&e.market_name.toLowerCase()===_.toLowerCase()&&e.sports_book_name.toLowerCase()==a.toLowerCase()&&e.selection.toLowerCase()===r.homeTeam.toLowerCase()}));0!==E.length&&(n=E[0].price);var i=0,A=e.filter((function(e){return e&&e.market_name.toLowerCase()===_.toLowerCase()&&e.sports_book_name.toLowerCase()==a.toLowerCase()&&e.selection.toLowerCase()===r.awayTeam.toLowerCase()}));0!==A.length&&(i=A[0].price);var N=0;if(!t){var I=e.filter((function(e){return e&&e.market_name.toLowerCase()===_.toLowerCase()&&e.sports_book_name.toLowerCase()==a.toLowerCase()&&e.selection.toLowerCase()===ca.toLowerCase()}));0!==I.length&&(N=I[0].price)}o.set(a.toLowerCase(),{homeOdds:n,awayOdds:i,drawOdds:N})})),o},Ha=function(e,_,a,r,t,o,n){var E={homeTeam:r.home_team,awayTeam:r.away_team},i=ga(r.odds,k,a,E,e),A=I(i,a,e,n,ma),N=A.some((function(e){return 1==e.homeOdds||1==e.awayOdds||1==e.drawOdds}));if([A[0].homeOdds,A[0].awayOdds,A[0].drawOdds].every((function(e){return e==ua}))||N)return console.log("No Moneyline odds found or there is 100% odd, returning zero odds."),e?[0,0]:[0,0,0];var S=[A[0].homeOdds,A[0].awayOdds,A[0].drawOdds].map((function(e){return Va(e)})),s=Da(_,t,pa,o);return null!==s?Fa(S,s.minSpread,s.targetSpread):Fa(S,o,0)},ba=function(e,_,a){return e.filter((function(e){return e.market_name.toLowerCase()===_.toLowerCase()&&e.sports_book_name.toLowerCase()==a.toLowerCase()}))},ha=function(e,_,a,r,t,o){var n=e.filter((function(e){return e&&.5===Math.abs(e.selection_points%1)}));return ya(n,_).map((function(e){var _=e.line,n=e.odds,E=Va(n[0])||ua,i=Va(n[1])||ua,A=E===ua||i===ua;if(!A){var N,I=Da(r,a,t,o);null!==I?(N=Fa([E,i],I.minSpread,I.targetSpread)).some((function(e){return e===ua}))?A=!0:(E=N[0],i=N[1]):(N=Fa([E,i],o,0)).some((function(e){return e===ua}))?A=!0:(E=N[0],i=N[1])}return{leagueId:a,typeId:t,type:"spread",results:[],status:A?wa.PAUSED:wa.OPEN,line:_,odds:[E,i]}})).filter((function(e){return null!==e}))},ya=function(e,_){var a=e.reduce((function(e,a){var r=a.selection_points,t=a.price,o=a.selection===_.homeTeam,n=o?r:-r;return e[n]||(e[n]={home:null,away:null}),o?e[n].home=t:e[n].away=t,e}),{}),r=Object.entries(a).reduce((function(e,_){var a=_[0],r=_[1],t=parseFloat(a);return null!==r.home&&null!==r.away&&e.push({line:t,odds:[r.home,r.away]}),e}),[]);return r},Ya=function(e,_){return void 0===_&&(_=.952),e.map((function(e){return Math.abs(e)>_?ua:e}))},Wa=function(e,_,a,r,t){var o=[],n=e.filter((function(e){return e&&.5===Math.abs(e.selection_points%1)})),E=ka(n);return Object.entries(E).forEach((function(e){var n=e[0],E=e[1],i=E.over,A=E.under,N=n.split("_"),I=(N[0],N[1]),S=Va(i)||ua,s=Va(A)||ua,L=S===ua||s===ua;if(!L){var l,T=Da(a,_,r,t);null!==T?(l=Fa([S,s],T.minSpread,T.targetSpread)).some((function(e){return e===ua}))?L=!0:(S=l[0],s=l[1]):(l=Fa([S,s],t,0)).some((function(e){return e===ua}))?L=!0:(S=l[0],s=l[1])}var O={leagueId:_,typeId:r,type:"total",results:[],status:L?wa.PAUSED:wa.OPEN,line:parseFloat(I),odds:[S,s]};o.push(O)})),o},ka=function(e){return e.reduce((function(e,_){if(_){var a="".concat(_.selection,"_").concat(_.selection_points);e[a]||(e[a]={over:null,under:null}),"over"===_.selection_line?e[a].over=_.price:"under"===_.selection_line&&(e[a].under=_.price)}return e}),{})},Ka=function(){return Ka=Object.assign||function(e){for(var _,a=1,r=arguments.length;a<r;a++)for(var t in _=arguments[a])Object.prototype.hasOwnProperty.call(_,t)&&(e[t]=_[t]);return e},Ka.apply(this,arguments)},Qa=function(e,_,a,r,t,o,n){var E=r.filter((function(_){return _.sportId===String(e.leagueId)})),i=Ha(!t,E,a,_,e.leagueId,o,n),N=i[0]==ua||i[1]==ua||t&&i[2]==ua;e.odds.length>0&&(e.odds=e.odds.map((function(e,_){var a;return _<3&&(a=i[_]),0==a?{american:0,decimal:0,normalizedImplied:0}:{american:A("impliedProbability",a).to("moneyline"),decimal:A("impliedProbability",a).to("decimal"),normalizedImplied:a}})));var I=(N?[]:Xa(e.leagueId,E,_,a,o)).map((function(_){var a=Ka(Ka({},e),_);return a.odds.length>0&&(a.odds=a.odds.map((function(e){return 0==e?{american:0,decimal:0,normalizedImplied:0}:{american:A("impliedProbability",e).to("moneyline"),decimal:A("impliedProbability",e).to("decimal"),normalizedImplied:e}}))),a}));return e.childMarkets=I,e},Xa=function(e,_,a,r,t){var o=[];return(o=o.concat(ja(a,e,_,r,t))).concat(xa(a,e,_,r,t))},ja=function(e,_,a,r,t){var o=[],n=sa(_),E={homeTeam:e.home_team,awayTeam:e.away_team};if(n){var i=ba(e.odds,n,r[0]);if(i.length>0){var A=ha(i,E,_,a,Ua,t);o.push.apply(o,A)}}else console.warn("Spread type for sport ID ".concat(_," not found."));return o},xa=function(e,_,a,r,t){var o=[],n=La(_);if(n){var E=ba(e.odds,n,r[0]);E.length>0&&o.push.apply(o,Wa(E,_,a,fa,t))}else console.warn("Configuration (totals) for sport ID ".concat(_," not found."));return o};return _})()));
1
+ !function(_,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.thalesUtils=e():_.thalesUtils=e()}(this,(()=>(()=>{"use strict";var _={d:(e,a)=>{for(var r in a)_.o(a,r)&&!_.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:a[r]})},o:(_,e)=>Object.prototype.hasOwnProperty.call(_,e),r:_=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(_,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(_,"__esModule",{value:!0})}},e={};_.r(e),_.d(e,{ANYTIME_GOAL_SCORER:()=>w,ASIAN_HANDICAP:()=>B,ASIAN_HANDICAP_CARDS:()=>V,ASIAN_HANDICAP_CORNERS:()=>H,BOTH_TEAMS_TO_SCORE:()=>b,CORRECT_SCORE:()=>g,DRAW:()=>ca,DRAW_NO_BET:()=>v,EIGHTH_INNING_MONEYLINE_3_WAY:()=>H_,EIGHTH_INNING_RUN_LINE:()=>b_,EIGHTH_INNING_TOTAL_RUNS:()=>g_,FIFTH_INNING_MONEYLINE_3_WAY:()=>U_,FIFTH_INNING_RUN_LINE:()=>m_,FIFTH_INNING_TOTAL_RUNS:()=>G_,FIRST_3_INNINGS_MONEYLINE:()=>r_,FIRST_3_INNINGS_RUN_LINE:()=>t_,FIRST_3_INNINGS_TEAM_TOTAL:()=>o_,FIRST_3_INNINGS_TOTAL_RUNS:()=>E_,FIRST_7_INNINGS_MONEYLINE:()=>n_,FIRST_7_INNINGS_RUN_LINE:()=>i_,FIRST_7_INNINGS_TEAM_TOTAL:()=>A_,FIRST_7_INNINGS_TOTAL_RUNS:()=>N_,FIRST_BASKET_INCLUDING_FT:()=>Ve,FIRST_GOAL_SCORER:()=>Y,FIRST_HALF_ASIAN_HANDICAP:()=>l,FIRST_HALF_ASIAN_HANDICAP_CORNERS:()=>O,FIRST_HALF_BOTH_TEAMS_TO_SCORE:()=>R,FIRST_HALF_CORRECT_SCORE:()=>d,FIRST_HALF_DOUBLE_CHANCE:()=>Ne,FIRST_HALF_MONEYLINE:()=>M,FIRST_HALF_MONEYLINE_3_WAY:()=>Ie,FIRST_HALF_POINT_SPREAD:()=>Se,FIRST_HALF_RACE_TO_20_POINTS:()=>se,FIRST_HALF_RACE_TO_25_POINTS:()=>Le,FIRST_HALF_RACE_TO_30_POINTS:()=>Te,FIRST_HALF_RACE_TO_35_POINTS:()=>le,FIRST_HALF_RACE_TO_40_POINTS:()=>Oe,FIRST_HALF_RACE_TO_45_POINTS:()=>Re,FIRST_HALF_RACE_TO_50_POINTS:()=>de,FIRST_HALF_RACE_TO_55_POINTS:()=>Me,FIRST_HALF_RACE_TO_60_POINTS:()=>Pe,FIRST_HALF_RUN_LINE:()=>I_,FIRST_HALF_TEAM_TOTAL:()=>P,FIRST_HALF_TEAM_TOTAL_EXACT:()=>C,FIRST_HALF_TOTAL_CORNERS:()=>u,FIRST_HALF_TOTAL_GOALS:()=>c,FIRST_HALF_TOTAL_GOALS_ODD_EVEN:()=>p,FIRST_HALF_TOTAL_POINTS:()=>Ce,FIRST_HALF_TOTAL_POINTS_ODD_EVEN:()=>ue,FIRST_HALF_TOTAL_RUNS:()=>S_,FIRST_INNING_MONEYLINE_3_WAY:()=>s_,FIRST_INNING_RUN_LINE:()=>L_,FIRST_INNING_TOTAL_RUNS:()=>T_,FIRST_INNING_TOTAL_RUNS_ODD_EVEN:()=>l_,FIRST_QUARTER_DOUBLE_CHANCE:()=>ce,FIRST_QUARTER_MONEYLINE:()=>pe,FIRST_QUARTER_MONEYLINE_3_WAY:()=>Ue,FIRST_QUARTER_POINT_SPREAD:()=>me,FIRST_QUARTER_RACE_TO_10_POINTS:()=>Ge,FIRST_QUARTER_RACE_TO_15_POINTS:()=>fe,FIRST_QUARTER_RACE_TO_20_POINTS:()=>Fe,FIRST_QUARTER_TEAM_TOTAL:()=>De,FIRST_QUARTER_TOTAL_POINTS:()=>we,FIRST_QUARTER_TOTAL_POINTS_ODD_EVEN:()=>Be,FIRST_TEAM_TO_SCORE:()=>y_,FIRST_TEAM_TO_SCORE_3_WAY:()=>h,FOURTH_INNING_MONEYLINE_3_WAY:()=>u_,FOURTH_INNING_RUN_LINE:()=>c_,FOURTH_INNING_TOTAL_RUNS:()=>p_,GAME_SPREAD:()=>ta,GO_THE_DISTANCE:()=>Xe,HALFTIME_FULLTIME:()=>a_,LAST_GOAL_SCORER:()=>y,LAST_TEAM_TO_SCORE_3_WAY:()=>W,LEAGUES_NO_FORMAL_HOME_AWAY:()=>T,LIVE_TYPE_ID_BASE:()=>pa,League:()=>L,LeagueMap:()=>oa,METHOD_OF_ENDING:()=>qe,METHOD_OF_VICTORY:()=>je,MIN_ODDS_FOR_DIFF_CHECKING:()=>Ua,MONEYLINE:()=>k,MONEYLINE_TOTAL_ROUNDS:()=>$e,MULTIPLIER_100:()=>fa,NINTH_INNING_MONEYLINE_3_WAY:()=>v_,NINTH_INNING_RUN_LINE:()=>Y_,NINTH_INNING_TOTAL_RUNS:()=>h_,NO_RUNS_FIRST_INNING:()=>W_,PLAYER_ASSISTS:()=>He,PLAYER_BASES:()=>k_,PLAYER_BATTING_STRIKEOUTS:()=>K_,PLAYER_BATTING_WALKS:()=>Q_,PLAYER_DOUBLES:()=>X_,PLAYER_DOUBLE_DOUBLE:()=>be,PLAYER_EARNED_RUNS:()=>j_,PLAYER_GOALS:()=>K,PLAYER_HITS:()=>x_,PLAYER_HITS_ALLOWED:()=>Z_,PLAYER_HITS_RUNS_RBIS:()=>z_,PLAYER_HOME_RUNS:()=>J_,PLAYER_HOME_RUNS_YES_NO:()=>q_,PLAYER_MADE_THREES:()=>ge,PLAYER_OUTS:()=>$_,PLAYER_POINTS:()=>ve,PLAYER_POINTS_REBOUNDS_ASSISTS:()=>Ye,PLAYER_RBIS:()=>_e,PLAYER_REBOUNDS:()=>he,PLAYER_RUNS:()=>ee,PLAYER_SIGNIFICANT_STRIKES:()=>xe,PLAYER_SINGLES:()=>ae,PLAYER_STOLEN_BASES:()=>re,PLAYER_STRIKEOUTS:()=>te,PLAYER_TAKEDOWNS:()=>ze,PLAYER_TO_RECORD_WIN:()=>oe,PLAYER_WALKS:()=>Ee,POINT_SPREAD:()=>ye,RACE_TO_20_POINTS:()=>We,ROUND_BETTING:()=>Ze,RUN_LINE:()=>ne,SECOND_HALF_ASIAN_HANDICAP_CORNERS:()=>U,SECOND_HALF_BOTH_TEAMS_TO_SCORE:()=>m,SECOND_HALF_MONEYLINE:()=>G,SECOND_HALF_TOTAL_CORNERS:()=>f,SECOND_HALF_TOTAL_GOALS:()=>F,SECOND_HALF_TOTAL_GOALS_ODD_EVEN:()=>D,SECOND_INNING_MONEYLINE_3_WAY:()=>O_,SECOND_INNING_RUN_LINE:()=>R_,SECOND_INNING_TOTAL_RUNS:()=>d_,SEVENTH_INNING_MONEYLINE_3_WAY:()=>w_,SEVENTH_INNING_RUN_LINE:()=>B_,SEVENTH_INNING_TOTAL_RUNS:()=>V_,SIXTH_INNING_MONEYLINE_3_WAY:()=>f_,SIXTH_INNING_RUN_LINE:()=>F_,SIXTH_INNING_TOTAL_RUNS:()=>D_,Sport:()=>s,TAG_CHILD_SPREAD:()=>ma,TAG_CHILD_TOTALS:()=>Ga,TEAM_CLEAN_SHEET:()=>Q,TEAM_TOTAL:()=>X,TEAM_TOTAL_CARD_POINTS:()=>j,TEAM_TOTAL_CORNERS:()=>x,TEAM_TOTAL_ODD_EVEN:()=>z,TEAM_TOTAL_POINTS_ODD_EVEN:()=>ke,TENNIS_ATP_GRAND_SLAM_SET_THRESHOLD:()=>Aa,TENNIS_GEMS_LIMIT:()=>Ia,TENNIS_MASTERS_SET_THRESHOLD:()=>Na,THIRD_INNING_MONEYLINE_3_WAY:()=>M_,THIRD_INNING_RUN_LINE:()=>P_,THIRD_INNING_TOTAL_RUNS:()=>C_,TOTAL_CARDS:()=>Z,TOTAL_CORNERS:()=>J,TOTAL_CORNERS_ODD_EVEN:()=>q,TOTAL_GAMES:()=>ra,TOTAL_GOALS:()=>$,TOTAL_GOALS_ODD_EVEN:()=>__,TOTAL_POINTS:()=>Ke,TOTAL_POINTS_ODD_EVEN:()=>Qe,TOTAL_ROUNDS:()=>Je,TOTAL_RUNS:()=>ie,TO_QUALIFY:()=>e_,VOLLEYBALL_FIFTH_SET_POINTS_LIMIT:()=>ia,VOLLEYBALL_POINTS_LIMIT:()=>na,VOLLEYBALL_SET_THRESHOLD:()=>Ea,WILL_A_POINT_BE_DEDUCTED:()=>_a,WILL_FIGHT_END_IN_FIRST_MINUTE:()=>ea,WILL_THERE_BE_OVERTIME:()=>Ae,WINNING_ROUND:()=>aa,ZERO:()=>ua,adjustSpreadOnOdds:()=>Da,allowGameSportWithPeriodConstraint:()=>la,allowGameSportWithResultConstraint:()=>Ra,allowSoccerGame:()=>Oa,calculateImpliedOddsDifference:()=>S,checkGameContraints:()=>Ta,checkOddsFromBookmakers:()=>I,createSpreadChildMarkets:()=>Xa,createTotalChildMarkets:()=>ja,cutOddsCloseToValue:()=>ha,fetchResultInCurrentSet:()=>da,filterOddsByMarketNameBookmaker:()=>ga,filterOddsByMarketNameTeamNameBookmaker:()=>Ha,formatSpreadOdds:()=>va,gamesDatesMatching:()=>Ca,getBookmakersArray:()=>N,getLeagueSport:()=>Sa,getLeagueSpreadType:()=>sa,getLeagueTotalType:()=>La,getParentOdds:()=>ba,getSpreadData:()=>wa,groupAndFormatSpreadOdds:()=>Ya,groupOddsBySelectionAndPoints:()=>Wa,processMarket:()=>Ka,processTotalOdds:()=>ya,statusCodes:()=>Fa,teamNamesMatching:()=>Pa}),"function"!=typeof Object.assign&&(Object.assign=function(_,e){if(null==_)throw new TypeError("Cannot convert undefined or null to object");for(var a=Object(_),r=1;r<arguments.length;r++){var t=arguments[r];if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(a[o]=t[o])}return a});var a=function(_){return parseFloat(_.toPrecision(12))};function r(_,e,a){return void 0===a||0==+a?Math[_](e):(e=+e,a=+a,isNaN(e)||"number"!=typeof a||a%1!=0?NaN:e<0?-r(_,-e,a):(e=e.toString().split("e"),+((e=(e=Math[_](+(e[0]+"e"+(e[1]?+e[1]-a:-a)))).toString().split("e"))[0]+"e"+(e[1]?+e[1]+a:a))))}var t,o,E={decimal:{from:function(_){if((_=parseFloat(_))<=1)throw new Error("Outside valid range.");return _},to:function(){return this.decimalValue}},moneyline:{from:function(_){return(_=parseFloat(_))>=0?_/100+1:100/-_+1},to:function(){return this.decimalValue>=2?a(100*(this.decimalValue-1)):a(-100/(this.decimalValue-1))}},hongKong:{from:function(_){if((_=parseFloat(_))<0)throw new Error("Outside valid range.");return _+1},to:function(){return a(this.decimalValue-1)}},impliedProbability:{from:function(_){if((_="string"==typeof _&&"%"==_.slice(-1)?parseFloat(_)/100:parseFloat(_))<=0||_>=1)throw new Error("Outside valid range");return 1/_},to:function(_){if(_.percentage){var e=a(100/this.decimalValue);return null!==_.precision&&(e=r("round",e,-_.precision)),e.toString()+"%"}return a(1/this.decimalValue)}},fractional:{from:function(_){var e,a=_.toString().split("/");if(_=parseFloat(a[0]),2===a.length)e=parseFloat(a[1]);else{if(1!==a.length)throw new Error("Invalid fraction");e=1}if(0===_||0===e||_/e<=0)throw new Error("Outside valid range");return 1+_/e},to:function(_){return function(_,e){for(var a,r=[0,1],t=[1,0],o=function(_){var e=null,a=_.toString().indexOf("E");-1==a&&(a=_.toString().indexOf("e"));var r=null,t=(e=-1==a?_.toString():_.toString().substring(0,a)).toString().indexOf(".");-1==t?r=e:0===t?r=e.substring(1,e.length):t<e.length&&(r=e.substring(0,t)+e.substring(t+1,e.length));var o=r,E=o.toString().length,n=_,i=n.toString().length;0===n&&(i=0);var A,N=E-i;for(A=N;A>0&&o%2==0;A--)o/=2;for(A=N;A>0&&o%5==0;A--)o/=5;return o}(_),E=_,n=Math.pow(10,-e)/2,i=2;i<1e3;i++){var A=Math.floor(E);if(r[i]=A*r[i-1]+r[i-2],Math.abs(r[i])>o)return;if(t[i]=A*t[i-1]+t[i-2],a=r[i]/t[i],Math.abs(a-_)<n||NaN==a)return r[i].toString()+"/"+t[i].toString();E=1/(E-A)}}(this.decimalValue-1,_.precision||12)}},malay:{from:function(_){if((_=parseFloat(_))<=-1||_>1)throw new Error("Outside valid range.");return _<0&&(_=-1/_),_+1},to:function(){return this.decimalValue<=2?a(this.decimalValue-1):a(-1/(this.decimalValue-1))}},indonesian:{from:function(_){if(0===(_=parseFloat(_)))throw new Error("Outside valid range.");return _>=1?_+1:-1/_+1},to:function(){return this.decimalValue<2?a(-1/(this.decimalValue-1)):a(this.decimalValue-1)}}},n=((o=function(_){if("number"!=typeof _||isNaN(_))throw new Error("Invalid odds");this.decimalValue=a(_)}).prototype=(t=function(){throw new Error("This constructor is private, please use the from* functions")}).prototype,t.from=function(_,e){if(!E.hasOwnProperty(_))throw new Error("Unknown format "+_+".");var a=E[_].from(e);return new o(a)},t);n.prototype.to=function(_,e){if(!E.hasOwnProperty(_))throw new Error("Unknown format "+_+".");e=Object.assign({precision:null,percentage:!1},e);var a=E[_].to.call(this,e);return"number"==typeof a&&null!==e.precision&&(a=r("round",a,-e.precision)),a};var i,A=n.from,N=function(_,e,a){var r=_.find((function(_){return Number(_.sportId)===Number(e)}));if(r){if(""==r.primaryBookmaker)return a;var t=[];return r.primaryBookmaker&&t.push(r.primaryBookmaker),r.secondaryBookmaker&&t.push(r.secondaryBookmaker),r.tertiaryBookmaker&&t.push(r.tertiaryBookmaker),t}return a},I=function(_,e,a,r,t){var o=_.get(e[0]);if(!o)return{homeOdds:0,awayOdds:0,drawOdds:0,errorMessage:"Returning zero odds cause no matching bookmakers have been found"};var E=o.homeOdds,n=o.awayOdds,i=a?0:o.drawOdds;if(e.some((function(e){var r=_.get(e);return!!r&&(0===r.homeOdds||0===r.awayOdds||!a&&0===r.drawOdds||1===r.homeOdds||1===r.awayOdds||!a&&1===r.drawOdds)})))return{homeOdds:0,awayOdds:0,drawOdds:0,errorMessage:"Returning zero odds cause bookmakers have 0 or 1 odds"};if(1==e.length)return{homeOdds:E,awayOdds:n,drawOdds:a?0:i};if(e.slice(1).some((function(e){var o=_[e];if(o){var N=o.homeOdds,I=o.awayOdds,s=o.drawOdds,L=A("decimal",E).to("impliedProbability"),T=A("decimal",n).to("impliedProbability"),l=a?0:A("decimal",i).to("impliedProbability"),O=A("decimal",N).to("impliedProbability"),R=A("decimal",I).to("impliedProbability"),d=a?0:A("decimal",s).to("impliedProbability"),M=S(L,O),P=S(T,R),C=a?0:S(l,d);if(M>r&&L>t&&O>t||P>r&&T>t&&R>t||!a&&C>r&&l>t&&d>t)return!0}return!1})))return{homeOdds:0,awayOdds:0,drawOdds:0,errorMessage:"Returning zero odds due to percentage difference between bookmakers"};var N=[];return e.forEach((function(e){return N.push(_.get(e))})),{homeOdds:E,awayOdds:n,drawOdds:a?0:i}},S=function(_,e){var a=Math.abs(_-e)/_*100;return console.log("% diff: "+a),a},s={SOCCER:"Soccer",FOOTBALL:"Football",BASKETBALL:"Basketball",BASEBALL:"Baseball",HOCKEY:"Hockey",FIGHTING:"Fighting",TENNIS:"Tennis",ESPORTS:"eSports",RUGBY:"Rugby",VOLLEYBALL:"Volleyball",HANDBALL:"Handball",WATERPOLO:"Waterpolo",CRICKET:"Cricket",MOTOSPORT:"Motosport",GOLF:"Golf",TABLE_TENNIS:"TableTennis",POLITICS:"Politics",EMPTY:""},L={NCAAF:1,NFL:2,MLB:3,NBA:4,NCAAB:5,NHL:6,UFC:7,WNBA:8,MLS:10,EPL:11,LIGUE_ONE:12,BUNDESLIGA:13,LA_LIGA:14,SERIE_A:15,UEFA_CL:16,UEFA_EL:17,FIFA_WC:18,J1_LEAGUE:19,IPL:20,T20_BLAST:21,IIHF_WORLD_CHAMPIONSHIP:33,COPA_AMERICA:44,COPA_LIBERTADORES:45,UEFA_EURO:50,EREDIVISIE:57,PRIMEIRA_LIGA:61,SUMMER_OLYMPICS_SOCCER_WOMEN:65,SUMMER_OLYMPICS_SOCCER:66,FIFA_WC_WOMEN:76,ENGLAND_CUP:132,FRANCE_CUP:134,SPAIN_CUP:138,ITALY_CUP:141,TENNIS_WTA:152,TENNIS_GS:153,TENNIS_MASTERS:156,SUMMER_OLYMPICS_TENNIS:158,GERMANY_CUP:209,LIGA_MX:230,BRAZIL_1:268,UEFA_EURO_U21:288,FIFA_WORLD_CUP_U20:296,SUMMER_OLYMPICS_HANDBALL_WOMEN:380,SUMMER_OLYMPICS_HANDBALL:381,EUROLEAGUE:399,SUMMER_OLYMPICS_BASKETBALL:406,SUMMER_OLYMPICS_BASKETBALL_WOMEN:407,FIBA_WORLD_CUP:409,FORMULA1:445,SUMMER_OLYMPICS_BEACH_VOLEYBALL_WOMEN:453,SUMMER_OLYMPICS_BEACH_VOLEYBALL:454,MOTOGP:497,SAUDI_PROFESSIONAL_LEAGUE:536,SUMMER_OLYMPICS_WATERPOLO:8881,SUMMER_OLYMPICS_VOLEYBALL_WOMEN:8893,SUMMER_OLYMPICS_VOLEYBALL:8894,SUMMER_OLYMPICS_TABLE_TENNIS:8910,BOXING:9196,SUMMER_OLYMPICS_RUGBY:9578,SUMMER_OLYMPICS_RUGBY_WOMEN:9588,SUMMER_OLYMPICS_HOCKEY_WOMEN:9698,SUMMER_OLYMPICS_HOCKEY:9699,UEFA_NATIONS_LEAGUE:9806,CONCACAF_NATIONS_LEAGUE:9821,CSGO:9977,DOTA2:9983,SUMMER_OLYMPICS_BASKETBALL_3X3:10071,SUMMER_OLYMPICS_BASKETBALL_3X3_WOMEN:10072,SUMMER_OLYMPICS_QUALIFICATION:10502,LOL:10138,CONMEBOL_WC_QUALIFICATIONS:10199,UEFA_CONFERENCE_LEAGUE:10216,NON_TITLE_BOXING:10595,UEFA_CHAMPIONS_LEAGUE_QUALIFICATION:10611,UEFA_EUROPA_LEAGUE_QUALIFICATION:10613,UEFA_CONFERENCE_LEAGUE_QUALIFICATION:10615,US_ELECTION:2e4,UEFA_SUPER_CUP:20001,BRAZIL_CUP:20002,ENGLAND_CHAMPIONSHIP:20011,GOLF_H2H:100021,GOLF_WINNER:100121,TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_1:15312,TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_2:15313,TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_3:15314,TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_4:15315,TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_5:15316,TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_6:15317,TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_7:15318,TENNIS_MASTERS_LIVE_MAPPING_V2_1:15622,TENNIS_MASTERS_LIVE_MAPPING_V2_2:15623,TENNIS_MASTERS_LIVE_MAPPING_V2_3:15624,TENNIS_MASTERS_LIVE_MAPPING_V2_4:15625,TENNIS_MASTERS_LIVE_MAPPING_V2_5:15626,TENNIS_MASTERS_LIVE_MAPPING_V2_6:15627,TENNIS_MASTERS_LIVE_MAPPING_V2_7:15628,TENNIS_MASTERS_LIVE_MAPPING_V2_8:15632,TENNIS_MASTERS_LIVE_MAPPING_V2_9:15633,TENNIS_MASTERS_LIVE_MAPPING_V2_10:15634,TENNIS_MASTERS_LIVE_MAPPING_V2_11:15635,TENNIS_MASTERS_LIVE_MAPPING_V2_12:15636,TENNIS_MASTERS_LIVE_MAPPING_V2_13:15637,TENNIS_MASTERS_LIVE_MAPPING_V2_14:15638,TENNIS_MASTERS_LIVE_MAPPING_V2_15:15641,TENNIS_MASTERS_LIVE_MAPPING_V2_16:15642,TENNIS_MASTERS_LIVE_MAPPING_V2_17:15643,TENNIS_MASTERS_LIVE_MAPPING_V2_18:15644,TENNIS_MASTERS_LIVE_MAPPING_V2_19:15645,TENNIS_MASTERS_LIVE_MAPPING_V2_20:15646,TENNIS_MASTERS_LIVE_MAPPING_V2_21:15647,TENNIS_MASTERS_LIVE_MAPPING_V2_22:15648,TENNIS_WTA_LIVE_MAPPING_V2_1:15322,TENNIS_WTA_LIVE_MAPPING_V2_2:15323,TENNIS_WTA_LIVE_MAPPING_V2_3:15324,TENNIS_WTA_LIVE_MAPPING_V2_4:15325,TENNIS_WTA_LIVE_MAPPING_V2_5:15326,TENNIS_WTA_LIVE_MAPPING_V2_6:15327,TENNIS_WTA_LIVE_MAPPING_V2_7:15328},T=[L.CSGO,L.DOTA2,L.LOL,L.TENNIS_GS,L.TENNIS_MASTERS,L.SUMMER_OLYMPICS_TENNIS,L.TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_1,L.TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_2,L.TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_3,L.TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_4,L.TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_5,L.TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_6,L.TENNIS_GRAND_SLAM_LIVE_MAPPING_V2_7,L.TENNIS_MASTERS_LIVE_MAPPING_V2_1,L.TENNIS_MASTERS_LIVE_MAPPING_V2_2,L.TENNIS_MASTERS_LIVE_MAPPING_V2_3,L.TENNIS_MASTERS_LIVE_MAPPING_V2_4,L.TENNIS_MASTERS_LIVE_MAPPING_V2_5,L.TENNIS_MASTERS_LIVE_MAPPING_V2_6,L.TENNIS_MASTERS_LIVE_MAPPING_V2_7,L.TENNIS_MASTERS_LIVE_MAPPING_V2_8,L.TENNIS_MASTERS_LIVE_MAPPING_V2_9,L.TENNIS_MASTERS_LIVE_MAPPING_V2_10,L.TENNIS_MASTERS_LIVE_MAPPING_V2_11,L.TENNIS_MASTERS_LIVE_MAPPING_V2_12,L.TENNIS_MASTERS_LIVE_MAPPING_V2_13,L.TENNIS_MASTERS_LIVE_MAPPING_V2_14,L.TENNIS_MASTERS_LIVE_MAPPING_V2_15,L.TENNIS_MASTERS_LIVE_MAPPING_V2_16,L.TENNIS_MASTERS_LIVE_MAPPING_V2_17,L.TENNIS_MASTERS_LIVE_MAPPING_V2_18,L.TENNIS_MASTERS_LIVE_MAPPING_V2_19,L.TENNIS_MASTERS_LIVE_MAPPING_V2_20,L.TENNIS_MASTERS_LIVE_MAPPING_V2_21,L.TENNIS_MASTERS_LIVE_MAPPING_V2_22,L.TENNIS_WTA_LIVE_MAPPING_V2_1,L.TENNIS_WTA_LIVE_MAPPING_V2_2,L.TENNIS_WTA_LIVE_MAPPING_V2_3,L.TENNIS_WTA_LIVE_MAPPING_V2_4,L.TENNIS_WTA_LIVE_MAPPING_V2_5,L.TENNIS_WTA_LIVE_MAPPING_V2_6,L.TENNIS_WTA_LIVE_MAPPING_V2_7],l="1st Half Asian Handicap",O="1st Half Asian Handicap Corners",R="1st Half Both Teams To Score",d="1st Half Correct Score",M="1st Half Moneyline",P="1st Half Team Total",C="1st Half Team Total Exact",u="1st Half Total Corners",c="1st Half Total Goals",p="1st Half Total Goals Odd/Even",U="2nd Half Asian Handicap Corners",m="2nd Half Both Teams To Score",G="2nd Half Moneyline",f="2nd Half Total Corners",F="2nd Half Total Goals",D="2nd Half Total Goals Odd/Even",w="Anytime Goal Scorer",B="Asian Handicap",V="Asian Handicap Cards",H="Asian Handicap Corners",b="Both Teams To Score",g="Correct Score",v="Draw No Bet",Y="First Goal Scorer",h="First Team To Score 3-Way",y="Last Goal Scorer",W="Last Team To Score 3-Way",k="Moneyline",K="Player Goals",Q="Team Clean Sheet",X="Team Total",j="Team Total Card Points",x="Team Total Corners",z="Team Total Odd/Even",Z="Total Cards",J="Total Corners",q="Total Corners Odd/Even",$="Total Goals",__="Total Goals Odd/Even",e_="To Qualify",a_="Halftime / Fulltime",r_="1st 3 Innings Moneyline",t_="1st 3 Innings Run Line",o_="1st 3 Innings Team Total",E_="1st 3 Innings Total Runs",n_="1st 7 Innings Moneyline",i_="1st 7 Innings Run Line",A_="1st 7 Innings Team Total",N_="1st 7 Innings Total Runs",I_="1st Half Run Line",S_="1st Half Total Runs",s_="1st Inning Moneyline 3-Way",L_="1st Inning Run Line",T_="1st Inning Total Runs",l_="1st Inning Total Runs Odd/Even",O_="2nd Inning Moneyline 3-Way",R_="2nd Inning Run Line",d_="2nd Inning Total Runs",M_="3rd Inning Moneyline 3-Way",P_="3rd Inning Run Line",C_="3rd Inning Total Runs",u_="4th Inning Moneyline 3-Way",c_="4th Inning Run Line",p_="4th Inning Total Runs",U_="5th Inning Moneyline 3-Way",m_="5th Inning Run Line",G_="5th Inning Total Runs",f_="6th Inning Moneyline 3-Way",F_="6th Inning Run Line",D_="6th Inning Total Runs",w_="7th Inning Moneyline 3-Way",B_="7th Inning Run Line",V_="7th Inning Total Runs",H_="8th Inning Moneyline 3-Way",b_="8th Inning Run Line",g_="8th Inning Total Runs",v_="9th Inning Moneyline 3-Way",Y_="9th Inning Run Line",h_="9th Inning Total Runs",y_="First Team To Score",W_="No Runs First Inning",k_="Player Bases",K_="Player Batting Strikeouts",Q_="Player Batting Walks",X_="Player Doubles",j_="Player Earned Runs",x_="Player Hits",z_="Player Hits + Runs + RBIs",Z_="Player Hits Allowed",J_="Player Home Runs",q_="Player Home Runs Yes/No",$_="Player Outs",_e="Player RBIs",ee="Player Runs",ae="Player Singles",re="Player Stolen Bases",te="Player Strikeouts",oe="Player To Record Win",Ee="Player Walks",ne="Run Line",ie="Total Runs",Ae="Will There Be Overtime",Ne="1st Half Double Chance",Ie="1st Half Moneyline 3-Way",Se="1st Half Point Spread",se="1st Half Race To 20 Points",Le="1st Half Race To 25 Points",Te="1st Half Race To 30 Points",le="1st Half Race To 35 Points",Oe="1st Half Race To 40 Points",Re="1st Half Race To 45 Points",de="1st Half Race To 50 Points",Me="1st Half Race To 55 Points",Pe="1st Half Race To 60 Points",Ce="1st Half Total Points",ue="1st Half Total Points Odd/Even",ce="1st Quarter Double Chance",pe="1st Quarter Moneyline",Ue="1st Quarter Moneyline 3-Way",me="1st Quarter Point Spread",Ge="1st Quarter Race To 10 Points",fe="1st Quarter Race To 15 Points",Fe="1st Quarter Race To 20 Points",De="1st Quarter Team Total",we="1st Quarter Total Points",Be="1st Quarter Total Points Odd/Even",Ve="First Basket Including FT",He="Player Assists",be="Player Double Double",ge="Player Made Threes",ve="Player Points",Ye="Player Points + Rebounds + Assists",he="Player Rebounds",ye="Point Spread",We="Race To 20 Points",ke="Team Total Points Odd/Even",Ke="Total Points",Qe="Total Points Odd/Even",Xe="Go The Distance",je="Method of Victory",xe="Player Significant Strikes",ze="Player Takedowns",Ze="Round Betting",Je="Total Rounds",qe="Method Of Ending",$e="Moneyline + Total Rounds",_a="Will A Point Be Deducted",ea="Will Fight End In First Minute",aa="Winning Round",ra="Total Games",ta="Game Spread",oa=((i={})[L.NCAAF]={sport:s.FOOTBALL,id:L.NCAAF,isDrawAvailable:!1},i[L.NFL]={sport:s.FOOTBALL,id:L.NFL,isDrawAvailable:!1,spread:B,total:Ke},i[L.MLB]={sport:s.BASEBALL,id:L.MLB,isDrawAvailable:!1,spread:ne,total:ie},i[L.NBA]={sport:s.BASKETBALL,id:L.NBA,isDrawAvailable:!1,spread:ye,total:Ke},i[L.NCAAB]={sport:s.BASKETBALL,id:L.NCAAB,isDrawAvailable:!1,spread:ye,total:Ke},i[L.NHL]={sport:s.HOCKEY,id:L.NHL,isDrawAvailable:!1},i[L.UFC]={sport:s.FIGHTING,id:L.UFC,isDrawAvailable:!1},i[L.WNBA]={sport:s.BASKETBALL,id:L.WNBA,isDrawAvailable:!1,spread:ye,total:Ke},i[L.MLS]={sport:s.SOCCER,id:L.MLS,isDrawAvailable:!0,spread:B,total:$},i[L.EPL]={sport:s.SOCCER,id:L.EPL,isDrawAvailable:!0,spread:B,total:$},i[L.LIGUE_ONE]={sport:s.SOCCER,id:L.LIGUE_ONE,isDrawAvailable:!0,spread:B,total:$},i[L.BUNDESLIGA]={sport:s.SOCCER,id:L.BUNDESLIGA,isDrawAvailable:!0,spread:B,total:$},i[L.LA_LIGA]={sport:s.SOCCER,id:L.LA_LIGA,isDrawAvailable:!0,spread:B,total:$},i[L.SERIE_A]={sport:s.SOCCER,id:L.SERIE_A,isDrawAvailable:!0,spread:B,total:$},i[L.UEFA_CL]={sport:s.SOCCER,id:L.UEFA_CL,isDrawAvailable:!0,spread:B,total:$},i[L.UEFA_EL]={sport:s.SOCCER,id:L.UEFA_EL,isDrawAvailable:!0,spread:B,total:$},i[L.FIFA_WC]={sport:s.SOCCER,id:L.FIFA_WC,isDrawAvailable:!0,spread:B,total:$},i[L.J1_LEAGUE]={sport:s.SOCCER,id:L.J1_LEAGUE,isDrawAvailable:!0,spread:B,total:$},i[L.IPL]={sport:s.CRICKET,id:L.IPL,isDrawAvailable:!1},i[L.T20_BLAST]={sport:s.CRICKET,id:L.T20_BLAST,isDrawAvailable:!1},i[L.IIHF_WORLD_CHAMPIONSHIP]={sport:s.HOCKEY,id:L.IIHF_WORLD_CHAMPIONSHIP,isDrawAvailable:!0},i[L.COPA_AMERICA]={sport:s.SOCCER,id:L.COPA_AMERICA,isDrawAvailable:!0,spread:B,total:$},i[L.COPA_LIBERTADORES]={sport:s.SOCCER,id:L.COPA_LIBERTADORES,isDrawAvailable:!0,spread:B,total:$},i[L.UEFA_EURO]={sport:s.SOCCER,id:L.UEFA_EURO,isDrawAvailable:!0,spread:B,total:$},i[L.EREDIVISIE]={sport:s.SOCCER,id:L.EREDIVISIE,isDrawAvailable:!0,spread:B,total:$},i[L.PRIMEIRA_LIGA]={sport:s.SOCCER,id:L.PRIMEIRA_LIGA,isDrawAvailable:!0,spread:B,total:$},i[L.SUMMER_OLYMPICS_SOCCER_WOMEN]={sport:s.SOCCER,id:L.SUMMER_OLYMPICS_SOCCER_WOMEN,isDrawAvailable:!0,spread:B,total:$},i[L.SUMMER_OLYMPICS_SOCCER]={sport:s.SOCCER,id:L.SUMMER_OLYMPICS_SOCCER,isDrawAvailable:!0,spread:B,total:$},i[L.FIFA_WC_WOMEN]={sport:s.SOCCER,id:L.FIFA_WC_WOMEN,isDrawAvailable:!0,spread:B,total:$},i[L.ENGLAND_CUP]={sport:s.SOCCER,id:L.ENGLAND_CUP,isDrawAvailable:!0,spread:B,total:$},i[L.FRANCE_CUP]={sport:s.SOCCER,id:L.FRANCE_CUP,isDrawAvailable:!0,spread:B,total:$},i[L.SPAIN_CUP]={sport:s.SOCCER,id:L.SPAIN_CUP,isDrawAvailable:!0,spread:B,total:$},i[L.ITALY_CUP]={sport:s.SOCCER,id:L.ITALY_CUP,isDrawAvailable:!0,spread:B,total:$},i[L.TENNIS_WTA]={sport:s.TENNIS,id:L.TENNIS_WTA,isDrawAvailable:!1,spread:ta,total:ra},i[L.TENNIS_GS]={sport:s.TENNIS,id:L.TENNIS_GS,isDrawAvailable:!1,spread:ta,total:ra},i[L.TENNIS_MASTERS]={sport:s.TENNIS,id:L.TENNIS_MASTERS,isDrawAvailable:!1,spread:ta,total:ra},i[L.SUMMER_OLYMPICS_TENNIS]={sport:s.TENNIS,id:L.SUMMER_OLYMPICS_TENNIS,isDrawAvailable:!1},i[L.GERMANY_CUP]={sport:s.SOCCER,id:L.GERMANY_CUP,isDrawAvailable:!0,spread:B,total:$},i[L.BRAZIL_1]={sport:s.SOCCER,id:L.BRAZIL_1,isDrawAvailable:!0,spread:B,total:$},i[L.UEFA_EURO_U21]={sport:s.SOCCER,id:L.UEFA_EURO_U21,isDrawAvailable:!0,spread:B,total:$},i[L.FIFA_WORLD_CUP_U20]={sport:s.SOCCER,id:L.FIFA_WORLD_CUP_U20,isDrawAvailable:!0,spread:B,total:$},i[L.SUMMER_OLYMPICS_HANDBALL_WOMEN]={sport:s.HANDBALL,id:L.SUMMER_OLYMPICS_HANDBALL_WOMEN,isDrawAvailable:!0},i[L.SUMMER_OLYMPICS_HANDBALL]={sport:s.HANDBALL,id:L.SUMMER_OLYMPICS_HANDBALL,isDrawAvailable:!0},i[L.EUROLEAGUE]={sport:s.BASKETBALL,id:L.EUROLEAGUE,isDrawAvailable:!1,spread:ye,total:Ke},i[L.SUMMER_OLYMPICS_BASKETBALL]={sport:s.BASKETBALL,id:L.SUMMER_OLYMPICS_BASKETBALL,isDrawAvailable:!1,spread:ye,total:Ke},i[L.SUMMER_OLYMPICS_BASKETBALL_WOMEN]={sport:s.BASKETBALL,id:L.SUMMER_OLYMPICS_BASKETBALL_WOMEN,isDrawAvailable:!1,spread:ye,total:Ke},i[L.FIBA_WORLD_CUP]={sport:s.BASKETBALL,id:L.FIBA_WORLD_CUP,isDrawAvailable:!1,spread:ye,total:Ke},i[L.FORMULA1]={sport:s.MOTOSPORT,id:L.FORMULA1,isDrawAvailable:!1},i[L.SUMMER_OLYMPICS_BEACH_VOLEYBALL_WOMEN]={sport:s.VOLLEYBALL,id:L.SUMMER_OLYMPICS_BEACH_VOLEYBALL_WOMEN,isDrawAvailable:!1},i[L.SUMMER_OLYMPICS_BEACH_VOLEYBALL]={sport:s.VOLLEYBALL,id:L.SUMMER_OLYMPICS_BEACH_VOLEYBALL,isDrawAvailable:!1},i[L.SUMMER_OLYMPICS_TABLE_TENNIS]={sport:s.TABLE_TENNIS,id:L.SUMMER_OLYMPICS_TABLE_TENNIS,isDrawAvailable:!1},i[L.MOTOGP]={sport:s.MOTOSPORT,id:L.MOTOGP,isDrawAvailable:!1},i[L.SAUDI_PROFESSIONAL_LEAGUE]={sport:s.SOCCER,id:L.SAUDI_PROFESSIONAL_LEAGUE,isDrawAvailable:!0,spread:B,total:$},i[L.SUMMER_OLYMPICS_WATERPOLO]={sport:s.WATERPOLO,id:L.SUMMER_OLYMPICS_WATERPOLO,isDrawAvailable:!0},i[L.SUMMER_OLYMPICS_VOLEYBALL_WOMEN]={sport:s.VOLLEYBALL,id:L.SUMMER_OLYMPICS_VOLEYBALL_WOMEN,isDrawAvailable:!1},i[L.SUMMER_OLYMPICS_VOLEYBALL]={sport:s.VOLLEYBALL,id:L.SUMMER_OLYMPICS_VOLEYBALL,isDrawAvailable:!1},i[L.BOXING]={sport:s.FIGHTING,id:L.BOXING,isDrawAvailable:!1},i[L.SUMMER_OLYMPICS_RUGBY]={sport:s.RUGBY,id:L.SUMMER_OLYMPICS_RUGBY,isDrawAvailable:!0},i[L.SUMMER_OLYMPICS_RUGBY_WOMEN]={sport:s.RUGBY,id:L.SUMMER_OLYMPICS_RUGBY_WOMEN,isDrawAvailable:!0},i[L.SUMMER_OLYMPICS_HOCKEY_WOMEN]={sport:s.HOCKEY,id:L.SUMMER_OLYMPICS_HOCKEY_WOMEN,isDrawAvailable:!0},i[L.SUMMER_OLYMPICS_HOCKEY]={sport:s.HOCKEY,id:L.SUMMER_OLYMPICS_HOCKEY,isDrawAvailable:!0},i[L.UEFA_NATIONS_LEAGUE]={sport:s.SOCCER,id:L.UEFA_NATIONS_LEAGUE,isDrawAvailable:!0,spread:B,total:$},i[L.CONCACAF_NATIONS_LEAGUE]={sport:s.SOCCER,id:L.CONCACAF_NATIONS_LEAGUE,isDrawAvailable:!0,spread:B,total:$},i[L.CSGO]={sport:s.ESPORTS,id:L.CSGO,isDrawAvailable:!1},i[L.DOTA2]={sport:s.ESPORTS,id:L.DOTA2,isDrawAvailable:!1},i[L.SUMMER_OLYMPICS_BASKETBALL_3X3]={sport:s.BASKETBALL,id:L.SUMMER_OLYMPICS_BASKETBALL_3X3,isDrawAvailable:!1},i[L.SUMMER_OLYMPICS_BASKETBALL_3X3_WOMEN]={sport:s.BASKETBALL,id:L.SUMMER_OLYMPICS_BASKETBALL_3X3_WOMEN,isDrawAvailable:!1},i[L.SUMMER_OLYMPICS_QUALIFICATION]={sport:s.BASKETBALL,id:L.SUMMER_OLYMPICS_QUALIFICATION,isDrawAvailable:!1,spread:ye,total:Ke},i[L.LOL]={sport:s.ESPORTS,id:L.LOL,isDrawAvailable:!1},i[L.CONMEBOL_WC_QUALIFICATIONS]={sport:s.SOCCER,id:L.CONMEBOL_WC_QUALIFICATIONS,isDrawAvailable:!0,spread:B,total:$},i[L.UEFA_CONFERENCE_LEAGUE]={sport:s.SOCCER,id:L.UEFA_CONFERENCE_LEAGUE,isDrawAvailable:!0,spread:B,total:$},i[L.NON_TITLE_BOXING]={sport:s.FIGHTING,id:L.NON_TITLE_BOXING,isDrawAvailable:!1},i[L.UEFA_CHAMPIONS_LEAGUE_QUALIFICATION]={sport:s.SOCCER,id:L.UEFA_CHAMPIONS_LEAGUE_QUALIFICATION,isDrawAvailable:!0,spread:B,total:$},i[L.UEFA_EUROPA_LEAGUE_QUALIFICATION]={sport:s.SOCCER,id:L.UEFA_EUROPA_LEAGUE_QUALIFICATION,isDrawAvailable:!0,spread:B,total:$},i[L.UEFA_CONFERENCE_LEAGUE_QUALIFICATION]={sport:s.SOCCER,id:L.UEFA_CONFERENCE_LEAGUE_QUALIFICATION,isDrawAvailable:!0,spread:B,total:$},i[L.US_ELECTION]={sport:s.POLITICS,id:L.US_ELECTION,isDrawAvailable:!1},i[L.UEFA_SUPER_CUP]={sport:s.SOCCER,id:L.UEFA_SUPER_CUP,isDrawAvailable:!0},i[L.BRAZIL_CUP]={sport:s.SOCCER,id:L.BRAZIL_CUP,isDrawAvailable:!0},i[L.ENGLAND_CHAMPIONSHIP]={sport:s.SOCCER,id:L.ENGLAND_CHAMPIONSHIP,isDrawAvailable:!0},i[L.GOLF_H2H]={sport:s.GOLF,id:L.GOLF_H2H,isDrawAvailable:!1},i[L.GOLF_WINNER]={sport:s.GOLF,id:L.GOLF_WINNER,isDrawAvailable:!1},i[L.LIGA_MX]={sport:s.SOCCER,id:L.LIGA_MX,isDrawAvailable:!0,spread:B,total:$},i),Ea=2,na=20,ia=10,Aa=2,Na=1,Ia=5,Sa=function(_){var e=oa[_];return e?e.sport:s.EMPTY},sa=function(_){var e=oa[_];return e?e.spread:void 0},La=function(_){var e=oa[_];return e?e.total:void 0},Ta=function(_,e,a){var r=_.score_home_total,t=_.score_away_total,o=_.clock,E=_.period,n=_.status,i=_.home_team,A=_.away_team,N=parseInt(E),I=Sa(e);return"completed"==n.toLowerCase()?{allow:!1,message:"Blocking game ".concat(i," - ").concat(A," because it is no longer live.")}:I===s.BASKETBALL?la(i,A,N,a.get(s.BASKETBALL)):I===s.HOCKEY?la(i,A,N,a.get(s.HOCKEY)):I===s.BASEBALL?la(i,A,N,a.get(s.BASEBALL)):I===s.SOCCER?Oa(i,A,o,E,a.get(s.SOCCER)):I===s.TENNIS?Ra(_,i,A,E,r,t,e,I):I===s.VOLLEYBALL?Ra(_,i,A,N,r,t,e,I):{allow:!0,message:"The sport ".concat(e," does not have constraint")}},la=function(_,e,a,r){return!Number.isNaN(a)&&a>=r?{allow:!1,message:"Blocking game ".concat(_," - ").concat(e," due to period: ").concat(a,". period")}:{allow:!0,message:""}},Oa=function(_,e,a,r,t){var o=Number(a);return!Number.isNaN(o)&&o>=t||Number.isNaN(o)&&"HALF"!=r?{allow:!1,message:"Blocking game ".concat(_," - ").concat(e," due to clock: ").concat(a,"min")}:{allow:!0,message:""}},Ra=function(_,e,a,r,t,o,E,n){var i=Number(r),A=da(i,_),N="atp"==_.league.toLowerCase(),I={home:t,away:o};return n==s.VOLLEYBALL?Ma(e,a,A,I,Ea,5==i?ia:na):E.toString().startsWith(L.TENNIS_GS)&&N?Ma(e,a,A,I,Aa,Ia):E.toString().startsWith(L.TENNIS_GS)&&!N||E.toString().startsWith(L.TENNIS_MASTERS)||E.toString().startsWith(L.SUMMER_OLYMPICS_TENNIS)||E.toString().startsWith(L.TENNIS_WTA)?Ma(e,a,A,I,Na,Ia):{allow:!0,message:"The sport ".concat(E," does not have result constraint")}},da=function(_,e){var a=0,r=0;switch(_){case 1:a=Number(e.score_home_period_1),r=Number(e.score_away_period_1);break;case 2:a=Number(e.score_home_period_2),r=Number(e.score_away_period_2);break;case 3:a=Number(e.score_home_period_3),r=Number(e.score_away_period_3);break;case 4:a=Number(e.score_home_period_4),r=Number(e.score_away_period_4);break;case 5:a=Number(e.score_home_period_5),r=Number(e.score_away_period_5)}return{home:a,away:r}},Ma=function(_,e,a,r,t,o){return Number(r.home)!=t&&Number(r.away)!=t||!(Number(r.home)==t&&a.home>=o||Number(r.away)==t&&a.away>=o)?{allow:!0,message:"",currentHomeGameScore:a.home,currentAwayGameScore:a.away}:{allow:!1,message:"Blocking game ".concat(_," - ").concat(e," due to current result: ").concat(r.home," - ").concat(r.away," (").concat(a.home," - ").concat(a.away,")")}},Pa=function(_,e,a,r,t,o){var E,n;if(T.includes(_)?(E=r.toLowerCase()==e.toLowerCase()||r.toLowerCase()==a.toLowerCase(),n=t.toLowerCase()==e.toLowerCase()||t.toLowerCase()==a.toLowerCase()):(E=r.toLowerCase()==e.toLowerCase(),n=t.toLowerCase()==a.toLowerCase()),!0!==E){var i=o.get(r.toLowerCase()),A=o.get(e.toLowerCase()),N=o.get(a.toLowerCase());if([i,A].some((function(_){return null==_})))return!1;E=T.includes(_)?i==A||i==N:i==A}if(!0!==n){var I=o.get(t.toLowerCase());if(A=o.get(e.toLowerCase()),[I,N=o.get(a.toLowerCase())].some((function(_){return null==_})))return!1;n=T.includes(_)&&I==A||I==N}return E&&n},Ca=function(_,e,a,r){var t;if(Sa(a)==s.TENNIS){var o=e.getTime(),E=_.getTime();t=Math.abs(E-o)<=Number(60*r*1e3)}else t=e.toUTCString()==_.toUTCString();return t},ua=0,ca="Draw",pa=1e5,Ua=.2,ma=10001,Ga=10002,fa=100,Fa={OPEN:0,PAUSED:1,IN_PROGRESS:3,FINISHED:8,RESOLVED:10,CANCELED:255},Da=function(_,e,a){if(_.some((function(_){return 0===_})))return _;var r=_.reduce((function(_,e){return _+e}),0);if(r<=1)return Array(_.length).fill(0);if(0===a){if(!(e>100*(r-1)))return _;a=e}var t=1+a/100,o=t/r,E=_.map((function(_){return _*o}));if(E.some((function(_){return _>=1})))return Array(_.length).fill(0);var n=E.reduce((function(_,e){return _+e}),0);if(n<1)return Array(_.length).fill(0);var i=t/n;return E.map((function(_){return _*i}))},wa=function(_,e,a,r){var t=_.find((function(_){return Number(_.typeId)===Number(a)&&Number(_.sportId)===Number(e)}));return t?{minSpread:t.minSpread?Number(t.minSpread):r,targetSpread:t.targetSpread?Number(t.targetSpread):0}:{minSpread:r,targetSpread:0}},Ba=function(_){return _===ua?0:Va("decimal","impliedProbability",_)},Va=function(_,e,a){try{return A(_,a).to(e)}catch(_){return 0}},Ha=function(_,e,a,r,t){var o=new Map;return a.forEach((function(a){var E=0,n=_.filter((function(_){return _&&_.market_name.toLowerCase()===e.toLowerCase()&&_.sports_book_name.toLowerCase()==a.toLowerCase()&&_.selection.toLowerCase()===r.homeTeam.toLowerCase()}));0!==n.length&&(E=n[0].price);var i=0,A=_.filter((function(_){return _&&_.market_name.toLowerCase()===e.toLowerCase()&&_.sports_book_name.toLowerCase()==a.toLowerCase()&&_.selection.toLowerCase()===r.awayTeam.toLowerCase()}));0!==A.length&&(i=A[0].price);var N=0;if(!t){var I=_.filter((function(_){return _&&_.market_name.toLowerCase()===e.toLowerCase()&&_.sports_book_name.toLowerCase()==a.toLowerCase()&&_.selection.toLowerCase()===ca.toLowerCase()}));0!==I.length&&(N=I[0].price)}o.set(a.toLowerCase(),{homeOdds:E,awayOdds:i,drawOdds:N})})),o},ba=function(_,e,a,r,t,o,E){var n={homeTeam:r.home_team,awayTeam:r.away_team},i=Ha(r.odds,k,a,n,_),A=I(i,a,_,E,Ua);if(A.errorMessage)return{odds:_?[0,0]:[0,0,0],errorMessage:A.errorMessage};var N=[A.homeOdds,A.awayOdds,A.drawOdds].map((function(_){return Ba(_)})),S=wa(e,t,pa,o);return{odds:N=null!==S?Da(N,S.minSpread,S.targetSpread):Da(N,o,0)}},ga=function(_,e,a){return _.filter((function(_){return _.market_name.toLowerCase()===e.toLowerCase()&&_.sports_book_name.toLowerCase()==a.toLowerCase()}))},va=function(_,e,a,r,t,o){var E=_.filter((function(_){return _&&.5===Math.abs(_.selection_points%1)}));return Ya(E,e).map((function(_){var e=_.line,E=_.odds,n=Ba(E[0])||ua,i=Ba(E[1])||ua,A=n===ua||i===ua;if(!A){var N,I=wa(r,a,t,o);null!==I?(N=Da([n,i],I.minSpread,I.targetSpread)).some((function(_){return _===ua}))?A=!0:(n=N[0],i=N[1]):(N=Da([n,i],o,0)).some((function(_){return _===ua}))?A=!0:(n=N[0],i=N[1])}return{leagueId:a,typeId:t,type:"spread",results:[],status:A?Fa.PAUSED:Fa.OPEN,line:e,odds:[n,i]}})).filter((function(_){return null!==_}))},Ya=function(_,e){var a=_.reduce((function(_,a){var r=a.selection_points,t=a.price,o=a.selection===e.homeTeam,E=o?r:-r;return _[E]||(_[E]={home:null,away:null}),o?_[E].home=t:_[E].away=t,_}),{}),r=Object.entries(a).reduce((function(_,e){var a=e[0],r=e[1],t=parseFloat(a);return null!==r.home&&null!==r.away&&_.push({line:t,odds:[r.home,r.away]}),_}),[]);return r},ha=function(_,e){return void 0===e&&(e=.952),_.map((function(_){return Math.abs(_)>e?ua:_}))},ya=function(_,e,a,r,t){var o=[],E=_.filter((function(_){return _&&.5===Math.abs(_.selection_points%1)})),n=Wa(E);return Object.entries(n).forEach((function(_){var E=_[0],n=_[1],i=n.over,A=n.under,N=E.split("_"),I=(N[0],N[1]),S=Ba(i)||ua,s=Ba(A)||ua,L=S===ua||s===ua;if(!L){var T,l=wa(a,e,r,t);null!==l?(T=Da([S,s],l.minSpread,l.targetSpread)).some((function(_){return _===ua}))?L=!0:(S=T[0],s=T[1]):(T=Da([S,s],t,0)).some((function(_){return _===ua}))?L=!0:(S=T[0],s=T[1])}var O={leagueId:e,typeId:r,type:"total",results:[],status:L?Fa.PAUSED:Fa.OPEN,line:parseFloat(I),odds:[S,s]};o.push(O)})),o},Wa=function(_){return _.reduce((function(_,e){if(e){var a="".concat(e.selection,"_").concat(e.selection_points);_[a]||(_[a]={over:null,under:null}),"over"===e.selection_line?_[a].over=e.price:"under"===e.selection_line&&(_[a].under=e.price)}return _}),{})},ka=function(){return ka=Object.assign||function(_){for(var e,a=1,r=arguments.length;a<r;a++)for(var t in e=arguments[a])Object.prototype.hasOwnProperty.call(e,t)&&(_[t]=e[t]);return _},ka.apply(this,arguments)},Ka=function(_,e,a,r,t,o,E){var n=r.filter((function(e){return e.sportId===String(_.leagueId)})),i=ba(!t,n,a,e,_.leagueId,o,E);if(i.errorMessage)return _.odds=_.odds.map((function(){return{american:0,decimal:0,normalizedImplied:0}})),_.childMarkets=[],_.errorMessage=i.errorMessage,_;_.odds=i.odds.map((function(_){return{american:A("impliedProbability",_).to("moneyline"),decimal:A("impliedProbability",_).to("decimal"),normalizedImplied:_}}));var N=Qa(_.leagueId,n,e,a,o).map((function(e){var a=ka(ka({},_),e);return a.odds.length>0&&(a.odds=a.odds.map((function(_){return 0==_?{american:0,decimal:0,normalizedImplied:0}:{american:A("impliedProbability",_).to("moneyline"),decimal:A("impliedProbability",_).to("decimal"),normalizedImplied:_}}))),a}));return _.childMarkets=N,_},Qa=function(_,e,a,r,t){var o=[];return(o=o.concat(Xa(a,_,e,r,t))).concat(ja(a,_,e,r,t))},Xa=function(_,e,a,r,t){var o=[],E=sa(e),n={homeTeam:_.home_team,awayTeam:_.away_team};if(E){var i=ga(_.odds,E,r[0]);if(i.length>0){var A=va(i,n,e,a,ma,t);o.push.apply(o,A)}}else console.warn("Spread type for sport ID ".concat(e," not found."));return o},ja=function(_,e,a,r,t){var o=[],E=La(e);if(E){var n=ga(_.odds,E,r[0]);n.length>0&&o.push.apply(o,ya(n,e,a,Ga,t))}else console.warn("Configuration (totals) for sport ID ".concat(e," not found."));return o};return e})()));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overtime-live-trading-utils",
3
- "version": "0.0.92",
3
+ "version": "0.0.93",
4
4
  "description": "",
5
5
  "main": "main.js",
6
6
  "scripts": {
@@ -24,13 +24,23 @@ export const checkOddsFromBookmakers = (
24
24
  maxImpliedPercentageDifference: number,
25
25
  minOddsForDiffChecking: number
26
26
  ) => {
27
- console.log('########## CHECK ODDS START ##########');
28
- console.log('oddsMap: ' + oddsMap);
29
- console.log('arrayOfBookmakers: ' + arrayOfBookmakers);
30
- console.log('isTwoPositionalSport: ' + isTwoPositionalSport);
31
- console.log('maxImpliedPercentageDifference: ' + maxImpliedPercentageDifference);
32
- console.log('minOddsForDiffChecking: ' + minOddsForDiffChecking);
33
- console.log('########## CHECK ODDS END ##########');
27
+ // Main bookmaker odds
28
+ const firstBookmakerOdds = oddsMap.get(arrayOfBookmakers[0]);
29
+
30
+ if (!firstBookmakerOdds) {
31
+ // If no matching bookmakers are found, return zero odds
32
+ return {
33
+ homeOdds: 0,
34
+ awayOdds: 0,
35
+ drawOdds: 0,
36
+ errorMessage: 'Returning zero odds cause no matching bookmakers have been found',
37
+ };
38
+ }
39
+
40
+ const homeOdd = firstBookmakerOdds.homeOdds;
41
+ const awayOdd = firstBookmakerOdds.awayOdds;
42
+ const drawOdd = isTwoPositionalSport ? 0 : firstBookmakerOdds.drawOdds;
43
+
34
44
  // Check if any bookmaker has odds of 0 or 0.0001
35
45
  const hasZeroOrOne = arrayOfBookmakers.some((bookmakerId) => {
36
46
  const line = oddsMap.get(bookmakerId);
@@ -47,134 +57,96 @@ export const checkOddsFromBookmakers = (
47
57
  return false;
48
58
  });
49
59
 
50
- if (arrayOfBookmakers.length == 1) {
51
- if (hasZeroOrOne) {
52
- // If any bookmaker has zero odds, return zero odds
53
- return [
54
- {
55
- homeOdds: 0,
56
- awayOdds: 0,
57
- drawOdds: 0,
58
- },
59
- ];
60
- }
60
+ if (hasZeroOrOne) {
61
+ // If any bookmaker has zero odds, return zero odds
62
+ return {
63
+ homeOdds: 0,
64
+ awayOdds: 0,
65
+ drawOdds: 0,
66
+ errorMessage: 'Returning zero odds cause bookmakers have 0 or 1 odds',
67
+ };
68
+ }
61
69
 
62
- const firstBookmaker = arrayOfBookmakers[0];
63
- const firstLine = oddsMap.get(firstBookmaker);
64
- return [
65
- {
66
- homeOdds: firstLine.homeOdds,
67
- awayOdds: firstLine.awayOdds,
68
- drawOdds: isTwoPositionalSport ? 0 : firstLine.drawOdds,
69
- },
70
- ];
70
+ if (arrayOfBookmakers.length == 1) {
71
+ return {
72
+ homeOdds: homeOdd,
73
+ awayOdds: awayOdd,
74
+ drawOdds: isTwoPositionalSport ? 0 : drawOdd,
75
+ };
71
76
  }
72
77
 
73
- if (hasZeroOrOne) {
74
- // If any bookmaker has zero odds, return zero odds
75
- return [
76
- {
77
- homeOdds: 0,
78
- awayOdds: 0,
79
- drawOdds: 0,
80
- },
81
- ];
82
- } else {
83
- // Main bookmaker odds
84
- const firstBookmakerOdds = oddsMap.get(arrayOfBookmakers[0]);
85
- const homeOdd = firstBookmakerOdds.homeOdds;
86
- const awayOdd = firstBookmakerOdds.awayOdds;
87
- const drawOdd = firstBookmakerOdds.drawOdds;
88
-
89
- // If none of the bookmakers have zero odds, check implied odds percentage difference
90
- const hasLargeImpliedPercentageDifference = arrayOfBookmakers.slice(1).some((bookmakerId) => {
91
- const line = oddsMap[bookmakerId];
92
- if (line) {
93
- const otherHomeOdd = line.homeOdds;
94
- const otherAwayOdd = line.awayOdds;
95
- const otherDrawOdd = line.drawOdds;
96
-
97
- const homeOddsImplied = oddslib.from('decimal', homeOdd).to('impliedProbability');
98
-
99
- const awayOddsImplied = oddslib.from('decimal', awayOdd).to('impliedProbability');
100
-
101
- // Calculate implied odds for the "draw" if it's not a two-positions sport
102
- const drawOddsImplied = isTwoPositionalSport
103
- ? 0
104
- : oddslib.from('decimal', drawOdd).to('impliedProbability');
105
-
106
- const otherHomeOddImplied = oddslib.from('decimal', otherHomeOdd).to('impliedProbability');
107
-
108
- const otherAwayOddImplied = oddslib.from('decimal', otherAwayOdd).to('impliedProbability');
109
-
110
- // Calculate implied odds for the "draw" if it's not a two-positions sport
111
- const otherDrawOddImplied = isTwoPositionalSport
112
- ? 0
113
- : oddslib.from('decimal', otherDrawOdd).to('impliedProbability');
114
-
115
- // Calculate the percentage difference for implied odds
116
- const homeOddsDifference = calculateImpliedOddsDifference(homeOddsImplied, otherHomeOddImplied);
117
-
118
- const awayOddsDifference = calculateImpliedOddsDifference(awayOddsImplied, otherAwayOddImplied);
119
-
120
- // Check implied odds difference for the "draw" only if it's not a two-positions sport
121
- const drawOddsDifference = isTwoPositionalSport
122
- ? 0
123
- : calculateImpliedOddsDifference(drawOddsImplied, otherDrawOddImplied);
124
-
125
- // Check if the percentage difference exceeds the threshold
126
- if (
127
- (homeOddsDifference > maxImpliedPercentageDifference &&
128
- homeOddsImplied > minOddsForDiffChecking &&
129
- otherHomeOddImplied > minOddsForDiffChecking) ||
130
- (awayOddsDifference > maxImpliedPercentageDifference &&
131
- awayOddsImplied > minOddsForDiffChecking &&
132
- otherAwayOddImplied > minOddsForDiffChecking) ||
133
- (!isTwoPositionalSport &&
134
- drawOddsDifference > maxImpliedPercentageDifference &&
135
- drawOddsImplied > minOddsForDiffChecking &&
136
- otherDrawOddImplied > minOddsForDiffChecking)
137
- ) {
138
- return true;
139
- }
78
+ // If none of the bookmakers have zero odds, check implied odds percentage difference
79
+ const hasLargeImpliedPercentageDifference = arrayOfBookmakers.slice(1).some((bookmakerId) => {
80
+ const line = oddsMap[bookmakerId];
81
+ if (line) {
82
+ const otherHomeOdd = line.homeOdds;
83
+ const otherAwayOdd = line.awayOdds;
84
+ const otherDrawOdd = line.drawOdds;
85
+
86
+ const homeOddsImplied = oddslib.from('decimal', homeOdd).to('impliedProbability');
87
+
88
+ const awayOddsImplied = oddslib.from('decimal', awayOdd).to('impliedProbability');
89
+
90
+ // Calculate implied odds for the "draw" if it's not a two-positions sport
91
+ const drawOddsImplied = isTwoPositionalSport
92
+ ? 0
93
+ : oddslib.from('decimal', drawOdd).to('impliedProbability');
94
+
95
+ const otherHomeOddImplied = oddslib.from('decimal', otherHomeOdd).to('impliedProbability');
96
+
97
+ const otherAwayOddImplied = oddslib.from('decimal', otherAwayOdd).to('impliedProbability');
98
+
99
+ // Calculate implied odds for the "draw" if it's not a two-positions sport
100
+ const otherDrawOddImplied = isTwoPositionalSport
101
+ ? 0
102
+ : oddslib.from('decimal', otherDrawOdd).to('impliedProbability');
103
+
104
+ // Calculate the percentage difference for implied odds
105
+ const homeOddsDifference = calculateImpliedOddsDifference(homeOddsImplied, otherHomeOddImplied);
106
+
107
+ const awayOddsDifference = calculateImpliedOddsDifference(awayOddsImplied, otherAwayOddImplied);
108
+
109
+ // Check implied odds difference for the "draw" only if it's not a two-positions sport
110
+ const drawOddsDifference = isTwoPositionalSport
111
+ ? 0
112
+ : calculateImpliedOddsDifference(drawOddsImplied, otherDrawOddImplied);
113
+
114
+ // Check if the percentage difference exceeds the threshold
115
+ if (
116
+ (homeOddsDifference > maxImpliedPercentageDifference &&
117
+ homeOddsImplied > minOddsForDiffChecking &&
118
+ otherHomeOddImplied > minOddsForDiffChecking) ||
119
+ (awayOddsDifference > maxImpliedPercentageDifference &&
120
+ awayOddsImplied > minOddsForDiffChecking &&
121
+ otherAwayOddImplied > minOddsForDiffChecking) ||
122
+ (!isTwoPositionalSport &&
123
+ drawOddsDifference > maxImpliedPercentageDifference &&
124
+ drawOddsImplied > minOddsForDiffChecking &&
125
+ otherDrawOddImplied > minOddsForDiffChecking)
126
+ ) {
127
+ return true;
140
128
  }
141
- return false;
142
- });
143
-
144
- if (hasLargeImpliedPercentageDifference) {
145
- console.log('Returning zero odds due to percentage difference');
146
- return [
147
- {
148
- homeOdds: 0,
149
- awayOdds: 0,
150
- drawOdds: 0,
151
- },
152
- ];
153
- }
154
-
155
- let lines: any[] = [];
156
- arrayOfBookmakers.forEach((bookmaker) => lines.push(oddsMap.get(bookmaker)));
157
-
158
- if (lines[0] != undefined) {
159
- return lines.map((line) => {
160
- return {
161
- homeOdds: line.homeOdds,
162
- awayOdds: line.awayOdds,
163
- drawOdds: isTwoPositionalSport ? 0 : line.drawOdds,
164
- };
165
- });
166
129
  }
167
- }
130
+ return false;
131
+ });
168
132
 
169
- // If no matching bookmakers are found, return zero odds
170
- console.log('Returning zero odds cause no matching bookmakers have been found');
171
- return [
172
- {
133
+ if (hasLargeImpliedPercentageDifference) {
134
+ return {
173
135
  homeOdds: 0,
174
136
  awayOdds: 0,
175
137
  drawOdds: 0,
176
- },
177
- ];
138
+ errorMessage: 'Returning zero odds due to percentage difference between bookmakers',
139
+ };
140
+ }
141
+
142
+ let lines: any[] = [];
143
+ arrayOfBookmakers.forEach((bookmaker) => lines.push(oddsMap.get(bookmaker)));
144
+
145
+ return {
146
+ homeOdds: homeOdd,
147
+ awayOdds: awayOdd,
148
+ drawOdds: isTwoPositionalSport ? 0 : drawOdd,
149
+ };
178
150
  };
179
151
 
180
152
  export const calculateImpliedOddsDifference = (impliedOddsA: number, impliedOddsB: number): number => {
@@ -37,60 +37,59 @@ export const processMarket = (
37
37
  maxPercentageDiffBetwenOdds
38
38
  );
39
39
 
40
- const isZeroParentOdds =
41
- moneylineOdds[0] == ZERO || moneylineOdds[1] == ZERO || (isDrawAvailable && moneylineOdds[2] == ZERO);
42
-
43
- if (market.odds.length > 0) {
44
- market.odds = market.odds.map((_odd, index) => {
45
- let positionOdds;
46
- if (index < 3) positionOdds = moneylineOdds[index];
47
- if (positionOdds == 0) {
48
- return {
49
- american: 0,
50
- decimal: 0,
51
- normalizedImplied: 0,
52
- };
53
- }
40
+ if (moneylineOdds.errorMessage) {
41
+ market.odds = market.odds.map(() => {
54
42
  return {
55
- american: oddslib.from('impliedProbability', positionOdds).to('moneyline'),
56
- decimal: oddslib.from('impliedProbability', positionOdds).to('decimal'),
57
- normalizedImplied: positionOdds,
43
+ american: 0,
44
+ decimal: 0,
45
+ normalizedImplied: 0,
58
46
  };
59
47
  });
60
- }
48
+ market.childMarkets = [];
49
+ market.errorMessage = moneylineOdds.errorMessage;
50
+ return market;
51
+ } else {
52
+ // Pack market odds for UI
53
+ market.odds = moneylineOdds.odds.map((odd) => {
54
+ return {
55
+ american: oddslib.from('impliedProbability', odd).to('moneyline'),
56
+ decimal: oddslib.from('impliedProbability', odd).to('decimal'),
57
+ normalizedImplied: odd,
58
+ };
59
+ });
60
+
61
+ const childMarkets = getChildMarkets(
62
+ market.leagueId,
63
+ sportSpreadData,
64
+ apiResponseWithOdds,
65
+ liveOddsProviders,
66
+ defaultSpreadForLiveMarkets
67
+ );
61
68
 
62
- const childMarkets = isZeroParentOdds
63
- ? []
64
- : getChildMarkets(
65
- market.leagueId,
66
- sportSpreadData,
67
- apiResponseWithOdds,
68
- liveOddsProviders,
69
- defaultSpreadForLiveMarkets
70
- );
71
- const packedChildMarkets = childMarkets.map((childMarket: any) => {
72
- const preparedMarket = { ...market, ...childMarket };
73
- if (preparedMarket.odds.length > 0) {
74
- preparedMarket.odds = preparedMarket.odds.map((_odd) => {
75
- if (_odd == 0) {
69
+ const packedChildMarkets = childMarkets.map((childMarket: any) => {
70
+ const preparedMarket = { ...market, ...childMarket };
71
+ if (preparedMarket.odds.length > 0) {
72
+ preparedMarket.odds = preparedMarket.odds.map((_odd) => {
73
+ if (_odd == 0) {
74
+ return {
75
+ american: 0,
76
+ decimal: 0,
77
+ normalizedImplied: 0,
78
+ };
79
+ }
76
80
  return {
77
- american: 0,
78
- decimal: 0,
79
- normalizedImplied: 0,
81
+ american: oddslib.from('impliedProbability', _odd).to('moneyline'),
82
+ decimal: oddslib.from('impliedProbability', _odd).to('decimal'),
83
+ normalizedImplied: _odd,
80
84
  };
81
- }
82
- return {
83
- american: oddslib.from('impliedProbability', _odd).to('moneyline'),
84
- decimal: oddslib.from('impliedProbability', _odd).to('decimal'),
85
- normalizedImplied: _odd,
86
- };
87
- });
88
- }
89
- return preparedMarket;
90
- });
91
- market.childMarkets = packedChildMarkets;
85
+ });
86
+ }
87
+ return preparedMarket;
88
+ });
89
+ market.childMarkets = packedChildMarkets;
92
90
 
93
- return market;
91
+ return market;
92
+ }
94
93
  };
95
94
 
96
95
  /**
package/src/utils/odds.ts CHANGED
@@ -5,93 +5,6 @@ import { checkOddsFromBookmakers } from './bookmakers';
5
5
  import { adjustSpreadOnOdds, getSpreadData } from './spread';
6
6
  import { MONEYLINE } from '../constants/constantsOpticodds';
7
7
 
8
- // TODO DEPRECATE FUNCTION
9
- export const extractOddsForGamePerProvider = (liveOddsProviders, gameWithOdds, market, teamsMap, isDrawAvailable) => {
10
- const linesMap = new Map<any, any>();
11
-
12
- liveOddsProviders.forEach((oddsProvider) => {
13
- const providerOddsObjects = gameWithOdds.odds.filter(
14
- (oddsObject) => oddsObject.sports_book_name.toLowerCase() == oddsProvider.toLowerCase()
15
- );
16
-
17
- const gameHomeTeam = teamsMap.get(market.homeTeam.toLowerCase());
18
- const gameAwayTeam = teamsMap.get(market.awayTeam.toLowerCase());
19
-
20
- let homeOddsObject;
21
- if (gameHomeTeam == undefined) {
22
- homeOddsObject = providerOddsObjects.find((oddsObject) => {
23
- const opticOddsTeamName = teamsMap.get(oddsObject.name.toLowerCase());
24
-
25
- if (opticOddsTeamName == undefined) {
26
- return oddsObject.name.toLowerCase() == market.homeTeam.toLowerCase();
27
- } else {
28
- return opticOddsTeamName == market.homeTeam.toLowerCase();
29
- }
30
- });
31
- } else {
32
- homeOddsObject = providerOddsObjects.find((oddsObject) => {
33
- const opticOddsTeamName = teamsMap.get(oddsObject.name.toLowerCase());
34
-
35
- if (opticOddsTeamName == undefined) {
36
- return oddsObject.name.toLowerCase() == gameHomeTeam;
37
- } else {
38
- return opticOddsTeamName == gameHomeTeam;
39
- }
40
- });
41
- }
42
-
43
- let homeOdds = 0;
44
- if (homeOddsObject != undefined) {
45
- homeOdds = homeOddsObject.price;
46
- }
47
-
48
- let awayOddsObject;
49
- if (gameAwayTeam == undefined) {
50
- awayOddsObject = providerOddsObjects.find((oddsObject) => {
51
- const opticOddsTeamName = teamsMap.get(oddsObject.name.toLowerCase());
52
-
53
- if (opticOddsTeamName == undefined) {
54
- return oddsObject.name.toLowerCase() == market.awayTeam.toLowerCase();
55
- } else {
56
- return opticOddsTeamName == market.awayTeam.toLowerCase();
57
- }
58
- });
59
- } else {
60
- awayOddsObject = providerOddsObjects.find((oddsObject) => {
61
- const opticOddsTeamName = teamsMap.get(oddsObject.name.toLowerCase());
62
-
63
- if (opticOddsTeamName == undefined) {
64
- return oddsObject.name.toLowerCase() == gameAwayTeam;
65
- } else {
66
- return opticOddsTeamName == gameAwayTeam;
67
- }
68
- });
69
- }
70
-
71
- let awayOdds = 0;
72
- if (awayOddsObject != undefined) {
73
- awayOdds = awayOddsObject.price;
74
- }
75
-
76
- let drawOdds = 0;
77
- if (isDrawAvailable) {
78
- const drawOddsObject = providerOddsObjects.find((oddsObject) => oddsObject.name.toLowerCase() == 'draw');
79
-
80
- if (drawOddsObject != undefined) {
81
- drawOdds = drawOddsObject.price;
82
- }
83
- }
84
-
85
- linesMap.set(oddsProvider.toLowerCase(), {
86
- homeOdds: homeOdds,
87
- awayOdds: awayOdds,
88
- drawOdds: drawOdds,
89
- });
90
- });
91
-
92
- return linesMap;
93
- };
94
-
95
8
  /**
96
9
  * Converts a given odds value from one format to another.
97
10
  * Specifically, it converts from 'moneyline' to 'impliedProbability', handling special cases.
@@ -220,7 +133,7 @@ export const getParentOdds = (
220
133
  );
221
134
 
222
135
  // CHECKING AND COMPARING ODDS FOR THE GIVEN BOOKMAKERS
223
- const oddsList = checkOddsFromBookmakers(
136
+ const oddsObject = checkOddsFromBookmakers(
224
137
  moneylineOddsMap,
225
138
  liveOddsProviders,
226
139
  isTwoPositionalSport,
@@ -228,18 +141,13 @@ export const getParentOdds = (
228
141
  MIN_ODDS_FOR_DIFF_CHECKING
229
142
  );
230
143
 
231
- const isThere100PercentOdd = oddsList.some(
232
- (oddsObject) => oddsObject.homeOdds == 1 || oddsObject.awayOdds == 1 || oddsObject.drawOdds == 1
233
- );
234
-
235
- if (
236
- [oddsList[0].homeOdds, oddsList[0].awayOdds, oddsList[0].drawOdds].every((odd) => odd == ZERO) ||
237
- isThere100PercentOdd
238
- ) {
239
- console.log('No Moneyline odds found or there is 100% odd, returning zero odds.');
240
- return isTwoPositionalSport ? [0, 0] : [0, 0, 0];
144
+ if (oddsObject.errorMessage) {
145
+ return {
146
+ odds: isTwoPositionalSport ? [0, 0] : [0, 0, 0],
147
+ errorMessage: oddsObject.errorMessage,
148
+ };
241
149
  }
242
- const primaryBookmakerOdds = [oddsList[0].homeOdds, oddsList[0].awayOdds, oddsList[0].drawOdds];
150
+ const primaryBookmakerOdds = [oddsObject.homeOdds, oddsObject.awayOdds, oddsObject.drawOdds];
243
151
 
244
152
  let parentOdds = primaryBookmakerOdds.map((odd) => convertOddsToImpl(odd));
245
153
  const spreadData = getSpreadData(sportSpreadData, sportId, LIVE_TYPE_ID_BASE, defaultSpreadForLiveMarkets);
@@ -250,7 +158,7 @@ export const getParentOdds = (
250
158
  // Use min spread by sport if available, otherwise use default min spread
251
159
  parentOdds = adjustSpreadOnOdds(parentOdds, defaultSpreadForLiveMarkets, 0);
252
160
  }
253
- return parentOdds;
161
+ return { odds: parentOdds };
254
162
  };
255
163
 
256
164
  /**