From 5031996c0f679594432a30b1119c918427b156d6 Mon Sep 17 00:00:00 2001 From: Greg Dorward Date: Thu, 13 Jun 2024 20:46:22 +0100 Subject: [PATCH] Updates --- CNAME | 1 - asset-manifest.json | 6 +++--- index.html | 2 +- .../js/{main.ca0963dc.chunk.js => main.31f0ed3c.chunk.js} | 4 ++-- static/js/main.31f0ed3c.chunk.js.map | 1 + static/js/main.ca0963dc.chunk.js.map | 1 - 6 files changed, 7 insertions(+), 8 deletions(-) delete mode 100644 CNAME rename static/js/{main.ca0963dc.chunk.js => main.31f0ed3c.chunk.js} (93%) create mode 100644 static/js/main.31f0ed3c.chunk.js.map delete mode 100644 static/js/main.ca0963dc.chunk.js.map diff --git a/CNAME b/CNAME deleted file mode 100644 index 1c215d47..00000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -www.xgtipping.com \ No newline at end of file diff --git a/asset-manifest.json b/asset-manifest.json index e597d3c3..b64738c7 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,8 +1,8 @@ { "files": { "main.css": "/static/css/main.4220e094.chunk.css", - "main.js": "/static/js/main.ca0963dc.chunk.js", - "main.js.map": "/static/js/main.ca0963dc.chunk.js.map", + "main.js": "/static/js/main.31f0ed3c.chunk.js", + "main.js.map": "/static/js/main.31f0ed3c.chunk.js.map", "runtime-main.js": "/static/js/runtime-main.1d8a2cdc.js", "runtime-main.js.map": "/static/js/runtime-main.1d8a2cdc.js.map", "static/css/2.33c847f3.chunk.css": "/static/css/2.33c847f3.chunk.css", @@ -20,6 +20,6 @@ "static/css/2.33c847f3.chunk.css", "static/js/2.7ad119ad.chunk.js", "static/css/main.4220e094.chunk.css", - "static/js/main.ca0963dc.chunk.js" + "static/js/main.31f0ed3c.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index 0a8d0ee2..04ce32cd 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -XG Tipping
\ No newline at end of file +XG Tipping
\ No newline at end of file diff --git a/static/js/main.ca0963dc.chunk.js b/static/js/main.31f0ed3c.chunk.js similarity index 93% rename from static/js/main.ca0963dc.chunk.js rename to static/js/main.31f0ed3c.chunk.js index 500d06ee..81588a48 100644 --- a/static/js/main.ca0963dc.chunk.js +++ b/static/js/main.31f0ed3c.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonppredictor=this.webpackJsonppredictor||[]).push([[0],{101:function(e,a,t){"use strict";t.r(a);var s=t(1),n=t(15),r=t.n(n),o=(t(88),t(6)),c=t(2),l=t(4),i=t(0);var d=function(){return Object(i.jsx)("h1",{className:"HeaderContainer",children:"XG Tipping"})};function u(e){return Object(i.jsx)("div",{id:"Button",children:Object(i.jsx)("button",{"data-cy":e.text,variant:"primary",type:"button",onClick:e.onClickEvent,className:e.className,style:e.style,children:e.text})})}var m=t(11),g=t(10),h=t(17),v=t(18),p="Fractional odds",b=function(e){Object(h.a)(t,e);var a=Object(v.a)(t);function t(e){var s;return Object(m.a)(this,t),(s=a.call(this,e)).handleOptionChange=function(){s.setState({selectedOdds:s.props.value}),p=s.state.selectedOdds},s.state={selectedOdds:s.props.value},s}return Object(g.a)(t,[{key:"render",value:function(){return Object(i.jsx)("section",{className:"dark2",children:Object(i.jsx)("div",{className:this.props.className,children:Object(i.jsxs)("label",{children:[Object(i.jsx)("input",{type:"radio",name:"odds",checked:this.state.checked,onChange:this.handleOptionChange,"data-cy":this.props.value}),Object(i.jsx)("span",{className:"design"}),Object(i.jsx)("span",{className:"text",children:this.props.value})]})})})}}]),t}(s.Component);function f(e){return"-"===e.image?Object(i.jsx)("div",{className:e.ClassName}):Object(i.jsx)("img",{src:"https://cdn.footystats.org/img/".concat(e.image),className:e.ClassName,alt:e.alt,"flex-shrink":e.flexShrink})}var O=function(e){function a(e){var a;return"W"===e?a="win":"D"===e?a="draw":"L"===e&&(a="loss"),a}function t(e){var a;return"\u2714"===e?a="BTTSTrue":"\u2718"===e&&(a="BTTSFalse"),a}return e.clicked,e.formRun?(console.log(e.formRun),Object(i.jsxs)(s.Fragment,{children:[Object(i.jsxs)("ul",{className:e.className,style:e.style,children:[Object(i.jsx)("li",{className:"FormSummaryHome",children:e.FormTextString}),Object(i.jsx)("li",{className:"FavouriteSummaryHome",children:e.FavouriteRecord}),Object(i.jsx)("li",{className:"FormHeader",children:"League results (most recent on right)"}),Object(i.jsxs)("li",{className:"last5League",children:[Object(i.jsx)("span",{className:a(e.Results[0]),children:e.Results[0]}),Object(i.jsx)("span",{className:a(e.Results[1]),children:e.Results[1]}),Object(i.jsx)("span",{className:a(e.Results[2]),children:e.Results[2]}),Object(i.jsx)("span",{className:a(e.Results[3]),children:e.Results[3]}),Object(i.jsx)("span",{className:a(e.Results[4]),children:e.Results[4]}),Object(i.jsx)("span",{className:a(e.Results[5]),children:e.Results[5]})]},"last5League"),Object(i.jsxs)("li",{className:"FormHeader",children:[e.homeOrAway," form (most recent on right)"]}),Object(i.jsxs)("li",{className:"FormHomeOrAway",children:[Object(i.jsx)("span",{className:a(e.ResultsHorA[0]),children:e.ResultsHorA[0]}),Object(i.jsx)("span",{className:a(e.ResultsHorA[1]),children:e.ResultsHorA[1]}),Object(i.jsx)("span",{className:a(e.ResultsHorA[2]),children:e.ResultsHorA[2]}),Object(i.jsx)("span",{className:a(e.ResultsHorA[3]),children:e.ResultsHorA[3]}),Object(i.jsx)("span",{className:a(e.ResultsHorA[4]),children:e.ResultsHorA[4]}),Object(i.jsx)("span",{className:a(e.ResultsHorA[5]),children:e.ResultsHorA[5]})]},"last5".concat(e.homeOrAwayResults)),Object(i.jsxs)("li",{className:"BTTSArrayHomeOrAway","data-cy":e.name+"BTTSArrayHomeOrAway",children:[Object(i.jsx)("div",{className:"BTTSResults",children:"BTTS"}),Object(i.jsx)("span",{className:t(e.BTTSArray[5]),children:e.BTTSArray[5]}),Object(i.jsx)("span",{className:t(e.BTTSArray[4]),children:e.BTTSArray[4]}),Object(i.jsx)("span",{className:t(e.BTTSArray[3]),children:e.BTTSArray[3]}),Object(i.jsx)("span",{className:t(e.BTTSArray[2]),children:e.BTTSArray[2]}),Object(i.jsx)("span",{className:t(e.BTTSArray[1]),children:e.BTTSArray[1]}),Object(i.jsx)("span",{className:t(e.BTTSArray[0]),children:e.BTTSArray[0]})]},"BTTSArrayHomeOrAway"),Object(i.jsx)("li",{className:"TeamScored","data-cy":e.name+"teamScored",children:"Avg goals scored - ".concat(e.goals)},"TeamScored"),Object(i.jsx)("li",{className:"TeamConceeded","data-cy":e.name+"teamConceded",children:"Avg goals conceeded - ".concat(e.conceeded)},"TeamConceeded"),Object(i.jsx)("li",{className:"TeamPossession","data-cy":e.name+"teamPossession",children:"Avg possession - ".concat(e.possession,"%")},"TeamPossession"),Object(i.jsx)("li",{className:"TeamXG","data-cy":e.name+"teamXG",children:"Avg XG - ".concat(e.XG)},"TeamXG"),Object(i.jsx)("li",{className:"TeamXGConceded","data-cy":e.name+"teamXGConceded",children:"Avg XG conceded - ".concat(e.XGConceded)},"TeamXGConceded"),Object(i.jsxs)("li",{className:"goalDifference","data-cy":e.name+"goalDifference",children:["Goal difference : ",Object(i.jsx)("span",{children:e.goalDifference})]},"goalDifference"),Object(i.jsx)("li",{className:"goalDifferenceHorA","data-cy":e.name+"goalDifference",children:"Goal difference ".concat(e.homeOrAway," : ").concat(e.goalDifferenceHomeOrAway)},"goalDifferenceHorA"),Object(i.jsx)("li",{className:"AverageSOT","data-cy":e.name+"averageSOT",children:"Avg shots on target - ".concat(e.sot)},"AverageSOT"),Object(i.jsx)("li",{className:"DangerousAttacks","data-cy":e.name+"dangerousAttacks",children:"Avg dangerous attacks - ".concat(e.dangerousAttacks)},"DangerousAttacks"),Object(i.jsx)("li",{className:"LeaguePosition","data-cy":e.name+"leaguePosition",children:"League position - ".concat(e.leaguePosition)},"LeaguePosition"),Object(i.jsx)("li",{className:"LeaguePositionHomeOrAway","data-cy":e.name+"LeaguePositionHomeOrAway",children:"Position (".concat(e.homeOrAway," only) - ").concat(e.homeOrAwayLeaguePosition)},"LeaguePositionHomeOrAway"),Object(i.jsx)("li",{className:"WinPercentage","data-cy":e.name+"WinPercentage",children:"".concat(e.homeOrAway," wins - ").concat(e.winPercentage.toFixed(1),"%")},"WinPercentage"),Object(i.jsx)("li",{className:"DrawPercentage","data-cy":e.name+"DrawPercentage",children:"".concat(e.homeOrAway," draws - ").concat(e.drawPercentage.toFixed(1),"%")},"DrawPercentage"),Object(i.jsx)("li",{className:"LossPercentage","data-cy":e.name+"LossPercentage",children:"".concat(e.homeOrAway," losses - ").concat(e.lossPercentage.toFixed(1),"%")},"LossPercentage"),Object(i.jsx)("li",{className:"PPG","data-cy":e.name+"PPG",children:"Season PPG - ".concat(e.ppg)},"PPG"),Object(i.jsx)("li",{className:"FormTrend","data-cy":e.name+"FormTrend10",children:"Last 10 PPG: ".concat(e.formTrend[0])},"FormTrend10a"),Object(i.jsx)("li",{className:"FormTrend","data-cy":e.name+"FormTrend10",children:"Last 6 PPG: ".concat(e.formTrend[1])},"FormTrend10b"),Object(i.jsx)("li",{className:"FormTrend","data-cy":e.name+"FormTrend10",children:"Last 5 PPG: ".concat(e.formTrend[2],".")},"FormTrend10c"),Object(i.jsx)("li",{className:"CardsTotal","data-cy":e.name+"CardsTotal",children:"Cards total: ".concat(e.CardsTotal)},"CardsTotal"),Object(i.jsx)("li",{className:"CornersAverage","data-cy":e.name+"CornersAverage",children:"Corners average: ".concat(e.CornersAverage)},"CornersAverage")]}),Object(i.jsx)("div",{id:"h2hStats"})]})):Object(i.jsxs)(s.Fragment,{children:[Object(i.jsxs)("ul",{className:e.className,style:e.style,children:[Object(i.jsx)("li",{className:"FormSummaryHome",children:e.FormTextString}),Object(i.jsx)("li",{className:"FavouriteSummaryAway",children:e.FavouriteRecord}),Object(i.jsx)("li",{className:"TeamScored","data-cy":e.name+"teamScored",children:"Avg goals scored - ".concat(e.goals)},"TeamScored"),Object(i.jsx)("li",{className:"TeamConceeded","data-cy":e.name+"teamConceded",children:"Avg goals conceeded - ".concat(e.conceeded)},"TeamConceeded"),Object(i.jsx)("li",{className:"TeamPossession","data-cy":e.name+"teamPossession",children:"Avg possession - ".concat(e.possession,"%")},"TeamPossession"),Object(i.jsx)("li",{className:"TeamXG","data-cy":e.name+"teamXG",children:"Avg XG - ".concat(e.XG)},"TeamXG"),Object(i.jsx)("li",{className:"TeamXGConceded","data-cy":e.name+"teamXGConceded",children:"Avg XG conceded - ".concat(e.XGConceded)},"TeamXGConceded"),Object(i.jsx)("li",{className:"AverageSOT","data-cy":e.name+"averageSOT",children:"Avg shots on target - ".concat(e.sot)},"AverageSOT"),Object(i.jsx)("li",{className:"DangerousAttacks","data-cy":e.name+"dangerousAttacks",children:"Avg dangerous attacks - ".concat(e.dangerousAttacks)},"DangerousAttacks"),Object(i.jsx)("li",{className:"LeaguePosition","data-cy":e.name+"leaguePosition",children:"League position - ".concat(e.leaguePosition)},"LeaguePosition"),Object(i.jsx)("li",{className:"LeaguePositionHomeOrAway","data-cy":e.name+"LeaguePositionHomeOrAway",children:"Position (".concat(e.homeOrAway," only) - ").concat(e.homeOrAwayLeaguePosition)},"LeaguePositionHomeOrAway"),Object(i.jsx)("li",{className:"WinPercentage","data-cy":e.name+"WinPercentage",children:"".concat(e.homeOrAway," wins - ").concat(e.winPercentage.toFixed(1),"%")},"WinPercentage"),Object(i.jsx)("li",{className:"DrawPercentage","data-cy":e.name+"DrawPercentage",children:"".concat(e.homeOrAway," draws - ").concat(e.drawPercentage.toFixed(1),"%")},"DrawPercentage"),Object(i.jsx)("li",{className:"LossPercentage","data-cy":e.name+"LossPercentage",children:"".concat(e.homeOrAway," losses - ").concat(e.lossPercentage.toFixed(1),"%")},"LossPercentage"),Object(i.jsx)("li",{className:"PPG","data-cy":e.name+"PPG",children:"Season PPG - ".concat(e.ppg)},"PPG"),Object(i.jsx)("li",{className:"FormTrend","data-cy":e.name+"FormTrend10",children:"Last 10 PPG: ".concat(e.formTrend[0])},"FormTrend10a"),Object(i.jsx)("li",{className:"FormTrend","data-cy":e.name+"FormTrend10",children:"Last 6 PPG: ".concat(e.formTrend[1])},"FormTrend10b"),Object(i.jsx)("li",{className:"FormTrend","data-cy":e.name+"FormTrend10",children:"Last 5 PPG: ".concat(e.formTrend[2],".")},"FormTrend10c"),Object(i.jsx)("li",{className:"CardsTotal","data-cy":e.name+"CardsTotal",children:"Cards total: ".concat(e.CardsTotal)},"CardsTotal"),Object(i.jsx)("li",{className:"CornersAverage","data-cy":e.name+"CornersAverage",children:"Corners average: ".concat(e.CornersAverage)},"CornersAverage")]}),Object(i.jsx)("div",{id:"h2hStats"})]})};var j=function(e){return Object(i.jsx)("div",{id:e.id,onClick:e.onClick,style:e.style,className:e.className,children:e.text})},x=t(13);function y(e){return A.apply(this,arguments)}function A(){return(A=Object(l.a)(Object(c.a)().mark((function e(a){var t,s,n,r;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=[a.homeId,a.awayId],s=[],n=Object(c.a)().mark((function e(a){var n,r;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t[a],e.next=3,fetch("".concat("https://api.xgtipping.com/","formTeam/").concat(n));case 3:return r=e.sent,e.next=6,r.json().then((function(e){e.lastMatchTimestamp=e.last_updated_match_timestamp,s[a]=e}));case 6:case"end":return e.stop()}}),e)})),r=0;case 4:if(!(r1&&(s.setState({incrementValue:s.state.incrementValue-1}),s.setState({riskLevel:s.state.riskLevel-1}),N=s.state.incrementValue-1,F=s.state.riskLevel-1),Sa(ha)},s.DecreaseItem=function(){N>0&&(s.setState({incrementValue:s.state.incrementValue+1}),s.setState({riskLevel:s.state.riskLevel+1}),N=s.state.incrementValue+1,F=s.state.riskLevel+1),Sa(ha)},s.state={incrementValue:N,riskLevel:F,show:!0},s}return Object(g.a)(t,[{key:"render",value:function(){return Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("button",{className:"IncrementButton",onClick:this.IncrementItem,children:"-"}),Object(i.jsx)("button",{className:"DecrementButton",onClick:this.DecreaseItem,children:"+"})]})}}]),t}(s.Component);function L(e,a,t,s,n){return H.apply(this,arguments)}function H(){return(H=Object(l.a)(Object(c.a)().mark((function e(a,t,s,n,r){var o,l,i,d,u,m;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return o=a.bttsAllPercentageHome,l=a.bttsPercentageHomeHome,i=a.bttsPercentageAwayAway,d=a.bttsAllPercentageAway,u=t,m=s,a.combinedBTTS=(o+d)/2,"N/A"!==a.bttsFraction&&"suspended"!==a.status&&"canceled"!==a.status&&(o>55&&d>55&&l>55&&i>55&&a.awayOdds<4&&a.awayOdds>1.3&&u>=1&&m>=1?(a.btts=!0,a.bttsChosen=!0,a.totalGoals=a.rawFinalHomeGoals+a.rawFinalAwayGoals):(a.btts=!1,a.bttsChosen=!1)),e.abrupt("return",a);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var R=t(145),B=t(125),X=t(126),I=t(146),M=t(127);t(94),t(95);R.a.use([B.a,X.a]);var W=function(e){return Object(i.jsxs)(I.a,{effect:"coverflow",autoHeight:!0,grabCursor:!0,centeredSlides:!0,slidesPerView:1,coverflowEffect:{rotate:50,stretch:0,depth:100,modifier:1,slideShadows:!1},pagination:{clickable:!0},className:"mySwiper",children:[Object(i.jsx)(M.a,{children:e.element}),Object(i.jsx)(M.a,{children:e.element2}),Object(i.jsx)(M.a,{children:e.element3}),Object(i.jsx)(M.a,{children:e.element4}),Object(i.jsx)(M.a,{children:e.element5})]})},E=t(68),V=t.n(E),U=function(e){return Object(i.jsx)(V.a,{className:"kofi-button",color:"#030061",title:e.buttonText,kofiID:"H2H0AX25Z"})},z=0,J=0,K=0,Y=0;var q,Z,Q,$,ee,ae,te=function(e){var a=Object(s.useState)(0),t=Object(o.a)(a,2),n=t[0],r=t[1];return Object(i.jsx)(w.a,{"aria-label":"Always visible",value:n,sx:{width:"90%",color:"#030061"},onChange:function(a,t){switch(r(t),!0){case"xg"===e.useCase:z=t;break;case"gd"===e.useCase:J=t;break;case"gdHorA"===e.useCase:K=t;break;case"last10"===e.useCase:Y=t}},step:1,marks:e.marks,valueLabelDisplay:"auto",min:parseFloat(e.lower),max:parseFloat(e.upper)})};(new Headers).append("Origin","https://gregdorward.github.io");var se=0,ne=0,re=0,oe=0,ce=0,le=0,ie=0,de=0,ue=0,me=0,ge=0,he=0,ve=0,pe=0,be=0,fe=0,Oe=0,je=0,xe=0,ye=!1;function Ae(e){return we.apply(this,arguments)}function we(){return(we=Object(l.a)(Object(c.a)().mark((function e(a){var t,s,n,r,l,i,d;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=new Date(1e3*a),s=t.toLocaleDateString("en-US").split("/"),n=Object(o.a)(s,3),r=n[0],l=n[1],i=n[2],d="".concat(i,"-").concat(r,"-").concat(l),e.abrupt("return",d);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function _e(e){var a,t=0;try{return e.forEach((function(e){switch(!0){case"W"===e:a=3;break;case"D"===e:a=1;break;case"L"===e:a=0}t+=a})),t}catch(s){return console.log(s),"N/A"}}function Ge(e,a,t,s){return Se.apply(this,arguments)}function Se(){return(Se=Object(l.a)(Object(c.a)().mark((function e(a,t,s,n){var r,o,l,i,d,u,m,g,h,v,p,b,f,O,j,x,y,A,w,_,G,S,T,P,k,C,N,F,D,L,H,R,B,X,I,M,W,E,V,U,z,J,K,Y,q,Z,Q,$,ee,ae,te,se,ne,re,oe,ce,le,ie,de,ue,me,ge,he,ve,pe,be,fe,Oe,je,xe,ye,we,_e,Ge,Se,Pe,ke,Ce,Fe,De,Le,He,Re,Be,Xe,Ie,Me,We,Ee,Ve,Ue,ze,Je,Ke,Ye,qe,Ze,Qe,$e,ea,aa,ta,sa,na,ra,oa,ca,la,ia,da,ua,ma,ga,ha,va,pa,ba,fa,Oa,ja,xa,ya,Aa,wa,_a,Ga,Sa,Ta,Pa,ka,Ca,Na,Fa,Da,La,Ha,Ra,Ba,Xa,Ia,Ma,Wa,Ea,Va,Ua,za,Ja,Ka,Ya,qa,Za,Qa,$a,et,at,tt,st,nt,rt,ot,ct,lt,it,dt,ut,mt,gt,ht,vt,pt,bt,ft,Ot,jt,xt,yt,At,wt,_t,Gt,St,Tt,Pt,kt,Ct,Nt,Ft,Dt,Ht,Rt,Bt,Xt,It,Mt,Wt,Et,Vt,Ut,zt,Jt,Kt,Yt,qt,Zt,Qt,$t,es,as,ts,ss,ns,rs,os,cs,ls,is,ds,us,ms,gs,hs,vs,ps,bs;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n.completeData=!0,r=t.date,!(Lt[t.leagueIndex].fixtures.length>10)){e.next=448;break}o=(o=Lt[t.leagueIndex].fixtures.filter((function(e){return e.home_name===a}))).filter((function(e){return e.date_unix0&&y.awayGoalCount>0,e.t20=y.homeGoalCount>y.awayGoalCount?3:y.homeGoalCounty.awayGoalCount?"W":y.homeGoalCounty.awayGoalCount?v+1:v+0,p=y.odds_ft_1y.odds_ft_2?h+1:h+0,f=y.odds_ft_1>y.odds_ft_2&&y.homeGoalCount>y.awayGoalCount?f+1:f+0,O=y.odds_ft_1>y.odds_ft_2&&y.homeGoalCount===y.awayGoalCount?O+1:O+0,j=y.odds_ft_1>y.odds_ft_2&&y.homeGoalCount0&&w.awayGoalCount>0,e.t43=w.homeGoalCount>w.awayGoalCount?0:w.homeGoalCountw.awayGoalCount?"L":w.homeGoalCountw.odds_ft_2?g+1:g+0,v=w.odds_ft_1>w.odds_ft_2&&w.homeGoalCountw.odds_ft_2&&w.homeGoalCount===w.awayGoalCount?p+1:p+0,b=w.odds_ft_1>w.odds_ft_2&&w.homeGoalCount>w.awayGoalCount?b+1:b+0,h=w.odds_ft_1w.awayGoalCount?j+1:j+0;case 98:A++,e.next=61;break;case 101:_=i,G=d,console.log(t.homeTeam),console.log(a),t.homeTeam===a?(S=t.homeOdds)<=1.5?(T=_.filter((function(e){return e.oddsHome<=1.45})),P=G.filter((function(e){return e.oddsAway<=1.45})),n.simlarGameResultsHome=T.concat(P).sort((function(e,a){return e.dateRaw-a.dateRaw}))):S<=2.1?(k=_.filter((function(e){return e.oddsHome<=2.1&&e.oddsHome>1.45})),C=G.filter((function(e){return e.oddsAway<=2.1&&e.oddsAway>1.45})),t.simlarGameResultsHome=k.concat(C).sort((function(e,a){return e.dateRaw-a.dateRaw}))):S<=2.75?(N=_.filter((function(e){return e.oddsHome<=2.75&&e.oddsHome>2.1})),F=G.filter((function(e){return e.oddsAway<=2.75&&e.oddsAway>2.1})),t.simlarGameResultsHome=N.concat(F).sort((function(e,a){return e.dateRaw-a.dateRaw}))):S<=4?(D=_.filter((function(e){return e.oddsHome<=4&&e.oddsHome>2.75})),L=G.filter((function(e){return e.oddsAway<=4&&e.oddsAway>2.75})),t.simlarGameResultsHome=D.concat(L).sort((function(e,a){return e.dateRaw-a.dateRaw}))):S>4&&(H=_.filter((function(e){return e.oddsHome>4})),R=G.filter((function(e){return e.oddsAway>4})),t.simlarGameResultsHome=H.concat(R).sort((function(e,a){return e.dateRaw-a.dateRaw}))):t.awayTeam===a&&((B=t.awayOdds)<=1.5?(X=_.filter((function(e){return e.oddsHome<=1.45})),I=G.filter((function(e){return e.oddsAway<=1.45})),t.simlarGameResultsAway=X.concat(I).sort((function(e,a){return e.dateRaw-a.dateRaw}))):B<=2.1?(M=_.filter((function(e){return e.oddsHome<=2.1&&e.oddsHome>1.45})),W=G.filter((function(e){return e.oddsAway<=2.1&&e.oddsAway>1.45})),t.simlarGameResultsAway=M.concat(W).sort((function(e,a){return e.dateRaw-a.dateRaw}))):B<=2.75?(E=_.filter((function(e){return e.oddsHome<=2.75&&e.oddsHome>2.1})),V=G.filter((function(e){return e.oddsAway<=2.75&&e.oddsAway>2.1})),t.simlarGameResultsAway=E.concat(V).sort((function(e,a){return e.dateRaw-a.dateRaw}))):B<=4?(U=_.filter((function(e){return e.oddsHome<=4&&e.oddsHome>2.75})),z=G.filter((function(e){return e.oddsAway<=4&&e.oddsAway>2.75})),t.simlarGameResultsAway=U.concat(z).sort((function(e,a){return e.dateRaw-a.dateRaw}))):B>4&&(J=_.filter((function(e){return e.oddsHome>4.5})),K=G.filter((function(e){return e.oddsAway>4.5})),t.simlarGameResultsAway=J.concat(K).sort((function(e,a){return e.dateRaw-a.dateRaw})))),Y=_.concat(G).sort((function(e,a){return e.dateRaw-a.dateRaw})),q=_.sort((function(e,a){return a.dateRaw-e.dateRaw})),Z=G.sort((function(e,a){return a.dateRaw-e.dateRaw})),console.log(t.game),console.log(Y),console.log(q),n.allTeamResults=Y.sort((function(e,a){return a.dateRaw-e.dateRaw})),Q=Y.map((function(e){return e.points})).slice(0,6),$=Q.reduce((function(e,a){return e+a}),0),n.avPoints6=$/Q.length,ee=Y.map((function(e){return e.points})).slice(0,5),ae=ee.reduce((function(e,a){return e+a}),0),n.avPoints5=ae/ee.length,te=Y.map((function(e){return e.points})),se=te.reduce((function(e,a){return e+a}),0),n.avPointsAll=se/te.length,ne=Y.map((function(e){return e.result})),re=q.map((function(e){return e.result})),oe=Z.map((function(e){return e.result})),n.resultsAll=ne.slice(0,6),n.resultsHome=re.slice(0,6),n.resultsAway=oe.slice(0,6),ce=Y.map((function(e){return e.scored})).slice(0,5),le=ce.reduce((function(e,a){return e+a}),0),n.avScoredLast5=le/ce.length,ie=Y.map((function(e){return e.conceeded})).slice(0,5),de=ie.reduce((function(e,a){return e+a}),0),n.avConceededLast5=de/ie.length,ue=Y.map((function(e){return e.dangerousAttacks})).slice(0,5),me=ue.reduce((function(e,a){return e+a}),0),n.avDALast5=me/ue.length,ge=Y.map((function(e){return e.sot})).slice(0,5),he=ge.reduce((function(e,a){return e+a}),0),n.avSOTLast5=he/ge.length,ve=Y.map((function(e){return e.sotAgainst})).slice(0,5),pe=ve.reduce((function(e,a){return e+a}),0),n.avSOTAgainstLast5=pe/ve.length,be=Y.map((function(e){return e.shots})).slice(0,5),fe=be.reduce((function(e,a){return e+a}),0),n.avShotsLast5=fe/be.length,Oe=Y.map((function(e){return e.corners})).slice(0,5),je=Oe.reduce((function(e,a){return e+a}),0),n.avCornersLast5=je/Oe.length,xe=Y.map((function(e){return e.possession})).slice(0,6),ye=xe.reduce((function(e,a){return e+a}),0),n.avPosessionLast5=ye/xe.length,we=Y.map((function(e){return e.XG})).slice(0,5),_e=we.reduce((function(e,a){return e+a}),0),n.avXGLast5=_e/we.length,Ge=Y.map((function(e){return e.XGAgainst})).slice(0,5),Se=Ge.reduce((function(e,a){return e+a}),0),n.avXGAgainstLast5=Se/Ge.length,Pe=u/o.length,ke=m/l.length,n.favouriteCount=g,n.winningFavouriteCount=v,n.drawingFavouriteCount=p,n.beatenFavouriteCount=b,n.underdogCount=h,n.winningUnderdogCount=f,n.drawingUnderdogCount=O,n.beatenUnderdogCount=j,n.oddsReliabilityWin=g>0?n.winningFavouriteCount/n.favouriteCount*100:0,n.oddsReliabilityDraw=g>0?n.drawingFavouriteCount/n.favouriteCount*100:0,n.oddsReliabilityLose=g>0?n.beatenFavouriteCount/n.favouriteCount*100:0,n.oddsReliabilityWinAsUnderdog=h>0?n.winningUnderdogCount/n.underdogCount*100:0,n.oddsReliabilityDrawAsUnderdog=h>0?n.drawingUnderdogCount/n.underdogCount*100:0,n.oddsReliabilityLoseAsUnderdog=h>0?n.beatenUnderdogCount/n.underdogCount*100:0,n.reliableIndicator=n.winningFavouriteCount+n.beatenUnderdogCount,n.unreliableIndicator=n.beatenFavouriteCount+n.drawingFavouriteCount+n.winningUnderdogCount+n.drawingUnderdogCount,n.predictabilityScore=n.reliableIndicator/n.unreliableIndicator,e.t46=!0,e.next=e.t46===n.predictabilityScore<.3?180:e.t46===(n.predictabilityScore>=.3&&n.predictabilityScore<.8)?182:e.t46===(n.predictabilityScore>=.8&&n.predictabilityScore<1.2)?184:e.t46===(n.predictabilityScore>=1.2&&n.predictabilityScore<1.7)?186:e.t46===(n.predictabilityScore>=1.7&&n.predictabilityScore<2.2)?188:e.t46===n.predictabilityScore>=2.2?190:192;break;case 180:return Ce="Odds have been an extremely unreliable indicator of actual performance so far this season. Maybe best avoided?",e.abrupt("break",193);case 182:return Ce="Odds have been an unreliable indicator of actual performance so far this season",e.abrupt("break",193);case 184:return Ce="Odds have been a decent indicator of actual performance so far this season",e.abrupt("break",193);case 186:return Ce="Odds have been a good indicator of actual performance so far this season",e.abrupt("break",193);case 188:return Ce="Odds have been a very good indicator of actual performance so far this season",e.abrupt("break",193);case 190:return Ce="Odds have been an excellent indicator of actual performance so far this season. One for the multi?",e.abrupt("break",193);case 192:return e.abrupt("break",193);case 193:if(n.reliabilityString=Ce,Fe=_.map((function(e){return e.scored})),De=d.map((function(e){return e.scored})),Le=Y.map((function(e){return e.scored})),He=Le.reverse(),Re=i.map((function(e){return e.conceeded})),Be=d.map((function(e){return e.conceeded})),Xe=Y.map((function(e){return e.conceeded})),Ie=Xe.reverse(),Me=Y.map((function(e){return e.XG})),We=Y.map((function(e){return e.XGAgainst})),Ee=Me.reverse(),Ve=We.reverse(),Ue=i.map((function(e){return e.XG})),ze=i.map((function(e){return e.XGAgainst})),Je=d.map((function(e){return e.XG})),Ke=d.map((function(e){return e.XGAgainst})),Ye=Me.reduce((function(e,a){return e+a}),0),qe=Ye/Me.length||0,Ze=We.reduce((function(e,a){return e+a}),0),Qe=Ze/We.length||0,$e=Y.map((function(e){return e.possession})),ea=$e.reduce((function(e,a){return e+a}),0),aa=ea/$e.length||0,ta=i.map((function(e){return e.possession})),sa=ta.reduce((function(e,a){return e+a}),0),n.avgPossessionHome=sa/ta.length||0,na=d.map((function(e){return e.possession})),ra=na.reduce((function(e,a){return e+a}),0),n.avgPossessionAway=ra/na.length||0,oa=Y.map((function(e){return e.dangerousAttacks})),ca=oa.reduce((function(e,a){return e+a}),0),la=ca/oa.length||0,ia=i.map((function(e){return e.dangerousAttacks})),da=ia.reduce((function(e,a){return e+a}),0),n.avgDangerousAttacksHome=da/ia.length||0,ua=d.map((function(e){return e.dangerousAttacks})),ma=ua.reduce((function(e,a){return e+a}),0),n.avgDangerousAttacksAway=ma/ua.length||0,ga=Y.map((function(e){return e.shots})),ha=ga.reduce((function(e,a){return e+a}),0),va=ha/ga.length||0,n.avgShots=va,pa=i.map((function(e){return e.shots})),ba=pa.reduce((function(e,a){return e+a}),0),n.avgShotsHome=ba/pa.length||0,fa=d.map((function(e){return e.shots})),Oa=fa.reduce((function(e,a){return e+a}),0),n.avgShotsAway=Oa/fa.length||0,ja=Y.map((function(e){return e.sot})),xa=ja.reduce((function(e,a){return e+a}),0),ya=xa/ja.length||0,Aa=i.map((function(e){return e.sot})),wa=Aa.reduce((function(e,a){return e+a}),0),n.avgShotsOnTargetHome=wa/Aa.length||0,_a=d.map((function(e){return e.sot})),Ga=_a.reduce((function(e,a){return e+a}),0),n.avgShotsOnTargetAway=Ga/_a.length||0,Sa=Y.map((function(e){return e.sotAgainst})),Ta=Sa.reduce((function(e,a){return e+a}),0),Pa=Ta/Sa.length||0,ka=i.map((function(e){return e.sotAgainst})),Ca=ka.reduce((function(e,a){return e+a}),0),n.avgShotsOnTargetAgainstHome=Ca/ka.length||0,Na=d.map((function(e){return e.sotAgainst})),Fa=Na.reduce((function(e,a){return e+a}),0),n.avgShotsOnTargetAgainstAway=Fa/Na.length||0,Da=Y.map((function(e){return e.corners})),La=Da.reduce((function(e,a){return e+a}),0),Ha=La/Da.length||0,Ra=i.map((function(e){return e.corners})),Ba=Ra.reduce((function(e,a){return e+a}),0),n.cornersAvHome=Ba/Ra.length||0,Xa=d.map((function(e){return e.corners})),Ia=Xa.reduce((function(e,a){return e+a}),0),n.cornersAvAway=Ia/Xa.length||0,Ma=Ee.slice(0,5),Wa=Ma.reduce((function(e,a){return e+a}),0),Ea=Wa/Ma.length||0,Va=Ue.slice(0,5),Ua=Va.reduce((function(e,a){return e+a}),0),n.last5XGAvgForHome=Ua/Va.length||0,za=Je.slice(0,5),Ja=za.reduce((function(e,a){return e+a}),0),n.last5XGAvgForAway=Ja/za.length||0,Ka=Ue.reduce((function(e,a){return e+a}),0),n.avgXGScoredHome=Ka/Ue.length||0,Ya=Je.reduce((function(e,a){return e+a}),0),n.avgXGScoredAway=Ya/Je.length||0,qa=ze.reduce((function(e,a){return e+a}),0),n.avgXGConceededHome=qa/ze.length||0,Za=Ke.reduce((function(e,a){return e+a}),0),n.avgXGConceededAway=Za/Ke.length||0,Qa=Ve.slice(0,5),$a=Qa.reduce((function(e,a){return e+a}),0),et=$a/Qa.length||0,at=Ue.slice(0,5),tt=at.reduce((function(e,a){return e+a}),0),n.last5XGAvgAgainstHome=tt/at.length||0,st=Je.slice(0,5),nt=st.reduce((function(e,a){return e+a}),0),n.last5XGAvgAgainstAway=nt/st.length||0,n.XGDiffNonAverage=Ye-Ze,n.XGDiffNonAverageLast5=Wa-$a,n.XGOverall=parseFloat(qe.toFixed(2)),n.XGlast5=parseFloat(Ea.toFixed(2)),n.XGAgainstAvgOverall=parseFloat(Qe.toFixed(2)),n.XGAgainstlast5=parseFloat(et.toFixed(2)),n.AveragePossessionOverall=parseFloat(aa.toFixed(1)),n.AverageDangerousAttacksOverall=parseFloat(la.toFixed(1)),n["Average Shots"]=parseFloat(va.toFixed(1)),n.AverageCorners=parseFloat(Ha.toFixed(1)),n.AverageShotsOnTargetOverall=parseFloat(ya.toFixed(1)),n.AverageShotsOnTargetAgainstOverall=parseFloat(Pa.toFixed(1)),rt=.75,ot=.75,"home"!==s){e.next=327;break}return n.allGoalsArrayHomeRecent=He.slice(0,20),n.allConceededArrayHomeRecent=Ie.slice(0,20),n.allGoalsArrayHome=He,n.allConceededArrayHome=Ie,n.allGoalsArrayHomeOnly=Fe,n.allConceededArrayHomeOnly=Re,it=Fe.reduce((function(e,a){return e+a}),0),dt=Re.reduce((function(e,a){return e+a}),0),n.goalDifferenceHomeOrAway=it-dt,e.next=321,Ne(Le.reverse(),Xe.reverse(),rt);case 321:return ct=e.sent,e.next=324,Ne(Fe,Re,ot);case 324:lt=e.sent,e.next=343;break;case 327:if("away"!==s){e.next=343;break}return n.allGoalsArrayAwayRecent=He.slice(0,20),n.allConceededArrayAwayRecent=Ie.slice(0,20),n.allGoalsArrayAway=He,n.allConceededArrayAway=Ie,n.allGoalsArrayAwayOnly=De,n.allConceededArrayAwayOnly=Be,ut=De.reduce((function(e,a){return e+a}),0),mt=Be.reduce((function(e,a){return e+a}),0),n.goalDifferenceHomeOrAway=ut-mt,e.next=339,Ne(Le.reverse(),Xe.reverse(),rt);case 339:return ct=e.sent,e.next=342,Ne(De,Be,ot);case 342:lt=e.sent;case 343:return(gt=i.map((function(e){return e.btts}))).length>10&&(gt=gt.slice(-10)),(ht=d.map((function(e){return e.btts}))).length>10&&(ht=ht.slice(-10)),(vt=Y.map((function(e){return e.btts}))).length>10&&(vt=vt.slice(-10)),pt=gt.filter((function(e){return!0===e})),bt="".concat(pt.length,"/").concat(gt.length),ft=(pt.length/gt.length*100).toFixed(0),Ot=ht.filter((function(e){return!0===e})),jt="".concat(Ot.length,"/").concat(ht.length),xt=(Ot.length/ht.length*100).toFixed(0),yt=vt.filter((function(e){return!0===e})),At="".concat(yt.length,"/").concat(vt.length),wt=(yt.length/vt.length*100).toFixed(0),n.bttsAllPercentage=wt,n.bttsHomePercentage=ft,n.bttsAwayPercentage=xt,_t=10,Gt=10,e.next=365,Te(Fe,Fe.length=0;r--)o=Math.pow(1-t,a.length-1-r),s+=a[r]*o,n+=o;return e.abrupt("return",s/n);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ne(e,a,t){return Fe.apply(this,arguments)}function Fe(){return(Fe=Object(l.a)(Object(c.a)().mark((function e(a,t,s){var n,r,o,l;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ke(a,s);case 2:return n=e.sent,e.next=5,ke(t,s);case 5:return r=e.sent,o=n,l=r,e.abrupt("return",{goalsFor:o,goalsAgainst:l});case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function De(e,a){return Le.apply(this,arguments)}function Le(){return(Le=Object(l.a)(Object(c.a)().mark((function e(a,t){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",a>=t?a-t:-(t-a));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function He(e,a){return Re.apply(this,arguments)}function Re(){return(Re=Object(l.a)(Object(c.a)().mark((function e(a,t){var s,n,r;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return s=parseFloat(a),n=parseFloat(t),e.next=4,De(s,n);case 4:return r=e.sent,e.abrupt("return",parseFloat(r));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Be(e){return Xe.apply(this,arguments)}function Xe(){return(Xe=Object(l.a)(Object(c.a)().mark((function e(a){var t,s;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:e.t0=!0,e.next=e.t0===a.dangerousAttackConversion<=15?3:e.t0===(a.dangerousAttackConversion>15&&a.dangerousAttackConversion<=20)?6:e.t0===(a.dangerousAttackConversion>20&&a.dangerousAttackConversion<=25)?9:e.t0===(a.dangerousAttackConversion>25&&a.dangerousAttackConversion<=32.5)?12:e.t0===(a.dangerousAttackConversion>30&&a.dangerousAttackConversion<=35)?15:e.t0===(a.dangerousAttackConversion>35&&a.dangerousAttackConversion<=40)?18:e.t0===(a.dangerousAttackConversion>40&&a.dangerousAttackConversion<=45)?21:e.t0===(a.dangerousAttackConversion>45&&a.dangerousAttackConversion<=50)?24:e.t0===(a.dangerousAttackConversion>50&&a.dangerousAttackConversion<=55)?27:e.t0===(a.dangerousAttackConversion>55&&a.dangerousAttackConversion<=60)?30:e.t0===a.dangerousAttackConversion>60?33:36;break;case 3:return t="excellent",s=.8,e.abrupt("break",37);case 6:return t="great",s=.9,e.abrupt("break",37);case 9:return t="very good",s=.95,e.abrupt("break",37);case 12:return t="good",s=.98,e.abrupt("break",37);case 15:return t="above average",s=.99,e.abrupt("break",37);case 18:return t="average",s=1,e.abrupt("break",37);case 21:return t="below average",s=1.01,e.abrupt("break",37);case 24:return t="poor",s=1.05,e.abrupt("break",37);case 27:return t="very poor",s=1.1,e.abrupt("break",37);case 30:return t="terrible",s=1.2,e.abrupt("break",37);case 33:return t="awful",s=1.3,e.abrupt("break",37);case 36:return e.abrupt("break",37);case 37:return e.abrupt("return",[t,s]);case 38:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ie(e,a){return Me.apply(this,arguments)}function Me(){return(Me=Object(l.a)(Object(c.a)().mark((function e(a,t){var s;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Ht(a,t);case 2:return s=e.sent,e.abrupt("return",parseFloat(s));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function We(e){return Ee.apply(this,arguments)}function Ee(){return(Ee=Object(l.a)(Object(c.a)().mark((function e(a){var t,s;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:e.t0=!0,e.next=e.t0===a>=2.5?3:e.t0===(a>=2&&a<2.5)?6:e.t0===(a>=1.5&&a<2)?9:e.t0===(a>=1&&a<1.5)?12:e.t0===(a>=.5&&a<1)?15:e.t0===(a>-.5&&a<.5)?18:e.t0===(a<=-.5&&a>-1)?21:e.t0===(a<=-1&&a>-1.5)?24:e.t0===(a<=-1.5&&a>-2)?27:e.t0===(a<=-2&&a>-2.5)?30:e.t0===a<=-2.5?33:36;break;case 3:return t=.3,s=-.3,e.abrupt("break",38);case 6:return t=.2,s=-.2,e.abrupt("break",38);case 9:return t=.15,s=-.15,e.abrupt("break",38);case 12:return t=.1,s=-.1,e.abrupt("break",38);case 15:return t=.05,s=-.05,e.abrupt("break",38);case 18:return t=0,s=0,e.abrupt("break",38);case 21:return t=-.05,s=.05,e.abrupt("break",38);case 24:return t=-.1,s=.1,e.abrupt("break",38);case 27:return t=-.15,s=.15,e.abrupt("break",38);case 30:return t=-.2,s=.2,e.abrupt("break",38);case 33:return t=-.3,s=.3,e.abrupt("break",38);case 36:t=0,s=0;case 38:return e.abrupt("return",[t,s]);case 39:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ve(e,a){return Ue.apply(this,arguments)}function Ue(){return(Ue=Object(l.a)(Object(c.a)().mark((function e(a,t){var s,n,r,o,l;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(n=0,r=0;rl?s=1.05:o===l?s=1:o=5||s.XGdifferentialValueRaw<0?r+=.3:("L"===t.lastGame||t.last2Points<2||a.last2Points>=5||s.XGdifferentialValueRaw>0)&&(n+=.3),n<0&&r<0&&(nr&&(r+=(n-=r/5)/5)),e.abrupt("return",[n,r]);case 37:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ra(e,a,t,s){return oa.apply(this,arguments)}function oa(){return(oa=Object(l.a)(Object(c.a)().mark((function e(a,t,s,n){var r,l,i,d,u,m,g,h,v,p,b,f,O,j,x,y,A,w,_,G,T,P,k,C,N,F,D,L,H,R,B,X,I,M,W,E,V,U,te,Oe,je,xe,ye,Ae,we,Se,Te,Pe,ke,Ce,Ne,Fe,De,Le,He,Re,Xe,Me,Ee,Ue,Je,Ke,Ye,qe,Ze,Qe,$e,ea,ta,na,ra,oa,ca,la,ia,da,ua;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!0===n&&Bt.find((function(e){return e.home.teamName===a.homeTeam&&e.away.teamName===a.awayTeam}))?r=[Bt.find((function(e){return e.home.teamName===a.homeTeam})).home,Bt.find((function(e){return e.away.teamName===a.awayTeam})).away]:n=!1,!n){e.next=579;break}d=0;case 4:if(!(d10&&7956!==a.leagueID)){e.next=166;break}return e.next=122,Ge(a.homeTeam,a,"home",l);case 122:return W=e.sent,E=Object(o.a)(W,18),l.predictedGoalsBasedOnHomeAv=E[0],l.predictedGoalsBasedOnAwayAv=E[1],l.allTeamGoalsBasedOnAverages=E[2],l.predictedGoalsConceededBasedOnHomeAv=E[3],l.predictedGoalsConceededBasedOnAwayAv=E[4],l.allTeamGoalsConceededBasedOnAverages=E[5],l.averageOddsHome=E[6],l.averageOddsAway=E[7],l.averageScoredLeague=E[8],l.averageConceededLeague=E[9],l.last10btts=E[10],l.last10bttsHome=E[11],l.last10bttsAway=E[12],a.bttsAllPercentageHome=E[13],a.bttsPercentageHomeHome=E[14],a.bttsPercentageHomeAway=E[15],l.forAndAgainstRollingAvHomeOrAway=E[16],l.forAndAgainstRollingAv=E[17],e.next=144,Ge(a.awayTeam,a,"away",i);case 144:V=e.sent,U=Object(o.a)(V,18),i.predictedGoalsBasedOnHomeAv=U[0],i.predictedGoalsBasedOnAwayAv=U[1],i.allTeamGoalsBasedOnAverages=U[2],i.predictedGoalsConceededBasedOnHomeAv=U[3],i.predictedGoalsConceededBasedOnAwayAv=U[4],i.allTeamGoalsConceededBasedOnAverages=U[5],i.averageOddsHome=U[6],i.averageOddsAway=U[7],i.averageScoredLeague=U[8],i.averageConceededLeague=U[9],i.last10btts=U[10],i.last10bttsHome=U[11],i.last10bttsAway=U[12],a.bttsAllPercentageAway=U[13],a.bttsPercentageAwayHome=U[14],a.bttsPercentageAwayAway=U[15],i.forAndAgainstRollingAvHomeOrAway=U[16],i.forAndAgainstRollingAv=U[17],e.next=216;break;case 166:l.completeData=!1,l.predictedGoalsBasedOnHomeAv=l.ScoredAverage,l.predictedGoalsBasedOnAwayAv=l.ConcededAverage,l.allTeamGoalsBasedOnAverages=l.ScoredAverage,l.forAndAgainstRollingAv={goalsFor:l.ScoredAverage,goalsAgainst:l.ConcededAverage},l.forAndAgainstRollingAvHomeOrAway={goalsFor:l.ScoredAverage,goalsAgainst:l.ConcededAverage},l.predictedGoalsConceededBasedOnHomeAv=l.ConcededAverage,l.predictedGoalsConceededBasedOnAwayAv=l.ConcededAverage,l.allTeamGoalsConceededBasedOnAverages=l.ConcededAverage,l.averageOddsHome=null,l.averageOddsAway=null,l.averageScoredLeague=null,l.averageConceededLeague=null,l.goalDifference=l.ScoredOverall-l.ConcededOverall,l.goalDifferenceHomeOrAway=l.ScoredOverall-l.ConcededOverall,l.last10btts=null,l.last10bttsHome=null,l.last10bttsAway=null,l.allTeamResults=[],l.resultsAll=[],l.resultsHome=[],l.resultsAway=[],a.bttsAllPercentageHome="",a.bttsPercentageHomeHome="",a.bttsPercentageHomeAway="",i.completeData=!1,i.predictedGoalsBasedOnHomeAv=i.ScoredAverage,i.predictedGoalsBasedOnAwayAv=i.ConcededAverage,i.allTeamGoalsBasedOnAverages=i.ScoredAverage,i.forAndAgainstRollingAv={goalsFor:i.ScoredAverage,goalsAgainst:i.ConcededAverage},i.forAndAgainstRollingAvHomeOrAway={goalsFor:i.ScoredAverage,goalsAgainst:i.ConcededAverage},i.predictedGoalsConceededBasedOnHomeAv=i.ConcededAverage,i.predictedGoalsConceededBasedOnAwayAv=i.ConcededAverage,i.allTeamGoalsConceededBasedOnAverages=i.ConcededAverage,i.averageOddsHome=null,i.averageOddsAway=null,i.averageScoredLeague=null,i.averageConceededLeague=null,i.goalDifference=i.ScoredOverall-i.ConcededOverall,i.goalDifferenceHomeOrAway=i.ScoredOverall-i.ConcededOverall,i.last10btts=null,i.last10bttsHome=null,i.last10bttsAway=null,i.allTeamResults=[],i.resultsAll=[],i.resultsHome=[],i.resultsAway=[],a.bttsAllPercentageAway="",a.bttsPercentageAwayHome="",a.bttsPercentageAwayAway="";case 216:return"number"===typeof l.homeTeamHomePositionRaw&&"number"===typeof i.awayTeamAwayPositionRaw?(l.homePositionHomeOnly=parseFloat(l.homeTeamHomePositionRaw),i.awayPositionAwayOnly=parseFloat(i.awayTeamAwayPositionRaw),l.homePosition=parseFloat(l.homeRawPosition),i.awayPosition=parseFloat(i.awayRawPosition)):(l.homePositionHomeOnly="N/A",i.awayPositionAwayOnly="N/A",l.homePosition="N/A",i.awayPosition="N/A"),l.last10Goals&&0!==i.last10Goals&&(l.last5Goals-l.last5GoalsConceeded>l.last10Goals-l.last10GoalsConceeded?l.improving=!0:l.improving=!1,i.last5Goals-i.last5GoalsConceeded>i.last10Goals-i.last10GoalsConceeded?i.improving=!0:i.improving=!1),l.AttackingPotency=l.XG/l.AttacksHome*100,i.AttackingPotency=i.XG/i.AttacksAverage*100,te={"Average Dangerous Attacks":l.AverageDangerousAttacksOverall,"Average Shots":l.AverageShots,"Average Shots On Target":l.AverageShotsOnTargetOverall?l.AverageShotsOnTargetOverall:l.AverageShotsOnTarget,"Average Expected Goals":l.XGOverall?l.XGOverall:l.expectedGoals,"Recent XG":l.XGlast5?l.XGlast5:l.XGOverall,"Average Goals":l.avgScored?l.avgScored:l.ScoredAverage,Corners:l.AverageCorners?l.AverageCorners:l.CornersAverage},Oe={"Average Dangerous Attacks":l.avDALast5?l.avDALast5:l.AverageDangerousAttacksOverall,"Average Shots":l.avShotsLast5?l.avShotsLast5:l.AverageShots,"Average Shots On Target":l.avSOTLast5?l.avSOTLast5:l.AverageShotsOnTarget,"Average Expected Goals":l.XGlast5?l.XGlast5:l.XGOverall,"Recent XG":l.XGlast5?l.XGlast5:l.XGOverall,"Average Goals":l.avScoredLast5?l.avScoredLast5:l.ScoredAverage,Corners:l.avCornersLast5?l.avCornersLast5:l.CornersAverage},je={"Average Dangerous Attacks":l.avgDangerousAttacksHome?l.avgDangerousAttacksHome:l.AverageDangerousAttacksOverall,"Average Shots":l.avgShotsHome?l.avgShotsHome:l.AverageShots,"Average Shots On Target":l.avgShotsOnTargetHome?l.avgShotsOnTargetHome:l.AverageShotsOnTarget,"Average Expected Goals":l.avgXGScoredHome?l.avgXGScoredHome:l.XGOverall,"Recent XG":l.last5XGAvgForHome?l.last5XGAvgForHome:l.XGOverall,"Average Goals":l.avgScoredHome?l.avgScoredHome:l.ScoredAverage,Corners:l.cornersAvHome?l.cornersAvHome:l.CornersAverage},xe={"Average Dangerous Attacks":i.avgDangerousAttacksAway?i.avgDangerousAttacksAway:i.AverageDangerousAttacksOverall,"Average Shots":i.avgShotsAway?i.avgShotsAway:i.AverageShots,"Average Shots On Target":i.avgShotsOnTargetAway?i.avgShotsOnTargetAway:i.AverageShotsOnTarget,"Average Expected Goals":i.avgXGScoredAway?i.avgXGScoredAway:i.XGOverall,"Recent XG":i.last5XGAvgForAway?i.last5XGAvgForAway:i.XGOverall,"Average Goals":i.avgScoredAway?i.avgScoredAway:i.ScoredAverage,Corners:i.cornersAvAway?i.cornersAvAway:i.CornersAverage},ye={"Average Dangerous Attacks":i.AverageDangerousAttacksOverall,"Average Shots":i.AverageShots,"Average Shots On Target":i.AverageShotsOnTargetOverall?i.AverageShotsOnTargetOverall:i.AverageShotsOnTarget,"Average Expected Goals":i.XGOverall?i.XGOverall:i.expectedGoals,"Recent XG":i.XGlast5?i.XGlast5:i.XGOverall,"Average Goals":i.avgScored?i.avgScored:i.ScoredAverage,Corners:i.AverageCorners?i.AverageCorners:i.CornersAverage},Ae={"Average Dangerous Attacks":i.avDALast5?i.avDALast5:i.AverageDangerousAttacksOverall,"Average Shots":i.avShotsLast5?i.avShotsLast5:i.AverageShots,"Average Shots On Target":i.avSOTLast5?i.avSOTLast5:i.AverageShotsOnTarget,"Average Expected Goals":i.XGlast5?i.XGlast5:i.XGOverall,"Recent XG":i.XGlast5?i.XGlast5:i.XGOverall,"Average Goals":i.avScoredLast5?i.avScoredLast5:i.ScoredAverage,Corners:i.avCornersLast5?i.avCornersLast5:i.CornersAverage},we={"Average XG Against":(l.XGAgainstAvgOverall,l.XGAgainstAvgOverall),"Recent XG Against":l.XGAgainstlast5?l.XGAgainstlast5:l.XGAgainstAvgOverall,"Average Goals Against":l.avgConceeded?l.avgConceeded:l.ConcededAverage,"Average SOT Against":l.AverageShotsOnTargetAgainstOverall?l.AverageShotsOnTargetAgainstOverall:5},Se={"Average XG Against":l.XGAgainstlast5?l.XGAgainstlast5:l.XGAgainstAvgOverall,"Recent XG Against":l.avXGAgainstLast5?l.avXGAgainstLast5:l.XGAgainstAvgOverall,"Average Goals Against":l.avConceededLast5?l.avConceededLast5:l.ConcededAverage,"Average SOT Against":l.avSOTAgainstLast5?l.avSOTAgainstLast5:5},Te={"Average XG Against":(i.XGAgainstAvgOverall,i.XGAgainstAvgOverall),"Recent XG Against":i.XGAgainstlast5?i.XGAgainstlast5:i.XGAgainstAvgOverall,"Average Goals Against":i.avgConceeded?i.avgConceeded:i.ConcededAverage,"Average SOT Against":i.AverageShotsOnTargetAgainstOverall?i.AverageShotsOnTargetAgainstOverall:5},Pe={"Average XG Against":i.XGAgainstlast5?i.XGAgainstlast5:i.XGAgainstAvgOverall,"Recent XG Against":i.avXGAgainstLast5?i.avXGAgainstLast5:i.XGAgainstAvgOverall,"Average Goals Against":i.avConceededLast5?i.avConceededLast5:i.ConcededAverage,"Average SOT Against":i.avSOTAgainstLast5?i.avSOTAgainstLast5:5},ke={"Average XG Against":l.avgXGConceededHome?l.avgXGConceededHome:l.XGAgainstAvgOverall,"Recent XG Against":l.last5XGAvgAgainstHome?l.last5XGAvgAgainstHome:l.XGAgainstAvgOverall,"Average Goals Against":l.teamConceededAvgHomeOnly?l.teamConceededAvgHomeOnly:l.ConcededAverage,"Average SOT Against":l.avgShotsOnTargetAgainstHome?l.avgShotsOnTargetAgainstHome:5},Ce={"Average XG Against":i.avgXGConceededAway?i.avgXGConceededAway:i.XGAgainstAvgOverall,"Recent XG Against":i.last5XGAvgAgainstAway?i.last5XGAvgAgainstAway:i.XGAgainstAvgOverall,"Average Goals Against":i.teamConceededAvgAwayOnly?i.teamConceededAvgAwayOnly:i.ConcededAverage,"Average SOT Against":i.avgShotsOnTargetAgainstAway?i.avgShotsOnTargetAgainstAway:5},l.attackingMetrics=te,l.defensiveMetrics=we,i.attackingMetrics=ye,i.defensiveMetrics=Te,e.next=238,As(te);case 238:return l.attackingStrength=e.sent,e.next=241,As(te);case 241:return l.attackingStrengthScoreGeneration=e.sent,e.next=244,As(Oe);case 244:return l.attackingStrengthLast5=e.sent,e.next=247,As(je);case 247:return l.attackingStrengthHomeOnly=e.sent,e.next=250,As(ye);case 250:return i.attackingStrength=e.sent,e.next=253,As(Ae);case 253:return i.attackingStrengthLast5=e.sent,e.next=256,As(xe);case 256:return i.attackingStrengthAwayOnly=e.sent,e.next=259,_s(we);case 259:return l.defensiveStrength=e.sent,e.next=262,_s(we,1);case 262:return l.defensiveStrengthScoreGeneration=e.sent,e.next=265,_s(Se);case 265:return l.defensiveStrengthLast5=e.sent,e.next=268,_s(Se,1);case 268:return l.defensiveStrengthScoreGenerationLast5=e.sent,e.next=271,_s(ke);case 271:return l.defensiveStrengthHomeOnly=e.sent,e.next=274,_s(ke,1);case 274:return l.defensiveStrengthScoreGenerationHomeOnly=e.sent,e.next=277,_s(Te);case 277:return i.defensiveStrength=e.sent,e.next=280,_s(Te,1);case 280:return i.defensiveStrengthScoreGeneration=e.sent,e.next=283,_s(Pe);case 283:return i.defensiveStrengthLast5=e.sent,e.next=286,_s(Pe,1);case 286:return i.defensiveStrengthScoreGenerationLast5=e.sent,e.next=289,_s(Ce);case 289:return i.defensiveStrengthAwayOnly=e.sent,e.next=292,_s(Ce,1);case 292:return i.defensiveStrengthScoreGenerationAwayOnly=e.sent,e.next=295,Ss("averagePossession",(l.AveragePossessionOverall,l.AveragePossessionOverall));case 295:return l.possessionStrength=e.sent,e.next=298,Ss("averagePossession",l.avPosessionLast5?l.avPosessionLast5:l.AveragePossessionOverall);case 298:return l.possessionStrengthLast5=e.sent,e.next=301,Ss("averagePossession",l.avgPossessionHome?l.avgPossessionHome:l.AveragePossessionOverall);case 301:return l.possessionStrengthHomeOnly=e.sent,e.next=304,Ss("averagePossession",i.avPosessionLast5?i.avPosessionLast5:i.AveragePossessionOverall);case 304:return i.possessionStrengthLast5=e.sent,e.next=307,Ss("averagePossession",(i.AveragePossessionOverall,i.AveragePossessionOverall));case 307:return i.possessionStrength=e.sent,e.next=310,Ss("averagePossession",i.avgPossessionAway?i.avgPossessionAway:i.AveragePossessionOverall);case 310:return i.possessionStrengthAwayOnly=e.sent,l.directnessOverall=l.AverageShots/l.AveragePossessionOverall*10,l.directnessOverallLast5=l.avShotsLast5/l.avPosessionLast5*10,i.directnessOverallLast5=i.avShotsLast5/i.avPosessionLast5*10,l.directnessHomeOnly=l.avgShotsHome/l.avgPossessionHome*10,i.directnessOverall=i.AverageShots/i.AveragePossessionOverall*10,i.directnessAwayOnly=i.avgShotsAway/i.avgPossessionAway*10,e.next=319,Ss("directnessOverall",l.directnessOverall);case 319:return l.directnessOverallStrength=e.sent,e.next=322,Ss("directnessOverall",l.directnessOverallLast5);case 322:return l.directnessOverallStrengthLast5=e.sent,e.next=325,Ss("directnessOverall",l.directnessHomeOnly);case 325:return l.directnessHomeStrength=e.sent,e.next=328,Ss("directnessOverall",i.directnessOverall);case 328:return i.directnessOverallStrength=e.sent,e.next=331,Ss("directnessOverall",i.directnessOverallLast5);case 331:return i.directnessOverallStrengthLast5=e.sent,e.next=334,Ss("directnessOverall",i.directnessAwayOnly);case 334:return i.directnessAwayStrength=e.sent,l.shootingAccuracy=(l.AverageShotsOnTargetOverall?l.AverageShotsOnTargetOverall:l.AverageShotsOnTarget/l.avgShots)*l.AverageShotsOnTargetOverall?l.AverageShotsOnTargetOverall:l.AverageShotsOnTarget,l.shootingAccuracyLast5=l.avSOTLast5/l.avShotsLast5*l.avSOTLast5,i.shootingAccuracyLast5=i.avSOTLast5/i.avShotsLast5*i.avSOTLast5,l.shootingAccuracyHomeOnly=l.avgShotsOnTargetHome/l.avgShotsHome*l.avgShotsOnTargetHome,i.shootingAccuracy=(i.AverageShotsOnTargetOverall?i.AverageShotsOnTargetOverall:i.AverageShotsOnTarget/i.avgShots)*i.AverageShotsOnTargetOverall?i.AverageShotsOnTargetOverall:i.AverageShotsOnTarget,i.shootingAccuracyAwayOnly=i.avgShotsOnTargetAway/i.avgShotsAway*i.avgShotsOnTargetAway,e.next=343,Ss("accuracyOverall",l.shootingAccuracy);case 343:return l.accuracyOverallStrength=e.sent,e.next=346,Ss("accuracyOverall",l.shootingAccuracyLast5);case 346:return l.accuracyOverallStrengthLast5=e.sent,e.next=349,Ss("accuracyOverall",l.shootingAccuracyHomeOnly);case 349:return l.accuracyHomeStrength=e.sent,e.next=352,Ss("accuracyOverall",i.shootingAccuracy);case 352:return i.accuracyOverallStrength=e.sent,e.next=355,Ss("accuracyOverall",i.shootingAccuracyLast5);case 355:return i.accuracyOverallStrengthLast5=e.sent,e.next=358,Ss("accuracyOverall",i.shootingAccuracyAwayOnly);case 358:return i.accuracyAwayStrength=e.sent,e.next=361,Ss("xgFor",l.XGOverall);case 361:return l.xgForStrength=e.sent,e.next=364,Ss("xgFor",l.XGlast5);case 364:return l.xgForStrengthLast5=e.sent,e.next=367,Ss("xgFor",l.avgXGScoredHome);case 367:return l.xgForStrengthHomeOnly=e.sent,e.next=370,Ss("xgAgainst",3-l.XGAgainstAvgOverall);case 370:return l.xgAgainstStrength=e.sent,e.next=373,Ss("xgAgainst",3-l.XGAgainstlast5);case 373:return l.xgAgainstStrengthLast5=e.sent,e.next=376,Ss("xgAgainst",3-l.avgXGConceededHome);case 376:return l.xgAgainstStrengthHomeOnly=e.sent,e.next=379,Ss("xgFor",i.XGOverall);case 379:return i.xgForStrength=e.sent,e.next=382,Ss("xgFor",i.last5XGAvgFor);case 382:return i.xgForStrengthLast5=e.sent,e.next=385,Ss("xgFor",i.XGlast5);case 385:return i.xgForStrengthLast5=e.sent,e.next=388,Ss("xgFor",i.avgXGScoredAway);case 388:return i.xgForStrengthAwayOnly=e.sent,e.next=391,Ss("xgAgainst",3-i.XGAgainstAvgOverall);case 391:return i.xgAgainstStrength=e.sent,e.next=394,Ss("xgAgainst",3-i.XGAgainstlast5);case 394:return i.xgAgainstStrengthLast5=e.sent,e.next=397,Ss("xgAgainst",3-i.avgXGConceededAway);case 397:return i.xgAgainstStrengthAwayOnly=e.sent,e.t0=parseInt,e.next=401,Ht(l.XGDiffNonAverage,l.goalDifference);case 401:return e.t1=e.sent,l.actualToXGDifference=(0,e.t0)(e.t1),e.t2=parseInt,e.next=406,Ht(i.XGDiffNonAverage,i.goalDifference);case 406:return e.t3=e.sent,i.actualToXGDifference=(0,e.t2)(e.t3),e.next=410,sa(l,i,a);case 410:if(Ne=e.sent,Fe=Object(o.a)(Ne,2),l.teamGoalsCalc=Fe[0],i.teamGoalsCalc=Fe[1],console.log(l.teamGoalsCalc),console.log(i.teamGoalsCalc),De={weighting:l.teamGoalsCalc},Le={weighting:i.teamGoalsCalc},void 0===l.allConceededArrayHome||void 0===i.allConceededArrayAway){e.next=428;break}return e.next=421,aa(l.allGoalsArrayHomeRecent,l.allConceededArrayHomeRecent,i.allGoalsArrayAwayRecent,i.allConceededArrayAwayRecent,De,Le,a.game);case 421:return Xe=e.sent,e.next=424,aa(l.allGoalsArrayHomeOnly,l.allConceededArrayHomeOnly,i.allGoalsArrayAwayOnly,i.allConceededArrayAwayOnly,De,Le,a.game);case 424:return Re=e.sent,e.next=427,aa(l.allGoalsArrayHome,l.allConceededArrayHome,i.allGoalsArrayAway,i.allConceededArrayAway,De,Le,a.game);case 427:He=e.sent;case 428:return Ue=l.ScoredAverageShortAndLongTerm-l.conceededAverageShortAndLongTerm,Je=i.ScoredAverageShortAndLongTerm-i.conceededAverageShortAndLongTerm,e.t4=parseFloat,e.next=433,Ht(Ue,Je);case 433:return e.t5=e.sent,e.t6=(0,e.t4)(e.t5),l.goalsDifferential=e.t6/1,e.t7=parseFloat,e.next=439,Ht(Je,Ue);case 439:return e.t8=e.sent,e.t9=(0,e.t7)(e.t8),i.goalsDifferential=e.t9/1,l.rollingAverageGoalsDifferential=parseFloat(l.allTeamGoalsBasedOnAverages-l.allTeamGoalsConceededBasedOnAverages),i.rollingAverageGoalsDifferential=parseFloat(i.allTeamGoalsBasedOnAverages-i.allTeamGoalsConceededBasedOnAverages),a.GoalsInGamesAverageHome=l.avScoredLast5+l.avConceededLast5,a.GoalsInGamesAverageAway=i.avScoredLast5+i.avConceededLast5,Ke=(1*l.forAndAgainstRollingAvHomeOrAway.goalsFor+1*i.forAndAgainstRollingAvHomeOrAway.goalsAgainst+1*l.forAndAgainstRollingAv.goalsFor+1*i.forAndAgainstRollingAv.goalsAgainst+0*l.allTeamGoalsBasedOnAverages+0*i.allTeamGoalsConceededBasedOnAverages+1*l.XGOverall+1*i.XGAgainstAvgOverall+0*C+0*L)/6,Ye=(1*i.forAndAgainstRollingAvHomeOrAway.goalsFor+1*l.forAndAgainstRollingAvHomeOrAway.goalsAgainst+1*i.forAndAgainstRollingAv.goalsFor+1*l.forAndAgainstRollingAv.goalsAgainst+0*i.allTeamGoalsBasedOnAverages+0*l.allTeamGoalsConceededBasedOnAverages+1*i.XGOverall+1*l.XGAgainstAvgOverall+0*N+0*H)/6,void 0!==He&&1!==He[0].probability?(qe=(He[0].team1Score+Xe[0].team1Score+.5*Re[0].team1Score)/2.5,Ze=(He[0].team2Score+Xe[0].team2Score+.5*Re[0].team2Score)/2.5):(qe=Ke,Ze=Ye),e.next=451,Ht(Ke,Ye);case 451:return a.scoreDiff=e.sent,1,1,console.log(a.game),console.log(a.simlarGameResultsHome),console.log(a.simlarGameResultsAway),Qe=qe+l.teamGoalsCalc,$e=Ze+i.teamGoalsCalc,ea=Qe,ta=$e,a.rawFinalHomeGoals=ea,a.rawFinalAwayGoals=ta,ea<0&&(ea=0),ta<0&&(ta=0),Me=Math.floor(ea),Ee=Math.floor(ta),console.log(a.omit),"suspended"!==a.status&&(Me>Ee?(a.prediction="homeWin",1,"L"===l.lastGame||l.last2Points<3||i.last2Points>4||l.oddsReliabilityWin<50?a.includeInMultis=!1:a.includeInMultis=!0):Ee>Me?(a.prediction="awayWin",1,"L"===i.lastGame||i.last2Points<3||l.last2Points>4||i.oddsReliabilityWin<50?a.includeInMultis=!1:a.includeInMultis=!0):Me===Ee&&(a.prediction="draw",se+=1)),console.log(a.game),console.log(Me),console.log(Ee),console.log(a.prediction),console.log(a.outcome),console.log("drawPredictions: ".concat(se)),M>1&&"homeWin"===a.prediction||M<-1.6&&"awayWin"===a.prediction?a.XGdifferential=!0:a.XGdifferential=!1,G>1.2&&"homeWin"===a.prediction||G<-1.2&&"awayWin"===a.prediction?(a.pointsDifferential=!0,a.pointsDifferentialValue=Math.abs(G),a.pointsDifferentialValueRaw=parseFloat(G)):(a.pointsDiff10=!1,a.pointsDifferentialValue=Math.abs(G),a.pointsDifferentialValueRaw=parseFloat(G)),e.next=478,Ht(l.rollingAverageGoalsDifferential,i.rollingAverageGoalsDifferential);case 478:return(na=e.sent)>1.5&&"homeWin"===a.prediction||na<-1.5&&"awayWin"===a.prediction?(a.rollingGoalDiff=!0,a.rollingGoalDiffValue=na):(a.rollingGoalDiff=!1,a.rollingGoalDiffValue=na),e.next=482,Ht(l.AverageDangerousAttacksOverall,i.AverageDangerousAttacksOverall);case 482:(ra=e.sent)>20&&"homeWin"===a.prediction||ra<-20&&"awayWin"===a.prediction?(a.dangerousAttacksDiff=!0,a.dangerousAttacksDiffValue=ra):(a.dangerousAttacksDiff=!1,a.dangerousAttacksDiffValue=ra),e.t10=!0,e.next=e.t10===("complete"!==a.status)?487:e.t10===a.homeGoals>a.awayGoals?488:e.t10===(a.homeGoals===a.awayGoals)?508:e.t10===a.homeGoals2?a.over25PredictionOutcome="Won":a.over25PredictionOutcome="Lost"),"complete"===a.status&&a.homeGoals>0&&a.awayGoals>0?a.bttsOutcome="bttsWon":a.bttsOutcome="bttsLost",a.formHome=l,a.formAway=i,oa=parseInt(Me+Ee),oa,ca=parseInt(a.homeGoals+a.awayGoals),ca,1,Me<0&&(Me=0),Ee<0&&(Ee=0),"suspended"===a.status&&(Me="P",Ee="P"),(Me>Ee&&(a.homeOddsS[1])||Ee>Me&&(a.awayOddsS[1])||Me===Ee&&(a.drawOddsS[1]))&&(a.omit=!0),la=Math.abs(l.last10Points-i.last10Points),ia=Math.abs(i.last10Points-l.last10Points),da=Math.abs(l.XGDiffNonAverage-i.XGDiffNonAverage),ua=Math.abs(i.XGDiffNonAverage-l.XGDiffNonAverage),a.goalDiffHomeOrAwayComparison=parseFloat(l.goalDifferenceHomeOrAway)-parseFloat(i.goalDifferenceHomeOrAway),a.goalDifferenceComparison=parseFloat(l.goalDifference)-parseFloat(i.goalDifference),e.t11=!0,e.next=e.t11===Me>Ee?559:e.t11===Me=0?"+":"",v=Oe>=0?"+":"",p=(o/n*100).toFixed(1),b=(l/n*100).toFixed(1),!(n>0)){e.next=22;break}r.a.render(Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)(j,{className:"SuccessMeasure",text:"ROI for \n all ".concat(n," W/D/W \n outcomes: ").concat(h," ").concat(g.toFixed(2),"%")}),Object(i.jsx)("p",{children:"Correct W/D/W predictions: ".concat(l," (").concat(b,"%)")}),Object(i.jsx)("p",{children:"Exact scores predicted: ".concat(o," (").concat(p,"%)")}),Object(i.jsx)(j,{className:"SuccessMeasure",text:"Cumalative ROI for \n all ".concat(je," match outcomes: ").concat(v," ").concat(Oe.toFixed(2),"%")})]}),document.getElementById("successMeasure2")),e.next=23;break;case 22:return e.abrupt("return");case 23:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var ia,da,ua,ma,ga,ha=[],va=[],pa=[],ba=[],fa=[],Oa=[],ja=[],xa=[],ya=[],Aa=[],wa=[],_a=1,Ga=[];function Sa(e){return Ta.apply(this,arguments)}function Ta(){return(Ta=Object(l.a)(Object(c.a)().mark((function e(a){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return pa=[],_a=1,a.length>1&&N>0&&a.forEach((function(e){a.indexOf(e).65&&0!==a.homeOdds&&"N/A"!==a.fractionHome&&!1!==a.includeInMultis&&!0!==a.omit)){e.next=61;break}if(!("draw"!==a.prediction&&"suspended"!==a.status&&"canceled"!==a.status&&"notEnoughData"!==a.status&&a.homeOdds<3)){e.next=59;break}return e.t1="".concat(a.homeTeam," to win"),e.t2="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t3=a.fractionHome,e.t4=a.homeOdds,e.t5=Math.abs(a.teamComparisonScore),e.t6=a.teamComparisonScore,e.t7=a.predictionOutcome,e.t8=a.outcomeSymbol,e.t9=parseFloat,e.next=53,Ht(a.unroundedGoalsA,a.unroundedGoalsB);case 53:e.t10=e.sent,e.t11=(0,e.t9)(e.t10),e.t12=((a.unroundedGoalsA-a.unroundedGoalsB)*Math.abs(a.teamComparisonScore)).toFixed(2),e.t13=parseFloat(a.XGdifferentialValue),(i={team:e.t1,game:e.t2,odds:e.t3,rawOdds:e.t4,comparisonScore:e.t5,rawComparisonScore:e.t6,outcome:e.t7,outcomeSymbol:e.t8,goalDifferential:e.t11,experimentalCalc:e.t12,XGdifferentialValue:e.t13}).rawOdds>=1.25&&"awful"!==a.formHome.clinicalRating&&(ha.push(i),a.unroundedGoalsA-a.unroundedGoalsB>N&&ba.push(i));case 59:e.next=81;break;case 61:if(!(a.unroundedGoalsB-a.unroundedGoalsA>1.75&&0!==a.awayOdds&&"N/A"!==a.fractionAway&&!1!==a.includeInMultis&&!0!==a.omit)){e.next=81;break}if(!("draw"!==a.prediction&&"suspended"!==a.status&&"canceled"!==a.status&&"notEnoughData"!==a.status&&a.awayOdds<3.5)){e.next=81;break}return e.t14="".concat(a.awayTeam," to win"),e.t15="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t16=a.awayOdds,e.t17=a.fractionAway,e.t18=Math.abs(a.teamComparisonScore),e.t19=a.teamComparisonScore,e.t20=a.predictionOutcome,e.t21=a.outcomeSymbol,e.t22=parseFloat,e.next=74,Ht(a.unroundedGoalsB,a.unroundedGoalsA);case 74:e.t23=e.sent,e.t24=(0,e.t22)(e.t23),e.t25=e.t24-1,e.t26=((a.unroundedGoalsB-a.unroundedGoalsA)*Math.abs(a.teamComparisonScore)).toFixed(2),e.t27=parseFloat(a.XGdifferentialValue),(i={team:e.t14,game:e.t15,rawOdds:e.t16,odds:e.t17,comparisonScore:e.t18,rawComparisonScore:e.t19,outcome:e.t20,outcomeSymbol:e.t21,goalDifferential:e.t25,experimentalCalc:e.t26,XGdifferentialValue:e.t27}).rawOdds>=1.25&&"awful"!==a.formAway.clinicalRating&&(ha.push(i),a.unroundedGoalsB-a.unroundedGoalsA>2&&ba.push(i));case 81:if(!0===a.btts&&"suspended"!==a.status&&"canceled"!==a.status&&"notEnoughData"!==a.status&&wa.push(a),a.unroundedGoalsA+a.unroundedGoalsB>4&&a.goalsA+a.goalsB>2&&a.GoalsInGamesAverageHome>3&&a.GoalsInGamesAverageAway>3&&(d={game:"complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,team:a.homeTeam,decimalOdds:a.homeDoubleChance,rawOdds:a.over25Odds,odds:a.over25Odds,comparisonScore:a.teamComparisonScore,outcome:a.predictionOutcome,outcomeSymbol:a.over25PredictionOutcomeSymbol,doubleChanceOutcome:a.over25PredictionOutcome,goalTotalUnrounded:a.unroundedGoalsA+a.unroundedGoalsB},fa.push(d)),!0!==a.XGdifferential||"homeWin"!==a.prediction||"notEnoughData"===a.status||"suspended"===a.status||"canceled"===a.status){e.next=104;break}return e.t28="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t29="".concat(a.homeTeam," to win"),e.t30=a.homeOdds,e.t31=Math.abs(a.teamComparisonScore),e.t32=a.teamComparisonScore,e.t33=a.predictionOutcome,e.t34=a.outcomeSymbol,e.t35="".concat(a.homeTeam," to win"),e.t36=a.fractionHome,e.t37=a.awayTeam,e.t38=a.XGdifferentialValue,e.t39=parseFloat,e.next=98,Ht(a.unroundedGoalsA,a.unroundedGoalsB);case 98:e.t40=e.sent,e.t41=(0,e.t39)(e.t40),u={game:e.t28,team:e.t29,rawOdds:e.t30,comparisonScore:e.t31,rawComparisonScore:e.t32,outcome:e.t33,outcomeSymbol:e.t34,prediction:e.t35,odds:e.t36,otherTeam:e.t37,XGdifferentialValue:e.t38,goalDifferential:e.t41},Oa.push(u),e.next=123;break;case 104:if(!0!==a.XGdifferential||"awayWin"!==a.prediction||"notEnoughData"===a.status||"suspended"===a.status||"canceled"===a.status){e.next=123;break}return e.t42="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t43="".concat(a.awayTeam," to win"),e.t44=a.awayOdds,e.t45=Math.abs(a.teamComparisonScore),e.t46=a.teamComparisonScore,e.t47=a.predictionOutcome,e.t48=a.outcomeSymbol,e.t49="".concat(a.awayTeam," to win"),e.t50=a.fractionAway,e.t51=a.homeTeam,e.t52=a.XGdifferentialValue,e.t53=parseFloat,e.next=119,Ht(a.unroundedGoalsB,a.unroundedGoalsA);case 119:e.t54=e.sent,e.t55=(0,e.t53)(e.t54),u={game:e.t42,team:e.t43,rawOdds:e.t44,comparisonScore:e.t45,rawComparisonScore:e.t46,outcome:e.t47,outcomeSymbol:e.t48,prediction:e.t49,odds:e.t50,otherTeam:e.t51,XGdifferentialValue:e.t52,goalDifferential:e.t55},Oa.push(u);case 123:if(!0!==a.pointsDifferential||"homeWin"!==a.prediction||"notEnoughData"===a.status||"suspended"===a.status||"canceled"===a.status){e.next=144;break}return e.t56="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t57="".concat(a.homeTeam," to win"),e.t58=a.homeOdds,e.t59=Math.abs(a.teamComparisonScore),e.t60=a.teamComparisonScore,e.t61=a.predictionOutcome,e.t62=a.outcomeSymbol,e.t63="".concat(a.homeTeam," to win"),e.t64=a.fractionHome,e.t65=a.awayTeam,e.t66=a.pointsDifferentialValue,e.t67=parseFloat,e.next=138,Ht(a.unroundedGoalsA,a.unroundedGoalsB);case 138:e.t68=e.sent,e.t69=(0,e.t67)(e.t68),m={game:e.t56,team:e.t57,rawOdds:e.t58,comparisonScore:e.t59,rawComparisonScore:e.t60,outcome:e.t61,outcomeSymbol:e.t62,prediction:e.t63,odds:e.t64,otherTeam:e.t65,pointsDifferentialValue:e.t66,goalDifferential:e.t69},ya.push(m),e.next=163;break;case 144:if(!0!==a.XGdifferential||"awayWin"!==a.prediction||"notEnoughData"===a.status||"suspended"===a.status||"canceled"===a.status){e.next=163;break}return e.t70="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t71="".concat(a.awayTeam," to win"),e.t72=a.awayOdds,e.t73=Math.abs(a.teamComparisonScore),e.t74=a.teamComparisonScore,e.t75=a.predictionOutcome,e.t76=a.outcomeSymbol,e.t77="".concat(a.awayTeam," to win"),e.t78=a.fractionAway,e.t79=a.homeTeam,e.t80=a.pointsDifferentialValue,e.t81=parseFloat,e.next=159,Ht(a.unroundedGoalsB,a.unroundedGoalsA);case 159:e.t82=e.sent,e.t83=(0,e.t81)(e.t82),m={game:e.t70,team:e.t71,rawOdds:e.t72,comparisonScore:e.t73,rawComparisonScore:e.t74,outcome:e.t75,outcomeSymbol:e.t76,prediction:e.t77,odds:e.t78,otherTeam:e.t79,pointsDifferentialValue:e.t80,goalDifferential:e.t83},ya.push(m);case 163:if(!0!==a.rollingGoalDiff||"homeWin"!==a.prediction||"notEnoughData"===a.status||"suspended"===a.status||"canceled"===a.status){e.next=184;break}return e.t84="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t85="".concat(a.homeTeam," to win"),e.t86=a.homeOdds,e.t87=Math.abs(a.teamComparisonScore),e.t88=a.teamComparisonScore,e.t89=a.predictionOutcome,e.t90=a.outcomeSymbol,e.t91="".concat(a.homeTeam," to win"),e.t92=a.fractionHome,e.t93=a.awayTeam,e.t94=a.rollingGoalDiffValue,e.t95=parseFloat,e.next=178,Ht(a.unroundedGoalsA,a.unroundedGoalsB);case 178:e.t96=e.sent,e.t97=(0,e.t95)(e.t96),g={game:e.t84,team:e.t85,rawOdds:e.t86,comparisonScore:e.t87,rawComparisonScore:e.t88,outcome:e.t89,outcomeSymbol:e.t90,prediction:e.t91,odds:e.t92,otherTeam:e.t93,rollingGoalDiffValue:e.t94,goalDifferential:e.t97},ja.push(g),e.next=203;break;case 184:if(!0!==a.XGdifferential||"awayWin"!==a.prediction||"notEnoughData"===a.status||"suspended"===a.status||"canceled"===a.status){e.next=203;break}return e.t98="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t99="".concat(a.awayTeam," to win"),e.t100=a.awayOdds,e.t101=Math.abs(a.teamComparisonScore),e.t102=a.teamComparisonScore,e.t103=a.predictionOutcome,e.t104=a.outcomeSymbol,e.t105="".concat(a.awayTeam," to win"),e.t106=a.fractionAway,e.t107=a.homeTeam,e.t108=a.rollingGoalDiffValue,e.t109=parseFloat,e.next=199,Ht(a.unroundedGoalsB,a.unroundedGoalsA);case 199:e.t110=e.sent,e.t111=(0,e.t109)(e.t110),g={game:e.t98,team:e.t99,rawOdds:e.t100,comparisonScore:e.t101,rawComparisonScore:e.t102,outcome:e.t103,outcomeSymbol:e.t104,prediction:e.t105,odds:e.t106,otherTeam:e.t107,rollingGoalDiffValue:e.t108,goalDifferential:e.t111},ja.push(g);case 203:if(!0!==a.dangerousAttacksDiff||"homeWin"!==a.prediction||"notEnoughData"===a.status||"suspended"===a.status||"canceled"===a.status){e.next=224;break}return e.t112="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t113="".concat(a.homeTeam," to win"),e.t114=a.homeOdds,e.t115=Math.abs(a.teamComparisonScore),e.t116=a.teamComparisonScore,e.t117=a.predictionOutcome,e.t118=a.outcomeSymbol,e.t119="".concat(a.homeTeam," to win"),e.t120=a.fractionHome,e.t121=a.awayTeam,e.t122=a.rollingGoalDiffValue,e.t123=parseFloat,e.next=218,Ht(a.unroundedGoalsA,a.unroundedGoalsB);case 218:e.t124=e.sent,e.t125=(0,e.t123)(e.t124),h={game:e.t112,team:e.t113,rawOdds:e.t114,comparisonScore:e.t115,rawComparisonScore:e.t116,outcome:e.t117,outcomeSymbol:e.t118,prediction:e.t119,odds:e.t120,otherTeam:e.t121,rollingGoalDiffValue:e.t122,goalDifferential:e.t125},xa.push(h),e.next=243;break;case 224:if(!0!==a.XGdifferential||"awayWin"!==a.prediction||"notEnoughData"===a.status||"suspended"===a.status||"canceled"===a.status){e.next=243;break}return e.t126="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t127="".concat(a.awayTeam," to win"),e.t128=a.awayOdds,e.t129=Math.abs(a.teamComparisonScore),e.t130=a.teamComparisonScore,e.t131=a.predictionOutcome,e.t132=a.outcomeSymbol,e.t133="".concat(a.awayTeam," to win"),e.t134=a.fractionAway,e.t135=a.homeTeam,e.t136=a.rollingGoalDiffValue,e.t137=parseFloat,e.next=239,Ht(a.unroundedGoalsB,a.unroundedGoalsA);case 239:e.t138=e.sent,e.t139=(0,e.t137)(e.t138),h={game:e.t126,team:e.t127,rawOdds:e.t128,comparisonScore:e.t129,rawComparisonScore:e.t130,outcome:e.t131,outcomeSymbol:e.t132,prediction:e.t133,odds:e.t134,otherTeam:e.t135,rollingGoalDiffValue:e.t136,goalDifferential:e.t139},xa.push(h);case 243:Ga.push(a);case 244:case"end":return e.stop()}}),e)})));return function(a){return e.apply(this,arguments)}}()));case 16:return r.a.render(Object(i.jsx)(Kt,{matches:kt,result:!0,bool:s}),document.getElementById("FixtureContainer")),e.next=19,ca(kt);case 19:return e.next=21,Ca();case 21:return e.next=23,Sa(va);case 23:case"end":return e.stop()}}),e)}))),ka.apply(this,arguments)}function Ca(){return Na.apply(this,arguments)}function Na(){return(Na=Object(l.a)(Object(c.a)().mark((function e(){var a,t,s,n,r,o,l,i,d,u,m,g,h,v;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:va=ha.sort((function(e,a){return a.goalDifferential-e.goalDifferential})),ba.sort((function(e,a){return e.goalDifferential===a.goalDifferential?a.comparisonScore-e.comparisonScore:a.goalDifferential>e.goalDifferential?1:-1})),wa.sort((function(e,a){return a.combinedBTTS-e.combinedBTTS})),fa.sort((function(e,a){return a.goalTotalUnrounded-e.goalTotalUnrounded})),Oa.sort((function(e,a){return Math.abs(a.XGdifferentialValue)-Math.abs(e.XGdifferentialValue)})),ya.sort((function(e,a){return Math.abs(a.pointsDifferentialValue)-Math.abs(e.pointsDifferentialValue)})),ja.sort((function(e,a){return Math.abs(a.rollingGoalDiffValue)-Math.abs(e.rollingGoalDiffValue)})),xa.sort((function(e,a){return Math.abs(a.dangerousAttacksDiffValue)-Math.abs(e.dangerousAttacksDiffValue)})),Aa=[],ua=0,ma=0,ga="",e.t0=!0,e.next=e.t0===ha.length>=10?15:e.t0===ha.length>=9?22:e.t0===ha.length>=8?29:e.t0===ha.length>=7?36:e.t0===ha.length>=6?43:e.t0===ha.length>=5?50:e.t0===fa.length>=4?57:64;break;case 15:for(a=0;a<10;a++)t=ha[a],Aa.push(t);return ua=10,ga="45 8-folds, 10 9-folds and 1 10-fold",ia=Da(Aa,8,ma=.1),e.abrupt("break",65);case 22:for(s=0;s<9;s++)n=ha[s],Aa.push(n);return ua=9,ga="36 7-folds, 9 8-folds and 1 9-fold",ia=Da(Aa,7,ma=.1),e.abrupt("break",65);case 29:for(r=0;r<8;r++)o=ha[r],Aa.push(o);return ua=8,ga="28 6-folds, 8 7-folds and 1 8-fold",ia=Da(Aa,6,ma=.1),e.abrupt("break",65);case 36:for(l=0;l<7;l++)i=ha[l],Aa.push(i);return ua=7,ga="7 6-folds and 1 7-fold",ia=Da(Aa,6,ma=1),e.abrupt("break",65);case 43:for(d=0;d<6;d++)u=ha[d],Aa.push(u);return ua=6,ga="6 5-folds and 1 6-fold",ia=Da(Aa,5,ma=1),e.abrupt("break",65);case 50:for(m=0;m<5;m++)g=ha[m],Aa.push(g);return ua=5,ga="5 4-folds and 1 5-fold",ia=Da(Aa,4,ma=1),e.abrupt("break",65);case 57:for(h=0;h<4;h++)v=fa[h],Aa.push(v);return ua=4,ga="4 3-folds and 1 4-fold",ia=Da(Aa,3,ma=1),e.abrupt("break",65);case 64:return e.abrupt("break",65);case 65:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Fa(e){for(var a=1,t=0;t0?r.a.render(Object(i.jsx)("div",{className:"PredictionContainer",children:Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)(D,{}),Object(i.jsx)(C,{buttonText:"Build a multi",element:Object(i.jsxs)("ul",{className:"BestPredictions",id:"BestPredictions",children:[Object(i.jsx)("div",{className:"BestPredictionsExplainer",children:"Add or remove a selection using the buttons below. Predictions are ordered by confidence in the outcome."}),pa.map((function(e){return Object(i.jsxs)("li",{children:[Object(i.jsxs)("div",{children:[e.team,": ",e.odds," ",Object(i.jsx)("span",{className:e.outcome,children:e.outcomeSymbol})]}),Object(i.jsx)("div",{className:"TipGame",children:e.game})]},"".concat(e.game,"acca"))})),Object(i.jsx)("div",{className:"AccumulatedOdds",children:"Accumulator odds ~ : ".concat(Math.round(_a)-1,"/1")})]})})]})}),document.getElementById("bestPredictions")):r.a.render(Object(i.jsx)("div",{className:"PredictionContainer",children:Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)(D,{}),Object(i.jsx)(C,{buttonText:"Build a multi",element:Object(i.jsxs)("ul",{className:"BestPredictions",id:"BestPredictions",children:[Object(i.jsx)("h4",{className:"BestPredictionsExplainer",children:"No games fit the criteria"}),Object(i.jsx)("div",{className:"AccumulatedOdds",children:"Accumulator odds ~ : ".concat(Math.round(_a)-1,"/1")})]})})]})}),document.getElementById("bestPredictions")),Aa.length>4?r.a.render(Object(i.jsx)("div",{className:"PredictionContainer",children:Object(i.jsx)(s.Fragment,{children:Object(i.jsx)(C,{buttonText:"Exotic of the day",element:Object(i.jsxs)("ul",{className:"BestPredictions",id:"BestPredictions",children:[Object(i.jsxs)("h4",{className:"BestPredictionsExplainer",children:[Object(i.jsx)(Ra,{text:"".concat(ua," games: ").concat(ga,"\nStake per multi: ").concat(ma," units - ").concat(da," combinations\nTotal stake: ").concat((ma*da).toFixed(2)," unit(s)")}),"Potential winnings: ".concat(ia.toFixed(2)," units")]}),Aa.map((function(e){return Object(i.jsxs)("li",{children:[e.team,": ",e.odds," ",Object(i.jsx)("span",{className:e.outcome,children:e.outcomeSymbol}),Object(i.jsx)("div",{children:e.game})]},e.team)}))]})})})}),document.getElementById("exoticOfTheDay")):r.a.render(Object(i.jsx)("div",{className:"PredictionContainer",children:Object(i.jsx)(s.Fragment,{children:Object(i.jsx)(C,{buttonText:"Exotic of the day",element:Object(i.jsx)("ul",{className:"BestPredictions",id:"BestPredictions",children:Object(i.jsx)("h4",{className:"BestPredictionsExplainer",children:"Not enough games for this feature"})})})})}),document.getElementById("exoticOfTheDay")),fa.length>0?r.a.render(Object(i.jsx)("div",{children:Object(i.jsx)(s.Fragment,{children:Object(i.jsx)(C,{buttonText:"Over 2.5 goals tips",element:Object(i.jsxs)("ul",{className:"LongshotPredictions",id:"LongshotPredictions",children:[Object(i.jsx)("h4",{children:"Over 2.5 goals"}),fa.map((function(e){return Object(i.jsxs)("li",{children:[e.game," - Odds: ",e.odds," ",Object(i.jsx)("span",{className:"".concat(e.doubleChanceOutcome),children:e.outcomeSymbol})]},e.team)}))]})})})}),document.getElementById("longShots")):r.a.render(Object(i.jsx)("div",{children:Object(i.jsx)(s.Fragment,{children:Object(i.jsx)(C,{buttonText:"Over 2.5 goals tips",element:Object(i.jsx)("ul",{className:"LongshotPredictions",id:"LongshotPredictions",children:Object(i.jsx)("h4",{children:"No games fit the criteria"})})})})}),document.getElementById("longShots")),wa.length>0?r.a.render(Object(i.jsx)("div",{children:Object(i.jsx)(s.Fragment,{children:Object(i.jsx)(C,{buttonText:"BTTS games",element:Object(i.jsxs)("ul",{className:"BTTSGames",id:"BTTSGames",children:[Object(i.jsx)("h4",{children:"Games with highest chance of BTTS"}),wa.map((function(e){return Object(i.jsxs)("li",{children:["".concat(e.game," odds: ").concat(e.bttsFraction)," ",Object(i.jsx)("span",{className:e.bttsOutcome,children:e.bttsOutcomeSymbol})]},e.game)}))]})})})}),document.getElementById("BTTS")):r.a.render(Object(i.jsx)("div",{children:Object(i.jsx)(s.Fragment,{children:Object(i.jsx)(C,{buttonText:"BTTS games",element:Object(i.jsx)("ul",{className:"BTTSGames",id:"BTTSGames",children:Object(i.jsx)("h4",{children:"No games fit the criteria"})})})})}),document.getElementById("BTTS")),r.a.render(Object(i.jsxs)("div",{children:[Object(i.jsx)(C,{buttonText:"XG tips",element:Object(i.jsx)(W,{element:Oa.length>0?Object(i.jsxs)("ul",{className:"XGDiffTips",id:"XGDiffTips",children:[Object(i.jsx)("h4",{children:"Games with greatest XG Differentials"}),Oa.map((function(e){return Object(i.jsxs)("li",{children:[e.game," | ",e.prediction," ",e.odds," ",Object(i.jsx)("span",{className:e.outcome,children:e.outcomeSymbol})]},e.game)}))]}):Object(i.jsxs)("ul",{className:"XGDiffTips",id:"XGDiffTips",children:[Object(i.jsx)("h4",{children:"Games with greatest XG Differentials"}),Object(i.jsx)("li",{children:"Sorry, no games fit this criteria today"},"noPPGDiff")]}),element2:ya.length>0?Object(i.jsxs)("ul",{className:"XGDiffTips",id:"XGDiffTips",children:[Object(i.jsx)("h4",{children:"Games with greatest points per game differentials (last 10)"}),ya.map((function(e){return Object(i.jsxs)("li",{children:[e.game," | ",e.prediction," ",e.odds," ",Object(i.jsx)("span",{className:e.outcome,children:e.outcomeSymbol})]},e.game)}))]}):Object(i.jsxs)("ul",{className:"XGDiffTips",id:"XGDiffTips",children:[Object(i.jsx)("h4",{children:"Games with greatest points per game differentials (last 10)"}),Object(i.jsx)("li",{children:"Sorry, no games fit this criteria today"},"noPPGDiff")]}),element3:ja.length>0?Object(i.jsxs)("ul",{className:"XGDiffTips",id:"XGDiffTips",children:[Object(i.jsx)("h4",{children:"Games with greatest rolling goal difference differentials"}),ja.map((function(e){return Object(i.jsxs)("li",{children:[e.game," | ",e.prediction," ",e.odds," ",Object(i.jsx)("span",{className:e.outcome,children:e.outcomeSymbol})]},e.game)}))]}):Object(i.jsxs)("ul",{className:"XGDiffTips",id:"XGDiffTips",children:[Object(i.jsx)("h4",{children:"Games with greatest rolling goal difference differentials"}),Object(i.jsx)("li",{children:"Sorry, no games fit this criteria today"},"noPPGDiff")]}),element4:xa.length>0?Object(i.jsxs)("ul",{className:"XGDiffTips",id:"XGDiffTips",children:[Object(i.jsx)("h4",{children:"Games with greatest average dangerous attacks differentials"}),xa.map((function(e){return Object(i.jsxs)("li",{children:[e.game," | ",e.prediction," ",e.odds," ",Object(i.jsx)("span",{className:e.outcome,children:e.outcomeSymbol})]},e.game)}))]}):Object(i.jsxs)("ul",{className:"XGDiffTips",id:"XGDiffTips",children:[Object(i.jsx)("h4",{children:"Games with greatest average dangerous attacks differentials"}),Object(i.jsx)("li",{children:"Sorry, no games fit this criteria today"},"noPPGDiff")]}),element5:Object(i.jsxs)("div",{className:"DonationButton",children:[Object(i.jsx)("h2",{children:"Help with running costs"}),Object(i.jsx)("h4",{children:"Monthly costs are rising and each donation helps keep XG Tipping free to use"}),Object(i.jsx)(U,{buttonText:"No sign up donation"})]})})}),Object(i.jsxs)("div",{className:"FiltersSelected",children:[Object(i.jsx)("h4",{children:"Filters selected:"}),Object(i.jsxs)("ul",{className:"FiltersSelectedList",children:[Object(i.jsxs)("li",{children:["Minimum goal difference spread: ",J]}),Object(i.jsxs)("li",{children:["Minimum goal difference spread (home or away only): ",K]}),Object(i.jsxs)("li",{children:["Minimum XG difference spread: ",z]}),Object(i.jsxs)("li",{children:["Minimum PPG difference spread: ",Y]}),Object(i.jsxs)("li",{children:["Odds range: ",S[0]," - ",S[1]]})]})]})]}),document.getElementById("insights"));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var Ia=t(57),Ma=t(29),Wa=t(131),Ea=t(133),Va=t(147),Ua=t(129),za=t(132),Ja=t(128),Ka=t(130),Ya=!1,qa=!1,Za="\u25b2",Qa=Object(Ma.a)((function(e){return{head:{backgroundColor:"rgba(226, 226, 226, 1)",color:"white",padding:"0.35em",paddingTop:"0.75em",paddingBottom:"0.75em",textAlign:"left",fontSize:"1.9em",fontFamily:"inherit",margin:"none"},body:{fontSize:"1.9em",textAlign:"left",fontFamily:"inherit",padding:"0.5em",paddingTop:"0.75em",paddingBottom:"0.75em",margin:"none",color:"#030061"}}}))(Va.a),$a=Object(Ma.a)((function(e){return{head:{backgroundColor:"white",color:"#030061",padding:"0.5em",paddingTop:"1em",paddingBottom:"1em",textAlign:"center",fontSize:"1.9em",fontFamily:"inherit",margin:"none"},body:{fontSize:"1.9em",textAlign:"center",fontFamily:"inherit",padding:"0.35em",paddingTop:"1em",paddingBottom:"1em",margin:"none",color:"#030061"}}}))(Va.a),et=Object(Ma.a)((function(e){return{root:{"&:nth-of-type(odd)":{backgroundColor:"#rgba(226, 226, 226, 0.424)",textAlign:"center"},"&:nth-of-type(even)":{backgroundColor:"#rgba(226, 226, 226, 1)",textAlign:"center"}}}}))(Ja.a);function at(e){var a;return"W"===e?a="winLeague":"D"===e?a="drawLeague":"L"===e&&(a="lossLeague"),a}function tt(e){var a=Object(s.useState)(!1),t=Object(o.a)(a,2);Ya=t[0],qa=t[1];var n,r=e.Teams.map((function(a,t){return Object(i.jsxs)(et,{children:[Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(t+1)}),Object(i.jsx)(Qa,{component:"th",scope:"row",style:{width:"15em"},children:"".concat(a.Name)}),Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(a.Played)}),Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(a.Wins)}),Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(a.Draws)}),Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(a.Losses)}),Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(a.For)}),Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(a.Against)}),Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(a.GoalDifference)}),Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(a.Points)}),Object(i.jsxs)($a,{component:"th",scope:"row",style:{textAlign:"center"},children:[Object(i.jsx)("span",{className:at(a.Form[0]),children:void 0!==a.Form[0]?a.Form[0]:""}),Object(i.jsx)("span",{className:at(a.Form[1]),children:void 0!==a.Form[1]?a.Form[1]:""}),Object(i.jsx)("span",{className:at(a.Form[2]),children:void 0!==a.Form[2]?a.Form[2]:""}),Object(i.jsx)("span",{className:at(a.Form[3]),children:void 0!==a.Form[3]?a.Form[3]:""}),Object(i.jsx)("span",{className:at(a.Form[4]),children:void 0!==a.Form[4]?a.Form[4]:""})]})]},"".concat(e.Key,"row").concat(t))})),d=[];e.Results&&e.Results.forEach((function(e){n=Object(i.jsxs)("div",{children:[Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_xg}),Object(i.jsx)("span",{className:"column",children:"XG"}),Object(i.jsx)("span",{className:"column",children:e.team_b_xg})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_shots}),Object(i.jsx)("span",{className:"column",children:"Shots"}),Object(i.jsx)("span",{className:"column",children:e.team_b_shots})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_shotsOnTarget}),Object(i.jsx)("span",{className:"column",children:"SOT"}),Object(i.jsx)("span",{className:"column",children:e.team_b_shotsOnTarget})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_dangerous_attacks}),Object(i.jsx)("span",{className:"column",children:"Dangerous Attacks"}),Object(i.jsx)("span",{className:"column",children:e.team_b_dangerous_attacks})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsxs)("span",{className:"column",children:[e.team_a_possession,"%"]}),Object(i.jsx)("span",{className:"column",children:"Possession"}),Object(i.jsxs)("span",{className:"column",children:[e.team_b_possession,"%"]})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_red_cards}),Object(i.jsx)("span",{className:"column",children:"Red cards"}),Object(i.jsx)("span",{className:"column",children:e.team_b_red_cards})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.odds_ft_1}),Object(i.jsx)("span",{className:"column",children:"Odds (pre-match)"}),Object(i.jsx)("span",{className:"column",children:e.odds_ft_2})]})]}),d.push(Object(i.jsx)(C,{classNameButton:"ResultButton",buttonText:Object(i.jsxs)("div",{className:"ResultRowOverview",children:[Object(i.jsx)("div",{className:"columnOverviewHome",children:e.home_name}),Object(i.jsxs)("span",{className:"columnOverviewScore",children:[e.homeGoalCount," : ",e.awayGoalCount]}),Object(i.jsx)("div",{className:"columnOverviewAway",children:e.away_name})]}),element:n}))}));var u=[];function m(a){return e.Teams.find((function(e){return e.ID===a})).Name}function g(e,a,t){return h.apply(this,arguments)}function h(){return(h=Object(l.a)(Object(c.a)().mark((function e(a,t,s){var n;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n="desc"===s?a.sort((function(e,a){return a[t]-e[t]})):a.sort((function(e,a){return e[t]-a[t]})),qa(!Ya),e.abrupt("return",n);case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}if(e.LastWeeksResults&&e.LastWeeksResults.forEach((function(e){n=Object(i.jsxs)("div",{children:[Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_xg}),Object(i.jsx)("span",{className:"column",children:"XG"}),Object(i.jsx)("span",{className:"column",children:e.team_b_xg})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_shots}),Object(i.jsx)("span",{className:"column",children:"Shots"}),Object(i.jsx)("span",{className:"column",children:e.team_b_shots})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_shotsOnTarget}),Object(i.jsx)("span",{className:"column",children:"SOT"}),Object(i.jsx)("span",{className:"column",children:e.team_b_shotsOnTarget})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_dangerous_attacks}),Object(i.jsx)("span",{className:"column",children:"Dangerous Attacks"}),Object(i.jsx)("span",{className:"column",children:e.team_b_dangerous_attacks})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_possession}),Object(i.jsx)("span",{className:"column",children:"Possession"}),Object(i.jsx)("span",{className:"column",children:e.team_b_possession})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_red_cards}),Object(i.jsx)("span",{className:"column",children:"Red cards"}),Object(i.jsx)("span",{className:"column",children:e.team_b_red_cards})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.odds_ft_1}),Object(i.jsx)("span",{className:"column",children:"Odds (pre-match)"}),Object(i.jsx)("span",{className:"column",children:e.odds_ft_2})]})]}),u.push(Object(i.jsx)(C,{classNameButton:"ResultButton",buttonText:Object(i.jsxs)("div",{className:"ResultRowOverview",children:[Object(i.jsx)("div",{className:"columnOverviewHome",children:e.home_name}),Object(i.jsxs)("span",{className:"columnOverviewScore",children:[e.homeGoalCount," : ",e.awayGoalCount]}),Object(i.jsx)("div",{className:"columnOverviewAway",children:e.away_name})]}),element:n}))})),e.GamesPlayed>3&&7956!==e.Teams[0].LeagueID&&6969!==e.Teams[0].LeagueID&&11084!==e.Teams[0].LeagueID)for(var v=0;v0&&!0===a)){e.next=6;break}return e.next=4,fetch("".concat("https://api.xgtipping.com/","results"),{method:"DELETE",headers:{Accept:"application/json","Content-Type":"application/json"}}).then(Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch("".concat("https://api.xgtipping.com/","results"),{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(Lt)});case 2:case"end":return e.stop()}}),e)}))));case 4:e.next=7;break;case 6:console.log("EMPTY RESULTS");case 7:case"end":return e.stop()}}),e)})));return function(a){return e.apply(this,arguments)}}(),Yt=!0,r.a.render(Object(i.jsxs)("div",{children:[Object(i.jsx)("div",{className:"LoadingText",children:"Loading all league, fixture & form data, please be patient..."}),Object(i.jsx)(Ia.a,{height:"3em",fill:"#030061"})]}),document.getElementById("Loading")),r.a.render(Object(i.jsx)("div",{}),document.getElementById("GeneratePredictions")),r.a.render(Object(i.jsx)("div",{}),document.getElementById("successMeasure2")),r.a.render(Object(i.jsx)("div",{}),document.getElementById("bestPredictions")),r.a.render(Object(i.jsx)("div",{}),document.getElementById("exoticOfTheDay")),r.a.render(Object(i.jsx)("div",{}),document.getElementById("insights")),r.a.render(Object(i.jsx)("div",{}),document.getElementById("longShots")),r.a.render(Object(i.jsx)("div",{}),document.getElementById("BTTS")),r.a.render(Object(i.jsx)("div",{}),document.getElementById("draws")),p="".concat("https://api.xgtipping.com/","matches/").concat(o),b="".concat("https://api.xgtipping.com/","form/").concat(t),kt=[],Pt=[],e.next=19,fetch("".concat("https://api.xgtipping.com/","leagues/").concat(m));case 19:return nt=e.sent,r.a.render(Object(i.jsx)("div",{}),document.getElementById("FixtureContainer")),e.next=23,fetch(p);case 23:return st=e.sent,e.next=26,st.json().then((function(e){Pt=Array.from(e.data)}));case 26:return O=[],Bt=[],w=!1,e.next=31,fetch(b);case 31:if(201!==(_=e.sent).status&&200!==_.status){e.next=37;break}return e.next=35,_.json().then((function(e){O=Array.from(e.allForm),j=!0,A=!0,Bt=O}));case 35:e.next=39;break;case 37:j=!1,A=!1;case 39:for(Dt=[],G=0;G<_n.length;G++)rt=_n[G].element.id,Dt.push(rt);return S=[],Ft=[],e.next=45,fetch("".concat("https://api.xgtipping.com/","results"));case 45:if(P=e.sent,200!==nt.status||201!==P.status){e.next=68;break}return console.log("Not fetching leagues"),e.next=50,nt.json().then((function(e){Ft=Array.from(e.leagueArray)}));case 50:return v(!1),e.next=53,P.json().then((function(e){Lt=Array.from(e)}));case 53:return console.log(Lt),w=!0,Et(Ft,Dt,Lt),Ct=[],e.next=59,fetch("https://www.sofascore.com/api/v1/sport/football/scheduled-events/".concat(g));case 59:return k=e.sent,e.next=62,k.json().then((function(e){e.events.forEach((function(e){Ct.push({homeTeam:e.homeTeam.name,awayTeam:e.awayTeam.name,id:e.id,time:e.startTimestamp,homeGoals:void 0!=e.homeScore.display?e.homeScore.display:"-",awayGoals:void 0!=e.awayScore.display?e.awayScore.display:"-"})}))}));case 62:return e.next=64,fetch("");case 64:e.sent,console.log(Ct),e.next=69;break;case 68:return e.delegateYield(Object(c.a)().mark((function e(){var a,t,s,n,r,o,l,i,u,g,h,p,b,f,O,j,y,A,_;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:Lt=[],console.log("Fetching leagues"),a=0;case 3:if(!(a<_n.length)){e.next=13;break}return e.next=6,fetch("".concat("https://api.xgtipping.com/","tables/").concat(_n[a].element.id,"/").concat(m));case 6:return nt=e.sent,e.next=9,nt.json().then((function(e){Ft.push(e)}));case 9:w=!1;case 10:a++,e.next=3;break;case 13:t=((new Date).getTime()/1e3).toFixed(0),s=t-23778463,n=Object(x.a)(_n),e.prev=16,n.s();case 18:if((r=n.n()).done){e.next=50;break}return o=r.value,e.next=22,fetch("".concat("https://api.xgtipping.com/","leagueFixtures/").concat(o.element.id));case 22:return l=e.sent,e.next=25,l.json();case 25:if(i=e.sent,u=void 0,g=void 0,!(i.pager.current_pages})),j=O.sort((function(e,a){return e.date_unix-a.date_unix})),g=j.slice(-600),u=g,e.next=45;break;case 43:u=i.data.filter((function(e){return"complete"===e.status})),d&&(y=u.filter((function(e){return e.date_unix>s})),u=y.slice(-600));case 45:A=u.map((function(e){return{home_name:e.home_name,away_name:e.away_name,homeGoalCount:e.homeGoalCount,awayGoalCount:e.awayGoalCount,date_unix:e.date_unix,team_a_xg:e.team_a_xg,team_b_xg:e.team_b_xg,odds_ft_1:e.odds_ft_1,odds_ft_2:e.odds_ft_2,team_a_shots:e.team_a_shots,team_b_shots:e.team_b_shots,team_a_corners:e.team_a_corners,team_b_corners:e.team_b_corners,team_a_shotsOnTarget:e.team_a_shotsOnTarget,team_b_shotsOnTarget:e.team_b_shotsOnTarget,team_a_red_cards:e.team_a_red_cards,team_b_red_cards:e.team_b_red_cards,team_a_possession:e.team_a_possession,team_b_possession:e.team_b_possession,team_a_dangerous_attacks:e.team_a_dangerous_attacks,team_b_dangerous_attacks:e.team_b_dangerous_attacks,pre_match_teamA_overall_ppg:e.pre_match_teamA_overall_ppg,pre_match_teamB_overall_ppg:e.pre_match_teamB_overall_ppg,game_week:e.game_week}})),_={name:o.name,id:o.element.id,fixtures:A},Lt.push(_);case 48:e.next=18;break;case 50:e.next=55;break;case 52:e.prev=52,e.t0=e.catch(16),n.e(e.t0);case 55:return e.prev=55,n.f(),e.finish(55);case 58:v(!0),Et(Ft,Dt,Lt);case 60:case"end":return e.stop()}}),e,null,[[16,52,55,58]])}))(),"t0",69);case 69:for(F=0;F=10?(ct=ft.slice(-3),it=ft.slice(-5),ut=ft.slice(-6),gt=ft.slice(-10),lt=Ot.slice(-3),dt=Ot.slice(-5),mt=Ot.slice(-6),ht=Ot.slice(-10),vt="League",xt=jt,At=yt,_t=wt,St=Gt):ft.length>=6?(ct=ft.slice(-3),it=ft.slice(-5),ut=ft.slice(-6),gt=Array.from(R),lt=Ot.slice(-3),dt=Ot.slice(-5),mt=Ot.slice(-6),ht=Array.from(B),vt="League",xt=jt,At=yt,_t=wt,St=Gt):ft.length>=5?(ct=ft.slice(-3),it=ft.slice(-5),ut=Array.from(L),gt=Array.from(R),lt=Ot.slice(-3),dt=Ot.slice(-5),mt=Array.from(H),ht=Array.from(B),vt="League",xt=jt,At=yt,_t=wt,St=Gt):(ct=[F[2],F[3],F[4]],it=Array.from(F),ut=Array.from(L),gt=Array.from(R),lt=[D[2],D[3],D[4]],dt=Array.from(D),mt=Array.from(H),ht=Array.from(B),vt="All",xt=void 0,At=void 0,_t=void 0,St=void 0),pt=Array.from(X),bt=Array.from(I),0!==d&&"Domestic League"===f[0].data[0].season_format||(d="N/A",u="N/A",w="",_=""),0!==A&&"Domestic League"===f[0].data[0].season_format||(A="N/A",m="N/A",G="",T=""),e.t2=Bt,e.t3=r.id,e.t4=r.homeId,e.t5=r.awayId,e.t6=rt,e.t7=r.homeTeam,e.t8={XGOverall:parseFloat(f[0].data[0].stats.xg_for_avg_overall),XG:parseFloat(f[0].data[0].stats.xg_for_avg_home),ScoredOverall:parseFloat(f[0].data[0].stats.seasonScoredNum_overall),ScoredAverage:parseFloat(f[0].data[0].stats.seasonScoredAVG_home),PlayedHome:parseFloat(f[0].data[0].stats.seasonMatchesPlayed_home),PlayedAway:parseFloat(f[0].data[0].stats.seasonMatchesPlayed_away),ConcededOverall:parseFloat(f[0].data[0].stats.seasonConcededNum_overall),ConcededAverage:parseFloat(f[0].data[0].stats.seasonConcededAVG_home),XGAgainstAvgOverall:parseFloat(f[0].data[0].stats.xg_against_avg_overall),XGAgainstAverage:parseFloat(f[0].data[0].stats.xg_against_avg_home),CleanSheetPercentage:parseFloat(f[0].data[0].stats.seasonCSPercentage_overall),AveragePossessionOverall:parseFloat(f[0].data[0].stats.possessionAVG_overall),AveragePossession:parseFloat(f[0].data[0].stats.possessionAVG_home),AverageShotsOnTargetOverall:parseFloat(f[0].data[0].stats.shotsOnTargetAVG_overall),AverageShotsOnTarget:parseFloat(f[0].data[0].stats.shotsOnTargetAVG_home),AverageDangerousAttacksOverall:parseFloat(f[0].data[0].stats.dangerous_attacks_avg_overall),PPG:parseFloat(f[0].data[0].stats.seasonPPG_overall),AttacksHome:parseFloat(f[0].data[0].stats.attacks_avg_home),AttacksAway:parseFloat(f[0].data[0].stats.attacks_avg_away),AverageDangerousAttacks:parseFloat(f[0].data[0].stats.dangerous_attacks_avg_home),homeAttackAdvantage:parseFloat(f[0].data[0].stats.homeAttackAdvantage),homeDefenceAdvantage:parseFloat(f[0].data[0].stats.homeDefenceAdvantage),BTTSPercentage:parseInt(f[0].data[0].stats.seasonBTTSPercentage_home),LeagueOrAll:vt,LeaguePosition:"".concat(d).concat(w),homeRawPosition:l.rawPosition?l.rawPosition:0,homeTeamHomePositionRaw:u,LeagueAverageGoals:xt,LeagueAverageConceded:At},e.t9={XGOverall:parseFloat(f[0].data[1].stats.xg_for_avg_overall),XG:parseFloat(f[0].data[1].stats.xg_for_avg_home),ScoredOverall:parseFloat(f[0].data[1].stats.seasonScoredNum_overall),ScoredAverage:parseFloat(f[0].data[1].stats.seasonScoredAVG_home),PlayedHome:parseFloat(f[0].data[1].stats.seasonMatchesPlayed_home),PlayedAway:parseFloat(f[0].data[1].stats.seasonMatchesPlayed_away),ConcededOverall:parseFloat(f[0].data[1].stats.seasonConcededNum_overall),ConcededAverage:parseFloat(f[0].data[1].stats.seasonConcededAVG_home),XGAgainstAvgOverall:parseFloat(f[0].data[1].stats.xg_against_avg_overall),XGAgainstAverage:parseFloat(f[0].data[1].stats.xg_against_avg_home),CleanSheetPercentage:parseFloat(f[0].data[1].stats.seasonCSPercentage_overall),AveragePossessionOverall:parseFloat(f[0].data[1].stats.possessionAVG_overall),AveragePossession:parseFloat(f[0].data[1].stats.possessionAVG_home),AverageShotsOnTargetOverall:parseFloat(f[0].data[1].stats.shotsOnTargetAVG_overall),AverageShotsOnTarget:parseFloat(f[0].data[1].stats.shotsOnTargetAVG_home),AverageDangerousAttacksOverall:parseFloat(f[0].data[1].stats.dangerous_attacks_avg_overall),PPG:parseFloat(f[0].data[1].stats.seasonPPG_overall),AttacksHome:parseFloat(f[0].data[1].stats.attacks_avg_home),AttacksAway:parseFloat(f[0].data[1].stats.attacks_avg_away),AverageDangerousAttacks:parseFloat(f[0].data[1].stats.dangerous_attacks_avg_home),homeAttackAdvantage:parseFloat(f[0].data[1].stats.homeAttackAdvantage),homeDefenceAdvantage:parseFloat(f[0].data[1].stats.homeDefenceAdvantage),BTTSPercentage:parseInt(f[0].data[1].stats.seasonBTTSPercentage_home),LeagueOrAll:vt,LeaguePosition:"".concat(d).concat(w),homeRawPosition:l.rawPosition?l.rawPosition:0,homeTeamHomePositionRaw:u,LeagueAverageGoals:xt,LeagueAverageConceded:At},e.t10=parseFloat(f[0].data[2].stats.xg_for_avg_overall),e.t11=parseFloat(f[0].data[2].stats.xg_for_avg_home),e.t12=parseFloat(f[0].data[2].stats.seasonScoredNum_overall),e.t13=parseFloat(f[0].data[2].stats.seasonScoredAVG_home),e.t14=parseFloat(f[0].data[2].stats.seasonMatchesPlayed_home),e.t15=parseFloat(f[0].data[2].stats.seasonMatchesPlayed_away),e.t16=parseFloat(f[0].data[2].stats.seasonConcededNum_overall),e.t17=parseFloat(f[0].data[2].stats.seasonConcededAVG_home),e.t18=parseFloat(f[0].data[2].stats.xg_against_avg_overall),e.t19=parseFloat(f[0].data[2].stats.xg_against_avg_home),e.t20=parseFloat(f[0].data[2].stats.seasonCSPercentage_overall),e.t21=parseFloat(f[0].data[2].stats.possessionAVG_overall),e.t22=parseFloat(f[0].data[2].stats.possessionAVG_home),e.t23=parseFloat(f[0].data[2].stats.shotsOnTargetAVG_overall),e.t24=parseFloat(f[0].data[2].stats.shotsOnTargetAVG_home),e.t25=parseFloat(f[0].data[2].stats.shotsAVG_overall),e.t26=parseFloat(f[0].data[2].stats.shotsAVG_home),e.t27=parseFloat(f[0].data[2].stats.dangerous_attacks_avg_overall),e.t28=parseFloat(f[0].data[2].stats.seasonPPG_overall),e.t29=parseFloat(f[0].data[2].stats.attacks_avg_home),e.t30=parseFloat(f[0].data[2].stats.attacks_avg_away),e.t31=parseFloat(f[0].data[2].stats.dangerous_attacks_avg_home),e.t32=parseFloat(f[0].data[2].stats.homeAttackAdvantage),e.t33=parseFloat(f[0].data[2].stats.homeDefenceAdvantage),e.t34=parseInt(f[0].data[2].stats.seasonBTTSPercentage_home),e.t35=ct.reverse(),e.t36=it.reverse(),e.t37=ut.reverse(),e.t38=gt.reverse(),e.t39=vt,e.t40="".concat(d).concat(w),e.t41=l.rawPosition?l.rawPosition:0,e.t42=u,e.t43=P,e.t44=g,e.t45=p,e.t46=O,e.t47=pt,e.t48=f[0].data[2].stats.seasonGoalDifference_overall,e.t49=f[0].data[2].stats.seasonGoalDifference_home,e.t50=f[0].data[2].stats.seasonBTTSPercentage_overall,e.t51=f[0].data[2].stats.seasonBTTSPercentage_home,e.t52=f[0].data[2].stats.cardsTotal_overall,e.t53=f[0].data[2].stats.cornersAVG_overall,e.t54=f[0].data[2].stats.scoredBothHalvesPercentage_overall,e.next=172,Mt(f[0].data[0].last_updated_match_timestamp);case 172:return e.t55=e.sent,e.t56=ft,e.t57=xt,e.t58=At,e.t59={XGOverall:e.t10,XG:e.t11,ScoredOverall:e.t12,ScoredAverage:e.t13,PlayedHome:e.t14,PlayedAway:e.t15,ConcededOverall:e.t16,ConcededAverage:e.t17,XGAgainstAvgOverall:e.t18,XGAgainstAverage:e.t19,CleanSheetPercentage:e.t20,AveragePossessionOverall:e.t21,AveragePossession:e.t22,AverageShotsOnTargetOverall:e.t23,AverageShotsOnTarget:e.t24,AverageShots:e.t25,AverageShotsHomeOrAway:e.t26,AverageDangerousAttacksOverall:e.t27,PPG:e.t28,AttacksHome:e.t29,AttacksAway:e.t30,AverageDangerousAttacks:e.t31,homeAttackAdvantage:e.t32,homeDefenceAdvantage:e.t33,BTTSPercentage:e.t34,lastThreeForm:e.t35,LastFiveForm:e.t36,LastSixForm:e.t37,LastTenForm:e.t38,LeagueOrAll:e.t39,LeaguePosition:e.t40,homeRawPosition:e.t41,homeTeamHomePositionRaw:e.t42,SeasonPPG:e.t43,WinPercentage:e.t44,LossPercentage:e.t45,DrawPercentage:e.t46,formRun:e.t47,goalDifference:e.t48,goalDifferenceHomeOrAway:e.t49,BttsPercentage:e.t50,BttsPercentageHomeOrAway:e.t51,CardsTotal:e.t52,CornersAverage:e.t53,ScoredBothHalvesPercentage:e.t54,LastMatch:e.t55,WDLRecord:e.t56,LeagueAverageGoals:e.t57,LeagueAverageConceded:e.t58},e.t60={teamName:e.t7,0:e.t8,1:e.t9,2:e.t59},e.t61=r.awayTeam,e.t62={XGOverall:parseFloat(f[1].data[0].stats.xg_for_avg_overall),XG:parseFloat(f[1].data[0].stats.xg_for_avg_away),ScoredOverall:parseFloat(f[1].data[0].stats.seasonScoredNum_overall),ScoredAverage:parseFloat(f[1].data[0].stats.seasonScoredAVG_away),PlayedHome:parseFloat(f[1].data[0].stats.seasonMatchesPlayed_home),PlayedAway:parseFloat(f[1].data[0].stats.seasonMatchesPlayed_away),ConcededOverall:parseFloat(f[1].data[0].stats.seasonConcededNum_overall),ConcededAverage:parseFloat(f[1].data[0].stats.seasonConcededAVG_away),XGAgainstAvgOverall:parseFloat(f[1].data[0].stats.xg_against_avg_overall),XGAgainstAverage:parseFloat(f[1].data[0].stats.xg_against_avg_away),CleanSheetPercentage:parseFloat(f[1].data[0].stats.seasonCSPercentage_overall),AveragePossessionOverall:parseFloat(f[1].data[0].stats.possessionAVG_overall),AveragePossession:parseFloat(f[1].data[0].stats.possessionAVG_away),AverageShotsOnTargetOverall:parseFloat(f[1].data[0].stats.shotsOnTargetAVG_overall),AverageShotsOnTarget:parseFloat(f[1].data[0].stats.shotsOnTargetAVG_away),AverageDangerousAttacksOverall:parseFloat(f[1].data[0].stats.dangerous_attacks_avg_overall),PPG:parseFloat(f[1].data[0].stats.seasonPPG_overall),AttacksAverage:parseFloat(f[1].data[0].stats.attacks_avg_away),AverageDangerousAttacks:parseFloat(f[1].data[0].stats.dangerous_attacks_avg_away),BTTSPercentage:parseInt(f[1].data[0].stats.seasonBTTSPercentage_away),LeagueOrAll:vt,LeaguePosition:"".concat(A).concat(G),awayRawPosition:i.rawPosition?i.rawPosition:0,awayTeamAwayPositionRaw:m,LeagueAverageGoals:_t,LeagueAverageConceded:St},e.t63={XGOverall:parseFloat(f[1].data[1].stats.xg_for_avg_overall),XG:parseFloat(f[1].data[1].stats.xg_for_avg_away),ScoredOverall:parseFloat(f[1].data[1].stats.seasonScoredNum_overall),ScoredAverage:parseFloat(f[1].data[1].stats.seasonScoredAVG_away),PlayedHome:parseFloat(f[1].data[1].stats.seasonMatchesPlayed_home),PlayedAway:parseFloat(f[1].data[1].stats.seasonMatchesPlayed_away),ConcededOverall:parseFloat(f[1].data[1].stats.seasonConcededNum_overall),ConcededAverage:parseFloat(f[1].data[1].stats.seasonConcededAVG_away),XGAgainstAvgOverall:parseFloat(f[1].data[1].stats.xg_against_avg_overall),XGAgainstAverage:parseFloat(f[1].data[1].stats.xg_against_avg_away),CleanSheetPercentage:parseFloat(f[1].data[1].stats.seasonCSPercentage_overall),AveragePossessionOverall:parseFloat(f[1].data[1].stats.possessionAVG_overall),AveragePossession:parseFloat(f[1].data[1].stats.possessionAVG_away),AverageShotsOnTargetOverall:parseFloat(f[1].data[1].stats.shotsOnTargetAVG_overall),AverageShotsOnTarget:parseFloat(f[1].data[1].stats.shotsOnTargetAVG_away),AverageDangerousAttacksOverall:parseFloat(f[1].data[1].stats.dangerous_attacks_avg_overall),PPG:parseFloat(f[1].data[1].stats.seasonPPG_overall),AttacksAverage:parseFloat(f[1].data[1].stats.attacks_avg_away),AverageDangerousAttacks:parseFloat(f[1].data[1].stats.dangerous_attacks_avg_away),BTTSPercentage:parseInt(f[1].data[1].stats.seasonBTTSPercentage_away),LeagueOrAll:vt,LeaguePosition:"".concat(A).concat(G),awayRawPosition:i.rawPosition?i.rawPosition:0,awayTeamAwayPositionRaw:m,LeagueAverageGoals:_t,LeagueAverageConceded:St},e.t64=parseFloat(f[1].data[2].stats.xg_for_avg_overall),e.t65=parseFloat(f[1].data[2].stats.xg_for_avg_away),e.t66=parseFloat(f[1].data[2].stats.seasonScoredNum_overall),e.t67=parseFloat(f[1].data[2].stats.seasonScoredAVG_away),e.t68=parseFloat(f[1].data[2].stats.seasonMatchesPlayed_home),e.t69=parseFloat(f[1].data[2].stats.seasonMatchesPlayed_away),e.t70=parseFloat(f[1].data[2].stats.seasonConcededNum_overall),e.t71=parseFloat(f[1].data[2].stats.seasonConcededAVG_away),e.t72=parseFloat(f[1].data[2].stats.xg_against_avg_overall),e.t73=parseFloat(f[1].data[2].stats.xg_against_avg_away),e.t74=parseFloat(f[1].data[2].stats.seasonCSPercentage_overall),e.t75=parseFloat(f[1].data[2].stats.possessionAVG_overall),e.t76=parseFloat(f[1].data[2].stats.possessionAVG_away),e.t77=parseFloat(f[1].data[2].stats.shotsOnTargetAVG_overall),e.t78=parseFloat(f[1].data[2].stats.shotsOnTargetAVG_away),e.t79=parseFloat(f[1].data[2].stats.shotsAVG_overall),e.t80=parseFloat(f[1].data[2].stats.shotsAVG_away),e.t81=parseFloat(f[1].data[2].stats.dangerous_attacks_avg_overall),e.t82=parseFloat(f[1].data[2].stats.seasonPPG_overall),e.t83=parseFloat(f[1].data[2].stats.attacks_avg_away),e.t84=parseFloat(f[1].data[2].stats.dangerous_attacks_avg_away),e.t85=parseInt(f[1].data[2].stats.seasonBTTSPercentage_away),e.t86=lt.reverse(),e.t87=dt.reverse(),e.t88=mt.reverse(),e.t89=ht.reverse(),e.t90=vt,e.t91="".concat(A).concat(G),e.t92=i.rawPosition?i.rawPosition:0,e.t93=m,e.t94=k,e.t95=v,e.t96=b,e.t97=x,e.t98=bt,e.t99=f[1].data[2].stats.seasonGoalDifference_overall,e.t100=f[1].data[2].stats.seasonGoalDifference_away,e.t101=f[1].data[2].stats.seasonBTTSPercentage_overall,e.t102=f[1].data[2].stats.seasonBTTSPercentage_away,e.t103=f[1].data[2].stats.cardsTotal_overall,e.t104=f[1].data[2].stats.cornersAVG_overall,e.t105=f[1].data[2].stats.scoredBothHalvesPercentage_overall,e.next=225,Mt(f[1].data[0].last_updated_match_timestamp);case 225:e.t106=e.sent,e.t107=Ot,e.t108=_t,e.t109=St,e.t110={XGOverall:e.t64,XG:e.t65,ScoredOverall:e.t66,ScoredAverage:e.t67,PlayedHome:e.t68,PlayedAway:e.t69,ConcededOverall:e.t70,ConcededAverage:e.t71,XGAgainstAvgOverall:e.t72,XGAgainstAverage:e.t73,CleanSheetPercentage:e.t74,AveragePossessionOverall:e.t75,AveragePossession:e.t76,AverageShotsOnTargetOverall:e.t77,AverageShotsOnTarget:e.t78,AverageShots:e.t79,AverageShotsHomeOrAway:e.t80,AverageDangerousAttacksOverall:e.t81,PPG:e.t82,AttacksAverage:e.t83,AverageDangerousAttacks:e.t84,BTTSPercentage:e.t85,lastThreeForm:e.t86,LastFiveForm:e.t87,LastSixForm:e.t88,LastTenForm:e.t89,LeagueOrAll:e.t90,LeaguePosition:e.t91,awayRawPosition:e.t92,awayTeamAwayPositionRaw:e.t93,SeasonPPG:e.t94,WinPercentage:e.t95,LossPercentage:e.t96,DrawPercentage:e.t97,formRun:e.t98,goalDifference:e.t99,goalDifferenceHomeOrAway:e.t100,BttsPercentage:e.t101,BttsPercentageHomeOrAway:e.t102,CardsTotal:e.t103,CornersAverage:e.t104,ScoredBothHalvesPercentage:e.t105,LastMatch:e.t106,WDLRecord:e.t107,LeagueAverageGoals:e.t108,LeagueAverageConceded:e.t109},e.t111={teamName:e.t61,0:e.t62,1:e.t63,2:e.t110},e.t112={id:e.t3,teamIDHome:e.t4,teamIDAway:e.t5,leagueId:e.t6,home:e.t60,away:e.t111},e.t2.push.call(e.t2,e.t112);case 233:if(r.homeBadge=a.home_image,r.awayBadge=a.away_image,r.homePpg=a.home_ppg.toFixed(2),r.awayPpg=a.away_ppg.toFixed(2),r.lastFiveFormHome=it,r.lastFiveFormAway=dt,r.homeRawPosition=l.rawPosition,r.awayRawPosition=i.rawPosition,r.homeTeamHomePosition="".concat(u).concat(_),r.awayTeamAwayPosition="".concat(m).concat(T),r.homeTeamHomePositionRaw=u,r.awayTeamAwayPositionRaw=m,r.homeTeamWinPercentage=g,r.awayTeamWinPercentage=v,r.homeTeamLossPercentage=p,r.awayTeamLossPercentage=b,r.homeTeamDrawPercentage=O,r.awayTeamDrawPercentage=x,r.status=a.status,r.over25Odds=a.odds_ft_over25,r.btts_potential=a.btts_potential,r.game=r.homeTeam+" v "+r.awayTeam,r.stadium=a.stadium_name,r.homeGoals=a.homeGoalCount,r.awayGoals=a.awayGoalCount,r.expectedGoalsHomeToDate=a.team_a_xg_prematch,r.expectedGoalsAwayToDate=a.team_b_xg_prematch,r.game_week=a.game_week,"canceled"===r.status&&"suspended"===r.status){e.next=265;break}return kt.push(r),e.next=265,zt(r,!1);case 265:case"end":return e.stop()}}),e,null,[[43,63],[72,92]])})),n.s();case 6:if((o=n.n()).done){e.next=10;break}return e.delegateYield(l(),"t0",8);case 8:e.next=6;break;case 10:e.next=15;break;case 12:e.prev=12,e.t1=e.catch(3),n.e(e.t1);case 15:return e.prev=15,n.f(),e.finish(15);case 18:kt.length>0&&r.a.render(Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)(u,{text:"Get Predictions & League stats",onClickEvent:function(){return Pa(a)},className:"GeneratePredictions"}),Object(i.jsx)("div",{className:"Version",children:"Prediction engine v4.2.1 (26/04/24)"}),Object(i.jsx)(C,{buttonText:"Filters",element:Object(i.jsxs)("div",{className:"FilterContainer",children:[Object(i.jsx)("h6",{children:"Use the below filters to remove predictions that don't meet the set criteria. These will be greyed out and not included in multi-builders and ROI stats"}),Object(i.jsx)("h6",{children:"Goals for/against differential filter (BETA)"}),Object(i.jsx)("div",{children:"I'm looking for tips where the goal differential between teams is at least..."}),Object(i.jsx)(te,{value:"0",text:"all games",useCase:"gd",lower:"0",upper:"30"}),Object(i.jsx)("h6",{children:"Goals for/against home or away differential filter (BETA)"}),Object(i.jsx)("div",{children:"I'm looking for tips where the goal differential (home or away only) between teams is at least..."}),Object(i.jsx)(te,{value:"0",text:"all games",useCase:"gdHorA",lower:"0",upper:"30"}),Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("h6",{children:"XG for/against differential filter (BETA)"}),Object(i.jsx)("div",{children:"I'm looking for tips where the XG differential between teams is at least..."}),Object(i.jsx)(te,{value:"0",text:"all games",useCase:"xg",lower:"0",upper:"30"})]}),Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("h6",{children:"Last 10 points differential filter (BETA)"}),Object(i.jsx)("div",{children:"I'm looking for tips where the points differential between teams is at least..."}),Object(i.jsx)(te,{value:"0",text:"all games",useCase:"last10",lower:"0",upper:"30"})]}),Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("h6",{children:"Choose your risk profile"}),Object(i.jsx)("div",{children:"I'm looking for tips where the odds are between..."}),Object(i.jsx)(T,{value:"1",text:"all games"})]})]})}),","]}),document.getElementById("GeneratePredictions"));case 19:case"end":return e.stop()}}),e,null,[[3,12,15,18]])})),V=0;case 72:if(!(V<_n.length)){e.next=77;break}return e.delegateYield(E(V),"t1",74);case 74:V++,e.next=72;break;case 77:if(r.a.render(Object(i.jsx)("div",{children:Object(i.jsx)("div",{className:"LoadingText"})}),document.getElementById("Loading")),A){e.next=83;break}return e.next=81,fetch("".concat("https://api.xgtipping.com/","allForm/").concat(t),{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({allForm:Bt})});case 81:return e.next=83,v(!0);case 83:if(w){e.next=86;break}return e.next=86,fetch("".concat("https://api.xgtipping.com/","leagues/").concat(m),{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({leagueArray:Ft})});case 86:r.a.render(Object(i.jsx)(Kt,{matches:kt,result:!1,bool:!1}),document.getElementById("FixtureContainer")),setTimeout((function(){Yt=!1}),3e3);case 88:case"end":return e.stop()}}),e)}))),Zt.apply(this,arguments)}var Qt=function(e){return Object(i.jsxs)("ul",{className:e.className,style:e.style,children:[Object(i.jsx)("li",{className:"Stadium","data-cy":e.name+"Stadium",children:"Venue - ".concat(e.stadium)},"Stadium"),Object(i.jsxs)("div",{className:"KeyStatsOne",children:[Object(i.jsx)("li",{className:"h2h","data-cy":e.name+"h2h",children:"Matches played: ".concat(e.matches)},"h2h"),Object(i.jsx)("li",{className:"homeWins","data-cy":e.name+"homeWins",children:"".concat(e.homeTeam," wins: ").concat(e.homeWins)},"homeWins"),Object(i.jsx)("li",{className:"awayWins","data-cy":e.name+"awayWins",children:"".concat(e.awayTeam," wins: ").concat(e.awayWins)},"awayWins"),Object(i.jsx)("li",{className:"draws","data-cy":e.name+"draws",children:"Draws: ".concat(e.draws)},"draws")]}),Object(i.jsxs)("div",{className:"KeyStatsTwo",children:[Object(i.jsx)("li",{className:"averageGoals","data-cy":e.name+"averageGoals",children:"Average goals in fixture: ".concat(e.averageGoals)},"averageGoals"),Object(i.jsx)("li",{className:"bestHomeOdds","data-cy":e.name+"bestHomeOdds",children:"Best oods for home win @: ".concat(e.bestHomeOdds)},"bestHomeOdds"),Object(i.jsx)("li",{className:"bestAwayOdds","data-cy":e.name+"bestAwayOdds",children:"Best oods for away win @: ".concat(e.bestAwayOdds)},"bestAwayOdds")]}),Object(i.jsx)("li",{className:"LastGameDetail","data-cy":e.name+"Last",children:"Last meeting - ".concat(e.lastGameStadiumName," ").concat(e.lastGameDate)},"lastGameDetail"),Object(i.jsxs)("div",{className:"LastGameOverview",children:[Object(i.jsx)("div",{className:"LastGameHome","data-cy":e.name+"LastGame",children:"".concat(e.lastGameHomeTeam)},"lastGame"),Object(i.jsx)("span",{className:"LastGameScore",children:"".concat(e.lastGameHomeGoals)}),Object(i.jsx)("span",{className:"LastGameScore",children:"".concat(e.lastGameAwayGoals)}),Object(i.jsx)("div",{className:"LastGameAway",children:"".concat(e.lastGameAwayTeam)})]}),Object(i.jsx)("li",{className:"secondToLastGameDetail","data-cy":e.name+"secondToLast",children:"Second to last meeting - ".concat(e.secondToLastGameStadiumName," ").concat(e.secondToLastGameDate)},"secondToLastGameDetail"),Object(i.jsxs)("div",{className:"LastGameOverview",children:[Object(i.jsx)("div",{className:"LastGameHome","data-cy":e.name+"LastGame",children:"".concat(e.secondToLastGameHomeTeam)},"lastGame"),Object(i.jsx)("span",{className:"LastGameScore",children:"".concat(e.secondToLastGameHomeGoals)}),Object(i.jsx)("span",{className:"LastGameScore",children:"".concat(e.secondToLastGameAwayGoals)}),Object(i.jsx)("div",{className:"LastGameAway",children:"".concat(e.secondToLastGameAwayTeam)})]})]})},$t=Object(Ma.a)((function(e){return{head:{padding:10,textAlign:"center",fontSize:"2em",fontFamily:"inherit",margin:"none",color:"white",lineHeight:"2em",backgroundColor:"#030061"},body:{fontSize:"2em",fontFamily:"inherit",padding:10,color:"white",margin:"none",backgroundColor:"#030061"}}}))(Va.a),es=Object(Ma.a)((function(e){return{root:{"&:nth-of-type(odd)":{backgroundColor:"#030061",textAlign:"center"},"&:nth-of-type(even)":{backgroundColor:"#030052",textAlign:"center"}}}}))(Ja.a);function as(e){return Object(i.jsx)(Ua.a,{className:"StatsTable",children:Object(i.jsxs)(Wa.a,{"aria-label":"customized table",children:[Object(i.jsx)(za.a,{children:Object(i.jsxs)(Ja.a,{children:[Object(i.jsx)($t,{children:"Stat"}),Object(i.jsx)($t,{children:"H2H history"}),Object(i.jsx)($t,{children:"XGTipping forecast"}),Object(i.jsx)($t,{children:"Odds (yes)"}),Object(i.jsx)($t,{children:"Odds (no)"})]})}),Object(i.jsxs)(Ea.a,{children:[Object(i.jsxs)(es,{children:[Object(i.jsx)($t,{component:"th",scope:"row",align:"center",padding:"5",children:"Over 0.5 Goals %"}),Object(i.jsx)($t,{component:"th",scope:"row",align:"center",children:"".concat(e.o05Stat,"%")}),Object(i.jsx)($t,{align:"center",children:"-"}),Object(i.jsx)($t,{align:"center",children:e.o05Odds}),Object(i.jsx)($t,{align:"center",children:e.u05Odds})]},"O05"),Object(i.jsxs)(es,{children:[Object(i.jsx)($t,{component:"th",scope:"row",align:"center",padding:"5",children:"Over 1.5 Goals %"}),Object(i.jsx)($t,{component:"th",scope:"row",align:"center",children:"".concat(e.o15Stat,"%")}),Object(i.jsx)($t,{align:"center",children:"-"}),Object(i.jsx)($t,{align:"center",children:e.o15Odds}),Object(i.jsx)($t,{align:"center",children:e.u15Odds})]},"O15"),Object(i.jsxs)(es,{children:[Object(i.jsx)($t,{component:"th",scope:"row",align:"center",children:"Over 2.5 Goals %"}),Object(i.jsx)($t,{component:"th",scope:"row",align:"center",children:"".concat(e.o25Stat,"%")}),Object(i.jsx)($t,{align:"center",children:"-"}),Object(i.jsx)($t,{align:"center",children:e.o25Odds}),Object(i.jsx)($t,{align:"center",children:e.u25Odds})]},"O25"),Object(i.jsxs)(es,{children:[Object(i.jsx)($t,{component:"th",scope:"row",align:"center",children:"Over 3.5 Goals %"}),Object(i.jsx)($t,{component:"th",scope:"row",align:"center",children:"".concat(e.o35Stat,"%")}),Object(i.jsx)($t,{align:"center",children:"-"}),Object(i.jsx)($t,{align:"center",children:e.o35Odds}),Object(i.jsx)($t,{align:"center",children:e.u35Odds})]},"O35")]})]})})}function ts(e,a,t,s,n,r,o){return ss.apply(this,arguments)}function ss(){return ss=Object(l.a)(Object(c.a)().mark((function e(a,t,n,o,d,u,m){var g,h,v,p,b,f;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return g=a,e.next=3,fetch("".concat("https://api.xgtipping.com/","match/").concat(g));case 3:return f=e.sent,e.next=6,f.json().then(function(){var e=Object(l.a)(Object(c.a)().mark((function e(a){var f,O,j,x,y,A,w,_,G,S,T,P,k,C,N,F,D,L,H,R,B;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(T=function(){return(T=Object(l.a)(Object(c.a)().mark((function e(a){var t;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=a/100,e.abrupt("return",(1/t).toFixed(2));case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)},S=function(e){return T.apply(this,arguments)},G=function(){return G=Object(l.a)(Object(c.a)().mark((function e(a,t,s,n,r){var o;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return console.log(a),console.log(t),console.log(s),console.log(n),console.log(r),o=a+t+s+n+r,e.abrupt("return",o/5);case 7:case"end":return e.stop()}}),e)}))),G.apply(this,arguments)},_=function(e,a,t,s,n){return G.apply(this,arguments)},f=a.data.h2h.previous_matches_ids,x=[],y=[],a.data.odds_comparison?(x=a.data.odds_comparison["FT Result"][1],y=a.data.odds_comparison["FT Result"][2],A=Object.entries(x).sort((function(e,a){return a[1]-e[1]})),w=Object.entries(y).sort((function(e,a){return a[1]-e[1]})),v=A[0][0],h=A[0][1],b=w[0][0],p=w[0][1]):(v="N/A",h="N/A",b="N/A",p="N/A"),!(a.data.h2h.previous_matches_results.totalMatches>0)){e.next=31;break}return f.sort((function(e,a){return a.date_unix-e.date_unix})),P=f[0].id,k=!0,C=void 0!==f[1]&&f[1].id,e.next=15,fetch("".concat("https://api.xgtipping.com/","match/").concat(P));case 15:return N=e.sent,e.next=18,N.json().then(function(){var e=Object(l.a)(Object(c.a)().mark((function e(a){var t,s,n;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(O=a.data,t=O.date_unix,F=new Date(1e3*t),D="".concat(F.getDate(),"/").concat(F.getMonth()+1,"/").concat(F.getFullYear()),!1===k){e.next=11;break}return e.next=8,fetch("".concat("https://api.xgtipping.com/","match/").concat(C));case 8:return s=e.sent,e.next=11,s.json().then((function(e){var a=(j=e.data).date_unix;n=new Date(1e3*a),L="".concat(n.getDate(),"/").concat(n.getMonth()+1,"/").concat(n.getFullYear())}));case 11:case"end":return e.stop()}}),e)})));return function(a){return e.apply(this,arguments)}}());case 18:return e.next=20,_(o,d,u,m,a.data.h2h.betting_stats.bttsPercentage);case 20:return H=e.sent,e.next=23,S(H);case 23:return R=e.sent,e.next=26,S(100-H);case 26:B=e.sent,console.log(a.data),r.a.render(Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("h3",{children:"Fixture history"}),Object(i.jsx)(Qt,{className:"PreviousMatchStats",homeTeam:t,awayTeam:n,stadium:a.data.stadium_name,matches:a.data.h2h.previous_matches_results.totalMatches,homeWins:a.data.h2h.previous_matches_results.team_a_wins,awayWins:a.data.h2h.previous_matches_results.team_b_wins,draws:a.data.h2h.previous_matches_results.draw,averageGoals:a.data.h2h.betting_stats.avg_goals,bestHomeOdds:"".concat(v," - ").concat(h),bestAwayOdds:"".concat(b," - ").concat(p),lastGameStadiumName:O.stadium_name?O.stadium_name:"-",lastGameHomeGoals:void 0!==O.homeGoalCount?O.homeGoalCount:"-",lastGameAwayGoals:void 0!==O.awayGoalCount?O.awayGoalCount:"-",lastGameHomeTeam:O.home_name?O.home_name:"-",lastGameAwayTeam:O.away_name?O.away_name:"-",lastGameDate:isNaN(D)?"-":D,secondToLastGameStadiumName:j.stadium_name?j.stadium_name:"-",secondToLastGameHomeGoals:void 0!==j.homeGoalCount?j.homeGoalCount:"-",secondToLastGameAwayGoals:void 0!==j.awayGoalCount?j.awayGoalCount:"-",secondToLastGameHomeTeam:j.home_name?j.home_name:"-",secondToLastGameAwayTeam:j.away_name?j.away_name:"-",secondToLastGameDate:isNaN(L)?"-":L}),Object(i.jsx)(as,{o05Stat:a.data.h2h.betting_stats.over05Percentage,o15Stat:a.data.h2h.betting_stats.over15Percentage,o15Forecast:a.data.o15_potential,o05Odds:a.data.odds_ft_over05,u05Odds:a.data.odds_ft_under05,o15Odds:a.data.odds_ft_over15,u15Odds:a.data.odds_ft_under15,o25Stat:a.data.h2h.betting_stats.over25Percentage,o25Forecast:a.data.o25_potential,o25Odds:a.data.odds_ft_over25,u25Odds:a.data.odds_ft_under25,o35Stat:a.data.h2h.betting_stats.over35Percentage,o35Forecast:a.data.o35_potential,o35Odds:a.data.odds_ft_over35,u35Odds:a.data.odds_ft_under35,BTTSStat:a.data.h2h.betting_stats.bttsPercentage,BTTSForecast:"".concat(H,"%"),BTTSOdds:"".concat(a.data.odds_btts_yes,"\n Fair odds: ").concat(R),BTTSOddsNo:"".concat(a.data.odds_btts_no,"\n Fair odds: ").concat(B),CornersStat:"\u2013",CornersForecast:a.data.corners_potential,CornersOdds:a.data.odds_corners_over_105})]}),document.getElementById("H2HStats".concat(g))),e.next=32;break;case 31:r.a.render(Object(i.jsx)("div",{children:"No fixture history found"}),document.getElementById("H2HStats".concat(g)));case 32:case"end":return e.stop()}}),e)})));return function(a){return e.apply(this,arguments)}}());case 6:case"end":return e.stop()}}),e)}))),ss.apply(this,arguments)}function ns(e){return rs.apply(this,arguments)}function rs(){return(rs=Object(l.a)(Object(c.a)().mark((function e(a){var t,s;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=a,e.t0=!0,e.next=e.t0===t>1.5?4:e.t0===(t>1.25&&t<=1.5)?6:e.t0===(t>1&&t<=1.25)?8:e.t0===(t>.75&&t<=1)?10:e.t0===(t>.4&&t<=.75)?12:e.t0===(t>-.4&&t<=.4)?14:e.t0===(t<-.4&&t>=-.75)?16:e.t0===(t<-.75&&t>=-1)?18:e.t0===(t<-1&&t>=-1.25)?20:e.t0===(t<-1.25&&t>=-1.5)?22:e.t0===t<-1.5?24:26;break;case 4:return s="Underachieving drastically against their expected goal difference.",e.abrupt("break",28);case 6:return s="Underachieving to a large degree against their expected goal difference.",e.abrupt("break",28);case 8:return s="Underachieving against their expected goal difference.",e.abrupt("break",28);case 10:return s="Underachieving to a small degree against their expected goal difference.",e.abrupt("break",28);case 12:return s="Underachieving slighly against their expected goal difference.",e.abrupt("break",28);case 14:return s="Roughly tracking on par with their expected goal difference.",e.abrupt("break",28);case 16:return s="Overachieving slighly against their expected goal difference.",e.abrupt("break",28);case 18:return s="Overachieving to a small degree against their expected goal difference.",e.abrupt("break",28);case 20:return s="Overachieving against their expected goal difference.",e.abrupt("break",28);case 22:return s="Overachieving to a large degree against their expected goal difference.",e.abrupt("break",28);case 24:return s="Overachieving drastically against their expected goal difference.",e.abrupt("break",28);case 26:return s="",e.abrupt("break",28);case 28:return e.abrupt("return",s);case 29:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function os(e,a){return cs.apply(this,arguments)}function cs(){return(cs=Object(l.a)(Object(c.a)().mark((function e(a,t){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",parseFloat(a-t).toFixed(2));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ls(e,a,t,s){return is.apply(this,arguments)}function is(){return(is=Object(l.a)(Object(c.a)().mark((function e(a,t,s,n){var r,o,l;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=a-t,o=s-n,e.next=4,os(r,o);case 4:return l=e.sent,e.abrupt("return",l);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ds(e,a){return us.apply(this,arguments)}function us(){return(us=Object(l.a)(Object(c.a)().mark((function e(a,t){var s;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(a>=3)){e.next=13;break}e.t0=!0,e.next=e.t0===a>t?4:e.t0===(a===t)?6:e.t0===a=2)){e.next=26;break}e.t1=!0,e.next=e.t1===a>t?17:e.t1===(a===t)?19:e.t1===a=1)){e.next=39;break}e.t2=!0,e.next=e.t2===a>t?30:e.t2===(a===t)?32:e.t2===a0)){e.next=52;break}e.t3=!0,e.next=e.t3===a>t?43:e.t3===(a===t)?45:e.t3===a80?3:e.t0===(a>60&&a<=80)?5:e.t0===(a>40&&a<=60)?7:e.t0===(a>20&&a<=40)?9:e.t0===(a>1&&a<=20)?11:e.t0===(0===a)?13:15;break;case 3:return t="Incredibly strong defensively, with ".concat(a,"% of their games ending in a cleansheet"),e.abrupt("break",16);case 5:return t="Very strong defensively, with ".concat(a,"% of their games ending in a cleansheet"),e.abrupt("break",16);case 7:return t="Defensively impressive, with ".concat(a,"% of their games ending in a cleansheet"),e.abrupt("break",16);case 9:return t="Defensively, ".concat(a,"% of their games have ended in a cleansheet"),e.abrupt("break",16);case 11:return t="Defensively frail, with only ".concat(a,"% of their games ending in a cleansheet"),e.abrupt("break",16);case 13:return t="Defensively weak, with ".concat(a,"% of their games ending in a cleansheet"),e.abrupt("break",16);case 15:return e.abrupt("break",16);case 16:return e.abrupt("return",t);case 17:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function hs(){return(hs=Object(l.a)(Object(c.a)().mark((function e(a,t,s){var n,r,o,l,i,d,u,m;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=t[1],o=t[0],e.next=4,ls(a.XGOverall,a.XGAgainstAvgOverall,a.ScoredOverall/10,a.ConcededOverall/10);case 4:return l=e.sent,e.next=7,ns(l);case 7:return i=e.sent,e.next=10,ds(a.last5Goals,a.last10Goals);case 10:return d=e.sent,e.next=13,ms(a.CleanSheetPercentage);case 13:if(u=e.sent,!((m=(parseFloat(o)+parseFloat(r))/2)>=2.6)){e.next=28;break}e.t0=!0,e.next=e.t0===o>r?19:e.t0===(o===r)?21:e.t0===o=2.3)){e.next=41;break}e.t1=!0,e.next=e.t1===o>r?32:e.t1===(o===r)?34:e.t1===o=2)){e.next=54;break}e.t2=!0,e.next=e.t2===o>r?45:e.t2===(o===r)?47:e.t2===o=1.7)){e.next=67;break}e.t3=!0,e.next=e.t3===o>r?58:e.t3===(o===r)?60:e.t3===o=1.4)){e.next=80;break}e.t4=!0,e.next=e.t4===o>r?71:e.t4===(o===r)?73:e.t4===o=1.1)){e.next=94;break}console.log(2),e.t5=!0,e.next=e.t5===o>r?85:e.t5===(o===r)?87:e.t5===o=.8)){e.next=107;break}e.t6=!0,e.next=e.t6===o>r?98:e.t6===(o===r)?100:e.t6===o=.5)){e.next=120;break}e.t7=!0,e.next=e.t7===o>r?111:e.t7===(o===r)?113:e.t7===or?124:e.t8===(o===r)?126:e.t8===oMath.abs(e.depth)?(a=Math.abs(e.height),t=-Math.abs(e.height)):(Math.abs(e.height),Math.abs(e.depth),a=Math.abs(e.depth),t=-Math.abs(e.depth));var s={color:"#030061",responsive:!0,aspectRatio:1.2,maintainAspectRatio:!0,layout:{padding:3},elements:{point:{radius:0}},scales:{y:{suggestedMin:t,suggestedMax:a,grid:{borderWidth:1,borderColor:"black"},ticks:{font:{size:12}}},x:{title:{display:!1,text:"Last X Games",font:{size:14}},grid:{borderWidth:1,borderColor:"black"},ticks:{display:!1,font:{size:14}}}},plugins:{legend:{position:"top",labels:{boxHeight:5}},title:{display:!0,text:e.type,color:"#030061",font:{size:14}}}},n={labels:Array.from(e.data1.keys()),datasets:[{label:e.team1,font:{color:"black"},data:e.data1,borderColor:"#030061",borderWidth:2,backgroundColor:"#030061",tension:e.tension},{label:e.team2,data:e.data2,borderColor:"#970d00",borderWidth:2,backgroundColor:"#970d00",tension:e.tension}]};return Object(i.jsx)(fs.b,{options:s,data:n})}function js(e){var a={color:"#030061",scales:{r:{angleLines:{display:!1},suggestedMin:0,suggestedMax:1,ticks:{precision:0,display:!1}}},plugins:{legend:{position:"top",labels:{boxHeight:10,color:"#030061"}},title:{display:!0,text:e.title,color:"#030061",font:{size:14}}}},t={labels:["Attack rating","Defence rating","Ball retention","XG For","XG Against","Directness","Attacking precision"],datasets:[{label:e.team1,data:e.data,fill:!0,backgroundColor:"rgba(54, 162, 235, 0.2)",borderColor:"#030061",pointBackgroundColor:"#030061",pointBorderColor:"#fff",pointHoverBackgroundColor:"#fff",pointHoverBorderColor:"rgb(255, 99, 132)",borderWidth:2},{label:e.team2,data:e.data2,fill:!0,backgroundColor:"rgba(255, 99, 132, 0.2)",borderColor:"#970d00",pointBackgroundColor:"#970d00",pointBorderColor:"#fff",pointHoverBackgroundColor:"#fff",pointHoverBorderColor:"rgb(54, 162, 235)",borderWidth:2}]};return Object(i.jsx)(fs.c,{options:a,data:t})}function xs(e){var a=e.data1,t=e.data2.map((function(e,t){return e-a[t]}));!function(e,a){var t=[],s=Math.abs(e),n=Math.abs(a);t.push(s,n),Math.max.apply(Math,t)}(Math.max.apply(Math,Object(ps.a)(t)),Math.min.apply(Math,Object(ps.a)(t)));var s={color:"#030061",indexAxis:"y",aspectRatio:1.3,elements:{bar:{borderWidth:2}},scales:{x:{min:-4,max:4,ticks:{display:!1}},y:{ticks:{font:{size:10}}}},responsive:!0,plugins:{legend:{display:!1},tooltip:{enabled:!1},title:{display:!0,text:e.text,color:"#030061",font:{size:14}}}},n={labels:["Highest Goals","Fewest Conceeded","PPG","Highest XG","Fewest XG Conceeded","Shots On Target","Dangerous Attacks","Av. Possession","Home/Away Goal Diff","Corners"],datasets:[{legend:{display:!1},data:t,backgroundColor:function(e){var a=e.dataIndex;return e.dataset.data[a]<0?"#030061":"#970d00"}}]};return Object(i.jsx)(fs.a,{options:s,data:n})}bs.f.register(bs.e,bs.l,bs.q,bs.n,bs.a,bs.h,bs.c,bs.k,bs.s,bs.t,bs.i);var ys=function(e){var a,t,s=e.id,n=e.team1,r=e.team2,o=e.time,c=e.homeGoals,l=e.awayGoals,d="https://widgets.sofascore.com/embed/lineups?id=".concat(s,"&widgetBackground=Gray&v=2"),u=(new Date).getTime()/1e3;return o>0?(a=o-u,t=Math.floor(a/60)):t=-99999999,"N/A"===n?Object(i.jsx)("h6",{children:"No lineups available for this match yet"}):t>60?Object(i.jsxs)("div",{children:[Object(i.jsx)("h6",{children:"Predicted lineups"}),Object(i.jsx)("iframe",{id:"sofa-lineups-embed-".concat(s),src:d,style:{height:"721px",maxWidth:"800px",width:"100%",border:"0"},scrolling:"no",title:"SofaScore Lineups"}),Object(i.jsx)("div",{style:{fontSize:"12px",fontFamily:"Open Sans, sans-serif"}})]}):t<60&&t>0?Object(i.jsxs)("div",{children:[Object(i.jsx)("h6",{children:"Lineups"}),Object(i.jsx)("iframe",{id:"sofa-lineups-embed-".concat(s),src:d,style:{height:"721px",maxWidth:"800px",width:"100%",border:"0"},scrolling:"no",title:"SofaScore Lineups"}),Object(i.jsx)("div",{style:{fontSize:"12px",fontFamily:"Open Sans, sans-serif"}})]}):t<0?Object(i.jsxs)("div",{children:[Object(i.jsxs)("div",{className:"CurrentScore",children:["Score: ","".concat(n,": ").concat(c," - ").concat(r,": ").concat(l)]}),Object(i.jsx)("span",{children:"Score not live updated"}),Object(i.jsx)("h6",{className:"AttackingMomentum",children:"Live attacking momentum and goals"}),Object(i.jsx)("iframe",{width:"100%",height:"194",src:"https://widgets.sofascore.com/embed/attackMomentum?id=".concat(s,"&widgetBackground=Gray&v=2"),frameborder:"0",scrolling:"no"}),Object(i.jsx)("div",{style:{fontSize:"12px",fontFamily:"Open Sans, sans-serif"}}),Object(i.jsx)("h6",{children:"Lineups and in-play ratings"}),Object(i.jsx)("iframe",{id:"sofa-lineups-embed-".concat(s),src:d,style:{height:"721px",maxWidth:"800px",width:"100%",border:"0"},scrolling:"no",title:"SofaScore Lineups"}),Object(i.jsx)("div",{style:{fontSize:"12px",fontFamily:"Open Sans, sans-serif"}})]}):Object(i.jsx)("h6",{children:"Lineups coming in approximately ".concat(t-60," minutes")})};function As(e){return ws.apply(this,arguments)}function ws(){return(ws=Object(l.a)(Object(c.a)().mark((function e(a){var t,s,n,r,o;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(r in t={"Average Dangerous Attacks":.1,"Average Shots":.05,"Average Shots On Target":.15,"Average Expected Goals":.25,"Recent XG":.15,"Average Goals":.25,Corners:.05},s={"Average Dangerous Attacks":{min:25,max:75},"Average Shots":{min:4,max:17},"Average Shots On Target":{min:2,max:10},"Average Expected Goals":{min:.25,max:2.75},"Recent XG":{min:.25,max:2.75},"Average Goals":{min:.25,max:2.75},Corners:{min:2,max:9}},n=0,a)a.hasOwnProperty(r)&&t.hasOwnProperty(r)&&s.hasOwnProperty(r)?(o=(a[r]-s[r].min)/(s[r].max-s[r].min),n+=o*t[r]):console.log(r);return e.abrupt("return",parseFloat(n.toFixed(2)));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function _s(e){return Gs.apply(this,arguments)}function Gs(){return Gs=Object(l.a)(Object(c.a)().mark((function e(a){var t,s,n,r,o,l,i,d=arguments;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(l in t=d.length>1&&void 0!==d[1]?d[1]:1,s=t,n={"Average XG Against":.3,"Recent XG Against":.15,"Average Goals Against":.3,"Average SOT Against":.25},r={"Average XG Against":{min:.25,max:2.75},"Recent XG Against":{min:.25,max:2.75},"Average Goals Against":{min:.25,max:2.75},"Average SOT Against":{min:2,max:10}},o=0,a)a.hasOwnProperty(l)&&n.hasOwnProperty(l)&&r.hasOwnProperty(l)&&(i=s-(a[l]-r[l].min)/(r[l].max-r[l].min),o+=i*n[l]);return e.abrupt("return",parseFloat(o.toFixed(2)));case 7:case"end":return e.stop()}}),e)}))),Gs.apply(this,arguments)}function Ss(e,a){return Ts.apply(this,arguments)}function Ts(){return(Ts=Object(l.a)(Object(c.a)().mark((function e(a,t){var s,n,r,o;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n={averagePossession:{min:20,max:80},xgFor:{min:.1,max:3},xgAgainst:{min:.1,max:3},directnessOverall:{min:.5,max:5},accuracyOverall:{min:.5,max:7}},(s={averagePossession:1,xgFor:1,xgAgainst:1,directnessOverall:1,accuracyOverall:1}).hasOwnProperty(a)&&n.hasOwnProperty(a)){e.next=4;break}throw new Error("Invalid metric name or missing normalization range.");case 4:return r=(t-n[a].min)/(n[a].max-n[a].min),o=r*s[a],e.abrupt("return",parseFloat(o.toFixed(2)));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var Ps=[],ks=[];function Cs(){return Cs=Object(l.a)(Object(c.a)().mark((function e(a,t){var s,n,d,m,g,h,v,p,b,f,x,y,A,w,_,G,S,T,P,k,N,F,D,L,H,R,B,X,I,M,W,E,V,U,z,J,K,Y,q,Z,Q,$,ee,ae,te,se,ne,re,oe,ce,le,ie,de,ue,me,ge,he,ve,pe,be,fe,Oe,je,xe,Ae,we,Ge,Se,Te,Pe,ke,Ce,Ne,Fe,De,Le,He,Re,Be,Xe,Ie,Me,We,Ee,Ve,Ue,ze,Je,Ke,Ye,qe,Ze,Qe,$e,ea,aa,ta,sa,na,ra,oa,ca,la,ia,da,ua,ma,ga,ha,va,pa,ba,fa,Oa,ja,xa,ya,Aa,wa,_a,Ga,Sa,Ta,Pa,ka,Ca,Na,Fa,Da,La,Ha,Ra,Ba;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(console.log(t),"void"===a.status){e.next=376;break}if(s=function(e){return!0===e&&!0===ye?{display:"block"}:{display:"none"}}(t),!1!==ye){e.next=8;break}alert("Tap Get Predictions to fetch all game stats first"),e.next=376;break;case 8:if(n=function(){var e=Object(l.a)(Object(c.a)().mark((function e(a,t){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",a/t);case 1:case"end":return e.stop()}}),e)})));return function(a,t){return e.apply(this,arguments)}}(),d=function(){var e=Object(l.a)(Object(c.a)().mark((function e(a){var t,s,n,r,o;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(t={W:3,D:1,L:0},s=[],n=[],r=0,o=0;o0)){e.next=5;break}return e.abrupt("return",s[0]);case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})));return function(a,t){return e.apply(this,arguments)}}(),2,f=10,x=Bt.find((function(e){return e.id===a.id})),y=[],A=[],w=[],_=[],T=[],P=[],k=function(e,a){return e.reduce((function(e,t,s){return s?e.concat(2*t/(a+1)+e[e.length-1]*(a-1)/(a+1)):e}),[e[0]])},N=x.home[2],F=x.away[2],!0!==t){e.next=203;break}console.log(x),D=Lt.map((function(e){return e.id})).indexOf(x.leagueId),L=Lt[D],console.log(L),H=L.fixtures.filter((function(e){return e.home_name===x.home.teamName||e.away_name===x.home.teamName})),R=L.fixtures.filter((function(e){return e.home_name===x.home.teamName})),H.sort((function(e,a){return a.date_unix-e.date_unix})),R.sort((function(e,a){return a.date_unix-e.date_unix})),B=0;case 38:if(!(BH[B].awayGoalCount?51:e.t1===(H[B].homeGoalCount===H[B].awayGoalCount)?55:e.t1===H[B].homeGoalCountH[B].awayGoalCount?68:e.t2===(H[B].homeGoalCount===H[B].awayGoalCount)?72:e.t2===H[B].homeGoalCount0&&H[B].awayGoalCount>0?"\u2714":"\u2718"});case 84:B++,e.next=38;break;case 87:V=0;case 88:if(!(VR[V].awayGoalCount?96:e.t4===(R[V].homeGoalCount===R[V].awayGoalCount)?99:e.t4===R[V].homeGoalCountK[q].awayGoalCount?136:e.t6===(K[q].awayGoalCount===K[q].homeGoalCount)?140:e.t6===K[q].homeGoalCountK[q].awayGoalCount?153:e.t7===(K[q].homeGoalCount===K[q].awayGoalCount)?157:e.t7===K[q].homeGoalCount0&&K[q].awayGoalCount>0?"\u2714":"\u2718"});case 169:q++,e.next=123;break;case 172:te=0;case 173:if(!(teY[te].homeGoalCount?181:e.t9===(Y[te].awayGoalCount===Y[te].homeGoalCount)?184:e.t9===Y[te].awayGoalCounta.awayOdds||a.homeOdds===a.awayOdds?"".concat(F.teamName," have been favourites ").concat(F.favouriteCount," times. Of these games, they have Won: ").concat(F.oddsReliabilityWin.toFixed(0),"%, Drawn: ").concat(F.oddsReliabilityDraw.toFixed(0),"%, Lost: ").concat(F.oddsReliabilityLose.toFixed(0),"%"):"".concat(F.teamName," have been underdogs ").concat(F.underdogCount," times. Of these games, they have Won: ").concat(F.oddsReliabilityWinAsUnderdog.toFixed(0),"%, Drawn: ").concat(F.oddsReliabilityDrawAsUnderdog.toFixed(0),"%, Lost: ").concat(F.oddsReliabilityLoseAsUnderdog.toFixed(0),"%")),e.next=245,m(N.LastFiveForm[4]);case 245:return xe=e.sent,e.next=248,m(F.LastFiveForm[4]);case 248:if(Ae=e.sent,we={"Average Dangerous Attacks":N.AverageDangerousAttacksOverall,"Average Shots":N.AverageShots,"Average Shots On Target":N.AverageShotsOnTargetOverall,"Average Expected Goals":N.XGOverall,"Recent XG":N.XGlast5?N.XGlast5:N.XGOverall,"Average Goals":void 0!==N.averageScoredLeague&&null!==N.averageScoredLeague?N.averageScoredLeague:N.ScoredOverall/10},Ge={"Average Dangerous Attacks":F.AverageDangerousAttacksOverall,"Average Shots":F.AverageShots,"Average Shots On Target":F.AverageShotsOnTargetOverall,"Average Expected Goals":F.XGOverall,"Recent XG":F.XGlast5?F.XGlast5:F.XGOverall,"Average Goals":void 0!==F.averageScoredLeague&&null!==F.averageScoredLeague?F.averageScoredLeague:F.ScoredOverall/10},Se={"Clean Sheet Percentage":100-N.CleanSheetPercentage,"Average XG Against":N.XGAgainstAvgOverall,"Recent XG Against":N.XGAgainstlast5?N.XGAgainstlast5:N.XGAgainstAvgOverall,"Average Goals Against":void 0!==N.averageConceededLeague&&null!==N.averageConceededLeague?N.averageConceededLeague:N.ConcededOverall/10},Te={"Clean Sheet Percentage":100-F.CleanSheetPercentage,"Average XG Against":F.XGAgainstAvgOverall,"Recent XG Against":F.XGAgainstlast5?F.XGAgainstlast5:F.XGAgainstAvgOverall,"Average Goals Against":void 0!==F.averageConceededLeague&&null!==F.averageConceededLeague?F.averageConceededLeague:F.ConcededOverall/10},!N.xgForStrength){e.next=299;break}console.log("not calculating"),Pe=N.attackingStrength,ke=N.attackingStrengthLast5,Ce=N.attackingStrengthHomeOnly,Ne=N.defensiveStrength,Fe=N.defensiveStrengthLast5,De=N.defensiveStrengthHomeOnly,Le=N.possessionStrength,He=N.possessionStrengthLast5,Re=N.possessionStrengthHomeOnly,Be=N.xgForStrength,Xe=N.xgForStrengthLast5,Ie=N.xgForStrengthHomeOnly,Me=N.xgAgainstStrength,We=N.xgAgainstStrengthLast5,Ee=N.xgAgainstStrengthHomeOnly,ra=N.directnessOverallStrength,oa=N.directnessOverallStrengthLast5,ca=N.directnessHomeStrength,ua=N.accuracyOverallStrength,ma=N.accuracyOverallStrengthLast5,ga=N.accuracyHomeStrength,Ve=F.attackingStrength,Ue=F.attackingStrengthLast5,ze=F.attackingStrengthAwayOnly,Je=F.defensiveStrength,Ke=F.defensiveStrengthLast5,Ye=F.defensiveStrengthAwayOnly,qe=F.possessionStrength,Ze=F.possessionStrengthLast5,Qe=F.possessionStrengthAwayOnly,$e=F.xgForStrength,ea=F.xgForStrengthLast5,aa=F.xgForStrengthAwayOnly,ta=F.xgAgainstStrength,sa=F.xgAgainstStrengthLast5,na=F.xgAgainstStrengthAwayOnly,la=F.directnessOverallStrength,ia=F.directnessOverallStrengthLast5,da=F.directnessAwayStrength,ha=F.accuracyOverallStrength,va=F.accuracyOverallStrengthLast5,pa=F.accuracyAwayStrength,e.next=341;break;case 299:return e.next=301,As(we);case 301:return Pe=e.sent,e.next=304,_s(Se);case 304:return Ne=e.sent,e.next=307,Ss("averagePossession",N.AveragePossessionOverall);case 307:return Le=e.sent,e.next=310,Ss("xgFor",x.home[2].XGOverall);case 310:return Be=e.sent,e.next=313,Ss("xgAgainst",3-x.home[2].XGAgainstAvgOverall);case 313:return Me=e.sent,e.next=316,Ss("directnessOverall",N.directnessOverall);case 316:return ra=e.sent,e.next=319,Ss("accuracyOverall",N.shootingAccuracy);case 319:return ua=e.sent,e.next=322,As(Ge);case 322:return Ve=e.sent,e.next=325,_s(Te);case 325:return Je=e.sent,e.next=328,Ss("averagePossession",F.AveragePossessionOverall);case 328:return qe=e.sent,e.next=331,Ss("xgFor",x.away[2].XGOverall);case 331:return $e=e.sent,e.next=334,Ss("xgAgainst",3-x.away[2].XGAgainstAvgOverall);case 334:return ta=e.sent,e.next=337,Ss("directnessOverall",F.directnessOverall);case 337:return la=e.sent,e.next=340,Ss("accuracyOverall",F.shootingAccuracy);case 340:ha=e.sent;case 341:return e.next=343,d(x.home[2].WDLRecord);case 343:return ba=e.sent,fa=Object(o.a)(ba,2),Oa=fa[0],fa[1],e.next=349,d(x.away[2].WDLRecord);case 349:return ja=e.sent,xa=Object(o.a)(ja,2),ya=xa[0],xa[1],[(x.home[0].ScoredOverall-x.home[0].ConcededOverall)/10,(x.home[1].ScoredOverall-x.home[1].ConcededOverall)/6,(x.home[2].ScoredOverall-x.home[2].ConcededOverall)/5],[(x.away[0].ScoredOverall-x.away[0].ConcededOverall)/10,(x.away[1].ScoredOverall-x.away[1].ConcededOverall)/6,(x.away[2].ScoredOverall-x.away[2].ConcededOverall)/5],[].push({btts:a.btts_potential}),Aa=[],console.log(x.home[2].LastFiveForm),Aa.push({name:a.homeTeam,Last5:x.home[2].LastFiveForm,LeagueOrAll:x.home[2].LeagueOrAll,AverageGoals:N.ScoredOverall/10,AverageConceeded:N.ConcededOverall/10,AverageXG:N.XGOverall,AverageXGConceded:N.XGAgainstAvgOverall,AveragePossession:N.AveragePossessionOverall,AverageShotsOnTarget:N.AverageShotsOnTargetOverall,AverageDangerousAttacks:N.AverageDangerousAttacksOverall,homeOrAway:"Home",leaguePosition:N.LeaguePosition,Last5PPG:N.PPG,SeasonPPG:N.SeasonPPG,lastGame:xe,formRun:N.formRun,goalDifference:N.goalDifference,goalDifferenceHomeOrAway:N.goalDifferenceHomeOrAway,CardsTotal:N.CardsTotal||"-",CornersAverage:N.AverageCorners||"-",FormTextStringHome:be,FavouriteRecord:Oe+". ".concat(N.reliabilityString),BTTSArray:re,Results:N.resultsAll,ResultsHorA:N.resultsHome.reverse()}),(wa=[]).push({name:a.awayTeam,Last5:x.away[2].LastFiveForm,LeagueOrAll:x.away[2].LeagueOrAll,AverageGoals:F.ScoredOverall/10,AverageConceeded:F.ConcededOverall/10,AverageXG:F.XGOverall,AverageXGConceded:F.XGAgainstAvgOverall,AveragePossession:F.AveragePossessionOverall,AverageShotsOnTarget:F.AverageShotsOnTargetOverall,AverageDangerousAttacks:F.AverageDangerousAttacksOverall,homeOrAway:"Away",leaguePosition:F.LeaguePosition,Last5PPG:F.PPG,SeasonPPG:F.SeasonPPG,lastGame:Ae,formRun:F.formRun,goalDifference:F.goalDifference,goalDifferenceHomeOrAway:F.goalDifferenceHomeOrAway,CardsTotal:F.CardsTotal||"-",CornersAverage:F.AverageCorners||"-",FormTextStringAway:fe,FavouriteRecord:je+". ".concat(F.reliabilityString),BTTSArray:oe,Results:F.resultsAll,ResultsHorA:F.resultsAway.reverse()}),Oa.length>1?(_a=Oa,Ga=ya,Sa="Points over time"):(_a=[ue,de,ie],Ga=[he,ge,me],Sa="Rolling average points over last 10"),r.a.render(Object(i.jsxs)("div",{style:s,children:[Object(i.jsx)("div",{className:"H2HStats",id:"H2HStats".concat(a.id)}),Object(i.jsx)("div",{className:"TrendsHome",id:"TrendsHome".concat(a.id)}),Object(i.jsx)("div",{className:"TrendsAway",id:"TrendsAway".concat(a.id)})]}),document.getElementById("history"+ce)),"Europe UEFA Women's Euro"===a.leagueName&&(a.homeTeamHomePosition="N/A",a.awayTeamAwayPosition="N/A"),Ta=y.slice(0,10).map((function(e){return Object(i.jsx)("div",{children:Object(i.jsx)(C,{classNameButton:"ResultButton",buttonText:Object(i.jsxs)("div",{className:"ResultRowOverviewSmall",children:[Object(i.jsx)("div",{className:"columnOverviewHomeSmall",children:e.homeTeam}),Object(i.jsxs)("span",{className:"columnOverviewScoreSmall",children:[e.homeGoals," : ",e.awayGoals]}),Object(i.jsx)("div",{className:"columnOverviewAwaySmall",children:e.awayTeam})]}),element:g(e)})})})),Pa=A.slice(0,10).map((function(e){return Object(i.jsx)("div",{children:Object(i.jsx)(C,{classNameButton:"ResultButton",buttonText:Object(i.jsxs)("div",{className:"ResultRowOverviewSmall",children:[Object(i.jsx)("div",{className:"columnOverviewHomeSmall",children:e.homeTeam}),Object(i.jsxs)("span",{className:"columnOverviewScoreSmall",children:[e.homeGoals," : ",e.awayGoals]}),Object(i.jsx)("div",{className:"columnOverviewAwaySmall",children:e.awayTeam})]}),element:g(e)})})})),ka=a.simlarGameResultsHome?a.simlarGameResultsHome.reverse().map((function(e){return Object(i.jsx)("div",{children:Object(i.jsx)(C,{classNameButton:"ResultButton",buttonText:Object(i.jsxs)("div",{className:"ResultRowOverviewSmall".concat(e.result),children:[Object(i.jsx)("div",{className:"columnOverviewHomeSmall",children:e.homeTeam}),Object(i.jsxs)("span",{className:"columnOverviewScoreSmall",children:[e.homeGoals," : ",e.awayGoals]}),Object(i.jsx)("div",{className:"columnOverviewAwaySmall",children:e.awayTeam})]}),element:h(e)})})})):Object(i.jsx)("h4",{className:"NoGames",children:"No previous games fit this profile"}),Ca=a.simlarGameResultsAway?a.simlarGameResultsAway.reverse().map((function(e){return Object(i.jsx)("div",{children:Object(i.jsx)(C,{classNameButton:"ResultButton",buttonText:Object(i.jsxs)("div",{className:"ResultRowOverviewSmall".concat(e.result),children:[Object(i.jsx)("div",{className:"columnOverviewHomeSmall",children:e.homeTeam}),Object(i.jsxs)("span",{className:"columnOverviewScoreSmall",children:[e.homeGoals," : ",e.awayGoals]}),Object(i.jsx)("div",{className:"columnOverviewAwaySmall",children:e.awayTeam})]}),element:h(e)})})})):Object(i.jsx)("h4",{children:"No previous games fit this profile"}),console.log(Aa[0].Results),e.next=372,b(Ct,a.homeTeam);case 372:Ba=e.sent,console.log(Ba),Ba?(Na=Ba.id.toString(),Fa=Ba.homeTeam,Da=Ba.awayTeam,La=Ba.time,Ha=Ba.homeGoals,Ra=Ba.awayGoals):(Na="0",Fa="N/A",Da="N/A",La=1,Ha="-",Ra="-"),1==N.completeData&&1==a.completeData?r.a.render(Object(i.jsx)(i.Fragment,{children:Object(i.jsxs)("div",{style:s,children:[Object(i.jsx)(C,{buttonText:"Lineups & match action",classNameButton:"Lineups",element:Object(i.jsx)(i.Fragment,{children:Object(i.jsx)(ys,{id:Na,team1:Fa,team2:Da,time:La,homeGoals:Ha,awayGoals:Ra})})}),Object(i.jsxs)("div",{className:"Chart",id:"Chart".concat(a.id),style:s,children:[Object(i.jsx)(js,{title:"XG Tipping Strength Ratings - All Games",data:[Pe,Ne,Le,Be,Me,ra,ua],data2:[Ve,Je,qe,$e,ta,la,ha],team1:a.homeTeam,team2:a.awayTeam}),Object(i.jsx)(js,{title:"XG Tipping Strength Ratings - Last 5 games",data:[ke,Fe,He,Xe,We,oa,ma],data2:[Ue,Ke,Ze,ea,sa,ia,va],team1:a.homeTeam,team2:a.awayTeam}),Object(i.jsx)(js,{title:"XG Tipping Strength Ratings - Home/Away Games Only",data:[Ce,De,Re,Ie,Ee,ca,ga],data2:[ze,Ye,Qe,aa,na,da,pa],team1:a.homeTeam,team2:a.awayTeam}),Object(i.jsx)(xs,{text:"H2H - Home Team | Away Team",data1:[2*N.avgScored,2*F.avgConceeded,3*N.avPointsAll,2*N.XGOverall,2*F.XGAgainstAvgOverall,N.AverageShotsOnTargetOverall,0!==N.AverageDangerousAttacksOverall?N.AverageDangerousAttacksOverall/7.5:N.AverageDangerousAttacks/7.5,N.AveragePossessionOverall/7.5,N.goalDifferenceHomeOrAway/10,N.AverageCorners],data2:[2*F.avgScored,2*N.avgConceeded,3*F.avPointsAll,2*F.XGOverall,2*N.XGAgainstAvgOverall,F.AverageShotsOnTargetOverall,0!==F.AverageDangerousAttacksOverall?F.AverageDangerousAttacksOverall/7.5:F.AverageDangerousAttacks/7.5,F.AveragePossessionOverall/7.5,F.goalDifferenceHomeOrAway/10,F.AverageCorners]}),Object(i.jsx)(Os,{height:3,depth:0,data1:_a,data2:Ga,team1:a.homeTeam,team2:a.awayTeam,type:Sa,tension:0}),Object(i.jsx)(Os,{height:Math.max(Ps[Ps.length-1],ks[ks.length-1])>2?Math.max(Ps[Ps.length-1],ks[ks.length-1]):2,depth:Math.min(Ps[Ps.length-1],ks[ks.length-1])<-2?Math.min(Ps[Ps.length-1],ks[ks.length-1]):-2,data1:Ps,data2:ks,team1:a.homeTeam,team2:a.awayTeam,type:"Goal difference over time",tension:.3})]}),Object(i.jsxs)("div",{style:s,children:[Object(i.jsx)(j,{className:"MatchTime",text:"Kick off: ".concat(le," GMT")}),Object(i.jsx)(j,{text:"Last league games (most recent first)",className:"LastGameHeader"})]}),Object(i.jsxs)("div",{className:"flex-container",children:[Object(i.jsx)("div",{className:"flex-childOneOverviewSmall",children:Ta}),Object(i.jsx)("div",{className:"flex-childTwoOverviewSmall",children:Pa})]}),Object(i.jsxs)("div",{className:"flex-container",children:[Object(i.jsx)(v,{}),Object(i.jsx)(p,{})]}),Object(i.jsx)("h2",{children:"Results from similar profile games"}),Object(i.jsx)("span",{children:"(Games where each team had similar odds)"}),Object(i.jsx)("h3",{children:"Most recent first"}),Object(i.jsxs)("div",{className:"flex-container-similar",children:[Object(i.jsx)("div",{className:"flex-childOneOverviewSmall",children:ka}),Object(i.jsx)("div",{className:"flex-childTwoOverviewSmall",children:Ca})]}),Object(i.jsx)("input",{type:"hidden",name:"IL_IN_ARTICLE"}),Object(i.jsx)(u,{className:"MoreStats",onClickEvent:function(){return ts(a.id,a.homeTeam,a.awayTeam,Aa[0].BttsPercentage,Aa[0].BttsPercentageHomeOrAway,wa[0].BttsPercentage,wa[0].BttsPercentageHomeOrAway)},text:"Fixture trends"})]})}),document.getElementById("stats"+ce)):(N.completeData=0==a.completeData)&&r.a.render(Object(i.jsx)(i.Fragment,{children:Object(i.jsxs)("div",{style:s,children:[Object(i.jsx)(C,{buttonText:"Lineups & match action",classNameButton:"Lineups",element:Object(i.jsx)(i.Fragment,{children:Object(i.jsx)(ys,{id:Na,team1:Fa,team2:Da,time:La,homeGoals:Ha,awayGoals:Ra})})}),Object(i.jsx)("div",{className:"Chart",id:"Chart".concat(a.id),style:s,children:Object(i.jsx)(js,{title:"XG Tipping Strength Ratings - All Games",data:[Pe,Ne,Le,Be,Me,ra,ua],data2:[Ve,Je,qe,$e,ta,la,ha],team1:a.homeTeam,team2:a.awayTeam})}),Object(i.jsx)("div",{style:s,children:Object(i.jsx)(j,{className:"MatchTime",text:"Kick off: ".concat(le," GMT")})}),Object(i.jsx)("h2",{children:"Results from similar profile games"}),Object(i.jsx)("span",{children:"(Games where each team had similar odds)"}),Object(i.jsx)("h3",{children:"Most recent first"}),Object(i.jsxs)("div",{className:"flex-container-similar",children:[Object(i.jsx)("div",{className:"flex-childOneOverviewSmall",children:ka}),Object(i.jsx)("div",{className:"flex-childTwoOverviewSmall",children:Ca})]}),Object(i.jsx)("input",{type:"hidden",name:"IL_IN_ARTICLE"}),Object(i.jsx)(u,{className:"MoreStats",onClickEvent:function(){return ts(a.id,a.homeTeam,a.awayTeam,Aa[0].BttsPercentage,Aa[0].BttsPercentageHomeOrAway,wa[0].BttsPercentage,wa[0].BttsPercentageHomeOrAway)},text:"Fixture trends"})]})}),document.getElementById("stats"+ce));case 376:case"end":return e.stop()}}),e)}))),Cs.apply(this,arguments)}var Ns,Fs,Ds,Ls=t(25),Hs=t(56),Rs={dataHome:localStorage.getItem("homeForm"),dataAway:localStorage.getItem("awayForm"),dataHomeDef:localStorage.getItem("homeFormDef"),dataAwayDef:localStorage.getItem("awayFormDef"),allTeamResultsHome:localStorage.getItem("allTeamResultsHome"),allTeamResultsAway:localStorage.getItem("allTeamResultsAway"),homeDetails:localStorage.getItem("homeDetails"),awayDetails:localStorage.getItem("awayDetails"),fixtureDetails:localStorage.getItem("fixtureDetails")},Bs=Object(Hs.b)({name:"data",initialState:Rs,reducers:{setData:function(e,a){e.data=a.payload}}}),Xs=Bs.actions.setData,Is=Bs.reducer,Ms=Object(Hs.a)({reducer:{data:Is}});function Ws(e,a){var t,n,r=e.status,o=Ns;if(!0===e.fixture.omit&&"complete"!==r)return o=!0,Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("div",{className:"KOTime",children:"".concat(e.fixture.time)}),Object(i.jsx)("div",{className:"Omitted",children:"".concat(e.fixture.goalsA," - ").concat(e.fixture.goalsB)},e.fixture.awayTeam)]});if(!0===Ds&&"complete"===r)return o=!1,Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("div",{className:"Result",children:"".concat(e.fixture.homeGoals," - ").concat(e.fixture.awayGoals)}),Object(i.jsx)("div",{className:"CorrectScore","data-cy":"score-"+e.fixture.id,children:"".concat(e.fixture.goalsA," - ").concat(e.fixture.goalsB)},e.fixture.homeTeam)]});if(!0===Ds&&"complete"!==r)return o=!0,Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("div",{className:"KOTime",children:"".concat(e.fixture.time)}),Object(i.jsx)("div",{className:"score",children:"".concat(e.fixture.goalsA," - ").concat(e.fixture.goalsB)},e.fixture.awayTeam)]});if(!1===o&&"complete"!==r)return Object(i.jsx)("div",{className:"divider","data-cy":"divider-"+e.fixture.id,children:"V"});if(!1===o&&"complete"===r)return Object(i.jsx)("div",{className:"Result","data-cy":"result-"+e.fixture.id,children:"".concat(e.fixture.homeGoals," - ").concat(e.fixture.awayGoals)});if(!0!==o||"complete"!==r)return Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("div",{className:"KOTime",children:"".concat(e.fixture.time)}),Object(i.jsx)("div",{className:"score",children:"".concat(e.fixture.goalsA," - ").concat(e.fixture.goalsB)},e.fixture.awayTeam)]});switch(!0){case e.fixture.homeGoals>e.fixture.awayGoals:t=0,e.fixture.winner=e.fixture.homeTeam,e.fixture.outcome="homeWin";break;case e.fixture.homeGoals===e.fixture.awayGoals:t=1,e.fixture.winner="draw",e.fixture.outcome="draw";break;case e.fixture.homeGoalse.fixture.goalsB:n=0;break;case e.fixture.goalsA===e.fixture.goalsB:n=1;break;case e.fixture.goalsA0?Lt[e.leagueIndex].id:null;return null===t||!0===a?Object(i.jsx)("div",{}):Object(i.jsxs)("div",{children:[Object(i.jsxs)("div",{className:"leagueName",id:"league".concat(s),onClick:function(){return function(e,a,t){return Ut.apply(this,arguments)}(e.leagueIndex,Lt[e.leagueIndex],s)},children:[e.leagueName," \u2630"]},"leagueName".concat(s,"div")),Object(i.jsx)("div",{className:"LeagueTable",id:"leagueName".concat(s)},"leagueName".concat(s))]})}function Vs(e){var a=e.fixture,t=e.count,s=e.mock,n=Object(Ls.b)();function r(){var e={id:a.id,homeTeamName:a.homeTeam,homeId:a.homeId,homeTeamBadge:a.homeBadge,awayTeamName:a.awayTeam,awayId:a.awayId,awayTeamBadge:a.awayBadge,stadium:a.stadium,time:a.time,homeGoals:a.goalsA,awayGoals:a.goalsB},t={"Attacking Strength":a.formHome.attackingStrength,"Defensive Strength":a.formHome.defensiveStrength},s={"Attacking Strength":a.formAway.attackingStrength,"Defensive Strength":a.formAway.defensiveStrength};a.formHome.defensiveMetrics["Clean Sheet Percentage"]=a.formHome.CleanSheetPercentage,a.formAway.defensiveMetrics["Clean Sheet Percentage"]=a.formAway.CleanSheetPercentage,localStorage.setItem("homeForm",JSON.stringify(a.formHome.attackingMetrics)),localStorage.setItem("homeFormDef",JSON.stringify(a.formHome.defensiveMetrics)),localStorage.setItem("allTeamResultsHome",JSON.stringify(a.formHome.allTeamResults)),localStorage.setItem("homeDetails",JSON.stringify(t)),localStorage.setItem("awayForm",JSON.stringify(a.formAway.attackingMetrics)),localStorage.setItem("awayFormDef",JSON.stringify(a.formAway.defensiveMetrics)),localStorage.setItem("allTeamResultsAway",JSON.stringify(a.formAway.allTeamResults)),localStorage.setItem("awayDetails",JSON.stringify(s)),localStorage.setItem("fixtureDetails",JSON.stringify(e)),n(Xs({key1:"value1",key2:"value2"}))}function o(){return(o=Object(l.a)(Object(c.a)().mark((function e(a){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!0!==ye){e.next=5;break}r(),window.open("/#/fixture"),e.next=6;break;case 5:return e.abrupt("return");case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return Object(i.jsxs)("div",{children:[Es(a,s),Object(i.jsxs)("div",{className:"individualFixtureContainer".concat(a.omit),children:[Object(i.jsxs)("li",{className:"individualFixture".concat(a.omit),"data-cy":a.id,children:[Object(i.jsx)("div",{className:"HomeOdds",children:a.fractionHome}),Object(i.jsx)("div",{className:"homeTeam",children:a.homeTeam}),Object(i.jsx)(Ws,{result:Ns,status:a.status,fixture:a}),Object(i.jsx)("div",{className:"awayTeam",children:a.awayTeam}),Object(i.jsx)(f,{image:a.homeBadge,ClassName:"HomeBadge",alt:"Home team badge",flexShrink:5}),Object(i.jsx)(f,{image:a.awayBadge,ClassName:"AwayBadge",alt:"Away team badge"}),Object(i.jsx)("div",{className:"AwayOdds",children:a.fractionAway})]},a.id),Object(i.jsxs)("button",{className:"GameStats",onClick:function(){return!1===s?function(e,a){return Cs.apply(this,arguments)}(a,t):null},onMouseDown:function(){return t=Fs=!t},children:["Game overview ","\u2195"]}),Object(i.jsxs)("button",{className:"GameStatsTwo",onClick:function(){return function(e){return o.apply(this,arguments)}(a)},children:["More detail ","\u29c9"]})]}),Object(i.jsx)("div",{id:"stats"+a.homeTeam}),Object(i.jsx)("div",{className:"MatchHistory",id:"history"+a.homeTeam})]},a.game)}var Us=function(e){var a=e.fixtures,t=e.mock;return Object(i.jsxs)("div",{children:[Object(i.jsx)("div",{id:"Headers"}),Object(i.jsx)("ul",{className:"FixtureList",id:"FixtureList",children:a.map((function(e,a){return Object(i.jsx)(Vs,{fixture:e,count:Fs,mock:t},e.game)}))})]})};function zs(e){var a=Object(s.useState)(!1),t=Object(o.a)(a,2);return Fs=t[0],t[1],Ns=e.result,Object(i.jsx)(Ls.a,{store:Ms,children:Object(i.jsx)(Us,{fixtures:e.fixtures,result:Ns,count:Fs,mock:e.mock})})}var Js,Ks,Ys,qs,Zs,Qs,$s,en,an,tn,sn,nn,rn,on,cn,ln,dn,un,mn=t(71),gn=t(134),hn=t(135),vn=t(136),pn=t(137),bn=t(138),fn=t(139),On=t(140),jn=t(141),xn=t(142),yn=t(143),An=[],wn=[],_n=[],Gn=[11084,7432,9660,9663,9582,9581,9700,9665,9636,9655,9697,9674,9984,9653,9577,10969,9545,10976,9954,9889,9553,9580,10946,9675,9808,9656,9741,9621,9637,9639,9638,9890,10977,11321,11212,10994,9525,9972,10505,11102];function Sn(){return Sn=Object(l.a)(Object(c.a)().mark((function e(){var a,t,n,d,m,g,h,v,f,O,j,x,y,A,w,_,G,S,T,P,k,N;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return N=function(){return(N=Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r.a.render(Object(i.jsxs)("div",{className:"FixtureButtons",children:[Object(i.jsx)("div",{className:"historicResults",children:Object(i.jsx)(u,{text:"Last Saturday",className:"HistoricFixturesButton",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=An,e.next=3,qt("lastSaturday",tn,p,sn,!1,Js,nn);case 3:return e.t1=e.sent,e.abrupt("return",e.t0.push.call(e.t0,e.t1));case 5:case"end":return e.stop()}}),e)})))})}),Object(i.jsx)(u,{text:"<",className:"FixturesButton",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n(1,$s);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}}),e)})))}),Object(i.jsx)(u,{text:void 0!==an?an:$s,className:"FixturesButton",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=An,e.next=3,qt("todaysFixtures",un,p,an,!1,Js,en);case 3:return e.t1=e.sent,e.abrupt("return",e.t0.push.call(e.t0,e.t1));case 5:case"end":return e.stop()}}),e)})))}),Object(i.jsx)(u,{text:"Today",className:"FixturesButtonToday",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=An,e.next=3,qt("todaysFixtures",Js,p,Ks,!0,Js,Ys);case 3:return e.t1=e.sent,e.abrupt("return",e.t0.push.call(e.t0,e.t1));case 5:case"end":return e.stop()}}),e)})))}),Object(i.jsx)(u,{text:"Tomorrow",className:"FixturesButton",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=An,e.next=3,qt("tomorrowsFixtures",qs,p,Zs,!0,Js,Qs);case 3:return e.t1=e.sent,e.abrupt("return",e.t0.push.call(e.t0,e.t1));case 5:case"end":return e.stop()}}),e)})))})]}),document.getElementById("Buttons"));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)},k=function(){return N.apply(this,arguments)},S=function(){return(S=Object(l.a)(Object(c.a)().mark((function e(a){var t,s,n,r,o;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=new Date(a),s=t.getFullYear(),n=String(t.getMonth()+1).padStart(2,"0"),r=String(t.getDate()).padStart(2,"0"),o="".concat(s,"-").concat(n,"-").concat(r),e.abrupt("return",o);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)},G=function(e){return S.apply(this,arguments)},g=function(){return(g=Object(l.a)(Object(c.a)().mark((function e(a){var t,s,n;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=a.getDate(),s=a.getMonth()+1,n=a.getFullYear(),e.abrupt("return",["".concat(s).concat(t).concat(n),"".concat(n,"-").concat(s,"-").concat(t)]);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)},m=function(e){return g.apply(this,arguments)},d=function(){return(d=Object(l.a)(Object(c.a)().mark((function e(t,s){var n,r;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a-=t,console.log(a),!(a>-120)){e.next=17;break}return s.setDate(s.getDate()-t),e.next=6,G(s);case 6:return en=e.sent,e.next=9,m(s);case 9:return n=e.sent,r=Object(o.a)(n,2),s=r[0],an=r[1],dn=an,un=s,e.next=17,k();case 17:case"end":return e.stop()}}),e)})))).apply(this,arguments)},n=function(e,a){return d.apply(this,arguments)},t=function(){return(t=Object(l.a)(Object(c.a)().mark((function e(t,s){var n,r;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a+=t,s.setDate(s.getDate()+t),e.next=4,G(s);case 4:return en=e.sent,e.next=7,m(s);case 7:return n=e.sent,r=Object(o.a)(n,2),s=r[0],an=r[1],dn=an,e.next=14,k();case 14:case"end":return e.stop()}}),e)})))).apply(this,arguments)},function(e,a){return t.apply(this,arguments)},a=0,$s=new Date,dn="Today",e.next=15,m(new Date);case 15:return h=e.sent,v=Object(o.a)(h,2),Js=v[0],Ks=v[1],(rn=new Date).setDate(rn.getDate()+1),e.next=23,m(rn);case 23:return f=e.sent,O=Object(o.a)(f,2),qs=O[0],Zs=O[1],(on=new Date).setDate(on.getDate()-1),e.next=31,m(on);case 31:return j=e.sent,x=Object(o.a)(j,2),x[0],x[1],(cn=new Date).setDate(cn.getDate()-(cn.getDay()+6)%7),cn.setDate(cn.getDate()-2),e.next=40,m(cn);case 40:return y=e.sent,A=Object(o.a)(y,2),tn=A[0],sn=A[1],(ln=new Date).setDate(ln.getDate()-(ln.getDay()+6)%7),ln.setDate(ln.getDate()-9),e.next=49,m(ln);case 49:return w=e.sent,_=Object(o.a)(w,2),_[0],_[1],e.next=55,G(new Date);case 55:return Ys=e.sent,e.next=58,G(rn);case 58:return Qs=e.sent,e.next=61,G(on);case 61:return e.sent,e.next=64,G(cn);case 64:return nn=e.sent,e.next=67,G(ln);case 67:e.sent,"Select a day you would like to retrieve fixtures for from the options above\n A list of games will be returned once the data has loaded\n Once all fixtures have loaded, click on \u201cGet Predictions\u201d to see XGTipping's forecasted outcomes for every game\n If a game has completed, the predictions is displayed on the right and the actual result on the left\n Each individual fixture is tappable/clickable. By doing so, you can access a range of detailed stats, from comparative charts, granular performance measures to previous meetings.\n All games are subject to the same automated prediction algorithm with the outcome being a score prediction. Factors that determine the tip include the following, amongst others:\n - Goal differentials\n - Expected goal differentials \n - Attack/Defence performance\n - Form trends over time\n - Home/Away records\n - WDL records\n - Points per game \n - A range of other comparative factors\n \u2013\n","A range of tools are available should you wish to use them\n Build a multi - Use the '+' or '-' buttons to add or remove a game deemed to be one of XGTIpping's highest confidence tips from the day\n Exotic of the day: A pre-built exotic multi comprising of XGTipping's highest confidence tips\n BTTS games: Games where both teams to score is deemed a likely outcome\n Over 2.5 goals tips: Games where over 2.5 goals are most likely to be scored\n XG tips: Comprises only games where the expected goal differentials between each team are at their greatest. We believe this shows a true disparity in the form of the two opposing teams\n Tap the 'How to use' option to hide this text",T="Select a day you would like to retrieve fixtures for from the options above\n A list of games will be returned once the data has loaded\n Once all fixtures have loaded, click on \u201cGet Predictions\u201d to see XGTipping's forecasted outcomes for every game\n If a game has completed, the predictions is displayed on the right and the actual result on the left\n Each individual fixture is tappable/clickable. By doing so, you can access a range of detailed stats, from comparative charts, granular performance measures to previous meetings.\n All games are subject to the same automated prediction algorithm with the outcome being a score prediction. Factors that determine the tip include the following, amongst others:\n - Goal differentials\n - Expected goal differentials \n - Attack/Defence performance\n - Form trends over time\n - Home/Away records\n - WDL records\n - Points per game \n - A range of other comparative factors\n \u2013\n".concat("A range of tools are available should you wish to use them\n Build a multi - Use the '+' or '-' buttons to add or remove a game deemed to be one of XGTIpping's highest confidence tips from the day\n Exotic of the day: A pre-built exotic multi comprising of XGTipping's highest confidence tips\n BTTS games: Games where both teams to score is deemed a likely outcome\n Over 2.5 goals tips: Games where over 2.5 goals are most likely to be scored\n XG tips: Comprises only games where the expected goal differentials between each team are at their greatest. We believe this shows a true disparity in the form of the two opposing teams\n Tap the 'How to use' option to hide this text"),P=T.split("\n").map((function(e){return Object(i.jsx)("p",{children:e})})),r.a.render(Object(i.jsxs)("div",{className:"FixtureButtons",children:[Object(i.jsx)("div",{className:"historicResults",children:Object(i.jsx)(u,{text:"Last Saturday",className:"HistoricFixturesButton",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=An,e.next=3,qt("lastSaturday",tn,p,sn,!1,Js,nn);case 3:return e.t1=e.sent,e.abrupt("return",e.t0.push.call(e.t0,e.t1));case 5:case"end":return e.stop()}}),e)})))})}),Object(i.jsx)(u,{text:"<",className:"FixturesButton",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n(1,$s);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}}),e)})))}),Object(i.jsx)(u,{text:"".concat(dn),className:"FixturesButtonToday",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=An,e.next=3,qt("todaysFixtures",Js,p,Ks,!0,Js,Ys);case 3:return e.t1=e.sent,e.abrupt("return",e.t0.push.call(e.t0,e.t1));case 5:case"end":return e.stop()}}),e)})))}),Object(i.jsx)(u,{text:"Tomorrow",className:"FixturesButton",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=An,e.next=3,qt("tomorrowsFixtures",qs,p,Zs,!0,Js,Qs);case 3:return e.t1=e.sent,e.abrupt("return",e.t0.push.call(e.t0,e.t1));case 5:case"end":return e.stop()}}),e)})))}),Object(i.jsx)("span",{children:"*Not enough data to predict games in the first few gameweeks - predictions displayed as 'x - x'"})]}),document.getElementById("Buttons")),r.a.render(Object(i.jsxs)("div",{className:"OddsRadios",children:[Object(i.jsx)(b,{value:"Fractional odds"}),Object(i.jsx)(b,{value:"Decimal odds"})]}),document.getElementById("Checkbox")),r.a.render(Object(i.jsx)(s.Fragment,{children:Object(i.jsx)(C,{buttonText:"How to use",element:P})}),document.getElementById("XGDiff"));case 75:case"end":return e.stop()}}),e)}))),Sn.apply(this,arguments)}!function(){var e=Object(l.a)(Object(c.a)().mark((function e(){var a,t,s,n,r,o,i,d;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch("".concat("https://api.xgtipping.com/","leagueList"));case 2:return a=e.sent,e.next=5,a.json().then((function(e){t=Array.from(e.data)}));case 5:s=0;case 6:if(!(st.indexOf(r)?1:-1})),e.abrupt("return",a);case 2:case"end":return e.stop()}}),e)})));return function(a,t,s){return e.apply(this,arguments)}}(),r=t[s],o=t[s].name,i=0;i1&&(s.setState({incrementValue:s.state.incrementValue-1}),s.setState({riskLevel:s.state.riskLevel-1}),N=s.state.incrementValue-1,F=s.state.riskLevel-1),Sa(ha)},s.DecreaseItem=function(){N>0&&(s.setState({incrementValue:s.state.incrementValue+1}),s.setState({riskLevel:s.state.riskLevel+1}),N=s.state.incrementValue+1,F=s.state.riskLevel+1),Sa(ha)},s.state={incrementValue:N,riskLevel:F,show:!0},s}return Object(g.a)(t,[{key:"render",value:function(){return Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("button",{className:"IncrementButton",onClick:this.IncrementItem,children:"-"}),Object(i.jsx)("button",{className:"DecrementButton",onClick:this.DecreaseItem,children:"+"})]})}}]),t}(s.Component);function L(e,a,t,s,n){return H.apply(this,arguments)}function H(){return(H=Object(l.a)(Object(c.a)().mark((function e(a,t,s,n,r){var o,l,i,d,u,m;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return o=a.bttsAllPercentageHome,l=a.bttsPercentageHomeHome,i=a.bttsPercentageAwayAway,d=a.bttsAllPercentageAway,u=t,m=s,a.combinedBTTS=(o+d)/2,"N/A"!==a.bttsFraction&&"suspended"!==a.status&&"canceled"!==a.status&&(o>55&&d>55&&l>55&&i>55&&a.awayOdds<4&&a.awayOdds>1.3&&u>=1&&m>=1?(a.btts=!0,a.bttsChosen=!0,a.totalGoals=a.rawFinalHomeGoals+a.rawFinalAwayGoals):(a.btts=!1,a.bttsChosen=!1)),e.abrupt("return",a);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var R=t(145),B=t(125),X=t(126),I=t(146),M=t(127);t(94),t(95);R.a.use([B.a,X.a]);var W=function(e){return Object(i.jsxs)(I.a,{effect:"coverflow",autoHeight:!0,grabCursor:!0,centeredSlides:!0,slidesPerView:1,coverflowEffect:{rotate:50,stretch:0,depth:100,modifier:1,slideShadows:!1},pagination:{clickable:!0},className:"mySwiper",children:[Object(i.jsx)(M.a,{children:e.element}),Object(i.jsx)(M.a,{children:e.element2}),Object(i.jsx)(M.a,{children:e.element3}),Object(i.jsx)(M.a,{children:e.element4}),Object(i.jsx)(M.a,{children:e.element5})]})},E=t(68),V=t.n(E),U=function(e){return Object(i.jsx)(V.a,{className:"kofi-button",color:"#030061",title:e.buttonText,kofiID:"H2H0AX25Z"})},z=0,J=0,K=0,Y=0;var q,Z,Q,$,ee,ae,te=function(e){var a=Object(s.useState)(0),t=Object(o.a)(a,2),n=t[0],r=t[1];return Object(i.jsx)(w.a,{"aria-label":"Always visible",value:n,sx:{width:"90%",color:"#030061"},onChange:function(a,t){switch(r(t),!0){case"xg"===e.useCase:z=t;break;case"gd"===e.useCase:J=t;break;case"gdHorA"===e.useCase:K=t;break;case"last10"===e.useCase:Y=t}},step:1,marks:e.marks,valueLabelDisplay:"auto",min:parseFloat(e.lower),max:parseFloat(e.upper)})};(new Headers).append("Origin","https://gregdorward.github.io");var se=0,ne=0,re=0,oe=0,ce=0,le=0,ie=0,de=0,ue=0,me=0,ge=0,he=0,ve=0,pe=0,be=0,fe=0,Oe=0,je=0,xe=0,ye=!1;function Ae(e){return we.apply(this,arguments)}function we(){return(we=Object(l.a)(Object(c.a)().mark((function e(a){var t,s,n,r,l,i,d;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=new Date(1e3*a),s=t.toLocaleDateString("en-US").split("/"),n=Object(o.a)(s,3),r=n[0],l=n[1],i=n[2],d="".concat(i,"-").concat(r,"-").concat(l),e.abrupt("return",d);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function _e(e){var a,t=0;try{return e.forEach((function(e){switch(!0){case"W"===e:a=3;break;case"D"===e:a=1;break;case"L"===e:a=0}t+=a})),t}catch(s){return console.log(s),"N/A"}}function Ge(e,a,t,s){return Se.apply(this,arguments)}function Se(){return(Se=Object(l.a)(Object(c.a)().mark((function e(a,t,s,n){var r,o,l,i,d,u,m,g,h,v,p,b,f,O,j,x,y,A,w,_,G,S,T,P,k,C,N,F,D,L,H,R,B,X,I,M,W,E,V,U,z,J,K,Y,q,Z,Q,$,ee,ae,te,se,ne,re,oe,ce,le,ie,de,ue,me,ge,he,ve,pe,be,fe,Oe,je,xe,ye,we,_e,Ge,Se,Pe,ke,Ce,Fe,De,Le,He,Re,Be,Xe,Ie,Me,We,Ee,Ve,Ue,ze,Je,Ke,Ye,qe,Ze,Qe,$e,ea,aa,ta,sa,na,ra,oa,ca,la,ia,da,ua,ma,ga,ha,va,pa,ba,fa,Oa,ja,xa,ya,Aa,wa,_a,Ga,Sa,Ta,Pa,ka,Ca,Na,Fa,Da,La,Ha,Ra,Ba,Xa,Ia,Ma,Wa,Ea,Va,Ua,za,Ja,Ka,Ya,qa,Za,Qa,$a,et,at,tt,st,nt,rt,ot,ct,lt,it,dt,ut,mt,gt,ht,vt,pt,bt,ft,Ot,jt,xt,yt,At,wt,_t,Gt,St,Tt,Pt,kt,Ct,Nt,Ft,Dt,Ht,Rt,Bt,Xt,It,Mt,Wt,Et,Vt,Ut,zt,Jt,Kt,Yt,qt,Zt,Qt,$t,es,as,ts,ss,ns,rs,os,cs,ls,is,ds,us,ms,gs,hs,vs,ps,bs;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n.completeData=!0,r=t.date,!(Lt[t.leagueIndex].fixtures.length>10)){e.next=448;break}o=(o=Lt[t.leagueIndex].fixtures.filter((function(e){return e.home_name===a}))).filter((function(e){return e.date_unix0&&y.awayGoalCount>0,e.t20=y.homeGoalCount>y.awayGoalCount?3:y.homeGoalCounty.awayGoalCount?"W":y.homeGoalCounty.awayGoalCount?v+1:v+0,p=y.odds_ft_1y.odds_ft_2?h+1:h+0,f=y.odds_ft_1>y.odds_ft_2&&y.homeGoalCount>y.awayGoalCount?f+1:f+0,O=y.odds_ft_1>y.odds_ft_2&&y.homeGoalCount===y.awayGoalCount?O+1:O+0,j=y.odds_ft_1>y.odds_ft_2&&y.homeGoalCount0&&w.awayGoalCount>0,e.t43=w.homeGoalCount>w.awayGoalCount?0:w.homeGoalCountw.awayGoalCount?"L":w.homeGoalCountw.odds_ft_2?g+1:g+0,v=w.odds_ft_1>w.odds_ft_2&&w.homeGoalCountw.odds_ft_2&&w.homeGoalCount===w.awayGoalCount?p+1:p+0,b=w.odds_ft_1>w.odds_ft_2&&w.homeGoalCount>w.awayGoalCount?b+1:b+0,h=w.odds_ft_1w.awayGoalCount?j+1:j+0;case 98:A++,e.next=61;break;case 101:_=i,G=d,console.log(t.homeTeam),console.log(a),t.homeTeam===a?(S=t.homeOdds)<=1.5?(T=_.filter((function(e){return e.oddsHome<=1.45})),P=G.filter((function(e){return e.oddsAway<=1.45})),n.simlarGameResultsHome=T.concat(P).sort((function(e,a){return e.dateRaw-a.dateRaw}))):S<=2.1?(k=_.filter((function(e){return e.oddsHome<=2.1&&e.oddsHome>1.45})),C=G.filter((function(e){return e.oddsAway<=2.1&&e.oddsAway>1.45})),t.simlarGameResultsHome=k.concat(C).sort((function(e,a){return e.dateRaw-a.dateRaw}))):S<=2.75?(N=_.filter((function(e){return e.oddsHome<=2.75&&e.oddsHome>2.1})),F=G.filter((function(e){return e.oddsAway<=2.75&&e.oddsAway>2.1})),t.simlarGameResultsHome=N.concat(F).sort((function(e,a){return e.dateRaw-a.dateRaw}))):S<=4?(D=_.filter((function(e){return e.oddsHome<=4&&e.oddsHome>2.75})),L=G.filter((function(e){return e.oddsAway<=4&&e.oddsAway>2.75})),t.simlarGameResultsHome=D.concat(L).sort((function(e,a){return e.dateRaw-a.dateRaw}))):S>4&&(H=_.filter((function(e){return e.oddsHome>4})),R=G.filter((function(e){return e.oddsAway>4})),t.simlarGameResultsHome=H.concat(R).sort((function(e,a){return e.dateRaw-a.dateRaw}))):t.awayTeam===a&&((B=t.awayOdds)<=1.5?(X=_.filter((function(e){return e.oddsHome<=1.45})),I=G.filter((function(e){return e.oddsAway<=1.45})),t.simlarGameResultsAway=X.concat(I).sort((function(e,a){return e.dateRaw-a.dateRaw}))):B<=2.1?(M=_.filter((function(e){return e.oddsHome<=2.1&&e.oddsHome>1.45})),W=G.filter((function(e){return e.oddsAway<=2.1&&e.oddsAway>1.45})),t.simlarGameResultsAway=M.concat(W).sort((function(e,a){return e.dateRaw-a.dateRaw}))):B<=2.75?(E=_.filter((function(e){return e.oddsHome<=2.75&&e.oddsHome>2.1})),V=G.filter((function(e){return e.oddsAway<=2.75&&e.oddsAway>2.1})),t.simlarGameResultsAway=E.concat(V).sort((function(e,a){return e.dateRaw-a.dateRaw}))):B<=4?(U=_.filter((function(e){return e.oddsHome<=4&&e.oddsHome>2.75})),z=G.filter((function(e){return e.oddsAway<=4&&e.oddsAway>2.75})),t.simlarGameResultsAway=U.concat(z).sort((function(e,a){return e.dateRaw-a.dateRaw}))):B>4&&(J=_.filter((function(e){return e.oddsHome>4.5})),K=G.filter((function(e){return e.oddsAway>4.5})),t.simlarGameResultsAway=J.concat(K).sort((function(e,a){return e.dateRaw-a.dateRaw})))),Y=_.concat(G).sort((function(e,a){return e.dateRaw-a.dateRaw})),q=_.sort((function(e,a){return a.dateRaw-e.dateRaw})),Z=G.sort((function(e,a){return a.dateRaw-e.dateRaw})),console.log(t.game),console.log(Y),console.log(q),n.allTeamResults=Y.sort((function(e,a){return a.dateRaw-e.dateRaw})),Q=Y.map((function(e){return e.points})).slice(0,6),$=Q.reduce((function(e,a){return e+a}),0),n.avPoints6=$/Q.length,ee=Y.map((function(e){return e.points})).slice(0,5),ae=ee.reduce((function(e,a){return e+a}),0),n.avPoints5=ae/ee.length,te=Y.map((function(e){return e.points})),se=te.reduce((function(e,a){return e+a}),0),n.avPointsAll=se/te.length,ne=Y.map((function(e){return e.result})),re=q.map((function(e){return e.result})),oe=Z.map((function(e){return e.result})),n.resultsAll=ne.slice(0,6),n.resultsHome=re.slice(0,6),n.resultsAway=oe.slice(0,6),ce=Y.map((function(e){return e.scored})).slice(0,5),le=ce.reduce((function(e,a){return e+a}),0),n.avScoredLast5=le/ce.length,ie=Y.map((function(e){return e.conceeded})).slice(0,5),de=ie.reduce((function(e,a){return e+a}),0),n.avConceededLast5=de/ie.length,ue=Y.map((function(e){return e.dangerousAttacks})).slice(0,5),me=ue.reduce((function(e,a){return e+a}),0),n.avDALast5=me/ue.length,ge=Y.map((function(e){return e.sot})).slice(0,5),he=ge.reduce((function(e,a){return e+a}),0),n.avSOTLast5=he/ge.length,ve=Y.map((function(e){return e.sotAgainst})).slice(0,5),pe=ve.reduce((function(e,a){return e+a}),0),n.avSOTAgainstLast5=pe/ve.length,be=Y.map((function(e){return e.shots})).slice(0,5),fe=be.reduce((function(e,a){return e+a}),0),n.avShotsLast5=fe/be.length,Oe=Y.map((function(e){return e.corners})).slice(0,5),je=Oe.reduce((function(e,a){return e+a}),0),n.avCornersLast5=je/Oe.length,xe=Y.map((function(e){return e.possession})).slice(0,6),ye=xe.reduce((function(e,a){return e+a}),0),n.avPosessionLast5=ye/xe.length,we=Y.map((function(e){return e.XG})).slice(0,5),_e=we.reduce((function(e,a){return e+a}),0),n.avXGLast5=_e/we.length,Ge=Y.map((function(e){return e.XGAgainst})).slice(0,5),Se=Ge.reduce((function(e,a){return e+a}),0),n.avXGAgainstLast5=Se/Ge.length,Pe=u/o.length,ke=m/l.length,n.favouriteCount=g,n.winningFavouriteCount=v,n.drawingFavouriteCount=p,n.beatenFavouriteCount=b,n.underdogCount=h,n.winningUnderdogCount=f,n.drawingUnderdogCount=O,n.beatenUnderdogCount=j,n.oddsReliabilityWin=g>0?n.winningFavouriteCount/n.favouriteCount*100:0,n.oddsReliabilityDraw=g>0?n.drawingFavouriteCount/n.favouriteCount*100:0,n.oddsReliabilityLose=g>0?n.beatenFavouriteCount/n.favouriteCount*100:0,n.oddsReliabilityWinAsUnderdog=h>0?n.winningUnderdogCount/n.underdogCount*100:0,n.oddsReliabilityDrawAsUnderdog=h>0?n.drawingUnderdogCount/n.underdogCount*100:0,n.oddsReliabilityLoseAsUnderdog=h>0?n.beatenUnderdogCount/n.underdogCount*100:0,n.reliableIndicator=n.winningFavouriteCount+n.beatenUnderdogCount,n.unreliableIndicator=n.beatenFavouriteCount+n.drawingFavouriteCount+n.winningUnderdogCount+n.drawingUnderdogCount,n.predictabilityScore=n.reliableIndicator/n.unreliableIndicator,e.t46=!0,e.next=e.t46===n.predictabilityScore<.3?180:e.t46===(n.predictabilityScore>=.3&&n.predictabilityScore<.8)?182:e.t46===(n.predictabilityScore>=.8&&n.predictabilityScore<1.2)?184:e.t46===(n.predictabilityScore>=1.2&&n.predictabilityScore<1.7)?186:e.t46===(n.predictabilityScore>=1.7&&n.predictabilityScore<2.2)?188:e.t46===n.predictabilityScore>=2.2?190:192;break;case 180:return Ce="Odds have been an extremely unreliable indicator of actual performance so far this season. Maybe best avoided?",e.abrupt("break",193);case 182:return Ce="Odds have been an unreliable indicator of actual performance so far this season",e.abrupt("break",193);case 184:return Ce="Odds have been a decent indicator of actual performance so far this season",e.abrupt("break",193);case 186:return Ce="Odds have been a good indicator of actual performance so far this season",e.abrupt("break",193);case 188:return Ce="Odds have been a very good indicator of actual performance so far this season",e.abrupt("break",193);case 190:return Ce="Odds have been an excellent indicator of actual performance so far this season. One for the multi?",e.abrupt("break",193);case 192:return e.abrupt("break",193);case 193:if(n.reliabilityString=Ce,Fe=_.map((function(e){return e.scored})),De=d.map((function(e){return e.scored})),Le=Y.map((function(e){return e.scored})),He=Le.reverse(),Re=i.map((function(e){return e.conceeded})),Be=d.map((function(e){return e.conceeded})),Xe=Y.map((function(e){return e.conceeded})),Ie=Xe.reverse(),Me=Y.map((function(e){return e.XG})),We=Y.map((function(e){return e.XGAgainst})),Ee=Me.reverse(),Ve=We.reverse(),Ue=i.map((function(e){return e.XG})),ze=i.map((function(e){return e.XGAgainst})),Je=d.map((function(e){return e.XG})),Ke=d.map((function(e){return e.XGAgainst})),Ye=Me.reduce((function(e,a){return e+a}),0),qe=Ye/Me.length||0,Ze=We.reduce((function(e,a){return e+a}),0),Qe=Ze/We.length||0,$e=Y.map((function(e){return e.possession})),ea=$e.reduce((function(e,a){return e+a}),0),aa=ea/$e.length||0,ta=i.map((function(e){return e.possession})),sa=ta.reduce((function(e,a){return e+a}),0),n.avgPossessionHome=sa/ta.length||0,na=d.map((function(e){return e.possession})),ra=na.reduce((function(e,a){return e+a}),0),n.avgPossessionAway=ra/na.length||0,oa=Y.map((function(e){return e.dangerousAttacks})),ca=oa.reduce((function(e,a){return e+a}),0),la=ca/oa.length||0,ia=i.map((function(e){return e.dangerousAttacks})),da=ia.reduce((function(e,a){return e+a}),0),n.avgDangerousAttacksHome=da/ia.length||0,ua=d.map((function(e){return e.dangerousAttacks})),ma=ua.reduce((function(e,a){return e+a}),0),n.avgDangerousAttacksAway=ma/ua.length||0,ga=Y.map((function(e){return e.shots})),ha=ga.reduce((function(e,a){return e+a}),0),va=ha/ga.length||0,n.avgShots=va,pa=i.map((function(e){return e.shots})),ba=pa.reduce((function(e,a){return e+a}),0),n.avgShotsHome=ba/pa.length||0,fa=d.map((function(e){return e.shots})),Oa=fa.reduce((function(e,a){return e+a}),0),n.avgShotsAway=Oa/fa.length||0,ja=Y.map((function(e){return e.sot})),xa=ja.reduce((function(e,a){return e+a}),0),ya=xa/ja.length||0,Aa=i.map((function(e){return e.sot})),wa=Aa.reduce((function(e,a){return e+a}),0),n.avgShotsOnTargetHome=wa/Aa.length||0,_a=d.map((function(e){return e.sot})),Ga=_a.reduce((function(e,a){return e+a}),0),n.avgShotsOnTargetAway=Ga/_a.length||0,Sa=Y.map((function(e){return e.sotAgainst})),Ta=Sa.reduce((function(e,a){return e+a}),0),Pa=Ta/Sa.length||0,ka=i.map((function(e){return e.sotAgainst})),Ca=ka.reduce((function(e,a){return e+a}),0),n.avgShotsOnTargetAgainstHome=Ca/ka.length||0,Na=d.map((function(e){return e.sotAgainst})),Fa=Na.reduce((function(e,a){return e+a}),0),n.avgShotsOnTargetAgainstAway=Fa/Na.length||0,Da=Y.map((function(e){return e.corners})),La=Da.reduce((function(e,a){return e+a}),0),Ha=La/Da.length||0,Ra=i.map((function(e){return e.corners})),Ba=Ra.reduce((function(e,a){return e+a}),0),n.cornersAvHome=Ba/Ra.length||0,Xa=d.map((function(e){return e.corners})),Ia=Xa.reduce((function(e,a){return e+a}),0),n.cornersAvAway=Ia/Xa.length||0,Ma=Ee.slice(0,5),Wa=Ma.reduce((function(e,a){return e+a}),0),Ea=Wa/Ma.length||0,Va=Ue.slice(0,5),Ua=Va.reduce((function(e,a){return e+a}),0),n.last5XGAvgForHome=Ua/Va.length||0,za=Je.slice(0,5),Ja=za.reduce((function(e,a){return e+a}),0),n.last5XGAvgForAway=Ja/za.length||0,Ka=Ue.reduce((function(e,a){return e+a}),0),n.avgXGScoredHome=Ka/Ue.length||0,Ya=Je.reduce((function(e,a){return e+a}),0),n.avgXGScoredAway=Ya/Je.length||0,qa=ze.reduce((function(e,a){return e+a}),0),n.avgXGConceededHome=qa/ze.length||0,Za=Ke.reduce((function(e,a){return e+a}),0),n.avgXGConceededAway=Za/Ke.length||0,Qa=Ve.slice(0,5),$a=Qa.reduce((function(e,a){return e+a}),0),et=$a/Qa.length||0,at=Ue.slice(0,5),tt=at.reduce((function(e,a){return e+a}),0),n.last5XGAvgAgainstHome=tt/at.length||0,st=Je.slice(0,5),nt=st.reduce((function(e,a){return e+a}),0),n.last5XGAvgAgainstAway=nt/st.length||0,n.XGDiffNonAverage=Ye-Ze,n.XGDiffNonAverageLast5=Wa-$a,n.XGOverall=parseFloat(qe.toFixed(2)),n.XGlast5=parseFloat(Ea.toFixed(2)),n.XGAgainstAvgOverall=parseFloat(Qe.toFixed(2)),n.XGAgainstlast5=parseFloat(et.toFixed(2)),n.AveragePossessionOverall=parseFloat(aa.toFixed(1)),n.AverageDangerousAttacksOverall=parseFloat(la.toFixed(1)),n["Average Shots"]=parseFloat(va.toFixed(1)),n.AverageCorners=parseFloat(Ha.toFixed(1)),n.AverageShotsOnTargetOverall=parseFloat(ya.toFixed(1)),n.AverageShotsOnTargetAgainstOverall=parseFloat(Pa.toFixed(1)),rt=.75,ot=.75,"home"!==s){e.next=327;break}return n.allGoalsArrayHomeRecent=He.slice(0,20),n.allConceededArrayHomeRecent=Ie.slice(0,20),n.allGoalsArrayHome=He,n.allConceededArrayHome=Ie,n.allGoalsArrayHomeOnly=Fe,n.allConceededArrayHomeOnly=Re,it=Fe.reduce((function(e,a){return e+a}),0),dt=Re.reduce((function(e,a){return e+a}),0),n.goalDifferenceHomeOrAway=it-dt,e.next=321,Ne(Le.reverse(),Xe.reverse(),rt);case 321:return ct=e.sent,e.next=324,Ne(Fe,Re,ot);case 324:lt=e.sent,e.next=343;break;case 327:if("away"!==s){e.next=343;break}return n.allGoalsArrayAwayRecent=He.slice(0,20),n.allConceededArrayAwayRecent=Ie.slice(0,20),n.allGoalsArrayAway=He,n.allConceededArrayAway=Ie,n.allGoalsArrayAwayOnly=De,n.allConceededArrayAwayOnly=Be,ut=De.reduce((function(e,a){return e+a}),0),mt=Be.reduce((function(e,a){return e+a}),0),n.goalDifferenceHomeOrAway=ut-mt,e.next=339,Ne(Le.reverse(),Xe.reverse(),rt);case 339:return ct=e.sent,e.next=342,Ne(De,Be,ot);case 342:lt=e.sent;case 343:return(gt=i.map((function(e){return e.btts}))).length>10&&(gt=gt.slice(-10)),(ht=d.map((function(e){return e.btts}))).length>10&&(ht=ht.slice(-10)),(vt=Y.map((function(e){return e.btts}))).length>10&&(vt=vt.slice(-10)),pt=gt.filter((function(e){return!0===e})),bt="".concat(pt.length,"/").concat(gt.length),ft=(pt.length/gt.length*100).toFixed(0),Ot=ht.filter((function(e){return!0===e})),jt="".concat(Ot.length,"/").concat(ht.length),xt=(Ot.length/ht.length*100).toFixed(0),yt=vt.filter((function(e){return!0===e})),At="".concat(yt.length,"/").concat(vt.length),wt=(yt.length/vt.length*100).toFixed(0),n.bttsAllPercentage=wt,n.bttsHomePercentage=ft,n.bttsAwayPercentage=xt,_t=10,Gt=10,e.next=365,Te(Fe,Fe.length=0;r--)o=Math.pow(1-t,a.length-1-r),s+=a[r]*o,n+=o;return e.abrupt("return",s/n);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ne(e,a,t){return Fe.apply(this,arguments)}function Fe(){return(Fe=Object(l.a)(Object(c.a)().mark((function e(a,t,s){var n,r,o,l;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ke(a,s);case 2:return n=e.sent,e.next=5,ke(t,s);case 5:return r=e.sent,o=n,l=r,e.abrupt("return",{goalsFor:o,goalsAgainst:l});case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function De(e,a){return Le.apply(this,arguments)}function Le(){return(Le=Object(l.a)(Object(c.a)().mark((function e(a,t){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",a>=t?a-t:-(t-a));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function He(e,a){return Re.apply(this,arguments)}function Re(){return(Re=Object(l.a)(Object(c.a)().mark((function e(a,t){var s,n,r;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return s=parseFloat(a),n=parseFloat(t),e.next=4,De(s,n);case 4:return r=e.sent,e.abrupt("return",parseFloat(r));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Be(e){return Xe.apply(this,arguments)}function Xe(){return(Xe=Object(l.a)(Object(c.a)().mark((function e(a){var t,s;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:e.t0=!0,e.next=e.t0===a.dangerousAttackConversion<=15?3:e.t0===(a.dangerousAttackConversion>15&&a.dangerousAttackConversion<=20)?6:e.t0===(a.dangerousAttackConversion>20&&a.dangerousAttackConversion<=25)?9:e.t0===(a.dangerousAttackConversion>25&&a.dangerousAttackConversion<=32.5)?12:e.t0===(a.dangerousAttackConversion>30&&a.dangerousAttackConversion<=35)?15:e.t0===(a.dangerousAttackConversion>35&&a.dangerousAttackConversion<=40)?18:e.t0===(a.dangerousAttackConversion>40&&a.dangerousAttackConversion<=45)?21:e.t0===(a.dangerousAttackConversion>45&&a.dangerousAttackConversion<=50)?24:e.t0===(a.dangerousAttackConversion>50&&a.dangerousAttackConversion<=55)?27:e.t0===(a.dangerousAttackConversion>55&&a.dangerousAttackConversion<=60)?30:e.t0===a.dangerousAttackConversion>60?33:36;break;case 3:return t="excellent",s=.8,e.abrupt("break",37);case 6:return t="great",s=.9,e.abrupt("break",37);case 9:return t="very good",s=.95,e.abrupt("break",37);case 12:return t="good",s=.98,e.abrupt("break",37);case 15:return t="above average",s=.99,e.abrupt("break",37);case 18:return t="average",s=1,e.abrupt("break",37);case 21:return t="below average",s=1.01,e.abrupt("break",37);case 24:return t="poor",s=1.05,e.abrupt("break",37);case 27:return t="very poor",s=1.1,e.abrupt("break",37);case 30:return t="terrible",s=1.2,e.abrupt("break",37);case 33:return t="awful",s=1.3,e.abrupt("break",37);case 36:return e.abrupt("break",37);case 37:return e.abrupt("return",[t,s]);case 38:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ie(e,a){return Me.apply(this,arguments)}function Me(){return(Me=Object(l.a)(Object(c.a)().mark((function e(a,t){var s;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Ht(a,t);case 2:return s=e.sent,e.abrupt("return",parseFloat(s));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function We(e){return Ee.apply(this,arguments)}function Ee(){return(Ee=Object(l.a)(Object(c.a)().mark((function e(a){var t,s;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:e.t0=!0,e.next=e.t0===a>=2.5?3:e.t0===(a>=2&&a<2.5)?6:e.t0===(a>=1.5&&a<2)?9:e.t0===(a>=1&&a<1.5)?12:e.t0===(a>=.5&&a<1)?15:e.t0===(a>-.5&&a<.5)?18:e.t0===(a<=-.5&&a>-1)?21:e.t0===(a<=-1&&a>-1.5)?24:e.t0===(a<=-1.5&&a>-2)?27:e.t0===(a<=-2&&a>-2.5)?30:e.t0===a<=-2.5?33:36;break;case 3:return t=.3,s=-.3,e.abrupt("break",38);case 6:return t=.2,s=-.2,e.abrupt("break",38);case 9:return t=.15,s=-.15,e.abrupt("break",38);case 12:return t=.1,s=-.1,e.abrupt("break",38);case 15:return t=.05,s=-.05,e.abrupt("break",38);case 18:return t=0,s=0,e.abrupt("break",38);case 21:return t=-.05,s=.05,e.abrupt("break",38);case 24:return t=-.1,s=.1,e.abrupt("break",38);case 27:return t=-.15,s=.15,e.abrupt("break",38);case 30:return t=-.2,s=.2,e.abrupt("break",38);case 33:return t=-.3,s=.3,e.abrupt("break",38);case 36:t=0,s=0;case 38:return e.abrupt("return",[t,s]);case 39:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ve(e,a){return Ue.apply(this,arguments)}function Ue(){return(Ue=Object(l.a)(Object(c.a)().mark((function e(a,t){var s,n,r,o,l;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(n=0,r=0;rl?s=1.05:o===l?s=1:o=5||s.XGdifferentialValueRaw<0?r+=.3:("L"===t.lastGame||t.last2Points<2||a.last2Points>=5||s.XGdifferentialValueRaw>0)&&(n+=.3),n<0&&r<0&&(nr&&(r+=(n-=r/5)/5)),e.abrupt("return",[n,r]);case 37:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ra(e,a,t,s){return oa.apply(this,arguments)}function oa(){return(oa=Object(l.a)(Object(c.a)().mark((function e(a,t,s,n){var r,l,i,d,u,m,g,h,v,p,b,f,O,j,x,y,A,w,_,G,T,P,k,C,N,F,D,L,H,R,B,X,I,M,W,E,V,U,te,Oe,je,xe,ye,Ae,we,Se,Te,Pe,ke,Ce,Ne,Fe,De,Le,He,Re,Xe,Me,Ee,Ue,Je,Ke,Ye,qe,Ze,Qe,$e,ea,ta,na,ra,oa,ca,la,ia,da,ua;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!0===n&&Bt.find((function(e){return e.home.teamName===a.homeTeam&&e.away.teamName===a.awayTeam}))?r=[Bt.find((function(e){return e.home.teamName===a.homeTeam})).home,Bt.find((function(e){return e.away.teamName===a.awayTeam})).away]:n=!1,!n){e.next=579;break}d=0;case 4:if(!(d10&&7956!==a.leagueID)){e.next=166;break}return e.next=122,Ge(a.homeTeam,a,"home",l);case 122:return W=e.sent,E=Object(o.a)(W,18),l.predictedGoalsBasedOnHomeAv=E[0],l.predictedGoalsBasedOnAwayAv=E[1],l.allTeamGoalsBasedOnAverages=E[2],l.predictedGoalsConceededBasedOnHomeAv=E[3],l.predictedGoalsConceededBasedOnAwayAv=E[4],l.allTeamGoalsConceededBasedOnAverages=E[5],l.averageOddsHome=E[6],l.averageOddsAway=E[7],l.averageScoredLeague=E[8],l.averageConceededLeague=E[9],l.last10btts=E[10],l.last10bttsHome=E[11],l.last10bttsAway=E[12],a.bttsAllPercentageHome=E[13],a.bttsPercentageHomeHome=E[14],a.bttsPercentageHomeAway=E[15],l.forAndAgainstRollingAvHomeOrAway=E[16],l.forAndAgainstRollingAv=E[17],e.next=144,Ge(a.awayTeam,a,"away",i);case 144:V=e.sent,U=Object(o.a)(V,18),i.predictedGoalsBasedOnHomeAv=U[0],i.predictedGoalsBasedOnAwayAv=U[1],i.allTeamGoalsBasedOnAverages=U[2],i.predictedGoalsConceededBasedOnHomeAv=U[3],i.predictedGoalsConceededBasedOnAwayAv=U[4],i.allTeamGoalsConceededBasedOnAverages=U[5],i.averageOddsHome=U[6],i.averageOddsAway=U[7],i.averageScoredLeague=U[8],i.averageConceededLeague=U[9],i.last10btts=U[10],i.last10bttsHome=U[11],i.last10bttsAway=U[12],a.bttsAllPercentageAway=U[13],a.bttsPercentageAwayHome=U[14],a.bttsPercentageAwayAway=U[15],i.forAndAgainstRollingAvHomeOrAway=U[16],i.forAndAgainstRollingAv=U[17],e.next=216;break;case 166:l.completeData=!1,l.predictedGoalsBasedOnHomeAv=l.ScoredAverage,l.predictedGoalsBasedOnAwayAv=l.ConcededAverage,l.allTeamGoalsBasedOnAverages=l.ScoredAverage,l.forAndAgainstRollingAv={goalsFor:l.ScoredAverage,goalsAgainst:l.ConcededAverage},l.forAndAgainstRollingAvHomeOrAway={goalsFor:l.ScoredAverage,goalsAgainst:l.ConcededAverage},l.predictedGoalsConceededBasedOnHomeAv=l.ConcededAverage,l.predictedGoalsConceededBasedOnAwayAv=l.ConcededAverage,l.allTeamGoalsConceededBasedOnAverages=l.ConcededAverage,l.averageOddsHome=null,l.averageOddsAway=null,l.averageScoredLeague=null,l.averageConceededLeague=null,l.goalDifference=l.ScoredOverall-l.ConcededOverall,l.goalDifferenceHomeOrAway=l.ScoredOverall-l.ConcededOverall,l.last10btts=null,l.last10bttsHome=null,l.last10bttsAway=null,l.allTeamResults=[],l.resultsAll=[],l.resultsHome=[],l.resultsAway=[],a.bttsAllPercentageHome="",a.bttsPercentageHomeHome="",a.bttsPercentageHomeAway="",i.completeData=!1,i.predictedGoalsBasedOnHomeAv=i.ScoredAverage,i.predictedGoalsBasedOnAwayAv=i.ConcededAverage,i.allTeamGoalsBasedOnAverages=i.ScoredAverage,i.forAndAgainstRollingAv={goalsFor:i.ScoredAverage,goalsAgainst:i.ConcededAverage},i.forAndAgainstRollingAvHomeOrAway={goalsFor:i.ScoredAverage,goalsAgainst:i.ConcededAverage},i.predictedGoalsConceededBasedOnHomeAv=i.ConcededAverage,i.predictedGoalsConceededBasedOnAwayAv=i.ConcededAverage,i.allTeamGoalsConceededBasedOnAverages=i.ConcededAverage,i.averageOddsHome=null,i.averageOddsAway=null,i.averageScoredLeague=null,i.averageConceededLeague=null,i.goalDifference=i.ScoredOverall-i.ConcededOverall,i.goalDifferenceHomeOrAway=i.ScoredOverall-i.ConcededOverall,i.last10btts=null,i.last10bttsHome=null,i.last10bttsAway=null,i.allTeamResults=[],i.resultsAll=[],i.resultsHome=[],i.resultsAway=[],a.bttsAllPercentageAway="",a.bttsPercentageAwayHome="",a.bttsPercentageAwayAway="";case 216:return"number"===typeof l.homeTeamHomePositionRaw&&"number"===typeof i.awayTeamAwayPositionRaw?(l.homePositionHomeOnly=parseFloat(l.homeTeamHomePositionRaw),i.awayPositionAwayOnly=parseFloat(i.awayTeamAwayPositionRaw),l.homePosition=parseFloat(l.homeRawPosition),i.awayPosition=parseFloat(i.awayRawPosition)):(l.homePositionHomeOnly="N/A",i.awayPositionAwayOnly="N/A",l.homePosition="N/A",i.awayPosition="N/A"),l.last10Goals&&0!==i.last10Goals&&(l.last5Goals-l.last5GoalsConceeded>l.last10Goals-l.last10GoalsConceeded?l.improving=!0:l.improving=!1,i.last5Goals-i.last5GoalsConceeded>i.last10Goals-i.last10GoalsConceeded?i.improving=!0:i.improving=!1),l.AttackingPotency=l.XG/l.AttacksHome*100,i.AttackingPotency=i.XG/i.AttacksAverage*100,te={"Average Dangerous Attacks":l.AverageDangerousAttacksOverall,"Average Shots":l.AverageShots,"Average Shots On Target":l.AverageShotsOnTargetOverall?l.AverageShotsOnTargetOverall:l.AverageShotsOnTarget,"Average Expected Goals":l.XGOverall?l.XGOverall:l.expectedGoals,"Recent XG":l.XGlast5?l.XGlast5:l.XGOverall,"Average Goals":l.avgScored?l.avgScored:l.ScoredAverage,Corners:l.AverageCorners?l.AverageCorners:l.CornersAverage},Oe={"Average Dangerous Attacks":l.avDALast5?l.avDALast5:l.AverageDangerousAttacksOverall,"Average Shots":l.avShotsLast5?l.avShotsLast5:l.AverageShots,"Average Shots On Target":l.avSOTLast5?l.avSOTLast5:l.AverageShotsOnTarget,"Average Expected Goals":l.XGlast5?l.XGlast5:l.XGOverall,"Recent XG":l.XGlast5?l.XGlast5:l.XGOverall,"Average Goals":l.avScoredLast5?l.avScoredLast5:l.ScoredAverage,Corners:l.avCornersLast5?l.avCornersLast5:l.CornersAverage},je={"Average Dangerous Attacks":l.avgDangerousAttacksHome?l.avgDangerousAttacksHome:l.AverageDangerousAttacksOverall,"Average Shots":l.avgShotsHome?l.avgShotsHome:l.AverageShots,"Average Shots On Target":l.avgShotsOnTargetHome?l.avgShotsOnTargetHome:l.AverageShotsOnTarget,"Average Expected Goals":l.avgXGScoredHome?l.avgXGScoredHome:l.XGOverall,"Recent XG":l.last5XGAvgForHome?l.last5XGAvgForHome:l.XGOverall,"Average Goals":l.avgScoredHome?l.avgScoredHome:l.ScoredAverage,Corners:l.cornersAvHome?l.cornersAvHome:l.CornersAverage},xe={"Average Dangerous Attacks":i.avgDangerousAttacksAway?i.avgDangerousAttacksAway:i.AverageDangerousAttacksOverall,"Average Shots":i.avgShotsAway?i.avgShotsAway:i.AverageShots,"Average Shots On Target":i.avgShotsOnTargetAway?i.avgShotsOnTargetAway:i.AverageShotsOnTarget,"Average Expected Goals":i.avgXGScoredAway?i.avgXGScoredAway:i.XGOverall,"Recent XG":i.last5XGAvgForAway?i.last5XGAvgForAway:i.XGOverall,"Average Goals":i.avgScoredAway?i.avgScoredAway:i.ScoredAverage,Corners:i.cornersAvAway?i.cornersAvAway:i.CornersAverage},ye={"Average Dangerous Attacks":i.AverageDangerousAttacksOverall,"Average Shots":i.AverageShots,"Average Shots On Target":i.AverageShotsOnTargetOverall?i.AverageShotsOnTargetOverall:i.AverageShotsOnTarget,"Average Expected Goals":i.XGOverall?i.XGOverall:i.expectedGoals,"Recent XG":i.XGlast5?i.XGlast5:i.XGOverall,"Average Goals":i.avgScored?i.avgScored:i.ScoredAverage,Corners:i.AverageCorners?i.AverageCorners:i.CornersAverage},Ae={"Average Dangerous Attacks":i.avDALast5?i.avDALast5:i.AverageDangerousAttacksOverall,"Average Shots":i.avShotsLast5?i.avShotsLast5:i.AverageShots,"Average Shots On Target":i.avSOTLast5?i.avSOTLast5:i.AverageShotsOnTarget,"Average Expected Goals":i.XGlast5?i.XGlast5:i.XGOverall,"Recent XG":i.XGlast5?i.XGlast5:i.XGOverall,"Average Goals":i.avScoredLast5?i.avScoredLast5:i.ScoredAverage,Corners:i.avCornersLast5?i.avCornersLast5:i.CornersAverage},we={"Average XG Against":(l.XGAgainstAvgOverall,l.XGAgainstAvgOverall),"Recent XG Against":l.XGAgainstlast5?l.XGAgainstlast5:l.XGAgainstAvgOverall,"Average Goals Against":l.avgConceeded?l.avgConceeded:l.ConcededAverage,"Average SOT Against":l.AverageShotsOnTargetAgainstOverall?l.AverageShotsOnTargetAgainstOverall:5},Se={"Average XG Against":l.XGAgainstlast5?l.XGAgainstlast5:l.XGAgainstAvgOverall,"Recent XG Against":l.avXGAgainstLast5?l.avXGAgainstLast5:l.XGAgainstAvgOverall,"Average Goals Against":l.avConceededLast5?l.avConceededLast5:l.ConcededAverage,"Average SOT Against":l.avSOTAgainstLast5?l.avSOTAgainstLast5:5},Te={"Average XG Against":(i.XGAgainstAvgOverall,i.XGAgainstAvgOverall),"Recent XG Against":i.XGAgainstlast5?i.XGAgainstlast5:i.XGAgainstAvgOverall,"Average Goals Against":i.avgConceeded?i.avgConceeded:i.ConcededAverage,"Average SOT Against":i.AverageShotsOnTargetAgainstOverall?i.AverageShotsOnTargetAgainstOverall:5},Pe={"Average XG Against":i.XGAgainstlast5?i.XGAgainstlast5:i.XGAgainstAvgOverall,"Recent XG Against":i.avXGAgainstLast5?i.avXGAgainstLast5:i.XGAgainstAvgOverall,"Average Goals Against":i.avConceededLast5?i.avConceededLast5:i.ConcededAverage,"Average SOT Against":i.avSOTAgainstLast5?i.avSOTAgainstLast5:5},ke={"Average XG Against":l.avgXGConceededHome?l.avgXGConceededHome:l.XGAgainstAvgOverall,"Recent XG Against":l.last5XGAvgAgainstHome?l.last5XGAvgAgainstHome:l.XGAgainstAvgOverall,"Average Goals Against":l.teamConceededAvgHomeOnly?l.teamConceededAvgHomeOnly:l.ConcededAverage,"Average SOT Against":l.avgShotsOnTargetAgainstHome?l.avgShotsOnTargetAgainstHome:5},Ce={"Average XG Against":i.avgXGConceededAway?i.avgXGConceededAway:i.XGAgainstAvgOverall,"Recent XG Against":i.last5XGAvgAgainstAway?i.last5XGAvgAgainstAway:i.XGAgainstAvgOverall,"Average Goals Against":i.teamConceededAvgAwayOnly?i.teamConceededAvgAwayOnly:i.ConcededAverage,"Average SOT Against":i.avgShotsOnTargetAgainstAway?i.avgShotsOnTargetAgainstAway:5},l.attackingMetrics=te,l.defensiveMetrics=we,i.attackingMetrics=ye,i.defensiveMetrics=Te,e.next=238,As(te);case 238:return l.attackingStrength=e.sent,e.next=241,As(te);case 241:return l.attackingStrengthScoreGeneration=e.sent,e.next=244,As(Oe);case 244:return l.attackingStrengthLast5=e.sent,e.next=247,As(je);case 247:return l.attackingStrengthHomeOnly=e.sent,e.next=250,As(ye);case 250:return i.attackingStrength=e.sent,e.next=253,As(Ae);case 253:return i.attackingStrengthLast5=e.sent,e.next=256,As(xe);case 256:return i.attackingStrengthAwayOnly=e.sent,e.next=259,_s(we);case 259:return l.defensiveStrength=e.sent,e.next=262,_s(we,1);case 262:return l.defensiveStrengthScoreGeneration=e.sent,e.next=265,_s(Se);case 265:return l.defensiveStrengthLast5=e.sent,e.next=268,_s(Se,1);case 268:return l.defensiveStrengthScoreGenerationLast5=e.sent,e.next=271,_s(ke);case 271:return l.defensiveStrengthHomeOnly=e.sent,e.next=274,_s(ke,1);case 274:return l.defensiveStrengthScoreGenerationHomeOnly=e.sent,e.next=277,_s(Te);case 277:return i.defensiveStrength=e.sent,e.next=280,_s(Te,1);case 280:return i.defensiveStrengthScoreGeneration=e.sent,e.next=283,_s(Pe);case 283:return i.defensiveStrengthLast5=e.sent,e.next=286,_s(Pe,1);case 286:return i.defensiveStrengthScoreGenerationLast5=e.sent,e.next=289,_s(Ce);case 289:return i.defensiveStrengthAwayOnly=e.sent,e.next=292,_s(Ce,1);case 292:return i.defensiveStrengthScoreGenerationAwayOnly=e.sent,e.next=295,Ss("averagePossession",(l.AveragePossessionOverall,l.AveragePossessionOverall));case 295:return l.possessionStrength=e.sent,e.next=298,Ss("averagePossession",l.avPosessionLast5?l.avPosessionLast5:l.AveragePossessionOverall);case 298:return l.possessionStrengthLast5=e.sent,e.next=301,Ss("averagePossession",l.avgPossessionHome?l.avgPossessionHome:l.AveragePossessionOverall);case 301:return l.possessionStrengthHomeOnly=e.sent,e.next=304,Ss("averagePossession",i.avPosessionLast5?i.avPosessionLast5:i.AveragePossessionOverall);case 304:return i.possessionStrengthLast5=e.sent,e.next=307,Ss("averagePossession",(i.AveragePossessionOverall,i.AveragePossessionOverall));case 307:return i.possessionStrength=e.sent,e.next=310,Ss("averagePossession",i.avgPossessionAway?i.avgPossessionAway:i.AveragePossessionOverall);case 310:return i.possessionStrengthAwayOnly=e.sent,l.directnessOverall=l.AverageShots/l.AveragePossessionOverall*10,l.directnessOverallLast5=l.avShotsLast5/l.avPosessionLast5*10,i.directnessOverallLast5=i.avShotsLast5/i.avPosessionLast5*10,l.directnessHomeOnly=l.avgShotsHome/l.avgPossessionHome*10,i.directnessOverall=i.AverageShots/i.AveragePossessionOverall*10,i.directnessAwayOnly=i.avgShotsAway/i.avgPossessionAway*10,e.next=319,Ss("directnessOverall",l.directnessOverall);case 319:return l.directnessOverallStrength=e.sent,e.next=322,Ss("directnessOverall",l.directnessOverallLast5);case 322:return l.directnessOverallStrengthLast5=e.sent,e.next=325,Ss("directnessOverall",l.directnessHomeOnly);case 325:return l.directnessHomeStrength=e.sent,e.next=328,Ss("directnessOverall",i.directnessOverall);case 328:return i.directnessOverallStrength=e.sent,e.next=331,Ss("directnessOverall",i.directnessOverallLast5);case 331:return i.directnessOverallStrengthLast5=e.sent,e.next=334,Ss("directnessOverall",i.directnessAwayOnly);case 334:return i.directnessAwayStrength=e.sent,l.shootingAccuracy=(l.AverageShotsOnTargetOverall?l.AverageShotsOnTargetOverall:l.AverageShotsOnTarget/l.avgShots)*l.AverageShotsOnTargetOverall?l.AverageShotsOnTargetOverall:l.AverageShotsOnTarget,l.shootingAccuracyLast5=l.avSOTLast5/l.avShotsLast5*l.avSOTLast5,i.shootingAccuracyLast5=i.avSOTLast5/i.avShotsLast5*i.avSOTLast5,l.shootingAccuracyHomeOnly=l.avgShotsOnTargetHome/l.avgShotsHome*l.avgShotsOnTargetHome,i.shootingAccuracy=(i.AverageShotsOnTargetOverall?i.AverageShotsOnTargetOverall:i.AverageShotsOnTarget/i.avgShots)*i.AverageShotsOnTargetOverall?i.AverageShotsOnTargetOverall:i.AverageShotsOnTarget,i.shootingAccuracyAwayOnly=i.avgShotsOnTargetAway/i.avgShotsAway*i.avgShotsOnTargetAway,e.next=343,Ss("accuracyOverall",l.shootingAccuracy);case 343:return l.accuracyOverallStrength=e.sent,e.next=346,Ss("accuracyOverall",l.shootingAccuracyLast5);case 346:return l.accuracyOverallStrengthLast5=e.sent,e.next=349,Ss("accuracyOverall",l.shootingAccuracyHomeOnly);case 349:return l.accuracyHomeStrength=e.sent,e.next=352,Ss("accuracyOverall",i.shootingAccuracy);case 352:return i.accuracyOverallStrength=e.sent,e.next=355,Ss("accuracyOverall",i.shootingAccuracyLast5);case 355:return i.accuracyOverallStrengthLast5=e.sent,e.next=358,Ss("accuracyOverall",i.shootingAccuracyAwayOnly);case 358:return i.accuracyAwayStrength=e.sent,e.next=361,Ss("xgFor",l.XGOverall);case 361:return l.xgForStrength=e.sent,e.next=364,Ss("xgFor",l.XGlast5);case 364:return l.xgForStrengthLast5=e.sent,e.next=367,Ss("xgFor",l.avgXGScoredHome);case 367:return l.xgForStrengthHomeOnly=e.sent,e.next=370,Ss("xgAgainst",3-l.XGAgainstAvgOverall);case 370:return l.xgAgainstStrength=e.sent,e.next=373,Ss("xgAgainst",3-l.XGAgainstlast5);case 373:return l.xgAgainstStrengthLast5=e.sent,e.next=376,Ss("xgAgainst",3-l.avgXGConceededHome);case 376:return l.xgAgainstStrengthHomeOnly=e.sent,e.next=379,Ss("xgFor",i.XGOverall);case 379:return i.xgForStrength=e.sent,e.next=382,Ss("xgFor",i.last5XGAvgFor);case 382:return i.xgForStrengthLast5=e.sent,e.next=385,Ss("xgFor",i.XGlast5);case 385:return i.xgForStrengthLast5=e.sent,e.next=388,Ss("xgFor",i.avgXGScoredAway);case 388:return i.xgForStrengthAwayOnly=e.sent,e.next=391,Ss("xgAgainst",3-i.XGAgainstAvgOverall);case 391:return i.xgAgainstStrength=e.sent,e.next=394,Ss("xgAgainst",3-i.XGAgainstlast5);case 394:return i.xgAgainstStrengthLast5=e.sent,e.next=397,Ss("xgAgainst",3-i.avgXGConceededAway);case 397:return i.xgAgainstStrengthAwayOnly=e.sent,e.t0=parseInt,e.next=401,Ht(l.XGDiffNonAverage,l.goalDifference);case 401:return e.t1=e.sent,l.actualToXGDifference=(0,e.t0)(e.t1),e.t2=parseInt,e.next=406,Ht(i.XGDiffNonAverage,i.goalDifference);case 406:return e.t3=e.sent,i.actualToXGDifference=(0,e.t2)(e.t3),e.next=410,sa(l,i,a);case 410:if(Ne=e.sent,Fe=Object(o.a)(Ne,2),l.teamGoalsCalc=Fe[0],i.teamGoalsCalc=Fe[1],console.log(l.teamGoalsCalc),console.log(i.teamGoalsCalc),De={weighting:l.teamGoalsCalc},Le={weighting:i.teamGoalsCalc},void 0===l.allConceededArrayHome||void 0===i.allConceededArrayAway){e.next=428;break}return e.next=421,aa(l.allGoalsArrayHomeRecent,l.allConceededArrayHomeRecent,i.allGoalsArrayAwayRecent,i.allConceededArrayAwayRecent,De,Le,a.game);case 421:return Xe=e.sent,e.next=424,aa(l.allGoalsArrayHomeOnly,l.allConceededArrayHomeOnly,i.allGoalsArrayAwayOnly,i.allConceededArrayAwayOnly,De,Le,a.game);case 424:return Re=e.sent,e.next=427,aa(l.allGoalsArrayHome,l.allConceededArrayHome,i.allGoalsArrayAway,i.allConceededArrayAway,De,Le,a.game);case 427:He=e.sent;case 428:return Ue=l.ScoredAverageShortAndLongTerm-l.conceededAverageShortAndLongTerm,Je=i.ScoredAverageShortAndLongTerm-i.conceededAverageShortAndLongTerm,e.t4=parseFloat,e.next=433,Ht(Ue,Je);case 433:return e.t5=e.sent,e.t6=(0,e.t4)(e.t5),l.goalsDifferential=e.t6/1,e.t7=parseFloat,e.next=439,Ht(Je,Ue);case 439:return e.t8=e.sent,e.t9=(0,e.t7)(e.t8),i.goalsDifferential=e.t9/1,l.rollingAverageGoalsDifferential=parseFloat(l.allTeamGoalsBasedOnAverages-l.allTeamGoalsConceededBasedOnAverages),i.rollingAverageGoalsDifferential=parseFloat(i.allTeamGoalsBasedOnAverages-i.allTeamGoalsConceededBasedOnAverages),a.GoalsInGamesAverageHome=l.avScoredLast5+l.avConceededLast5,a.GoalsInGamesAverageAway=i.avScoredLast5+i.avConceededLast5,Ke=(1*l.forAndAgainstRollingAvHomeOrAway.goalsFor+1*i.forAndAgainstRollingAvHomeOrAway.goalsAgainst+1*l.forAndAgainstRollingAv.goalsFor+1*i.forAndAgainstRollingAv.goalsAgainst+0*l.allTeamGoalsBasedOnAverages+0*i.allTeamGoalsConceededBasedOnAverages+1*l.XGOverall+1*i.XGAgainstAvgOverall+0*C+0*L)/6,Ye=(1*i.forAndAgainstRollingAvHomeOrAway.goalsFor+1*l.forAndAgainstRollingAvHomeOrAway.goalsAgainst+1*i.forAndAgainstRollingAv.goalsFor+1*l.forAndAgainstRollingAv.goalsAgainst+0*i.allTeamGoalsBasedOnAverages+0*l.allTeamGoalsConceededBasedOnAverages+1*i.XGOverall+1*l.XGAgainstAvgOverall+0*N+0*H)/6,void 0!==He&&1!==He[0].probability?(qe=(He[0].team1Score+Xe[0].team1Score+.5*Re[0].team1Score)/2.5,Ze=(He[0].team2Score+Xe[0].team2Score+.5*Re[0].team2Score)/2.5):(qe=Ke,Ze=Ye),e.next=451,Ht(Ke,Ye);case 451:return a.scoreDiff=e.sent,1,1,console.log(a.game),console.log(a.simlarGameResultsHome),console.log(a.simlarGameResultsAway),Qe=qe+l.teamGoalsCalc,$e=Ze+i.teamGoalsCalc,ea=Qe,ta=$e,a.rawFinalHomeGoals=ea,a.rawFinalAwayGoals=ta,ea<0&&(ea=0),ta<0&&(ta=0),Me=Math.floor(ea),Ee=Math.floor(ta),console.log(a.omit),"suspended"!==a.status&&(Me>Ee?(a.prediction="homeWin",1,"L"===l.lastGame||l.last2Points<3||i.last2Points>4||l.oddsReliabilityWin<50?a.includeInMultis=!1:a.includeInMultis=!0):Ee>Me?(a.prediction="awayWin",1,"L"===i.lastGame||i.last2Points<3||l.last2Points>4||i.oddsReliabilityWin<50?a.includeInMultis=!1:a.includeInMultis=!0):Me===Ee&&(a.prediction="draw",se+=1)),console.log(a.game),console.log(Me),console.log(Ee),console.log(a.prediction),console.log(a.outcome),console.log("drawPredictions: ".concat(se)),M>1&&"homeWin"===a.prediction||M<-1.6&&"awayWin"===a.prediction?a.XGdifferential=!0:a.XGdifferential=!1,G>1.2&&"homeWin"===a.prediction||G<-1.2&&"awayWin"===a.prediction?(a.pointsDifferential=!0,a.pointsDifferentialValue=Math.abs(G),a.pointsDifferentialValueRaw=parseFloat(G)):(a.pointsDiff10=!1,a.pointsDifferentialValue=Math.abs(G),a.pointsDifferentialValueRaw=parseFloat(G)),e.next=478,Ht(l.rollingAverageGoalsDifferential,i.rollingAverageGoalsDifferential);case 478:return(na=e.sent)>1.5&&"homeWin"===a.prediction||na<-1.5&&"awayWin"===a.prediction?(a.rollingGoalDiff=!0,a.rollingGoalDiffValue=na):(a.rollingGoalDiff=!1,a.rollingGoalDiffValue=na),e.next=482,Ht(l.AverageDangerousAttacksOverall,i.AverageDangerousAttacksOverall);case 482:(ra=e.sent)>20&&"homeWin"===a.prediction||ra<-20&&"awayWin"===a.prediction?(a.dangerousAttacksDiff=!0,a.dangerousAttacksDiffValue=ra):(a.dangerousAttacksDiff=!1,a.dangerousAttacksDiffValue=ra),e.t10=!0,e.next=e.t10===("complete"!==a.status)?487:e.t10===a.homeGoals>a.awayGoals?488:e.t10===(a.homeGoals===a.awayGoals)?508:e.t10===a.homeGoals2?a.over25PredictionOutcome="Won":a.over25PredictionOutcome="Lost"),"complete"===a.status&&a.homeGoals>0&&a.awayGoals>0?a.bttsOutcome="bttsWon":a.bttsOutcome="bttsLost",a.formHome=l,a.formAway=i,oa=parseInt(Me+Ee),oa,ca=parseInt(a.homeGoals+a.awayGoals),ca,1,Me<0&&(Me=0),Ee<0&&(Ee=0),"suspended"===a.status&&(Me="P",Ee="P"),(Me>Ee&&(a.homeOddsS[1])||Ee>Me&&(a.awayOddsS[1])||Me===Ee&&(a.drawOddsS[1]))&&(a.omit=!0),la=Math.abs(l.last10Points-i.last10Points),ia=Math.abs(i.last10Points-l.last10Points),da=Math.abs(l.XGDiffNonAverage-i.XGDiffNonAverage),ua=Math.abs(i.XGDiffNonAverage-l.XGDiffNonAverage),a.goalDiffHomeOrAwayComparison=parseFloat(l.goalDifferenceHomeOrAway)-parseFloat(i.goalDifferenceHomeOrAway),a.goalDifferenceComparison=parseFloat(l.goalDifference)-parseFloat(i.goalDifference),e.t11=!0,e.next=e.t11===Me>Ee?559:e.t11===Me=0?"+":"",v=Oe>=0?"+":"",p=(o/n*100).toFixed(1),b=(l/n*100).toFixed(1),!(n>0)){e.next=22;break}r.a.render(Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)(j,{className:"SuccessMeasure",text:"ROI for \n all ".concat(n," W/D/W \n outcomes: ").concat(h," ").concat(g.toFixed(2),"%")}),Object(i.jsx)("p",{children:"Correct W/D/W predictions: ".concat(l," (").concat(b,"%)")}),Object(i.jsx)("p",{children:"Exact scores predicted: ".concat(o," (").concat(p,"%)")}),Object(i.jsx)(j,{className:"SuccessMeasure",text:"Cumalative ROI for \n all ".concat(je," match outcomes: ").concat(v," ").concat(Oe.toFixed(2),"%")})]}),document.getElementById("successMeasure2")),e.next=23;break;case 22:return e.abrupt("return");case 23:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var ia,da,ua,ma,ga,ha=[],va=[],pa=[],ba=[],fa=[],Oa=[],ja=[],xa=[],ya=[],Aa=[],wa=[],_a=1,Ga=[];function Sa(e){return Ta.apply(this,arguments)}function Ta(){return(Ta=Object(l.a)(Object(c.a)().mark((function e(a){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return pa=[],_a=1,a.length>1&&N>0&&a.forEach((function(e){a.indexOf(e).65&&0!==a.homeOdds&&"N/A"!==a.fractionHome&&!1!==a.includeInMultis&&!0!==a.omit)){e.next=61;break}if(!("draw"!==a.prediction&&"suspended"!==a.status&&"canceled"!==a.status&&"notEnoughData"!==a.status&&a.homeOdds<3)){e.next=59;break}return e.t1="".concat(a.homeTeam," to win"),e.t2="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t3=a.fractionHome,e.t4=a.homeOdds,e.t5=Math.abs(a.teamComparisonScore),e.t6=a.teamComparisonScore,e.t7=a.predictionOutcome,e.t8=a.outcomeSymbol,e.t9=parseFloat,e.next=53,Ht(a.unroundedGoalsA,a.unroundedGoalsB);case 53:e.t10=e.sent,e.t11=(0,e.t9)(e.t10),e.t12=((a.unroundedGoalsA-a.unroundedGoalsB)*Math.abs(a.teamComparisonScore)).toFixed(2),e.t13=parseFloat(a.XGdifferentialValue),(i={team:e.t1,game:e.t2,odds:e.t3,rawOdds:e.t4,comparisonScore:e.t5,rawComparisonScore:e.t6,outcome:e.t7,outcomeSymbol:e.t8,goalDifferential:e.t11,experimentalCalc:e.t12,XGdifferentialValue:e.t13}).rawOdds>=1.25&&"awful"!==a.formHome.clinicalRating&&(ha.push(i),a.unroundedGoalsA-a.unroundedGoalsB>N&&ba.push(i));case 59:e.next=81;break;case 61:if(!(a.unroundedGoalsB-a.unroundedGoalsA>1.75&&0!==a.awayOdds&&"N/A"!==a.fractionAway&&!1!==a.includeInMultis&&!0!==a.omit)){e.next=81;break}if(!("draw"!==a.prediction&&"suspended"!==a.status&&"canceled"!==a.status&&"notEnoughData"!==a.status&&a.awayOdds<3.5)){e.next=81;break}return e.t14="".concat(a.awayTeam," to win"),e.t15="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t16=a.awayOdds,e.t17=a.fractionAway,e.t18=Math.abs(a.teamComparisonScore),e.t19=a.teamComparisonScore,e.t20=a.predictionOutcome,e.t21=a.outcomeSymbol,e.t22=parseFloat,e.next=74,Ht(a.unroundedGoalsB,a.unroundedGoalsA);case 74:e.t23=e.sent,e.t24=(0,e.t22)(e.t23),e.t25=e.t24-1,e.t26=((a.unroundedGoalsB-a.unroundedGoalsA)*Math.abs(a.teamComparisonScore)).toFixed(2),e.t27=parseFloat(a.XGdifferentialValue),(i={team:e.t14,game:e.t15,rawOdds:e.t16,odds:e.t17,comparisonScore:e.t18,rawComparisonScore:e.t19,outcome:e.t20,outcomeSymbol:e.t21,goalDifferential:e.t25,experimentalCalc:e.t26,XGdifferentialValue:e.t27}).rawOdds>=1.25&&"awful"!==a.formAway.clinicalRating&&(ha.push(i),a.unroundedGoalsB-a.unroundedGoalsA>2&&ba.push(i));case 81:if(!0===a.btts&&"suspended"!==a.status&&"canceled"!==a.status&&"notEnoughData"!==a.status&&wa.push(a),a.unroundedGoalsA+a.unroundedGoalsB>4&&a.goalsA+a.goalsB>2&&a.GoalsInGamesAverageHome>3&&a.GoalsInGamesAverageAway>3&&(d={game:"complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,team:a.homeTeam,decimalOdds:a.homeDoubleChance,rawOdds:a.over25Odds,odds:a.over25Odds,comparisonScore:a.teamComparisonScore,outcome:a.predictionOutcome,outcomeSymbol:a.over25PredictionOutcomeSymbol,doubleChanceOutcome:a.over25PredictionOutcome,goalTotalUnrounded:a.unroundedGoalsA+a.unroundedGoalsB},fa.push(d)),!0!==a.XGdifferential||"homeWin"!==a.prediction||"notEnoughData"===a.status||"suspended"===a.status||"canceled"===a.status){e.next=104;break}return e.t28="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t29="".concat(a.homeTeam," to win"),e.t30=a.homeOdds,e.t31=Math.abs(a.teamComparisonScore),e.t32=a.teamComparisonScore,e.t33=a.predictionOutcome,e.t34=a.outcomeSymbol,e.t35="".concat(a.homeTeam," to win"),e.t36=a.fractionHome,e.t37=a.awayTeam,e.t38=a.XGdifferentialValue,e.t39=parseFloat,e.next=98,Ht(a.unroundedGoalsA,a.unroundedGoalsB);case 98:e.t40=e.sent,e.t41=(0,e.t39)(e.t40),u={game:e.t28,team:e.t29,rawOdds:e.t30,comparisonScore:e.t31,rawComparisonScore:e.t32,outcome:e.t33,outcomeSymbol:e.t34,prediction:e.t35,odds:e.t36,otherTeam:e.t37,XGdifferentialValue:e.t38,goalDifferential:e.t41},Oa.push(u),e.next=123;break;case 104:if(!0!==a.XGdifferential||"awayWin"!==a.prediction||"notEnoughData"===a.status||"suspended"===a.status||"canceled"===a.status){e.next=123;break}return e.t42="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t43="".concat(a.awayTeam," to win"),e.t44=a.awayOdds,e.t45=Math.abs(a.teamComparisonScore),e.t46=a.teamComparisonScore,e.t47=a.predictionOutcome,e.t48=a.outcomeSymbol,e.t49="".concat(a.awayTeam," to win"),e.t50=a.fractionAway,e.t51=a.homeTeam,e.t52=a.XGdifferentialValue,e.t53=parseFloat,e.next=119,Ht(a.unroundedGoalsB,a.unroundedGoalsA);case 119:e.t54=e.sent,e.t55=(0,e.t53)(e.t54),u={game:e.t42,team:e.t43,rawOdds:e.t44,comparisonScore:e.t45,rawComparisonScore:e.t46,outcome:e.t47,outcomeSymbol:e.t48,prediction:e.t49,odds:e.t50,otherTeam:e.t51,XGdifferentialValue:e.t52,goalDifferential:e.t55},Oa.push(u);case 123:if(!0!==a.pointsDifferential||"homeWin"!==a.prediction||"notEnoughData"===a.status||"suspended"===a.status||"canceled"===a.status){e.next=144;break}return e.t56="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t57="".concat(a.homeTeam," to win"),e.t58=a.homeOdds,e.t59=Math.abs(a.teamComparisonScore),e.t60=a.teamComparisonScore,e.t61=a.predictionOutcome,e.t62=a.outcomeSymbol,e.t63="".concat(a.homeTeam," to win"),e.t64=a.fractionHome,e.t65=a.awayTeam,e.t66=a.pointsDifferentialValue,e.t67=parseFloat,e.next=138,Ht(a.unroundedGoalsA,a.unroundedGoalsB);case 138:e.t68=e.sent,e.t69=(0,e.t67)(e.t68),m={game:e.t56,team:e.t57,rawOdds:e.t58,comparisonScore:e.t59,rawComparisonScore:e.t60,outcome:e.t61,outcomeSymbol:e.t62,prediction:e.t63,odds:e.t64,otherTeam:e.t65,pointsDifferentialValue:e.t66,goalDifferential:e.t69},ya.push(m),e.next=163;break;case 144:if(!0!==a.XGdifferential||"awayWin"!==a.prediction||"notEnoughData"===a.status||"suspended"===a.status||"canceled"===a.status){e.next=163;break}return e.t70="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t71="".concat(a.awayTeam," to win"),e.t72=a.awayOdds,e.t73=Math.abs(a.teamComparisonScore),e.t74=a.teamComparisonScore,e.t75=a.predictionOutcome,e.t76=a.outcomeSymbol,e.t77="".concat(a.awayTeam," to win"),e.t78=a.fractionAway,e.t79=a.homeTeam,e.t80=a.pointsDifferentialValue,e.t81=parseFloat,e.next=159,Ht(a.unroundedGoalsB,a.unroundedGoalsA);case 159:e.t82=e.sent,e.t83=(0,e.t81)(e.t82),m={game:e.t70,team:e.t71,rawOdds:e.t72,comparisonScore:e.t73,rawComparisonScore:e.t74,outcome:e.t75,outcomeSymbol:e.t76,prediction:e.t77,odds:e.t78,otherTeam:e.t79,pointsDifferentialValue:e.t80,goalDifferential:e.t83},ya.push(m);case 163:if(!0!==a.rollingGoalDiff||"homeWin"!==a.prediction||"notEnoughData"===a.status||"suspended"===a.status||"canceled"===a.status){e.next=184;break}return e.t84="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t85="".concat(a.homeTeam," to win"),e.t86=a.homeOdds,e.t87=Math.abs(a.teamComparisonScore),e.t88=a.teamComparisonScore,e.t89=a.predictionOutcome,e.t90=a.outcomeSymbol,e.t91="".concat(a.homeTeam," to win"),e.t92=a.fractionHome,e.t93=a.awayTeam,e.t94=a.rollingGoalDiffValue,e.t95=parseFloat,e.next=178,Ht(a.unroundedGoalsA,a.unroundedGoalsB);case 178:e.t96=e.sent,e.t97=(0,e.t95)(e.t96),g={game:e.t84,team:e.t85,rawOdds:e.t86,comparisonScore:e.t87,rawComparisonScore:e.t88,outcome:e.t89,outcomeSymbol:e.t90,prediction:e.t91,odds:e.t92,otherTeam:e.t93,rollingGoalDiffValue:e.t94,goalDifferential:e.t97},ja.push(g),e.next=203;break;case 184:if(!0!==a.XGdifferential||"awayWin"!==a.prediction||"notEnoughData"===a.status||"suspended"===a.status||"canceled"===a.status){e.next=203;break}return e.t98="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t99="".concat(a.awayTeam," to win"),e.t100=a.awayOdds,e.t101=Math.abs(a.teamComparisonScore),e.t102=a.teamComparisonScore,e.t103=a.predictionOutcome,e.t104=a.outcomeSymbol,e.t105="".concat(a.awayTeam," to win"),e.t106=a.fractionAway,e.t107=a.homeTeam,e.t108=a.rollingGoalDiffValue,e.t109=parseFloat,e.next=199,Ht(a.unroundedGoalsB,a.unroundedGoalsA);case 199:e.t110=e.sent,e.t111=(0,e.t109)(e.t110),g={game:e.t98,team:e.t99,rawOdds:e.t100,comparisonScore:e.t101,rawComparisonScore:e.t102,outcome:e.t103,outcomeSymbol:e.t104,prediction:e.t105,odds:e.t106,otherTeam:e.t107,rollingGoalDiffValue:e.t108,goalDifferential:e.t111},ja.push(g);case 203:if(!0!==a.dangerousAttacksDiff||"homeWin"!==a.prediction||"notEnoughData"===a.status||"suspended"===a.status||"canceled"===a.status){e.next=224;break}return e.t112="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t113="".concat(a.homeTeam," to win"),e.t114=a.homeOdds,e.t115=Math.abs(a.teamComparisonScore),e.t116=a.teamComparisonScore,e.t117=a.predictionOutcome,e.t118=a.outcomeSymbol,e.t119="".concat(a.homeTeam," to win"),e.t120=a.fractionHome,e.t121=a.awayTeam,e.t122=a.rollingGoalDiffValue,e.t123=parseFloat,e.next=218,Ht(a.unroundedGoalsA,a.unroundedGoalsB);case 218:e.t124=e.sent,e.t125=(0,e.t123)(e.t124),h={game:e.t112,team:e.t113,rawOdds:e.t114,comparisonScore:e.t115,rawComparisonScore:e.t116,outcome:e.t117,outcomeSymbol:e.t118,prediction:e.t119,odds:e.t120,otherTeam:e.t121,rollingGoalDiffValue:e.t122,goalDifferential:e.t125},xa.push(h),e.next=243;break;case 224:if(!0!==a.XGdifferential||"awayWin"!==a.prediction||"notEnoughData"===a.status||"suspended"===a.status||"canceled"===a.status){e.next=243;break}return e.t126="complete"===a.status?"".concat(a.homeTeam," ").concat(a.homeGoals," - ").concat(a.awayGoals," ").concat(a.awayTeam):a.game,e.t127="".concat(a.awayTeam," to win"),e.t128=a.awayOdds,e.t129=Math.abs(a.teamComparisonScore),e.t130=a.teamComparisonScore,e.t131=a.predictionOutcome,e.t132=a.outcomeSymbol,e.t133="".concat(a.awayTeam," to win"),e.t134=a.fractionAway,e.t135=a.homeTeam,e.t136=a.rollingGoalDiffValue,e.t137=parseFloat,e.next=239,Ht(a.unroundedGoalsB,a.unroundedGoalsA);case 239:e.t138=e.sent,e.t139=(0,e.t137)(e.t138),h={game:e.t126,team:e.t127,rawOdds:e.t128,comparisonScore:e.t129,rawComparisonScore:e.t130,outcome:e.t131,outcomeSymbol:e.t132,prediction:e.t133,odds:e.t134,otherTeam:e.t135,rollingGoalDiffValue:e.t136,goalDifferential:e.t139},xa.push(h);case 243:Ga.push(a);case 244:case"end":return e.stop()}}),e)})));return function(a){return e.apply(this,arguments)}}()));case 16:return r.a.render(Object(i.jsx)(Kt,{matches:kt,result:!0,bool:s}),document.getElementById("FixtureContainer")),e.next=19,ca(kt);case 19:return e.next=21,Ca();case 21:return e.next=23,Sa(va);case 23:case"end":return e.stop()}}),e)}))),ka.apply(this,arguments)}function Ca(){return Na.apply(this,arguments)}function Na(){return(Na=Object(l.a)(Object(c.a)().mark((function e(){var a,t,s,n,r,o,l,i,d,u,m,g,h,v;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:va=ha.sort((function(e,a){return a.goalDifferential-e.goalDifferential})),ba.sort((function(e,a){return e.goalDifferential===a.goalDifferential?a.comparisonScore-e.comparisonScore:a.goalDifferential>e.goalDifferential?1:-1})),wa.sort((function(e,a){return a.combinedBTTS-e.combinedBTTS})),fa.sort((function(e,a){return a.goalTotalUnrounded-e.goalTotalUnrounded})),Oa.sort((function(e,a){return Math.abs(a.XGdifferentialValue)-Math.abs(e.XGdifferentialValue)})),ya.sort((function(e,a){return Math.abs(a.pointsDifferentialValue)-Math.abs(e.pointsDifferentialValue)})),ja.sort((function(e,a){return Math.abs(a.rollingGoalDiffValue)-Math.abs(e.rollingGoalDiffValue)})),xa.sort((function(e,a){return Math.abs(a.dangerousAttacksDiffValue)-Math.abs(e.dangerousAttacksDiffValue)})),Aa=[],ua=0,ma=0,ga="",e.t0=!0,e.next=e.t0===ha.length>=10?15:e.t0===ha.length>=9?22:e.t0===ha.length>=8?29:e.t0===ha.length>=7?36:e.t0===ha.length>=6?43:e.t0===ha.length>=5?50:e.t0===fa.length>=4?57:64;break;case 15:for(a=0;a<10;a++)t=ha[a],Aa.push(t);return ua=10,ga="45 8-folds, 10 9-folds and 1 10-fold",ia=Da(Aa,8,ma=.1),e.abrupt("break",65);case 22:for(s=0;s<9;s++)n=ha[s],Aa.push(n);return ua=9,ga="36 7-folds, 9 8-folds and 1 9-fold",ia=Da(Aa,7,ma=.1),e.abrupt("break",65);case 29:for(r=0;r<8;r++)o=ha[r],Aa.push(o);return ua=8,ga="28 6-folds, 8 7-folds and 1 8-fold",ia=Da(Aa,6,ma=.1),e.abrupt("break",65);case 36:for(l=0;l<7;l++)i=ha[l],Aa.push(i);return ua=7,ga="7 6-folds and 1 7-fold",ia=Da(Aa,6,ma=1),e.abrupt("break",65);case 43:for(d=0;d<6;d++)u=ha[d],Aa.push(u);return ua=6,ga="6 5-folds and 1 6-fold",ia=Da(Aa,5,ma=1),e.abrupt("break",65);case 50:for(m=0;m<5;m++)g=ha[m],Aa.push(g);return ua=5,ga="5 4-folds and 1 5-fold",ia=Da(Aa,4,ma=1),e.abrupt("break",65);case 57:for(h=0;h<4;h++)v=fa[h],Aa.push(v);return ua=4,ga="4 3-folds and 1 4-fold",ia=Da(Aa,3,ma=1),e.abrupt("break",65);case 64:return e.abrupt("break",65);case 65:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Fa(e){for(var a=1,t=0;t0?r.a.render(Object(i.jsx)("div",{className:"PredictionContainer",children:Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)(D,{}),Object(i.jsx)(C,{buttonText:"Build a multi",element:Object(i.jsxs)("ul",{className:"BestPredictions",id:"BestPredictions",children:[Object(i.jsx)("div",{className:"BestPredictionsExplainer",children:"Add or remove a selection using the buttons below. Predictions are ordered by confidence in the outcome."}),pa.map((function(e){return Object(i.jsxs)("li",{children:[Object(i.jsxs)("div",{children:[e.team,": ",e.odds," ",Object(i.jsx)("span",{className:e.outcome,children:e.outcomeSymbol})]}),Object(i.jsx)("div",{className:"TipGame",children:e.game})]},"".concat(e.game,"acca"))})),Object(i.jsx)("div",{className:"AccumulatedOdds",children:"Accumulator odds ~ : ".concat(Math.round(_a)-1,"/1")})]})})]})}),document.getElementById("bestPredictions")):r.a.render(Object(i.jsx)("div",{className:"PredictionContainer",children:Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)(D,{}),Object(i.jsx)(C,{buttonText:"Build a multi",element:Object(i.jsxs)("ul",{className:"BestPredictions",id:"BestPredictions",children:[Object(i.jsx)("h4",{className:"BestPredictionsExplainer",children:"No games fit the criteria"}),Object(i.jsx)("div",{className:"AccumulatedOdds",children:"Accumulator odds ~ : ".concat(Math.round(_a)-1,"/1")})]})})]})}),document.getElementById("bestPredictions")),Aa.length>4?r.a.render(Object(i.jsx)("div",{className:"PredictionContainer",children:Object(i.jsx)(s.Fragment,{children:Object(i.jsx)(C,{buttonText:"Exotic of the day",element:Object(i.jsxs)("ul",{className:"BestPredictions",id:"BestPredictions",children:[Object(i.jsxs)("h4",{className:"BestPredictionsExplainer",children:[Object(i.jsx)(Ra,{text:"".concat(ua," games: ").concat(ga,"\nStake per multi: ").concat(ma," units - ").concat(da," combinations\nTotal stake: ").concat((ma*da).toFixed(2)," unit(s)")}),"Potential winnings: ".concat(ia.toFixed(2)," units")]}),Aa.map((function(e){return Object(i.jsxs)("li",{children:[e.team,": ",e.odds," ",Object(i.jsx)("span",{className:e.outcome,children:e.outcomeSymbol}),Object(i.jsx)("div",{children:e.game})]},e.team)}))]})})})}),document.getElementById("exoticOfTheDay")):r.a.render(Object(i.jsx)("div",{className:"PredictionContainer",children:Object(i.jsx)(s.Fragment,{children:Object(i.jsx)(C,{buttonText:"Exotic of the day",element:Object(i.jsx)("ul",{className:"BestPredictions",id:"BestPredictions",children:Object(i.jsx)("h4",{className:"BestPredictionsExplainer",children:"Not enough games for this feature"})})})})}),document.getElementById("exoticOfTheDay")),fa.length>0?r.a.render(Object(i.jsx)("div",{children:Object(i.jsx)(s.Fragment,{children:Object(i.jsx)(C,{buttonText:"Over 2.5 goals tips",element:Object(i.jsxs)("ul",{className:"LongshotPredictions",id:"LongshotPredictions",children:[Object(i.jsx)("h4",{children:"Over 2.5 goals"}),fa.map((function(e){return Object(i.jsxs)("li",{children:[e.game," - Odds: ",e.odds," ",Object(i.jsx)("span",{className:"".concat(e.doubleChanceOutcome),children:e.outcomeSymbol})]},e.team)}))]})})})}),document.getElementById("longShots")):r.a.render(Object(i.jsx)("div",{children:Object(i.jsx)(s.Fragment,{children:Object(i.jsx)(C,{buttonText:"Over 2.5 goals tips",element:Object(i.jsx)("ul",{className:"LongshotPredictions",id:"LongshotPredictions",children:Object(i.jsx)("h4",{children:"No games fit the criteria"})})})})}),document.getElementById("longShots")),wa.length>0?r.a.render(Object(i.jsx)("div",{children:Object(i.jsx)(s.Fragment,{children:Object(i.jsx)(C,{buttonText:"BTTS games",element:Object(i.jsxs)("ul",{className:"BTTSGames",id:"BTTSGames",children:[Object(i.jsx)("h4",{children:"Games with highest chance of BTTS"}),wa.map((function(e){return Object(i.jsxs)("li",{children:["".concat(e.game," odds: ").concat(e.bttsFraction)," ",Object(i.jsx)("span",{className:e.bttsOutcome,children:e.bttsOutcomeSymbol})]},e.game)}))]})})})}),document.getElementById("BTTS")):r.a.render(Object(i.jsx)("div",{children:Object(i.jsx)(s.Fragment,{children:Object(i.jsx)(C,{buttonText:"BTTS games",element:Object(i.jsx)("ul",{className:"BTTSGames",id:"BTTSGames",children:Object(i.jsx)("h4",{children:"No games fit the criteria"})})})})}),document.getElementById("BTTS")),r.a.render(Object(i.jsxs)("div",{children:[Object(i.jsx)(C,{buttonText:"XG tips",element:Object(i.jsx)(W,{element:Oa.length>0?Object(i.jsxs)("ul",{className:"XGDiffTips",id:"XGDiffTips",children:[Object(i.jsx)("h4",{children:"Games with greatest XG Differentials"}),Oa.map((function(e){return Object(i.jsxs)("li",{children:[e.game," | ",e.prediction," ",e.odds," ",Object(i.jsx)("span",{className:e.outcome,children:e.outcomeSymbol})]},e.game)}))]}):Object(i.jsxs)("ul",{className:"XGDiffTips",id:"XGDiffTips",children:[Object(i.jsx)("h4",{children:"Games with greatest XG Differentials"}),Object(i.jsx)("li",{children:"Sorry, no games fit this criteria today"},"noPPGDiff")]}),element2:ya.length>0?Object(i.jsxs)("ul",{className:"XGDiffTips",id:"XGDiffTips",children:[Object(i.jsx)("h4",{children:"Games with greatest points per game differentials (last 10)"}),ya.map((function(e){return Object(i.jsxs)("li",{children:[e.game," | ",e.prediction," ",e.odds," ",Object(i.jsx)("span",{className:e.outcome,children:e.outcomeSymbol})]},e.game)}))]}):Object(i.jsxs)("ul",{className:"XGDiffTips",id:"XGDiffTips",children:[Object(i.jsx)("h4",{children:"Games with greatest points per game differentials (last 10)"}),Object(i.jsx)("li",{children:"Sorry, no games fit this criteria today"},"noPPGDiff")]}),element3:ja.length>0?Object(i.jsxs)("ul",{className:"XGDiffTips",id:"XGDiffTips",children:[Object(i.jsx)("h4",{children:"Games with greatest rolling goal difference differentials"}),ja.map((function(e){return Object(i.jsxs)("li",{children:[e.game," | ",e.prediction," ",e.odds," ",Object(i.jsx)("span",{className:e.outcome,children:e.outcomeSymbol})]},e.game)}))]}):Object(i.jsxs)("ul",{className:"XGDiffTips",id:"XGDiffTips",children:[Object(i.jsx)("h4",{children:"Games with greatest rolling goal difference differentials"}),Object(i.jsx)("li",{children:"Sorry, no games fit this criteria today"},"noPPGDiff")]}),element4:xa.length>0?Object(i.jsxs)("ul",{className:"XGDiffTips",id:"XGDiffTips",children:[Object(i.jsx)("h4",{children:"Games with greatest average dangerous attacks differentials"}),xa.map((function(e){return Object(i.jsxs)("li",{children:[e.game," | ",e.prediction," ",e.odds," ",Object(i.jsx)("span",{className:e.outcome,children:e.outcomeSymbol})]},e.game)}))]}):Object(i.jsxs)("ul",{className:"XGDiffTips",id:"XGDiffTips",children:[Object(i.jsx)("h4",{children:"Games with greatest average dangerous attacks differentials"}),Object(i.jsx)("li",{children:"Sorry, no games fit this criteria today"},"noPPGDiff")]}),element5:Object(i.jsxs)("div",{className:"DonationButton",children:[Object(i.jsx)("h2",{children:"Help with running costs"}),Object(i.jsx)("h4",{children:"Monthly costs are rising and each donation helps keep XG Tipping free to use"}),Object(i.jsx)(U,{buttonText:"No sign up donation"})]})})}),Object(i.jsxs)("div",{className:"FiltersSelected",children:[Object(i.jsx)("h4",{children:"Filters selected:"}),Object(i.jsxs)("ul",{className:"FiltersSelectedList",children:[Object(i.jsxs)("li",{children:["Minimum goal difference spread: ",J]}),Object(i.jsxs)("li",{children:["Minimum goal difference spread (home or away only): ",K]}),Object(i.jsxs)("li",{children:["Minimum XG difference spread: ",z]}),Object(i.jsxs)("li",{children:["Minimum PPG difference spread: ",Y]}),Object(i.jsxs)("li",{children:["Odds range: ",S[0]," - ",S[1]]})]})]})]}),document.getElementById("insights"));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var Ia=t(57),Ma=t(29),Wa=t(131),Ea=t(133),Va=t(147),Ua=t(129),za=t(132),Ja=t(128),Ka=t(130),Ya=!1,qa=!1,Za="\u25b2",Qa=Object(Ma.a)((function(e){return{head:{backgroundColor:"rgba(226, 226, 226, 1)",color:"white",padding:"0.35em",paddingTop:"0.75em",paddingBottom:"0.75em",textAlign:"left",fontSize:"1.9em",fontFamily:"inherit",margin:"none"},body:{fontSize:"1.9em",textAlign:"left",fontFamily:"inherit",padding:"0.5em",paddingTop:"0.75em",paddingBottom:"0.75em",margin:"none",color:"#030061"}}}))(Va.a),$a=Object(Ma.a)((function(e){return{head:{backgroundColor:"white",color:"#030061",padding:"0.5em",paddingTop:"1em",paddingBottom:"1em",textAlign:"center",fontSize:"1.9em",fontFamily:"inherit",margin:"none"},body:{fontSize:"1.9em",textAlign:"center",fontFamily:"inherit",padding:"0.35em",paddingTop:"1em",paddingBottom:"1em",margin:"none",color:"#030061"}}}))(Va.a),et=Object(Ma.a)((function(e){return{root:{"&:nth-of-type(odd)":{backgroundColor:"#rgba(226, 226, 226, 0.424)",textAlign:"center"},"&:nth-of-type(even)":{backgroundColor:"#rgba(226, 226, 226, 1)",textAlign:"center"}}}}))(Ja.a);function at(e){var a;return"W"===e?a="winLeague":"D"===e?a="drawLeague":"L"===e&&(a="lossLeague"),a}function tt(e){var a=Object(s.useState)(!1),t=Object(o.a)(a,2);Ya=t[0],qa=t[1];var n,r=e.Teams.map((function(a,t){return Object(i.jsxs)(et,{children:[Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(t+1)}),Object(i.jsx)(Qa,{component:"th",scope:"row",style:{width:"15em"},children:"".concat(a.Name)}),Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(a.Played)}),Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(a.Wins)}),Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(a.Draws)}),Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(a.Losses)}),Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(a.For)}),Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(a.Against)}),Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(a.GoalDifference)}),Object(i.jsx)($a,{component:"th",scope:"row",children:"".concat(a.Points)}),Object(i.jsxs)($a,{component:"th",scope:"row",style:{textAlign:"center"},children:[Object(i.jsx)("span",{className:at(a.Form[0]),children:void 0!==a.Form[0]?a.Form[0]:""}),Object(i.jsx)("span",{className:at(a.Form[1]),children:void 0!==a.Form[1]?a.Form[1]:""}),Object(i.jsx)("span",{className:at(a.Form[2]),children:void 0!==a.Form[2]?a.Form[2]:""}),Object(i.jsx)("span",{className:at(a.Form[3]),children:void 0!==a.Form[3]?a.Form[3]:""}),Object(i.jsx)("span",{className:at(a.Form[4]),children:void 0!==a.Form[4]?a.Form[4]:""})]})]},"".concat(e.Key,"row").concat(t))})),d=[];e.Results&&e.Results.forEach((function(e){n=Object(i.jsxs)("div",{children:[Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_xg}),Object(i.jsx)("span",{className:"column",children:"XG"}),Object(i.jsx)("span",{className:"column",children:e.team_b_xg})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_shots}),Object(i.jsx)("span",{className:"column",children:"Shots"}),Object(i.jsx)("span",{className:"column",children:e.team_b_shots})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_shotsOnTarget}),Object(i.jsx)("span",{className:"column",children:"SOT"}),Object(i.jsx)("span",{className:"column",children:e.team_b_shotsOnTarget})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_dangerous_attacks}),Object(i.jsx)("span",{className:"column",children:"Dangerous Attacks"}),Object(i.jsx)("span",{className:"column",children:e.team_b_dangerous_attacks})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsxs)("span",{className:"column",children:[e.team_a_possession,"%"]}),Object(i.jsx)("span",{className:"column",children:"Possession"}),Object(i.jsxs)("span",{className:"column",children:[e.team_b_possession,"%"]})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_red_cards}),Object(i.jsx)("span",{className:"column",children:"Red cards"}),Object(i.jsx)("span",{className:"column",children:e.team_b_red_cards})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.odds_ft_1}),Object(i.jsx)("span",{className:"column",children:"Odds (pre-match)"}),Object(i.jsx)("span",{className:"column",children:e.odds_ft_2})]})]}),d.push(Object(i.jsx)(C,{classNameButton:"ResultButton",buttonText:Object(i.jsxs)("div",{className:"ResultRowOverview",children:[Object(i.jsx)("div",{className:"columnOverviewHome",children:e.home_name}),Object(i.jsxs)("span",{className:"columnOverviewScore",children:[e.homeGoalCount," : ",e.awayGoalCount]}),Object(i.jsx)("div",{className:"columnOverviewAway",children:e.away_name})]}),element:n}))}));var u=[];function m(a){return e.Teams.find((function(e){return e.ID===a})).Name}function g(e,a,t){return h.apply(this,arguments)}function h(){return(h=Object(l.a)(Object(c.a)().mark((function e(a,t,s){var n;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n="desc"===s?a.sort((function(e,a){return a[t]-e[t]})):a.sort((function(e,a){return e[t]-a[t]})),qa(!Ya),e.abrupt("return",n);case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}if(e.LastWeeksResults&&e.LastWeeksResults.forEach((function(e){n=Object(i.jsxs)("div",{children:[Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_xg}),Object(i.jsx)("span",{className:"column",children:"XG"}),Object(i.jsx)("span",{className:"column",children:e.team_b_xg})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_shots}),Object(i.jsx)("span",{className:"column",children:"Shots"}),Object(i.jsx)("span",{className:"column",children:e.team_b_shots})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_shotsOnTarget}),Object(i.jsx)("span",{className:"column",children:"SOT"}),Object(i.jsx)("span",{className:"column",children:e.team_b_shotsOnTarget})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_dangerous_attacks}),Object(i.jsx)("span",{className:"column",children:"Dangerous Attacks"}),Object(i.jsx)("span",{className:"column",children:e.team_b_dangerous_attacks})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_possession}),Object(i.jsx)("span",{className:"column",children:"Possession"}),Object(i.jsx)("span",{className:"column",children:e.team_b_possession})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.team_a_red_cards}),Object(i.jsx)("span",{className:"column",children:"Red cards"}),Object(i.jsx)("span",{className:"column",children:e.team_b_red_cards})]}),Object(i.jsxs)("div",{className:"ResultRow",children:[Object(i.jsx)("span",{className:"column",children:e.odds_ft_1}),Object(i.jsx)("span",{className:"column",children:"Odds (pre-match)"}),Object(i.jsx)("span",{className:"column",children:e.odds_ft_2})]})]}),u.push(Object(i.jsx)(C,{classNameButton:"ResultButton",buttonText:Object(i.jsxs)("div",{className:"ResultRowOverview",children:[Object(i.jsx)("div",{className:"columnOverviewHome",children:e.home_name}),Object(i.jsxs)("span",{className:"columnOverviewScore",children:[e.homeGoalCount," : ",e.awayGoalCount]}),Object(i.jsx)("div",{className:"columnOverviewAway",children:e.away_name})]}),element:n}))})),e.GamesPlayed>3&&7956!==e.Teams[0].LeagueID&&6969!==e.Teams[0].LeagueID&&11084!==e.Teams[0].LeagueID)for(var v=0;v0&&!0===a)){e.next=6;break}return e.next=4,fetch("".concat("https://api.xgtipping.com/","results"),{method:"DELETE",headers:{Accept:"application/json","Content-Type":"application/json"}}).then(Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch("".concat("https://api.xgtipping.com/","results"),{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(Lt)});case 2:case"end":return e.stop()}}),e)}))));case 4:e.next=7;break;case 6:console.log("EMPTY RESULTS");case 7:case"end":return e.stop()}}),e)})));return function(a){return e.apply(this,arguments)}}(),Yt=!0,r.a.render(Object(i.jsxs)("div",{children:[Object(i.jsx)("div",{className:"LoadingText",children:"Loading all league, fixture & form data, please be patient..."}),Object(i.jsx)(Ia.a,{height:"3em",fill:"#030061"})]}),document.getElementById("Loading")),r.a.render(Object(i.jsx)("div",{}),document.getElementById("GeneratePredictions")),r.a.render(Object(i.jsx)("div",{}),document.getElementById("successMeasure2")),r.a.render(Object(i.jsx)("div",{}),document.getElementById("bestPredictions")),r.a.render(Object(i.jsx)("div",{}),document.getElementById("exoticOfTheDay")),r.a.render(Object(i.jsx)("div",{}),document.getElementById("insights")),r.a.render(Object(i.jsx)("div",{}),document.getElementById("longShots")),r.a.render(Object(i.jsx)("div",{}),document.getElementById("BTTS")),r.a.render(Object(i.jsx)("div",{}),document.getElementById("draws")),p="".concat("https://api.xgtipping.com/","matches/").concat(o),b="".concat("https://api.xgtipping.com/","form/").concat(t),kt=[],Pt=[],e.next=19,fetch("".concat("https://api.xgtipping.com/","leagues/").concat(m));case 19:return nt=e.sent,r.a.render(Object(i.jsx)("div",{}),document.getElementById("FixtureContainer")),e.next=23,fetch(p);case 23:return st=e.sent,e.next=26,st.json().then((function(e){Pt=Array.from(e.data)}));case 26:return O=[],Bt=[],w=!1,e.next=31,fetch(b);case 31:if(201!==(_=e.sent).status&&200!==_.status){e.next=37;break}return e.next=35,_.json().then((function(e){O=Array.from(e.allForm),j=!0,A=!0,Bt=O}));case 35:e.next=39;break;case 37:j=!1,A=!1;case 39:for(Dt=[],G=0;G<_n.length;G++)rt=_n[G].element.id,Dt.push(rt);return S=[],Ft=[],e.next=45,fetch("".concat("https://api.xgtipping.com/","results"));case 45:if(P=e.sent,200!==nt.status||201!==P.status){e.next=68;break}return console.log("Not fetching leagues"),e.next=50,nt.json().then((function(e){Ft=Array.from(e.leagueArray)}));case 50:return v(!1),e.next=53,P.json().then((function(e){Lt=Array.from(e)}));case 53:return console.log(Lt),w=!0,Et(Ft,Dt,Lt),Ct=[],e.next=59,fetch("https://www.sofascore.com/api/v1/sport/football/scheduled-events/".concat(g));case 59:return k=e.sent,e.next=62,k.json().then((function(e){e.events.forEach((function(e){Ct.push({homeTeam:e.homeTeam.name,awayTeam:e.awayTeam.name,id:e.id,time:e.startTimestamp,homeGoals:void 0!=e.homeScore.display?e.homeScore.display:"-",awayGoals:void 0!=e.awayScore.display?e.awayScore.display:"-"})}))}));case 62:return e.next=64,fetch("");case 64:e.sent,console.log(Ct),e.next=69;break;case 68:return e.delegateYield(Object(c.a)().mark((function e(){var a,t,s,n,r,o,l,i,u,g,h,p,b,f,O,j,y,A,_;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:Lt=[],console.log("Fetching leagues"),a=0;case 3:if(!(a<_n.length)){e.next=13;break}return e.next=6,fetch("".concat("https://api.xgtipping.com/","tables/").concat(_n[a].element.id,"/").concat(m));case 6:return nt=e.sent,e.next=9,nt.json().then((function(e){Ft.push(e)}));case 9:w=!1;case 10:a++,e.next=3;break;case 13:t=((new Date).getTime()/1e3).toFixed(0),s=t-23778463,n=Object(x.a)(_n),e.prev=16,n.s();case 18:if((r=n.n()).done){e.next=50;break}return o=r.value,e.next=22,fetch("".concat("https://api.xgtipping.com/","leagueFixtures/").concat(o.element.id));case 22:return l=e.sent,e.next=25,l.json();case 25:if(i=e.sent,u=void 0,g=void 0,!(i.pager.current_pages})),j=O.sort((function(e,a){return e.date_unix-a.date_unix})),g=j.slice(-600),u=g,e.next=45;break;case 43:u=i.data.filter((function(e){return"complete"===e.status})),d&&(y=u.filter((function(e){return e.date_unix>s})),u=y.slice(-600));case 45:A=u.map((function(e){return{home_name:e.home_name,away_name:e.away_name,homeGoalCount:e.homeGoalCount,awayGoalCount:e.awayGoalCount,date_unix:e.date_unix,team_a_xg:e.team_a_xg,team_b_xg:e.team_b_xg,odds_ft_1:e.odds_ft_1,odds_ft_2:e.odds_ft_2,team_a_shots:e.team_a_shots,team_b_shots:e.team_b_shots,team_a_corners:e.team_a_corners,team_b_corners:e.team_b_corners,team_a_shotsOnTarget:e.team_a_shotsOnTarget,team_b_shotsOnTarget:e.team_b_shotsOnTarget,team_a_red_cards:e.team_a_red_cards,team_b_red_cards:e.team_b_red_cards,team_a_possession:e.team_a_possession,team_b_possession:e.team_b_possession,team_a_dangerous_attacks:e.team_a_dangerous_attacks,team_b_dangerous_attacks:e.team_b_dangerous_attacks,pre_match_teamA_overall_ppg:e.pre_match_teamA_overall_ppg,pre_match_teamB_overall_ppg:e.pre_match_teamB_overall_ppg,game_week:e.game_week}})),_={name:o.name,id:o.element.id,fixtures:A},Lt.push(_);case 48:e.next=18;break;case 50:e.next=55;break;case 52:e.prev=52,e.t0=e.catch(16),n.e(e.t0);case 55:return e.prev=55,n.f(),e.finish(55);case 58:v(!0),Et(Ft,Dt,Lt);case 60:case"end":return e.stop()}}),e,null,[[16,52,55,58]])}))(),"t0",69);case 69:for(F=0;F=10?(ct=ft.slice(-3),it=ft.slice(-5),ut=ft.slice(-6),gt=ft.slice(-10),lt=Ot.slice(-3),dt=Ot.slice(-5),mt=Ot.slice(-6),ht=Ot.slice(-10),vt="League",xt=jt,At=yt,_t=wt,St=Gt):ft.length>=6?(ct=ft.slice(-3),it=ft.slice(-5),ut=ft.slice(-6),gt=Array.from(R),lt=Ot.slice(-3),dt=Ot.slice(-5),mt=Ot.slice(-6),ht=Array.from(B),vt="League",xt=jt,At=yt,_t=wt,St=Gt):ft.length>=5?(ct=ft.slice(-3),it=ft.slice(-5),ut=Array.from(L),gt=Array.from(R),lt=Ot.slice(-3),dt=Ot.slice(-5),mt=Array.from(H),ht=Array.from(B),vt="League",xt=jt,At=yt,_t=wt,St=Gt):(ct=[F[2],F[3],F[4]],it=Array.from(F),ut=Array.from(L),gt=Array.from(R),lt=[D[2],D[3],D[4]],dt=Array.from(D),mt=Array.from(H),ht=Array.from(B),vt="All",xt=void 0,At=void 0,_t=void 0,St=void 0),pt=Array.from(X),bt=Array.from(I),0!==d&&"Domestic League"===f[0].data[0].season_format||(d="N/A",u="N/A",w="",_=""),0!==A&&"Domestic League"===f[0].data[0].season_format||(A="N/A",m="N/A",G="",T=""),e.t2=Bt,e.t3=r.id,e.t4=r.homeId,e.t5=r.awayId,e.t6=rt,e.t7=r.homeTeam,e.t8={XGOverall:parseFloat(f[0].data[0].stats.xg_for_avg_overall),XG:parseFloat(f[0].data[0].stats.xg_for_avg_home),ScoredOverall:parseFloat(f[0].data[0].stats.seasonScoredNum_overall),ScoredAverage:parseFloat(f[0].data[0].stats.seasonScoredAVG_home),PlayedHome:parseFloat(f[0].data[0].stats.seasonMatchesPlayed_home),PlayedAway:parseFloat(f[0].data[0].stats.seasonMatchesPlayed_away),ConcededOverall:parseFloat(f[0].data[0].stats.seasonConcededNum_overall),ConcededAverage:parseFloat(f[0].data[0].stats.seasonConcededAVG_home),XGAgainstAvgOverall:parseFloat(f[0].data[0].stats.xg_against_avg_overall),XGAgainstAverage:parseFloat(f[0].data[0].stats.xg_against_avg_home),CleanSheetPercentage:parseFloat(f[0].data[0].stats.seasonCSPercentage_overall),AveragePossessionOverall:parseFloat(f[0].data[0].stats.possessionAVG_overall),AveragePossession:parseFloat(f[0].data[0].stats.possessionAVG_home),AverageShotsOnTargetOverall:parseFloat(f[0].data[0].stats.shotsOnTargetAVG_overall),AverageShotsOnTarget:parseFloat(f[0].data[0].stats.shotsOnTargetAVG_home),AverageDangerousAttacksOverall:parseFloat(f[0].data[0].stats.dangerous_attacks_avg_overall),PPG:parseFloat(f[0].data[0].stats.seasonPPG_overall),AttacksHome:parseFloat(f[0].data[0].stats.attacks_avg_home),AttacksAway:parseFloat(f[0].data[0].stats.attacks_avg_away),AverageDangerousAttacks:parseFloat(f[0].data[0].stats.dangerous_attacks_avg_home),homeAttackAdvantage:parseFloat(f[0].data[0].stats.homeAttackAdvantage),homeDefenceAdvantage:parseFloat(f[0].data[0].stats.homeDefenceAdvantage),BTTSPercentage:parseInt(f[0].data[0].stats.seasonBTTSPercentage_home),LeagueOrAll:vt,LeaguePosition:"".concat(d).concat(w),homeRawPosition:l.rawPosition?l.rawPosition:0,homeTeamHomePositionRaw:u,LeagueAverageGoals:xt,LeagueAverageConceded:At},e.t9={XGOverall:parseFloat(f[0].data[1].stats.xg_for_avg_overall),XG:parseFloat(f[0].data[1].stats.xg_for_avg_home),ScoredOverall:parseFloat(f[0].data[1].stats.seasonScoredNum_overall),ScoredAverage:parseFloat(f[0].data[1].stats.seasonScoredAVG_home),PlayedHome:parseFloat(f[0].data[1].stats.seasonMatchesPlayed_home),PlayedAway:parseFloat(f[0].data[1].stats.seasonMatchesPlayed_away),ConcededOverall:parseFloat(f[0].data[1].stats.seasonConcededNum_overall),ConcededAverage:parseFloat(f[0].data[1].stats.seasonConcededAVG_home),XGAgainstAvgOverall:parseFloat(f[0].data[1].stats.xg_against_avg_overall),XGAgainstAverage:parseFloat(f[0].data[1].stats.xg_against_avg_home),CleanSheetPercentage:parseFloat(f[0].data[1].stats.seasonCSPercentage_overall),AveragePossessionOverall:parseFloat(f[0].data[1].stats.possessionAVG_overall),AveragePossession:parseFloat(f[0].data[1].stats.possessionAVG_home),AverageShotsOnTargetOverall:parseFloat(f[0].data[1].stats.shotsOnTargetAVG_overall),AverageShotsOnTarget:parseFloat(f[0].data[1].stats.shotsOnTargetAVG_home),AverageDangerousAttacksOverall:parseFloat(f[0].data[1].stats.dangerous_attacks_avg_overall),PPG:parseFloat(f[0].data[1].stats.seasonPPG_overall),AttacksHome:parseFloat(f[0].data[1].stats.attacks_avg_home),AttacksAway:parseFloat(f[0].data[1].stats.attacks_avg_away),AverageDangerousAttacks:parseFloat(f[0].data[1].stats.dangerous_attacks_avg_home),homeAttackAdvantage:parseFloat(f[0].data[1].stats.homeAttackAdvantage),homeDefenceAdvantage:parseFloat(f[0].data[1].stats.homeDefenceAdvantage),BTTSPercentage:parseInt(f[0].data[1].stats.seasonBTTSPercentage_home),LeagueOrAll:vt,LeaguePosition:"".concat(d).concat(w),homeRawPosition:l.rawPosition?l.rawPosition:0,homeTeamHomePositionRaw:u,LeagueAverageGoals:xt,LeagueAverageConceded:At},e.t10=parseFloat(f[0].data[2].stats.xg_for_avg_overall),e.t11=parseFloat(f[0].data[2].stats.xg_for_avg_home),e.t12=parseFloat(f[0].data[2].stats.seasonScoredNum_overall),e.t13=parseFloat(f[0].data[2].stats.seasonScoredAVG_home),e.t14=parseFloat(f[0].data[2].stats.seasonMatchesPlayed_home),e.t15=parseFloat(f[0].data[2].stats.seasonMatchesPlayed_away),e.t16=parseFloat(f[0].data[2].stats.seasonConcededNum_overall),e.t17=parseFloat(f[0].data[2].stats.seasonConcededAVG_home),e.t18=parseFloat(f[0].data[2].stats.xg_against_avg_overall),e.t19=parseFloat(f[0].data[2].stats.xg_against_avg_home),e.t20=parseFloat(f[0].data[2].stats.seasonCSPercentage_overall),e.t21=parseFloat(f[0].data[2].stats.possessionAVG_overall),e.t22=parseFloat(f[0].data[2].stats.possessionAVG_home),e.t23=parseFloat(f[0].data[2].stats.shotsOnTargetAVG_overall),e.t24=parseFloat(f[0].data[2].stats.shotsOnTargetAVG_home),e.t25=parseFloat(f[0].data[2].stats.shotsAVG_overall),e.t26=parseFloat(f[0].data[2].stats.shotsAVG_home),e.t27=parseFloat(f[0].data[2].stats.dangerous_attacks_avg_overall),e.t28=parseFloat(f[0].data[2].stats.seasonPPG_overall),e.t29=parseFloat(f[0].data[2].stats.attacks_avg_home),e.t30=parseFloat(f[0].data[2].stats.attacks_avg_away),e.t31=parseFloat(f[0].data[2].stats.dangerous_attacks_avg_home),e.t32=parseFloat(f[0].data[2].stats.homeAttackAdvantage),e.t33=parseFloat(f[0].data[2].stats.homeDefenceAdvantage),e.t34=parseInt(f[0].data[2].stats.seasonBTTSPercentage_home),e.t35=ct.reverse(),e.t36=it.reverse(),e.t37=ut.reverse(),e.t38=gt.reverse(),e.t39=vt,e.t40="".concat(d).concat(w),e.t41=l.rawPosition?l.rawPosition:0,e.t42=u,e.t43=P,e.t44=g,e.t45=p,e.t46=O,e.t47=pt,e.t48=f[0].data[2].stats.seasonGoalDifference_overall,e.t49=f[0].data[2].stats.seasonGoalDifference_home,e.t50=f[0].data[2].stats.seasonBTTSPercentage_overall,e.t51=f[0].data[2].stats.seasonBTTSPercentage_home,e.t52=f[0].data[2].stats.cardsTotal_overall,e.t53=f[0].data[2].stats.cornersAVG_overall,e.t54=f[0].data[2].stats.scoredBothHalvesPercentage_overall,e.next=172,Mt(f[0].data[0].last_updated_match_timestamp);case 172:return e.t55=e.sent,e.t56=ft,e.t57=xt,e.t58=At,e.t59={XGOverall:e.t10,XG:e.t11,ScoredOverall:e.t12,ScoredAverage:e.t13,PlayedHome:e.t14,PlayedAway:e.t15,ConcededOverall:e.t16,ConcededAverage:e.t17,XGAgainstAvgOverall:e.t18,XGAgainstAverage:e.t19,CleanSheetPercentage:e.t20,AveragePossessionOverall:e.t21,AveragePossession:e.t22,AverageShotsOnTargetOverall:e.t23,AverageShotsOnTarget:e.t24,AverageShots:e.t25,AverageShotsHomeOrAway:e.t26,AverageDangerousAttacksOverall:e.t27,PPG:e.t28,AttacksHome:e.t29,AttacksAway:e.t30,AverageDangerousAttacks:e.t31,homeAttackAdvantage:e.t32,homeDefenceAdvantage:e.t33,BTTSPercentage:e.t34,lastThreeForm:e.t35,LastFiveForm:e.t36,LastSixForm:e.t37,LastTenForm:e.t38,LeagueOrAll:e.t39,LeaguePosition:e.t40,homeRawPosition:e.t41,homeTeamHomePositionRaw:e.t42,SeasonPPG:e.t43,WinPercentage:e.t44,LossPercentage:e.t45,DrawPercentage:e.t46,formRun:e.t47,goalDifference:e.t48,goalDifferenceHomeOrAway:e.t49,BttsPercentage:e.t50,BttsPercentageHomeOrAway:e.t51,CardsTotal:e.t52,CornersAverage:e.t53,ScoredBothHalvesPercentage:e.t54,LastMatch:e.t55,WDLRecord:e.t56,LeagueAverageGoals:e.t57,LeagueAverageConceded:e.t58},e.t60={teamName:e.t7,0:e.t8,1:e.t9,2:e.t59},e.t61=r.awayTeam,e.t62={XGOverall:parseFloat(f[1].data[0].stats.xg_for_avg_overall),XG:parseFloat(f[1].data[0].stats.xg_for_avg_away),ScoredOverall:parseFloat(f[1].data[0].stats.seasonScoredNum_overall),ScoredAverage:parseFloat(f[1].data[0].stats.seasonScoredAVG_away),PlayedHome:parseFloat(f[1].data[0].stats.seasonMatchesPlayed_home),PlayedAway:parseFloat(f[1].data[0].stats.seasonMatchesPlayed_away),ConcededOverall:parseFloat(f[1].data[0].stats.seasonConcededNum_overall),ConcededAverage:parseFloat(f[1].data[0].stats.seasonConcededAVG_away),XGAgainstAvgOverall:parseFloat(f[1].data[0].stats.xg_against_avg_overall),XGAgainstAverage:parseFloat(f[1].data[0].stats.xg_against_avg_away),CleanSheetPercentage:parseFloat(f[1].data[0].stats.seasonCSPercentage_overall),AveragePossessionOverall:parseFloat(f[1].data[0].stats.possessionAVG_overall),AveragePossession:parseFloat(f[1].data[0].stats.possessionAVG_away),AverageShotsOnTargetOverall:parseFloat(f[1].data[0].stats.shotsOnTargetAVG_overall),AverageShotsOnTarget:parseFloat(f[1].data[0].stats.shotsOnTargetAVG_away),AverageDangerousAttacksOverall:parseFloat(f[1].data[0].stats.dangerous_attacks_avg_overall),PPG:parseFloat(f[1].data[0].stats.seasonPPG_overall),AttacksAverage:parseFloat(f[1].data[0].stats.attacks_avg_away),AverageDangerousAttacks:parseFloat(f[1].data[0].stats.dangerous_attacks_avg_away),BTTSPercentage:parseInt(f[1].data[0].stats.seasonBTTSPercentage_away),LeagueOrAll:vt,LeaguePosition:"".concat(A).concat(G),awayRawPosition:i.rawPosition?i.rawPosition:0,awayTeamAwayPositionRaw:m,LeagueAverageGoals:_t,LeagueAverageConceded:St},e.t63={XGOverall:parseFloat(f[1].data[1].stats.xg_for_avg_overall),XG:parseFloat(f[1].data[1].stats.xg_for_avg_away),ScoredOverall:parseFloat(f[1].data[1].stats.seasonScoredNum_overall),ScoredAverage:parseFloat(f[1].data[1].stats.seasonScoredAVG_away),PlayedHome:parseFloat(f[1].data[1].stats.seasonMatchesPlayed_home),PlayedAway:parseFloat(f[1].data[1].stats.seasonMatchesPlayed_away),ConcededOverall:parseFloat(f[1].data[1].stats.seasonConcededNum_overall),ConcededAverage:parseFloat(f[1].data[1].stats.seasonConcededAVG_away),XGAgainstAvgOverall:parseFloat(f[1].data[1].stats.xg_against_avg_overall),XGAgainstAverage:parseFloat(f[1].data[1].stats.xg_against_avg_away),CleanSheetPercentage:parseFloat(f[1].data[1].stats.seasonCSPercentage_overall),AveragePossessionOverall:parseFloat(f[1].data[1].stats.possessionAVG_overall),AveragePossession:parseFloat(f[1].data[1].stats.possessionAVG_away),AverageShotsOnTargetOverall:parseFloat(f[1].data[1].stats.shotsOnTargetAVG_overall),AverageShotsOnTarget:parseFloat(f[1].data[1].stats.shotsOnTargetAVG_away),AverageDangerousAttacksOverall:parseFloat(f[1].data[1].stats.dangerous_attacks_avg_overall),PPG:parseFloat(f[1].data[1].stats.seasonPPG_overall),AttacksAverage:parseFloat(f[1].data[1].stats.attacks_avg_away),AverageDangerousAttacks:parseFloat(f[1].data[1].stats.dangerous_attacks_avg_away),BTTSPercentage:parseInt(f[1].data[1].stats.seasonBTTSPercentage_away),LeagueOrAll:vt,LeaguePosition:"".concat(A).concat(G),awayRawPosition:i.rawPosition?i.rawPosition:0,awayTeamAwayPositionRaw:m,LeagueAverageGoals:_t,LeagueAverageConceded:St},e.t64=parseFloat(f[1].data[2].stats.xg_for_avg_overall),e.t65=parseFloat(f[1].data[2].stats.xg_for_avg_away),e.t66=parseFloat(f[1].data[2].stats.seasonScoredNum_overall),e.t67=parseFloat(f[1].data[2].stats.seasonScoredAVG_away),e.t68=parseFloat(f[1].data[2].stats.seasonMatchesPlayed_home),e.t69=parseFloat(f[1].data[2].stats.seasonMatchesPlayed_away),e.t70=parseFloat(f[1].data[2].stats.seasonConcededNum_overall),e.t71=parseFloat(f[1].data[2].stats.seasonConcededAVG_away),e.t72=parseFloat(f[1].data[2].stats.xg_against_avg_overall),e.t73=parseFloat(f[1].data[2].stats.xg_against_avg_away),e.t74=parseFloat(f[1].data[2].stats.seasonCSPercentage_overall),e.t75=parseFloat(f[1].data[2].stats.possessionAVG_overall),e.t76=parseFloat(f[1].data[2].stats.possessionAVG_away),e.t77=parseFloat(f[1].data[2].stats.shotsOnTargetAVG_overall),e.t78=parseFloat(f[1].data[2].stats.shotsOnTargetAVG_away),e.t79=parseFloat(f[1].data[2].stats.shotsAVG_overall),e.t80=parseFloat(f[1].data[2].stats.shotsAVG_away),e.t81=parseFloat(f[1].data[2].stats.dangerous_attacks_avg_overall),e.t82=parseFloat(f[1].data[2].stats.seasonPPG_overall),e.t83=parseFloat(f[1].data[2].stats.attacks_avg_away),e.t84=parseFloat(f[1].data[2].stats.dangerous_attacks_avg_away),e.t85=parseInt(f[1].data[2].stats.seasonBTTSPercentage_away),e.t86=lt.reverse(),e.t87=dt.reverse(),e.t88=mt.reverse(),e.t89=ht.reverse(),e.t90=vt,e.t91="".concat(A).concat(G),e.t92=i.rawPosition?i.rawPosition:0,e.t93=m,e.t94=k,e.t95=v,e.t96=b,e.t97=x,e.t98=bt,e.t99=f[1].data[2].stats.seasonGoalDifference_overall,e.t100=f[1].data[2].stats.seasonGoalDifference_away,e.t101=f[1].data[2].stats.seasonBTTSPercentage_overall,e.t102=f[1].data[2].stats.seasonBTTSPercentage_away,e.t103=f[1].data[2].stats.cardsTotal_overall,e.t104=f[1].data[2].stats.cornersAVG_overall,e.t105=f[1].data[2].stats.scoredBothHalvesPercentage_overall,e.next=225,Mt(f[1].data[0].last_updated_match_timestamp);case 225:e.t106=e.sent,e.t107=Ot,e.t108=_t,e.t109=St,e.t110={XGOverall:e.t64,XG:e.t65,ScoredOverall:e.t66,ScoredAverage:e.t67,PlayedHome:e.t68,PlayedAway:e.t69,ConcededOverall:e.t70,ConcededAverage:e.t71,XGAgainstAvgOverall:e.t72,XGAgainstAverage:e.t73,CleanSheetPercentage:e.t74,AveragePossessionOverall:e.t75,AveragePossession:e.t76,AverageShotsOnTargetOverall:e.t77,AverageShotsOnTarget:e.t78,AverageShots:e.t79,AverageShotsHomeOrAway:e.t80,AverageDangerousAttacksOverall:e.t81,PPG:e.t82,AttacksAverage:e.t83,AverageDangerousAttacks:e.t84,BTTSPercentage:e.t85,lastThreeForm:e.t86,LastFiveForm:e.t87,LastSixForm:e.t88,LastTenForm:e.t89,LeagueOrAll:e.t90,LeaguePosition:e.t91,awayRawPosition:e.t92,awayTeamAwayPositionRaw:e.t93,SeasonPPG:e.t94,WinPercentage:e.t95,LossPercentage:e.t96,DrawPercentage:e.t97,formRun:e.t98,goalDifference:e.t99,goalDifferenceHomeOrAway:e.t100,BttsPercentage:e.t101,BttsPercentageHomeOrAway:e.t102,CardsTotal:e.t103,CornersAverage:e.t104,ScoredBothHalvesPercentage:e.t105,LastMatch:e.t106,WDLRecord:e.t107,LeagueAverageGoals:e.t108,LeagueAverageConceded:e.t109},e.t111={teamName:e.t61,0:e.t62,1:e.t63,2:e.t110},e.t112={id:e.t3,teamIDHome:e.t4,teamIDAway:e.t5,leagueId:e.t6,home:e.t60,away:e.t111},e.t2.push.call(e.t2,e.t112);case 233:if(r.homeBadge=a.home_image,r.awayBadge=a.away_image,r.homePpg=a.home_ppg.toFixed(2),r.awayPpg=a.away_ppg.toFixed(2),r.lastFiveFormHome=it,r.lastFiveFormAway=dt,r.homeRawPosition=l.rawPosition,r.awayRawPosition=i.rawPosition,r.homeTeamHomePosition="".concat(u).concat(_),r.awayTeamAwayPosition="".concat(m).concat(T),r.homeTeamHomePositionRaw=u,r.awayTeamAwayPositionRaw=m,r.homeTeamWinPercentage=g,r.awayTeamWinPercentage=v,r.homeTeamLossPercentage=p,r.awayTeamLossPercentage=b,r.homeTeamDrawPercentage=O,r.awayTeamDrawPercentage=x,r.status=a.status,r.over25Odds=a.odds_ft_over25,r.btts_potential=a.btts_potential,r.game=r.homeTeam+" v "+r.awayTeam,r.stadium=a.stadium_name,r.homeGoals=a.homeGoalCount,r.awayGoals=a.awayGoalCount,r.expectedGoalsHomeToDate=a.team_a_xg_prematch,r.expectedGoalsAwayToDate=a.team_b_xg_prematch,r.game_week=a.game_week,"canceled"===r.status&&"suspended"===r.status){e.next=265;break}return kt.push(r),e.next=265,zt(r,!1);case 265:case"end":return e.stop()}}),e,null,[[43,63],[72,92]])})),n.s();case 6:if((o=n.n()).done){e.next=10;break}return e.delegateYield(l(),"t0",8);case 8:e.next=6;break;case 10:e.next=15;break;case 12:e.prev=12,e.t1=e.catch(3),n.e(e.t1);case 15:return e.prev=15,n.f(),e.finish(15);case 18:kt.length>0&&r.a.render(Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)(u,{text:"Get Predictions & League stats",onClickEvent:function(){return Pa(a)},className:"GeneratePredictions"}),Object(i.jsx)("div",{className:"Version",children:"Prediction engine v4.2.1 (26/04/24)"}),Object(i.jsx)(C,{buttonText:"Filters",element:Object(i.jsxs)("div",{className:"FilterContainer",children:[Object(i.jsx)("h6",{children:"Use the below filters to remove predictions that don't meet the set criteria. These will be greyed out and not included in multi-builders and ROI stats"}),Object(i.jsx)("h6",{children:"Goals for/against differential filter (BETA)"}),Object(i.jsx)("div",{children:"I'm looking for tips where the goal differential between teams is at least..."}),Object(i.jsx)(te,{value:"0",text:"all games",useCase:"gd",lower:"0",upper:"30"}),Object(i.jsx)("h6",{children:"Goals for/against home or away differential filter (BETA)"}),Object(i.jsx)("div",{children:"I'm looking for tips where the goal differential (home or away only) between teams is at least..."}),Object(i.jsx)(te,{value:"0",text:"all games",useCase:"gdHorA",lower:"0",upper:"30"}),Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("h6",{children:"XG for/against differential filter (BETA)"}),Object(i.jsx)("div",{children:"I'm looking for tips where the XG differential between teams is at least..."}),Object(i.jsx)(te,{value:"0",text:"all games",useCase:"xg",lower:"0",upper:"30"})]}),Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("h6",{children:"Last 10 points differential filter (BETA)"}),Object(i.jsx)("div",{children:"I'm looking for tips where the points differential between teams is at least..."}),Object(i.jsx)(te,{value:"0",text:"all games",useCase:"last10",lower:"0",upper:"30"})]}),Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("h6",{children:"Choose your risk profile"}),Object(i.jsx)("div",{children:"I'm looking for tips where the odds are between..."}),Object(i.jsx)(T,{value:"1",text:"all games"})]})]})}),","]}),document.getElementById("GeneratePredictions"));case 19:case"end":return e.stop()}}),e,null,[[3,12,15,18]])})),V=0;case 72:if(!(V<_n.length)){e.next=77;break}return e.delegateYield(E(V),"t1",74);case 74:V++,e.next=72;break;case 77:if(r.a.render(Object(i.jsx)("div",{children:Object(i.jsx)("div",{className:"LoadingText"})}),document.getElementById("Loading")),A){e.next=83;break}return e.next=81,fetch("".concat("https://api.xgtipping.com/","allForm/").concat(t),{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({allForm:Bt})});case 81:return e.next=83,v(!0);case 83:if(w){e.next=86;break}return e.next=86,fetch("".concat("https://api.xgtipping.com/","leagues/").concat(m),{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({leagueArray:Ft})});case 86:r.a.render(Object(i.jsx)(Kt,{matches:kt,result:!1,bool:!1}),document.getElementById("FixtureContainer")),setTimeout((function(){Yt=!1}),3e3);case 88:case"end":return e.stop()}}),e)}))),Zt.apply(this,arguments)}var Qt=function(e){return Object(i.jsxs)("ul",{className:e.className,style:e.style,children:[Object(i.jsx)("li",{className:"Stadium","data-cy":e.name+"Stadium",children:"Venue - ".concat(e.stadium)},"Stadium"),Object(i.jsxs)("div",{className:"KeyStatsOne",children:[Object(i.jsx)("li",{className:"h2h","data-cy":e.name+"h2h",children:"Matches played: ".concat(e.matches)},"h2h"),Object(i.jsx)("li",{className:"homeWins","data-cy":e.name+"homeWins",children:"".concat(e.homeTeam," wins: ").concat(e.homeWins)},"homeWins"),Object(i.jsx)("li",{className:"awayWins","data-cy":e.name+"awayWins",children:"".concat(e.awayTeam," wins: ").concat(e.awayWins)},"awayWins"),Object(i.jsx)("li",{className:"draws","data-cy":e.name+"draws",children:"Draws: ".concat(e.draws)},"draws")]}),Object(i.jsxs)("div",{className:"KeyStatsTwo",children:[Object(i.jsx)("li",{className:"averageGoals","data-cy":e.name+"averageGoals",children:"Average goals in fixture: ".concat(e.averageGoals)},"averageGoals"),Object(i.jsx)("li",{className:"bestHomeOdds","data-cy":e.name+"bestHomeOdds",children:"Best oods for home win @: ".concat(e.bestHomeOdds)},"bestHomeOdds"),Object(i.jsx)("li",{className:"bestAwayOdds","data-cy":e.name+"bestAwayOdds",children:"Best oods for away win @: ".concat(e.bestAwayOdds)},"bestAwayOdds")]}),Object(i.jsx)("li",{className:"LastGameDetail","data-cy":e.name+"Last",children:"Last meeting - ".concat(e.lastGameStadiumName," ").concat(e.lastGameDate)},"lastGameDetail"),Object(i.jsxs)("div",{className:"LastGameOverview",children:[Object(i.jsx)("div",{className:"LastGameHome","data-cy":e.name+"LastGame",children:"".concat(e.lastGameHomeTeam)},"lastGame"),Object(i.jsx)("span",{className:"LastGameScore",children:"".concat(e.lastGameHomeGoals)}),Object(i.jsx)("span",{className:"LastGameScore",children:"".concat(e.lastGameAwayGoals)}),Object(i.jsx)("div",{className:"LastGameAway",children:"".concat(e.lastGameAwayTeam)})]}),Object(i.jsx)("li",{className:"secondToLastGameDetail","data-cy":e.name+"secondToLast",children:"Second to last meeting - ".concat(e.secondToLastGameStadiumName," ").concat(e.secondToLastGameDate)},"secondToLastGameDetail"),Object(i.jsxs)("div",{className:"LastGameOverview",children:[Object(i.jsx)("div",{className:"LastGameHome","data-cy":e.name+"LastGame",children:"".concat(e.secondToLastGameHomeTeam)},"lastGame"),Object(i.jsx)("span",{className:"LastGameScore",children:"".concat(e.secondToLastGameHomeGoals)}),Object(i.jsx)("span",{className:"LastGameScore",children:"".concat(e.secondToLastGameAwayGoals)}),Object(i.jsx)("div",{className:"LastGameAway",children:"".concat(e.secondToLastGameAwayTeam)})]})]})},$t=Object(Ma.a)((function(e){return{head:{padding:10,textAlign:"center",fontSize:"2em",fontFamily:"inherit",margin:"none",color:"white",lineHeight:"2em",backgroundColor:"#030061"},body:{fontSize:"2em",fontFamily:"inherit",padding:10,color:"white",margin:"none",backgroundColor:"#030061"}}}))(Va.a),es=Object(Ma.a)((function(e){return{root:{"&:nth-of-type(odd)":{backgroundColor:"#030061",textAlign:"center"},"&:nth-of-type(even)":{backgroundColor:"#030052",textAlign:"center"}}}}))(Ja.a);function as(e){return Object(i.jsx)(Ua.a,{className:"StatsTable",children:Object(i.jsxs)(Wa.a,{"aria-label":"customized table",children:[Object(i.jsx)(za.a,{children:Object(i.jsxs)(Ja.a,{children:[Object(i.jsx)($t,{children:"Stat"}),Object(i.jsx)($t,{children:"H2H history"}),Object(i.jsx)($t,{children:"XGTipping forecast"}),Object(i.jsx)($t,{children:"Odds (yes)"}),Object(i.jsx)($t,{children:"Odds (no)"})]})}),Object(i.jsxs)(Ea.a,{children:[Object(i.jsxs)(es,{children:[Object(i.jsx)($t,{component:"th",scope:"row",align:"center",padding:"5",children:"Over 0.5 Goals %"}),Object(i.jsx)($t,{component:"th",scope:"row",align:"center",children:"".concat(e.o05Stat,"%")}),Object(i.jsx)($t,{align:"center",children:"-"}),Object(i.jsx)($t,{align:"center",children:e.o05Odds}),Object(i.jsx)($t,{align:"center",children:e.u05Odds})]},"O05"),Object(i.jsxs)(es,{children:[Object(i.jsx)($t,{component:"th",scope:"row",align:"center",padding:"5",children:"Over 1.5 Goals %"}),Object(i.jsx)($t,{component:"th",scope:"row",align:"center",children:"".concat(e.o15Stat,"%")}),Object(i.jsx)($t,{align:"center",children:"-"}),Object(i.jsx)($t,{align:"center",children:e.o15Odds}),Object(i.jsx)($t,{align:"center",children:e.u15Odds})]},"O15"),Object(i.jsxs)(es,{children:[Object(i.jsx)($t,{component:"th",scope:"row",align:"center",children:"Over 2.5 Goals %"}),Object(i.jsx)($t,{component:"th",scope:"row",align:"center",children:"".concat(e.o25Stat,"%")}),Object(i.jsx)($t,{align:"center",children:"-"}),Object(i.jsx)($t,{align:"center",children:e.o25Odds}),Object(i.jsx)($t,{align:"center",children:e.u25Odds})]},"O25"),Object(i.jsxs)(es,{children:[Object(i.jsx)($t,{component:"th",scope:"row",align:"center",children:"Over 3.5 Goals %"}),Object(i.jsx)($t,{component:"th",scope:"row",align:"center",children:"".concat(e.o35Stat,"%")}),Object(i.jsx)($t,{align:"center",children:"-"}),Object(i.jsx)($t,{align:"center",children:e.o35Odds}),Object(i.jsx)($t,{align:"center",children:e.u35Odds})]},"O35")]})]})})}function ts(e,a,t,s,n,r,o){return ss.apply(this,arguments)}function ss(){return ss=Object(l.a)(Object(c.a)().mark((function e(a,t,n,o,d,u,m){var g,h,v,p,b,f;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return g=a,e.next=3,fetch("".concat("https://api.xgtipping.com/","match/").concat(g));case 3:return f=e.sent,e.next=6,f.json().then(function(){var e=Object(l.a)(Object(c.a)().mark((function e(a){var f,O,j,x,y,A,w,_,G,S,T,P,k,C,N,F,D,L,H,R,B;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(T=function(){return(T=Object(l.a)(Object(c.a)().mark((function e(a){var t;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=a/100,e.abrupt("return",(1/t).toFixed(2));case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)},S=function(e){return T.apply(this,arguments)},G=function(){return G=Object(l.a)(Object(c.a)().mark((function e(a,t,s,n,r){var o;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return console.log(a),console.log(t),console.log(s),console.log(n),console.log(r),o=a+t+s+n+r,e.abrupt("return",o/5);case 7:case"end":return e.stop()}}),e)}))),G.apply(this,arguments)},_=function(e,a,t,s,n){return G.apply(this,arguments)},f=a.data.h2h.previous_matches_ids,x=[],y=[],a.data.odds_comparison?(x=a.data.odds_comparison["FT Result"][1],y=a.data.odds_comparison["FT Result"][2],A=Object.entries(x).sort((function(e,a){return a[1]-e[1]})),w=Object.entries(y).sort((function(e,a){return a[1]-e[1]})),v=A[0][0],h=A[0][1],b=w[0][0],p=w[0][1]):(v="N/A",h="N/A",b="N/A",p="N/A"),!(a.data.h2h.previous_matches_results.totalMatches>0)){e.next=31;break}return f.sort((function(e,a){return a.date_unix-e.date_unix})),P=f[0].id,k=!0,C=void 0!==f[1]&&f[1].id,e.next=15,fetch("".concat("https://api.xgtipping.com/","match/").concat(P));case 15:return N=e.sent,e.next=18,N.json().then(function(){var e=Object(l.a)(Object(c.a)().mark((function e(a){var t,s,n;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(O=a.data,t=O.date_unix,F=new Date(1e3*t),D="".concat(F.getDate(),"/").concat(F.getMonth()+1,"/").concat(F.getFullYear()),!1===k){e.next=11;break}return e.next=8,fetch("".concat("https://api.xgtipping.com/","match/").concat(C));case 8:return s=e.sent,e.next=11,s.json().then((function(e){var a=(j=e.data).date_unix;n=new Date(1e3*a),L="".concat(n.getDate(),"/").concat(n.getMonth()+1,"/").concat(n.getFullYear())}));case 11:case"end":return e.stop()}}),e)})));return function(a){return e.apply(this,arguments)}}());case 18:return e.next=20,_(o,d,u,m,a.data.h2h.betting_stats.bttsPercentage);case 20:return H=e.sent,e.next=23,S(H);case 23:return R=e.sent,e.next=26,S(100-H);case 26:B=e.sent,console.log(a.data),r.a.render(Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("h3",{children:"Fixture history"}),Object(i.jsx)(Qt,{className:"PreviousMatchStats",homeTeam:t,awayTeam:n,stadium:a.data.stadium_name,matches:a.data.h2h.previous_matches_results.totalMatches,homeWins:a.data.h2h.previous_matches_results.team_a_wins,awayWins:a.data.h2h.previous_matches_results.team_b_wins,draws:a.data.h2h.previous_matches_results.draw,averageGoals:a.data.h2h.betting_stats.avg_goals,bestHomeOdds:"".concat(v," - ").concat(h),bestAwayOdds:"".concat(b," - ").concat(p),lastGameStadiumName:O.stadium_name?O.stadium_name:"-",lastGameHomeGoals:void 0!==O.homeGoalCount?O.homeGoalCount:"-",lastGameAwayGoals:void 0!==O.awayGoalCount?O.awayGoalCount:"-",lastGameHomeTeam:O.home_name?O.home_name:"-",lastGameAwayTeam:O.away_name?O.away_name:"-",lastGameDate:isNaN(D)?"-":D,secondToLastGameStadiumName:j.stadium_name?j.stadium_name:"-",secondToLastGameHomeGoals:void 0!==j.homeGoalCount?j.homeGoalCount:"-",secondToLastGameAwayGoals:void 0!==j.awayGoalCount?j.awayGoalCount:"-",secondToLastGameHomeTeam:j.home_name?j.home_name:"-",secondToLastGameAwayTeam:j.away_name?j.away_name:"-",secondToLastGameDate:isNaN(L)?"-":L}),Object(i.jsx)(as,{o05Stat:a.data.h2h.betting_stats.over05Percentage,o15Stat:a.data.h2h.betting_stats.over15Percentage,o15Forecast:a.data.o15_potential,o05Odds:a.data.odds_ft_over05,u05Odds:a.data.odds_ft_under05,o15Odds:a.data.odds_ft_over15,u15Odds:a.data.odds_ft_under15,o25Stat:a.data.h2h.betting_stats.over25Percentage,o25Forecast:a.data.o25_potential,o25Odds:a.data.odds_ft_over25,u25Odds:a.data.odds_ft_under25,o35Stat:a.data.h2h.betting_stats.over35Percentage,o35Forecast:a.data.o35_potential,o35Odds:a.data.odds_ft_over35,u35Odds:a.data.odds_ft_under35,BTTSStat:a.data.h2h.betting_stats.bttsPercentage,BTTSForecast:"".concat(H,"%"),BTTSOdds:"".concat(a.data.odds_btts_yes,"\n Fair odds: ").concat(R),BTTSOddsNo:"".concat(a.data.odds_btts_no,"\n Fair odds: ").concat(B),CornersStat:"\u2013",CornersForecast:a.data.corners_potential,CornersOdds:a.data.odds_corners_over_105})]}),document.getElementById("H2HStats".concat(g))),e.next=32;break;case 31:r.a.render(Object(i.jsx)("div",{children:"No fixture history found"}),document.getElementById("H2HStats".concat(g)));case 32:case"end":return e.stop()}}),e)})));return function(a){return e.apply(this,arguments)}}());case 6:case"end":return e.stop()}}),e)}))),ss.apply(this,arguments)}function ns(e){return rs.apply(this,arguments)}function rs(){return(rs=Object(l.a)(Object(c.a)().mark((function e(a){var t,s;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=a,e.t0=!0,e.next=e.t0===t>1.5?4:e.t0===(t>1.25&&t<=1.5)?6:e.t0===(t>1&&t<=1.25)?8:e.t0===(t>.75&&t<=1)?10:e.t0===(t>.4&&t<=.75)?12:e.t0===(t>-.4&&t<=.4)?14:e.t0===(t<-.4&&t>=-.75)?16:e.t0===(t<-.75&&t>=-1)?18:e.t0===(t<-1&&t>=-1.25)?20:e.t0===(t<-1.25&&t>=-1.5)?22:e.t0===t<-1.5?24:26;break;case 4:return s="Underachieving drastically against their expected goal difference.",e.abrupt("break",28);case 6:return s="Underachieving to a large degree against their expected goal difference.",e.abrupt("break",28);case 8:return s="Underachieving against their expected goal difference.",e.abrupt("break",28);case 10:return s="Underachieving to a small degree against their expected goal difference.",e.abrupt("break",28);case 12:return s="Underachieving slighly against their expected goal difference.",e.abrupt("break",28);case 14:return s="Roughly tracking on par with their expected goal difference.",e.abrupt("break",28);case 16:return s="Overachieving slighly against their expected goal difference.",e.abrupt("break",28);case 18:return s="Overachieving to a small degree against their expected goal difference.",e.abrupt("break",28);case 20:return s="Overachieving against their expected goal difference.",e.abrupt("break",28);case 22:return s="Overachieving to a large degree against their expected goal difference.",e.abrupt("break",28);case 24:return s="Overachieving drastically against their expected goal difference.",e.abrupt("break",28);case 26:return s="",e.abrupt("break",28);case 28:return e.abrupt("return",s);case 29:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function os(e,a){return cs.apply(this,arguments)}function cs(){return(cs=Object(l.a)(Object(c.a)().mark((function e(a,t){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",parseFloat(a-t).toFixed(2));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ls(e,a,t,s){return is.apply(this,arguments)}function is(){return(is=Object(l.a)(Object(c.a)().mark((function e(a,t,s,n){var r,o,l;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=a-t,o=s-n,e.next=4,os(r,o);case 4:return l=e.sent,e.abrupt("return",l);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ds(e,a){return us.apply(this,arguments)}function us(){return(us=Object(l.a)(Object(c.a)().mark((function e(a,t){var s;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(a>=3)){e.next=13;break}e.t0=!0,e.next=e.t0===a>t?4:e.t0===(a===t)?6:e.t0===a=2)){e.next=26;break}e.t1=!0,e.next=e.t1===a>t?17:e.t1===(a===t)?19:e.t1===a=1)){e.next=39;break}e.t2=!0,e.next=e.t2===a>t?30:e.t2===(a===t)?32:e.t2===a0)){e.next=52;break}e.t3=!0,e.next=e.t3===a>t?43:e.t3===(a===t)?45:e.t3===a80?3:e.t0===(a>60&&a<=80)?5:e.t0===(a>40&&a<=60)?7:e.t0===(a>20&&a<=40)?9:e.t0===(a>1&&a<=20)?11:e.t0===(0===a)?13:15;break;case 3:return t="Incredibly strong defensively, with ".concat(a,"% of their games ending in a cleansheet"),e.abrupt("break",16);case 5:return t="Very strong defensively, with ".concat(a,"% of their games ending in a cleansheet"),e.abrupt("break",16);case 7:return t="Defensively impressive, with ".concat(a,"% of their games ending in a cleansheet"),e.abrupt("break",16);case 9:return t="Defensively, ".concat(a,"% of their games have ended in a cleansheet"),e.abrupt("break",16);case 11:return t="Defensively frail, with only ".concat(a,"% of their games ending in a cleansheet"),e.abrupt("break",16);case 13:return t="Defensively weak, with ".concat(a,"% of their games ending in a cleansheet"),e.abrupt("break",16);case 15:return e.abrupt("break",16);case 16:return e.abrupt("return",t);case 17:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function hs(){return(hs=Object(l.a)(Object(c.a)().mark((function e(a,t,s){var n,r,o,l,i,d,u,m;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=t[1],o=t[0],e.next=4,ls(a.XGOverall,a.XGAgainstAvgOverall,a.ScoredOverall/10,a.ConcededOverall/10);case 4:return l=e.sent,e.next=7,ns(l);case 7:return i=e.sent,e.next=10,ds(a.last5Goals,a.last10Goals);case 10:return d=e.sent,e.next=13,ms(a.CleanSheetPercentage);case 13:if(u=e.sent,!((m=(parseFloat(o)+parseFloat(r))/2)>=2.6)){e.next=28;break}e.t0=!0,e.next=e.t0===o>r?19:e.t0===(o===r)?21:e.t0===o=2.3)){e.next=41;break}e.t1=!0,e.next=e.t1===o>r?32:e.t1===(o===r)?34:e.t1===o=2)){e.next=54;break}e.t2=!0,e.next=e.t2===o>r?45:e.t2===(o===r)?47:e.t2===o=1.7)){e.next=67;break}e.t3=!0,e.next=e.t3===o>r?58:e.t3===(o===r)?60:e.t3===o=1.4)){e.next=80;break}e.t4=!0,e.next=e.t4===o>r?71:e.t4===(o===r)?73:e.t4===o=1.1)){e.next=94;break}console.log(2),e.t5=!0,e.next=e.t5===o>r?85:e.t5===(o===r)?87:e.t5===o=.8)){e.next=107;break}e.t6=!0,e.next=e.t6===o>r?98:e.t6===(o===r)?100:e.t6===o=.5)){e.next=120;break}e.t7=!0,e.next=e.t7===o>r?111:e.t7===(o===r)?113:e.t7===or?124:e.t8===(o===r)?126:e.t8===oMath.abs(e.depth)?(a=Math.abs(e.height),t=-Math.abs(e.height)):(Math.abs(e.height),Math.abs(e.depth),a=Math.abs(e.depth),t=-Math.abs(e.depth));var s={color:"#030061",responsive:!0,aspectRatio:1.2,maintainAspectRatio:!0,layout:{padding:3},elements:{point:{radius:0}},scales:{y:{suggestedMin:t,suggestedMax:a,grid:{borderWidth:1,borderColor:"black"},ticks:{font:{size:12}}},x:{title:{display:!1,text:"Last X Games",font:{size:14}},grid:{borderWidth:1,borderColor:"black"},ticks:{display:!1,font:{size:14}}}},plugins:{legend:{position:"top",labels:{boxHeight:5}},title:{display:!0,text:e.type,color:"#030061",font:{size:14}}}},n={labels:Array.from(e.data1.keys()),datasets:[{label:e.team1,font:{color:"black"},data:e.data1,borderColor:"#030061",borderWidth:2,backgroundColor:"#030061",tension:e.tension},{label:e.team2,data:e.data2,borderColor:"#970d00",borderWidth:2,backgroundColor:"#970d00",tension:e.tension}]};return Object(i.jsx)(fs.b,{options:s,data:n})}function js(e){var a={color:"#030061",scales:{r:{angleLines:{display:!1},suggestedMin:0,suggestedMax:1,ticks:{precision:0,display:!1}}},plugins:{legend:{position:"top",labels:{boxHeight:10,color:"#030061"}},title:{display:!0,text:e.title,color:"#030061",font:{size:14}}}},t={labels:["Attack rating","Defence rating","Ball retention","XG For","XG Against","Directness","Attacking precision"],datasets:[{label:e.team1,data:e.data,fill:!0,backgroundColor:"rgba(54, 162, 235, 0.2)",borderColor:"#030061",pointBackgroundColor:"#030061",pointBorderColor:"#fff",pointHoverBackgroundColor:"#fff",pointHoverBorderColor:"rgb(255, 99, 132)",borderWidth:2},{label:e.team2,data:e.data2,fill:!0,backgroundColor:"rgba(255, 99, 132, 0.2)",borderColor:"#970d00",pointBackgroundColor:"#970d00",pointBorderColor:"#fff",pointHoverBackgroundColor:"#fff",pointHoverBorderColor:"rgb(54, 162, 235)",borderWidth:2}]};return Object(i.jsx)(fs.c,{options:a,data:t})}function xs(e){var a=e.data1,t=e.data2.map((function(e,t){return e-a[t]}));!function(e,a){var t=[],s=Math.abs(e),n=Math.abs(a);t.push(s,n),Math.max.apply(Math,t)}(Math.max.apply(Math,Object(ps.a)(t)),Math.min.apply(Math,Object(ps.a)(t)));var s={color:"#030061",indexAxis:"y",aspectRatio:1.3,elements:{bar:{borderWidth:2}},scales:{x:{min:-4,max:4,ticks:{display:!1}},y:{ticks:{font:{size:10}}}},responsive:!0,plugins:{legend:{display:!1},tooltip:{enabled:!1},title:{display:!0,text:e.text,color:"#030061",font:{size:14}}}},n={labels:["Highest Goals","Fewest Conceeded","PPG","Highest XG","Fewest XG Conceeded","Shots On Target","Dangerous Attacks","Av. Possession","Home/Away Goal Diff","Corners"],datasets:[{legend:{display:!1},data:t,backgroundColor:function(e){var a=e.dataIndex;return e.dataset.data[a]<0?"#030061":"#970d00"}}]};return Object(i.jsx)(fs.a,{options:s,data:n})}bs.f.register(bs.e,bs.l,bs.q,bs.n,bs.a,bs.h,bs.c,bs.k,bs.s,bs.t,bs.i);var ys=function(e){var a,t,s=e.id,n=e.team1,r=e.team2,o=e.time,c=e.homeGoals,l=e.awayGoals,d="https://widgets.sofascore.com/embed/lineups?id=".concat(s,"&widgetBackground=Gray&v=2"),u=(new Date).getTime()/1e3;return o>0?(a=o-u,t=Math.floor(a/60)):t=-99999999,"N/A"===n?Object(i.jsx)("h6",{children:"No lineups available for this match yet"}):t>60?Object(i.jsxs)("div",{children:[Object(i.jsx)("h6",{children:"Predicted lineups"}),Object(i.jsx)("iframe",{id:"sofa-lineups-embed-".concat(s),src:d,style:{height:"721px",maxWidth:"800px",width:"100%",border:"0"},scrolling:"no",title:"SofaScore Lineups"}),Object(i.jsx)("div",{style:{fontSize:"12px",fontFamily:"Open Sans, sans-serif"}})]}):t<60&&t>0?Object(i.jsxs)("div",{children:[Object(i.jsx)("h6",{children:"Lineups"}),Object(i.jsx)("iframe",{id:"sofa-lineups-embed-".concat(s),src:d,style:{height:"721px",maxWidth:"800px",width:"100%",border:"0"},scrolling:"no",title:"SofaScore Lineups"}),Object(i.jsx)("div",{style:{fontSize:"12px",fontFamily:"Open Sans, sans-serif"}})]}):t<0?Object(i.jsxs)("div",{children:[Object(i.jsxs)("div",{className:"CurrentScore",children:["Score: ","".concat(n,": ").concat(c," - ").concat(r,": ").concat(l)]}),Object(i.jsx)("span",{children:"Score not live updated"}),Object(i.jsx)("h6",{className:"AttackingMomentum",children:"Live attacking momentum and goals"}),Object(i.jsx)("iframe",{width:"100%",height:"194",src:"https://widgets.sofascore.com/embed/attackMomentum?id=".concat(s,"&widgetBackground=Gray&v=2"),frameborder:"0",scrolling:"no"}),Object(i.jsx)("div",{style:{fontSize:"12px",fontFamily:"Open Sans, sans-serif"}}),Object(i.jsx)("h6",{children:"Lineups and in-play ratings"}),Object(i.jsx)("iframe",{id:"sofa-lineups-embed-".concat(s),src:d,style:{height:"721px",maxWidth:"800px",width:"100%",border:"0"},scrolling:"no",title:"SofaScore Lineups"}),Object(i.jsx)("div",{style:{fontSize:"12px",fontFamily:"Open Sans, sans-serif"}})]}):Object(i.jsx)("h6",{children:"Lineups coming in approximately ".concat(t-60," minutes")})};function As(e){return ws.apply(this,arguments)}function ws(){return(ws=Object(l.a)(Object(c.a)().mark((function e(a){var t,s,n,r,o;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(r in t={"Average Dangerous Attacks":.1,"Average Shots":.05,"Average Shots On Target":.15,"Average Expected Goals":.25,"Recent XG":.15,"Average Goals":.25,Corners:.05},s={"Average Dangerous Attacks":{min:25,max:75},"Average Shots":{min:4,max:17},"Average Shots On Target":{min:2,max:10},"Average Expected Goals":{min:.25,max:2.75},"Recent XG":{min:.25,max:2.75},"Average Goals":{min:.25,max:2.75},Corners:{min:2,max:9}},n=0,a)a.hasOwnProperty(r)&&t.hasOwnProperty(r)&&s.hasOwnProperty(r)?(o=(a[r]-s[r].min)/(s[r].max-s[r].min),n+=o*t[r]):console.log(r);return e.abrupt("return",parseFloat(n.toFixed(2)));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function _s(e){return Gs.apply(this,arguments)}function Gs(){return Gs=Object(l.a)(Object(c.a)().mark((function e(a){var t,s,n,r,o,l,i,d=arguments;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(l in t=d.length>1&&void 0!==d[1]?d[1]:1,s=t,n={"Average XG Against":.3,"Recent XG Against":.15,"Average Goals Against":.3,"Average SOT Against":.25},r={"Average XG Against":{min:.25,max:2.75},"Recent XG Against":{min:.25,max:2.75},"Average Goals Against":{min:.25,max:2.75},"Average SOT Against":{min:2,max:10}},o=0,a)a.hasOwnProperty(l)&&n.hasOwnProperty(l)&&r.hasOwnProperty(l)&&(i=s-(a[l]-r[l].min)/(r[l].max-r[l].min),o+=i*n[l]);return e.abrupt("return",parseFloat(o.toFixed(2)));case 7:case"end":return e.stop()}}),e)}))),Gs.apply(this,arguments)}function Ss(e,a){return Ts.apply(this,arguments)}function Ts(){return(Ts=Object(l.a)(Object(c.a)().mark((function e(a,t){var s,n,r,o;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n={averagePossession:{min:20,max:80},xgFor:{min:.1,max:3},xgAgainst:{min:.1,max:3},directnessOverall:{min:.5,max:5},accuracyOverall:{min:.5,max:7}},(s={averagePossession:1,xgFor:1,xgAgainst:1,directnessOverall:1,accuracyOverall:1}).hasOwnProperty(a)&&n.hasOwnProperty(a)){e.next=4;break}throw new Error("Invalid metric name or missing normalization range.");case 4:return r=(t-n[a].min)/(n[a].max-n[a].min),o=r*s[a],e.abrupt("return",parseFloat(o.toFixed(2)));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var Ps=[],ks=[];function Cs(){return Cs=Object(l.a)(Object(c.a)().mark((function e(a,t){var s,n,d,m,g,h,v,p,b,f,x,y,A,w,_,G,S,T,P,k,N,F,D,L,H,R,B,X,I,M,W,E,V,U,z,J,K,Y,q,Z,Q,$,ee,ae,te,se,ne,re,oe,ce,le,ie,de,ue,me,ge,he,ve,pe,be,fe,Oe,je,xe,Ae,we,Ge,Se,Te,Pe,ke,Ce,Ne,Fe,De,Le,He,Re,Be,Xe,Ie,Me,We,Ee,Ve,Ue,ze,Je,Ke,Ye,qe,Ze,Qe,$e,ea,aa,ta,sa,na,ra,oa,ca,la,ia,da,ua,ma,ga,ha,va,pa,ba,fa,Oa,ja,xa,ya,Aa,wa,_a,Ga,Sa,Ta,Pa,ka,Ca,Na,Fa,Da,La,Ha,Ra,Ba;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(console.log(t),"void"===a.status){e.next=376;break}if(s=function(e){return!0===e&&!0===ye?{display:"block"}:{display:"none"}}(t),!1!==ye){e.next=8;break}alert("Tap Get Predictions to fetch all game stats first"),e.next=376;break;case 8:if(n=function(){var e=Object(l.a)(Object(c.a)().mark((function e(a,t){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",a/t);case 1:case"end":return e.stop()}}),e)})));return function(a,t){return e.apply(this,arguments)}}(),d=function(){var e=Object(l.a)(Object(c.a)().mark((function e(a){var t,s,n,r,o;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(t={W:3,D:1,L:0},s=[],n=[],r=0,o=0;o0)){e.next=5;break}return e.abrupt("return",s[0]);case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})));return function(a,t){return e.apply(this,arguments)}}(),2,f=10,x=Bt.find((function(e){return e.id===a.id})),y=[],A=[],w=[],_=[],T=[],P=[],k=function(e,a){return e.reduce((function(e,t,s){return s?e.concat(2*t/(a+1)+e[e.length-1]*(a-1)/(a+1)):e}),[e[0]])},N=x.home[2],F=x.away[2],!0!==t){e.next=203;break}console.log(x),D=Lt.map((function(e){return e.id})).indexOf(x.leagueId),L=Lt[D],console.log(L),H=L.fixtures.filter((function(e){return e.home_name===x.home.teamName||e.away_name===x.home.teamName})),R=L.fixtures.filter((function(e){return e.home_name===x.home.teamName})),H.sort((function(e,a){return a.date_unix-e.date_unix})),R.sort((function(e,a){return a.date_unix-e.date_unix})),B=0;case 38:if(!(BH[B].awayGoalCount?51:e.t1===(H[B].homeGoalCount===H[B].awayGoalCount)?55:e.t1===H[B].homeGoalCountH[B].awayGoalCount?68:e.t2===(H[B].homeGoalCount===H[B].awayGoalCount)?72:e.t2===H[B].homeGoalCount0&&H[B].awayGoalCount>0?"\u2714":"\u2718"});case 84:B++,e.next=38;break;case 87:V=0;case 88:if(!(VR[V].awayGoalCount?96:e.t4===(R[V].homeGoalCount===R[V].awayGoalCount)?99:e.t4===R[V].homeGoalCountK[q].awayGoalCount?136:e.t6===(K[q].awayGoalCount===K[q].homeGoalCount)?140:e.t6===K[q].homeGoalCountK[q].awayGoalCount?153:e.t7===(K[q].homeGoalCount===K[q].awayGoalCount)?157:e.t7===K[q].homeGoalCount0&&K[q].awayGoalCount>0?"\u2714":"\u2718"});case 169:q++,e.next=123;break;case 172:te=0;case 173:if(!(teY[te].homeGoalCount?181:e.t9===(Y[te].awayGoalCount===Y[te].homeGoalCount)?184:e.t9===Y[te].awayGoalCounta.awayOdds||a.homeOdds===a.awayOdds?"".concat(F.teamName," have been favourites ").concat(F.favouriteCount," times. Of these games, they have Won: ").concat(F.oddsReliabilityWin.toFixed(0),"%, Drawn: ").concat(F.oddsReliabilityDraw.toFixed(0),"%, Lost: ").concat(F.oddsReliabilityLose.toFixed(0),"%"):"".concat(F.teamName," have been underdogs ").concat(F.underdogCount," times. Of these games, they have Won: ").concat(F.oddsReliabilityWinAsUnderdog.toFixed(0),"%, Drawn: ").concat(F.oddsReliabilityDrawAsUnderdog.toFixed(0),"%, Lost: ").concat(F.oddsReliabilityLoseAsUnderdog.toFixed(0),"%")),e.next=245,m(N.LastFiveForm[4]);case 245:return xe=e.sent,e.next=248,m(F.LastFiveForm[4]);case 248:if(Ae=e.sent,we={"Average Dangerous Attacks":N.AverageDangerousAttacksOverall,"Average Shots":N.AverageShots,"Average Shots On Target":N.AverageShotsOnTargetOverall,"Average Expected Goals":N.XGOverall,"Recent XG":N.XGlast5?N.XGlast5:N.XGOverall,"Average Goals":void 0!==N.averageScoredLeague&&null!==N.averageScoredLeague?N.averageScoredLeague:N.ScoredOverall/10},Ge={"Average Dangerous Attacks":F.AverageDangerousAttacksOverall,"Average Shots":F.AverageShots,"Average Shots On Target":F.AverageShotsOnTargetOverall,"Average Expected Goals":F.XGOverall,"Recent XG":F.XGlast5?F.XGlast5:F.XGOverall,"Average Goals":void 0!==F.averageScoredLeague&&null!==F.averageScoredLeague?F.averageScoredLeague:F.ScoredOverall/10},Se={"Clean Sheet Percentage":100-N.CleanSheetPercentage,"Average XG Against":N.XGAgainstAvgOverall,"Recent XG Against":N.XGAgainstlast5?N.XGAgainstlast5:N.XGAgainstAvgOverall,"Average Goals Against":void 0!==N.averageConceededLeague&&null!==N.averageConceededLeague?N.averageConceededLeague:N.ConcededOverall/10},Te={"Clean Sheet Percentage":100-F.CleanSheetPercentage,"Average XG Against":F.XGAgainstAvgOverall,"Recent XG Against":F.XGAgainstlast5?F.XGAgainstlast5:F.XGAgainstAvgOverall,"Average Goals Against":void 0!==F.averageConceededLeague&&null!==F.averageConceededLeague?F.averageConceededLeague:F.ConcededOverall/10},!N.xgForStrength){e.next=299;break}console.log("not calculating"),Pe=N.attackingStrength,ke=N.attackingStrengthLast5,Ce=N.attackingStrengthHomeOnly,Ne=N.defensiveStrength,Fe=N.defensiveStrengthLast5,De=N.defensiveStrengthHomeOnly,Le=N.possessionStrength,He=N.possessionStrengthLast5,Re=N.possessionStrengthHomeOnly,Be=N.xgForStrength,Xe=N.xgForStrengthLast5,Ie=N.xgForStrengthHomeOnly,Me=N.xgAgainstStrength,We=N.xgAgainstStrengthLast5,Ee=N.xgAgainstStrengthHomeOnly,ra=N.directnessOverallStrength,oa=N.directnessOverallStrengthLast5,ca=N.directnessHomeStrength,ua=N.accuracyOverallStrength,ma=N.accuracyOverallStrengthLast5,ga=N.accuracyHomeStrength,Ve=F.attackingStrength,Ue=F.attackingStrengthLast5,ze=F.attackingStrengthAwayOnly,Je=F.defensiveStrength,Ke=F.defensiveStrengthLast5,Ye=F.defensiveStrengthAwayOnly,qe=F.possessionStrength,Ze=F.possessionStrengthLast5,Qe=F.possessionStrengthAwayOnly,$e=F.xgForStrength,ea=F.xgForStrengthLast5,aa=F.xgForStrengthAwayOnly,ta=F.xgAgainstStrength,sa=F.xgAgainstStrengthLast5,na=F.xgAgainstStrengthAwayOnly,la=F.directnessOverallStrength,ia=F.directnessOverallStrengthLast5,da=F.directnessAwayStrength,ha=F.accuracyOverallStrength,va=F.accuracyOverallStrengthLast5,pa=F.accuracyAwayStrength,e.next=341;break;case 299:return e.next=301,As(we);case 301:return Pe=e.sent,e.next=304,_s(Se);case 304:return Ne=e.sent,e.next=307,Ss("averagePossession",N.AveragePossessionOverall);case 307:return Le=e.sent,e.next=310,Ss("xgFor",x.home[2].XGOverall);case 310:return Be=e.sent,e.next=313,Ss("xgAgainst",3-x.home[2].XGAgainstAvgOverall);case 313:return Me=e.sent,e.next=316,Ss("directnessOverall",N.directnessOverall);case 316:return ra=e.sent,e.next=319,Ss("accuracyOverall",N.shootingAccuracy);case 319:return ua=e.sent,e.next=322,As(Ge);case 322:return Ve=e.sent,e.next=325,_s(Te);case 325:return Je=e.sent,e.next=328,Ss("averagePossession",F.AveragePossessionOverall);case 328:return qe=e.sent,e.next=331,Ss("xgFor",x.away[2].XGOverall);case 331:return $e=e.sent,e.next=334,Ss("xgAgainst",3-x.away[2].XGAgainstAvgOverall);case 334:return ta=e.sent,e.next=337,Ss("directnessOverall",F.directnessOverall);case 337:return la=e.sent,e.next=340,Ss("accuracyOverall",F.shootingAccuracy);case 340:ha=e.sent;case 341:return e.next=343,d(x.home[2].WDLRecord);case 343:return ba=e.sent,fa=Object(o.a)(ba,2),Oa=fa[0],fa[1],e.next=349,d(x.away[2].WDLRecord);case 349:return ja=e.sent,xa=Object(o.a)(ja,2),ya=xa[0],xa[1],[(x.home[0].ScoredOverall-x.home[0].ConcededOverall)/10,(x.home[1].ScoredOverall-x.home[1].ConcededOverall)/6,(x.home[2].ScoredOverall-x.home[2].ConcededOverall)/5],[(x.away[0].ScoredOverall-x.away[0].ConcededOverall)/10,(x.away[1].ScoredOverall-x.away[1].ConcededOverall)/6,(x.away[2].ScoredOverall-x.away[2].ConcededOverall)/5],[].push({btts:a.btts_potential}),Aa=[],console.log(x.home[2].LastFiveForm),Aa.push({name:a.homeTeam,Last5:x.home[2].LastFiveForm,LeagueOrAll:x.home[2].LeagueOrAll,AverageGoals:N.ScoredOverall/10,AverageConceeded:N.ConcededOverall/10,AverageXG:N.XGOverall,AverageXGConceded:N.XGAgainstAvgOverall,AveragePossession:N.AveragePossessionOverall,AverageShotsOnTarget:N.AverageShotsOnTargetOverall,AverageDangerousAttacks:N.AverageDangerousAttacksOverall,homeOrAway:"Home",leaguePosition:N.LeaguePosition,Last5PPG:N.PPG,SeasonPPG:N.SeasonPPG,lastGame:xe,formRun:N.formRun,goalDifference:N.goalDifference,goalDifferenceHomeOrAway:N.goalDifferenceHomeOrAway,CardsTotal:N.CardsTotal||"-",CornersAverage:N.AverageCorners||"-",FormTextStringHome:be,FavouriteRecord:Oe+". ".concat(N.reliabilityString),BTTSArray:re,Results:N.resultsAll,ResultsHorA:N.resultsHome.reverse()}),(wa=[]).push({name:a.awayTeam,Last5:x.away[2].LastFiveForm,LeagueOrAll:x.away[2].LeagueOrAll,AverageGoals:F.ScoredOverall/10,AverageConceeded:F.ConcededOverall/10,AverageXG:F.XGOverall,AverageXGConceded:F.XGAgainstAvgOverall,AveragePossession:F.AveragePossessionOverall,AverageShotsOnTarget:F.AverageShotsOnTargetOverall,AverageDangerousAttacks:F.AverageDangerousAttacksOverall,homeOrAway:"Away",leaguePosition:F.LeaguePosition,Last5PPG:F.PPG,SeasonPPG:F.SeasonPPG,lastGame:Ae,formRun:F.formRun,goalDifference:F.goalDifference,goalDifferenceHomeOrAway:F.goalDifferenceHomeOrAway,CardsTotal:F.CardsTotal||"-",CornersAverage:F.AverageCorners||"-",FormTextStringAway:fe,FavouriteRecord:je+". ".concat(F.reliabilityString),BTTSArray:oe,Results:F.resultsAll,ResultsHorA:F.resultsAway.reverse()}),Oa.length>1?(_a=Oa,Ga=ya,Sa="Points over time"):(_a=[ue,de,ie],Ga=[he,ge,me],Sa="Rolling average points over last 10"),r.a.render(Object(i.jsxs)("div",{style:s,children:[Object(i.jsx)("div",{className:"H2HStats",id:"H2HStats".concat(a.id)}),Object(i.jsx)("div",{className:"TrendsHome",id:"TrendsHome".concat(a.id)}),Object(i.jsx)("div",{className:"TrendsAway",id:"TrendsAway".concat(a.id)})]}),document.getElementById("history"+ce)),"Europe UEFA Women's Euro"===a.leagueName&&(a.homeTeamHomePosition="N/A",a.awayTeamAwayPosition="N/A"),Ta=y.slice(0,10).map((function(e){return Object(i.jsx)("div",{children:Object(i.jsx)(C,{classNameButton:"ResultButton",buttonText:Object(i.jsxs)("div",{className:"ResultRowOverviewSmall",children:[Object(i.jsx)("div",{className:"columnOverviewHomeSmall",children:e.homeTeam}),Object(i.jsxs)("span",{className:"columnOverviewScoreSmall",children:[e.homeGoals," : ",e.awayGoals]}),Object(i.jsx)("div",{className:"columnOverviewAwaySmall",children:e.awayTeam})]}),element:g(e)})})})),Pa=A.slice(0,10).map((function(e){return Object(i.jsx)("div",{children:Object(i.jsx)(C,{classNameButton:"ResultButton",buttonText:Object(i.jsxs)("div",{className:"ResultRowOverviewSmall",children:[Object(i.jsx)("div",{className:"columnOverviewHomeSmall",children:e.homeTeam}),Object(i.jsxs)("span",{className:"columnOverviewScoreSmall",children:[e.homeGoals," : ",e.awayGoals]}),Object(i.jsx)("div",{className:"columnOverviewAwaySmall",children:e.awayTeam})]}),element:g(e)})})})),ka=a.simlarGameResultsHome?a.simlarGameResultsHome.reverse().map((function(e){return Object(i.jsx)("div",{children:Object(i.jsx)(C,{classNameButton:"ResultButton",buttonText:Object(i.jsxs)("div",{className:"ResultRowOverviewSmall".concat(e.result),children:[Object(i.jsx)("div",{className:"columnOverviewHomeSmall",children:e.homeTeam}),Object(i.jsxs)("span",{className:"columnOverviewScoreSmall",children:[e.homeGoals," : ",e.awayGoals]}),Object(i.jsx)("div",{className:"columnOverviewAwaySmall",children:e.awayTeam})]}),element:h(e)})})})):Object(i.jsx)("h4",{className:"NoGames",children:"No previous games fit this profile"}),Ca=a.simlarGameResultsAway?a.simlarGameResultsAway.reverse().map((function(e){return Object(i.jsx)("div",{children:Object(i.jsx)(C,{classNameButton:"ResultButton",buttonText:Object(i.jsxs)("div",{className:"ResultRowOverviewSmall".concat(e.result),children:[Object(i.jsx)("div",{className:"columnOverviewHomeSmall",children:e.homeTeam}),Object(i.jsxs)("span",{className:"columnOverviewScoreSmall",children:[e.homeGoals," : ",e.awayGoals]}),Object(i.jsx)("div",{className:"columnOverviewAwaySmall",children:e.awayTeam})]}),element:h(e)})})})):Object(i.jsx)("h4",{children:"No previous games fit this profile"}),console.log(Aa[0].Results),e.next=372,b(Ct,a.homeTeam);case 372:Ba=e.sent,console.log(Ba),Ba?(Na=Ba.id.toString(),Fa=Ba.homeTeam,Da=Ba.awayTeam,La=Ba.time,Ha=Ba.homeGoals,Ra=Ba.awayGoals):(Na="0",Fa="N/A",Da="N/A",La=1,Ha="-",Ra="-"),1==N.completeData&&1==a.completeData?r.a.render(Object(i.jsx)(i.Fragment,{children:Object(i.jsxs)("div",{style:s,children:[Object(i.jsx)(C,{buttonText:"Lineups & match action",classNameButton:"Lineups",element:Object(i.jsx)(i.Fragment,{children:Object(i.jsx)(ys,{id:Na,team1:Fa,team2:Da,time:La,homeGoals:Ha,awayGoals:Ra})})}),Object(i.jsxs)("div",{className:"Chart",id:"Chart".concat(a.id),style:s,children:[Object(i.jsx)(js,{title:"XG Tipping Strength Ratings - All Games",data:[Pe,Ne,Le,Be,Me,ra,ua],data2:[Ve,Je,qe,$e,ta,la,ha],team1:a.homeTeam,team2:a.awayTeam}),Object(i.jsx)(js,{title:"XG Tipping Strength Ratings - Last 5 games",data:[ke,Fe,He,Xe,We,oa,ma],data2:[Ue,Ke,Ze,ea,sa,ia,va],team1:a.homeTeam,team2:a.awayTeam}),Object(i.jsx)(js,{title:"XG Tipping Strength Ratings - Home/Away Games Only",data:[Ce,De,Re,Ie,Ee,ca,ga],data2:[ze,Ye,Qe,aa,na,da,pa],team1:a.homeTeam,team2:a.awayTeam}),Object(i.jsx)(xs,{text:"H2H - Home Team | Away Team",data1:[2*N.avgScored,2*F.avgConceeded,3*N.avPointsAll,2*N.XGOverall,2*F.XGAgainstAvgOverall,N.AverageShotsOnTargetOverall,0!==N.AverageDangerousAttacksOverall?N.AverageDangerousAttacksOverall/7.5:N.AverageDangerousAttacks/7.5,N.AveragePossessionOverall/7.5,N.goalDifferenceHomeOrAway/10,N.AverageCorners],data2:[2*F.avgScored,2*N.avgConceeded,3*F.avPointsAll,2*F.XGOverall,2*N.XGAgainstAvgOverall,F.AverageShotsOnTargetOverall,0!==F.AverageDangerousAttacksOverall?F.AverageDangerousAttacksOverall/7.5:F.AverageDangerousAttacks/7.5,F.AveragePossessionOverall/7.5,F.goalDifferenceHomeOrAway/10,F.AverageCorners]}),Object(i.jsx)(Os,{height:3,depth:0,data1:_a,data2:Ga,team1:a.homeTeam,team2:a.awayTeam,type:Sa,tension:0}),Object(i.jsx)(Os,{height:Math.max(Ps[Ps.length-1],ks[ks.length-1])>2?Math.max(Ps[Ps.length-1],ks[ks.length-1]):2,depth:Math.min(Ps[Ps.length-1],ks[ks.length-1])<-2?Math.min(Ps[Ps.length-1],ks[ks.length-1]):-2,data1:Ps,data2:ks,team1:a.homeTeam,team2:a.awayTeam,type:"Goal difference over time",tension:.3})]}),Object(i.jsxs)("div",{style:s,children:[Object(i.jsx)(j,{className:"MatchTime",text:"Kick off: ".concat(le," GMT")}),Object(i.jsx)(j,{text:"Last league games (most recent first)",className:"LastGameHeader"})]}),Object(i.jsxs)("div",{className:"flex-container",children:[Object(i.jsx)("div",{className:"flex-childOneOverviewSmall",children:Ta}),Object(i.jsx)("div",{className:"flex-childTwoOverviewSmall",children:Pa})]}),Object(i.jsxs)("div",{className:"flex-container",children:[Object(i.jsx)(v,{}),Object(i.jsx)(p,{})]}),Object(i.jsx)("h2",{children:"Results from similar profile games"}),Object(i.jsx)("span",{children:"(Games where each team had similar odds)"}),Object(i.jsx)("h3",{children:"Most recent first"}),Object(i.jsxs)("div",{className:"flex-container-similar",children:[Object(i.jsx)("div",{className:"flex-childOneOverviewSmall",children:ka}),Object(i.jsx)("div",{className:"flex-childTwoOverviewSmall",children:Ca})]}),Object(i.jsx)("input",{type:"hidden",name:"IL_IN_ARTICLE"}),Object(i.jsx)(u,{className:"MoreStats",onClickEvent:function(){return ts(a.id,a.homeTeam,a.awayTeam,Aa[0].BttsPercentage,Aa[0].BttsPercentageHomeOrAway,wa[0].BttsPercentage,wa[0].BttsPercentageHomeOrAway)},text:"Fixture trends"})]})}),document.getElementById("stats"+ce)):(N.completeData=0==a.completeData)&&r.a.render(Object(i.jsx)(i.Fragment,{children:Object(i.jsxs)("div",{style:s,children:[Object(i.jsx)(C,{buttonText:"Lineups & match action",classNameButton:"Lineups",element:Object(i.jsx)(i.Fragment,{children:Object(i.jsx)(ys,{id:Na,team1:Fa,team2:Da,time:La,homeGoals:Ha,awayGoals:Ra})})}),Object(i.jsx)("div",{className:"Chart",id:"Chart".concat(a.id),style:s,children:Object(i.jsx)(js,{title:"XG Tipping Strength Ratings - All Games",data:[Pe,Ne,Le,Be,Me,ra,ua],data2:[Ve,Je,qe,$e,ta,la,ha],team1:a.homeTeam,team2:a.awayTeam})}),Object(i.jsx)("div",{style:s,children:Object(i.jsx)(j,{className:"MatchTime",text:"Kick off: ".concat(le," GMT")})}),Object(i.jsx)("h2",{children:"Results from similar profile games"}),Object(i.jsx)("span",{children:"(Games where each team had similar odds)"}),Object(i.jsx)("h3",{children:"Most recent first"}),Object(i.jsxs)("div",{className:"flex-container-similar",children:[Object(i.jsx)("div",{className:"flex-childOneOverviewSmall",children:ka}),Object(i.jsx)("div",{className:"flex-childTwoOverviewSmall",children:Ca})]}),Object(i.jsx)("input",{type:"hidden",name:"IL_IN_ARTICLE"}),Object(i.jsx)(u,{className:"MoreStats",onClickEvent:function(){return ts(a.id,a.homeTeam,a.awayTeam,Aa[0].BttsPercentage,Aa[0].BttsPercentageHomeOrAway,wa[0].BttsPercentage,wa[0].BttsPercentageHomeOrAway)},text:"Fixture trends"})]})}),document.getElementById("stats"+ce));case 376:case"end":return e.stop()}}),e)}))),Cs.apply(this,arguments)}var Ns,Fs,Ds,Ls=t(25),Hs=t(56),Rs={dataHome:localStorage.getItem("homeForm"),dataAway:localStorage.getItem("awayForm"),dataHomeDef:localStorage.getItem("homeFormDef"),dataAwayDef:localStorage.getItem("awayFormDef"),allTeamResultsHome:localStorage.getItem("allTeamResultsHome"),allTeamResultsAway:localStorage.getItem("allTeamResultsAway"),homeDetails:localStorage.getItem("homeDetails"),awayDetails:localStorage.getItem("awayDetails"),fixtureDetails:localStorage.getItem("fixtureDetails")},Bs=Object(Hs.b)({name:"data",initialState:Rs,reducers:{setData:function(e,a){e.data=a.payload}}}),Xs=Bs.actions.setData,Is=Bs.reducer,Ms=Object(Hs.a)({reducer:{data:Is}});function Ws(e,a){var t,n,r=e.status,o=Ns;if(!0===e.fixture.omit&&"complete"!==r)return o=!0,Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("div",{className:"KOTime",children:"".concat(e.fixture.time)}),Object(i.jsx)("div",{className:"Omitted",children:"".concat(e.fixture.goalsA," - ").concat(e.fixture.goalsB)},e.fixture.awayTeam)]});if(!0===Ds&&"complete"===r)return o=!1,Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("div",{className:"Result",children:"".concat(e.fixture.homeGoals," - ").concat(e.fixture.awayGoals)}),Object(i.jsx)("div",{className:"CorrectScore","data-cy":"score-"+e.fixture.id,children:"".concat(e.fixture.goalsA," - ").concat(e.fixture.goalsB)},e.fixture.homeTeam)]});if(!0===Ds&&"complete"!==r)return o=!0,Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("div",{className:"KOTime",children:"".concat(e.fixture.time)}),Object(i.jsx)("div",{className:"score",children:"".concat(e.fixture.goalsA," - ").concat(e.fixture.goalsB)},e.fixture.awayTeam)]});if(!1===o&&"complete"!==r)return Object(i.jsx)("div",{className:"divider","data-cy":"divider-"+e.fixture.id,children:"V"});if(!1===o&&"complete"===r)return Object(i.jsx)("div",{className:"Result","data-cy":"result-"+e.fixture.id,children:"".concat(e.fixture.homeGoals," - ").concat(e.fixture.awayGoals)});if(!0!==o||"complete"!==r)return Object(i.jsxs)(s.Fragment,{children:[Object(i.jsx)("div",{className:"KOTime",children:"".concat(e.fixture.time)}),Object(i.jsx)("div",{className:"score",children:"".concat(e.fixture.goalsA," - ").concat(e.fixture.goalsB)},e.fixture.awayTeam)]});switch(!0){case e.fixture.homeGoals>e.fixture.awayGoals:t=0,e.fixture.winner=e.fixture.homeTeam,e.fixture.outcome="homeWin";break;case e.fixture.homeGoals===e.fixture.awayGoals:t=1,e.fixture.winner="draw",e.fixture.outcome="draw";break;case e.fixture.homeGoalse.fixture.goalsB:n=0;break;case e.fixture.goalsA===e.fixture.goalsB:n=1;break;case e.fixture.goalsA0?Lt[e.leagueIndex].id:null;return null===t||!0===a?Object(i.jsx)("div",{}):Object(i.jsxs)("div",{children:[Object(i.jsxs)("div",{className:"leagueName",id:"league".concat(s),onClick:function(){return function(e,a,t){return Ut.apply(this,arguments)}(e.leagueIndex,Lt[e.leagueIndex],s)},children:[e.leagueName," \u2630"]},"leagueName".concat(s,"div")),Object(i.jsx)("div",{className:"LeagueTable",id:"leagueName".concat(s)},"leagueName".concat(s))]})}function Vs(e){var a=e.fixture,t=e.count,s=e.mock,n=Object(Ls.b)();function r(){var e={id:a.id,homeTeamName:a.homeTeam,homeId:a.homeId,homeTeamBadge:a.homeBadge,awayTeamName:a.awayTeam,awayId:a.awayId,awayTeamBadge:a.awayBadge,stadium:a.stadium,time:a.time,homeGoals:a.goalsA,awayGoals:a.goalsB},t={"Attacking Strength":a.formHome.attackingStrength,"Defensive Strength":a.formHome.defensiveStrength},s={"Attacking Strength":a.formAway.attackingStrength,"Defensive Strength":a.formAway.defensiveStrength};a.formHome.defensiveMetrics["Clean Sheet Percentage"]=a.formHome.CleanSheetPercentage,a.formAway.defensiveMetrics["Clean Sheet Percentage"]=a.formAway.CleanSheetPercentage,localStorage.setItem("homeForm",JSON.stringify(a.formHome.attackingMetrics)),localStorage.setItem("homeFormDef",JSON.stringify(a.formHome.defensiveMetrics)),localStorage.setItem("allTeamResultsHome",JSON.stringify(a.formHome.allTeamResults)),localStorage.setItem("homeDetails",JSON.stringify(t)),localStorage.setItem("awayForm",JSON.stringify(a.formAway.attackingMetrics)),localStorage.setItem("awayFormDef",JSON.stringify(a.formAway.defensiveMetrics)),localStorage.setItem("allTeamResultsAway",JSON.stringify(a.formAway.allTeamResults)),localStorage.setItem("awayDetails",JSON.stringify(s)),localStorage.setItem("fixtureDetails",JSON.stringify(e)),n(Xs({key1:"value1",key2:"value2"}))}function o(){return(o=Object(l.a)(Object(c.a)().mark((function e(a){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!0!==ye){e.next=5;break}r(),window.open("/#/fixture"),e.next=6;break;case 5:return e.abrupt("return");case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return Object(i.jsxs)("div",{children:[Es(a,s),Object(i.jsxs)("div",{className:"individualFixtureContainer".concat(a.omit),children:[Object(i.jsxs)("li",{className:"individualFixture".concat(a.omit),"data-cy":a.id,children:[Object(i.jsx)("div",{className:"HomeOdds",children:a.fractionHome}),Object(i.jsx)("div",{className:"homeTeam",children:a.homeTeam}),Object(i.jsx)(Ws,{result:Ns,status:a.status,fixture:a}),Object(i.jsx)("div",{className:"awayTeam",children:a.awayTeam}),Object(i.jsx)(f,{image:a.homeBadge,ClassName:"HomeBadge",alt:"Home team badge",flexShrink:5}),Object(i.jsx)(f,{image:a.awayBadge,ClassName:"AwayBadge",alt:"Away team badge"}),Object(i.jsx)("div",{className:"AwayOdds",children:a.fractionAway})]},a.id),Object(i.jsxs)("button",{className:"GameStats",onClick:function(){return!1===s?function(e,a){return Cs.apply(this,arguments)}(a,t):null},onMouseDown:function(){return t=Fs=!t},children:["Game overview ","\u2195"]}),Object(i.jsxs)("button",{className:"GameStatsTwo",onClick:function(){return function(e){return o.apply(this,arguments)}(a)},children:["More detail ","\u29c9"]})]}),Object(i.jsx)("div",{id:"stats"+a.homeTeam}),Object(i.jsx)("div",{className:"MatchHistory",id:"history"+a.homeTeam})]},a.game)}var Us=function(e){var a=e.fixtures,t=e.mock;return Object(i.jsxs)("div",{children:[Object(i.jsx)("div",{id:"Headers"}),Object(i.jsx)("ul",{className:"FixtureList",id:"FixtureList",children:a.map((function(e,a){return Object(i.jsx)(Vs,{fixture:e,count:Fs,mock:t},e.game)}))})]})};function zs(e){var a=Object(s.useState)(!1),t=Object(o.a)(a,2);return Fs=t[0],t[1],Ns=e.result,Object(i.jsx)(Ls.a,{store:Ms,children:Object(i.jsx)(Us,{fixtures:e.fixtures,result:Ns,count:Fs,mock:e.mock})})}var Js,Ks,Ys,qs,Zs,Qs,$s,en,an,tn,sn,nn,rn,on,cn,ln,dn,un,mn=t(71),gn=t(134),hn=t(135),vn=t(136),pn=t(137),bn=t(138),fn=t(139),On=t(140),jn=t(141),xn=t(142),yn=t(143),An=[],wn=[],_n=[],Gn=[11084,7432,9660,9663,9582,9581,9700,9665,9636,9655,9697,9674,9984,9653,9577,10969,9545,10976,9954,9889,9553,9580,10946,9675,9808,9656,9741,9621,9637,9639,9638,9890,10977,11321,11212,10994,9525,9972,10505,11102];function Sn(){return Sn=Object(l.a)(Object(c.a)().mark((function e(){var a,t,n,d,m,g,h,v,f,O,j,x,y,A,w,_,G,S,T,P,k,N;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return N=function(){return(N=Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r.a.render(Object(i.jsxs)("div",{className:"FixtureButtons",children:[Object(i.jsx)("div",{className:"historicResults",children:Object(i.jsx)(u,{text:"Last Saturday",className:"HistoricFixturesButton",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=An,e.next=3,qt("lastSaturday",tn,p,sn,!1,Js,nn);case 3:return e.t1=e.sent,e.abrupt("return",e.t0.push.call(e.t0,e.t1));case 5:case"end":return e.stop()}}),e)})))})}),Object(i.jsx)(u,{text:"<",className:"FixturesButton",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n(1,$s);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}}),e)})))}),Object(i.jsx)(u,{text:void 0!==an?an:$s,className:"FixturesButton",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=An,e.next=3,qt("todaysFixtures",un,p,an,!1,Js,en);case 3:return e.t1=e.sent,e.abrupt("return",e.t0.push.call(e.t0,e.t1));case 5:case"end":return e.stop()}}),e)})))}),Object(i.jsx)(u,{text:"Today",className:"FixturesButtonToday",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=An,e.next=3,qt("todaysFixtures",Js,p,Ks,!0,Js,Ys);case 3:return e.t1=e.sent,e.abrupt("return",e.t0.push.call(e.t0,e.t1));case 5:case"end":return e.stop()}}),e)})))}),Object(i.jsx)(u,{text:"Tomorrow",className:"FixturesButton",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=An,e.next=3,qt("tomorrowsFixtures",qs,p,Zs,!0,Js,Qs);case 3:return e.t1=e.sent,e.abrupt("return",e.t0.push.call(e.t0,e.t1));case 5:case"end":return e.stop()}}),e)})))})]}),document.getElementById("Buttons"));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)},k=function(){return N.apply(this,arguments)},S=function(){return(S=Object(l.a)(Object(c.a)().mark((function e(a){var t,s,n,r,o;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=new Date(a),s=t.getFullYear(),n=String(t.getMonth()+1).padStart(2,"0"),r=String(t.getDate()).padStart(2,"0"),o="".concat(s,"-").concat(n,"-").concat(r),e.abrupt("return",o);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)},G=function(e){return S.apply(this,arguments)},g=function(){return(g=Object(l.a)(Object(c.a)().mark((function e(a){var t,s,n;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=a.getDate(),s=a.getMonth()+1,n=a.getFullYear(),e.abrupt("return",["".concat(s).concat(t).concat(n),"".concat(n,"-").concat(s,"-").concat(t)]);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)},m=function(e){return g.apply(this,arguments)},d=function(){return(d=Object(l.a)(Object(c.a)().mark((function e(t,s){var n,r;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a-=t,console.log(a),!(a>-120)){e.next=17;break}return s.setDate(s.getDate()-t),e.next=6,G(s);case 6:return en=e.sent,e.next=9,m(s);case 9:return n=e.sent,r=Object(o.a)(n,2),s=r[0],an=r[1],dn=an,un=s,e.next=17,k();case 17:case"end":return e.stop()}}),e)})))).apply(this,arguments)},n=function(e,a){return d.apply(this,arguments)},t=function(){return(t=Object(l.a)(Object(c.a)().mark((function e(t,s){var n,r;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a+=t,s.setDate(s.getDate()+t),e.next=4,G(s);case 4:return en=e.sent,e.next=7,m(s);case 7:return n=e.sent,r=Object(o.a)(n,2),s=r[0],an=r[1],dn=an,e.next=14,k();case 14:case"end":return e.stop()}}),e)})))).apply(this,arguments)},function(e,a){return t.apply(this,arguments)},a=0,$s=new Date,dn="Today",e.next=15,m(new Date);case 15:return h=e.sent,v=Object(o.a)(h,2),Js=v[0],Ks=v[1],(rn=new Date).setDate(rn.getDate()+1),e.next=23,m(rn);case 23:return f=e.sent,O=Object(o.a)(f,2),qs=O[0],Zs=O[1],(on=new Date).setDate(on.getDate()-1),e.next=31,m(on);case 31:return j=e.sent,x=Object(o.a)(j,2),x[0],x[1],(cn=new Date).setDate(cn.getDate()-(cn.getDay()+6)%7),cn.setDate(cn.getDate()-2),e.next=40,m(cn);case 40:return y=e.sent,A=Object(o.a)(y,2),tn=A[0],sn=A[1],(ln=new Date).setDate(ln.getDate()-(ln.getDay()+6)%7),ln.setDate(ln.getDate()-9),e.next=49,m(ln);case 49:return w=e.sent,_=Object(o.a)(w,2),_[0],_[1],e.next=55,G(new Date);case 55:return Ys=e.sent,e.next=58,G(rn);case 58:return Qs=e.sent,e.next=61,G(on);case 61:return e.sent,e.next=64,G(cn);case 64:return nn=e.sent,e.next=67,G(ln);case 67:e.sent,"Select a day you would like to retrieve fixtures for from the options above\n A list of games will be returned once the data has loaded\n Once all fixtures have loaded, click on \u201cGet Predictions\u201d to see XGTipping's forecasted outcomes for every game\n If a game has completed, the predictions is displayed on the right and the actual result on the left\n Each individual fixture is tappable/clickable. By doing so, you can access a range of detailed stats, from comparative charts, granular performance measures to previous meetings.\n All games are subject to the same automated prediction algorithm with the outcome being a score prediction. Factors that determine the tip include the following, amongst others:\n - Goal differentials\n - Expected goal differentials \n - Attack/Defence performance\n - Form trends over time\n - Home/Away records\n - WDL records\n - Points per game \n - A range of other comparative factors\n \u2013\n","A range of tools are available should you wish to use them\n Build a multi - Use the '+' or '-' buttons to add or remove a game deemed to be one of XGTIpping's highest confidence tips from the day\n Exotic of the day: A pre-built exotic multi comprising of XGTipping's highest confidence tips\n BTTS games: Games where both teams to score is deemed a likely outcome\n Over 2.5 goals tips: Games where over 2.5 goals are most likely to be scored\n XG tips: Comprises only games where the expected goal differentials between each team are at their greatest. We believe this shows a true disparity in the form of the two opposing teams\n Tap the 'How to use' option to hide this text",T="Select a day you would like to retrieve fixtures for from the options above\n A list of games will be returned once the data has loaded\n Once all fixtures have loaded, click on \u201cGet Predictions\u201d to see XGTipping's forecasted outcomes for every game\n If a game has completed, the predictions is displayed on the right and the actual result on the left\n Each individual fixture is tappable/clickable. By doing so, you can access a range of detailed stats, from comparative charts, granular performance measures to previous meetings.\n All games are subject to the same automated prediction algorithm with the outcome being a score prediction. Factors that determine the tip include the following, amongst others:\n - Goal differentials\n - Expected goal differentials \n - Attack/Defence performance\n - Form trends over time\n - Home/Away records\n - WDL records\n - Points per game \n - A range of other comparative factors\n \u2013\n".concat("A range of tools are available should you wish to use them\n Build a multi - Use the '+' or '-' buttons to add or remove a game deemed to be one of XGTIpping's highest confidence tips from the day\n Exotic of the day: A pre-built exotic multi comprising of XGTipping's highest confidence tips\n BTTS games: Games where both teams to score is deemed a likely outcome\n Over 2.5 goals tips: Games where over 2.5 goals are most likely to be scored\n XG tips: Comprises only games where the expected goal differentials between each team are at their greatest. We believe this shows a true disparity in the form of the two opposing teams\n Tap the 'How to use' option to hide this text"),P=T.split("\n").map((function(e){return Object(i.jsx)("p",{children:e})})),r.a.render(Object(i.jsxs)("div",{className:"FixtureButtons",children:[Object(i.jsx)("div",{className:"historicResults",children:Object(i.jsx)(u,{text:"Last Saturday",className:"HistoricFixturesButton",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=An,e.next=3,qt("lastSaturday",tn,p,sn,!1,Js,nn);case 3:return e.t1=e.sent,e.abrupt("return",e.t0.push.call(e.t0,e.t1));case 5:case"end":return e.stop()}}),e)})))})}),Object(i.jsx)(u,{text:"<",className:"FixturesButton",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n(1,$s);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}}),e)})))}),Object(i.jsx)(u,{text:"".concat(dn),className:"FixturesButtonToday",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=An,e.next=3,qt("todaysFixtures",Js,p,Ks,!0,Js,Ys);case 3:return e.t1=e.sent,e.abrupt("return",e.t0.push.call(e.t0,e.t1));case 5:case"end":return e.stop()}}),e)})))}),Object(i.jsx)(u,{text:"Tomorrow",className:"FixturesButton",onClickEvent:Object(l.a)(Object(c.a)().mark((function e(){return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=An,e.next=3,qt("tomorrowsFixtures",qs,p,Zs,!0,Js,Qs);case 3:return e.t1=e.sent,e.abrupt("return",e.t0.push.call(e.t0,e.t1));case 5:case"end":return e.stop()}}),e)})))}),Object(i.jsx)("span",{children:"*Not enough data to predict games in the first few gameweeks - predictions displayed as 'x - x'"})]}),document.getElementById("Buttons")),r.a.render(Object(i.jsxs)("div",{className:"OddsRadios",children:[Object(i.jsx)(b,{value:"Fractional odds"}),Object(i.jsx)(b,{value:"Decimal odds"})]}),document.getElementById("Checkbox")),r.a.render(Object(i.jsx)(s.Fragment,{children:Object(i.jsx)(C,{buttonText:"How to use",element:P})}),document.getElementById("XGDiff"));case 75:case"end":return e.stop()}}),e)}))),Sn.apply(this,arguments)}!function(){var e=Object(l.a)(Object(c.a)().mark((function e(){var a,t,s,n,r,o,i,d;return Object(c.a)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch("".concat("https://api.xgtipping.com/","leagueList"));case 2:return a=e.sent,e.next=5,a.json().then((function(e){t=Array.from(e.data)}));case 5:s=0;case 6:if(!(st.indexOf(r)?1:-1})),e.abrupt("return",a);case 2:case"end":return e.stop()}}),e)})));return function(a,t,s){return e.apply(this,arguments)}}(),r=t[s],o=t[s].name,i=0;iXG Tipping\n );\n}\n\nexport default Header;\n","import React from \"react\";\n\nexport function Button(props) {\n return (\n
\n \n
\n );\n}\n","import React, { Component } from \"react\";\nexport var selectedOdds = \"Fractional odds\";\n\nexport class OddsRadio extends Component {\n constructor(props) {\n super(props);\n this.state = {\n selectedOdds: this.props.value,\n };\n }\n\n handleOptionChange = () => {\n this.setState({\n selectedOdds: this.props.value,\n });\n selectedOdds = this.state.selectedOdds;\n };\n\n render() {\n return (\n
\n
\n \n
\n
\n );\n }\n}\n\nexport default OddsRadio;\n","import React from \"react\";\n\nexport function CreateBadge(props) {\n\n if(props.image === \"-\"){\n return (\n
\n );\n } else {\n return (\n \n );\n }\n}\n","import React, { Fragment } from \"react\";\n\nfunction Stats(props) {\n let shouldOpen = props.clicked\n function styleForm(formIndicator) {\n let className;\n if (formIndicator === \"W\") {\n className = \"win\";\n } else if (formIndicator === \"D\") {\n className = \"draw\";\n } else if (formIndicator === \"L\") {\n className = \"loss\";\n }\n return className;\n }\n\n function styleBTTS(BTTSBoolean) {\n let className;\n if (BTTSBoolean === \"\\u2714\") {\n className = \"BTTSTrue\";\n } else if (BTTSBoolean === \"\\u2718\") {\n className = \"BTTSFalse\";\n }\n return className;\n }\n\n if (props.formRun) {\n console.log(props.formRun)\n return (\n \n
    \n
  • {props.FormTextString}
  • \n
  • {props.FavouriteRecord}
  • \n
  • \n League results (most recent on right)\n
  • \n
  • \n \n {props.Results[0]}\n \n \n {props.Results[1]}\n \n \n {props.Results[2]}\n \n \n {props.Results[3]}\n \n \n {props.Results[4]}\n \n \n {props.Results[5]}\n \n
  • \n
  • \n {props.homeOrAway} form (most recent on right)\n
  • \n
  • \n \n {props.ResultsHorA[0]}\n \n \n {props.ResultsHorA[1]}\n \n \n {props.ResultsHorA[2]}\n \n \n {props.ResultsHorA[3]}\n \n \n {props.ResultsHorA[4]}\n \n \n {props.ResultsHorA[5]}\n \n
  • \n \n
    BTTS
    \n {props.BTTSArray[5]}\n {props.BTTSArray[4]}\n {props.BTTSArray[3]}\n {props.BTTSArray[2]}\n {props.BTTSArray[1]}\n {props.BTTSArray[0]}\n \n \n {`Avg goals scored - ${props.goals}`}\n \n \n {`Avg goals conceeded - ${props.conceeded}`}\n \n \n {`Avg possession - ${props.possession}%`}\n \n
  • \n {`Avg XG - ${props.XG}`}\n
  • \n \n {`Avg XG conceded - ${props.XGConceded}`}\n \n \n {`Goal difference : `}\n {props.goalDifference}\n \n \n {`Goal difference ${props.homeOrAway} : ${props.goalDifferenceHomeOrAway}`}\n \n \n {`Avg shots on target - ${props.sot}`}\n \n \n {`Avg dangerous attacks - ${props.dangerousAttacks}`}\n \n \n {`League position - ${props.leaguePosition}`}\n \n\n \n {`Position (${props.homeOrAway} only) - ${props.homeOrAwayLeaguePosition}`}\n \n \n {`${props.homeOrAway} wins - ${props.winPercentage.toFixed(1)}%`}\n \n \n {`${props.homeOrAway} draws - ${props.drawPercentage.toFixed(1)}%`}\n \n \n {`${props.homeOrAway} losses - ${props.lossPercentage.toFixed(1)}%`}\n \n
  • \n {`Season PPG - ${props.ppg}`}\n
  • \n \n {`Last 10 PPG: ${props.formTrend[0]}`}\n \n \n {`Last 6 PPG: ${props.formTrend[1]}`}\n \n \n {`Last 5 PPG: ${props.formTrend[2]}.`}\n \n \n {`Cards total: ${props.CardsTotal}`}\n \n \n {`Corners average: ${props.CornersAverage}`}\n \n
\n
\n
\n );\n } else {\n return (\n \n
    \n
  • {props.FormTextString}
  • \n
  • {props.FavouriteRecord}
  • \n \n {`Avg goals scored - ${props.goals}`}\n \n \n {`Avg goals conceeded - ${props.conceeded}`}\n \n \n {`Avg possession - ${props.possession}%`}\n \n
  • \n {`Avg XG - ${props.XG}`}\n
  • \n \n {`Avg XG conceded - ${props.XGConceded}`}\n \n \n {`Avg shots on target - ${props.sot}`}\n \n \n {`Avg dangerous attacks - ${props.dangerousAttacks}`}\n \n \n {`League position - ${props.leaguePosition}`}\n \n\n \n {`Position (${props.homeOrAway} only) - ${props.homeOrAwayLeaguePosition}`}\n \n \n {`${props.homeOrAway} wins - ${props.winPercentage.toFixed(1)}%`}\n \n \n {`${props.homeOrAway} draws - ${props.drawPercentage.toFixed(1)}%`}\n \n \n {`${props.homeOrAway} losses - ${props.lossPercentage.toFixed(1)}%`}\n \n
  • \n {`Season PPG - ${props.ppg}`}\n
  • \n \n {`Last 10 PPG: ${props.formTrend[0]}`}\n \n \n {`Last 6 PPG: ${props.formTrend[1]}`}\n \n \n {`Last 5 PPG: ${props.formTrend[2]}.`}\n \n \n {`Cards total: ${props.CardsTotal}`}\n \n \n {`Corners average: ${props.CornersAverage}`}\n \n
\n
\n
\n );\n }\n}\n\nexport default Stats;\n","import React from \"react\";\n\nfunction Div(props) {\n return (\n
{props.text}
\n );\n}\n\nexport default Div;\n","export async function getForm(match) {\n const teams = [match.homeId, match.awayId];\n const fixtureForm = [];\n\n for (let i = 0; i < teams.length; i++) {\n const team = teams[i];\n\n let response = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}formTeam/${team}`\n );\n await response.json().then((formData) => {\n formData.lastMatchTimestamp = formData.last_updated_match_timestamp\n fixtureForm[i] = formData;\n });\n }\n return fixtureForm;\n}\n","import React, { useState, useEffect } from \"react\";\nimport Slider from \"@mui/material/Slider\";\nimport { selectedOdds } from \"../components/OddsRadio\";\nimport oddslib from \"oddslib\";\nexport let rangeValue = [1, 10];\n\nexport const Slide = (props) => {\n const [range, setRange] = useState([1.1, 10]);\n const [fractionalValue, setFractionalValue] = useState([\"1/9\", \"10/1\"]);\n\n useEffect(() => {\n if (selectedOdds === \"Fractional odds\") {\n let roundedValueOne = (Math.round(range[0] * 5) / 5).toFixed(1);\n let roundedValueTwo = (Math.round(range[1] * 5) / 5).toFixed(1);\n\n try {\n const fractionalOne = oddslib\n .from(\"decimal\", roundedValueOne)\n .to(\"fractional\", { precision: 1 });\n const fractionalTwo = oddslib\n .from(\"decimal\", roundedValueTwo)\n .to(\"fractional\", { precision: 1 });\n console.log(fractionalOne);\n console.log(fractionalTwo);\n setFractionalValue([fractionalOne, fractionalTwo]);\n } catch (error) {\n console.log(error);\n }\n }\n }, [range]);\n\n const handleChange = (event, newValue) => {\n setRange(newValue);\n console.log(newValue);\n rangeValue = newValue;\n };\n\n return (\n \n selectedOdds === \"Fractional odds\" ? fractionalValue[index] : value\n }\n />\n );\n};\n","import React from \"react\";\nimport Collapsible from \"react-collapsible\";\n\nconst Collapsable = (props) => {\n return (\n {props.buttonText}} className={props.className? props.className: \"Collapsable\"}>\n
\n {props.element}\n {props.elementTwo}\n
\n
\n );\n};\n\n\nexport default Collapsable;","import React, { Component, Fragment } from \"react\";\nimport { getNewTips } from \"../logic/getScorePredictions\"\nimport {allTips} from \"../logic/getScorePredictions\"\nexport var incrementValue = 3;\n\nexport var riskLevel = 10;\n\nclass Increment extends Component {\n constructor(props) {\n super(props);\n this.state = {\n incrementValue,\n riskLevel,\n show: true,\n };\n }\n\n IncrementItem = () => {\n if(incrementValue > 1){\n this.setState({ incrementValue: this.state.incrementValue - 1 });\n this.setState({ riskLevel: this.state.riskLevel - 1 });\n incrementValue = (this.state.incrementValue - 1);\n riskLevel = this.state.riskLevel - 1;\n }\n getNewTips(allTips)\n };\n DecreaseItem = () => {\n if(incrementValue > 0){\n this.setState({ incrementValue: this.state.incrementValue + 1 });\n this.setState({ riskLevel: this.state.riskLevel + 1 });\n incrementValue = (this.state.incrementValue + 1);\n riskLevel = this.state.riskLevel + 1;\n }\n getNewTips(allTips)\n };\n\n render() {\n return (\n \n \n \n \n\n );\n }\n}\n\nexport default Increment;\n","export async function getBTTSPotential(\n match,\n homeGoals,\n awayGoals,\n unroundedHomeGoals,\n unroundedAwayGoals\n) {\n const homeBTTS = match.bttsAllPercentageHome;\n const homeOnlyBTTS = match.bttsPercentageHomeHome;\n const awayOnlyBTTS = match.bttsPercentageAwayAway;\n const awayBTTS = match.bttsAllPercentageAway;\n const homeG = homeGoals;\n const awayG = awayGoals;\n\n match.combinedBTTS = (homeBTTS + awayBTTS) / 2;\n\n if (\n match.bttsFraction !== \"N/A\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n if (\n homeBTTS > 55 &&\n awayBTTS > 55 &&\n homeOnlyBTTS > 55 &&\n awayOnlyBTTS > 55 &&\n match.awayOdds < 4 &&\n match.awayOdds > 1.3 &&\n homeG >= 1 &&\n awayG >= 1 \n ) {\n match.btts = true;\n match.bttsChosen = true;\n match.totalGoals = match.rawFinalHomeGoals + match.rawFinalAwayGoals;\n } else {\n match.btts = false;\n match.bttsChosen = false;\n }\n }\n return match;\n}\n","import SwiperCore, { EffectCoverflow, Pagination } from \"swiper\";\nimport { Swiper, SwiperSlide } from \"swiper/react\";\nimport \"swiper/swiper-bundle.min.css\";\nimport \"swiper/swiper.min.css\";\n\nSwiperCore.use([EffectCoverflow, Pagination]);\n\nexport const Slider = (props) => {\n return (\n \n \n {props.element}\n \n \n {props.element2}\n \n \n {props.element3}\n \n \n {props.element4}\n \n \n {props.element5}\n \n \n );\n};\n","import KofiButton from \"kofi-button\"\n\nexport const StyledKofiButton = (props) => {\n return (\n \n )\n}","import React, { useState } from \"react\";\nimport Slider from \"@mui/material/Slider\";\nexport let minimumXG = 0;\nexport let minimumGD = 0;\nexport let minimumGDHorA = 0;\nexport let minimumLast10 = 0;\n\nfunction SlideDiff(props) {\n const [value, setValue] = useState(0);\n\n const handleChange = (event, newValue) => {\n setValue(newValue);\n\n switch (true) {\n case props.useCase === \"xg\":\n minimumXG = newValue;\n break;\n case props.useCase === \"gd\":\n minimumGD = newValue;\n break;\n case props.useCase === \"gdHorA\":\n minimumGDHorA = newValue;\n break;\n case props.useCase === \"last10\":\n minimumLast10 = newValue;\n break;\n\n default:\n break;\n }\n };\n\n return (\n \n );\n}\n\nexport default SlideDiff;\n","import React, { Fragment } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { matches, diff } from \"./getFixtures\";\nimport { RenderAllFixtures } from \"../logic/getFixtures\";\nimport Div from \"../components/Div\";\nimport Collapsable from \"../components/CollapsableElement\";\nimport { allForm } from \"../logic/getFixtures\";\nimport Increment from \"../components/Increment\";\nimport { incrementValue } from \"../components/Increment\";\nimport { getBTTSPotential } from \"../logic/getBTTSPotential\";\nimport { allLeagueResultsArrayOfObjects } from \"../logic/getFixtures\";\nimport { Slider } from \"../components/Carousel\";\nimport { StyledKofiButton } from \"../components/KofiButton\";\nimport {\n calculateAttackingStrength,\n calculateDefensiveStrength,\n calculateMetricStrength,\n getXGtoActualDifferentialStrength,\n} from \"./getStats\";\nimport { rangeValue } from \"../components/Slider\";\nimport {\n minimumGD,\n minimumXG,\n minimumLast10,\n minimumGDHorA,\n} from \"../components/SliderDiff\";\n\nvar myHeaders = new Headers();\nmyHeaders.append(\"Origin\", \"https://gregdorward.github.io\");\n\nlet finalHomeGoals;\nlet finalAwayGoals;\nlet rawFinalHomeGoals;\nlet rawFinalAwayGoals;\nlet homeOdds;\nlet awayOdds;\nlet totalGoals = 0;\nlet totalGoals2 = 0;\nlet numberOfGames = 0;\nlet drawPredictions = 0;\nlet homePredictions = 0;\nlet awayPredictions = 0;\nlet allOutcomes = 0;\nlet homeOutcomes = 0;\nlet awayOutcomes = 0;\nlet winAmount = 0;\nlet lossAmount = 0;\nlet sumStatDAWin = 0;\nlet sumStatDALoss = 0;\nlet sumStatPossessionWin = 0;\nlet sumStatPossessionLoss = 0;\nlet sumStatSOTWin = 0;\nlet sumStatSOTLoss = 0;\nlet sumStatPPGLast10Win = 0;\nlet sumStatPPGLast10Loss = 0;\nlet sumOddsWin = 0;\nlet sumOddsLoss = 0;\nlet sumXGForWin = 0;\nlet sumXGForLoss = 0;\nlet sumXGAgainstWin = 0;\nlet sumXGAgainstLoss = 0;\nlet allWinOutcomes = 0;\nlet allLossOutcomes = 0;\nlet allDrawOutcomes = 0;\nlet totalROI = 0;\nlet totalInvestment = 0;\nlet totalProfit = 0;\nexport let formObjectHome;\nexport let formObjectAway;\nexport let clicked = false;\n\nexport var renderPredictions;\n\nasync function convertTimestamp(timestamp) {\n let newDate = new Date(timestamp * 1000);\n let [day, month, year] = newDate.toLocaleDateString(\"en-US\").split(\"/\");\n\n let converted = `${year}-${day}-${month}`;\n\n return converted;\n}\n\nexport function getPointsFromLastX(lastX) {\n let points = 0;\n let pointsAddition;\n\n try {\n lastX.forEach((game) => {\n switch (true) {\n case game === \"W\":\n pointsAddition = 3;\n break;\n case game === \"D\":\n pointsAddition = 1;\n break;\n case game === \"L\":\n pointsAddition = 0;\n break;\n default:\n break;\n }\n\n points = points + pointsAddition;\n });\n return points;\n } catch (error) {\n console.log(error);\n return \"N/A\";\n }\n}\n\nasync function getPastLeagueResults(team, game, hOrA, form) {\n form.completeData = true\n let date = game.date;\n if (allLeagueResultsArrayOfObjects[game.leagueIndex].fixtures.length > 10) {\n let teamsHomeResults = allLeagueResultsArrayOfObjects[\n game.leagueIndex\n ].fixtures.filter((fixture) => fixture.home_name === team);\n\n teamsHomeResults = teamsHomeResults\n .filter(function (item) {\n return item.date_unix < date;\n })\n .sort((a, b) => a.date_unix - b.date_unix);\n\n let teamsAwayResults = allLeagueResultsArrayOfObjects[\n game.leagueIndex\n ].fixtures.filter((fixture) => fixture.away_name === team);\n\n teamsAwayResults = teamsAwayResults\n .filter(function (item) {\n return item.date_unix < date;\n })\n .sort((a, b) => a.date_unix - b.date_unix);\n\n let homeResults = [];\n let awayResults = [];\n let oddsSumHome = 0;\n let oddsSumAway = 0;\n let favouriteCount = 0;\n let underdogCount = 0;\n let winningFavouriteCount = 0;\n let drawingFavouriteCount = 0;\n let beatenFavouriteCount = 0;\n let winningUnderdogCount = 0;\n let drawingUnderdogCount = 0;\n let beatenUnderdogCount = 0;\n for (let index = 0; index < teamsHomeResults.length; index++) {\n const resultedGame = teamsHomeResults[index];\n\n homeResults.push({\n homeTeam: resultedGame.home_name,\n homeGoals: resultedGame.homeGoalCount,\n XG: resultedGame.team_a_xg,\n awayTeam: resultedGame.away_name,\n awayGoals: resultedGame.awayGoalCount,\n XGAgainst: resultedGame.team_b_xg,\n possession: resultedGame.team_a_possession,\n scored: resultedGame.homeGoalCount,\n conceeded: resultedGame.awayGoalCount,\n shots: resultedGame.team_a_shots,\n sot: resultedGame.team_a_shotsOnTarget,\n sotAgainst: resultedGame.team_b_shotsOnTarget,\n dangerousAttacks: resultedGame.team_a_dangerous_attacks,\n corners: resultedGame.team_a_corners,\n date: await convertTimestamp(resultedGame.date_unix),\n dateRaw: resultedGame.date_unix,\n oddsHome: resultedGame.odds_ft_1,\n oddsAway: resultedGame.odds_ft_2,\n btts:\n resultedGame.homeGoalCount > 0 && resultedGame.awayGoalCount > 0\n ? true\n : false,\n points:\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? 3\n : resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? 0\n : 1,\n result:\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? \"W\"\n : resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? \"L\"\n : \"D\",\n });\n oddsSumHome = oddsSumHome + resultedGame.odds_ft_1;\n favouriteCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2\n ? favouriteCount + 1\n : favouriteCount + 0;\n winningFavouriteCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? winningFavouriteCount + 1\n : winningFavouriteCount + 0;\n drawingFavouriteCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount === resultedGame.awayGoalCount\n ? drawingFavouriteCount + 1\n : drawingFavouriteCount + 0;\n beatenFavouriteCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? beatenFavouriteCount + 1\n : beatenFavouriteCount + 0;\n\n underdogCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2\n ? underdogCount + 1\n : underdogCount + 0;\n winningUnderdogCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? winningUnderdogCount + 1\n : winningUnderdogCount + 0;\n drawingUnderdogCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount === resultedGame.awayGoalCount\n ? drawingUnderdogCount + 1\n : drawingUnderdogCount + 0;\n beatenUnderdogCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? beatenUnderdogCount + 1\n : beatenUnderdogCount + 0;\n }\n for (let index = 0; index < teamsAwayResults.length; index++) {\n const resultedGame = teamsAwayResults[index];\n awayResults.push({\n homeTeam: resultedGame.home_name,\n homeGoals: resultedGame.homeGoalCount,\n XG: resultedGame.team_b_xg,\n awayTeam: resultedGame.away_name,\n awayGoals: resultedGame.awayGoalCount,\n XGAgainst: resultedGame.team_a_xg,\n possession: resultedGame.team_b_possession,\n scored: resultedGame.awayGoalCount,\n conceeded: resultedGame.homeGoalCount,\n shots: resultedGame.team_b_shots,\n sot: resultedGame.team_b_shotsOnTarget,\n sotAgainst: resultedGame.team_a_shotsOnTarget,\n dangerousAttacks: resultedGame.team_b_dangerous_attacks,\n corners: resultedGame.team_b_corners,\n date: await convertTimestamp(resultedGame.date_unix),\n dateRaw: resultedGame.date_unix,\n oddsHome: resultedGame.odds_ft_1,\n oddsAway: resultedGame.odds_ft_2,\n btts:\n resultedGame.homeGoalCount > 0 && resultedGame.awayGoalCount > 0\n ? true\n : false,\n points:\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? 0\n : resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? 3\n : 1,\n result:\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? \"L\"\n : resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? \"W\"\n : \"D\",\n });\n oddsSumAway = oddsSumAway + resultedGame.odds_ft_2;\n favouriteCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2\n ? favouriteCount + 1\n : favouriteCount + 0;\n winningFavouriteCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? winningFavouriteCount + 1\n : winningFavouriteCount + 0;\n drawingFavouriteCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount === resultedGame.awayGoalCount\n ? drawingFavouriteCount + 1\n : drawingFavouriteCount + 0;\n beatenFavouriteCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? beatenFavouriteCount + 1\n : beatenFavouriteCount + 0;\n\n underdogCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2\n ? underdogCount + 1\n : underdogCount + 0;\n winningUnderdogCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? winningUnderdogCount + 1\n : winningUnderdogCount + 0;\n drawingUnderdogCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount === resultedGame.awayGoalCount\n ? drawingUnderdogCount + 1\n : drawingUnderdogCount + 0;\n beatenUnderdogCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? beatenUnderdogCount + 1\n : beatenUnderdogCount + 0;\n }\n\n let reversedResultsHome = homeResults;\n let reversedResultsAway = awayResults;\n\n console.log(game.homeTeam)\n console.log(team)\n\n if (game.homeTeam === team) {\n let y = game.homeOdds;\n //Clear fav\n if (y <= 1.5) {\n const allClearFavouriteResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 1.45\n );\n const allClearFavouriteResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 1.45\n );\n\n form.simlarGameResultsHome = allClearFavouriteResultsHome\n .concat(allClearFavouriteResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //fav\n else if (y <= 2.1) {\n const allSlightFavouriteResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 2.1 && fixture.oddsHome > 1.45\n );\n const allSlightFavouriteResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 2.1 && fixture.oddsAway > 1.45\n );\n game.simlarGameResultsHome = allSlightFavouriteResultsHome\n .concat(allSlightFavouriteResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //Tossup\n else if (y <= 2.75) {\n const allTossupResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 2.75 && fixture.oddsHome > 2.1\n );\n const allTossupResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 2.75 && fixture.oddsAway > 2.1\n );\n game.simlarGameResultsHome = allTossupResultsHome\n .concat(allTossupResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //Underdog\n else if (y <= 4) {\n const allUnderdogResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 4 && fixture.oddsHome > 2.75\n );\n const allUnderdogResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 4 && fixture.oddsAway > 2.75\n );\n game.simlarGameResultsHome = allUnderdogResultsHome\n .concat(allUnderdogResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //MassiveUnderdog\n else if (y > 4) {\n const allMassiveUnderdogResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome > 4\n );\n const allMassiveUnderdogResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway > 4\n );\n game.simlarGameResultsHome = allMassiveUnderdogResultsHome\n .concat(allMassiveUnderdogResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n } else if (game.awayTeam === team) {\n let z = game.awayOdds;\n //Clear fav\n if (z <= 1.5) {\n const allClearFavouriteResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 1.45\n );\n const allClearFavouriteResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 1.45\n );\n\n game.simlarGameResultsAway = allClearFavouriteResultsHome\n .concat(allClearFavouriteResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //fav\n else if (z <= 2.1) {\n const allSlightFavouriteResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 2.1 && fixture.oddsHome > 1.45\n );\n const allSlightFavouriteResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 2.1 && fixture.oddsAway > 1.45\n );\n game.simlarGameResultsAway = allSlightFavouriteResultsHome\n .concat(allSlightFavouriteResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //Tossup\n else if (z <= 2.75) {\n const allTossupResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 2.75 && fixture.oddsHome > 2.1\n );\n const allTossupResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 2.75 && fixture.oddsAway > 2.1\n );\n game.simlarGameResultsAway = allTossupResultsHome\n .concat(allTossupResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //Underdog\n else if (z <= 4) {\n const allUnderdogResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 4 && fixture.oddsHome > 2.75\n );\n const allUnderdogResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 4 && fixture.oddsAway > 2.75\n );\n game.simlarGameResultsAway = allUnderdogResultsHome\n .concat(allUnderdogResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //MassiveUnderdog\n else if (z > 4) {\n const allMassiveUnderdogResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome > 4.5\n );\n const allMassiveUnderdogResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway > 4.5\n );\n game.simlarGameResultsAway = allMassiveUnderdogResultsHome\n .concat(allMassiveUnderdogResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n }\n\n const allTeamResults = reversedResultsHome\n .concat(reversedResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n\n const allTeamResultsHome = reversedResultsHome.sort(\n (a, b) => b.dateRaw - a.dateRaw\n );\n const allTeamResultsAway = reversedResultsAway.sort(\n (a, b) => b.dateRaw - a.dateRaw\n );\n\n console.log(game.game);\n console.log(allTeamResults);\n console.log(allTeamResultsHome);\n\n form.allTeamResults = allTeamResults.sort((b, a) => a.dateRaw - b.dateRaw);\n\n const points6 = allTeamResults.map((res) => res.points).slice(0, 6);\n const pointsSum6 = points6.reduce((a, b) => a + b, 0);\n form.avPoints6 = pointsSum6 / points6.length;\n\n const points5 = allTeamResults.map((res) => res.points).slice(0, 5);\n const pointsSum5 = points5.reduce((a, b) => a + b, 0);\n form.avPoints5 = pointsSum5 / points5.length;\n\n const pointsAll = allTeamResults.map((res) => res.points);\n const pointsSumAll = pointsAll.reduce((a, b) => a + b, 0);\n form.avPointsAll = pointsSumAll / pointsAll.length;\n\n const resultsAll = allTeamResults.map((res) => res.result);\n const resultsHome = allTeamResultsHome.map((res) => res.result);\n const resultsAway = allTeamResultsAway.map((res) => res.result);\n\n form.resultsAll = resultsAll.slice(0, 6);\n form.resultsHome = resultsHome.slice(0, 6);\n form.resultsAway = resultsAway.slice(0, 6);\n\n const avScoredLast5 = allTeamResults.map((res) => res.scored).slice(0, 5);\n const avScoredLast5Sum = avScoredLast5.reduce((a, b) => a + b, 0);\n form.avScoredLast5 = avScoredLast5Sum / avScoredLast5.length;\n const avConceededLast5 = allTeamResults\n .map((res) => res.conceeded)\n .slice(0, 5);\n const avConceededLast5Sum = avConceededLast5.reduce((a, b) => a + b, 0);\n form.avConceededLast5 = avConceededLast5Sum / avConceededLast5.length;\n const avDALast5 = allTeamResults\n .map((res) => res.dangerousAttacks)\n .slice(0, 5);\n const avDALast5Sum = avDALast5.reduce((a, b) => a + b, 0);\n form.avDALast5 = avDALast5Sum / avDALast5.length;\n const avSOTLast5 = allTeamResults.map((res) => res.sot).slice(0, 5);\n const avSOTLast5Sum = avSOTLast5.reduce((a, b) => a + b, 0);\n form.avSOTLast5 = avSOTLast5Sum / avSOTLast5.length;\n const avSOTAgainstLast5 = allTeamResults\n .map((res) => res.sotAgainst)\n .slice(0, 5);\n const avSOTAgainstLast5Sum = avSOTAgainstLast5.reduce((a, b) => a + b, 0);\n form.avSOTAgainstLast5 = avSOTAgainstLast5Sum / avSOTAgainstLast5.length;\n const avShotsLast5 = allTeamResults.map((res) => res.shots).slice(0, 5);\n const avShotsLast5Sum = avShotsLast5.reduce((a, b) => a + b, 0);\n form.avShotsLast5 = avShotsLast5Sum / avShotsLast5.length;\n const avCornersLast5 = allTeamResults.map((res) => res.corners).slice(0, 5);\n const avCornersLast5Sum = avCornersLast5.reduce((a, b) => a + b, 0);\n form.avCornersLast5 = avCornersLast5Sum / avCornersLast5.length;\n const avPosessionLast5 = allTeamResults\n .map((res) => res.possession)\n .slice(0, 6);\n const avPosessionLast5Sum = avPosessionLast5.reduce((a, b) => a + b, 0);\n form.avPosessionLast5 = avPosessionLast5Sum / avPosessionLast5.length;\n const avXGLast5 = allTeamResults.map((res) => res.XG).slice(0, 5);\n const avXGLast5Sum = avXGLast5.reduce((a, b) => a + b, 0);\n form.avXGLast5 = avXGLast5Sum / avXGLast5.length;\n const avXGAgainstLast5 = allTeamResults\n .map((res) => res.XGAgainst)\n .slice(0, 5);\n\n // console.log(form.teamName);\n\n // console.log(\"avConceededLast5\")\n // console.log(avConceededLast5)\n // console.log(\"avSOTLast5\")\n // console.log(avSOTLast5)\n\n // console.log(\"avSOTAgainstLast5\")\n // console.log(avSOTAgainstLast5)\n\n // console.log(\"avShotsLast5\")\n // console.log(avShotsLast5)\n\n // console.log(\"avCornersLast5\")\n // console.log(avCornersLast5)\n\n // console.log(\"avPosessionLast5\")\n // console.log(avPosessionLast5)\n\n // console.log(\"avXGLast5\")\n // console.log(avXGLast5)\n\n // console.log(\"avXGAgainstLast5\")\n // console.log(avXGAgainstLast5)\n\n const avXGAgainstLast5Sum = avXGAgainstLast5.reduce((a, b) => a + b, 0);\n form.avXGAgainstLast5 = avXGAgainstLast5Sum / avXGAgainstLast5.length;\n\n const averageOddsHome = oddsSumHome / teamsHomeResults.length;\n const averageOddsAway = oddsSumAway / teamsAwayResults.length;\n form.favouriteCount = favouriteCount;\n form.winningFavouriteCount = winningFavouriteCount;\n form.drawingFavouriteCount = drawingFavouriteCount;\n form.beatenFavouriteCount = beatenFavouriteCount;\n\n form.underdogCount = underdogCount;\n form.winningUnderdogCount = winningUnderdogCount;\n form.drawingUnderdogCount = drawingUnderdogCount;\n form.beatenUnderdogCount = beatenUnderdogCount;\n\n form.oddsReliabilityWin =\n favouriteCount > 0\n ? (form.winningFavouriteCount / form.favouriteCount) * 100\n : 0;\n form.oddsReliabilityDraw =\n favouriteCount > 0\n ? (form.drawingFavouriteCount / form.favouriteCount) * 100\n : 0;\n form.oddsReliabilityLose =\n favouriteCount > 0\n ? (form.beatenFavouriteCount / form.favouriteCount) * 100\n : 0;\n\n form.oddsReliabilityWinAsUnderdog =\n underdogCount > 0\n ? (form.winningUnderdogCount / form.underdogCount) * 100\n : 0;\n form.oddsReliabilityDrawAsUnderdog =\n underdogCount > 0\n ? (form.drawingUnderdogCount / form.underdogCount) * 100\n : 0;\n form.oddsReliabilityLoseAsUnderdog =\n underdogCount > 0\n ? (form.beatenUnderdogCount / form.underdogCount) * 100\n : 0;\n\n form.reliableIndicator =\n form.winningFavouriteCount + form.beatenUnderdogCount;\n form.unreliableIndicator =\n form.beatenFavouriteCount +\n form.drawingFavouriteCount +\n form.winningUnderdogCount +\n form.drawingUnderdogCount;\n\n form.predictabilityScore =\n form.reliableIndicator / form.unreliableIndicator;\n\n let reliabilityString;\n\n switch (true) {\n case form.predictabilityScore < 0.3:\n reliabilityString =\n \"Odds have been an extremely unreliable indicator of actual performance so far this season. Maybe best avoided?\";\n break;\n case form.predictabilityScore >= 0.3 && form.predictabilityScore < 0.8:\n reliabilityString =\n \"Odds have been an unreliable indicator of actual performance so far this season\";\n break;\n case form.predictabilityScore >= 0.8 && form.predictabilityScore < 1.2:\n reliabilityString =\n \"Odds have been a decent indicator of actual performance so far this season\";\n break;\n case form.predictabilityScore >= 1.2 && form.predictabilityScore < 1.7:\n reliabilityString =\n \"Odds have been a good indicator of actual performance so far this season\";\n break;\n case form.predictabilityScore >= 1.7 && form.predictabilityScore < 2.2:\n reliabilityString =\n \"Odds have been a very good indicator of actual performance so far this season\";\n break;\n case form.predictabilityScore >= 2.2:\n reliabilityString =\n \"Odds have been an excellent indicator of actual performance so far this season. One for the multi?\";\n break;\n default:\n break;\n }\n\n form.reliabilityString = reliabilityString;\n\n const teamGoalsHome = reversedResultsHome.map((res) => res.scored);\n\n const teamGoalsAway = awayResults.map((res) => res.scored);\n const teamGoalsAll = allTeamResults.map((res) => res.scored);\n const teamGoalsAllRecentAtStart = teamGoalsAll.reverse();\n const teamConceededHome = homeResults.map((res) => res.conceeded);\n const teamConceededAway = awayResults.map((res) => res.conceeded);\n const teamConceededAll = allTeamResults.map((res) => res.conceeded);\n const teamConceededAllRecentAtStart = teamConceededAll.reverse();\n\n const teamXGForAll = allTeamResults.map((res) => res.XG);\n const teamXGAgainstAll = allTeamResults.map((res) => res.XGAgainst);\n const teamXGForAllRecentAtStart = teamXGForAll.reverse();\n const teamXGAgainstAllRecentAtStart = teamXGAgainstAll.reverse();\n\n const teamXGForHome = homeResults.map((res) => res.XG);\n const teamXGAgainstHome = homeResults.map((res) => res.XGAgainst);\n const teamXGForAway = awayResults.map((res) => res.XG);\n const teamXGAgainstAway = awayResults.map((res) => res.XGAgainst);\n\n const XGSum = teamXGForAll.reduce((a, b) => a + b, 0);\n const avgXGScored = XGSum / teamXGForAll.length || 0;\n const XGAgainstSum = teamXGAgainstAll.reduce((a, b) => a + b, 0);\n const avgXGConceeded = XGAgainstSum / teamXGAgainstAll.length || 0;\n\n const possession = allTeamResults.map((res) => res.possession);\n const possessionSum = possession.reduce((a, b) => a + b, 0);\n const avgPossession = possessionSum / possession.length || 0;\n\n const possessionHome = homeResults.map((res) => res.possession);\n const possessionSumHome = possessionHome.reduce((a, b) => a + b, 0);\n form.avgPossessionHome = possessionSumHome / possessionHome.length || 0;\n\n const possessionAway = awayResults.map((res) => res.possession);\n const possessionSumAway = possessionAway.reduce((a, b) => a + b, 0);\n form.avgPossessionAway = possessionSumAway / possessionAway.length || 0;\n\n const dangerousAttacks = allTeamResults.map((res) => res.dangerousAttacks);\n const dangerousAttacksSum = dangerousAttacks.reduce((a, b) => a + b, 0);\n const avgDangerousAttacks =\n dangerousAttacksSum / dangerousAttacks.length || 0;\n\n const dangerousAttacksHome = homeResults.map((res) => res.dangerousAttacks);\n const dangerousAttacksSumHome = dangerousAttacksHome.reduce(\n (a, b) => a + b,\n 0\n );\n form.avgDangerousAttacksHome =\n dangerousAttacksSumHome / dangerousAttacksHome.length || 0;\n\n const dangerousAttacksAway = awayResults.map((res) => res.dangerousAttacks);\n const dangerousAttacksSumAway = dangerousAttacksAway.reduce(\n (a, b) => a + b,\n 0\n );\n form.avgDangerousAttacksAway =\n dangerousAttacksSumAway / dangerousAttacksAway.length || 0;\n\n const shots = allTeamResults.map((res) => res.shots);\n const shotsSum = shots.reduce((a, b) => a + b, 0);\n const avgShots = shotsSum / shots.length || 0;\n form.avgShots = avgShots;\n\n const shotsHome = homeResults.map((res) => res.shots);\n const shotsSumHome = shotsHome.reduce((a, b) => a + b, 0);\n form.avgShotsHome = shotsSumHome / shotsHome.length || 0;\n\n const shotsAway = awayResults.map((res) => res.shots);\n const shotsSumAway = shotsAway.reduce((a, b) => a + b, 0);\n form.avgShotsAway = shotsSumAway / shotsAway.length || 0;\n\n const shotsOnTarget = allTeamResults.map((res) => res.sot);\n const shotsOnTargetSum = shotsOnTarget.reduce((a, b) => a + b, 0);\n const avgShotsOnTarget = shotsOnTargetSum / shotsOnTarget.length || 0;\n\n const shotsOnTargetHome = homeResults.map((res) => res.sot);\n const shotsOnTargetSumHome = shotsOnTargetHome.reduce((a, b) => a + b, 0);\n form.avgShotsOnTargetHome =\n shotsOnTargetSumHome / shotsOnTargetHome.length || 0;\n\n const shotsOnTargetAway = awayResults.map((res) => res.sot);\n const shotsOnTargetSumAway = shotsOnTargetAway.reduce((a, b) => a + b, 0);\n form.avgShotsOnTargetAway =\n shotsOnTargetSumAway / shotsOnTargetAway.length || 0;\n\n const shotsOnTargetAgainst = allTeamResults.map((res) => res.sotAgainst);\n const shotsOnTargetSumAgainst = shotsOnTargetAgainst.reduce(\n (a, b) => a + b,\n 0\n );\n const avgShotsOnTargetAgainst =\n shotsOnTargetSumAgainst / shotsOnTargetAgainst.length || 0;\n\n const shotsOnTargetAgainstHome = homeResults.map((res) => res.sotAgainst);\n const shotsOnTargetSumAgainstHome = shotsOnTargetAgainstHome.reduce(\n (a, b) => a + b,\n 0\n );\n form.avgShotsOnTargetAgainstHome =\n shotsOnTargetSumAgainstHome / shotsOnTargetAgainstHome.length || 0;\n\n const shotsOnTargetAgainstAway = awayResults.map((res) => res.sotAgainst);\n const shotsOnTargetSumAgainstAway = shotsOnTargetAgainstAway.reduce(\n (a, b) => a + b,\n 0\n );\n form.avgShotsOnTargetAgainstAway =\n shotsOnTargetSumAgainstAway / shotsOnTargetAgainstAway.length || 0;\n\n const corners = allTeamResults.map((res) => res.corners);\n const cornersSum = corners.reduce((a, b) => a + b, 0);\n const cornersAv = cornersSum / corners.length || 0;\n\n const cornersHome = homeResults.map((res) => res.corners);\n const cornersSumHome = cornersHome.reduce((a, b) => a + b, 0);\n form.cornersAvHome = cornersSumHome / cornersHome.length || 0;\n\n const cornersAway = awayResults.map((res) => res.corners);\n const cornersSumAway = cornersAway.reduce((a, b) => a + b, 0);\n form.cornersAvAway = cornersSumAway / cornersAway.length || 0;\n\n const last5XG = teamXGForAllRecentAtStart.slice(0, 5);\n const last5XGSum = last5XG.reduce((a, b) => a + b, 0);\n const last5XGAvgFor = last5XGSum / last5XG.length || 0;\n\n const last5XGHome = teamXGForHome.slice(0, 5);\n const last5XGSumHome = last5XGHome.reduce((a, b) => a + b, 0);\n form.last5XGAvgForHome = last5XGSumHome / last5XGHome.length || 0;\n\n const last5XGAway = teamXGForAway.slice(0, 5);\n const last5XGSumAway = last5XGAway.reduce((a, b) => a + b, 0);\n form.last5XGAvgForAway = last5XGSumAway / last5XGAway.length || 0;\n\n const XGSumHome = teamXGForHome.reduce((a, b) => a + b, 0);\n form.avgXGScoredHome = XGSumHome / teamXGForHome.length || 0;\n\n const XGSumAway = teamXGForAway.reduce((a, b) => a + b, 0);\n form.avgXGScoredAway = XGSumAway / teamXGForAway.length || 0;\n\n const XGAgainstSumHome = teamXGAgainstHome.reduce((a, b) => a + b, 0);\n form.avgXGConceededHome = XGAgainstSumHome / teamXGAgainstHome.length || 0;\n\n const XGAgainstSumAway = teamXGAgainstAway.reduce((a, b) => a + b, 0);\n form.avgXGConceededAway = XGAgainstSumAway / teamXGAgainstAway.length || 0;\n\n const last5XGAgainst = teamXGAgainstAllRecentAtStart.slice(0, 5);\n const last5XGAgainstSum = last5XGAgainst.reduce((a, b) => a + b, 0);\n const last5XGAvgAgainst = last5XGAgainstSum / last5XGAgainst.length || 0;\n\n const last5XGAgainstHome = teamXGForHome.slice(0, 5);\n const last5XGAgainstSumHome = last5XGAgainstHome.reduce((a, b) => a + b, 0);\n form.last5XGAvgAgainstHome =\n last5XGAgainstSumHome / last5XGAgainstHome.length || 0;\n\n const last5XGAgainstAway = teamXGForAway.slice(0, 5);\n const last5XGAgainstSumAway = last5XGAgainstAway.reduce((a, b) => a + b, 0);\n form.last5XGAvgAgainstAway =\n last5XGAgainstSumAway / last5XGAgainstAway.length || 0;\n\n form.XGDiffNonAverage = XGSum - XGAgainstSum;\n form.XGDiffNonAverageLast5 = last5XGSum - last5XGAgainstSum;\n\n form.XGOverall = parseFloat(avgXGScored.toFixed(2));\n form.XGlast5 = parseFloat(last5XGAvgFor.toFixed(2));\n\n form.XGAgainstAvgOverall = parseFloat(avgXGConceeded.toFixed(2));\n form.XGAgainstlast5 = parseFloat(last5XGAvgAgainst.toFixed(2));\n\n form.AveragePossessionOverall = parseFloat(avgPossession.toFixed(1));\n form.AverageDangerousAttacksOverall = parseFloat(\n avgDangerousAttacks.toFixed(1)\n );\n form[\"Average Shots\"] = parseFloat(avgShots.toFixed(1));\n form.AverageCorners = parseFloat(cornersAv.toFixed(1));\n form.AverageShotsOnTargetOverall = parseFloat(avgShotsOnTarget.toFixed(1));\n form.AverageShotsOnTargetAgainstOverall = parseFloat(\n avgShotsOnTargetAgainst.toFixed(1)\n );\n const alpha = 0.75;\n const beta = 0.75;\n\n let forAndAgainstRollingAv;\n let forAndAgainstRollingAvHomeOrAway;\n if (hOrA === \"home\") {\n form.allGoalsArrayHomeRecent = teamGoalsAllRecentAtStart.slice(0, 20);\n form.allConceededArrayHomeRecent = teamConceededAllRecentAtStart.slice(\n 0,\n 20\n );\n form.allGoalsArrayHome = teamGoalsAllRecentAtStart;\n form.allConceededArrayHome = teamConceededAllRecentAtStart;\n form.allGoalsArrayHomeOnly = teamGoalsHome;\n form.allConceededArrayHomeOnly = teamConceededHome;\n const sum = teamGoalsHome.reduce((a, b) => a + b, 0);\n const sumTwo = teamConceededHome.reduce((a, b) => a + b, 0);\n form.goalDifferenceHomeOrAway = sum - sumTwo;\n\n forAndAgainstRollingAv = await predictGoalsWithExponentialSmoothing(\n teamGoalsAll.reverse(),\n teamConceededAll.reverse(),\n alpha\n );\n forAndAgainstRollingAvHomeOrAway =\n await predictGoalsWithExponentialSmoothing(\n teamGoalsHome,\n teamConceededHome,\n beta\n );\n } else if (hOrA === \"away\") {\n form.allGoalsArrayAwayRecent = teamGoalsAllRecentAtStart.slice(0, 20);\n form.allConceededArrayAwayRecent = teamConceededAllRecentAtStart.slice(\n 0,\n 20\n );\n form.allGoalsArrayAway = teamGoalsAllRecentAtStart;\n form.allConceededArrayAway = teamConceededAllRecentAtStart;\n form.allGoalsArrayAwayOnly = teamGoalsAway;\n form.allConceededArrayAwayOnly = teamConceededAway;\n const sum = teamGoalsAway.reduce((a, b) => a + b, 0);\n const sumTwo = teamConceededAway.reduce((a, b) => a + b, 0);\n form.goalDifferenceHomeOrAway = sum - sumTwo;\n forAndAgainstRollingAv = await predictGoalsWithExponentialSmoothing(\n teamGoalsAll.reverse(),\n teamConceededAll.reverse(),\n alpha\n );\n forAndAgainstRollingAvHomeOrAway =\n await predictGoalsWithExponentialSmoothing(\n teamGoalsAway,\n teamConceededAway,\n beta\n );\n }\n\n let bttsHome = homeResults.map((res) => res.btts);\n if (bttsHome.length > 10) {\n bttsHome = bttsHome.slice(-10);\n }\n\n let bttsAway = awayResults.map((res) => res.btts);\n if (bttsAway.length > 10) {\n bttsAway = bttsAway.slice(-10);\n }\n\n let bttsAll = allTeamResults.map((res) => res.btts);\n if (bttsAll.length > 10) {\n bttsAll = bttsAll.slice(-10);\n }\n\n const bttsHomeCount = bttsHome.filter((btts) => btts === true);\n const bttsHomeString = `${bttsHomeCount.length}/${bttsHome.length}`;\n const bttsHomePercentage = (\n (bttsHomeCount.length / bttsHome.length) *\n 100\n ).toFixed(0);\n\n const bttsAwayCount = bttsAway.filter((btts) => btts === true);\n const bttsAwayString = `${bttsAwayCount.length}/${bttsAway.length}`;\n const bttsAwayPercentage = (\n (bttsAwayCount.length / bttsAway.length) *\n 100\n ).toFixed(0);\n const bttsAllCount = bttsAll.filter((btts) => btts === true);\n const bttsAllString = `${bttsAllCount.length}/${bttsAll.length}`;\n const bttsAllPercentage = (\n (bttsAllCount.length / bttsAll.length) *\n 100\n ).toFixed(0);\n form.bttsAllPercentage = bttsAllPercentage;\n form.bttsHomePercentage = bttsHomePercentage;\n form.bttsAwayPercentage = bttsAwayPercentage;\n\n let r = 10;\n let x = 10;\n\n const teamGoalsHomeRollingAverage = await predictNextWeightedMovingAverage(\n teamGoalsHome,\n teamGoalsHome.length < x ? teamGoalsHome.length : x\n );\n\n const teamGoalsAwayRollingAverage = await predictNextWeightedMovingAverage(\n teamGoalsAway,\n teamGoalsAway.length < x ? teamGoalsAway.length : x\n );\n\n const RoundedXGFor = teamXGForAll.map((xg) => xg);\n const RoundedXGAgainst = teamXGAgainstAll.map((xg) => xg);\n const RoundedXGForHome = teamXGForHome.map((xg) => xg);\n const RoundedXGAgainstHome = teamXGAgainstHome.map((xg) => xg);\n const RoundedXGForAway = teamXGForAway.map((xg) => xg);\n const RoundedXGAgainstAway = teamXGAgainstAway.map((xg) => xg);\n\n form.XGPrediction = await predictGoalsWithExponentialSmoothing(\n RoundedXGFor,\n RoundedXGAgainst,\n alpha\n );\n\n form.XGPredictionHome = await predictGoalsWithExponentialSmoothing(\n RoundedXGForHome,\n RoundedXGAgainstHome,\n beta\n );\n\n form.XGPredictionAway = await predictGoalsWithExponentialSmoothing(\n RoundedXGForAway,\n RoundedXGAgainstAway,\n beta\n );\n\n const teamConceededHomeRollingAverage =\n await predictNextWeightedMovingAverage(\n teamConceededHome,\n teamConceededHome.length < x ? teamConceededHome.length : x\n );\n\n const teamConceededAwayRollingAverage =\n await predictNextWeightedMovingAverage(\n teamConceededAway,\n teamConceededAway.length < x ? teamConceededAway.length : x\n );\n\n const sum = teamGoalsAll.reduce((a, b) => a + b, 0);\n const avgScored = sum / teamGoalsAll.length || 0;\n form.avgScored = avgScored.toFixed(2);\n\n const sumHome = teamGoalsHome.reduce((a, b) => a + b, 0);\n const avgScoredHome = sumHome / teamGoalsAll.length || 0;\n form.avgScoredHome = avgScoredHome.toFixed(2);\n\n const sumAway = teamGoalsAway.reduce((a, b) => a + b, 0);\n const avgScoredAway = sumAway / teamGoalsAway.length || 0;\n form.avgScoredAway = avgScoredAway.toFixed(2);\n\n const last5 = teamGoalsAllRecentAtStart.slice(0, 5);\n const last5Sum = last5.reduce((a, b) => a + b, 0);\n const last5AvgScored = last5Sum / last5.length || 0;\n\n const last5Home = teamGoalsHome.slice(0, 5);\n const last5SumHome = last5Home.reduce((a, b) => a + b, 0);\n form.last5AvgScoredHome = last5SumHome / last5Home.length || 0;\n\n const last5Away = teamGoalsAway.slice(0, 5);\n const last5SumAway = last5Away.reduce((a, b) => a + b, 0);\n form.last5AvgScoredAway = last5SumAway / last5Away.length || 0;\n\n const last5Conceeded = teamConceededAllRecentAtStart.slice(0, 5);\n const last5ConceededSum = last5Conceeded.reduce((a, b) => a + b, 0);\n const last5AvgConceeded = last5ConceededSum / last5Conceeded.length || 0;\n\n const last5ConceededHome = teamConceededHome.slice(0, 5);\n const last5ConceededSumHome = last5ConceededHome.reduce((a, b) => a + b, 0);\n form.last5AvgConceededHome =\n last5ConceededSumHome / last5ConceededHome.length || 0;\n\n const last5ConceededAway = teamConceededAway.slice(0, 5);\n const last5ConceededSumAway = last5ConceededAway.reduce((a, b) => a + b, 0);\n form.last5AvgConceededAway =\n last5ConceededSumAway / last5ConceededAway.length || 0;\n\n const last10 = teamGoalsAllRecentAtStart.slice(0, 10);\n const last10Sum = last10.reduce((a, b) => a + b, 0);\n const last10AvgScored = last10Sum / last10.length || 0;\n\n const last10Conceeded = teamConceededAllRecentAtStart.slice(0, 10);\n const last10ConceededSum = last10Conceeded.reduce((a, b) => a + b, 0);\n const last10AvgConceeded = last10ConceededSum / last10Conceeded.length || 0;\n\n form.last5Goals = parseFloat(last5AvgScored.toFixed(2));\n form.last5GoalsConceeded = parseFloat(last5AvgConceeded.toFixed(2));\n form.last5GoalDiff = form.last5Goals - form.last5GoalsConceeded;\n form.last10Goals = parseFloat(last10AvgScored.toFixed(2));\n form.last10GoalsConceeded = parseFloat(last10AvgConceeded.toFixed(2));\n form.last10GoalDiff = form.last10Goals - form.last10GoalsConceeded;\n\n const teamGoalsAllRollingAverage = await predictNextWeightedMovingAverage(\n teamGoalsAll,\n teamGoalsAll.length < r ? teamGoalsAll.length : r\n );\n\n const teamGoalsConceededAllRollingAverage =\n await predictNextWeightedMovingAverage(\n last10Conceeded,\n last10Conceeded.length < r ? last10Conceeded.length : r\n );\n\n const sumTwo = teamConceededAll.reduce((a, b) => a + b, 0);\n const avgConceeded = sumTwo / teamConceededAll.length || 0;\n form.avgConceeded = avgConceeded.toFixed(2);\n\n const teamConceededHomeOnlySum = teamConceededHome.reduce(\n (a, b) => a + b,\n 0\n );\n const teamConceededAvgHomeOnly =\n teamConceededHomeOnlySum / teamConceededHome.length || 0;\n form.teamConceededAvgHomeOnly = teamConceededAvgHomeOnly;\n\n const teamConceededAwayOnlySum = teamConceededAway.reduce(\n (a, b) => a + b,\n 0\n );\n const teamConceededAvgAwayOnly =\n teamConceededAwayOnlySum / teamConceededAway.length || 0;\n form.teamConceededAvgAwayOnly = teamConceededAvgAwayOnly;\n\n form.goalDifference = sum - sumTwo;\n\n // console.log(teamGoalsHomeRollingAverage)\n // console.log(teamGoalsAwayRollingAverage)\n // console.log(teamGoalsAllRollingAverage)\n // console.log(teamConceededHomeRollingAverage)\n // console.log(teamConceededAwayRollingAverage)\n // console.log(teamGoalsConceededAllRollingAverage)\n // console.log(averageOddsHome)\n // console.log(averageOddsAway)\n // console.log(avgScored)\n // console.log(avgConceeded)\n // console.log(form.XGPrediction)\n // console.log(forAndAgainstRollingAvHomeOrAway)\n // console.log(forAndAgainstRollingAv)\n\n return [\n teamGoalsHomeRollingAverage,\n teamGoalsAwayRollingAverage,\n teamGoalsAllRollingAverage,\n teamConceededHomeRollingAverage,\n teamConceededAwayRollingAverage,\n teamGoalsConceededAllRollingAverage,\n averageOddsHome,\n averageOddsAway,\n avgScored,\n avgConceeded,\n bttsAllString,\n bttsHomeString,\n bttsAwayString,\n bttsAllPercentage,\n bttsHomePercentage,\n bttsAwayPercentage,\n forAndAgainstRollingAvHomeOrAway,\n forAndAgainstRollingAv,\n ];\n } else {\n return null;\n }\n}\n\nasync function predictNextWeightedMovingAverage(numbers, windowSize) {\n const startIndex = numbers.length - windowSize;\n const window = numbers.slice(startIndex);\n const weights = Array.from(\n { length: windowSize },\n (_, i) => (i + 1) / ((windowSize * (windowSize + 1)) / 2)\n );\n const sum = window.reduce((acc, num, i) => acc + num * weights[i], 0);\n const movingAverage = sum / weights.reduce((acc, w) => acc + w, 0);\n return parseFloat(movingAverage.toFixed(2));\n}\n\n// Function to calculate the weighted average using exponential smoothing\nasync function calculateWeightedAverage(arr, alpha) {\n let weightedSum = 0;\n let totalWeight = 0;\n\n for (let i = arr.length - 1; i >= 0; i--) {\n const weight = Math.pow(1 - alpha, arr.length - 1 - i);\n weightedSum += arr[i] * weight;\n totalWeight += weight;\n }\n\n return weightedSum / totalWeight;\n}\n\n// Function to predict goals scored and conceded for a team with exponential smoothing\nasync function predictGoalsWithExponentialSmoothing(\n teamGoalsFor,\n teamGoalsAgainst,\n alpha\n) {\n const lambdaFor = await calculateWeightedAverage(teamGoalsFor, alpha);\n const lambdaAgainst = await calculateWeightedAverage(teamGoalsAgainst, alpha);\n\n // You can fine-tune these values based on your model and data\n const predictedGoalsFor = lambdaFor;\n const predictedGoalsAgainst = lambdaAgainst;\n\n return {\n goalsFor: predictedGoalsFor,\n goalsAgainst: predictedGoalsAgainst,\n };\n}\n\nasync function calculateDifference(num1, num2) {\n return num1 >= num2 ? num1 - num2 : -(num2 - num1);\n}\n\nexport async function comparison(metricOne, metricTwo) {\n let stat1 = parseFloat(metricOne);\n let stat2 = parseFloat(metricTwo);\n let statDiff;\n\n statDiff = await calculateDifference(stat1, stat2);\n\n return parseFloat(statDiff);\n}\n\nexport async function compareStat(statOne, statTwo) {\n let stat1 = parseFloat(statOne);\n let stat2 = parseFloat(statTwo);\n let statDiff;\n // console.log( await normalizeValues(12, 2, 0, 1))\n // console.log(await diff(1.8571428571428571, 1.14285714285714285))\n\n if (stat1 === 0) {\n stat1 = stat1 + 1;\n stat2 = stat2 + 1;\n }\n if (stat2 === 0) {\n stat2 = stat2 + 1;\n stat2 = stat2 + 1;\n }\n\n const { normalizedValue1, normalizedValue2 } = await normalizeValues(\n stat1,\n stat2,\n 0,\n 1\n );\n\n const finalValue1 = normalizedValue1;\n const finalValue2 = normalizedValue2;\n\n statDiff = await diff(finalValue1, finalValue2);\n\n // if (statDiff > 0.3 || statDiff < -0.3) {\n // // console.log(statDiff)\n // } else {\n // statDiff = 0;\n // }\n return statDiff;\n}\n\nexport async function getClinicalRating(form) {\n let rating;\n let score;\n switch (true) {\n case form.dangerousAttackConversion <= 15:\n rating = \"excellent\";\n score = 0.8;\n break;\n\n case form.dangerousAttackConversion > 15 &&\n form.dangerousAttackConversion <= 20:\n rating = \"great\";\n score = 0.9;\n break;\n\n case form.dangerousAttackConversion > 20 &&\n form.dangerousAttackConversion <= 25:\n rating = \"very good\";\n score = 0.95;\n break;\n\n case form.dangerousAttackConversion > 25 &&\n form.dangerousAttackConversion <= 32.5:\n rating = \"good\";\n score = 0.98;\n break;\n\n case form.dangerousAttackConversion > 30 &&\n form.dangerousAttackConversion <= 35:\n rating = \"above average\";\n score = 0.99;\n break;\n\n case form.dangerousAttackConversion > 35 &&\n form.dangerousAttackConversion <= 40:\n rating = \"average\";\n score = 1;\n break;\n\n case form.dangerousAttackConversion > 40 &&\n form.dangerousAttackConversion <= 45:\n rating = \"below average\";\n score = 1.01;\n break;\n\n case form.dangerousAttackConversion > 45 &&\n form.dangerousAttackConversion <= 50:\n rating = \"poor\";\n score = 1.05;\n break;\n\n case form.dangerousAttackConversion > 50 &&\n form.dangerousAttackConversion <= 55:\n rating = \"very poor\";\n score = 1.1;\n break;\n\n case form.dangerousAttackConversion > 55 &&\n form.dangerousAttackConversion <= 60:\n rating = \"terrible\";\n score = 1.2;\n break;\n\n case form.dangerousAttackConversion > 60:\n rating = \"awful\";\n score = 1.3;\n break;\n\n default:\n break;\n }\n\n return [rating, score];\n}\n\nexport async function getPointsDifferential(pointsHomeAvg, pointsAwayAvg) {\n const differential = await diff(pointsHomeAvg, pointsAwayAvg);\n return parseFloat(differential);\n}\n\nexport async function getPointWeighting(pointsDiff) {\n let pointsDiffWeightingHome;\n let pointsDiffWeightingAway;\n\n switch (true) {\n case pointsDiff >= 2.5:\n pointsDiffWeightingHome = 0.3;\n pointsDiffWeightingAway = -0.3;\n break;\n case pointsDiff >= 2 && pointsDiff < 2.5:\n pointsDiffWeightingHome = 0.2;\n pointsDiffWeightingAway = -0.2;\n break;\n case pointsDiff >= 1.5 && pointsDiff < 2:\n pointsDiffWeightingHome = 0.15;\n pointsDiffWeightingAway = -0.15;\n break;\n case pointsDiff >= 1 && pointsDiff < 1.5:\n pointsDiffWeightingHome = 0.1;\n pointsDiffWeightingAway = -0.1;\n break;\n case pointsDiff >= 0.5 && pointsDiff < 1:\n pointsDiffWeightingHome = 0.05;\n pointsDiffWeightingAway = -0.05;\n break;\n case pointsDiff > -0.5 && pointsDiff < 0.5:\n pointsDiffWeightingHome = 0;\n pointsDiffWeightingAway = 0;\n break;\n case pointsDiff <= -0.5 && pointsDiff > -1:\n pointsDiffWeightingHome = -0.05;\n pointsDiffWeightingAway = 0.05;\n break;\n case pointsDiff <= -1 && pointsDiff > -1.5:\n pointsDiffWeightingHome = -0.1;\n pointsDiffWeightingAway = 0.1;\n break;\n case pointsDiff <= -1.5 && pointsDiff > -2:\n pointsDiffWeightingHome = -0.15;\n pointsDiffWeightingAway = 0.15;\n break;\n case pointsDiff <= -2 && pointsDiff > -2.5:\n pointsDiffWeightingHome = -0.2;\n pointsDiffWeightingAway = 0.2;\n break;\n case pointsDiff <= -2.5:\n pointsDiffWeightingHome = -0.3;\n pointsDiffWeightingAway = 0.3;\n break;\n default:\n pointsDiffWeightingHome = 0;\n pointsDiffWeightingAway = 0;\n }\n return [pointsDiffWeightingHome, pointsDiffWeightingAway];\n}\n\nexport async function compareFormTrend(recentForm, distantForm) {\n let score;\n let scoreTotal = 0;\n\n for (let index = 0; index < recentForm.length; index++) {\n const recent = recentForm[index];\n const distant = distantForm[index];\n\n if (recent > distant) {\n score = 1.05;\n } else if (recent === distant) {\n score = 1;\n } else if (recent < distant) {\n score = 0.95;\n }\n scoreTotal = scoreTotal + score / recentForm.length;\n }\n\n return scoreTotal;\n}\n\nexport async function getPointAverage(pointTotal, games) {\n return pointTotal / games;\n}\n\nasync function poissonDistribution(lambda, k) {\n const numerator = Math.exp(-lambda) * Math.pow(lambda, k);\n const denominator = factorial(k);\n return numerator / denominator;\n}\n\nfunction factorial(n) {\n if (n === 0 || n === 1) {\n return 1;\n }\n let result = 1;\n for (let i = 2; i <= n; i++) {\n result *= i;\n }\n return result;\n}\n\nasync function calculateAverageGoals(goalsFor) {\n const totalGoals = goalsFor.reduce((sum, goals) => sum + goals, 0);\n return totalGoals / goalsFor.length;\n}\n\nasync function adjustGoalsAvg(goalsAvg, strengthRatio) {\n return goalsAvg * strengthRatio;\n}\n\nasync function predictScore(\n goalsForTeam1,\n goalsAgainstTeam1,\n goalsForTeam2,\n goalsAgainstTeam2,\n team1Metrics,\n team2Metrics,\n game\n) {\n let team1AverageGoalsFor = await calculateAverageGoals(goalsForTeam1);\n let team1AverageGoalsAgainst = await calculateAverageGoals(goalsAgainstTeam1);\n let team2AverageGoalsFor = await calculateAverageGoals(goalsForTeam2);\n let team2AverageGoalsAgainst = await calculateAverageGoals(goalsAgainstTeam2);\n\n let team1StrengthRatio = 1;\n let team2StrengthRatio = 1;\n\n let adjustedTeam1AverageGoals = await adjustGoalsAvg(\n team1AverageGoalsFor,\n team1StrengthRatio\n );\n let adjustedTeam2AverageGoals = await adjustGoalsAvg(\n team2AverageGoalsFor,\n team2StrengthRatio\n );\n\n let adjustedTeam1AverageGoalsAgainst = await adjustGoalsAvg(\n team1AverageGoalsAgainst,\n team2StrengthRatio\n );\n let adjustedTeam2AverageGoalsAgainst = await adjustGoalsAvg(\n team2AverageGoalsAgainst,\n team1StrengthRatio\n );\n\n let maxGoals = 5; // Set the maximum number of goals to predict\n\n const scores = [];\n\n for (let i = 0; i <= maxGoals; i++) {\n for (let j = 0; j <= maxGoals; j++) {\n let team1GoalExpectation =\n (adjustedTeam1AverageGoals + adjustedTeam2AverageGoalsAgainst) / 2;\n // (adjustedTeam2AverageGoalsAgainst / adjustedTeam1AverageGoalsAgainst);\n let team2GoalExpectation =\n (adjustedTeam2AverageGoals + adjustedTeam1AverageGoalsAgainst) / 2;\n // (adjustedTeam1AverageGoalsAgainst / adjustedTeam2AverageGoalsAgainst);\n\n if (!isFinite(team1GoalExpectation)) {\n team1GoalExpectation = 0;\n }\n\n if (!isFinite(team2GoalExpectation)) {\n team2GoalExpectation = 0;\n }\n\n const probability =\n (await poissonDistribution(team1GoalExpectation, i)) *\n (await poissonDistribution(team2GoalExpectation, j));\n scores.push({\n team1Score: i,\n team2Score: j,\n probability,\n });\n }\n }\n\n scores.sort((a, b) => b.probability - a.probability); // Sort scores in descending order by probability\n const top5Scores = scores.slice(0, 5); // Get the top 5 scores\n\n // for (const score of top5Scores) {\n // console.log(\n // `Team 1: ${score.team1Score} - Team 2: ${score.team2Score} (${(\n // score.probability * 100\n // ).toFixed(2)}%)`\n // );\n // }\n return top5Scores;\n}\n\nasync function normalizeValues(value1, value2, minRange, maxRange) {\n if (\n typeof value1 !== \"number\" ||\n typeof value2 !== \"number\" ||\n typeof minRange !== \"number\" ||\n typeof maxRange !== \"number\"\n ) {\n throw new Error(\"All arguments must be numbers.\");\n }\n\n // Calculate the absolute values of the inputs\n\n const absValue1 = Math.abs(value1);\n const absValue2 = Math.abs(value2);\n\n // Calculate the total sum of the absolute values\n const totalAbs = absValue1 + absValue2;\n\n // Calculate the normalized values based on the ratio of absolute values\n const normalizedAbsValue1 =\n (absValue1 / totalAbs) * (maxRange - minRange) + minRange;\n const normalizedAbsValue2 =\n (absValue2 / totalAbs) * (maxRange - minRange) + minRange;\n\n // Adjust the signs of the normalized values based on the original values\n const normalizedValue1 =\n value1 >= 0 ? normalizedAbsValue1 : -normalizedAbsValue1;\n const normalizedValue2 =\n value2 >= 0 ? normalizedAbsValue2 : -normalizedAbsValue2;\n\n return { normalizedValue1, normalizedValue2 };\n}\n\nexport async function generateGoals(homeForm, awayForm, match) {\n let homeGoals = 0;\n let awayGoals = 0;\n\n const homeAttackVsAwayDefenceComparison = await comparison(\n homeForm.attackingStrength,\n awayForm.defensiveStrengthScoreGeneration\n );\n const awayAttackVsHomeDefenceComparison = await comparison(\n awayForm.attackingStrength,\n homeForm.defensiveStrengthScoreGeneration\n );\n\n const homeOverallVsAwayOverallComparison = await comparison(\n homeForm.attackingStrength + homeForm.defensiveStrength,\n awayForm.attackingStrength + awayForm.defensiveStrength\n );\n\n const awayOverallVsHomeOverallComparison = await comparison(\n awayForm.attackingStrength + awayForm.defensiveStrength,\n homeForm.attackingStrength + homeForm.defensiveStrength\n );\n\n const homeAttackVsAwayDefenceComparisonLast5 = await comparison(\n homeForm.attackingStrengthLast5,\n awayForm.defensiveStrengthScoreGenerationLast5\n );\n const awayAttackVsHomeDefenceComparisonLast5 = await comparison(\n awayForm.attackingStrengthLast5,\n homeForm.defensiveStrengthScoreGenerationLast5\n );\n\n const homeAttackVsAwayDefenceComparisonHomeOnly = await comparison(\n homeForm.attackingStrengthHomeOnly,\n awayForm.defensiveStrengthScoreGenerationAwayOnly\n );\n const awayAttackVsHomeDefenceComparisonAwayOnly = await comparison(\n awayForm.attackingStrengthAwayOnly,\n homeForm.defensiveStrengthScoreGenerationHomeOnly\n );\n\n const pointsComparisonHome = await comparison(\n homeForm.avPoints6,\n awayForm.avPoints6\n );\n\n const pointsComparisonAway = await comparison(\n awayForm.avPoints6,\n homeForm.avPoints6\n );\n\n homeGoals =\n 1 +\n homeAttackVsAwayDefenceComparison * 1.75 +\n // (homeGoals + homeOverallVsAwayOverallComparison) * 0.25 +\n homeAttackVsAwayDefenceComparisonLast5 * 1.75 +\n homeAttackVsAwayDefenceComparisonHomeOnly * 1;\n // pointsComparisonHome * 0.1;\n awayGoals =\n 1 +\n awayAttackVsHomeDefenceComparison * 1.75 +\n // (awayGoals + awayOverallVsHomeOverallComparison) * 0.25 +\n awayAttackVsHomeDefenceComparisonLast5 * 1.75 +\n awayAttackVsHomeDefenceComparisonAwayOnly * 1;\n // pointsComparisonAway * 0.1;\n\n // if (homeForm.actualToXGDifference > 25) {\n // homeGoals = homeGoals + homeForm.actualToXGDifference / 50;\n // } else if (homeForm.actualToXGDifference < -25) {\n // homeGoals = homeGoals + homeForm.actualToXGDifference / 50;\n // }\n\n // if (awayForm.actualToXGDifference > 25) {\n // awayGoals = awayGoals + awayForm.actualToXGDifference / 50;\n // } else if (awayForm.actualToXGDifference < -25) {\n // awayGoals = awayGoals + awayForm.actualToXGDifference / 50;\n // }\n\n if (\n homeForm.lastGame === \"L\" ||\n homeForm.last2Points < 2 ||\n awayForm.last2Points >= 5 ||\n match.XGdifferentialValueRaw < 0\n ) {\n awayGoals = awayGoals + 0.3;\n } else if (\n awayForm.lastGame === \"L\" ||\n awayForm.last2Points < 2 ||\n homeForm.last2Points >= 5 ||\n match.XGdifferentialValueRaw > 0\n ) {\n homeGoals = homeGoals + 0.3;\n }\n\n // if(homeForm.last5Points > homeForm.last10Points){\n // homeGoals = homeGoals + 0.1;\n // awayGoals = awayGoals - 0.1;\n\n // } else if (awayForm.last5Points > awayForm.last10Points){\n // awayGoals = awayGoals + 0.1;\n // homeGoals = homeGoals - 0.1;\n // }\n\n // Cumalative ROI for all 2193 match outcomes: + 4.18%\n\n if (homeGoals < 0 && awayGoals < 0) {\n if (homeGoals < awayGoals) {\n homeGoals = homeGoals + awayGoals / 5;\n awayGoals = awayGoals - homeGoals / 5;\n } else if (homeGoals > awayGoals) {\n homeGoals = homeGoals - awayGoals / 5;\n awayGoals = awayGoals + homeGoals / 5;\n }\n }\n\n return [homeGoals, awayGoals];\n}\n\nexport async function compareTeams(homeForm, awayForm, match) {\n // let homeAttackStrength = homeForm.attackingStrength;\n // let homeDefenceStrength = homeForm.defensiveStrength;\n // let homePossessionStrength = homeForm.possessionStrength;\n // let awayAttackStrength = awayForm.attackingStrength;\n // let awayDefenceStrength = awayForm.defensiveStrength;\n // let awayPossessionStrength = awayForm.possessionStrength;\n // let homeAttackStrengthLast5 = homeForm.attackingStrengthLast5;\n // let homeDefenceStrengthLast5 = homeForm.defensiveStrengthLast5;\n // let homePossessionStrengthLast5 = homeForm.possessionStrengthLast5;\n // let awayAttackStrengthLast5 = awayForm.attackingStrengthLast5;\n // let awayDefenceStrengthLast5 = awayForm.defensiveStrengthLast5;\n // let awayPossessionStrengthLast5 = awayForm.possessionStrengthLast5;\n // let homeAttackStrengthHome = homeForm.attackingStrengthHomeOnly;\n // let homeDefenceStrengthHome = homeForm.defensiveStrengthHomeOnly;\n // let homePossessionStrengthHome = homeForm.possessionStrengthHomeOnly;\n // let awayAttackStrengthAway = awayForm.attackingStrengthAwayOnly;\n // let awayDefenceStrengthAway = awayForm.defensiveStrengthAwayOnly;\n // let awayPossessionStrengthAway = awayForm.possessionStrengthAwayOnly;\n // const attackStrengthComparison = await compareStat(\n // homeAttackStrength,\n // awayAttackStrength\n // );\n // const attackStrengthHAComparison = await compareStat(\n // homeAttackStrengthHome,\n // awayAttackStrengthAway\n // );\n // const defenceStrengthComparison = await compareStat(\n // homeDefenceStrength,\n // awayDefenceStrength\n // );\n // const defenceStrengthHAComparison = await compareStat(\n // homeDefenceStrengthHome,\n // awayDefenceStrengthAway\n // );\n // const attackStrengthComparisonLast5 = await compareStat(\n // homeAttackStrengthLast5,\n // awayAttackStrengthLast5\n // );\n // const defenceStrengthComparisonLast5 = await compareStat(\n // homeDefenceStrengthLast5,\n // awayDefenceStrengthLast5\n // );\n // const possessiontrengthComparison = await compareStat(\n // homePossessionStrength,\n // awayPossessionStrength\n // );\n // const possessiontrengthComparisonLast5 = await compareStat(\n // homePossessionStrengthLast5,\n // awayPossessionStrengthLast5\n // );\n // const possessionHAStrengthComparison = await compareStat(\n // homePossessionStrengthHome,\n // awayPossessionStrengthAway\n // );\n // // const xgActualComparison = await compareStat(\n // // homeForm.actualToXGDifference,\n // // awayForm.actualToXGDifference\n // // );\n // // const XGComparison = await compareStat(\n // // homeForm.XGDiffNonAverage,\n // // awayForm.XGDiffNonAverage\n // // );\n // // const XGComparisonLast5 = await compareStat(\n // // homeForm.XGDiffNonAverageLast5,\n // // awayForm.XGDiffNonAverageLast5\n // // )\n // const homeAwayPointAverageComparison = await compareStat(\n // homeForm.homeOrAwayAverage,\n // awayForm.homeOrAwayAverage\n // );\n // // const fiveGameComparison = await compareStat(\n // // homeForm.last5Points,\n // // awayForm.last5Points\n // // );\n // // const last5GDComparison = await compareStat(\n // // homeForm.last5GoalDiff,\n // // awayForm.last5GoalDiff\n // // )\n // let oddsComparison = await compareStat(match.awayOdds, match.homeOdds);\n // // const homeAdvantage = await compareStat(\n // // parseFloat(homeForm.homeAttackAdvantage) / 2,\n // // 1\n // // );\n // // const dangerousAttacksWithConverstionComparison = await compareStat(\n // // homeForm.AverageDangerousAttacksOverall *\n // // homeForm.dangerousAttackConversion,\n // // awayForm.AverageDangerousAttacksOverall * awayForm.dangerousAttackConversion\n // // );\n // match.goalDiffHomeOrAwayComparison =\n // parseFloat(homeForm.goalDifferenceHomeOrAway) -\n // parseFloat(awayForm.goalDifferenceHomeOrAway);\n // match.goalDifferenceComparison =\n // parseFloat(homeForm.goalDifference) - parseFloat(awayForm.goalDifference);\n // const goalDiffHomeOrAwayComparison = await compareStat(\n // homeForm.goalDifferenceHomeOrAway,\n // awayForm.goalDifferenceHomeOrAway\n // );\n // const overallDirectnessComparison = await compareStat(\n // homeForm.directnessOverallStrength,\n // awayForm.directnessOverallStrength\n // );\n // // const hOrADirectnessComparison = await compareStat(\n // // homeForm.directnessHomeOnly,\n // // awayForm.directnessAwayOnly\n // // );\n // const accuracyComparison = await compareStat(\n // homeForm.accuracyOverallStrength,\n // awayForm.accuracyOverallStrength\n // );\n // const accuracyComparisonLast5 = await compareStat(\n // homeForm.accuracyOverallStrengthLast5,\n // awayForm.accuracyOverallStrengthLast5\n // );\n // // console.log(match.game)\n // // console.log(attackStrengthComparison);\n // // console.log(defenceStrengthComparison);\n // // console.log(possessiontrengthComparison);\n // // console.log(attackStrengthComparisonLast5);\n // // console.log(defenceStrengthComparisonLast5);\n // // console.log(attackStrengthHAComparison);\n // // console.log(defenceStrengthHAComparison);\n // // console.log(homeAwayPointAverageComparison);\n // // console.log(goalDiffHomeOrAwayComparison);\n // // // console.log(oddsComparison);\n // // console.log(overallDirectnessComparison);\n // // console.log(accuracyComparisonLast5);\n // // console.log(accuracyComparison);\n // // let calculation =\n // // attackStrengthComparison * 0 +\n // // attackStrengthComparisonLast5 * 0 +\n // // attackStrengthHAComparison * 1 +\n // // defenceStrengthComparison * 0 +\n // // defenceStrengthComparisonLast5 * 0 +\n // // defenceStrengthHAComparison * 1 +\n // // possessiontrengthComparison * 0 +\n // // possessionHAStrengthComparison * 0 +\n // // possessiontrengthComparisonLast5 * 1 +\n // // // xgToActualDiffComparison * 1 +\n // // // xgForStrengthRecentComparison * 1 +\n // // // xgAgainstStrengthRecentComparison * 1 +\n // // homeAwayPointAverageComparison * 5 +\n // // goalDiffHomeOrAwayComparison * 0 +\n // // // xgActualComparison * 0 +\n // // // xgForComparison * 1 +\n // // // xgAgainstComparison * 1 +\n // // // XGComparison * 0 +\n // // oddsComparison * 2 +\n // // // dangerousAttacksWithConverstionComparison * 0.05 +\n // // overallDirectnessComparison * 0 +\n // // // hOrADirectnessComparison * 0 +\n // // accuracyComparisonLast5 * 0 +\n // // accuracyComparison * 0;\n // // // console.log(match.game)\n // // // console.log(calculation)\n // let calculation =\n // attackStrengthComparisonLast5 * 2 +\n // attackStrengthHAComparison * 1 +\n // defenceStrengthComparisonLast5 * 2 +\n // defenceStrengthHAComparison * 1 +\n // possessionHAStrengthComparison * 1 +\n // possessiontrengthComparisonLast5 * 1 +\n // possessiontrengthComparison * 1 +\n // // xgToActualDiffComparison * 1 +\n // // xgForStrengthRecentComparison * 1 +\n // // xgAgainstStrengthRecentComparison * 1 +\n // homeAwayPointAverageComparison * 2 +\n // goalDiffHomeOrAwayComparison * 0 +\n // // xgActualComparison * 1 +\n // // xgForComparison * 1 +\n // // xgAgainstComparison * 1 +\n // oddsComparison * 0 +\n // // dangerousAttacksWithConverstionComparison * 0.05 +\n // overallDirectnessComparison * 0 +\n // accuracyComparison * 1;\n // let homeWinOutcomeProbability =\n // match.homeTeamWinPercentage + match.awayTeamLossPercentage;\n // let awayWinOutcomeProbability =\n // match.homeTeamLossPercentage + match.awayTeamWinPercentage;\n // let drawOutcomeProbability =\n // match.homeTeamDrawPercentage + match.awayTeamDrawPercentage;\n // if (\n // drawOutcomeProbability > homeWinOutcomeProbability &&\n // drawOutcomeProbability > awayWinOutcomeProbability\n // ) {\n // switch (true) {\n // case drawOutcomeProbability > 100:\n // calculation = calculation / 3;\n // break;\n // default:\n // calculation = calculation * 1;\n // break;\n // }\n // } else {\n // calculation = calculation * 1;\n // }\n // if (calculation > 0) {\n // if (\n // homeForm.lastGame === \"L\" ||\n // homeForm.last2Points < 2 ||\n // awayForm.last2Points >= 5 ||\n // match.XGdifferentialValueRaw < 0\n // ) {\n // calculation = calculation / 2;\n // }\n // } else if (calculation < 0) {\n // if (\n // awayForm.lastGame === \"L\" ||\n // awayForm.last2Points < 2 ||\n // homeForm.last2Points >= 5 ||\n // match.XGdifferentialValueRaw > 0\n // ) {\n // calculation = calculation / 2;\n // }\n // }\n // // if (homeForm.averageOddsHome !== null || awayForm.averageOddsAway !== null) {\n // // if (\n // // calculation > 0 &&\n // // homeForm.averageOddsHome < match.homeOdds &&\n // // awayForm.averageOddsAway > match.awayOdds\n // // ) {\n // // calculation = calculation / 2;\n // // } else if (\n // // calculation > 0 &&\n // // homeForm.averageOddsHome > match.homeOdds &&\n // // awayForm.averageOddsAway < match.awayOdds\n // // ) {\n // // calculation = calculation * 1.25;\n // // } else {\n // // calculation = calculation * 1;\n // // }\n // // if (\n // // calculation < 0 &&\n // // awayForm.averageOddsAway < match.awayOdds &&\n // // homeForm.averageOddsHome > match.homeOdds\n // // ) {\n // // calculation = calculation / 2;\n // // } else if (\n // // calculation < 0 &&\n // // awayForm.averageOddsAway > match.awayOdds &&\n // // homeForm.averageOddsHome < match.homeOdds\n // // ) {\n // // calculation = calculation * 1.25;\n // // } else {\n // // calculation = calculation * 1;\n // // }\n // // }\n // if (\n // calculation > 0 &&\n // homeForm.improving === true &&\n // awayForm.improving === false\n // ) {\n // console.log(homeForm);\n // calculation = calculation * 1.5;\n // } else if (\n // calculation < 0 &&\n // awayForm.improving === true &&\n // awayForm.improving === false\n // ) {\n // calculation = calculation * 1.5;\n // } else if (\n // calculation > 0 &&\n // homeForm.improving === false &&\n // awayForm.improving === true\n // ) {\n // calculation = calculation / 2;\n // } else if (\n // calculation < 0 &&\n // awayForm.improving === false &&\n // homeForm.improving === true\n // ) {\n // calculation = calculation / 2;\n // }\n // // if (\n // // (calculation < 0 && homeForm.oddsReliabilityWin < 50) ||\n // // (calculation < 0 && awayForm.oddsReliabilityWinAsUnderdog > 45)\n // // ) {\n // // calculation = calculation / 2;\n // // } else if (\n // // (calculation > 0 && awayForm.oddsReliabilityWin < 50) ||\n // // (calculation > 0 && homeForm.oddsReliabilityWinAsUnderdog > 45)\n // // ) {\n // // calculation = calculation / 2;\n // // }\n // // if (calculation < 0 && homeForm.predictabilityScore < 0.3) {\n // // calculation = calculation / 2;\n // // } else if (calculation > 0 && awayForm.predictabilityScore < 0.3) {\n // // calculation = calculation / 2;\n // // }\n // return calculation;\n}\n\nexport async function roundCustom(num, form, otherForm) {\n let wholeNumber = Math.floor(num);\n let remainder = num - wholeNumber;\n let goals;\n\n switch (true) {\n case remainder >= 0.9:\n switch (true) {\n default:\n goals = Math.round(num);\n break;\n }\n break;\n case remainder >= 0.8 && remainder < 0.9:\n switch (true) {\n case form.actualToXGDifference >= 0:\n goals = Math.ceil(num);\n break;\n case form.actualToXGDifference < 0:\n goals = Math.floor(num);\n break;\n default:\n goals = Math.round(num);\n break;\n }\n break;\n case remainder >= 0.6 && remainder < 0.8:\n switch (true) {\n case form.actualToXGDifference >= 10:\n goals = Math.ceil(num);\n break;\n case form.actualToXGDifference < 10:\n goals = Math.floor(num);\n break;\n default:\n goals = Math.round(num);\n break;\n }\n break;\n case remainder >= 0.5 && remainder < 0.6:\n switch (true) {\n case form.actualToXGDifference >= 20:\n goals = Math.ceil(num);\n break;\n case form.actualToXGDifference < 20:\n goals = Math.floor(num);\n break;\n default:\n goals = Math.round(num);\n break;\n }\n break;\n default:\n goals = Math.floor(num);\n break;\n }\n\n return goals;\n\n // if (remainder > 0.5) {\n // return Math.ceil(num);\n // } else {\n // return Math.floor(num);\n // }\n}\n\n//Calculates scores based on prior XG figures, weighted by odds\nlet i = 0;\n\nexport async function calculateScore(match, index, divider, calculate) {\n i++;\n\n let teams;\n\n if (\n calculate === true &&\n allForm.find(\n (game) =>\n game.home.teamName === match.homeTeam &&\n game.away.teamName === match.awayTeam\n )\n ) {\n teams = [\n allForm.find((game) => game.home.teamName === match.homeTeam).home,\n allForm.find((game) => game.away.teamName === match.awayTeam).away,\n ];\n } else {\n calculate = false;\n }\n\n let formHome;\n let formAway;\n\n if (calculate) {\n for (let i = 0; i < teams.length; i++) {\n if (teams[0][index].PlayedHome <= 1 || teams[1][index].PlayedAway <= 1) {\n index = 2;\n divider = 10;\n }\n\n teams[i][index].lastGame = teams[i][index].LastFiveForm[4];\n teams[i][index].previousToLastGame = teams[i][index].LastFiveForm[3];\n\n let last2 = [\n teams[i][index].lastGame,\n teams[i][index].previousToLastGame,\n ];\n\n teams[i][index].last2Points = getPointsFromLastX(last2);\n\n teams[i][index].twoGameAverage = await getPointAverage(\n teams[i][index].last2Points,\n 2\n );\n teams[i][index].threeGameAverage = await getPointAverage(\n teams[i][index].last3Points,\n 3\n );\n teams[i][index].fiveGameAverage = await getPointAverage(\n teams[i][index].last5Points,\n 5\n );\n teams[i][index].sixGameAverage = await getPointAverage(\n teams[i][index].last6Points,\n 6\n );\n teams[i][index].tenGameAverage = await getPointAverage(\n teams[i][index].last10Points,\n 10\n );\n\n if (teams[i][index].formRun) {\n teams[i][index].lastHomeOrAwayPoints = getPointsFromLastX(\n teams[i][index].formRun\n );\n\n teams[i][index].homeOrAwayAverage = await getPointAverage(\n teams[i][index].lastHomeOrAwayPoints,\n teams[i][index].formRun.length\n );\n }\n\n teams[i][0].ScoredAverage = teams[i][0].ScoredOverall / 5;\n teams[i][1].ScoredAverage = teams[i][1].ScoredOverall / 6;\n teams[i][2].ScoredAverage = teams[i][2].ScoredOverall / 10;\n\n teams[i][0].ConcededAverage = teams[i][0].ConcededOverall / 5;\n teams[i][1].ConcededAverage = teams[i][1].ConcededOverall / 6;\n teams[i][2].ConcededAverage = teams[i][2].ConcededOverall / 10;\n\n if (teams[i][1].ScoredAverage === 0) {\n teams[i][1].ScoredAverage = teams[i][index].ScoredOverall / 10;\n teams[i][1].ScoredOverall = teams[i][2].ScoredOverall / 2;\n }\n\n if (teams[i][1].ConcededAverage === 0) {\n teams[i][1].ConcededAverage = teams[i][index].ConcededOverall / 10;\n teams[i][1].ConcededOverall = teams[i][2].ConcededOverall / 2;\n }\n\n teams[i][index].ScoredAverageShortTerm = teams[i][0].ScoredOverall / 5;\n teams[i][index].ConcededAverageShortTerm =\n teams[i][0].ConcededOverall / 5;\n\n teams[i][index].longTermAverageGoals = teams[i][2].ScoredOverall / 10;\n teams[i][index].longTermAverageConceeded =\n teams[i][2].ConcededOverall / 10;\n\n let recentGoalDiff =\n teams[i][index].ScoredAverageShortTerm -\n teams[i][index].ConcededAverageShortTerm;\n let distantGoalDiff =\n teams[i][index].longTermAverageGoals -\n teams[i][index].longTermAverageConceeded;\n\n let recentDA = teams[i][0].AverageDangerousAttacksOverall;\n let distantDA = teams[i][2].AverageDangerousAttacksOverall;\n\n let recentPosession = teams[i][0].AveragePossessionOverall;\n let distantPosession = teams[i][2].AveragePossessionOverall;\n\n let recentCleanSheet = teams[i][0].CleanSheetPercentage;\n let distantCleanSheet = teams[i][2].CleanSheetPercentage;\n\n let recentFormArray = [\n recentGoalDiff,\n recentDA,\n recentPosession,\n recentCleanSheet,\n ];\n let distantFormArray = [\n distantGoalDiff,\n distantDA,\n distantPosession,\n distantCleanSheet,\n ];\n\n teams[i][index].formTrendScore = await compareFormTrend(\n recentFormArray,\n distantFormArray\n );\n\n teams[i][index].expectedGoals = parseFloat(teams[i][index].XG);\n\n teams[i][index].ScoredAverageShortAndLongTerm =\n (teams[i][index].ScoredOverall / 10 +\n teams[i][index].ScoredAverageShortTerm) /\n 2;\n\n teams[i][index].conceededAverageShortAndLongTerm =\n (teams[i][index].ConcededOverall / 10 +\n teams[i][index].ConcededAverageShortTerm) /\n 2;\n\n teams[i][index].longTermGoalDifference =\n teams[i][2].ScoredAverage - teams[i][2].ConcededAverage;\n\n teams[i][index].shortTermGoalDifference =\n teams[i][0].ScoredAverage - teams[i][0].ConcededAverage;\n\n teams[i][index].XGdifferential = await diff(\n teams[i][index].XGOverall,\n teams[i][index].XGAgainstAvgOverall\n );\n\n teams[i][index].XGdifferentialRecent = await diff(\n teams[i][0].XGOverall,\n teams[i][0].XGAgainstAvgOverall\n );\n\n teams[i][index].actualToXGDifferenceRecent = await diff(\n teams[i][index].shortTermGoalDifference,\n teams[i][index].XGdifferentialRecent\n );\n }\n\n homeOdds = match.homeOdds;\n awayOdds = match.awayOdds;\n\n formHome = teams[0][index];\n formAway = teams[1][index];\n\n // if (\n // (formHome.XGOverall - formHome.XGAgainstAvgOverall) < (formHome.last5XG - formHome.XGAgainstlast5)\n // ) {\n // formHome.improving = true;\n // } else {\n // formHome.improving = false;\n // }\n\n // if (\n // (formAway.XGOverall - formAway.XGAgainstAvgOverall) < (formAway.last5XG - formAway.XGAgainstlast5)\n // ) {\n // formAway.improving = true;\n // } else {\n // formAway.improving = false;\n // }\n\n let homeTenGameAvg = formHome.last10Points / 10;\n let awayTenGameAvg = formAway.last10Points / 10;\n\n let homeTwoGameAvg = formHome.last2Points / 2;\n let awayTwoGameAvg = formAway.last2Points / 2;\n\n let pointsDiff10 = await getPointsDifferential(\n homeTenGameAvg,\n awayTenGameAvg\n );\n\n let pointsDiff2 = await getPointsDifferential(\n homeTwoGameAvg,\n awayTwoGameAvg\n );\n\n let [last10WeightingHome, last10WeightingAway] = await getPointWeighting(\n pointsDiff10\n );\n\n let [last2WeightingHome, last2WeightingAway] = await getPointWeighting(\n pointsDiff2\n );\n\n formHome.dangerousAttackConversion =\n (formHome.ScoredAverageShortAndLongTerm /\n formHome.AverageDangerousAttacksOverall) *\n 100;\n formAway.dangerousAttackConversion =\n (formAway.ScoredAverageShortAndLongTerm /\n formAway.AverageDangerousAttacksOverall) *\n 100;\n\n [formHome.clinicalRating, formHome.clinicalScore] = await getClinicalRating(\n formHome\n );\n [formAway.clinicalRating, formAway.clinicalScore] = await getClinicalRating(\n formAway\n );\n\n let XGdifferential = await diff(\n formHome.XGdifferential,\n formAway.XGdifferential\n );\n\n formHome.teamName = match.homeTeam;\n formAway.teamName = match.awayTeam;\n\n match.XGdifferentialValue = Math.abs(XGdifferential);\n match.XGdifferentialValueRaw = parseFloat(XGdifferential);\n if (\n allLeagueResultsArrayOfObjects[match.leagueIndex].fixtures.length > 10 &&\n match.leagueID !== 7956\n ) {\n [\n formHome.predictedGoalsBasedOnHomeAv,\n formHome.predictedGoalsBasedOnAwayAv,\n formHome.allTeamGoalsBasedOnAverages,\n formHome.predictedGoalsConceededBasedOnHomeAv,\n formHome.predictedGoalsConceededBasedOnAwayAv,\n formHome.allTeamGoalsConceededBasedOnAverages,\n formHome.averageOddsHome,\n formHome.averageOddsAway,\n formHome.averageScoredLeague,\n formHome.averageConceededLeague,\n formHome.last10btts,\n formHome.last10bttsHome,\n formHome.last10bttsAway,\n match.bttsAllPercentageHome,\n match.bttsPercentageHomeHome,\n match.bttsPercentageHomeAway,\n formHome.forAndAgainstRollingAvHomeOrAway,\n formHome.forAndAgainstRollingAv,\n ] = await getPastLeagueResults(match.homeTeam, match, \"home\", formHome);\n\n [\n formAway.predictedGoalsBasedOnHomeAv,\n formAway.predictedGoalsBasedOnAwayAv,\n formAway.allTeamGoalsBasedOnAverages,\n formAway.predictedGoalsConceededBasedOnHomeAv,\n formAway.predictedGoalsConceededBasedOnAwayAv,\n formAway.allTeamGoalsConceededBasedOnAverages,\n formAway.averageOddsHome,\n formAway.averageOddsAway,\n formAway.averageScoredLeague,\n formAway.averageConceededLeague,\n formAway.last10btts,\n formAway.last10bttsHome,\n formAway.last10bttsAway,\n match.bttsAllPercentageAway,\n match.bttsPercentageAwayHome,\n match.bttsPercentageAwayAway,\n formAway.forAndAgainstRollingAvHomeOrAway,\n formAway.forAndAgainstRollingAv,\n ] = await getPastLeagueResults(match.awayTeam, match, \"away\", formAway);\n } else {\n formHome.completeData = false;\n formHome.predictedGoalsBasedOnHomeAv = formHome.ScoredAverage;\n formHome.predictedGoalsBasedOnAwayAv = formHome.ConcededAverage;\n formHome.allTeamGoalsBasedOnAverages = formHome.ScoredAverage;\n formHome.forAndAgainstRollingAv = {\n goalsFor: formHome.ScoredAverage,\n goalsAgainst: formHome.ConcededAverage,\n };\n formHome.forAndAgainstRollingAvHomeOrAway = {\n goalsFor: formHome.ScoredAverage,\n goalsAgainst: formHome.ConcededAverage,\n };\n formHome.predictedGoalsConceededBasedOnHomeAv = formHome.ConcededAverage;\n formHome.predictedGoalsConceededBasedOnAwayAv = formHome.ConcededAverage;\n formHome.allTeamGoalsConceededBasedOnAverages = formHome.ConcededAverage;\n formHome.averageOddsHome = null;\n formHome.averageOddsAway = null;\n formHome.averageScoredLeague = null;\n formHome.averageConceededLeague = null;\n formHome.goalDifference =\n formHome.ScoredOverall - formHome.ConcededOverall;\n formHome.goalDifferenceHomeOrAway =\n formHome.ScoredOverall - formHome.ConcededOverall;\n formHome.last10btts = null;\n formHome.last10bttsHome = null;\n formHome.last10bttsAway = null;\n formHome.allTeamResults = [];\n formHome.resultsAll = [];\n formHome.resultsHome = [];\n formHome.resultsAway = [];\n match.bttsAllPercentageHome = \"\";\n match.bttsPercentageHomeHome = \"\";\n match.bttsPercentageHomeAway = \"\";\n formAway.completeData = false;\n formAway.predictedGoalsBasedOnHomeAv = formAway.ScoredAverage;\n formAway.predictedGoalsBasedOnAwayAv = formAway.ConcededAverage;\n formAway.allTeamGoalsBasedOnAverages = formAway.ScoredAverage;\n formAway.forAndAgainstRollingAv = {\n goalsFor: formAway.ScoredAverage,\n goalsAgainst: formAway.ConcededAverage,\n };\n formAway.forAndAgainstRollingAvHomeOrAway = {\n goalsFor: formAway.ScoredAverage,\n goalsAgainst: formAway.ConcededAverage,\n };\n formAway.predictedGoalsConceededBasedOnHomeAv = formAway.ConcededAverage;\n formAway.predictedGoalsConceededBasedOnAwayAv = formAway.ConcededAverage;\n formAway.allTeamGoalsConceededBasedOnAverages = formAway.ConcededAverage;\n formAway.averageOddsHome = null;\n formAway.averageOddsAway = null;\n formAway.averageScoredLeague = null;\n formAway.averageConceededLeague = null;\n formAway.goalDifference =\n formAway.ScoredOverall - formAway.ConcededOverall;\n formAway.goalDifferenceHomeOrAway =\n formAway.ScoredOverall - formAway.ConcededOverall;\n\n formAway.last10btts = null;\n formAway.last10bttsHome = null;\n formAway.last10bttsAway = null;\n formAway.allTeamResults = [];\n formAway.resultsAll = [];\n formAway.resultsHome = [];\n formAway.resultsAway = [];\n match.bttsAllPercentageAway = \"\";\n match.bttsPercentageAwayHome = \"\";\n match.bttsPercentageAwayAway = \"\";\n }\n\n if (\n typeof formHome.homeTeamHomePositionRaw === \"number\" &&\n typeof formAway.awayTeamAwayPositionRaw === \"number\"\n ) {\n formHome.homePositionHomeOnly = parseFloat(\n formHome.homeTeamHomePositionRaw\n );\n formAway.awayPositionAwayOnly = parseFloat(\n formAway.awayTeamAwayPositionRaw\n );\n formHome.homePosition = parseFloat(formHome.homeRawPosition);\n formAway.awayPosition = parseFloat(formAway.awayRawPosition);\n } else {\n formHome.homePositionHomeOnly = \"N/A\";\n formAway.awayPositionAwayOnly = \"N/A\";\n formHome.homePosition = \"N/A\";\n formAway.awayPosition = \"N/A\";\n }\n\n if (formHome.last10Goals && formAway.last10Goals !== 0) {\n if (\n formHome.last5Goals - formHome.last5GoalsConceeded >\n formHome.last10Goals - formHome.last10GoalsConceeded\n ) {\n formHome.improving = true;\n } else {\n formHome.improving = false;\n }\n\n if (\n formAway.last5Goals - formAway.last5GoalsConceeded >\n formAway.last10Goals - formAway.last10GoalsConceeded\n ) {\n formAway.improving = true;\n } else {\n formAway.improving = false;\n }\n }\n\n formHome.AttackingPotency = (formHome.XG / formHome.AttacksHome) * 100;\n formAway.AttackingPotency = (formAway.XG / formAway.AttacksAverage) * 100;\n\n let teamComparisonScore;\n\n const attackingMetricsHome = {\n \"Average Dangerous Attacks\": formHome.AverageDangerousAttacksOverall,\n \"Average Shots\": formHome.AverageShots,\n \"Average Shots On Target\": formHome.AverageShotsOnTargetOverall ? formHome.AverageShotsOnTargetOverall : formHome.AverageShotsOnTarget,\n \"Average Expected Goals\": formHome.XGOverall ? formHome.XGOverall : formHome.expectedGoals,\n \"Recent XG\": formHome.XGlast5 ? formHome.XGlast5 : formHome.XGOverall,\n \"Average Goals\": formHome.avgScored ? formHome.avgScored : formHome.ScoredAverage,\n Corners: formHome.AverageCorners ? formHome.AverageCorners : formHome.CornersAverage,\n };\n\n const attackingMetricsHomeLast5 = {\n \"Average Dangerous Attacks\": formHome.avDALast5 ? formHome.avDALast5 : formHome.AverageDangerousAttacksOverall,\n \"Average Shots\": formHome.avShotsLast5 ? formHome.avShotsLast5 : formHome.AverageShots,\n \"Average Shots On Target\": formHome.avSOTLast5 ? formHome.avSOTLast5 : formHome.AverageShotsOnTarget,\n \"Average Expected Goals\": formHome.XGlast5 ? formHome.XGlast5 : formHome.XGOverall,\n \"Recent XG\": formHome.XGlast5 ? formHome.XGlast5 : formHome.XGOverall,\n \"Average Goals\": formHome.avScoredLast5 ? formHome.avScoredLast5 : formHome.ScoredAverage,\n Corners: formHome.avCornersLast5 ? formHome.avCornersLast5 : formHome.CornersAverage,\n };\n\n const attackingMetricsHomeOnly = {\n \"Average Dangerous Attacks\": formHome.avgDangerousAttacksHome ? formHome.avgDangerousAttacksHome : formHome.AverageDangerousAttacksOverall,\n \"Average Shots\": formHome.avgShotsHome ? formHome.avgShotsHome : formHome.AverageShots,\n \"Average Shots On Target\": formHome.avgShotsOnTargetHome ? formHome.avgShotsOnTargetHome : formHome.AverageShotsOnTarget,\n \"Average Expected Goals\": formHome.avgXGScoredHome ? formHome.avgXGScoredHome : formHome.XGOverall,\n \"Recent XG\": formHome.last5XGAvgForHome ? formHome.last5XGAvgForHome : formHome.XGOverall,\n \"Average Goals\": formHome.avgScoredHome ? formHome.avgScoredHome : formHome.ScoredAverage,\n Corners: formHome.cornersAvHome ? formHome.cornersAvHome : formHome.CornersAverage,\n };\n\n const attackingMetricsAwayOnly = {\n \"Average Dangerous Attacks\": formAway.avgDangerousAttacksAway ? formAway.avgDangerousAttacksAway : formAway.AverageDangerousAttacksOverall,\n \"Average Shots\": formAway.avgShotsAway ? formAway.avgShotsAway : formAway.AverageShots,\n \"Average Shots On Target\": formAway.avgShotsOnTargetAway ? formAway.avgShotsOnTargetAway : formAway.AverageShotsOnTarget,\n \"Average Expected Goals\": formAway.avgXGScoredAway ? formAway.avgXGScoredAway : formAway.XGOverall,\n \"Recent XG\": formAway.last5XGAvgForAway ? formAway.last5XGAvgForAway : formAway.XGOverall,\n \"Average Goals\": formAway.avgScoredAway ? formAway.avgScoredAway : formAway.ScoredAverage,\n Corners: formAway.cornersAvAway ? formAway.cornersAvAway : formAway.CornersAverage,\n };\n\n const attackingMetricsAway = {\n \"Average Dangerous Attacks\": formAway.AverageDangerousAttacksOverall,\n \"Average Shots\": formAway.AverageShots,\n \"Average Shots On Target\": formAway.AverageShotsOnTargetOverall ? formAway.AverageShotsOnTargetOverall : formAway.AverageShotsOnTarget,\n \"Average Expected Goals\": formAway.XGOverall ? formAway.XGOverall : formAway.expectedGoals,\n \"Recent XG\": formAway.XGlast5 ? formAway.XGlast5 : formAway.XGOverall,\n \"Average Goals\": formAway.avgScored ? formAway.avgScored : formAway.ScoredAverage,\n Corners: formAway.AverageCorners ? formAway.AverageCorners : formAway.CornersAverage,\n };\n\n const attackingMetricsAwayLast5 = {\n \"Average Dangerous Attacks\": formAway.avDALast5 ? formAway.avDALast5 : formAway.AverageDangerousAttacksOverall,\n \"Average Shots\": formAway.avShotsLast5 ? formAway.avShotsLast5 : formAway.AverageShots,\n \"Average Shots On Target\": formAway.avSOTLast5 ? formAway.avSOTLast5 : formAway.AverageShotsOnTarget,\n \"Average Expected Goals\": formAway.XGlast5 ? formAway.XGlast5 : formAway.XGOverall,\n \"Recent XG\": formAway.XGlast5 ? formAway.XGlast5 : formAway.XGOverall,\n \"Average Goals\": formAway.avScoredLast5 ? formAway.avScoredLast5 : formAway.ScoredAverage,\n Corners: formAway.avCornersLast5 ? formAway.avCornersLast5 : formAway.CornersAverage,\n };\n\n const defensiveMetricsHome = {\n \"Average XG Against\": formHome.XGAgainstAvgOverall ? formHome.XGAgainstAvgOverall : formHome.XGAgainstAvgOverall,\n \"Recent XG Against\": formHome.XGAgainstlast5\n ? formHome.XGAgainstlast5\n : formHome.XGAgainstAvgOverall,\n \"Average Goals Against\": formHome.avgConceeded ? formHome.avgConceeded : formHome.ConcededAverage,\n \"Average SOT Against\": formHome.AverageShotsOnTargetAgainstOverall ? formHome.AverageShotsOnTargetAgainstOverall : 5,\n };\n\n const defensiveMetricsHomeLast5 = {\n \"Average XG Against\": formHome.XGAgainstlast5 ? formHome.XGAgainstlast5 : formHome.XGAgainstAvgOverall,\n \"Recent XG Against\": formHome.avXGAgainstLast5 ? formHome.avXGAgainstLast5 : formHome.XGAgainstAvgOverall,\n \"Average Goals Against\": formHome.avConceededLast5 ? formHome.avConceededLast5 : formHome.ConcededAverage,\n \"Average SOT Against\": formHome.avSOTAgainstLast5 ? formHome.avSOTAgainstLast5 : 5,\n };\n\n const defensiveMetricsAway = {\n \"Average XG Against\": formAway.XGAgainstAvgOverall ? formAway.XGAgainstAvgOverall : formAway.XGAgainstAvgOverall,\n \"Recent XG Against\": formAway.XGAgainstlast5\n ? formAway.XGAgainstlast5\n : formAway.XGAgainstAvgOverall,\n \"Average Goals Against\": formAway.avgConceeded ? formAway.avgConceeded : formAway.ConcededAverage,\n \"Average SOT Against\": formAway.AverageShotsOnTargetAgainstOverall ? formAway.AverageShotsOnTargetAgainstOverall : 5,\n };\n\n const defensiveMetricsAwayLast5 = {\n \"Average XG Against\": formAway.XGAgainstlast5 ? formAway.XGAgainstlast5 : formAway.XGAgainstAvgOverall,\n \"Recent XG Against\": formAway.avXGAgainstLast5 ? formAway.avXGAgainstLast5 : formAway.XGAgainstAvgOverall,\n \"Average Goals Against\": formAway.avConceededLast5 ? formAway.avConceededLast5 : formAway.ConcededAverage,\n \"Average SOT Against\": formAway.avSOTAgainstLast5 ? formAway.avSOTAgainstLast5 : 5,\n };\n\n const defensiveMetricsHomeOnly = {\n \"Average XG Against\": formHome.avgXGConceededHome ? formHome.avgXGConceededHome : formHome.XGAgainstAvgOverall,\n \"Recent XG Against\": formHome.last5XGAvgAgainstHome ? formHome.last5XGAvgAgainstHome : formHome.XGAgainstAvgOverall,\n \"Average Goals Against\": formHome.teamConceededAvgHomeOnly ? formHome.teamConceededAvgHomeOnly : formHome.ConcededAverage,\n \"Average SOT Against\": formHome.avgShotsOnTargetAgainstHome ? formHome.avgShotsOnTargetAgainstHome : 5,\n };\n\n const defensiveMetricsAwayOnly = {\n \"Average XG Against\": formAway.avgXGConceededAway ? formAway.avgXGConceededAway : formAway.XGAgainstAvgOverall,\n \"Recent XG Against\": formAway.last5XGAvgAgainstAway ? formAway.last5XGAvgAgainstAway : formAway.XGAgainstAvgOverall,\n \"Average Goals Against\": formAway.teamConceededAvgAwayOnly ? formAway.teamConceededAvgAwayOnly : formAway.ConcededAverage,\n \"Average SOT Against\": formAway.avgShotsOnTargetAgainstAway ? formAway.avgShotsOnTargetAgainstAway : 5,\n };\n\n formHome.attackingMetrics = attackingMetricsHome;\n formHome.defensiveMetrics = defensiveMetricsHome;\n formAway.attackingMetrics = attackingMetricsAway;\n formAway.defensiveMetrics = defensiveMetricsAway;\n\n formHome.attackingStrength = await calculateAttackingStrength(\n attackingMetricsHome\n );\n\n formHome.attackingStrengthScoreGeneration =\n await calculateAttackingStrength(attackingMetricsHome);\n\n formHome.attackingStrengthLast5 = await calculateAttackingStrength(\n attackingMetricsHomeLast5\n );\n\n formHome.attackingStrengthHomeOnly = await calculateAttackingStrength(\n attackingMetricsHomeOnly\n );\n\n formAway.attackingStrength = await calculateAttackingStrength(\n attackingMetricsAway\n );\n\n formAway.attackingStrengthLast5 = await calculateAttackingStrength(\n attackingMetricsAwayLast5\n );\n\n formAway.attackingStrengthAwayOnly = await calculateAttackingStrength(\n attackingMetricsAwayOnly\n );\n\n formHome.defensiveStrength = await calculateDefensiveStrength(\n defensiveMetricsHome\n );\n\n formHome.defensiveStrengthScoreGeneration =\n await calculateDefensiveStrength(defensiveMetricsHome, 1);\n\n formHome.defensiveStrengthLast5 = await calculateDefensiveStrength(\n defensiveMetricsHomeLast5\n );\n\n formHome.defensiveStrengthScoreGenerationLast5 =\n await calculateDefensiveStrength(defensiveMetricsHomeLast5, 1);\n\n formHome.defensiveStrengthHomeOnly = await calculateDefensiveStrength(\n defensiveMetricsHomeOnly\n );\n\n formHome.defensiveStrengthScoreGenerationHomeOnly =\n await calculateDefensiveStrength(defensiveMetricsHomeOnly, 1);\n\n formAway.defensiveStrength = await calculateDefensiveStrength(\n defensiveMetricsAway\n );\n\n formAway.defensiveStrengthScoreGeneration =\n await calculateDefensiveStrength(defensiveMetricsAway, 1);\n\n formAway.defensiveStrengthLast5 = await calculateDefensiveStrength(\n defensiveMetricsAwayLast5\n );\n\n formAway.defensiveStrengthScoreGenerationLast5 =\n await calculateDefensiveStrength(defensiveMetricsAwayLast5, 1);\n\n formAway.defensiveStrengthAwayOnly = await calculateDefensiveStrength(\n defensiveMetricsAwayOnly\n );\n\n formAway.defensiveStrengthScoreGenerationAwayOnly =\n await calculateDefensiveStrength(defensiveMetricsAwayOnly, 1);\n\n formHome.possessionStrength = await calculateMetricStrength(\n \"averagePossession\",\n formHome.AveragePossessionOverall ? formHome.AveragePossessionOverall : formHome.AveragePossessionOverall\n );\n\n formHome.possessionStrengthLast5 = await calculateMetricStrength(\n \"averagePossession\",\n formHome.avPosessionLast5 ? formHome.avPosessionLast5 : formHome.AveragePossessionOverall\n );\n\n\n formHome.possessionStrengthHomeOnly = await calculateMetricStrength(\n \"averagePossession\",\n formHome.avgPossessionHome ? formHome.avgPossessionHome : formHome.AveragePossessionOverall\n );\n\n formAway.possessionStrengthLast5 = await calculateMetricStrength(\n \"averagePossession\",\n formAway.avPosessionLast5 ? formAway.avPosessionLast5 : formAway.AveragePossessionOverall\n );\n\n formAway.possessionStrength = await calculateMetricStrength(\n \"averagePossession\",\n formAway.AveragePossessionOverall ? formAway.AveragePossessionOverall : formAway.AveragePossessionOverall\n );\n\n formAway.possessionStrengthAwayOnly = await calculateMetricStrength(\n \"averagePossession\",\n formAway.avgPossessionAway ? formAway.avgPossessionAway : formAway.AveragePossessionOverall\n );\n\n formHome.directnessOverall =\n (formHome.AverageShots / formHome.AveragePossessionOverall) * 10;\n\n formHome.directnessOverallLast5 =\n (formHome.avShotsLast5 / formHome.avPosessionLast5) * 10;\n\n formAway.directnessOverallLast5 =\n (formAway.avShotsLast5 / formAway.avPosessionLast5) * 10;\n\n formHome.directnessHomeOnly =\n (formHome.avgShotsHome / formHome.avgPossessionHome) * 10;\n\n formAway.directnessOverall =\n (formAway.AverageShots / formAway.AveragePossessionOverall) * 10;\n\n formAway.directnessAwayOnly =\n (formAway.avgShotsAway / formAway.avgPossessionAway) * 10;\n\n formHome.directnessOverallStrength = await calculateMetricStrength(\n \"directnessOverall\",\n formHome.directnessOverall\n );\n\n formHome.directnessOverallStrengthLast5 = await calculateMetricStrength(\n \"directnessOverall\",\n formHome.directnessOverallLast5\n );\n\n formHome.directnessHomeStrength = await calculateMetricStrength(\n \"directnessOverall\",\n formHome.directnessHomeOnly\n );\n\n formAway.directnessOverallStrength = await calculateMetricStrength(\n \"directnessOverall\",\n formAway.directnessOverall\n );\n\n formAway.directnessOverallStrengthLast5 = await calculateMetricStrength(\n \"directnessOverall\",\n formAway.directnessOverallLast5\n );\n\n formAway.directnessAwayStrength = await calculateMetricStrength(\n \"directnessOverall\",\n formAway.directnessAwayOnly\n );\n\n formHome.shootingAccuracy =\n (formHome.AverageShotsOnTargetOverall ? formHome.AverageShotsOnTargetOverall : formHome.AverageShotsOnTarget / formHome.avgShots) *\n formHome.AverageShotsOnTargetOverall ? formHome.AverageShotsOnTargetOverall : formHome.AverageShotsOnTarget;\n\n formHome.shootingAccuracyLast5 =\n (formHome.avSOTLast5 / formHome.avShotsLast5) * formHome.avSOTLast5;\n\n formAway.shootingAccuracyLast5 =\n (formAway.avSOTLast5 / formAway.avShotsLast5) * formAway.avSOTLast5;\n\n formHome.shootingAccuracyHomeOnly =\n (formHome.avgShotsOnTargetHome / formHome.avgShotsHome) *\n formHome.avgShotsOnTargetHome;\n\n formAway.shootingAccuracy =\n (formAway.AverageShotsOnTargetOverall ? formAway.AverageShotsOnTargetOverall : formAway.AverageShotsOnTarget / formAway.avgShots) *\n formAway.AverageShotsOnTargetOverall ? formAway.AverageShotsOnTargetOverall : formAway.AverageShotsOnTarget;\n\n formAway.shootingAccuracyAwayOnly =\n (formAway.avgShotsOnTargetAway / formAway.avgShotsAway) *\n formAway.avgShotsOnTargetAway;\n\n formHome.accuracyOverallStrength = await calculateMetricStrength(\n \"accuracyOverall\",\n formHome.shootingAccuracy\n );\n\n formHome.accuracyOverallStrengthLast5 = await calculateMetricStrength(\n \"accuracyOverall\",\n formHome.shootingAccuracyLast5\n );\n\n formHome.accuracyHomeStrength = await calculateMetricStrength(\n \"accuracyOverall\",\n formHome.shootingAccuracyHomeOnly\n );\n\n formAway.accuracyOverallStrength = await calculateMetricStrength(\n \"accuracyOverall\",\n formAway.shootingAccuracy\n );\n\n formAway.accuracyOverallStrengthLast5 = await calculateMetricStrength(\n \"accuracyOverall\",\n formAway.shootingAccuracyLast5\n );\n\n formAway.accuracyAwayStrength = await calculateMetricStrength(\n \"accuracyOverall\",\n formAway.shootingAccuracyAwayOnly\n );\n\n formHome.xgForStrength = await calculateMetricStrength(\n \"xgFor\",\n formHome.XGOverall\n );\n\n formHome.xgForStrengthLast5 = await calculateMetricStrength(\n \"xgFor\",\n formHome.XGlast5\n );\n\n formHome.xgForStrengthHomeOnly = await calculateMetricStrength(\n \"xgFor\",\n formHome.avgXGScoredHome\n );\n\n formHome.xgAgainstStrength = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formHome.XGAgainstAvgOverall\n );\n\n formHome.xgAgainstStrengthLast5 = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formHome.XGAgainstlast5\n );\n\n formHome.xgAgainstStrengthHomeOnly = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formHome.avgXGConceededHome\n );\n\n formAway.xgForStrength = await calculateMetricStrength(\n \"xgFor\",\n formAway.XGOverall\n );\n\n formAway.xgForStrengthLast5 = await calculateMetricStrength(\n \"xgFor\",\n formAway.last5XGAvgFor\n );\n\n formAway.xgForStrengthLast5 = await calculateMetricStrength(\n \"xgFor\",\n formAway.XGlast5\n );\n\n formAway.xgForStrengthAwayOnly = await calculateMetricStrength(\n \"xgFor\",\n formAway.avgXGScoredAway\n );\n\n formAway.xgAgainstStrength = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formAway.XGAgainstAvgOverall\n );\n\n formAway.xgAgainstStrengthLast5 = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formAway.XGAgainstlast5\n );\n\n formAway.xgAgainstStrengthAwayOnly = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formAway.avgXGConceededAway\n );\n\n formHome.actualToXGDifference = parseInt(\n await diff(formHome.XGDiffNonAverage, formHome.goalDifference)\n );\n\n formAway.actualToXGDifference = parseInt(\n await diff(formAway.XGDiffNonAverage, formAway.goalDifference)\n );\n\n // teamComparisonScore = await compareTeams(formHome, formAway, match);\n\n [formHome.teamGoalsCalc, formAway.teamGoalsCalc] = await generateGoals(\n formHome,\n formAway,\n match\n );\n\n console.log(formHome.teamGoalsCalc);\n console.log(formAway.teamGoalsCalc);\n\n // teamComparisonScore = teamComparisonScore * 0.3;\n // LEAVE\n\n // if (teamComparisonScore > 0.45) {\n // teamComparisonScore = 0.45;\n // } else if (teamComparisonScore < -0.45) {\n // teamComparisonScore = -0.45;\n // }\n\n // if (teamComparisonScore < 0) {\n // formHome.teamStrengthWeighting = 1 + teamComparisonScore / 1;\n // formAway.teamStrengthWeighting = 1 - teamComparisonScore / 1;\n // } else if (teamComparisonScore >= 0) {\n // formHome.teamStrengthWeighting = 1 + teamComparisonScore / 1;\n // formAway.teamStrengthWeighting = 1 - teamComparisonScore / 1;\n // }\n\n // teamComparisonScore = 0;\n\n // match.teamComparisonScore = teamComparisonScore.toFixed(2);\n // match.goalWeighting = 1 + parseFloat(match.teamComparisonScore)\n\n let team1Metrics = {\n weighting: formHome.teamGoalsCalc,\n // Add other relevant metrics here\n };\n\n let team2Metrics = {\n weighting: formAway.teamGoalsCalc,\n // Add other relevant metrics here\n };\n\n // pass arrays of league goals and conceeded\n let scorePredictions;\n let scorePredictionsHA;\n let scorePredictionsRecent;\n\n if (\n formHome.allConceededArrayHome !== undefined &&\n formAway.allConceededArrayAway !== undefined\n ) {\n scorePredictionsRecent = await predictScore(\n formHome.allGoalsArrayHomeRecent,\n formHome.allConceededArrayHomeRecent,\n formAway.allGoalsArrayAwayRecent,\n formAway.allConceededArrayAwayRecent,\n team1Metrics,\n team2Metrics,\n match.game\n );\n scorePredictionsHA = await predictScore(\n formHome.allGoalsArrayHomeOnly,\n formHome.allConceededArrayHomeOnly,\n formAway.allGoalsArrayAwayOnly,\n formAway.allConceededArrayAwayOnly,\n team1Metrics,\n team2Metrics,\n match.game\n );\n scorePredictions = await predictScore(\n formHome.allGoalsArrayHome,\n formHome.allConceededArrayHome,\n formAway.allGoalsArrayAway,\n formAway.allConceededArrayAway,\n team1Metrics,\n team2Metrics,\n match.game\n );\n }\n\n let finalHomeGoals;\n let finalAwayGoals;\n\n const homeGoalDiff =\n formHome.ScoredAverageShortAndLongTerm -\n formHome.conceededAverageShortAndLongTerm;\n const awayGoalDiff =\n formAway.ScoredAverageShortAndLongTerm -\n formAway.conceededAverageShortAndLongTerm;\n\n formHome.goalsDifferential =\n parseFloat(await diff(homeGoalDiff, awayGoalDiff)) / 1;\n formAway.goalsDifferential =\n parseFloat(await diff(awayGoalDiff, homeGoalDiff)) / 1;\n\n formHome.rollingAverageGoalsDifferential = parseFloat(\n formHome.allTeamGoalsBasedOnAverages -\n formHome.allTeamGoalsConceededBasedOnAverages\n );\n formAway.rollingAverageGoalsDifferential = parseFloat(\n formAway.allTeamGoalsBasedOnAverages -\n formAway.allTeamGoalsConceededBasedOnAverages\n );\n\n match.GoalsInGamesAverageHome =\n formHome.avScoredLast5 + formHome.avConceededLast5;\n\n match.GoalsInGamesAverageAway =\n formAway.avScoredLast5 + formAway.avConceededLast5;\n\n let factorOneHome;\n let factorOneAway;\n\n factorOneHome =\n // homeLeagueOrAllFormAverageGoals * 1 +\n // formHome.last5Goals * 0.5 +\n // formAway.last5GoalsConceeded * 0.5 +\n (formHome.forAndAgainstRollingAvHomeOrAway.goalsFor * 1 +\n formAway.forAndAgainstRollingAvHomeOrAway.goalsAgainst * 1 +\n formHome.forAndAgainstRollingAv.goalsFor * 1 +\n formAway.forAndAgainstRollingAv.goalsAgainst * 1 +\n formHome.allTeamGoalsBasedOnAverages * 0 +\n formAway.allTeamGoalsConceededBasedOnAverages * 0 +\n formHome.XGOverall * 1 +\n formAway.XGAgainstAvgOverall * 1 +\n last10WeightingHome * 0 +\n last2WeightingHome * 0) /\n 6;\n\n factorOneAway =\n // awayLeagueOrAllFormAverageGoals * 1 +\n // formAway.last5Goals * 0.5 +\n // formHome.last5GoalsConceeded * 0.5 +\n (formAway.forAndAgainstRollingAvHomeOrAway.goalsFor * 1 +\n formHome.forAndAgainstRollingAvHomeOrAway.goalsAgainst * 1 +\n formAway.forAndAgainstRollingAv.goalsFor * 1 +\n formHome.forAndAgainstRollingAv.goalsAgainst * 1 +\n formAway.allTeamGoalsBasedOnAverages * 0 +\n formHome.allTeamGoalsConceededBasedOnAverages * 0 +\n formAway.XGOverall * 1 +\n formHome.XGAgainstAvgOverall * 1 +\n last10WeightingAway * 0 +\n last2WeightingAway * 0) /\n 6;\n\n let factorTwoHome;\n let factorTwoAway;\n\n if (\n scorePredictions !== undefined &&\n scorePredictions[0].probability !== 1\n ) {\n factorTwoHome =\n (scorePredictions[0].team1Score +\n scorePredictionsRecent[0].team1Score +\n scorePredictionsHA[0].team1Score * 0.5) /\n 2.5;\n factorTwoAway =\n (scorePredictions[0].team2Score +\n scorePredictionsRecent[0].team2Score +\n scorePredictionsHA[0].team2Score * 0.5) /\n 2.5;\n } else {\n factorTwoHome = factorOneHome;\n factorTwoAway = factorOneAway;\n }\n\n let homeComparisonWeighting;\n let awayComparisonWeighting;\n match.scoreDiff = await diff(factorOneHome, factorOneAway);\n\n if (teamComparisonScore > 0) {\n homeComparisonWeighting = 1 + Math.abs(teamComparisonScore);\n awayComparisonWeighting = 1 + -Math.abs(teamComparisonScore);\n } else if (teamComparisonScore < 0) {\n homeComparisonWeighting = 1 + -Math.abs(teamComparisonScore);\n awayComparisonWeighting = 1 + Math.abs(teamComparisonScore);\n } else {\n homeComparisonWeighting = 1;\n awayComparisonWeighting = 1;\n }\n\n console.log(match.game);\n console.log(match.simlarGameResultsHome);\n console.log(match.simlarGameResultsAway);\n\n // let experimentalHomeGoals = factorOneHome + formHome.teamGoalsCalc;\n let experimentalHomeGoals = factorTwoHome + formHome.teamGoalsCalc;\n\n // (factorOneHome * homeComparisonWeighting +\n // (formHome.teamGoalsCalc * 2) +\n // factorTwoHome) /\n // 4;\n // (formHome.forAndAgainstRollingAvHomeOrAway.goalsFor + formAway.forAndAgainstRollingAvHomeOrAway.goalsAgainst) / 2\n\n // let experimentalAwayGoals = factorOneAway + formAway.teamGoalsCalc;\n let experimentalAwayGoals = factorTwoAway + formAway.teamGoalsCalc;\n\n // (factorOneAway * awayComparisonWeighting +\n // (formAway.teamGoalsCalc * 2) +\n // factorTwoAway) /\n // 4;\n // (formAway.forAndAgainstRollingAvHomeOrAway.goalsFor + formHome.forAndAgainstRollingAvHomeOrAway.goalsAgainst) / 2\n\n let rawFinalHomeGoals = experimentalHomeGoals;\n let rawFinalAwayGoals = experimentalAwayGoals;\n\n // if(rawFinalHomeGoals < 0){\n // rawFinalHomeGoals = 0\n // }\n\n // if(rawFinalAwayGoals < 0){\n // rawFinalAwayGoals = 0\n // }\n\n match.rawFinalHomeGoals = rawFinalHomeGoals;\n match.rawFinalAwayGoals = rawFinalAwayGoals;\n\n // if (rawFinalHomeGoals < 1 && rawFinalHomeGoals > 0 && rawFinalAwayGoals < 1 && rawFinalAwayGoals > 0) {\n // if (\n // formHome.CleanSheetPercentage < 45 &&\n // formAway.CleanSheetPercentage < 45\n // ) {\n // finalHomeGoals = Math.ceil(rawFinalHomeGoals);\n // finalAwayGoals = Math.ceil(rawFinalAwayGoals);\n // } else {\n // finalHomeGoals = Math.floor(rawFinalHomeGoals);\n // finalAwayGoals = Math.floor(rawFinalAwayGoals);\n // }\n // }\n // else if (rawFinalHomeGoals < 0 && rawFinalAwayGoals < 0) {\n // if (\n // formHome.CleanSheetPercentage < 45 &&\n // formAway.CleanSheetPercentage < 45\n // ) {\n // finalHomeGoals = 1;\n // finalAwayGoals = 1;\n // } else {\n // finalHomeGoals = Math.floor(rawFinalHomeGoals);\n // finalAwayGoals = Math.floor(rawFinalAwayGoals);\n // }\n // }\n // else {\n // finalHomeGoals = Math.floor(rawFinalHomeGoals);\n // finalAwayGoals = Math.floor(rawFinalAwayGoals);\n // }\n\n if (rawFinalHomeGoals < 0) {\n rawFinalHomeGoals = 0;\n }\n\n if (rawFinalAwayGoals < 0) {\n rawFinalAwayGoals = 0;\n }\n\n finalHomeGoals = Math.floor(rawFinalHomeGoals);\n finalAwayGoals = Math.floor(rawFinalAwayGoals);\n\n // if (finalHomeGoals > formHome.avgScored + 2) {\n // finalHomeGoals = Math.round((finalHomeGoals + formHome.avgScored) / 2);\n // }\n\n // if (finalAwayGoals > formAway.avgScored + 2) {\n // finalAwayGoals = Math.round((finalAwayGoals + formAway.avgScored) / 2);\n // }\n\n // if (finalAwayGoals < 0) {\n // let difference = Math.abs(\n // parseFloat((await diff(0, finalAwayGoals)) / 2)\n // );\n // rawFinalHomeGoals = rawFinalHomeGoals + difference;\n // finalAwayGoals = 0;\n // }\n\n // if (finalHomeGoals < 0) {\n // let difference = Math.abs(\n // parseFloat((await diff(0, finalHomeGoals)) / 2)\n // );\n // rawFinalAwayGoals = rawFinalAwayGoals + difference;\n // finalHomeGoals = 0;\n // }\n\n console.log(match.omit);\n\n if (match.status !== \"suspended\") {\n if (finalHomeGoals > finalAwayGoals) {\n match.prediction = \"homeWin\";\n homePredictions = homePredictions + 1;\n if (\n formHome.lastGame === \"L\" ||\n formHome.last2Points < 3 ||\n formAway.last2Points > 4 ||\n formHome.oddsReliabilityWin < 50\n ) {\n match.includeInMultis = false;\n } else {\n match.includeInMultis = true;\n }\n } else if (finalAwayGoals > finalHomeGoals) {\n match.prediction = \"awayWin\";\n awayPredictions = awayPredictions + 1;\n if (\n formAway.lastGame === \"L\" ||\n formAway.last2Points < 3 ||\n formHome.last2Points > 4 ||\n formAway.oddsReliabilityWin < 50\n ) {\n match.includeInMultis = false;\n } else {\n match.includeInMultis = true;\n }\n } else if (finalHomeGoals === finalAwayGoals) {\n match.prediction = \"draw\";\n drawPredictions = drawPredictions + 1;\n }\n }\n\n console.log(match.game);\n console.log(finalHomeGoals);\n console.log(finalAwayGoals);\n console.log(match.prediction);\n console.log(match.outcome);\n\n console.log(`drawPredictions: ${drawPredictions}`);\n\n if (\n (XGdifferential > 1 && match.prediction === \"homeWin\") ||\n (XGdifferential < -1.6 && match.prediction === \"awayWin\")\n ) {\n match.XGdifferential = true;\n } else {\n match.XGdifferential = false;\n }\n\n if (\n (pointsDiff10 > 1.2 && match.prediction === \"homeWin\") ||\n (pointsDiff10 < -1.2 && match.prediction === \"awayWin\")\n ) {\n match.pointsDifferential = true;\n match.pointsDifferentialValue = Math.abs(pointsDiff10);\n match.pointsDifferentialValueRaw = parseFloat(pointsDiff10);\n } else {\n match.pointsDiff10 = false;\n match.pointsDifferentialValue = Math.abs(pointsDiff10);\n match.pointsDifferentialValueRaw = parseFloat(pointsDiff10);\n }\n\n let rollingGoalDiffDifferential = await diff(\n formHome.rollingAverageGoalsDifferential,\n formAway.rollingAverageGoalsDifferential\n );\n\n if (\n (rollingGoalDiffDifferential > 1.5 && match.prediction === \"homeWin\") ||\n (rollingGoalDiffDifferential < -1.5 && match.prediction === \"awayWin\")\n ) {\n match.rollingGoalDiff = true;\n match.rollingGoalDiffValue = rollingGoalDiffDifferential;\n } else {\n match.rollingGoalDiff = false;\n match.rollingGoalDiffValue = rollingGoalDiffDifferential;\n }\n\n let dangerousAttacksDifferential = await diff(\n formHome.AverageDangerousAttacksOverall,\n formAway.AverageDangerousAttacksOverall\n );\n\n if (\n (dangerousAttacksDifferential > 20 && match.prediction === \"homeWin\") ||\n (dangerousAttacksDifferential < -20 && match.prediction === \"awayWin\")\n ) {\n match.dangerousAttacksDiff = true;\n match.dangerousAttacksDiffValue = dangerousAttacksDifferential;\n } else {\n match.dangerousAttacksDiff = false;\n match.dangerousAttacksDiffValue = dangerousAttacksDifferential;\n }\n\n switch (true) {\n case match.status !== \"complete\":\n break;\n case match.homeGoals > match.awayGoals:\n match.winner = match.homeTeam;\n match.outcome = \"homeWin\";\n homeOutcomes = homeOutcomes + 1;\n allWinOutcomes = allWinOutcomes + 1;\n allLossOutcomes = allLossOutcomes + 1;\n sumStatDAWin = sumStatDAWin += formHome.AverageDangerousAttacksOverall;\n sumStatDALoss = sumStatDALoss +=\n formAway.AverageDangerousAttacksOverall;\n sumStatPossessionWin = sumStatPossessionWin +=\n formHome.AveragePossessionOverall;\n sumStatPossessionLoss = sumStatPossessionLoss +=\n formAway.AveragePossessionOverall;\n sumStatPPGLast10Win = sumStatPPGLast10Win += formHome.last10Points / 10;\n sumStatPPGLast10Loss = sumStatPPGLast10Loss +=\n formAway.last10Points / 10;\n sumStatSOTWin = sumStatSOTWin += formHome.AverageShotsOnTargetOverall;\n sumStatSOTLoss = sumStatSOTLoss += formAway.AverageShotsOnTargetOverall;\n sumOddsWin = sumOddsWin += homeOdds;\n sumOddsLoss = sumOddsLoss += awayOdds;\n sumXGForWin = sumXGForWin += formHome.XGOverall;\n sumXGForLoss = sumXGForLoss += formAway.XGOverall;\n sumXGAgainstWin = sumXGAgainstWin += formHome.XGAgainstAvgOverall;\n sumXGAgainstLoss = sumXGAgainstLoss += formAway.XGAgainstAvgOverall;\n break;\n case match.homeGoals === match.awayGoals:\n match.winner = \"draw\";\n match.outcome = \"draw\";\n allOutcomes = allOutcomes + 1;\n allDrawOutcomes = allDrawOutcomes + 1;\n break;\n case match.homeGoals < match.awayGoals:\n match.winner = match.awayTeam;\n match.outcome = \"awayWin\";\n allOutcomes = allOutcomes + 1;\n awayOutcomes = awayOutcomes + 1;\n allWinOutcomes = allWinOutcomes + 1;\n allLossOutcomes = allLossOutcomes + 1;\n sumStatDAWin = sumStatDAWin += formAway.AverageDangerousAttacksOverall;\n sumStatDALoss = sumStatDALoss +=\n formHome.AverageDangerousAttacksOverall;\n sumStatPossessionWin = sumStatPossessionWin +=\n formAway.AveragePossessionOverall;\n sumStatPossessionLoss = sumStatPossessionLoss +=\n formHome.AveragePossessionOverall;\n sumStatPPGLast10Win = sumStatPPGLast10Win += formAway.last10Points / 10;\n sumStatPPGLast10Loss = sumStatPPGLast10Loss +=\n formHome.last10Points / 10;\n sumStatSOTWin = sumStatSOTWin += formAway.AverageShotsOnTargetOverall;\n sumStatSOTLoss = sumStatSOTLoss += formHome.AverageShotsOnTargetOverall;\n sumOddsWin = sumOddsWin += awayOdds;\n sumOddsLoss = sumOddsLoss += homeOdds;\n sumXGForWin = sumXGForWin += formAway.XGOverall;\n sumXGForLoss = sumXGForLoss += formHome.XGOverall;\n sumXGAgainstWin = sumXGAgainstWin += formAway.XGAgainstAvgOverall;\n sumXGAgainstLoss = sumXGAgainstLoss += formHome.XGAgainstAvgOverall;\n break;\n default:\n break;\n }\n\n console.log(`allDrawOutcomes: ${allDrawOutcomes}`);\n\n if (match.status === \"complete\") {\n if (match.prediction === match.outcome) {\n match.predictionOutcome = \"Won\";\n winAmount = winAmount + 1;\n if (match.outcome === \"draw\") {\n }\n } else if (match.prediction !== match.outcome) {\n match.predictionOutcome = \"Lost\";\n lossAmount = lossAmount + 1;\n if (match.outcome === \"draw\") {\n }\n }\n }\n\n if (match.status === \"complete\") {\n if (match.homeGoals + match.awayGoals > 2) {\n match.over25PredictionOutcome = \"Won\";\n } else {\n match.over25PredictionOutcome = \"Lost\";\n }\n }\n\n if (\n match.status === \"complete\" &&\n match.homeGoals > 0 &&\n match.awayGoals > 0\n ) {\n match.bttsOutcome = \"bttsWon\";\n } else {\n match.bttsOutcome = \"bttsLost\";\n }\n\n match.formHome = formHome;\n match.formAway = formAway;\n\n // formObjectHome = formHome;\n // formObjectAway = formAway;\n\n // console.log(formObjectHome)\n // console.log(formObjectAway)\n\n let total = parseInt(finalHomeGoals + finalAwayGoals);\n totalGoals = totalGoals + total;\n\n let total2 = parseInt(match.homeGoals + match.awayGoals);\n totalGoals2 = totalGoals2 + total2;\n\n numberOfGames = numberOfGames + 1;\n\n if (finalHomeGoals < 0) {\n finalHomeGoals = 0;\n }\n\n if (finalAwayGoals < 0) {\n finalAwayGoals = 0;\n }\n\n if (match.status === \"suspended\") {\n finalHomeGoals = \"P\";\n finalAwayGoals = \"P\";\n }\n\n if (\n finalHomeGoals > finalAwayGoals &&\n (match.homeOdds < rangeValue[0] || match.homeOdds > rangeValue[1])\n ) {\n match.omit = true;\n } else if (\n finalAwayGoals > finalHomeGoals &&\n (match.awayOdds < rangeValue[0] || match.awayOdds > rangeValue[1])\n ) {\n match.omit = true;\n } else if (\n finalHomeGoals === finalAwayGoals &&\n (match.drawOdds < rangeValue[0] || match.drawOdds > rangeValue[1])\n ) {\n match.omit = true;\n }\n\n const last10PointDiffHomePerspective = Math.abs(\n formHome.last10Points - formAway.last10Points\n );\n\n const last10PointDiffAwayPerspective = Math.abs(\n formAway.last10Points - formHome.last10Points\n );\n\n const XGDiffBetweenTeamsHomePerspective = Math.abs(\n formHome.XGDiffNonAverage - formAway.XGDiffNonAverage\n );\n const XGDiffBetweenTeamsAwayPerspective = Math.abs(\n formAway.XGDiffNonAverage - formHome.XGDiffNonAverage\n );\n\n match.goalDiffHomeOrAwayComparison =\n parseFloat(formHome.goalDifferenceHomeOrAway) -\n parseFloat(formAway.goalDifferenceHomeOrAway);\n\n match.goalDifferenceComparison =\n parseFloat(formHome.goalDifference) - parseFloat(formAway.goalDifference);\n\n switch (true) {\n case finalHomeGoals > finalAwayGoals:\n if (minimumXG !== 0 && XGDiffBetweenTeamsHomePerspective < minimumXG) {\n match.omit = true;\n }\n if (\n minimumLast10 !== 0 &&\n last10PointDiffHomePerspective < minimumLast10\n ) {\n match.omit = true;\n }\n if (\n minimumGDHorA !== 0 &&\n match.goalDiffHomeOrAwayComparison < minimumGDHorA\n ) {\n match.omit = true;\n }\n if (minimumGD !== 0 && match.goalDifferenceComparison < minimumGD) {\n match.omit = true;\n }\n break;\n case finalHomeGoals < finalAwayGoals:\n if (minimumXG !== 0 && XGDiffBetweenTeamsAwayPerspective < minimumXG) {\n match.omit = true;\n }\n if (\n minimumLast10 !== 0 &&\n last10PointDiffAwayPerspective < minimumLast10\n ) {\n match.omit = true;\n }\n if (\n minimumGDHorA !== 0 &&\n Math.abs(match.goalDiffHomeOrAwayComparison) < minimumGDHorA\n ) {\n match.omit = true;\n }\n if (\n minimumGD !== 0 &&\n Math.abs(match.goalDifferenceComparison) < minimumGD\n ) {\n match.omit = true;\n }\n break;\n case finalHomeGoals === finalAwayGoals:\n if (\n minimumXG !== 0 &&\n Math.abs(XGDiffBetweenTeamsHomePerspective) < minimumXG\n ) {\n match.omit = true;\n }\n if (\n minimumLast10 !== 0 &&\n last10PointDiffHomePerspective < minimumLast10\n ) {\n match.omit = true;\n }\n if (\n minimumGDHorA !== 0 &&\n Math.abs(match.goalDiffHomeOrAwayComparison) < minimumGDHorA\n ) {\n match.omit = true;\n }\n if (\n minimumGD !== 0 &&\n Math.abs(match.goalDifferenceComparison) < minimumGD\n ) {\n match.omit = true;\n }\n break;\n default:\n break;\n }\n\n if (\n match.game_week < 3\n // match.omit === true\n // match.game_week < 3 &&\n ) {\n finalHomeGoals = \"-\";\n finalAwayGoals = \"-\";\n match.status = \"notEnoughData\";\n }\n\n return [\n finalHomeGoals,\n finalAwayGoals,\n rawFinalHomeGoals,\n rawFinalAwayGoals,\n ];\n } else {\n finalHomeGoals = \"\";\n finalAwayGoals = \"\";\n rawFinalHomeGoals = \"\";\n rawFinalAwayGoals = \"\";\n match.status = \"notEnoughData\";\n match.profit = 0;\n }\n\n return [finalHomeGoals, finalAwayGoals, rawFinalHomeGoals, rawFinalAwayGoals];\n}\n\nasync function getSuccessMeasure(fixtures) {\n let sumProfit = 0;\n let investment = 0;\n let exactScores = 0;\n let successCount = 0;\n let profit = 0;\n let netProfit = 0;\n\n // await fetch(`${process.env.REACT_APP_EXPRESS_SERVER}tips/${dateStamp}`, {\n // method: \"PUT\",\n // headers: {\n // Accept: \"application/json\",\n // \"Content-Type\": \"application/json\",\n // },\n // body: JSON.stringify(matches)\n // })\n\n for (let i = 0; i < fixtures.length; i++) {\n if (\n fixtures[i].status === \"complete\" &&\n fixtures[i].hasOwnProperty(\"prediction\") &&\n fixtures[i].omit !== true\n ) {\n sumProfit = sumProfit + fixtures[i].profit;\n investment = investment + 1;\n netProfit = (sumProfit - investment).toFixed(2);\n profit = parseFloat(netProfit);\n if (fixtures[i].exactScore === true) {\n exactScores = exactScores + 1;\n }\n if (fixtures[i].predictionOutcome === \"Won\") {\n successCount = successCount + 1;\n }\n }\n }\n\n totalInvestment = totalInvestment + investment;\n totalProfit = totalProfit + profit;\n let ROI = (profit / investment) * 100;\n totalROI = (totalProfit / totalInvestment) * 100;\n console.log(`Total Profit : ${totalProfit}`);\n console.log(`Total Investment : ${totalInvestment}`);\n console.log(`Total ROI : ${totalROI}`);\n var operand = ROI >= 0 ? \"+\" : \"\";\n var operandTwo = totalROI >= 0 ? \"+\" : \"\";\n let exactScoreHitRate = ((exactScores / investment) * 100).toFixed(1);\n let successRate = ((successCount / investment) * 100).toFixed(1);\n\n if (investment > 0) {\n ReactDOM.render(\n \n \n

{`Correct W/D/W predictions: ${successCount} (${successRate}%)`}

\n

{`Exact scores predicted: ${exactScores} (${exactScoreHitRate}%)`}

\n \n
,\n document.getElementById(\"successMeasure2\")\n );\n } else {\n return;\n }\n}\n\nexport var tips = [];\nexport var allTips = [];\nlet allTipsSorted = [];\nvar newArray = [];\nvar bestBets = [];\nvar price;\nvar Over25Tips = [];\nvar XGDiffTips = [];\nvar rollingDiffTips = [];\nvar dangerousAttacksDiffTips = [];\nvar pointsDiffTips = [];\nvar combinations;\nvar exoticArray = [];\nvar gamesInExotic;\nvar minimumExotic;\nvar exoticStake;\nvar exoticString;\nvar bttsArray = [];\nvar accumulatedOdds = 1;\nlet predictions = [];\n\nexport async function getNewTips(array) {\n // allTips = [];\n newArray = [];\n accumulatedOdds = 1;\n\n if (array.length > 1 && incrementValue > 0) {\n array.forEach((tip) => {\n if (\n array.indexOf(tip) < incrementValue\n // tip.goalDifferential >= incrementValue && tip.comparisonScore > 0\n ) {\n newArray.push(tip);\n accumulatedOdds = parseFloat(accumulatedOdds) * parseFloat(tip.rawOdds);\n }\n });\n }\n await renderTips(newArray);\n}\n\nexport async function getScorePrediction(day, mocked) {\n let mock = mocked;\n clicked = true;\n tips = [];\n bestBets = [];\n // price = 0\n bttsArray = [];\n Over25Tips = [];\n XGDiffTips = [];\n pointsDiffTips = [];\n rollingDiffTips = [];\n dangerousAttacksDiffTips = [];\n allTips = [];\n\n let index = 2;\n let divider = 10;\n\n ReactDOM.render(
, document.getElementById(\"GeneratePredictions\"));\n\n await Promise.all(\n matches.map(async (match) => {\n // if there are no stored predictions, calculate them based on live data\n if (match) {\n switch (true) {\n case match.status === \"canceled\":\n match.goalsA = \"P\";\n match.goalsB = \"P\";\n match.completeData = false\n await calculateScore(match, index, divider, false);\n break;\n case match.leagueID === 6935 ||\n match.leagueID === 7061 ||\n (match.game_week < 3 && match.game_week !== 0):\n match.goalsA = \"x\";\n match.goalsB = \"x\";\n match.completeData = false\n await calculateScore(match, index, divider, true);\n break;\n default:\n [\n match.goalsA,\n match.goalsB,\n match.unroundedGoalsA,\n match.unroundedGoalsB,\n match.completeData = true\n ] = await calculateScore(match, index, divider, true);\n break;\n }\n } else {\n [\n match.goalsA,\n match.goalsB,\n match.unroundedGoalsA,\n match.unroundedGoalsB,\n ] = await calculateScore(match, index, divider, true);\n }\n\n await getBTTSPotential(\n match,\n match.goalsA,\n match.goalsB,\n match.unroundedGoalsA,\n match.unroundedGoalsB\n );\n\n let predictionObject;\n let Over25PredictionObject;\n let XGPredictionObject;\n let pointsDiffObject;\n let rollingDiffObject;\n let dangerousAttacksDiffObject;\n\n if (match.status === \"complete\" && match.prediction) {\n match.outcomeSymbol =\n match.predictionOutcome === \"Won\" ? \"\\u2714\" : \"\\u2718\";\n match.over25PredictionOutcomeSymbol =\n match.over25PredictionOutcome === \"Won\" ? \"\\u2714\" : \"\\u2718\";\n match.bttsOutcomeSymbol =\n match.bttsOutcome === \"bttsWon\" ? \"\\u2714\" : \"\\u2718\";\n } else {\n match.outcomeSymbol = \"\";\n match.over25PredictionOutcomeSymbol = \"\";\n match.bttsOutcomeSymbol = \"\";\n }\n\n if (\n match.unroundedGoalsA - match.unroundedGoalsB > 0.65 &&\n match.homeOdds !== 0 &&\n match.fractionHome !== \"N/A\" &&\n match.includeInMultis !== false &&\n match.omit !== true\n ) {\n if (\n match.prediction !== \"draw\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\" &&\n match.status !== \"notEnoughData\" &&\n match.homeOdds < 3\n ) {\n predictionObject = {\n team: `${match.homeTeam} to win`,\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n odds: match.fractionHome,\n rawOdds: match.homeOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsA, match.unroundedGoalsB)\n ),\n experimentalCalc: (\n (match.unroundedGoalsA - match.unroundedGoalsB) *\n Math.abs(match.teamComparisonScore)\n ).toFixed(2),\n XGdifferentialValue: parseFloat(match.XGdifferentialValue),\n };\n if (\n predictionObject.rawOdds >= 1.25 &&\n match.formHome.clinicalRating !== \"awful\"\n ) {\n allTips.push(predictionObject);\n\n if (\n match.unroundedGoalsA - match.unroundedGoalsB >\n incrementValue\n ) {\n bestBets.push(predictionObject);\n }\n }\n }\n } else if (\n match.unroundedGoalsB - match.unroundedGoalsA > 1.75 &&\n match.awayOdds !== 0 &&\n match.fractionAway !== \"N/A\" &&\n match.includeInMultis !== false &&\n match.omit !== true\n ) {\n if (\n match.prediction !== \"draw\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\" &&\n match.status !== \"notEnoughData\" &&\n match.awayOdds < 3.5\n ) {\n predictionObject = {\n team: `${match.awayTeam} to win`,\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n rawOdds: match.awayOdds,\n odds: match.fractionAway,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n goalDifferential:\n parseFloat(\n await diff(match.unroundedGoalsB, match.unroundedGoalsA)\n ) - 1,\n experimentalCalc: (\n (match.unroundedGoalsB - match.unroundedGoalsA) *\n Math.abs(match.teamComparisonScore)\n ).toFixed(2),\n XGdifferentialValue: parseFloat(match.XGdifferentialValue),\n };\n if (\n predictionObject.rawOdds >= 1.25 &&\n match.formAway.clinicalRating !== \"awful\"\n ) {\n allTips.push(predictionObject);\n if (match.unroundedGoalsB - match.unroundedGoalsA > 2) {\n bestBets.push(predictionObject);\n }\n }\n }\n }\n\n if (\n match.btts === true &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\" &&\n match.status !== \"notEnoughData\"\n ) {\n bttsArray.push(match);\n }\n if (\n match.unroundedGoalsA + match.unroundedGoalsB > 4 &&\n match.goalsA + match.goalsB > 2 &&\n match.GoalsInGamesAverageHome > 3 &&\n match.GoalsInGamesAverageAway > 3\n ) {\n Over25PredictionObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: match.homeTeam,\n decimalOdds: match.homeDoubleChance,\n rawOdds: match.over25Odds,\n odds: match.over25Odds,\n comparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.over25PredictionOutcomeSymbol,\n doubleChanceOutcome: match.over25PredictionOutcome,\n goalTotalUnrounded: match.unroundedGoalsA + match.unroundedGoalsB,\n };\n Over25Tips.push(Over25PredictionObject);\n }\n\n if (\n match.XGdifferential === true &&\n match.prediction === \"homeWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n XGPredictionObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.homeTeam} to win`,\n rawOdds: match.homeOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.homeTeam} to win`,\n odds: match.fractionHome,\n otherTeam: match.awayTeam,\n XGdifferentialValue: match.XGdifferentialValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsA, match.unroundedGoalsB)\n ),\n };\n XGDiffTips.push(XGPredictionObject);\n } else if (\n match.XGdifferential === true &&\n match.prediction === \"awayWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n XGPredictionObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.awayTeam} to win`,\n rawOdds: match.awayOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.awayTeam} to win`,\n odds: match.fractionAway,\n otherTeam: match.homeTeam,\n XGdifferentialValue: match.XGdifferentialValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsB, match.unroundedGoalsA)\n ),\n };\n XGDiffTips.push(XGPredictionObject);\n }\n\n if (\n match.pointsDifferential === true &&\n match.prediction === \"homeWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n pointsDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.homeTeam} to win`,\n rawOdds: match.homeOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.homeTeam} to win`,\n odds: match.fractionHome,\n otherTeam: match.awayTeam,\n pointsDifferentialValue: match.pointsDifferentialValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsA, match.unroundedGoalsB)\n ),\n };\n pointsDiffTips.push(pointsDiffObject);\n } else if (\n match.XGdifferential === true &&\n match.prediction === \"awayWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n pointsDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.awayTeam} to win`,\n rawOdds: match.awayOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.awayTeam} to win`,\n odds: match.fractionAway,\n otherTeam: match.homeTeam,\n pointsDifferentialValue: match.pointsDifferentialValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsB, match.unroundedGoalsA)\n ),\n };\n pointsDiffTips.push(pointsDiffObject);\n }\n\n if (\n match.rollingGoalDiff === true &&\n match.prediction === \"homeWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n rollingDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.homeTeam} to win`,\n rawOdds: match.homeOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.homeTeam} to win`,\n odds: match.fractionHome,\n otherTeam: match.awayTeam,\n rollingGoalDiffValue: match.rollingGoalDiffValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsA, match.unroundedGoalsB)\n ),\n };\n rollingDiffTips.push(rollingDiffObject);\n } else if (\n match.XGdifferential === true &&\n match.prediction === \"awayWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n rollingDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.awayTeam} to win`,\n rawOdds: match.awayOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.awayTeam} to win`,\n odds: match.fractionAway,\n otherTeam: match.homeTeam,\n rollingGoalDiffValue: match.rollingGoalDiffValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsB, match.unroundedGoalsA)\n ),\n };\n rollingDiffTips.push(rollingDiffObject);\n }\n\n if (\n match.dangerousAttacksDiff === true &&\n match.prediction === \"homeWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n dangerousAttacksDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.homeTeam} to win`,\n rawOdds: match.homeOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.homeTeam} to win`,\n odds: match.fractionHome,\n otherTeam: match.awayTeam,\n rollingGoalDiffValue: match.rollingGoalDiffValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsA, match.unroundedGoalsB)\n ),\n };\n dangerousAttacksDiffTips.push(dangerousAttacksDiffObject);\n } else if (\n match.XGdifferential === true &&\n match.prediction === \"awayWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n dangerousAttacksDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.awayTeam} to win`,\n rawOdds: match.awayOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.awayTeam} to win`,\n odds: match.fractionAway,\n otherTeam: match.homeTeam,\n rollingGoalDiffValue: match.rollingGoalDiffValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsB, match.unroundedGoalsA)\n ),\n };\n dangerousAttacksDiffTips.push(dangerousAttacksDiffObject);\n }\n\n predictions.push(match);\n })\n );\n ReactDOM.render(\n ,\n document.getElementById(\"FixtureContainer\")\n );\n await getSuccessMeasure(matches);\n await getMultis();\n await getNewTips(allTipsSorted);\n\n // await renderTips();\n}\n\nasync function getMultis() {\n allTipsSorted = allTips.sort(function (a, b) {\n return b.goalDifferential - a.goalDifferential;\n });\n\n bestBets.sort(function (a, b) {\n if (a.goalDifferential === b.goalDifferential) {\n return b.comparisonScore - a.comparisonScore;\n } else {\n return b.goalDifferential > a.goalDifferential ? 1 : -1;\n }\n });\n\n bttsArray.sort(function (a, b) {\n return b.combinedBTTS - a.combinedBTTS;\n });\n\n Over25Tips.sort(function (a, b) {\n return b.goalTotalUnrounded - a.goalTotalUnrounded;\n });\n\n XGDiffTips.sort(function (a, b) {\n return Math.abs(b.XGdifferentialValue) - Math.abs(a.XGdifferentialValue);\n });\n\n pointsDiffTips.sort(function (a, b) {\n return (\n Math.abs(b.pointsDifferentialValue) - Math.abs(a.pointsDifferentialValue)\n );\n });\n\n rollingDiffTips.sort(function (a, b) {\n return Math.abs(b.rollingGoalDiffValue) - Math.abs(a.rollingGoalDiffValue);\n });\n\n dangerousAttacksDiffTips.sort(function (a, b) {\n return (\n Math.abs(b.dangerousAttacksDiffValue) -\n Math.abs(a.dangerousAttacksDiffValue)\n );\n });\n\n exoticArray = [];\n gamesInExotic = 0;\n exoticStake = 0;\n exoticString = \"\";\n\n switch (true) {\n case allTips.length >= 10:\n for (let i = 0; i < 10; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 10;\n minimumExotic = 8;\n exoticStake = 0.1;\n exoticString = \"45 8-folds, 10 9-folds and 1 10-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case allTips.length >= 9:\n for (let i = 0; i < 9; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 9;\n minimumExotic = 7;\n exoticStake = 0.1;\n exoticString = \"36 7-folds, 9 8-folds and 1 9-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case allTips.length >= 8:\n for (let i = 0; i < 8; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 8;\n minimumExotic = 6;\n exoticStake = 0.1;\n exoticString = \"28 6-folds, 8 7-folds and 1 8-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case allTips.length >= 7:\n for (let i = 0; i < 7; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 7;\n minimumExotic = 6;\n exoticStake = 1;\n exoticString = \"7 6-folds and 1 7-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case allTips.length >= 6:\n for (let i = 0; i < 6; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 6;\n minimumExotic = 5;\n exoticStake = 1;\n exoticString = \"6 5-folds and 1 6-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case allTips.length >= 5:\n for (let i = 0; i < 5; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 5;\n minimumExotic = 4;\n exoticStake = 1;\n exoticString = \"5 4-folds and 1 5-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case Over25Tips.length >= 4:\n for (let i = 0; i < 4; i++) {\n let game = Over25Tips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 4;\n minimumExotic = 3;\n exoticStake = 1;\n exoticString = \"4 3-folds and 1 4-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n default:\n break;\n }\n}\n\nexport function getAccumulatorPrice(priceArray) {\n var result = 1;\n for (var i = 0; i < priceArray.length; i++)\n result = result * priceArray[i].rawOdds;\n\n return result;\n}\n\nexport function getCoverBetMaxReturns(priceArray, minAccSize, stake) {\n var total = 0;\n combinations = 0;\n\n for (var i = minAccSize; i <= priceArray.length; i++) {\n var perms = getUniquePermutations(priceArray, i);\n combinations = combinations + perms.length;\n\n for (var j = 0; j < perms.length; j++)\n total += getAccumulatorPrice(perms[j]) * stake;\n }\n return parseFloat(total.toFixed(2));\n}\n\nfunction getUniquePermutations(arr, permLength) {\n if (arr.length <= permLength) return [arr];\n\n var permutations = [];\n var newArr = [];\n\n newArr = arr.slice(0);\n\n for (var i = 0; i < arr.length; i++) {\n newArr = arr.slice(0);\n newArr.splice(i, 1);\n permutations = twoDimArrayUnion(\n permutations,\n getUniquePermutations(newArr, permLength)\n );\n }\n return permutations;\n}\n\nfunction twoDimArrayUnion(arr1, arr2) {\n for (var i = 0; i < arr2.length; i++) {\n var duplicate = false;\n\n for (var j = 0; j < arr1.length; j++)\n if (arr1[j].length === arr2[i].length)\n for (var k = 0; k < arr1[j].length; k++)\n if (arr1[j][k] !== arr2[i][k]) break;\n else if (k === arr1[j].length - 1) duplicate = true;\n\n if (!duplicate) arr1.push(arr2[i]);\n }\n\n return arr1;\n}\n\nfunction NewlineText(props) {\n const text = props.text;\n const newText = text.split(\"\\n\").map((str) =>

{str}

);\n\n return newText;\n}\n\nasync function renderTips() {\n if (newArray.length > 0) {\n ReactDOM.render(\n
\n \n \n \n
\n Add or remove a selection using the buttons below. Predictions\n are ordered by confidence in the outcome.\n
\n {newArray.map((tip) => (\n
  • \n
    \n {tip.team}: {tip.odds}{\" \"}\n {tip.outcomeSymbol}\n
    \n
    {tip.game}
    \n
  • \n ))}\n
    {`Accumulator odds ~ : ${\n Math.round(accumulatedOdds) - 1\n }/1`}
    \n \n }\n />\n
    \n
    ,\n document.getElementById(\"bestPredictions\")\n );\n } else {\n ReactDOM.render(\n
    \n \n \n \n

    \n No games fit the criteria\n

    \n
    {`Accumulator odds ~ : ${\n Math.round(accumulatedOdds) - 1\n }/1`}
    \n \n }\n />\n
    \n
    ,\n document.getElementById(\"bestPredictions\")\n );\n }\n\n if (exoticArray.length > 4) {\n ReactDOM.render(\n
    \n \n \n

    \n \n {`Potential winnings: ${price.toFixed(2)} units`}\n

    \n {exoticArray.map((tip) => (\n
  • \n {tip.team}: {tip.odds}{\" \"}\n {tip.outcomeSymbol}\n
    {tip.game}
    \n
  • \n ))}\n \n }\n />\n
    \n
    ,\n document.getElementById(\"exoticOfTheDay\")\n );\n } else {\n ReactDOM.render(\n
    \n \n \n

    \n Not enough games for this feature\n

    \n \n }\n />\n
    \n
    ,\n document.getElementById(\"exoticOfTheDay\")\n );\n }\n\n if (Over25Tips.length > 0) {\n ReactDOM.render(\n
    \n \n \n

    Over 2.5 goals

    \n {Over25Tips.map((tip) => (\n
  • \n {tip.game} - Odds: {tip.odds}{\" \"}\n \n {tip.outcomeSymbol}\n \n
  • \n ))}\n \n }\n />\n
    \n
    ,\n document.getElementById(\"longShots\")\n );\n } else {\n ReactDOM.render(\n
    \n \n \n

    No games fit the criteria

    \n \n }\n />\n
    \n
    ,\n document.getElementById(\"longShots\")\n );\n }\n\n if (bttsArray.length > 0) {\n ReactDOM.render(\n
    \n \n \n

    Games with highest chance of BTTS

    \n {bttsArray.map((game) => (\n
  • \n {`${game.game} odds: ${game.bttsFraction}`}{\" \"}\n \n {game.bttsOutcomeSymbol}\n \n
  • \n ))}\n \n }\n />\n
    \n
    ,\n document.getElementById(\"BTTS\")\n );\n } else {\n ReactDOM.render(\n
    \n \n \n

    No games fit the criteria

    \n \n }\n />\n
    \n
    ,\n document.getElementById(\"BTTS\")\n );\n }\n\n ReactDOM.render(\n
    \n 0 ? (\n
      \n

      Games with greatest XG Differentials

      \n {XGDiffTips.map((tip) => (\n
    • \n {tip.game} | {tip.prediction} {tip.odds}{\" \"}\n {tip.outcomeSymbol}\n
    • \n ))}\n
    \n ) : (\n
      \n

      Games with greatest XG Differentials

      \n
    • \n Sorry, no games fit this criteria today\n
    • \n
    \n )\n }\n element2={\n pointsDiffTips.length > 0 ? (\n
      \n

      \n Games with greatest points per game differentials (last 10)\n

      \n {pointsDiffTips.map((game) => (\n
    • \n {game.game} | {game.prediction} {game.odds}{\" \"}\n {game.outcomeSymbol}\n
    • \n ))}\n
    \n ) : (\n
      \n

      \n Games with greatest points per game differentials (last 10)\n

      \n
    • \n Sorry, no games fit this criteria today\n
    • \n
    \n )\n }\n element3={\n rollingDiffTips.length > 0 ? (\n
      \n

      \n Games with greatest rolling goal difference differentials\n

      \n {rollingDiffTips.map((game) => (\n
    • \n {game.game} | {game.prediction} {game.odds}{\" \"}\n {game.outcomeSymbol}\n
    • \n ))}\n
    \n ) : (\n
      \n

      \n Games with greatest rolling goal difference differentials\n

      \n
    • \n Sorry, no games fit this criteria today\n
    • \n
    \n )\n }\n element4={\n dangerousAttacksDiffTips.length > 0 ? (\n
      \n

      \n Games with greatest average dangerous attacks differentials\n

      \n {dangerousAttacksDiffTips.map((game) => (\n
    • \n {game.game} | {game.prediction} {game.odds}{\" \"}\n {game.outcomeSymbol}\n
    • \n ))}\n
    \n ) : (\n
      \n

      \n Games with greatest average dangerous attacks differentials\n

      \n
    • \n Sorry, no games fit this criteria today\n
    • \n
    \n )\n }\n element5={\n
    \n

    Help with running costs

    \n

    \n Monthly costs are rising and each donation helps keep XG\n Tipping free to use\n

    \n \n
    \n }\n >\n }\n >\n
    \n

    Filters selected:

    \n
      \n
    • Minimum goal difference spread: {minimumGD}
    • \n
    • \n Minimum goal difference spread (home or away only): {minimumGDHorA}\n
    • \n
    • Minimum XG difference spread: {minimumXG}
    • \n
    • Minimum PPG difference spread: {minimumLast10}
    • \n
    • \n Odds range: {rangeValue[0]} - {rangeValue[1]}\n
    • \n
    \n
    \n
    ,\n document.getElementById(\"insights\")\n );\n}\n","import React, { useState } from \"react\";\nimport { withStyles } from \"@material-ui/core/styles\";\nimport Table from \"@material-ui/core/Table\";\nimport TableBody from \"@material-ui/core/TableBody\";\nimport TableCell from \"@material-ui/core/TableCell\";\nimport TableContainer from \"@material-ui/core/TableContainer\";\nimport TableHead from \"@material-ui/core/TableHead\";\nimport TableRow from \"@material-ui/core/TableRow\";\nimport Paper from \"@material-ui/core/Paper\";\nimport Collapsable from \"../components/CollapsableElement\";\n// import TeamOfTheWeek from \"../components/TeamOfTheWeek\";\n// import TeamOfTheSeason from \"../components/TeamOfTheSeason\";\n\nexport var toggleState = false;\nexport var setIsOff = false;\n\nconst upArrow = \"\\u{25B2}\";\n\nconst StyledTableCell2 = withStyles((theme) => ({\n head: {\n backgroundColor: \"rgba(226, 226, 226, 1)\",\n color: \"white\",\n padding: \"0.35em\",\n paddingTop: \"0.75em\",\n paddingBottom: \"0.75em\",\n textAlign: \"left\",\n fontSize: \"1.9em\",\n fontFamily: \"inherit\",\n // border: \"none\",\n margin: \"none\",\n },\n body: {\n fontSize: \"1.9em\",\n textAlign: \"left\",\n fontFamily: \"inherit\",\n padding: \"0.5em\",\n paddingTop: \"0.75em\",\n paddingBottom: \"0.75em\",\n // border: \"none\",\n margin: \"none\",\n color: \"#030061\",\n },\n}))(TableCell);\n\nconst StyledTableCell = withStyles((theme) => ({\n head: {\n backgroundColor: \"white\",\n color: \"#030061\",\n padding: \"0.5em\",\n paddingTop: \"1em\",\n paddingBottom: \"1em\",\n textAlign: \"center\",\n fontSize: \"1.9em\",\n fontFamily: \"inherit\",\n // border: \"none\",\n margin: \"none\",\n },\n body: {\n // backgroundColor: \"#030061\",\n fontSize: \"1.9em\",\n textAlign: \"center\",\n fontFamily: \"inherit\",\n padding: \"0.35em\",\n paddingTop: \"1em\",\n paddingBottom: \"1em\",\n // border: \"none\",\n margin: \"none\",\n color: \"#030061\",\n },\n}))(TableCell);\n\nconst StyledTableRow = withStyles((theme) => ({\n root: {\n \"&:nth-of-type(odd)\": {\n backgroundColor: \"#rgba(226, 226, 226, 0.424)\",\n textAlign: \"center\",\n },\n \"&:nth-of-type(even)\": {\n backgroundColor: \"#rgba(226, 226, 226, 1)\",\n textAlign: \"center\",\n },\n },\n}))(TableRow);\n\nfunction styleForm(formIndicator) {\n let className;\n if (formIndicator === \"W\") {\n className = \"winLeague\";\n } else if (formIndicator === \"D\") {\n className = \"drawLeague\";\n } else if (formIndicator === \"L\") {\n className = \"lossLeague\";\n }\n return className;\n}\n\nexport default function LeagueTable(props) {\n [toggleState, setIsOff] = useState(false);\n\n let rows = props.Teams.map((team, i) => (\n \n \n {`${i + 1}`}\n \n \n {`${team.Name}`}\n \n \n {`${team.Played}`}\n \n \n {`${team.Wins}`}\n \n \n {`${team.Draws}`}\n \n \n {`${team.Losses}`}\n \n \n {`${team.For}`}\n \n \n {`${team.Against}`}\n \n \n {`${team.GoalDifference}`}\n \n \n {`${team.Points}`}\n \n \n \n {team.Form[0] !== undefined ? team.Form[0] : \"\"}\n \n \n {team.Form[1] !== undefined ? team.Form[1] : \"\"}\n \n \n {team.Form[2] !== undefined ? team.Form[2] : \"\"}\n \n \n {team.Form[3] !== undefined ? team.Form[3] : \"\"}\n \n \n {team.Form[4] !== undefined ? team.Form[4] : \"\"}\n \n \n \n ));\n\n const leagueResults = [];\n let singleResult;\n if (props.Results) {\n props.Results.forEach((result) => {\n singleResult = (\n
    \n
    \n {result.team_a_xg}\n XG\n {result.team_b_xg}\n
    \n
    \n {result.team_a_shots}\n Shots\n {result.team_b_shots}\n
    \n
    \n {result.team_a_shotsOnTarget}\n SOT\n {result.team_b_shotsOnTarget}\n
    \n
    \n {result.team_a_dangerous_attacks}\n Dangerous Attacks\n {result.team_b_dangerous_attacks}\n
    \n
    \n {result.team_a_possession}%\n Possession\n {result.team_b_possession}%\n
    \n
    \n {result.team_a_red_cards}\n Red cards\n {result.team_b_red_cards}\n
    \n
    \n {result.odds_ft_1}\n Odds (pre-match)\n {result.odds_ft_2}\n
    \n
    \n );\n\n leagueResults.push(\n \n
    {result.home_name}
    \n \n {result.homeGoalCount} : {result.awayGoalCount}\n \n
    {result.away_name}
    \n
    \n }\n element={singleResult}\n />\n );\n });\n }\n\n const leagueResultsOlder = [];\n if (props.LastWeeksResults) {\n props.LastWeeksResults.forEach((result) => {\n singleResult = (\n
    \n
    \n {result.team_a_xg}\n XG\n {result.team_b_xg}\n
    \n
    \n {result.team_a_shots}\n Shots\n {result.team_b_shots}\n
    \n
    \n {result.team_a_shotsOnTarget}\n SOT\n {result.team_b_shotsOnTarget}\n
    \n
    \n {result.team_a_dangerous_attacks}\n Dangerous Attacks\n {result.team_b_dangerous_attacks}\n
    \n
    \n {result.team_a_possession}\n Possession\n {result.team_b_possession}\n
    \n
    \n {result.team_a_red_cards}\n Red cards\n {result.team_b_red_cards}\n
    \n
    \n {result.odds_ft_1}\n Odds (pre-match)\n {result.odds_ft_2}\n
    \n
    \n );\n\n leagueResultsOlder.push(\n \n
    {result.home_name}
    \n \n {result.homeGoalCount} : {result.awayGoalCount}\n \n
    {result.away_name}
    \n \n }\n element={singleResult}\n />\n );\n });\n }\n\n function getTopScorersTeam(id) {\n let found = props.Teams.find((team) => team.ID === id);\n return found.Name;\n }\n\n async function sorted(league, value, order) {\n let sortedByForm;\n if (order === \"desc\") {\n sortedByForm = league.sort((a, b) => b[value] - a[value]);\n } else {\n sortedByForm = league.sort((a, b) => a[value] - b[value]);\n }\n setIsOff(!toggleState);\n return sortedByForm;\n }\n\n if (\n props.GamesPlayed > 3 &&\n props.Teams[0].LeagueID !== 7956 &&\n props.Teams[0].LeagueID !== 6969 &&\n props.Teams[0].LeagueID !== 11084\n ) {\n for (let i = 0; i < props.Teams.length; i++) {\n return (\n \n \n \n \n \n \n Pld\n W\n D\n L\n GF\n GA\n GD\n \n sorted(props.Teams, \"Points\", \"desc\")}\n >\n Pts {upArrow}\n \n \n \n sorted(props.Teams, \"LastXPoints\", \"desc\")}\n >\n Last 5 {upArrow}\n \n \n \n \n {rows}\n \n
    {`${props.mostRecentGameweek} results`}
    \n
    \n
      {leagueResults}
    \n
    \n
    League Statistics
    \n {/* \n */}\n
    \n
      \n
    • Average home goals: {props.Stats.seasonAVG_home}
    • \n
    • Average away goals: {props.Stats.seasonAVG_away}
    • \n
    • BTTS: {props.Stats.seasonBTTSPercentage}%
    • \n
    • \n Over 0.5 goals: {props.Stats.seasonOver05Percentage_overall}%\n
    • \n
    • \n Over 1.5 goals: {props.Stats.seasonOver15Percentage_overall}%\n
    • \n
    • \n Over 2.5 goals: {props.Stats.seasonOver25Percentage_overall}%\n
    • \n
    • \n Over 3.5 goals: {props.Stats.seasonOver35Percentage_overall}%\n
    • \n
    • \n Over 4.5 goals: {props.Stats.seasonOver45Percentage_overall}%\n
    • \n
    \n
      \n
    • \n Over 7.5 corners: {props.Stats.over75CornersPercentage_overall}%\n
    • \n
    • \n Over 8.5 corners: {props.Stats.over85CornersPercentage_overall}%\n
    • \n
    • \n Over 9.5 corners: {props.Stats.over95CornersPercentage_overall}%\n
    • \n
    • \n Over 10.5 corners:{\" \"}\n {props.Stats.over105CornersPercentage_overall}%\n
    • \n
    • \n Over 11.5 corners:{\" \"}\n {props.Stats.over115CornersPercentage_overall}%\n
    • \n
    • \n Over 12.5 corners:{\" \"}\n {props.Stats.over125CornersPercentage_overall}%\n
    • \n
    • Corners average: {props.Stats.cornersAVG_overall}
    • \n
    • Cards average: {props.Stats.cardsAVG_overall}
    • \n
    \n
      \n

      Top scorers

      \n
    • \n {props.Stats.top_scorers[0].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[0].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[0].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[1].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[1].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[1].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[2].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[2].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[2].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[3].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[3].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[3].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[4].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[4].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[4].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[5].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[5].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[5].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[6].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[6].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[6].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[7].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[7].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[7].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[8].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[8].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[8].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[9].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[9].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[9].goals_overall}\n
    • \n
    \n
    \n
    \n );\n }\n } else if (props.Teams[0].LeagueID === 4340) {\n return null;\n } else {\n for (let i = 0; i < props.Teams.length; i++) {\n return (\n \n \n \n \n sorted(props.Teams, \"Position\")}\n >\n {upArrow}\n {\" \"}\n \n Pld\n W\n D\n L\n GF\n GA\n GD\n Pts\n \n \n \n {rows}\n
    \n sorted(props.Teams, \"LastXPoints\", \"desc\")}\n >\n Last 5 {upArrow}\n \n
    \n
    \n );\n }\n }\n}\n","import React, { Fragment } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { orderedLeagues } from \"../App\";\nimport { getForm } from \"./getForm\";\nimport { Fixture } from \"../components/Fixture\";\nimport { Button } from \"../components/Button\";\nimport { Slide } from \"../components/Slider\";\nimport { getScorePrediction } from \"../logic/getScorePredictions\";\nimport { ThreeDots } from \"react-loading-icons\";\nimport { selectedOdds } from \"../components/OddsRadio\";\nimport LeagueTable from \"../components/LeagueTable\";\nimport { getPointsFromLastX } from \"../logic/getScorePredictions\";\nimport SlideDiff from \"../components/SliderDiff\";\nimport Collapsable from \"../components/CollapsableElement\";\n\nvar oddslib = require(\"oddslib\");\n\n// require(\"dotenv\").config();\n\nvar fixtureResponse;\nvar fixtureArray = [];\nexport var matches = [];\nexport var resultedMatches = [];\nexport let arrayOfGames = [];\n\nvar league;\nvar leagueID;\nvar leagueGames = [];\nexport var leagueArray = [];\nvar leagueIdArray = [];\nexport var leagueStatsArray = [];\nexport let leagueInstance;\nexport let groupInstance;\nexport let allLeagueResultsArrayOfObjects = [];\nvar lastThreeFormHome;\nvar lastThreeFormAway;\nvar lastFiveFormHome;\nvar lastFiveFormAway;\nvar lastSixFormHome;\nvar lastSixFormAway;\nvar lastTenFormHome;\nvar lastTenFormAway;\nvar leagueOrAll;\nvar formRunHome;\nvar formRunAway;\nlet WDLinLeagueHome;\nlet WDLinLeagueAway;\nlet HomeAverageGoals;\nlet homeAverageGoals;\nlet HomeAverageConceded;\nlet homeAverageConceded;\nlet AwayAverageGoals;\nlet awayAverageGoals;\nlet AwayAverageConceded;\nlet awayAverageConceded;\n\n// export var [currentDay, month, year] = new Date()\n// .toLocaleDateString(\"en-US\", { timeZone: \"Europe/London\" })\n// .split(\"/\");\n\nexport async function diff(a, b) {\n return parseFloat(a - b).toFixed(2);\n}\n\nexport let allForm = [];\nexport let tableArray = [];\nexport let worldCupArray = [];\ngroupInstance = [];\nleagueInstance = [];\n\nasync function convertTimestampForSofaScore(timestamp) {\n let newDate = new Date(timestamp);\n\n let year = newDate.getFullYear();\n let month = String(newDate.getMonth() + 1).padStart(2, '0'); // Adding 1 to month because it is zero-based\n let day = String(newDate.getDate()).padStart(2, '0');\n \n let converted = `${year}-${month}-${day}`;\n\n return converted;\n}\n\nasync function convertTimestamp(timestamp) {\n let newDate = new Date(timestamp);\n let [day, month, year] = newDate.toLocaleDateString(\"en-US\").split(\"/\");\n\n let converted = `${year}-${day}-${month}`;\n\n return converted;\n}\n\n\nexport async function generateTables(a, leagueIdArray, allResults) {\n // leagueIdArray = [];\n tableArray = [];\n worldCupArray = [];\n let i = 0;\n leagueArray.forEach(function (league) {\n let currentLeagueId = leagueIdArray[i];\n i++;\n leagueInstance = [];\n //Skip MLS which has a weird format\n if (\n !league.data.specific_tables[0].groups &&\n currentLeagueId !== 6969 &&\n league.data.specific_tables[0].table\n ) {\n for (\n let index = 0;\n index < league.data.specific_tables[0].table.length;\n index++\n ) {\n let currentTeam = league.data.specific_tables[0].table[index];\n let last5;\n if (currentTeam.wdl_record.length < 5) {\n last5 = currentTeam.wdl_record\n .slice(`-${currentTeam.wdl_record.length}`)\n .toUpperCase();\n } else {\n last5 = currentTeam.wdl_record.slice(-5).toUpperCase();\n }\n\n const team = {\n LeagueID: currentLeagueId,\n Position: index + 1,\n Name: currentTeam.cleanName,\n ID: currentTeam.id,\n Played: currentTeam.matchesPlayed,\n Wins: currentTeam.seasonWins_overall,\n Draws: currentTeam.seasonDraws_overall,\n Losses: currentTeam.seasonLosses_overall,\n For: currentTeam.seasonGoals,\n Against:\n currentTeam.seasonConceded_home + currentTeam.seasonConceded_away,\n GoalDifference: currentTeam.seasonGoalDifference,\n Form: last5,\n LastXPoints: getPointsFromLastX(last5.split(\"\")),\n Points: currentTeam.points,\n wdl: currentTeam.wdl_record,\n seasonGoals: currentTeam.seasonGoals,\n seasonConceded: currentTeam.seasonConceded,\n };\n leagueInstance.push(team);\n }\n tableArray.push({ id: currentLeagueId, table: leagueInstance });\n } else if (currentLeagueId === 11084) {\n // for (let x = 0; x < league.data.specific_tables[0].groups.length; x++) {\n // for (\n // let index = 0;\n // index < league.data.specific_tables[0].groups[x].table.length;\n // index++\n // )\n league.data.specific_tables[0].groups.forEach((group) => {\n leagueInstance = [];\n for (let index = 0; index < group.table.length; index++) {\n let currentTeam = group.table[index];\n let last5 = \"N/A\";\n const team = {\n LeagueID: currentLeagueId,\n Position: index + 1,\n Name: currentTeam.cleanName,\n ID: currentTeam.id,\n Played: currentTeam.matchesPlayed,\n Wins: currentTeam.seasonWins_overall,\n Draws: currentTeam.seasonDraws_overall,\n Losses: currentTeam.seasonLosses_overall,\n For: currentTeam.seasonGoals,\n Against:\n currentTeam.seasonConceded_home + currentTeam.seasonConceded_away,\n GoalDifference: currentTeam.seasonGoalDifference,\n Form: last5,\n LastXPoints: getPointsFromLastX(last5.split(\"\")),\n Points: currentTeam.points,\n wdl: currentTeam.wdl_record,\n seasonGoals: currentTeam.seasonGoals,\n seasonConceded: currentTeam.seasonConceded,\n };\n leagueInstance.push(team);\n }\n worldCupArray.push({\n group: group.name,\n table: leagueInstance,\n });\n });\n } else if (league.data.league_table === null) {\n for (\n let index = 0;\n index < league.data.all_matches_table_overall.length;\n index++\n ) {\n let currentTeam = league.data.all_matches_table_overall[index];\n let last5 = \"N/A\";\n const team = {\n LeagueID: currentLeagueId,\n Position: index + 1,\n Name: currentTeam.cleanName,\n ID: currentTeam.id,\n Played: currentTeam.matchesPlayed,\n Wins: currentTeam.seasonWins_overall,\n Draws: currentTeam.seasonDraws_overall,\n Losses: currentTeam.seasonLosses_overall,\n For: currentTeam.seasonGoals,\n Against:\n currentTeam.seasonConceded_home + currentTeam.seasonConceded_away,\n GoalDifference: currentTeam.seasonGoalDifference,\n Form: last5,\n LastXPoints: getPointsFromLastX(last5.split(\"\")),\n Points: currentTeam.points,\n wdl: currentTeam.wdl_record,\n seasonGoals: currentTeam.seasonGoals,\n seasonConceded: currentTeam.seasonConceded,\n };\n leagueInstance.push(team);\n }\n\n tableArray.push({ id: currentLeagueId, table: leagueInstance });\n }\n });\n}\n\nexport async function renderTable(index, results, id) {\n let league;\n //World cup table rendering\n\n // let mostRecentGame = results.fixtures.pop();\n let mostRecentGame = results.fixtures.pop();\n\n let mostRecentGameweek = \"Latest\";\n\n const gameweeksResults = results.fixtures.filter(\n (games) => games.game_week === mostRecentGame.game_week\n );\n\n // const lastGameweeksResults = results.fixtures.filter(\n // (games) => games.game_week === mostRecentGameweek - 1\n // );\n\n const leagueTable = tableArray.filter((table) => table.id === id);\n\n league = leagueTable[0].table;\n\n let statistics;\n let leagueStatistics = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}leagueStats/${id}`\n );\n await leagueStatistics.json().then((stats) => {\n statistics = stats.data;\n });\n\n if (league !== undefined) {\n ReactDOM.render(\n ,\n document.getElementById(`leagueName${id}`)\n );\n }\n}\n\nasync function createFixture(match, result, mockBool) {\n let roundedHomeOdds;\n let roundedAwayOdds;\n let roundedBTTSOdds;\n let homeFraction;\n let awayFraction;\n let bttsFraction;\n\n if (selectedOdds === \"Fractional odds\") {\n if (match.homeOdds !== 0 && match.awayOdds !== 0) {\n roundedHomeOdds = (Math.round(match.homeOdds * 5) / 5).toFixed(1);\n roundedAwayOdds = (Math.round(match.awayOdds * 5) / 5).toFixed(1);\n\n if (roundedHomeOdds < 1.1) {\n roundedHomeOdds = 1.1;\n }\n if (roundedAwayOdds < 1.1) {\n roundedAwayOdds = 1.1;\n }\n\n if (match.homeOdds === 0.1 && match.awayOdds === 0.1) {\n match.homeOdds = 3;\n roundedHomeOdds = 3;\n match.awayOdds = 3;\n roundedAwayOdds = 3;\n }\n\n try {\n homeFraction = oddslib\n .from(\"decimal\", roundedHomeOdds)\n .to(\"fractional\", { precision: 1 });\n awayFraction = oddslib\n .from(\"decimal\", roundedAwayOdds)\n .to(\"fractional\", { precision: 1 });\n } catch (error) {\n console.log(error);\n }\n } else {\n homeFraction = \"N/A\";\n awayFraction = \"N/A\";\n }\n\n if (match.bttsOdds !== 0) {\n roundedBTTSOdds = (Math.round(match.bttsOdds * 5) / 5).toFixed(1);\n\n if (roundedBTTSOdds < 1.1) {\n roundedBTTSOdds = 1.1;\n }\n\n try {\n bttsFraction = oddslib\n .from(\"decimal\", roundedBTTSOdds)\n .to(\"fractional\", { precision: 1 });\n } catch (error) {\n console.log(error);\n }\n } else {\n bttsFraction = \"N/A\";\n }\n } else if (selectedOdds === \"Decimal odds\") {\n if (match.homeOdds !== 0 && match.awayOdds !== 0) {\n homeFraction = match.homeOdds;\n awayFraction = match.awayOdds;\n } else {\n homeFraction = \"N/A\";\n awayFraction = \"N/A\";\n }\n\n if (match.bttsOdds !== 0) {\n bttsFraction = match.bttsOdds;\n } else {\n bttsFraction = \"N/A\";\n }\n }\n\n match.omit = false;\n match.homeTeamWinsPercentage = match.homeTeamWinPercentage;\n match.homeTeamLossesPercentage = match.homeTeamLossPercentage;\n match.homeTeamDrawsPercentage = match.homeTeamDrawPercentage;\n\n match.awayTeamWinsPercentage = match.awayTeamWinPercentage;\n match.awayTeamLossesPercentage = match.awayTeamLossPercentage;\n match.awayTeamDrawsPercentage = match.awayTeamDrawPercentage;\n match.fractionHome = homeFraction;\n match.fractionAway = awayFraction;\n\n match.bttsFraction = bttsFraction;\n\n match.game = match.homeTeam + \" v \" + match.awayTeam;\n\n // ReactDOM.render(\n // ,\n // document.getElementById(\"FixtureContainer\")\n // );\n}\n\nexport function RenderAllFixtures(props) {\n return (\n \n );\n}\n// document.getElementById(\"FixtureContainer\")\n\nvar myHeaders = new Headers();\nmyHeaders.append(\"Origin\", \"https://gregdorward.github.io\");\n\nlet isFunctionRunning = false;\n\nexport async function generateFixtures(\n day,\n date,\n selectedOdds,\n footyStatsFormattedDate,\n current,\n todaysDate,\n dateSS\n) {\n if (!isFunctionRunning) {\n isFunctionRunning = true;\n // const randomInt = Math.random() * 10\n\n // if(randomInt >= 7){\n // alert(\"XGTipping is now serving over 2000 users a month,1 relying on donations to cover increasing running costs. If you can afford to do so and like what we do, please, help us stay subscription fee today by tapping to Donation button at the bottom of the page\")\n // }\n\n ReactDOM.render(\n
    \n
    \n Loading all league, fixture & form data, please be patient...\n
    \n \n
    ,\n document.getElementById(\"Loading\")\n );\n\n //cleanup if different day is selected\n ReactDOM.render(\n
    ,\n document.getElementById(\"GeneratePredictions\")\n );\n ReactDOM.render(
    , document.getElementById(\"successMeasure2\"));\n ReactDOM.render(
    , document.getElementById(\"bestPredictions\"));\n ReactDOM.render(
    , document.getElementById(\"exoticOfTheDay\"));\n ReactDOM.render(
    , document.getElementById(\"insights\"));\n ReactDOM.render(
    , document.getElementById(\"longShots\"));\n ReactDOM.render(
    , document.getElementById(\"BTTS\"));\n ReactDOM.render(
    , document.getElementById(\"draws\"));\n\n const url = `${process.env.REACT_APP_EXPRESS_SERVER}matches/${footyStatsFormattedDate}`;\n const formUrl = `${process.env.REACT_APP_EXPRESS_SERVER}form/${date}`;\n\n matches = [];\n fixtureArray = [];\n\n league = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}leagues/${todaysDate}`\n );\n\n ReactDOM.render(
    , document.getElementById(\"FixtureContainer\"));\n\n fixtureResponse = await fetch(url);\n\n await fixtureResponse.json().then((fixtures) => {\n fixtureArray = Array.from(fixtures.data);\n });\n\n let form;\n let formArray = [];\n allForm = [];\n var isFormStored;\n var isStoredLocally;\n var leaguesStored = false;\n let storedForm = await fetch(formUrl);\n if (storedForm.status === 201 || storedForm.status === 200) {\n await storedForm.json().then((form) => {\n formArray = Array.from(form.allForm);\n isFormStored = true;\n isStoredLocally = true;\n allForm = formArray;\n });\n } else {\n isFormStored = false;\n isStoredLocally = false;\n }\n\n leagueIdArray = [];\n for (let i = 0; i < orderedLeagues.length; i++) {\n leagueID = orderedLeagues[i].element.id;\n leagueIdArray.push(leagueID);\n }\n\n var leaguePositions = [];\n leagueArray = [];\n\n let allLeagueResults;\n\n allLeagueResults = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}results`\n );\n\n if (league.status === 200 && allLeagueResults.status === 201) {\n console.log(\"Not fetching leagues\");\n await league.json().then((leagues) => {\n leagueArray = Array.from(leagues.leagueArray);\n });\n updateResults(false);\n\n await allLeagueResults.json().then((allGames) => {\n allLeagueResultsArrayOfObjects = Array.from(allGames);\n });\n\n console.log(allLeagueResultsArrayOfObjects)\n leaguesStored = true;\n generateTables(\n leagueArray,\n leagueIdArray,\n allLeagueResultsArrayOfObjects\n );\n arrayOfGames = []\n\n const sofaScore = await fetch(`https://www.sofascore.com/api/v1/sport/football/scheduled-events/${dateSS}`)\n await sofaScore.json().then((games) => {\n games.events.forEach((game) => {\n arrayOfGames.push({\n homeTeam: game.homeTeam.name,\n awayTeam: game.awayTeam.name,\n id: game.id,\n time: game.startTimestamp,\n homeGoals: game.homeScore.display != undefined ? game.homeScore.display : \"-\",\n awayGoals: game.awayScore.display != undefined ? game.awayScore.display : \"-\"\n })\n })\n })\n\n const sofaScoreLeagues = await fetch('')\n console.log(arrayOfGames)\n } else {\n allLeagueResultsArrayOfObjects = [];\n console.log(\"Fetching leagues\");\n for (let i = 0; i < orderedLeagues.length; i++) {\n league = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}tables/${orderedLeagues[i].element.id}/${todaysDate}`\n );\n // eslint-disable-next-line no-loop-func\n await league.json().then((table) => {\n leagueArray.push(table);\n });\n leaguesStored = false;\n }\n\n //set variable for date X amount of days in the past and use that to filter the results\n\n let startDate = (new Date().getTime() / 1000).toFixed(0);\n // deduct 3 months\n let targetDate = startDate - 23778463;\n\n for (const orderedLeague of orderedLeagues) {\n let fixtures = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}leagueFixtures/${orderedLeague.element.id}`\n );\n\n let games = await fixtures.json();\n let gamesFiltered;\n let gamesShortened;\n if (games.pager.current_page < games.pager.max_page) {\n const page2 = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}leagueFixtures/${orderedLeague.element.id}&page=2`\n );\n let page2Data = await page2.json();\n\n const gamesConcat = games.data.concat(page2Data.data);\n const gamesConcatFiltered = gamesConcat.filter((game) => game.status === \"complete\");\n\n let mostRecentResults = gamesConcatFiltered.filter(\n (game) => game.date_unix > targetDate\n );\n let sorted = mostRecentResults.sort((a, b) => a.date_unix - b.date_unix);\n gamesShortened = sorted.slice(-600);\n gamesFiltered = gamesShortened;\n } else {\n\n gamesFiltered = games.data.filter(\n (game) => game.status === \"complete\"\n );\n\n if (current) {\n let mostRecentResults = gamesFiltered.filter(\n (game) => game.date_unix > targetDate\n );\n gamesFiltered = mostRecentResults.slice(-600);\n }\n }\n\n // let mostRecentResults = gamesFiltered.filter(\n // (game) => game.date_unix > targetDate\n // );\n\n const shortenedResults = gamesFiltered.map(\n ({\n home_name,\n away_name,\n homeGoalCount,\n awayGoalCount,\n date_unix,\n team_a_xg,\n team_b_xg,\n odds_ft_1,\n odds_ft_2,\n team_a_shots,\n team_b_shots,\n team_a_corners,\n team_b_corners,\n team_a_shotsOnTarget,\n team_b_shotsOnTarget,\n team_a_red_cards,\n team_b_red_cards,\n team_a_possession,\n team_b_possession,\n team_a_dangerous_attacks,\n team_b_dangerous_attacks,\n pre_match_teamA_overall_ppg,\n pre_match_teamB_overall_ppg,\n game_week,\n }) => ({\n home_name,\n away_name,\n homeGoalCount,\n awayGoalCount,\n date_unix,\n team_a_xg,\n team_b_xg,\n odds_ft_1,\n odds_ft_2,\n team_a_shots,\n team_b_shots,\n team_a_corners,\n team_b_corners,\n team_a_shotsOnTarget,\n team_b_shotsOnTarget,\n team_a_red_cards,\n team_b_red_cards,\n team_a_possession,\n team_b_possession,\n team_a_dangerous_attacks,\n team_b_dangerous_attacks,\n pre_match_teamA_overall_ppg,\n pre_match_teamB_overall_ppg,\n game_week,\n })\n );\n\n let leagueObj = {\n // leagueObject[orderedLeague] = {\n name: orderedLeague.name,\n id: orderedLeague.element.id,\n fixtures: shortenedResults,\n };\n\n allLeagueResultsArrayOfObjects.push(leagueObj);\n }\n updateResults(true);\n generateTables(\n leagueArray,\n leagueIdArray,\n allLeagueResultsArrayOfObjects\n );\n }\n\n let teamPositionPrefix;\n\n async function getPrefix(position) {\n switch (position) {\n case 1:\n case 21:\n case 31:\n case 41:\n teamPositionPrefix = \"st\";\n break;\n case 2:\n case 22:\n case 32:\n case 42:\n teamPositionPrefix = \"nd\";\n break;\n case 3:\n case 23:\n case 33:\n case 43:\n teamPositionPrefix = \"rd\";\n break;\n case 4:\n case 5:\n case 6:\n case 7:\n case 8:\n case 9:\n case 10:\n case 11:\n case 12:\n case 13:\n case 14:\n case 15:\n case 16:\n case 17:\n case 18:\n case 19:\n case 20:\n case 24:\n case 25:\n case 26:\n case 27:\n case 28:\n case 29:\n case 30:\n case 34:\n case 35:\n case 36:\n case 37:\n case 38:\n case 39:\n case 40:\n case 44:\n case 45:\n case 46:\n case 47:\n case 48:\n teamPositionPrefix = \"th\";\n break;\n default:\n break;\n }\n return teamPositionPrefix;\n }\n\n for (let i = 0; i < leagueArray.length; i++) {\n let leagueInstance;\n let homeLeague;\n let awayLeague;\n\n if (leagueArray[i].data.league_table !== null) {\n leagueInstance = leagueArray[i].data.league_table;\n homeLeague = leagueArray[i].data.all_matches_table_home;\n awayLeague = leagueArray[i].data.all_matches_table_away;\n } else {\n leagueInstance = leagueArray[i].data.all_matches_table_overall;\n homeLeague = leagueArray[i].data.all_matches_table_home;\n awayLeague = leagueArray[i].data.all_matches_table_away;\n }\n\n for (let x = 0; x < leagueInstance.length; x++) {\n let regularSeason = leagueArray[i].data.specific_tables.find(\n (season) =>\n season.round === \"Regular Season\" ||\n season.round === \"2023\" ||\n season.round === \"2023/2024\" ||\n season.round === \"Apertura\" ||\n season.round === \"1st Phase\"\n // season.round === \"North\" ||\n // season.round === \"South\"\n );\n let string;\n\n if (regularSeason !== undefined && regularSeason.table) {\n string = regularSeason.table[x];\n homeLeague = leagueArray[i].data.all_matches_table_home;\n awayLeague = leagueArray[i].data.all_matches_table_away;\n } else {\n string = leagueArray[i].data.all_matches_table_overall[x];\n homeLeague = leagueArray[i].data.all_matches_table_home;\n awayLeague = leagueArray[i].data.all_matches_table_away;\n }\n\n let stringHome = homeLeague[x];\n let stringAway = awayLeague[x];\n\n leaguePositions.push({\n name: string.cleanName,\n position: x + 1,\n rawPosition: x + 1,\n homeFormName: stringHome ? stringHome.cleanName : string.cleanName,\n awayFormName: stringAway ? stringAway.cleanName : string.cleanName,\n homeSeasonWinPercentage: stringHome\n ? stringHome.seasonWins\n : string.seasonWins,\n awaySeasonWinPercentage: stringAway\n ? stringAway.seasonWins\n : string.seasonWins,\n homeSeasonLossPercentage: stringHome\n ? stringHome.seasonLosses_home\n : string.seasonLosses_home,\n awaySeasonLossPercentage: stringAway\n ? stringAway.seasonLosses_away\n : string.seasonLosses_away,\n homeSeasonDrawPercentage: stringHome\n ? stringHome.seasonDraws\n : string.seasonDraws,\n awaySeasonDrawPercentage: stringAway\n ? stringAway.seasonDraws\n : string.seasonDraws,\n homeSeasonMatchesPlayed: stringHome\n ? stringHome.matchesPlayed\n : string.matchesPlayed,\n awaySeasonMatchesPlayed: stringAway\n ? stringAway.matchesPlayed\n : string.matchesPlayed,\n ppg: string.points / string.matchesPlayed,\n wdl: string.wdl_record ? string.wdl_record : \"\",\n played: string.matchesPlayed,\n seasonGoals: string.seasonGoals,\n seasonConceded: string.seasonConceded,\n });\n }\n }\n\n let previousLeagueName;\n\n for (let i = 0; i < orderedLeagues.length; i++) {\n leagueID = orderedLeagues[i].element.id;\n leagueGames = fixtureArray.filter(\n (game) => game.competition_id === orderedLeagues[i].element.id\n );\n\n for (const fixture of leagueGames) {\n const unixTimestamp = fixture.date_unix;\n const milliseconds = unixTimestamp * 1000;\n const dateObject = new Date(milliseconds);\n\n let match = {};\n if (orderedLeagues[i].name !== previousLeagueName) {\n match.leagueName = orderedLeagues[i].name;\n match.leagueIndex = i;\n match.leagueID = leagueID;\n } else {\n match.leagueName = null;\n match.leagueIndex = i;\n match.leagueID = leagueID;\n }\n match.id = fixture.id;\n match.competition_id = fixture.competition_id;\n match.date = fixture.date_unix;\n match.time = dateObject.toLocaleString(\"en-GB\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n match.homeTeam = fixture.home_name;\n match.awayTeam = fixture.away_name;\n\n match.homeOdds = +fixture.odds_ft_1.toFixed(2);\n match.awayOdds = +fixture.odds_ft_2.toFixed(2);\n match.drawOdds = +fixture.odds_ft_x.toFixed(2);\n match.homeDoubleChance = fixture.odds_doublechance_1x;\n match.awayDoubleChance = fixture.odds_doublechance_x2;\n match.bttsOdds = fixture.odds_btts_yes;\n match.homeId = fixture.homeID;\n match.awayId = fixture.awayID;\n match.form = [];\n match.homeTeamInfo = [];\n match.awayTeamInfo = [];\n match.btts = false;\n\n previousLeagueName = orderedLeagues[i].name;\n\n let homeTeaminLeague;\n let awayTeaminLeague;\n let teamPositionHome;\n let teamPositionHomeTable;\n let teamPositionAwayTable;\n let homeTeamWinPercentageHome;\n let awayTeamWinPercentageAway;\n let homeTeamLossPercentageHome;\n let awayTeamLossPercentageAway;\n let homeTeamDrawPercentageHome;\n let awayTeamDrawPercentageAway;\n let teamPositionAway;\n let homePrefix;\n let homePrefixHomeTable;\n let awayPrefix;\n let awayPrefixAwayTable;\n let homeSeasonPPG;\n let awaySeasonPPG;\n\n try {\n homeTeaminLeague = leaguePositions.find(\n (team) => team.name === match.homeTeam\n );\n\n let homeTeaminHomeLeague = leaguePositions.find(\n (team) => team.homeFormName === match.homeTeam\n );\n teamPositionHome = homeTeaminLeague.position;\n teamPositionHomeTable = homeTeaminHomeLeague.position;\n\n WDLinLeagueHome = Array.from(homeTeaminLeague.wdl.toUpperCase());\n HomeAverageGoals =\n homeTeaminLeague.seasonGoals / homeTeaminLeague.played;\n HomeAverageConceded =\n homeTeaminLeague.seasonConceded / homeTeaminLeague.played;\n\n homeTeamWinPercentageHome =\n (homeTeaminHomeLeague.homeSeasonWinPercentage /\n homeTeaminHomeLeague.homeSeasonMatchesPlayed) *\n 100;\n\n homeTeamLossPercentageHome =\n (homeTeaminHomeLeague.homeSeasonLossPercentage /\n homeTeaminHomeLeague.homeSeasonMatchesPlayed) *\n 100;\n\n homeTeamDrawPercentageHome =\n (homeTeaminHomeLeague.homeSeasonDrawPercentage /\n homeTeaminHomeLeague.homeSeasonMatchesPlayed) *\n 100;\n\n homePrefix = await getPrefix(teamPositionHome);\n homePrefixHomeTable = await getPrefix(teamPositionHomeTable);\n\n homeSeasonPPG = homeTeaminLeague.ppg.toFixed(2);\n } catch (error) {\n console.log(error);\n teamPositionHome = \"N/A\";\n homePrefix = \"\";\n homePrefixHomeTable = \"\";\n homeSeasonPPG = \"N/A\";\n homeTeaminLeague = {\n rawPosition: \"N/A\",\n };\n WDLinLeagueHome = \"N/A\";\n }\n\n try {\n awayTeaminLeague = leaguePositions.find(\n (team) => team.name === match.awayTeam\n );\n\n let awayTeaminAwayLeague = leaguePositions.find(\n (team) => team.awayFormName === match.awayTeam\n );\n\n teamPositionAway = awayTeaminLeague.position;\n teamPositionAwayTable = awayTeaminAwayLeague.position;\n\n WDLinLeagueAway = Array.from(awayTeaminLeague.wdl.toUpperCase());\n AwayAverageGoals =\n awayTeaminLeague.seasonGoals / awayTeaminLeague.played;\n AwayAverageConceded =\n awayTeaminLeague.seasonConceded / awayTeaminLeague.played;\n\n awayTeamWinPercentageAway =\n (awayTeaminAwayLeague.awaySeasonWinPercentage /\n awayTeaminAwayLeague.awaySeasonMatchesPlayed) *\n 100;\n\n awayTeamLossPercentageAway =\n (awayTeaminAwayLeague.awaySeasonLossPercentage /\n awayTeaminAwayLeague.awaySeasonMatchesPlayed) *\n 100;\n\n awayTeamDrawPercentageAway =\n (awayTeaminAwayLeague.awaySeasonDrawPercentage /\n awayTeaminAwayLeague.awaySeasonMatchesPlayed) *\n 100;\n\n awayPrefix = await getPrefix(teamPositionAway);\n awayPrefixAwayTable = await getPrefix(teamPositionAwayTable);\n\n awaySeasonPPG = awayTeaminLeague.ppg.toFixed(2);\n } catch (error) {\n console.log(error);\n teamPositionAway = \"N/A\";\n awayPrefix = \"\";\n awaySeasonPPG = \"N/A\";\n awayTeaminLeague = {\n rawPosition: \"N/A\",\n };\n WDLinLeagueAway = \"N/A\";\n }\n\n if (!isFormStored) {\n form = await getForm(match);\n\n let homeFormString5 =\n form[0].data[0].stats.additional_info.formRun_overall.toUpperCase();\n let awayFormString5 =\n form[1].data[0].stats.additional_info.formRun_overall.toUpperCase();\n let homeFormString6 =\n form[0].data[1].stats.additional_info.formRun_overall.toUpperCase();\n let awayFormString6 =\n form[1].data[1].stats.additional_info.formRun_overall.toUpperCase();\n let homeFormString10 =\n form[0].data[2].stats.additional_info.formRun_overall.toUpperCase();\n let awayFormString10 =\n form[1].data[2].stats.additional_info.formRun_overall.toUpperCase();\n\n let homeFormRun =\n form[0].data[2].stats.additional_info.formRun_home.toUpperCase();\n let awayFormRun =\n form[1].data[2].stats.additional_info.formRun_away.toUpperCase();\n\n if (WDLinLeagueHome.length >= 10) {\n lastThreeFormHome = WDLinLeagueHome.slice(-3);\n lastFiveFormHome = WDLinLeagueHome.slice(-5);\n lastSixFormHome = WDLinLeagueHome.slice(-6);\n lastTenFormHome = WDLinLeagueHome.slice(-10);\n lastThreeFormAway = WDLinLeagueAway.slice(-3);\n lastFiveFormAway = WDLinLeagueAway.slice(-5);\n lastSixFormAway = WDLinLeagueAway.slice(-6);\n lastTenFormAway = WDLinLeagueAway.slice(-10);\n leagueOrAll = \"League\";\n homeAverageGoals = HomeAverageGoals;\n homeAverageConceded = HomeAverageConceded;\n awayAverageGoals = AwayAverageGoals;\n awayAverageConceded = AwayAverageConceded;\n } else if (WDLinLeagueHome.length >= 6) {\n lastThreeFormHome = WDLinLeagueHome.slice(-3);\n lastFiveFormHome = WDLinLeagueHome.slice(-5);\n lastSixFormHome = WDLinLeagueHome.slice(-6);\n lastTenFormHome = Array.from(homeFormString10);\n lastThreeFormAway = WDLinLeagueAway.slice(-3);\n lastFiveFormAway = WDLinLeagueAway.slice(-5);\n lastSixFormAway = WDLinLeagueAway.slice(-6);\n lastTenFormAway = Array.from(awayFormString10);\n leagueOrAll = \"League\";\n\n homeAverageGoals = HomeAverageGoals;\n homeAverageConceded = HomeAverageConceded;\n awayAverageGoals = AwayAverageGoals;\n awayAverageConceded = AwayAverageConceded;\n } else if (WDLinLeagueHome.length >= 5) {\n lastThreeFormHome = WDLinLeagueHome.slice(-3);\n lastFiveFormHome = WDLinLeagueHome.slice(-5);\n lastSixFormHome = Array.from(homeFormString6);\n lastTenFormHome = Array.from(homeFormString10);\n lastThreeFormAway = WDLinLeagueAway.slice(-3);\n lastFiveFormAway = WDLinLeagueAway.slice(-5);\n lastSixFormAway = Array.from(awayFormString6);\n lastTenFormAway = Array.from(awayFormString10);\n leagueOrAll = \"League\";\n\n homeAverageGoals = HomeAverageGoals;\n homeAverageConceded = HomeAverageConceded;\n awayAverageGoals = AwayAverageGoals;\n awayAverageConceded = AwayAverageConceded;\n } else {\n lastThreeFormHome = [\n homeFormString5[2],\n homeFormString5[3],\n homeFormString5[4],\n ];\n lastFiveFormHome = Array.from(homeFormString5);\n lastSixFormHome = Array.from(homeFormString6);\n lastTenFormHome = Array.from(homeFormString10);\n lastThreeFormAway = [\n awayFormString5[2],\n awayFormString5[3],\n awayFormString5[4],\n ];\n\n lastFiveFormAway = Array.from(awayFormString5);\n lastSixFormAway = Array.from(awayFormString6);\n lastTenFormAway = Array.from(awayFormString10);\n\n leagueOrAll = \"All\";\n\n homeAverageGoals = undefined;\n homeAverageConceded = undefined;\n awayAverageGoals = undefined;\n awayAverageConceded = undefined;\n }\n\n formRunHome = Array.from(homeFormRun);\n formRunAway = Array.from(awayFormRun);\n\n if (\n teamPositionHome === 0 ||\n form[0].data[0].season_format !== \"Domestic League\"\n ) {\n teamPositionHome = \"N/A\";\n teamPositionHomeTable = \"N/A\";\n homePrefix = \"\";\n homePrefixHomeTable = \"\";\n }\n\n if (\n teamPositionAway === 0 ||\n form[0].data[0].season_format !== \"Domestic League\"\n ) {\n teamPositionAway = \"N/A\";\n teamPositionAwayTable = \"N/A\";\n awayPrefix = \"\";\n awayPrefixAwayTable = \"\";\n }\n\n allForm.push({\n id: match.id,\n teamIDHome: match.homeId,\n teamIDAway: match.awayId,\n leagueId: leagueID,\n home: {\n teamName: match.homeTeam,\n 0: {\n XGOverall: parseFloat(form[0].data[0].stats.xg_for_avg_overall),\n XG: parseFloat(form[0].data[0].stats.xg_for_avg_home),\n ScoredOverall: parseFloat(\n form[0].data[0].stats.seasonScoredNum_overall\n ),\n ScoredAverage: parseFloat(\n form[0].data[0].stats.seasonScoredAVG_home\n ),\n PlayedHome: parseFloat(\n form[0].data[0].stats.seasonMatchesPlayed_home\n ),\n PlayedAway: parseFloat(\n form[0].data[0].stats.seasonMatchesPlayed_away\n ),\n ConcededOverall: parseFloat(\n form[0].data[0].stats.seasonConcededNum_overall\n ),\n ConcededAverage: parseFloat(\n form[0].data[0].stats.seasonConcededAVG_home\n ),\n XGAgainstAvgOverall: parseFloat(\n form[0].data[0].stats.xg_against_avg_overall\n ),\n XGAgainstAverage: parseFloat(\n form[0].data[0].stats.xg_against_avg_home\n ),\n CleanSheetPercentage: parseFloat(\n form[0].data[0].stats.seasonCSPercentage_overall\n ),\n AveragePossessionOverall: parseFloat(\n form[0].data[0].stats.possessionAVG_overall\n ),\n AveragePossession: parseFloat(\n form[0].data[0].stats.possessionAVG_home\n ),\n AverageShotsOnTargetOverall: parseFloat(\n form[0].data[0].stats.shotsOnTargetAVG_overall\n ),\n AverageShotsOnTarget: parseFloat(\n form[0].data[0].stats.shotsOnTargetAVG_home\n ),\n AverageDangerousAttacksOverall: parseFloat(\n form[0].data[0].stats.dangerous_attacks_avg_overall\n ),\n PPG: parseFloat(form[0].data[0].stats.seasonPPG_overall),\n AttacksHome: parseFloat(form[0].data[0].stats.attacks_avg_home),\n AttacksAway: parseFloat(form[0].data[0].stats.attacks_avg_away),\n AverageDangerousAttacks: parseFloat(\n form[0].data[0].stats.dangerous_attacks_avg_home\n ),\n homeAttackAdvantage: parseFloat(\n form[0].data[0].stats.homeAttackAdvantage\n ),\n homeDefenceAdvantage: parseFloat(\n form[0].data[0].stats.homeDefenceAdvantage\n ),\n BTTSPercentage: parseInt(\n form[0].data[0].stats.seasonBTTSPercentage_home\n ),\n LeagueOrAll: leagueOrAll,\n LeaguePosition: `${teamPositionHome}${homePrefix}`,\n homeRawPosition: homeTeaminLeague.rawPosition\n ? homeTeaminLeague.rawPosition\n : 0,\n homeTeamHomePositionRaw: teamPositionHomeTable,\n LeagueAverageGoals: homeAverageGoals,\n LeagueAverageConceded: homeAverageConceded,\n },\n 1: {\n XGOverall: parseFloat(form[0].data[1].stats.xg_for_avg_overall),\n XG: parseFloat(form[0].data[1].stats.xg_for_avg_home),\n ScoredOverall: parseFloat(\n form[0].data[1].stats.seasonScoredNum_overall\n ),\n ScoredAverage: parseFloat(\n form[0].data[1].stats.seasonScoredAVG_home\n ),\n PlayedHome: parseFloat(\n form[0].data[1].stats.seasonMatchesPlayed_home\n ),\n PlayedAway: parseFloat(\n form[0].data[1].stats.seasonMatchesPlayed_away\n ),\n ConcededOverall: parseFloat(\n form[0].data[1].stats.seasonConcededNum_overall\n ),\n ConcededAverage: parseFloat(\n form[0].data[1].stats.seasonConcededAVG_home\n ),\n XGAgainstAvgOverall: parseFloat(\n form[0].data[1].stats.xg_against_avg_overall\n ),\n XGAgainstAverage: parseFloat(\n form[0].data[1].stats.xg_against_avg_home\n ),\n CleanSheetPercentage: parseFloat(\n form[0].data[1].stats.seasonCSPercentage_overall\n ),\n AveragePossessionOverall: parseFloat(\n form[0].data[1].stats.possessionAVG_overall\n ),\n AveragePossession: parseFloat(\n form[0].data[1].stats.possessionAVG_home\n ),\n AverageShotsOnTargetOverall: parseFloat(\n form[0].data[1].stats.shotsOnTargetAVG_overall\n ),\n AverageShotsOnTarget: parseFloat(\n form[0].data[1].stats.shotsOnTargetAVG_home\n ),\n AverageDangerousAttacksOverall: parseFloat(\n form[0].data[1].stats.dangerous_attacks_avg_overall\n ),\n PPG: parseFloat(form[0].data[1].stats.seasonPPG_overall),\n AttacksHome: parseFloat(form[0].data[1].stats.attacks_avg_home),\n AttacksAway: parseFloat(form[0].data[1].stats.attacks_avg_away),\n AverageDangerousAttacks: parseFloat(\n form[0].data[1].stats.dangerous_attacks_avg_home\n ),\n homeAttackAdvantage: parseFloat(\n form[0].data[1].stats.homeAttackAdvantage\n ),\n homeDefenceAdvantage: parseFloat(\n form[0].data[1].stats.homeDefenceAdvantage\n ),\n BTTSPercentage: parseInt(\n form[0].data[1].stats.seasonBTTSPercentage_home\n ),\n LeagueOrAll: leagueOrAll,\n LeaguePosition: `${teamPositionHome}${homePrefix}`,\n homeRawPosition: homeTeaminLeague.rawPosition\n ? homeTeaminLeague.rawPosition\n : 0,\n homeTeamHomePositionRaw: teamPositionHomeTable,\n LeagueAverageGoals: homeAverageGoals,\n LeagueAverageConceded: homeAverageConceded,\n },\n 2: {\n XGOverall: parseFloat(form[0].data[2].stats.xg_for_avg_overall),\n XG: parseFloat(form[0].data[2].stats.xg_for_avg_home),\n ScoredOverall: parseFloat(\n form[0].data[2].stats.seasonScoredNum_overall\n ),\n ScoredAverage: parseFloat(\n form[0].data[2].stats.seasonScoredAVG_home\n ),\n PlayedHome: parseFloat(\n form[0].data[2].stats.seasonMatchesPlayed_home\n ),\n PlayedAway: parseFloat(\n form[0].data[2].stats.seasonMatchesPlayed_away\n ),\n ConcededOverall: parseFloat(\n form[0].data[2].stats.seasonConcededNum_overall\n ),\n ConcededAverage: parseFloat(\n form[0].data[2].stats.seasonConcededAVG_home\n ),\n XGAgainstAvgOverall: parseFloat(\n form[0].data[2].stats.xg_against_avg_overall\n ),\n XGAgainstAverage: parseFloat(\n form[0].data[2].stats.xg_against_avg_home\n ),\n CleanSheetPercentage: parseFloat(\n form[0].data[2].stats.seasonCSPercentage_overall\n ),\n AveragePossessionOverall: parseFloat(\n form[0].data[2].stats.possessionAVG_overall\n ),\n AveragePossession: parseFloat(\n form[0].data[2].stats.possessionAVG_home\n ),\n AverageShotsOnTargetOverall: parseFloat(\n form[0].data[2].stats.shotsOnTargetAVG_overall\n ),\n AverageShotsOnTarget: parseFloat(\n form[0].data[2].stats.shotsOnTargetAVG_home\n ),\n AverageShots: parseFloat(\n form[0].data[2].stats.shotsAVG_overall\n ),\n AverageShotsHomeOrAway: parseFloat(\n form[0].data[2].stats.shotsAVG_home\n ),\n AverageDangerousAttacksOverall: parseFloat(\n form[0].data[2].stats.dangerous_attacks_avg_overall\n ),\n PPG: parseFloat(form[0].data[2].stats.seasonPPG_overall),\n AttacksHome: parseFloat(form[0].data[2].stats.attacks_avg_home),\n AttacksAway: parseFloat(form[0].data[2].stats.attacks_avg_away),\n AverageDangerousAttacks: parseFloat(\n form[0].data[2].stats.dangerous_attacks_avg_home\n ),\n homeAttackAdvantage: parseFloat(\n form[0].data[2].stats.homeAttackAdvantage\n ),\n homeDefenceAdvantage: parseFloat(\n form[0].data[2].stats.homeDefenceAdvantage\n ),\n BTTSPercentage: parseInt(\n form[0].data[2].stats.seasonBTTSPercentage_home\n ),\n lastThreeForm: lastThreeFormHome.reverse(),\n LastFiveForm: lastFiveFormHome.reverse(),\n LastSixForm: lastSixFormHome.reverse(),\n LastTenForm: lastTenFormHome.reverse(),\n LeagueOrAll: leagueOrAll,\n LeaguePosition: `${teamPositionHome}${homePrefix}`,\n homeRawPosition: homeTeaminLeague.rawPosition\n ? homeTeaminLeague.rawPosition\n : 0,\n homeTeamHomePositionRaw: teamPositionHomeTable,\n SeasonPPG: homeSeasonPPG,\n WinPercentage: homeTeamWinPercentageHome,\n LossPercentage: homeTeamLossPercentageHome,\n DrawPercentage: homeTeamDrawPercentageHome,\n formRun: formRunHome,\n goalDifference:\n form[0].data[2].stats.seasonGoalDifference_overall,\n goalDifferenceHomeOrAway:\n form[0].data[2].stats.seasonGoalDifference_home,\n BttsPercentage:\n form[0].data[2].stats.seasonBTTSPercentage_overall,\n BttsPercentageHomeOrAway:\n form[0].data[2].stats.seasonBTTSPercentage_home,\n CardsTotal: form[0].data[2].stats.cardsTotal_overall,\n CornersAverage: form[0].data[2].stats.cornersAVG_overall,\n ScoredBothHalvesPercentage:\n form[0].data[2].stats.scoredBothHalvesPercentage_overall,\n LastMatch: await convertTimestamp(\n form[0].data[0].last_updated_match_timestamp\n ),\n WDLRecord: WDLinLeagueHome,\n LeagueAverageGoals: homeAverageGoals,\n LeagueAverageConceded: homeAverageConceded,\n },\n },\n away: {\n teamName: match.awayTeam,\n 0: {\n XGOverall: parseFloat(form[1].data[0].stats.xg_for_avg_overall),\n XG: parseFloat(form[1].data[0].stats.xg_for_avg_away),\n ScoredOverall: parseFloat(\n form[1].data[0].stats.seasonScoredNum_overall\n ),\n ScoredAverage: parseFloat(\n form[1].data[0].stats.seasonScoredAVG_away\n ),\n PlayedHome: parseFloat(\n form[1].data[0].stats.seasonMatchesPlayed_home\n ),\n PlayedAway: parseFloat(\n form[1].data[0].stats.seasonMatchesPlayed_away\n ),\n ConcededOverall: parseFloat(\n form[1].data[0].stats.seasonConcededNum_overall\n ),\n ConcededAverage: parseFloat(\n form[1].data[0].stats.seasonConcededAVG_away\n ),\n XGAgainstAvgOverall: parseFloat(\n form[1].data[0].stats.xg_against_avg_overall\n ),\n XGAgainstAverage: parseFloat(\n form[1].data[0].stats.xg_against_avg_away\n ),\n CleanSheetPercentage: parseFloat(\n form[1].data[0].stats.seasonCSPercentage_overall\n ),\n AveragePossessionOverall: parseFloat(\n form[1].data[0].stats.possessionAVG_overall\n ),\n AveragePossession: parseFloat(\n form[1].data[0].stats.possessionAVG_away\n ),\n AverageShotsOnTargetOverall: parseFloat(\n form[1].data[0].stats.shotsOnTargetAVG_overall\n ),\n AverageShotsOnTarget: parseFloat(\n form[1].data[0].stats.shotsOnTargetAVG_away\n ),\n AverageDangerousAttacksOverall: parseFloat(\n form[1].data[0].stats.dangerous_attacks_avg_overall\n ),\n PPG: parseFloat(form[1].data[0].stats.seasonPPG_overall),\n AttacksAverage: parseFloat(\n form[1].data[0].stats.attacks_avg_away\n ),\n AverageDangerousAttacks: parseFloat(\n form[1].data[0].stats.dangerous_attacks_avg_away\n ),\n BTTSPercentage: parseInt(\n form[1].data[0].stats.seasonBTTSPercentage_away\n ),\n LeagueOrAll: leagueOrAll,\n LeaguePosition: `${teamPositionAway}${awayPrefix}`,\n awayRawPosition: awayTeaminLeague.rawPosition\n ? awayTeaminLeague.rawPosition\n : 0,\n awayTeamAwayPositionRaw: teamPositionAwayTable,\n LeagueAverageGoals: awayAverageGoals,\n LeagueAverageConceded: awayAverageConceded,\n },\n 1: {\n XGOverall: parseFloat(form[1].data[1].stats.xg_for_avg_overall),\n XG: parseFloat(form[1].data[1].stats.xg_for_avg_away),\n ScoredOverall: parseFloat(\n form[1].data[1].stats.seasonScoredNum_overall\n ),\n ScoredAverage: parseFloat(\n form[1].data[1].stats.seasonScoredAVG_away\n ),\n PlayedHome: parseFloat(\n form[1].data[1].stats.seasonMatchesPlayed_home\n ),\n PlayedAway: parseFloat(\n form[1].data[1].stats.seasonMatchesPlayed_away\n ),\n ConcededOverall: parseFloat(\n form[1].data[1].stats.seasonConcededNum_overall\n ),\n ConcededAverage: parseFloat(\n form[1].data[1].stats.seasonConcededAVG_away\n ),\n XGAgainstAvgOverall: parseFloat(\n form[1].data[1].stats.xg_against_avg_overall\n ),\n XGAgainstAverage: parseFloat(\n form[1].data[1].stats.xg_against_avg_away\n ),\n CleanSheetPercentage: parseFloat(\n form[1].data[1].stats.seasonCSPercentage_overall\n ),\n AveragePossessionOverall: parseFloat(\n form[1].data[1].stats.possessionAVG_overall\n ),\n AveragePossession: parseFloat(\n form[1].data[1].stats.possessionAVG_away\n ),\n AverageShotsOnTargetOverall: parseFloat(\n form[1].data[1].stats.shotsOnTargetAVG_overall\n ),\n AverageShotsOnTarget: parseFloat(\n form[1].data[1].stats.shotsOnTargetAVG_away\n ),\n AverageDangerousAttacksOverall: parseFloat(\n form[1].data[1].stats.dangerous_attacks_avg_overall\n ),\n PPG: parseFloat(form[1].data[1].stats.seasonPPG_overall),\n AttacksAverage: parseFloat(\n form[1].data[1].stats.attacks_avg_away\n ),\n AverageDangerousAttacks: parseFloat(\n form[1].data[1].stats.dangerous_attacks_avg_away\n ),\n BTTSPercentage: parseInt(\n form[1].data[1].stats.seasonBTTSPercentage_away\n ),\n LeagueOrAll: leagueOrAll,\n LeaguePosition: `${teamPositionAway}${awayPrefix}`,\n awayRawPosition: awayTeaminLeague.rawPosition\n ? awayTeaminLeague.rawPosition\n : 0,\n awayTeamAwayPositionRaw: teamPositionAwayTable,\n LeagueAverageGoals: awayAverageGoals,\n LeagueAverageConceded: awayAverageConceded,\n },\n 2: {\n XGOverall: parseFloat(form[1].data[2].stats.xg_for_avg_overall),\n XG: parseFloat(form[1].data[2].stats.xg_for_avg_away),\n ScoredOverall: parseFloat(\n form[1].data[2].stats.seasonScoredNum_overall\n ),\n ScoredAverage: parseFloat(\n form[1].data[2].stats.seasonScoredAVG_away\n ),\n PlayedHome: parseFloat(\n form[1].data[2].stats.seasonMatchesPlayed_home\n ),\n PlayedAway: parseFloat(\n form[1].data[2].stats.seasonMatchesPlayed_away\n ),\n ConcededOverall: parseFloat(\n form[1].data[2].stats.seasonConcededNum_overall\n ),\n ConcededAverage: parseFloat(\n form[1].data[2].stats.seasonConcededAVG_away\n ),\n XGAgainstAvgOverall: parseFloat(\n form[1].data[2].stats.xg_against_avg_overall\n ),\n XGAgainstAverage: parseFloat(\n form[1].data[2].stats.xg_against_avg_away\n ),\n CleanSheetPercentage: parseFloat(\n form[1].data[2].stats.seasonCSPercentage_overall\n ),\n AveragePossessionOverall: parseFloat(\n form[1].data[2].stats.possessionAVG_overall\n ),\n AveragePossession: parseFloat(\n form[1].data[2].stats.possessionAVG_away\n ),\n AverageShotsOnTargetOverall: parseFloat(\n form[1].data[2].stats.shotsOnTargetAVG_overall\n ),\n AverageShotsOnTarget: parseFloat(\n form[1].data[2].stats.shotsOnTargetAVG_away\n ),\n AverageShots: parseFloat(\n form[1].data[2].stats.shotsAVG_overall\n ),\n AverageShotsHomeOrAway: parseFloat(\n form[1].data[2].stats.shotsAVG_away\n ),\n AverageDangerousAttacksOverall: parseFloat(\n form[1].data[2].stats.dangerous_attacks_avg_overall\n ),\n PPG: parseFloat(form[1].data[2].stats.seasonPPG_overall),\n AttacksAverage: parseFloat(\n form[1].data[2].stats.attacks_avg_away\n ),\n AverageDangerousAttacks: parseFloat(\n form[1].data[2].stats.dangerous_attacks_avg_away\n ),\n BTTSPercentage: parseInt(\n form[1].data[2].stats.seasonBTTSPercentage_away\n ),\n lastThreeForm: lastThreeFormAway.reverse(),\n LastFiveForm: lastFiveFormAway.reverse(),\n LastSixForm: lastSixFormAway.reverse(),\n LastTenForm: lastTenFormAway.reverse(),\n LeagueOrAll: leagueOrAll,\n LeaguePosition: `${teamPositionAway}${awayPrefix}`,\n awayRawPosition: awayTeaminLeague.rawPosition\n ? awayTeaminLeague.rawPosition\n : 0,\n awayTeamAwayPositionRaw: teamPositionAwayTable,\n SeasonPPG: awaySeasonPPG,\n WinPercentage: awayTeamWinPercentageAway,\n LossPercentage: awayTeamLossPercentageAway,\n DrawPercentage: awayTeamDrawPercentageAway,\n formRun: formRunAway,\n goalDifference:\n form[1].data[2].stats.seasonGoalDifference_overall,\n goalDifferenceHomeOrAway:\n form[1].data[2].stats.seasonGoalDifference_away,\n BttsPercentage:\n form[1].data[2].stats.seasonBTTSPercentage_overall,\n BttsPercentageHomeOrAway:\n form[1].data[2].stats.seasonBTTSPercentage_away,\n CardsTotal: form[1].data[2].stats.cardsTotal_overall,\n CornersAverage: form[1].data[2].stats.cornersAVG_overall,\n ScoredBothHalvesPercentage:\n form[1].data[2].stats.scoredBothHalvesPercentage_overall,\n LastMatch: await convertTimestamp(\n form[1].data[0].last_updated_match_timestamp\n ),\n WDLRecord: WDLinLeagueAway,\n LeagueAverageGoals: awayAverageGoals,\n LeagueAverageConceded: awayAverageConceded,\n },\n },\n });\n }\n\n match.homeBadge = fixture.home_image;\n match.awayBadge = fixture.away_image;\n\n match.homePpg = fixture.home_ppg.toFixed(2);\n match.awayPpg = fixture.away_ppg.toFixed(2);\n\n match.lastFiveFormHome = lastFiveFormHome;\n match.lastFiveFormAway = lastFiveFormAway;\n\n match.homeRawPosition = homeTeaminLeague.rawPosition;\n match.awayRawPosition = awayTeaminLeague.rawPosition;\n\n match.homeTeamHomePosition = `${teamPositionHomeTable}${homePrefixHomeTable}`;\n match.awayTeamAwayPosition = `${teamPositionAwayTable}${awayPrefixAwayTable}`;\n\n match.homeTeamHomePositionRaw = teamPositionHomeTable;\n match.awayTeamAwayPositionRaw = teamPositionAwayTable;\n\n match.homeTeamWinPercentage = homeTeamWinPercentageHome;\n match.awayTeamWinPercentage = awayTeamWinPercentageAway;\n\n match.homeTeamLossPercentage = homeTeamLossPercentageHome;\n match.awayTeamLossPercentage = awayTeamLossPercentageAway;\n\n match.homeTeamDrawPercentage = homeTeamDrawPercentageHome;\n match.awayTeamDrawPercentage = awayTeamDrawPercentageAway;\n match.status = fixture.status;\n match.over25Odds = fixture.odds_ft_over25;\n match.btts_potential = fixture.btts_potential;\n match.game = match.homeTeam + \" v \" + match.awayTeam;\n match.stadium = fixture.stadium_name;\n match.homeGoals = fixture.homeGoalCount;\n match.awayGoals = fixture.awayGoalCount;\n\n match.expectedGoalsHomeToDate = fixture.team_a_xg_prematch;\n match.expectedGoalsAwayToDate = fixture.team_b_xg_prematch;\n match.game_week = fixture.game_week;\n\n if (match.status !== \"canceled\" || match.status !== \"suspended\") {\n matches.push(match);\n await createFixture(match, false);\n }\n }\n\n if (matches.length > 0) {\n ReactDOM.render(\n \n getScorePrediction(day)}\n className={\"GeneratePredictions\"}\n />\n
    Prediction engine v4.2.1 (26/04/24)
    \n \n
    \n Use the below filters to remove predictions that don't meet\n the set criteria. These will be greyed out and not included\n in multi-builders and ROI stats\n
    \n
    Goals for/against differential filter (BETA)
    \n
    \n I'm looking for tips where the goal differential between\n teams is at least...\n
    \n \n
    \n Goals for/against home or away differential filter (BETA)\n
    \n
    \n I'm looking for tips where the goal differential (home or\n away only) between teams is at least...\n
    \n \n \n
    XG for/against differential filter (BETA)
    \n
    \n I'm looking for tips where the XG differential between\n teams is at least...\n
    \n \n
    \n \n
    Last 10 points differential filter (BETA)
    \n
    \n I'm looking for tips where the points differential between\n teams is at least...\n
    \n \n
    \n \n
    Choose your risk profile
    \n
    \n I'm looking for tips where the odds are between...\n
    \n \n
    \n \n }\n />\n ,\n
    ,\n document.getElementById(\"GeneratePredictions\")\n );\n }\n\n // }\n }\n\n ReactDOM.render(\n
    \n
    \n
    ,\n document.getElementById(\"Loading\")\n );\n\n async function updateResults(bool) {\n console.log(\"updating results\");\n if (allLeagueResultsArrayOfObjects.length > 0 && bool === true) {\n await fetch(`${process.env.REACT_APP_EXPRESS_SERVER}results`, {\n method: \"DELETE\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n }).then(async () => {\n await fetch(`${process.env.REACT_APP_EXPRESS_SERVER}results`, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(allLeagueResultsArrayOfObjects),\n });\n });\n } else {\n console.log(\"EMPTY RESULTS\");\n }\n }\n\n if (!isStoredLocally) {\n await fetch(`${process.env.REACT_APP_EXPRESS_SERVER}allForm/${date}`, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ allForm }),\n });\n await updateResults(true);\n }\n if (!leaguesStored) {\n await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}leagues/${todaysDate}`,\n {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ leagueArray }),\n }\n );\n }\n // const allFixtures = await RenderAllFixtures(matches, false)\n ReactDOM.render(\n ,\n document.getElementById(\"FixtureContainer\")\n );\n // ReactDOM.render(),document.getElementById(\"FixtureContainer\")\n setTimeout(() => {\n isFunctionRunning = false;\n }, 3000);\n }\n}\n","import React from \"react\";\n\nfunction HeadToHead(props) {\n return (\n
      \n
    • \n {`Venue - ${props.stadium}`}\n
    • \n
      \n
    • \n {`Matches played: ${props.matches}`}\n
    • \n
    • \n {`${props.homeTeam} wins: ${props.homeWins}`}\n
    • \n
    • \n {`${props.awayTeam} wins: ${props.awayWins}`}\n
    • \n
    • \n {`Draws: ${props.draws}`}\n
    • \n
      \n
      \n \n {`Average goals in fixture: ${props.averageGoals}`}\n \n \n {`Best oods for home win @: ${props.bestHomeOdds}`}\n \n \n {`Best oods for away win @: ${props.bestAwayOdds}`}\n \n
      \n \n {`Last meeting - ${props.lastGameStadiumName} ${props.lastGameDate}`}\n \n
      \n \n {`${props.lastGameHomeTeam}`}\n
      \n {`${props.lastGameHomeGoals}`}\n {`${props.lastGameAwayGoals}`}\n
      {`${props.lastGameAwayTeam}`}
      \n \n\n \n {`Second to last meeting - ${props.secondToLastGameStadiumName} ${props.secondToLastGameDate}`}\n \n
      \n \n {`${props.secondToLastGameHomeTeam}`}\n
      \n {`${props.secondToLastGameHomeGoals}`}\n {`${props.secondToLastGameAwayGoals}`}\n
      \n {`${props.secondToLastGameAwayTeam}`}\n
      \n \n
    \n );\n}\n\nexport default HeadToHead;\n","import React from \"react\";\nimport { withStyles } from \"@material-ui/core/styles\";\nimport Table from \"@material-ui/core/Table\";\nimport TableBody from \"@material-ui/core/TableBody\";\nimport TableCell from \"@material-ui/core/TableCell\";\nimport TableContainer from \"@material-ui/core/TableContainer\";\nimport TableHead from \"@material-ui/core/TableHead\";\nimport TableRow from \"@material-ui/core/TableRow\";\n\nconst StyledTableCell = withStyles((theme) => ({\n head: {\n // backgroundColor: \"#dedddd\",\n padding: 10,\n textAlign: \"center\",\n fontSize: \"2em\",\n fontFamily: 'inherit',\n // border: \"none\",\n margin: \"none\",\n color: 'white',\n lineHeight: '2em',\n backgroundColor: '#030061',\n },\n body: {\n fontSize: \"2em\",\n fontFamily: 'inherit',\n padding: 10,\n color: 'white',\n // border: \"none\",\n margin: \"none\",\n backgroundColor: '#030061',\n },\n}))(TableCell);\n\nconst StyledTableRow = withStyles((theme) => ({\n root: {\n \"&:nth-of-type(odd)\": {\n backgroundColor: \"#030061\",\n textAlign: \"center\",\n },\n \"&:nth-of-type(even)\": {\n backgroundColor: \"#030052\",\n textAlign: \"center\",\n },\n },\n}))(TableRow);\n\n\nexport default function CustomizedTables(props) {\n\n\n return (\n \n \n \n \n Stat\n H2H history\n XGTipping forecast\n Odds (yes)\n Odds (no)\n \n \n \n \n \n Over 0.5 Goals %\n \n \n {`${props.o05Stat}%`}\n \n {\"-\"}\n {props.o05Odds}\n {props.u05Odds}\n \n \n \n Over 1.5 Goals %\n \n \n {`${props.o15Stat}%`}\n \n {\"-\"}\n {props.o15Odds}\n {props.u15Odds}\n \n \n \n Over 2.5 Goals %\n \n \n {`${props.o25Stat}%`}\n \n {\"-\"}\n {props.o25Odds}\n {props.u25Odds}\n \n \n \n Over 3.5 Goals %\n \n \n {`${props.o35Stat}%`}\n \n {\"-\"}\n {props.o35Odds}\n {props.u35Odds}\n \n \n
    \n
    \n );\n}\n","import ReactDOM from \"react-dom\";\nimport HeadToHead from \"../components/HeadToHead\";\nimport { Fragment } from \"react\";\nimport CustomizedTables from \"../components/Table\";\n\nexport async function getTeamStats(\n id,\n home,\n away,\n homeBTTS,\n homeOnlyBTTS,\n awayBTTS,\n awayOnlyBTTS\n) {\n let identifier = id;\n let bestHomeOdds;\n let bestHomeOddsProvider;\n let bestAwayOdds;\n let bestAwayOddsProvider;\n\n let match = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}match/${identifier}`\n );\n await match.json().then(async (match) => {\n let matchArr = match.data.h2h.previous_matches_ids;\n let previousMatchDetails;\n let secondToPreviousMatchDetails;\n\n let oddsComparisonHomeArray = [];\n let oddsComparisonAwayArray = [];\n\n if (match.data.odds_comparison) {\n oddsComparisonHomeArray = match.data.odds_comparison[\"FT Result\"][1];\n oddsComparisonAwayArray = match.data.odds_comparison[\"FT Result\"][2];\n\n let sortedHomeOdds = Object.entries(oddsComparisonHomeArray).sort(\n (a, b) => b[1] - a[1]\n );\n let sortedAwayOdds = Object.entries(oddsComparisonAwayArray).sort(\n (a, b) => b[1] - a[1]\n );\n\n bestHomeOddsProvider = sortedHomeOdds[0][0];\n bestHomeOdds = sortedHomeOdds[0][1];\n bestAwayOddsProvider = sortedAwayOdds[0][0];\n bestAwayOdds = sortedAwayOdds[0][1];\n } else {\n bestHomeOddsProvider = \"N/A\";\n bestHomeOdds = \"N/A\";\n bestAwayOddsProvider = \"N/A\";\n bestAwayOdds = \"N/A\";\n }\n\n async function getBTTSPercentage(\n homeToal,\n home,\n awayTotal,\n away,\n fixtureHistory\n ) {\n console.log(homeToal)\n console.log(home)\n console.log(awayTotal)\n console.log(away)\n console.log(fixtureHistory)\n\n let total = homeToal + home + awayTotal + away + fixtureHistory;\n return total / 5;\n }\n\n async function getFairOdds(impliedProbability) {\n let impliedProbabilityDivided = impliedProbability / 100;\n return (1 / impliedProbabilityDivided).toFixed(2);\n }\n\n if (match.data.h2h.previous_matches_results.totalMatches > 0) {\n matchArr.sort((a, b) => b.date_unix - a.date_unix);\n let lastMatch = matchArr[0].id;\n let secondMatchExists = true;\n let secondToLastMatch =\n matchArr[1] !== undefined ? matchArr[1].id : false;\n\n let previousMatch = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}match/${lastMatch}`\n );\n let dateObject;\n let date;\n let date2;\n await previousMatch.json().then(async (game) => {\n previousMatchDetails = game.data;\n const unixTimestamp = previousMatchDetails.date_unix;\n const milliseconds = unixTimestamp * 1000;\n dateObject = new Date(milliseconds);\n date = `${dateObject.getDate()}/${\n dateObject.getMonth() + 1\n }/${dateObject.getFullYear()}`;\n\n let secondToPreviousMatch;\n let dateObject2;\n\n if (secondMatchExists !== false) {\n secondToPreviousMatch = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}match/${secondToLastMatch}`\n );\n await secondToPreviousMatch.json().then((game) => {\n secondToPreviousMatchDetails = game.data;\n const unixTimestamp = secondToPreviousMatchDetails.date_unix;\n const milliseconds = unixTimestamp * 1000;\n dateObject2 = new Date(milliseconds);\n date2 = `${dateObject2.getDate()}/${\n dateObject2.getMonth() + 1\n }/${dateObject2.getFullYear()}`;\n });\n }\n });\n\n const BTTSForecast = await getBTTSPercentage(\n homeBTTS,\n homeOnlyBTTS,\n awayBTTS,\n awayOnlyBTTS,\n match.data.h2h.betting_stats.bttsPercentage\n );\n const fairOddsBTTSYes = await getFairOdds(BTTSForecast);\n const fairOddsBTTSNo = await getFairOdds(100 - BTTSForecast);\n console.log(match.data)\n\n ReactDOM.render(\n \n

    Fixture history

    \n \n \n
    ,\n document.getElementById(`H2HStats${identifier}`)\n );\n } else {\n ReactDOM.render(\n
    No fixture history found
    ,\n document.getElementById(`H2HStats${identifier}`)\n );\n }\n });\n}\n","async function getOverOrUnderText(xgSum) {\n let overUnderAchievingSum = xgSum;\n let text;\n switch (true) {\n case overUnderAchievingSum > 1.5:\n text =\n \"Underachieving drastically against their expected goal difference.\";\n break;\n case overUnderAchievingSum > 1.25 && overUnderAchievingSum <= 1.5:\n text =\n \"Underachieving to a large degree against their expected goal difference.\";\n break;\n case overUnderAchievingSum > 1 && overUnderAchievingSum <= 1.25:\n text = \"Underachieving against their expected goal difference.\";\n break;\n case overUnderAchievingSum > 0.75 && overUnderAchievingSum <= 1:\n text =\n \"Underachieving to a small degree against their expected goal difference.\";\n break;\n case overUnderAchievingSum > 0.4 && overUnderAchievingSum <= 0.75:\n text =\n \"Underachieving slighly against their expected goal difference.\";\n break;\n case overUnderAchievingSum > -0.4 && overUnderAchievingSum <= 0.4:\n text =\n \"Roughly tracking on par with their expected goal difference.\";\n break;\n\n case overUnderAchievingSum < -0.4 && overUnderAchievingSum >= -0.75:\n text =\n \"Overachieving slighly against their expected goal difference.\";\n break;\n case overUnderAchievingSum < -0.75 && overUnderAchievingSum >= -1:\n text =\n \"Overachieving to a small degree against their expected goal difference.\";\n break;\n case overUnderAchievingSum < -1 && overUnderAchievingSum >= -1.25:\n text = \"Overachieving against their expected goal difference.\";\n break;\n case overUnderAchievingSum < -1.25 && overUnderAchievingSum >= -1.5:\n text =\n \"Overachieving to a large degree against their expected goal difference.\";\n break;\n case overUnderAchievingSum < -1.5:\n text =\n \"Overachieving drastically against their expected goal difference.\";\n break;\n default:\n text = \"\";\n break;\n }\n return text;\n}\n\nexport async function diff(a, b) {\n return parseFloat(a - b).toFixed(2);\n}\n\nasync function getXGDifferential(xgFor, xgAgainst, goalsFor, goalsAgainst) {\n let xgDiff = xgFor - xgAgainst;\n let goalDiff = goalsFor - goalsAgainst;\n let compareXgAndGoalDiff = await diff(xgDiff, goalDiff);\n\n return compareXgAndGoalDiff;\n}\n\nasync function getAttackingSummary(goalsRecent, goalsLongTerm) {\n\n let text;\n if (goalsRecent >= 3) {\n switch (true) {\n case goalsRecent > goalsLongTerm:\n text = \"Free scoring and improving in front of goal recently.\";\n break;\n case goalsRecent === goalsLongTerm:\n text = \"Free scoring and consistent in front of goal.\";\n break;\n case goalsRecent < goalsLongTerm:\n text = \"Free scoring but less so recently.\";\n break;\n default:\n break;\n }\n } else if (goalsRecent < 3 && goalsRecent >= 2) {\n switch (true) {\n case goalsRecent > goalsLongTerm:\n text =\n \"Impressive scoring stats and improving in front of goal recently.\";\n break;\n case goalsRecent === goalsLongTerm:\n text = \"Impressive scoring stats and consistent in front of goal.\";\n break;\n case goalsRecent < goalsLongTerm:\n text = \"Impressive scoring stats but less so recently.\";\n break;\n default:\n break;\n }\n } else if (goalsRecent < 2 && goalsRecent >= 1) {\n switch (true) {\n case goalsRecent > goalsLongTerm:\n text = \"Decent scoring stats and improving in front of goal recently.\";\n break;\n case goalsRecent === goalsLongTerm:\n text = \"Decent scoring stats and consistent in front of goal.\";\n break;\n case goalsRecent < goalsLongTerm:\n text = \"Decent scoring stats but less so recently.\";\n break;\n default:\n break;\n }\n } else if (goalsRecent < 1 && goalsRecent > 0) {\n switch (true) {\n case goalsRecent > goalsLongTerm:\n text = \"Poor scoring stats but improving in front of goal recently.\";\n break;\n case goalsRecent === goalsLongTerm:\n text = \"Poor scoring stats and consistently poor in front of goal.\";\n break;\n case goalsRecent < goalsLongTerm:\n text = \"Poor scoring stats showing no signs of improvement.\";\n break;\n default:\n break;\n }\n } else if (goalsRecent === 0) {\n switch (true) {\n case goalsRecent === 0:\n text = \"Woeful goal stats in recent games.\";\n break;\n default:\n text = \"\";\n break;\n }\n }\n return text;\n}\n\nasync function getDefenceSummary(cleansheetStat) {\n let text;\n switch (true) {\n case cleansheetStat > 80:\n text = `Incredibly strong defensively, with ${cleansheetStat}% of their games ending in a cleansheet`;\n break;\n case cleansheetStat > 60 && cleansheetStat <= 80:\n text = `Very strong defensively, with ${cleansheetStat}% of their games ending in a cleansheet`;\n break;\n case cleansheetStat > 40 && cleansheetStat <= 60:\n text = `Defensively impressive, with ${cleansheetStat}% of their games ending in a cleansheet`;\n break;\n case cleansheetStat > 20 && cleansheetStat <= 40:\n text = `Defensively, ${cleansheetStat}% of their games have ended in a cleansheet`;\n break;\n case cleansheetStat > 1 && cleansheetStat <= 20:\n text = `Defensively frail, with only ${cleansheetStat}% of their games ending in a cleansheet`;\n break;\n case cleansheetStat === 0:\n text = `Defensively weak, with ${cleansheetStat}% of their games ending in a cleansheet`;\n break;\n default:\n break;\n }\n return text;\n}\n\nasync function GenerateFormSummary(form, lastx, recentForm) {\n let text;\n // let six = lastx[2];\n let ten = lastx[1];\n let five = lastx[0];\n\n let xgSum = await getXGDifferential(\n form.XGOverall,\n form.XGAgainstAvgOverall,\n form.ScoredOverall / 10,\n form.ConcededOverall / 10\n );\n let xgText = await getOverOrUnderText(xgSum);\n let attackString = await getAttackingSummary(\n form.last5Goals,\n form.last10Goals\n );\n let defenceString = await getDefenceSummary(form.CleanSheetPercentage);\n let pointsAverageTotal =\n (parseFloat(five) + parseFloat(ten)) / 2;\n\n if (pointsAverageTotal >= 2.6) {\n switch (true) {\n case five > ten:\n text =\n \"Outstanding recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Outstanding recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Outstanding recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else if (pointsAverageTotal >= 2.3) {\n switch (true) {\n case five > ten:\n text =\n \"Excellent recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Excellent recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Excellent recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else if (pointsAverageTotal >= 2) {\n switch (true) {\n case five > ten:\n text =\n \"Very good recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Very good recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Very good recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else if (pointsAverageTotal >= 1.7) {\n switch (true) {\n case five > ten:\n text =\n \"Good recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Good recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Good recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else if (pointsAverageTotal >= 1.4) {\n switch (true) {\n case five > ten:\n text =\n \"Fairly good recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Fairly good recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Fairly good recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else if (pointsAverageTotal >= 1.1) {\n console.log(2);\n switch (true) {\n case five > ten:\n text =\n \"Average recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Average recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Average recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else if (pointsAverageTotal >= 0.8) {\n switch (true) {\n case five > ten:\n text =\n \"Poor recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Poor recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Poor recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else if (pointsAverageTotal >= 0.5) {\n switch (true) {\n case five > ten:\n text =\n \"Very poor recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Very poor recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Very poor recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else if (pointsAverageTotal < 0.5) {\n switch (true) {\n case five > ten:\n text =\n \"Terrible recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Terrible recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Terrible recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else {\n console.log(pointsAverageTotal);\n }\n return text + ` ${xgText} ${attackString} ${defenceString}`;\n}\n\nexport default GenerateFormSummary;\n","// import { light } from \"@material-ui/core/styles/createPalette\";\n// import { toBePartiallyChecked } from \"@testing-library/jest-dom/dist/matchers\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n RadialLinearScale,\n PointElement,\n ArcElement,\n LineElement,\n Filler,\n BarElement,\n Title,\n Tooltip,\n Legend,\n} from \"chart.js\";\nimport { Line, Radar, Bar } from \"react-chartjs-2\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n RadialLinearScale,\n PointElement,\n ArcElement,\n Filler,\n BarElement,\n LineElement,\n Title,\n Tooltip,\n Legend\n);\n\nexport function Chart(props) {\n let length;\n let depth;\n\n if (props.type === \"Points over time\") {\n length = props.data1.length * 3;\n depth = 0;\n } else if (props.type === \"Rolling average points over last 10\") {\n length = Math.abs(props.height);\n depth = 0;\n } else if (Math.abs(props.height) > Math.abs(props.depth)) {\n length = Math.abs(props.height);\n depth = -Math.abs(props.height);\n } else if (Math.abs(props.height) < Math.abs(props.depth)) {\n length = Math.abs(props.depth);\n depth = -Math.abs(props.depth);\n } else {\n length = Math.abs(props.depth);\n depth = -Math.abs(props.depth);\n }\n\n const options = {\n color: \"#030061\",\n responsive: true,\n aspectRatio: 1.2,\n maintainAspectRatio: true,\n layout: {\n padding: 3,\n },\n elements: {\n point: {\n radius: 0,\n },\n },\n scales: {\n y: {\n suggestedMin: depth,\n suggestedMax: length,\n // suggestedMax: Math.max(...props.data1) > 3 ? Math.max(...props.data1) : 3,\n grid: {\n borderWidth: 1,\n borderColor: \"black\",\n },\n ticks: {\n font: {\n size: 12,\n },\n },\n },\n x: {\n title: {\n display: false,\n text: \"Last X Games\",\n font: {\n size: 14,\n },\n },\n grid: {\n borderWidth: 1,\n borderColor: \"black\",\n },\n ticks: {\n display: false,\n font: {\n size: 14,\n },\n },\n },\n },\n plugins: {\n legend: {\n position: \"top\",\n\n labels: {\n boxHeight: 5,\n },\n },\n title: {\n display: true,\n text: props.type,\n color: '#030061',\n font: {\n size: 14,\n },\n },\n },\n };\n\n const labels = Array.from(props.data1.keys());\n\n let data = {\n labels,\n datasets: [\n {\n label: props.team1,\n font: {\n color: \"black\",\n },\n data: props.data1,\n borderColor: \"#030061\",\n borderWidth: 2,\n backgroundColor: \"#030061\",\n tension: props.tension,\n },\n {\n label: props.team2,\n data: props.data2,\n borderColor: \"#970d00\",\n borderWidth: 2,\n backgroundColor: \"#970d00\",\n tension: props.tension,\n },\n ],\n };\n\n return ;\n}\n\nexport function RadarChart(props) {\n const options = {\n color: \"#030061\",\n scales: {\n r: {\n angleLines: {\n display: false,\n },\n suggestedMin: 0,\n suggestedMax: 1,\n ticks: {\n precision: 0,\n display: false,\n },\n // grid: {\n // circular: true,\n // }\n },\n },\n plugins: {\n legend: {\n position: \"top\",\n\n labels: {\n boxHeight: 10,\n color: '#030061'\n },\n },\n title: {\n display: true,\n text: props.title,\n color: '#030061',\n font: {\n size: 14,\n },\n },\n },\n };\n\n let data = {\n labels: [\"Attack rating\", \"Defence rating\", \"Ball retention\", \"XG For\", \"XG Against\", \"Directness\", \"Attacking precision\"],\n datasets: [\n {\n label: props.team1,\n data: props.data,\n fill: true,\n backgroundColor: \"rgba(54, 162, 235, 0.2)\",\n borderColor: \"#030061\",\n pointBackgroundColor: \"#030061\",\n pointBorderColor: \"#fff\",\n pointHoverBackgroundColor: \"#fff\",\n pointHoverBorderColor: \"rgb(255, 99, 132)\",\n borderWidth: 2,\n },\n {\n label: props.team2,\n data: props.data2,\n fill: true,\n backgroundColor: \"rgba(255, 99, 132, 0.2)\",\n borderColor: \"#970d00\",\n pointBackgroundColor: \"#970d00\",\n pointBorderColor: \"#fff\",\n pointHoverBackgroundColor: \"#fff\",\n pointHoverBorderColor: \"rgb(54, 162, 235)\",\n borderWidth: 2,\n },\n ],\n };\n\n return ;\n}\n\nexport function BarChart(props) {\n const datasetOne = props.data1;\n const datasetTwo = props.data2;\n const sum = datasetTwo.map(function (num, idx) {\n return num - datasetOne[idx];\n });\n\n const max = Math.max(...sum);\n const min = Math.min(...sum);\n\n const largest = findLargestNum(max, min);\n\n function findLargestNum(numOne, numTwo) {\n const tempArr = [];\n const firstNum = Math.abs(numOne);\n const secondNum = Math.abs(numTwo);\n tempArr.push(firstNum, secondNum);\n\n return Math.max(...tempArr);\n }\n\n const options = {\n color: \"#030061\",\n indexAxis: \"y\",\n // Elements options apply to all of the options unless overridden in a dataset\n // In this case, we are setting the border of each horizontal bar to be 2px wide\n aspectRatio: 1.3,\n elements: {\n bar: {\n borderWidth: 2,\n },\n },\n scales: {\n x: {\n min: -4,\n max: 4,\n ticks: {\n display: false,\n },\n },\n y: {\n ticks: {\n font: {\n size: 10,\n },\n },\n },\n },\n responsive: true,\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n enabled: false,\n },\n title: {\n display: true,\n text: props.text,\n color: '#030061',\n font: {\n size: 14,\n },\n },\n },\n };\n\n const labels = [\n \"Highest Goals\",\n \"Fewest Conceeded\",\n \"PPG\",\n \"Highest XG\",\n \"Fewest XG Conceeded\",\n \"Shots On Target\",\n \"Dangerous Attacks\",\n \"Av. Possession\",\n \"Home/Away Goal Diff\",\n \"Corners\",\n ];\n\n const data = {\n labels,\n datasets: [\n {\n // label: 'Dataset 1',\n legend: {\n display: false,\n },\n data: sum,\n backgroundColor(context) {\n const index = context.dataIndex;\n const value = context.dataset.data[index];\n return value < 0 ? \"#030061\" : \"#970d00\";\n },\n },\n ],\n };\n\n return ;\n}\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\nconst SofaLineupsWidget = ({ id, team1, team2, time, homeGoals, awayGoals }) => {\n const iframeSrc = `https://widgets.sofascore.com/embed/lineups?id=${id}&widgetBackground=Gray&v=2`;\n\n let differenceInSeconds, minutes\n const currentTime = new Date().getTime() / 1000;\n // Calculate the difference in seconds\n if(time > 0){\n differenceInSeconds = time - currentTime;\n minutes = Math.floor(differenceInSeconds / 60);\n } else {\n minutes = -99999999\n }\n\n\n\n if(team1 === \"N/A\") {\n return
    No lineups available for this match yet
    \n } else if (minutes > 60) {\n return (\n
    \n
    Predicted lineups
    \n \n
    \n \n );\n } else if (minutes < 60 && minutes > 0) {\n return (\n
    \n
    Lineups
    \n \n
    \n \n );\n } else if (minutes < 0) {\n return (\n
    \n
    Score: {`${team1}: ${homeGoals} - ${team2}: ${awayGoals}`}
    \n Score not live updated\n
    Live attacking momentum and goals
    \n \n
    \n
    Lineups and in-play ratings
    \n \n \n \n );\n }\n else {\n return
    {`Lineups coming in approximately ${minutes - 60} minutes`}
    ;\n }\n};\n\n\nSofaLineupsWidget.propTypes = {\n id: PropTypes.string.isRequired,\n team1: PropTypes.string.isRequired,\n team2: PropTypes.string.isRequired,\n};\n\nexport default SofaLineupsWidget;\n","import ReactDOM from \"react-dom\";\nimport { Button } from \"../components/Button\";\nimport Stats from \"../components/createStatsDiv\";\nimport Div from \"../components/Div\";\nimport { allForm } from \"../logic/getFixtures\";\nimport { getTeamStats } from \"../logic/getTeamStats\";\nimport { getPointsFromLastX } from \"../logic/getScorePredictions\";\nimport { allLeagueResultsArrayOfObjects } from \"../logic/getFixtures\";\nimport GenerateFormSummary from \"../logic/compareFormTrend\";\nimport { Chart, RadarChart, BarChart } from \"../components/Chart\";\nimport Collapsable from \"../components/CollapsableElement\";\nimport { clicked } from \"../logic/getScorePredictions\";\nimport SofaLineupsWidget from \"../components/SofaScore\";\nimport { arrayOfGames } from \"../logic/getFixtures\";\n\nexport async function calculateAttackingStrength(stats) {\n // Define weights for each metric (you can adjust these based on your preference)\n const weights = {\n // averagePossession: 0.15,\n \"Average Dangerous Attacks\": 0.1,\n \"Average Shots\": 0.05,\n \"Average Shots On Target\": 0.15,\n \"Average Expected Goals\": 0.25,\n \"Recent XG\": 0.15,\n \"Average Goals\": 0.25,\n Corners: 0.05,\n };\n\n // Define the ranges for normalization\n const ranges = {\n // averagePossession: { min: 25, max: 75 },\n \"Average Dangerous Attacks\": { min: 25, max: 75 }, // Adjust the max value as needed\n \"Average Shots\": { min: 4, max: 17 }, // Adjust the max value as needed\n \"Average Shots On Target\": { min: 2, max: 10 }, // Adjust the max value as needed\n \"Average Expected Goals\": { min: 0.25, max: 2.75 }, // Adjust the max value as needed\n \"Recent XG\": { min: 0.25, max: 2.75 }, // Adjust the max value as needed\n \"Average Goals\": { min: 0.25, max: 2.75 }, // Adjust the max value as needed\n Corners: { min: 2, max: 9 },\n };\n\n // Normalize each metric value and calculate the weighted sum\n let weightedSum = 0;\n for (const metric in stats) {\n if (\n stats.hasOwnProperty(metric) &&\n weights.hasOwnProperty(metric) &&\n ranges.hasOwnProperty(metric)\n ) {\n const normalizedValue =\n (stats[metric] - ranges[metric].min) /\n (ranges[metric].max - ranges[metric].min);\n weightedSum += normalizedValue * weights[metric];\n } else {\n console.log(metric);\n }\n }\n\n return parseFloat(weightedSum.toFixed(2));\n}\n\nexport async function calculateDefensiveStrength(stats, normalizedValue = 1) {\n let normValue = normalizedValue;\n // Define weights for each metric (you can adjust these based on your preference)\n const weights = {\n \"Average XG Against\": 0.3,\n \"Recent XG Against\": 0.15,\n \"Average Goals Against\": 0.3,\n \"Average SOT Against\": 0.25,\n };\n\n // Define the ranges for normalization\n const ranges = {\n \"Average XG Against\": { min: 0.25, max: 2.75 }, // Adjust the max value as needed\n \"Recent XG Against\": { min: 0.25, max: 2.75 },\n \"Average Goals Against\": { min: 0.25, max: 2.75 }, // Adjust the max value as needed\n \"Average SOT Against\": { min: 2, max: 10 },\n };\n\n // Normalize each metric value and calculate the weighted sum\n let weightedSum = 0;\n for (const metric in stats) {\n if (\n stats.hasOwnProperty(metric) &&\n weights.hasOwnProperty(metric) &&\n ranges.hasOwnProperty(metric)\n ) {\n let val =\n normValue -\n (stats[metric] - ranges[metric].min) /\n (ranges[metric].max - ranges[metric].min);\n weightedSum += val * weights[metric];\n }\n }\n\n return parseFloat(weightedSum.toFixed(2));\n}\n\nexport async function calculateMetricStrength(metricName, metricValue) {\n // Define weights for each metric (you can adjust these based on your preference)\n const weights = {\n averagePossession: 1,\n xgFor: 1,\n xgAgainst: 1,\n directnessOverall: 1,\n accuracyOverall: 1,\n };\n\n // Define the ranges for normalization\n const ranges = {\n averagePossession: { min: 20, max: 80 },\n xgFor: { min: 0.1, max: 3 },\n xgAgainst: { min: 0.1, max: 3 },\n directnessOverall: { min: 0.5, max: 5 },\n accuracyOverall: { min: 0.5, max: 7 },\n };\n\n // Ensure the metric is valid and exists in the weights and ranges objects\n if (\n !weights.hasOwnProperty(metricName) ||\n !ranges.hasOwnProperty(metricName)\n ) {\n throw new Error(\"Invalid metric name or missing normalization range.\");\n }\n\n // Normalize the metric value\n const normalizedValue =\n (metricValue - ranges[metricName].min) /\n (ranges[metricName].max - ranges[metricName].min);\n\n // Calculate the weighted score\n const weightedScore = normalizedValue * weights[metricName];\n\n return parseFloat(weightedScore.toFixed(2));\n}\n\n// export async function getDefenceStrength(goalsAgainst) {\n// let strength;\n// switch (true) {\n// case goalsAgainst >= 2.8:\n// strength = 1;\n// break;\n// case goalsAgainst >= 2.5 && goalsAgainst < 2.8:\n// strength = 2;\n// break;\n// case goalsAgainst >= 2.2 && goalsAgainst < 2.5:\n// strength = 3;\n// break;\n// case goalsAgainst >= 1.9 && goalsAgainst < 2.2:\n// strength = 4;\n// break;\n// case goalsAgainst >= 1.6 && goalsAgainst < 1.9:\n// strength = 5;\n// break;\n// case goalsAgainst >= 1.3 && goalsAgainst < 1.6:\n// strength = 6;\n// break;\n// case goalsAgainst >= 1 && goalsAgainst < 1.3:\n// strength = 7;\n// break;\n// case goalsAgainst >= 0.7 && goalsAgainst < 1:\n// strength = 8;\n// break;\n// case goalsAgainst >= 0.4 && goalsAgainst < 0.7:\n// strength = 9;\n// break;\n// case goalsAgainst < 0.4:\n// strength = 10;\n// break;\n// default:\n// break;\n// }\n// return strength;\n// }\n\n// export async function getPossessionStrength(possession) {\n// let strength;\n// switch (true) {\n// case possession >= 68:\n// strength = 10;\n// break;\n// case possession >= 64 && possession < 68:\n// strength = 9;\n// break;\n// case possession >= 60 && possession < 64:\n// strength = 8;\n// break;\n// case possession >= 56 && possession < 60:\n// strength = 7;\n// break;\n// case possession >= 52 && possession < 56:\n// strength = 6;\n// break;\n// case possession >= 48 && possession < 52:\n// strength = 5;\n// break;\n// case possession >= 44 && possession < 48:\n// strength = 4;\n// break;\n// case possession >= 40 && possession < 44:\n// strength = 3;\n// break;\n// case possession >= 35 && possession < 40:\n// strength = 2;\n// break;\n// case possession < 35:\n// strength = 1;\n// break;\n// default:\n// break;\n// }\n// return strength;\n// }\n\n// export async function getShotsStrength(Shots) {\n// let strength;\n// switch (true) {\n// case Shots >= 15:\n// strength = 10;\n// break;\n// case Shots >= 14.25 && Shots < 15:\n// strength = 9;\n// break;\n// case Shots >= 13.5 && Shots < 14.25:\n// strength = 8;\n// break;\n// case Shots >= 12.75 && Shots < 13.5:\n// strength = 7;\n// break;\n// case Shots >= 12 && Shots < 12.75:\n// strength = 6;\n// break;\n// case Shots >= 11.25 && Shots < 12:\n// strength = 5;\n// break;\n// case Shots >= 10.5 && Shots < 11.25:\n// strength = 4;\n// break;\n// case Shots >= 9.75 && Shots < 10.5:\n// strength = 3;\n// break;\n// case Shots >= 9 && Shots < 9.75:\n// strength = 2;\n// break;\n// case Shots < 9:\n// strength = 1;\n// break;\n// default:\n// break;\n// }\n// return strength;\n// }\n\n// export async function getShotsStrengthHorA(Shots) {\n// let strength;\n// switch (true) {\n// case Shots >= 19.5:\n// strength = 10;\n// break;\n// case Shots >= 18 && Shots < 19.5:\n// strength = 9;\n// break;\n// case Shots >= 17 && Shots < 18:\n// strength = 8;\n// break;\n// case Shots >= 15.5 && Shots < 17:\n// strength = 7;\n// break;\n// case Shots >= 14 && Shots < 15.5:\n// strength = 6;\n// break;\n// case Shots >= 12.5 && Shots < 14:\n// strength = 5;\n// break;\n// case Shots >= 11 && Shots < 12.5:\n// strength = 4;\n// break;\n// case Shots >= 9.5 && Shots < 11:\n// strength = 3;\n// break;\n// case Shots >= 8 && Shots < 9.5:\n// strength = 2;\n// break;\n// case Shots < 8:\n// strength = 1;\n// break;\n// default:\n// break;\n// }\n// return strength;\n// }\n\n// export async function getXGForStrength(XG) {\n// let strength;\n// switch (true) {\n// case XG >= 2.9:\n// strength = 10;\n// break;\n// case XG >= 2.6 && XG < 2.9:\n// strength = 9;\n// break;\n// case XG >= 2.3 && XG < 2.6:\n// strength = 8;\n// break;\n// case XG >= 2 && XG < 2.3:\n// strength = 7;\n// break;\n// case XG >= 1.7 && XG < 2:\n// strength = 6;\n// break;\n// case XG >= 1.4 && XG < 1.7:\n// strength = 5;\n// break;\n// case XG >= 1.1 && XG < 1.4:\n// strength = 4;\n// break;\n// case XG >= 0.8 && XG < 1.1:\n// strength = 3;\n// break;\n// case XG >= 0.5 && XG < 0.8:\n// strength = 2;\n// break;\n// case XG < 0.5:\n// strength = 1;\n// break;\n// default:\n// break;\n// }\n// return strength;\n// }\n\n// export async function getXGAgainstStrength(XGAgainst) {\n// let strength;\n// switch (true) {\n// case XGAgainst >= 2.9:\n// strength = 1;\n// break;\n// case XGAgainst >= 2.6 && XGAgainst < 2.9:\n// strength = 2;\n// break;\n// case XGAgainst >= 2.3 && XGAgainst < 2.6:\n// strength = 3;\n// break;\n// case XGAgainst >= 2 && XGAgainst < 2.3:\n// strength = 4;\n// break;\n// case XGAgainst >= 1.7 && XGAgainst < 2:\n// strength = 5;\n// break;\n// case XGAgainst >= 1.4 && XGAgainst < 1.7:\n// strength = 6;\n// break;\n// case XGAgainst >= 1.1 && XGAgainst < 1.4:\n// strength = 7;\n// break;\n// case XGAgainst >= 0.8 && XGAgainst < 1.1:\n// strength = 8;\n// break;\n// case XGAgainst >= 0.5 && XGAgainst < 0.8:\n// strength = 9;\n// break;\n// case XGAgainst < 0.5:\n// strength = 10;\n// break;\n// default:\n// break;\n// }\n// return strength;\n// }\n\n// export async function getXGDifferentialStrength(XGDiff) {\n// let strength;\n// switch (true) {\n// case XGDiff >= 1.5:\n// strength = 10;\n// break;\n// case XGDiff >= 1 && XGDiff < 1.5:\n// strength = 9;\n// break;\n// case XGDiff >= 0.5 && XGDiff < 1:\n// strength = 8;\n// break;\n// case XGDiff >= 0.25 && XGDiff < 0.5:\n// strength = 7;\n// break;\n// case XGDiff > 0 && XGDiff < 0.25:\n// strength = 6;\n// break;\n// case XGDiff <= 0 && XGDiff > -0.25:\n// strength = 5;\n// break;\n// case XGDiff <= -0.25 && XGDiff > -0.5:\n// strength = 4;\n// break;\n// case XGDiff <= -0.5 && XGDiff > -1:\n// strength = 3;\n// break;\n// case XGDiff <= -1 && XGDiff > -1.5:\n// strength = 2;\n// break;\n// case XGDiff <= -1.5:\n// strength = 1;\n// break;\n// default:\n// console.log(\"default clause triggered\");\n// break;\n// }\n// return strength;\n// }\n\nexport async function getXGtoActualDifferentialStrength(XGDiff) {\n let strength;\n switch (true) {\n case XGDiff >= 1.5:\n strength = 10;\n break;\n case XGDiff >= 1 && XGDiff < 1.5:\n strength = 9;\n break;\n case XGDiff >= 0.5 && XGDiff < 1:\n strength = 8;\n break;\n case XGDiff >= 0.25 && XGDiff < 0.5:\n strength = 7;\n break;\n case XGDiff > 0 && XGDiff < 0.25:\n strength = 6;\n break;\n case XGDiff <= 0 && XGDiff > -0.25:\n strength = 5;\n break;\n case XGDiff <= -0.25 && XGDiff > -0.5:\n strength = 4;\n break;\n case XGDiff <= -0.5 && XGDiff > -1:\n strength = 3;\n break;\n case XGDiff <= -1 && XGDiff > -1.5:\n strength = 2;\n break;\n case XGDiff <= -1.5:\n strength = 1;\n break;\n default:\n strength = 1;\n break;\n }\n return strength;\n}\n\nlet rollingGoalDiffTotalHome = [];\nlet rollingGoalDiffTotalAway = [];\n\nexport async function createStatsDiv(game, displayBool) {\n console.log(displayBool);\n if (game.status !== \"void\") {\n // takes the displayBool boolean from the fixture onClick and sets the styling of the stats div from there\n function styling(testBool) {\n let bool = testBool;\n if (bool === true && clicked === true) {\n // set stats element to display flex\n return { display: \"block\" };\n } else {\n // set stats element to display none\n return { display: \"none\" };\n }\n }\n let style = styling(displayBool);\n\n if (clicked === false) {\n alert(\"Tap Get Predictions to fetch all game stats first\");\n } else {\n let index = 2;\n let divider = 10;\n\n let gameStats = allForm.find((match) => match.id === game.id);\n const gameArrayHome = [];\n const gameArrayAway = [];\n const gameArrayHomeTeamHomeGames = [];\n const gameArrayAwayTeamAwayGames = [];\n let goalDiffArrayHome;\n let goalDiffArrayAway;\n let goalDiffHomeMovingAv = [];\n let goalDiffAwayMovingAv = [];\n let latestHomeGoalDiff;\n let latestAwayGoalDiff;\n\n var getEMA = (a, r) =>\n a.reduce(\n (p, n, i) =>\n i\n ? p.concat(\n (2 * n) / (r + 1) + (p[p.length - 1] * (r - 1)) / (r + 1)\n )\n : p,\n [a[0]]\n );\n\n const homeForm = gameStats.home[index];\n const awayForm = gameStats.away[index];\n\n if (displayBool === true) {\n // let fixtures = await fetch(\n // `${process.env.REACT_APP_EXPRESS_SERVER}leagueFixtures/${gameStats.leagueId}`\n // );\n\n console.log(gameStats);\n const pos = allLeagueResultsArrayOfObjects\n .map((i) => i.id)\n .indexOf(gameStats.leagueId);\n let matches = allLeagueResultsArrayOfObjects[pos];\n // await fixtures.json().then((matches) => {\n console.log(matches);\n const resultHome = matches.fixtures.filter(\n (game) =>\n game.home_name === gameStats.home.teamName ||\n game.away_name === gameStats.home.teamName\n );\n\n const resultHomeOnly = matches.fixtures.filter(\n (game) => game.home_name === gameStats.home.teamName\n );\n\n resultHome.sort((a, b) => b.date_unix - a.date_unix);\n resultHomeOnly.sort((a, b) => b.date_unix - a.date_unix);\n\n for (let i = 0; i < resultHome.length; i++) {\n let unixTimestamp = resultHome[i].date_unix;\n let milliseconds = unixTimestamp * 1000;\n let dateObject = new Date(milliseconds).toLocaleString(\"en-GB\", {\n timeZone: \"UTC\",\n });\n\n let won;\n let goalsScored;\n let goalsConceeded;\n\n switch (true) {\n case resultHome[i].home_name === gameStats.home.teamName:\n switch (true) {\n case resultHome[i].homeGoalCount > resultHome[i].awayGoalCount:\n won = \"W\";\n goalsScored = resultHome[i].homeGoalCount;\n goalsConceeded = resultHome[i].awayGoalCount;\n break;\n case resultHome[i].homeGoalCount ===\n resultHome[i].awayGoalCount:\n won = \"D\";\n goalsScored = resultHome[i].homeGoalCount;\n goalsConceeded = resultHome[i].awayGoalCount;\n break;\n case resultHome[i].homeGoalCount < resultHome[i].awayGoalCount:\n won = \"L\";\n goalsScored = resultHome[i].homeGoalCount;\n goalsConceeded = resultHome[i].awayGoalCount;\n break;\n default:\n break;\n }\n break;\n case resultHome[i].away_name === gameStats.home.teamName:\n switch (true) {\n case resultHome[i].homeGoalCount > resultHome[i].awayGoalCount:\n won = \"L\";\n goalsScored = resultHome[i].homeGoalCount;\n goalsConceeded = resultHome[i].awayGoalCount;\n break;\n case resultHome[i].homeGoalCount ===\n resultHome[i].awayGoalCount:\n won = \"D\";\n goalsScored = resultHome[i].homeGoalCount;\n goalsConceeded = resultHome[i].awayGoalCount;\n break;\n case resultHome[i].homeGoalCount < resultHome[i].awayGoalCount:\n won = \"W\";\n goalsScored = resultHome[i].homeGoalCount;\n goalsConceeded = resultHome[i].awayGoalCount;\n break;\n default:\n break;\n }\n break;\n default:\n break;\n }\n\n gameArrayHome.push({\n id: resultHome[i].id,\n date: dateObject,\n homeTeam: resultHome[i].home_name,\n homeGoals: resultHome[i].homeGoalCount,\n homeXG: resultHome[i].team_a_xg,\n homeOdds: resultHome[i].odds_ft_1,\n awayTeam: resultHome[i].away_name,\n awayGoals: resultHome[i].awayGoalCount,\n awayXG: resultHome[i].team_b_xg,\n awayOdds: resultHome[i].odds_ft_2,\n won: won,\n homeShots: resultHome[i].team_a_shots,\n awayShots: resultHome[i].team_b_shots,\n homeSot: resultHome[i].team_a_shotsOnTarget,\n awaySot: resultHome[i].team_b_shotsOnTarget,\n homeRed: resultHome[i].team_a_red_cards,\n awayRed: resultHome[i].team_b_red_cards,\n homePossession: resultHome[i].team_a_possession,\n awayPossession: resultHome[i].team_b_possession,\n homeDangerousAttacks: resultHome[i].team_a_dangerous_attacks,\n awayDangerousAttacks: resultHome[i].team_b_dangerous_attacks,\n homePPG: resultHome[i].pre_match_teamA_overall_ppg,\n awayPPG: resultHome[i].pre_match_teamB_overall_ppg,\n unixTimestamp: resultHome[i].date_unix,\n goalsFor: goalsScored,\n goalsAgainst: goalsConceeded,\n btts:\n resultHome[i].homeGoalCount > 0 && resultHome[i].awayGoalCount > 0\n ? \"\\u2714\"\n : \"\\u2718\",\n });\n }\n\n for (let i = 0; i < resultHomeOnly.length; i++) {\n let wonHomeOrAwayOnly;\n\n switch (true) {\n case resultHomeOnly[i].home_name === gameStats.home.teamName:\n switch (true) {\n case resultHomeOnly[i].homeGoalCount >\n resultHomeOnly[i].awayGoalCount:\n wonHomeOrAwayOnly = \"W\";\n gameArrayHomeTeamHomeGames.push(wonHomeOrAwayOnly);\n break;\n case resultHomeOnly[i].homeGoalCount ===\n resultHomeOnly[i].awayGoalCount:\n wonHomeOrAwayOnly = \"D\";\n gameArrayHomeTeamHomeGames.push(wonHomeOrAwayOnly);\n break;\n case resultHomeOnly[i].homeGoalCount <\n resultHomeOnly[i].awayGoalCount:\n wonHomeOrAwayOnly = \"L\";\n gameArrayHomeTeamHomeGames.push(wonHomeOrAwayOnly);\n break;\n default:\n break;\n }\n break;\n\n default:\n break;\n }\n }\n\n console.log(homeForm)\n\n goalDiffArrayHome = homeForm.allTeamResults.map(\n (a) => a.scored - a.conceeded\n );\n\n // goalDiffArrayHome = gameArrayHome.map(\n // (a) => a.goalsFor - a.goalsAgainst\n // );\n\n let r = 5;\n goalDiffHomeMovingAv = getEMA(\n goalDiffArrayHome.reverse(),\n goalDiffArrayHome.length < 5 ? goalDiffArrayHome.length : r\n );\n\n const cumulativeSumHome = (\n (sum) => (value) =>\n (sum += value)\n )(0);\n\n gameArrayHome.sort((a, b) => b.unixTimestamp - a.unixTimestamp);\n\n rollingGoalDiffTotalHome = goalDiffArrayHome.map(cumulativeSumHome);\n\n const resultAway = matches.fixtures.filter(\n (game) =>\n game.away_name === gameStats.away.teamName ||\n game.home_name === gameStats.away.teamName\n );\n\n const resultAwayOnly = matches.fixtures.filter(\n (game) => game.away_name === gameStats.away.teamName\n );\n\n resultAway.sort((a, b) => b.date_unix - a.date_unix);\n resultAwayOnly.sort((a, b) => b.date_unix - a.date_unix);\n\n for (let i = 0; i < resultAway.length; i++) {\n let unixTimestamp = resultAway[i].date_unix;\n let milliseconds = unixTimestamp * 1000;\n let dateObject = new Date(milliseconds).toLocaleString(\"en-GB\", {\n timeZone: \"UTC\",\n });\n\n let won;\n let goalsScored;\n let goalsConceeded;\n\n switch (true) {\n case resultAway[i].home_name === gameStats.away.teamName:\n switch (true) {\n case resultAway[i].homeGoalCount > resultAway[i].awayGoalCount:\n won = \"W\";\n goalsScored = resultAway[i].awayGoalCount;\n goalsConceeded = resultAway[i].homeGoalCount;\n break;\n case resultAway[i].awayGoalCount ===\n resultAway[i].homeGoalCount:\n won = \"D\";\n goalsScored = resultAway[i].awayGoalCount;\n goalsConceeded = resultAway[i].homeGoalCount;\n break;\n case resultAway[i].homeGoalCount < resultAway[i].awayGoalCount:\n won = \"L\";\n goalsScored = resultAway[i].awayGoalCount;\n goalsConceeded = resultAway[i].homeGoalCount;\n break;\n default:\n break;\n }\n break;\n\n case resultAway[i].away_name === gameStats.away.teamName:\n switch (true) {\n case resultAway[i].homeGoalCount > resultAway[i].awayGoalCount:\n won = \"L\";\n goalsScored = resultAway[i].awayGoalCount;\n goalsConceeded = resultAway[i].homeGoalCount;\n break;\n case resultAway[i].homeGoalCount ===\n resultAway[i].awayGoalCount:\n won = \"D\";\n goalsScored = resultAway[i].awayGoalCount;\n goalsConceeded = resultAway[i].homeGoalCount;\n break;\n case resultAway[i].homeGoalCount < resultAway[i].awayGoalCount:\n won = \"W\";\n goalsScored = resultAway[i].awayGoalCount;\n goalsConceeded = resultAway[i].homeGoalCount;\n break;\n default:\n break;\n }\n break;\n default:\n break;\n }\n\n gameArrayAway.push({\n id: resultAway[i].id,\n date: dateObject,\n homeTeam: resultAway[i].home_name,\n homeGoals: resultAway[i].homeGoalCount,\n homeXG: resultAway[i].team_a_xg,\n homeOdds: resultAway[i].odds_ft_1,\n awayTeam: resultAway[i].away_name,\n awayGoals: resultAway[i].awayGoalCount,\n awayXG: resultAway[i].team_b_xg,\n awayOdds: resultAway[i].odds_ft_2,\n won: won,\n homeShots: resultAway[i].team_a_shots,\n awayShots: resultAway[i].team_b_shots,\n homeSot: resultAway[i].team_a_shotsOnTarget,\n awaySot: resultAway[i].team_b_shotsOnTarget,\n homeRed: resultAway[i].team_a_red_cards,\n awayRed: resultAway[i].team_b_red_cards,\n homePossession: resultAway[i].team_a_possession,\n awayPossession: resultAway[i].team_b_possession,\n homeDangerousAttacks: resultAway[i].team_a_dangerous_attacks,\n awayDangerousAttacks: resultAway[i].team_b_dangerous_attacks,\n homePPG: resultAway[i].pre_match_teamA_overall_ppg,\n awayPPG: resultAway[i].pre_match_teamB_overall_ppg,\n unixTimestamp: resultAway[i].date_unix,\n goalsFor: goalsScored,\n goalsAgainst: goalsConceeded,\n btts:\n resultAway[i].homeGoalCount > 0 && resultAway[i].awayGoalCount > 0\n ? \"\\u2714\"\n : \"\\u2718\",\n });\n }\n\n for (let i = 0; i < resultAwayOnly.length; i++) {\n let wonAwayOrAwayOnly;\n\n switch (true) {\n case resultAwayOnly[i].away_name === gameStats.away.teamName:\n switch (true) {\n case resultAwayOnly[i].awayGoalCount >\n resultAwayOnly[i].homeGoalCount:\n wonAwayOrAwayOnly = \"W\";\n gameArrayAwayTeamAwayGames.push(wonAwayOrAwayOnly);\n break;\n case resultAwayOnly[i].awayGoalCount ===\n resultAwayOnly[i].homeGoalCount:\n wonAwayOrAwayOnly = \"D\";\n gameArrayAwayTeamAwayGames.push(wonAwayOrAwayOnly);\n break;\n case resultAwayOnly[i].awayGoalCount <\n resultAwayOnly[i].homeGoalCount:\n wonAwayOrAwayOnly = \"L\";\n gameArrayAwayTeamAwayGames.push(wonAwayOrAwayOnly);\n break;\n default:\n break;\n }\n break;\n\n default:\n break;\n }\n }\n\n goalDiffArrayAway = awayForm.allTeamResults.map(\n (a) => a.scored - a.conceeded\n );\n\n goalDiffAwayMovingAv = getEMA(\n goalDiffArrayAway.reverse(),\n goalDiffArrayAway.length < 5 ? goalDiffArrayAway.length : r\n );\n\n const cumulativeSumAway = (\n (sum) => (value) =>\n (sum += value)\n )(0);\n\n gameArrayAway.sort((a, b) => b.unixTimestamp - a.unixTimestamp);\n\n rollingGoalDiffTotalAway = goalDiffArrayAway.map(cumulativeSumAway);\n\n latestHomeGoalDiff =\n goalDiffHomeMovingAv[goalDiffHomeMovingAv.length - 1];\n latestAwayGoalDiff =\n goalDiffAwayMovingAv[goalDiffAwayMovingAv.length - 1];\n // });\n }\n\n const bttsArrayHome = Array.from(gameArrayHome, (x) => x.btts);\n const bttsArrayAway = Array.from(gameArrayAway, (x) => x.btts);\n const resultsArrayHome = Array.from(gameArrayHome, (x) => x.won);\n const resultsArrayAway = Array.from(gameArrayAway, (x) => x.won);\n\n let homeTeam = gameStats.home.teamName;\n let awayTeam = gameStats.away.teamName;\n\n let time = game.time;\n\n if (homeForm.last3Points === undefined) {\n homeForm.last3Points = getPointsFromLastX(homeForm.lastThreeForm);\n\n homeForm.last5Points = getPointsFromLastX(homeForm.LastFiveForm);\n\n homeForm.last6Points = getPointsFromLastX(homeForm.LastSixForm);\n\n homeForm.last10Points = getPointsFromLastX(homeForm.LastTenForm);\n\n awayForm.last3Points = getPointsFromLastX(awayForm.lastThreeForm);\n\n awayForm.last5Points = getPointsFromLastX(awayForm.LastFiveForm);\n\n awayForm.last6Points = getPointsFromLastX(awayForm.LastSixForm);\n\n awayForm.last10Points = getPointsFromLastX(awayForm.LastTenForm);\n }\n\n async function getPointAverage(pointTotal, games) {\n return pointTotal / games;\n }\n\n // let homeThreeGameAverage = await getPointAverage(\n // homeForm.last3Points,\n // 3\n // );\n\n let homeFiveGameAverage = await getPointAverage(homeForm.last5Points, 5);\n\n let homeSixGameAverage = await getPointAverage(homeForm.last6Points, 6);\n\n let homeTenGameAverage = await getPointAverage(homeForm.last10Points, 10);\n\n // let awayThreeGameAverage = await getPointAverage(\n // awayForm.last3Points,\n // 3\n // );\n\n let awayFiveGameAverage = await getPointAverage(awayForm.last5Points, 5);\n\n let awaySixGameAverage = await getPointAverage(awayForm.last6Points, 6);\n\n let awayTenGameAverage = await getPointAverage(awayForm.last10Points, 10);\n\n async function getPointsFromGames(formArr) {\n const pairings = {\n W: 3,\n D: 1,\n L: 0,\n };\n let newArr = [];\n let arrayOfIndividualPoints = [];\n let sum = 0;\n\n for (let i = 0; i < formArr.length; i++) {\n sum = sum + pairings[formArr[i]];\n newArr.push(sum);\n arrayOfIndividualPoints.push(pairings[formArr[i]]);\n }\n return [newArr, arrayOfIndividualPoints];\n }\n\n async function getLastGameResult(lastGame) {\n let text;\n switch (true) {\n case lastGame === \"L\":\n text = \"Lost\";\n break;\n case lastGame === \"D\":\n text = \"Drew\";\n break;\n case lastGame === \"W\":\n text = \"Won\";\n break;\n default:\n break;\n }\n return text;\n }\n\n let homeFormTrend = [\n homeFiveGameAverage.toFixed(2),\n homeTenGameAverage.toFixed(2),\n ];\n\n let awayFormTrend = [\n awayFiveGameAverage.toFixed(2),\n awayTenGameAverage.toFixed(2),\n ];\n\n let formTextStringHome;\n let formTextStringAway;\n\n if (displayBool === true && gameStats.home[2].LeagueOrAll === \"League\") {\n formTextStringHome = await GenerateFormSummary(\n gameStats.home[2],\n homeFormTrend,\n gameStats.home[0]\n );\n formTextStringAway = await GenerateFormSummary(\n gameStats.away[2],\n awayFormTrend,\n gameStats.away[0]\n );\n } else {\n formTextStringHome = \"\";\n formTextStringAway = \"\";\n }\n\n let favouriteRecordHome, favouriteRecordAway;\n\n\n if(homeForm.oddsReliabilityWin){\n favouriteRecordHome =\n game.homeOdds < game.awayOdds || game.homeOdds === game.awayOdds\n ? `${homeForm.teamName} have been favourites ${\n homeForm.favouriteCount\n } times. Of these games, they have Won: ${homeForm.oddsReliabilityWin.toFixed(\n 0\n )}%, Drawn: ${homeForm.oddsReliabilityDraw.toFixed(\n 0\n )}%, Lost: ${homeForm.oddsReliabilityLose.toFixed(0)}%`\n : `${homeForm.teamName} have been underdogs ${\n homeForm.underdogCount\n } times. Of these games, they have Won: ${homeForm.oddsReliabilityWinAsUnderdog.toFixed(\n 0\n )}%, Drawn: ${homeForm.oddsReliabilityDrawAsUnderdog.toFixed(\n 0\n )}%, Lost: ${homeForm.oddsReliabilityLoseAsUnderdog.toFixed(0)}%`;\n favouriteRecordAway =\n game.homeOdds > game.awayOdds || game.homeOdds === game.awayOdds\n ? `${awayForm.teamName} have been favourites ${\n awayForm.favouriteCount\n } times. Of these games, they have Won: ${awayForm.oddsReliabilityWin.toFixed(\n 0\n )}%, Drawn: ${awayForm.oddsReliabilityDraw.toFixed(\n 0\n )}%, Lost: ${awayForm.oddsReliabilityLose.toFixed(0)}%`\n : `${awayForm.teamName} have been underdogs ${\n awayForm.underdogCount\n } times. Of these games, they have Won: ${awayForm.oddsReliabilityWinAsUnderdog.toFixed(\n 0\n )}%, Drawn: ${awayForm.oddsReliabilityDrawAsUnderdog.toFixed(\n 0\n )}%, Lost: ${awayForm.oddsReliabilityLoseAsUnderdog.toFixed(0)}%`;\n }\n \n\n let homeLastGame = await getLastGameResult(homeForm.LastFiveForm[4]);\n let awayLastGame = await getLastGameResult(awayForm.LastFiveForm[4]);\n\n // let homeAttackStrength = await getAttackStrength(\n // homeForm.ScoredOverall / 10\n // );\n\n const attackingMetricsHome = {\n // averagePossession: homeForm.AveragePossessionOverall,\n \"Average Dangerous Attacks\": homeForm.AverageDangerousAttacksOverall,\n \"Average Shots\": homeForm.AverageShots,\n \"Average Shots On Target\": homeForm.AverageShotsOnTargetOverall,\n \"Average Expected Goals\": homeForm.XGOverall,\n \"Recent XG\": homeForm.XGlast5 ? homeForm.XGlast5 : homeForm.XGOverall,\n \"Average Goals\":\n homeForm.averageScoredLeague !== undefined &&\n homeForm.averageScoredLeague !== null\n ? homeForm.averageScoredLeague\n : homeForm.ScoredOverall / 10,\n };\n const attackingMetricsAway = {\n // averagePossession: awayForm.AveragePossessionOverall,\n \"Average Dangerous Attacks\": awayForm.AverageDangerousAttacksOverall,\n \"Average Shots\": awayForm.AverageShots,\n \"Average Shots On Target\": awayForm.AverageShotsOnTargetOverall,\n \"Average Expected Goals\": awayForm.XGOverall,\n \"Recent XG\": awayForm.XGlast5 ? awayForm.XGlast5 : awayForm.XGOverall,\n \"Average Goals\":\n awayForm.averageScoredLeague !== undefined &&\n awayForm.averageScoredLeague !== null\n ? awayForm.averageScoredLeague\n : awayForm.ScoredOverall / 10,\n };\n\n const defensiveMetricsHome = {\n \"Clean Sheet Percentage\": 100 - homeForm.CleanSheetPercentage,\n \"Average XG Against\": homeForm.XGAgainstAvgOverall,\n \"Recent XG Against\": homeForm.XGAgainstlast5\n ? homeForm.XGAgainstlast5\n : homeForm.XGAgainstAvgOverall,\n \"Average Goals Against\":\n homeForm.averageConceededLeague !== undefined &&\n homeForm.averageConceededLeague !== null\n ? homeForm.averageConceededLeague\n : homeForm.ConcededOverall / 10,\n };\n\n const defensiveMetricsAway = {\n \"Clean Sheet Percentage\": 100 - awayForm.CleanSheetPercentage,\n \"Average XG Against\": awayForm.XGAgainstAvgOverall,\n \"Recent XG Against\": awayForm.XGAgainstlast5\n ? awayForm.XGAgainstlast5\n : awayForm.XGAgainstAvgOverall,\n \"Average Goals Against\":\n awayForm.averageConceededLeague !== undefined &&\n awayForm.averageConceededLeague !== null\n ? awayForm.averageConceededLeague\n : awayForm.ConcededOverall / 10,\n };\n\n let homeAttackStrength;\n let homeAttackStrengthLast5;\n let homeOnlyAttackStrength;\n let homeDefenceStrength;\n let homeDefenceStrengthLast5;\n let homeOnlyDefenceStrength;\n let homePossessionStrength;\n let homePossessionStrengthLast5;\n let homeOnlyPossessionStrength;\n let homeXGForStrength;\n let homeXGForStrengthLast5;\n let homeOnlyXGForStrength;\n let homeXGAgainstStrength;\n let homeXGAgainstStrengthLast5;\n let homeOnlyXGAgainstStrength;\n let awayAttackStrength;\n let awayAttackStrengthLast5;\n let awayOnlyAttackStrength;\n let awayDefenceStrength;\n let awayDefenceStrengthLast5;\n let awayOnlyDefenceStrength;\n let awayPossessionStrength;\n let awayPossessionStrengthLast5;\n let awayOnlyPossessionStrength;\n let awayXGForStrength;\n let awayXGForStrengthLast5;\n let awayOnlyXGForStrength;\n let awayXGAgainstStrength;\n let awayXGAgainstStrengthLast5;\n let awayOnlyXGAgainstStrength;\n let homeDirectnessStrength;\n let homeDirectnessStrengthLast5;\n let homeOnlyDirectnessStrength;\n let awayDirectnessStrength;\n let awayDirectnessStrengthLast5;\n let awayOnlyDirectnessStrength;\n let homeAccuracyOverallStrength;\n let homeAccuracyOverallStrengthLast5;\n let homeOnlyAccuracyOverallStrength;\n let awayAccuracyOverallStrength;\n let awayAccuracyOverallStrengthLast5;\n let awayOnlyAccuracyOverallStrength;\n\n if (homeForm.xgForStrength) {\n console.log(\"not calculating\");\n homeAttackStrength = homeForm.attackingStrength;\n homeAttackStrengthLast5 = homeForm.attackingStrengthLast5;\n homeOnlyAttackStrength = homeForm.attackingStrengthHomeOnly;\n homeDefenceStrength = homeForm.defensiveStrength;\n homeDefenceStrengthLast5 = homeForm.defensiveStrengthLast5;\n homeOnlyDefenceStrength = homeForm.defensiveStrengthHomeOnly;\n homePossessionStrength = homeForm.possessionStrength;\n homePossessionStrengthLast5 = homeForm.possessionStrengthLast5;\n homeOnlyPossessionStrength = homeForm.possessionStrengthHomeOnly;\n homeXGForStrength = homeForm.xgForStrength;\n homeXGForStrengthLast5 = homeForm.xgForStrengthLast5;\n homeOnlyXGForStrength = homeForm.xgForStrengthHomeOnly;\n homeXGAgainstStrength = homeForm.xgAgainstStrength;\n homeXGAgainstStrengthLast5 = homeForm.xgAgainstStrengthLast5;\n homeOnlyXGAgainstStrength = homeForm.xgAgainstStrengthHomeOnly;\n homeDirectnessStrength = homeForm.directnessOverallStrength;\n homeDirectnessStrengthLast5 = homeForm.directnessOverallStrengthLast5;\n homeOnlyDirectnessStrength = homeForm.directnessHomeStrength;\n homeAccuracyOverallStrength = homeForm.accuracyOverallStrength;\n homeAccuracyOverallStrengthLast5 =\n homeForm.accuracyOverallStrengthLast5;\n homeOnlyAccuracyOverallStrength = homeForm.accuracyHomeStrength;\n awayAttackStrength = awayForm.attackingStrength;\n awayAttackStrengthLast5 = awayForm.attackingStrengthLast5;\n awayOnlyAttackStrength = awayForm.attackingStrengthAwayOnly;\n awayDefenceStrength = awayForm.defensiveStrength;\n awayDefenceStrengthLast5 = awayForm.defensiveStrengthLast5;\n awayOnlyDefenceStrength = awayForm.defensiveStrengthAwayOnly;\n awayPossessionStrength = awayForm.possessionStrength;\n awayPossessionStrengthLast5 = awayForm.possessionStrengthLast5;\n awayOnlyPossessionStrength = awayForm.possessionStrengthAwayOnly;\n awayXGForStrength = awayForm.xgForStrength;\n awayXGForStrengthLast5 = awayForm.xgForStrengthLast5;\n awayOnlyXGForStrength = awayForm.xgForStrengthAwayOnly;\n awayXGAgainstStrength = awayForm.xgAgainstStrength;\n awayXGAgainstStrengthLast5 = awayForm.xgAgainstStrengthLast5;\n awayOnlyXGAgainstStrength = awayForm.xgAgainstStrengthAwayOnly;\n awayDirectnessStrength = awayForm.directnessOverallStrength;\n awayDirectnessStrengthLast5 = awayForm.directnessOverallStrengthLast5;\n awayOnlyDirectnessStrength = awayForm.directnessAwayStrength;\n awayAccuracyOverallStrength = awayForm.accuracyOverallStrength;\n awayAccuracyOverallStrengthLast5 =\n awayForm.accuracyOverallStrengthLast5;\n awayOnlyAccuracyOverallStrength = awayForm.accuracyAwayStrength;\n } else {\n homeAttackStrength = await calculateAttackingStrength(\n attackingMetricsHome\n );\n\n homeDefenceStrength = await calculateDefensiveStrength(\n defensiveMetricsHome\n );\n\n homePossessionStrength = await calculateMetricStrength(\n \"averagePossession\",\n homeForm.AveragePossessionOverall\n );\n\n homeXGForStrength = await calculateMetricStrength(\n \"xgFor\",\n gameStats.home[2].XGOverall\n );\n\n homeXGAgainstStrength = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - gameStats.home[2].XGAgainstAvgOverall\n );\n homeDirectnessStrength = await calculateMetricStrength(\n \"directnessOverall\",\n homeForm.directnessOverall\n );\n homeAccuracyOverallStrength = await calculateMetricStrength(\n \"accuracyOverall\",\n homeForm.shootingAccuracy\n );\n\n awayAttackStrength = await calculateAttackingStrength(\n attackingMetricsAway\n );\n awayDefenceStrength = await calculateDefensiveStrength(\n defensiveMetricsAway\n );\n awayPossessionStrength = await calculateMetricStrength(\n \"averagePossession\",\n awayForm.AveragePossessionOverall\n );\n awayXGForStrength = await calculateMetricStrength(\n \"xgFor\",\n gameStats.away[2].XGOverall\n );\n\n awayXGAgainstStrength = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - gameStats.away[2].XGAgainstAvgOverall\n );\n awayDirectnessStrength = await calculateMetricStrength(\n \"directnessOverall\",\n awayForm.directnessOverall\n );\n awayAccuracyOverallStrength = await calculateMetricStrength(\n \"accuracyOverall\",\n awayForm.shootingAccuracy\n );\n }\n\n let [formPointsHome, testArrayHome] = await getPointsFromGames(\n gameStats.home[2].WDLRecord\n );\n let [formPointsAway, testArrayAway] = await getPointsFromGames(\n gameStats.away[2].WDLRecord\n );\n\n let rollingGoalDiffHome = [\n (gameStats.home[0].ScoredOverall - gameStats.home[0].ConcededOverall) /\n 10,\n (gameStats.home[1].ScoredOverall - gameStats.home[1].ConcededOverall) /\n 6,\n (gameStats.home[2].ScoredOverall - gameStats.home[2].ConcededOverall) /\n 5,\n ];\n\n let rollingGoalDiffAway = [\n (gameStats.away[0].ScoredOverall - gameStats.away[0].ConcededOverall) /\n 10,\n (gameStats.away[1].ScoredOverall - gameStats.away[1].ConcededOverall) /\n 6,\n (gameStats.away[2].ScoredOverall - gameStats.away[2].ConcededOverall) /\n 5,\n ];\n\n const formDataMatch = [];\n\n formDataMatch.push({\n btts: game.btts_potential,\n });\n\n const formDataHome = [];\n console.log(gameStats.home[2].LastFiveForm);\n\n formDataHome.push({\n name: game.homeTeam,\n Last5: gameStats.home[2].LastFiveForm,\n LeagueOrAll: gameStats.home[2].LeagueOrAll,\n AverageGoals: homeForm.ScoredOverall / 10,\n AverageConceeded: homeForm.ConcededOverall / 10,\n AverageXG: homeForm.XGOverall,\n AverageXGConceded: homeForm.XGAgainstAvgOverall,\n AveragePossession: homeForm.AveragePossessionOverall,\n AverageShotsOnTarget: homeForm.AverageShotsOnTargetOverall,\n AverageDangerousAttacks: homeForm.AverageDangerousAttacksOverall,\n homeOrAway: \"Home\",\n leaguePosition: homeForm.LeaguePosition,\n Last5PPG: homeForm.PPG,\n SeasonPPG: homeForm.SeasonPPG,\n lastGame: homeLastGame,\n formRun: homeForm.formRun,\n goalDifference: homeForm.goalDifference,\n goalDifferenceHomeOrAway: homeForm.goalDifferenceHomeOrAway,\n // BttsPercentage: homeForm.BttsPercentage || \"-\",\n // BttsPercentageHomeOrAway: homeForm.BttsPercentageHomeOrAway || \"-\",\n CardsTotal: homeForm.CardsTotal || \"-\",\n CornersAverage: homeForm.AverageCorners || \"-\",\n FormTextStringHome: formTextStringHome,\n FavouriteRecord:\n favouriteRecordHome + `. ${homeForm.reliabilityString}`,\n BTTSArray: bttsArrayHome,\n Results: homeForm.resultsAll,\n ResultsHorA: homeForm.resultsHome.reverse(),\n // BTTSAll: homeForm.last10btts,\n // BTTSHorA: homeForm.last10bttsHome,\n });\n\n const formDataAway = [];\n\n formDataAway.push({\n name: game.awayTeam,\n Last5: gameStats.away[2].LastFiveForm,\n LeagueOrAll: gameStats.away[2].LeagueOrAll,\n AverageGoals: awayForm.ScoredOverall / 10,\n AverageConceeded: awayForm.ConcededOverall / 10,\n AverageXG: awayForm.XGOverall,\n AverageXGConceded: awayForm.XGAgainstAvgOverall,\n AveragePossession: awayForm.AveragePossessionOverall,\n AverageShotsOnTarget: awayForm.AverageShotsOnTargetOverall,\n AverageDangerousAttacks: awayForm.AverageDangerousAttacksOverall,\n homeOrAway: \"Away\",\n leaguePosition: awayForm.LeaguePosition,\n Last5PPG: awayForm.PPG,\n SeasonPPG: awayForm.SeasonPPG,\n lastGame: awayLastGame,\n formRun: awayForm.formRun,\n goalDifference: awayForm.goalDifference,\n goalDifferenceHomeOrAway: awayForm.goalDifferenceHomeOrAway,\n // BttsPercentage: awayForm.BttsPercentage || \"-\",\n // BttsPercentageHomeOrAway: awayForm.BttsPercentageHomeOrAway || \"-\",\n CardsTotal: awayForm.CardsTotal || \"-\",\n CornersAverage: awayForm.AverageCorners || \"-\",\n FormTextStringAway: formTextStringAway,\n FavouriteRecord:\n favouriteRecordAway + `. ${awayForm.reliabilityString}`,\n BTTSArray: bttsArrayAway,\n Results: awayForm.resultsAll,\n ResultsHorA: awayForm.resultsAway.reverse(),\n // BTTSAll: awayForm.last10btts,\n // BTTSHorA: awayForm.last10bttsAway,\n });\n\n let formArrayHome;\n let formArrayAway;\n let chartType;\n\n if (formPointsHome.length > 1) {\n formArrayHome = formPointsHome;\n formArrayAway = formPointsAway;\n chartType = \"Points over time\";\n } else {\n formArrayHome = [\n homeTenGameAverage,\n homeSixGameAverage,\n homeFiveGameAverage,\n ];\n formArrayAway = [\n awayTenGameAverage,\n awaySixGameAverage,\n awayFiveGameAverage,\n ];\n chartType = \"Rolling average points over last 10\";\n }\n\n ReactDOM.render(\n
    \n
    \n
    \n
    \n
    ,\n document.getElementById(\"history\" + homeTeam)\n );\n\n //This tournament does not have league positions\n if (game.leagueName === \"Europe UEFA Women's Euro\") {\n game.homeTeamHomePosition = \"N/A\";\n game.awayTeamAwayPosition = \"N/A\";\n }\n\n function singleResult(game) {\n return (\n
    \n
    \n {game.homeXG}\n XG\n {game.awayXG}\n
    \n
    \n {game.homeShots}\n Shots\n {game.awayShots}\n
    \n
    \n {game.homeSot}\n SOT\n {game.awaySot}\n
    \n
    \n {game.homeDangerousAttacks}\n Dangerous Attacks\n {game.awayDangerousAttacks}\n
    \n
    \n {game.homePossession}%\n Possession\n {game.awayPossession}%\n
    \n
    \n {game.homeRed}\n Red cards\n {game.awayRed}\n
    \n
    \n {game.homePPG}\n PPG (pre-match)\n {game.awayPPG}\n
    \n
    \n );\n }\n\n function singleSimilarResult(game) {\n return (\n
    \n
    \n {game.date}\n
    \n {/*
    \n {game.XG}\n XG\n {game.XGAgainst}\n
    \n
    \n {game.sot}\n SOT\n {game.sotAgainst}\n
    \n
    \n {game.possession}%\n Possession\n {100 - game.possession}%\n
    */}\n
    \n );\n }\n\n const overviewHome = gameArrayHome.slice(0, 10).map((game) => (\n
    \n \n
    {game.homeTeam}
    \n \n {game.homeGoals} : {game.awayGoals}\n \n
    {game.awayTeam}
    \n
    \n }\n element={singleResult(game)}\n />\n \n ));\n\n const overviewAway = gameArrayAway.slice(0, 10).map((game) => (\n
    \n \n
    {game.homeTeam}
    \n \n {game.homeGoals} : {game.awayGoals}\n \n
    {game.awayTeam}
    \n
    \n }\n element={singleResult(game)}\n />\n \n ));\n\n let similarGamesHome;\n\n if (game.simlarGameResultsHome) {\n similarGamesHome = game.simlarGameResultsHome.reverse().map((game) => (\n
    \n \n
    {game.homeTeam}
    \n \n {game.homeGoals} : {game.awayGoals}\n \n
    {game.awayTeam}
    \n
    \n }\n element={singleSimilarResult(game)}\n />\n \n ));\n } else {\n similarGamesHome = (\n

    No previous games fit this profile

    \n );\n }\n\n let similarGamesAway;\n if (game.simlarGameResultsAway) {\n similarGamesAway = game.simlarGameResultsAway.reverse().map((game) => (\n
    \n \n
    {game.homeTeam}
    \n \n {game.homeGoals} : {game.awayGoals}\n \n
    {game.awayTeam}
    \n
    \n }\n element={singleSimilarResult(game)}\n />\n \n ));\n } else {\n similarGamesAway =

    No previous games fit this profile

    ;\n }\n\n console.log(formDataHome[0].Results);\n\n function StatsHome() {\n return (\n
    \n
      \n \n
    \n
    \n );\n }\n\n function StatsAway() {\n return (\n
    \n
      \n \n
    \n
    \n );\n }\n\n // const allHomeGames = homeForm.WDLRecord.reverse();\n // const allAwayGames = awayForm.WDLRecord.reverse();\n\n // // const pointsHome = getPointsFromLastX(formDataHome[0].Last5);\n // const pointsHome = getPointsFromLastX(allHomeGames);\n // const pointsHomeAv = await getPointAverage(\n // pointsHome,\n // allHomeGames.length\n // );\n // const pointsHomeLast5 = getPointsFromLastX(allHomeGames.slice(0, 5));\n // const pointsHomeAvLast5 = await getPointAverage(pointsHomeLast5, 5);\n // const pointsAway = getPointsFromLastX(allAwayGames);\n // const pointsAwayAv = await getPointAverage(\n // pointsAway,\n // allAwayGames.length\n // );\n // const pointsAwayLast5 = getPointsFromLastX(allAwayGames.slice(0, 5));\n // const pointsAwayAvLast5 = await getPointAverage(pointsAwayLast5, 5);\n\n // console.log(homeForm.WDLRecord.length);\n // console.log(pointsHomeAvLast5);\n // console.log(pointsAwayAvLast5);\n\n let id, team1, team2, timestamp, homeGoals, awayGoals;\n\n\n async function getGameIdByHomeTeam(games, homeTeamName) {\n const matchingGames = games.filter((game) =>\n game.homeTeam.includes(homeTeamName)\n );\n if (matchingGames.length > 0) {\n return matchingGames[0];\n } else {\n return null; // or any other value you prefer to return if no match is found\n }\n }\n\n const matchingGame = await getGameIdByHomeTeam(\n arrayOfGames,\n game.homeTeam\n );\n\n console.log(matchingGame)\n if (matchingGame) {\n id = matchingGame.id.toString();\n team1 = matchingGame.homeTeam;\n team2 = matchingGame.awayTeam;\n timestamp = matchingGame.time;\n homeGoals = matchingGame.homeGoals;\n awayGoals = matchingGame.awayGoals;\n } else {\n id = \"0\";\n team1 = \"N/A\";\n team2 = \"N/A\";\n timestamp = 1;\n homeGoals = \"-\";\n awayGoals = \"-\";\n }\n\n if(homeForm.completeData == true && game.completeData == true){\n ReactDOM.render(\n <>\n
    \n \n \n \n }\n />\n
    \n \n \n \n \n \n 2\n ? Math.max(\n rollingGoalDiffTotalHome[\n rollingGoalDiffTotalHome.length - 1\n ],\n rollingGoalDiffTotalAway[\n rollingGoalDiffTotalAway.length - 1\n ]\n )\n : 2\n }\n depth={\n Math.min(\n rollingGoalDiffTotalHome[\n rollingGoalDiffTotalHome.length - 1\n ],\n rollingGoalDiffTotalAway[\n rollingGoalDiffTotalAway.length - 1\n ]\n ) < -2\n ? Math.min(\n rollingGoalDiffTotalHome[\n rollingGoalDiffTotalHome.length - 1\n ],\n rollingGoalDiffTotalAway[\n rollingGoalDiffTotalAway.length - 1\n ]\n )\n : -2\n }\n data1={rollingGoalDiffTotalHome}\n data2={rollingGoalDiffTotalAway}\n team1={game.homeTeam}\n team2={game.awayTeam}\n type={\"Goal difference over time\"}\n tension={0.3}\n >\n
    \n
    \n
    \n
    \n
    \n
    \n
    {overviewHome}
    \n
    {overviewAway}
    \n
    \n
    \n \n \n
    \n

    Results from similar profile games

    \n (Games where each team had similar odds)\n

    Most recent first

    \n
    \n
    \n {similarGamesHome}\n
    \n
    \n {similarGamesAway}\n
    \n
    \n \n \n getTeamStats(\n game.id,\n game.homeTeam,\n game.awayTeam,\n formDataHome[0].BttsPercentage,\n formDataHome[0].BttsPercentageHomeOrAway,\n formDataAway[0].BttsPercentage,\n formDataAway[0].BttsPercentageHomeOrAway\n )\n }\n text={\"Fixture trends\"}\n >\n \n ,\n document.getElementById(\"stats\" + homeTeam)\n );\n } else if (homeForm.completeData = false || game.completeData == false){\n ReactDOM.render(\n <>\n
    \n \n \n \n }\n />\n
    \n \n
    \n
    \n
    \n {/*
    */}\n
    \n {/*
    \n
    {overviewHome}
    \n
    {overviewAway}
    \n
    \n
    \n \n \n
    */}\n

    Results from similar profile games

    \n (Games where each team had similar odds)\n

    Most recent first

    \n
    \n
    \n {similarGamesHome}\n
    \n
    \n {similarGamesAway}\n
    \n
    \n \n \n getTeamStats(\n game.id,\n game.homeTeam,\n game.awayTeam,\n formDataHome[0].BttsPercentage,\n formDataHome[0].BttsPercentageHomeOrAway,\n formDataAway[0].BttsPercentage,\n formDataAway[0].BttsPercentageHomeOrAway\n )\n }\n text={\"Fixture trends\"}\n >\n \n ,\n document.getElementById(\"stats\" + homeTeam)\n );\n }\n }\n \n\n // ReactDOM.render(\n // \n // getTeamStats(\n // game.id,\n // game.homeTeam,\n // game.awayTeam,\n // formDataHome[0].BttsPercentage,\n // formDataHome[0].BttsPercentageHomeOrAway,\n // formDataAway[0].BttsPercentage,\n // formDataAway[0].BttsPercentageHomeOrAway\n // )\n // }\n // text={\"Fixture trends\"}\n // >,\n // document.getElementById(`H2HStats${game.id}`)\n // );\n }\n}\n","import React, { Fragment, useState } from \"react\";\nimport { CreateBadge } from \"./createBadge\";\nimport { createStatsDiv } from \"../logic/getStats\";\nimport { renderTable } from \"../logic/getFixtures\";\nimport { allLeagueResultsArrayOfObjects } from \"../logic/getFixtures\";\nimport { useDispatch } from \"react-redux\";\nimport { setData } from \"../logic/dataSlice\";\nimport { Provider } from \"react-redux\";\nimport store from \"../logic/store\"; // Import your Redux store\nimport { formObjectHome } from \"../logic/getScorePredictions\";\nimport { clicked } from \"../logic/getScorePredictions\";\n\nlet resultValue;\nvar count;\nlet mockValue;\nvar setCount;\n\nfunction toggle(bool) {\n count = !bool;\n return count;\n}\n\nfunction GetDivider(fixture, mock) {\n const matchStatus = fixture.status;\n let isPrediction = resultValue;\n\n if (fixture.fixture.omit === true && matchStatus !== \"complete\") {\n isPrediction = true;\n return (\n \n
    {`${fixture.fixture.time}`}
    \n {`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}\n
    \n );\n } else if (mockValue === true && matchStatus === \"complete\") {\n isPrediction = false;\n return (\n \n
    {`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}
    \n {`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}\n
    \n );\n } else if (mockValue === true && matchStatus !== \"complete\") {\n isPrediction = true;\n return (\n \n
    {`${fixture.fixture.time}`}
    \n {`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}\n
    \n );\n } else if (isPrediction === false && matchStatus !== \"complete\") {\n return (\n
    \n {\"V\"}\n
    \n );\n } else if (isPrediction === false && matchStatus === \"complete\") {\n return (\n {`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}\n );\n } else if (isPrediction === true && matchStatus === \"complete\") {\n let outcome;\n let prediction;\n\n switch (true) {\n case fixture.fixture.homeGoals > fixture.fixture.awayGoals:\n outcome = 0;\n fixture.fixture.winner = fixture.fixture.homeTeam;\n fixture.fixture.outcome = \"homeWin\";\n break;\n case fixture.fixture.homeGoals === fixture.fixture.awayGoals:\n outcome = 1;\n fixture.fixture.winner = \"draw\";\n fixture.fixture.outcome = \"draw\";\n\n break;\n case fixture.fixture.homeGoals < fixture.fixture.awayGoals:\n outcome = 2;\n fixture.fixture.winner = fixture.fixture.awayTeam;\n fixture.fixture.outcome = \"awayWin\";\n\n break;\n default:\n break;\n }\n\n switch (true) {\n case fixture.fixture.goalsA > fixture.fixture.goalsB:\n prediction = 0;\n break;\n case fixture.fixture.goalsA === fixture.fixture.goalsB:\n prediction = 1;\n break;\n case fixture.fixture.goalsA < fixture.fixture.goalsB:\n prediction = 2;\n break;\n default:\n break;\n }\n\n if (fixture.fixture.omit === true) {\n return (\n \n
    {`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}
    \n {`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}\n
    \n );\n } else if (outcome === prediction) {\n if (fixture.fixture.homeOdds !== 0) {\n switch (true) {\n case outcome === 0:\n fixture.fixture.profit = fixture.fixture.homeOdds;\n break;\n case outcome === 1:\n fixture.fixture.profit = fixture.fixture.drawOdds;\n break;\n case outcome === 2:\n fixture.fixture.profit = fixture.fixture.awayOdds;\n break;\n default:\n break;\n }\n } else fixture.fixture.profit = 1;\n\n if (\n fixture.fixture.goalsA === fixture.fixture.homeGoals &&\n fixture.fixture.goalsB === fixture.fixture.awayGoals\n ) {\n fixture.fixture.exactScore = true;\n return (\n \n
    {`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}
    \n {`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}\n
    \n );\n } else {\n fixture.fixture.exactScore = false;\n return (\n \n
    {`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}
    \n {`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}\n
    \n );\n }\n } else if (outcome !== prediction) {\n if (fixture.fixture.homeOdds !== 0) {\n fixture.fixture.profit = 0;\n } else {\n fixture.fixture.profit = 1;\n }\n fixture.fixture.exactScore = false;\n return (\n \n
    {`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}
    \n {`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}\n
    \n );\n }\n } else {\n return (\n \n
    {`${fixture.fixture.time}`}
    \n {`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}\n
    \n );\n }\n}\n\nfunction renderLeagueName(fixture, mock) {\n mockValue = mock;\n\n let name = fixture.leagueName;\n let id =\n allLeagueResultsArrayOfObjects.length > 0\n ? allLeagueResultsArrayOfObjects[fixture.leagueIndex].id\n : null;\n if (name === null || mock === true) {\n return
    ;\n } else {\n return (\n
    \n \n renderTable(\n fixture.leagueIndex,\n allLeagueResultsArrayOfObjects[fixture.leagueIndex],\n id\n )\n }\n >\n {fixture.leagueName} ☰\n
    \n \n \n );\n }\n}\n\nconst downArrow = \"\\u{2195}\";\nconst rightArrow = \"\\u{29C9}\";\n\nexport let testing;\n\nfunction SingleFixture({ fixture, count, mock }) {\n const dispatch = useDispatch();\n function StoreData() {\n const fixtureDetails = {\n id: fixture.id,\n homeTeamName: fixture.homeTeam,\n homeId: fixture.homeId,\n homeTeamBadge: fixture.homeBadge,\n awayTeamName: fixture.awayTeam,\n awayId: fixture.awayId,\n awayTeamBadge: fixture.awayBadge,\n stadium: fixture.stadium,\n time: fixture.time,\n homeGoals: fixture.goalsA,\n awayGoals: fixture.goalsB,\n };\n\n const homeDetails = {\n \"Attacking Strength\": fixture.formHome.attackingStrength,\n \"Defensive Strength\": fixture.formHome.defensiveStrength,\n };\n\n const awayDetails = {\n \"Attacking Strength\": fixture.formAway.attackingStrength,\n \"Defensive Strength\": fixture.formAway.defensiveStrength,\n };\n\n const dataToSend = {\n key1: \"value1\",\n key2: \"value2\",\n };\n fixture.formHome.defensiveMetrics[\"Clean Sheet Percentage\"] =\n fixture.formHome.CleanSheetPercentage;\n fixture.formAway.defensiveMetrics[\"Clean Sheet Percentage\"] =\n fixture.formAway.CleanSheetPercentage;\n\n localStorage.setItem(\n \"homeForm\",\n JSON.stringify(fixture.formHome.attackingMetrics)\n );\n localStorage.setItem(\n \"homeFormDef\",\n JSON.stringify(fixture.formHome.defensiveMetrics)\n );\n localStorage.setItem(\n \"allTeamResultsHome\",\n JSON.stringify(fixture.formHome.allTeamResults)\n );\n localStorage.setItem(\"homeDetails\", JSON.stringify(homeDetails));\n\n localStorage.setItem(\n \"awayForm\",\n JSON.stringify(fixture.formAway.attackingMetrics)\n );\n localStorage.setItem(\n \"awayFormDef\",\n JSON.stringify(fixture.formAway.defensiveMetrics)\n );\n localStorage.setItem(\n \"allTeamResultsAway\",\n JSON.stringify(fixture.formAway.allTeamResults)\n );\n localStorage.setItem(\"awayDetails\", JSON.stringify(awayDetails));\n\n localStorage.setItem(\"fixtureDetails\", JSON.stringify(fixtureDetails));\n\n dispatch(setData(dataToSend));\n }\n\n async function handleButtonClick(game) {\n if (clicked === true) {\n StoreData(formObjectHome);\n window.open(\"/#/fixture\");\n } else return;\n }\n return (\n
    \n {renderLeagueName(fixture, mock)}\n
    \n \n
    {fixture.fractionHome}
    \n
    {fixture.homeTeam}
    \n \n {/*
    {\"V\"}
    */}\n
    {fixture.awayTeam}
    \n \n \n
    {fixture.fractionAway}
    \n \n \n mock === false ? createStatsDiv(fixture, count) : null\n }\n onMouseDown={() => (count = toggle(count))}\n >\n Game overview {downArrow}\n \n handleButtonClick(fixture)}\n >\n More detail {rightArrow}\n \n {/* */}\n
    \n
    \n
    \n
    \n );\n}\n\nconst List = ({ fixtures, mock }) => (\n
    \n
    \n
      \n {fixtures.map((fixture, i) => (\n \n ))}\n
    \n
    \n);\n\nexport function Fixture(props) {\n [count, setCount] = useState(false);\n resultValue = props.result;\n return (\n \n \n \n );\n}\n","// src/dataSlice.js\nimport { createSlice } from '@reduxjs/toolkit';\n\n// src/dataSlice.js\nconst initialState = {\n dataHome: localStorage.getItem('homeForm'),\n dataAway: localStorage.getItem('awayForm'),\n dataHomeDef: localStorage.getItem('homeFormDef'),\n dataAwayDef: localStorage.getItem('awayFormDef'),\n allTeamResultsHome: localStorage.getItem('allTeamResultsHome'),\n allTeamResultsAway: localStorage.getItem('allTeamResultsAway'),\n homeDetails:localStorage.getItem('homeDetails'),\n awayDetails:localStorage.getItem('awayDetails'),\n fixtureDetails: localStorage.getItem('fixtureDetails')\n};\n\nconst dataSlice = createSlice({\n name: 'data',\n initialState,\n reducers: {\n setData: (state, action) => {\n state.data = action.payload;\n },\n },\n});\n\nexport const { setData } = dataSlice.actions;\n\nexport default dataSlice.reducer;\n","// src/store.js\nimport { configureStore } from '@reduxjs/toolkit';\nimport dataReducer from './dataSlice'; // Your data reducer\n\nconst store = configureStore({\n reducer: {\n data: dataReducer, // Ensure this key matches the key in your initialState\n },\n});\n\nexport default store;\n","import React, { Fragment } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport Header from \"./components/Header\";\nimport { Button } from \"./components/Button\";\nimport OddsRadio from \"./components/OddsRadio\";\nimport { Fixture } from \"./components/Fixture\";\nimport mockedFixtures from \"./data/mockedFixtures.json\";\nimport { selectedOdds } from \"./components/OddsRadio\";\nimport Collapsable from \"./components/CollapsableElement\";\nimport {\n FacebookShareButton,\n FacebookIcon,\n RedditShareButton,\n RedditIcon,\n TelegramShareButton,\n TelegramIcon,\n TwitterShareButton,\n TwitterIcon,\n WhatsappShareButton,\n WhatsappIcon,\n} from \"react-share\";\nimport { generateFixtures } from \"./logic/getFixtures\";\nimport { ThreeDots } from \"react-loading-icons\";\nimport { BrowserRouter as Router, Route, Routes, Link } from \"react-router-dom\";\nimport reactDom from \"react-dom\";\n// require(\"dotenv\").config();\n\nexport const proxyurl = \"https://safe-caverns-99679.herokuapp.com/\";\nexport var fixtureList = [];\nexport let allLeagueData = [];\n\nexport const availableLeagues = [];\nexport var orderedLeagues = [];\n\nconst leagueOrder = [\n 11084, //Euro 2024\n 7432, //World Cup 22\n 9660, //premier league 22/23\n 9663, //championship 22/23\n 9582, //league 1 22/23\n 9581, //league 2 22/23\n 9700, //National league 22/23\n 9665, //La Liga 22/23\n 9636, //Scottish Prem 22/23\n 9655, //Bundesliga 22/23\n 9697, //Serie A 22/23\n 9674, //French Prem 22/23\n 9984, //Portagul Prem 22/23\n 9653, //Dutch Prem 22/23\n 9577, //Belgian Pro League 22/23\n 10969, //sweden 23\n 9545, //Danish Prem 22/23\n 10976, //Norway Prem 23\n 9954, //Austrian Prem 22/23\n 9889, //Greek Prem 22/23\n 9553, //Polish prem 22/23\n 9580, //Swiss prem 22/23\n 10946, //Irish Prem 23\n 9675, //Spanish secunda 22/23\n 9808, //Italy serie B 22/23\n 9656, //Bundesliga 2 22/23\n 9741, //German 3rd tier 22/23\n 9621, //French League 2 22/23\n 9637, //Scottish Championship 22/23\n 9639, //Scottish league 1 22/23\n 9638, //Scottish league 2 22/23\n 9890, //Women's prem 23/24\n 10977, //MLS 23\n 11321, //Brazil prem 24\n 11212, //Argentina prem 23\n 10994, //Japan 22\n 9525, //Mexico prem 23/24\n 9972, //National league North and South 22/23\n 10505, //Australian A league 23/24\n 11102, //S Korea 23\n];\n\nlet today;\nlet todayFootyStats;\nlet todaySS\nlet tomorrow;\nlet tomorrowFootyStats;\nlet tomorrowSS;\nlet date;\nlet dateSS;\nlet dateFootyStats;\nlet yesterday;\nlet yesterdayFootyStats;\nlet yesterdaySS\nlet lastSaturday;\nlet lastSaturdayFootyStats;\nlet lastSaturdaySS;\nlet historic;\nlet historicFootyStats;\nlet historicSS;\nlet tomorrowsDate;\nlet yesterdaysDate;\nlet saturdayDate;\nlet historicDate;\nlet string;\nlet dateString;\n\n(async function fetchLeagueData() {\n let leagueList;\n\n leagueList = await fetch(`${process.env.REACT_APP_EXPRESS_SERVER}leagueList`);\n\n let leagueArray;\n await leagueList.json().then((leagues) => {\n leagueArray = Array.from(leagues.data);\n });\n\n for (let i = 0; i < leagueArray.length; i++) {\n const league = leagueArray[i];\n const name = leagueArray[i].name;\n\n for (let x = 0; x < league.season.length; x++) {\n const element = league.season[x];\n\n if (element.year === 2024 || element.year === 20232024) {\n if (element.id !== 4340 && element.id !== 6935 && element.id !== 7061) {\n availableLeagues.push({ name: name, element });\n }\n }\n }\n\n async function mapOrder(array, order, key) {\n array.sort(function (a, b) {\n var A = a.element[key],\n B = b.element[key];\n\n if (order.indexOf(A) > order.indexOf(B)) {\n return 1;\n } else {\n return -1;\n }\n });\n return array;\n }\n //leagues ordered by id\n orderedLeagues = await mapOrder(availableLeagues, leagueOrder, \"id\");\n }\n return orderedLeagues;\n})();\n\nexport async function getLeagueList() {\n let i = 0;\n date = new Date();\n string = \"Today\";\n\n async function incrementDate(num, date) {\n i = i + num;\n date.setDate(date.getDate() + num);\n dateSS = await convertTimestampForSofaScore(date);\n\n [date, dateFootyStats] = await calculateDate(date);\n string = dateFootyStats;\n await renderButtons();\n }\n\n async function decrementDate(num, date) {\n i = i - num;\n console.log(i);\n if (i > -120) {\n date.setDate(date.getDate() - num);\n dateSS = await convertTimestampForSofaScore(date);\n [date, dateFootyStats] = await calculateDate(date);\n string = dateFootyStats;\n dateString = date;\n await renderButtons();\n }\n }\n\n async function calculateDate(dateString) {\n const day = dateString.getDate();\n const month = dateString.getMonth() + 1;\n const year = dateString.getFullYear();\n return [`${month}${day}${year}`, `${year}-${month}-${day}`];\n }\n\n [today, todayFootyStats] = await calculateDate(new Date());\n\n tomorrowsDate = new Date();\n tomorrowsDate.setDate(tomorrowsDate.getDate() + 1);\n [tomorrow, tomorrowFootyStats] = await calculateDate(tomorrowsDate);\n\n yesterdaysDate = new Date();\n yesterdaysDate.setDate(yesterdaysDate.getDate() - 1);\n [yesterday, yesterdayFootyStats] = await calculateDate(yesterdaysDate);\n\n saturdayDate = new Date();\n saturdayDate.setDate(\n saturdayDate.getDate() - ((saturdayDate.getDay() + 6) % 7)\n );\n saturdayDate.setDate(saturdayDate.getDate() - 2);\n [lastSaturday, lastSaturdayFootyStats] = await calculateDate(saturdayDate);\n\n historicDate = new Date();\n historicDate.setDate(\n historicDate.getDate() - ((historicDate.getDay() + 6) % 7)\n );\n historicDate.setDate(historicDate.getDate() - 9);\n [historic, historicFootyStats] = await calculateDate(historicDate);\n\n\n async function convertTimestampForSofaScore(timestamp) {\n let newDate = new Date(timestamp);\n \n let year = newDate.getFullYear();\n let month = String(newDate.getMonth() + 1).padStart(2, '0'); // Adding 1 to month because it is zero-based\n let day = String(newDate.getDate()).padStart(2, '0');\n \n let converted = `${year}-${month}-${day}`;\n \n return converted;\n }\n\n todaySS = await convertTimestampForSofaScore(new Date());\n tomorrowSS = await convertTimestampForSofaScore(tomorrowsDate);\n yesterdaySS = await convertTimestampForSofaScore(yesterdaysDate);\n lastSaturdaySS = await convertTimestampForSofaScore(saturdayDate);\n historicSS = await convertTimestampForSofaScore(historicDate);\n\n const text =\n \"Select a day you would like to retrieve fixtures for from the options above\\n A list of games will be returned once the data has loaded\\n Once all fixtures have loaded, click on “Get Predictions” to see XGTipping's forecasted outcomes for every game\\n If a game has completed, the predictions is displayed on the right and the actual result on the left\\n Each individual fixture is tappable/clickable. By doing so, you can access a range of detailed stats, from comparative charts, granular performance measures to previous meetings.\\n All games are subject to the same automated prediction algorithm with the outcome being a score prediction. Factors that determine the tip include the following, amongst others:\\n - Goal differentials\\n - Expected goal differentials \\n - Attack/Defence performance\\n - Form trends over time\\n - Home/Away records\\n - WDL records\\n - Points per game \\n - A range of other comparative factors\\n –\\n\";\n\n const text2 =\n \"A range of tools are available should you wish to use them\\n Build a multi - Use the '+' or '-' buttons to add or remove a game deemed to be one of XGTIpping's highest confidence tips from the day\\n Exotic of the day: A pre-built exotic multi comprising of XGTipping's highest confidence tips\\n BTTS games: Games where both teams to score is deemed a likely outcome\\n Over 2.5 goals tips: Games where over 2.5 goals are most likely to be scored\\n XG tips: Comprises only games where the expected goal differentials between each team are at their greatest. We believe this shows a true disparity in the form of the two opposing teams\\n Tap the 'How to use' option to hide this text\";\n\n let textJoined = text.concat(text2);\n\n let newText = textJoined.split(\"\\n\").map((i) => {\n return

    {i}

    ;\n });\n\n async function renderButtons() {\n ReactDOM.render(\n
    \n
    \n \n fixtureList.push(\n await generateFixtures(\n \"lastSaturday\",\n lastSaturday,\n selectedOdds,\n lastSaturdayFootyStats,\n false,\n today,\n lastSaturdaySS\n )\n )\n }\n />\n
    \n await decrementDate(1, date)}\n />\n \n fixtureList.push(\n await generateFixtures(\n \"todaysFixtures\",\n dateString,\n selectedOdds,\n dateFootyStats,\n false,\n today,\n dateSS\n )\n )\n }\n />\n \n fixtureList.push(\n await generateFixtures(\n \"todaysFixtures\",\n today,\n selectedOdds,\n todayFootyStats,\n true,\n today,\n todaySS\n )\n )\n }\n />\n \n fixtureList.push(\n await generateFixtures(\n \"tomorrowsFixtures\",\n tomorrow,\n selectedOdds,\n tomorrowFootyStats,\n true,\n today,\n tomorrowSS\n )\n )\n }\n />\n
    ,\n document.getElementById(\"Buttons\")\n );\n }\n\n ReactDOM.render(\n
    \n
    \n \n fixtureList.push(\n await generateFixtures(\n \"lastSaturday\",\n lastSaturday,\n selectedOdds,\n lastSaturdayFootyStats,\n false,\n today,\n lastSaturdaySS\n )\n )\n }\n />\n {/* \n fixtureList.push(\n await generateFixtures(\n \"historic\",\n historic,\n selectedOdds,\n historicFootyStats\n )\n )\n }\n /> */}\n
    \n await decrementDate(1, date)}\n />\n \n fixtureList.push(\n await generateFixtures(\n \"todaysFixtures\",\n today,\n selectedOdds,\n todayFootyStats,\n true,\n today,\n todaySS\n )\n )\n }\n />\n \n fixtureList.push(\n await generateFixtures(\n \"tomorrowsFixtures\",\n tomorrow,\n selectedOdds,\n tomorrowFootyStats,\n true,\n today,\n tomorrowSS\n )\n )\n }\n />\n \n *Not enough data to predict games in the first few gameweeks -\n predictions displayed as 'x - x'\n \n
    ,\n document.getElementById(\"Buttons\")\n );\n ReactDOM.render(\n
    \n \n \n
    ,\n document.getElementById(\"Checkbox\")\n );\n ReactDOM.render(\n \n \n ,\n document.getElementById(\"XGDiff\")\n );\n\n // ReactDOM.render(\n // {\n // let leagues = await getLowestScoringLeagues();\n // const leagueList = [];\n\n // leagues.forEach(async (league) =>\n // leagueList.push(\n //
      \n //

      \n // {league.league} ({league.leagueCountry})\n //

      \n //
    • Average goals: {league.averageGoals}
    • \n //
    • Under 2.5 goals %: {league.under25Percentage}%
    • \n //
    \n // )\n // );\n\n // reactDom.render(\n //
    \n //

    Leagues with the lowest scoring games

    \n //
      {leagueList}
    \n //
    ,\n // document.getElementById(\"Under25Games\")\n // );\n // }}\n // >,\n // document.getElementById(\"Under25Games\")\n // );\n\n // ReactDOM.render(\n // {\n // let leagues = await getHighestScoringLeagues();\n // const leagueList = [];\n\n // leagues.forEach(async (league) =>\n // leagueList.push(\n //
      \n //

      \n // {league.league} ({league.leagueCountry})\n //

      \n //
    • Average goals: {league.averageGoals}
    • \n //
    • Over 2.5 goals %: {league.over25Percentage}%
    • \n //
    \n // )\n // );\n\n // reactDom.render(\n //
    \n //

    Leagues with the highest scoring games

    \n //
      {leagueList}
    \n //
    ,\n // document.getElementById(\"Over25Games\")\n // );\n // }}\n // >,\n // document.getElementById(\"Over25Games\")\n // );\n}\n\nasync function getHighestScoringLeagues() {\n let teamsList = await fetch(`${process.env.REACT_APP_EXPRESS_SERVER}over25`);\n let arr = [];\n await teamsList.json().then(async (leagues) => {\n for (let index = 0; index < 215; index++) {\n const league = {\n league: leagues.data.top_leagues.data[index].name,\n leagueCountry: leagues.data.top_leagues.data[index].country,\n averageGoals: leagues.data.top_leagues.data[index].seasonAVG_overall,\n over25Percentage:\n leagues.data.top_leagues.data[index].seasonOver25Percentage_overall,\n division: leagues.data.top_leagues.data[index].division,\n leagueId: leagues.data.top_leagues.data[index].id,\n };\n arr.push(league);\n }\n });\n\n const finalArray = arr.filter(\n (league) =>\n leagueOrder.find((element) => element === league.leagueId) &&\n league.averageGoals >= 2.5\n );\n\n let sortedArray = finalArray.sort((a, b) => b.averageGoals - a.averageGoals);\n\n return sortedArray;\n}\n\nasync function getLowestScoringLeagues() {\n let teamsList = await fetch(`${process.env.REACT_APP_EXPRESS_SERVER}under25`);\n let arr = [];\n await teamsList.json().then(async (leagues) => {\n for (let index = 0; index < 215; index++) {\n const league = {\n league: leagues.data.top_leagues.data[index].name,\n leagueCountry: leagues.data.top_leagues.data[index].country,\n averageGoals: leagues.data.top_leagues.data[index].seasonAVG_overall,\n under25Percentage:\n leagues.data.top_leagues.data[index].seasonUnder25Percentage_overall,\n leagueId: leagues.data.top_leagues.data[index].id,\n };\n arr.push(league);\n }\n });\n\n const finalArray = arr.filter(\n (league) =>\n leagueOrder.find((element) => element === league.leagueId) &&\n league.averageGoals < 2.5\n );\n\n let sortedArray = finalArray.sort((a, b) => a.averageGoals - b.averageGoals);\n\n return sortedArray;\n}\n\nconst welcomeTextUnsplitOne = `Welcome to XGTipping. Your go-to resource for all things football, from predictions, comprehensive head to head stats, results, xg scores, odds, league tables, form, and bespoke multi-builders underpinned by expected goal (XG) data.\\n `;\nlet welcomeTextOne = welcomeTextUnsplitOne.split(\"\\n\").map((i) => {\n return

    {i}

    ;\n});\n\nconst welcomeTextUnsplitTwo = `XGTipping is completely independent and free to use, relying on a donation model to support running costs. For feedback or feature ideas, get in touch at @TippingXg.`;\nlet welcomeTextTwo = welcomeTextUnsplitTwo.split(\"\\n\").map((i) => {\n return

    {i}

    ;\n});\n\nfunction App() {\n getLeagueList();\n return (\n <>\n
    \n
    \n \n r/xgtipping\n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    Loading all fixture and form data...
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n {/* */}\n
    \n
    \n
    {welcomeTextOne}
    \n
    \n Below is an example of our tips/results overview for you to\n familiarise yourself with. Get real fixtures using the date buttons,\n above. When loaded, tap on one to see full match stats\n
    \n
    \n Home odds\n \n Result / KO Time\n Our Prediction\n \n Away odds\n
    \n \n
    \n
    {welcomeTextTwo}
    \n
    \n We cover a range of leagues, including\n
      \n
    • Premier League
    • \n
    • English Football League
    • \n
    • La Liga
    • \n
    • Serie A
    • \n
    • Bundesliga
    • \n
    • Ligue 1
    • \n
    • MLS
    • \n
    • Primeira Liga
    • \n
    • Loads more...
    • \n
    \n
    \n
    \n
    \n
    Raw data from
    \n \n footystats.org\n \n
    \n
    \n We aim to remain free to use, contributions are always appreciated\n though:\n \n Donations\n \n ₿itcoin address\n \n bc1q7j62txkvhfu0dt3l0s07saze6pjnyzs26wfgp0\n \n
    \n
    \n
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n
    \n \n );\n}\n\nexport default App;\n\n// import React from \"react\";\n// import { BrowserRouter as Router, Route, Routes, Link } from \"react-router-dom\";\n// import HomePage from \"./components/HomePage\";\n// import TeamPage from \"./components/Team\";\n\n// const App = () => {\n// return (\n// \n// \n// } />\n// } />\n// {/* Add more routes */}\n// \n// \n// );\n// };\n\n// export default App;\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React, { useState, useEffect } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { CreateBadge } from \"./createBadge\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n} from \"chart.js\";\nimport { Bar } from \"react-chartjs-2\";\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend\n);\n\nfunction TeamPage() {\n const [dataState, setData] = useState([]);\n\n useEffect(() => {\n fetchData();\n }, []);\n\n const fetchData = async () => {\n try {\n const responseHome = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}team/${storedFixtureDetailsJson.homeId}`\n );\n const resultHome = await responseHome.json();\n\n const responseAway = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}team/${storedFixtureDetailsJson.awayId}`\n );\n const resultAway = await responseAway.json();\n // setData(result.data.stadium_name);\n\n let indexHome = resultHome.data.findIndex(\n (x) => x.season_format === \"Domestic League\"\n );\n let indexAway = resultAway.data.findIndex(\n (x) => x.season_format === \"Domestic League\"\n );\n\n if (resultHome.data[indexHome].stats.seasonScoredNum_overall) {\n setData((test) => ({\n ...test,\n scoredOverallHome:\n resultHome.data[indexHome].stats.seasonScoredNum_overall,\n playedHomeOnly:\n resultHome.data[indexHome].stats.seasonMatchesPlayed_home,\n scoredOverallHomeOnly:\n resultHome.data[indexHome].stats.seasonScoredNum_home,\n conceededOverallHome:\n resultHome.data[indexHome].stats.seasonConcededNum_overall,\n conceededOverallHomeOnly:\n resultHome.data[indexHome].stats.seasonConcededNum_home,\n\n PPGOverallHome: resultHome.data[indexHome].stats.seasonPPG_overall,\n PPGOverallHomeOnly: resultHome.data[indexHome].stats.seasonPPG_home,\n leaguePosition_overallHome:\n resultHome.data[indexHome].stats.leaguePosition_overall,\n leaguePosition_HomeOnly:\n resultHome.data[indexHome].stats.leaguePosition_home,\n averageAttendance:\n resultHome.data[indexHome].stats.average_attendance_home,\n BTTSPercentage_overallHome:\n resultHome.data[indexHome].stats.seasonBTTSPercentage_overall,\n BTTSAndWinPercentage_Home:\n resultHome.data[indexHome].stats.BTTS_and_win_percentage_overall,\n BTTSAndLosePercentage_Home:\n resultHome.data[indexHome].stats.BTTS_and_lose_percentage_overall,\n BTTSBothHalvesHome:\n resultHome.data[indexHome].stats\n .BTTS_both_halves_percentage_overall,\n GoalDifferenceHT_overall_Home:\n resultHome.data[indexHome].stats.GoalDifferenceHT_overall,\n GD_2hg_overall_Home: resultHome.data[indexHome].stats.gd_2hg_overall,\n leadingAtHTPercentage_overallHome:\n resultHome.data[indexHome].stats.leadingAtHTPercentage_overall,\n seasonOver15Percentage_overallHome:\n resultHome.data[indexHome].stats.seasonOver15Percentage_overall,\n seasonOver25Percentage_overallHome:\n resultHome.data[indexHome].stats.seasonOver25Percentage_overall,\n seasonOver35Percentage_overallHome:\n resultHome.data[indexHome].stats.seasonOver35Percentage_overall,\n seasonOver45Percentage_overallHome:\n resultHome.data[indexHome].stats.seasonOver45Percentage_overall,\n scoredBothHalvesPercentage_overallHome:\n resultHome.data[indexHome].stats.scoredBothHalvesPercentage_overall,\n shots_on_target_per_goals_scored_overallHome:\n resultHome.data[indexHome].stats.additional_info\n .shots_on_target_per_goals_scored_overall,\n cornersTotalAVG_overallHome:\n resultHome.data[indexHome].stats.cornersTotalAVG_overall,\n cardsAVG_overallHome:\n resultHome.data[indexHome].stats.cardsAVG_overall,\n foulsAVG_overallHome:\n resultHome.data[indexHome].stats.foulsAVG_overall,\n penalties_won_per_match_overallHome:\n resultHome.data[indexHome].stats.additional_info\n .penalties_won_per_match_overall,\n penalty_in_a_match_percentage_overallHome:\n resultHome.data[indexHome].stats.additional_info\n .penalty_in_a_match_percentage_overall,\n\n scoredOverallAway:\n resultAway.data[indexAway].stats.seasonScoredNum_overall,\n playedAwayOnly:\n resultAway.data[indexAway].stats.seasonMatchesPlayed_away,\n scoredOverallAwayOnly:\n resultAway.data[indexAway].stats.seasonScoredNum_away,\n conceededOverallAway:\n resultAway.data[indexAway].stats.seasonConcededNum_overall,\n conceededOverallAwayOnly:\n resultAway.data[indexAway].stats.seasonConcededNum_away,\n\n PPGOverallAway: resultAway.data[indexAway].stats.seasonPPG_overall,\n PPGOverallAwayOnly: resultAway.data[indexAway].stats.seasonPPG_away,\n leaguePosition_overallAway:\n resultAway.data[indexAway].stats.leaguePosition_overall,\n leaguePosition_AwayOnly:\n resultAway.data[indexAway].stats.leaguePosition_away,\n BTTSPercentage_overallAway:\n resultAway.data[indexAway].stats.seasonBTTSPercentage_overall,\n BTTSAndWinPercentage_Away:\n resultAway.data[indexAway].stats.BTTS_and_win_percentage_overall,\n BTTSAndLosePercentage_Away:\n resultAway.data[indexAway].stats.BTTS_and_lose_percentage_overall,\n BTTSBothHalvesAway:\n resultAway.data[indexAway].stats\n .BTTS_both_halves_percentage_overall,\n GoalDifferenceHT_overall_Away:\n resultAway.data[indexAway].stats.GoalDifferenceHT_overall,\n GD_2hg_overall_Away: resultAway.data[indexAway].stats.gd_2hg_overall,\n leadingAtHTPercentage_overallAway:\n resultAway.data[indexAway].stats.leadingAtHTPercentage_overall,\n seasonOver15Percentage_overallAway:\n resultAway.data[indexAway].stats.seasonOver15Percentage_overall,\n seasonOver25Percentage_overallAway:\n resultAway.data[indexAway].stats.seasonOver25Percentage_overall,\n seasonOver35Percentage_overallAway:\n resultAway.data[indexAway].stats.seasonOver35Percentage_overall,\n seasonOver45Percentage_overallAway:\n resultAway.data[indexAway].stats.seasonOver45Percentage_overall,\n scoredBothHalvesPercentage_overallAway:\n resultAway.data[indexAway].stats.scoredBothHalvesPercentage_overall,\n shots_on_target_per_goals_scored_overallAway:\n resultAway.data[indexAway].stats.additional_info\n .shots_on_target_per_goals_scored_overall,\n\n cornersTotalAVG_overallAway:\n resultAway.data[indexAway].stats.cornersTotalAVG_overall,\n cardsAVG_overallAway:\n resultAway.data[indexAway].stats.cardsAVG_overall,\n foulsAVG_overallAway:\n resultAway.data[indexAway].stats.foulsAVG_overall,\n penalties_won_per_match_overallAway:\n resultAway.data[indexAway].stats.additional_info\n .penalties_won_per_match_overall,\n penalty_in_a_match_percentage_overallAway:\n resultAway.data[indexAway].stats.additional_info\n .penalty_in_a_match_percentage_overall,\n }));\n }\n } catch (error) {\n console.error(\"Error fetching data:\", error);\n }\n };\n\n const storedDataHome = useSelector((state) => state.data.dataHome);\n const jsonDataHome = JSON.parse(storedDataHome);\n const propertyNamesHome = Object.entries(jsonDataHome);\n\n const storedDataHomeDef = useSelector((state) => state.data.dataHomeDef);\n const jsonDataHomeDef = JSON.parse(storedDataHomeDef);\n const propertyNamesHomeDef = Object.entries(jsonDataHomeDef);\n\n const storedDataallTeamResultsHome = useSelector(\n (state) => state.data.allTeamResultsHome\n );\n const jsonDataallTeamResultsHome = JSON.parse(storedDataallTeamResultsHome);\n const propertyNamesallTeamResultsHome = Object.values(\n jsonDataallTeamResultsHome\n );\n\n const homeDetails = useSelector((state) => state.data.homeDetails);\n const jsonHomeDetails = JSON.parse(homeDetails);\n\n const storedDataAway = useSelector((state) => state.data.dataAway);\n const jsonDataAway = JSON.parse(storedDataAway);\n const propertyNamesAway = Object.entries(jsonDataAway);\n\n const storedDataAwayDef = useSelector((state) => state.data.dataAwayDef);\n const jsonDataAwayDef = JSON.parse(storedDataAwayDef);\n const propertyNamesAwayDef = Object.entries(jsonDataAwayDef);\n\n const storedDataallTeamResultsAway = useSelector(\n (state) => state.data.allTeamResultsAway\n );\n const jsonDataallTeamResultsAway = JSON.parse(storedDataallTeamResultsAway);\n const propertyNamesallTeamResultsAway = Object.values(\n jsonDataallTeamResultsAway\n );\n\n const awayDetails = useSelector((state) => state.data.awayDetails);\n const jsonAwayDetails = JSON.parse(awayDetails);\n\n const storedFixtureDetails = useSelector(\n (state) => state.data.fixtureDetails\n );\n const storedFixtureDetailsJson = JSON.parse(storedFixtureDetails);\n\n const options = {\n plugins: {\n title: {\n display: true,\n text: \"Team comparison\",\n },\n },\n aspectRatio: 0.5,\n maintainAspectRatio: true,\n responsive: true,\n scales: {\n x: {\n stacked: true,\n },\n y: {\n stacked: true,\n display: false,\n },\n },\n };\n const labels = [\n storedFixtureDetailsJson.homeTeamName,\n storedFixtureDetailsJson.awayTeamName,\n ];\n\n const data = {\n labels,\n datasets: [\n {\n data: [\n jsonHomeDetails[\"Attacking Strength\"],\n [jsonAwayDetails[\"Attacking Strength\"]],\n ],\n label: \"Attacking Strength\",\n backgroundColor: \"#030061\",\n },\n {\n data: [\n jsonHomeDetails[\"Defensive Strength\"],\n [jsonAwayDetails[\"Defensive Strength\"]],\n ],\n label: \"Defensive Strength\",\n backgroundColor: \"#CC3314\",\n },\n ],\n };\n\n return (\n
    \n
    \n \n {`${storedFixtureDetailsJson.homeTeamName} v ${storedFixtureDetailsJson.awayTeamName}`}\n \n
    \n

    \n {storedFixtureDetailsJson.stadium} KO: {storedFixtureDetailsJson.time} |\n Average Attendance: {dataState.averageAttendance}\n

    \n

    \n XGTipping Prediction: {storedFixtureDetailsJson.homeGoals} -{\" \"}\n {storedFixtureDetailsJson.awayGoals}\n

    \n
    \n
      \n \n

      {storedFixtureDetailsJson.homeTeamName}

      \n {propertyNamesHome.map(([key, value], index) => (\n
    • \n {key}:{\" \"}\n {typeof value === \"object\" ? JSON.stringify(value) : value}\n
    • \n ))}\n
        \n {propertyNamesHomeDef.map(([key, value], index) => (\n
      • \n {key}:{\" \"}\n {typeof value === \"object\" ? JSON.stringify(value) : value}\n
      • \n ))}\n
      \n
    • Scored overall: {dataState.scoredOverallHome}
    • \n
    • Conceeded overall: {dataState.conceededOverallHome}
    • \n
    • \n Average scored home only:{\" \"}\n {(\n dataState.scoredOverallHomeOnly / dataState.playedHomeOnly\n ).toFixed(2)}\n
    • \n
    • \n Average conceeded home only:{\" \"}\n {(\n dataState.conceededOverallHomeOnly / dataState.playedHomeOnly\n ).toFixed(2)}\n
    • \n
    • PPG overall: {dataState.PPGOverallHome}
    • \n
    • PPG home only: {dataState.PPGOverallHomeOnly}
    • \n
    • League position: {dataState.leaguePosition_overallHome}
    • \n
    • \n League position home only: {dataState.leaguePosition_HomeOnly}\n
    • \n
    • BTTS {dataState.BTTSPercentage_overallHome}%
    • \n
    • BTTS and win: {dataState.BTTSAndWinPercentage_Home}%
    • \n
    • BTTS and lose: {dataState.BTTSAndLosePercentage_Home}%
    • \n
    • BTTS both halves: {dataState.BTTSBothHalvesHome}%
    • \n
    • \n Goal diff 1st half only: {dataState.GoalDifferenceHT_overall_Home}\n
    • \n
    • Goal diff 2nd half only: {dataState.GD_2hg_overall_Home}
    • \n
    • \n Leading at half time: {dataState.leadingAtHTPercentage_overallHome}%\n
    • \n
    • \n Over 1.5 goals in games:{\" \"}\n {dataState.seasonOver15Percentage_overallHome}%\n
    • \n
    • \n Over 2.5 goals in games:{\" \"}\n {dataState.seasonOver25Percentage_overallHome}%\n
    • \n
    • \n Over 3.5 goals in games:{\" \"}\n {dataState.seasonOver35Percentage_overallHome}%\n
    • \n
    • \n Over 4.5 goals in games:{\" \"}\n {dataState.seasonOver45Percentage_overallHome}%\n
    • \n
    • \n Scored both halves:{\" \"}\n {dataState.scoredBothHalvesPercentage_overallHome}%\n
    • \n
    • \n SOTs per goal:{\" \"}\n {dataState.shots_on_target_per_goals_scored_overallHome}\n
    • \n
    • Corners in game avg: {dataState.cornersTotalAVG_overallHome}
    • \n
    • Cards avg: {dataState.cardsAVG_overallHome}
    • \n
    • Fouls against avg: {dataState.foulsAVG_overallHome}
    • \n
    • \n Penalties won avg: {dataState.penalties_won_per_match_overallHome}\n
    • \n
    • \n Penalties in match:{\" \"}\n {dataState.penalty_in_a_match_percentage_overallHome}%\n
    • \n
    \n
      \n \n

      {storedFixtureDetailsJson.awayTeamName}

      \n {propertyNamesAway.map(([key, value], index) => (\n
    • \n {key}:{\" \"}\n {typeof value === \"object\" ? JSON.stringify(value) : value}\n
    • \n ))}\n
        \n {propertyNamesAwayDef.map(([key, value], index) => (\n
      • \n {key}:{\" \"}\n {typeof value === \"object\" ? JSON.stringify(value) : value}\n
      • \n ))}\n
      \n
    • Scored overall: {dataState.scoredOverallAway}
    • \n
    • Conceeded overall: {dataState.conceededOverallAway}
    • \n
    • \n Average scored away only:{\" \"}\n {(\n dataState.scoredOverallAwayOnly / dataState.playedAwayOnly\n ).toFixed(2)}\n
    • \n
    • \n Average conceeded away only:{\" \"}\n {(\n dataState.conceededOverallAwayOnly / dataState.playedAwayOnly\n ).toFixed(2)}\n
    • \n
    • PPG overall: {dataState.PPGOverallAway}
    • \n
    • PPG away only: {dataState.PPGOverallAwayOnly}
    • \n
    • League position: {dataState.leaguePosition_overallAway}
    • \n
    • \n League position away only: {dataState.leaguePosition_AwayOnly}\n
    • \n
    • BTTS: {dataState.BTTSPercentage_overallAway}%
    • \n
    • BTTS and win: {dataState.BTTSAndWinPercentage_Away}%
    • \n
    • BTTS and lose: {dataState.BTTSAndLosePercentage_Away}%
    • \n
    • BTTS both halves: {dataState.BTTSBothHalvesAway}%
    • \n
    • \n Goal diff 1st half only: {dataState.GoalDifferenceHT_overall_Away}\n
    • \n
    • Goal diff 2nd half only: {dataState.GD_2hg_overall_Away}
    • \n
    • \n Leading at half time: {dataState.leadingAtHTPercentage_overallAway}%\n
    • \n
    • \n Over 1.5 goals in games:{\" \"}\n {dataState.seasonOver15Percentage_overallAway}%\n
    • \n
    • \n Over 2.5 goals in games:{\" \"}\n {dataState.seasonOver25Percentage_overallAway}%\n
    • \n
    • \n Over 3.5 goals in games:{\" \"}\n {dataState.seasonOver35Percentage_overallAway}%\n
    • \n
    • \n Over 4.5 goals in games:{\" \"}\n {dataState.seasonOver45Percentage_overallAway}%\n
    • \n
    • \n Scored both halves:{\" \"}\n {dataState.scoredBothHalvesPercentage_overallAway}%\n
    • \n
    • \n SOTs per goal:{\" \"}\n {dataState.shots_on_target_per_goals_scored_overallAway}\n
    • \n
    • Corners in game avg: {dataState.cornersTotalAVG_overallAway}
    • \n
    • Cards avg: {dataState.cardsAVG_overallAway}
    • \n
    • Fouls against avg: {dataState.foulsAVG_overallAway}
    • \n
    • \n Penalties won avg: {dataState.penalties_won_per_match_overallAway}\n
    • \n
    • \n Penalties in match:{\" \"}\n {dataState.penalty_in_a_match_percentage_overallAway}%\n
    • \n
    \n
    \n \n \n \n
    \n
      \n {propertyNamesallTeamResultsHome.map((match, index) => (\n <>\n
      {match.date}
      \n
      \n
      {match.homeTeam}
      \n \n {match.homeGoals} : {match.awayGoals}\n \n
      {match.awayTeam}
      \n
      \n \n ))}\n
    \n
      \n {propertyNamesallTeamResultsAway.map((match, index) => (\n <>\n
      {match.date}
      \n
      \n
      {match.homeTeam}
      \n \n {match.homeGoals} : {match.awayGoals}\n \n
      {match.awayTeam}
      \n
      \n \n ))}\n
    \n
    \n
    \n );\n}\n\nexport default TeamPage;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport \"./index.css\";\nimport App from \"./App\";\nimport reportWebVitals from \"./reportWebVitals\";\nimport { BrowserRouter as Router, Route, Routes, HashRouter } from \"react-router-dom\";\nimport TeamPage from \"./components/Team\";\nimport { Provider } from \"react-redux\";\nimport store from \"./logic/store\"; // Import your Redux store\nimport {Fixture} from \"./components/Fixture\"\n\nReactDOM.render(\n // \n \n \n \n } />\n } />\n {/* } /> */}\n \n \n \n ,\n // ,\n document.getElementById(\"root\")\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/main.ca0963dc.chunk.js.map b/static/js/main.ca0963dc.chunk.js.map deleted file mode 100644 index 1efd9fa5..00000000 --- a/static/js/main.ca0963dc.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["components/Header.js","components/Button.js","components/OddsRadio.js","components/createBadge.js","components/createStatsDiv.js","components/Div.js","logic/getForm.js","components/Slider.js","components/CollapsableElement.js","components/Increment.js","logic/getBTTSPotential.js","components/Carousel.js","components/KofiButton.js","components/SliderDiff.js","logic/getScorePredictions.js","components/LeagueTable.js","logic/getFixtures.js","components/HeadToHead.js","components/Table.js","logic/getTeamStats.js","logic/compareFormTrend.js","components/Chart.js","components/SofaScore.js","logic/getStats.js","components/Fixture.js","logic/dataSlice.js","logic/store.js","App.js","reportWebVitals.js","components/Team.js","index.js"],"names":["Header","className","Button","props","id","text","variant","type","onClick","onClickEvent","style","selectedOdds","OddsRadio","handleOptionChange","setState","value","state","this","name","checked","onChange","Component","CreateBadge","image","ClassName","src","alt","flexShrink","Stats","styleForm","formIndicator","styleBTTS","BTTSBoolean","clicked","formRun","console","log","FormTextString","FavouriteRecord","Results","homeOrAway","ResultsHorA","homeOrAwayResults","BTTSArray","goals","conceeded","possession","XG","XGConceded","goalDifference","goalDifferenceHomeOrAway","sot","dangerousAttacks","leaguePosition","homeOrAwayLeaguePosition","winPercentage","toFixed","drawPercentage","lossPercentage","ppg","formTrend","CardsTotal","CornersAverage","Div","getForm","match","teams","homeId","awayId","fixtureForm","i","team","fetch","process","response","json","then","formData","lastMatchTimestamp","last_updated_match_timestamp","length","rangeValue","Slide","useState","range","setRange","fractionalValue","setFractionalValue","useEffect","roundedValueOne","Math","round","roundedValueTwo","fractionalOne","oddslib","from","to","precision","fractionalTwo","error","sx","width","color","event","newValue","valueLabelDisplay","step","min","max","valueLabelFormat","index","Collapsable","transitionTime","trigger","classNameButton","buttonText","classNameFlex","classNameTwo","element","classNameThree","elementTwo","incrementValue","riskLevel","Increment","IncrementItem","getNewTips","allTips","DecreaseItem","show","getBTTSPotential","homeGoals","awayGoals","unroundedHomeGoals","unroundedAwayGoals","homeBTTS","bttsAllPercentageHome","homeOnlyBTTS","bttsPercentageHomeHome","awayOnlyBTTS","bttsPercentageAwayAway","awayBTTS","bttsAllPercentageAway","homeG","awayG","combinedBTTS","bttsFraction","status","awayOdds","btts","bttsChosen","totalGoals","rawFinalHomeGoals","rawFinalAwayGoals","SwiperCore","use","EffectCoverflow","Pagination","Slider","effect","autoHeight","grabCursor","centeredSlides","slidesPerView","coverflowEffect","rotate","stretch","depth","modifier","slideShadows","pagination","clickable","element2","element3","element4","element5","StyledKofiButton","title","kofiID","minimumXG","minimumGD","minimumGDHorA","minimumLast10","SlideDiff","finalHomeGoals","finalAwayGoals","homeOdds","setValue","useCase","marks","parseFloat","lower","upper","Headers","append","drawPredictions","sumStatDAWin","sumStatDALoss","sumStatPossessionWin","sumStatPossessionLoss","sumStatSOTWin","sumStatSOTLoss","sumStatPPGLast10Win","sumStatPPGLast10Loss","sumOddsWin","sumOddsLoss","sumXGForWin","sumXGForLoss","sumXGAgainstWin","sumXGAgainstLoss","allDrawOutcomes","totalROI","totalInvestment","totalProfit","convertTimestamp","timestamp","newDate","Date","toLocaleDateString","split","day","month","year","converted","getPointsFromLastX","lastX","pointsAddition","points","forEach","game","getPastLeagueResults","hOrA","form","completeData","date","allLeagueResultsArrayOfObjects","leagueIndex","fixtures","teamsHomeResults","filter","fixture","home_name","item","date_unix","sort","a","b","teamsAwayResults","away_name","homeResults","awayResults","oddsSumHome","oddsSumAway","favouriteCount","underdogCount","winningFavouriteCount","drawingFavouriteCount","beatenFavouriteCount","winningUnderdogCount","drawingUnderdogCount","beatenUnderdogCount","resultedGame","homeGoalCount","team_a_xg","awayGoalCount","team_b_xg","team_a_possession","team_a_shots","team_a_shotsOnTarget","team_b_shotsOnTarget","team_a_dangerous_attacks","team_a_corners","odds_ft_1","odds_ft_2","homeTeam","awayTeam","XGAgainst","scored","shots","sotAgainst","corners","dateRaw","oddsHome","oddsAway","result","push","team_b_possession","team_b_shots","team_b_dangerous_attacks","team_b_corners","reversedResultsHome","reversedResultsAway","y","allClearFavouriteResultsHome","allClearFavouriteResultsAway","simlarGameResultsHome","concat","allSlightFavouriteResultsHome","allSlightFavouriteResultsAway","allTossupResultsHome","allTossupResultsAway","allUnderdogResultsHome","allUnderdogResultsAway","allMassiveUnderdogResultsHome","allMassiveUnderdogResultsAway","z","simlarGameResultsAway","allTeamResults","allTeamResultsHome","allTeamResultsAway","points6","map","res","slice","pointsSum6","reduce","avPoints6","points5","pointsSum5","avPoints5","pointsAll","pointsSumAll","avPointsAll","resultsAll","resultsHome","resultsAway","avScoredLast5","avScoredLast5Sum","avConceededLast5","avConceededLast5Sum","avDALast5","avDALast5Sum","avSOTLast5","avSOTLast5Sum","avSOTAgainstLast5","avSOTAgainstLast5Sum","avShotsLast5","avShotsLast5Sum","avCornersLast5","avCornersLast5Sum","avPosessionLast5","avPosessionLast5Sum","avXGLast5","avXGLast5Sum","avXGAgainstLast5","avXGAgainstLast5Sum","averageOddsHome","averageOddsAway","oddsReliabilityWin","oddsReliabilityDraw","oddsReliabilityLose","oddsReliabilityWinAsUnderdog","oddsReliabilityDrawAsUnderdog","oddsReliabilityLoseAsUnderdog","reliableIndicator","unreliableIndicator","predictabilityScore","reliabilityString","teamGoalsHome","teamGoalsAway","teamGoalsAll","teamGoalsAllRecentAtStart","reverse","teamConceededHome","teamConceededAway","teamConceededAll","teamConceededAllRecentAtStart","teamXGForAll","teamXGAgainstAll","teamXGForAllRecentAtStart","teamXGAgainstAllRecentAtStart","teamXGForHome","teamXGAgainstHome","teamXGForAway","teamXGAgainstAway","XGSum","avgXGScored","XGAgainstSum","avgXGConceeded","possessionSum","avgPossession","possessionHome","possessionSumHome","avgPossessionHome","possessionAway","possessionSumAway","avgPossessionAway","dangerousAttacksSum","avgDangerousAttacks","dangerousAttacksHome","dangerousAttacksSumHome","avgDangerousAttacksHome","dangerousAttacksAway","dangerousAttacksSumAway","avgDangerousAttacksAway","shotsSum","avgShots","shotsHome","shotsSumHome","avgShotsHome","shotsAway","shotsSumAway","avgShotsAway","shotsOnTarget","shotsOnTargetSum","avgShotsOnTarget","shotsOnTargetHome","shotsOnTargetSumHome","avgShotsOnTargetHome","shotsOnTargetAway","shotsOnTargetSumAway","avgShotsOnTargetAway","shotsOnTargetAgainst","shotsOnTargetSumAgainst","avgShotsOnTargetAgainst","shotsOnTargetAgainstHome","shotsOnTargetSumAgainstHome","avgShotsOnTargetAgainstHome","shotsOnTargetAgainstAway","shotsOnTargetSumAgainstAway","avgShotsOnTargetAgainstAway","cornersSum","cornersAv","cornersHome","cornersSumHome","cornersAvHome","cornersAway","cornersSumAway","cornersAvAway","last5XG","last5XGSum","last5XGAvgFor","last5XGHome","last5XGSumHome","last5XGAvgForHome","last5XGAway","last5XGSumAway","last5XGAvgForAway","XGSumHome","avgXGScoredHome","XGSumAway","avgXGScoredAway","XGAgainstSumHome","avgXGConceededHome","XGAgainstSumAway","avgXGConceededAway","last5XGAgainst","last5XGAgainstSum","last5XGAvgAgainst","last5XGAgainstHome","last5XGAgainstSumHome","last5XGAvgAgainstHome","last5XGAgainstAway","last5XGAgainstSumAway","last5XGAvgAgainstAway","XGDiffNonAverage","XGDiffNonAverageLast5","XGOverall","XGlast5","XGAgainstAvgOverall","XGAgainstlast5","AveragePossessionOverall","AverageDangerousAttacksOverall","AverageCorners","AverageShotsOnTargetOverall","AverageShotsOnTargetAgainstOverall","alpha","beta","allGoalsArrayHomeRecent","allConceededArrayHomeRecent","allGoalsArrayHome","allConceededArrayHome","allGoalsArrayHomeOnly","allConceededArrayHomeOnly","sum","sumTwo","predictGoalsWithExponentialSmoothing","forAndAgainstRollingAv","forAndAgainstRollingAvHomeOrAway","allGoalsArrayAwayRecent","allConceededArrayAwayRecent","allGoalsArrayAway","allConceededArrayAway","allGoalsArrayAwayOnly","allConceededArrayAwayOnly","bttsHome","bttsAway","bttsAll","bttsHomeCount","bttsHomeString","bttsHomePercentage","bttsAwayCount","bttsAwayString","bttsAwayPercentage","bttsAllCount","bttsAllString","bttsAllPercentage","r","x","predictNextWeightedMovingAverage","teamGoalsHomeRollingAverage","teamGoalsAwayRollingAverage","RoundedXGFor","xg","RoundedXGAgainst","RoundedXGForHome","RoundedXGAgainstHome","RoundedXGForAway","RoundedXGAgainstAway","XGPrediction","XGPredictionHome","XGPredictionAway","teamConceededHomeRollingAverage","teamConceededAwayRollingAverage","avgScored","sumHome","avgScoredHome","sumAway","avgScoredAway","last5","last5Sum","last5AvgScored","last5Home","last5SumHome","last5AvgScoredHome","last5Away","last5SumAway","last5AvgScoredAway","last5Conceeded","last5ConceededSum","last5AvgConceeded","last5ConceededHome","last5ConceededSumHome","last5AvgConceededHome","last5ConceededAway","last5ConceededSumAway","last5AvgConceededAway","last10","last10Sum","last10AvgScored","last10Conceeded","last10ConceededSum","last10AvgConceeded","last5Goals","last5GoalsConceeded","last5GoalDiff","last10Goals","last10GoalsConceeded","last10GoalDiff","teamGoalsAllRollingAverage","teamGoalsConceededAllRollingAverage","avgConceeded","teamConceededHomeOnlySum","teamConceededAvgHomeOnly","teamConceededAwayOnlySum","teamConceededAvgAwayOnly","numbers","windowSize","startIndex","window","weights","Array","_","acc","num","movingAverage","w","calculateWeightedAverage","arr","weightedSum","totalWeight","weight","pow","teamGoalsFor","teamGoalsAgainst","lambdaFor","lambdaAgainst","predictedGoalsFor","predictedGoalsAgainst","goalsFor","goalsAgainst","calculateDifference","num1","num2","comparison","metricOne","metricTwo","stat1","stat2","statDiff","getClinicalRating","dangerousAttackConversion","rating","score","getPointsDifferential","pointsHomeAvg","pointsAwayAvg","diff","differential","getPointWeighting","pointsDiff","pointsDiffWeightingHome","pointsDiffWeightingAway","compareFormTrend","recentForm","distantForm","scoreTotal","recent","distant","getPointAverage","pointTotal","games","poissonDistribution","lambda","k","numerator","exp","denominator","factorial","n","calculateAverageGoals","adjustGoalsAvg","goalsAvg","strengthRatio","predictScore","goalsForTeam1","goalsAgainstTeam1","goalsForTeam2","goalsAgainstTeam2","team1Metrics","team2Metrics","team1AverageGoalsFor","team1AverageGoalsAgainst","team2AverageGoalsFor","team2AverageGoalsAgainst","team1StrengthRatio","team2StrengthRatio","adjustedTeam1AverageGoals","adjustedTeam2AverageGoals","adjustedTeam1AverageGoalsAgainst","adjustedTeam2AverageGoalsAgainst","maxGoals","scores","j","team1GoalExpectation","team2GoalExpectation","isFinite","probability","team1Score","team2Score","top5Scores","generateGoals","homeForm","awayForm","attackingStrength","defensiveStrengthScoreGeneration","homeAttackVsAwayDefenceComparison","awayAttackVsHomeDefenceComparison","defensiveStrength","attackingStrengthLast5","defensiveStrengthScoreGenerationLast5","homeAttackVsAwayDefenceComparisonLast5","awayAttackVsHomeDefenceComparisonLast5","attackingStrengthHomeOnly","defensiveStrengthScoreGenerationAwayOnly","homeAttackVsAwayDefenceComparisonHomeOnly","attackingStrengthAwayOnly","defensiveStrengthScoreGenerationHomeOnly","awayAttackVsHomeDefenceComparisonAwayOnly","lastGame","last2Points","XGdifferentialValueRaw","calculateScore","divider","calculate","allForm","find","home","teamName","away","PlayedHome","PlayedAway","LastFiveForm","previousToLastGame","last2","twoGameAverage","last3Points","threeGameAverage","last5Points","fiveGameAverage","last6Points","sixGameAverage","last10Points","tenGameAverage","lastHomeOrAwayPoints","homeOrAwayAverage","ScoredAverage","ScoredOverall","ConcededAverage","ConcededOverall","ScoredAverageShortTerm","ConcededAverageShortTerm","longTermAverageGoals","longTermAverageConceeded","recentGoalDiff","distantGoalDiff","recentDA","distantDA","recentPosession","distantPosession","recentCleanSheet","CleanSheetPercentage","distantCleanSheet","recentFormArray","distantFormArray","formTrendScore","expectedGoals","ScoredAverageShortAndLongTerm","conceededAverageShortAndLongTerm","longTermGoalDifference","shortTermGoalDifference","XGdifferential","XGdifferentialRecent","actualToXGDifferenceRecent","formHome","formAway","homeTenGameAvg","awayTenGameAvg","homeTwoGameAvg","awayTwoGameAvg","pointsDiff10","pointsDiff2","last10WeightingHome","last10WeightingAway","last2WeightingHome","last2WeightingAway","clinicalRating","clinicalScore","XGdifferentialValue","abs","leagueID","predictedGoalsBasedOnHomeAv","predictedGoalsBasedOnAwayAv","allTeamGoalsBasedOnAverages","predictedGoalsConceededBasedOnHomeAv","predictedGoalsConceededBasedOnAwayAv","allTeamGoalsConceededBasedOnAverages","averageScoredLeague","averageConceededLeague","last10btts","last10bttsHome","last10bttsAway","bttsPercentageHomeAway","bttsPercentageAwayHome","homeTeamHomePositionRaw","awayTeamAwayPositionRaw","homePositionHomeOnly","awayPositionAwayOnly","homePosition","homeRawPosition","awayPosition","awayRawPosition","improving","AttackingPotency","AttacksHome","AttacksAverage","attackingMetricsHome","AverageShots","AverageShotsOnTarget","Corners","attackingMetricsHomeLast5","attackingMetricsHomeOnly","attackingMetricsAwayOnly","attackingMetricsAway","attackingMetricsAwayLast5","defensiveMetricsHome","defensiveMetricsHomeLast5","defensiveMetricsAway","defensiveMetricsAwayLast5","defensiveMetricsHomeOnly","defensiveMetricsAwayOnly","attackingMetrics","defensiveMetrics","calculateAttackingStrength","attackingStrengthScoreGeneration","calculateDefensiveStrength","defensiveStrengthLast5","defensiveStrengthHomeOnly","defensiveStrengthAwayOnly","calculateMetricStrength","possessionStrength","possessionStrengthLast5","possessionStrengthHomeOnly","possessionStrengthAwayOnly","directnessOverall","directnessOverallLast5","directnessHomeOnly","directnessAwayOnly","directnessOverallStrength","directnessOverallStrengthLast5","directnessHomeStrength","directnessAwayStrength","shootingAccuracy","shootingAccuracyLast5","shootingAccuracyHomeOnly","shootingAccuracyAwayOnly","accuracyOverallStrength","accuracyOverallStrengthLast5","accuracyHomeStrength","accuracyAwayStrength","xgForStrength","xgForStrengthLast5","xgForStrengthHomeOnly","xgAgainstStrength","xgAgainstStrengthLast5","xgAgainstStrengthHomeOnly","xgForStrengthAwayOnly","xgAgainstStrengthAwayOnly","parseInt","actualToXGDifference","teamGoalsCalc","weighting","undefined","scorePredictionsRecent","scorePredictionsHA","scorePredictions","homeGoalDiff","awayGoalDiff","goalsDifferential","rollingAverageGoalsDifferential","GoalsInGamesAverageHome","GoalsInGamesAverageAway","factorOneHome","factorOneAway","factorTwoHome","factorTwoAway","scoreDiff","experimentalHomeGoals","experimentalAwayGoals","floor","omit","prediction","includeInMultis","outcome","pointsDifferential","pointsDifferentialValue","pointsDifferentialValueRaw","rollingGoalDiffDifferential","rollingGoalDiff","rollingGoalDiffValue","dangerousAttacksDifferential","dangerousAttacksDiff","dangerousAttacksDiffValue","winner","predictionOutcome","over25PredictionOutcome","bttsOutcome","total","total2","drawOdds","last10PointDiffHomePerspective","last10PointDiffAwayPerspective","XGDiffBetweenTeamsHomePerspective","XGDiffBetweenTeamsAwayPerspective","goalDiffHomeOrAwayComparison","goalDifferenceComparison","game_week","profit","getSuccessMeasure","sumProfit","investment","exactScores","successCount","netProfit","hasOwnProperty","exactScore","ROI","operand","operandTwo","exactScoreHitRate","successRate","ReactDOM","render","document","getElementById","price","combinations","gamesInExotic","exoticStake","exoticString","allTipsSorted","newArray","bestBets","Over25Tips","XGDiffTips","rollingDiffTips","dangerousAttacksDiffTips","pointsDiffTips","exoticArray","bttsArray","accumulatedOdds","predictions","array","tip","indexOf","rawOdds","renderTips","getScorePrediction","mocked","mock","Promise","all","matches","goalsA","goalsB","unroundedGoalsA","unroundedGoalsB","outcomeSymbol","over25PredictionOutcomeSymbol","bttsOutcomeSymbol","fractionHome","teamComparisonScore","predictionObject","odds","comparisonScore","rawComparisonScore","goalDifferential","experimentalCalc","fractionAway","Over25PredictionObject","decimalOdds","homeDoubleChance","over25Odds","doubleChanceOutcome","goalTotalUnrounded","XGPredictionObject","otherTeam","pointsDiffObject","rollingDiffObject","dangerousAttacksDiffObject","RenderAllFixtures","bool","getMultis","getCoverBetMaxReturns","getAccumulatorPrice","priceArray","minAccSize","stake","perms","getUniquePermutations","permLength","permutations","newArr","splice","twoDimArrayUnion","arr1","arr2","duplicate","NewlineText","str","toggleState","setIsOff","upArrow","StyledTableCell2","withStyles","theme","head","backgroundColor","padding","paddingTop","paddingBottom","textAlign","fontSize","fontFamily","margin","body","TableCell","StyledTableCell","StyledTableRow","root","TableRow","LeagueTable","singleResult","rows","Teams","component","scope","Name","Played","Wins","Draws","Losses","For","Against","GoalDifference","Points","Form","Key","leagueResults","team_a_red_cards","team_b_red_cards","leagueResultsOlder","getTopScorersTeam","ID","sorted","league","order","sortedByForm","LastWeeksResults","GamesPlayed","LeagueID","TableContainer","Paper","Table","marginTop","marginBottom","TableHead","TableBody","mostRecentGameweek","seasonAVG_home","seasonAVG_away","seasonBTTSPercentage","seasonOver05Percentage_overall","seasonOver15Percentage_overall","seasonOver25Percentage_overall","seasonOver35Percentage_overall","seasonOver45Percentage_overall","over75CornersPercentage_overall","over85CornersPercentage_overall","over95CornersPercentage_overall","over105CornersPercentage_overall","over115CornersPercentage_overall","over125CornersPercentage_overall","cornersAVG_overall","cardsAVG_overall","top_scorers","known_as","club_team_id","goals_overall","fixtureResponse","leagueInstance","lastThreeFormHome","lastThreeFormAway","lastFiveFormHome","lastFiveFormAway","lastSixFormHome","lastSixFormAway","lastTenFormHome","lastTenFormAway","leagueOrAll","formRunHome","formRunAway","WDLinLeagueHome","WDLinLeagueAway","HomeAverageGoals","homeAverageGoals","HomeAverageConceded","homeAverageConceded","AwayAverageGoals","awayAverageGoals","AwayAverageConceded","awayAverageConceded","require","fixtureArray","arrayOfGames","leagueGames","leagueArray","leagueIdArray","tableArray","worldCupArray","generateTables","allResults","currentLeagueId","data","specific_tables","groups","table","currentTeam","wdl_record","toUpperCase","Position","cleanName","matchesPlayed","seasonWins_overall","seasonDraws_overall","seasonLosses_overall","seasonGoals","seasonConceded_home","seasonConceded_away","seasonGoalDifference","LastXPoints","wdl","seasonConceded","group","league_table","all_matches_table_overall","results","mostRecentGame","pop","gameweeksResults","leagueTable","leagueStatistics","stats","statistics","createFixture","mockBool","roundedHomeOdds","roundedAwayOdds","homeFraction","awayFraction","bttsOdds","roundedBTTSOdds","homeTeamWinsPercentage","homeTeamWinPercentage","homeTeamLossesPercentage","homeTeamLossPercentage","homeTeamDrawsPercentage","homeTeamDrawPercentage","awayTeamWinsPercentage","awayTeamWinPercentage","awayTeamLossesPercentage","awayTeamLossPercentage","awayTeamDrawsPercentage","awayTeamDrawPercentage","Fixture","isFunctionRunning","generateFixtures","footyStatsFormattedDate","current","todaysDate","dateSS","getPrefix","position","teamPositionPrefix","updateResults","method","headers","Accept","JSON","stringify","height","fill","url","formUrl","formArray","leaguesStored","storedForm","isFormStored","isStoredLocally","orderedLeagues","leaguePositions","allLeagueResults","leagues","allGames","sofaScore","events","time","startTimestamp","homeScore","display","awayScore","startDate","getTime","targetDate","orderedLeague","gamesFiltered","gamesShortened","pager","current_page","max_page","page2","page2Data","gamesConcat","gamesConcatFiltered","mostRecentResults","shortenedResults","pre_match_teamA_overall_ppg","pre_match_teamB_overall_ppg","leagueObj","homeLeague","awayLeague","all_matches_table_home","all_matches_table_away","regularSeason","season","string","stringHome","stringAway","rawPosition","homeFormName","awayFormName","homeSeasonWinPercentage","seasonWins","awaySeasonWinPercentage","homeSeasonLossPercentage","seasonLosses_home","awaySeasonLossPercentage","seasonLosses_away","homeSeasonDrawPercentage","seasonDraws","awaySeasonDrawPercentage","homeSeasonMatchesPlayed","awaySeasonMatchesPlayed","played","competition_id","unixTimestamp","dateObject","previousLeagueName","leagueName","toLocaleString","hour","minute","odds_ft_x","odds_doublechance_1x","awayDoubleChance","odds_doublechance_x2","odds_btts_yes","homeID","awayID","homeTeamInfo","awayTeamInfo","homeTeaminLeague","awayTeaminLeague","teamPositionHome","teamPositionHomeTable","teamPositionAwayTable","homeTeamWinPercentageHome","awayTeamWinPercentageAway","homeTeamLossPercentageHome","awayTeamLossPercentageAway","homeTeamDrawPercentageHome","awayTeamDrawPercentageAway","teamPositionAway","homePrefix","homePrefixHomeTable","awayPrefix","awayPrefixAwayTable","homeSeasonPPG","awaySeasonPPG","homeTeaminHomeLeague","awayTeaminAwayLeague","homeFormString5","additional_info","formRun_overall","awayFormString5","homeFormString6","awayFormString6","homeFormString10","awayFormString10","homeFormRun","formRun_home","awayFormRun","formRun_away","season_format","xg_for_avg_overall","xg_for_avg_home","seasonScoredNum_overall","seasonScoredAVG_home","seasonMatchesPlayed_home","seasonMatchesPlayed_away","seasonConcededNum_overall","seasonConcededAVG_home","xg_against_avg_overall","XGAgainstAverage","xg_against_avg_home","seasonCSPercentage_overall","possessionAVG_overall","AveragePossession","possessionAVG_home","shotsOnTargetAVG_overall","shotsOnTargetAVG_home","dangerous_attacks_avg_overall","PPG","seasonPPG_overall","attacks_avg_home","AttacksAway","attacks_avg_away","AverageDangerousAttacks","dangerous_attacks_avg_home","homeAttackAdvantage","homeDefenceAdvantage","BTTSPercentage","seasonBTTSPercentage_home","LeagueOrAll","LeaguePosition","LeagueAverageGoals","LeagueAverageConceded","shotsAVG_overall","shotsAVG_home","seasonGoalDifference_overall","seasonGoalDifference_home","seasonBTTSPercentage_overall","cardsTotal_overall","scoredBothHalvesPercentage_overall","AverageShotsHomeOrAway","lastThreeForm","LastSixForm","LastTenForm","SeasonPPG","WinPercentage","LossPercentage","DrawPercentage","BttsPercentage","BttsPercentageHomeOrAway","ScoredBothHalvesPercentage","LastMatch","WDLRecord","xg_for_avg_away","seasonScoredAVG_away","seasonConcededAVG_away","xg_against_avg_away","possessionAVG_away","shotsOnTargetAVG_away","dangerous_attacks_avg_away","seasonBTTSPercentage_away","shotsAVG_away","seasonGoalDifference_away","teamIDHome","teamIDAway","leagueId","homeBadge","home_image","awayBadge","away_image","homePpg","home_ppg","awayPpg","away_ppg","homeTeamHomePosition","awayTeamAwayPosition","odds_ft_over25","btts_potential","stadium","stadium_name","expectedGoalsHomeToDate","team_a_xg_prematch","expectedGoalsAwayToDate","team_b_xg_prematch","setTimeout","HeadToHead","homeWins","awayWins","draws","averageGoals","bestHomeOdds","bestAwayOdds","lastGameStadiumName","lastGameDate","lastGameHomeTeam","lastGameHomeGoals","lastGameAwayGoals","lastGameAwayTeam","secondToLastGameStadiumName","secondToLastGameDate","secondToLastGameHomeTeam","secondToLastGameHomeGoals","secondToLastGameAwayGoals","secondToLastGameAwayTeam","lineHeight","CustomizedTables","align","o05Stat","o05Odds","u05Odds","o15Stat","o15Odds","u15Odds","o25Stat","o25Odds","u25Odds","o35Stat","o35Odds","u35Odds","getTeamStats","identifier","getBTTSPercentage","getFairOdds","impliedProbability","impliedProbabilityDivided","homeToal","awayTotal","fixtureHistory","matchArr","h2h","previous_matches_ids","oddsComparisonHomeArray","oddsComparisonAwayArray","odds_comparison","sortedHomeOdds","Object","entries","sortedAwayOdds","bestHomeOddsProvider","bestAwayOddsProvider","previous_matches_results","totalMatches","lastMatch","secondMatchExists","secondToLastMatch","previousMatch","previousMatchDetails","getDate","getMonth","getFullYear","secondToPreviousMatch","secondToPreviousMatchDetails","dateObject2","date2","betting_stats","bttsPercentage","BTTSForecast","fairOddsBTTSYes","fairOddsBTTSNo","team_a_wins","team_b_wins","draw","avg_goals","isNaN","over05Percentage","over15Percentage","o15Forecast","o15_potential","odds_ft_over05","odds_ft_under05","odds_ft_over15","odds_ft_under15","over25Percentage","o25Forecast","o25_potential","odds_ft_under25","over35Percentage","o35Forecast","o35_potential","odds_ft_over35","odds_ft_under35","BTTSStat","BTTSOdds","BTTSOddsNo","odds_btts_no","CornersStat","CornersForecast","corners_potential","CornersOdds","odds_corners_over_105","getOverOrUnderText","xgSum","overUnderAchievingSum","getXGDifferential","xgFor","xgAgainst","xgDiff","goalDiff","compareXgAndGoalDiff","getAttackingSummary","goalsRecent","goalsLongTerm","getDefenceSummary","cleansheetStat","lastx","ten","five","xgText","attackString","defenceString","pointsAverageTotal","GenerateFormSummary","Chart","data1","options","responsive","aspectRatio","maintainAspectRatio","layout","elements","point","radius","scales","suggestedMin","suggestedMax","grid","borderWidth","borderColor","ticks","font","size","plugins","legend","labels","boxHeight","keys","datasets","label","team1","tension","team2","data2","RadarChart","angleLines","pointBackgroundColor","pointBorderColor","pointHoverBackgroundColor","pointHoverBorderColor","BarChart","datasetOne","idx","numOne","numTwo","tempArr","firstNum","secondNum","findLargestNum","indexAxis","bar","tooltip","enabled","context","dataIndex","dataset","ChartJS","register","CategoryScale","LinearScale","RadialLinearScale","PointElement","ArcElement","Filler","BarElement","LineElement","Title","Tooltip","Legend","SofaLineupsWidget","differenceInSeconds","minutes","iframeSrc","currentTime","maxWidth","border","scrolling","frameborder","metric","ranges","normalizedValue","normValue","val","metricName","metricValue","averagePossession","accuracyOverall","Error","weightedScore","rollingGoalDiffTotalHome","rollingGoalDiffTotalAway","displayBool","testBool","styling","alert","getPointsFromGames","formArr","pairings","W","D","L","arrayOfIndividualPoints","getLastGameResult","homeXG","awayXG","homeShots","awayShots","homeSot","awaySot","homeDangerousAttacks","awayDangerousAttacks","homePossession","awayPossession","homeRed","awayRed","homePPG","awayPPG","singleSimilarResult","StatsHome","gameCount","formDataHome","Last5","gameArrayHomeTeamHomeGames","homeTenGameAverage","homeSixGameAverage","homeFiveGameAverage","homeLastGame","FormTextStringHome","StatsAway","formDataAway","gameArrayAwayTeamAwayGames","awayTenGameAverage","awaySixGameAverage","awayFiveGameAverage","awayLastGame","FormTextStringAway","getGameIdByHomeTeam","homeTeamName","matchingGames","includes","gameStats","gameArrayHome","gameArrayAway","goalDiffHomeMovingAv","goalDiffAwayMovingAv","getEMA","p","pos","resultHome","resultHomeOnly","timeZone","won","goalsScored","goalsConceeded","wonHomeOrAwayOnly","goalDiffArrayHome","cumulativeSumHome","resultAway","resultAwayOnly","wonAwayOrAwayOnly","goalDiffArrayAway","cumulativeSumAway","bttsArrayHome","bttsArrayAway","homeFormTrend","awayFormTrend","formTextStringHome","formTextStringAway","favouriteRecordHome","favouriteRecordAway","homeAttackStrength","homeAttackStrengthLast5","homeOnlyAttackStrength","homeDefenceStrength","homeDefenceStrengthLast5","homeOnlyDefenceStrength","homePossessionStrength","homePossessionStrengthLast5","homeOnlyPossessionStrength","homeXGForStrength","homeXGForStrengthLast5","homeOnlyXGForStrength","homeXGAgainstStrength","homeXGAgainstStrengthLast5","homeOnlyXGAgainstStrength","homeDirectnessStrength","homeDirectnessStrengthLast5","homeOnlyDirectnessStrength","homeAccuracyOverallStrength","homeAccuracyOverallStrengthLast5","homeOnlyAccuracyOverallStrength","awayAttackStrength","awayAttackStrengthLast5","awayOnlyAttackStrength","awayDefenceStrength","awayDefenceStrengthLast5","awayOnlyDefenceStrength","awayPossessionStrength","awayPossessionStrengthLast5","awayOnlyPossessionStrength","awayXGForStrength","awayXGForStrengthLast5","awayOnlyXGForStrength","awayXGAgainstStrength","awayXGAgainstStrengthLast5","awayOnlyXGAgainstStrength","awayDirectnessStrength","awayDirectnessStrengthLast5","awayOnlyDirectnessStrength","awayAccuracyOverallStrength","awayAccuracyOverallStrengthLast5","awayOnlyAccuracyOverallStrength","formPointsHome","formPointsAway","AverageGoals","AverageConceeded","AverageXG","AverageXGConceded","Last5PPG","formArrayHome","formArrayAway","chartType","overviewHome","overviewAway","similarGamesHome","similarGamesAway","matchingGame","toString","resultValue","count","mockValue","initialState","dataHome","localStorage","getItem","dataAway","dataHomeDef","dataAwayDef","homeDetails","awayDetails","fixtureDetails","dataSlice","createSlice","reducers","setData","action","payload","actions","store","configureStore","reducer","dataReducer","GetDivider","matchStatus","isPrediction","renderLeagueName","renderTable","SingleFixture","dispatch","useDispatch","StoreData","homeTeamBadge","awayTeamName","awayTeamBadge","setItem","key1","key2","open","createStatsDiv","onMouseDown","handleButtonClick","List","today","todayFootyStats","todaySS","tomorrow","tomorrowFootyStats","tomorrowSS","dateFootyStats","lastSaturday","lastSaturdayFootyStats","lastSaturdaySS","tomorrowsDate","yesterdaysDate","saturdayDate","historicDate","dateString","fixtureList","availableLeagues","leagueOrder","decrementDate","calculateDate","convertTimestampForSofaScore","renderButtons","String","padStart","setDate","getDay","textJoined","newText","leagueList","mapOrder","key","A","B","welcomeTextOne","welcomeTextTwo","App","getLeagueList","href","target","rel","mockedFixtures","TwitterShareButton","boxShadow","TwitterIcon","RedditShareButton","RedditIcon","FacebookShareButton","quote","FacebookIcon","WhatsappShareButton","separator","WhatsappIcon","TelegramShareButton","TelegramIcon","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","TeamPage","dataState","fetchData","storedFixtureDetailsJson","responseHome","responseAway","indexHome","findIndex","indexAway","test","scoredOverallHome","playedHomeOnly","scoredOverallHomeOnly","seasonScoredNum_home","conceededOverallHome","conceededOverallHomeOnly","seasonConcededNum_home","PPGOverallHome","PPGOverallHomeOnly","seasonPPG_home","leaguePosition_overallHome","leaguePosition_overall","leaguePosition_HomeOnly","leaguePosition_home","averageAttendance","average_attendance_home","BTTSPercentage_overallHome","BTTSAndWinPercentage_Home","BTTS_and_win_percentage_overall","BTTSAndLosePercentage_Home","BTTS_and_lose_percentage_overall","BTTSBothHalvesHome","BTTS_both_halves_percentage_overall","GoalDifferenceHT_overall_Home","GoalDifferenceHT_overall","GD_2hg_overall_Home","gd_2hg_overall","leadingAtHTPercentage_overallHome","leadingAtHTPercentage_overall","seasonOver15Percentage_overallHome","seasonOver25Percentage_overallHome","seasonOver35Percentage_overallHome","seasonOver45Percentage_overallHome","scoredBothHalvesPercentage_overallHome","shots_on_target_per_goals_scored_overallHome","shots_on_target_per_goals_scored_overall","cornersTotalAVG_overallHome","cornersTotalAVG_overall","cardsAVG_overallHome","foulsAVG_overallHome","foulsAVG_overall","penalties_won_per_match_overallHome","penalties_won_per_match_overall","penalty_in_a_match_percentage_overallHome","penalty_in_a_match_percentage_overall","scoredOverallAway","playedAwayOnly","scoredOverallAwayOnly","seasonScoredNum_away","conceededOverallAway","conceededOverallAwayOnly","seasonConcededNum_away","PPGOverallAway","PPGOverallAwayOnly","seasonPPG_away","leaguePosition_overallAway","leaguePosition_AwayOnly","leaguePosition_away","BTTSPercentage_overallAway","BTTSAndWinPercentage_Away","BTTSAndLosePercentage_Away","BTTSBothHalvesAway","GoalDifferenceHT_overall_Away","GD_2hg_overall_Away","leadingAtHTPercentage_overallAway","seasonOver15Percentage_overallAway","seasonOver25Percentage_overallAway","seasonOver35Percentage_overallAway","seasonOver45Percentage_overallAway","scoredBothHalvesPercentage_overallAway","shots_on_target_per_goals_scored_overallAway","cornersTotalAVG_overallAway","cardsAVG_overallAway","foulsAVG_overallAway","penalties_won_per_match_overallAway","penalty_in_a_match_percentage_overallAway","storedDataHome","useSelector","jsonDataHome","parse","propertyNamesHome","storedDataHomeDef","jsonDataHomeDef","propertyNamesHomeDef","storedDataallTeamResultsHome","jsonDataallTeamResultsHome","propertyNamesallTeamResultsHome","values","jsonHomeDetails","storedDataAway","jsonDataAway","propertyNamesAway","storedDataAwayDef","jsonDataAwayDef","propertyNamesAwayDef","storedDataallTeamResultsAway","jsonDataallTeamResultsAway","propertyNamesallTeamResultsAway","jsonAwayDetails","storedFixtureDetails","stacked","path","Team","exact"],"mappings":"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","file":"static/js/main.ca0963dc.chunk.js","sourcesContent":["import React from \"react\";\n\nfunction Header() {\n return (\n

    XG Tipping

    \n );\n}\n\nexport default Header;\n","import React from \"react\";\n\nexport function Button(props) {\n return (\n
    \n \n
    \n );\n}\n","import React, { Component } from \"react\";\nexport var selectedOdds = \"Fractional odds\";\n\nexport class OddsRadio extends Component {\n constructor(props) {\n super(props);\n this.state = {\n selectedOdds: this.props.value,\n };\n }\n\n handleOptionChange = () => {\n this.setState({\n selectedOdds: this.props.value,\n });\n selectedOdds = this.state.selectedOdds;\n };\n\n render() {\n return (\n
    \n
    \n \n
    \n
    \n );\n }\n}\n\nexport default OddsRadio;\n","import React from \"react\";\n\nexport function CreateBadge(props) {\n\n if(props.image === \"-\"){\n return (\n
    \n );\n } else {\n return (\n \n );\n }\n}\n","import React, { Fragment } from \"react\";\n\nfunction Stats(props) {\n let shouldOpen = props.clicked\n function styleForm(formIndicator) {\n let className;\n if (formIndicator === \"W\") {\n className = \"win\";\n } else if (formIndicator === \"D\") {\n className = \"draw\";\n } else if (formIndicator === \"L\") {\n className = \"loss\";\n }\n return className;\n }\n\n function styleBTTS(BTTSBoolean) {\n let className;\n if (BTTSBoolean === \"\\u2714\") {\n className = \"BTTSTrue\";\n } else if (BTTSBoolean === \"\\u2718\") {\n className = \"BTTSFalse\";\n }\n return className;\n }\n\n if (props.formRun) {\n console.log(props.formRun)\n return (\n \n
      \n
    • {props.FormTextString}
    • \n
    • {props.FavouriteRecord}
    • \n
    • \n League results (most recent on right)\n
    • \n
    • \n \n {props.Results[0]}\n \n \n {props.Results[1]}\n \n \n {props.Results[2]}\n \n \n {props.Results[3]}\n \n \n {props.Results[4]}\n \n \n {props.Results[5]}\n \n
    • \n
    • \n {props.homeOrAway} form (most recent on right)\n
    • \n
    • \n \n {props.ResultsHorA[0]}\n \n \n {props.ResultsHorA[1]}\n \n \n {props.ResultsHorA[2]}\n \n \n {props.ResultsHorA[3]}\n \n \n {props.ResultsHorA[4]}\n \n \n {props.ResultsHorA[5]}\n \n
    • \n \n
      BTTS
      \n {props.BTTSArray[5]}\n {props.BTTSArray[4]}\n {props.BTTSArray[3]}\n {props.BTTSArray[2]}\n {props.BTTSArray[1]}\n {props.BTTSArray[0]}\n \n \n {`Avg goals scored - ${props.goals}`}\n \n \n {`Avg goals conceeded - ${props.conceeded}`}\n \n \n {`Avg possession - ${props.possession}%`}\n \n
    • \n {`Avg XG - ${props.XG}`}\n
    • \n \n {`Avg XG conceded - ${props.XGConceded}`}\n \n \n {`Goal difference : `}\n {props.goalDifference}\n \n \n {`Goal difference ${props.homeOrAway} : ${props.goalDifferenceHomeOrAway}`}\n \n \n {`Avg shots on target - ${props.sot}`}\n \n \n {`Avg dangerous attacks - ${props.dangerousAttacks}`}\n \n \n {`League position - ${props.leaguePosition}`}\n \n\n \n {`Position (${props.homeOrAway} only) - ${props.homeOrAwayLeaguePosition}`}\n \n \n {`${props.homeOrAway} wins - ${props.winPercentage.toFixed(1)}%`}\n \n \n {`${props.homeOrAway} draws - ${props.drawPercentage.toFixed(1)}%`}\n \n \n {`${props.homeOrAway} losses - ${props.lossPercentage.toFixed(1)}%`}\n \n
    • \n {`Season PPG - ${props.ppg}`}\n
    • \n \n {`Last 10 PPG: ${props.formTrend[0]}`}\n \n \n {`Last 6 PPG: ${props.formTrend[1]}`}\n \n \n {`Last 5 PPG: ${props.formTrend[2]}.`}\n \n \n {`Cards total: ${props.CardsTotal}`}\n \n \n {`Corners average: ${props.CornersAverage}`}\n \n
    \n
    \n
    \n );\n } else {\n return (\n \n
      \n
    • {props.FormTextString}
    • \n
    • {props.FavouriteRecord}
    • \n \n {`Avg goals scored - ${props.goals}`}\n \n \n {`Avg goals conceeded - ${props.conceeded}`}\n \n \n {`Avg possession - ${props.possession}%`}\n \n
    • \n {`Avg XG - ${props.XG}`}\n
    • \n \n {`Avg XG conceded - ${props.XGConceded}`}\n \n \n {`Avg shots on target - ${props.sot}`}\n \n \n {`Avg dangerous attacks - ${props.dangerousAttacks}`}\n \n \n {`League position - ${props.leaguePosition}`}\n \n\n \n {`Position (${props.homeOrAway} only) - ${props.homeOrAwayLeaguePosition}`}\n \n \n {`${props.homeOrAway} wins - ${props.winPercentage.toFixed(1)}%`}\n \n \n {`${props.homeOrAway} draws - ${props.drawPercentage.toFixed(1)}%`}\n \n \n {`${props.homeOrAway} losses - ${props.lossPercentage.toFixed(1)}%`}\n \n
    • \n {`Season PPG - ${props.ppg}`}\n
    • \n \n {`Last 10 PPG: ${props.formTrend[0]}`}\n \n \n {`Last 6 PPG: ${props.formTrend[1]}`}\n \n \n {`Last 5 PPG: ${props.formTrend[2]}.`}\n \n \n {`Cards total: ${props.CardsTotal}`}\n \n \n {`Corners average: ${props.CornersAverage}`}\n \n
    \n
    \n
    \n );\n }\n}\n\nexport default Stats;\n","import React from \"react\";\n\nfunction Div(props) {\n return (\n
    {props.text}
    \n );\n}\n\nexport default Div;\n","export async function getForm(match) {\n const teams = [match.homeId, match.awayId];\n const fixtureForm = [];\n\n for (let i = 0; i < teams.length; i++) {\n const team = teams[i];\n\n let response = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}formTeam/${team}`\n );\n await response.json().then((formData) => {\n formData.lastMatchTimestamp = formData.last_updated_match_timestamp\n fixtureForm[i] = formData;\n });\n }\n return fixtureForm;\n}\n","import React, { useState, useEffect } from \"react\";\nimport Slider from \"@mui/material/Slider\";\nimport { selectedOdds } from \"../components/OddsRadio\";\nimport oddslib from \"oddslib\";\nexport let rangeValue = [1, 10];\n\nexport const Slide = (props) => {\n const [range, setRange] = useState([1.1, 10]);\n const [fractionalValue, setFractionalValue] = useState([\"1/9\", \"10/1\"]);\n\n useEffect(() => {\n if (selectedOdds === \"Fractional odds\") {\n let roundedValueOne = (Math.round(range[0] * 5) / 5).toFixed(1);\n let roundedValueTwo = (Math.round(range[1] * 5) / 5).toFixed(1);\n\n try {\n const fractionalOne = oddslib\n .from(\"decimal\", roundedValueOne)\n .to(\"fractional\", { precision: 1 });\n const fractionalTwo = oddslib\n .from(\"decimal\", roundedValueTwo)\n .to(\"fractional\", { precision: 1 });\n console.log(fractionalOne);\n console.log(fractionalTwo);\n setFractionalValue([fractionalOne, fractionalTwo]);\n } catch (error) {\n console.log(error);\n }\n }\n }, [range]);\n\n const handleChange = (event, newValue) => {\n setRange(newValue);\n console.log(newValue);\n rangeValue = newValue;\n };\n\n return (\n \n selectedOdds === \"Fractional odds\" ? fractionalValue[index] : value\n }\n />\n );\n};\n","import React from \"react\";\nimport Collapsible from \"react-collapsible\";\n\nconst Collapsable = (props) => {\n return (\n {props.buttonText}} className={props.className? props.className: \"Collapsable\"}>\n
    \n {props.element}\n {props.elementTwo}\n
    \n
    \n );\n};\n\n\nexport default Collapsable;","import React, { Component, Fragment } from \"react\";\nimport { getNewTips } from \"../logic/getScorePredictions\"\nimport {allTips} from \"../logic/getScorePredictions\"\nexport var incrementValue = 3;\n\nexport var riskLevel = 10;\n\nclass Increment extends Component {\n constructor(props) {\n super(props);\n this.state = {\n incrementValue,\n riskLevel,\n show: true,\n };\n }\n\n IncrementItem = () => {\n if(incrementValue > 1){\n this.setState({ incrementValue: this.state.incrementValue - 1 });\n this.setState({ riskLevel: this.state.riskLevel - 1 });\n incrementValue = (this.state.incrementValue - 1);\n riskLevel = this.state.riskLevel - 1;\n }\n getNewTips(allTips)\n };\n DecreaseItem = () => {\n if(incrementValue > 0){\n this.setState({ incrementValue: this.state.incrementValue + 1 });\n this.setState({ riskLevel: this.state.riskLevel + 1 });\n incrementValue = (this.state.incrementValue + 1);\n riskLevel = this.state.riskLevel + 1;\n }\n getNewTips(allTips)\n };\n\n render() {\n return (\n \n \n \n \n\n );\n }\n}\n\nexport default Increment;\n","export async function getBTTSPotential(\n match,\n homeGoals,\n awayGoals,\n unroundedHomeGoals,\n unroundedAwayGoals\n) {\n const homeBTTS = match.bttsAllPercentageHome;\n const homeOnlyBTTS = match.bttsPercentageHomeHome;\n const awayOnlyBTTS = match.bttsPercentageAwayAway;\n const awayBTTS = match.bttsAllPercentageAway;\n const homeG = homeGoals;\n const awayG = awayGoals;\n\n match.combinedBTTS = (homeBTTS + awayBTTS) / 2;\n\n if (\n match.bttsFraction !== \"N/A\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n if (\n homeBTTS > 55 &&\n awayBTTS > 55 &&\n homeOnlyBTTS > 55 &&\n awayOnlyBTTS > 55 &&\n match.awayOdds < 4 &&\n match.awayOdds > 1.3 &&\n homeG >= 1 &&\n awayG >= 1 \n ) {\n match.btts = true;\n match.bttsChosen = true;\n match.totalGoals = match.rawFinalHomeGoals + match.rawFinalAwayGoals;\n } else {\n match.btts = false;\n match.bttsChosen = false;\n }\n }\n return match;\n}\n","import SwiperCore, { EffectCoverflow, Pagination } from \"swiper\";\nimport { Swiper, SwiperSlide } from \"swiper/react\";\nimport \"swiper/swiper-bundle.min.css\";\nimport \"swiper/swiper.min.css\";\n\nSwiperCore.use([EffectCoverflow, Pagination]);\n\nexport const Slider = (props) => {\n return (\n \n \n {props.element}\n \n \n {props.element2}\n \n \n {props.element3}\n \n \n {props.element4}\n \n \n {props.element5}\n \n \n );\n};\n","import KofiButton from \"kofi-button\"\n\nexport const StyledKofiButton = (props) => {\n return (\n \n )\n}","import React, { useState } from \"react\";\nimport Slider from \"@mui/material/Slider\";\nexport let minimumXG = 0;\nexport let minimumGD = 0;\nexport let minimumGDHorA = 0;\nexport let minimumLast10 = 0;\n\nfunction SlideDiff(props) {\n const [value, setValue] = useState(0);\n\n const handleChange = (event, newValue) => {\n setValue(newValue);\n\n switch (true) {\n case props.useCase === \"xg\":\n minimumXG = newValue;\n break;\n case props.useCase === \"gd\":\n minimumGD = newValue;\n break;\n case props.useCase === \"gdHorA\":\n minimumGDHorA = newValue;\n break;\n case props.useCase === \"last10\":\n minimumLast10 = newValue;\n break;\n\n default:\n break;\n }\n };\n\n return (\n \n );\n}\n\nexport default SlideDiff;\n","import React, { Fragment } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { matches, diff } from \"./getFixtures\";\nimport { RenderAllFixtures } from \"../logic/getFixtures\";\nimport Div from \"../components/Div\";\nimport Collapsable from \"../components/CollapsableElement\";\nimport { allForm } from \"../logic/getFixtures\";\nimport Increment from \"../components/Increment\";\nimport { incrementValue } from \"../components/Increment\";\nimport { getBTTSPotential } from \"../logic/getBTTSPotential\";\nimport { allLeagueResultsArrayOfObjects } from \"../logic/getFixtures\";\nimport { Slider } from \"../components/Carousel\";\nimport { StyledKofiButton } from \"../components/KofiButton\";\nimport {\n calculateAttackingStrength,\n calculateDefensiveStrength,\n calculateMetricStrength,\n getXGtoActualDifferentialStrength,\n} from \"./getStats\";\nimport { rangeValue } from \"../components/Slider\";\nimport {\n minimumGD,\n minimumXG,\n minimumLast10,\n minimumGDHorA,\n} from \"../components/SliderDiff\";\n\nvar myHeaders = new Headers();\nmyHeaders.append(\"Origin\", \"https://gregdorward.github.io\");\n\nlet finalHomeGoals;\nlet finalAwayGoals;\nlet rawFinalHomeGoals;\nlet rawFinalAwayGoals;\nlet homeOdds;\nlet awayOdds;\nlet totalGoals = 0;\nlet totalGoals2 = 0;\nlet numberOfGames = 0;\nlet drawPredictions = 0;\nlet homePredictions = 0;\nlet awayPredictions = 0;\nlet allOutcomes = 0;\nlet homeOutcomes = 0;\nlet awayOutcomes = 0;\nlet winAmount = 0;\nlet lossAmount = 0;\nlet sumStatDAWin = 0;\nlet sumStatDALoss = 0;\nlet sumStatPossessionWin = 0;\nlet sumStatPossessionLoss = 0;\nlet sumStatSOTWin = 0;\nlet sumStatSOTLoss = 0;\nlet sumStatPPGLast10Win = 0;\nlet sumStatPPGLast10Loss = 0;\nlet sumOddsWin = 0;\nlet sumOddsLoss = 0;\nlet sumXGForWin = 0;\nlet sumXGForLoss = 0;\nlet sumXGAgainstWin = 0;\nlet sumXGAgainstLoss = 0;\nlet allWinOutcomes = 0;\nlet allLossOutcomes = 0;\nlet allDrawOutcomes = 0;\nlet totalROI = 0;\nlet totalInvestment = 0;\nlet totalProfit = 0;\nexport let formObjectHome;\nexport let formObjectAway;\nexport let clicked = false;\n\nexport var renderPredictions;\n\nasync function convertTimestamp(timestamp) {\n let newDate = new Date(timestamp * 1000);\n let [day, month, year] = newDate.toLocaleDateString(\"en-US\").split(\"/\");\n\n let converted = `${year}-${day}-${month}`;\n\n return converted;\n}\n\nexport function getPointsFromLastX(lastX) {\n let points = 0;\n let pointsAddition;\n\n try {\n lastX.forEach((game) => {\n switch (true) {\n case game === \"W\":\n pointsAddition = 3;\n break;\n case game === \"D\":\n pointsAddition = 1;\n break;\n case game === \"L\":\n pointsAddition = 0;\n break;\n default:\n break;\n }\n\n points = points + pointsAddition;\n });\n return points;\n } catch (error) {\n console.log(error);\n return \"N/A\";\n }\n}\n\nasync function getPastLeagueResults(team, game, hOrA, form) {\n form.completeData = true\n let date = game.date;\n if (allLeagueResultsArrayOfObjects[game.leagueIndex].fixtures.length > 10) {\n let teamsHomeResults = allLeagueResultsArrayOfObjects[\n game.leagueIndex\n ].fixtures.filter((fixture) => fixture.home_name === team);\n\n teamsHomeResults = teamsHomeResults\n .filter(function (item) {\n return item.date_unix < date;\n })\n .sort((a, b) => a.date_unix - b.date_unix);\n\n let teamsAwayResults = allLeagueResultsArrayOfObjects[\n game.leagueIndex\n ].fixtures.filter((fixture) => fixture.away_name === team);\n\n teamsAwayResults = teamsAwayResults\n .filter(function (item) {\n return item.date_unix < date;\n })\n .sort((a, b) => a.date_unix - b.date_unix);\n\n let homeResults = [];\n let awayResults = [];\n let oddsSumHome = 0;\n let oddsSumAway = 0;\n let favouriteCount = 0;\n let underdogCount = 0;\n let winningFavouriteCount = 0;\n let drawingFavouriteCount = 0;\n let beatenFavouriteCount = 0;\n let winningUnderdogCount = 0;\n let drawingUnderdogCount = 0;\n let beatenUnderdogCount = 0;\n for (let index = 0; index < teamsHomeResults.length; index++) {\n const resultedGame = teamsHomeResults[index];\n\n homeResults.push({\n homeTeam: resultedGame.home_name,\n homeGoals: resultedGame.homeGoalCount,\n XG: resultedGame.team_a_xg,\n awayTeam: resultedGame.away_name,\n awayGoals: resultedGame.awayGoalCount,\n XGAgainst: resultedGame.team_b_xg,\n possession: resultedGame.team_a_possession,\n scored: resultedGame.homeGoalCount,\n conceeded: resultedGame.awayGoalCount,\n shots: resultedGame.team_a_shots,\n sot: resultedGame.team_a_shotsOnTarget,\n sotAgainst: resultedGame.team_b_shotsOnTarget,\n dangerousAttacks: resultedGame.team_a_dangerous_attacks,\n corners: resultedGame.team_a_corners,\n date: await convertTimestamp(resultedGame.date_unix),\n dateRaw: resultedGame.date_unix,\n oddsHome: resultedGame.odds_ft_1,\n oddsAway: resultedGame.odds_ft_2,\n btts:\n resultedGame.homeGoalCount > 0 && resultedGame.awayGoalCount > 0\n ? true\n : false,\n points:\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? 3\n : resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? 0\n : 1,\n result:\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? \"W\"\n : resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? \"L\"\n : \"D\",\n });\n oddsSumHome = oddsSumHome + resultedGame.odds_ft_1;\n favouriteCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2\n ? favouriteCount + 1\n : favouriteCount + 0;\n winningFavouriteCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? winningFavouriteCount + 1\n : winningFavouriteCount + 0;\n drawingFavouriteCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount === resultedGame.awayGoalCount\n ? drawingFavouriteCount + 1\n : drawingFavouriteCount + 0;\n beatenFavouriteCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? beatenFavouriteCount + 1\n : beatenFavouriteCount + 0;\n\n underdogCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2\n ? underdogCount + 1\n : underdogCount + 0;\n winningUnderdogCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? winningUnderdogCount + 1\n : winningUnderdogCount + 0;\n drawingUnderdogCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount === resultedGame.awayGoalCount\n ? drawingUnderdogCount + 1\n : drawingUnderdogCount + 0;\n beatenUnderdogCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? beatenUnderdogCount + 1\n : beatenUnderdogCount + 0;\n }\n for (let index = 0; index < teamsAwayResults.length; index++) {\n const resultedGame = teamsAwayResults[index];\n awayResults.push({\n homeTeam: resultedGame.home_name,\n homeGoals: resultedGame.homeGoalCount,\n XG: resultedGame.team_b_xg,\n awayTeam: resultedGame.away_name,\n awayGoals: resultedGame.awayGoalCount,\n XGAgainst: resultedGame.team_a_xg,\n possession: resultedGame.team_b_possession,\n scored: resultedGame.awayGoalCount,\n conceeded: resultedGame.homeGoalCount,\n shots: resultedGame.team_b_shots,\n sot: resultedGame.team_b_shotsOnTarget,\n sotAgainst: resultedGame.team_a_shotsOnTarget,\n dangerousAttacks: resultedGame.team_b_dangerous_attacks,\n corners: resultedGame.team_b_corners,\n date: await convertTimestamp(resultedGame.date_unix),\n dateRaw: resultedGame.date_unix,\n oddsHome: resultedGame.odds_ft_1,\n oddsAway: resultedGame.odds_ft_2,\n btts:\n resultedGame.homeGoalCount > 0 && resultedGame.awayGoalCount > 0\n ? true\n : false,\n points:\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? 0\n : resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? 3\n : 1,\n result:\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? \"L\"\n : resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? \"W\"\n : \"D\",\n });\n oddsSumAway = oddsSumAway + resultedGame.odds_ft_2;\n favouriteCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2\n ? favouriteCount + 1\n : favouriteCount + 0;\n winningFavouriteCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? winningFavouriteCount + 1\n : winningFavouriteCount + 0;\n drawingFavouriteCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount === resultedGame.awayGoalCount\n ? drawingFavouriteCount + 1\n : drawingFavouriteCount + 0;\n beatenFavouriteCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? beatenFavouriteCount + 1\n : beatenFavouriteCount + 0;\n\n underdogCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2\n ? underdogCount + 1\n : underdogCount + 0;\n winningUnderdogCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? winningUnderdogCount + 1\n : winningUnderdogCount + 0;\n drawingUnderdogCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount === resultedGame.awayGoalCount\n ? drawingUnderdogCount + 1\n : drawingUnderdogCount + 0;\n beatenUnderdogCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? beatenUnderdogCount + 1\n : beatenUnderdogCount + 0;\n }\n\n let reversedResultsHome = homeResults;\n let reversedResultsAway = awayResults;\n\n console.log(game.homeTeam)\n console.log(team)\n\n if (game.homeTeam === team) {\n let y = game.homeOdds;\n //Clear fav\n if (y <= 1.5) {\n const allClearFavouriteResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 1.45\n );\n const allClearFavouriteResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 1.45\n );\n\n form.simlarGameResultsHome = allClearFavouriteResultsHome\n .concat(allClearFavouriteResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //fav\n else if (y <= 2.1) {\n const allSlightFavouriteResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 2.1 && fixture.oddsHome > 1.45\n );\n const allSlightFavouriteResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 2.1 && fixture.oddsAway > 1.45\n );\n game.simlarGameResultsHome = allSlightFavouriteResultsHome\n .concat(allSlightFavouriteResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //Tossup\n else if (y <= 2.75) {\n const allTossupResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 2.75 && fixture.oddsHome > 2.1\n );\n const allTossupResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 2.75 && fixture.oddsAway > 2.1\n );\n game.simlarGameResultsHome = allTossupResultsHome\n .concat(allTossupResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //Underdog\n else if (y <= 4) {\n const allUnderdogResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 4 && fixture.oddsHome > 2.75\n );\n const allUnderdogResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 4 && fixture.oddsAway > 2.75\n );\n game.simlarGameResultsHome = allUnderdogResultsHome\n .concat(allUnderdogResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //MassiveUnderdog\n else if (y > 4) {\n const allMassiveUnderdogResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome > 4\n );\n const allMassiveUnderdogResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway > 4\n );\n game.simlarGameResultsHome = allMassiveUnderdogResultsHome\n .concat(allMassiveUnderdogResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n } else if (game.awayTeam === team) {\n let z = game.awayOdds;\n //Clear fav\n if (z <= 1.5) {\n const allClearFavouriteResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 1.45\n );\n const allClearFavouriteResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 1.45\n );\n\n game.simlarGameResultsAway = allClearFavouriteResultsHome\n .concat(allClearFavouriteResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //fav\n else if (z <= 2.1) {\n const allSlightFavouriteResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 2.1 && fixture.oddsHome > 1.45\n );\n const allSlightFavouriteResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 2.1 && fixture.oddsAway > 1.45\n );\n game.simlarGameResultsAway = allSlightFavouriteResultsHome\n .concat(allSlightFavouriteResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //Tossup\n else if (z <= 2.75) {\n const allTossupResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 2.75 && fixture.oddsHome > 2.1\n );\n const allTossupResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 2.75 && fixture.oddsAway > 2.1\n );\n game.simlarGameResultsAway = allTossupResultsHome\n .concat(allTossupResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //Underdog\n else if (z <= 4) {\n const allUnderdogResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 4 && fixture.oddsHome > 2.75\n );\n const allUnderdogResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 4 && fixture.oddsAway > 2.75\n );\n game.simlarGameResultsAway = allUnderdogResultsHome\n .concat(allUnderdogResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //MassiveUnderdog\n else if (z > 4) {\n const allMassiveUnderdogResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome > 4.5\n );\n const allMassiveUnderdogResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway > 4.5\n );\n game.simlarGameResultsAway = allMassiveUnderdogResultsHome\n .concat(allMassiveUnderdogResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n }\n\n const allTeamResults = reversedResultsHome\n .concat(reversedResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n\n const allTeamResultsHome = reversedResultsHome.sort(\n (a, b) => b.dateRaw - a.dateRaw\n );\n const allTeamResultsAway = reversedResultsAway.sort(\n (a, b) => b.dateRaw - a.dateRaw\n );\n\n console.log(game.game);\n console.log(allTeamResults);\n console.log(allTeamResultsHome);\n\n form.allTeamResults = allTeamResults.sort((b, a) => a.dateRaw - b.dateRaw);\n\n const points6 = allTeamResults.map((res) => res.points).slice(0, 6);\n const pointsSum6 = points6.reduce((a, b) => a + b, 0);\n form.avPoints6 = pointsSum6 / points6.length;\n\n const points5 = allTeamResults.map((res) => res.points).slice(0, 5);\n const pointsSum5 = points5.reduce((a, b) => a + b, 0);\n form.avPoints5 = pointsSum5 / points5.length;\n\n const pointsAll = allTeamResults.map((res) => res.points);\n const pointsSumAll = pointsAll.reduce((a, b) => a + b, 0);\n form.avPointsAll = pointsSumAll / pointsAll.length;\n\n const resultsAll = allTeamResults.map((res) => res.result);\n const resultsHome = allTeamResultsHome.map((res) => res.result);\n const resultsAway = allTeamResultsAway.map((res) => res.result);\n\n form.resultsAll = resultsAll.slice(0, 6);\n form.resultsHome = resultsHome.slice(0, 6);\n form.resultsAway = resultsAway.slice(0, 6);\n\n const avScoredLast5 = allTeamResults.map((res) => res.scored).slice(0, 5);\n const avScoredLast5Sum = avScoredLast5.reduce((a, b) => a + b, 0);\n form.avScoredLast5 = avScoredLast5Sum / avScoredLast5.length;\n const avConceededLast5 = allTeamResults\n .map((res) => res.conceeded)\n .slice(0, 5);\n const avConceededLast5Sum = avConceededLast5.reduce((a, b) => a + b, 0);\n form.avConceededLast5 = avConceededLast5Sum / avConceededLast5.length;\n const avDALast5 = allTeamResults\n .map((res) => res.dangerousAttacks)\n .slice(0, 5);\n const avDALast5Sum = avDALast5.reduce((a, b) => a + b, 0);\n form.avDALast5 = avDALast5Sum / avDALast5.length;\n const avSOTLast5 = allTeamResults.map((res) => res.sot).slice(0, 5);\n const avSOTLast5Sum = avSOTLast5.reduce((a, b) => a + b, 0);\n form.avSOTLast5 = avSOTLast5Sum / avSOTLast5.length;\n const avSOTAgainstLast5 = allTeamResults\n .map((res) => res.sotAgainst)\n .slice(0, 5);\n const avSOTAgainstLast5Sum = avSOTAgainstLast5.reduce((a, b) => a + b, 0);\n form.avSOTAgainstLast5 = avSOTAgainstLast5Sum / avSOTAgainstLast5.length;\n const avShotsLast5 = allTeamResults.map((res) => res.shots).slice(0, 5);\n const avShotsLast5Sum = avShotsLast5.reduce((a, b) => a + b, 0);\n form.avShotsLast5 = avShotsLast5Sum / avShotsLast5.length;\n const avCornersLast5 = allTeamResults.map((res) => res.corners).slice(0, 5);\n const avCornersLast5Sum = avCornersLast5.reduce((a, b) => a + b, 0);\n form.avCornersLast5 = avCornersLast5Sum / avCornersLast5.length;\n const avPosessionLast5 = allTeamResults\n .map((res) => res.possession)\n .slice(0, 6);\n const avPosessionLast5Sum = avPosessionLast5.reduce((a, b) => a + b, 0);\n form.avPosessionLast5 = avPosessionLast5Sum / avPosessionLast5.length;\n const avXGLast5 = allTeamResults.map((res) => res.XG).slice(0, 5);\n const avXGLast5Sum = avXGLast5.reduce((a, b) => a + b, 0);\n form.avXGLast5 = avXGLast5Sum / avXGLast5.length;\n const avXGAgainstLast5 = allTeamResults\n .map((res) => res.XGAgainst)\n .slice(0, 5);\n\n // console.log(form.teamName);\n\n // console.log(\"avConceededLast5\")\n // console.log(avConceededLast5)\n // console.log(\"avSOTLast5\")\n // console.log(avSOTLast5)\n\n // console.log(\"avSOTAgainstLast5\")\n // console.log(avSOTAgainstLast5)\n\n // console.log(\"avShotsLast5\")\n // console.log(avShotsLast5)\n\n // console.log(\"avCornersLast5\")\n // console.log(avCornersLast5)\n\n // console.log(\"avPosessionLast5\")\n // console.log(avPosessionLast5)\n\n // console.log(\"avXGLast5\")\n // console.log(avXGLast5)\n\n // console.log(\"avXGAgainstLast5\")\n // console.log(avXGAgainstLast5)\n\n const avXGAgainstLast5Sum = avXGAgainstLast5.reduce((a, b) => a + b, 0);\n form.avXGAgainstLast5 = avXGAgainstLast5Sum / avXGAgainstLast5.length;\n\n const averageOddsHome = oddsSumHome / teamsHomeResults.length;\n const averageOddsAway = oddsSumAway / teamsAwayResults.length;\n form.favouriteCount = favouriteCount;\n form.winningFavouriteCount = winningFavouriteCount;\n form.drawingFavouriteCount = drawingFavouriteCount;\n form.beatenFavouriteCount = beatenFavouriteCount;\n\n form.underdogCount = underdogCount;\n form.winningUnderdogCount = winningUnderdogCount;\n form.drawingUnderdogCount = drawingUnderdogCount;\n form.beatenUnderdogCount = beatenUnderdogCount;\n\n form.oddsReliabilityWin =\n favouriteCount > 0\n ? (form.winningFavouriteCount / form.favouriteCount) * 100\n : 0;\n form.oddsReliabilityDraw =\n favouriteCount > 0\n ? (form.drawingFavouriteCount / form.favouriteCount) * 100\n : 0;\n form.oddsReliabilityLose =\n favouriteCount > 0\n ? (form.beatenFavouriteCount / form.favouriteCount) * 100\n : 0;\n\n form.oddsReliabilityWinAsUnderdog =\n underdogCount > 0\n ? (form.winningUnderdogCount / form.underdogCount) * 100\n : 0;\n form.oddsReliabilityDrawAsUnderdog =\n underdogCount > 0\n ? (form.drawingUnderdogCount / form.underdogCount) * 100\n : 0;\n form.oddsReliabilityLoseAsUnderdog =\n underdogCount > 0\n ? (form.beatenUnderdogCount / form.underdogCount) * 100\n : 0;\n\n form.reliableIndicator =\n form.winningFavouriteCount + form.beatenUnderdogCount;\n form.unreliableIndicator =\n form.beatenFavouriteCount +\n form.drawingFavouriteCount +\n form.winningUnderdogCount +\n form.drawingUnderdogCount;\n\n form.predictabilityScore =\n form.reliableIndicator / form.unreliableIndicator;\n\n let reliabilityString;\n\n switch (true) {\n case form.predictabilityScore < 0.3:\n reliabilityString =\n \"Odds have been an extremely unreliable indicator of actual performance so far this season. Maybe best avoided?\";\n break;\n case form.predictabilityScore >= 0.3 && form.predictabilityScore < 0.8:\n reliabilityString =\n \"Odds have been an unreliable indicator of actual performance so far this season\";\n break;\n case form.predictabilityScore >= 0.8 && form.predictabilityScore < 1.2:\n reliabilityString =\n \"Odds have been a decent indicator of actual performance so far this season\";\n break;\n case form.predictabilityScore >= 1.2 && form.predictabilityScore < 1.7:\n reliabilityString =\n \"Odds have been a good indicator of actual performance so far this season\";\n break;\n case form.predictabilityScore >= 1.7 && form.predictabilityScore < 2.2:\n reliabilityString =\n \"Odds have been a very good indicator of actual performance so far this season\";\n break;\n case form.predictabilityScore >= 2.2:\n reliabilityString =\n \"Odds have been an excellent indicator of actual performance so far this season. One for the multi?\";\n break;\n default:\n break;\n }\n\n form.reliabilityString = reliabilityString;\n\n const teamGoalsHome = reversedResultsHome.map((res) => res.scored);\n\n const teamGoalsAway = awayResults.map((res) => res.scored);\n const teamGoalsAll = allTeamResults.map((res) => res.scored);\n const teamGoalsAllRecentAtStart = teamGoalsAll.reverse();\n const teamConceededHome = homeResults.map((res) => res.conceeded);\n const teamConceededAway = awayResults.map((res) => res.conceeded);\n const teamConceededAll = allTeamResults.map((res) => res.conceeded);\n const teamConceededAllRecentAtStart = teamConceededAll.reverse();\n\n const teamXGForAll = allTeamResults.map((res) => res.XG);\n const teamXGAgainstAll = allTeamResults.map((res) => res.XGAgainst);\n const teamXGForAllRecentAtStart = teamXGForAll.reverse();\n const teamXGAgainstAllRecentAtStart = teamXGAgainstAll.reverse();\n\n const teamXGForHome = homeResults.map((res) => res.XG);\n const teamXGAgainstHome = homeResults.map((res) => res.XGAgainst);\n const teamXGForAway = awayResults.map((res) => res.XG);\n const teamXGAgainstAway = awayResults.map((res) => res.XGAgainst);\n\n const XGSum = teamXGForAll.reduce((a, b) => a + b, 0);\n const avgXGScored = XGSum / teamXGForAll.length || 0;\n const XGAgainstSum = teamXGAgainstAll.reduce((a, b) => a + b, 0);\n const avgXGConceeded = XGAgainstSum / teamXGAgainstAll.length || 0;\n\n const possession = allTeamResults.map((res) => res.possession);\n const possessionSum = possession.reduce((a, b) => a + b, 0);\n const avgPossession = possessionSum / possession.length || 0;\n\n const possessionHome = homeResults.map((res) => res.possession);\n const possessionSumHome = possessionHome.reduce((a, b) => a + b, 0);\n form.avgPossessionHome = possessionSumHome / possessionHome.length || 0;\n\n const possessionAway = awayResults.map((res) => res.possession);\n const possessionSumAway = possessionAway.reduce((a, b) => a + b, 0);\n form.avgPossessionAway = possessionSumAway / possessionAway.length || 0;\n\n const dangerousAttacks = allTeamResults.map((res) => res.dangerousAttacks);\n const dangerousAttacksSum = dangerousAttacks.reduce((a, b) => a + b, 0);\n const avgDangerousAttacks =\n dangerousAttacksSum / dangerousAttacks.length || 0;\n\n const dangerousAttacksHome = homeResults.map((res) => res.dangerousAttacks);\n const dangerousAttacksSumHome = dangerousAttacksHome.reduce(\n (a, b) => a + b,\n 0\n );\n form.avgDangerousAttacksHome =\n dangerousAttacksSumHome / dangerousAttacksHome.length || 0;\n\n const dangerousAttacksAway = awayResults.map((res) => res.dangerousAttacks);\n const dangerousAttacksSumAway = dangerousAttacksAway.reduce(\n (a, b) => a + b,\n 0\n );\n form.avgDangerousAttacksAway =\n dangerousAttacksSumAway / dangerousAttacksAway.length || 0;\n\n const shots = allTeamResults.map((res) => res.shots);\n const shotsSum = shots.reduce((a, b) => a + b, 0);\n const avgShots = shotsSum / shots.length || 0;\n form.avgShots = avgShots;\n\n const shotsHome = homeResults.map((res) => res.shots);\n const shotsSumHome = shotsHome.reduce((a, b) => a + b, 0);\n form.avgShotsHome = shotsSumHome / shotsHome.length || 0;\n\n const shotsAway = awayResults.map((res) => res.shots);\n const shotsSumAway = shotsAway.reduce((a, b) => a + b, 0);\n form.avgShotsAway = shotsSumAway / shotsAway.length || 0;\n\n const shotsOnTarget = allTeamResults.map((res) => res.sot);\n const shotsOnTargetSum = shotsOnTarget.reduce((a, b) => a + b, 0);\n const avgShotsOnTarget = shotsOnTargetSum / shotsOnTarget.length || 0;\n\n const shotsOnTargetHome = homeResults.map((res) => res.sot);\n const shotsOnTargetSumHome = shotsOnTargetHome.reduce((a, b) => a + b, 0);\n form.avgShotsOnTargetHome =\n shotsOnTargetSumHome / shotsOnTargetHome.length || 0;\n\n const shotsOnTargetAway = awayResults.map((res) => res.sot);\n const shotsOnTargetSumAway = shotsOnTargetAway.reduce((a, b) => a + b, 0);\n form.avgShotsOnTargetAway =\n shotsOnTargetSumAway / shotsOnTargetAway.length || 0;\n\n const shotsOnTargetAgainst = allTeamResults.map((res) => res.sotAgainst);\n const shotsOnTargetSumAgainst = shotsOnTargetAgainst.reduce(\n (a, b) => a + b,\n 0\n );\n const avgShotsOnTargetAgainst =\n shotsOnTargetSumAgainst / shotsOnTargetAgainst.length || 0;\n\n const shotsOnTargetAgainstHome = homeResults.map((res) => res.sotAgainst);\n const shotsOnTargetSumAgainstHome = shotsOnTargetAgainstHome.reduce(\n (a, b) => a + b,\n 0\n );\n form.avgShotsOnTargetAgainstHome =\n shotsOnTargetSumAgainstHome / shotsOnTargetAgainstHome.length || 0;\n\n const shotsOnTargetAgainstAway = awayResults.map((res) => res.sotAgainst);\n const shotsOnTargetSumAgainstAway = shotsOnTargetAgainstAway.reduce(\n (a, b) => a + b,\n 0\n );\n form.avgShotsOnTargetAgainstAway =\n shotsOnTargetSumAgainstAway / shotsOnTargetAgainstAway.length || 0;\n\n const corners = allTeamResults.map((res) => res.corners);\n const cornersSum = corners.reduce((a, b) => a + b, 0);\n const cornersAv = cornersSum / corners.length || 0;\n\n const cornersHome = homeResults.map((res) => res.corners);\n const cornersSumHome = cornersHome.reduce((a, b) => a + b, 0);\n form.cornersAvHome = cornersSumHome / cornersHome.length || 0;\n\n const cornersAway = awayResults.map((res) => res.corners);\n const cornersSumAway = cornersAway.reduce((a, b) => a + b, 0);\n form.cornersAvAway = cornersSumAway / cornersAway.length || 0;\n\n const last5XG = teamXGForAllRecentAtStart.slice(0, 5);\n const last5XGSum = last5XG.reduce((a, b) => a + b, 0);\n const last5XGAvgFor = last5XGSum / last5XG.length || 0;\n\n const last5XGHome = teamXGForHome.slice(0, 5);\n const last5XGSumHome = last5XGHome.reduce((a, b) => a + b, 0);\n form.last5XGAvgForHome = last5XGSumHome / last5XGHome.length || 0;\n\n const last5XGAway = teamXGForAway.slice(0, 5);\n const last5XGSumAway = last5XGAway.reduce((a, b) => a + b, 0);\n form.last5XGAvgForAway = last5XGSumAway / last5XGAway.length || 0;\n\n const XGSumHome = teamXGForHome.reduce((a, b) => a + b, 0);\n form.avgXGScoredHome = XGSumHome / teamXGForHome.length || 0;\n\n const XGSumAway = teamXGForAway.reduce((a, b) => a + b, 0);\n form.avgXGScoredAway = XGSumAway / teamXGForAway.length || 0;\n\n const XGAgainstSumHome = teamXGAgainstHome.reduce((a, b) => a + b, 0);\n form.avgXGConceededHome = XGAgainstSumHome / teamXGAgainstHome.length || 0;\n\n const XGAgainstSumAway = teamXGAgainstAway.reduce((a, b) => a + b, 0);\n form.avgXGConceededAway = XGAgainstSumAway / teamXGAgainstAway.length || 0;\n\n const last5XGAgainst = teamXGAgainstAllRecentAtStart.slice(0, 5);\n const last5XGAgainstSum = last5XGAgainst.reduce((a, b) => a + b, 0);\n const last5XGAvgAgainst = last5XGAgainstSum / last5XGAgainst.length || 0;\n\n const last5XGAgainstHome = teamXGForHome.slice(0, 5);\n const last5XGAgainstSumHome = last5XGAgainstHome.reduce((a, b) => a + b, 0);\n form.last5XGAvgAgainstHome =\n last5XGAgainstSumHome / last5XGAgainstHome.length || 0;\n\n const last5XGAgainstAway = teamXGForAway.slice(0, 5);\n const last5XGAgainstSumAway = last5XGAgainstAway.reduce((a, b) => a + b, 0);\n form.last5XGAvgAgainstAway =\n last5XGAgainstSumAway / last5XGAgainstAway.length || 0;\n\n form.XGDiffNonAverage = XGSum - XGAgainstSum;\n form.XGDiffNonAverageLast5 = last5XGSum - last5XGAgainstSum;\n\n form.XGOverall = parseFloat(avgXGScored.toFixed(2));\n form.XGlast5 = parseFloat(last5XGAvgFor.toFixed(2));\n\n form.XGAgainstAvgOverall = parseFloat(avgXGConceeded.toFixed(2));\n form.XGAgainstlast5 = parseFloat(last5XGAvgAgainst.toFixed(2));\n\n form.AveragePossessionOverall = parseFloat(avgPossession.toFixed(1));\n form.AverageDangerousAttacksOverall = parseFloat(\n avgDangerousAttacks.toFixed(1)\n );\n form[\"Average Shots\"] = parseFloat(avgShots.toFixed(1));\n form.AverageCorners = parseFloat(cornersAv.toFixed(1));\n form.AverageShotsOnTargetOverall = parseFloat(avgShotsOnTarget.toFixed(1));\n form.AverageShotsOnTargetAgainstOverall = parseFloat(\n avgShotsOnTargetAgainst.toFixed(1)\n );\n const alpha = 0.75;\n const beta = 0.75;\n\n let forAndAgainstRollingAv;\n let forAndAgainstRollingAvHomeOrAway;\n if (hOrA === \"home\") {\n form.allGoalsArrayHomeRecent = teamGoalsAllRecentAtStart.slice(0, 20);\n form.allConceededArrayHomeRecent = teamConceededAllRecentAtStart.slice(\n 0,\n 20\n );\n form.allGoalsArrayHome = teamGoalsAllRecentAtStart;\n form.allConceededArrayHome = teamConceededAllRecentAtStart;\n form.allGoalsArrayHomeOnly = teamGoalsHome;\n form.allConceededArrayHomeOnly = teamConceededHome;\n const sum = teamGoalsHome.reduce((a, b) => a + b, 0);\n const sumTwo = teamConceededHome.reduce((a, b) => a + b, 0);\n form.goalDifferenceHomeOrAway = sum - sumTwo;\n\n forAndAgainstRollingAv = await predictGoalsWithExponentialSmoothing(\n teamGoalsAll.reverse(),\n teamConceededAll.reverse(),\n alpha\n );\n forAndAgainstRollingAvHomeOrAway =\n await predictGoalsWithExponentialSmoothing(\n teamGoalsHome,\n teamConceededHome,\n beta\n );\n } else if (hOrA === \"away\") {\n form.allGoalsArrayAwayRecent = teamGoalsAllRecentAtStart.slice(0, 20);\n form.allConceededArrayAwayRecent = teamConceededAllRecentAtStart.slice(\n 0,\n 20\n );\n form.allGoalsArrayAway = teamGoalsAllRecentAtStart;\n form.allConceededArrayAway = teamConceededAllRecentAtStart;\n form.allGoalsArrayAwayOnly = teamGoalsAway;\n form.allConceededArrayAwayOnly = teamConceededAway;\n const sum = teamGoalsAway.reduce((a, b) => a + b, 0);\n const sumTwo = teamConceededAway.reduce((a, b) => a + b, 0);\n form.goalDifferenceHomeOrAway = sum - sumTwo;\n forAndAgainstRollingAv = await predictGoalsWithExponentialSmoothing(\n teamGoalsAll.reverse(),\n teamConceededAll.reverse(),\n alpha\n );\n forAndAgainstRollingAvHomeOrAway =\n await predictGoalsWithExponentialSmoothing(\n teamGoalsAway,\n teamConceededAway,\n beta\n );\n }\n\n let bttsHome = homeResults.map((res) => res.btts);\n if (bttsHome.length > 10) {\n bttsHome = bttsHome.slice(-10);\n }\n\n let bttsAway = awayResults.map((res) => res.btts);\n if (bttsAway.length > 10) {\n bttsAway = bttsAway.slice(-10);\n }\n\n let bttsAll = allTeamResults.map((res) => res.btts);\n if (bttsAll.length > 10) {\n bttsAll = bttsAll.slice(-10);\n }\n\n const bttsHomeCount = bttsHome.filter((btts) => btts === true);\n const bttsHomeString = `${bttsHomeCount.length}/${bttsHome.length}`;\n const bttsHomePercentage = (\n (bttsHomeCount.length / bttsHome.length) *\n 100\n ).toFixed(0);\n\n const bttsAwayCount = bttsAway.filter((btts) => btts === true);\n const bttsAwayString = `${bttsAwayCount.length}/${bttsAway.length}`;\n const bttsAwayPercentage = (\n (bttsAwayCount.length / bttsAway.length) *\n 100\n ).toFixed(0);\n const bttsAllCount = bttsAll.filter((btts) => btts === true);\n const bttsAllString = `${bttsAllCount.length}/${bttsAll.length}`;\n const bttsAllPercentage = (\n (bttsAllCount.length / bttsAll.length) *\n 100\n ).toFixed(0);\n form.bttsAllPercentage = bttsAllPercentage;\n form.bttsHomePercentage = bttsHomePercentage;\n form.bttsAwayPercentage = bttsAwayPercentage;\n\n let r = 10;\n let x = 10;\n\n const teamGoalsHomeRollingAverage = await predictNextWeightedMovingAverage(\n teamGoalsHome,\n teamGoalsHome.length < x ? teamGoalsHome.length : x\n );\n\n const teamGoalsAwayRollingAverage = await predictNextWeightedMovingAverage(\n teamGoalsAway,\n teamGoalsAway.length < x ? teamGoalsAway.length : x\n );\n\n const RoundedXGFor = teamXGForAll.map((xg) => xg);\n const RoundedXGAgainst = teamXGAgainstAll.map((xg) => xg);\n const RoundedXGForHome = teamXGForHome.map((xg) => xg);\n const RoundedXGAgainstHome = teamXGAgainstHome.map((xg) => xg);\n const RoundedXGForAway = teamXGForAway.map((xg) => xg);\n const RoundedXGAgainstAway = teamXGAgainstAway.map((xg) => xg);\n\n form.XGPrediction = await predictGoalsWithExponentialSmoothing(\n RoundedXGFor,\n RoundedXGAgainst,\n alpha\n );\n\n form.XGPredictionHome = await predictGoalsWithExponentialSmoothing(\n RoundedXGForHome,\n RoundedXGAgainstHome,\n beta\n );\n\n form.XGPredictionAway = await predictGoalsWithExponentialSmoothing(\n RoundedXGForAway,\n RoundedXGAgainstAway,\n beta\n );\n\n const teamConceededHomeRollingAverage =\n await predictNextWeightedMovingAverage(\n teamConceededHome,\n teamConceededHome.length < x ? teamConceededHome.length : x\n );\n\n const teamConceededAwayRollingAverage =\n await predictNextWeightedMovingAverage(\n teamConceededAway,\n teamConceededAway.length < x ? teamConceededAway.length : x\n );\n\n const sum = teamGoalsAll.reduce((a, b) => a + b, 0);\n const avgScored = sum / teamGoalsAll.length || 0;\n form.avgScored = avgScored.toFixed(2);\n\n const sumHome = teamGoalsHome.reduce((a, b) => a + b, 0);\n const avgScoredHome = sumHome / teamGoalsAll.length || 0;\n form.avgScoredHome = avgScoredHome.toFixed(2);\n\n const sumAway = teamGoalsAway.reduce((a, b) => a + b, 0);\n const avgScoredAway = sumAway / teamGoalsAway.length || 0;\n form.avgScoredAway = avgScoredAway.toFixed(2);\n\n const last5 = teamGoalsAllRecentAtStart.slice(0, 5);\n const last5Sum = last5.reduce((a, b) => a + b, 0);\n const last5AvgScored = last5Sum / last5.length || 0;\n\n const last5Home = teamGoalsHome.slice(0, 5);\n const last5SumHome = last5Home.reduce((a, b) => a + b, 0);\n form.last5AvgScoredHome = last5SumHome / last5Home.length || 0;\n\n const last5Away = teamGoalsAway.slice(0, 5);\n const last5SumAway = last5Away.reduce((a, b) => a + b, 0);\n form.last5AvgScoredAway = last5SumAway / last5Away.length || 0;\n\n const last5Conceeded = teamConceededAllRecentAtStart.slice(0, 5);\n const last5ConceededSum = last5Conceeded.reduce((a, b) => a + b, 0);\n const last5AvgConceeded = last5ConceededSum / last5Conceeded.length || 0;\n\n const last5ConceededHome = teamConceededHome.slice(0, 5);\n const last5ConceededSumHome = last5ConceededHome.reduce((a, b) => a + b, 0);\n form.last5AvgConceededHome =\n last5ConceededSumHome / last5ConceededHome.length || 0;\n\n const last5ConceededAway = teamConceededAway.slice(0, 5);\n const last5ConceededSumAway = last5ConceededAway.reduce((a, b) => a + b, 0);\n form.last5AvgConceededAway =\n last5ConceededSumAway / last5ConceededAway.length || 0;\n\n const last10 = teamGoalsAllRecentAtStart.slice(0, 10);\n const last10Sum = last10.reduce((a, b) => a + b, 0);\n const last10AvgScored = last10Sum / last10.length || 0;\n\n const last10Conceeded = teamConceededAllRecentAtStart.slice(0, 10);\n const last10ConceededSum = last10Conceeded.reduce((a, b) => a + b, 0);\n const last10AvgConceeded = last10ConceededSum / last10Conceeded.length || 0;\n\n form.last5Goals = parseFloat(last5AvgScored.toFixed(2));\n form.last5GoalsConceeded = parseFloat(last5AvgConceeded.toFixed(2));\n form.last5GoalDiff = form.last5Goals - form.last5GoalsConceeded;\n form.last10Goals = parseFloat(last10AvgScored.toFixed(2));\n form.last10GoalsConceeded = parseFloat(last10AvgConceeded.toFixed(2));\n form.last10GoalDiff = form.last10Goals - form.last10GoalsConceeded;\n\n const teamGoalsAllRollingAverage = await predictNextWeightedMovingAverage(\n teamGoalsAll,\n teamGoalsAll.length < r ? teamGoalsAll.length : r\n );\n\n const teamGoalsConceededAllRollingAverage =\n await predictNextWeightedMovingAverage(\n last10Conceeded,\n last10Conceeded.length < r ? last10Conceeded.length : r\n );\n\n const sumTwo = teamConceededAll.reduce((a, b) => a + b, 0);\n const avgConceeded = sumTwo / teamConceededAll.length || 0;\n form.avgConceeded = avgConceeded.toFixed(2);\n\n const teamConceededHomeOnlySum = teamConceededHome.reduce(\n (a, b) => a + b,\n 0\n );\n const teamConceededAvgHomeOnly =\n teamConceededHomeOnlySum / teamConceededHome.length || 0;\n form.teamConceededAvgHomeOnly = teamConceededAvgHomeOnly;\n\n const teamConceededAwayOnlySum = teamConceededAway.reduce(\n (a, b) => a + b,\n 0\n );\n const teamConceededAvgAwayOnly =\n teamConceededAwayOnlySum / teamConceededAway.length || 0;\n form.teamConceededAvgAwayOnly = teamConceededAvgAwayOnly;\n\n form.goalDifference = sum - sumTwo;\n\n // console.log(teamGoalsHomeRollingAverage)\n // console.log(teamGoalsAwayRollingAverage)\n // console.log(teamGoalsAllRollingAverage)\n // console.log(teamConceededHomeRollingAverage)\n // console.log(teamConceededAwayRollingAverage)\n // console.log(teamGoalsConceededAllRollingAverage)\n // console.log(averageOddsHome)\n // console.log(averageOddsAway)\n // console.log(avgScored)\n // console.log(avgConceeded)\n // console.log(form.XGPrediction)\n // console.log(forAndAgainstRollingAvHomeOrAway)\n // console.log(forAndAgainstRollingAv)\n\n return [\n teamGoalsHomeRollingAverage,\n teamGoalsAwayRollingAverage,\n teamGoalsAllRollingAverage,\n teamConceededHomeRollingAverage,\n teamConceededAwayRollingAverage,\n teamGoalsConceededAllRollingAverage,\n averageOddsHome,\n averageOddsAway,\n avgScored,\n avgConceeded,\n bttsAllString,\n bttsHomeString,\n bttsAwayString,\n bttsAllPercentage,\n bttsHomePercentage,\n bttsAwayPercentage,\n forAndAgainstRollingAvHomeOrAway,\n forAndAgainstRollingAv,\n ];\n } else {\n return null;\n }\n}\n\nasync function predictNextWeightedMovingAverage(numbers, windowSize) {\n const startIndex = numbers.length - windowSize;\n const window = numbers.slice(startIndex);\n const weights = Array.from(\n { length: windowSize },\n (_, i) => (i + 1) / ((windowSize * (windowSize + 1)) / 2)\n );\n const sum = window.reduce((acc, num, i) => acc + num * weights[i], 0);\n const movingAverage = sum / weights.reduce((acc, w) => acc + w, 0);\n return parseFloat(movingAverage.toFixed(2));\n}\n\n// Function to calculate the weighted average using exponential smoothing\nasync function calculateWeightedAverage(arr, alpha) {\n let weightedSum = 0;\n let totalWeight = 0;\n\n for (let i = arr.length - 1; i >= 0; i--) {\n const weight = Math.pow(1 - alpha, arr.length - 1 - i);\n weightedSum += arr[i] * weight;\n totalWeight += weight;\n }\n\n return weightedSum / totalWeight;\n}\n\n// Function to predict goals scored and conceded for a team with exponential smoothing\nasync function predictGoalsWithExponentialSmoothing(\n teamGoalsFor,\n teamGoalsAgainst,\n alpha\n) {\n const lambdaFor = await calculateWeightedAverage(teamGoalsFor, alpha);\n const lambdaAgainst = await calculateWeightedAverage(teamGoalsAgainst, alpha);\n\n // You can fine-tune these values based on your model and data\n const predictedGoalsFor = lambdaFor;\n const predictedGoalsAgainst = lambdaAgainst;\n\n return {\n goalsFor: predictedGoalsFor,\n goalsAgainst: predictedGoalsAgainst,\n };\n}\n\nasync function calculateDifference(num1, num2) {\n return num1 >= num2 ? num1 - num2 : -(num2 - num1);\n}\n\nexport async function comparison(metricOne, metricTwo) {\n let stat1 = parseFloat(metricOne);\n let stat2 = parseFloat(metricTwo);\n let statDiff;\n\n statDiff = await calculateDifference(stat1, stat2);\n\n return parseFloat(statDiff);\n}\n\nexport async function compareStat(statOne, statTwo) {\n let stat1 = parseFloat(statOne);\n let stat2 = parseFloat(statTwo);\n let statDiff;\n // console.log( await normalizeValues(12, 2, 0, 1))\n // console.log(await diff(1.8571428571428571, 1.14285714285714285))\n\n if (stat1 === 0) {\n stat1 = stat1 + 1;\n stat2 = stat2 + 1;\n }\n if (stat2 === 0) {\n stat2 = stat2 + 1;\n stat2 = stat2 + 1;\n }\n\n const { normalizedValue1, normalizedValue2 } = await normalizeValues(\n stat1,\n stat2,\n 0,\n 1\n );\n\n const finalValue1 = normalizedValue1;\n const finalValue2 = normalizedValue2;\n\n statDiff = await diff(finalValue1, finalValue2);\n\n // if (statDiff > 0.3 || statDiff < -0.3) {\n // // console.log(statDiff)\n // } else {\n // statDiff = 0;\n // }\n return statDiff;\n}\n\nexport async function getClinicalRating(form) {\n let rating;\n let score;\n switch (true) {\n case form.dangerousAttackConversion <= 15:\n rating = \"excellent\";\n score = 0.8;\n break;\n\n case form.dangerousAttackConversion > 15 &&\n form.dangerousAttackConversion <= 20:\n rating = \"great\";\n score = 0.9;\n break;\n\n case form.dangerousAttackConversion > 20 &&\n form.dangerousAttackConversion <= 25:\n rating = \"very good\";\n score = 0.95;\n break;\n\n case form.dangerousAttackConversion > 25 &&\n form.dangerousAttackConversion <= 32.5:\n rating = \"good\";\n score = 0.98;\n break;\n\n case form.dangerousAttackConversion > 30 &&\n form.dangerousAttackConversion <= 35:\n rating = \"above average\";\n score = 0.99;\n break;\n\n case form.dangerousAttackConversion > 35 &&\n form.dangerousAttackConversion <= 40:\n rating = \"average\";\n score = 1;\n break;\n\n case form.dangerousAttackConversion > 40 &&\n form.dangerousAttackConversion <= 45:\n rating = \"below average\";\n score = 1.01;\n break;\n\n case form.dangerousAttackConversion > 45 &&\n form.dangerousAttackConversion <= 50:\n rating = \"poor\";\n score = 1.05;\n break;\n\n case form.dangerousAttackConversion > 50 &&\n form.dangerousAttackConversion <= 55:\n rating = \"very poor\";\n score = 1.1;\n break;\n\n case form.dangerousAttackConversion > 55 &&\n form.dangerousAttackConversion <= 60:\n rating = \"terrible\";\n score = 1.2;\n break;\n\n case form.dangerousAttackConversion > 60:\n rating = \"awful\";\n score = 1.3;\n break;\n\n default:\n break;\n }\n\n return [rating, score];\n}\n\nexport async function getPointsDifferential(pointsHomeAvg, pointsAwayAvg) {\n const differential = await diff(pointsHomeAvg, pointsAwayAvg);\n return parseFloat(differential);\n}\n\nexport async function getPointWeighting(pointsDiff) {\n let pointsDiffWeightingHome;\n let pointsDiffWeightingAway;\n\n switch (true) {\n case pointsDiff >= 2.5:\n pointsDiffWeightingHome = 0.3;\n pointsDiffWeightingAway = -0.3;\n break;\n case pointsDiff >= 2 && pointsDiff < 2.5:\n pointsDiffWeightingHome = 0.2;\n pointsDiffWeightingAway = -0.2;\n break;\n case pointsDiff >= 1.5 && pointsDiff < 2:\n pointsDiffWeightingHome = 0.15;\n pointsDiffWeightingAway = -0.15;\n break;\n case pointsDiff >= 1 && pointsDiff < 1.5:\n pointsDiffWeightingHome = 0.1;\n pointsDiffWeightingAway = -0.1;\n break;\n case pointsDiff >= 0.5 && pointsDiff < 1:\n pointsDiffWeightingHome = 0.05;\n pointsDiffWeightingAway = -0.05;\n break;\n case pointsDiff > -0.5 && pointsDiff < 0.5:\n pointsDiffWeightingHome = 0;\n pointsDiffWeightingAway = 0;\n break;\n case pointsDiff <= -0.5 && pointsDiff > -1:\n pointsDiffWeightingHome = -0.05;\n pointsDiffWeightingAway = 0.05;\n break;\n case pointsDiff <= -1 && pointsDiff > -1.5:\n pointsDiffWeightingHome = -0.1;\n pointsDiffWeightingAway = 0.1;\n break;\n case pointsDiff <= -1.5 && pointsDiff > -2:\n pointsDiffWeightingHome = -0.15;\n pointsDiffWeightingAway = 0.15;\n break;\n case pointsDiff <= -2 && pointsDiff > -2.5:\n pointsDiffWeightingHome = -0.2;\n pointsDiffWeightingAway = 0.2;\n break;\n case pointsDiff <= -2.5:\n pointsDiffWeightingHome = -0.3;\n pointsDiffWeightingAway = 0.3;\n break;\n default:\n pointsDiffWeightingHome = 0;\n pointsDiffWeightingAway = 0;\n }\n return [pointsDiffWeightingHome, pointsDiffWeightingAway];\n}\n\nexport async function compareFormTrend(recentForm, distantForm) {\n let score;\n let scoreTotal = 0;\n\n for (let index = 0; index < recentForm.length; index++) {\n const recent = recentForm[index];\n const distant = distantForm[index];\n\n if (recent > distant) {\n score = 1.05;\n } else if (recent === distant) {\n score = 1;\n } else if (recent < distant) {\n score = 0.95;\n }\n scoreTotal = scoreTotal + score / recentForm.length;\n }\n\n return scoreTotal;\n}\n\nexport async function getPointAverage(pointTotal, games) {\n return pointTotal / games;\n}\n\nasync function poissonDistribution(lambda, k) {\n const numerator = Math.exp(-lambda) * Math.pow(lambda, k);\n const denominator = factorial(k);\n return numerator / denominator;\n}\n\nfunction factorial(n) {\n if (n === 0 || n === 1) {\n return 1;\n }\n let result = 1;\n for (let i = 2; i <= n; i++) {\n result *= i;\n }\n return result;\n}\n\nasync function calculateAverageGoals(goalsFor) {\n const totalGoals = goalsFor.reduce((sum, goals) => sum + goals, 0);\n return totalGoals / goalsFor.length;\n}\n\nasync function adjustGoalsAvg(goalsAvg, strengthRatio) {\n return goalsAvg * strengthRatio;\n}\n\nasync function predictScore(\n goalsForTeam1,\n goalsAgainstTeam1,\n goalsForTeam2,\n goalsAgainstTeam2,\n team1Metrics,\n team2Metrics,\n game\n) {\n let team1AverageGoalsFor = await calculateAverageGoals(goalsForTeam1);\n let team1AverageGoalsAgainst = await calculateAverageGoals(goalsAgainstTeam1);\n let team2AverageGoalsFor = await calculateAverageGoals(goalsForTeam2);\n let team2AverageGoalsAgainst = await calculateAverageGoals(goalsAgainstTeam2);\n\n let team1StrengthRatio = 1;\n let team2StrengthRatio = 1;\n\n let adjustedTeam1AverageGoals = await adjustGoalsAvg(\n team1AverageGoalsFor,\n team1StrengthRatio\n );\n let adjustedTeam2AverageGoals = await adjustGoalsAvg(\n team2AverageGoalsFor,\n team2StrengthRatio\n );\n\n let adjustedTeam1AverageGoalsAgainst = await adjustGoalsAvg(\n team1AverageGoalsAgainst,\n team2StrengthRatio\n );\n let adjustedTeam2AverageGoalsAgainst = await adjustGoalsAvg(\n team2AverageGoalsAgainst,\n team1StrengthRatio\n );\n\n let maxGoals = 5; // Set the maximum number of goals to predict\n\n const scores = [];\n\n for (let i = 0; i <= maxGoals; i++) {\n for (let j = 0; j <= maxGoals; j++) {\n let team1GoalExpectation =\n (adjustedTeam1AverageGoals + adjustedTeam2AverageGoalsAgainst) / 2;\n // (adjustedTeam2AverageGoalsAgainst / adjustedTeam1AverageGoalsAgainst);\n let team2GoalExpectation =\n (adjustedTeam2AverageGoals + adjustedTeam1AverageGoalsAgainst) / 2;\n // (adjustedTeam1AverageGoalsAgainst / adjustedTeam2AverageGoalsAgainst);\n\n if (!isFinite(team1GoalExpectation)) {\n team1GoalExpectation = 0;\n }\n\n if (!isFinite(team2GoalExpectation)) {\n team2GoalExpectation = 0;\n }\n\n const probability =\n (await poissonDistribution(team1GoalExpectation, i)) *\n (await poissonDistribution(team2GoalExpectation, j));\n scores.push({\n team1Score: i,\n team2Score: j,\n probability,\n });\n }\n }\n\n scores.sort((a, b) => b.probability - a.probability); // Sort scores in descending order by probability\n const top5Scores = scores.slice(0, 5); // Get the top 5 scores\n\n // for (const score of top5Scores) {\n // console.log(\n // `Team 1: ${score.team1Score} - Team 2: ${score.team2Score} (${(\n // score.probability * 100\n // ).toFixed(2)}%)`\n // );\n // }\n return top5Scores;\n}\n\nasync function normalizeValues(value1, value2, minRange, maxRange) {\n if (\n typeof value1 !== \"number\" ||\n typeof value2 !== \"number\" ||\n typeof minRange !== \"number\" ||\n typeof maxRange !== \"number\"\n ) {\n throw new Error(\"All arguments must be numbers.\");\n }\n\n // Calculate the absolute values of the inputs\n\n const absValue1 = Math.abs(value1);\n const absValue2 = Math.abs(value2);\n\n // Calculate the total sum of the absolute values\n const totalAbs = absValue1 + absValue2;\n\n // Calculate the normalized values based on the ratio of absolute values\n const normalizedAbsValue1 =\n (absValue1 / totalAbs) * (maxRange - minRange) + minRange;\n const normalizedAbsValue2 =\n (absValue2 / totalAbs) * (maxRange - minRange) + minRange;\n\n // Adjust the signs of the normalized values based on the original values\n const normalizedValue1 =\n value1 >= 0 ? normalizedAbsValue1 : -normalizedAbsValue1;\n const normalizedValue2 =\n value2 >= 0 ? normalizedAbsValue2 : -normalizedAbsValue2;\n\n return { normalizedValue1, normalizedValue2 };\n}\n\nexport async function generateGoals(homeForm, awayForm, match) {\n let homeGoals = 0;\n let awayGoals = 0;\n\n const homeAttackVsAwayDefenceComparison = await comparison(\n homeForm.attackingStrength,\n awayForm.defensiveStrengthScoreGeneration\n );\n const awayAttackVsHomeDefenceComparison = await comparison(\n awayForm.attackingStrength,\n homeForm.defensiveStrengthScoreGeneration\n );\n\n const homeOverallVsAwayOverallComparison = await comparison(\n homeForm.attackingStrength + homeForm.defensiveStrength,\n awayForm.attackingStrength + awayForm.defensiveStrength\n );\n\n const awayOverallVsHomeOverallComparison = await comparison(\n awayForm.attackingStrength + awayForm.defensiveStrength,\n homeForm.attackingStrength + homeForm.defensiveStrength\n );\n\n const homeAttackVsAwayDefenceComparisonLast5 = await comparison(\n homeForm.attackingStrengthLast5,\n awayForm.defensiveStrengthScoreGenerationLast5\n );\n const awayAttackVsHomeDefenceComparisonLast5 = await comparison(\n awayForm.attackingStrengthLast5,\n homeForm.defensiveStrengthScoreGenerationLast5\n );\n\n const homeAttackVsAwayDefenceComparisonHomeOnly = await comparison(\n homeForm.attackingStrengthHomeOnly,\n awayForm.defensiveStrengthScoreGenerationAwayOnly\n );\n const awayAttackVsHomeDefenceComparisonAwayOnly = await comparison(\n awayForm.attackingStrengthAwayOnly,\n homeForm.defensiveStrengthScoreGenerationHomeOnly\n );\n\n const pointsComparisonHome = await comparison(\n homeForm.avPoints6,\n awayForm.avPoints6\n );\n\n const pointsComparisonAway = await comparison(\n awayForm.avPoints6,\n homeForm.avPoints6\n );\n\n homeGoals =\n 1 +\n homeAttackVsAwayDefenceComparison * 1.75 +\n // (homeGoals + homeOverallVsAwayOverallComparison) * 0.25 +\n homeAttackVsAwayDefenceComparisonLast5 * 1.75 +\n homeAttackVsAwayDefenceComparisonHomeOnly * 1;\n // pointsComparisonHome * 0.1;\n awayGoals =\n 1 +\n awayAttackVsHomeDefenceComparison * 1.75 +\n // (awayGoals + awayOverallVsHomeOverallComparison) * 0.25 +\n awayAttackVsHomeDefenceComparisonLast5 * 1.75 +\n awayAttackVsHomeDefenceComparisonAwayOnly * 1;\n // pointsComparisonAway * 0.1;\n\n // if (homeForm.actualToXGDifference > 25) {\n // homeGoals = homeGoals + homeForm.actualToXGDifference / 50;\n // } else if (homeForm.actualToXGDifference < -25) {\n // homeGoals = homeGoals + homeForm.actualToXGDifference / 50;\n // }\n\n // if (awayForm.actualToXGDifference > 25) {\n // awayGoals = awayGoals + awayForm.actualToXGDifference / 50;\n // } else if (awayForm.actualToXGDifference < -25) {\n // awayGoals = awayGoals + awayForm.actualToXGDifference / 50;\n // }\n\n if (\n homeForm.lastGame === \"L\" ||\n homeForm.last2Points < 2 ||\n awayForm.last2Points >= 5 ||\n match.XGdifferentialValueRaw < 0\n ) {\n awayGoals = awayGoals + 0.3;\n } else if (\n awayForm.lastGame === \"L\" ||\n awayForm.last2Points < 2 ||\n homeForm.last2Points >= 5 ||\n match.XGdifferentialValueRaw > 0\n ) {\n homeGoals = homeGoals + 0.3;\n }\n\n // if(homeForm.last5Points > homeForm.last10Points){\n // homeGoals = homeGoals + 0.1;\n // awayGoals = awayGoals - 0.1;\n\n // } else if (awayForm.last5Points > awayForm.last10Points){\n // awayGoals = awayGoals + 0.1;\n // homeGoals = homeGoals - 0.1;\n // }\n\n // Cumalative ROI for all 2193 match outcomes: + 4.18%\n\n if (homeGoals < 0 && awayGoals < 0) {\n if (homeGoals < awayGoals) {\n homeGoals = homeGoals + awayGoals / 5;\n awayGoals = awayGoals - homeGoals / 5;\n } else if (homeGoals > awayGoals) {\n homeGoals = homeGoals - awayGoals / 5;\n awayGoals = awayGoals + homeGoals / 5;\n }\n }\n\n return [homeGoals, awayGoals];\n}\n\nexport async function compareTeams(homeForm, awayForm, match) {\n // let homeAttackStrength = homeForm.attackingStrength;\n // let homeDefenceStrength = homeForm.defensiveStrength;\n // let homePossessionStrength = homeForm.possessionStrength;\n // let awayAttackStrength = awayForm.attackingStrength;\n // let awayDefenceStrength = awayForm.defensiveStrength;\n // let awayPossessionStrength = awayForm.possessionStrength;\n // let homeAttackStrengthLast5 = homeForm.attackingStrengthLast5;\n // let homeDefenceStrengthLast5 = homeForm.defensiveStrengthLast5;\n // let homePossessionStrengthLast5 = homeForm.possessionStrengthLast5;\n // let awayAttackStrengthLast5 = awayForm.attackingStrengthLast5;\n // let awayDefenceStrengthLast5 = awayForm.defensiveStrengthLast5;\n // let awayPossessionStrengthLast5 = awayForm.possessionStrengthLast5;\n // let homeAttackStrengthHome = homeForm.attackingStrengthHomeOnly;\n // let homeDefenceStrengthHome = homeForm.defensiveStrengthHomeOnly;\n // let homePossessionStrengthHome = homeForm.possessionStrengthHomeOnly;\n // let awayAttackStrengthAway = awayForm.attackingStrengthAwayOnly;\n // let awayDefenceStrengthAway = awayForm.defensiveStrengthAwayOnly;\n // let awayPossessionStrengthAway = awayForm.possessionStrengthAwayOnly;\n // const attackStrengthComparison = await compareStat(\n // homeAttackStrength,\n // awayAttackStrength\n // );\n // const attackStrengthHAComparison = await compareStat(\n // homeAttackStrengthHome,\n // awayAttackStrengthAway\n // );\n // const defenceStrengthComparison = await compareStat(\n // homeDefenceStrength,\n // awayDefenceStrength\n // );\n // const defenceStrengthHAComparison = await compareStat(\n // homeDefenceStrengthHome,\n // awayDefenceStrengthAway\n // );\n // const attackStrengthComparisonLast5 = await compareStat(\n // homeAttackStrengthLast5,\n // awayAttackStrengthLast5\n // );\n // const defenceStrengthComparisonLast5 = await compareStat(\n // homeDefenceStrengthLast5,\n // awayDefenceStrengthLast5\n // );\n // const possessiontrengthComparison = await compareStat(\n // homePossessionStrength,\n // awayPossessionStrength\n // );\n // const possessiontrengthComparisonLast5 = await compareStat(\n // homePossessionStrengthLast5,\n // awayPossessionStrengthLast5\n // );\n // const possessionHAStrengthComparison = await compareStat(\n // homePossessionStrengthHome,\n // awayPossessionStrengthAway\n // );\n // // const xgActualComparison = await compareStat(\n // // homeForm.actualToXGDifference,\n // // awayForm.actualToXGDifference\n // // );\n // // const XGComparison = await compareStat(\n // // homeForm.XGDiffNonAverage,\n // // awayForm.XGDiffNonAverage\n // // );\n // // const XGComparisonLast5 = await compareStat(\n // // homeForm.XGDiffNonAverageLast5,\n // // awayForm.XGDiffNonAverageLast5\n // // )\n // const homeAwayPointAverageComparison = await compareStat(\n // homeForm.homeOrAwayAverage,\n // awayForm.homeOrAwayAverage\n // );\n // // const fiveGameComparison = await compareStat(\n // // homeForm.last5Points,\n // // awayForm.last5Points\n // // );\n // // const last5GDComparison = await compareStat(\n // // homeForm.last5GoalDiff,\n // // awayForm.last5GoalDiff\n // // )\n // let oddsComparison = await compareStat(match.awayOdds, match.homeOdds);\n // // const homeAdvantage = await compareStat(\n // // parseFloat(homeForm.homeAttackAdvantage) / 2,\n // // 1\n // // );\n // // const dangerousAttacksWithConverstionComparison = await compareStat(\n // // homeForm.AverageDangerousAttacksOverall *\n // // homeForm.dangerousAttackConversion,\n // // awayForm.AverageDangerousAttacksOverall * awayForm.dangerousAttackConversion\n // // );\n // match.goalDiffHomeOrAwayComparison =\n // parseFloat(homeForm.goalDifferenceHomeOrAway) -\n // parseFloat(awayForm.goalDifferenceHomeOrAway);\n // match.goalDifferenceComparison =\n // parseFloat(homeForm.goalDifference) - parseFloat(awayForm.goalDifference);\n // const goalDiffHomeOrAwayComparison = await compareStat(\n // homeForm.goalDifferenceHomeOrAway,\n // awayForm.goalDifferenceHomeOrAway\n // );\n // const overallDirectnessComparison = await compareStat(\n // homeForm.directnessOverallStrength,\n // awayForm.directnessOverallStrength\n // );\n // // const hOrADirectnessComparison = await compareStat(\n // // homeForm.directnessHomeOnly,\n // // awayForm.directnessAwayOnly\n // // );\n // const accuracyComparison = await compareStat(\n // homeForm.accuracyOverallStrength,\n // awayForm.accuracyOverallStrength\n // );\n // const accuracyComparisonLast5 = await compareStat(\n // homeForm.accuracyOverallStrengthLast5,\n // awayForm.accuracyOverallStrengthLast5\n // );\n // // console.log(match.game)\n // // console.log(attackStrengthComparison);\n // // console.log(defenceStrengthComparison);\n // // console.log(possessiontrengthComparison);\n // // console.log(attackStrengthComparisonLast5);\n // // console.log(defenceStrengthComparisonLast5);\n // // console.log(attackStrengthHAComparison);\n // // console.log(defenceStrengthHAComparison);\n // // console.log(homeAwayPointAverageComparison);\n // // console.log(goalDiffHomeOrAwayComparison);\n // // // console.log(oddsComparison);\n // // console.log(overallDirectnessComparison);\n // // console.log(accuracyComparisonLast5);\n // // console.log(accuracyComparison);\n // // let calculation =\n // // attackStrengthComparison * 0 +\n // // attackStrengthComparisonLast5 * 0 +\n // // attackStrengthHAComparison * 1 +\n // // defenceStrengthComparison * 0 +\n // // defenceStrengthComparisonLast5 * 0 +\n // // defenceStrengthHAComparison * 1 +\n // // possessiontrengthComparison * 0 +\n // // possessionHAStrengthComparison * 0 +\n // // possessiontrengthComparisonLast5 * 1 +\n // // // xgToActualDiffComparison * 1 +\n // // // xgForStrengthRecentComparison * 1 +\n // // // xgAgainstStrengthRecentComparison * 1 +\n // // homeAwayPointAverageComparison * 5 +\n // // goalDiffHomeOrAwayComparison * 0 +\n // // // xgActualComparison * 0 +\n // // // xgForComparison * 1 +\n // // // xgAgainstComparison * 1 +\n // // // XGComparison * 0 +\n // // oddsComparison * 2 +\n // // // dangerousAttacksWithConverstionComparison * 0.05 +\n // // overallDirectnessComparison * 0 +\n // // // hOrADirectnessComparison * 0 +\n // // accuracyComparisonLast5 * 0 +\n // // accuracyComparison * 0;\n // // // console.log(match.game)\n // // // console.log(calculation)\n // let calculation =\n // attackStrengthComparisonLast5 * 2 +\n // attackStrengthHAComparison * 1 +\n // defenceStrengthComparisonLast5 * 2 +\n // defenceStrengthHAComparison * 1 +\n // possessionHAStrengthComparison * 1 +\n // possessiontrengthComparisonLast5 * 1 +\n // possessiontrengthComparison * 1 +\n // // xgToActualDiffComparison * 1 +\n // // xgForStrengthRecentComparison * 1 +\n // // xgAgainstStrengthRecentComparison * 1 +\n // homeAwayPointAverageComparison * 2 +\n // goalDiffHomeOrAwayComparison * 0 +\n // // xgActualComparison * 1 +\n // // xgForComparison * 1 +\n // // xgAgainstComparison * 1 +\n // oddsComparison * 0 +\n // // dangerousAttacksWithConverstionComparison * 0.05 +\n // overallDirectnessComparison * 0 +\n // accuracyComparison * 1;\n // let homeWinOutcomeProbability =\n // match.homeTeamWinPercentage + match.awayTeamLossPercentage;\n // let awayWinOutcomeProbability =\n // match.homeTeamLossPercentage + match.awayTeamWinPercentage;\n // let drawOutcomeProbability =\n // match.homeTeamDrawPercentage + match.awayTeamDrawPercentage;\n // if (\n // drawOutcomeProbability > homeWinOutcomeProbability &&\n // drawOutcomeProbability > awayWinOutcomeProbability\n // ) {\n // switch (true) {\n // case drawOutcomeProbability > 100:\n // calculation = calculation / 3;\n // break;\n // default:\n // calculation = calculation * 1;\n // break;\n // }\n // } else {\n // calculation = calculation * 1;\n // }\n // if (calculation > 0) {\n // if (\n // homeForm.lastGame === \"L\" ||\n // homeForm.last2Points < 2 ||\n // awayForm.last2Points >= 5 ||\n // match.XGdifferentialValueRaw < 0\n // ) {\n // calculation = calculation / 2;\n // }\n // } else if (calculation < 0) {\n // if (\n // awayForm.lastGame === \"L\" ||\n // awayForm.last2Points < 2 ||\n // homeForm.last2Points >= 5 ||\n // match.XGdifferentialValueRaw > 0\n // ) {\n // calculation = calculation / 2;\n // }\n // }\n // // if (homeForm.averageOddsHome !== null || awayForm.averageOddsAway !== null) {\n // // if (\n // // calculation > 0 &&\n // // homeForm.averageOddsHome < match.homeOdds &&\n // // awayForm.averageOddsAway > match.awayOdds\n // // ) {\n // // calculation = calculation / 2;\n // // } else if (\n // // calculation > 0 &&\n // // homeForm.averageOddsHome > match.homeOdds &&\n // // awayForm.averageOddsAway < match.awayOdds\n // // ) {\n // // calculation = calculation * 1.25;\n // // } else {\n // // calculation = calculation * 1;\n // // }\n // // if (\n // // calculation < 0 &&\n // // awayForm.averageOddsAway < match.awayOdds &&\n // // homeForm.averageOddsHome > match.homeOdds\n // // ) {\n // // calculation = calculation / 2;\n // // } else if (\n // // calculation < 0 &&\n // // awayForm.averageOddsAway > match.awayOdds &&\n // // homeForm.averageOddsHome < match.homeOdds\n // // ) {\n // // calculation = calculation * 1.25;\n // // } else {\n // // calculation = calculation * 1;\n // // }\n // // }\n // if (\n // calculation > 0 &&\n // homeForm.improving === true &&\n // awayForm.improving === false\n // ) {\n // console.log(homeForm);\n // calculation = calculation * 1.5;\n // } else if (\n // calculation < 0 &&\n // awayForm.improving === true &&\n // awayForm.improving === false\n // ) {\n // calculation = calculation * 1.5;\n // } else if (\n // calculation > 0 &&\n // homeForm.improving === false &&\n // awayForm.improving === true\n // ) {\n // calculation = calculation / 2;\n // } else if (\n // calculation < 0 &&\n // awayForm.improving === false &&\n // homeForm.improving === true\n // ) {\n // calculation = calculation / 2;\n // }\n // // if (\n // // (calculation < 0 && homeForm.oddsReliabilityWin < 50) ||\n // // (calculation < 0 && awayForm.oddsReliabilityWinAsUnderdog > 45)\n // // ) {\n // // calculation = calculation / 2;\n // // } else if (\n // // (calculation > 0 && awayForm.oddsReliabilityWin < 50) ||\n // // (calculation > 0 && homeForm.oddsReliabilityWinAsUnderdog > 45)\n // // ) {\n // // calculation = calculation / 2;\n // // }\n // // if (calculation < 0 && homeForm.predictabilityScore < 0.3) {\n // // calculation = calculation / 2;\n // // } else if (calculation > 0 && awayForm.predictabilityScore < 0.3) {\n // // calculation = calculation / 2;\n // // }\n // return calculation;\n}\n\nexport async function roundCustom(num, form, otherForm) {\n let wholeNumber = Math.floor(num);\n let remainder = num - wholeNumber;\n let goals;\n\n switch (true) {\n case remainder >= 0.9:\n switch (true) {\n default:\n goals = Math.round(num);\n break;\n }\n break;\n case remainder >= 0.8 && remainder < 0.9:\n switch (true) {\n case form.actualToXGDifference >= 0:\n goals = Math.ceil(num);\n break;\n case form.actualToXGDifference < 0:\n goals = Math.floor(num);\n break;\n default:\n goals = Math.round(num);\n break;\n }\n break;\n case remainder >= 0.6 && remainder < 0.8:\n switch (true) {\n case form.actualToXGDifference >= 10:\n goals = Math.ceil(num);\n break;\n case form.actualToXGDifference < 10:\n goals = Math.floor(num);\n break;\n default:\n goals = Math.round(num);\n break;\n }\n break;\n case remainder >= 0.5 && remainder < 0.6:\n switch (true) {\n case form.actualToXGDifference >= 20:\n goals = Math.ceil(num);\n break;\n case form.actualToXGDifference < 20:\n goals = Math.floor(num);\n break;\n default:\n goals = Math.round(num);\n break;\n }\n break;\n default:\n goals = Math.floor(num);\n break;\n }\n\n return goals;\n\n // if (remainder > 0.5) {\n // return Math.ceil(num);\n // } else {\n // return Math.floor(num);\n // }\n}\n\n//Calculates scores based on prior XG figures, weighted by odds\nlet i = 0;\n\nexport async function calculateScore(match, index, divider, calculate) {\n i++;\n\n let teams;\n\n if (\n calculate === true &&\n allForm.find(\n (game) =>\n game.home.teamName === match.homeTeam &&\n game.away.teamName === match.awayTeam\n )\n ) {\n teams = [\n allForm.find((game) => game.home.teamName === match.homeTeam).home,\n allForm.find((game) => game.away.teamName === match.awayTeam).away,\n ];\n } else {\n calculate = false;\n }\n\n let formHome;\n let formAway;\n\n if (calculate) {\n for (let i = 0; i < teams.length; i++) {\n if (teams[0][index].PlayedHome <= 1 || teams[1][index].PlayedAway <= 1) {\n index = 2;\n divider = 10;\n }\n\n teams[i][index].lastGame = teams[i][index].LastFiveForm[4];\n teams[i][index].previousToLastGame = teams[i][index].LastFiveForm[3];\n\n let last2 = [\n teams[i][index].lastGame,\n teams[i][index].previousToLastGame,\n ];\n\n teams[i][index].last2Points = getPointsFromLastX(last2);\n\n teams[i][index].twoGameAverage = await getPointAverage(\n teams[i][index].last2Points,\n 2\n );\n teams[i][index].threeGameAverage = await getPointAverage(\n teams[i][index].last3Points,\n 3\n );\n teams[i][index].fiveGameAverage = await getPointAverage(\n teams[i][index].last5Points,\n 5\n );\n teams[i][index].sixGameAverage = await getPointAverage(\n teams[i][index].last6Points,\n 6\n );\n teams[i][index].tenGameAverage = await getPointAverage(\n teams[i][index].last10Points,\n 10\n );\n\n if (teams[i][index].formRun) {\n teams[i][index].lastHomeOrAwayPoints = getPointsFromLastX(\n teams[i][index].formRun\n );\n\n teams[i][index].homeOrAwayAverage = await getPointAverage(\n teams[i][index].lastHomeOrAwayPoints,\n teams[i][index].formRun.length\n );\n }\n\n teams[i][0].ScoredAverage = teams[i][0].ScoredOverall / 5;\n teams[i][1].ScoredAverage = teams[i][1].ScoredOverall / 6;\n teams[i][2].ScoredAverage = teams[i][2].ScoredOverall / 10;\n\n teams[i][0].ConcededAverage = teams[i][0].ConcededOverall / 5;\n teams[i][1].ConcededAverage = teams[i][1].ConcededOverall / 6;\n teams[i][2].ConcededAverage = teams[i][2].ConcededOverall / 10;\n\n if (teams[i][1].ScoredAverage === 0) {\n teams[i][1].ScoredAverage = teams[i][index].ScoredOverall / 10;\n teams[i][1].ScoredOverall = teams[i][2].ScoredOverall / 2;\n }\n\n if (teams[i][1].ConcededAverage === 0) {\n teams[i][1].ConcededAverage = teams[i][index].ConcededOverall / 10;\n teams[i][1].ConcededOverall = teams[i][2].ConcededOverall / 2;\n }\n\n teams[i][index].ScoredAverageShortTerm = teams[i][0].ScoredOverall / 5;\n teams[i][index].ConcededAverageShortTerm =\n teams[i][0].ConcededOverall / 5;\n\n teams[i][index].longTermAverageGoals = teams[i][2].ScoredOverall / 10;\n teams[i][index].longTermAverageConceeded =\n teams[i][2].ConcededOverall / 10;\n\n let recentGoalDiff =\n teams[i][index].ScoredAverageShortTerm -\n teams[i][index].ConcededAverageShortTerm;\n let distantGoalDiff =\n teams[i][index].longTermAverageGoals -\n teams[i][index].longTermAverageConceeded;\n\n let recentDA = teams[i][0].AverageDangerousAttacksOverall;\n let distantDA = teams[i][2].AverageDangerousAttacksOverall;\n\n let recentPosession = teams[i][0].AveragePossessionOverall;\n let distantPosession = teams[i][2].AveragePossessionOverall;\n\n let recentCleanSheet = teams[i][0].CleanSheetPercentage;\n let distantCleanSheet = teams[i][2].CleanSheetPercentage;\n\n let recentFormArray = [\n recentGoalDiff,\n recentDA,\n recentPosession,\n recentCleanSheet,\n ];\n let distantFormArray = [\n distantGoalDiff,\n distantDA,\n distantPosession,\n distantCleanSheet,\n ];\n\n teams[i][index].formTrendScore = await compareFormTrend(\n recentFormArray,\n distantFormArray\n );\n\n teams[i][index].expectedGoals = parseFloat(teams[i][index].XG);\n\n teams[i][index].ScoredAverageShortAndLongTerm =\n (teams[i][index].ScoredOverall / 10 +\n teams[i][index].ScoredAverageShortTerm) /\n 2;\n\n teams[i][index].conceededAverageShortAndLongTerm =\n (teams[i][index].ConcededOverall / 10 +\n teams[i][index].ConcededAverageShortTerm) /\n 2;\n\n teams[i][index].longTermGoalDifference =\n teams[i][2].ScoredAverage - teams[i][2].ConcededAverage;\n\n teams[i][index].shortTermGoalDifference =\n teams[i][0].ScoredAverage - teams[i][0].ConcededAverage;\n\n teams[i][index].XGdifferential = await diff(\n teams[i][index].XGOverall,\n teams[i][index].XGAgainstAvgOverall\n );\n\n teams[i][index].XGdifferentialRecent = await diff(\n teams[i][0].XGOverall,\n teams[i][0].XGAgainstAvgOverall\n );\n\n teams[i][index].actualToXGDifferenceRecent = await diff(\n teams[i][index].shortTermGoalDifference,\n teams[i][index].XGdifferentialRecent\n );\n }\n\n homeOdds = match.homeOdds;\n awayOdds = match.awayOdds;\n\n formHome = teams[0][index];\n formAway = teams[1][index];\n\n // if (\n // (formHome.XGOverall - formHome.XGAgainstAvgOverall) < (formHome.last5XG - formHome.XGAgainstlast5)\n // ) {\n // formHome.improving = true;\n // } else {\n // formHome.improving = false;\n // }\n\n // if (\n // (formAway.XGOverall - formAway.XGAgainstAvgOverall) < (formAway.last5XG - formAway.XGAgainstlast5)\n // ) {\n // formAway.improving = true;\n // } else {\n // formAway.improving = false;\n // }\n\n let homeTenGameAvg = formHome.last10Points / 10;\n let awayTenGameAvg = formAway.last10Points / 10;\n\n let homeTwoGameAvg = formHome.last2Points / 2;\n let awayTwoGameAvg = formAway.last2Points / 2;\n\n let pointsDiff10 = await getPointsDifferential(\n homeTenGameAvg,\n awayTenGameAvg\n );\n\n let pointsDiff2 = await getPointsDifferential(\n homeTwoGameAvg,\n awayTwoGameAvg\n );\n\n let [last10WeightingHome, last10WeightingAway] = await getPointWeighting(\n pointsDiff10\n );\n\n let [last2WeightingHome, last2WeightingAway] = await getPointWeighting(\n pointsDiff2\n );\n\n formHome.dangerousAttackConversion =\n (formHome.ScoredAverageShortAndLongTerm /\n formHome.AverageDangerousAttacksOverall) *\n 100;\n formAway.dangerousAttackConversion =\n (formAway.ScoredAverageShortAndLongTerm /\n formAway.AverageDangerousAttacksOverall) *\n 100;\n\n [formHome.clinicalRating, formHome.clinicalScore] = await getClinicalRating(\n formHome\n );\n [formAway.clinicalRating, formAway.clinicalScore] = await getClinicalRating(\n formAway\n );\n\n let XGdifferential = await diff(\n formHome.XGdifferential,\n formAway.XGdifferential\n );\n\n formHome.teamName = match.homeTeam;\n formAway.teamName = match.awayTeam;\n\n match.XGdifferentialValue = Math.abs(XGdifferential);\n match.XGdifferentialValueRaw = parseFloat(XGdifferential);\n if (\n allLeagueResultsArrayOfObjects[match.leagueIndex].fixtures.length > 10 &&\n match.leagueID !== 7956\n ) {\n [\n formHome.predictedGoalsBasedOnHomeAv,\n formHome.predictedGoalsBasedOnAwayAv,\n formHome.allTeamGoalsBasedOnAverages,\n formHome.predictedGoalsConceededBasedOnHomeAv,\n formHome.predictedGoalsConceededBasedOnAwayAv,\n formHome.allTeamGoalsConceededBasedOnAverages,\n formHome.averageOddsHome,\n formHome.averageOddsAway,\n formHome.averageScoredLeague,\n formHome.averageConceededLeague,\n formHome.last10btts,\n formHome.last10bttsHome,\n formHome.last10bttsAway,\n match.bttsAllPercentageHome,\n match.bttsPercentageHomeHome,\n match.bttsPercentageHomeAway,\n formHome.forAndAgainstRollingAvHomeOrAway,\n formHome.forAndAgainstRollingAv,\n ] = await getPastLeagueResults(match.homeTeam, match, \"home\", formHome);\n\n [\n formAway.predictedGoalsBasedOnHomeAv,\n formAway.predictedGoalsBasedOnAwayAv,\n formAway.allTeamGoalsBasedOnAverages,\n formAway.predictedGoalsConceededBasedOnHomeAv,\n formAway.predictedGoalsConceededBasedOnAwayAv,\n formAway.allTeamGoalsConceededBasedOnAverages,\n formAway.averageOddsHome,\n formAway.averageOddsAway,\n formAway.averageScoredLeague,\n formAway.averageConceededLeague,\n formAway.last10btts,\n formAway.last10bttsHome,\n formAway.last10bttsAway,\n match.bttsAllPercentageAway,\n match.bttsPercentageAwayHome,\n match.bttsPercentageAwayAway,\n formAway.forAndAgainstRollingAvHomeOrAway,\n formAway.forAndAgainstRollingAv,\n ] = await getPastLeagueResults(match.awayTeam, match, \"away\", formAway);\n } else {\n formHome.completeData = false;\n formHome.predictedGoalsBasedOnHomeAv = formHome.ScoredAverage;\n formHome.predictedGoalsBasedOnAwayAv = formHome.ConcededAverage;\n formHome.allTeamGoalsBasedOnAverages = formHome.ScoredAverage;\n formHome.forAndAgainstRollingAv = {\n goalsFor: formHome.ScoredAverage,\n goalsAgainst: formHome.ConcededAverage,\n };\n formHome.forAndAgainstRollingAvHomeOrAway = {\n goalsFor: formHome.ScoredAverage,\n goalsAgainst: formHome.ConcededAverage,\n };\n formHome.predictedGoalsConceededBasedOnHomeAv = formHome.ConcededAverage;\n formHome.predictedGoalsConceededBasedOnAwayAv = formHome.ConcededAverage;\n formHome.allTeamGoalsConceededBasedOnAverages = formHome.ConcededAverage;\n formHome.averageOddsHome = null;\n formHome.averageOddsAway = null;\n formHome.averageScoredLeague = null;\n formHome.averageConceededLeague = null;\n formHome.goalDifference =\n formHome.ScoredOverall - formHome.ConcededOverall;\n formHome.goalDifferenceHomeOrAway =\n formHome.ScoredOverall - formHome.ConcededOverall;\n formHome.last10btts = null;\n formHome.last10bttsHome = null;\n formHome.last10bttsAway = null;\n formHome.allTeamResults = [];\n formHome.resultsAll = [];\n formHome.resultsHome = [];\n formHome.resultsAway = [];\n match.bttsAllPercentageHome = \"\";\n match.bttsPercentageHomeHome = \"\";\n match.bttsPercentageHomeAway = \"\";\n formAway.completeData = false;\n formAway.predictedGoalsBasedOnHomeAv = formAway.ScoredAverage;\n formAway.predictedGoalsBasedOnAwayAv = formAway.ConcededAverage;\n formAway.allTeamGoalsBasedOnAverages = formAway.ScoredAverage;\n formAway.forAndAgainstRollingAv = {\n goalsFor: formAway.ScoredAverage,\n goalsAgainst: formAway.ConcededAverage,\n };\n formAway.forAndAgainstRollingAvHomeOrAway = {\n goalsFor: formAway.ScoredAverage,\n goalsAgainst: formAway.ConcededAverage,\n };\n formAway.predictedGoalsConceededBasedOnHomeAv = formAway.ConcededAverage;\n formAway.predictedGoalsConceededBasedOnAwayAv = formAway.ConcededAverage;\n formAway.allTeamGoalsConceededBasedOnAverages = formAway.ConcededAverage;\n formAway.averageOddsHome = null;\n formAway.averageOddsAway = null;\n formAway.averageScoredLeague = null;\n formAway.averageConceededLeague = null;\n formAway.goalDifference =\n formAway.ScoredOverall - formAway.ConcededOverall;\n formAway.goalDifferenceHomeOrAway =\n formAway.ScoredOverall - formAway.ConcededOverall;\n\n formAway.last10btts = null;\n formAway.last10bttsHome = null;\n formAway.last10bttsAway = null;\n formAway.allTeamResults = [];\n formAway.resultsAll = [];\n formAway.resultsHome = [];\n formAway.resultsAway = [];\n match.bttsAllPercentageAway = \"\";\n match.bttsPercentageAwayHome = \"\";\n match.bttsPercentageAwayAway = \"\";\n }\n\n if (\n typeof formHome.homeTeamHomePositionRaw === \"number\" &&\n typeof formAway.awayTeamAwayPositionRaw === \"number\"\n ) {\n formHome.homePositionHomeOnly = parseFloat(\n formHome.homeTeamHomePositionRaw\n );\n formAway.awayPositionAwayOnly = parseFloat(\n formAway.awayTeamAwayPositionRaw\n );\n formHome.homePosition = parseFloat(formHome.homeRawPosition);\n formAway.awayPosition = parseFloat(formAway.awayRawPosition);\n } else {\n formHome.homePositionHomeOnly = \"N/A\";\n formAway.awayPositionAwayOnly = \"N/A\";\n formHome.homePosition = \"N/A\";\n formAway.awayPosition = \"N/A\";\n }\n\n if (formHome.last10Goals && formAway.last10Goals !== 0) {\n if (\n formHome.last5Goals - formHome.last5GoalsConceeded >\n formHome.last10Goals - formHome.last10GoalsConceeded\n ) {\n formHome.improving = true;\n } else {\n formHome.improving = false;\n }\n\n if (\n formAway.last5Goals - formAway.last5GoalsConceeded >\n formAway.last10Goals - formAway.last10GoalsConceeded\n ) {\n formAway.improving = true;\n } else {\n formAway.improving = false;\n }\n }\n\n formHome.AttackingPotency = (formHome.XG / formHome.AttacksHome) * 100;\n formAway.AttackingPotency = (formAway.XG / formAway.AttacksAverage) * 100;\n\n let teamComparisonScore;\n\n const attackingMetricsHome = {\n \"Average Dangerous Attacks\": formHome.AverageDangerousAttacksOverall,\n \"Average Shots\": formHome.AverageShots,\n \"Average Shots On Target\": formHome.AverageShotsOnTargetOverall ? formHome.AverageShotsOnTargetOverall : formHome.AverageShotsOnTarget,\n \"Average Expected Goals\": formHome.XGOverall ? formHome.XGOverall : formHome.expectedGoals,\n \"Recent XG\": formHome.XGlast5 ? formHome.XGlast5 : formHome.XGOverall,\n \"Average Goals\": formHome.avgScored ? formHome.avgScored : formHome.ScoredAverage,\n Corners: formHome.AverageCorners ? formHome.AverageCorners : formHome.CornersAverage,\n };\n\n const attackingMetricsHomeLast5 = {\n \"Average Dangerous Attacks\": formHome.avDALast5 ? formHome.avDALast5 : formHome.AverageDangerousAttacksOverall,\n \"Average Shots\": formHome.avShotsLast5 ? formHome.avShotsLast5 : formHome.AverageShots,\n \"Average Shots On Target\": formHome.avSOTLast5 ? formHome.avSOTLast5 : formHome.AverageShotsOnTarget,\n \"Average Expected Goals\": formHome.XGlast5 ? formHome.XGlast5 : formHome.XGOverall,\n \"Recent XG\": formHome.XGlast5 ? formHome.XGlast5 : formHome.XGOverall,\n \"Average Goals\": formHome.avScoredLast5 ? formHome.avScoredLast5 : formHome.ScoredAverage,\n Corners: formHome.avCornersLast5 ? formHome.avCornersLast5 : formHome.CornersAverage,\n };\n\n const attackingMetricsHomeOnly = {\n \"Average Dangerous Attacks\": formHome.avgDangerousAttacksHome ? formHome.avgDangerousAttacksHome : formHome.AverageDangerousAttacksOverall,\n \"Average Shots\": formHome.avgShotsHome ? formHome.avgShotsHome : formHome.AverageShots,\n \"Average Shots On Target\": formHome.avgShotsOnTargetHome ? formHome.avgShotsOnTargetHome : formHome.AverageShotsOnTarget,\n \"Average Expected Goals\": formHome.avgXGScoredHome ? formHome.avgXGScoredHome : formHome.XGOverall,\n \"Recent XG\": formHome.last5XGAvgForHome ? formHome.last5XGAvgForHome : formHome.XGOverall,\n \"Average Goals\": formHome.avgScoredHome ? formHome.avgScoredHome : formHome.ScoredAverage,\n Corners: formHome.cornersAvHome ? formHome.cornersAvHome : formHome.CornersAverage,\n };\n\n const attackingMetricsAwayOnly = {\n \"Average Dangerous Attacks\": formAway.avgDangerousAttacksAway ? formAway.avgDangerousAttacksAway : formAway.AverageDangerousAttacksOverall,\n \"Average Shots\": formAway.avgShotsAway ? formAway.avgShotsAway : formAway.AverageShots,\n \"Average Shots On Target\": formAway.avgShotsOnTargetAway ? formAway.avgShotsOnTargetAway : formAway.AverageShotsOnTarget,\n \"Average Expected Goals\": formAway.avgXGScoredAway ? formAway.avgXGScoredAway : formAway.XGOverall,\n \"Recent XG\": formAway.last5XGAvgForAway ? formAway.last5XGAvgForAway : formAway.XGOverall,\n \"Average Goals\": formAway.avgScoredAway ? formAway.avgScoredAway : formAway.ScoredAverage,\n Corners: formAway.cornersAvAway ? formAway.cornersAvAway : formAway.CornersAverage,\n };\n\n const attackingMetricsAway = {\n \"Average Dangerous Attacks\": formAway.AverageDangerousAttacksOverall,\n \"Average Shots\": formAway.AverageShots,\n \"Average Shots On Target\": formAway.AverageShotsOnTargetOverall ? formAway.AverageShotsOnTargetOverall : formAway.AverageShotsOnTarget,\n \"Average Expected Goals\": formAway.XGOverall ? formAway.XGOverall : formAway.expectedGoals,\n \"Recent XG\": formAway.XGlast5 ? formAway.XGlast5 : formAway.XGOverall,\n \"Average Goals\": formAway.avgScored ? formAway.avgScored : formAway.ScoredAverage,\n Corners: formAway.AverageCorners ? formAway.AverageCorners : formAway.CornersAverage,\n };\n\n const attackingMetricsAwayLast5 = {\n \"Average Dangerous Attacks\": formAway.avDALast5 ? formAway.avDALast5 : formAway.AverageDangerousAttacksOverall,\n \"Average Shots\": formAway.avShotsLast5 ? formAway.avShotsLast5 : formAway.AverageShots,\n \"Average Shots On Target\": formAway.avSOTLast5 ? formAway.avSOTLast5 : formAway.AverageShotsOnTarget,\n \"Average Expected Goals\": formAway.XGlast5 ? formAway.XGlast5 : formAway.XGOverall,\n \"Recent XG\": formAway.XGlast5 ? formAway.XGlast5 : formAway.XGOverall,\n \"Average Goals\": formAway.avScoredLast5 ? formAway.avScoredLast5 : formAway.ScoredAverage,\n Corners: formAway.avCornersLast5 ? formAway.avCornersLast5 : formAway.CornersAverage,\n };\n\n const defensiveMetricsHome = {\n \"Average XG Against\": formHome.XGAgainstAvgOverall ? formHome.XGAgainstAvgOverall : formHome.XGAgainstAvgOverall,\n \"Recent XG Against\": formHome.XGAgainstlast5\n ? formHome.XGAgainstlast5\n : formHome.XGAgainstAvgOverall,\n \"Average Goals Against\": formHome.avgConceeded ? formHome.avgConceeded : formHome.ConcededAverage,\n \"Average SOT Against\": formHome.AverageShotsOnTargetAgainstOverall ? formHome.AverageShotsOnTargetAgainstOverall : 5,\n };\n\n const defensiveMetricsHomeLast5 = {\n \"Average XG Against\": formHome.XGAgainstlast5 ? formHome.XGAgainstlast5 : formHome.XGAgainstAvgOverall,\n \"Recent XG Against\": formHome.avXGAgainstLast5 ? formHome.avXGAgainstLast5 : formHome.XGAgainstAvgOverall,\n \"Average Goals Against\": formHome.avConceededLast5 ? formHome.avConceededLast5 : formHome.ConcededAverage,\n \"Average SOT Against\": formHome.avSOTAgainstLast5 ? formHome.avSOTAgainstLast5 : 5,\n };\n\n const defensiveMetricsAway = {\n \"Average XG Against\": formAway.XGAgainstAvgOverall ? formAway.XGAgainstAvgOverall : formAway.XGAgainstAvgOverall,\n \"Recent XG Against\": formAway.XGAgainstlast5\n ? formAway.XGAgainstlast5\n : formAway.XGAgainstAvgOverall,\n \"Average Goals Against\": formAway.avgConceeded ? formAway.avgConceeded : formAway.ConcededAverage,\n \"Average SOT Against\": formAway.AverageShotsOnTargetAgainstOverall ? formAway.AverageShotsOnTargetAgainstOverall : 5,\n };\n\n const defensiveMetricsAwayLast5 = {\n \"Average XG Against\": formAway.XGAgainstlast5 ? formAway.XGAgainstlast5 : formAway.XGAgainstAvgOverall,\n \"Recent XG Against\": formAway.avXGAgainstLast5 ? formAway.avXGAgainstLast5 : formAway.XGAgainstAvgOverall,\n \"Average Goals Against\": formAway.avConceededLast5 ? formAway.avConceededLast5 : formAway.ConcededAverage,\n \"Average SOT Against\": formAway.avSOTAgainstLast5 ? formAway.avSOTAgainstLast5 : 5,\n };\n\n const defensiveMetricsHomeOnly = {\n \"Average XG Against\": formHome.avgXGConceededHome ? formHome.avgXGConceededHome : formHome.XGAgainstAvgOverall,\n \"Recent XG Against\": formHome.last5XGAvgAgainstHome ? formHome.last5XGAvgAgainstHome : formHome.XGAgainstAvgOverall,\n \"Average Goals Against\": formHome.teamConceededAvgHomeOnly ? formHome.teamConceededAvgHomeOnly : formHome.ConcededAverage,\n \"Average SOT Against\": formHome.avgShotsOnTargetAgainstHome ? formHome.avgShotsOnTargetAgainstHome : 5,\n };\n\n const defensiveMetricsAwayOnly = {\n \"Average XG Against\": formAway.avgXGConceededAway ? formAway.avgXGConceededAway : formAway.XGAgainstAvgOverall,\n \"Recent XG Against\": formAway.last5XGAvgAgainstAway ? formAway.last5XGAvgAgainstAway : formAway.XGAgainstAvgOverall,\n \"Average Goals Against\": formAway.teamConceededAvgAwayOnly ? formAway.teamConceededAvgAwayOnly : formAway.ConcededAverage,\n \"Average SOT Against\": formAway.avgShotsOnTargetAgainstAway ? formAway.avgShotsOnTargetAgainstAway : 5,\n };\n\n formHome.attackingMetrics = attackingMetricsHome;\n formHome.defensiveMetrics = defensiveMetricsHome;\n formAway.attackingMetrics = attackingMetricsAway;\n formAway.defensiveMetrics = defensiveMetricsAway;\n\n formHome.attackingStrength = await calculateAttackingStrength(\n attackingMetricsHome\n );\n\n formHome.attackingStrengthScoreGeneration =\n await calculateAttackingStrength(attackingMetricsHome);\n\n formHome.attackingStrengthLast5 = await calculateAttackingStrength(\n attackingMetricsHomeLast5\n );\n\n formHome.attackingStrengthHomeOnly = await calculateAttackingStrength(\n attackingMetricsHomeOnly\n );\n\n formAway.attackingStrength = await calculateAttackingStrength(\n attackingMetricsAway\n );\n\n formAway.attackingStrengthLast5 = await calculateAttackingStrength(\n attackingMetricsAwayLast5\n );\n\n formAway.attackingStrengthAwayOnly = await calculateAttackingStrength(\n attackingMetricsAwayOnly\n );\n\n formHome.defensiveStrength = await calculateDefensiveStrength(\n defensiveMetricsHome\n );\n\n formHome.defensiveStrengthScoreGeneration =\n await calculateDefensiveStrength(defensiveMetricsHome, 1);\n\n formHome.defensiveStrengthLast5 = await calculateDefensiveStrength(\n defensiveMetricsHomeLast5\n );\n\n formHome.defensiveStrengthScoreGenerationLast5 =\n await calculateDefensiveStrength(defensiveMetricsHomeLast5, 1);\n\n formHome.defensiveStrengthHomeOnly = await calculateDefensiveStrength(\n defensiveMetricsHomeOnly\n );\n\n formHome.defensiveStrengthScoreGenerationHomeOnly =\n await calculateDefensiveStrength(defensiveMetricsHomeOnly, 1);\n\n formAway.defensiveStrength = await calculateDefensiveStrength(\n defensiveMetricsAway\n );\n\n formAway.defensiveStrengthScoreGeneration =\n await calculateDefensiveStrength(defensiveMetricsAway, 1);\n\n formAway.defensiveStrengthLast5 = await calculateDefensiveStrength(\n defensiveMetricsAwayLast5\n );\n\n formAway.defensiveStrengthScoreGenerationLast5 =\n await calculateDefensiveStrength(defensiveMetricsAwayLast5, 1);\n\n formAway.defensiveStrengthAwayOnly = await calculateDefensiveStrength(\n defensiveMetricsAwayOnly\n );\n\n formAway.defensiveStrengthScoreGenerationAwayOnly =\n await calculateDefensiveStrength(defensiveMetricsAwayOnly, 1);\n\n formHome.possessionStrength = await calculateMetricStrength(\n \"averagePossession\",\n formHome.AveragePossessionOverall ? formHome.AveragePossessionOverall : formHome.AveragePossessionOverall\n );\n\n formHome.possessionStrengthLast5 = await calculateMetricStrength(\n \"averagePossession\",\n formHome.avPosessionLast5 ? formHome.avPosessionLast5 : formHome.AveragePossessionOverall\n );\n\n\n formHome.possessionStrengthHomeOnly = await calculateMetricStrength(\n \"averagePossession\",\n formHome.avgPossessionHome ? formHome.avgPossessionHome : formHome.AveragePossessionOverall\n );\n\n formAway.possessionStrengthLast5 = await calculateMetricStrength(\n \"averagePossession\",\n formAway.avPosessionLast5 ? formAway.avPosessionLast5 : formAway.AveragePossessionOverall\n );\n\n formAway.possessionStrength = await calculateMetricStrength(\n \"averagePossession\",\n formAway.AveragePossessionOverall ? formAway.AveragePossessionOverall : formAway.AveragePossessionOverall\n );\n\n formAway.possessionStrengthAwayOnly = await calculateMetricStrength(\n \"averagePossession\",\n formAway.avgPossessionAway ? formAway.avgPossessionAway : formAway.AveragePossessionOverall\n );\n\n formHome.directnessOverall =\n (formHome.AverageShots / formHome.AveragePossessionOverall) * 10;\n\n formHome.directnessOverallLast5 =\n (formHome.avShotsLast5 / formHome.avPosessionLast5) * 10;\n\n formAway.directnessOverallLast5 =\n (formAway.avShotsLast5 / formAway.avPosessionLast5) * 10;\n\n formHome.directnessHomeOnly =\n (formHome.avgShotsHome / formHome.avgPossessionHome) * 10;\n\n formAway.directnessOverall =\n (formAway.AverageShots / formAway.AveragePossessionOverall) * 10;\n\n formAway.directnessAwayOnly =\n (formAway.avgShotsAway / formAway.avgPossessionAway) * 10;\n\n formHome.directnessOverallStrength = await calculateMetricStrength(\n \"directnessOverall\",\n formHome.directnessOverall\n );\n\n formHome.directnessOverallStrengthLast5 = await calculateMetricStrength(\n \"directnessOverall\",\n formHome.directnessOverallLast5\n );\n\n formHome.directnessHomeStrength = await calculateMetricStrength(\n \"directnessOverall\",\n formHome.directnessHomeOnly\n );\n\n formAway.directnessOverallStrength = await calculateMetricStrength(\n \"directnessOverall\",\n formAway.directnessOverall\n );\n\n formAway.directnessOverallStrengthLast5 = await calculateMetricStrength(\n \"directnessOverall\",\n formAway.directnessOverallLast5\n );\n\n formAway.directnessAwayStrength = await calculateMetricStrength(\n \"directnessOverall\",\n formAway.directnessAwayOnly\n );\n\n formHome.shootingAccuracy =\n (formHome.AverageShotsOnTargetOverall ? formHome.AverageShotsOnTargetOverall : formHome.AverageShotsOnTarget / formHome.avgShots) *\n formHome.AverageShotsOnTargetOverall ? formHome.AverageShotsOnTargetOverall : formHome.AverageShotsOnTarget;\n\n formHome.shootingAccuracyLast5 =\n (formHome.avSOTLast5 / formHome.avShotsLast5) * formHome.avSOTLast5;\n\n formAway.shootingAccuracyLast5 =\n (formAway.avSOTLast5 / formAway.avShotsLast5) * formAway.avSOTLast5;\n\n formHome.shootingAccuracyHomeOnly =\n (formHome.avgShotsOnTargetHome / formHome.avgShotsHome) *\n formHome.avgShotsOnTargetHome;\n\n formAway.shootingAccuracy =\n (formAway.AverageShotsOnTargetOverall ? formAway.AverageShotsOnTargetOverall : formAway.AverageShotsOnTarget / formAway.avgShots) *\n formAway.AverageShotsOnTargetOverall ? formAway.AverageShotsOnTargetOverall : formAway.AverageShotsOnTarget;\n\n formAway.shootingAccuracyAwayOnly =\n (formAway.avgShotsOnTargetAway / formAway.avgShotsAway) *\n formAway.avgShotsOnTargetAway;\n\n formHome.accuracyOverallStrength = await calculateMetricStrength(\n \"accuracyOverall\",\n formHome.shootingAccuracy\n );\n\n formHome.accuracyOverallStrengthLast5 = await calculateMetricStrength(\n \"accuracyOverall\",\n formHome.shootingAccuracyLast5\n );\n\n formHome.accuracyHomeStrength = await calculateMetricStrength(\n \"accuracyOverall\",\n formHome.shootingAccuracyHomeOnly\n );\n\n formAway.accuracyOverallStrength = await calculateMetricStrength(\n \"accuracyOverall\",\n formAway.shootingAccuracy\n );\n\n formAway.accuracyOverallStrengthLast5 = await calculateMetricStrength(\n \"accuracyOverall\",\n formAway.shootingAccuracyLast5\n );\n\n formAway.accuracyAwayStrength = await calculateMetricStrength(\n \"accuracyOverall\",\n formAway.shootingAccuracyAwayOnly\n );\n\n formHome.xgForStrength = await calculateMetricStrength(\n \"xgFor\",\n formHome.XGOverall\n );\n\n formHome.xgForStrengthLast5 = await calculateMetricStrength(\n \"xgFor\",\n formHome.XGlast5\n );\n\n formHome.xgForStrengthHomeOnly = await calculateMetricStrength(\n \"xgFor\",\n formHome.avgXGScoredHome\n );\n\n formHome.xgAgainstStrength = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formHome.XGAgainstAvgOverall\n );\n\n formHome.xgAgainstStrengthLast5 = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formHome.XGAgainstlast5\n );\n\n formHome.xgAgainstStrengthHomeOnly = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formHome.avgXGConceededHome\n );\n\n formAway.xgForStrength = await calculateMetricStrength(\n \"xgFor\",\n formAway.XGOverall\n );\n\n formAway.xgForStrengthLast5 = await calculateMetricStrength(\n \"xgFor\",\n formAway.last5XGAvgFor\n );\n\n formAway.xgForStrengthLast5 = await calculateMetricStrength(\n \"xgFor\",\n formAway.XGlast5\n );\n\n formAway.xgForStrengthAwayOnly = await calculateMetricStrength(\n \"xgFor\",\n formAway.avgXGScoredAway\n );\n\n formAway.xgAgainstStrength = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formAway.XGAgainstAvgOverall\n );\n\n formAway.xgAgainstStrengthLast5 = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formAway.XGAgainstlast5\n );\n\n formAway.xgAgainstStrengthAwayOnly = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formAway.avgXGConceededAway\n );\n\n formHome.actualToXGDifference = parseInt(\n await diff(formHome.XGDiffNonAverage, formHome.goalDifference)\n );\n\n formAway.actualToXGDifference = parseInt(\n await diff(formAway.XGDiffNonAverage, formAway.goalDifference)\n );\n\n // teamComparisonScore = await compareTeams(formHome, formAway, match);\n\n [formHome.teamGoalsCalc, formAway.teamGoalsCalc] = await generateGoals(\n formHome,\n formAway,\n match\n );\n\n console.log(formHome.teamGoalsCalc);\n console.log(formAway.teamGoalsCalc);\n\n // teamComparisonScore = teamComparisonScore * 0.3;\n // LEAVE\n\n // if (teamComparisonScore > 0.45) {\n // teamComparisonScore = 0.45;\n // } else if (teamComparisonScore < -0.45) {\n // teamComparisonScore = -0.45;\n // }\n\n // if (teamComparisonScore < 0) {\n // formHome.teamStrengthWeighting = 1 + teamComparisonScore / 1;\n // formAway.teamStrengthWeighting = 1 - teamComparisonScore / 1;\n // } else if (teamComparisonScore >= 0) {\n // formHome.teamStrengthWeighting = 1 + teamComparisonScore / 1;\n // formAway.teamStrengthWeighting = 1 - teamComparisonScore / 1;\n // }\n\n // teamComparisonScore = 0;\n\n // match.teamComparisonScore = teamComparisonScore.toFixed(2);\n // match.goalWeighting = 1 + parseFloat(match.teamComparisonScore)\n\n let team1Metrics = {\n weighting: formHome.teamGoalsCalc,\n // Add other relevant metrics here\n };\n\n let team2Metrics = {\n weighting: formAway.teamGoalsCalc,\n // Add other relevant metrics here\n };\n\n // pass arrays of league goals and conceeded\n let scorePredictions;\n let scorePredictionsHA;\n let scorePredictionsRecent;\n\n if (\n formHome.allConceededArrayHome !== undefined &&\n formAway.allConceededArrayAway !== undefined\n ) {\n scorePredictionsRecent = await predictScore(\n formHome.allGoalsArrayHomeRecent,\n formHome.allConceededArrayHomeRecent,\n formAway.allGoalsArrayAwayRecent,\n formAway.allConceededArrayAwayRecent,\n team1Metrics,\n team2Metrics,\n match.game\n );\n scorePredictionsHA = await predictScore(\n formHome.allGoalsArrayHomeOnly,\n formHome.allConceededArrayHomeOnly,\n formAway.allGoalsArrayAwayOnly,\n formAway.allConceededArrayAwayOnly,\n team1Metrics,\n team2Metrics,\n match.game\n );\n scorePredictions = await predictScore(\n formHome.allGoalsArrayHome,\n formHome.allConceededArrayHome,\n formAway.allGoalsArrayAway,\n formAway.allConceededArrayAway,\n team1Metrics,\n team2Metrics,\n match.game\n );\n }\n\n let finalHomeGoals;\n let finalAwayGoals;\n\n const homeGoalDiff =\n formHome.ScoredAverageShortAndLongTerm -\n formHome.conceededAverageShortAndLongTerm;\n const awayGoalDiff =\n formAway.ScoredAverageShortAndLongTerm -\n formAway.conceededAverageShortAndLongTerm;\n\n formHome.goalsDifferential =\n parseFloat(await diff(homeGoalDiff, awayGoalDiff)) / 1;\n formAway.goalsDifferential =\n parseFloat(await diff(awayGoalDiff, homeGoalDiff)) / 1;\n\n formHome.rollingAverageGoalsDifferential = parseFloat(\n formHome.allTeamGoalsBasedOnAverages -\n formHome.allTeamGoalsConceededBasedOnAverages\n );\n formAway.rollingAverageGoalsDifferential = parseFloat(\n formAway.allTeamGoalsBasedOnAverages -\n formAway.allTeamGoalsConceededBasedOnAverages\n );\n\n match.GoalsInGamesAverageHome =\n formHome.avScoredLast5 + formHome.avConceededLast5;\n\n match.GoalsInGamesAverageAway =\n formAway.avScoredLast5 + formAway.avConceededLast5;\n\n let factorOneHome;\n let factorOneAway;\n\n factorOneHome =\n // homeLeagueOrAllFormAverageGoals * 1 +\n // formHome.last5Goals * 0.5 +\n // formAway.last5GoalsConceeded * 0.5 +\n (formHome.forAndAgainstRollingAvHomeOrAway.goalsFor * 1 +\n formAway.forAndAgainstRollingAvHomeOrAway.goalsAgainst * 1 +\n formHome.forAndAgainstRollingAv.goalsFor * 1 +\n formAway.forAndAgainstRollingAv.goalsAgainst * 1 +\n formHome.allTeamGoalsBasedOnAverages * 0 +\n formAway.allTeamGoalsConceededBasedOnAverages * 0 +\n formHome.XGOverall * 1 +\n formAway.XGAgainstAvgOverall * 1 +\n last10WeightingHome * 0 +\n last2WeightingHome * 0) /\n 6;\n\n factorOneAway =\n // awayLeagueOrAllFormAverageGoals * 1 +\n // formAway.last5Goals * 0.5 +\n // formHome.last5GoalsConceeded * 0.5 +\n (formAway.forAndAgainstRollingAvHomeOrAway.goalsFor * 1 +\n formHome.forAndAgainstRollingAvHomeOrAway.goalsAgainst * 1 +\n formAway.forAndAgainstRollingAv.goalsFor * 1 +\n formHome.forAndAgainstRollingAv.goalsAgainst * 1 +\n formAway.allTeamGoalsBasedOnAverages * 0 +\n formHome.allTeamGoalsConceededBasedOnAverages * 0 +\n formAway.XGOverall * 1 +\n formHome.XGAgainstAvgOverall * 1 +\n last10WeightingAway * 0 +\n last2WeightingAway * 0) /\n 6;\n\n let factorTwoHome;\n let factorTwoAway;\n\n if (\n scorePredictions !== undefined &&\n scorePredictions[0].probability !== 1\n ) {\n factorTwoHome =\n (scorePredictions[0].team1Score +\n scorePredictionsRecent[0].team1Score +\n scorePredictionsHA[0].team1Score * 0.5) /\n 2.5;\n factorTwoAway =\n (scorePredictions[0].team2Score +\n scorePredictionsRecent[0].team2Score +\n scorePredictionsHA[0].team2Score * 0.5) /\n 2.5;\n } else {\n factorTwoHome = factorOneHome;\n factorTwoAway = factorOneAway;\n }\n\n let homeComparisonWeighting;\n let awayComparisonWeighting;\n match.scoreDiff = await diff(factorOneHome, factorOneAway);\n\n if (teamComparisonScore > 0) {\n homeComparisonWeighting = 1 + Math.abs(teamComparisonScore);\n awayComparisonWeighting = 1 + -Math.abs(teamComparisonScore);\n } else if (teamComparisonScore < 0) {\n homeComparisonWeighting = 1 + -Math.abs(teamComparisonScore);\n awayComparisonWeighting = 1 + Math.abs(teamComparisonScore);\n } else {\n homeComparisonWeighting = 1;\n awayComparisonWeighting = 1;\n }\n\n console.log(match.game);\n console.log(match.simlarGameResultsHome);\n console.log(match.simlarGameResultsAway);\n\n // let experimentalHomeGoals = factorOneHome + formHome.teamGoalsCalc;\n let experimentalHomeGoals = factorTwoHome + formHome.teamGoalsCalc;\n\n // (factorOneHome * homeComparisonWeighting +\n // (formHome.teamGoalsCalc * 2) +\n // factorTwoHome) /\n // 4;\n // (formHome.forAndAgainstRollingAvHomeOrAway.goalsFor + formAway.forAndAgainstRollingAvHomeOrAway.goalsAgainst) / 2\n\n // let experimentalAwayGoals = factorOneAway + formAway.teamGoalsCalc;\n let experimentalAwayGoals = factorTwoAway + formAway.teamGoalsCalc;\n\n // (factorOneAway * awayComparisonWeighting +\n // (formAway.teamGoalsCalc * 2) +\n // factorTwoAway) /\n // 4;\n // (formAway.forAndAgainstRollingAvHomeOrAway.goalsFor + formHome.forAndAgainstRollingAvHomeOrAway.goalsAgainst) / 2\n\n let rawFinalHomeGoals = experimentalHomeGoals;\n let rawFinalAwayGoals = experimentalAwayGoals;\n\n // if(rawFinalHomeGoals < 0){\n // rawFinalHomeGoals = 0\n // }\n\n // if(rawFinalAwayGoals < 0){\n // rawFinalAwayGoals = 0\n // }\n\n match.rawFinalHomeGoals = rawFinalHomeGoals;\n match.rawFinalAwayGoals = rawFinalAwayGoals;\n\n // if (rawFinalHomeGoals < 1 && rawFinalHomeGoals > 0 && rawFinalAwayGoals < 1 && rawFinalAwayGoals > 0) {\n // if (\n // formHome.CleanSheetPercentage < 45 &&\n // formAway.CleanSheetPercentage < 45\n // ) {\n // finalHomeGoals = Math.ceil(rawFinalHomeGoals);\n // finalAwayGoals = Math.ceil(rawFinalAwayGoals);\n // } else {\n // finalHomeGoals = Math.floor(rawFinalHomeGoals);\n // finalAwayGoals = Math.floor(rawFinalAwayGoals);\n // }\n // }\n // else if (rawFinalHomeGoals < 0 && rawFinalAwayGoals < 0) {\n // if (\n // formHome.CleanSheetPercentage < 45 &&\n // formAway.CleanSheetPercentage < 45\n // ) {\n // finalHomeGoals = 1;\n // finalAwayGoals = 1;\n // } else {\n // finalHomeGoals = Math.floor(rawFinalHomeGoals);\n // finalAwayGoals = Math.floor(rawFinalAwayGoals);\n // }\n // }\n // else {\n // finalHomeGoals = Math.floor(rawFinalHomeGoals);\n // finalAwayGoals = Math.floor(rawFinalAwayGoals);\n // }\n\n if (rawFinalHomeGoals < 0) {\n rawFinalHomeGoals = 0;\n }\n\n if (rawFinalAwayGoals < 0) {\n rawFinalAwayGoals = 0;\n }\n\n finalHomeGoals = Math.floor(rawFinalHomeGoals);\n finalAwayGoals = Math.floor(rawFinalAwayGoals);\n\n // if (finalHomeGoals > formHome.avgScored + 2) {\n // finalHomeGoals = Math.round((finalHomeGoals + formHome.avgScored) / 2);\n // }\n\n // if (finalAwayGoals > formAway.avgScored + 2) {\n // finalAwayGoals = Math.round((finalAwayGoals + formAway.avgScored) / 2);\n // }\n\n // if (finalAwayGoals < 0) {\n // let difference = Math.abs(\n // parseFloat((await diff(0, finalAwayGoals)) / 2)\n // );\n // rawFinalHomeGoals = rawFinalHomeGoals + difference;\n // finalAwayGoals = 0;\n // }\n\n // if (finalHomeGoals < 0) {\n // let difference = Math.abs(\n // parseFloat((await diff(0, finalHomeGoals)) / 2)\n // );\n // rawFinalAwayGoals = rawFinalAwayGoals + difference;\n // finalHomeGoals = 0;\n // }\n\n console.log(match.omit);\n\n if (match.status !== \"suspended\") {\n if (finalHomeGoals > finalAwayGoals) {\n match.prediction = \"homeWin\";\n homePredictions = homePredictions + 1;\n if (\n formHome.lastGame === \"L\" ||\n formHome.last2Points < 3 ||\n formAway.last2Points > 4 ||\n formHome.oddsReliabilityWin < 50\n ) {\n match.includeInMultis = false;\n } else {\n match.includeInMultis = true;\n }\n } else if (finalAwayGoals > finalHomeGoals) {\n match.prediction = \"awayWin\";\n awayPredictions = awayPredictions + 1;\n if (\n formAway.lastGame === \"L\" ||\n formAway.last2Points < 3 ||\n formHome.last2Points > 4 ||\n formAway.oddsReliabilityWin < 50\n ) {\n match.includeInMultis = false;\n } else {\n match.includeInMultis = true;\n }\n } else if (finalHomeGoals === finalAwayGoals) {\n match.prediction = \"draw\";\n drawPredictions = drawPredictions + 1;\n }\n }\n\n console.log(match.game);\n console.log(finalHomeGoals);\n console.log(finalAwayGoals);\n console.log(match.prediction);\n console.log(match.outcome);\n\n console.log(`drawPredictions: ${drawPredictions}`);\n\n if (\n (XGdifferential > 1 && match.prediction === \"homeWin\") ||\n (XGdifferential < -1.6 && match.prediction === \"awayWin\")\n ) {\n match.XGdifferential = true;\n } else {\n match.XGdifferential = false;\n }\n\n if (\n (pointsDiff10 > 1.2 && match.prediction === \"homeWin\") ||\n (pointsDiff10 < -1.2 && match.prediction === \"awayWin\")\n ) {\n match.pointsDifferential = true;\n match.pointsDifferentialValue = Math.abs(pointsDiff10);\n match.pointsDifferentialValueRaw = parseFloat(pointsDiff10);\n } else {\n match.pointsDiff10 = false;\n match.pointsDifferentialValue = Math.abs(pointsDiff10);\n match.pointsDifferentialValueRaw = parseFloat(pointsDiff10);\n }\n\n let rollingGoalDiffDifferential = await diff(\n formHome.rollingAverageGoalsDifferential,\n formAway.rollingAverageGoalsDifferential\n );\n\n if (\n (rollingGoalDiffDifferential > 1.5 && match.prediction === \"homeWin\") ||\n (rollingGoalDiffDifferential < -1.5 && match.prediction === \"awayWin\")\n ) {\n match.rollingGoalDiff = true;\n match.rollingGoalDiffValue = rollingGoalDiffDifferential;\n } else {\n match.rollingGoalDiff = false;\n match.rollingGoalDiffValue = rollingGoalDiffDifferential;\n }\n\n let dangerousAttacksDifferential = await diff(\n formHome.AverageDangerousAttacksOverall,\n formAway.AverageDangerousAttacksOverall\n );\n\n if (\n (dangerousAttacksDifferential > 20 && match.prediction === \"homeWin\") ||\n (dangerousAttacksDifferential < -20 && match.prediction === \"awayWin\")\n ) {\n match.dangerousAttacksDiff = true;\n match.dangerousAttacksDiffValue = dangerousAttacksDifferential;\n } else {\n match.dangerousAttacksDiff = false;\n match.dangerousAttacksDiffValue = dangerousAttacksDifferential;\n }\n\n switch (true) {\n case match.status !== \"complete\":\n break;\n case match.homeGoals > match.awayGoals:\n match.winner = match.homeTeam;\n match.outcome = \"homeWin\";\n homeOutcomes = homeOutcomes + 1;\n allWinOutcomes = allWinOutcomes + 1;\n allLossOutcomes = allLossOutcomes + 1;\n sumStatDAWin = sumStatDAWin += formHome.AverageDangerousAttacksOverall;\n sumStatDALoss = sumStatDALoss +=\n formAway.AverageDangerousAttacksOverall;\n sumStatPossessionWin = sumStatPossessionWin +=\n formHome.AveragePossessionOverall;\n sumStatPossessionLoss = sumStatPossessionLoss +=\n formAway.AveragePossessionOverall;\n sumStatPPGLast10Win = sumStatPPGLast10Win += formHome.last10Points / 10;\n sumStatPPGLast10Loss = sumStatPPGLast10Loss +=\n formAway.last10Points / 10;\n sumStatSOTWin = sumStatSOTWin += formHome.AverageShotsOnTargetOverall;\n sumStatSOTLoss = sumStatSOTLoss += formAway.AverageShotsOnTargetOverall;\n sumOddsWin = sumOddsWin += homeOdds;\n sumOddsLoss = sumOddsLoss += awayOdds;\n sumXGForWin = sumXGForWin += formHome.XGOverall;\n sumXGForLoss = sumXGForLoss += formAway.XGOverall;\n sumXGAgainstWin = sumXGAgainstWin += formHome.XGAgainstAvgOverall;\n sumXGAgainstLoss = sumXGAgainstLoss += formAway.XGAgainstAvgOverall;\n break;\n case match.homeGoals === match.awayGoals:\n match.winner = \"draw\";\n match.outcome = \"draw\";\n allOutcomes = allOutcomes + 1;\n allDrawOutcomes = allDrawOutcomes + 1;\n break;\n case match.homeGoals < match.awayGoals:\n match.winner = match.awayTeam;\n match.outcome = \"awayWin\";\n allOutcomes = allOutcomes + 1;\n awayOutcomes = awayOutcomes + 1;\n allWinOutcomes = allWinOutcomes + 1;\n allLossOutcomes = allLossOutcomes + 1;\n sumStatDAWin = sumStatDAWin += formAway.AverageDangerousAttacksOverall;\n sumStatDALoss = sumStatDALoss +=\n formHome.AverageDangerousAttacksOverall;\n sumStatPossessionWin = sumStatPossessionWin +=\n formAway.AveragePossessionOverall;\n sumStatPossessionLoss = sumStatPossessionLoss +=\n formHome.AveragePossessionOverall;\n sumStatPPGLast10Win = sumStatPPGLast10Win += formAway.last10Points / 10;\n sumStatPPGLast10Loss = sumStatPPGLast10Loss +=\n formHome.last10Points / 10;\n sumStatSOTWin = sumStatSOTWin += formAway.AverageShotsOnTargetOverall;\n sumStatSOTLoss = sumStatSOTLoss += formHome.AverageShotsOnTargetOverall;\n sumOddsWin = sumOddsWin += awayOdds;\n sumOddsLoss = sumOddsLoss += homeOdds;\n sumXGForWin = sumXGForWin += formAway.XGOverall;\n sumXGForLoss = sumXGForLoss += formHome.XGOverall;\n sumXGAgainstWin = sumXGAgainstWin += formAway.XGAgainstAvgOverall;\n sumXGAgainstLoss = sumXGAgainstLoss += formHome.XGAgainstAvgOverall;\n break;\n default:\n break;\n }\n\n console.log(`allDrawOutcomes: ${allDrawOutcomes}`);\n\n if (match.status === \"complete\") {\n if (match.prediction === match.outcome) {\n match.predictionOutcome = \"Won\";\n winAmount = winAmount + 1;\n if (match.outcome === \"draw\") {\n }\n } else if (match.prediction !== match.outcome) {\n match.predictionOutcome = \"Lost\";\n lossAmount = lossAmount + 1;\n if (match.outcome === \"draw\") {\n }\n }\n }\n\n if (match.status === \"complete\") {\n if (match.homeGoals + match.awayGoals > 2) {\n match.over25PredictionOutcome = \"Won\";\n } else {\n match.over25PredictionOutcome = \"Lost\";\n }\n }\n\n if (\n match.status === \"complete\" &&\n match.homeGoals > 0 &&\n match.awayGoals > 0\n ) {\n match.bttsOutcome = \"bttsWon\";\n } else {\n match.bttsOutcome = \"bttsLost\";\n }\n\n match.formHome = formHome;\n match.formAway = formAway;\n\n // formObjectHome = formHome;\n // formObjectAway = formAway;\n\n // console.log(formObjectHome)\n // console.log(formObjectAway)\n\n let total = parseInt(finalHomeGoals + finalAwayGoals);\n totalGoals = totalGoals + total;\n\n let total2 = parseInt(match.homeGoals + match.awayGoals);\n totalGoals2 = totalGoals2 + total2;\n\n numberOfGames = numberOfGames + 1;\n\n if (finalHomeGoals < 0) {\n finalHomeGoals = 0;\n }\n\n if (finalAwayGoals < 0) {\n finalAwayGoals = 0;\n }\n\n if (match.status === \"suspended\") {\n finalHomeGoals = \"P\";\n finalAwayGoals = \"P\";\n }\n\n if (\n finalHomeGoals > finalAwayGoals &&\n (match.homeOdds < rangeValue[0] || match.homeOdds > rangeValue[1])\n ) {\n match.omit = true;\n } else if (\n finalAwayGoals > finalHomeGoals &&\n (match.awayOdds < rangeValue[0] || match.awayOdds > rangeValue[1])\n ) {\n match.omit = true;\n } else if (\n finalHomeGoals === finalAwayGoals &&\n (match.drawOdds < rangeValue[0] || match.drawOdds > rangeValue[1])\n ) {\n match.omit = true;\n }\n\n const last10PointDiffHomePerspective = Math.abs(\n formHome.last10Points - formAway.last10Points\n );\n\n const last10PointDiffAwayPerspective = Math.abs(\n formAway.last10Points - formHome.last10Points\n );\n\n const XGDiffBetweenTeamsHomePerspective = Math.abs(\n formHome.XGDiffNonAverage - formAway.XGDiffNonAverage\n );\n const XGDiffBetweenTeamsAwayPerspective = Math.abs(\n formAway.XGDiffNonAverage - formHome.XGDiffNonAverage\n );\n\n match.goalDiffHomeOrAwayComparison =\n parseFloat(formHome.goalDifferenceHomeOrAway) -\n parseFloat(formAway.goalDifferenceHomeOrAway);\n\n match.goalDifferenceComparison =\n parseFloat(formHome.goalDifference) - parseFloat(formAway.goalDifference);\n\n switch (true) {\n case finalHomeGoals > finalAwayGoals:\n if (minimumXG !== 0 && XGDiffBetweenTeamsHomePerspective < minimumXG) {\n match.omit = true;\n }\n if (\n minimumLast10 !== 0 &&\n last10PointDiffHomePerspective < minimumLast10\n ) {\n match.omit = true;\n }\n if (\n minimumGDHorA !== 0 &&\n match.goalDiffHomeOrAwayComparison < minimumGDHorA\n ) {\n match.omit = true;\n }\n if (minimumGD !== 0 && match.goalDifferenceComparison < minimumGD) {\n match.omit = true;\n }\n break;\n case finalHomeGoals < finalAwayGoals:\n if (minimumXG !== 0 && XGDiffBetweenTeamsAwayPerspective < minimumXG) {\n match.omit = true;\n }\n if (\n minimumLast10 !== 0 &&\n last10PointDiffAwayPerspective < minimumLast10\n ) {\n match.omit = true;\n }\n if (\n minimumGDHorA !== 0 &&\n Math.abs(match.goalDiffHomeOrAwayComparison) < minimumGDHorA\n ) {\n match.omit = true;\n }\n if (\n minimumGD !== 0 &&\n Math.abs(match.goalDifferenceComparison) < minimumGD\n ) {\n match.omit = true;\n }\n break;\n case finalHomeGoals === finalAwayGoals:\n if (\n minimumXG !== 0 &&\n Math.abs(XGDiffBetweenTeamsHomePerspective) < minimumXG\n ) {\n match.omit = true;\n }\n if (\n minimumLast10 !== 0 &&\n last10PointDiffHomePerspective < minimumLast10\n ) {\n match.omit = true;\n }\n if (\n minimumGDHorA !== 0 &&\n Math.abs(match.goalDiffHomeOrAwayComparison) < minimumGDHorA\n ) {\n match.omit = true;\n }\n if (\n minimumGD !== 0 &&\n Math.abs(match.goalDifferenceComparison) < minimumGD\n ) {\n match.omit = true;\n }\n break;\n default:\n break;\n }\n\n if (\n match.game_week < 3\n // match.omit === true\n // match.game_week < 3 &&\n ) {\n finalHomeGoals = \"-\";\n finalAwayGoals = \"-\";\n match.status = \"notEnoughData\";\n }\n\n return [\n finalHomeGoals,\n finalAwayGoals,\n rawFinalHomeGoals,\n rawFinalAwayGoals,\n ];\n } else {\n finalHomeGoals = \"\";\n finalAwayGoals = \"\";\n rawFinalHomeGoals = \"\";\n rawFinalAwayGoals = \"\";\n match.status = \"notEnoughData\";\n match.profit = 0;\n }\n\n return [finalHomeGoals, finalAwayGoals, rawFinalHomeGoals, rawFinalAwayGoals];\n}\n\nasync function getSuccessMeasure(fixtures) {\n let sumProfit = 0;\n let investment = 0;\n let exactScores = 0;\n let successCount = 0;\n let profit = 0;\n let netProfit = 0;\n\n // await fetch(`${process.env.REACT_APP_EXPRESS_SERVER}tips/${dateStamp}`, {\n // method: \"PUT\",\n // headers: {\n // Accept: \"application/json\",\n // \"Content-Type\": \"application/json\",\n // },\n // body: JSON.stringify(matches)\n // })\n\n for (let i = 0; i < fixtures.length; i++) {\n if (\n fixtures[i].status === \"complete\" &&\n fixtures[i].hasOwnProperty(\"prediction\") &&\n fixtures[i].omit !== true\n ) {\n sumProfit = sumProfit + fixtures[i].profit;\n investment = investment + 1;\n netProfit = (sumProfit - investment).toFixed(2);\n profit = parseFloat(netProfit);\n if (fixtures[i].exactScore === true) {\n exactScores = exactScores + 1;\n }\n if (fixtures[i].predictionOutcome === \"Won\") {\n successCount = successCount + 1;\n }\n }\n }\n\n totalInvestment = totalInvestment + investment;\n totalProfit = totalProfit + profit;\n let ROI = (profit / investment) * 100;\n totalROI = (totalProfit / totalInvestment) * 100;\n console.log(`Total Profit : ${totalProfit}`);\n console.log(`Total Investment : ${totalInvestment}`);\n console.log(`Total ROI : ${totalROI}`);\n var operand = ROI >= 0 ? \"+\" : \"\";\n var operandTwo = totalROI >= 0 ? \"+\" : \"\";\n let exactScoreHitRate = ((exactScores / investment) * 100).toFixed(1);\n let successRate = ((successCount / investment) * 100).toFixed(1);\n\n if (investment > 0) {\n ReactDOM.render(\n \n \n

    {`Correct W/D/W predictions: ${successCount} (${successRate}%)`}

    \n

    {`Exact scores predicted: ${exactScores} (${exactScoreHitRate}%)`}

    \n \n
    ,\n document.getElementById(\"successMeasure2\")\n );\n } else {\n return;\n }\n}\n\nexport var tips = [];\nexport var allTips = [];\nlet allTipsSorted = [];\nvar newArray = [];\nvar bestBets = [];\nvar price;\nvar Over25Tips = [];\nvar XGDiffTips = [];\nvar rollingDiffTips = [];\nvar dangerousAttacksDiffTips = [];\nvar pointsDiffTips = [];\nvar combinations;\nvar exoticArray = [];\nvar gamesInExotic;\nvar minimumExotic;\nvar exoticStake;\nvar exoticString;\nvar bttsArray = [];\nvar accumulatedOdds = 1;\nlet predictions = [];\n\nexport async function getNewTips(array) {\n // allTips = [];\n newArray = [];\n accumulatedOdds = 1;\n\n if (array.length > 1 && incrementValue > 0) {\n array.forEach((tip) => {\n if (\n array.indexOf(tip) < incrementValue\n // tip.goalDifferential >= incrementValue && tip.comparisonScore > 0\n ) {\n newArray.push(tip);\n accumulatedOdds = parseFloat(accumulatedOdds) * parseFloat(tip.rawOdds);\n }\n });\n }\n await renderTips(newArray);\n}\n\nexport async function getScorePrediction(day, mocked) {\n let mock = mocked;\n clicked = true;\n tips = [];\n bestBets = [];\n // price = 0\n bttsArray = [];\n Over25Tips = [];\n XGDiffTips = [];\n pointsDiffTips = [];\n rollingDiffTips = [];\n dangerousAttacksDiffTips = [];\n allTips = [];\n\n let index = 2;\n let divider = 10;\n\n ReactDOM.render(
    , document.getElementById(\"GeneratePredictions\"));\n\n await Promise.all(\n matches.map(async (match) => {\n // if there are no stored predictions, calculate them based on live data\n if (match) {\n switch (true) {\n case match.status === \"canceled\":\n match.goalsA = \"P\";\n match.goalsB = \"P\";\n match.completeData = false\n await calculateScore(match, index, divider, false);\n break;\n case match.leagueID === 6935 ||\n match.leagueID === 7061 ||\n (match.game_week < 3 && match.game_week !== 0):\n match.goalsA = \"x\";\n match.goalsB = \"x\";\n match.completeData = false\n await calculateScore(match, index, divider, true);\n break;\n default:\n [\n match.goalsA,\n match.goalsB,\n match.unroundedGoalsA,\n match.unroundedGoalsB,\n match.completeData = true\n ] = await calculateScore(match, index, divider, true);\n break;\n }\n } else {\n [\n match.goalsA,\n match.goalsB,\n match.unroundedGoalsA,\n match.unroundedGoalsB,\n ] = await calculateScore(match, index, divider, true);\n }\n\n await getBTTSPotential(\n match,\n match.goalsA,\n match.goalsB,\n match.unroundedGoalsA,\n match.unroundedGoalsB\n );\n\n let predictionObject;\n let Over25PredictionObject;\n let XGPredictionObject;\n let pointsDiffObject;\n let rollingDiffObject;\n let dangerousAttacksDiffObject;\n\n if (match.status === \"complete\" && match.prediction) {\n match.outcomeSymbol =\n match.predictionOutcome === \"Won\" ? \"\\u2714\" : \"\\u2718\";\n match.over25PredictionOutcomeSymbol =\n match.over25PredictionOutcome === \"Won\" ? \"\\u2714\" : \"\\u2718\";\n match.bttsOutcomeSymbol =\n match.bttsOutcome === \"bttsWon\" ? \"\\u2714\" : \"\\u2718\";\n } else {\n match.outcomeSymbol = \"\";\n match.over25PredictionOutcomeSymbol = \"\";\n match.bttsOutcomeSymbol = \"\";\n }\n\n if (\n match.unroundedGoalsA - match.unroundedGoalsB > 0.65 &&\n match.homeOdds !== 0 &&\n match.fractionHome !== \"N/A\" &&\n match.includeInMultis !== false &&\n match.omit !== true\n ) {\n if (\n match.prediction !== \"draw\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\" &&\n match.status !== \"notEnoughData\" &&\n match.homeOdds < 3\n ) {\n predictionObject = {\n team: `${match.homeTeam} to win`,\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n odds: match.fractionHome,\n rawOdds: match.homeOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsA, match.unroundedGoalsB)\n ),\n experimentalCalc: (\n (match.unroundedGoalsA - match.unroundedGoalsB) *\n Math.abs(match.teamComparisonScore)\n ).toFixed(2),\n XGdifferentialValue: parseFloat(match.XGdifferentialValue),\n };\n if (\n predictionObject.rawOdds >= 1.25 &&\n match.formHome.clinicalRating !== \"awful\"\n ) {\n allTips.push(predictionObject);\n\n if (\n match.unroundedGoalsA - match.unroundedGoalsB >\n incrementValue\n ) {\n bestBets.push(predictionObject);\n }\n }\n }\n } else if (\n match.unroundedGoalsB - match.unroundedGoalsA > 1.75 &&\n match.awayOdds !== 0 &&\n match.fractionAway !== \"N/A\" &&\n match.includeInMultis !== false &&\n match.omit !== true\n ) {\n if (\n match.prediction !== \"draw\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\" &&\n match.status !== \"notEnoughData\" &&\n match.awayOdds < 3.5\n ) {\n predictionObject = {\n team: `${match.awayTeam} to win`,\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n rawOdds: match.awayOdds,\n odds: match.fractionAway,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n goalDifferential:\n parseFloat(\n await diff(match.unroundedGoalsB, match.unroundedGoalsA)\n ) - 1,\n experimentalCalc: (\n (match.unroundedGoalsB - match.unroundedGoalsA) *\n Math.abs(match.teamComparisonScore)\n ).toFixed(2),\n XGdifferentialValue: parseFloat(match.XGdifferentialValue),\n };\n if (\n predictionObject.rawOdds >= 1.25 &&\n match.formAway.clinicalRating !== \"awful\"\n ) {\n allTips.push(predictionObject);\n if (match.unroundedGoalsB - match.unroundedGoalsA > 2) {\n bestBets.push(predictionObject);\n }\n }\n }\n }\n\n if (\n match.btts === true &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\" &&\n match.status !== \"notEnoughData\"\n ) {\n bttsArray.push(match);\n }\n if (\n match.unroundedGoalsA + match.unroundedGoalsB > 4 &&\n match.goalsA + match.goalsB > 2 &&\n match.GoalsInGamesAverageHome > 3 &&\n match.GoalsInGamesAverageAway > 3\n ) {\n Over25PredictionObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: match.homeTeam,\n decimalOdds: match.homeDoubleChance,\n rawOdds: match.over25Odds,\n odds: match.over25Odds,\n comparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.over25PredictionOutcomeSymbol,\n doubleChanceOutcome: match.over25PredictionOutcome,\n goalTotalUnrounded: match.unroundedGoalsA + match.unroundedGoalsB,\n };\n Over25Tips.push(Over25PredictionObject);\n }\n\n if (\n match.XGdifferential === true &&\n match.prediction === \"homeWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n XGPredictionObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.homeTeam} to win`,\n rawOdds: match.homeOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.homeTeam} to win`,\n odds: match.fractionHome,\n otherTeam: match.awayTeam,\n XGdifferentialValue: match.XGdifferentialValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsA, match.unroundedGoalsB)\n ),\n };\n XGDiffTips.push(XGPredictionObject);\n } else if (\n match.XGdifferential === true &&\n match.prediction === \"awayWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n XGPredictionObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.awayTeam} to win`,\n rawOdds: match.awayOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.awayTeam} to win`,\n odds: match.fractionAway,\n otherTeam: match.homeTeam,\n XGdifferentialValue: match.XGdifferentialValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsB, match.unroundedGoalsA)\n ),\n };\n XGDiffTips.push(XGPredictionObject);\n }\n\n if (\n match.pointsDifferential === true &&\n match.prediction === \"homeWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n pointsDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.homeTeam} to win`,\n rawOdds: match.homeOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.homeTeam} to win`,\n odds: match.fractionHome,\n otherTeam: match.awayTeam,\n pointsDifferentialValue: match.pointsDifferentialValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsA, match.unroundedGoalsB)\n ),\n };\n pointsDiffTips.push(pointsDiffObject);\n } else if (\n match.XGdifferential === true &&\n match.prediction === \"awayWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n pointsDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.awayTeam} to win`,\n rawOdds: match.awayOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.awayTeam} to win`,\n odds: match.fractionAway,\n otherTeam: match.homeTeam,\n pointsDifferentialValue: match.pointsDifferentialValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsB, match.unroundedGoalsA)\n ),\n };\n pointsDiffTips.push(pointsDiffObject);\n }\n\n if (\n match.rollingGoalDiff === true &&\n match.prediction === \"homeWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n rollingDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.homeTeam} to win`,\n rawOdds: match.homeOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.homeTeam} to win`,\n odds: match.fractionHome,\n otherTeam: match.awayTeam,\n rollingGoalDiffValue: match.rollingGoalDiffValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsA, match.unroundedGoalsB)\n ),\n };\n rollingDiffTips.push(rollingDiffObject);\n } else if (\n match.XGdifferential === true &&\n match.prediction === \"awayWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n rollingDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.awayTeam} to win`,\n rawOdds: match.awayOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.awayTeam} to win`,\n odds: match.fractionAway,\n otherTeam: match.homeTeam,\n rollingGoalDiffValue: match.rollingGoalDiffValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsB, match.unroundedGoalsA)\n ),\n };\n rollingDiffTips.push(rollingDiffObject);\n }\n\n if (\n match.dangerousAttacksDiff === true &&\n match.prediction === \"homeWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n dangerousAttacksDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.homeTeam} to win`,\n rawOdds: match.homeOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.homeTeam} to win`,\n odds: match.fractionHome,\n otherTeam: match.awayTeam,\n rollingGoalDiffValue: match.rollingGoalDiffValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsA, match.unroundedGoalsB)\n ),\n };\n dangerousAttacksDiffTips.push(dangerousAttacksDiffObject);\n } else if (\n match.XGdifferential === true &&\n match.prediction === \"awayWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n dangerousAttacksDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.awayTeam} to win`,\n rawOdds: match.awayOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.awayTeam} to win`,\n odds: match.fractionAway,\n otherTeam: match.homeTeam,\n rollingGoalDiffValue: match.rollingGoalDiffValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsB, match.unroundedGoalsA)\n ),\n };\n dangerousAttacksDiffTips.push(dangerousAttacksDiffObject);\n }\n\n predictions.push(match);\n })\n );\n ReactDOM.render(\n ,\n document.getElementById(\"FixtureContainer\")\n );\n await getSuccessMeasure(matches);\n await getMultis();\n await getNewTips(allTipsSorted);\n\n // await renderTips();\n}\n\nasync function getMultis() {\n allTipsSorted = allTips.sort(function (a, b) {\n return b.goalDifferential - a.goalDifferential;\n });\n\n bestBets.sort(function (a, b) {\n if (a.goalDifferential === b.goalDifferential) {\n return b.comparisonScore - a.comparisonScore;\n } else {\n return b.goalDifferential > a.goalDifferential ? 1 : -1;\n }\n });\n\n bttsArray.sort(function (a, b) {\n return b.combinedBTTS - a.combinedBTTS;\n });\n\n Over25Tips.sort(function (a, b) {\n return b.goalTotalUnrounded - a.goalTotalUnrounded;\n });\n\n XGDiffTips.sort(function (a, b) {\n return Math.abs(b.XGdifferentialValue) - Math.abs(a.XGdifferentialValue);\n });\n\n pointsDiffTips.sort(function (a, b) {\n return (\n Math.abs(b.pointsDifferentialValue) - Math.abs(a.pointsDifferentialValue)\n );\n });\n\n rollingDiffTips.sort(function (a, b) {\n return Math.abs(b.rollingGoalDiffValue) - Math.abs(a.rollingGoalDiffValue);\n });\n\n dangerousAttacksDiffTips.sort(function (a, b) {\n return (\n Math.abs(b.dangerousAttacksDiffValue) -\n Math.abs(a.dangerousAttacksDiffValue)\n );\n });\n\n exoticArray = [];\n gamesInExotic = 0;\n exoticStake = 0;\n exoticString = \"\";\n\n switch (true) {\n case allTips.length >= 10:\n for (let i = 0; i < 10; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 10;\n minimumExotic = 8;\n exoticStake = 0.1;\n exoticString = \"45 8-folds, 10 9-folds and 1 10-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case allTips.length >= 9:\n for (let i = 0; i < 9; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 9;\n minimumExotic = 7;\n exoticStake = 0.1;\n exoticString = \"36 7-folds, 9 8-folds and 1 9-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case allTips.length >= 8:\n for (let i = 0; i < 8; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 8;\n minimumExotic = 6;\n exoticStake = 0.1;\n exoticString = \"28 6-folds, 8 7-folds and 1 8-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case allTips.length >= 7:\n for (let i = 0; i < 7; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 7;\n minimumExotic = 6;\n exoticStake = 1;\n exoticString = \"7 6-folds and 1 7-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case allTips.length >= 6:\n for (let i = 0; i < 6; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 6;\n minimumExotic = 5;\n exoticStake = 1;\n exoticString = \"6 5-folds and 1 6-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case allTips.length >= 5:\n for (let i = 0; i < 5; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 5;\n minimumExotic = 4;\n exoticStake = 1;\n exoticString = \"5 4-folds and 1 5-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case Over25Tips.length >= 4:\n for (let i = 0; i < 4; i++) {\n let game = Over25Tips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 4;\n minimumExotic = 3;\n exoticStake = 1;\n exoticString = \"4 3-folds and 1 4-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n default:\n break;\n }\n}\n\nexport function getAccumulatorPrice(priceArray) {\n var result = 1;\n for (var i = 0; i < priceArray.length; i++)\n result = result * priceArray[i].rawOdds;\n\n return result;\n}\n\nexport function getCoverBetMaxReturns(priceArray, minAccSize, stake) {\n var total = 0;\n combinations = 0;\n\n for (var i = minAccSize; i <= priceArray.length; i++) {\n var perms = getUniquePermutations(priceArray, i);\n combinations = combinations + perms.length;\n\n for (var j = 0; j < perms.length; j++)\n total += getAccumulatorPrice(perms[j]) * stake;\n }\n return parseFloat(total.toFixed(2));\n}\n\nfunction getUniquePermutations(arr, permLength) {\n if (arr.length <= permLength) return [arr];\n\n var permutations = [];\n var newArr = [];\n\n newArr = arr.slice(0);\n\n for (var i = 0; i < arr.length; i++) {\n newArr = arr.slice(0);\n newArr.splice(i, 1);\n permutations = twoDimArrayUnion(\n permutations,\n getUniquePermutations(newArr, permLength)\n );\n }\n return permutations;\n}\n\nfunction twoDimArrayUnion(arr1, arr2) {\n for (var i = 0; i < arr2.length; i++) {\n var duplicate = false;\n\n for (var j = 0; j < arr1.length; j++)\n if (arr1[j].length === arr2[i].length)\n for (var k = 0; k < arr1[j].length; k++)\n if (arr1[j][k] !== arr2[i][k]) break;\n else if (k === arr1[j].length - 1) duplicate = true;\n\n if (!duplicate) arr1.push(arr2[i]);\n }\n\n return arr1;\n}\n\nfunction NewlineText(props) {\n const text = props.text;\n const newText = text.split(\"\\n\").map((str) =>

    {str}

    );\n\n return newText;\n}\n\nasync function renderTips() {\n if (newArray.length > 0) {\n ReactDOM.render(\n
    \n \n \n \n
    \n Add or remove a selection using the buttons below. Predictions\n are ordered by confidence in the outcome.\n
    \n {newArray.map((tip) => (\n
  • \n
    \n {tip.team}: {tip.odds}{\" \"}\n {tip.outcomeSymbol}\n
    \n
    {tip.game}
    \n
  • \n ))}\n
    {`Accumulator odds ~ : ${\n Math.round(accumulatedOdds) - 1\n }/1`}
    \n \n }\n />\n
    \n
    ,\n document.getElementById(\"bestPredictions\")\n );\n } else {\n ReactDOM.render(\n
    \n \n \n \n

    \n No games fit the criteria\n

    \n
    {`Accumulator odds ~ : ${\n Math.round(accumulatedOdds) - 1\n }/1`}
    \n \n }\n />\n
    \n
    ,\n document.getElementById(\"bestPredictions\")\n );\n }\n\n if (exoticArray.length > 4) {\n ReactDOM.render(\n
    \n \n \n

    \n \n {`Potential winnings: ${price.toFixed(2)} units`}\n

    \n {exoticArray.map((tip) => (\n
  • \n {tip.team}: {tip.odds}{\" \"}\n {tip.outcomeSymbol}\n
    {tip.game}
    \n
  • \n ))}\n \n }\n />\n
    \n
    ,\n document.getElementById(\"exoticOfTheDay\")\n );\n } else {\n ReactDOM.render(\n
    \n \n \n

    \n Not enough games for this feature\n

    \n \n }\n />\n
    \n
    ,\n document.getElementById(\"exoticOfTheDay\")\n );\n }\n\n if (Over25Tips.length > 0) {\n ReactDOM.render(\n
    \n \n \n

    Over 2.5 goals

    \n {Over25Tips.map((tip) => (\n
  • \n {tip.game} - Odds: {tip.odds}{\" \"}\n \n {tip.outcomeSymbol}\n \n
  • \n ))}\n \n }\n />\n
    \n
    ,\n document.getElementById(\"longShots\")\n );\n } else {\n ReactDOM.render(\n
    \n \n \n

    No games fit the criteria

    \n \n }\n />\n
    \n
    ,\n document.getElementById(\"longShots\")\n );\n }\n\n if (bttsArray.length > 0) {\n ReactDOM.render(\n
    \n \n \n

    Games with highest chance of BTTS

    \n {bttsArray.map((game) => (\n
  • \n {`${game.game} odds: ${game.bttsFraction}`}{\" \"}\n \n {game.bttsOutcomeSymbol}\n \n
  • \n ))}\n \n }\n />\n
    \n
    ,\n document.getElementById(\"BTTS\")\n );\n } else {\n ReactDOM.render(\n
    \n \n \n

    No games fit the criteria

    \n \n }\n />\n
    \n
    ,\n document.getElementById(\"BTTS\")\n );\n }\n\n ReactDOM.render(\n
    \n 0 ? (\n
      \n

      Games with greatest XG Differentials

      \n {XGDiffTips.map((tip) => (\n
    • \n {tip.game} | {tip.prediction} {tip.odds}{\" \"}\n {tip.outcomeSymbol}\n
    • \n ))}\n
    \n ) : (\n
      \n

      Games with greatest XG Differentials

      \n
    • \n Sorry, no games fit this criteria today\n
    • \n
    \n )\n }\n element2={\n pointsDiffTips.length > 0 ? (\n
      \n

      \n Games with greatest points per game differentials (last 10)\n

      \n {pointsDiffTips.map((game) => (\n
    • \n {game.game} | {game.prediction} {game.odds}{\" \"}\n {game.outcomeSymbol}\n
    • \n ))}\n
    \n ) : (\n
      \n

      \n Games with greatest points per game differentials (last 10)\n

      \n
    • \n Sorry, no games fit this criteria today\n
    • \n
    \n )\n }\n element3={\n rollingDiffTips.length > 0 ? (\n
      \n

      \n Games with greatest rolling goal difference differentials\n

      \n {rollingDiffTips.map((game) => (\n
    • \n {game.game} | {game.prediction} {game.odds}{\" \"}\n {game.outcomeSymbol}\n
    • \n ))}\n
    \n ) : (\n
      \n

      \n Games with greatest rolling goal difference differentials\n

      \n
    • \n Sorry, no games fit this criteria today\n
    • \n
    \n )\n }\n element4={\n dangerousAttacksDiffTips.length > 0 ? (\n
      \n

      \n Games with greatest average dangerous attacks differentials\n

      \n {dangerousAttacksDiffTips.map((game) => (\n
    • \n {game.game} | {game.prediction} {game.odds}{\" \"}\n {game.outcomeSymbol}\n
    • \n ))}\n
    \n ) : (\n
      \n

      \n Games with greatest average dangerous attacks differentials\n

      \n
    • \n Sorry, no games fit this criteria today\n
    • \n
    \n )\n }\n element5={\n
    \n

    Help with running costs

    \n

    \n Monthly costs are rising and each donation helps keep XG\n Tipping free to use\n

    \n \n
    \n }\n >\n }\n >\n
    \n

    Filters selected:

    \n
      \n
    • Minimum goal difference spread: {minimumGD}
    • \n
    • \n Minimum goal difference spread (home or away only): {minimumGDHorA}\n
    • \n
    • Minimum XG difference spread: {minimumXG}
    • \n
    • Minimum PPG difference spread: {minimumLast10}
    • \n
    • \n Odds range: {rangeValue[0]} - {rangeValue[1]}\n
    • \n
    \n
    \n
    ,\n document.getElementById(\"insights\")\n );\n}\n","import React, { useState } from \"react\";\nimport { withStyles } from \"@material-ui/core/styles\";\nimport Table from \"@material-ui/core/Table\";\nimport TableBody from \"@material-ui/core/TableBody\";\nimport TableCell from \"@material-ui/core/TableCell\";\nimport TableContainer from \"@material-ui/core/TableContainer\";\nimport TableHead from \"@material-ui/core/TableHead\";\nimport TableRow from \"@material-ui/core/TableRow\";\nimport Paper from \"@material-ui/core/Paper\";\nimport Collapsable from \"../components/CollapsableElement\";\n// import TeamOfTheWeek from \"../components/TeamOfTheWeek\";\n// import TeamOfTheSeason from \"../components/TeamOfTheSeason\";\n\nexport var toggleState = false;\nexport var setIsOff = false;\n\nconst upArrow = \"\\u{25B2}\";\n\nconst StyledTableCell2 = withStyles((theme) => ({\n head: {\n backgroundColor: \"rgba(226, 226, 226, 1)\",\n color: \"white\",\n padding: \"0.35em\",\n paddingTop: \"0.75em\",\n paddingBottom: \"0.75em\",\n textAlign: \"left\",\n fontSize: \"1.9em\",\n fontFamily: \"inherit\",\n // border: \"none\",\n margin: \"none\",\n },\n body: {\n fontSize: \"1.9em\",\n textAlign: \"left\",\n fontFamily: \"inherit\",\n padding: \"0.5em\",\n paddingTop: \"0.75em\",\n paddingBottom: \"0.75em\",\n // border: \"none\",\n margin: \"none\",\n color: \"#030061\",\n },\n}))(TableCell);\n\nconst StyledTableCell = withStyles((theme) => ({\n head: {\n backgroundColor: \"white\",\n color: \"#030061\",\n padding: \"0.5em\",\n paddingTop: \"1em\",\n paddingBottom: \"1em\",\n textAlign: \"center\",\n fontSize: \"1.9em\",\n fontFamily: \"inherit\",\n // border: \"none\",\n margin: \"none\",\n },\n body: {\n // backgroundColor: \"#030061\",\n fontSize: \"1.9em\",\n textAlign: \"center\",\n fontFamily: \"inherit\",\n padding: \"0.35em\",\n paddingTop: \"1em\",\n paddingBottom: \"1em\",\n // border: \"none\",\n margin: \"none\",\n color: \"#030061\",\n },\n}))(TableCell);\n\nconst StyledTableRow = withStyles((theme) => ({\n root: {\n \"&:nth-of-type(odd)\": {\n backgroundColor: \"#rgba(226, 226, 226, 0.424)\",\n textAlign: \"center\",\n },\n \"&:nth-of-type(even)\": {\n backgroundColor: \"#rgba(226, 226, 226, 1)\",\n textAlign: \"center\",\n },\n },\n}))(TableRow);\n\nfunction styleForm(formIndicator) {\n let className;\n if (formIndicator === \"W\") {\n className = \"winLeague\";\n } else if (formIndicator === \"D\") {\n className = \"drawLeague\";\n } else if (formIndicator === \"L\") {\n className = \"lossLeague\";\n }\n return className;\n}\n\nexport default function LeagueTable(props) {\n [toggleState, setIsOff] = useState(false);\n\n let rows = props.Teams.map((team, i) => (\n \n \n {`${i + 1}`}\n \n \n {`${team.Name}`}\n \n \n {`${team.Played}`}\n \n \n {`${team.Wins}`}\n \n \n {`${team.Draws}`}\n \n \n {`${team.Losses}`}\n \n \n {`${team.For}`}\n \n \n {`${team.Against}`}\n \n \n {`${team.GoalDifference}`}\n \n \n {`${team.Points}`}\n \n \n \n {team.Form[0] !== undefined ? team.Form[0] : \"\"}\n \n \n {team.Form[1] !== undefined ? team.Form[1] : \"\"}\n \n \n {team.Form[2] !== undefined ? team.Form[2] : \"\"}\n \n \n {team.Form[3] !== undefined ? team.Form[3] : \"\"}\n \n \n {team.Form[4] !== undefined ? team.Form[4] : \"\"}\n \n \n \n ));\n\n const leagueResults = [];\n let singleResult;\n if (props.Results) {\n props.Results.forEach((result) => {\n singleResult = (\n
    \n
    \n {result.team_a_xg}\n XG\n {result.team_b_xg}\n
    \n
    \n {result.team_a_shots}\n Shots\n {result.team_b_shots}\n
    \n
    \n {result.team_a_shotsOnTarget}\n SOT\n {result.team_b_shotsOnTarget}\n
    \n
    \n {result.team_a_dangerous_attacks}\n Dangerous Attacks\n {result.team_b_dangerous_attacks}\n
    \n
    \n {result.team_a_possession}%\n Possession\n {result.team_b_possession}%\n
    \n
    \n {result.team_a_red_cards}\n Red cards\n {result.team_b_red_cards}\n
    \n
    \n {result.odds_ft_1}\n Odds (pre-match)\n {result.odds_ft_2}\n
    \n
    \n );\n\n leagueResults.push(\n \n
    {result.home_name}
    \n \n {result.homeGoalCount} : {result.awayGoalCount}\n \n
    {result.away_name}
    \n
    \n }\n element={singleResult}\n />\n );\n });\n }\n\n const leagueResultsOlder = [];\n if (props.LastWeeksResults) {\n props.LastWeeksResults.forEach((result) => {\n singleResult = (\n
    \n
    \n {result.team_a_xg}\n XG\n {result.team_b_xg}\n
    \n
    \n {result.team_a_shots}\n Shots\n {result.team_b_shots}\n
    \n
    \n {result.team_a_shotsOnTarget}\n SOT\n {result.team_b_shotsOnTarget}\n
    \n
    \n {result.team_a_dangerous_attacks}\n Dangerous Attacks\n {result.team_b_dangerous_attacks}\n
    \n
    \n {result.team_a_possession}\n Possession\n {result.team_b_possession}\n
    \n
    \n {result.team_a_red_cards}\n Red cards\n {result.team_b_red_cards}\n
    \n
    \n {result.odds_ft_1}\n Odds (pre-match)\n {result.odds_ft_2}\n
    \n
    \n );\n\n leagueResultsOlder.push(\n \n
    {result.home_name}
    \n \n {result.homeGoalCount} : {result.awayGoalCount}\n \n
    {result.away_name}
    \n
    \n }\n element={singleResult}\n />\n );\n });\n }\n\n function getTopScorersTeam(id) {\n let found = props.Teams.find((team) => team.ID === id);\n return found.Name;\n }\n\n async function sorted(league, value, order) {\n let sortedByForm;\n if (order === \"desc\") {\n sortedByForm = league.sort((a, b) => b[value] - a[value]);\n } else {\n sortedByForm = league.sort((a, b) => a[value] - b[value]);\n }\n setIsOff(!toggleState);\n return sortedByForm;\n }\n\n if (\n props.GamesPlayed > 3 &&\n props.Teams[0].LeagueID !== 7956 &&\n props.Teams[0].LeagueID !== 6969 &&\n props.Teams[0].LeagueID !== 11084\n ) {\n for (let i = 0; i < props.Teams.length; i++) {\n return (\n \n \n \n \n \n \n Pld\n W\n D\n L\n GF\n GA\n GD\n \n sorted(props.Teams, \"Points\", \"desc\")}\n >\n Pts {upArrow}\n \n \n \n sorted(props.Teams, \"LastXPoints\", \"desc\")}\n >\n Last 5 {upArrow}\n \n \n \n \n {rows}\n \n
    {`${props.mostRecentGameweek} results`}
    \n
    \n
      {leagueResults}
    \n
    \n
    League Statistics
    \n {/* \n */}\n
    \n
      \n
    • Average home goals: {props.Stats.seasonAVG_home}
    • \n
    • Average away goals: {props.Stats.seasonAVG_away}
    • \n
    • BTTS: {props.Stats.seasonBTTSPercentage}%
    • \n
    • \n Over 0.5 goals: {props.Stats.seasonOver05Percentage_overall}%\n
    • \n
    • \n Over 1.5 goals: {props.Stats.seasonOver15Percentage_overall}%\n
    • \n
    • \n Over 2.5 goals: {props.Stats.seasonOver25Percentage_overall}%\n
    • \n
    • \n Over 3.5 goals: {props.Stats.seasonOver35Percentage_overall}%\n
    • \n
    • \n Over 4.5 goals: {props.Stats.seasonOver45Percentage_overall}%\n
    • \n
    \n
      \n
    • \n Over 7.5 corners: {props.Stats.over75CornersPercentage_overall}%\n
    • \n
    • \n Over 8.5 corners: {props.Stats.over85CornersPercentage_overall}%\n
    • \n
    • \n Over 9.5 corners: {props.Stats.over95CornersPercentage_overall}%\n
    • \n
    • \n Over 10.5 corners:{\" \"}\n {props.Stats.over105CornersPercentage_overall}%\n
    • \n
    • \n Over 11.5 corners:{\" \"}\n {props.Stats.over115CornersPercentage_overall}%\n
    • \n
    • \n Over 12.5 corners:{\" \"}\n {props.Stats.over125CornersPercentage_overall}%\n
    • \n
    • Corners average: {props.Stats.cornersAVG_overall}
    • \n
    • Cards average: {props.Stats.cardsAVG_overall}
    • \n
    \n
      \n

      Top scorers

      \n
    • \n {props.Stats.top_scorers[0].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[0].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[0].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[1].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[1].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[1].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[2].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[2].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[2].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[3].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[3].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[3].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[4].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[4].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[4].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[5].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[5].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[5].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[6].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[6].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[6].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[7].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[7].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[7].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[8].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[8].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[8].goals_overall}\n
    • \n
    • \n {props.Stats.top_scorers[9].known_as} (\n {getTopScorersTeam(props.Stats.top_scorers[9].club_team_id)}):{\" \"}\n {props.Stats.top_scorers[9].goals_overall}\n
    • \n
    \n
    \n
    \n );\n }\n } else if (props.Teams[0].LeagueID === 4340) {\n return null;\n } else {\n for (let i = 0; i < props.Teams.length; i++) {\n return (\n \n \n \n \n sorted(props.Teams, \"Position\")}\n >\n {upArrow}\n {\" \"}\n \n Pld\n W\n D\n L\n GF\n GA\n GD\n Pts\n \n \n \n {rows}\n
    \n sorted(props.Teams, \"LastXPoints\", \"desc\")}\n >\n Last 5 {upArrow}\n \n
    \n
    \n );\n }\n }\n}\n","import React, { Fragment } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { orderedLeagues } from \"../App\";\nimport { getForm } from \"./getForm\";\nimport { Fixture } from \"../components/Fixture\";\nimport { Button } from \"../components/Button\";\nimport { Slide } from \"../components/Slider\";\nimport { getScorePrediction } from \"../logic/getScorePredictions\";\nimport { ThreeDots } from \"react-loading-icons\";\nimport { selectedOdds } from \"../components/OddsRadio\";\nimport LeagueTable from \"../components/LeagueTable\";\nimport { getPointsFromLastX } from \"../logic/getScorePredictions\";\nimport SlideDiff from \"../components/SliderDiff\";\nimport Collapsable from \"../components/CollapsableElement\";\n\nvar oddslib = require(\"oddslib\");\n\n// require(\"dotenv\").config();\n\nvar fixtureResponse;\nvar fixtureArray = [];\nexport var matches = [];\nexport var resultedMatches = [];\nexport let arrayOfGames = [];\n\nvar league;\nvar leagueID;\nvar leagueGames = [];\nexport var leagueArray = [];\nvar leagueIdArray = [];\nexport var leagueStatsArray = [];\nexport let leagueInstance;\nexport let groupInstance;\nexport let allLeagueResultsArrayOfObjects = [];\nvar lastThreeFormHome;\nvar lastThreeFormAway;\nvar lastFiveFormHome;\nvar lastFiveFormAway;\nvar lastSixFormHome;\nvar lastSixFormAway;\nvar lastTenFormHome;\nvar lastTenFormAway;\nvar leagueOrAll;\nvar formRunHome;\nvar formRunAway;\nlet WDLinLeagueHome;\nlet WDLinLeagueAway;\nlet HomeAverageGoals;\nlet homeAverageGoals;\nlet HomeAverageConceded;\nlet homeAverageConceded;\nlet AwayAverageGoals;\nlet awayAverageGoals;\nlet AwayAverageConceded;\nlet awayAverageConceded;\n\n// export var [currentDay, month, year] = new Date()\n// .toLocaleDateString(\"en-US\", { timeZone: \"Europe/London\" })\n// .split(\"/\");\n\nexport async function diff(a, b) {\n return parseFloat(a - b).toFixed(2);\n}\n\nexport let allForm = [];\nexport let tableArray = [];\nexport let worldCupArray = [];\ngroupInstance = [];\nleagueInstance = [];\n\nasync function convertTimestampForSofaScore(timestamp) {\n let newDate = new Date(timestamp);\n\n let year = newDate.getFullYear();\n let month = String(newDate.getMonth() + 1).padStart(2, '0'); // Adding 1 to month because it is zero-based\n let day = String(newDate.getDate()).padStart(2, '0');\n \n let converted = `${year}-${month}-${day}`;\n\n return converted;\n}\n\nasync function convertTimestamp(timestamp) {\n let newDate = new Date(timestamp);\n let [day, month, year] = newDate.toLocaleDateString(\"en-US\").split(\"/\");\n\n let converted = `${year}-${day}-${month}`;\n\n return converted;\n}\n\n\nexport async function generateTables(a, leagueIdArray, allResults) {\n // leagueIdArray = [];\n tableArray = [];\n worldCupArray = [];\n let i = 0;\n leagueArray.forEach(function (league) {\n let currentLeagueId = leagueIdArray[i];\n i++;\n leagueInstance = [];\n //Skip MLS which has a weird format\n if (\n !league.data.specific_tables[0].groups &&\n currentLeagueId !== 6969 &&\n league.data.specific_tables[0].table\n ) {\n for (\n let index = 0;\n index < league.data.specific_tables[0].table.length;\n index++\n ) {\n let currentTeam = league.data.specific_tables[0].table[index];\n let last5;\n if (currentTeam.wdl_record.length < 5) {\n last5 = currentTeam.wdl_record\n .slice(`-${currentTeam.wdl_record.length}`)\n .toUpperCase();\n } else {\n last5 = currentTeam.wdl_record.slice(-5).toUpperCase();\n }\n\n const team = {\n LeagueID: currentLeagueId,\n Position: index + 1,\n Name: currentTeam.cleanName,\n ID: currentTeam.id,\n Played: currentTeam.matchesPlayed,\n Wins: currentTeam.seasonWins_overall,\n Draws: currentTeam.seasonDraws_overall,\n Losses: currentTeam.seasonLosses_overall,\n For: currentTeam.seasonGoals,\n Against:\n currentTeam.seasonConceded_home + currentTeam.seasonConceded_away,\n GoalDifference: currentTeam.seasonGoalDifference,\n Form: last5,\n LastXPoints: getPointsFromLastX(last5.split(\"\")),\n Points: currentTeam.points,\n wdl: currentTeam.wdl_record,\n seasonGoals: currentTeam.seasonGoals,\n seasonConceded: currentTeam.seasonConceded,\n };\n leagueInstance.push(team);\n }\n tableArray.push({ id: currentLeagueId, table: leagueInstance });\n } else if (currentLeagueId === 11084) {\n // for (let x = 0; x < league.data.specific_tables[0].groups.length; x++) {\n // for (\n // let index = 0;\n // index < league.data.specific_tables[0].groups[x].table.length;\n // index++\n // )\n league.data.specific_tables[0].groups.forEach((group) => {\n leagueInstance = [];\n for (let index = 0; index < group.table.length; index++) {\n let currentTeam = group.table[index];\n let last5 = \"N/A\";\n const team = {\n LeagueID: currentLeagueId,\n Position: index + 1,\n Name: currentTeam.cleanName,\n ID: currentTeam.id,\n Played: currentTeam.matchesPlayed,\n Wins: currentTeam.seasonWins_overall,\n Draws: currentTeam.seasonDraws_overall,\n Losses: currentTeam.seasonLosses_overall,\n For: currentTeam.seasonGoals,\n Against:\n currentTeam.seasonConceded_home + currentTeam.seasonConceded_away,\n GoalDifference: currentTeam.seasonGoalDifference,\n Form: last5,\n LastXPoints: getPointsFromLastX(last5.split(\"\")),\n Points: currentTeam.points,\n wdl: currentTeam.wdl_record,\n seasonGoals: currentTeam.seasonGoals,\n seasonConceded: currentTeam.seasonConceded,\n };\n leagueInstance.push(team);\n }\n worldCupArray.push({\n group: group.name,\n table: leagueInstance,\n });\n });\n } else if (league.data.league_table === null) {\n for (\n let index = 0;\n index < league.data.all_matches_table_overall.length;\n index++\n ) {\n let currentTeam = league.data.all_matches_table_overall[index];\n let last5 = \"N/A\";\n const team = {\n LeagueID: currentLeagueId,\n Position: index + 1,\n Name: currentTeam.cleanName,\n ID: currentTeam.id,\n Played: currentTeam.matchesPlayed,\n Wins: currentTeam.seasonWins_overall,\n Draws: currentTeam.seasonDraws_overall,\n Losses: currentTeam.seasonLosses_overall,\n For: currentTeam.seasonGoals,\n Against:\n currentTeam.seasonConceded_home + currentTeam.seasonConceded_away,\n GoalDifference: currentTeam.seasonGoalDifference,\n Form: last5,\n LastXPoints: getPointsFromLastX(last5.split(\"\")),\n Points: currentTeam.points,\n wdl: currentTeam.wdl_record,\n seasonGoals: currentTeam.seasonGoals,\n seasonConceded: currentTeam.seasonConceded,\n };\n leagueInstance.push(team);\n }\n\n tableArray.push({ id: currentLeagueId, table: leagueInstance });\n }\n });\n}\n\nexport async function renderTable(index, results, id) {\n let league;\n //World cup table rendering\n\n // let mostRecentGame = results.fixtures.pop();\n let mostRecentGame = results.fixtures.pop();\n\n let mostRecentGameweek = \"Latest\";\n\n const gameweeksResults = results.fixtures.filter(\n (games) => games.game_week === mostRecentGame.game_week\n );\n\n // const lastGameweeksResults = results.fixtures.filter(\n // (games) => games.game_week === mostRecentGameweek - 1\n // );\n\n const leagueTable = tableArray.filter((table) => table.id === id);\n\n league = leagueTable[0].table;\n\n let statistics;\n let leagueStatistics = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}leagueStats/${id}`\n );\n await leagueStatistics.json().then((stats) => {\n statistics = stats.data;\n });\n\n if (league !== undefined) {\n ReactDOM.render(\n ,\n document.getElementById(`leagueName${id}`)\n );\n }\n}\n\nasync function createFixture(match, result, mockBool) {\n let roundedHomeOdds;\n let roundedAwayOdds;\n let roundedBTTSOdds;\n let homeFraction;\n let awayFraction;\n let bttsFraction;\n\n if (selectedOdds === \"Fractional odds\") {\n if (match.homeOdds !== 0 && match.awayOdds !== 0) {\n roundedHomeOdds = (Math.round(match.homeOdds * 5) / 5).toFixed(1);\n roundedAwayOdds = (Math.round(match.awayOdds * 5) / 5).toFixed(1);\n\n if (roundedHomeOdds < 1.1) {\n roundedHomeOdds = 1.1;\n }\n if (roundedAwayOdds < 1.1) {\n roundedAwayOdds = 1.1;\n }\n\n if (match.homeOdds === 0.1 && match.awayOdds === 0.1) {\n match.homeOdds = 3;\n roundedHomeOdds = 3;\n match.awayOdds = 3;\n roundedAwayOdds = 3;\n }\n\n try {\n homeFraction = oddslib\n .from(\"decimal\", roundedHomeOdds)\n .to(\"fractional\", { precision: 1 });\n awayFraction = oddslib\n .from(\"decimal\", roundedAwayOdds)\n .to(\"fractional\", { precision: 1 });\n } catch (error) {\n console.log(error);\n }\n } else {\n homeFraction = \"N/A\";\n awayFraction = \"N/A\";\n }\n\n if (match.bttsOdds !== 0) {\n roundedBTTSOdds = (Math.round(match.bttsOdds * 5) / 5).toFixed(1);\n\n if (roundedBTTSOdds < 1.1) {\n roundedBTTSOdds = 1.1;\n }\n\n try {\n bttsFraction = oddslib\n .from(\"decimal\", roundedBTTSOdds)\n .to(\"fractional\", { precision: 1 });\n } catch (error) {\n console.log(error);\n }\n } else {\n bttsFraction = \"N/A\";\n }\n } else if (selectedOdds === \"Decimal odds\") {\n if (match.homeOdds !== 0 && match.awayOdds !== 0) {\n homeFraction = match.homeOdds;\n awayFraction = match.awayOdds;\n } else {\n homeFraction = \"N/A\";\n awayFraction = \"N/A\";\n }\n\n if (match.bttsOdds !== 0) {\n bttsFraction = match.bttsOdds;\n } else {\n bttsFraction = \"N/A\";\n }\n }\n\n match.omit = false;\n match.homeTeamWinsPercentage = match.homeTeamWinPercentage;\n match.homeTeamLossesPercentage = match.homeTeamLossPercentage;\n match.homeTeamDrawsPercentage = match.homeTeamDrawPercentage;\n\n match.awayTeamWinsPercentage = match.awayTeamWinPercentage;\n match.awayTeamLossesPercentage = match.awayTeamLossPercentage;\n match.awayTeamDrawsPercentage = match.awayTeamDrawPercentage;\n match.fractionHome = homeFraction;\n match.fractionAway = awayFraction;\n\n match.bttsFraction = bttsFraction;\n\n match.game = match.homeTeam + \" v \" + match.awayTeam;\n\n // ReactDOM.render(\n // ,\n // document.getElementById(\"FixtureContainer\")\n // );\n}\n\nexport function RenderAllFixtures(props) {\n return (\n \n );\n}\n// document.getElementById(\"FixtureContainer\")\n\nvar myHeaders = new Headers();\nmyHeaders.append(\"Origin\", \"https://gregdorward.github.io\");\n\nlet isFunctionRunning = false;\n\nexport async function generateFixtures(\n day,\n date,\n selectedOdds,\n footyStatsFormattedDate,\n current,\n todaysDate,\n dateSS\n) {\n if (!isFunctionRunning) {\n isFunctionRunning = true;\n // const randomInt = Math.random() * 10\n\n // if(randomInt >= 7){\n // alert(\"XGTipping is now serving over 2000 users a month,1 relying on donations to cover increasing running costs. If you can afford to do so and like what we do, please, help us stay subscription fee today by tapping to Donation button at the bottom of the page\")\n // }\n\n ReactDOM.render(\n
    \n
    \n Loading all league, fixture & form data, please be patient...\n
    \n \n
    ,\n document.getElementById(\"Loading\")\n );\n\n //cleanup if different day is selected\n ReactDOM.render(\n
    ,\n document.getElementById(\"GeneratePredictions\")\n );\n ReactDOM.render(
    , document.getElementById(\"successMeasure2\"));\n ReactDOM.render(
    , document.getElementById(\"bestPredictions\"));\n ReactDOM.render(
    , document.getElementById(\"exoticOfTheDay\"));\n ReactDOM.render(
    , document.getElementById(\"insights\"));\n ReactDOM.render(
    , document.getElementById(\"longShots\"));\n ReactDOM.render(
    , document.getElementById(\"BTTS\"));\n ReactDOM.render(
    , document.getElementById(\"draws\"));\n\n const url = `${process.env.REACT_APP_EXPRESS_SERVER}matches/${footyStatsFormattedDate}`;\n const formUrl = `${process.env.REACT_APP_EXPRESS_SERVER}form/${date}`;\n\n matches = [];\n fixtureArray = [];\n\n league = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}leagues/${todaysDate}`\n );\n\n ReactDOM.render(
    , document.getElementById(\"FixtureContainer\"));\n\n fixtureResponse = await fetch(url);\n\n await fixtureResponse.json().then((fixtures) => {\n fixtureArray = Array.from(fixtures.data);\n });\n\n let form;\n let formArray = [];\n allForm = [];\n var isFormStored;\n var isStoredLocally;\n var leaguesStored = false;\n let storedForm = await fetch(formUrl);\n if (storedForm.status === 201 || storedForm.status === 200) {\n await storedForm.json().then((form) => {\n formArray = Array.from(form.allForm);\n isFormStored = true;\n isStoredLocally = true;\n allForm = formArray;\n });\n } else {\n isFormStored = false;\n isStoredLocally = false;\n }\n\n leagueIdArray = [];\n for (let i = 0; i < orderedLeagues.length; i++) {\n leagueID = orderedLeagues[i].element.id;\n leagueIdArray.push(leagueID);\n }\n\n var leaguePositions = [];\n leagueArray = [];\n\n let allLeagueResults;\n\n allLeagueResults = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}results`\n );\n\n if (league.status === 200 && allLeagueResults.status === 201) {\n console.log(\"Not fetching leagues\");\n await league.json().then((leagues) => {\n leagueArray = Array.from(leagues.leagueArray);\n });\n updateResults(false);\n\n await allLeagueResults.json().then((allGames) => {\n allLeagueResultsArrayOfObjects = Array.from(allGames);\n });\n\n console.log(allLeagueResultsArrayOfObjects)\n leaguesStored = true;\n generateTables(\n leagueArray,\n leagueIdArray,\n allLeagueResultsArrayOfObjects\n );\n arrayOfGames = []\n\n const sofaScore = await fetch(`https://www.sofascore.com/api/v1/sport/football/scheduled-events/${dateSS}`)\n await sofaScore.json().then((games) => {\n games.events.forEach((game) => {\n arrayOfGames.push({\n homeTeam: game.homeTeam.name,\n awayTeam: game.awayTeam.name,\n id: game.id,\n time: game.startTimestamp,\n homeGoals: game.homeScore.display != undefined ? game.homeScore.display : \"-\",\n awayGoals: game.awayScore.display != undefined ? game.awayScore.display : \"-\"\n })\n })\n })\n\n const sofaScoreLeagues = await fetch('')\n console.log(arrayOfGames)\n } else {\n allLeagueResultsArrayOfObjects = [];\n console.log(\"Fetching leagues\");\n for (let i = 0; i < orderedLeagues.length; i++) {\n league = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}tables/${orderedLeagues[i].element.id}/${todaysDate}`\n );\n // eslint-disable-next-line no-loop-func\n await league.json().then((table) => {\n leagueArray.push(table);\n });\n leaguesStored = false;\n }\n\n //set variable for date X amount of days in the past and use that to filter the results\n\n let startDate = (new Date().getTime() / 1000).toFixed(0);\n // deduct 3 months\n let targetDate = startDate - 23778463;\n\n for (const orderedLeague of orderedLeagues) {\n let fixtures = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}leagueFixtures/${orderedLeague.element.id}`\n );\n\n let games = await fixtures.json();\n let gamesFiltered;\n let gamesShortened;\n if (games.pager.current_page < games.pager.max_page) {\n const page2 = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}leagueFixtures/${orderedLeague.element.id}&page=2`\n );\n let page2Data = await page2.json();\n\n const gamesConcat = games.data.concat(page2Data.data);\n const gamesConcatFiltered = gamesConcat.filter((game) => game.status === \"complete\");\n\n let mostRecentResults = gamesConcatFiltered.filter(\n (game) => game.date_unix > targetDate\n );\n let sorted = mostRecentResults.sort((a, b) => a.date_unix - b.date_unix);\n gamesShortened = sorted.slice(-600);\n gamesFiltered = gamesShortened;\n } else {\n\n gamesFiltered = games.data.filter(\n (game) => game.status === \"complete\"\n );\n\n if (current) {\n let mostRecentResults = gamesFiltered.filter(\n (game) => game.date_unix > targetDate\n );\n gamesFiltered = mostRecentResults.slice(-600);\n }\n }\n\n // let mostRecentResults = gamesFiltered.filter(\n // (game) => game.date_unix > targetDate\n // );\n\n const shortenedResults = gamesFiltered.map(\n ({\n home_name,\n away_name,\n homeGoalCount,\n awayGoalCount,\n date_unix,\n team_a_xg,\n team_b_xg,\n odds_ft_1,\n odds_ft_2,\n team_a_shots,\n team_b_shots,\n team_a_corners,\n team_b_corners,\n team_a_shotsOnTarget,\n team_b_shotsOnTarget,\n team_a_red_cards,\n team_b_red_cards,\n team_a_possession,\n team_b_possession,\n team_a_dangerous_attacks,\n team_b_dangerous_attacks,\n pre_match_teamA_overall_ppg,\n pre_match_teamB_overall_ppg,\n game_week,\n }) => ({\n home_name,\n away_name,\n homeGoalCount,\n awayGoalCount,\n date_unix,\n team_a_xg,\n team_b_xg,\n odds_ft_1,\n odds_ft_2,\n team_a_shots,\n team_b_shots,\n team_a_corners,\n team_b_corners,\n team_a_shotsOnTarget,\n team_b_shotsOnTarget,\n team_a_red_cards,\n team_b_red_cards,\n team_a_possession,\n team_b_possession,\n team_a_dangerous_attacks,\n team_b_dangerous_attacks,\n pre_match_teamA_overall_ppg,\n pre_match_teamB_overall_ppg,\n game_week,\n })\n );\n\n let leagueObj = {\n // leagueObject[orderedLeague] = {\n name: orderedLeague.name,\n id: orderedLeague.element.id,\n fixtures: shortenedResults,\n };\n\n allLeagueResultsArrayOfObjects.push(leagueObj);\n }\n updateResults(true);\n generateTables(\n leagueArray,\n leagueIdArray,\n allLeagueResultsArrayOfObjects\n );\n }\n\n let teamPositionPrefix;\n\n async function getPrefix(position) {\n switch (position) {\n case 1:\n case 21:\n case 31:\n case 41:\n teamPositionPrefix = \"st\";\n break;\n case 2:\n case 22:\n case 32:\n case 42:\n teamPositionPrefix = \"nd\";\n break;\n case 3:\n case 23:\n case 33:\n case 43:\n teamPositionPrefix = \"rd\";\n break;\n case 4:\n case 5:\n case 6:\n case 7:\n case 8:\n case 9:\n case 10:\n case 11:\n case 12:\n case 13:\n case 14:\n case 15:\n case 16:\n case 17:\n case 18:\n case 19:\n case 20:\n case 24:\n case 25:\n case 26:\n case 27:\n case 28:\n case 29:\n case 30:\n case 34:\n case 35:\n case 36:\n case 37:\n case 38:\n case 39:\n case 40:\n case 44:\n case 45:\n case 46:\n case 47:\n case 48:\n teamPositionPrefix = \"th\";\n break;\n default:\n break;\n }\n return teamPositionPrefix;\n }\n\n for (let i = 0; i < leagueArray.length; i++) {\n let leagueInstance;\n let homeLeague;\n let awayLeague;\n\n if (leagueArray[i].data.league_table !== null) {\n leagueInstance = leagueArray[i].data.league_table;\n homeLeague = leagueArray[i].data.all_matches_table_home;\n awayLeague = leagueArray[i].data.all_matches_table_away;\n } else {\n leagueInstance = leagueArray[i].data.all_matches_table_overall;\n homeLeague = leagueArray[i].data.all_matches_table_home;\n awayLeague = leagueArray[i].data.all_matches_table_away;\n }\n\n for (let x = 0; x < leagueInstance.length; x++) {\n let regularSeason = leagueArray[i].data.specific_tables.find(\n (season) =>\n season.round === \"Regular Season\" ||\n season.round === \"2023\" ||\n season.round === \"2023/2024\" ||\n season.round === \"Apertura\" ||\n season.round === \"1st Phase\"\n // season.round === \"North\" ||\n // season.round === \"South\"\n );\n let string;\n\n if (regularSeason !== undefined && regularSeason.table) {\n string = regularSeason.table[x];\n homeLeague = leagueArray[i].data.all_matches_table_home;\n awayLeague = leagueArray[i].data.all_matches_table_away;\n } else {\n string = leagueArray[i].data.all_matches_table_overall[x];\n homeLeague = leagueArray[i].data.all_matches_table_home;\n awayLeague = leagueArray[i].data.all_matches_table_away;\n }\n\n let stringHome = homeLeague[x];\n let stringAway = awayLeague[x];\n\n leaguePositions.push({\n name: string.cleanName,\n position: x + 1,\n rawPosition: x + 1,\n homeFormName: stringHome ? stringHome.cleanName : string.cleanName,\n awayFormName: stringAway ? stringAway.cleanName : string.cleanName,\n homeSeasonWinPercentage: stringHome\n ? stringHome.seasonWins\n : string.seasonWins,\n awaySeasonWinPercentage: stringAway\n ? stringAway.seasonWins\n : string.seasonWins,\n homeSeasonLossPercentage: stringHome\n ? stringHome.seasonLosses_home\n : string.seasonLosses_home,\n awaySeasonLossPercentage: stringAway\n ? stringAway.seasonLosses_away\n : string.seasonLosses_away,\n homeSeasonDrawPercentage: stringHome\n ? stringHome.seasonDraws\n : string.seasonDraws,\n awaySeasonDrawPercentage: stringAway\n ? stringAway.seasonDraws\n : string.seasonDraws,\n homeSeasonMatchesPlayed: stringHome\n ? stringHome.matchesPlayed\n : string.matchesPlayed,\n awaySeasonMatchesPlayed: stringAway\n ? stringAway.matchesPlayed\n : string.matchesPlayed,\n ppg: string.points / string.matchesPlayed,\n wdl: string.wdl_record ? string.wdl_record : \"\",\n played: string.matchesPlayed,\n seasonGoals: string.seasonGoals,\n seasonConceded: string.seasonConceded,\n });\n }\n }\n\n let previousLeagueName;\n\n for (let i = 0; i < orderedLeagues.length; i++) {\n leagueID = orderedLeagues[i].element.id;\n leagueGames = fixtureArray.filter(\n (game) => game.competition_id === orderedLeagues[i].element.id\n );\n\n for (const fixture of leagueGames) {\n const unixTimestamp = fixture.date_unix;\n const milliseconds = unixTimestamp * 1000;\n const dateObject = new Date(milliseconds);\n\n let match = {};\n if (orderedLeagues[i].name !== previousLeagueName) {\n match.leagueName = orderedLeagues[i].name;\n match.leagueIndex = i;\n match.leagueID = leagueID;\n } else {\n match.leagueName = null;\n match.leagueIndex = i;\n match.leagueID = leagueID;\n }\n match.id = fixture.id;\n match.competition_id = fixture.competition_id;\n match.date = fixture.date_unix;\n match.time = dateObject.toLocaleString(\"en-GB\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n match.homeTeam = fixture.home_name;\n match.awayTeam = fixture.away_name;\n\n match.homeOdds = +fixture.odds_ft_1.toFixed(2);\n match.awayOdds = +fixture.odds_ft_2.toFixed(2);\n match.drawOdds = +fixture.odds_ft_x.toFixed(2);\n match.homeDoubleChance = fixture.odds_doublechance_1x;\n match.awayDoubleChance = fixture.odds_doublechance_x2;\n match.bttsOdds = fixture.odds_btts_yes;\n match.homeId = fixture.homeID;\n match.awayId = fixture.awayID;\n match.form = [];\n match.homeTeamInfo = [];\n match.awayTeamInfo = [];\n match.btts = false;\n\n previousLeagueName = orderedLeagues[i].name;\n\n let homeTeaminLeague;\n let awayTeaminLeague;\n let teamPositionHome;\n let teamPositionHomeTable;\n let teamPositionAwayTable;\n let homeTeamWinPercentageHome;\n let awayTeamWinPercentageAway;\n let homeTeamLossPercentageHome;\n let awayTeamLossPercentageAway;\n let homeTeamDrawPercentageHome;\n let awayTeamDrawPercentageAway;\n let teamPositionAway;\n let homePrefix;\n let homePrefixHomeTable;\n let awayPrefix;\n let awayPrefixAwayTable;\n let homeSeasonPPG;\n let awaySeasonPPG;\n\n try {\n homeTeaminLeague = leaguePositions.find(\n (team) => team.name === match.homeTeam\n );\n\n let homeTeaminHomeLeague = leaguePositions.find(\n (team) => team.homeFormName === match.homeTeam\n );\n teamPositionHome = homeTeaminLeague.position;\n teamPositionHomeTable = homeTeaminHomeLeague.position;\n\n WDLinLeagueHome = Array.from(homeTeaminLeague.wdl.toUpperCase());\n HomeAverageGoals =\n homeTeaminLeague.seasonGoals / homeTeaminLeague.played;\n HomeAverageConceded =\n homeTeaminLeague.seasonConceded / homeTeaminLeague.played;\n\n homeTeamWinPercentageHome =\n (homeTeaminHomeLeague.homeSeasonWinPercentage /\n homeTeaminHomeLeague.homeSeasonMatchesPlayed) *\n 100;\n\n homeTeamLossPercentageHome =\n (homeTeaminHomeLeague.homeSeasonLossPercentage /\n homeTeaminHomeLeague.homeSeasonMatchesPlayed) *\n 100;\n\n homeTeamDrawPercentageHome =\n (homeTeaminHomeLeague.homeSeasonDrawPercentage /\n homeTeaminHomeLeague.homeSeasonMatchesPlayed) *\n 100;\n\n homePrefix = await getPrefix(teamPositionHome);\n homePrefixHomeTable = await getPrefix(teamPositionHomeTable);\n\n homeSeasonPPG = homeTeaminLeague.ppg.toFixed(2);\n } catch (error) {\n console.log(error);\n teamPositionHome = \"N/A\";\n homePrefix = \"\";\n homePrefixHomeTable = \"\";\n homeSeasonPPG = \"N/A\";\n homeTeaminLeague = {\n rawPosition: \"N/A\",\n };\n WDLinLeagueHome = \"N/A\";\n }\n\n try {\n awayTeaminLeague = leaguePositions.find(\n (team) => team.name === match.awayTeam\n );\n\n let awayTeaminAwayLeague = leaguePositions.find(\n (team) => team.awayFormName === match.awayTeam\n );\n\n teamPositionAway = awayTeaminLeague.position;\n teamPositionAwayTable = awayTeaminAwayLeague.position;\n\n WDLinLeagueAway = Array.from(awayTeaminLeague.wdl.toUpperCase());\n AwayAverageGoals =\n awayTeaminLeague.seasonGoals / awayTeaminLeague.played;\n AwayAverageConceded =\n awayTeaminLeague.seasonConceded / awayTeaminLeague.played;\n\n awayTeamWinPercentageAway =\n (awayTeaminAwayLeague.awaySeasonWinPercentage /\n awayTeaminAwayLeague.awaySeasonMatchesPlayed) *\n 100;\n\n awayTeamLossPercentageAway =\n (awayTeaminAwayLeague.awaySeasonLossPercentage /\n awayTeaminAwayLeague.awaySeasonMatchesPlayed) *\n 100;\n\n awayTeamDrawPercentageAway =\n (awayTeaminAwayLeague.awaySeasonDrawPercentage /\n awayTeaminAwayLeague.awaySeasonMatchesPlayed) *\n 100;\n\n awayPrefix = await getPrefix(teamPositionAway);\n awayPrefixAwayTable = await getPrefix(teamPositionAwayTable);\n\n awaySeasonPPG = awayTeaminLeague.ppg.toFixed(2);\n } catch (error) {\n console.log(error);\n teamPositionAway = \"N/A\";\n awayPrefix = \"\";\n awaySeasonPPG = \"N/A\";\n awayTeaminLeague = {\n rawPosition: \"N/A\",\n };\n WDLinLeagueAway = \"N/A\";\n }\n\n if (!isFormStored) {\n form = await getForm(match);\n\n let homeFormString5 =\n form[0].data[0].stats.additional_info.formRun_overall.toUpperCase();\n let awayFormString5 =\n form[1].data[0].stats.additional_info.formRun_overall.toUpperCase();\n let homeFormString6 =\n form[0].data[1].stats.additional_info.formRun_overall.toUpperCase();\n let awayFormString6 =\n form[1].data[1].stats.additional_info.formRun_overall.toUpperCase();\n let homeFormString10 =\n form[0].data[2].stats.additional_info.formRun_overall.toUpperCase();\n let awayFormString10 =\n form[1].data[2].stats.additional_info.formRun_overall.toUpperCase();\n\n let homeFormRun =\n form[0].data[2].stats.additional_info.formRun_home.toUpperCase();\n let awayFormRun =\n form[1].data[2].stats.additional_info.formRun_away.toUpperCase();\n\n if (WDLinLeagueHome.length >= 10) {\n lastThreeFormHome = WDLinLeagueHome.slice(-3);\n lastFiveFormHome = WDLinLeagueHome.slice(-5);\n lastSixFormHome = WDLinLeagueHome.slice(-6);\n lastTenFormHome = WDLinLeagueHome.slice(-10);\n lastThreeFormAway = WDLinLeagueAway.slice(-3);\n lastFiveFormAway = WDLinLeagueAway.slice(-5);\n lastSixFormAway = WDLinLeagueAway.slice(-6);\n lastTenFormAway = WDLinLeagueAway.slice(-10);\n leagueOrAll = \"League\";\n homeAverageGoals = HomeAverageGoals;\n homeAverageConceded = HomeAverageConceded;\n awayAverageGoals = AwayAverageGoals;\n awayAverageConceded = AwayAverageConceded;\n } else if (WDLinLeagueHome.length >= 6) {\n lastThreeFormHome = WDLinLeagueHome.slice(-3);\n lastFiveFormHome = WDLinLeagueHome.slice(-5);\n lastSixFormHome = WDLinLeagueHome.slice(-6);\n lastTenFormHome = Array.from(homeFormString10);\n lastThreeFormAway = WDLinLeagueAway.slice(-3);\n lastFiveFormAway = WDLinLeagueAway.slice(-5);\n lastSixFormAway = WDLinLeagueAway.slice(-6);\n lastTenFormAway = Array.from(awayFormString10);\n leagueOrAll = \"League\";\n\n homeAverageGoals = HomeAverageGoals;\n homeAverageConceded = HomeAverageConceded;\n awayAverageGoals = AwayAverageGoals;\n awayAverageConceded = AwayAverageConceded;\n } else if (WDLinLeagueHome.length >= 5) {\n lastThreeFormHome = WDLinLeagueHome.slice(-3);\n lastFiveFormHome = WDLinLeagueHome.slice(-5);\n lastSixFormHome = Array.from(homeFormString6);\n lastTenFormHome = Array.from(homeFormString10);\n lastThreeFormAway = WDLinLeagueAway.slice(-3);\n lastFiveFormAway = WDLinLeagueAway.slice(-5);\n lastSixFormAway = Array.from(awayFormString6);\n lastTenFormAway = Array.from(awayFormString10);\n leagueOrAll = \"League\";\n\n homeAverageGoals = HomeAverageGoals;\n homeAverageConceded = HomeAverageConceded;\n awayAverageGoals = AwayAverageGoals;\n awayAverageConceded = AwayAverageConceded;\n } else {\n lastThreeFormHome = [\n homeFormString5[2],\n homeFormString5[3],\n homeFormString5[4],\n ];\n lastFiveFormHome = Array.from(homeFormString5);\n lastSixFormHome = Array.from(homeFormString6);\n lastTenFormHome = Array.from(homeFormString10);\n lastThreeFormAway = [\n awayFormString5[2],\n awayFormString5[3],\n awayFormString5[4],\n ];\n\n lastFiveFormAway = Array.from(awayFormString5);\n lastSixFormAway = Array.from(awayFormString6);\n lastTenFormAway = Array.from(awayFormString10);\n\n leagueOrAll = \"All\";\n\n homeAverageGoals = undefined;\n homeAverageConceded = undefined;\n awayAverageGoals = undefined;\n awayAverageConceded = undefined;\n }\n\n formRunHome = Array.from(homeFormRun);\n formRunAway = Array.from(awayFormRun);\n\n if (\n teamPositionHome === 0 ||\n form[0].data[0].season_format !== \"Domestic League\"\n ) {\n teamPositionHome = \"N/A\";\n teamPositionHomeTable = \"N/A\";\n homePrefix = \"\";\n homePrefixHomeTable = \"\";\n }\n\n if (\n teamPositionAway === 0 ||\n form[0].data[0].season_format !== \"Domestic League\"\n ) {\n teamPositionAway = \"N/A\";\n teamPositionAwayTable = \"N/A\";\n awayPrefix = \"\";\n awayPrefixAwayTable = \"\";\n }\n\n allForm.push({\n id: match.id,\n teamIDHome: match.homeId,\n teamIDAway: match.awayId,\n leagueId: leagueID,\n home: {\n teamName: match.homeTeam,\n 0: {\n XGOverall: parseFloat(form[0].data[0].stats.xg_for_avg_overall),\n XG: parseFloat(form[0].data[0].stats.xg_for_avg_home),\n ScoredOverall: parseFloat(\n form[0].data[0].stats.seasonScoredNum_overall\n ),\n ScoredAverage: parseFloat(\n form[0].data[0].stats.seasonScoredAVG_home\n ),\n PlayedHome: parseFloat(\n form[0].data[0].stats.seasonMatchesPlayed_home\n ),\n PlayedAway: parseFloat(\n form[0].data[0].stats.seasonMatchesPlayed_away\n ),\n ConcededOverall: parseFloat(\n form[0].data[0].stats.seasonConcededNum_overall\n ),\n ConcededAverage: parseFloat(\n form[0].data[0].stats.seasonConcededAVG_home\n ),\n XGAgainstAvgOverall: parseFloat(\n form[0].data[0].stats.xg_against_avg_overall\n ),\n XGAgainstAverage: parseFloat(\n form[0].data[0].stats.xg_against_avg_home\n ),\n CleanSheetPercentage: parseFloat(\n form[0].data[0].stats.seasonCSPercentage_overall\n ),\n AveragePossessionOverall: parseFloat(\n form[0].data[0].stats.possessionAVG_overall\n ),\n AveragePossession: parseFloat(\n form[0].data[0].stats.possessionAVG_home\n ),\n AverageShotsOnTargetOverall: parseFloat(\n form[0].data[0].stats.shotsOnTargetAVG_overall\n ),\n AverageShotsOnTarget: parseFloat(\n form[0].data[0].stats.shotsOnTargetAVG_home\n ),\n AverageDangerousAttacksOverall: parseFloat(\n form[0].data[0].stats.dangerous_attacks_avg_overall\n ),\n PPG: parseFloat(form[0].data[0].stats.seasonPPG_overall),\n AttacksHome: parseFloat(form[0].data[0].stats.attacks_avg_home),\n AttacksAway: parseFloat(form[0].data[0].stats.attacks_avg_away),\n AverageDangerousAttacks: parseFloat(\n form[0].data[0].stats.dangerous_attacks_avg_home\n ),\n homeAttackAdvantage: parseFloat(\n form[0].data[0].stats.homeAttackAdvantage\n ),\n homeDefenceAdvantage: parseFloat(\n form[0].data[0].stats.homeDefenceAdvantage\n ),\n BTTSPercentage: parseInt(\n form[0].data[0].stats.seasonBTTSPercentage_home\n ),\n LeagueOrAll: leagueOrAll,\n LeaguePosition: `${teamPositionHome}${homePrefix}`,\n homeRawPosition: homeTeaminLeague.rawPosition\n ? homeTeaminLeague.rawPosition\n : 0,\n homeTeamHomePositionRaw: teamPositionHomeTable,\n LeagueAverageGoals: homeAverageGoals,\n LeagueAverageConceded: homeAverageConceded,\n },\n 1: {\n XGOverall: parseFloat(form[0].data[1].stats.xg_for_avg_overall),\n XG: parseFloat(form[0].data[1].stats.xg_for_avg_home),\n ScoredOverall: parseFloat(\n form[0].data[1].stats.seasonScoredNum_overall\n ),\n ScoredAverage: parseFloat(\n form[0].data[1].stats.seasonScoredAVG_home\n ),\n PlayedHome: parseFloat(\n form[0].data[1].stats.seasonMatchesPlayed_home\n ),\n PlayedAway: parseFloat(\n form[0].data[1].stats.seasonMatchesPlayed_away\n ),\n ConcededOverall: parseFloat(\n form[0].data[1].stats.seasonConcededNum_overall\n ),\n ConcededAverage: parseFloat(\n form[0].data[1].stats.seasonConcededAVG_home\n ),\n XGAgainstAvgOverall: parseFloat(\n form[0].data[1].stats.xg_against_avg_overall\n ),\n XGAgainstAverage: parseFloat(\n form[0].data[1].stats.xg_against_avg_home\n ),\n CleanSheetPercentage: parseFloat(\n form[0].data[1].stats.seasonCSPercentage_overall\n ),\n AveragePossessionOverall: parseFloat(\n form[0].data[1].stats.possessionAVG_overall\n ),\n AveragePossession: parseFloat(\n form[0].data[1].stats.possessionAVG_home\n ),\n AverageShotsOnTargetOverall: parseFloat(\n form[0].data[1].stats.shotsOnTargetAVG_overall\n ),\n AverageShotsOnTarget: parseFloat(\n form[0].data[1].stats.shotsOnTargetAVG_home\n ),\n AverageDangerousAttacksOverall: parseFloat(\n form[0].data[1].stats.dangerous_attacks_avg_overall\n ),\n PPG: parseFloat(form[0].data[1].stats.seasonPPG_overall),\n AttacksHome: parseFloat(form[0].data[1].stats.attacks_avg_home),\n AttacksAway: parseFloat(form[0].data[1].stats.attacks_avg_away),\n AverageDangerousAttacks: parseFloat(\n form[0].data[1].stats.dangerous_attacks_avg_home\n ),\n homeAttackAdvantage: parseFloat(\n form[0].data[1].stats.homeAttackAdvantage\n ),\n homeDefenceAdvantage: parseFloat(\n form[0].data[1].stats.homeDefenceAdvantage\n ),\n BTTSPercentage: parseInt(\n form[0].data[1].stats.seasonBTTSPercentage_home\n ),\n LeagueOrAll: leagueOrAll,\n LeaguePosition: `${teamPositionHome}${homePrefix}`,\n homeRawPosition: homeTeaminLeague.rawPosition\n ? homeTeaminLeague.rawPosition\n : 0,\n homeTeamHomePositionRaw: teamPositionHomeTable,\n LeagueAverageGoals: homeAverageGoals,\n LeagueAverageConceded: homeAverageConceded,\n },\n 2: {\n XGOverall: parseFloat(form[0].data[2].stats.xg_for_avg_overall),\n XG: parseFloat(form[0].data[2].stats.xg_for_avg_home),\n ScoredOverall: parseFloat(\n form[0].data[2].stats.seasonScoredNum_overall\n ),\n ScoredAverage: parseFloat(\n form[0].data[2].stats.seasonScoredAVG_home\n ),\n PlayedHome: parseFloat(\n form[0].data[2].stats.seasonMatchesPlayed_home\n ),\n PlayedAway: parseFloat(\n form[0].data[2].stats.seasonMatchesPlayed_away\n ),\n ConcededOverall: parseFloat(\n form[0].data[2].stats.seasonConcededNum_overall\n ),\n ConcededAverage: parseFloat(\n form[0].data[2].stats.seasonConcededAVG_home\n ),\n XGAgainstAvgOverall: parseFloat(\n form[0].data[2].stats.xg_against_avg_overall\n ),\n XGAgainstAverage: parseFloat(\n form[0].data[2].stats.xg_against_avg_home\n ),\n CleanSheetPercentage: parseFloat(\n form[0].data[2].stats.seasonCSPercentage_overall\n ),\n AveragePossessionOverall: parseFloat(\n form[0].data[2].stats.possessionAVG_overall\n ),\n AveragePossession: parseFloat(\n form[0].data[2].stats.possessionAVG_home\n ),\n AverageShotsOnTargetOverall: parseFloat(\n form[0].data[2].stats.shotsOnTargetAVG_overall\n ),\n AverageShotsOnTarget: parseFloat(\n form[0].data[2].stats.shotsOnTargetAVG_home\n ),\n AverageShots: parseFloat(\n form[0].data[2].stats.shotsAVG_overall\n ),\n AverageShotsHomeOrAway: parseFloat(\n form[0].data[2].stats.shotsAVG_home\n ),\n AverageDangerousAttacksOverall: parseFloat(\n form[0].data[2].stats.dangerous_attacks_avg_overall\n ),\n PPG: parseFloat(form[0].data[2].stats.seasonPPG_overall),\n AttacksHome: parseFloat(form[0].data[2].stats.attacks_avg_home),\n AttacksAway: parseFloat(form[0].data[2].stats.attacks_avg_away),\n AverageDangerousAttacks: parseFloat(\n form[0].data[2].stats.dangerous_attacks_avg_home\n ),\n homeAttackAdvantage: parseFloat(\n form[0].data[2].stats.homeAttackAdvantage\n ),\n homeDefenceAdvantage: parseFloat(\n form[0].data[2].stats.homeDefenceAdvantage\n ),\n BTTSPercentage: parseInt(\n form[0].data[2].stats.seasonBTTSPercentage_home\n ),\n lastThreeForm: lastThreeFormHome.reverse(),\n LastFiveForm: lastFiveFormHome.reverse(),\n LastSixForm: lastSixFormHome.reverse(),\n LastTenForm: lastTenFormHome.reverse(),\n LeagueOrAll: leagueOrAll,\n LeaguePosition: `${teamPositionHome}${homePrefix}`,\n homeRawPosition: homeTeaminLeague.rawPosition\n ? homeTeaminLeague.rawPosition\n : 0,\n homeTeamHomePositionRaw: teamPositionHomeTable,\n SeasonPPG: homeSeasonPPG,\n WinPercentage: homeTeamWinPercentageHome,\n LossPercentage: homeTeamLossPercentageHome,\n DrawPercentage: homeTeamDrawPercentageHome,\n formRun: formRunHome,\n goalDifference:\n form[0].data[2].stats.seasonGoalDifference_overall,\n goalDifferenceHomeOrAway:\n form[0].data[2].stats.seasonGoalDifference_home,\n BttsPercentage:\n form[0].data[2].stats.seasonBTTSPercentage_overall,\n BttsPercentageHomeOrAway:\n form[0].data[2].stats.seasonBTTSPercentage_home,\n CardsTotal: form[0].data[2].stats.cardsTotal_overall,\n CornersAverage: form[0].data[2].stats.cornersAVG_overall,\n ScoredBothHalvesPercentage:\n form[0].data[2].stats.scoredBothHalvesPercentage_overall,\n LastMatch: await convertTimestamp(\n form[0].data[0].last_updated_match_timestamp\n ),\n WDLRecord: WDLinLeagueHome,\n LeagueAverageGoals: homeAverageGoals,\n LeagueAverageConceded: homeAverageConceded,\n },\n },\n away: {\n teamName: match.awayTeam,\n 0: {\n XGOverall: parseFloat(form[1].data[0].stats.xg_for_avg_overall),\n XG: parseFloat(form[1].data[0].stats.xg_for_avg_away),\n ScoredOverall: parseFloat(\n form[1].data[0].stats.seasonScoredNum_overall\n ),\n ScoredAverage: parseFloat(\n form[1].data[0].stats.seasonScoredAVG_away\n ),\n PlayedHome: parseFloat(\n form[1].data[0].stats.seasonMatchesPlayed_home\n ),\n PlayedAway: parseFloat(\n form[1].data[0].stats.seasonMatchesPlayed_away\n ),\n ConcededOverall: parseFloat(\n form[1].data[0].stats.seasonConcededNum_overall\n ),\n ConcededAverage: parseFloat(\n form[1].data[0].stats.seasonConcededAVG_away\n ),\n XGAgainstAvgOverall: parseFloat(\n form[1].data[0].stats.xg_against_avg_overall\n ),\n XGAgainstAverage: parseFloat(\n form[1].data[0].stats.xg_against_avg_away\n ),\n CleanSheetPercentage: parseFloat(\n form[1].data[0].stats.seasonCSPercentage_overall\n ),\n AveragePossessionOverall: parseFloat(\n form[1].data[0].stats.possessionAVG_overall\n ),\n AveragePossession: parseFloat(\n form[1].data[0].stats.possessionAVG_away\n ),\n AverageShotsOnTargetOverall: parseFloat(\n form[1].data[0].stats.shotsOnTargetAVG_overall\n ),\n AverageShotsOnTarget: parseFloat(\n form[1].data[0].stats.shotsOnTargetAVG_away\n ),\n AverageDangerousAttacksOverall: parseFloat(\n form[1].data[0].stats.dangerous_attacks_avg_overall\n ),\n PPG: parseFloat(form[1].data[0].stats.seasonPPG_overall),\n AttacksAverage: parseFloat(\n form[1].data[0].stats.attacks_avg_away\n ),\n AverageDangerousAttacks: parseFloat(\n form[1].data[0].stats.dangerous_attacks_avg_away\n ),\n BTTSPercentage: parseInt(\n form[1].data[0].stats.seasonBTTSPercentage_away\n ),\n LeagueOrAll: leagueOrAll,\n LeaguePosition: `${teamPositionAway}${awayPrefix}`,\n awayRawPosition: awayTeaminLeague.rawPosition\n ? awayTeaminLeague.rawPosition\n : 0,\n awayTeamAwayPositionRaw: teamPositionAwayTable,\n LeagueAverageGoals: awayAverageGoals,\n LeagueAverageConceded: awayAverageConceded,\n },\n 1: {\n XGOverall: parseFloat(form[1].data[1].stats.xg_for_avg_overall),\n XG: parseFloat(form[1].data[1].stats.xg_for_avg_away),\n ScoredOverall: parseFloat(\n form[1].data[1].stats.seasonScoredNum_overall\n ),\n ScoredAverage: parseFloat(\n form[1].data[1].stats.seasonScoredAVG_away\n ),\n PlayedHome: parseFloat(\n form[1].data[1].stats.seasonMatchesPlayed_home\n ),\n PlayedAway: parseFloat(\n form[1].data[1].stats.seasonMatchesPlayed_away\n ),\n ConcededOverall: parseFloat(\n form[1].data[1].stats.seasonConcededNum_overall\n ),\n ConcededAverage: parseFloat(\n form[1].data[1].stats.seasonConcededAVG_away\n ),\n XGAgainstAvgOverall: parseFloat(\n form[1].data[1].stats.xg_against_avg_overall\n ),\n XGAgainstAverage: parseFloat(\n form[1].data[1].stats.xg_against_avg_away\n ),\n CleanSheetPercentage: parseFloat(\n form[1].data[1].stats.seasonCSPercentage_overall\n ),\n AveragePossessionOverall: parseFloat(\n form[1].data[1].stats.possessionAVG_overall\n ),\n AveragePossession: parseFloat(\n form[1].data[1].stats.possessionAVG_away\n ),\n AverageShotsOnTargetOverall: parseFloat(\n form[1].data[1].stats.shotsOnTargetAVG_overall\n ),\n AverageShotsOnTarget: parseFloat(\n form[1].data[1].stats.shotsOnTargetAVG_away\n ),\n AverageDangerousAttacksOverall: parseFloat(\n form[1].data[1].stats.dangerous_attacks_avg_overall\n ),\n PPG: parseFloat(form[1].data[1].stats.seasonPPG_overall),\n AttacksAverage: parseFloat(\n form[1].data[1].stats.attacks_avg_away\n ),\n AverageDangerousAttacks: parseFloat(\n form[1].data[1].stats.dangerous_attacks_avg_away\n ),\n BTTSPercentage: parseInt(\n form[1].data[1].stats.seasonBTTSPercentage_away\n ),\n LeagueOrAll: leagueOrAll,\n LeaguePosition: `${teamPositionAway}${awayPrefix}`,\n awayRawPosition: awayTeaminLeague.rawPosition\n ? awayTeaminLeague.rawPosition\n : 0,\n awayTeamAwayPositionRaw: teamPositionAwayTable,\n LeagueAverageGoals: awayAverageGoals,\n LeagueAverageConceded: awayAverageConceded,\n },\n 2: {\n XGOverall: parseFloat(form[1].data[2].stats.xg_for_avg_overall),\n XG: parseFloat(form[1].data[2].stats.xg_for_avg_away),\n ScoredOverall: parseFloat(\n form[1].data[2].stats.seasonScoredNum_overall\n ),\n ScoredAverage: parseFloat(\n form[1].data[2].stats.seasonScoredAVG_away\n ),\n PlayedHome: parseFloat(\n form[1].data[2].stats.seasonMatchesPlayed_home\n ),\n PlayedAway: parseFloat(\n form[1].data[2].stats.seasonMatchesPlayed_away\n ),\n ConcededOverall: parseFloat(\n form[1].data[2].stats.seasonConcededNum_overall\n ),\n ConcededAverage: parseFloat(\n form[1].data[2].stats.seasonConcededAVG_away\n ),\n XGAgainstAvgOverall: parseFloat(\n form[1].data[2].stats.xg_against_avg_overall\n ),\n XGAgainstAverage: parseFloat(\n form[1].data[2].stats.xg_against_avg_away\n ),\n CleanSheetPercentage: parseFloat(\n form[1].data[2].stats.seasonCSPercentage_overall\n ),\n AveragePossessionOverall: parseFloat(\n form[1].data[2].stats.possessionAVG_overall\n ),\n AveragePossession: parseFloat(\n form[1].data[2].stats.possessionAVG_away\n ),\n AverageShotsOnTargetOverall: parseFloat(\n form[1].data[2].stats.shotsOnTargetAVG_overall\n ),\n AverageShotsOnTarget: parseFloat(\n form[1].data[2].stats.shotsOnTargetAVG_away\n ),\n AverageShots: parseFloat(\n form[1].data[2].stats.shotsAVG_overall\n ),\n AverageShotsHomeOrAway: parseFloat(\n form[1].data[2].stats.shotsAVG_away\n ),\n AverageDangerousAttacksOverall: parseFloat(\n form[1].data[2].stats.dangerous_attacks_avg_overall\n ),\n PPG: parseFloat(form[1].data[2].stats.seasonPPG_overall),\n AttacksAverage: parseFloat(\n form[1].data[2].stats.attacks_avg_away\n ),\n AverageDangerousAttacks: parseFloat(\n form[1].data[2].stats.dangerous_attacks_avg_away\n ),\n BTTSPercentage: parseInt(\n form[1].data[2].stats.seasonBTTSPercentage_away\n ),\n lastThreeForm: lastThreeFormAway.reverse(),\n LastFiveForm: lastFiveFormAway.reverse(),\n LastSixForm: lastSixFormAway.reverse(),\n LastTenForm: lastTenFormAway.reverse(),\n LeagueOrAll: leagueOrAll,\n LeaguePosition: `${teamPositionAway}${awayPrefix}`,\n awayRawPosition: awayTeaminLeague.rawPosition\n ? awayTeaminLeague.rawPosition\n : 0,\n awayTeamAwayPositionRaw: teamPositionAwayTable,\n SeasonPPG: awaySeasonPPG,\n WinPercentage: awayTeamWinPercentageAway,\n LossPercentage: awayTeamLossPercentageAway,\n DrawPercentage: awayTeamDrawPercentageAway,\n formRun: formRunAway,\n goalDifference:\n form[1].data[2].stats.seasonGoalDifference_overall,\n goalDifferenceHomeOrAway:\n form[1].data[2].stats.seasonGoalDifference_away,\n BttsPercentage:\n form[1].data[2].stats.seasonBTTSPercentage_overall,\n BttsPercentageHomeOrAway:\n form[1].data[2].stats.seasonBTTSPercentage_away,\n CardsTotal: form[1].data[2].stats.cardsTotal_overall,\n CornersAverage: form[1].data[2].stats.cornersAVG_overall,\n ScoredBothHalvesPercentage:\n form[1].data[2].stats.scoredBothHalvesPercentage_overall,\n LastMatch: await convertTimestamp(\n form[1].data[0].last_updated_match_timestamp\n ),\n WDLRecord: WDLinLeagueAway,\n LeagueAverageGoals: awayAverageGoals,\n LeagueAverageConceded: awayAverageConceded,\n },\n },\n });\n }\n\n match.homeBadge = fixture.home_image;\n match.awayBadge = fixture.away_image;\n\n match.homePpg = fixture.home_ppg.toFixed(2);\n match.awayPpg = fixture.away_ppg.toFixed(2);\n\n match.lastFiveFormHome = lastFiveFormHome;\n match.lastFiveFormAway = lastFiveFormAway;\n\n match.homeRawPosition = homeTeaminLeague.rawPosition;\n match.awayRawPosition = awayTeaminLeague.rawPosition;\n\n match.homeTeamHomePosition = `${teamPositionHomeTable}${homePrefixHomeTable}`;\n match.awayTeamAwayPosition = `${teamPositionAwayTable}${awayPrefixAwayTable}`;\n\n match.homeTeamHomePositionRaw = teamPositionHomeTable;\n match.awayTeamAwayPositionRaw = teamPositionAwayTable;\n\n match.homeTeamWinPercentage = homeTeamWinPercentageHome;\n match.awayTeamWinPercentage = awayTeamWinPercentageAway;\n\n match.homeTeamLossPercentage = homeTeamLossPercentageHome;\n match.awayTeamLossPercentage = awayTeamLossPercentageAway;\n\n match.homeTeamDrawPercentage = homeTeamDrawPercentageHome;\n match.awayTeamDrawPercentage = awayTeamDrawPercentageAway;\n match.status = fixture.status;\n match.over25Odds = fixture.odds_ft_over25;\n match.btts_potential = fixture.btts_potential;\n match.game = match.homeTeam + \" v \" + match.awayTeam;\n match.stadium = fixture.stadium_name;\n match.homeGoals = fixture.homeGoalCount;\n match.awayGoals = fixture.awayGoalCount;\n\n match.expectedGoalsHomeToDate = fixture.team_a_xg_prematch;\n match.expectedGoalsAwayToDate = fixture.team_b_xg_prematch;\n match.game_week = fixture.game_week;\n\n if (match.status !== \"canceled\" || match.status !== \"suspended\") {\n matches.push(match);\n await createFixture(match, false);\n }\n }\n\n if (matches.length > 0) {\n ReactDOM.render(\n \n getScorePrediction(day)}\n className={\"GeneratePredictions\"}\n />\n
    Prediction engine v4.2.1 (26/04/24)
    \n \n
    \n Use the below filters to remove predictions that don't meet\n the set criteria. These will be greyed out and not included\n in multi-builders and ROI stats\n
    \n
    Goals for/against differential filter (BETA)
    \n
    \n I'm looking for tips where the goal differential between\n teams is at least...\n
    \n \n
    \n Goals for/against home or away differential filter (BETA)\n
    \n
    \n I'm looking for tips where the goal differential (home or\n away only) between teams is at least...\n
    \n \n \n
    XG for/against differential filter (BETA)
    \n
    \n I'm looking for tips where the XG differential between\n teams is at least...\n
    \n \n
    \n \n
    Last 10 points differential filter (BETA)
    \n
    \n I'm looking for tips where the points differential between\n teams is at least...\n
    \n \n
    \n \n
    Choose your risk profile
    \n
    \n I'm looking for tips where the odds are between...\n
    \n \n
    \n
    \n }\n />\n ,\n ,\n document.getElementById(\"GeneratePredictions\")\n );\n }\n\n // }\n }\n\n ReactDOM.render(\n
    \n
    \n
    ,\n document.getElementById(\"Loading\")\n );\n\n async function updateResults(bool) {\n console.log(\"updating results\");\n if (allLeagueResultsArrayOfObjects.length > 0 && bool === true) {\n await fetch(`${process.env.REACT_APP_EXPRESS_SERVER}results`, {\n method: \"DELETE\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n }).then(async () => {\n await fetch(`${process.env.REACT_APP_EXPRESS_SERVER}results`, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(allLeagueResultsArrayOfObjects),\n });\n });\n } else {\n console.log(\"EMPTY RESULTS\");\n }\n }\n\n if (!isStoredLocally) {\n await fetch(`${process.env.REACT_APP_EXPRESS_SERVER}allForm/${date}`, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ allForm }),\n });\n await updateResults(true);\n }\n if (!leaguesStored) {\n await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}leagues/${todaysDate}`,\n {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ leagueArray }),\n }\n );\n }\n // const allFixtures = await RenderAllFixtures(matches, false)\n ReactDOM.render(\n ,\n document.getElementById(\"FixtureContainer\")\n );\n // ReactDOM.render(),document.getElementById(\"FixtureContainer\")\n setTimeout(() => {\n isFunctionRunning = false;\n }, 3000);\n }\n}\n","import React from \"react\";\n\nfunction HeadToHead(props) {\n return (\n
      \n
    • \n {`Venue - ${props.stadium}`}\n
    • \n
      \n
    • \n {`Matches played: ${props.matches}`}\n
    • \n
    • \n {`${props.homeTeam} wins: ${props.homeWins}`}\n
    • \n
    • \n {`${props.awayTeam} wins: ${props.awayWins}`}\n
    • \n
    • \n {`Draws: ${props.draws}`}\n
    • \n
      \n
      \n \n {`Average goals in fixture: ${props.averageGoals}`}\n \n \n {`Best oods for home win @: ${props.bestHomeOdds}`}\n \n \n {`Best oods for away win @: ${props.bestAwayOdds}`}\n \n
      \n \n {`Last meeting - ${props.lastGameStadiumName} ${props.lastGameDate}`}\n \n
      \n \n {`${props.lastGameHomeTeam}`}\n
      \n {`${props.lastGameHomeGoals}`}\n {`${props.lastGameAwayGoals}`}\n
      {`${props.lastGameAwayTeam}`}
      \n
    \n\n \n {`Second to last meeting - ${props.secondToLastGameStadiumName} ${props.secondToLastGameDate}`}\n \n
    \n \n {`${props.secondToLastGameHomeTeam}`}\n
    \n {`${props.secondToLastGameHomeGoals}`}\n {`${props.secondToLastGameAwayGoals}`}\n
    \n {`${props.secondToLastGameAwayTeam}`}\n
    \n
    \n \n );\n}\n\nexport default HeadToHead;\n","import React from \"react\";\nimport { withStyles } from \"@material-ui/core/styles\";\nimport Table from \"@material-ui/core/Table\";\nimport TableBody from \"@material-ui/core/TableBody\";\nimport TableCell from \"@material-ui/core/TableCell\";\nimport TableContainer from \"@material-ui/core/TableContainer\";\nimport TableHead from \"@material-ui/core/TableHead\";\nimport TableRow from \"@material-ui/core/TableRow\";\n\nconst StyledTableCell = withStyles((theme) => ({\n head: {\n // backgroundColor: \"#dedddd\",\n padding: 10,\n textAlign: \"center\",\n fontSize: \"2em\",\n fontFamily: 'inherit',\n // border: \"none\",\n margin: \"none\",\n color: 'white',\n lineHeight: '2em',\n backgroundColor: '#030061',\n },\n body: {\n fontSize: \"2em\",\n fontFamily: 'inherit',\n padding: 10,\n color: 'white',\n // border: \"none\",\n margin: \"none\",\n backgroundColor: '#030061',\n },\n}))(TableCell);\n\nconst StyledTableRow = withStyles((theme) => ({\n root: {\n \"&:nth-of-type(odd)\": {\n backgroundColor: \"#030061\",\n textAlign: \"center\",\n },\n \"&:nth-of-type(even)\": {\n backgroundColor: \"#030052\",\n textAlign: \"center\",\n },\n },\n}))(TableRow);\n\n\nexport default function CustomizedTables(props) {\n\n\n return (\n \n \n \n \n Stat\n H2H history\n XGTipping forecast\n Odds (yes)\n Odds (no)\n \n \n \n \n \n Over 0.5 Goals %\n \n \n {`${props.o05Stat}%`}\n \n {\"-\"}\n {props.o05Odds}\n {props.u05Odds}\n \n \n \n Over 1.5 Goals %\n \n \n {`${props.o15Stat}%`}\n \n {\"-\"}\n {props.o15Odds}\n {props.u15Odds}\n \n \n \n Over 2.5 Goals %\n \n \n {`${props.o25Stat}%`}\n \n {\"-\"}\n {props.o25Odds}\n {props.u25Odds}\n \n \n \n Over 3.5 Goals %\n \n \n {`${props.o35Stat}%`}\n \n {\"-\"}\n {props.o35Odds}\n {props.u35Odds}\n \n \n
    \n
    \n );\n}\n","import ReactDOM from \"react-dom\";\nimport HeadToHead from \"../components/HeadToHead\";\nimport { Fragment } from \"react\";\nimport CustomizedTables from \"../components/Table\";\n\nexport async function getTeamStats(\n id,\n home,\n away,\n homeBTTS,\n homeOnlyBTTS,\n awayBTTS,\n awayOnlyBTTS\n) {\n let identifier = id;\n let bestHomeOdds;\n let bestHomeOddsProvider;\n let bestAwayOdds;\n let bestAwayOddsProvider;\n\n let match = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}match/${identifier}`\n );\n await match.json().then(async (match) => {\n let matchArr = match.data.h2h.previous_matches_ids;\n let previousMatchDetails;\n let secondToPreviousMatchDetails;\n\n let oddsComparisonHomeArray = [];\n let oddsComparisonAwayArray = [];\n\n if (match.data.odds_comparison) {\n oddsComparisonHomeArray = match.data.odds_comparison[\"FT Result\"][1];\n oddsComparisonAwayArray = match.data.odds_comparison[\"FT Result\"][2];\n\n let sortedHomeOdds = Object.entries(oddsComparisonHomeArray).sort(\n (a, b) => b[1] - a[1]\n );\n let sortedAwayOdds = Object.entries(oddsComparisonAwayArray).sort(\n (a, b) => b[1] - a[1]\n );\n\n bestHomeOddsProvider = sortedHomeOdds[0][0];\n bestHomeOdds = sortedHomeOdds[0][1];\n bestAwayOddsProvider = sortedAwayOdds[0][0];\n bestAwayOdds = sortedAwayOdds[0][1];\n } else {\n bestHomeOddsProvider = \"N/A\";\n bestHomeOdds = \"N/A\";\n bestAwayOddsProvider = \"N/A\";\n bestAwayOdds = \"N/A\";\n }\n\n async function getBTTSPercentage(\n homeToal,\n home,\n awayTotal,\n away,\n fixtureHistory\n ) {\n console.log(homeToal)\n console.log(home)\n console.log(awayTotal)\n console.log(away)\n console.log(fixtureHistory)\n\n let total = homeToal + home + awayTotal + away + fixtureHistory;\n return total / 5;\n }\n\n async function getFairOdds(impliedProbability) {\n let impliedProbabilityDivided = impliedProbability / 100;\n return (1 / impliedProbabilityDivided).toFixed(2);\n }\n\n if (match.data.h2h.previous_matches_results.totalMatches > 0) {\n matchArr.sort((a, b) => b.date_unix - a.date_unix);\n let lastMatch = matchArr[0].id;\n let secondMatchExists = true;\n let secondToLastMatch =\n matchArr[1] !== undefined ? matchArr[1].id : false;\n\n let previousMatch = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}match/${lastMatch}`\n );\n let dateObject;\n let date;\n let date2;\n await previousMatch.json().then(async (game) => {\n previousMatchDetails = game.data;\n const unixTimestamp = previousMatchDetails.date_unix;\n const milliseconds = unixTimestamp * 1000;\n dateObject = new Date(milliseconds);\n date = `${dateObject.getDate()}/${\n dateObject.getMonth() + 1\n }/${dateObject.getFullYear()}`;\n\n let secondToPreviousMatch;\n let dateObject2;\n\n if (secondMatchExists !== false) {\n secondToPreviousMatch = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}match/${secondToLastMatch}`\n );\n await secondToPreviousMatch.json().then((game) => {\n secondToPreviousMatchDetails = game.data;\n const unixTimestamp = secondToPreviousMatchDetails.date_unix;\n const milliseconds = unixTimestamp * 1000;\n dateObject2 = new Date(milliseconds);\n date2 = `${dateObject2.getDate()}/${\n dateObject2.getMonth() + 1\n }/${dateObject2.getFullYear()}`;\n });\n }\n });\n\n const BTTSForecast = await getBTTSPercentage(\n homeBTTS,\n homeOnlyBTTS,\n awayBTTS,\n awayOnlyBTTS,\n match.data.h2h.betting_stats.bttsPercentage\n );\n const fairOddsBTTSYes = await getFairOdds(BTTSForecast);\n const fairOddsBTTSNo = await getFairOdds(100 - BTTSForecast);\n console.log(match.data)\n\n ReactDOM.render(\n \n

    Fixture history

    \n \n \n
    ,\n document.getElementById(`H2HStats${identifier}`)\n );\n } else {\n ReactDOM.render(\n
    No fixture history found
    ,\n document.getElementById(`H2HStats${identifier}`)\n );\n }\n });\n}\n","async function getOverOrUnderText(xgSum) {\n let overUnderAchievingSum = xgSum;\n let text;\n switch (true) {\n case overUnderAchievingSum > 1.5:\n text =\n \"Underachieving drastically against their expected goal difference.\";\n break;\n case overUnderAchievingSum > 1.25 && overUnderAchievingSum <= 1.5:\n text =\n \"Underachieving to a large degree against their expected goal difference.\";\n break;\n case overUnderAchievingSum > 1 && overUnderAchievingSum <= 1.25:\n text = \"Underachieving against their expected goal difference.\";\n break;\n case overUnderAchievingSum > 0.75 && overUnderAchievingSum <= 1:\n text =\n \"Underachieving to a small degree against their expected goal difference.\";\n break;\n case overUnderAchievingSum > 0.4 && overUnderAchievingSum <= 0.75:\n text =\n \"Underachieving slighly against their expected goal difference.\";\n break;\n case overUnderAchievingSum > -0.4 && overUnderAchievingSum <= 0.4:\n text =\n \"Roughly tracking on par with their expected goal difference.\";\n break;\n\n case overUnderAchievingSum < -0.4 && overUnderAchievingSum >= -0.75:\n text =\n \"Overachieving slighly against their expected goal difference.\";\n break;\n case overUnderAchievingSum < -0.75 && overUnderAchievingSum >= -1:\n text =\n \"Overachieving to a small degree against their expected goal difference.\";\n break;\n case overUnderAchievingSum < -1 && overUnderAchievingSum >= -1.25:\n text = \"Overachieving against their expected goal difference.\";\n break;\n case overUnderAchievingSum < -1.25 && overUnderAchievingSum >= -1.5:\n text =\n \"Overachieving to a large degree against their expected goal difference.\";\n break;\n case overUnderAchievingSum < -1.5:\n text =\n \"Overachieving drastically against their expected goal difference.\";\n break;\n default:\n text = \"\";\n break;\n }\n return text;\n}\n\nexport async function diff(a, b) {\n return parseFloat(a - b).toFixed(2);\n}\n\nasync function getXGDifferential(xgFor, xgAgainst, goalsFor, goalsAgainst) {\n let xgDiff = xgFor - xgAgainst;\n let goalDiff = goalsFor - goalsAgainst;\n let compareXgAndGoalDiff = await diff(xgDiff, goalDiff);\n\n return compareXgAndGoalDiff;\n}\n\nasync function getAttackingSummary(goalsRecent, goalsLongTerm) {\n\n let text;\n if (goalsRecent >= 3) {\n switch (true) {\n case goalsRecent > goalsLongTerm:\n text = \"Free scoring and improving in front of goal recently.\";\n break;\n case goalsRecent === goalsLongTerm:\n text = \"Free scoring and consistent in front of goal.\";\n break;\n case goalsRecent < goalsLongTerm:\n text = \"Free scoring but less so recently.\";\n break;\n default:\n break;\n }\n } else if (goalsRecent < 3 && goalsRecent >= 2) {\n switch (true) {\n case goalsRecent > goalsLongTerm:\n text =\n \"Impressive scoring stats and improving in front of goal recently.\";\n break;\n case goalsRecent === goalsLongTerm:\n text = \"Impressive scoring stats and consistent in front of goal.\";\n break;\n case goalsRecent < goalsLongTerm:\n text = \"Impressive scoring stats but less so recently.\";\n break;\n default:\n break;\n }\n } else if (goalsRecent < 2 && goalsRecent >= 1) {\n switch (true) {\n case goalsRecent > goalsLongTerm:\n text = \"Decent scoring stats and improving in front of goal recently.\";\n break;\n case goalsRecent === goalsLongTerm:\n text = \"Decent scoring stats and consistent in front of goal.\";\n break;\n case goalsRecent < goalsLongTerm:\n text = \"Decent scoring stats but less so recently.\";\n break;\n default:\n break;\n }\n } else if (goalsRecent < 1 && goalsRecent > 0) {\n switch (true) {\n case goalsRecent > goalsLongTerm:\n text = \"Poor scoring stats but improving in front of goal recently.\";\n break;\n case goalsRecent === goalsLongTerm:\n text = \"Poor scoring stats and consistently poor in front of goal.\";\n break;\n case goalsRecent < goalsLongTerm:\n text = \"Poor scoring stats showing no signs of improvement.\";\n break;\n default:\n break;\n }\n } else if (goalsRecent === 0) {\n switch (true) {\n case goalsRecent === 0:\n text = \"Woeful goal stats in recent games.\";\n break;\n default:\n text = \"\";\n break;\n }\n }\n return text;\n}\n\nasync function getDefenceSummary(cleansheetStat) {\n let text;\n switch (true) {\n case cleansheetStat > 80:\n text = `Incredibly strong defensively, with ${cleansheetStat}% of their games ending in a cleansheet`;\n break;\n case cleansheetStat > 60 && cleansheetStat <= 80:\n text = `Very strong defensively, with ${cleansheetStat}% of their games ending in a cleansheet`;\n break;\n case cleansheetStat > 40 && cleansheetStat <= 60:\n text = `Defensively impressive, with ${cleansheetStat}% of their games ending in a cleansheet`;\n break;\n case cleansheetStat > 20 && cleansheetStat <= 40:\n text = `Defensively, ${cleansheetStat}% of their games have ended in a cleansheet`;\n break;\n case cleansheetStat > 1 && cleansheetStat <= 20:\n text = `Defensively frail, with only ${cleansheetStat}% of their games ending in a cleansheet`;\n break;\n case cleansheetStat === 0:\n text = `Defensively weak, with ${cleansheetStat}% of their games ending in a cleansheet`;\n break;\n default:\n break;\n }\n return text;\n}\n\nasync function GenerateFormSummary(form, lastx, recentForm) {\n let text;\n // let six = lastx[2];\n let ten = lastx[1];\n let five = lastx[0];\n\n let xgSum = await getXGDifferential(\n form.XGOverall,\n form.XGAgainstAvgOverall,\n form.ScoredOverall / 10,\n form.ConcededOverall / 10\n );\n let xgText = await getOverOrUnderText(xgSum);\n let attackString = await getAttackingSummary(\n form.last5Goals,\n form.last10Goals\n );\n let defenceString = await getDefenceSummary(form.CleanSheetPercentage);\n let pointsAverageTotal =\n (parseFloat(five) + parseFloat(ten)) / 2;\n\n if (pointsAverageTotal >= 2.6) {\n switch (true) {\n case five > ten:\n text =\n \"Outstanding recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Outstanding recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Outstanding recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else if (pointsAverageTotal >= 2.3) {\n switch (true) {\n case five > ten:\n text =\n \"Excellent recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Excellent recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Excellent recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else if (pointsAverageTotal >= 2) {\n switch (true) {\n case five > ten:\n text =\n \"Very good recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Very good recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Very good recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else if (pointsAverageTotal >= 1.7) {\n switch (true) {\n case five > ten:\n text =\n \"Good recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Good recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Good recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else if (pointsAverageTotal >= 1.4) {\n switch (true) {\n case five > ten:\n text =\n \"Fairly good recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Fairly good recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Fairly good recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else if (pointsAverageTotal >= 1.1) {\n console.log(2);\n switch (true) {\n case five > ten:\n text =\n \"Average recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Average recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Average recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else if (pointsAverageTotal >= 0.8) {\n switch (true) {\n case five > ten:\n text =\n \"Poor recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Poor recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Poor recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else if (pointsAverageTotal >= 0.5) {\n switch (true) {\n case five > ten:\n text =\n \"Very poor recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Very poor recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Very poor recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else if (pointsAverageTotal < 0.5) {\n switch (true) {\n case five > ten:\n text =\n \"Terrible recent form with improvement over last 5 games.\";\n break;\n case five === ten:\n text =\n \"Terrible recent form which has remained steady over the past 10 games.\";\n break;\n case five < ten:\n text = \"Terrible recent form which has worsened in the last 5.\";\n break;\n default:\n break;\n }\n } else {\n console.log(pointsAverageTotal);\n }\n return text + ` ${xgText} ${attackString} ${defenceString}`;\n}\n\nexport default GenerateFormSummary;\n","// import { light } from \"@material-ui/core/styles/createPalette\";\n// import { toBePartiallyChecked } from \"@testing-library/jest-dom/dist/matchers\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n RadialLinearScale,\n PointElement,\n ArcElement,\n LineElement,\n Filler,\n BarElement,\n Title,\n Tooltip,\n Legend,\n} from \"chart.js\";\nimport { Line, Radar, Bar } from \"react-chartjs-2\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n RadialLinearScale,\n PointElement,\n ArcElement,\n Filler,\n BarElement,\n LineElement,\n Title,\n Tooltip,\n Legend\n);\n\nexport function Chart(props) {\n let length;\n let depth;\n\n if (props.type === \"Points over time\") {\n length = props.data1.length * 3;\n depth = 0;\n } else if (props.type === \"Rolling average points over last 10\") {\n length = Math.abs(props.height);\n depth = 0;\n } else if (Math.abs(props.height) > Math.abs(props.depth)) {\n length = Math.abs(props.height);\n depth = -Math.abs(props.height);\n } else if (Math.abs(props.height) < Math.abs(props.depth)) {\n length = Math.abs(props.depth);\n depth = -Math.abs(props.depth);\n } else {\n length = Math.abs(props.depth);\n depth = -Math.abs(props.depth);\n }\n\n const options = {\n color: \"#030061\",\n responsive: true,\n aspectRatio: 1.2,\n maintainAspectRatio: true,\n layout: {\n padding: 3,\n },\n elements: {\n point: {\n radius: 0,\n },\n },\n scales: {\n y: {\n suggestedMin: depth,\n suggestedMax: length,\n // suggestedMax: Math.max(...props.data1) > 3 ? Math.max(...props.data1) : 3,\n grid: {\n borderWidth: 1,\n borderColor: \"black\",\n },\n ticks: {\n font: {\n size: 12,\n },\n },\n },\n x: {\n title: {\n display: false,\n text: \"Last X Games\",\n font: {\n size: 14,\n },\n },\n grid: {\n borderWidth: 1,\n borderColor: \"black\",\n },\n ticks: {\n display: false,\n font: {\n size: 14,\n },\n },\n },\n },\n plugins: {\n legend: {\n position: \"top\",\n\n labels: {\n boxHeight: 5,\n },\n },\n title: {\n display: true,\n text: props.type,\n color: '#030061',\n font: {\n size: 14,\n },\n },\n },\n };\n\n const labels = Array.from(props.data1.keys());\n\n let data = {\n labels,\n datasets: [\n {\n label: props.team1,\n font: {\n color: \"black\",\n },\n data: props.data1,\n borderColor: \"#030061\",\n borderWidth: 2,\n backgroundColor: \"#030061\",\n tension: props.tension,\n },\n {\n label: props.team2,\n data: props.data2,\n borderColor: \"#970d00\",\n borderWidth: 2,\n backgroundColor: \"#970d00\",\n tension: props.tension,\n },\n ],\n };\n\n return ;\n}\n\nexport function RadarChart(props) {\n const options = {\n color: \"#030061\",\n scales: {\n r: {\n angleLines: {\n display: false,\n },\n suggestedMin: 0,\n suggestedMax: 1,\n ticks: {\n precision: 0,\n display: false,\n },\n // grid: {\n // circular: true,\n // }\n },\n },\n plugins: {\n legend: {\n position: \"top\",\n\n labels: {\n boxHeight: 10,\n color: '#030061'\n },\n },\n title: {\n display: true,\n text: props.title,\n color: '#030061',\n font: {\n size: 14,\n },\n },\n },\n };\n\n let data = {\n labels: [\"Attack rating\", \"Defence rating\", \"Ball retention\", \"XG For\", \"XG Against\", \"Directness\", \"Attacking precision\"],\n datasets: [\n {\n label: props.team1,\n data: props.data,\n fill: true,\n backgroundColor: \"rgba(54, 162, 235, 0.2)\",\n borderColor: \"#030061\",\n pointBackgroundColor: \"#030061\",\n pointBorderColor: \"#fff\",\n pointHoverBackgroundColor: \"#fff\",\n pointHoverBorderColor: \"rgb(255, 99, 132)\",\n borderWidth: 2,\n },\n {\n label: props.team2,\n data: props.data2,\n fill: true,\n backgroundColor: \"rgba(255, 99, 132, 0.2)\",\n borderColor: \"#970d00\",\n pointBackgroundColor: \"#970d00\",\n pointBorderColor: \"#fff\",\n pointHoverBackgroundColor: \"#fff\",\n pointHoverBorderColor: \"rgb(54, 162, 235)\",\n borderWidth: 2,\n },\n ],\n };\n\n return ;\n}\n\nexport function BarChart(props) {\n const datasetOne = props.data1;\n const datasetTwo = props.data2;\n const sum = datasetTwo.map(function (num, idx) {\n return num - datasetOne[idx];\n });\n\n const max = Math.max(...sum);\n const min = Math.min(...sum);\n\n const largest = findLargestNum(max, min);\n\n function findLargestNum(numOne, numTwo) {\n const tempArr = [];\n const firstNum = Math.abs(numOne);\n const secondNum = Math.abs(numTwo);\n tempArr.push(firstNum, secondNum);\n\n return Math.max(...tempArr);\n }\n\n const options = {\n color: \"#030061\",\n indexAxis: \"y\",\n // Elements options apply to all of the options unless overridden in a dataset\n // In this case, we are setting the border of each horizontal bar to be 2px wide\n aspectRatio: 1.3,\n elements: {\n bar: {\n borderWidth: 2,\n },\n },\n scales: {\n x: {\n min: -4,\n max: 4,\n ticks: {\n display: false,\n },\n },\n y: {\n ticks: {\n font: {\n size: 10,\n },\n },\n },\n },\n responsive: true,\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n enabled: false,\n },\n title: {\n display: true,\n text: props.text,\n color: '#030061',\n font: {\n size: 14,\n },\n },\n },\n };\n\n const labels = [\n \"Highest Goals\",\n \"Fewest Conceeded\",\n \"PPG\",\n \"Highest XG\",\n \"Fewest XG Conceeded\",\n \"Shots On Target\",\n \"Dangerous Attacks\",\n \"Av. Possession\",\n \"Home/Away Goal Diff\",\n \"Corners\",\n ];\n\n const data = {\n labels,\n datasets: [\n {\n // label: 'Dataset 1',\n legend: {\n display: false,\n },\n data: sum,\n backgroundColor(context) {\n const index = context.dataIndex;\n const value = context.dataset.data[index];\n return value < 0 ? \"#030061\" : \"#970d00\";\n },\n },\n ],\n };\n\n return ;\n}\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\nconst SofaLineupsWidget = ({ id, team1, team2, time, homeGoals, awayGoals }) => {\n const iframeSrc = `https://widgets.sofascore.com/embed/lineups?id=${id}&widgetBackground=Gray&v=2`;\n\n let differenceInSeconds, minutes\n const currentTime = new Date().getTime() / 1000;\n // Calculate the difference in seconds\n if(time > 0){\n differenceInSeconds = time - currentTime;\n minutes = Math.floor(differenceInSeconds / 60);\n } else {\n minutes = -99999999\n }\n\n\n\n if(team1 === \"N/A\") {\n return
    No lineups available for this match yet
    \n } else if (minutes > 60) {\n return (\n
    \n
    Predicted lineups
    \n \n
    \n
    \n );\n } else if (minutes < 60 && minutes > 0) {\n return (\n
    \n
    Lineups
    \n \n
    \n
    \n );\n } else if (minutes < 0) {\n return (\n
    \n
    Score: {`${team1}: ${homeGoals} - ${team2}: ${awayGoals}`}
    \n Score not live updated\n
    Live attacking momentum and goals
    \n \n
    \n
    Lineups and in-play ratings
    \n \n
    \n
    \n );\n }\n else {\n return
    {`Lineups coming in approximately ${minutes - 60} minutes`}
    ;\n }\n};\n\n\nSofaLineupsWidget.propTypes = {\n id: PropTypes.string.isRequired,\n team1: PropTypes.string.isRequired,\n team2: PropTypes.string.isRequired,\n};\n\nexport default SofaLineupsWidget;\n","import ReactDOM from \"react-dom\";\nimport { Button } from \"../components/Button\";\nimport Stats from \"../components/createStatsDiv\";\nimport Div from \"../components/Div\";\nimport { allForm } from \"../logic/getFixtures\";\nimport { getTeamStats } from \"../logic/getTeamStats\";\nimport { getPointsFromLastX } from \"../logic/getScorePredictions\";\nimport { allLeagueResultsArrayOfObjects } from \"../logic/getFixtures\";\nimport GenerateFormSummary from \"../logic/compareFormTrend\";\nimport { Chart, RadarChart, BarChart } from \"../components/Chart\";\nimport Collapsable from \"../components/CollapsableElement\";\nimport { clicked } from \"../logic/getScorePredictions\";\nimport SofaLineupsWidget from \"../components/SofaScore\";\nimport { arrayOfGames } from \"../logic/getFixtures\";\n\nexport async function calculateAttackingStrength(stats) {\n // Define weights for each metric (you can adjust these based on your preference)\n const weights = {\n // averagePossession: 0.15,\n \"Average Dangerous Attacks\": 0.1,\n \"Average Shots\": 0.05,\n \"Average Shots On Target\": 0.15,\n \"Average Expected Goals\": 0.25,\n \"Recent XG\": 0.15,\n \"Average Goals\": 0.25,\n Corners: 0.05,\n };\n\n // Define the ranges for normalization\n const ranges = {\n // averagePossession: { min: 25, max: 75 },\n \"Average Dangerous Attacks\": { min: 25, max: 75 }, // Adjust the max value as needed\n \"Average Shots\": { min: 4, max: 17 }, // Adjust the max value as needed\n \"Average Shots On Target\": { min: 2, max: 10 }, // Adjust the max value as needed\n \"Average Expected Goals\": { min: 0.25, max: 2.75 }, // Adjust the max value as needed\n \"Recent XG\": { min: 0.25, max: 2.75 }, // Adjust the max value as needed\n \"Average Goals\": { min: 0.25, max: 2.75 }, // Adjust the max value as needed\n Corners: { min: 2, max: 9 },\n };\n\n // Normalize each metric value and calculate the weighted sum\n let weightedSum = 0;\n for (const metric in stats) {\n if (\n stats.hasOwnProperty(metric) &&\n weights.hasOwnProperty(metric) &&\n ranges.hasOwnProperty(metric)\n ) {\n const normalizedValue =\n (stats[metric] - ranges[metric].min) /\n (ranges[metric].max - ranges[metric].min);\n weightedSum += normalizedValue * weights[metric];\n } else {\n console.log(metric);\n }\n }\n\n return parseFloat(weightedSum.toFixed(2));\n}\n\nexport async function calculateDefensiveStrength(stats, normalizedValue = 1) {\n let normValue = normalizedValue;\n // Define weights for each metric (you can adjust these based on your preference)\n const weights = {\n \"Average XG Against\": 0.3,\n \"Recent XG Against\": 0.15,\n \"Average Goals Against\": 0.3,\n \"Average SOT Against\": 0.25,\n };\n\n // Define the ranges for normalization\n const ranges = {\n \"Average XG Against\": { min: 0.25, max: 2.75 }, // Adjust the max value as needed\n \"Recent XG Against\": { min: 0.25, max: 2.75 },\n \"Average Goals Against\": { min: 0.25, max: 2.75 }, // Adjust the max value as needed\n \"Average SOT Against\": { min: 2, max: 10 },\n };\n\n // Normalize each metric value and calculate the weighted sum\n let weightedSum = 0;\n for (const metric in stats) {\n if (\n stats.hasOwnProperty(metric) &&\n weights.hasOwnProperty(metric) &&\n ranges.hasOwnProperty(metric)\n ) {\n let val =\n normValue -\n (stats[metric] - ranges[metric].min) /\n (ranges[metric].max - ranges[metric].min);\n weightedSum += val * weights[metric];\n }\n }\n\n return parseFloat(weightedSum.toFixed(2));\n}\n\nexport async function calculateMetricStrength(metricName, metricValue) {\n // Define weights for each metric (you can adjust these based on your preference)\n const weights = {\n averagePossession: 1,\n xgFor: 1,\n xgAgainst: 1,\n directnessOverall: 1,\n accuracyOverall: 1,\n };\n\n // Define the ranges for normalization\n const ranges = {\n averagePossession: { min: 20, max: 80 },\n xgFor: { min: 0.1, max: 3 },\n xgAgainst: { min: 0.1, max: 3 },\n directnessOverall: { min: 0.5, max: 5 },\n accuracyOverall: { min: 0.5, max: 7 },\n };\n\n // Ensure the metric is valid and exists in the weights and ranges objects\n if (\n !weights.hasOwnProperty(metricName) ||\n !ranges.hasOwnProperty(metricName)\n ) {\n throw new Error(\"Invalid metric name or missing normalization range.\");\n }\n\n // Normalize the metric value\n const normalizedValue =\n (metricValue - ranges[metricName].min) /\n (ranges[metricName].max - ranges[metricName].min);\n\n // Calculate the weighted score\n const weightedScore = normalizedValue * weights[metricName];\n\n return parseFloat(weightedScore.toFixed(2));\n}\n\n// export async function getDefenceStrength(goalsAgainst) {\n// let strength;\n// switch (true) {\n// case goalsAgainst >= 2.8:\n// strength = 1;\n// break;\n// case goalsAgainst >= 2.5 && goalsAgainst < 2.8:\n// strength = 2;\n// break;\n// case goalsAgainst >= 2.2 && goalsAgainst < 2.5:\n// strength = 3;\n// break;\n// case goalsAgainst >= 1.9 && goalsAgainst < 2.2:\n// strength = 4;\n// break;\n// case goalsAgainst >= 1.6 && goalsAgainst < 1.9:\n// strength = 5;\n// break;\n// case goalsAgainst >= 1.3 && goalsAgainst < 1.6:\n// strength = 6;\n// break;\n// case goalsAgainst >= 1 && goalsAgainst < 1.3:\n// strength = 7;\n// break;\n// case goalsAgainst >= 0.7 && goalsAgainst < 1:\n// strength = 8;\n// break;\n// case goalsAgainst >= 0.4 && goalsAgainst < 0.7:\n// strength = 9;\n// break;\n// case goalsAgainst < 0.4:\n// strength = 10;\n// break;\n// default:\n// break;\n// }\n// return strength;\n// }\n\n// export async function getPossessionStrength(possession) {\n// let strength;\n// switch (true) {\n// case possession >= 68:\n// strength = 10;\n// break;\n// case possession >= 64 && possession < 68:\n// strength = 9;\n// break;\n// case possession >= 60 && possession < 64:\n// strength = 8;\n// break;\n// case possession >= 56 && possession < 60:\n// strength = 7;\n// break;\n// case possession >= 52 && possession < 56:\n// strength = 6;\n// break;\n// case possession >= 48 && possession < 52:\n// strength = 5;\n// break;\n// case possession >= 44 && possession < 48:\n// strength = 4;\n// break;\n// case possession >= 40 && possession < 44:\n// strength = 3;\n// break;\n// case possession >= 35 && possession < 40:\n// strength = 2;\n// break;\n// case possession < 35:\n// strength = 1;\n// break;\n// default:\n// break;\n// }\n// return strength;\n// }\n\n// export async function getShotsStrength(Shots) {\n// let strength;\n// switch (true) {\n// case Shots >= 15:\n// strength = 10;\n// break;\n// case Shots >= 14.25 && Shots < 15:\n// strength = 9;\n// break;\n// case Shots >= 13.5 && Shots < 14.25:\n// strength = 8;\n// break;\n// case Shots >= 12.75 && Shots < 13.5:\n// strength = 7;\n// break;\n// case Shots >= 12 && Shots < 12.75:\n// strength = 6;\n// break;\n// case Shots >= 11.25 && Shots < 12:\n// strength = 5;\n// break;\n// case Shots >= 10.5 && Shots < 11.25:\n// strength = 4;\n// break;\n// case Shots >= 9.75 && Shots < 10.5:\n// strength = 3;\n// break;\n// case Shots >= 9 && Shots < 9.75:\n// strength = 2;\n// break;\n// case Shots < 9:\n// strength = 1;\n// break;\n// default:\n// break;\n// }\n// return strength;\n// }\n\n// export async function getShotsStrengthHorA(Shots) {\n// let strength;\n// switch (true) {\n// case Shots >= 19.5:\n// strength = 10;\n// break;\n// case Shots >= 18 && Shots < 19.5:\n// strength = 9;\n// break;\n// case Shots >= 17 && Shots < 18:\n// strength = 8;\n// break;\n// case Shots >= 15.5 && Shots < 17:\n// strength = 7;\n// break;\n// case Shots >= 14 && Shots < 15.5:\n// strength = 6;\n// break;\n// case Shots >= 12.5 && Shots < 14:\n// strength = 5;\n// break;\n// case Shots >= 11 && Shots < 12.5:\n// strength = 4;\n// break;\n// case Shots >= 9.5 && Shots < 11:\n// strength = 3;\n// break;\n// case Shots >= 8 && Shots < 9.5:\n// strength = 2;\n// break;\n// case Shots < 8:\n// strength = 1;\n// break;\n// default:\n// break;\n// }\n// return strength;\n// }\n\n// export async function getXGForStrength(XG) {\n// let strength;\n// switch (true) {\n// case XG >= 2.9:\n// strength = 10;\n// break;\n// case XG >= 2.6 && XG < 2.9:\n// strength = 9;\n// break;\n// case XG >= 2.3 && XG < 2.6:\n// strength = 8;\n// break;\n// case XG >= 2 && XG < 2.3:\n// strength = 7;\n// break;\n// case XG >= 1.7 && XG < 2:\n// strength = 6;\n// break;\n// case XG >= 1.4 && XG < 1.7:\n// strength = 5;\n// break;\n// case XG >= 1.1 && XG < 1.4:\n// strength = 4;\n// break;\n// case XG >= 0.8 && XG < 1.1:\n// strength = 3;\n// break;\n// case XG >= 0.5 && XG < 0.8:\n// strength = 2;\n// break;\n// case XG < 0.5:\n// strength = 1;\n// break;\n// default:\n// break;\n// }\n// return strength;\n// }\n\n// export async function getXGAgainstStrength(XGAgainst) {\n// let strength;\n// switch (true) {\n// case XGAgainst >= 2.9:\n// strength = 1;\n// break;\n// case XGAgainst >= 2.6 && XGAgainst < 2.9:\n// strength = 2;\n// break;\n// case XGAgainst >= 2.3 && XGAgainst < 2.6:\n// strength = 3;\n// break;\n// case XGAgainst >= 2 && XGAgainst < 2.3:\n// strength = 4;\n// break;\n// case XGAgainst >= 1.7 && XGAgainst < 2:\n// strength = 5;\n// break;\n// case XGAgainst >= 1.4 && XGAgainst < 1.7:\n// strength = 6;\n// break;\n// case XGAgainst >= 1.1 && XGAgainst < 1.4:\n// strength = 7;\n// break;\n// case XGAgainst >= 0.8 && XGAgainst < 1.1:\n// strength = 8;\n// break;\n// case XGAgainst >= 0.5 && XGAgainst < 0.8:\n// strength = 9;\n// break;\n// case XGAgainst < 0.5:\n// strength = 10;\n// break;\n// default:\n// break;\n// }\n// return strength;\n// }\n\n// export async function getXGDifferentialStrength(XGDiff) {\n// let strength;\n// switch (true) {\n// case XGDiff >= 1.5:\n// strength = 10;\n// break;\n// case XGDiff >= 1 && XGDiff < 1.5:\n// strength = 9;\n// break;\n// case XGDiff >= 0.5 && XGDiff < 1:\n// strength = 8;\n// break;\n// case XGDiff >= 0.25 && XGDiff < 0.5:\n// strength = 7;\n// break;\n// case XGDiff > 0 && XGDiff < 0.25:\n// strength = 6;\n// break;\n// case XGDiff <= 0 && XGDiff > -0.25:\n// strength = 5;\n// break;\n// case XGDiff <= -0.25 && XGDiff > -0.5:\n// strength = 4;\n// break;\n// case XGDiff <= -0.5 && XGDiff > -1:\n// strength = 3;\n// break;\n// case XGDiff <= -1 && XGDiff > -1.5:\n// strength = 2;\n// break;\n// case XGDiff <= -1.5:\n// strength = 1;\n// break;\n// default:\n// console.log(\"default clause triggered\");\n// break;\n// }\n// return strength;\n// }\n\nexport async function getXGtoActualDifferentialStrength(XGDiff) {\n let strength;\n switch (true) {\n case XGDiff >= 1.5:\n strength = 10;\n break;\n case XGDiff >= 1 && XGDiff < 1.5:\n strength = 9;\n break;\n case XGDiff >= 0.5 && XGDiff < 1:\n strength = 8;\n break;\n case XGDiff >= 0.25 && XGDiff < 0.5:\n strength = 7;\n break;\n case XGDiff > 0 && XGDiff < 0.25:\n strength = 6;\n break;\n case XGDiff <= 0 && XGDiff > -0.25:\n strength = 5;\n break;\n case XGDiff <= -0.25 && XGDiff > -0.5:\n strength = 4;\n break;\n case XGDiff <= -0.5 && XGDiff > -1:\n strength = 3;\n break;\n case XGDiff <= -1 && XGDiff > -1.5:\n strength = 2;\n break;\n case XGDiff <= -1.5:\n strength = 1;\n break;\n default:\n strength = 1;\n break;\n }\n return strength;\n}\n\nlet rollingGoalDiffTotalHome = [];\nlet rollingGoalDiffTotalAway = [];\n\nexport async function createStatsDiv(game, displayBool) {\n console.log(displayBool);\n if (game.status !== \"void\") {\n // takes the displayBool boolean from the fixture onClick and sets the styling of the stats div from there\n function styling(testBool) {\n let bool = testBool;\n if (bool === true && clicked === true) {\n // set stats element to display flex\n return { display: \"block\" };\n } else {\n // set stats element to display none\n return { display: \"none\" };\n }\n }\n let style = styling(displayBool);\n\n if (clicked === false) {\n alert(\"Tap Get Predictions to fetch all game stats first\");\n } else {\n let index = 2;\n let divider = 10;\n\n let gameStats = allForm.find((match) => match.id === game.id);\n const gameArrayHome = [];\n const gameArrayAway = [];\n const gameArrayHomeTeamHomeGames = [];\n const gameArrayAwayTeamAwayGames = [];\n let goalDiffArrayHome;\n let goalDiffArrayAway;\n let goalDiffHomeMovingAv = [];\n let goalDiffAwayMovingAv = [];\n let latestHomeGoalDiff;\n let latestAwayGoalDiff;\n\n var getEMA = (a, r) =>\n a.reduce(\n (p, n, i) =>\n i\n ? p.concat(\n (2 * n) / (r + 1) + (p[p.length - 1] * (r - 1)) / (r + 1)\n )\n : p,\n [a[0]]\n );\n\n const homeForm = gameStats.home[index];\n const awayForm = gameStats.away[index];\n\n if (displayBool === true) {\n // let fixtures = await fetch(\n // `${process.env.REACT_APP_EXPRESS_SERVER}leagueFixtures/${gameStats.leagueId}`\n // );\n\n console.log(gameStats);\n const pos = allLeagueResultsArrayOfObjects\n .map((i) => i.id)\n .indexOf(gameStats.leagueId);\n let matches = allLeagueResultsArrayOfObjects[pos];\n // await fixtures.json().then((matches) => {\n console.log(matches);\n const resultHome = matches.fixtures.filter(\n (game) =>\n game.home_name === gameStats.home.teamName ||\n game.away_name === gameStats.home.teamName\n );\n\n const resultHomeOnly = matches.fixtures.filter(\n (game) => game.home_name === gameStats.home.teamName\n );\n\n resultHome.sort((a, b) => b.date_unix - a.date_unix);\n resultHomeOnly.sort((a, b) => b.date_unix - a.date_unix);\n\n for (let i = 0; i < resultHome.length; i++) {\n let unixTimestamp = resultHome[i].date_unix;\n let milliseconds = unixTimestamp * 1000;\n let dateObject = new Date(milliseconds).toLocaleString(\"en-GB\", {\n timeZone: \"UTC\",\n });\n\n let won;\n let goalsScored;\n let goalsConceeded;\n\n switch (true) {\n case resultHome[i].home_name === gameStats.home.teamName:\n switch (true) {\n case resultHome[i].homeGoalCount > resultHome[i].awayGoalCount:\n won = \"W\";\n goalsScored = resultHome[i].homeGoalCount;\n goalsConceeded = resultHome[i].awayGoalCount;\n break;\n case resultHome[i].homeGoalCount ===\n resultHome[i].awayGoalCount:\n won = \"D\";\n goalsScored = resultHome[i].homeGoalCount;\n goalsConceeded = resultHome[i].awayGoalCount;\n break;\n case resultHome[i].homeGoalCount < resultHome[i].awayGoalCount:\n won = \"L\";\n goalsScored = resultHome[i].homeGoalCount;\n goalsConceeded = resultHome[i].awayGoalCount;\n break;\n default:\n break;\n }\n break;\n case resultHome[i].away_name === gameStats.home.teamName:\n switch (true) {\n case resultHome[i].homeGoalCount > resultHome[i].awayGoalCount:\n won = \"L\";\n goalsScored = resultHome[i].homeGoalCount;\n goalsConceeded = resultHome[i].awayGoalCount;\n break;\n case resultHome[i].homeGoalCount ===\n resultHome[i].awayGoalCount:\n won = \"D\";\n goalsScored = resultHome[i].homeGoalCount;\n goalsConceeded = resultHome[i].awayGoalCount;\n break;\n case resultHome[i].homeGoalCount < resultHome[i].awayGoalCount:\n won = \"W\";\n goalsScored = resultHome[i].homeGoalCount;\n goalsConceeded = resultHome[i].awayGoalCount;\n break;\n default:\n break;\n }\n break;\n default:\n break;\n }\n\n gameArrayHome.push({\n id: resultHome[i].id,\n date: dateObject,\n homeTeam: resultHome[i].home_name,\n homeGoals: resultHome[i].homeGoalCount,\n homeXG: resultHome[i].team_a_xg,\n homeOdds: resultHome[i].odds_ft_1,\n awayTeam: resultHome[i].away_name,\n awayGoals: resultHome[i].awayGoalCount,\n awayXG: resultHome[i].team_b_xg,\n awayOdds: resultHome[i].odds_ft_2,\n won: won,\n homeShots: resultHome[i].team_a_shots,\n awayShots: resultHome[i].team_b_shots,\n homeSot: resultHome[i].team_a_shotsOnTarget,\n awaySot: resultHome[i].team_b_shotsOnTarget,\n homeRed: resultHome[i].team_a_red_cards,\n awayRed: resultHome[i].team_b_red_cards,\n homePossession: resultHome[i].team_a_possession,\n awayPossession: resultHome[i].team_b_possession,\n homeDangerousAttacks: resultHome[i].team_a_dangerous_attacks,\n awayDangerousAttacks: resultHome[i].team_b_dangerous_attacks,\n homePPG: resultHome[i].pre_match_teamA_overall_ppg,\n awayPPG: resultHome[i].pre_match_teamB_overall_ppg,\n unixTimestamp: resultHome[i].date_unix,\n goalsFor: goalsScored,\n goalsAgainst: goalsConceeded,\n btts:\n resultHome[i].homeGoalCount > 0 && resultHome[i].awayGoalCount > 0\n ? \"\\u2714\"\n : \"\\u2718\",\n });\n }\n\n for (let i = 0; i < resultHomeOnly.length; i++) {\n let wonHomeOrAwayOnly;\n\n switch (true) {\n case resultHomeOnly[i].home_name === gameStats.home.teamName:\n switch (true) {\n case resultHomeOnly[i].homeGoalCount >\n resultHomeOnly[i].awayGoalCount:\n wonHomeOrAwayOnly = \"W\";\n gameArrayHomeTeamHomeGames.push(wonHomeOrAwayOnly);\n break;\n case resultHomeOnly[i].homeGoalCount ===\n resultHomeOnly[i].awayGoalCount:\n wonHomeOrAwayOnly = \"D\";\n gameArrayHomeTeamHomeGames.push(wonHomeOrAwayOnly);\n break;\n case resultHomeOnly[i].homeGoalCount <\n resultHomeOnly[i].awayGoalCount:\n wonHomeOrAwayOnly = \"L\";\n gameArrayHomeTeamHomeGames.push(wonHomeOrAwayOnly);\n break;\n default:\n break;\n }\n break;\n\n default:\n break;\n }\n }\n\n console.log(homeForm)\n\n goalDiffArrayHome = homeForm.allTeamResults.map(\n (a) => a.scored - a.conceeded\n );\n\n // goalDiffArrayHome = gameArrayHome.map(\n // (a) => a.goalsFor - a.goalsAgainst\n // );\n\n let r = 5;\n goalDiffHomeMovingAv = getEMA(\n goalDiffArrayHome.reverse(),\n goalDiffArrayHome.length < 5 ? goalDiffArrayHome.length : r\n );\n\n const cumulativeSumHome = (\n (sum) => (value) =>\n (sum += value)\n )(0);\n\n gameArrayHome.sort((a, b) => b.unixTimestamp - a.unixTimestamp);\n\n rollingGoalDiffTotalHome = goalDiffArrayHome.map(cumulativeSumHome);\n\n const resultAway = matches.fixtures.filter(\n (game) =>\n game.away_name === gameStats.away.teamName ||\n game.home_name === gameStats.away.teamName\n );\n\n const resultAwayOnly = matches.fixtures.filter(\n (game) => game.away_name === gameStats.away.teamName\n );\n\n resultAway.sort((a, b) => b.date_unix - a.date_unix);\n resultAwayOnly.sort((a, b) => b.date_unix - a.date_unix);\n\n for (let i = 0; i < resultAway.length; i++) {\n let unixTimestamp = resultAway[i].date_unix;\n let milliseconds = unixTimestamp * 1000;\n let dateObject = new Date(milliseconds).toLocaleString(\"en-GB\", {\n timeZone: \"UTC\",\n });\n\n let won;\n let goalsScored;\n let goalsConceeded;\n\n switch (true) {\n case resultAway[i].home_name === gameStats.away.teamName:\n switch (true) {\n case resultAway[i].homeGoalCount > resultAway[i].awayGoalCount:\n won = \"W\";\n goalsScored = resultAway[i].awayGoalCount;\n goalsConceeded = resultAway[i].homeGoalCount;\n break;\n case resultAway[i].awayGoalCount ===\n resultAway[i].homeGoalCount:\n won = \"D\";\n goalsScored = resultAway[i].awayGoalCount;\n goalsConceeded = resultAway[i].homeGoalCount;\n break;\n case resultAway[i].homeGoalCount < resultAway[i].awayGoalCount:\n won = \"L\";\n goalsScored = resultAway[i].awayGoalCount;\n goalsConceeded = resultAway[i].homeGoalCount;\n break;\n default:\n break;\n }\n break;\n\n case resultAway[i].away_name === gameStats.away.teamName:\n switch (true) {\n case resultAway[i].homeGoalCount > resultAway[i].awayGoalCount:\n won = \"L\";\n goalsScored = resultAway[i].awayGoalCount;\n goalsConceeded = resultAway[i].homeGoalCount;\n break;\n case resultAway[i].homeGoalCount ===\n resultAway[i].awayGoalCount:\n won = \"D\";\n goalsScored = resultAway[i].awayGoalCount;\n goalsConceeded = resultAway[i].homeGoalCount;\n break;\n case resultAway[i].homeGoalCount < resultAway[i].awayGoalCount:\n won = \"W\";\n goalsScored = resultAway[i].awayGoalCount;\n goalsConceeded = resultAway[i].homeGoalCount;\n break;\n default:\n break;\n }\n break;\n default:\n break;\n }\n\n gameArrayAway.push({\n id: resultAway[i].id,\n date: dateObject,\n homeTeam: resultAway[i].home_name,\n homeGoals: resultAway[i].homeGoalCount,\n homeXG: resultAway[i].team_a_xg,\n homeOdds: resultAway[i].odds_ft_1,\n awayTeam: resultAway[i].away_name,\n awayGoals: resultAway[i].awayGoalCount,\n awayXG: resultAway[i].team_b_xg,\n awayOdds: resultAway[i].odds_ft_2,\n won: won,\n homeShots: resultAway[i].team_a_shots,\n awayShots: resultAway[i].team_b_shots,\n homeSot: resultAway[i].team_a_shotsOnTarget,\n awaySot: resultAway[i].team_b_shotsOnTarget,\n homeRed: resultAway[i].team_a_red_cards,\n awayRed: resultAway[i].team_b_red_cards,\n homePossession: resultAway[i].team_a_possession,\n awayPossession: resultAway[i].team_b_possession,\n homeDangerousAttacks: resultAway[i].team_a_dangerous_attacks,\n awayDangerousAttacks: resultAway[i].team_b_dangerous_attacks,\n homePPG: resultAway[i].pre_match_teamA_overall_ppg,\n awayPPG: resultAway[i].pre_match_teamB_overall_ppg,\n unixTimestamp: resultAway[i].date_unix,\n goalsFor: goalsScored,\n goalsAgainst: goalsConceeded,\n btts:\n resultAway[i].homeGoalCount > 0 && resultAway[i].awayGoalCount > 0\n ? \"\\u2714\"\n : \"\\u2718\",\n });\n }\n\n for (let i = 0; i < resultAwayOnly.length; i++) {\n let wonAwayOrAwayOnly;\n\n switch (true) {\n case resultAwayOnly[i].away_name === gameStats.away.teamName:\n switch (true) {\n case resultAwayOnly[i].awayGoalCount >\n resultAwayOnly[i].homeGoalCount:\n wonAwayOrAwayOnly = \"W\";\n gameArrayAwayTeamAwayGames.push(wonAwayOrAwayOnly);\n break;\n case resultAwayOnly[i].awayGoalCount ===\n resultAwayOnly[i].homeGoalCount:\n wonAwayOrAwayOnly = \"D\";\n gameArrayAwayTeamAwayGames.push(wonAwayOrAwayOnly);\n break;\n case resultAwayOnly[i].awayGoalCount <\n resultAwayOnly[i].homeGoalCount:\n wonAwayOrAwayOnly = \"L\";\n gameArrayAwayTeamAwayGames.push(wonAwayOrAwayOnly);\n break;\n default:\n break;\n }\n break;\n\n default:\n break;\n }\n }\n\n goalDiffArrayAway = awayForm.allTeamResults.map(\n (a) => a.scored - a.conceeded\n );\n\n goalDiffAwayMovingAv = getEMA(\n goalDiffArrayAway.reverse(),\n goalDiffArrayAway.length < 5 ? goalDiffArrayAway.length : r\n );\n\n const cumulativeSumAway = (\n (sum) => (value) =>\n (sum += value)\n )(0);\n\n gameArrayAway.sort((a, b) => b.unixTimestamp - a.unixTimestamp);\n\n rollingGoalDiffTotalAway = goalDiffArrayAway.map(cumulativeSumAway);\n\n latestHomeGoalDiff =\n goalDiffHomeMovingAv[goalDiffHomeMovingAv.length - 1];\n latestAwayGoalDiff =\n goalDiffAwayMovingAv[goalDiffAwayMovingAv.length - 1];\n // });\n }\n\n const bttsArrayHome = Array.from(gameArrayHome, (x) => x.btts);\n const bttsArrayAway = Array.from(gameArrayAway, (x) => x.btts);\n const resultsArrayHome = Array.from(gameArrayHome, (x) => x.won);\n const resultsArrayAway = Array.from(gameArrayAway, (x) => x.won);\n\n let homeTeam = gameStats.home.teamName;\n let awayTeam = gameStats.away.teamName;\n\n let time = game.time;\n\n if (homeForm.last3Points === undefined) {\n homeForm.last3Points = getPointsFromLastX(homeForm.lastThreeForm);\n\n homeForm.last5Points = getPointsFromLastX(homeForm.LastFiveForm);\n\n homeForm.last6Points = getPointsFromLastX(homeForm.LastSixForm);\n\n homeForm.last10Points = getPointsFromLastX(homeForm.LastTenForm);\n\n awayForm.last3Points = getPointsFromLastX(awayForm.lastThreeForm);\n\n awayForm.last5Points = getPointsFromLastX(awayForm.LastFiveForm);\n\n awayForm.last6Points = getPointsFromLastX(awayForm.LastSixForm);\n\n awayForm.last10Points = getPointsFromLastX(awayForm.LastTenForm);\n }\n\n async function getPointAverage(pointTotal, games) {\n return pointTotal / games;\n }\n\n // let homeThreeGameAverage = await getPointAverage(\n // homeForm.last3Points,\n // 3\n // );\n\n let homeFiveGameAverage = await getPointAverage(homeForm.last5Points, 5);\n\n let homeSixGameAverage = await getPointAverage(homeForm.last6Points, 6);\n\n let homeTenGameAverage = await getPointAverage(homeForm.last10Points, 10);\n\n // let awayThreeGameAverage = await getPointAverage(\n // awayForm.last3Points,\n // 3\n // );\n\n let awayFiveGameAverage = await getPointAverage(awayForm.last5Points, 5);\n\n let awaySixGameAverage = await getPointAverage(awayForm.last6Points, 6);\n\n let awayTenGameAverage = await getPointAverage(awayForm.last10Points, 10);\n\n async function getPointsFromGames(formArr) {\n const pairings = {\n W: 3,\n D: 1,\n L: 0,\n };\n let newArr = [];\n let arrayOfIndividualPoints = [];\n let sum = 0;\n\n for (let i = 0; i < formArr.length; i++) {\n sum = sum + pairings[formArr[i]];\n newArr.push(sum);\n arrayOfIndividualPoints.push(pairings[formArr[i]]);\n }\n return [newArr, arrayOfIndividualPoints];\n }\n\n async function getLastGameResult(lastGame) {\n let text;\n switch (true) {\n case lastGame === \"L\":\n text = \"Lost\";\n break;\n case lastGame === \"D\":\n text = \"Drew\";\n break;\n case lastGame === \"W\":\n text = \"Won\";\n break;\n default:\n break;\n }\n return text;\n }\n\n let homeFormTrend = [\n homeFiveGameAverage.toFixed(2),\n homeTenGameAverage.toFixed(2),\n ];\n\n let awayFormTrend = [\n awayFiveGameAverage.toFixed(2),\n awayTenGameAverage.toFixed(2),\n ];\n\n let formTextStringHome;\n let formTextStringAway;\n\n if (displayBool === true && gameStats.home[2].LeagueOrAll === \"League\") {\n formTextStringHome = await GenerateFormSummary(\n gameStats.home[2],\n homeFormTrend,\n gameStats.home[0]\n );\n formTextStringAway = await GenerateFormSummary(\n gameStats.away[2],\n awayFormTrend,\n gameStats.away[0]\n );\n } else {\n formTextStringHome = \"\";\n formTextStringAway = \"\";\n }\n\n let favouriteRecordHome, favouriteRecordAway;\n\n\n if(homeForm.oddsReliabilityWin){\n favouriteRecordHome =\n game.homeOdds < game.awayOdds || game.homeOdds === game.awayOdds\n ? `${homeForm.teamName} have been favourites ${\n homeForm.favouriteCount\n } times. Of these games, they have Won: ${homeForm.oddsReliabilityWin.toFixed(\n 0\n )}%, Drawn: ${homeForm.oddsReliabilityDraw.toFixed(\n 0\n )}%, Lost: ${homeForm.oddsReliabilityLose.toFixed(0)}%`\n : `${homeForm.teamName} have been underdogs ${\n homeForm.underdogCount\n } times. Of these games, they have Won: ${homeForm.oddsReliabilityWinAsUnderdog.toFixed(\n 0\n )}%, Drawn: ${homeForm.oddsReliabilityDrawAsUnderdog.toFixed(\n 0\n )}%, Lost: ${homeForm.oddsReliabilityLoseAsUnderdog.toFixed(0)}%`;\n favouriteRecordAway =\n game.homeOdds > game.awayOdds || game.homeOdds === game.awayOdds\n ? `${awayForm.teamName} have been favourites ${\n awayForm.favouriteCount\n } times. Of these games, they have Won: ${awayForm.oddsReliabilityWin.toFixed(\n 0\n )}%, Drawn: ${awayForm.oddsReliabilityDraw.toFixed(\n 0\n )}%, Lost: ${awayForm.oddsReliabilityLose.toFixed(0)}%`\n : `${awayForm.teamName} have been underdogs ${\n awayForm.underdogCount\n } times. Of these games, they have Won: ${awayForm.oddsReliabilityWinAsUnderdog.toFixed(\n 0\n )}%, Drawn: ${awayForm.oddsReliabilityDrawAsUnderdog.toFixed(\n 0\n )}%, Lost: ${awayForm.oddsReliabilityLoseAsUnderdog.toFixed(0)}%`;\n }\n \n\n let homeLastGame = await getLastGameResult(homeForm.LastFiveForm[4]);\n let awayLastGame = await getLastGameResult(awayForm.LastFiveForm[4]);\n\n // let homeAttackStrength = await getAttackStrength(\n // homeForm.ScoredOverall / 10\n // );\n\n const attackingMetricsHome = {\n // averagePossession: homeForm.AveragePossessionOverall,\n \"Average Dangerous Attacks\": homeForm.AverageDangerousAttacksOverall,\n \"Average Shots\": homeForm.AverageShots,\n \"Average Shots On Target\": homeForm.AverageShotsOnTargetOverall,\n \"Average Expected Goals\": homeForm.XGOverall,\n \"Recent XG\": homeForm.XGlast5 ? homeForm.XGlast5 : homeForm.XGOverall,\n \"Average Goals\":\n homeForm.averageScoredLeague !== undefined &&\n homeForm.averageScoredLeague !== null\n ? homeForm.averageScoredLeague\n : homeForm.ScoredOverall / 10,\n };\n const attackingMetricsAway = {\n // averagePossession: awayForm.AveragePossessionOverall,\n \"Average Dangerous Attacks\": awayForm.AverageDangerousAttacksOverall,\n \"Average Shots\": awayForm.AverageShots,\n \"Average Shots On Target\": awayForm.AverageShotsOnTargetOverall,\n \"Average Expected Goals\": awayForm.XGOverall,\n \"Recent XG\": awayForm.XGlast5 ? awayForm.XGlast5 : awayForm.XGOverall,\n \"Average Goals\":\n awayForm.averageScoredLeague !== undefined &&\n awayForm.averageScoredLeague !== null\n ? awayForm.averageScoredLeague\n : awayForm.ScoredOverall / 10,\n };\n\n const defensiveMetricsHome = {\n \"Clean Sheet Percentage\": 100 - homeForm.CleanSheetPercentage,\n \"Average XG Against\": homeForm.XGAgainstAvgOverall,\n \"Recent XG Against\": homeForm.XGAgainstlast5\n ? homeForm.XGAgainstlast5\n : homeForm.XGAgainstAvgOverall,\n \"Average Goals Against\":\n homeForm.averageConceededLeague !== undefined &&\n homeForm.averageConceededLeague !== null\n ? homeForm.averageConceededLeague\n : homeForm.ConcededOverall / 10,\n };\n\n const defensiveMetricsAway = {\n \"Clean Sheet Percentage\": 100 - awayForm.CleanSheetPercentage,\n \"Average XG Against\": awayForm.XGAgainstAvgOverall,\n \"Recent XG Against\": awayForm.XGAgainstlast5\n ? awayForm.XGAgainstlast5\n : awayForm.XGAgainstAvgOverall,\n \"Average Goals Against\":\n awayForm.averageConceededLeague !== undefined &&\n awayForm.averageConceededLeague !== null\n ? awayForm.averageConceededLeague\n : awayForm.ConcededOverall / 10,\n };\n\n let homeAttackStrength;\n let homeAttackStrengthLast5;\n let homeOnlyAttackStrength;\n let homeDefenceStrength;\n let homeDefenceStrengthLast5;\n let homeOnlyDefenceStrength;\n let homePossessionStrength;\n let homePossessionStrengthLast5;\n let homeOnlyPossessionStrength;\n let homeXGForStrength;\n let homeXGForStrengthLast5;\n let homeOnlyXGForStrength;\n let homeXGAgainstStrength;\n let homeXGAgainstStrengthLast5;\n let homeOnlyXGAgainstStrength;\n let awayAttackStrength;\n let awayAttackStrengthLast5;\n let awayOnlyAttackStrength;\n let awayDefenceStrength;\n let awayDefenceStrengthLast5;\n let awayOnlyDefenceStrength;\n let awayPossessionStrength;\n let awayPossessionStrengthLast5;\n let awayOnlyPossessionStrength;\n let awayXGForStrength;\n let awayXGForStrengthLast5;\n let awayOnlyXGForStrength;\n let awayXGAgainstStrength;\n let awayXGAgainstStrengthLast5;\n let awayOnlyXGAgainstStrength;\n let homeDirectnessStrength;\n let homeDirectnessStrengthLast5;\n let homeOnlyDirectnessStrength;\n let awayDirectnessStrength;\n let awayDirectnessStrengthLast5;\n let awayOnlyDirectnessStrength;\n let homeAccuracyOverallStrength;\n let homeAccuracyOverallStrengthLast5;\n let homeOnlyAccuracyOverallStrength;\n let awayAccuracyOverallStrength;\n let awayAccuracyOverallStrengthLast5;\n let awayOnlyAccuracyOverallStrength;\n\n if (homeForm.xgForStrength) {\n console.log(\"not calculating\");\n homeAttackStrength = homeForm.attackingStrength;\n homeAttackStrengthLast5 = homeForm.attackingStrengthLast5;\n homeOnlyAttackStrength = homeForm.attackingStrengthHomeOnly;\n homeDefenceStrength = homeForm.defensiveStrength;\n homeDefenceStrengthLast5 = homeForm.defensiveStrengthLast5;\n homeOnlyDefenceStrength = homeForm.defensiveStrengthHomeOnly;\n homePossessionStrength = homeForm.possessionStrength;\n homePossessionStrengthLast5 = homeForm.possessionStrengthLast5;\n homeOnlyPossessionStrength = homeForm.possessionStrengthHomeOnly;\n homeXGForStrength = homeForm.xgForStrength;\n homeXGForStrengthLast5 = homeForm.xgForStrengthLast5;\n homeOnlyXGForStrength = homeForm.xgForStrengthHomeOnly;\n homeXGAgainstStrength = homeForm.xgAgainstStrength;\n homeXGAgainstStrengthLast5 = homeForm.xgAgainstStrengthLast5;\n homeOnlyXGAgainstStrength = homeForm.xgAgainstStrengthHomeOnly;\n homeDirectnessStrength = homeForm.directnessOverallStrength;\n homeDirectnessStrengthLast5 = homeForm.directnessOverallStrengthLast5;\n homeOnlyDirectnessStrength = homeForm.directnessHomeStrength;\n homeAccuracyOverallStrength = homeForm.accuracyOverallStrength;\n homeAccuracyOverallStrengthLast5 =\n homeForm.accuracyOverallStrengthLast5;\n homeOnlyAccuracyOverallStrength = homeForm.accuracyHomeStrength;\n awayAttackStrength = awayForm.attackingStrength;\n awayAttackStrengthLast5 = awayForm.attackingStrengthLast5;\n awayOnlyAttackStrength = awayForm.attackingStrengthAwayOnly;\n awayDefenceStrength = awayForm.defensiveStrength;\n awayDefenceStrengthLast5 = awayForm.defensiveStrengthLast5;\n awayOnlyDefenceStrength = awayForm.defensiveStrengthAwayOnly;\n awayPossessionStrength = awayForm.possessionStrength;\n awayPossessionStrengthLast5 = awayForm.possessionStrengthLast5;\n awayOnlyPossessionStrength = awayForm.possessionStrengthAwayOnly;\n awayXGForStrength = awayForm.xgForStrength;\n awayXGForStrengthLast5 = awayForm.xgForStrengthLast5;\n awayOnlyXGForStrength = awayForm.xgForStrengthAwayOnly;\n awayXGAgainstStrength = awayForm.xgAgainstStrength;\n awayXGAgainstStrengthLast5 = awayForm.xgAgainstStrengthLast5;\n awayOnlyXGAgainstStrength = awayForm.xgAgainstStrengthAwayOnly;\n awayDirectnessStrength = awayForm.directnessOverallStrength;\n awayDirectnessStrengthLast5 = awayForm.directnessOverallStrengthLast5;\n awayOnlyDirectnessStrength = awayForm.directnessAwayStrength;\n awayAccuracyOverallStrength = awayForm.accuracyOverallStrength;\n awayAccuracyOverallStrengthLast5 =\n awayForm.accuracyOverallStrengthLast5;\n awayOnlyAccuracyOverallStrength = awayForm.accuracyAwayStrength;\n } else {\n homeAttackStrength = await calculateAttackingStrength(\n attackingMetricsHome\n );\n\n homeDefenceStrength = await calculateDefensiveStrength(\n defensiveMetricsHome\n );\n\n homePossessionStrength = await calculateMetricStrength(\n \"averagePossession\",\n homeForm.AveragePossessionOverall\n );\n\n homeXGForStrength = await calculateMetricStrength(\n \"xgFor\",\n gameStats.home[2].XGOverall\n );\n\n homeXGAgainstStrength = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - gameStats.home[2].XGAgainstAvgOverall\n );\n homeDirectnessStrength = await calculateMetricStrength(\n \"directnessOverall\",\n homeForm.directnessOverall\n );\n homeAccuracyOverallStrength = await calculateMetricStrength(\n \"accuracyOverall\",\n homeForm.shootingAccuracy\n );\n\n awayAttackStrength = await calculateAttackingStrength(\n attackingMetricsAway\n );\n awayDefenceStrength = await calculateDefensiveStrength(\n defensiveMetricsAway\n );\n awayPossessionStrength = await calculateMetricStrength(\n \"averagePossession\",\n awayForm.AveragePossessionOverall\n );\n awayXGForStrength = await calculateMetricStrength(\n \"xgFor\",\n gameStats.away[2].XGOverall\n );\n\n awayXGAgainstStrength = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - gameStats.away[2].XGAgainstAvgOverall\n );\n awayDirectnessStrength = await calculateMetricStrength(\n \"directnessOverall\",\n awayForm.directnessOverall\n );\n awayAccuracyOverallStrength = await calculateMetricStrength(\n \"accuracyOverall\",\n awayForm.shootingAccuracy\n );\n }\n\n let [formPointsHome, testArrayHome] = await getPointsFromGames(\n gameStats.home[2].WDLRecord\n );\n let [formPointsAway, testArrayAway] = await getPointsFromGames(\n gameStats.away[2].WDLRecord\n );\n\n let rollingGoalDiffHome = [\n (gameStats.home[0].ScoredOverall - gameStats.home[0].ConcededOverall) /\n 10,\n (gameStats.home[1].ScoredOverall - gameStats.home[1].ConcededOverall) /\n 6,\n (gameStats.home[2].ScoredOverall - gameStats.home[2].ConcededOverall) /\n 5,\n ];\n\n let rollingGoalDiffAway = [\n (gameStats.away[0].ScoredOverall - gameStats.away[0].ConcededOverall) /\n 10,\n (gameStats.away[1].ScoredOverall - gameStats.away[1].ConcededOverall) /\n 6,\n (gameStats.away[2].ScoredOverall - gameStats.away[2].ConcededOverall) /\n 5,\n ];\n\n const formDataMatch = [];\n\n formDataMatch.push({\n btts: game.btts_potential,\n });\n\n const formDataHome = [];\n console.log(gameStats.home[2].LastFiveForm);\n\n formDataHome.push({\n name: game.homeTeam,\n Last5: gameStats.home[2].LastFiveForm,\n LeagueOrAll: gameStats.home[2].LeagueOrAll,\n AverageGoals: homeForm.ScoredOverall / 10,\n AverageConceeded: homeForm.ConcededOverall / 10,\n AverageXG: homeForm.XGOverall,\n AverageXGConceded: homeForm.XGAgainstAvgOverall,\n AveragePossession: homeForm.AveragePossessionOverall,\n AverageShotsOnTarget: homeForm.AverageShotsOnTargetOverall,\n AverageDangerousAttacks: homeForm.AverageDangerousAttacksOverall,\n homeOrAway: \"Home\",\n leaguePosition: homeForm.LeaguePosition,\n Last5PPG: homeForm.PPG,\n SeasonPPG: homeForm.SeasonPPG,\n lastGame: homeLastGame,\n formRun: homeForm.formRun,\n goalDifference: homeForm.goalDifference,\n goalDifferenceHomeOrAway: homeForm.goalDifferenceHomeOrAway,\n // BttsPercentage: homeForm.BttsPercentage || \"-\",\n // BttsPercentageHomeOrAway: homeForm.BttsPercentageHomeOrAway || \"-\",\n CardsTotal: homeForm.CardsTotal || \"-\",\n CornersAverage: homeForm.AverageCorners || \"-\",\n FormTextStringHome: formTextStringHome,\n FavouriteRecord:\n favouriteRecordHome + `. ${homeForm.reliabilityString}`,\n BTTSArray: bttsArrayHome,\n Results: homeForm.resultsAll,\n ResultsHorA: homeForm.resultsHome.reverse(),\n // BTTSAll: homeForm.last10btts,\n // BTTSHorA: homeForm.last10bttsHome,\n });\n\n const formDataAway = [];\n\n formDataAway.push({\n name: game.awayTeam,\n Last5: gameStats.away[2].LastFiveForm,\n LeagueOrAll: gameStats.away[2].LeagueOrAll,\n AverageGoals: awayForm.ScoredOverall / 10,\n AverageConceeded: awayForm.ConcededOverall / 10,\n AverageXG: awayForm.XGOverall,\n AverageXGConceded: awayForm.XGAgainstAvgOverall,\n AveragePossession: awayForm.AveragePossessionOverall,\n AverageShotsOnTarget: awayForm.AverageShotsOnTargetOverall,\n AverageDangerousAttacks: awayForm.AverageDangerousAttacksOverall,\n homeOrAway: \"Away\",\n leaguePosition: awayForm.LeaguePosition,\n Last5PPG: awayForm.PPG,\n SeasonPPG: awayForm.SeasonPPG,\n lastGame: awayLastGame,\n formRun: awayForm.formRun,\n goalDifference: awayForm.goalDifference,\n goalDifferenceHomeOrAway: awayForm.goalDifferenceHomeOrAway,\n // BttsPercentage: awayForm.BttsPercentage || \"-\",\n // BttsPercentageHomeOrAway: awayForm.BttsPercentageHomeOrAway || \"-\",\n CardsTotal: awayForm.CardsTotal || \"-\",\n CornersAverage: awayForm.AverageCorners || \"-\",\n FormTextStringAway: formTextStringAway,\n FavouriteRecord:\n favouriteRecordAway + `. ${awayForm.reliabilityString}`,\n BTTSArray: bttsArrayAway,\n Results: awayForm.resultsAll,\n ResultsHorA: awayForm.resultsAway.reverse(),\n // BTTSAll: awayForm.last10btts,\n // BTTSHorA: awayForm.last10bttsAway,\n });\n\n let formArrayHome;\n let formArrayAway;\n let chartType;\n\n if (formPointsHome.length > 1) {\n formArrayHome = formPointsHome;\n formArrayAway = formPointsAway;\n chartType = \"Points over time\";\n } else {\n formArrayHome = [\n homeTenGameAverage,\n homeSixGameAverage,\n homeFiveGameAverage,\n ];\n formArrayAway = [\n awayTenGameAverage,\n awaySixGameAverage,\n awayFiveGameAverage,\n ];\n chartType = \"Rolling average points over last 10\";\n }\n\n ReactDOM.render(\n
    \n
    \n
    \n
    \n
    ,\n document.getElementById(\"history\" + homeTeam)\n );\n\n //This tournament does not have league positions\n if (game.leagueName === \"Europe UEFA Women's Euro\") {\n game.homeTeamHomePosition = \"N/A\";\n game.awayTeamAwayPosition = \"N/A\";\n }\n\n function singleResult(game) {\n return (\n
    \n
    \n {game.homeXG}\n XG\n {game.awayXG}\n
    \n
    \n {game.homeShots}\n Shots\n {game.awayShots}\n
    \n
    \n {game.homeSot}\n SOT\n {game.awaySot}\n
    \n
    \n {game.homeDangerousAttacks}\n Dangerous Attacks\n {game.awayDangerousAttacks}\n
    \n
    \n {game.homePossession}%\n Possession\n {game.awayPossession}%\n
    \n
    \n {game.homeRed}\n Red cards\n {game.awayRed}\n
    \n
    \n {game.homePPG}\n PPG (pre-match)\n {game.awayPPG}\n
    \n
    \n );\n }\n\n function singleSimilarResult(game) {\n return (\n
    \n
    \n {game.date}\n
    \n {/*
    \n {game.XG}\n XG\n {game.XGAgainst}\n
    \n
    \n {game.sot}\n SOT\n {game.sotAgainst}\n
    \n
    \n {game.possession}%\n Possession\n {100 - game.possession}%\n
    */}\n
    \n );\n }\n\n const overviewHome = gameArrayHome.slice(0, 10).map((game) => (\n
    \n \n
    {game.homeTeam}
    \n \n {game.homeGoals} : {game.awayGoals}\n \n
    {game.awayTeam}
    \n
    \n }\n element={singleResult(game)}\n />\n
    \n ));\n\n const overviewAway = gameArrayAway.slice(0, 10).map((game) => (\n
    \n \n
    {game.homeTeam}
    \n \n {game.homeGoals} : {game.awayGoals}\n \n
    {game.awayTeam}
    \n
    \n }\n element={singleResult(game)}\n />\n
    \n ));\n\n let similarGamesHome;\n\n if (game.simlarGameResultsHome) {\n similarGamesHome = game.simlarGameResultsHome.reverse().map((game) => (\n
    \n \n
    {game.homeTeam}
    \n \n {game.homeGoals} : {game.awayGoals}\n \n
    {game.awayTeam}
    \n
    \n }\n element={singleSimilarResult(game)}\n />\n
    \n ));\n } else {\n similarGamesHome = (\n

    No previous games fit this profile

    \n );\n }\n\n let similarGamesAway;\n if (game.simlarGameResultsAway) {\n similarGamesAway = game.simlarGameResultsAway.reverse().map((game) => (\n
    \n \n
    {game.homeTeam}
    \n \n {game.homeGoals} : {game.awayGoals}\n \n
    {game.awayTeam}
    \n
    \n }\n element={singleSimilarResult(game)}\n />\n
    \n ));\n } else {\n similarGamesAway =

    No previous games fit this profile

    ;\n }\n\n console.log(formDataHome[0].Results);\n\n function StatsHome() {\n return (\n
    \n
      \n \n
    \n
    \n );\n }\n\n function StatsAway() {\n return (\n
    \n
      \n \n
    \n
    \n );\n }\n\n // const allHomeGames = homeForm.WDLRecord.reverse();\n // const allAwayGames = awayForm.WDLRecord.reverse();\n\n // // const pointsHome = getPointsFromLastX(formDataHome[0].Last5);\n // const pointsHome = getPointsFromLastX(allHomeGames);\n // const pointsHomeAv = await getPointAverage(\n // pointsHome,\n // allHomeGames.length\n // );\n // const pointsHomeLast5 = getPointsFromLastX(allHomeGames.slice(0, 5));\n // const pointsHomeAvLast5 = await getPointAverage(pointsHomeLast5, 5);\n // const pointsAway = getPointsFromLastX(allAwayGames);\n // const pointsAwayAv = await getPointAverage(\n // pointsAway,\n // allAwayGames.length\n // );\n // const pointsAwayLast5 = getPointsFromLastX(allAwayGames.slice(0, 5));\n // const pointsAwayAvLast5 = await getPointAverage(pointsAwayLast5, 5);\n\n // console.log(homeForm.WDLRecord.length);\n // console.log(pointsHomeAvLast5);\n // console.log(pointsAwayAvLast5);\n\n let id, team1, team2, timestamp, homeGoals, awayGoals;\n\n\n async function getGameIdByHomeTeam(games, homeTeamName) {\n const matchingGames = games.filter((game) =>\n game.homeTeam.includes(homeTeamName)\n );\n if (matchingGames.length > 0) {\n return matchingGames[0];\n } else {\n return null; // or any other value you prefer to return if no match is found\n }\n }\n\n const matchingGame = await getGameIdByHomeTeam(\n arrayOfGames,\n game.homeTeam\n );\n\n console.log(matchingGame)\n if (matchingGame) {\n id = matchingGame.id.toString();\n team1 = matchingGame.homeTeam;\n team2 = matchingGame.awayTeam;\n timestamp = matchingGame.time;\n homeGoals = matchingGame.homeGoals;\n awayGoals = matchingGame.awayGoals;\n } else {\n id = \"0\";\n team1 = \"N/A\";\n team2 = \"N/A\";\n timestamp = 1;\n homeGoals = \"-\";\n awayGoals = \"-\";\n }\n\n if(homeForm.completeData == true && game.completeData == true){\n ReactDOM.render(\n <>\n
    \n \n \n \n }\n />\n
    \n \n \n \n \n \n 2\n ? Math.max(\n rollingGoalDiffTotalHome[\n rollingGoalDiffTotalHome.length - 1\n ],\n rollingGoalDiffTotalAway[\n rollingGoalDiffTotalAway.length - 1\n ]\n )\n : 2\n }\n depth={\n Math.min(\n rollingGoalDiffTotalHome[\n rollingGoalDiffTotalHome.length - 1\n ],\n rollingGoalDiffTotalAway[\n rollingGoalDiffTotalAway.length - 1\n ]\n ) < -2\n ? Math.min(\n rollingGoalDiffTotalHome[\n rollingGoalDiffTotalHome.length - 1\n ],\n rollingGoalDiffTotalAway[\n rollingGoalDiffTotalAway.length - 1\n ]\n )\n : -2\n }\n data1={rollingGoalDiffTotalHome}\n data2={rollingGoalDiffTotalAway}\n team1={game.homeTeam}\n team2={game.awayTeam}\n type={\"Goal difference over time\"}\n tension={0.3}\n >\n
    \n
    \n
    \n
    \n
    \n
    \n
    {overviewHome}
    \n
    {overviewAway}
    \n
    \n
    \n \n \n
    \n

    Results from similar profile games

    \n (Games where each team had similar odds)\n

    Most recent first

    \n
    \n
    \n {similarGamesHome}\n
    \n
    \n {similarGamesAway}\n
    \n
    \n \n \n getTeamStats(\n game.id,\n game.homeTeam,\n game.awayTeam,\n formDataHome[0].BttsPercentage,\n formDataHome[0].BttsPercentageHomeOrAway,\n formDataAway[0].BttsPercentage,\n formDataAway[0].BttsPercentageHomeOrAway\n )\n }\n text={\"Fixture trends\"}\n >\n
    \n ,\n document.getElementById(\"stats\" + homeTeam)\n );\n } else if (homeForm.completeData = false || game.completeData == false){\n ReactDOM.render(\n <>\n
    \n \n \n \n }\n />\n
    \n \n
    \n
    \n
    \n {/*
    */}\n
    \n {/*
    \n
    {overviewHome}
    \n
    {overviewAway}
    \n
    \n
    \n \n \n
    */}\n

    Results from similar profile games

    \n (Games where each team had similar odds)\n

    Most recent first

    \n
    \n
    \n {similarGamesHome}\n
    \n
    \n {similarGamesAway}\n
    \n
    \n \n \n getTeamStats(\n game.id,\n game.homeTeam,\n game.awayTeam,\n formDataHome[0].BttsPercentage,\n formDataHome[0].BttsPercentageHomeOrAway,\n formDataAway[0].BttsPercentage,\n formDataAway[0].BttsPercentageHomeOrAway\n )\n }\n text={\"Fixture trends\"}\n >\n
    \n ,\n document.getElementById(\"stats\" + homeTeam)\n );\n }\n }\n \n\n // ReactDOM.render(\n // \n // getTeamStats(\n // game.id,\n // game.homeTeam,\n // game.awayTeam,\n // formDataHome[0].BttsPercentage,\n // formDataHome[0].BttsPercentageHomeOrAway,\n // formDataAway[0].BttsPercentage,\n // formDataAway[0].BttsPercentageHomeOrAway\n // )\n // }\n // text={\"Fixture trends\"}\n // >,\n // document.getElementById(`H2HStats${game.id}`)\n // );\n }\n}\n","import React, { Fragment, useState } from \"react\";\nimport { CreateBadge } from \"./createBadge\";\nimport { createStatsDiv } from \"../logic/getStats\";\nimport { renderTable } from \"../logic/getFixtures\";\nimport { allLeagueResultsArrayOfObjects } from \"../logic/getFixtures\";\nimport { useDispatch } from \"react-redux\";\nimport { setData } from \"../logic/dataSlice\";\nimport { Provider } from \"react-redux\";\nimport store from \"../logic/store\"; // Import your Redux store\nimport { formObjectHome } from \"../logic/getScorePredictions\";\nimport { clicked } from \"../logic/getScorePredictions\";\n\nlet resultValue;\nvar count;\nlet mockValue;\nvar setCount;\n\nfunction toggle(bool) {\n count = !bool;\n return count;\n}\n\nfunction GetDivider(fixture, mock) {\n const matchStatus = fixture.status;\n let isPrediction = resultValue;\n\n if (fixture.fixture.omit === true && matchStatus !== \"complete\") {\n isPrediction = true;\n return (\n \n
    {`${fixture.fixture.time}`}
    \n {`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}
    \n \n );\n } else if (mockValue === true && matchStatus === \"complete\") {\n isPrediction = false;\n return (\n \n
    {`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}
    \n {`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}
    \n \n );\n } else if (mockValue === true && matchStatus !== \"complete\") {\n isPrediction = true;\n return (\n \n
    {`${fixture.fixture.time}`}
    \n {`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}
    \n \n );\n } else if (isPrediction === false && matchStatus !== \"complete\") {\n return (\n
    \n {\"V\"}\n
    \n );\n } else if (isPrediction === false && matchStatus === \"complete\") {\n return (\n {`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}
    \n );\n } else if (isPrediction === true && matchStatus === \"complete\") {\n let outcome;\n let prediction;\n\n switch (true) {\n case fixture.fixture.homeGoals > fixture.fixture.awayGoals:\n outcome = 0;\n fixture.fixture.winner = fixture.fixture.homeTeam;\n fixture.fixture.outcome = \"homeWin\";\n break;\n case fixture.fixture.homeGoals === fixture.fixture.awayGoals:\n outcome = 1;\n fixture.fixture.winner = \"draw\";\n fixture.fixture.outcome = \"draw\";\n\n break;\n case fixture.fixture.homeGoals < fixture.fixture.awayGoals:\n outcome = 2;\n fixture.fixture.winner = fixture.fixture.awayTeam;\n fixture.fixture.outcome = \"awayWin\";\n\n break;\n default:\n break;\n }\n\n switch (true) {\n case fixture.fixture.goalsA > fixture.fixture.goalsB:\n prediction = 0;\n break;\n case fixture.fixture.goalsA === fixture.fixture.goalsB:\n prediction = 1;\n break;\n case fixture.fixture.goalsA < fixture.fixture.goalsB:\n prediction = 2;\n break;\n default:\n break;\n }\n\n if (fixture.fixture.omit === true) {\n return (\n \n
    {`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}
    \n {`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}
    \n \n );\n } else if (outcome === prediction) {\n if (fixture.fixture.homeOdds !== 0) {\n switch (true) {\n case outcome === 0:\n fixture.fixture.profit = fixture.fixture.homeOdds;\n break;\n case outcome === 1:\n fixture.fixture.profit = fixture.fixture.drawOdds;\n break;\n case outcome === 2:\n fixture.fixture.profit = fixture.fixture.awayOdds;\n break;\n default:\n break;\n }\n } else fixture.fixture.profit = 1;\n\n if (\n fixture.fixture.goalsA === fixture.fixture.homeGoals &&\n fixture.fixture.goalsB === fixture.fixture.awayGoals\n ) {\n fixture.fixture.exactScore = true;\n return (\n \n
    {`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}
    \n {`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}
    \n \n );\n } else {\n fixture.fixture.exactScore = false;\n return (\n \n
    {`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}
    \n {`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}
    \n \n );\n }\n } else if (outcome !== prediction) {\n if (fixture.fixture.homeOdds !== 0) {\n fixture.fixture.profit = 0;\n } else {\n fixture.fixture.profit = 1;\n }\n fixture.fixture.exactScore = false;\n return (\n \n
    {`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}
    \n {`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}\n
    \n );\n }\n } else {\n return (\n \n
    {`${fixture.fixture.time}`}
    \n {`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}\n
    \n );\n }\n}\n\nfunction renderLeagueName(fixture, mock) {\n mockValue = mock;\n\n let name = fixture.leagueName;\n let id =\n allLeagueResultsArrayOfObjects.length > 0\n ? allLeagueResultsArrayOfObjects[fixture.leagueIndex].id\n : null;\n if (name === null || mock === true) {\n return
    ;\n } else {\n return (\n
    \n \n renderTable(\n fixture.leagueIndex,\n allLeagueResultsArrayOfObjects[fixture.leagueIndex],\n id\n )\n }\n >\n {fixture.leagueName} ☰\n
    \n \n \n );\n }\n}\n\nconst downArrow = \"\\u{2195}\";\nconst rightArrow = \"\\u{29C9}\";\n\nexport let testing;\n\nfunction SingleFixture({ fixture, count, mock }) {\n const dispatch = useDispatch();\n function StoreData() {\n const fixtureDetails = {\n id: fixture.id,\n homeTeamName: fixture.homeTeam,\n homeId: fixture.homeId,\n homeTeamBadge: fixture.homeBadge,\n awayTeamName: fixture.awayTeam,\n awayId: fixture.awayId,\n awayTeamBadge: fixture.awayBadge,\n stadium: fixture.stadium,\n time: fixture.time,\n homeGoals: fixture.goalsA,\n awayGoals: fixture.goalsB,\n };\n\n const homeDetails = {\n \"Attacking Strength\": fixture.formHome.attackingStrength,\n \"Defensive Strength\": fixture.formHome.defensiveStrength,\n };\n\n const awayDetails = {\n \"Attacking Strength\": fixture.formAway.attackingStrength,\n \"Defensive Strength\": fixture.formAway.defensiveStrength,\n };\n\n const dataToSend = {\n key1: \"value1\",\n key2: \"value2\",\n };\n fixture.formHome.defensiveMetrics[\"Clean Sheet Percentage\"] =\n fixture.formHome.CleanSheetPercentage;\n fixture.formAway.defensiveMetrics[\"Clean Sheet Percentage\"] =\n fixture.formAway.CleanSheetPercentage;\n\n localStorage.setItem(\n \"homeForm\",\n JSON.stringify(fixture.formHome.attackingMetrics)\n );\n localStorage.setItem(\n \"homeFormDef\",\n JSON.stringify(fixture.formHome.defensiveMetrics)\n );\n localStorage.setItem(\n \"allTeamResultsHome\",\n JSON.stringify(fixture.formHome.allTeamResults)\n );\n localStorage.setItem(\"homeDetails\", JSON.stringify(homeDetails));\n\n localStorage.setItem(\n \"awayForm\",\n JSON.stringify(fixture.formAway.attackingMetrics)\n );\n localStorage.setItem(\n \"awayFormDef\",\n JSON.stringify(fixture.formAway.defensiveMetrics)\n );\n localStorage.setItem(\n \"allTeamResultsAway\",\n JSON.stringify(fixture.formAway.allTeamResults)\n );\n localStorage.setItem(\"awayDetails\", JSON.stringify(awayDetails));\n\n localStorage.setItem(\"fixtureDetails\", JSON.stringify(fixtureDetails));\n\n dispatch(setData(dataToSend));\n }\n\n async function handleButtonClick(game) {\n if (clicked === true) {\n StoreData(formObjectHome);\n window.open(\"/#/fixture\");\n } else return;\n }\n return (\n
    \n {renderLeagueName(fixture, mock)}\n
    \n \n
    {fixture.fractionHome}
    \n
    {fixture.homeTeam}
    \n \n {/*
    {\"V\"}
    */}\n
    {fixture.awayTeam}
    \n \n \n
    {fixture.fractionAway}
    \n \n \n mock === false ? createStatsDiv(fixture, count) : null\n }\n onMouseDown={() => (count = toggle(count))}\n >\n Game overview {downArrow}\n \n handleButtonClick(fixture)}\n >\n More detail {rightArrow}\n \n {/* */}\n
    \n
    \n
    \n
    \n );\n}\n\nconst List = ({ fixtures, mock }) => (\n
    \n
    \n
      \n {fixtures.map((fixture, i) => (\n \n ))}\n
    \n
    \n);\n\nexport function Fixture(props) {\n [count, setCount] = useState(false);\n resultValue = props.result;\n return (\n \n \n \n );\n}\n","// src/dataSlice.js\nimport { createSlice } from '@reduxjs/toolkit';\n\n// src/dataSlice.js\nconst initialState = {\n dataHome: localStorage.getItem('homeForm'),\n dataAway: localStorage.getItem('awayForm'),\n dataHomeDef: localStorage.getItem('homeFormDef'),\n dataAwayDef: localStorage.getItem('awayFormDef'),\n allTeamResultsHome: localStorage.getItem('allTeamResultsHome'),\n allTeamResultsAway: localStorage.getItem('allTeamResultsAway'),\n homeDetails:localStorage.getItem('homeDetails'),\n awayDetails:localStorage.getItem('awayDetails'),\n fixtureDetails: localStorage.getItem('fixtureDetails')\n};\n\nconst dataSlice = createSlice({\n name: 'data',\n initialState,\n reducers: {\n setData: (state, action) => {\n state.data = action.payload;\n },\n },\n});\n\nexport const { setData } = dataSlice.actions;\n\nexport default dataSlice.reducer;\n","// src/store.js\nimport { configureStore } from '@reduxjs/toolkit';\nimport dataReducer from './dataSlice'; // Your data reducer\n\nconst store = configureStore({\n reducer: {\n data: dataReducer, // Ensure this key matches the key in your initialState\n },\n});\n\nexport default store;\n","import React, { Fragment } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport Header from \"./components/Header\";\nimport { Button } from \"./components/Button\";\nimport OddsRadio from \"./components/OddsRadio\";\nimport { Fixture } from \"./components/Fixture\";\nimport mockedFixtures from \"./data/mockedFixtures.json\";\nimport { selectedOdds } from \"./components/OddsRadio\";\nimport Collapsable from \"./components/CollapsableElement\";\nimport {\n FacebookShareButton,\n FacebookIcon,\n RedditShareButton,\n RedditIcon,\n TelegramShareButton,\n TelegramIcon,\n TwitterShareButton,\n TwitterIcon,\n WhatsappShareButton,\n WhatsappIcon,\n} from \"react-share\";\nimport { generateFixtures } from \"./logic/getFixtures\";\nimport { ThreeDots } from \"react-loading-icons\";\nimport { BrowserRouter as Router, Route, Routes, Link } from \"react-router-dom\";\nimport reactDom from \"react-dom\";\n// require(\"dotenv\").config();\n\nexport const proxyurl = \"https://safe-caverns-99679.herokuapp.com/\";\nexport var fixtureList = [];\nexport let allLeagueData = [];\n\nexport const availableLeagues = [];\nexport var orderedLeagues = [];\n\nconst leagueOrder = [\n 11084, //Euro 2024\n 7432, //World Cup 22\n 9660, //premier league 22/23\n 9663, //championship 22/23\n 9582, //league 1 22/23\n 9581, //league 2 22/23\n 9700, //National league 22/23\n 9665, //La Liga 22/23\n 9636, //Scottish Prem 22/23\n 9655, //Bundesliga 22/23\n 9697, //Serie A 22/23\n 9674, //French Prem 22/23\n 9984, //Portagul Prem 22/23\n 9653, //Dutch Prem 22/23\n 9577, //Belgian Pro League 22/23\n 10969, //sweden 23\n 9545, //Danish Prem 22/23\n 10976, //Norway Prem 23\n 9954, //Austrian Prem 22/23\n 9889, //Greek Prem 22/23\n 9553, //Polish prem 22/23\n 9580, //Swiss prem 22/23\n 10946, //Irish Prem 23\n 9675, //Spanish secunda 22/23\n 9808, //Italy serie B 22/23\n 9656, //Bundesliga 2 22/23\n 9741, //German 3rd tier 22/23\n 9621, //French League 2 22/23\n 9637, //Scottish Championship 22/23\n 9639, //Scottish league 1 22/23\n 9638, //Scottish league 2 22/23\n 9890, //Women's prem 23/24\n 10977, //MLS 23\n 11321, //Brazil prem 24\n 11212, //Argentina prem 23\n 10994, //Japan 22\n 9525, //Mexico prem 23/24\n 9972, //National league North and South 22/23\n 10505, //Australian A league 23/24\n 11102, //S Korea 23\n];\n\nlet today;\nlet todayFootyStats;\nlet todaySS\nlet tomorrow;\nlet tomorrowFootyStats;\nlet tomorrowSS;\nlet date;\nlet dateSS;\nlet dateFootyStats;\nlet yesterday;\nlet yesterdayFootyStats;\nlet yesterdaySS\nlet lastSaturday;\nlet lastSaturdayFootyStats;\nlet lastSaturdaySS;\nlet historic;\nlet historicFootyStats;\nlet historicSS;\nlet tomorrowsDate;\nlet yesterdaysDate;\nlet saturdayDate;\nlet historicDate;\nlet string;\nlet dateString;\n\n(async function fetchLeagueData() {\n let leagueList;\n\n leagueList = await fetch(`${process.env.REACT_APP_EXPRESS_SERVER}leagueList`);\n\n let leagueArray;\n await leagueList.json().then((leagues) => {\n leagueArray = Array.from(leagues.data);\n });\n\n for (let i = 0; i < leagueArray.length; i++) {\n const league = leagueArray[i];\n const name = leagueArray[i].name;\n\n for (let x = 0; x < league.season.length; x++) {\n const element = league.season[x];\n\n if (element.year === 2024 || element.year === 20232024) {\n if (element.id !== 4340 && element.id !== 6935 && element.id !== 7061) {\n availableLeagues.push({ name: name, element });\n }\n }\n }\n\n async function mapOrder(array, order, key) {\n array.sort(function (a, b) {\n var A = a.element[key],\n B = b.element[key];\n\n if (order.indexOf(A) > order.indexOf(B)) {\n return 1;\n } else {\n return -1;\n }\n });\n return array;\n }\n //leagues ordered by id\n orderedLeagues = await mapOrder(availableLeagues, leagueOrder, \"id\");\n }\n return orderedLeagues;\n})();\n\nexport async function getLeagueList() {\n let i = 0;\n date = new Date();\n string = \"Today\";\n\n async function incrementDate(num, date) {\n i = i + num;\n date.setDate(date.getDate() + num);\n dateSS = await convertTimestampForSofaScore(date);\n\n [date, dateFootyStats] = await calculateDate(date);\n string = dateFootyStats;\n await renderButtons();\n }\n\n async function decrementDate(num, date) {\n i = i - num;\n console.log(i);\n if (i > -120) {\n date.setDate(date.getDate() - num);\n dateSS = await convertTimestampForSofaScore(date);\n [date, dateFootyStats] = await calculateDate(date);\n string = dateFootyStats;\n dateString = date;\n await renderButtons();\n }\n }\n\n async function calculateDate(dateString) {\n const day = dateString.getDate();\n const month = dateString.getMonth() + 1;\n const year = dateString.getFullYear();\n return [`${month}${day}${year}`, `${year}-${month}-${day}`];\n }\n\n [today, todayFootyStats] = await calculateDate(new Date());\n\n tomorrowsDate = new Date();\n tomorrowsDate.setDate(tomorrowsDate.getDate() + 1);\n [tomorrow, tomorrowFootyStats] = await calculateDate(tomorrowsDate);\n\n yesterdaysDate = new Date();\n yesterdaysDate.setDate(yesterdaysDate.getDate() - 1);\n [yesterday, yesterdayFootyStats] = await calculateDate(yesterdaysDate);\n\n saturdayDate = new Date();\n saturdayDate.setDate(\n saturdayDate.getDate() - ((saturdayDate.getDay() + 6) % 7)\n );\n saturdayDate.setDate(saturdayDate.getDate() - 2);\n [lastSaturday, lastSaturdayFootyStats] = await calculateDate(saturdayDate);\n\n historicDate = new Date();\n historicDate.setDate(\n historicDate.getDate() - ((historicDate.getDay() + 6) % 7)\n );\n historicDate.setDate(historicDate.getDate() - 9);\n [historic, historicFootyStats] = await calculateDate(historicDate);\n\n\n async function convertTimestampForSofaScore(timestamp) {\n let newDate = new Date(timestamp);\n \n let year = newDate.getFullYear();\n let month = String(newDate.getMonth() + 1).padStart(2, '0'); // Adding 1 to month because it is zero-based\n let day = String(newDate.getDate()).padStart(2, '0');\n \n let converted = `${year}-${month}-${day}`;\n \n return converted;\n }\n\n todaySS = await convertTimestampForSofaScore(new Date());\n tomorrowSS = await convertTimestampForSofaScore(tomorrowsDate);\n yesterdaySS = await convertTimestampForSofaScore(yesterdaysDate);\n lastSaturdaySS = await convertTimestampForSofaScore(saturdayDate);\n historicSS = await convertTimestampForSofaScore(historicDate);\n\n const text =\n \"Select a day you would like to retrieve fixtures for from the options above\\n A list of games will be returned once the data has loaded\\n Once all fixtures have loaded, click on “Get Predictions” to see XGTipping's forecasted outcomes for every game\\n If a game has completed, the predictions is displayed on the right and the actual result on the left\\n Each individual fixture is tappable/clickable. By doing so, you can access a range of detailed stats, from comparative charts, granular performance measures to previous meetings.\\n All games are subject to the same automated prediction algorithm with the outcome being a score prediction. Factors that determine the tip include the following, amongst others:\\n - Goal differentials\\n - Expected goal differentials \\n - Attack/Defence performance\\n - Form trends over time\\n - Home/Away records\\n - WDL records\\n - Points per game \\n - A range of other comparative factors\\n –\\n\";\n\n const text2 =\n \"A range of tools are available should you wish to use them\\n Build a multi - Use the '+' or '-' buttons to add or remove a game deemed to be one of XGTIpping's highest confidence tips from the day\\n Exotic of the day: A pre-built exotic multi comprising of XGTipping's highest confidence tips\\n BTTS games: Games where both teams to score is deemed a likely outcome\\n Over 2.5 goals tips: Games where over 2.5 goals are most likely to be scored\\n XG tips: Comprises only games where the expected goal differentials between each team are at their greatest. We believe this shows a true disparity in the form of the two opposing teams\\n Tap the 'How to use' option to hide this text\";\n\n let textJoined = text.concat(text2);\n\n let newText = textJoined.split(\"\\n\").map((i) => {\n return

    {i}

    ;\n });\n\n async function renderButtons() {\n ReactDOM.render(\n
    \n
    \n \n fixtureList.push(\n await generateFixtures(\n \"lastSaturday\",\n lastSaturday,\n selectedOdds,\n lastSaturdayFootyStats,\n false,\n today,\n lastSaturdaySS\n )\n )\n }\n />\n
    \n await decrementDate(1, date)}\n />\n \n fixtureList.push(\n await generateFixtures(\n \"todaysFixtures\",\n dateString,\n selectedOdds,\n dateFootyStats,\n false,\n today,\n dateSS\n )\n )\n }\n />\n \n fixtureList.push(\n await generateFixtures(\n \"todaysFixtures\",\n today,\n selectedOdds,\n todayFootyStats,\n true,\n today,\n todaySS\n )\n )\n }\n />\n \n fixtureList.push(\n await generateFixtures(\n \"tomorrowsFixtures\",\n tomorrow,\n selectedOdds,\n tomorrowFootyStats,\n true,\n today,\n tomorrowSS\n )\n )\n }\n />\n
    ,\n document.getElementById(\"Buttons\")\n );\n }\n\n ReactDOM.render(\n
    \n
    \n \n fixtureList.push(\n await generateFixtures(\n \"lastSaturday\",\n lastSaturday,\n selectedOdds,\n lastSaturdayFootyStats,\n false,\n today,\n lastSaturdaySS\n )\n )\n }\n />\n {/* \n fixtureList.push(\n await generateFixtures(\n \"historic\",\n historic,\n selectedOdds,\n historicFootyStats\n )\n )\n }\n /> */}\n
    \n await decrementDate(1, date)}\n />\n \n fixtureList.push(\n await generateFixtures(\n \"todaysFixtures\",\n today,\n selectedOdds,\n todayFootyStats,\n true,\n today,\n todaySS\n )\n )\n }\n />\n \n fixtureList.push(\n await generateFixtures(\n \"tomorrowsFixtures\",\n tomorrow,\n selectedOdds,\n tomorrowFootyStats,\n true,\n today,\n tomorrowSS\n )\n )\n }\n />\n \n *Not enough data to predict games in the first few gameweeks -\n predictions displayed as 'x - x'\n \n
    ,\n document.getElementById(\"Buttons\")\n );\n ReactDOM.render(\n
    \n \n \n
    ,\n document.getElementById(\"Checkbox\")\n );\n ReactDOM.render(\n \n \n ,\n document.getElementById(\"XGDiff\")\n );\n\n // ReactDOM.render(\n // {\n // let leagues = await getLowestScoringLeagues();\n // const leagueList = [];\n\n // leagues.forEach(async (league) =>\n // leagueList.push(\n //
      \n //

      \n // {league.league} ({league.leagueCountry})\n //

      \n //
    • Average goals: {league.averageGoals}
    • \n //
    • Under 2.5 goals %: {league.under25Percentage}%
    • \n //
    \n // )\n // );\n\n // reactDom.render(\n //
    \n //

    Leagues with the lowest scoring games

    \n //
      {leagueList}
    \n //
    ,\n // document.getElementById(\"Under25Games\")\n // );\n // }}\n // >,\n // document.getElementById(\"Under25Games\")\n // );\n\n // ReactDOM.render(\n // {\n // let leagues = await getHighestScoringLeagues();\n // const leagueList = [];\n\n // leagues.forEach(async (league) =>\n // leagueList.push(\n //
      \n //

      \n // {league.league} ({league.leagueCountry})\n //

      \n //
    • Average goals: {league.averageGoals}
    • \n //
    • Over 2.5 goals %: {league.over25Percentage}%
    • \n //
    \n // )\n // );\n\n // reactDom.render(\n //
    \n //

    Leagues with the highest scoring games

    \n //
      {leagueList}
    \n //
    ,\n // document.getElementById(\"Over25Games\")\n // );\n // }}\n // >,\n // document.getElementById(\"Over25Games\")\n // );\n}\n\nasync function getHighestScoringLeagues() {\n let teamsList = await fetch(`${process.env.REACT_APP_EXPRESS_SERVER}over25`);\n let arr = [];\n await teamsList.json().then(async (leagues) => {\n for (let index = 0; index < 215; index++) {\n const league = {\n league: leagues.data.top_leagues.data[index].name,\n leagueCountry: leagues.data.top_leagues.data[index].country,\n averageGoals: leagues.data.top_leagues.data[index].seasonAVG_overall,\n over25Percentage:\n leagues.data.top_leagues.data[index].seasonOver25Percentage_overall,\n division: leagues.data.top_leagues.data[index].division,\n leagueId: leagues.data.top_leagues.data[index].id,\n };\n arr.push(league);\n }\n });\n\n const finalArray = arr.filter(\n (league) =>\n leagueOrder.find((element) => element === league.leagueId) &&\n league.averageGoals >= 2.5\n );\n\n let sortedArray = finalArray.sort((a, b) => b.averageGoals - a.averageGoals);\n\n return sortedArray;\n}\n\nasync function getLowestScoringLeagues() {\n let teamsList = await fetch(`${process.env.REACT_APP_EXPRESS_SERVER}under25`);\n let arr = [];\n await teamsList.json().then(async (leagues) => {\n for (let index = 0; index < 215; index++) {\n const league = {\n league: leagues.data.top_leagues.data[index].name,\n leagueCountry: leagues.data.top_leagues.data[index].country,\n averageGoals: leagues.data.top_leagues.data[index].seasonAVG_overall,\n under25Percentage:\n leagues.data.top_leagues.data[index].seasonUnder25Percentage_overall,\n leagueId: leagues.data.top_leagues.data[index].id,\n };\n arr.push(league);\n }\n });\n\n const finalArray = arr.filter(\n (league) =>\n leagueOrder.find((element) => element === league.leagueId) &&\n league.averageGoals < 2.5\n );\n\n let sortedArray = finalArray.sort((a, b) => a.averageGoals - b.averageGoals);\n\n return sortedArray;\n}\n\nconst welcomeTextUnsplitOne = `Welcome to XGTipping. Your go-to resource for all things football, from predictions, comprehensive head to head stats, results, xg scores, odds, league tables, form, and bespoke multi-builders underpinned by expected goal (XG) data.\\n `;\nlet welcomeTextOne = welcomeTextUnsplitOne.split(\"\\n\").map((i) => {\n return

    {i}

    ;\n});\n\nconst welcomeTextUnsplitTwo = `XGTipping is completely independent and free to use, relying on a donation model to support running costs. For feedback or feature ideas, get in touch at @TippingXg.`;\nlet welcomeTextTwo = welcomeTextUnsplitTwo.split(\"\\n\").map((i) => {\n return

    {i}

    ;\n});\n\nfunction App() {\n getLeagueList();\n return (\n <>\n
    \n
    \n \n r/xgtipping\n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    Loading all fixture and form data...
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n {/* */}\n
    \n
    \n
    {welcomeTextOne}
    \n
    \n Below is an example of our tips/results overview for you to\n familiarise yourself with. Get real fixtures using the date buttons,\n above. When loaded, tap on one to see full match stats\n
    \n
    \n Home odds\n \n Result / KO Time\n Our Prediction\n \n Away odds\n
    \n \n
    \n
    {welcomeTextTwo}
    \n
    \n We cover a range of leagues, including\n
      \n
    • Premier League
    • \n
    • English Football League
    • \n
    • La Liga
    • \n
    • Serie A
    • \n
    • Bundesliga
    • \n
    • Ligue 1
    • \n
    • MLS
    • \n
    • Primeira Liga
    • \n
    • Loads more...
    • \n
    \n
    \n
    \n
    \n
    Raw data from
    \n \n footystats.org\n \n
    \n
    \n We aim to remain free to use, contributions are always appreciated\n though:\n \n Donations\n \n ₿itcoin address\n \n bc1q7j62txkvhfu0dt3l0s07saze6pjnyzs26wfgp0\n \n
    \n
    \n
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n
    \n \n );\n}\n\nexport default App;\n\n// import React from \"react\";\n// import { BrowserRouter as Router, Route, Routes, Link } from \"react-router-dom\";\n// import HomePage from \"./components/HomePage\";\n// import TeamPage from \"./components/Team\";\n\n// const App = () => {\n// return (\n// \n// \n// } />\n// } />\n// {/* Add more routes */}\n// \n// \n// );\n// };\n\n// export default App;\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React, { useState, useEffect } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { CreateBadge } from \"./createBadge\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n} from \"chart.js\";\nimport { Bar } from \"react-chartjs-2\";\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend\n);\n\nfunction TeamPage() {\n const [dataState, setData] = useState([]);\n\n useEffect(() => {\n fetchData();\n }, []);\n\n const fetchData = async () => {\n try {\n const responseHome = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}team/${storedFixtureDetailsJson.homeId}`\n );\n const resultHome = await responseHome.json();\n\n const responseAway = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}team/${storedFixtureDetailsJson.awayId}`\n );\n const resultAway = await responseAway.json();\n // setData(result.data.stadium_name);\n\n let indexHome = resultHome.data.findIndex(\n (x) => x.season_format === \"Domestic League\"\n );\n let indexAway = resultAway.data.findIndex(\n (x) => x.season_format === \"Domestic League\"\n );\n\n setData((test) => ({\n ...test,\n scoredOverallHome:\n resultHome.data[indexHome].stats.seasonScoredNum_overall,\n playedHomeOnly:\n resultHome.data[indexHome].stats.seasonMatchesPlayed_home,\n scoredOverallHomeOnly:\n resultHome.data[indexHome].stats.seasonScoredNum_home,\n conceededOverallHome:\n resultHome.data[indexHome].stats.seasonConcededNum_overall,\n conceededOverallHomeOnly:\n resultHome.data[indexHome].stats.seasonConcededNum_home,\n\n PPGOverallHome: resultHome.data[indexHome].stats.seasonPPG_overall,\n PPGOverallHomeOnly: resultHome.data[indexHome].stats.seasonPPG_home,\n leaguePosition_overallHome:\n resultHome.data[indexHome].stats.leaguePosition_overall,\n leaguePosition_HomeOnly:\n resultHome.data[indexHome].stats.leaguePosition_home,\n averageAttendance:\n resultHome.data[indexHome].stats.average_attendance_home,\n BTTSPercentage_overallHome:\n resultHome.data[indexHome].stats.seasonBTTSPercentage_overall,\n BTTSAndWinPercentage_Home:\n resultHome.data[indexHome].stats.BTTS_and_win_percentage_overall,\n BTTSAndLosePercentage_Home:\n resultHome.data[indexHome].stats.BTTS_and_lose_percentage_overall,\n BTTSBothHalvesHome:\n resultHome.data[indexHome].stats.BTTS_both_halves_percentage_overall,\n GoalDifferenceHT_overall_Home:\n resultHome.data[indexHome].stats.GoalDifferenceHT_overall,\n GD_2hg_overall_Home: resultHome.data[indexHome].stats.gd_2hg_overall,\n leadingAtHTPercentage_overallHome:\n resultHome.data[indexHome].stats.leadingAtHTPercentage_overall,\n seasonOver15Percentage_overallHome:\n resultHome.data[indexHome].stats.seasonOver15Percentage_overall,\n seasonOver25Percentage_overallHome:\n resultHome.data[indexHome].stats.seasonOver25Percentage_overall,\n seasonOver35Percentage_overallHome:\n resultHome.data[indexHome].stats.seasonOver35Percentage_overall,\n seasonOver45Percentage_overallHome:\n resultHome.data[indexHome].stats.seasonOver45Percentage_overall,\n scoredBothHalvesPercentage_overallHome:\n resultHome.data[indexHome].stats.scoredBothHalvesPercentage_overall,\n shots_on_target_per_goals_scored_overallHome:\n resultHome.data[indexHome].stats.additional_info\n .shots_on_target_per_goals_scored_overall,\n cornersTotalAVG_overallHome:\n resultHome.data[indexHome].stats.cornersTotalAVG_overall,\n cardsAVG_overallHome: resultHome.data[indexHome].stats.cardsAVG_overall,\n foulsAVG_overallHome: resultHome.data[indexHome].stats.foulsAVG_overall,\n penalties_won_per_match_overallHome:\n resultHome.data[indexHome].stats.additional_info\n .penalties_won_per_match_overall,\n penalty_in_a_match_percentage_overallHome:\n resultHome.data[indexHome].stats.additional_info\n .penalty_in_a_match_percentage_overall,\n\n scoredOverallAway:\n resultAway.data[indexAway].stats.seasonScoredNum_overall,\n playedAwayOnly:\n resultAway.data[indexAway].stats.seasonMatchesPlayed_away,\n scoredOverallAwayOnly:\n resultAway.data[indexAway].stats.seasonScoredNum_away,\n conceededOverallAway:\n resultAway.data[indexAway].stats.seasonConcededNum_overall,\n conceededOverallAwayOnly:\n resultAway.data[indexAway].stats.seasonConcededNum_away,\n\n PPGOverallAway: resultAway.data[indexAway].stats.seasonPPG_overall,\n PPGOverallAwayOnly: resultAway.data[indexAway].stats.seasonPPG_away,\n leaguePosition_overallAway:\n resultAway.data[indexAway].stats.leaguePosition_overall,\n leaguePosition_AwayOnly:\n resultAway.data[indexAway].stats.leaguePosition_away,\n BTTSPercentage_overallAway:\n resultAway.data[indexAway].stats.seasonBTTSPercentage_overall,\n BTTSAndWinPercentage_Away:\n resultAway.data[indexAway].stats.BTTS_and_win_percentage_overall,\n BTTSAndLosePercentage_Away:\n resultAway.data[indexAway].stats.BTTS_and_lose_percentage_overall,\n BTTSBothHalvesAway:\n resultAway.data[indexAway].stats.BTTS_both_halves_percentage_overall,\n GoalDifferenceHT_overall_Away:\n resultAway.data[indexAway].stats.GoalDifferenceHT_overall,\n GD_2hg_overall_Away: resultAway.data[indexAway].stats.gd_2hg_overall,\n leadingAtHTPercentage_overallAway:\n resultAway.data[indexAway].stats.leadingAtHTPercentage_overall,\n seasonOver15Percentage_overallAway:\n resultAway.data[indexAway].stats.seasonOver15Percentage_overall,\n seasonOver25Percentage_overallAway:\n resultAway.data[indexAway].stats.seasonOver25Percentage_overall,\n seasonOver35Percentage_overallAway:\n resultAway.data[indexAway].stats.seasonOver35Percentage_overall,\n seasonOver45Percentage_overallAway:\n resultAway.data[indexAway].stats.seasonOver45Percentage_overall,\n scoredBothHalvesPercentage_overallAway:\n resultAway.data[indexAway].stats.scoredBothHalvesPercentage_overall,\n shots_on_target_per_goals_scored_overallAway:\n resultAway.data[indexAway].stats.additional_info\n .shots_on_target_per_goals_scored_overall,\n\n cornersTotalAVG_overallAway:\n resultAway.data[indexAway].stats.cornersTotalAVG_overall,\n cardsAVG_overallAway: resultAway.data[indexAway].stats.cardsAVG_overall,\n foulsAVG_overallAway: resultAway.data[indexAway].stats.foulsAVG_overall,\n penalties_won_per_match_overallAway:\n resultAway.data[indexAway].stats.additional_info\n .penalties_won_per_match_overall,\n penalty_in_a_match_percentage_overallAway:\n resultAway.data[indexAway].stats.additional_info\n .penalty_in_a_match_percentage_overall,\n }));\n } catch (error) {\n console.error(\"Error fetching data:\", error);\n }\n };\n\n const storedDataHome = useSelector((state) => state.data.dataHome);\n const jsonDataHome = JSON.parse(storedDataHome);\n const propertyNamesHome = Object.entries(jsonDataHome);\n\n const storedDataHomeDef = useSelector((state) => state.data.dataHomeDef);\n const jsonDataHomeDef = JSON.parse(storedDataHomeDef);\n const propertyNamesHomeDef = Object.entries(jsonDataHomeDef);\n\n const storedDataallTeamResultsHome = useSelector(\n (state) => state.data.allTeamResultsHome\n );\n const jsonDataallTeamResultsHome = JSON.parse(storedDataallTeamResultsHome);\n const propertyNamesallTeamResultsHome = Object.values(\n jsonDataallTeamResultsHome\n );\n\n const homeDetails = useSelector((state) => state.data.homeDetails);\n const jsonHomeDetails = JSON.parse(homeDetails);\n\n const storedDataAway = useSelector((state) => state.data.dataAway);\n const jsonDataAway = JSON.parse(storedDataAway);\n const propertyNamesAway = Object.entries(jsonDataAway);\n\n const storedDataAwayDef = useSelector((state) => state.data.dataAwayDef);\n const jsonDataAwayDef = JSON.parse(storedDataAwayDef);\n const propertyNamesAwayDef = Object.entries(jsonDataAwayDef);\n\n const storedDataallTeamResultsAway = useSelector(\n (state) => state.data.allTeamResultsAway\n );\n const jsonDataallTeamResultsAway = JSON.parse(storedDataallTeamResultsAway);\n const propertyNamesallTeamResultsAway = Object.values(\n jsonDataallTeamResultsAway\n );\n\n const awayDetails = useSelector((state) => state.data.awayDetails);\n const jsonAwayDetails = JSON.parse(awayDetails);\n\n const storedFixtureDetails = useSelector(\n (state) => state.data.fixtureDetails\n );\n const storedFixtureDetailsJson = JSON.parse(storedFixtureDetails);\n\n const options = {\n plugins: {\n title: {\n display: true,\n text: \"Team comparison\",\n },\n },\n aspectRatio: 0.5,\n maintainAspectRatio: true,\n responsive: true,\n scales: {\n x: {\n stacked: true,\n },\n y: {\n stacked: true,\n display: false,\n },\n },\n };\n const labels = [\n storedFixtureDetailsJson.homeTeamName,\n storedFixtureDetailsJson.awayTeamName,\n ];\n\n const data = {\n labels,\n datasets: [\n {\n data: [\n jsonHomeDetails[\"Attacking Strength\"],\n [jsonAwayDetails[\"Attacking Strength\"]],\n ],\n label: \"Attacking Strength\",\n backgroundColor: \"#030061\",\n },\n {\n data: [\n jsonHomeDetails[\"Defensive Strength\"],\n [jsonAwayDetails[\"Defensive Strength\"]],\n ],\n label: \"Defensive Strength\",\n backgroundColor: \"#CC3314\",\n },\n ],\n };\n\n return (\n
    \n
    \n \n {`${storedFixtureDetailsJson.homeTeamName} v ${storedFixtureDetailsJson.awayTeamName}`}\n \n
    \n

    \n {storedFixtureDetailsJson.stadium} KO: {storedFixtureDetailsJson.time} |\n Average Attendance: {dataState.averageAttendance}\n

    \n

    \n XGTipping Prediction: {storedFixtureDetailsJson.homeGoals} -{\" \"}\n {storedFixtureDetailsJson.awayGoals}\n

    \n
    \n
      \n \n

      {storedFixtureDetailsJson.homeTeamName}

      \n {propertyNamesHome.map(([key, value], index) => (\n
    • \n {key}:{\" \"}\n {typeof value === \"object\" ? JSON.stringify(value) : value}\n
    • \n ))}\n
        \n {propertyNamesHomeDef.map(([key, value], index) => (\n
      • \n {key}:{\" \"}\n {typeof value === \"object\" ? JSON.stringify(value) : value}\n
      • \n ))}\n
      \n
    • Scored overall: {dataState.scoredOverallHome}
    • \n
    • Conceeded overall: {dataState.conceededOverallHome}
    • \n
    • \n Average scored home only:{\" \"}\n {(\n dataState.scoredOverallHomeOnly / dataState.playedHomeOnly\n ).toFixed(2)}\n
    • \n
    • \n Average conceeded home only:{\" \"}\n {(\n dataState.conceededOverallHomeOnly / dataState.playedHomeOnly\n ).toFixed(2)}\n
    • \n
    • PPG overall: {dataState.PPGOverallHome}
    • \n
    • PPG home only: {dataState.PPGOverallHomeOnly}
    • \n
    • League position: {dataState.leaguePosition_overallHome}
    • \n
    • \n League position home only: {dataState.leaguePosition_HomeOnly}\n
    • \n
    • BTTS {dataState.BTTSPercentage_overallHome}%
    • \n
    • BTTS and win: {dataState.BTTSAndWinPercentage_Home}%
    • \n
    • BTTS and lose: {dataState.BTTSAndLosePercentage_Home}%
    • \n
    • BTTS both halves: {dataState.BTTSBothHalvesHome}%
    • \n
    • \n Goal diff 1st half only: {dataState.GoalDifferenceHT_overall_Home}\n
    • \n
    • Goal diff 2nd half only: {dataState.GD_2hg_overall_Home}
    • \n
    • \n Leading at half time: {dataState.leadingAtHTPercentage_overallHome}%\n
    • \n
    • \n Over 1.5 goals in games:{\" \"}\n {dataState.seasonOver15Percentage_overallHome}%\n
    • \n
    • \n Over 2.5 goals in games:{\" \"}\n {dataState.seasonOver25Percentage_overallHome}%\n
    • \n
    • \n Over 3.5 goals in games:{\" \"}\n {dataState.seasonOver35Percentage_overallHome}%\n
    • \n
    • \n Over 4.5 goals in games:{\" \"}\n {dataState.seasonOver45Percentage_overallHome}%\n
    • \n
    • \n Scored both halves:{\" \"}\n {dataState.scoredBothHalvesPercentage_overallHome}%\n
    • \n
    • \n SOTs per goal:{\" \"}\n {dataState.shots_on_target_per_goals_scored_overallHome}\n
    • \n
    • Corners in game avg: {dataState.cornersTotalAVG_overallHome}
    • \n
    • Cards avg: {dataState.cardsAVG_overallHome}
    • \n
    • Fouls against avg: {dataState.foulsAVG_overallHome}
    • \n
    • \n Penalties won avg: {dataState.penalties_won_per_match_overallHome}\n
    • \n
    • \n Penalties in match:{\" \"}\n {dataState.penalty_in_a_match_percentage_overallHome}%\n
    • \n
    \n
      \n \n

      {storedFixtureDetailsJson.awayTeamName}

      \n {propertyNamesAway.map(([key, value], index) => (\n
    • \n {key}:{\" \"}\n {typeof value === \"object\" ? JSON.stringify(value) : value}\n
    • \n ))}\n
        \n {propertyNamesAwayDef.map(([key, value], index) => (\n
      • \n {key}:{\" \"}\n {typeof value === \"object\" ? JSON.stringify(value) : value}\n
      • \n ))}\n
      \n
    • Scored overall: {dataState.scoredOverallAway}
    • \n
    • Conceeded overall: {dataState.conceededOverallAway}
    • \n
    • \n Average scored away only:{\" \"}\n {(\n dataState.scoredOverallAwayOnly / dataState.playedAwayOnly\n ).toFixed(2)}\n
    • \n
    • \n Average conceeded away only:{\" \"}\n {(\n dataState.conceededOverallAwayOnly / dataState.playedAwayOnly\n ).toFixed(2)}\n
    • \n
    • PPG overall: {dataState.PPGOverallAway}
    • \n
    • PPG away only: {dataState.PPGOverallAwayOnly}
    • \n
    • League position: {dataState.leaguePosition_overallAway}
    • \n
    • \n League position away only: {dataState.leaguePosition_AwayOnly}\n
    • \n
    • BTTS: {dataState.BTTSPercentage_overallAway}%
    • \n
    • BTTS and win: {dataState.BTTSAndWinPercentage_Away}%
    • \n
    • BTTS and lose: {dataState.BTTSAndLosePercentage_Away}%
    • \n
    • BTTS both halves: {dataState.BTTSBothHalvesAway}%
    • \n
    • \n Goal diff 1st half only: {dataState.GoalDifferenceHT_overall_Away}\n
    • \n
    • Goal diff 2nd half only: {dataState.GD_2hg_overall_Away}
    • \n
    • \n Leading at half time: {dataState.leadingAtHTPercentage_overallAway}%\n
    • \n
    • \n Over 1.5 goals in games:{\" \"}\n {dataState.seasonOver15Percentage_overallAway}%\n
    • \n
    • \n Over 2.5 goals in games:{\" \"}\n {dataState.seasonOver25Percentage_overallAway}%\n
    • \n
    • \n Over 3.5 goals in games:{\" \"}\n {dataState.seasonOver35Percentage_overallAway}%\n
    • \n
    • \n Over 4.5 goals in games:{\" \"}\n {dataState.seasonOver45Percentage_overallAway}%\n
    • \n
    • \n Scored both halves:{\" \"}\n {dataState.scoredBothHalvesPercentage_overallAway}%\n
    • \n
    • \n SOTs per goal:{\" \"}\n {dataState.shots_on_target_per_goals_scored_overallAway}\n
    • \n
    • Corners in game avg: {dataState.cornersTotalAVG_overallAway}
    • \n
    • Cards avg: {dataState.cardsAVG_overallAway}
    • \n
    • Fouls against avg: {dataState.foulsAVG_overallAway}
    • \n
    • \n Penalties won avg: {dataState.penalties_won_per_match_overallAway}\n
    • \n
    • \n Penalties in match:{\" \"}\n {dataState.penalty_in_a_match_percentage_overallAway}%\n
    • \n
    \n
    \n \n \n \n
    \n
      \n {propertyNamesallTeamResultsHome.map((match, index) => (\n <>\n
      {match.date}
      \n
      \n
      {match.homeTeam}
      \n \n {match.homeGoals} : {match.awayGoals}\n \n
      {match.awayTeam}
      \n
      \n \n ))}\n
    \n
      \n {propertyNamesallTeamResultsAway.map((match, index) => (\n <>\n
      {match.date}
      \n
      \n
      {match.homeTeam}
      \n \n {match.homeGoals} : {match.awayGoals}\n \n
      {match.awayTeam}
      \n
      \n \n ))}\n
    \n
    \n
    \n );\n}\n\nexport default TeamPage;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport \"./index.css\";\nimport App from \"./App\";\nimport reportWebVitals from \"./reportWebVitals\";\nimport { BrowserRouter as Router, Route, Routes, HashRouter } from \"react-router-dom\";\nimport TeamPage from \"./components/Team\";\nimport { Provider } from \"react-redux\";\nimport store from \"./logic/store\"; // Import your Redux store\nimport {Fixture} from \"./components/Fixture\"\n\nReactDOM.render(\n // \n \n \n \n } />\n } />\n {/* } /> */}\n \n \n \n ,\n // ,\n document.getElementById(\"root\")\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""} \ No newline at end of file