PageSourceSearch

https://keobongda.network/wp-content/plugins/sport-streaming-plugin/assets/js/dv2-script.min.js?ver=1.9.6xs23

js keobongda.network collected 2026-10-07 00:47:22 UTC 309,399 bytes, 1 lines download raw bytes

1!function(window){window.DV2BlvDropdown=window.DV2BlvDropdown||{},function(DV2BlvDropdown){const e=new Set;function escapeHtml(e){return String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function getMatchId(e){return e?.match_id||e?.matchId||e?.id||e?.slug||""}function getSortedLinks(e){return window.DV2StreamLinks?.sortForDetail?window.DV2StreamLinks.sortForDetail(e?.livestream?.links):Array.isArray(e?.livestream?.links)?e.livestream.links:[]}function getBlvLabel(e,t){return window.DV2StreamLinks?.getBlvName?window.DV2StreamLinks.getBlvName(e,t):String(e?.commentator||"").trim()||`Link ${t+1}`}function defaultGetDetailUrl(e,t){if(window.DV2StreamLinks?.getDetailUrl)return window.DV2StreamLinks.getDetailUrl(e,t,{trailingSlash:!1});const a=null!=t?.liveId?String(t.liveId):"";return a?`/streams/${e}?liveId=${encodeURIComponent(a)}`:`/streams/${e}`}DV2BlvDropdown.escapeHtml=escapeHtml,DV2BlvDropdown.getMatchId=getMatchId,DV2BlvDropdown.getSortedLinks=getSortedLinks,DV2BlvDropdown.getBlvLabel=getBlvLabel,DV2BlvDropdown.defaultGetDetailUrl=defaultGetDetailUrl,DV2BlvDropdown.build=function build(e){const t=e||{},{match:a,links:n=getSortedLinks(a),preferredLink:i,matchId:o=getMatchId(a),getDetailUrl:s=defaultGetDetailUrl,renderToggle:r,renderItemContent:l,emptyHtml:d="",menuPlacement:c="up",rootClass:m="",toggleClass:v=""}=t;if(!n.length)return d;if("function"!=typeof r||"function"!=typeof l)return d;const u=t.escapeHtml||escapeHtml,h=i??n[0]??null,p=getBlvLabel(h,0),f="down"===c?"dv2-blv-dropdown--menu-down":"dv2-blv-dropdown--menu-up",g=n.map((e,t)=>{const a=getBlvLabel(e,t),n=s(o,e);return`\n          <li class="dv2-blv-dropdown__item">\n            <a href="${u(n)}" class="dv2-blv-dropdown__link">\n              ${l({link:e,label:a,href:n,index:t,esc:u})}\n            </a>\n          </li>\n        `}).join("");return`\n      <div class="dv2-blv-dropdown ${f}${m?` ${m}`:""}">\n        <button type="button" class="dv2-blv-dropdown__toggle${v?` ${v}`:""}" aria-expanded="false" aria-haspopup="listbox">\n          ${r({link:h,label:p,esc:u})}\n          <span class="dv2-blv-dropdown__caret" aria-hidden="true"></span>\n        </button>\n        <ul class="dv2-blv-dropdown__menu" role="listbox">\n          ${g}\n        </ul>\n      </div>\n    `},DV2BlvDropdown.bind=function bind(t,a){const $=window.jQuery||window.$;if(!$?.fn||!t?.length)return;const{namespace:n="dv2BlvDropdown",closeOnDocument:i=!0,documentCloseDelay:o=!1,stopPropagationOnWrap:s=!1,rebindDocumentClose:r=!1}=a||{};function handleToggleClick(e,a){e.preventDefault(),e.stopPropagation();const n=a.hasClass("is-open");t.find(".dv2-blv-dropdown.is-open").not(a).removeClass("is-open").find(".dv2-blv-dropdown__toggle").attr("aria-expanded","false"),a.toggleClass("is-open",!n).find(".dv2-blv-dropdown__toggle").attr("aria-expanded",n?"false":"true")}if(s?t.find(".dv2-blv-dropdown").each(function(){const e=$(this);e.off(`click.${n}Wrap`).on(`click.${n}Wrap`,function(e){e.stopPropagation()}),e.find(".dv2-blv-dropdown__toggle").off(`click.${n}`).on(`click.${n}`,function(t){handleToggleClick(t,e)}),e.find(".dv2-blv-dropdown__menu a").off(`click.${n}Menu`).on(`click.${n}Menu`,function(e){e.stopPropagation()})}):(t.off(`click.${n}`,".dv2-blv-dropdown__toggle").on(`click.${n}`,".dv2-blv-dropdown__toggle",function(e){handleToggleClick(e,$(this).closest(".dv2-blv-dropdown"))}),t.off(`click.${n}Menu`,".dv2-blv-dropdown__menu a").on(`click.${n}Menu`,".dv2-blv-dropdown__menu a",function(e){e.stopPropagation()})),!i)return;const l=`click.${n}Close`;if(r)$(document).off(l);else if(e.has(l))return;$(document).on(l,function(e){const run=()=>{$(e.target).closest(".dv2-blv-dropdown").length||function closeAllDropdowns($,e){e.find(".dv2-blv-dropdown.is-open").each(function(){$(this).removeClass("is-open").find(".dv2-blv-dropdown__toggle").attr("aria-expanded","false")})}($,t)};o?window.setTimeout(run,0):run()}),r||e.add(l)}}(window.DV2BlvDropdown)}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window){window.DV2HotLeagues=window.DV2HotLeagues||{},function(DV2HotLeagues){const e="https://vsc-apidev.helizones.com/api/data/lives/compet
1itions/hot";DV2HotLeagues.DEFAULT_ENDPOINT=e,DV2HotLeagues.createRankMap=function createRankMap(e){return new Map((e||[]).map((e,t)=>[e.id,t]))},DV2HotLeagues.load=function load(t){const{url:a=e,ajax:n=window.jQuery?.ajax||window.$?.ajax,setHotLeaguesRank:i,onSuccess:o,onError:s,method:r="GET"}=t||{};return n?n({url:a,method:r,success:function(e){const t=DV2HotLeagues.createRankMap(e?.result);i&&i(t),o&&o(t,e)},error:function(e,t,a){console.error("[DV2HotLeagues] Failed to load hot leagues:",a),s&&s({xhr:e,status:t,error:a})}}):(console.error("[DV2HotLeagues] jQuery ajax is not available"),s&&s({message:"jQuery ajax is not available"}),null)}}(window.DV2HotLeagues)}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window){window.DV2MatchScorePoll=window.DV2MatchScorePoll||{},function(DV2MatchScorePoll){const e="undefined"!=typeof API_URL?API_URL:"https://vsc-apidev.helizones.com/api/data/";function getDefaultIntervalMs(){return"number"==typeof window.DV2_HOME_MATCH_SCORE_POLL_INTERVAL_MS?window.DV2_HOME_MATCH_SCORE_POLL_INTERVAL_MS:3e4}DV2MatchScorePoll.DEFAULT_API_BASE=e,DV2MatchScorePoll.getMatchId=function getMatchId(e){return e?.match_id||e?.matchId||e?.id||e?.slug||""},DV2MatchScorePoll.getScoreSnapshot=function getScoreSnapshot(e){const t=e?.score?.fulltime||{};return{home:t.home??0,away:t.away??0,currentMinute:e?.currentMinute??e?.currentMinutes??null}},DV2MatchScorePoll.create=function create(t){const{ajax:a=window.jQuery?.ajax||window.$?.ajax,$:n=window.jQuery||window.$,apiBase:i=e,intervalMs:o=getDefaultIntervalMs(),container:s,onScoreChange:r}=t||{};let l=null,d=null;function poll(){if(!d?.matchId||!a)return;const e=String(i).replace(/\/?$/,"/");a({url:`${e}lives/${d.matchId}`,method:"GET",success(e){if(!e?.data)return;const t=DV2MatchScorePoll.getScoreSnapshot(e.data);(d.home!==t.home||d.away!==t.away||d.currentMinute!==t.currentMinute)&&(d={...d,...t},function applyDomUpdate(e){const t=function resolveContainer(e,$){return e?"string"==typeof e?$(e):e:$(document)}(s,n),a=t.find("[data-dv2-score-home]"),i=t.find("[data-dv2-score-away]"),o=t.find("[data-dv2-score-minute]");a.length&&a.text(e.home),i.length&&i.text(e.away),null!=e.currentMinute&&o.length&&o.text(`${e.currentMinute}'`),r&&r(e,d)}(d))}})}function stop(){l&&(clearInterval(l),l=null)}return{sync:function sync(e){const t=DV2MatchScorePoll.getMatchId(e);t&&(d={matchId:t,...DV2MatchScorePoll.getScoreSnapshot(e)})}
1,start:function start(){stop(),!d?.matchId||!o||o<=0||(l=setInterval(poll,o))},stop:stop,destroy:function destroy(){stop(),d=null},poll:poll}}}(window.DV2MatchScorePoll)}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window){window.DV2MatchSort=window.DV2MatchSort||{},function(DV2MatchSort){DV2MatchSort.isWcCompetitionMatch=function isWcCompetitionMatch(e){const t=window.DV2_STREAMING_WC_COMPETITION_ID;return t&&e?.league?.id===t},DV2MatchSort.isLiveMatch=function isLiveMatch(e,t){if(!Array.isArray(t)||!t.length)return!1;const a=String(e?.matchInfo?.status??e?.status??"").toLowerCase();return t.includes(a)},DV2MatchSort.getMatchKickoffTime=function getMatchKickoffTime(e){const t=new Date(e?.matchInfo?.kickoff??e?.kickoff);return Number.isNaN(t.getTime())?null:t},DV2MatchSort.isWcStartingSoon=function isWcStartingSoon(e,t,a=10){if(!DV2MatchSort.isWcCompetitionMatch(e))return!1;if(DV2MatchSort.isLiveMatch(e,t))return!1;const n=DV2MatchSort.getMatchKickoffTime(e);if(!n)return!1;const i=n.getTime()-Date.now();return i>0&&i<=60*a*1e3},DV2MatchSort.getHotLeagueRank=function getHotLeagueRank(e,t){const a=function resolveHotLeaguesRank(e){return"function"==typeof e?e():e}(t);return a?.has?.(e?.league?.id)?a.get(e.league.id):1/0},DV2MatchSort.compareKickoff=function compareKickoff(e,t){const a=DV2MatchSort.getMatchKickoffTime(e),n=DV2MatchSort.getMatchKickoffTime(t);return a||n?a?n?a.getTime()-n.getTime():-1:1:0},DV2MatchSort.compareMatches=function compareMatches(e,t,a){const{mode:n="wc-first",liveStatuses:i=[],hotLeaguesRank:o=null,hasLiveMatches:s=!1,wcSoonMinutes:r=10}=a||{},l=function compareWc(){const a=DV2MatchSort.isWcCompetitionMatch(e);return a!==DV2MatchSort.isWcCompetitionMatch(t)?a?-1:1:0},d=function compareLive(){const a=DV2MatchSort.isLiveMatch(e,i);return a!==DV2MatchSort.isLiveMatch(t,i)?a?-1:1:0},c=function compareHot(){const a=DV2MatchSort.getHotLeagueRank(e,o),n=DV2MatchSort.getHotLeagueRank(t,o);return a!==n?a-n:0};if("wc-kickoff-only"===n){const a=l();return 0!==a?a:DV2MatchSort.compareKickoff(e,t)}if("wc-first"===n){const a=l();if(0!==a)return a;const n=d();if(0!==n)return n;const i=c();return 0!==i?i:DV2MatchSort.compareKickoff(e,t)}if("live-first-wc"===n){const a=d();if(0!==a)return a;const n=l();if(0!==n)return n;const i=c();return 0!==i?i:DV2MatchSort.compareKickoff(e,t)}if("wc-when-live-or-soon"===n){const a=DV2MatchSort.isWcStartingSoon(e,i,r);if(a!==DV2MatchSort.isWcStartingSoon(t,i,r))return a?-1:1;const n=d();if(0!==n)return n;if(s){const e=l();if(0!==e)return e}const o=c();return 0!==o?o:DV2MatchSort.compareKickoff(e,t)}if("wc-when-live"===n){const a=d();if(0!==a)return a;if(s){const e=l();if(0!==e)return e}const n=c();return 0!==n?n:DV2MatchSort.compareKickoff(e,t)}return DV2MatchSort.compareKickoff(e,t)},DV2MatchSort.createSortedMatchesFunction=function createSortedMatchesFunction(e){return function sortedMatchesFunction(t){if(!Array.isArray(t))return[];const a={...e||{},hasLiveMatches:t.some(t=>DV2MatchSort.isLiveMatch(t,e?.liveStatuses))};return e?.copy?t.slice().sort((e,t)=>DV2MatchSort.compareMatches(e,t,a)):t.sort((e,t)=>DV2MatchSort.compareMatches(e,t,a))}}}(window.DV2MatchSort)}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$){function dv2GetFullscreenElement(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||null}function dv2GetStreamChromeEl(e){if(!e?.length)return $();const t=e.children(".dv2-stream-chrome");return t.length?t:e.find("> .dv2-video-container > .dv2-stream-chrome, > .dv2-video-stage > .dv2-stream-chrome").first()}function dv2ApplyStreamVideoControls(e){e?.length&&(e.prop("controls",!1),e.removeAttr("controlsList"),e.attr("playsinline",""),e.attr("webkit-playsinline",""))}function dv2MarkStreamVolumeTouched(e){e&&(e.dataset.dv2VolumeTouched="1")}function dv2IsStreamVideoMuted(e){return!(!e||!e.muted&&0!==e.volume)}function dv2GetVideoStageEl(e){return e?.length?e.children(".dv2-video-container, .dv2-video-stage").first():$()}function dv2EnsureVideoStage(e){if(!e?.length)return $();const t=dv2GetStreamChromeEl(e),a=e.children("video, #stream-player").first();let n=dv2GetVideoStageEl(e);return!n.length&&a.length&&(n=$('<div class="dv2-video-stage"></div>'),a.before(n),n.append(a)),n.length?(t.length&&!t.parent().is(n)&&n.prepend(t),e.children(".dv2-stream-control
1s").each(function(){$.contains(n[0],this)||n.append(this)}),e.children(".dv2-stream-loading, .dv2-loading, .dv2-not-loaded").each(function(){$(this).appendTo(n)}),n):$()}function dv2SyncVideoStageLayout(e){if(!e?.length)return;const t=dv2EnsureVideoStage(e);if(!t.length)return;const a=t.find("video").first()[0],n=e[0];if(!a||!n)return void t.removeClass("dv2-video-stage--bounded").css({top:"",left:"",width:"",height:""});if(!dv2IsStreamWrapperFullscreen(e))return void t.removeClass("dv2-video-stage--bounded").css({top:"",left:"",width:"",height:""});const i=function dv2GetContainedVideoBounds(e,t){if(!e||!t?.width||!t?.height)return null;const a=e.videoWidth,n=e.videoHeight;if(!a||!n)return null;const i=a/n;let o,s,r,l;return i>t.width/t.height?(o=t.width,s=t.width/i,r=0,l=(t.height-s)/2):(s=t.height,o=t.height*i,l=0,r=(t.width-o)/2),{top:l,left:r,width:o,height:s}}(a,n.getBoundingClientRect());i?.width&&i?.height&&t.addClass("dv2-video-stage--bounded").css({top:i.top+"px",left:i.left+"px",width:i.width+"px",height:i.height+"px"})}function dv2EnsureStreamControlsBar(e){if(!e?.length)return;const t=e.find("video").first();e.find(".dv2-stream-controls").length||(e.children(".dv2-stream-fs-btn").remove(),function dv2GetStreamControlsMount(e){if(!e?.length)return e;const t=dv2EnsureVideoStage(e);return t.length?t:e}(e).append('<div class="dv2-stream-controls dv2-stream-controls--paused dv2-stream-controls--muted" role="toolbar" aria-label="Điều khiển phát video">\n<button type="button" class="dv2-stream-controls__play" aria-label="Phát" title="Phát">\n<svg class="dv2-stream-controls__icon-play" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M4 2.5v11l9-5.5-9-5.5z"/></svg>\n<svg class="dv2-stream-controls__icon-pause" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M4 2h3v12H4V2zm5 0h3v12H9V2z"/></svg>\n</button>\n<div class="dv2-stream-controls__volume">\n<button type="button" class="dv2-stream-controls__mute" aria-label="Bật tiếng" title="Âm lượng">\n<svg class="dv2-stream-controls__icon-vol-on" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M7 2.5v11L3.5 11H1V5h2.5L7 2.5zm5.2 1.8a5 5 0 010 7.4M9.5 4.5a3.5 3.5 0 010 7"/></svg>\n<svg class="dv2-stream-controls__icon-vol-off" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M7 2.5v11L3.5 11H1V5h2.5L7 2.5zm7.8 2.3l-1.1 1.1L11.6 6l2.1 2.1-1.1 1.1L10.5 7.1 8.4 9.2l-1.1-1.1L9.4 6 7.3 3.9l1.1-1.1L9.5 4.9l2.1-2.1 1.1 1.1L11.6 6l2.1-2.1z"/></svg>\n</button>\n<input type="range" class="dv2-stream-volume" min="0" max="1" step="0.05" value="0" aria-label="Mức âm lượng">\n</div>\n<button type="button" class="dv2-stream-fs-btn" aria-label="Toàn màn hình" title="Toàn màn hình">\n<svg class="dv2-stream-fs-btn__expand" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M3 12h10V4H3v8zm2-6h6v4H5V6zM2 6H1V2.5l.5-.5H5v1H2v3zm13-3.5V6h-1V3h-3V2h3.5l.5.5zM14 10h1v3.5l-.5.5H11v-1h3v-3zM2 13h3v1H1.5l-.5-.5V10h1v3z"/></svg>\n<svg class="dv2-stream-fs-btn__shrink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M3.5 4H1V3h2V1h1v2.5l-.5.5zM13 3V1h-1v2.5l.5.5H15V3h-2zm-1 9.5V15h1v-2h2v-1h-2.5l-.5.5zM1 12v1h2v2h1v-2.5l-.5-.5H1zm11-1.5l-.5.5h-7l-.5-.5v-5l.5-.5h7l.5.5v5zM10 7H6v2h4V7z"/></svg>\n</button>\n</div>')),dv2SyncStreamControlsState(e,t)}function dv2SyncStreamControlsState(e,t){if(!e?.length)return;t=t||e.find("video").first();const a=t?.[0],n=e.find(".dv2-stream-controls");if(!a||!n.length)return;const i=a.paused,o=dv2IsStreamVideoMuted(a),s=o?0:a.volume;n.toggleClass("dv2-stream-controls--paused",i),n.toggleClass("dv2-stream-controls--muted",o);const r=i?"Phát":"Tạm dừng";n.find(".dv2-stream-controls__play").attr({"aria-label":r,title:r});const l=o?"Bật tiếng":"Tắt tiếng";n.find(".dv2-stream-controls__mute").attr({"aria-label":l,title:l}),n.find(".dv2-stream-volume").val(s)}function dv2IsNativeWrapperFullscreen(e){const t=e?.[0];return!!t&&dv2GetFullscreenElement()===t}function dv2IsCssWrapperFullscreen(e){return!!e?.data("cssWrapperFs")}function dv2IsStreamWrapperFullscreen(e){return dv2IsNativeWrapperFullscreen(e)||dv2IsCssWrapperFullscreen(e)}function dv2SyncStreamWrapperFullscreenUi(e){if(!e?.length)return;const t=dv2IsStreamWrapperFullscreen(e);e.toggleClass("dv2-stream-wrapper-fs",t);const a=e.find(".dv2-stream-fs-btn");if(a.length){const e=t?"Thu nhỏ":"Toàn màn hình";a.attr({"aria-label":e,title:e})}}function dv2RestoreCssFullscreenPortal(e){if(!e?.length||!e.hasClass("dv2-fs-portal"))return;const t=e.data("dv2FsPortalPlaceholder"),a=e.data("dv2FsPortalParent");e.removeClass("dv2-fs-portal"),t?.length?(e.insertBefore(t),t.remove()):a?.length&&a.append(e),e.removeData("dv2FsPortalPlaceholder"),e.removeData("dv2FsPortalParent")}function dv2SyncCssFullscreenPortal(e){e?.length&&(dv2IsCssWrapperFullscreen(e)?function dv2MountCssFullscreenPortal(e){if(!e?.length||e.hasClass("dv2-fs-portal"))return;const t=$('<div class="dv2-fs-placeholder" aria-hidden="true"></div>'),a=e.outerHeight();a>0&&t.height(a),e.data("dv2FsPortalParent",e.parent()),t.insertBefore(e),e.data("dv2FsPortalPlaceholder",t),e.addClass("dv2-fs-portal"),$("body").append(e)}
1(e):dv2RestoreCssFullscreenPortal(e))}function dv2EnterCssWrapperFullscreen(e){e.data("cssWrapperFs",!0),$("body").addClass("dv2-stream-body-fs"),dv2SyncStreamWrapperFullscreenUi(e),e.trigger("dv2wrapperfschange")}function dv2ExitStreamWrapperFullscreen(e){dv2IsNativeWrapperFullscreen(e)&&function dv2ExitDocumentFullscreen(){const e=document.exitFullscreen||document.webkitExitFullscreen||document.mozCancelFullScreen||document.msExitFullscreen;e?Promise.resolve(e.call(document)):Promise.resolve()}(),dv2IsCssWrapperFullscreen(e)&&function dv2ExitCssWrapperFullscreen(e){e.data("cssWrapperFs",!1),dv2RestoreCssFullscreenPortal(e),$(".dv2-video-wrapper").toArray().some(e=>$(e).data("cssWrapperFs"))||$("body").removeClass("dv2-stream-body-fs"),dv2SyncStreamWrapperFullscreenUi(e),e.trigger("dv2wrapperfschange")}(e)}function dv2ToggleWrapperFullscreen(e){const t=e[0];t&&(dv2IsStreamWrapperFullscreen(e)?dv2ExitStreamWrapperFullscreen(e):function dv2ShouldPreferCssWrapperFullscreen(){return/iPad|iPhone|iPod/i.test(navigator.userAgent)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1}()?dv2EnterCssWrapperFullscreen(e):function dv2SupportsWrapperFullscreenApi(){const e=document.createElement("div");return!!(e.requestFullscreen||e.webkitRequestFullscreen||e.mozRequestFullScreen||e.msRequestFullscreen)}()?function dv2RequestElementFullscreen(e){if(!e)return Promise.reject();const t=e.requestFullscreen||e.webkitRequestFullscreen||e.mozRequestFullScreen||e.msRequestFullscreen;return t?Promise.resolve(t.call(e)):Promise.reject()}(t).then(()=>{dv2GetFullscreenElement()===t?(dv2SyncStreamWrapperFullscreenUi(e),e.trigger("dv2wrapperfschange")):dv2EnterCssWrapperFullscreen(e)}).catch(()=>{dv2EnterCssWrapperFullscreen(e)}):dv2EnterCssWrapperFullscreen(e))}function dv2RefreshStreamChromeReviveAds(e){const t=e&&"function"==typeof e.find&&e.length?e:$("string"==typeof e?e:document),a=new Set;if(t.find("ins[data-revive-id]").each(function(){const e=this.getAttribute("data-revive-id");e&&(this.removeAttribute("data-revive-loaded"),a.add(e))}),!a.size)return;const runRefresh=()=>{const e=window.reviveAsync;return!!e&&(a.forEach(t=>{const a=e[t];a&&("function"!=typeof a.refresh?"function"==typeof a.apply&&"function"==typeof a.detect&&a.apply(a.detect()):a.refresh())}),!0)};if(runRefresh())return;let n=0;const i=setInterval(()=>{n+=1,(runRefresh()||n>=20)&&clearInterval(i)},250)}function dv2UpdateStreamChromeVisibility(e){if(!e?.length)return;const t=e.hasClass("dv2-full-stream-active");dv2GetStreamChromeEl(e).attr("aria-hidden",t?"false":"true")}function dv2SetFullStreamChromeVisible(e,t){e?.length&&(e.toggleClass("dv2-full-stream-active",!!t),t&&dv2RefreshStreamChromeReviveAds(),dv2UpdateStreamChromeVisibility(e))}function dv2SyncStreamChromeVisibility(e){if(!e?.length)return;const t=!!e.data("hlsReady");dv2SetFullStreamChromeVisible(e,t)}function dv2BindStreamChromeEvents(e){if(e.data("streamChromeBound"))return;e.data("streamChromeBound",!0),function dv2InitCssFullscreenPortal(e){e?.length&&!e.data("dv2FsPortalBound")&&(e.data("dv2FsPortalBound",!0),e.on("dv2wrapperfschange.dv2FsPortal",function(){dv2SyncCssFullscreenPortal(e)}),$(document).on("fullscreenchange.dv2FsPortal webkitfullscreenchange.dv2FsPortal",function(){dv2SyncCssFullscreenPortal(e)}),$(window).on("pagehide.dv2FsPortal",function(){dv2RestoreCssFullscreenPortal(e)}))}(e),e.on("click",".dv2-stream-chrome-footer .dv2-stream-chrome-close",t=>{t.preventDefault(),t.stopPropagation(),e.addClass("dv2-stream-chrome-footer-closed"),dv2GetStreamChromeEl(e).addClass("dv2-stream-chrome-footer-closed"),dv2UpdateStreamChromeVisibility(e)}),e.on("click",".dv2-stream-chrome-right .dv2-stream-chrome-close",t=>{t.preventDefault(),t.stopPropagation(),e.addClass("dv2-stream-chrome-right-closed"),dv2GetStreamChromeEl(e).addClass("dv2-stream-chrome-right-closed"),dv2UpdateStreamChromeVisibility(e)}),e.on("click",".dv2-stream-fs-btn",function(t){t.preventDefault(),t.stopPropagation(),dv2ToggleWrapperFullscreen(e)}),e.on("click",".dv2-stream-controls__play",function(t){t.preventDefault(),t.stopPropagation();const a=e.find("video").first();dv2ToggleStreamVideoPlayPause(a),dv2SyncStreamControlsState(e,a),dv2PulseStreamControlsVisible(e)}
1),e.on("click",".dv2-stream-controls__mute",function(t){t.preventDefault(),t.stopPropagation();const a=e.find("video")[0];a&&(dv2IsStreamVideoMuted(a)?(a.muted=!1,0===a.volume&&(a.volume=.7)):a.muted=!0,dv2MarkStreamVolumeTouched(a),dv2SyncStreamControlsState(e),dv2PulseStreamControlsVisible(e))}),e.on("input change",".dv2-stream-volume",function(t){t.stopPropagation();const a=e.find("video")[0];if(!a)return;const n=parseFloat(this.value);Number.isNaN(n)||(a.volume=n,a.muted=0===n,dv2MarkStreamVolumeTouched(a),dv2SyncStreamControlsState(e),dv2PulseStreamControlsVisible(e))});let t=null,a=null;const isStreamChromeUiClick=e=>$(e).closest(".dv2-stream-controls, .dv2-stream-chrome-close, .dv2-stream-chrome-header, .dv2-stream-chrome-right, .dv2-stream-chrome-footer, .dv2-stream-odds-slot, .dv2-stream-odds-panel, button, a, input, label").length>0,clearStreamControlsHideTimer=()=>{a&&(clearTimeout(a),a=null)},setStreamControlsVisible=t=>{e.toggleClass("dv2-stream-ui-active",!!t)},pulseStreamControlsVisible=()=>{setStreamControlsVisible(!0),clearStreamControlsHideTimer(),a=setTimeout(()=>{setStreamControlsVisible(!1),a=null},2600)};e.data("dv2PulseStreamControlsVisible",pulseStreamControlsVisible),e.on("click","video",function(e){if(isStreamChromeUiClick(e.target))return;pulseStreamControlsVisible();const a=$(this);clearTimeout(t),t=setTimeout(()=>{t=null,(e=>{const t=e?.[0];t&&(t.paused?t.play().catch(()=>console.warn("[VSC LIVE] Không thể phát video")):t.pause())})(a)},220)}),e.on("dblclick","video",function(a){isStreamChromeUiClick(a.target)||(clearTimeout(t),t=null,a.preventDefault(),dv2ToggleWrapperFullscreen(e))}),e.on("mousemove.dv2StreamUi pointerenter.dv2StreamUi pointerdown.dv2StreamUi touchstart.dv2StreamUi",function(){pulseStreamControlsVisible()}),e.on("playing.dv2StreamUi","video",function(){pulseStreamControlsVisible()}),e.on("play.dv2StreamControls pause.dv2StreamControls volumechange.dv2StreamControls loadedmetadata.dv2StreamControls","video",function(){dv2SyncStreamControlsState(e,$(this))}),e.on("mouseleave.dv2StreamUi",function(){clearStreamControlsHideTimer(),setStreamControlsVisible(!1)});const syncFullscreenChrome=()=>{!dv2IsNativeWrapperFullscreen(e)&&dv2IsCssWrapperFullscreen(e)||dv2IsNativeWrapperFullscreen(e)||(e.data("cssWrapperFs",!1),dv2RestoreCssFullscreenPortal(e),$(".dv2-video-wrapper").toArray().some(e=>$(e).data("cssWrapperFs"))||$("body").removeClass("dv2-stream-body-fs"));const t=dv2IsStreamWrapperFullscreen(e);dv2SyncCssFullscreenPortal(e),dv2SyncStreamWrapperFullscreenUi(e),t?pulseStreamControlsVisible():(clearStreamControlsHideTimer(),setStreamControlsVisible(!1)),dv2SyncStreamChromeVisibility(e),dv2SyncVideoStageLayout(e)};$(document).on("fullscreenchange.dv2StreamChrome webkitfullscreenchange.dv2StreamChrome mozfullscreenchange.dv2StreamChrome MSFullscreenChange.dv2StreamChrome",syncFullscreenChrome),e.on("dv2wrapperfschange.dv2StreamChrome",syncFullscreenChrome),$(window).on("resize.dv2StreamChrome orientationchange.dv2StreamChrome",function(){syncFullscreenChrome(),dv2SyncVideoStageLayout(e)})}function dv2PulseStreamControlsVisible(e){const t=e?.data("dv2PulseStreamControlsVisible");"function"==typeof t&&t()}function dv2ToggleStreamVideoPlayPause(e){const t=e?.[0];t&&(t.paused?t.play().catch(()=>console.warn("[VSC LIVE] Không thể phát video")):t.pause())}function dv2GetStreamOddsApiBase(){if("undefined"!=typeof API_URL)return String(API_URL).replace(/\/?$/,"/");if("undefined"!=typeof BASE_API_URL){const e=String(BASE_API_URL);return e.endsWith("/api/data/")||e.endsWith("/api/data")?e.replace(/\/?$/,"/"):`${e.replace(/\/?$/,"")}/api/data/`}return"https://vsc-apidev.helizones.com/api/data/"}function dv2NormalizeOddsTrend(e){const t=String(e||"same").toLowerCase();return"up"===t||"down"===t?t:"same"}function dv2FormatOddsValue(e){if(null==e||""===e)return"-";const t=Number(e);if(Number.isNaN(t))return String(e);const a=Math.round(100*t)/100;return Number.isInteger(a)?String(a):a.toFixed(2).replace(/0$/,"")}function dv2CountMatchEvents(e,t,a){if(!Array.isArray(e))return 0;const n=String(t).toLowerCase();return e.filter(e=>{const t=String(e?.type||"").toLowerCase();return e?.team===a&&t.includes(n)}).length}function dv2ExtractOddsSnapshot(e){const t=e?.hdp,a=e?.ou,n=e?.stats||{},i=e?.corner||n?.corner||n?.corners||{},o=e?.yellowCard||n?.yellowCard||{},s=e?.events;return{hdp:{home:t?.home,away:t?.away,rate:t?.rate,homeTrend:dv2NormalizeOddsTrend(t?.homeTrend),awayTrend:dv2NormalizeOddsTrend(t?.awayTrend),rateTrend:dv2NormalizeOddsTrend(t?.rateTrend)},ou:{over:a?.over,under:a?.under,rate:a?.rate,overTrend:dv2NormalizeOddsTrend(a?.overTrend),underTrend:dv2NormalizeOddsTrend(a?.underTrend),rateTrend:dv2NormalizeOddsTrend(a?.rateTrend)},corners:{home:i.home??dv2CountMatchEvents(s,"corner","home"),away:i.away??dv2CountMatchEvents(s,"corner","away")},yellowCard:{home:o.home??dv2CountMatchEvents(s,"yellow card","home"),away:o.away??dv2CountMatchEvents(s,"yellow card","away")}}}function dv2SerializeOddsSnapshot(e){return JSON.stringify(e||{})}function dv2OddsValueHasData(e){return null!=e&&""!==e}function dv2OddsSectionHasData(e){return null!=e&&(dv2OddsValueHasData(e.home)||dv2OddsValueHasData(e.away)||dv2OddsValueHasData(e.rate)||dv2OddsValueHasData(e.over)||dv2OddsValueHasData(e.under))}function dv2HasStreamOddsData(e){return!!e&&(dv2OddsSectionHasData(e.hdp)||dv2OddsSectionHasData(e.ou))}function dv2UpdateOddsPill(e,t,a,n,i,o){const s=e.find(t);if(!s.length)return;const r=dv2NormalizeOddsTrend(n),l=!(!o||!o.signedRate),d="rate"===i&&l?function dv2FormatOddsRate(e){if(null==e||""===e)return"-";const t=Number(e);return Number.isNaN(t)?String(e):t>0?`+${dv2FormatOddsValue(t)}`:dv2FormatOddsValue(t)}(a):dv2FormatOddsValue(a),c="rate"!==i&&"up"===r?'<svg width="6" height="6" viewBox="0 0 9 8" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M3.69976 0.258553L0.0659156 6.7166C-0.124386 7.0548 0.120008 7.47275 0.508076 7.47275H7.77577C8.16384 7.47275 8.40823 7.0548 8.21793 6.7166L4.58408 0.258553C4.3901 -0.0861874 3.89374 -0.0861869 3.69976 0.258553Z" fill="#469631"></path></svg>':"rate"!==i&&"down"===r?'<svg width="6" height="6" viewBox="0 0 9 8" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M3.6984 7.21387L0.0658934 0.756087C-0.124346 0.417884 0.120053 0 0.508089 0H7.7731C8.16114 0 8.40553 0.417885 8.21529 0.756088L4.58279 7.21387C4.38883 7.5587 3.89236 7.5587 3.6984 7.21387Z" fill="#F94A4A"></path></svg>':"",m="rate"!==i&&"same"!==r?` dv2-stream-odds-panel__pill--${r}`:"";s.attr("class",`dv2-stream-odds-panel__pill dv2-stream-odds-panel__pill--${i}${m}`).html(`${d}${c}`)}function dv2RenderStreamOddsPanel(e,t){e?.length&&t&&(dv2UpdateOddsPill(e,"[data-dv2-odds-hdp-home]",t.hdp.home,t.hdp.homeTrend,"side"),dv2UpdateOddsPill(e,"[data-dv2-odds-hdp-rate]",t.hdp.rate,t.hdp.rateTrend,"rate",{signedRate:!0}),dv2UpdateOddsPill(e,"[data-dv2-odds-hdp-away]",t.hdp.away,t.hdp.awayTrend,"side"),dv2UpdateOddsPill(e,"[data-dv2-odds-ou-over]",t.ou.over,t.ou.overTrend,"side"),dv2UpdateOddsPill(e,"[data-dv2-odds-ou-rate]",t.ou.rate,t.ou.rateTrend,"rate"),dv2UpdateOddsPill(e,"[data-dv2-odds-ou-under]",t.ou.under,t.ou.underTrend,"side"),e.find("[data-dv2-odds-corners-home]").text(t.corners.home??0),e.find("[data-dv2-odds-corners-away]").text(t.corners.away??0),e.find("[data-dv2-odds-yc-home]").text(t.yellowCard.home??0),e.find("[data-dv2-odds-yc-away]").text(t.yellowCard.away??0))}function dv2ForceApplyStreamOddsData(e,t){const a=e.data("dv2OddsPanelState"),n=a?.$panel;if(!a||!n?.length||!t)return;const i=dv2ExtractOddsSnapshot(t);a.snapshotSerialized=dv2SerializeOddsSnapshot(i),dv2RenderStreamOddsPanel(n,i),dv2HasStreamOddsData(t)||(a.autoHideTimer&&(clearTimeout(a.autoHideTimer),a.autoHideTimer=null),dv2SetStreamOddsPanelOpen(n,!1))}function dv2RememberStreamOddsMatchData(e,t){e?.length&&t&&e.data("dv2OddsMatchData",t)}function dv2SetStreamOddsPanelOpen(e,t,a){if(!e?.length)return;const n=!!t,i=!(!a||!a.auto),o=e.closest("[data-dv2-odds-panel]");e.toggleClass("dv2-stream-odds-panel--open",n).toggleClass("dv2-stream-odds-panel--collapsed",!n).attr("aria-hidden",n?"false":"true"),o.toggleClass("dv2-stream-odds-slot--open",n).attr("aria-hidden",n?"false":"true"),e.find(".dv2-stream-odds-panel__toggle-close").attr("aria-expanded",n?"true":"false"),o.find(".dv2-stream-odds-panel__toggle-open").attr("aria-expanded",n?"true":"false"),e.data("dv2OddsAutoVisible",i)}function dv2BindStreamOddsPanelToggle(e){const t=e?.data("dv2OddsPanelState"),a=t?.$panel;if(!t||!a?.length)return;const n=a.closest("[data-dv2-odds-panel]");e.off("click.dv2OddsPanel",".dv2-stream-odds-panel__toggle-close, .dv2-stream-odds-panel__toggle-open"),n.off("click.dv2OddsPanel"),n.on("click.dv2OddsPanel",".dv2-stream-odds-panel__toggle-close",function(e){e.preventDefault(),e.stopPropagation(),t.autoHideTimer&&(clearTimeout(t.autoHideTimer),t.autoHideTimer=null),dv2SetStreamOddsPanelOpen(a,!1)}),n.on("click.dv2OddsPanel",".dv2-stream-odds-panel__toggle-open",function(e){e.preventDefault(),e.stopPropagation(),dv2SetStreamOddsPanelOpen(a,!0,{auto:!1}
1)})}function dv2DestroyStreamOddsPanel(e){e?.length&&(function dv2ClearStreamOddsTimers(e){const t=e.data("dv2OddsPanelState");t&&(t.pollTimer&&(clearInterval(t.pollTimer),t.pollTimer=null),t.autoShowTimer&&(clearInterval(t.autoShowTimer),t.autoShowTimer=null),t.autoHideTimer&&(clearTimeout(t.autoHideTimer),t.autoHideTimer=null))}(e),e.removeData("dv2OddsPanelState"),e.off(".dv2OddsPanel"),dv2GetStreamChromeEl(e).find("[data-dv2-odds-panel]").empty())}function dv2PollStreamOddsPanel(e){const t=e.data("dv2OddsPanelState");t?.matchId&&$.ajax&&$.ajax({url:`${t.apiBase}lives/${t.matchId}`,method:"GET",success(t){t?.data&&function dv2ApplyStreamOddsData(e,t){const a=e.data("dv2OddsPanelState"),n=a?.$panel;if(!a||!n?.length||!t)return;const i=dv2ExtractOddsSnapshot(t),o=dv2SerializeOddsSnapshot(i);a.snapshotSerialized!==o&&(a.snapshotSerialized=o,dv2RenderStreamOddsPanel(n,i),dv2RememberStreamOddsMatchData(e,t),dv2HasStreamOddsData(t)?e.data("hlsReady")&&!a.hasShownFirstAuto&&function dv2SnapshotHasOddsData(e){return!!e&&(dv2OddsSectionHasData(e.hdp)||dv2OddsSectionHasData(e.ou))}(i)&&dv2MaybeShowFirstStreamOddsAuto(e):(a.autoHideTimer&&(clearTimeout(a.autoHideTimer),a.autoHideTimer=null),dv2SetStreamOddsPanelOpen(n,!1)))}(e,t.data)}})}function dv2ShowStreamOddsAuto(e){const t=e.data("dv2OddsPanelState"),a=t?.$panel;t&&a?.length&&dv2HasStreamOddsData(e.data("dv2OddsMatchData"))&&(dv2SetStreamOddsPanelOpen(a,!0,{auto:!0}),function dv2ScheduleStreamOddsAutoHide(e){const t=e.data("dv2OddsPanelState");t?.$panel?.length&&(t.autoHideTimer&&(clearTimeout(t.autoHideTimer),t.autoHideTimer=null),t.autoHideTimer=setTimeout(()=>{t.autoHideTimer=null,t.$panel.data("dv2OddsAutoVisible")&&dv2SetStreamOddsPanelOpen(t.$panel,!1)},1e4))}(e))}function dv2MaybeShowFirstStreamOddsAuto(e){const t=e.data("dv2OddsPanelState");t?.$panel?.length&&!t.hasShownFirstAuto&&dv2HasStreamOddsData(e.data("dv2OddsMatchData"))&&(t.hasShownFirstAuto=!0,dv2SetStreamOddsPanelOpen(t.$panel,!0,{auto:!1}))}function dv2EnsureStreamOddsPanelShell(e){if(!e?.length)return $();let t=dv2GetStreamChromeEl(e);if(!t.length){t=$('<div class="dv2-stream-chrome" aria-hidden="true"></div>');const a=dv2GetVideoStageEl(e);a.length?a.prepend(t):e.prepend(t)}let a=t.find("[data-dv2-odds-panel]").first();a.length||(a=t.children("[data-dv2-odds-panel]").first()),a.length||(a=e.children("[data-dv2-odds-panel]").first()),a.length||(a=$('<div class="dv2-stream-odds-slot" data-dv2-odds-panel aria-hidden="true"></div>'),t.prepend(a));let n=a.find("[data-dv2-odds-panel-root]");return n.length||(a.html(function dv2BuildStreamOddsPanelHtml(e){const t=e?.imageUrl||"",a=e?.linkUrl||"",n=a?"a":"div";return`\n<div class="dv2-stream-odds-panel dv2-stream-odds-panel--collapsed" data-dv2-odds-panel-root aria-hidden="true">\n    <div class="dv2-stream-odds-panel__viewport">\n        <div class="dv2-stream-odds-panel__slide">\n            <div class="dv2-stream-odds-panel__body">\n            <${n}${a?` class="dv2-stream-odds-panel__brand" href="${a}" target="_blank" rel="noopener noreferrer"`:' class="dv2-stream-odds-panel__brand"'}>\n                <span class="dv2-stream-odds-panel__brand-label">Cược</span>\n                ${t?`<img src="${t}" alt="Cược" loading="lazy" decoding="async">`:""}\n            </${n}>\n            <div class="dv2-stream-odds-panel__rows">\n                <div class="dv2-stream-odds-panel__row dv2-stream-odds-panel__row--hdp">\n                    <span class="dv2-stream-odds-panel__row-label">HDP</span>\n                    <span class="dv2-stream-odds-panel__pill dv2-stream-odds-panel__pill--side" data-dv2-odds-hdp-home>-</span>\n                    <span class="dv2-stream-odds-panel__pill dv2-stream-odds-panel__pill--rate" data-dv2-odds-hdp-rate>-</span>\n                    <span class="dv2-stream-odds-panel__pill dv2-stream-odds-panel__pill--side" data-dv2-odds-hdp-away>-</span>\n                </div>\n                <div class="dv2-stream-odds-panel__row dv2-stream-odds-panel__row--ou">\n                    <span class="dv2-stream-odds-panel__row-label">O/U</span>
1\n                    <span class="dv2-stream-odds-panel__pill dv2-stream-odds-panel__pill--side" data-dv2-odds-ou-over>-</span>\n                    <span class="dv2-stream-odds-panel__pill dv2-stream-odds-panel__pill--rate" data-dv2-odds-ou-rate>-</span>\n                    <span class="dv2-stream-odds-panel__pill dv2-stream-odds-panel__pill--side" data-dv2-odds-ou-under>-</span>\n                </div>\n            </div>\n            <div class="dv2-stream-odds-panel__stats">\n                <span data-dv2-odds-corners-home>0</span>\n                <span class="dv2-stream-odds-panel__stat-icon"><svg width="10" height="10" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M1.25762 14.4734L11.7539 7.51758M7.71808 10.0793C7.71808 10.0793 11.7548 11.1782 11.3506 14.4734M0.451172 14.4734H13.7735" stroke="#2DB10B" stroke-width="1.33224"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M1.49032 2.39258V14.5972H0.451172V2.39342H1.49032V2.39258Z" fill="#2DB10B"></path><path d="M0.451172 5.68755H9.33275L0.451172 0.5625V5.68755Z" fill="#2DB10B"></path></svg></span>\n                <span data-dv2-odds-corners-away>0</span>\n                <span class="dv2-stream-odds-panel__stat-sep" aria-hidden="true">|</span>\n                <span data-dv2-odds-yc-home>0</span>\n                <span class="dv2-stream-odds-panel__stat-icon"><svg width="7" height="10" viewBox="0 0 10 16" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><rect width="10" height="16" rx="2" fill="#F7FF00"></rect></svg></span>\n                <span data-dv2-odds-yc-away>0</span>\n            </div>\n            </div>\n            <button type="button" class="dv2-stream-odds-panel__toggle-close" aria-label="Thu gọn" aria-expanded="false">\n                <svg class="dv2-stream-odds-panel__toggle-icon--close" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><g filter="url(#dv2_odds_filter_close)"><path d="M18.3063 41.9042L10.4543 53.8015C8.88006 56.1882 11.6954 58.9857 14.3331 57.6572L56.4611 36.4132C58.513 35.3784 58.513 32.6199 56.4611 31.5851L14.3331 10.3438C11.6954 9.01263 8.88006 11.8127 10.4543 14.1995L18.3063 26.0967C21.5021 30.9404 21.5021 37.0606 18.3063 41.9042Z" fill="#F7FF00"></path></g><defs><filter id="dv2_odds_filter_close" x="0" y="0" width="72" height="72" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"></feColorMatrix><feOffset dx="2" dy="2"></feOffset><feGaussianBlur stdDeviation="6"></feGaussianBlur><feComposite in2="hardAlpha" operator="out"></feComposite><feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0.933333 0 0 0 0 0 0 0 0 0.35 0"></feColorMatrix><feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"></feBlend><feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"></feBlend></filter></defs></svg>\n            </button>\n        </div>\n    </div>\n</div>\n<button type="button" class="dv2-stream-odds-panel__toggle-open" aria-label="Mở rộng" aria-expanded="false">\n    <svg class="dv2-stream-odds-panel__toggle-icon--open" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><g filter="url(#dv2_odds_filter_open)"><path d="M49.6937 41.9042L57.5457 53.8015C59.1199 56.1882 56.3046 58.9857 53.6669 57.6572L11.5389 36.4132C9.48704 35.3784 9.48704 32.6199 11.5389 31.5851L53.6669 10.3438C56.3046 9.01263 59.1199 11.8127 57.5457 14.1995L49.6937 26.0967C46.4979 30.9404 46.4979 37.0606 49.6937 41.9042Z" fill="#F7FF00"></path></g><defs><filter id="dv2_odds_filter_open" x="0" y="0" width="72" height="72" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"></feColorMatrix><feOffset dx="2" dy="2"></feOffset><feGaussianBlur stdDeviation="6"></feGaussianBlur><feComposite in2="hardAlpha" operator="out"></feComposite><feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0.933333 0 0 0 0 0 0 0 0 0.35 0"></feColorMatrix>
1<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"></feBlend><feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"></feBlend></filter></defs></svg>\n</button>`}(function dv2GetStreamOddsPanelConfig(){const e=window.DV2_STREAM_ODDS_PANEL||{};return{imageUrl:e.imageUrl||"",linkUrl:e.linkUrl||""}}())),n=a.find("[data-dv2-odds-panel-root]")),n}function dv2InitStreamOddsPanel(e,t){if(!e?.length)return;t?dv2RememberStreamOddsMatchData(e,t):t=e.data("dv2OddsMatchData");const a=t?.matchId||t?.match_id||t?.id||function dv2GetStreamMatchId(){if("undefined"!=typeof DV2_MATCH_ID&&DV2_MATCH_ID)return String(DV2_MATCH_ID);try{const e=new URLSearchParams(window.location.search).get("match");if(e)return e}catch(e){}const e=window.location.pathname.match(/\/streams\/([^/?#]+)/i);return e?e[1]:""}();if(!a)return;const n=dv2EnsureStreamOddsPanelShell(e);if(!n.length)return;if(e.data("dv2OddsPanelState")?.matchId===a)return e.data("dv2OddsPanelState").$panel=dv2EnsureStreamOddsPanelShell(e),t&&(dv2RememberStreamOddsMatchData(e,t),dv2ForceApplyStreamOddsData(e,t),e.data("hlsReady")&&dv2MaybeShowFirstStreamOddsAuto(e)),void dv2BindStreamOddsPanelToggle(e);dv2DestroyStreamOddsPanel(e);const i={matchId:a,apiBase:dv2GetStreamOddsApiBase(),$panel:n,snapshotSerialized:"",pollTimer:null,autoShowTimer:null,autoHideTimer:null,hasShownFirstAuto:!1};e.data("dv2OddsPanelState",i),dv2SetStreamOddsPanelOpen(n,!1),t?dv2ForceApplyStreamOddsData(e,t):dv2PollStreamOddsPanel(e),i.pollTimer=setInterval(()=>{dv2PollStreamOddsPanel(e)},15e3),i.autoShowTimer=setInterval(()=>{n.hasClass("dv2-stream-odds-panel--open")||dv2ShowStreamOddsAuto(e)},18e4),dv2BindStreamOddsPanelToggle(e),e.data("hlsReady")&&dv2MaybeShowFirstStreamOddsAuto(e)}window.DV2_StreamChrome={getChromeEl:dv2GetStreamChromeEl,getOverlayMount:function dv2GetOverlayMount(e){const t=dv2EnsureVideoStage(e);return t.length?t:e},ensureVideoStage:dv2EnsureVideoStage,syncVideoStageLayout:dv2SyncVideoStageLayout,applyVideoControls:dv2ApplyStreamVideoControls,ensureControlsBar:dv2EnsureStreamControlsBar,syncControlsState:dv2SyncStreamControlsState,bindEvents:dv2BindStreamChromeEvents,initPlayerUi:function dv2InitStreamPlayerUi(e,t){e?.length&&(t=t||e.find("video").first(),t?.length&&(dv2ApplyStreamVideoControls(t),function dv2ApplyStreamAutoplayMuted(e){if(!e?.length)return;const t=e[0];t&&"1"!==t.dataset.dv2VolumeTouched&&(t.muted=!0)}(t)),dv2EnsureVideoStage(e),dv2EnsureStreamControlsBar(e),dv2BindStreamChromeEvents(e),function dv2InitVideoStageSync(e){if(!e?.length||e.data("dv2VideoStageSyncBound"))return;e.data("dv2VideoStageSyncBound",!0);const scheduleSync=()=>function dv2ScheduleVideoStageLayoutSync(e){if(!e?.length)return;if(e.data("dv2VideoStageSyncRaf"))return;const t=requestAnimationFrame(()=>{e.removeData("dv2VideoStageSyncRaf"),dv2SyncVideoStageLayout(e)});e.data("dv2VideoStageSyncRaf",t)}(e);if(scheduleSync(),e.on("loadedmetadata.dv2StageSync loadeddata.dv2StageSync resize.dv2StageSync","video",scheduleSync),"undefined"!=typeof ResizeObserver){const t=new ResizeObserver(scheduleSync);t.observe(e[0]);const a=e.find("video").first()[0];a&&t.observe(a),e.data("dv2VideoStageResizeObserver",t)}$(window).on("resize.dv2StageSync orientationchange.dv2StageSync",scheduleSync),e.on("dv2wrapperfschange.dv2StageSync",scheduleSync),$(document).on("fullscreenchange.dv2StageSync webkitfullscreenchange.dv2StageSync",scheduleSync)}(e),dv2SyncStreamControlsState(e,t),dv2SyncVideoStageLayout(e))},refreshReviveAds:dv2RefreshStreamChromeReviveAds,setFullChromeVisible:dv2SetFullStreamChromeVisible,syncVisibility:dv2SyncStreamChromeVisibility,updateVisibility:dv2UpdateStreamChromeVisibility,onHlsReady:function dv2OnHlsStreamReady(e){if(!e?.length)return;e.data("hlsReady",!0),dv2SyncStreamChromeVisibility(e),dv2InitStreamOddsPanel(e,e.data("dv2OddsMatchData"));const t=e.data("dv2OddsPanelState");t?.$panel?.length&&(t.hasShownFirstAuto?t.$panel.hasClass("dv2-stream-odds-panel--open")||dv2ShowStreamOddsAuto(e):dv2MaybeShowFirstStreamOddsAuto(e))},clearFullChrome:function dv2ClearFullStreamChrome(e){if(!e?.length)return;e.data("hlsReady",!1),dv2SetFullStreamChromeVisible(e,!1);const t=e.data("dv2OddsPanelState");t?.$panel?.length&&(t.autoHideTimer&&(clearTimeout(t.autoHideTimer),t.autoHideTimer=null),dv2SetStreamOddsPanelOpen(t.$panel,!1)),dv2ExitStreamWrapperFullscreen(e)},initOddsPanel:dv2InitStreamOddsPanel,rememberOddsMatchData:dv2RememberStreamOddsMatchData,destroyOddsPanel:dv2DestroyStreamOddsPanel,exitWrapperFullscreen:dv2ExitStreamWrapperFullscreen,toggleWrapperFullscreen:dv2ToggleWrapperFullscreen,pulseControlsVisible:dv2PulseStreamControlsVisible,togglePlayPause:dv2ToggleStreamVideoPlayPause,getWrapperFrom:e=>e.closest(".dv2-video-wrapper")}}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window){window.DV2StreamKickoff=window.DV2StreamKickoff||{},function(DV2StreamKickoff){let e=null;DV2StreamKickoff.getKickoff=function getKickoff(e){return e?"string"==typeof e||e instanceof Date||"number"==typeof e?e:e?.matchInfo?.kickoff??e?.kickoff??"":""},DV2StreamKickoff.getDefaultHot18PosterUrl=function getDefaultHot18PosterUrl(){return`${function getImagePath(){return"undefined"!=typeof DV2_IMAGE_PATH&&DV2_IMAGE_PATH?DV2_IMAGE_PATH.endsWith("/")?DV2_IMAGE_PATH:`${DV2_IMAGE_PATH}/`:"string"==typeof window.DV2_STREAMING_PLUGIN_URL&&window.DV2_STREAMING_PLUGIN_URL?`${window.DV2_STREAMING_PLUGIN_URL.endsWith("/")?window.DV2_STREAMING_PLUGIN_URL:`${window.DV2_STREAMING_PLUGIN_URL}/`}assets/images/`:"../../assets/images/"}()}bg-18+.webp`},DV2StreamKickoff.resolvePosterUrl=function resolvePosterUrl(e,t){return function isHot18Link(e){if(!e)return!1;const t=function getHot18CommentatorId(){return String(window.DV2_STREAMING_HOT18_COMMENTATOR_ID||"18602824317240064")}();if(t&&String(e.commentatorId||"")===t)return!0;const a=String(e.commentator||"").trim().toLowerCase();return"18+"===a||"18"===a}(e)?String(window.DV2_STREAMING_HOT18_POSTER_URL||"").trim()||DV2StreamKickoff.getDefaultHot18PosterUrl():t},DV2StreamKickoff.applyPosterForLink=function applyPosterForLink(e,t,a){const $=window.jQuery;$?.fn&&e?.length&&e.attr("poster",DV2StreamKickoff.resolvePosterUrl(t,a))},DV2StreamKickoff.applyPosterForVideo=function applyPosterForVideo(e,t,a){e&&(e.poster=DV2StreamKickoff.resolvePosterUrl(t,a))},DV2StreamKickoff.getKickoffDiffMs=function getKickoffDiffMs(e){const t=new Date(DV2StreamKickoff.getKickoff(e));return Number.isNaN(t.getTime())?null:t.getTime()-Date.now()},DV2StreamKickoff.shouldShowCountdown=function shouldShowCountdown(e){const t=DV2StreamKickoff.getKickoffDiffMs(e);return null!==t&&t>0&&t<864e5},DV2StreamKickoff.formatCountdown=function formatCountdown(e){const t=DV2StreamKickoff.getKickoffDiffMs(e);if(null===t||t<=0)return"00:00:00";const a=Math.floor(t/36e5),n=Math.floor(t%36e5/6e4),i=Math.floor(t%6e4/1e3);return`${String(a).padStart(2,"0")}
1:${String(n).padStart(2,"0")}:${String(i).padStart(2,"0")}`},DV2StreamKickoff.formatTime=function formatTime(e){const t=new Date(DV2StreamKickoff.getKickoff(e));return!e||Number.isNaN(t.getTime())?"":`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`},DV2StreamKickoff.formatDateLabel=function formatDateLabel(e){const t=new Date(DV2StreamKickoff.getKickoff(e));return!e||Number.isNaN(t.getTime())?"":`${String(t.getDate()).padStart(2,"0")}/${String(t.getMonth()+1).padStart(2,"0")}/${t.getFullYear()}`},DV2StreamKickoff.renderTimeDisplay=function renderTimeDisplay(e,t){const a=(t=t||{}).formatTime||DV2StreamKickoff.formatTime,n=t.formatDateLabel||DV2StreamKickoff.formatDateLabel,i=t.countdownClass||"dv2-kickoff-countdown",o=DV2StreamKickoff.getKickoff(e);return DV2StreamKickoff.shouldShowCountdown(o)?`Bắt đầu sau: <strong class="${i}" data-dv2-kickoff-countdown>${DV2StreamKickoff.formatCountdown(o)}</strong>`:`${t.useFooterTitle?'<strong class="dv2-layout-vb2-footer-title">Thời gian:</strong>':"Thời gian:"} <strong>${a(o)}</strong> ngày ${n(o)}`},DV2StreamKickoff.stopCountdown=function stopCountdown(){e&&(clearInterval(e),e=null)},DV2StreamKickoff.startCountdown=function startCountdown(t){DV2StreamKickoff.stopCountdown();const $=window.jQuery,a=DV2StreamKickoff.getKickoff(t);if(!$?.fn||!DV2StreamKickoff.shouldShowCountdown(a))return;const tick=()=>{const e=$(".dv2-kickoff-countdown[data-dv2-kickoff-countdown]");if(!e.length)return void DV2StreamKickoff.stopCountdown();const t=DV2StreamKickoff.getKickoffDiffMs(a);if(null===t||t<=0)return e.text("00:00:00"),void DV2StreamKickoff.stopCountdown();e.text(DV2StreamKickoff.formatCountdown(a))};tick(),e=setInterval(tick,1e3)}}(window.DV2StreamKickoff)}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window){window.DV2StreamLinks=window.DV2StreamLinks||{},function(DV2StreamLinks){DV2StreamLinks.isNhaDaiLink=function isNhaDaiLink(e){if(!e)return!1;if(1e17===e.commentatorId)return!0;const t=String(e.commentator||"").trim().toLowerCase();return"nhà đài"===t||"nha dai"===t||"blv nhà đài"===t},DV2StreamLinks.sortLinks=function sortLinks(e,t){const a=(!0===t?.includeAll?(e||[]).slice():(e||[]).filter(e=>!1!==e?.isStreaming)).slice();return a.sort((e,t)=>{const a=DV2StreamLinks.isNhaDaiLink(e),n=DV2StreamLinks.isNhaDaiLink(t);return a&&!n?1:!a&&n?-1:0}),a},DV2StreamLinks.sort=function sort(e){return DV2StreamLinks.sortLinks(e)},DV2StreamLinks.sortForDetail=function sortForDetail(e){return DV2StreamLinks.sortLinks(e,{includeAll:!0})},DV2StreamLinks.getPreferredLink=function getPreferredLink(e,t){const a=!1!==t?.preferStreaming,n=DV2StreamLinks.sort(e);return n.length?n[0]:a&&DV2StreamLinks.sortForDetail(e)[0]||null},DV2StreamLinks.getBlvName=function getBlvName(e,t){return String(e?.commentator||"").trim()||`Link ${t+1}`},DV2StreamLinks.resolveBrandLandingUrl=function resolveBrandLandingUrl(e){if(null==e||""===e)return null;const t=String(e).trim();if(!t)return null;const a=t.indexOf("?"),n=a>=0?t.slice(0,a):t,i=a>=0?t.slice(a+1):"",o=n.split("/").filter(Boolean).pop()||"",s=o.lastIndexOf("-");if(s<0)return null;const r=o.slice(s+1);if(!r)return null;const l=i?`?${i}`:"";return`/streams/${encodeURIComponent(r)}/${l}`},DV2StreamLinks.getDetailUrl=function getDetailUrl(e,t,a){const n=!0===(a||{}).trailingSlash,i=DV2StreamLinks.resolveBrandLandingUrl(t?.brandLanding);if(i)return i;const o=null!=t?.liveId?String(t.liveId):"",s=encodeURIComponent(String(e)),r=n?`/streams/${s}/`:`/streams/${s}`;return o?`${r}?liveId=${encodeURIComponent(o)}`:r},DV2StreamLinks.navigateForLink=function navigateForLink(e){const t=DV2StreamLinks.resolveBrandLandingUrl(e?.brandLanding);return!!t&&(window.location.href=t,!0)},DV2StreamLinks.findIndexByLiveId=function findIndexByLiveId(e,t){if(!t||!Array.isArray(e))return-1;const a=String(t);return e.findIndex(e=>String(e?.liveId)===a)},DV2StreamLinks.updateLiveIdInUrl=function updateLiveIdInUrl(e){const t=new URLSearchParams(window.location.search);null!=e&&""!==e?t.set("liveId",String(e)):t.delete("liveId");const a=t.toString(),n=a?`${window.location.pathname}?${a}${window.location.hash}`:`${window.location.pathname}${window.location.hash}`;window.history.replaceState(null,"",n)},DV2StreamLinks.resolveActiveLink=function resolveActiveLink(e,t){const a=t||{},n=!1!==a.syncUrl,i=void 0!==a.liveId?a.liveId:new URLSearchParams(window.location.search).get("liveId");let o=DV2StreamLinks.findIndexByLiveId(e,i);o<0&&(o=0);const s=e[o]||null;return n&&null!=s?.liveId&&DV2StreamLinks.updateLiveIdInUrl(s.liveId),{activeIndex:o,activeLink:s}}
1,DV2StreamLinks.bindSpanLinks=function bindSpanLinks(e){const $=window.jQuery,{$container:t,links:a=[],activeIndex:n=0,streamAttr:i="data-stream-url",onSelect:o}=e||{};if(!$?.fn||!t?.length||!a.length)return;const s=a.map((e,t)=>{const a=t===n?"active":"",o=DV2StreamLinks.getBlvName(e,t),s=e.url||"";return`<span data-index="${t}" data-live-id="${null!=e.liveId?String(e.liveId):""}" ${i}="${s}" class="${a}">${o}</span>`}).join("");t.html(s),t.off("click.dv2StreamLinks").on("click.dv2StreamLinks","span",function(e){e.preventDefault(),e.stopPropagation();const n=$(this),i=Number(n.attr("data-index")),s=a[i];if(DV2StreamLinks.navigateForLink(s))return;const r=n.attr("data-live-id");r&&DV2StreamLinks.updateLiveIdInUrl(r),t.find("span").removeClass("active"),t.find(`span[data-index="${i}"]`).addClass("active"),"function"==typeof o&&o(s,i,n)})},DV2StreamLinks.prepareSpanLinks=function prepareSpanLinks(e){const{rawLinks:t,$container:a,streamAttr:n="data-stream-url",onSelect:i,syncUrl:o=!0}=e||{},s=DV2StreamLinks.sortForDetail(t);if(!s.length)return{links:s,activeIndex:-1,activeLink:null};const{activeIndex:r,activeLink:l}=DV2StreamLinks.resolveActiveLink(s,{syncUrl:o});return a?.length&&DV2StreamLinks.bindSpanLinks({$container:a,links:s,activeIndex:r,streamAttr:n,onSelect:i}),{links:s,activeIndex:r,activeLink:l}}}(window.DV2StreamLinks)}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$){window.DV2StreamTvc=window.DV2StreamTvc||{},function(DV2StreamTvc){let e=!1;function normalizeTvcItem(e){if("string"==typeof e&&e)return{url:e,s3Url:e,redirectUrl:""};if(!e||"object"!=typeof e)return null;const t=e.s3Url||e.s3_url||"",a=t||e.url||"";return a?{url:a,s3Url:t||a,redirectUrl:e.redirectUrl||e.redirect_url||""}:null}DV2StreamTvc.playBeforeStream=function playBeforeStream(t,a){if(e||!t?.length)return void a?.();const n=function pickRandomTvc(){const e=function getTvcVideos(){const e=void 0!==window.DV2_TVC_VIDEOS&&Array.isArray(window.DV2_TVC_VIDEOS)?window.DV2_TVC_VIDEOS:[],t="undefined"!=typeof dv2Streaming&&Array.isArray(dv2Streaming.tvcVideos)?dv2Streaming.tvcVideos:[];return(e.length?e:t).map(normalizeTvcItem).filter(Boolean)}();return e.length?e[Math.floor(Math.random()*e.length)]:null}();if(!n)return console.info("[DV2 TVC] No TVC videos configured, skipping pre-roll"),void a?.();e=!0;const i=$('\n      <div class="dv2-stream-tvc" role="dialog" aria-label="Quảng cáo">\n        <video class="dv2-stream-tvc__video" autoplay playsinline preload="auto"></video>\n        <button type="button" class="dv2-stream-tvc__unmute" aria-label="Bật tiếng" hidden>Bật tiếng</button>\n        <button type="button" class="dv2-stream-tvc__skip dv2-stream-tvc__skip--disabled" disabled aria-disabled="true">Bỏ qua (5)</button>\n      </div>\n    '),o=i.find("video")[0],s=i.find(".dv2-stream-tvc__unmute"),r=i.find(".dv2-stream-tvc__skip");let l=!1,d=5,c=null;const finish=()=>{l||(l=!0,c&&(clearInterval(c),c=null),o.pause(),t.removeClass("dv2-stream-tvc-active"),i.remove(),a?.())};c=setInterval(()=>{if(d-=1,d<=0)return clearInterval(c),c=null,void r.prop("disabled",!1).attr("aria-disabled","false").removeClass("dv2-stream-tvc__skip--disabled").text("Bỏ qua");r.text(`Bỏ qua (${d})`)},1e3),r.on("click",finish),o.addEventListener("ended",finish,{once:!0}),o.addEventListener("error",e=>{const t=o.error;console.warn("[DV2 TVC] Failed to load pre-roll, skipping",{src:o.currentSrc||o.src,code:t?.code,message:t?.message,event:e}),finish()},{once:!0});const showUnmuteButton=()=>{!l&&o.muted&&s.prop("hidden",!1).show()};s.on("click",e=>{e.stopPropagation(),!l&&o.muted&&(o.muted=!1,o.volume=1,o.play().catch(()=>{}),s.remove())});const m=(n.redirectUrl||"").trim();m&&(o.classList.add("dv2-stream-tvc__video--clickable"),o.addEventListener("click",()=>{window.open(m,"_blank","noopener,noreferrer")})),t.addClass("dv2-stream-tvc-active"),t.append(i),o.setAttribute("playsinline","true"),o.setAttribute("webkit-playsinline","true"),o.src=n.s3Url||n.url,o.muted=!1,o.volume=1,o.play().catch(()=>(console.warn("[DV2 TVC] Autoplay with sound blocked, retrying muted"),o.muted=!0,o.play().then(showUnmuteButton).catch(()=>{console.warn("[DV2 TVC] Autoplay blocked, skipping"),finish()})))}}(window.DV2StreamTvc)}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery,Hls){function getDateLabel_CK(e){const t=new Date,a=new Date(t);a.setDate(a.getDate()+1);const n=new Date(e);return t.setHours(0,0,0,0),a.setHours(0,0,0,0),n.setHours(0,0,0,0),n.getTime()===t.getTime()?"Hôm nay":n.getTime()===a.getTime()?"Ngày mai":`${String(n.getDate()).padStart(2,"0")}/${String(n.getMonth()+1).padStart(2,"0")}`}function formatTime_CK(e){if(!e)return"";const t=new Date(e);return`${String(t.getHours()).padStart(2,"0")}
1:${String(t.getMinutes()).padStart(2,"0")}`}($=jQuery.noConflict())(document).ready(function(){$(".dv2-layout-ck.dv2-detail-livestream").length>0&&function renderDetailMatch_CK(){const e=$(".dv2-layout-ck.dv2-detail-livestream .dv2-video-wrapper"),t=$(".dv2-layout-ck.dv2-detail-livestream .dv2-match-info");let a=new URLSearchParams(window.location.search).get("match");if(a||(a="undefined"!=typeof DV2_MATCH_ID&&DV2_MATCH_ID?DV2_MATCH_ID:"2y8m4zh54p4zql0"),!a)return void e.html('<div class="dv2-notfound-video">❌ Không có ID livestream hợp lệ</div>');console.log("[VSC LIVE] Load livestream detail cho ID:",a);const n=$('\n    <div class="dv2-loading">\n      Đang tải video...\n    </div>\n  ');e.append(n);const i=$("<video>",{id:"liveVideo",controls:!0,autoplay:!0,muted:!0,playsinline:!0,poster:"https://watch.rkplayer.xyz/img/cakhia.png"});e.append(i),$.ajax({url:`https://vsc-apidev.helizones.com/api/data/lives/${a}`,method:"GET",success:function(a){console.log("[VSC LIVE] API response:",a);const o=a?.data;if(o){n.remove();const e=o?.teams?.home?.name,a=o?.teams?.away?.name,i=o?.teams?.home?.logo,s=o?.teams?.away?.logo,r=o?.league?.name,l=o?.league?.logo,d=o?.matchInfo?.kickoff,c=o?.score?.fulltime?.home,m=o?.score?.fulltime?.away,v=`\n                <div class="dv2-league">\n                    <img class="dv2-league-logo" id="leagueLogo" src="${l}" alt="League Logo">\n                    <span class="dv2-league-name" id="leagueName">${r}</span>\n                </div>\n                <div class="dv2-teams">\n                    <div class="dv2-team">\n                        <img class="dv2-home-logo" id="homeLogo" src="${i}" alt="Home Team">\n                        <span class="dv2-home-name" id="homeName">${e}</span>\n                    </div>\n                    <div class="dv2-score" id="score">${c} - ${m}</div>\n                    <div class="dv2-team">\n                        <img class="dv2-away-logo" id="awayLogo" src="${s}" alt="Away Team">\n                        <span class="dv2-away-name" id="awayName">${a}</span>\n                    </div>\n                </div>\n                <div class="dv2-match-time" id="matchTime">Thời gian diễn ra trận đấu: ${getDateLabel_CK(d)} - ${formatTime_CK(d)}</div>\n            `;t.append(v)}if(!o||!o.livestream)return e.html('<div class="dv2-not-loaded">🚫 Không có luồng livestream</div>'),void e.append(i);const s=new Date(o?.matchInfo?.kickoff);if(!Number.isNaN(s.getTime())&&s.getTime()-Date.now()>9e5){const t=function createNotFoundMatchOverlay_CK(e){const t=e?.matchInfo?.kickoff,a=e?.league?.name,n=e?.teams?.home?.name||"Home",i=e?.teams?.away?.name||"Away",o=function render
1StatusMatch_CK(e){const t=new Date;new Date(t).setHours(0,0,0,0),new Date(t).setHours(23,59,59,999);const a=e instanceof Date?e:new Date(e);let n="";if(a>t)n=Math.round((a-t)/6e4)<=30?"sắp bắt đầu":"chưa diễn ra";else{const e=new Date(a);e.setHours(e.getHours()+2),n=t<=e?"đang diễn ra":"đã kết thúc"}return n}(t);return $(`\n            <div class="dv2-loading">\n                Trận đấu ${o}: <strong>${n} - ${i}</strong>\n                <div class="dv2-load-league">\n                    <span>Giải đấu: <strong>${a}</strong></span>\n                </div>\n                <div class="dv2-load-time">\n                    <span>Thời gian: ${getDateLabel_CK(t)}</span>\n                    <span>${formatTime_CK(t)}</span>\n                </div>\n            </div>\n        `)}(o);return void e.append(t)}const r=o?.livestream?.links[0]?.url||"";if(!r)return void e.html('<div class="dv2-not-loaded">Không tìm thấy video livestream</div>');const l=$(".dv2-stream-links"),d=Array.isArray(o?.livestream?.links)?o.livestream.links.map((e,t)=>`<span data-index="${t}" data-stream-url=${e.url}>Link ${t+1}</span>`):null;l.html(d),l.on("click","span",function(e){e.preventDefault(),e.stopPropagation(),initHLSPlayer($(this).data("stream-url"))}),initHLSPlayer(r)},error:function(t){console.error("[VSC LIVE] Lỗi khi gọi API:",t),e.html('<div class="dv2-not-loaded">Không thể tải dữ liệu livestream</div>')}});let o=null;function initHLSPlayer(t){console.log("[VSC LIVE] Init HLS for:",t);let a=0;if(o){console.log("[VSC LIVE] Destroy old HLS instance");try{o.destroy()}catch(e){console.warn(e)}o=null}function setupPlayer(){if(Hls.isSupported()){const e=new Hls({maxBufferLength:10,liveSyncDuration:3,enableWorker:!0,xhrSetup:function(e,t){e.withCredentials=!1,e.referrerPolicy="no-referrer-when-downgrade"}});o=e,e.loadSource(t),e.attachMedia(i[0]),e.on(Hls.Events.MANIFEST_PARSED,function(){console.log("[VSC LIVE] Manifest loaded — starting playback"),n.remove(),i[0].muted=!0,i[0].play().catch(()=>console.warn("Autoplay bị chặn"))}),e.on(Hls.Events.ERROR,function(t,a){if(a.fatal)switch(console.log("[VSC LIVE] HLS fatal error:",a.type),a.type){case Hls.ErrorTypes.NETWORK_ERROR:e.startLoad();break;case Hls.ErrorTypes.MEDIA_ERROR:e.recoverMediaError();break;default:e.destroy(),retry()}})}else i[0].canPlayType("application/vnd.apple.mpegurl")?(i.attr("src",t),i.on("loadedmetadata",function(){n.remove(),i[0].play()}),i.on("error",retry)):e.html('\n                    <div class="dv2-not-loaded">\n                        🚫 Trình duyệt không hỗ trợ phát livestream\n                    </div>\n                    ')}function retry(){a<3?(a++,console.warn(`[VSC LIVE] Retry lần ${a}/3...`),setTimeout(setupPlayer,3e3)):(console.error("[VSC LIVE] Hết số lần retry, dừng phát."),n.text("Không thể tải video, vui lòng thử lại sau."))}setupPlayer()}}()})}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery){($=jQuery.noConflict())(document).ready(function(){$(".dv2-layout-ck.dv2-result-matchs").length>0&&(function updateDateTime_CK(){const e=new Date;$(".dv2-layout-ck.dv2-result-matchs #currentDateTime").text(e.toLocaleDateString("vi-VN",{weekday:"long",year:"numeric",month:"long",day:"numeric"}))}(),function loadResultsData_CK(){const e=new Date,t=new Date(e);t.setDate(t.getDate()-1);const a={fromDate:t.toISOString().split("T")[0],toDate:e.toISOString().split("T")[0]};$.ajax({url:"https://vsc-apidev.helizones.com/api/data/lives/range-date",method:"POST",contentType:"application/json",data:JSON.stringify(a),success:function(e){if(e&&e.matches_by_date){const t=[];Object.keys(e.matches_by_date).forEach(a=>{t.push(...e.matches_by_date[a])}),function renderResultsPage_CK(e){const t=new Date,a=e.filter(e=>{const a=new Date(e.kickoff),n=new Date(a.getTime()+72e5);return t>n});a.sort((e,t)=>new Date(t.kickoff)-new Date(e.kickoff));const n=$(".dv2-layout-ck.dv2-result-matchs .dv2-results-container");if(n.empty(),0===a.length)return void n.html('\n                    <div class="dv2-empty-state">\n                        <div style="font-size: 56px; margin-bottom: 16px; opacity: 0.3;">⚽</div>\n                        <div style="font-size: 15px;">Chưa có trận đấu nào kết thúc</div>\n                    </div>\n                ');const i=function groupMatchesByLeague_CK(e){const t={};
1return e.forEach(e=>{const a=e?.league?.name||"Giải đấu khác";t[a]||(t[a]=[]),t[a].push(e)}),t}(a);Object.keys(i).forEach(e=>{const t=i[e],a=t[0]?.league?.logo||"",o=`\n                    <div class="dv2-league-section">\n                        <div class="dv2-league-header">\n                            ${a?`<img src="${a}" class="dv2-league-logo" alt="${e}">`:""}\n                            <h3 class="dv2-league-title">${e}</h3>\n                        </div>\n\n                        <div class="dv2-match-headers">\n                            <div></div>\n                            <div>Chủ nhà</div>\n                            <div>Tỷ số</div>\n                            <div>Khách</div>\n                            <div></div>\n                            <div>HT | FT</div>\n                        </div>\n\n                        ${t.map(e=>function renderMatchCard_CK(e){const t=function formatMatchTime_CK(e){const t=new Date(e);return`${String(t.getDate()).padStart(2,"0")}/${String(t.getMonth()+1).padStart(2,"0")} - ${t.toLocaleTimeString("vi-VN",{hour:"2-digit",minute:"2-digit"})}`}(e.kickoff),a=e?.teams?.home||{},n=e?.teams?.away||{},i=e?.score?.fulltime?.home??0,o=e?.score?.fulltime?.away??0,s=e?.score?.halftime?.home??0,r=e?.score?.halftime?.away??0,l=function generateStats_CK(e,t,a){return{htFt:`${a} - ${e}`,ht1:Math.floor(3*Math.random()),ft1:Math.floor(5*Math.random()),yellowTotal:Math.floor(7*Math.random()),yellow1:Math.floor(4*Math.random()),yellow2:Math.floor(4*Math.random()),redTotal:Math.floor(2*Math.random()),red1:Math.floor(2*Math.random()),red2:Math.floor(2*Math.random()),corner1:Math.floor(8*Math.random()),corner2:Math.floor(8*Math.random()),shot1:Math.floor(15*Math.random()),shot2:Math.floor(15*Math.random())}}(i,0,s);return`\n                <div class="dv2-match-card" \n                     data-match-id="${e.match_id||e.id}"\n                     onclick="goToMatchDetail('${e.match_id||e.id}')">\n                    \n                    \x3c!-- Time --\x3e\n                    <div class="dv2-time-col">\n                        <div class="dv2-match-time">${t}</div>\n                    </div>\n\n                    \x3c!-- Home team --\x3e\n                    <div class="dv2-team-home">\n                        <div class="dv2-team-name" style="text-align: right;">${a.name||"Home"}</div>\n                        <div class="dv2-team-logo">\n                            <img src="${a.logo}" \n                                 alt="${a.name}">\n                        </div>\n                    </div>\n\n                    \x3c!-- Score --\x3e\n                    <div class="dv2-score-col">\n                        <div class="dv2-score-box">\n                            <div class="dv2-score-number">${i}</div>\n                            <div class="dv2-score-separator">:</div>\n                            <div class="dv2-score-number">${o}</div>\n                        </div>\n                        <div class="dv2-halftime">HT ${s}:${r}</div>\n                    </div>\n\n                    \x3c!-- Away team --\x3e\n                    <div class="dv2-team-away">\n                        <div class="dv2-team-logo">\n                            <img src="${n.logo}" \n                                 alt="${n.name}">\n                        </div>\n                        <div class="dv2-team-name">${n.name||"Away"}</div>\n                    </div>\n\n                    \x3c!-- Highlight button --\x3e\n                    <div class="dv2-highlight-col">\n                        <button class="dv2-highlight-btn" \n                                onclick="event.stopPropagation(); viewHighlight('${e.match_id}')">\n                            XEM HIGHLIGHT\n                        </button>\n                    </div>\n\n                    \x3c!-- Stats --\x3e\n                    <div class="dv2-stats-col">\n                        \x3c!-- HT --\x3e\n                        <div class="dv2-stat-group">\n                            <div class="dv2-stat-main">${s} : ${r}</div>\n                            <div class="dv2-stat-label">HT</div>\n                        </div>\n\n                        \x3c!-- HT | FT --\x3e\n                        <div class="dv2-stat-group">\n                            <div class="dv2-stat-main" style="color: #10b981;">${l.htFt}</div>\n                            <div class="dv2-stat-detail">
1\n                                <span class="dv2-stat-value">${l.ht1} : ${l.ft1}</span>\n                            </div>\n                        </div>\n\n                        \x3c!-- Yellow cards --\x3e\n                        <div class="dv2-stat-group">\n                            <div class="dv2-stat-main" style="color: #fbbf24;">${l.yellowTotal}</div>\n                            <div class="dv2-stat-detail">\n                                <span class="dv2-stat-value">${l.yellow1} - ${l.yellow2}</span>\n                            </div>\n                        </div>\n\n                        \x3c!-- Red cards --\x3e\n                        <div class="dv2-stat-group">\n                            <div class="dv2-stat-main" style="color: #ef4444;">${l.redTotal}</div>\n                            <div class="dv2-stat-detail">\n                                <span class="dv2-stat-value">${l.red1} - ${l.red2}</span>\n                            </div>\n                        </div>\n\n                        \x3c!-- More stats --\x3e\n                        <div class="dv2-stat-group">\n                            <div class="dv2-stat-detail">\n                                <span class="dv2-stat-value">${l.corner1} - ${l.corner2}</span>\n                            </div>\n                            <div class="dv2-stat-detail">\n                                <span class="dv2-stat-value">${l.shot1} - ${l.shot2}</span>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            `}(e)).join("")}\n                    </div>\n                `;n.append(o)})}(t)}else $(".dv2-layout-ck.dv2-result-matchs .dv2-results-container").html('<div class="dv2-empty-state">Không có dữ liệu</div>')},error:function(e){console.error("Error:",e),$(".dv2-layout-ck.dv2-result-matchs .dv2-results-container").html('<div class="dv2-empty-state">Lỗi tải dữ liệu</div>')}})}())}),window.goToMatchDetail=function goToMatchDetail(e){window.location.href=`/streams/${e}`},window.viewHighlight=function viewHighlight(e){window.location.href=`/highlights/${e}`}}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery){($=jQuery.noConflict())(document).ready(()=>{$(".dv2-layout-ck.dv2-calendar-matchs").length>0&&(function updateDateTime_CK(){const e=new Date;$(".dv2-layout-ck.dv2-calendar-matchs #currentDateTime").text(e.toLocaleDateString("vi-VN",{weekday:"long",year:"numeric",month:"long",day:"numeric"}))}(),function loadHomeMatchesData_CK(){const e=new Date,t=new Date(e);t.setDate(e.getDate()+1);const a={fromDate:e.toISOString().split("T")[0],toDate:t.toISOString().split("T")[0]};$.ajax({url:"https://vsc-apidev.helizones.com/api/data/lives/range-date",method:"POST",contentType:"application/json",data:JSON.stringify(a),success:e=>{if(e&&e.matches_by_date){const t=[];Object.keys(e.matches_by_date).forEach(a=>t.push(...e.matches_by_date[a])),function renderHomeMatches_CK(e,t="all"){const a=new Date,n=e.filter(e=>{const n=new Date(e.kickoff),i=new Date(n.getTime()+72e5);if("live"===t)return a>=n&&a<=i;if("today"===t){new Date(a).setHours(0,0,0,0);const e=new Date(a);return e.setHours(23,59,59,999),n>a&&n<=e}return i>=a}).sort((e,t)=>new Date(e.kickoff)-new Date(t.kickoff)),i=$(".dv2-layout-ck.dv2-calendar-matchs .dv2-home-container");if(i.empty(),!n.length)return void i.html('<div class="dv2-empty-state">Không có trận đấu</div>');const o=function groupMatchesByLeague_CK(e){const t={};return e.forEach(e=>{const a=e.league?.name||"Giải đấu khác";t[a]||(t[a]=[]),t[a].push(e)}),t}(n);Object.keys(o).forEach(e=>{const t=o[e][0]?.league?.logo||"",a=o[e].map(e=>function renderHomeMatchCard_CK(e){const t=new Date(e.kickoff),a=e.teams?.home||{},n=e.teams?.away||{},i=function formatMatchTime_CK(e){const t=new Date(e);return`${String(t.getDate()).padStart(2,"0")}/${String(t.getMonth()+1).padStart(2,"0")} - ${t.toLocaleTimeString("vi-VN",{hour:"2-digit",minute:"2-digit"})}`}(t),o=e?.livestream?.links;return`\n                <div class="dv2-match-card" onclick="goToMatchDetail('${e.match_id}')">\n                <div class="dv2-time-col">${i}</div>\n                <div class="dv2-teams-col">\n                    <div class="dv2-team">\n                    <div class="dv2-team-name" style="text-align: right">${a.name}</div>\n                    <div class="dv2-team-logo"><img src="${a.logo}" alt="${a.name}"></div>\n                    </div>\n                    <div class="dv2-vs">vs</div>\n                    <div class="dv2-team">\n                    <div class="dv2-team-logo"><img src="${n.logo}" alt="${n.name}"></div>\n                    <div class="dv2-team-name">${n.name}</div>\n                    </div>\n                </div>\n                ${o.length>0?`\n                    <div class="dv2-commentators">\n                        ${o.slice(0,4).map(e=>`\n                            <div class="dv2-commentator" \n                                data-commentator-id="${e.commentatorId||""}">\n                                <div class="dv2-commentator-avatar">\n                                    ${e.avatar?`<img src="${e.avatar}" alt="${e.commentator}">`:e.commentator.charAt(0)}\n                                </div>
1\n                                <span class="dv2-commentator-name">${e.commentator}</span>\n                            </div>\n                        `).join("")}\n                        ${o.length>4?`<div class="dv2-commentator-more">+${o.length-4}</div>`:""}\n                    </div>\n                `:""}\n                </div>\n            `}(e)).join("");i.append(`\n                    <div class="dv2-league-section">\n                        <div class="dv2-league-header">\n                        ${t?`<img src="${t}" class="dv2-league-logo">`:""}\n                        <div class="dv2-league-title">${e}</div>\n                        </div>\n                        ${a}\n                    </div>\n                `)})}(t)}else $(".dv2-layout-ck.dv2-calendar-matchs .dv2-home-container").html('<div class="dv2-empty-state">Không có dữ liệu</div>')},error:()=>$(".dv2-layout-ck.dv2-calendar-matchs .dv2-home-container").html('<div class="dv2-empty-state">Lỗi tải dữ liệu</div>')})}())}),window.goToMatchDetail=function goToMatchDetail(e){window.location.href=`/streams/${e}`}}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery){($=jQuery.noConflict())(document).ready(function(){$(".dv2-layout-ck.dv2-home-matchs").length>0&&function renderListMatchs_CK(){const e=$(".dv2-layout-ck.dv2-home-matchs"),t=e.find(".dv2-match-grid");0===e.find(".dv2-loading").length&&e.append('\n            <div class="dv2-loading">\n                <div class="dv2-spinner"></div>\n            </div>\n        ');const a=new Date,n=new Date;n.setDate(a.getDate()+7);const i={fromDate:a.toISOString().split("T")[0],toDate:n.toISOString().split("T")[0]};$.ajax({url:"https://vsc-apidev.helizones.com/api/data/lives/range-date",method:"POST",headers:{"Content-Type":"application/json"},data:JSON.stringify(i),dataType:"json",success:function(a){e.find(".dv2-loading").remove();const n=[];if(Object.values(a.matches_by_date||{}).forEach(e=>{Array.isArray(e)&&n.push(...e)}),!n.length)return void t.html('<div class="dv2-empty-state">Không có trận đấu nào trong 7 ngày tới</div>');const i=n.map(e=>{const t=e.kickoff?new Date(e.kickoff):null,a=t?new Date(t.getTime()+72e5):null,n=new Date;let i="Sắp diễn ra";return t&&n>=t&&n<=a&&e.livestream.available?i="LIVE":t&&n>a&&(i="Kết thúc"),{id:e.match_id,slug:e.slug||"",homeLogo:e?.teams?.home?.logo||"",awayLogo:e?.teams?.away?.logo||"",homeName:e?.teams?.home?.name||"Đội nhà",awayName:e?.teams?.away?.name||"Đội khách",kickoff:t,league:e?.league?.name||"Giải đấu",leagueLogo:e?.league?.logo||"",livestream:e.livestream,links:e?.livestream?.links||[],scoreHalftime:e?.score?.halftime||{home:"-",away:"-"},scoreFulltime:e?.score?.fulltime||{home:"-",away:"-"},status:i}}),o=new Date,s=[],r=[];i.forEach(e=>{const t=new Date(e.kickoff),a=new Date(t.getTime()+72e5);o>=t&&o<=a&&e.livestream.available?s.push(e):o<t&&r.push(e)});const l=[...s,...r];!function updateFilterCounts_CK(e){const t=new Date,a=new Date(t);a.setHours(0,0,0,0);const n=new Date(t);n.setHours(23,59,59,999);const i=new Date(a);i.setDate(a.getDate()+7);const o=e.filter(e=>e.kickoff>=a&&e.kickoff<=i).length,s=e.filter(e=>"LIVE"===e.status).length,r=e.filter(e=>e.kickoff>=a&&e.kickoff<=n).length;$('.dv2-layout-ck.dv2-home-matchs .dv2-filter-btn[data-filter="all"]').text(`Tất cả (${o})`),$('.dv2-layout-ck.dv2-home-matchs .dv2-filter-btn[data-filter="live"]').text(`Đang live (${s})`),$('.dv2-layout-ck.dv2-home-matchs .dv2-filter-btn[data-filter="today"]').text(`Hôm nay (${r})`)}(l),function setupFilterButtons_CK(e){$(".dv2-layout-ck.dv2-home-matchs .dv2-filter-btn").off("click").on("click",function(){$(".dv2-layout-ck.dv2-home-matchs .dv2-filter-btn").removeClass("dv2-active"),$(this).addClass("dv2-active");const t=$(this).data("filter");renderHomeMatches_CK(e,t)})}(l),renderHomeMatches_CK(l,"live")},error:function(e){console.error("[VSC LIVE] API error:",e),t.html('<div class="dv2-empty-state">Lỗi khi tải dữ liệu</div>')}})}()});let e=0,t=[];function renderHomeMatches_CK(a,n="all"){const i=new Date,o=new Date(i);o.setHours(0,0,0,0);const s=new Date(i);s.setHours(23,59,59,999);const r=new Date(o);r.setDate(o.getDate()+7);let l=a.filter(e=>"live"===n?"LIVE"===e.status:"today"===n?e.kickoff>=o&&e.kickoff<=s:"all"!==n||e.kickoff>=o&&e.kickoff<=r);l.sort((e,t)=>
1"LIVE"===e.status&&"LIVE"!==t.status?-1:"LIVE"!==e.status&&"LIVE"===t.status?1:new Date(e.kickoff)-new Date(t.kickoff)),t=l,e=0;const d=$(".dv2-layout-ck.dv2-home-matchs .dv2-match-grid");if(d.empty(),!l.length)return d.html('<div class="dv2-empty-state">\n                        <div style="font-size: 56px; opacity: 0.3;">⚽</div>\n                        <div style="font-size: 15px;">Không có trận đấu nào</div>\n                    </div>'),void $(".dv2-loadmore").hide();renderNextMatchesBatch_CK(),$(".dv2-layout-ck.dv2-home-matchs .dv2-load-more-btn").off("click").on("click",renderNextMatchesBatch_CK)}function renderNextMatchesBatch_CK(){const a=$(".dv2-layout-ck.dv2-home-matchs .dv2-match-grid"),n=t.slice(e,e+10);n.forEach(e=>{const t=$(function renderMatchCard_CK(e){const t=e.kickoff||"",a=function getDateLabel_CK(e){if(!e)return"";const t=new Date;t.setHours(0,0,0,0);const a=new Date(t);a.setDate(a.getDate()+1);const n=new Date(e);return n.setHours(0,0,0,0),`${String(n.getDate()).padStart(2,"0")}/${String(n.getMonth()+1).padStart(2,"0")}`}(t),n=t?function formatTime_CK(e){if(!e)return"";const t=new Date(e);return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}(t):"",i="LIVE"===e.status?"dv2-status-live":"Sắp diễn ra"===e.status?"dv2-status-scheduled":"dv2-status-finished";return`\n        <div class="dv2-match-card" data-id="${e.id}">\n            <div class="dv2-match-header">\n                <div class="dv2-league-info">\n                    <span class="dv2-league-name">${e.league}</span>\n                </div>\n                <div style="display: flex; align-items: center; gap: 12px;">\n                    <span class="dv2-match-status ${i}">\n                        ${"LIVE"===e.status?"● LIVE":"Sắp diễn ra"===e.status?"Sắp diễn ra":"Kết thúc"}\n                    </span>\n                    <span class="dv2-match-time">${a} - ${n}</span>\n                </div>\n            </div>\n            <div class="dv2-match-content">\n                <div class="dv2-team">\n                    <div class="dv2-team-logo"><img src="${e.homeLogo}" alt="${e.homeName}"></div>\n                    <div class="dv2-team-name">${e.homeName}</div>\n                </div>\n                <div class="dv2-score-section">\n                    <div class="dv2-score">\n                        <div class="dv2-score-number">${e.scoreFulltime.home}</div>\n                        <div class="dv2-score-separator">:</div>\n                        <div class="dv2-score-number">${e.scoreFulltime.away}</div>\n                    </div>\n                    <div class="dv2-half-time">HT ${e.scoreHalftime.home} - ${e.scoreHalftime.away}</div>\n                </div>\n                <div class="dv2-team dv2-away">\n                    <div class="dv2-team-logo"><img src="${e.awayLogo}" alt="${e.awayName}"></div>\n                    <div class="dv2-team-name">${e.awayName}</div>\n                </div>\n            </div>\n            <div class="dv2-blv-box">\n                ${(e?.links||[]).map(t=>`\n                    <a class="dv2-bottom-group" href="#" data-id="${e.id}">\n                        <span class="dv2-bottom-logo">\n                            <img class="dv2-image-blv" alt="${t.commentator}"\n                                src="${t.avatar}">\n                        </span>\n                        <span class="dv2-bottom-name dv2-ellipsis">${t.commentator}</span>\n                    </a>\n                `).join("")}\n            </div>\n        </div>\n    `}(e));a.append(t),setTimeout(()=>t.addClass("fade-in"),50)}),e+=n.length,e>=t.length?$(".dv2-layout-ck.dv2-home-matchs .dv2-loadmore").fadeOut(200):$(".dv2-layout-ck.dv2-home-matchs .dv2-loadmore").show()}$(document).on("click",".dv2-layout-ck.dv2-home-matchs .dv2-match-card",function(e){e.preventDefault();const t=$(this).data("id")||"";window.location.href=`/streams/${t}`})}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery,Hls){($=jQuery.noConflict())(document).ready(function(){$(".dv2-layout-ls.dv2-streaming-ctn").length>0&&function renderDetailMatch_LS(){const e=$(".dv2-layout-ls.dv2-streaming-ctn .dv2-video-container"),t=$(".dv2-layout-ls.dv2-streaming-ctn .dv2-detail-match");let a=new URLSearchParams(window.location.search).get("match");if(a||(a="undefined"!=typeof DV2_MATCH_ID&&DV2_MATCH_ID?DV2_MATCH_ID:"2y8m4zh54p4zql0"),!a)return void e.html('<div class="dv2-notfound-video">❌ Không có ID livestream hợp lệ</div>');console.log("[VSC LIVE] Load livestream detail cho ID:",a);const n=$('\n    <div class="dv2-loading">\n      Đang tải video...\n    </div>\n  ');e.append(n);const i=$("<video>",{id:"liveVideo",controls:!0,autoplay:!0,muted:!0,playsinline:!0,poster:"https://luongson.io/wp-content/uploads/2025/10/bxh-ty-le-thang-hieu-suat-ghi-ban-tat-ca-trong-mot-cu-cham-tai-luongson-tv.jpg"});e.append(i),$.ajax({url:`https://vsc-apidev.helizones.com/api/data/lives/${a}`,method:"GET",success:function(a){console.log("[VSC LIVE] API response:",a),n.remove();const o=a?.data,s=o?.teams?.home?.name,r=o?.teams?.away?.name,l=o?.league?.name,d=o?.matchInfo?.kickoff,c=o?.score?.fulltime?.home,m=o?.score?.fulltime?.away,v=`Trận đấu giữa <strong>${s}</strong> và <strong>${r}</strong> thuộc khuôn khổ\n                        <strong>${l}</strong> sẽ diễn ra vào lúc <strong>${function formatDateTime_LS(e){const t=new Date(e);return`${String(t.getDate()).padStart(2,"0")}/${String(t.getMonth()+1).padStart(2,"0")}/${t.getFullYear()} ${String(t.getHours()).padStart(2,"0")}
1:${String(t.getMinutes()).padStart(2,"0")}`}(d)}</strong>`,u=`\n                <h1 class="dv2-name-match">Trực tiếp ${s} vs ${r} - ${l} </h1>\n                <div class="dv2-live-match">\n                    ${v}\n                </div>\n                <div class="dv2-blv-match">\n                    <span>Bình luận viên: <strong>NHÀ ĐÀI</strong></span>\n                </div>\n                <div class="dv2-score-match">\n                    <span>Tỉ số hiện tại: <strong>${c} - ${m}</strong></span>\n                </div>\n            `;if(t.append(u),$(".dv2-detail-match-info").html(v),!o||!o.livestream)return e.html('<div class="dv2-not-loaded">🚫 Không có luồng livestream</div>'),void e.append(i);const h=new Date(o?.matchInfo?.kickoff);if(!Number.isNaN(h.getTime())&&h.getTime()-Date.now()>9e5){const t=function createNotFoundMatchOverlay_LS(e){const t=e?.matchInfo?.kickoff,a=e?.league?.name,n=e?.teams?.home?.name||"Home",i=e?.teams?.away?.name||"Away",o=function renderStatusMatch_LS(e){const t=new Date;new Date(t).setHours(0,0,0,0),new Date(t).setHours(23,59,59,999);const a=e instanceof Date?e:new Date(e);let n="";if(a>t)n=Math.round((a-t)/6e4)<=30?"sắp bắt đầu":"chưa diễn ra";else{const e=new Date(a);e.setHours(e.getHours()+2),n=t<=e?"đang diễn ra":"đã kết thúc"}return n}(t);return $(`\n            <div class="dv2-loading">\n                Trận đấu ${o}: <strong>${n} - ${i}</strong>\n                <div class="dv2-load-league">\n                    <span>Giải đấu: <strong>${a}</strong></span>\n                </div>\n                <div class="dv2-load-time">\n                    <span>Thời gian: ${function getDateLabel_LS(e){const t=new Date,a=new Date(t);a.setDate(a.getDate()+1);const n=new Date(e);return t.setHours(0,0,0,0),a.setHours(0,0,0,0),n.setHours(0,0,0,0),n.getTime()===t.getTime()?"Hôm nay":n.getTime()===a.getTime()?"Ngày mai":`${String(n.getDate()).padStart(2,"0")}/${String(n.getMonth()+1).padStart(2,"0")}`}(t)}</span>\n                    <span>${function formatTime_LS(e){if(!e)return"";const t=new Date(e);return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}(t)}</span>\n                </div>\n            </div>\n        `)}(o);return void e.append(t)}const p=o?.livestream?.links[0]?.url||"";if(!p)return void e.html('<div class="dv2-not-loaded">Không tìm thấy video livestream</div>');const f=$(".dv2-stream-links"),g=Array.isArray(o?.livestream?.links)?o.livestream.links.map((e,t)=>`<span data-index="${t}" data-stream-url="${e.url}">Link ${t+1}</span>`):null;f.html(g),f.on("click","span",function(e){e.preventDefault(),e.stopPropagation(),initHLSPlayer($(this).data("stream-url"))}),initHLSPlayer(p)},error:function(t){console.error("[VSC LIVE] Lỗi khi gọi API:",t),e.html('<div class="dv2-not-loaded">Không thể tải dữ liệu livestream</div>')}});let o=null;function initHLSPlayer(t){if(console.log("[VSC LIVE] Init HLS for:",t),o){console.log("[VSC LIVE] Destroy old HLS instance");try{o.destroy()}catch(e){console.warn(e)}o=null}let a=0;function setupPlayer(){if(Hls.isSupported()){const e=new Hls({maxBufferLength:10,liveSyncDuration:3,enableWorker:!0,xhrSetup:function(e,t){e.withCredentials=!1,e.referrerPolicy="no-referrer-when-downgrade"}});o=e,e.loadSource(t),e.attachMedia(i[0]),e.on(Hls.Events.MANIFEST_PARSED,function(){console.log("[VSC LIVE] Manifest loaded — starting playback"),n.remove(),i[0].muted=!0,i[0].play().catch(()=>console.warn("Autoplay bị chặn"))}),e.on(Hls.Events.ERROR,function(t,a){if(a.fatal)switch(console.log("[VSC LIVE] HLS fatal error:",a.type),a.type){case Hls.ErrorTypes.NETWORK_ERROR:e.startLoad();break;case Hls.ErrorTypes.MEDIA_ERROR:e.recoverMediaError();break;default:e.destroy(),retry()}})}else i[0].canPlayType("application/vnd.apple.mpegurl")?(i.attr("src",t),i.on("loadedmetadata",function(){n.remove(),i[0].play()}),i.on("error",retry)):e.html('\n                    <div class="dv2-not-loaded">\n                        🚫 Trình duyệt không hỗ trợ phát livestream\n                    </div>\n                    ')}function retry(){a<3?(a++,console.warn(`[VSC LIVE] Retry lần ${a}/3...`),setTimeout(setupPlayer,3e3)):(console.error("[VSC LIVE] Hết số lần retry, dừng phát."),n.text("Không thể tải video, vui lòng thử lại sau."))}setupPlayer()}}()})}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery){($=jQuery.noConflict())(document).ready(function(){$(".dv2-layout-ls.dv2-list-video-ctn .dv2-content-ctn").length&&function renderFeaturedStreamBlock_LS(){const e=$(".dv2-layout-ls.dv2-list-video-ctn .dv2-content-ctn"),t=e.find(".dv2-matchs-grid");0===e.find(".dv2-loading").length&&e.append('\n            <div class="dv2-loading">\n                <div class="dv2-spinner"></div>\n            </div>\n        ');const a=new Date,n=new Date;n.setDate(a.getDate()+7);const i={fromDate:a.toISOString().split("T")[0],toDate:n.toISOString().split("T")[0]};$.ajax({url:"https://vsc-apidev.helizones.com/api/data/lives/range-date",method:"POST",headers:{"Content-Type":"application/json"},data:JSON.stringify(i),dataType:"json",success:function(a){e.find(".dv2-loading").remove();const n=[];if(Object.values(a.matches_by_date||{}
1).forEach(e=>{Array.isArray(e)&&n.push(...e)}),!n.length)return t.html('<div class="no-match">Không có trận đấu trong 7 ngày tới</div>'),void e.find(".dv2-load-more").hide();const i=n.map(e=>{const t=e.kickoff?new Date(e.kickoff):null,a=new Date;let n="Sắp diễn ra";if(t){const i=new Date(t.getTime()+72e5);a>=t&&a<=i&&e.livestream.available?n="LIVE":a>i&&(n="Kết thúc")}const i=`${window.location.origin}/detail/?match=${e.match_id}`;return{id:e.match_id,slug:e.slug||"",url:i,homeLogo:e?.teams?.home?.logo||"",awayLogo:e?.teams?.away?.logo||"",homeName:e?.teams?.home?.name||"Đội nhà",awayName:e?.teams?.away?.name||"Đội khách",kickoff:t,league:e?.league?.name||"Giải đấu",livestream:e?.livestream,links:e?.livestream?.links||[],status:n}}),o=new Date,s=[],r=[];i.forEach(e=>{const t=new Date(e.kickoff),a=new Date(t.getTime()+72e5);o>=t&&o<=a&&e.livestream.available?s.push(e):o<t&&r.push(e)});const l=[...s,...r];updateFilterCounts_LS&&updateFilterCounts_LS(l),setupFilterButtons_LS&&setupFilterButtons_LS(l),renderHomeMatches_LS(l,"live")},error:function(a){console.error("[VSC LIVE] API error:",a),e.find(".dv2-loading").remove(),t.html('<div class="error">Lỗi khi tải dữ liệu</div>'),e.find(".dv2-load-more").hide()}})}()});let e=0,t=[];const a=12;function updateFilterCounts_LS(e){const t=new Date,a=new Date(t);a.setHours(0,0,0,0);const n=new Date(t);n.setHours(23,59,59,999);const i=new Date(a);i.setDate(a.getDate()+7);const o=e.filter(e=>e.kickoff&&e.kickoff>=a&&e.kickoff<=i).length,s=e.filter(e=>"LIVE"===e.status).length,r=e.filter(e=>e.kickoff&&e.kickoff>=a&&e.kickoff<=n).length;$('.dv2-filter-btn[data-filter="all"]').text(`Tất cả (${o})`),$('.dv2-filter-btn[data-filter="live"]').text(`Đang Live (${s})`),$('.dv2-filter-btn[data-filter="today"]').text(`Hôm nay (${r})`)}function setupFilterButtons_LS(e){$(".dv2-filter-btn").off("click").on("click",function(){$(".dv2-filter-btn").removeClass("dv2-active"),$(this).addClass("dv2-active");const t=$(this).data("filter");renderHomeMatches_LS(e,t)})}function renderHomeMatches_LS(n,i="all"){const o=new Date,s=new Date(o);s.setHours(0,0,0,0);const r=new Date(o);r.setHours(23,59,59,999);const l=new Date(s);l.setDate(s.getDate()+7);let d=n.filter(e=>!(!e.kickoff&&"all"!==i&&"today"!==i&&"live"!==i)&&("live"===i?"LIVE"===e.status:"today"===i?e.kickoff&&e.kickoff>=s&&e.kickoff<=r:"all"!==i||e.kickoff&&e.kickoff>=s&&e.kickoff<=l));d.sort((e,t)=>"LIVE"===e.status&&"LIVE"!==t.status?-1:"LIVE"!==e.status&&"LIVE"===t.status?1:new Date(e.kickoff)-new Date(t.kickoff)),t=d,e=0;const c=$(".dv2-layout-ls.dv2-list-video-ctn .dv2-content-ctn"),m=c.find(".dv2-matchs-grid");if(m.empty(),!d.length)return m.html('<div class="dv2-empty-state">\n                                <div style="font-size: 56px; opacity: 0.3;">⚽</div>\n                                <div style="font-size: 15px;">Không có trận đấu nào</div>\n                            </div>'),void c.find(".dv2-load-more").hide();c.find(".dv2-load-more").hide(),renderNextMatches_LS(),t.length>a&&c.find(".dv2-load-more-btn").off("click").on("click",renderNextMatches_LS)}function renderNextMatches_LS(){const n=$(".dv2-layout-ls.dv2-list-video-ctn .dv2-content-ctn"),i=n.find(".dv2-matchs-grid"),o=t.slice(e,e+a);o.forEach((t,a)=>{const n="LIVE"===t.status?'<div class="dv2-top-inlive">\n                    <span class="dv2-top-inlive-live">\n                        <img decoding="async" src="data:image/webp;base64,UklGRhACAABXRUJQVlA4WAoAAAASAAAAFwAAFwAAQU5JTQYAAAAAAAAAAABBTk1GPAAAAAAAAAAAABcAABcAADIAAAJWUDhMIwAAAC8XwAUQDzD/8z//8x/wUNC2DVNg5Y/sbggi+j8BsAyYvYQEAEFOTUY2AAAAAQAAAQAAEwAABwAAMgAAAlZQOEwdAAAALxPAARAPMP/zP//zH/AQkBAe+P9XNkT0fwJI8SQAQU5NRjQAAAABAAABAAATAAAFAAAyAAACVlA4TBwAAAAvE0ABEA8w//M///Mf8BCQEB74/1c2RPR/Akg9QU5NRjQAAAABAAABAAATAAAFAAAyAAACVlA4TBwAAAAvE0ABEA8w//M///Mf8BCQEB74/1c2RPR/Akg9QU5NRjQAAAABAAABAAATAAAHAAAyAAACVlA4TBsAAAAvE8ABEA8w//M///Mf8BAIJBnsLzxDRP9DpgUAQU5NRjYAAAABAAABAAATAAAHAAAyAAACVlA4TB0AAAAvE8ABEA8w//M///Mf8BCQEB74/1c2RPR/AmiPCQBBTk1GNAAAAAEAAAIAABMAAAUAADIAAAJWUDhMHAAAAC8TQAEQDzD/8z//8x/wEJAQHvj/VzZE9H8CaB1BTk1GNAAAAAEAAAIAABMAAAUAADIAAAJWUDhMHAAAAC8TQAEQDzD/8z//8x/wEJAQHvj/VzZE9H8CwNE=" alt="" class="h-3 w-2.5 object-contain">
1\n                        <span>Live</span>\n                    </span>\n                </div>':`<div class="dv2-kickoff">\n                    <span class="dv2-kickoff-time">${t.kickoff?function formatTime_LS(e){if(!e)return"";const t=new Date(e),a=new Date,n=new Date(t);if(n.setHours(n.getHours()+2),a>n)return"Đã kết thúc";return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}(t.kickoff):""}</span>\n               </div>`,o=(t.links||[]).map(e=>`\n            <a class="dv2-bottom-group" href="#" data-id="${t.id}">\n                <span class="dv2-bottom-logo">\n                    <img class="aspect-square h-full w-full object-cover" alt="${e.commentator}" src="${e.avatar}">\n                </span>\n                <span class="dv2-bottom-name ellipsis">${e.commentator}</span>\n            </a>\n        `).join("");$(`\n            <div class="dv2-match-item" data-index="${e+a}" data-id="${t.id}">\n                <a class="dv2-top" href="${t.url}">\n                    <div class="dv2-top_time">\n                        <span class="dv2-ellipsis dv2-league">${t.league}</span>\n                        ${n}\n                    </div>\n                    <div class="dv2-top_team">\n                        <div class="dv2-top_team_home">\n                            <div class="dv2-top_team_home_logo">\n                                <img src="${t.homeLogo}" alt="${t.homeName}">\n                            </div>\n                            <p class="dv2-top_name ellipsis">${t.homeName}</p>\n                        </div>\n                        <div class="dv2-top_vs"><span class="vs">VS</span></div>\n                        <div class="dv2-top_team_away">\n                            <div class="dv2-top_team_home_logo">\n                                <img src="${t.awayLogo}" alt="${t.awayName}">\n                            </div>\n                            <p class="dv2-top_name dv2-ellipsis">${t.awayName}</p>\n                        </div>\n                    </div>\n                </a>\n                <div class="dv2-bottom">\n                    <div class="dv2-bottom-commentators">\n                        ${o}\n                    </div>\n                </div>\n            </div>\n        `).hide().appendTo(i).fadeIn(300)}),e+=o.length,e>=t.length?n.find(".dv2-load-more").fadeOut(300,function(){$(this).hide()}):n.find(".dv2-load-more").show()}$(document).on("click",".dv2-layout-ls.dv2-list-video-ctn .dv2-match-item",function(e){e.preventDefault();const t=$(this).data("id")||"";window.location.href=`/streams/${t}`})}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery,Hls,Swiper){$=jQuery.noConflict();const e="https://sta.vnres.co/file/common/20250410/000bfdfc22afe0f322140fabd2228aec.jpg",t={hotLeaguesRank:new Map};let a=null,n=null,i=null,o=null,s=0,r=null,l=null,d=null;const c=["first half","firsthalf","first-half","fh","half-time","half time","halftime","ht","second half","secondhalf","second-half","sh","extra time","extratime","et","overtime","overtime(deprecated)","ot","penalty","penalties","penalty shoot-out","penalty shootout"],m="https://vsc-apidev.helizones.com";const v=DV2MatchSort.createSortedMatchesFunction({mode:"wc-first",liveStatuses:c,hotLeaguesRank:()=>t.hotLeaguesRank,copy:!0});function getPreferredLivestreamLink(e){const t=e?.livestream?.links;return Array.isArray(t)&&t.length?DV2StreamLinks.getPreferredLink(t):null}function getStreamVideoWrapper_SCL(){return $(".dv2-layout-scl.dv2-streaming-ctn .dv2-video-wrapper").first()}function getStreamChrome_SCL(){return window.DV2_StreamChrome}function initStreamPlayerUi_SCL(e){const t=getStreamVideoWrapper_SCL(),a=getStreamChrome_SCL();t.length&&a&&a.initPlayerUi(t,e)}function clearSclPlaybackTimers(){r&&(clearTimeout(r),r=null),l&&(clearTimeout(l),l=null),d&&(clearTimeout(d),d=null)}function showStreamLoading_SCL(e,t="Đang tải video..."){if(!e?.length)return $();hideStreamLoading_SCL(e);const a=String(t||"Đang tải video...").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),n=$(`\n        <div class="dv2-stream-loading-scl dv2-loading"\n            style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;font-size:16px;background:rgba(0,0,0,0.6);padding:10px 20px;border-radius:6px;width:auto;">\n            ${a}\n        </div>\n    `);return e.append(n),n}
1function hideStreamLoading_SCL(e){e?.find(".dv2-stream-loading-scl").remove()}function showStreamFallback_SCL(e,t,a){const n=getStreamChrome_SCL();if(n&&e.length&&n.clearFullChrome(e),hideStreamLoading_SCL(t),!a)return;t.find(".dv2-match-overlay-scl").remove();const i=createNotFoundMatchOverlay_SCL(a);i.addClass("dv2-match-overlay-scl"),t.append(i),DV2StreamKickoff.startCountdown(a?.matchInfo?.kickoff)}function initHLSPlayer_SCL(e){const t=getStreamVideoWrapper_SCL(),a=t.find(".dv2-video-container"),n=a.find("#liveVideo"),c=i;s+=1;const m=s,isStalePlayback=()=>m!==s;if(clearSclPlaybackTimers(),a.find(".dv2-match-overlay-scl").remove(),!e||!n.length)return hideStreamLoading_SCL(a),void(c&&showStreamFallback_SCL(t,a,c));if(o){try{o.destroy()}catch(e){console.warn(e)}o=null}showStreamLoading_SCL(a,"Đang tải video...");let v=0,u=!1;function setupPlayer(){if(!isStalePlayback())if(Hls.isSupported()){r=setTimeout(()=>{isStalePlayback()||(console.warn("[VSC LIVE] Manifest load timeout"),retry())},15e3);const i=new Hls({maxBufferLength:10,liveSyncDuration:3,enableWorker:!0,xhrSetup:function(e){e.withCredentials=!1,e.referrerPolicy="no-referrer-when-downgrade"}});o=i,i.loadSource(e),i.attachMedia(n[0]),i.on(Hls.Events.MANIFEST_PARSED,function(){isStalePlayback()||(clearSclPlaybackTimers(),hideStreamLoading_SCL(a),n[0].muted=!0,n[0].play().catch(()=>console.warn("Autoplay bị chặn")),getStreamChrome_SCL()?.syncControlsState?.(t,n),onHlsStreamReady_SCL())}),i.on(Hls.Events.ERROR,function(e,t){if(!isStalePlayback()&&t.fatal)switch(clearSclPlaybackTimers(),t.type){case Hls.ErrorTypes.NETWORK_ERROR:i.startLoad();break;case Hls.ErrorTypes.MEDIA_ERROR:i.recoverMediaError();break;default:try{i.destroy()}catch(e){}o===i&&(o=null),retry()}})}else n[0].canPlayType("application/vnd.apple.mpegurl")?(l=setTimeout(()=>{isStalePlayback()||(console.warn("[VSC LIVE] Native HLS load timeout"),retry())},15e3),n.attr("src",e),n.one("loadedmetadata",function(){isStalePlayback()||(clearSclPlaybackTimers(),hideStreamLoading_SCL(a),n[0].muted=!0,n[0].play().catch(()=>console.warn("Autoplay bị chặn")),getStreamChrome_SCL()?.syncControlsState?.(t,n),onHlsStreamReady_SCL())}),n.one("error",function(){isStalePlayback()||(clearSclPlaybackTimers(),retry())})):a.html('\n                <div style="color:#fff;text-align:center;padding:100px;">\n                    🚫 Trình duyệt không hỗ trợ phát livestream\n                </div>\n            ')}function retry(){isStalePlayback()||(v<3?(v+=1,console.warn(`[VSC LIVE] Retry lần ${v}/3...`),showStreamLoading_SCL(a,`Đang thử lại... (${v}/3)`),d=setTimeout(()=>{isStalePlayback()||setupPlayer()},3e3)):(console.error("[VSC LIVE] Hết số lần retry, dừng phát."),isStalePlayback()||u||(u=!0,clearSclPlaybackTimers(),showStreamFallback_SCL(t,a,c))))}setupPlayer()}function onHlsStreamReady_SCL(){const e=getStreamChrome_SCL(),t=getStreamVideoWrapper_SCL();e&&t.length&&(i&&e.rememberOddsMatchData?.(t,i),e.onHlsReady(t))}function hideAppointmentBlock_SCL(){$(".dv2-layout-scl.dv2-appoinment-list-ctn").hide()}function loadCommentatorAppointments_SCL(e){const t=function sortLivestreamLinksPreferRealBlv(e){return DV2StreamLinks.sort(e)}(e?.livestream?.links||[]),a=t[0]?.commentatorId;a?$.ajax({url:`${m}/api/data/lives/commentators/${a}`,method:"GET",success(e){const t=e?.matches;
1Array.isArray(t)&&t.length?function renderSliderAppointmentsBlock(e){const t=$(".dv2-layout-scl.dv2-appoinment-list-ctn"),a=t.find(".dv2-appoinment-swiper-container"),n=a.find(".dv2-swiper-wrapper");n.empty(),Array.isArray(e)&&e.length?(e.forEach(function(e,t){const a=e?.match_id||e?.matchId||e?.id||e?.slug||t,i=e?.league?.name||"N/A",o=e?.league?.logo||"https://sta.vnres.co/file/common/20210503/fca5954ec22137ad05325506d6645592",s=e?.matchInfo?.kickoff??e?.kickoff??"",r=function getDateLabel_SCL(e){const t=new Date,a=new Date(t);a.setDate(a.getDate()+1);const n=new Date(e);return t.setHours(0,0,0,0),a.setHours(0,0,0,0),n.setHours(0,0,0,0),n.getTime()===t.getTime()?"Hôm nay":n.getTime()===a.getTime()?"Ngày mai":`${String(n.getDate()).padStart(2,"0")}/${String(n.getMonth()+1).padStart(2,"0")}`}(s),l=function formatTime_SCL(e){if(!e)return"";const t=new Date(e);return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}(s),d=e?.teams?.home?.name||"Home Team",c=e?.teams?.home?.logo||"Logo",m=e?.teams?.away?.name||"Away Team",v=e?.teams?.away?.logo||"Logo",u=`\n\t\t\t<div class="dv2-swiper-slide swiper-slide" style="cursor:pointer;" data-id="${a}" onclick="goToMatchDetail('${a}')">\n\t\t\t\t<div class="dv2-title">\n\t\t\t\t\t<div class="dv2-fl">\n\t\t\t\t\t\t<img onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'" src="${o}" class="icon" draggable="false">\n\t\t\t\t\t\t<span>${i}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="dv2-fr dv2-match-time">\n\t\t\t\t\t\t<span style="padding-right:5px;">${r}</span>\n\t\t\t\t\t\t${l}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="dv2-box" style="display: flex;">\n\t\t\t\t\t<div class="dv2-battle-team">\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<img \n                                onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                                class="dv2-logo" \n\t\t\t\t\t\t\t\t src="${c}" \n\t\t\t\t\t\t\t\t data-src="${c}" \n\t\t\t\t\t\t\t\t draggable="false">\n\t\t\t\t\t\t\t<span class="dv2-ellipsis">${d}</span>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<img \n                                onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                                class="dv2-logo" \n\t\t\t\t\t\t\t\t src="${v}" \n\t\t\t\t\t\t\t\t data-src="${v}" \n\t\t\t\t\t\t\t\t alt="" \n\t\t\t\t\t\t\t\t draggable="false">\n\t\t\t\t\t\t\t<span class="dv2-ellipsis">${m}</span>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n                    <a href="${window.DV2_LINK_BET}" \n                        target="_blank" rel="nofollow"\n\t\t\t\t\t\tdata-id="${a}" \n\t\t\t\t\t\tdata-slug="${e.slug||""}"\n\t\t\t\t\t\tclass="dv2-appoinment" \n                        onclick="event.stopPropagation();"\n\t\t\t\t\t\tdraggable="false">\n\t\t\t\t\t\t<span class="no-appoinment">Đặt cược</span>\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;n.append(u)}),t.show(),a.show(),function initSwiperInstance(e,t,a){if(!$(e).length)return null;swiper=new Swiper(e,{slidesPerView:1.5,navigation:{nextEl:t,prevEl:a},breakpoints:{640:{slidesPerView:2},768:{slidesPerView:3},1024:{slidesPerView:4},1280:{slidesPerView:5}},loop:!1,watchSlidesProgress:!0,roundLengths:!0})}(".dv2-layout-scl.dv2-appoinment-list-ctn .dv2-appoinment-swiper-container",".dv2-appoinment-next",".dv2-appoinment-prev")):hideAppointmentBlock_SCL()}(v(t)):hideAppointmentBlock_SCL()},error(e){console.error("[VSC LIVE] Lỗi khi gọi API lịch BLV:",e),hideAppointmentBlock_SCL()}}):hideAppointmentBlock_SCL()}function createNotFoundMatchOverlay_SCL(e){const t=e?.matchInfo?.kickoff,a=e?.league?.name,n=e?.teams?.home?.name||"Home",i=e?.teams?.away?.name||"Away",o=function render
1StatusMatch_SCL(e){const t=new Date;new Date(t).setHours(0,0,0,0),new Date(t).setHours(23,59,59,999);const a=e instanceof Date?e:new Date(e);let n="";if(a>t)n=Math.round((a-t)/6e4)<=30?"sắp bắt đầu":"chưa diễn ra";else{const e=new Date(a);e.setHours(e.getHours()+2),n=t<=e?"đang diễn ra":"đã kết thúc"}return n}(t);return $(`\n            <div class="dv2-loading">\n                Trận đấu ${o}: <strong>${n} - ${i}</strong>\n                <div class="dv2-load-league">\n                    <span>Giải đấu: <strong>${a}</strong></span>\n                </div>\n                <div class="dv2-load-time">\n                    <span>${DV2StreamKickoff.renderTimeDisplay(t)}</span>\n                </div>\n            </div>\n        `)}function renderMatchBoxInfo(e,t="#matchCard",a=0){if(!e)return;const n=e?.matchInfo?.kickoff,i=DV2StreamLinks.sortForDetail(e.livestream?.links||[])[a],o=`\n        <div class="dv2-match-header">\n            <img class="dv2-league-logo" src="${e.league.logo}" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'">\n            <div class="dv2-league-name">${e.league.name}</div>\n            <div class="dv2-status">${e.matchInfo.status}</div>\n        </div>\n\n        <div class="dv2-match-body">\n            <div class="dv2-team">\n                <img src="${e.teams.home.logo}" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'">\n                <div>${e.teams.home.name}</div>\n            </div>\n\n            <div class="dv2-score">\n                <span data-dv2-score-home>${e.score.fulltime.home}</span> - <span data-dv2-score-away>${e.score.fulltime.away}</span>\n            </div>\n\n            <div class="dv2-team" style="justify-content:flex-end">\n                <div>${e.teams.away.name}</div>\n                <img src="${e.teams.away.logo}" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'">\n            </div>\n        </div>\n\n        <div class="dv2-match-footer">\n            ${DV2StreamKickoff.renderTimeDisplay(n)}\n        </div>\n        ${i?`\n        <div class="dv2-commentator">\n            <span class="dv2-commentator-name">Bình Luận Viên: </span>\n            <img class="dv2-commentator-avatar" src="${i.avatar}" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'">\n            <span class="dv2-commentator-name">${i.commentator}</span>\n        </div>\n        `:""}\n    `;$(t).html(o),DV2StreamKickoff.startCountdown(n)}$(document).ready(function(){$(".dv2-layout-scl.dv2-streaming-ctn .dv2-video-wrapper").length&&function renderDetailMatch_SCL(){const r=getStreamVideoWrapper_SCL(),l=r.find(".dv2-video-container");hideAppointmentBlock_SCL(),DV2HotLeagues.load({url:`${m}/api/data/lives/competitions/hot`,ajax:$.ajax,setHotLeaguesRank:e=>{t.hotLeaguesRank=e}}).always(()=>{!function initHotLiveBlock_SCL(){$(".dv2-layout-scl.dv2-hotlive-ctn .dv2-hot-content").length&&DV2SocoliveHotLive.init(function getHotLiveRenderOptions_SCL(){return{baseApiUrl:m,ajax:$.ajax,sortedMatchesFunction:v,liveStatuses:c,hotLeaguesRank:t.hotLeaguesRank,getPreferredLivestreamLink:getPreferredLivestreamLink}}())}()});let d=new URLSearchParams(window.location.search).get("match");if(d||(d="undefined"!=typeof DV2_MATCH_ID&&DV2_MATCH_ID?DV2_MATCH_ID:"2y8m4zh54p4zql0"),!d)return void l.html('<div class="dv2-notfound-video">❌ Không có ID livestream hợp lệ</div>');const u=document.querySelector(".dv2-layout-scl.dv2-streaming-ctn .dv2-living-room .dv2-video-inner .dv2-marquee-container .dv2-marquee-box");u.addEventListener("mouseenter",()=>{u.style.animationPlayState="paused"}),u.addEventListener("mouseleave",()=>{u.style.animationPlayState="running"});const h=$("<video>",{id:"liveVideo",controls:!1,autoplay:!0,muted:!0,playsinline:!0,poster:DV2StreamKickoff.resolvePosterUrl(n,e)});l.append(h),initStreamPlayerUi_SCL(h),showStreamLoading_SCL(l,"Đang tải video..."),$.ajax({url:`${m}/api/data/lives/${d}`,method:"GET",success:function(t){const d=t?.data;if(!d||!d.livestream)return l.html('<div class="dv2-notfound-video-livestream">🚫 Không có luồng livestream</div>'),l.append(h),void hideAppointmentBlock_SCL();!function startDetailScorePoll_SCL(e){e&&(a||(a=DV2MatchScorePoll.create({container:".dv2-layout-scl"})),a.sync(e),a.start())}(d),i=d;const c=function bindDetailStreamLinks_SCL(t){return DV2StreamLinks.prepareSpanLinks({rawLinks:t?.livestream?.links,$container:$(".dv2-layout-scl.dv2-streaming-ctn .dv2-stream-links"),onSelect(a,r){n=a;const l=getStreamVideoWrapper_SCL(),d=l.find(".dv2-video-container"),c=d.find("#liveVideo");DV2StreamKickoff.applyPosterForLink(c,a,e),renderMatchBoxInfo(t,"#matchCard",r),i&&function initStreamOddsPanel_SCL(e,t){const a=getStreamChrome_SCL();a&&e?.length&&t&&(a.rememberOddsMatchData?.(e,t),a.initOddsPanel?.(e,t))}(l,i);const m=new Date(t?.matchInfo?.kickoff);if(!Number.isNaN(m.getTime())&&m.getTime()-Date.now()>9e5||!a?.url){const e=getStreamChrome_SCL();return e&&l.length&&e.clearFullChrome(l),function stopStreamPlayback_SCL(e){if(s+=1,clearSclPlaybackTimers(),o){try{o.destroy()}catch(e){console.warn(e)}o=null}if(!e?.length)return;const t=e[0];t.pause(),t.removeAttribute("src"),"function"==typeof t.load&&t.load()}
1(c),void hideStreamLoading_SCL(d)}!function clearStreamLoading_SCL(e){hideStreamLoading_SCL(e)}(d),initHLSPlayer_SCL(a.url)}})}(d);n=c?.activeLink??null,DV2StreamKickoff.applyPosterForLink(h,n,e);const m=c?.activeIndex??0;c?.links?.length&&renderMatchBoxInfo(d,"#matchCard",m);const v=getStreamChrome_SCL();v&&r.length&&(v.rememberOddsMatchData?.(r,d),v.initOddsPanel?.(r,d));const u=new Date(d?.matchInfo?.kickoff);if(!Number.isNaN(u.getTime())&&u.getTime()-Date.now()>9e5){const showPreMatchOverlay=()=>{const t=getStreamChrome_SCL();t&&r.length&&t.clearFullChrome(r),l.empty();const a=createNotFoundMatchOverlay_SCL(d);l.append(a),DV2StreamKickoff.startCountdown(d?.matchInfo?.kickoff);const i=$("<video>",{id:"liveVideo",controls:!1,autoplay:!1,muted:!0,playsinline:!0,poster:DV2StreamKickoff.resolvePosterUrl(n,e)});l.append(i),initStreamPlayerUi_SCL(i),loadCommentatorAppointments_SCL(d)};return void(window.DV2StreamTvc?.playBeforeStream?window.DV2StreamTvc.playBeforeStream(r,showPreMatchOverlay):showPreMatchOverlay())}const p=c?.activeLink?.url||"";if(!p)return l.html('<div class="dv2-notfound">Không tìm thấy video livestream</div>'),void loadCommentatorAppointments_SCL(d);const startStream=()=>{initHLSPlayer_SCL(p),loadCommentatorAppointments_SCL(d)};window.DV2StreamTvc?.playBeforeStream?window.DV2StreamTvc.playBeforeStream(r,startStream):startStream()},error:function(e){console.error("[VSC LIVE] Lỗi khi gọi API:",e),l.html('<div class="dv2-notfound">Không thể tải dữ liệu livestream</div>')}})}()}),$(document).on("click",".dv2-layout-scl .dv2-game",function(e){e.preventDefault();const t=$(this).data("id")||"";window.location.href=`/streams/${t}`})}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper,function(window){window.DV2SocoliveHotLive=window.DV2SocoliveHotLive||{},function(DV2SocoliveHotLive){const e=".dv2-layout-scl.dv2-hotlive-ctn .dv2-hot-content";function escapeHtml(e){return String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function getMatchStatus(e){return String(e?.matchInfo?.status??e?.status??"").toLowerCase()}function getDetailUrl(e,t){return window.DV2StreamLinks.getDetailUrl(e,t,{trailingSlash:!1})}DV2SocoliveHotLive.isMatchLive=function isMatchLive(e,t){return Array.isArray(t)&&t.includes(getMatchStatus(e))},DV2SocoliveHotLive.prepareMatches=function prepareMatches(e,t){return Array.isArray(e)&&"function"==typeof t?t(e.filter(e=>"finished"!==getMatchStatus(e))):[]},DV2SocoliveHotLive.loadMatches=function loadMatches(e){const{baseApiUrl:t,ajax:a=window.jQuery?.ajax||window.$?.ajax,sortedMatchesFunction:n,onSuccess:i,onError:o}=e||{},s=new Date,r=new Date(s);r.setDate(s.getDate()+1);const l={fromDate:s.toISOString().split("T")[0],toDate:r.toISOString().split("T")[0]};return a({url:`${t}/api/data/lives/range-date`,method:"POST",contentType:"application/json",data:JSON.stringify(l),success(e){if("success"!==e?.status||!e?.matches_by_date)return void i?.([]);let t=[];Object.values(e.matches_by_date).forEach(e=>{t=t.concat(e)}),i?.(DV2SocoliveHotLive.prepareMatches(t,n))},error:o})},DV2SocoliveHotLive.render=function render(t,a){const{containerSelector:n=e,liveStatuses:i=[],hotLeaguesRank:o=new Map,getPreferredLivestreamLink:s=()=>null,$:$=window.jQuery||window.$}=a||{},r=$(n);if(r.empty(),!Array.isArray(t)||!t.length)return void r.html('\n        <div class="dv2-hotlive-empty">\n          Hiện không có trận nào đang diễn ra 🔥\n        </div>\n      ');const l=o instanceof Map?o:new Map;t.forEach(e=>{const t=function getMatchId(e){return e?.match_id||e?.matchId||e?.id||e?.slug||""}(e),a=e?.teams?.home||{},n=e?.teams?.away||{},o=a.name||"Đội nhà",d=n.name||"Đội khách",c=e?.league?.logo||"",m=e?.league?.name||"",v=e?.slug||"",u=function buildCommentatorDropdown(e,t){const a=function getSortedCommentatorLinks(e){return window.DV2StreamLinks?.sortForDetail?window.DV2StreamLinks.sortForDetail(e?.livestream?.links):Array.isArray(e?.livestream?.links)?e.livestream.links:[]}(e);if(!a.length)return`<span class="dv2-name">${escapeHtml(t(e)?.commentator||"")}</span>`;const n=t(e)||a[0]||null;return window.DV2BlvDropdown.build({match:e,links:a,preferredLink:n,getDetailUrl:getDetailUrl,escapeHtml:escapeHtml,menuPlacement:"up",renderToggle:({label:e,esc:t})=>`<span class="dv2-name">${t(e)}</span>`,renderItemContent:({label:e,esc:t})=>t(e)})}(e,s),h=DV2SocoliveHotLive.isMatchLive(e,i),p=l.has(e?.league?.id)?"hot-match":"",f=h?'<img src="https://sta.vnres.co/web/assets/soco/img/living.gif"><span>Live</span>':"<span>Sắp diễn ra</span>",g=getDetailUrl(t),w=$(`\n        <li class="${p}">\n          <a data-id="${t}" data-slug="${v}" class="dv2-game" href="${escapeHtml(g)}">\n            <div class="dv2-mask"></div>\n            <img class="dv2-live-cover" src="${c}" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'">\n            <div class="dv2-live-mask"></div><i class="dv2-btn-open"></i>\n            <div class="dv2-top-tag"><span></span>\n              <div class="dv2-living ${h?"":"dv2-living--upcoming"}">\n                ${f}\n              </div>\n            </div>\n            <h5 class="dv2-bottom-title">
1\n              <span class="dv2-num">\n                <img src="https://sta.vnres.co/web/assets/soco/img/icon-hot-white.png" srcset="">\n                <span>29.06k</span>\n              </span>\n            </h5>\n            <h4 class="dv2-ellipsis">${m}: ${o} - ${d}</h4>\n          </a>\n          ${u}\n        </li>\n      `);r.append(w)}),function bindHotliveDropdownEvents(e){window.DV2BlvDropdown.bind(e,{namespace:"dv2HotliveDropdown",rebindDocumentClose:!0})}(r)},DV2SocoliveHotLive.init=function init(e){const t=e||{};DV2SocoliveHotLive.loadMatches({...t,onSuccess(e){DV2SocoliveHotLive.render(e,t),t.onSuccess?.(e)},onError(e){DV2SocoliveHotLive.render([],t),t.onError?.(e)}})}}(window.DV2SocoliveHotLive)}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery,Hls,Swiper){$=jQuery.noConflict();const e={hotLeaguesRank:new Map},t=["interrupt","first half","firsthalf","first-half","fh","half-time","half time","halftime","ht","second half","secondhalf","second-half","sh","extra time","extratime","extra time","et","overtime","overtime(deprecated)","ot","penalty","penalties","penalty shoot-out","penalty shootout"],a=["end","finished","ft"],n=window.BASE_API_URL;$(document).ready(function(){$(".dv2-layout-scl.dv2-match-wrapper-ctn").length&&function loadMatchByRangeDate_SCL(){const o=new Date,s=new Date;s.setDate(o.getDate()+7);const r={fromDate:o.toISOString().split("T")[0],toDate:s.toISOString().split("T")[0]};$(".dv2-layout-scl.dv2-match-wrapper-ctn .match-loading").show(),$(".dv2-layout-scl.dv2-match-wrapper-ctn .match-none").hide(),DV2HotLeagues.load({url:`${n}/api/data/lives/competitions/hot`,ajax:$.ajax,setHotLeaguesRank:t=>{e.hotLeaguesRank=t}}),$.ajax({url:`${n}/api/data/lives/range-date`,method:"POST",contentType:"application/json",data:JSON.stringify(r),success:function(n){if($(".dv2-layout-scl.dv2-match-wrapper-ctn .match-loading").hide(),!n||!n.matches_by_date)return void $(".match-none").show();let o=Object.keys(n.matches_by_date).map(e=>({date:e,matches:n.matches_by_date[e]}));o=function sortDateMatches_SCL(e){return e.sort((e,t)=>{const a=new Date(e.date),n=new Date(t.date),i=new Date;i.setHours(0,0,0,0),a.setHours(0,0,0,0),n.setHours(0,0,0,0);const o=a.getTime()===i.getTime(),s=n.getTime()===i.getTime();return o?-1:s?1:a-n})}(o),0!==o.length?(function renderDateTabs_SCL(e){const t=$(".dv2-layout-scl.dv2-match-wrapper-ctn .dv2-date-list .dv2-date-item");t.empty();const a=[...e];if(a.length<7){const e=new Date(a[a.length-1].date),t=7-a.length;for(let n=1;n<=t;n++){const t=new Date(e);t.setDate(e.getDate()+n),a.push({date:t.toISOString().split("T")[0],matches:[]})}}a.slice(0,7).forEach((e,a)=>{const{weekday:n,dateFormatted:i}=function formatDateLabel_SCL(e){const t=new Date(e);if(isNaN(t))return e;const a=new Date;a.setHours(0,0,0,0);const n=new Date(t);n.setHours(0,0,0,0);const i=n.getTime()===a.getTime();return{weekday:i?"Hôm nay":["Chủ nhật","Thứ hai","Thứ ba","Thứ tư","Thứ năm","Thứ sáu","Thứ bảy"][t.getDay()],dateFormatted:`${String(t.getDate()).padStart(2,"0")}.${String(t.getMonth()+1).padStart(2,"0")}`,isToday:i}}(e.date),o=0===a?"dv2-active":"",s=`\n            <li class="dv2-item ${o}" data-tag="${a+1}" data-date="${e.date}">\n                <div class="dv2-day">${n}</div>\n                <div class="dv2-date">${i}</div>\n                ${o?'<div class="dv2-indicator"></div>':""}\n            </li>\n        `;t.append(s)})}(o),function renderMatchData_SCL(n){const o=$(".dv2-layout-scl.dv2-match-wrapper-ctn .dv2-match-data"),s=$(".dv2-layout-scl.dv2-match-wrapper-ctn .match-none");o.empty(),new Date,n.forEach((n,s)=>{const{liveMatches:r,upcomingMatches:l,endedMatches:d}=function getListMatchsByTime_SCL(e,n){const o=new Date,s=new Date(n);s.setHours(0,0,0,0);const r=new Date(n);r.setHours(23,59,59,999);const l=[],d=[],c=[];return i(e).forEach(e=>{const n=new Date(e?.kickoff);if(isNaN(n))return;new Date(n.getTime()+72e5);const i=t.includes(e.status.toLowerCase()),m=a.includes(e.status.toLowerCase());n>=s&&n<=r&&(i?l.push(e):n>o?d.push(e):m&&c.push(e))}),{liveMatches:l,upcomingMatches:d,endedMatches:c}}(n.matches,n.date);let c="";const renderMatchList=(t,a)=>{if(!t.length)return"";let n=`<div class="match-section"><h4 class="section-title">${"live"===a?"🔴 Đang diễn ra":"upcoming"===a?"⏰ Sắp diễn ra":"✅ Đã kết thúc"}</h4>`;return t.forEach(t=>{const i=e.hotLeaguesRank.has(t.league.id),o=function formatTime_SCL(e){const t=new Date(e);return`${String(t.getHours()).padStart(2,"0")}
1:${String(t.getMinutes()).padStart(2,"0")}`}(new Date(t.kickoff));n+=`\n                    <div class="dv2-match-card ${i?"hot-match":""} ${a}" data-id="${t.match_id||""}">\n                        <div class="dv2-left">\n                            <div class="dv2-info">\n                                <div class="name dv2-ellipsis" style="color:${"live"===a?"red":"#000"};">\n                                    ${t?.league?.name||"Giải đấu"}\n                                </div>\n                                <div class="time">${o}</div>\n                            </div>\n                            <div class="dv2-team">\n                                <div class="host">\n                                    <img onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'" class="host-img match-cover" src="${t.teams?.home?.logo||""}">\n                                    <span class="host-name dv2-ellipsis">${t.teams?.home?.name||""}</span>\n                                </div>\n                                <div class="guest">\n                                    <img onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'" class="guest-img match-cover" src="${t.teams?.away?.logo||""}">\n                                    <span class="guest-name dv2-ellipsis">${t.teams?.away?.name||""}</span>\n                                </div>\n                            </div>\n                        </div>\n                        <div class="dv2-right">\n                            <div class="anchor-list" data-tag="${s}">\n                                <div class="avatar-list avatar-swiper-container container-${s}">\n                                    <div class="swiper-wrapper">\n                                        ${(t.livestream?.links||[]).map(e=>`\n                                            <div class="dv2-blv-detail-match avatar-box swiper-slide ${"live"===a?"living":""}" \n                                                 data-id="${t.match_id}" data-slug="${t.slug}"\n                                                 data-href="${function getBlvDetailUrl_SCL(e,t){if(window.DV2StreamLinks?.getDetailUrl)return window.DV2StreamLinks.getDetailUrl(e,t,{trailingSlash:!1});const a=t?.liveId;return null!=a&&""!==a?`/streams/${e}?liveId=${encodeURIComponent(String(a))}`:`/streams/${e}`}(t.match_id,e)}">\n                                                <img onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'" class="avatar" src="${e.avatar}" title="${e.commentator}">\n                                                <div class="name dv2-ellipsis">${e.commentator}</div>\n                                                ${"live"===a?'<img class="live" src="https://sta.vnres.co/web/assets/soco/img/live.png">':""}\n                                            </div>\n                                        `).join("")}\n                                    </div>\n                                </div>\n                            </div>\n                            ${"live"===a?'\n                                <div class="living-box">\n                                    <img src="https://sta.vnres.co/web/assets/soco/img/triangle.png">\n                                    <span>Đang trực tiếp...</span>\n                                </div>':""}\n                        </div>\n                    </div>`}),n+="</div>",n};c+=renderMatchList(r,"live"),c+=renderMatchList(l,"upcoming"),c+=renderMatchList(d,"ended"),o.append(`\n            <div class="dv2-match-day ${0===s?"dv2-active":"dv2-hidden"}" data-tag="${s+1}" data-date="${n.date}">\n                ${c||'<div class="match-none">Không có trận đấu nào</div>'}\n            </div>\n        `)}),$(".dv2-date-list .dv2-item").off("click").on("click",function(){const e=$(this).data("tag");$(".dv2-date-list .dv2-item").removeClass("dv2-active"),$(this).addClass("dv2-active"),$(".dv2-match-day").addClass("dv2-hidden").removeClass("dv2-active");const t=$(`.dv2-match-day[data-tag="${e}"]`);t.removeClass("dv2-hidden").addClass("dv2-active"),t.find(".dv2-match-card").length>0?s.hide():s.show()})}(o)):$(".dv2-layout-scl.dv2-match-wrapper-ctn .match-none").show()},error:function(e){console.error("[VSC CALENDAR] Error:",e),$(".dv2-layout-scl.dv2-match-wrapper-ctn .match-loading").hide(),$(".dv2-layout-scl.dv2-match-wrapper-ctn .match-none").show()}})}(),$(".dv2-layout-scl.dv2-match-wrapper-ctn .avatar-swiper-container").length&&function initSwiperInstance(e,t,a){if($(e).length)new Swiper(e,{slidesPerView:5,navigation:{nextEl:t,prevEl:a},breakpoints:{640:{slidesPerView:2},768:{slidesPerView:3},1024:{slidesPerView:4},1280:{slidesPerView:5}},loop:!1})}(".avatar-swiper-container",".avatar-next",".avatar-prev")});const i=DV2MatchSort.createSortedMatchesFunction({mode:"wc-first",liveStatuses:t,hotLeaguesRank:()=>e.hotLeaguesRank});$(document).on("click",".dv2-layout-scl .dv2-match-card",function(e){e.preventDefault();const t=$(this).data("id")||"";
1window.location.href=`/streams/${t}`}),$(document).on("click",".dv2-layout-scl .dv2-match-card .dv2-blv-detail-match",function(e){e.preventDefault(),e.stopPropagation();const t=$(this).data("href")||"",a=$(this).data("id")||"";window.location.href=t||`/streams/${a}`})}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery,Hls,Swiper){$=jQuery.noConflict();const e="https://vsc-apidev.helizones.com",t="https://img.winfast.dev/assets/upload/football/team/images/teamicon.png",a={hotLeaguesRank:new Map},n=["first half","firsthalf","first-half","fh","half-time","half time","halftime","ht","second half","secondhalf","second-half","sh","extra time","extratime","et","overtime","overtime(deprecated)","ot","penalty","penalties","penalty shoot-out","penalty shootout"],i=DV2MatchSort.createSortedMatchesFunction({mode:"wc-when-live-or-soon",liveStatuses:n,hotLeaguesRank:()=>a.hotLeaguesRank,wcSoonMinutes:10,copy:!0}),o=DV2MatchSort.createSortedMatchesFunction({mode:"wc-first",liveStatuses:n,hotLeaguesRank:()=>a.hotLeaguesRank,copy:!0});function isNhaDaiLivestreamLink(e){if(!e)return!1;if(1e17===e.commentatorId)return!0;const t=String(e.commentator||"").trim().toLowerCase();return"nhà đài"===t||"nha dai"===t||"blv nhà đài"===t}function sortLivestreamLinksPreferRealBlv(e){if(!Array.isArray(e))return[];const t=e.filter(e=>!1!==e?.isStreaming);return t.sort((e,t)=>{const a=isNhaDaiLivestreamLink(e),n=isNhaDaiLivestreamLink(t);return a&&!n?1:!a&&n?-1:0}),t}function getPreferredLivestreamLink(e){const t=e?.livestream?.links;return Array.isArray(t)&&t.length?DV2StreamLinks.getPreferredLink(t):null}function getStreamVideoWrapperHome_SCL(){return $(".dv2-layout-scl.dv2-home-featured-streaming-ctn .dv2-video-wrapper").first()}function getStreamVideoContainerHome_SCL(){return getStreamVideoWrapperHome_SCL().find(".dv2-video-container").first()}function getMatchTopInfoHome_SCL(){const e=getStreamVideoContainerHome_SCL();let t=e.children("#matchTopInfo");return t.length||(t=$('<div id="matchTopInfo"></div>'),e.prepend(t)),t}function clearStreamChromeHome_SCL(){const e=window.DV2_StreamChrome,t=getStreamVideoWrapperHome_SCL();e&&t.length&&e.clearFullChrome(t)}function isMatchLive_SCL(e){return n.includes(String(e?.status??"").toLowerCase())}function isWcStartingSoon_SCL(e){return DV2MatchSort.isWcStartingSoon(e,n,10)}function bindFeaturedRoomListClick_SCL(e,t,a){e.off("click.featuredMatch").on("click.featuredMatch","li.dv2-item-match",function(e){e.preventDefault(),e.stopPropagation();const n=$(this).data("index");a(t[n],n)})}function sclOddsValueHasData_SCL(e){return null!=e&&""!==e}function sclOddsSectionHasData_SCL(e){return null!=e&&(sclOddsValueHasData_SCL(e.home)||sclOddsValueHasData_SCL(e.away)||sclOddsValueHasData_SCL(e.rate)||sclOddsValueHasData_SCL(e.over)||sclOddsValueHasData_SCL(e.under))}function sclNormalizeAssetBase_SCL(e){return e?String(e).endsWith("/")?String(e):`${e}/`:""}function sclGetSocoliveImageUrl_SCL(e){const t=String(e||"").replace(/^\//,"");return`${function sclGetSocoliveImgBase_SCL(){return`${function sclGetImagePath_SCL(){if("undefined"!=typeof DV2_IMAGE_PATH&&DV2_IMAGE_PATH)return sclNormalizeAssetBase_SCL(DV2_IMAGE_PATH);if("string"==typeof window.DV2_STREAMING_PLUGIN_URL&&window.DV2_STREAMING_PLUGIN_URL)return`${sclNormalizeAssetBase_SCL(window.DV2_STREAMING_PLUGIN_URL)}assets/images/`;if("undefined"!=typeof dv2Streaming){if(dv2Streaming.imagePath)return sclNormalizeAssetBase_SCL(dv2Streaming.imagePath);if(dv2Streaming.pluginUrl)return`${sclNormalizeAssetBase_SCL(dv2Streaming.pluginUrl)}assets/images/`}return"../../assets/images/"}()}socolive/`}()}${t}`}function sclGetStreamDetailUrl_SCL(e,t){if(!e)return"";const a=e.matchId||e.match_id||e.id||"";if(!a)return"";let n=t||null;if(!n){const t=e.livestream?.links||[];n=sortLivestreamLinksPreferRealBlv(t)[0]||t[0]||null}if(window.DV2StreamLinks?.getDetailUrl)return DV2StreamLinks.getDetailUrl(a,n,{trailingSlash:!0});const i=encodeURIComponent(String(a)),o=n?.liveId;return null!=o&&""!==o?`/streams/${i}/?liveId=${encodeURIComponent(String(o))}
1`:`/streams/${i}/`}function sclBindFeaturedStreamClick_SCL(e){const t=getStreamVideoWrapperHome_SCL();t.length&&(e?t.attr("data-stream-detail-url",e).addClass("dv2-video-wrapper--clickable"):t.removeAttr("data-stream-detail-url").removeClass("dv2-video-wrapper--clickable"))}function sclScheduleTopMarqueeInit_SCL(e){const run=()=>function sclInitTopMarquee_SCL(e){(e?.length?e:getMatchTopInfoHome_SCL()).find(".dv2-video-inner-top-marquee").each(function(){const e=this.querySelector(".dv2-video-inner-top-marquee-track"),t=e?.querySelectorAll(".dv2-video-inner-top-marquee-content");if(!e||!t?.length)return;t.forEach(e=>{e.style.display=""});const a=t[0].offsetWidth;if(!a)return;const n=Math.max(a/60,6);e.style.animation=`dv2-video-inner-marquee ${n}s linear infinite`})}(e);requestAnimationFrame(()=>requestAnimationFrame(run)),setTimeout(run,400)}function getHotLiveRenderOptions_SCL(){return{baseApiUrl:e,ajax:$.ajax,sortedMatchesFunction:o,liveStatuses:n,hotLeaguesRank:a.hotLeaguesRank,getPreferredLivestreamLink:getPreferredLivestreamLink}}function renderListLiveMatch_SCL(e){const a=$(".dv2-layout-scl.dv2-home-featured-streaming-ctn .dv2-room-list"),n=(e||[]).slice(0,10).map(e=>{const t=(e?.title||e?.slug||"Trận đấu").replace(/vuasanco/gi,"").trim(),a=e?.slug||t.toLowerCase().replace(/\s+/g,"-");return{id:e?.match_id||a,homeLogo:e?.teams?.home?.logo||"",awayLogo:e?.teams?.away?.logo||"",homeName:e?.teams?.home?.name||"Đội nhà",awayName:e?.teams?.away?.name||"Đội khách"}});
1a.empty(),n.forEach((e,n)=>{a.append(`\n      <li class="dv2-item-match" data-id="${e.id}" data-index="${n}">\n        <a href="javascript:void(0)" class="${0===n?"dv2-active":""}">\n          <div class="dv2-match-card">\n            <div class="dv2-team dv2-team-home">\n              <img class="dv2-team-logo" src="${e.homeLogo}" alt="${e.homeName}" onerror="this.src='${t}'">\n              <span class="dv2-team-name">${e.homeName}</span>\n            </div>\n            <div class="vs">VS</div>\n            <div class="dv2-team dv2-team-away">\n              <img class="dv2-team-logo" src="${e.awayLogo}" alt="${e.awayName}" onerror="this.src='${t}'">\n              <span class="dv2-team-name">${e.awayName}</span>\n            </div>\n          </div>\n        </a>\n      </li>\n    `)})}$(document).ready(function(){$(".dv2-layout-scl.dv2-home-featured-streaming-ctn .dv2-video-wrapper").length&&function renderFeaturedStreamBlock_SCL(){const n=$(".dv2-layout-scl.dv2-home-featured-streaming-ctn .dv2-video-inner"),s=$(".dv2-layout-scl.dv2-home-featured-streaming-ctn .dv2-room-list"),r=getStreamVideoContainerHome_SCL(),l=$(".dv2-stream-links"),d=new Date,c=new Date(d);c.setDate(c.getDate()+1);const m={fromDate:d.toISOString().split("T")[0],toDate:c.toISOString().split("T")[0]},v=$('\n    <div class="dv2-loading-nomatch">\n      <div class="no-match-text">Hiện không có trận nào đang diễn ra 🔥</div>\n      <div class="subtitle">Vui lòng quay lại sau...</div>\n    </div>\n  ');function showFeaturedMatchError_SCL(e){getMatchTopInfoHome_SCL().html(`<div class="dv2-notfound">${e}</div>`),sclBindFeaturedStreamClick_SCL("")}function loadFeaturedMatch_SCL(t,a){t?.match_id&&(s.find("a").removeClass("dv2-active"),s.find("li").eq(a).find("a").addClass("dv2-active"),clearStreamChromeHome_SCL(),function sclClearFeaturedStreamMediaHome_SCL(e){e.children().not("#matchTopInfo, .dv2-stream-controls, .dv2-stream-chrome").remove(),getMatchTopInfoHome_SCL()}(r),l.find("span").removeClass("active"),$.ajax({url:`${e}/api/data/lives/${t.match_id}`,method:"GET",success(e){const t=e?.data;if(!t?.livestream)return getMatchTopInfoHome_SCL().html('<div class="dv2-notfound-video-livestream">🚫 Không có luồng livestream</div>'),hideAppointmentBlock_SCL(),void sclBindFeaturedStreamClick_SCL("");!function renderNewScreen_SCL(e){if(!e)return;const t=e.league||{},a=e.teams?.home||{},n=e.teams?.away||{},i=e.matchInfo||{},o=e.hdp,s=e.ou,r=function sclHasStreamOddsData_SCL(e){return!!e&&(sclOddsSectionHasData_SCL(e.hdp)||sclOddsSectionHasData_SCL(e.ou))}(e),l=e.livestream?.links||[],d=sclGetStreamDetailUrl_SCL(e),c=function sclGetHomeBetButtonsHtml_SCL(){const e=window.DV2_SOCOLIVE_HOME_BET_BUTTONS_HTML;return"string"==typeof e&&e.trim()?e:function sclGetHomeBetButtonsDefaultHtml_SCL(){return`\n    <a href="#">\n      <img src="${sclGetSocoliveImageUrl_SCL("cuoc-say88.png")}" alt="Cược SAY88" />\n    </a>\n    <a href="#">\n      <img src="${sclGetSocoliveImageUrl_SCL("cuoc-fabet88.png")}" alt="Cược FABET88" />\n    </a>\n    <a href="#">\n      <img src="${sclGetSocoliveImageUrl_SCL("cuoc-fabet88.png")}" alt="Cược FABET88" />\n    </a>`}()}(),m=function sclGetHomeBetButtonHeaderHtml_SCL(){const e=window.DV2_SOCOLIVE_HOME_BET_BUTTON_HEADER_HTML;return"string"==typeof e&&e.trim()?e:function sclGetHomeBetButtonHeaderDefaultHtml_SCL(){return`<img src="${sclGetSocoliveImageUrl_SCL("top-banner.png")}" alt="top-banner"/>`}()}(),v=function sclGetHomeBetButtonFooterHtml_SCL(){const e=window.DV2_SOCOLIVE_HOME_BET_BUTTON_FOOTER_HTML;return"string"==typeof e&&e.trim()?e:function sclGetHomeBetButtonFooterDefaultHtml_SCL(){return`<a href="${"string"==typeof window.DV2_LINK_BET&&window.DV2_LINK_BET.trim()?window.DV2_LINK_BET:"#"}" target="_blank" rel="nofollow">\n    <img src="${sclGetSocoliveImageUrl_SCL("footer-banner-cuocngay-say88.png")}" alt="banner cược ngay footer" />\n  </a>`}()}(),u=t.name||"",h=t.logo||"",p=a.name||"Home",f=a.logo||"",g=n.name||"Away",w=n.logo||"",y=i.kickoff?new Date(i.kickoff):null,S=y?`${String(y.getDate()).padStart(2,"0")}/${String(y.getMonth()+1).padStart(2,"0")}`:"";let _="";if(y){const e=y-new Date;if(e>0&&e/36e5<24){const t=Math.floor(e/36e5),a=Math.floor(e%36e5/6e4),n=Math.floor(e%6e4/1e3);_=`${String(t).padStart(2,"0")}
1:${String(a).padStart(2,"0")}:${String(n).padStart(2,"0")}`,i._kickoffForCountdown=y}else _=`${String(y.getHours()).padStart(2,"0")}:${String(y.getMinutes()).padStart(2,"0")}`}const D=l.length?l.map(t=>`\n            <a href="${sclGetStreamDetailUrl_SCL(e,t)}">\n              <div class="dv2-video-inner-commentator-item">\n                <div class="dv2-video-inner-commentator-avatar">\n                  ${t.avatar?`<img src="${t.avatar}" alt="${t.commentator}" />`:"👨"}\n                </div>\n                <div class="dv2-video-inner-commentator-name">${t.commentator}</div>\n              </div>\n            </a>`).join(""):"",k=r?`\n      <div class="dv2-video-inner-odds">\n        <div class="dv2-video-inner-odds-group">\n          <div class="dv2-video-inner-odds-type">HDP</div>\n          <div class="dv2-video-inner-odds-values">\n            <div>${o?.home??""}</div>\n            <div>${o?.rate??""}</div>\n            <div>${o?.away??""}</div>\n          </div>\n        </div>\n        <div class="dv2-video-inner-odds-group">\n          <div class="dv2-video-inner-odds-type">O/U</div>\n          <div class="dv2-video-inner-odds-values">\n            <div>${s?.over??"-"}</div>\n            <div>${s?.rate??"-"}</div>\n            <div>${s?.under??"-"}</div>\n          </div>\n        </div>\n      </div>`:"",C=`\n    <div class="dv2-video-inner-top-banner">\n      <div class="dv2-video-inner-top-left">\n        <div class="dv2-video-inner-top-icon"><img src="${h}" alt="${u}" /></div>\n        <div class="dv2-video-inner-top-title">${u}</div>\n      </div>\n      <div class="dv2-video-inner-top-marquee">\n        <div class="dv2-video-inner-top-marquee-track">\n          <div class="dv2-video-inner-top-marquee-content">${m}</div>\n          <div class="dv2-video-inner-top-marquee-content" aria-hidden="true">${m}</div>\n        </div>\n      </div>\n    </div>\n    <div class="dv2-video-inner-main-banner">\n      <div class="dv2-video-inner-team-info">\n        <div class="dv2-video-inner-team dv2-video-inner-team-left">\n          <div class="dv2-video-inner-team-flag">\n            ${f?`<img src="${f}" alt="${p}" />`:""}\n          </div>\n          <div class="dv2-video-inner-team-name">${p}</div>\n        </div>\n        <div class="vs-image">\n          <img src="${sclGetSocoliveImageUrl_SCL("vs-icon.png")}" alt="VS" />\n        </div>\n        <div class="dv2-video-inner-team dv2-video-inner-team-right">\n          <div class="dv2-video-inner-team-flag">\n            ${w?`<img src="${w}" alt="${g}" />`:""}\n          </div>\n          <div class="dv2-video-inner-team-name">${g}</div>\n        </div>\n      </div>\n    </div>\n    <div class="dv2-video-inner-time-box-wrapper">\n      <div class="dv2-video-inner-time-box">\n        <div class="dv2-video-inner-time-label">Thời gian: ${S}</div>\n        <div class="dv2-video-inner-time-value">${_}</div>\n      </div>\n    </div>\n    <div class="dv2-video-inner-footer-bar">\n      <div class="dv2-video-inner-odds-row">\n        ${k}\n        <div class="dv2-video-inner-cta-group"><div class="dv2-video-inner-cta-track">${c}</div></div>\n      </div>\n      <div class="dv2-video-inner-commentator">\n        ${v}\n        <div class="dv2-video-inner-commentator-list">${D}</div>\n      </div>\n    </div>`,b=getMatchTopInfoHome_SCL();if(b.html(C),sclBindFeaturedStreamClick_SCL(d),function sclRefreshFeaturedReviveAds_SCL(){window.DV2_StreamChrome?.refreshReviveAds?.(getMatchTopInfoHome_SCL())}(),sclScheduleTopMarqueeInit_SCL(b),b.find(".dv2-video-inner-top-marquee img").each(function(){this.complete?sclScheduleTopMarqueeInit_SCL(b):$(this).one("load error",()=>sclScheduleTopMarqueeInit_SCL(b))}),i._kickoffForCountdown){const e=i._kickoffForCountdown;delete i._kickoffForCountdown,window._sclCountdownInterval&&clearInterval(window._sclCountdownInterval),window._sclCountdownInterval=setInterval(()=>{const t=e-new Date;if(t<=0)return clearInterval(window._sclCountdownInterval),window._sclCountdownInterval=null,void location.reload();const a=Math.floor(t/36e5),n=Math.floor(t%36e5/6e4),i=Math.floor(t%6e4/1e3),o=`${String(a).padStart(2,"0")}
1:${String(n).padStart(2,"0")}:${String(i).padStart(2,"0")}`;getMatchTopInfoHome_SCL().find(".dv2-video-inner-time-value").text(o)},1e3)}}(t)},error(e){console.error("[VSC LIVE] Lỗi khi gọi API:",e),showFeaturedMatchError_SCL("Không thể tải dữ liệu livestream")}}))}DV2HotLeagues.load({url:`${e}/api/data/lives/competitions/hot`,ajax:$.ajax,setHotLeaguesRank:e=>{a.hotLeaguesRank=e}}),$.ajax({url:`${e}/api/data/lives/range-date`,method:"POST",headers:{"Content-Type":"application/json"},data:JSON.stringify(m),dataType:"json",success(e){if(!e||"success"!==e.status||!e.matches_by_date)return void s.html("<li>Không có dữ liệu hợp lệ</li>");const a=[];if(Object.keys(e.matches_by_date).forEach(t=>{a.push(...e.matches_by_date[t])}),!a.length)return void s.html("<span>Không có trận đấu nào</span>");const{now:r,todayStart:d,todayEnd:c,tomorrowStart:m,tomorrowEnd:u}=function getTodayTomorrowRange_SCL(){const e=new Date,t=new Date(e);t.setHours(0,0,0,0);const a=new Date(e);a.setHours(23,59,59,999);const n=new Date(t);n.setDate(t.getDate()+1);const i=new Date(a);return i.setDate(a.getDate()+1),{now:e,todayStart:t,todayEnd:a,tomorrowStart:n,tomorrowEnd:i}}(),h=i(a),{streamMatches:p,liveMatch:f,upcomingMatch:g,wcSoonMatch:w}=function buildFeaturedStreamMatches_SCL(e,t,a,n,i,o){const s=e.filter(isMatchLive_SCL),r=e.filter(e=>{const s=new Date(e?.kickoff);return s>t&&(s>=a&&s<=n||s>=i&&s<=o)}),l=e.find(isWcStartingSoon_SCL)||null,d=new Set,c=[],pushMatch=e=>{const t=e?.match_id??e?.id;!e||t&&d.has(t)||(t&&d.add(t),c.push(e))};
1return l&&pushMatch(l),s.forEach(pushMatch),r.forEach(pushMatch),{streamMatches:c,liveMatch:s,upcomingMatch:r,wcSoonMatch:l}}(h,r,d,c,m,u);if(!f.length&&!g.length)return clearStreamChromeHome_SCL(),n.append(v),void $(".dv2-layout-scl.dv2-appoinment-list-ctn").hide();f.length&&!g.length&&$(".dv2-layout-scl.dv2-appoinment-list-ctn").hide(),!f.length&&!w&&g.length>0&&(renderListLiveMatch_SCL(g),bindFeaturedRoomListClick_SCL(s,g,loadFeaturedMatch_SCL),loadFeaturedMatch_SCL(g[0],0)),(f.length>0||w)&&(renderListLiveMatch_SCL(p),bindFeaturedRoomListClick_SCL(s,p,loadFeaturedMatch_SCL),function bindFeaturedStreamLinksClick_SCL(e){l.off("click.featuredLinks").on("click.featuredLinks","span",function(t){t.preventDefault(),t.stopPropagation();const a=$(this).data("index"),n=$(this).data("index-links"),i=e[a],o=sortLivestreamLinksPreferRealBlv(i?.livestream?.links||[])[n];DV2StreamLinks.navigateForLink(o)||loadFeaturedMatch_SCL(i,a)})}(p),loadFeaturedMatch_SCL(p[0],0)),function renderSliderAppointmentsBlock_SCL(e){const a=$(".dv2-layout-scl.dv2-appoinment-list-ctn .dv2-appoinment-swiper-container"),n=a.find(".dv2-swiper-wrapper");n.empty(),e.forEach(function(e,a){const i=e?.match_id||e?.id||e?.slug||a,o=e?.league?.name||"N/A",s=e?.league?.logo||"https://sta.vnres.co/file/common/20210503/fca5954ec22137ad05325506d6645592",r=function getDateLabel_SCL(e){const t=new Date,a=new Date(t);a.setDate(a.getDate()+1);const n=new Date(e);if(t.setHours(0,0,0,0),a.setHours(0,0,0,0),n.setHours(0,0,0,0),n.getTime()===t.getTime())return"Hôm nay";if(n.getTime()===a.getTime())return"Ngày mai";return`${String(n.getDate()).padStart(2,"0")}/${String(n.getMonth()+1).padStart(2,"0")}`}(e?.kickoff||""),l=function formatTime_SCL(e){if(!e)return"";const t=new Date(e);return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}(e?.kickoff||""),d=e?.teams?.home?.name||"Home Team",c=e?.teams?.home?.logo||"Logo",m=e?.teams?.away?.name||"Away Team",v=e?.teams?.away?.logo||"Logo";n.append(`\n      <div class="dv2-swiper-slide swiper-slide" style="cursor:pointer;" data-id="${i}" onclick="goToMatchDetail('${i}')">\n        <div class="dv2-title">\n          <div class="dv2-fl">\n            <img onerror="this.src='${t}'" src="${s}" class="icon" draggable="false">\n            <span>${o}</span>\n          </div>\n          <div class="dv2-fr dv2-match-time">\n            <span style="padding-right:5px;">${r}</span>\n            ${l}\n          </div>\n        </div>\n        <div class="dv2-box" style="display: flex;">\n          <div class="dv2-battle-team">\n            <p>\n              <img onerror="this.src='${t}'" class="dv2-logo" src="${c}" data-src="${c}" draggable="false">\n              <span class="dv2-ellipsis">${d}</span>\n            </p>\n            <p>\n              <img onerror="this.src='${t}'" class="dv2-logo" src="${v}" data-src="${v}" alt="" draggable="false">\n              <span class="dv2-ellipsis">${m}</span>\n            </p>\n          </div>\n          <a href="${window.DV2_LINK_BET}" target="_blank" rel="nofollow"\n            data-id="${i}" data-slug="${e.slug||""}"\n            class="dv2-appoinment" onclick="event.stopPropagation();" draggable="false">\n            <span class="no-appoinment">Đặt cược</span>\n          </a>\n        </div>\n      </div>\n    `)}),a.show(),function initSwiperInstance(e,t,a){$(e).length&&new Swiper(e,{slidesPerView:1.5,navigation:{nextEl:t,prevEl:a},breakpoints:{640:{slidesPerView:2},768:{slidesPerView:3},1024:{slidesPerView:4},1280:{slidesPerView:5}},loop:!0,watchSlidesProgress:!0,roundLengths:!0,autoplay:{delay:3e3,disableOnInteraction:!1}})}(".dv2-layout-scl.dv2-appoinment-list-ctn .dv2-appoinment-swiper-container",".dv2-appoinment-next",".dv2-appoinment-prev")}(g),function renderHotLiveBlock_SCL(e=[]){DV2SocoliveHotLive.render(e,getHotLiveRenderOptions_SCL())}(DV2SocoliveHotLive.prepareMatches(a,o))},error(){clearStreamChromeHome_SCL(),s.html('<li class="dv2-list-empty">Danh sách phát trống</li>'),showFeaturedMatchError_SCL("Không thể tải danh sách trận đấu"),$(".dv2-layout-scl.dv2-appoinment-list-ctn").hide()}})}(),$(".dv2-layout-scl.dv2-blv-list-ctn .dv2-anchor-swiper-container").length&&function render
1SlideBlvBlock_SCL(){const a=$(".dv2-layout-scl.dv2-blv-list-ctn .dv2-anchor-swiper-container").find(".dv2-swiper-wrapper");a.empty(),a.html('\n    <div class="dv2-loading-blv" style="color:#000;text-align:center;padding:40px 0;">\n      Đang tải danh sách bình luận viên...\n    </div>\n  '),$.ajax({url:`${e}/api/admin/streams/commentators`,method:"GET",dataType:"json",success(e){e&&"success"===e.message&&Array.isArray(e.commentators)?e.commentators.length?(a.empty(),e.commentators.forEach(e=>{const n=e?.name||"Bình luận viên",i=e?.avatar||"https://sta.vnres.co/file/common/20250410/000bfdfc22afe0f322140fabd2228aec.jpg";a.append(`\n          <div class="dv2-swiper-slide swiper-slide dv2-person-blv" data-id="${e?.id}">\n            <a href="javascript:void(0)">\n              <img onerror="this.src='${t}'" class="dv2-blv-avatar" src="${i}" alt="${n}">\n              <p class="dv2-blv-name ellipsis">${n}</p>\n            </a>\n          </div>\n        `)}),function initSwiperInstanceCom(e,t,a){$(e).length&&new Swiper(e,{slidesPerView:8,navigation:{nextEl:t,prevEl:a},breakpoints:{640:{slidesPerView:3},768:{slidesPerView:3},1024:{slidesPerView:5},1280:{slidesPerView:8}},loop:!1,watchSlidesProgress:!0,roundLengths:!0,autoplay:{delay:3e3,disableOnInteraction:!1}})}(".dv2-layout-scl.dv2-blv-list-ctn .dv2-anchor-swiper-container",".dv2-anchor-next",".dv2-anchor-prev")):a.html('<div style="color:#fff;text-align:center;padding:40px 0;">Không có bình luận viên nào</div>'):a.html('<div style="color:#fff;text-align:center;padding:40px 0;">Không có dữ liệu bình luận viên</div>')},error(){a.html('\n        <div style="color:#fff;text-align:center;padding:40px 0;">\n          Lỗi khi tải danh sách bình luận viên\n        </div>\n      ')}})}(),$(".dv2-layout-scl.dv2-hotlive-ctn .dv2-hot-content").length&&function initHotLiveBlock_SCL(){if(!$(".dv2-layout-scl.dv2-hotlive-ctn .dv2-hot-content").length)return;const start=()=>DV2SocoliveHotLive.init(getHotLiveRenderOptions_SCL()),t=DV2HotLeagues.load({url:`${e}/api/data/lives/competitions/hot`,ajax:$.ajax,setHotLeaguesRank:e=>{a.hotLeaguesRank=e}});t&&"function"==typeof t.always?t.always(start):start()}()}),$(document).on("click",".dv2-layout-scl.dv2-home-featured-streaming-ctn .dv2-video-wrapper.dv2-video-wrapper--clickable",function(e){if($(e.target).closest("a, button, input, label, .dv2-video-inner-cta-group, .dv2-video-inner-commentator-list").length)return;const t=$(this).attr("data-stream-detail-url");t&&(window.location.href=t)}),$(document).on("click",".dv2-layout-scl.dv2-hotlive-ctn .dv2-game",function(e){if($(e.target).closest(".dv2-blv-dropdown").length)return;const t=$(this),a=t.attr("href");if(a&&"#"!==a)return;e.preventDefault();const n=t.data("id")||"";window.location.href=`/streams/${n}`}),window.goToMatchDetail=function goToMatchDetail(e){window.location.href=`/streams/${e}`}}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery,Hls){$=jQuery.noConflict();const e="https://img.freepik.com/premium-photo/close-up-soccer-player-who-kicks-ball_207634-4089.jpg";$(document).ready(function(){if($(".dv2-layout-tc.dv2-detail-stream-ctn").length>0){const e=document.getElementById("liveVideo");e&&(initStreamPlayerUi_TC(e),function initThapcamMobilePlaybackFix_TC(){const e=getStreamVideoWrapper_TC();if(!e.length||e.data("tcMobileFixBound"))return;e.data("tcMobileFixBound",!0);const syncTcFsLayoutClass=()=>{const t=e[0],a=!!t&&(document.fullscreenElement===t||document.webkitFullscreenElement===t)||e.hasClass("dv2-stream-wrapper-fs");e.toggleClass("dv2-tc-stream-fs",a),e.closest(".dv2-thapcam-video").toggleClass("dv2-tc-stream-parent-fs",a)};e.on("dv2wrapperfschange.tcFsLayout",syncTcFsLayoutClass),$(document).on("fullscreenchange.tcFsLayout webkitfullscreenchange.tcFsLayout",syncTcFsLayoutClass),$(window).on("resize.tcFsLayout orientationchange.tcFsLayout",syncTcFsLayoutClass),syncTcFsLayoutClass(),e.on("play.dv2TcMobileFix pause.dv2TcMobileFix loadedmetadata.dv2TcMobileFix","video",function(){applyThapcamVideoAttrs_TC($(this))})}()),function loadMatchData_TC(e){const t=getStreamVideoWrapper_TC();
1showStreamLoading_TC(t,"Đang tải thông tin trận đấu..."),$.ajax({url:`https://vsc-apidev.helizones.com/api/data/lives/${e}`,method:"GET",success:function(e){if(hideStreamLoading_TC(t),e&&e.data){a=e.data;const n=a;!function startDetailScorePoll_TC(e){e&&(i||(i=DV2MatchScorePoll.create({container:".dv2-layout-tc.dv2-detail-stream-ctn"})),i.sync(e),i.start())}(n),initStreamOddsPanel_TC(n);const o=new Date(n?.matchInfo?.kickoff);if(!Number.isNaN(o.getTime())&&o.getTime()-Date.now()>9e5){clearStreamChrome_TC(),updatePageTitle_TC(n),renderScoreOverlay_TC(n),renderCommentatorLinks_TC(n,{autoPlay:!1});const showCountdown=()=>{showMatchInfoCard_TC(t,n,"countdown"),$(".dv2-layout-tc.dv2-detail-stream-ctn #scoreOverlay").show()};return void(window.DV2StreamTvc?.playBeforeStream?window.DV2StreamTvc.playBeforeStream(t,showCountdown):showCountdown())}if("finished"===n?.matchInfo?.status?.toLowerCase())return clearStreamChrome_TC(),updatePageTitle_TC(n),renderScoreOverlay_TC(n),renderCommentatorLinks_TC(n,{autoPlay:!1}),showMatchInfoCard_TC(t,n,"result"),void $(".dv2-layout-tc.dv2-detail-stream-ctn #scoreOverlay").show();!function renderMatchPage_TC(){const e=a;updatePageTitle_TC(e),renderScoreOverlay_TC(e);const t=renderCommentatorLinks_TC(e);t?.links?.length||(clearStreamChrome_TC(),showMatchPosterOverlay_TC(getStreamVideoWrapper_TC(),e)),$(".dv2-layout-tc.dv2-detail-stream-ctn #scoreOverlay").show()}()}else showError_TC()},error:function(){hideStreamLoading_TC(t),showError_TC()}})}(function getMatchIdFromUrl_TC(){let e=new URLSearchParams(window.location.search).get("match");return e||(e="undefined"!=typeof DV2_MATCH_ID&&DV2_MATCH_ID?DV2_MATCH_ID:"2y8m4zh54p4zql0"),e}())}});let t=null,a=null,n=null,i=null,o=0,s=null,r=null;function getStreamChrome_TC(){return window.DV2_StreamChrome}function getStreamVideoWrapper_TC(){return $(".dv2-layout-tc.dv2-detail-stream-ctn .dv2-video-wrapper").first()}function applyThapcamVideoAttrs_TC(e){if(!e?.length)return;const t=e[0];e.prop("controls",!1),e.removeAttr("controls"),e.attr({playsinline:"","webkit-playsinline":"","x-webkit-airplay":"allow"}),t&&(t.controls=!1,"disablePictureInPicture"in t&&(t.disablePictureInPicture=!0))}function initStreamPlayerUi_TC(e){const t=getStreamVideoWrapper_TC(),a=getStreamChrome_TC();if(!t.length||!a)return;const n=e?$(e):t.find("video").first();applyThapcamVideoAttrs_TC(n),a.initPlayerUi(t,n),applyThapcamVideoAttrs_TC(n)}function onHlsStreamReady_TC(){const e=getStreamChrome_TC(),t=getStreamVideoWrapper_TC();t.length&&clearMatchOverlays_TC(t),e&&t.length&&(a&&e.rememberOddsMatchData?.(t,a),e.onHlsReady(t))}function initStreamOddsPanel_TC(e){const t=getStreamChrome_TC(),a=getStreamVideoWrapper_TC();t&&a.length&&e&&(t.rememberOddsMatchData?.(a,e),t.initOddsPanel?.(a,e))}function clearStreamChrome_TC(){const e=getStreamChrome_TC(),t=getStreamVideoWrapper_TC();e&&t.length&&e.clearFullChrome(t)}function showStreamLoading_TC(e,t="Đang tải luồng phát..."){if(!e?.length)return $();hideStreamLoading_TC(e);const a=String(t||"Đang tải luồng phát...").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),n=$(`\n    <div class="dv2-stream-loading" role="status" aria-live="polite" aria-busy="true">\n      <div class="dv2-stream-loading__panel">\n        <div class="dv2-stream-loading__spinner" aria-hidden="true"></div>\n        <p class="dv2-stream-loading__text">${a}</p>\n      </div>\n    </div>\n  `);return e.append(n),n}function hideStreamLoading_TC(e){(e?.length?e:getStreamVideoWrapper_TC()).find(".dv2-stream-loading").remove()}function clearTcPlaybackTimers(){s&&(clearTimeout(s),s=null),r&&(clearTimeout(r),r=null)}function stopStreamPlayback_TC(e){if(o+=1,clearTcPlaybackTimers(),t){try{t.destroy()}catch(e){console.warn(e)}t=null}if(!e?.length)return;const a=e[0];a.pause(),a.removeAttribute("src"),"function"==typeof a.load&&a.load()}function ensurePosterVideo_TC(t){if(!t?.length)return $();let a=t.find("#liveVideo");a.length?(stopStreamPlayback_TC(a),a.attr({poster:DV2StreamKickoff.resolvePosterUrl(n,e),muted:!0,playsinline:!0}),a.prop({autoplay:!1,controls:!1}),applyThapcamVideoAttrs_TC(a)):(a=$("<video>",{id:"liveVideo",class:"dv2-video-player",controls:!1,autoplay:!1,muted:!0,playsinline:!0,poster:DV2StreamKickoff.resolvePosterUrl(n,e)}),t.find(".dv2-video-container").append(a),applyThapcamVideoAttrs_TC(a));const i=getStreamChrome_TC();return i&&(i.applyVideoControls?.(a),i.ensureControlsBar?.(t)),a}function clearMatchOverlays_TC(e){(e?.length?e:getStreamVideoWrapper_TC()).find(".dv2-loading.dv2-match-overlay, .dv2-not-loaded.dv2-match-overlay").remove()}function showMatchPosterOverlay_TC(e,t){if(!e?.length)return;
1if(hideStreamLoading_TC(e),e.find(".dv2-loading").not(".dv2-match-overlay").remove(),clearMatchOverlays_TC(e),$(".dv2-layout-tc.dv2-detail-stream-ctn #noStreamMessage").hide(),ensurePosterVideo_TC(e),t){const a=function createMatchOverlay_TC(e){const t=e?.matchInfo?.kickoff,a=e?.league||{},n=e?.teams?.home?.name||"Home",i=e?.teams?.away?.name||"Away",o=e?.matchInfo?.status;return $(`\n    <div class="dv2-loading">\n      <span class="dv2-loading-status">${statusMatchRender_TC(o)}</span>\n      Trận đấu: <strong>${n} - ${i}</strong>\n      <div class="dv2-load-league">\n        <span>Giải đấu: <strong><img src="${a.logo||""}" alt="${a.name||"-"}" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"> ${a.name||"-"}</strong></span>\n      </div>\n      <div class="dv2-load-time">\n        <span>${DV2StreamKickoff.renderTimeDisplay(t)}</span>\n      </div>\n    </div>\n  `)}(t);a.addClass("dv2-match-overlay"),e.append(a)}const a=getStreamChrome_TC();a&&a.bindEvents?.(e),t?.matchInfo?.kickoff&&DV2StreamKickoff.startCountdown(t.matchInfo.kickoff)}function showMatchInfoCard_TC(e,t,a="countdown"){if(!e?.length)return;if(hideStreamLoading_TC(e),e.find(".dv2-loading").not(".dv2-match-overlay").remove(),clearMatchOverlays_TC(e),$(".dv2-layout-tc.dv2-detail-stream-ctn #noStreamMessage").hide(),ensurePosterVideo_TC(e),t){const n=function createMatchInfoCard_TC(e,t="countdown"){const a=e?.matchInfo?.kickoff,n=e?.league||{},i=e?.teams?.home?.name||"Home",o=e?.teams?.away?.name||"Away",s=e?.score?.fulltime?.home??0,r=e?.score?.fulltime?.away??0,l=e?.matchInfo?.status;let d="";return d="result"===t?`<span>Kết quả: <strong><span data-dv2-score-home>${s}</span> - <span data-dv2-score-away>${r}</span></strong></span>`:`<span>${DV2StreamKickoff.renderTimeDisplay(a)}</span>`,$(`\n    <div class="dv2-loading">
1\n      <span class="dv2-loading-status">${statusMatchRender_TC("result"===t?"finished":l)}</span>\n      Trận đấu: <strong>${i} - ${o}</strong>\n      <div class="dv2-load-league">\n        <span>Giải đấu: <strong><img src="${n.logo||""}" alt="${n.name||"-"}" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"> ${n.name||"-"}</strong></span>\n      </div>\n      <div class="dv2-load-time">\n        ${d}\n      </div>\n    </div>\n  `)}(t,a);n.addClass("dv2-match-overlay"),e.append(n)}"countdown"===a&&t?.matchInfo?.kickoff&&DV2StreamKickoff.startCountdown(t.matchInfo.kickoff);const n=getStreamChrome_TC();n&&n.bindEvents?.(e)}function bindStreamLoadingUntilPlaying_TC(e,t,a){if(!e?.length||!t)return void a?.();let n=!1;const finish=()=>{n||(n=!0,t.removeEventListener("playing",onPlaying),t.removeEventListener("canplay",onCanPlay),clearTimeout(i),hideStreamLoading_TC(e),a?.())},onPlaying=()=>finish(),onCanPlay=()=>{t.paused||finish()};t.addEventListener("playing",onPlaying),t.addEventListener("canplay",onCanPlay);const i=setTimeout(finish,12e3)}function shouldShowPreMatchOverlay_TC(e){const t=new Date(e?.matchInfo?.kickoff);return!Number.isNaN(t.getTime())&&t.getTime()-Date.now()>9e5}function renderCommentatorLinks_TC(t,i={}){const{autoPlay:o=!0}=i;let s=[];const r=DV2StreamLinks.prepareSpanLinks({rawLinks:t?.livestream?.links,$container:$(".dv2-layout-tc.dv2-detail-stream-ctn .dv2-stream-links"),onSelect(i,o){n=i;const r=getStreamVideoWrapper_TC(),l=r.find("#liveVideo");if(DV2StreamKickoff.applyPosterForLink(l,i,e),updateCommentatorInfo_TC(t,o,s),initStreamOddsPanel_TC(a),shouldShowPreMatchOverlay_TC(a)||"finished"===a?.matchInfo?.status?.toLowerCase()||!i?.url)return stopStreamPlayback_TC(l),clearMatchOverlays_TC(r),$(".dv2-layout-tc.dv2-detail-stream-ctn #noStreamMessage").hide(),void("finished"===a?.matchInfo?.status?.toLowerCase()?showMatchInfoCard_TC(r,a,"result"):shouldShowPreMatchOverlay_TC(a)?showMatchInfoCard_TC(r,a,"countdown"):ensurePosterVideo_TC(r));clearMatchOverlays_TC(r),$(".dv2-layout-tc.dv2-detail-stream-ctn #noStreamMessage").hide(),initVideoPlayer_TC(i.url)}});if(s=r.links||[],!s.length)return null;if(n=r.activeLink,updateCommentatorInfo_TC(t,r.activeIndex,s),DV2StreamKickoff.applyPosterForLink(getStreamVideoWrapper_TC().find("#liveVideo"),n,e),o&&r.activeLink?.url){const e=r.activeLink.url,startStream=()=>initVideoPlayer_TC(e),t=getStreamVideoWrapper_TC();window.DV2StreamTvc?.playBeforeStream?window.DV2StreamTvc.playBeforeStream(t,startStream):startStream()}return r}function updatePageTitle_TC(e){const t=e.teams?.home?.name||"Home",a=e.teams?.away?.name||"Away",n=new Date(e.matchInfo.kickoff),i=n.toLocaleDateString("vi-VN",{day:"2-digit",month:"2-digit",year:"numeric"}),o=n.toLocaleTimeString("vi-VN",{hour:"2-digit",minute:"2-digit"});$(".dv2-layout-tc.dv2-detail-stream-ctn #pageTitle").text(`LINK TRỰC TIẾP ${t.toUpperCase()} VS ${a.toUpperCase()} LÚC ${o} ${i} MIỄN PHÍ`)}
1function renderScoreOverlay_TC(e){const t=e.teams?.home||{},a=e.teams?.away||{},n=e.score?.fulltime?.home??0,i=e.score?.fulltime?.away??0;$(".dv2-layout-tc.dv2-detail-stream-ctn #homeTeam").html(`\n                <div class="dv2-overlay-flag">\n                    <img src="${t.logo}" alt="${t.name}" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'">\n                </div>\n                <div class="dv2-overlay-team-name">${t.name||"Home"}</div>\n            `),$(".dv2-layout-tc.dv2-detail-stream-ctn #scoreDisplay").html(`\n                <div class="dv2-score-number dv2-home-score-number" data-dv2-score-home>${n}</div>\n                <div class="dv2-score-separator">-</div>\n                <div class="dv2-score-number dv2-away-score-number" data-dv2-score-away>${i}</div>\n            `),$(".dv2-layout-tc.dv2-detail-stream-ctn #awayTeam").html(`\n                <div class="dv2-overlay-flag">\n                    <img src="${a.logo}" alt="${a.name}" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'">\n                </div>\n                <div class="dv2-overlay-team-name">${a.name||"Away"}</div>\n            `)}function updateCommentatorInfo_TC(e,t=0,a=null){const n=(a||DV2StreamLinks.sortForDetail(e?.livestream?.links))[t];n&&$(".dv2-layout-tc.dv2-detail-stream-ctn #commentatorInfo").text(n.commentator.toUpperCase())}function initVideoPlayer_TC(e){const n=getStreamVideoWrapper_TC(),i=n.find("#liveVideo"),l=i[0];o+=1;const d=o,isStalePlayback=()=>d!==o;if(clearMatchOverlays_TC(n),clearTcPlaybackTimers(),!e||!l)return hideStreamLoading_TC(n),void(a?showMatchPosterOverlay_TC(n,a):showError_TC("Không tìm thấy video livestream"));let c=!1;const showFallback=()=>{if(!isStalePlayback()&&!c){if(c=!0,clearTcPlaybackTimers(),t){try{t.destroy()}catch(e){console.warn(e)}t=null}l&&(l.pause(),l.removeAttribute("src"),"function"==typeof l.load&&l.load()),hideStreamLoading_TC(n),clearStreamChrome_TC(),a?showMatchPosterOverlay_TC(n,a):showError_TC("Không tải được video livestream")}};if(t){try{t.destroy()}catch(e){console.warn(e)}t=null}$(".dv2-layout-tc.dv2-detail-stream-ctn #noStreamMessage").hide(),showStreamLoading_TC(n,"Đang tải luồng phát..."),initStreamPlayerUi_TC(l),Hls.isSupported()?(s=setTimeout(()=>{isStalePlayback()||(console.warn("[VSC LIVE] Manifest load timeout"),showFallback())},15e3),t=new Hls({maxBufferLength:10,liveSyncDuration:3,enableWorker:!0,xhrSetup:function(e){e.withCredentials=!1,e.referrerPolicy="no-referrer-when-downgrade"}}),t.loadSource(e),t.attachMedia(l),t.on(Hls.Events.MANIFEST_PARSED,function(){isStalePlayback()||(clearTcPlaybackTimers(),bindStreamLoadingUntilPlaying_TC(n,l,()=>{isStalePlayback()||onHlsStreamReady_TC()}),l.muted=!0,getStreamChrome_TC()?.syncControlsState?.(n,i),l.play().catch(()=>console.warn("Autoplay blocked")))}),t.on(Hls.Events.ERROR,function(e,t){isStalePlayback()||t.fatal&&(clearTcPlaybackTimers(),showFallback())}),l.addEventListener("error",function(){isStalePlayback()||(clearTcPlaybackTimers(),showFallback())},{once:!0})):l.canPlayType("application/vnd.apple.mpegurl")?(r=setTimeout(()=>{isStalePlayback()||(console.warn("[VSC LIVE] Native HLS load timeout"),showFallback())},15e3),l.src=e,l.addEventListener("loadedmetadata",function(){isStalePlayback()||(clearTcPlaybackTimers(),bindStreamLoadingUntilPlaying_TC(n,l,()=>{isStalePlayback()||onHlsStreamReady_TC()}),l.muted=!0,getStreamChrome_TC()?.syncControlsState?.(n,i),l.play().catch(()=>console.warn("Autoplay blocked on Safari")))}),l.addEventListener("error",function(){isStalePlayback()||(clearTcPlaybackTimers(),showFallback())},{once:!0})):showFallback()}function showError_TC(e="Không có luồng livestream"){const t=getStreamVideoWrapper_TC();hideStreamLoading_TC(t),clearStreamChrome_TC(),t.find(".dv2-loading").not(".dv2-match-overlay").remove(),clearMatchOverlays_TC(t),ensurePosterVideo_TC(t);const a=String(e||"Không có luồng livestream").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),n=$(`\n    <div class="dv2-not-loaded dv2-match-overlay">\n      <div class="dv2-no-stream" id="noStreamMessage">\n        <div class="dv2-no-stream-icon">🚫</div>\n        <div class="dv2-no-stream-title">${a}</div>\n        <div class="dv2-no-stream-subtitle">\n          Trận đấu này hiện chưa có luồng phát trá»±c tiếp hoặc bị lá
1»—i.<br>\n          Vui lòng quay lại sau hoặc xem các trận đấu khác.\n        </div>\n      </div>\n    </div>\n  `);t.append(n);const i=getStreamChrome_TC();i&&i.bindEvents?.(t)}function statusMatchRender_TC(e){return{"not started":"Sắp diễn ra","to be determined":"Chưa xác định",delay:"Trì hoãn",interrupt:"Tạm dừng","cut in half":"Bị cắt hiệp",postponed:"Hoãn trận",suspended:"Tạm hoãn",abandoned:"Bỏ dở",cancel:"Há»§y trận","abnormal(suggest hiding)":"Trạng thái bất thường","first half":"Đang thi đấu",firsthalf:"Đang thi đấu","first-half":"Đang thi đấu",fh:"Đang thi đấu","half-time":"Nghỉ giữa hiệp","half time":"Nghỉ giữa hiệp",halftime:"Nghỉ giữa hiệp",ht:"Nghỉ giữa hiệp","second half":"Đang thi đấu",secondhalf:"Đang thi đấu","second-half":"Đang thi đấu",sh:"Đang thi đấu","extra time":"Hiệp phụ",extratime:"Hiệp phụ",et:"Hiệp phụ",overtime:"Hiệp phụ","overtime(deprecated)":"Hiệp phụ",ot:"Hiệp phụ",penalty:"Luân lưu",penalties:"Luân lưu","penalty shoot-out":"Luân lưu","penalty shootout":"Luân lưu",finished:"Đã kết thúc",ft:"Đã kết thúc",end:"Đã kết thúc",walkover:"Thắng xá»­ thua"}[e?String(e).toLowerCase():""]||"Không xác định"}window.addEventListener("beforeunload",function(){t&&t.destroy()})}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery){$=jQuery.noConflict();const e={hotLeaguesRank:new Map},t=["first half","firsthalf","first-half","fh","half-time","half time","halftime","ht","second half","secondhalf","second-half","sh","extra time","extratime","extra time","et","overtime","overtime(deprecated)","ot","penalty","penalties","penalty shoot-out","penalty shootout"];function escapeHtml_TC(e){return String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function getDetailUrl_TC(e,t){return window.DV2StreamLinks.getDetailUrl(e,t,{trailingSlash:!0})}function renderTcBlvAvatar(e,t){const a=e?.avatar;return a?`\n      <div class="dv2-commentator-avatar">\n        <img src="${escapeHtml_TC(a)}" alt="${escapeHtml_TC(t)}" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'">\n      </div>\n    `:`<div class="dv2-commentator-avatar">${escapeHtml_TC(t?t.charAt(0):"?")}</div>`}$(document).ready(function(){$(".dv2-layout-tc.dv2-home-matches").length>0&&function loadHomeData_TC(){const n=new Date,i=new Date(n);i.setDate(i.getDate()+1);const o=new Date(n);o.setDate(n.getDate()-1);const s={fromDate:o.toISOString().split("T")[0],toDate:i.toISOString().split("T")[0]};DV2HotLeagues.load({ajax:$.ajax,setHotLeaguesRank:t=>{e.hotLeaguesRank=t}}),$.ajax({url:"https://vsc-apidev.helizones.com/api/data/lives/range-date",method:"POST",contentType:"application/json",data:JSON.stringify(s),success:function(n){if(n&&n.matches_by_date){const i=[];Object.keys(n.matches_by_date).forEach(e=>{i.push(...n.matches_by_date[e])}),function renderHomePage_TC(n){const i=new Date,o=[],s=[];n.forEach(e=>{const a=new Date(e.kickoff);t.includes(e.status.toLowerCase())?o.push(e):i<a&&s.push(e)});const r=[...o,...s],l=a(r),d=$(".dv2-layout-tc.dv2-home-matches #matchGrid");d.empty(),0!==l.length?(l.forEach(a=>{d.append(function renderMatchCard_TC(a){const n=new Date(a.kickoff||"").toLocaleDateString("en-GB",{day:"2-digit",month:"2-digit"}),i=t.includes(a.status.toLowerCase()),o=a.teams?.home||{},s=a.teams?.away||{},r=a.league?.name||"Giải đấu",l=a.league?.logo||"",d=e.hotLeaguesRank.has(a.league.id),c=a.score?.fulltime?.home??0,m=a.score?.fulltime?.away??0,v=a.status||"",u=i?"LIVE":function formatMatchTime_TC(e){return e?new Date(e).toLocaleTimeString("vi-VN",{hour:"2-digit",minute:"2-digit"}):"--:--"}(a.kickoff);let h="";return i&&("Half Time"===v?h='<div class="dv2-status-badge ht">HT</div>':"Second Half"===v&&(h='<div class="dv2-status-badge">LIVE</div>')),`\n                <div class="dv2-match-card ${d?"hot-game":""}" \n                     data-match-id="${a.match_id}"\n                     onclick="goToMatchDetail('${a.match_id}')">\n                    \n                    \x3c!-- Header --\x3e\n                    <div class="dv2-card-header">\n                        <div class="dv2-league-info">\n                            ${l?`<img src="${l}" class="dv2-league-logo" alt="${r}" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'">`:'<span class="dv2-league-logo">⚽</span>'}
1\n                            <span class="dv2-league-name">${r}</span>\n                        </div>\n                        <div style="display:flex;align-items: center;">\n                        \n                        <div class="dv2-match-time ${i?"live":"upcoming"}">${u}</div>\n                        ${i?"":`<div class="dv2-match-time upcoming">${n}</div>`}\n                        </div>\n\n                    </div>\n\n                    \x3c!-- Body --\x3e\n                    <div class="dv2-card-body">\n                        \x3c!-- Home Team --\x3e\n                        <div class="dv2-team-row">\n                            <div class="dv2-team-logo">\n                                <img src="${o.logo||"https://via.placeholder.com/36"}" \n                                     alt="${o.name}" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'">\n                            </div>\n                            <div class="dv2-team-name">${o.name||"Home Team"}</div>\n                        </div>\n\n                        ${i?`\n                            \x3c!-- Score Display --\x3e\n                            <div class="dv2-score-display">\n                                <div class="dv2-score-number">${c}</div>\n                                <div class="dv2-score-separator">:</div>\n                                <div class="dv2-score-number">${m}</div>\n                            </div>\n                        `:'\n                            \x3c!-- VS Divider --\x3e\n                            <div class="dv2-vs-divider">VS</div>\n                        '}\n\n                        \x3c!-- Away Team --\x3e\n                        <div class="dv2-team-row">\n                            <div class="dv2-team-logo">\n                                <img src="${s.logo||"https://via.placeholder.com/36"}" \n                                     alt="${s.name}" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'">\n                            </div>\n                            <div class="dv2-team-name">${s.name||"Away Team"}</div>\n                        </div>\n                    </div>\n\n                    \x3c!-- Footer --\x3e\n                    <div class="dv2-card-footer">\n                        ${function buildCommentatorDropdown_TC(e){const t=window.DV2BlvDropdown.getSortedLinks(e);return window.DV2BlvDropdown.build({match:e,links:t,getDetailUrl:getDetailUrl_TC,escapeHtml:escapeHtml_TC,menuPlacement:"up",emptyHtml:"<div></div>",toggleClass:"dv2-commentator-info",renderToggle:({link:e,label:t})=>`\n      ${renderTcBlvAvatar(e,t)}\n      <span class="dv2-commentator-name">${escapeHtml_TC(t)}</span>\n    `,renderItemContent:({link:e,label:t})=>`\n      ${renderTcBlvAvatar(e,t)}\n      <span class="dv2-commentator-name">${escapeHtml_TC(t)}</span>\n    `})}(a)}\n                        <a class="dv2-action-btn" href="${window.DV2_LINK_BET}" target="_blank" rel="nofollow"\n                           onclick="event.stopPropagation();">\n                            Đặt cược\n                        </a>\n                        <button class="dv2-action-btn" onclick="event.stopPropagation(); goToMatchDetail('${a.match_id}')">\n                            Xem Ngay\n                        </button>\n                    </div>\n                </div>\n            `}(a))}),function bindTcBlvDropdownEvents(){window.DV2BlvDropdown.bind($(".dv2-layout-tc.dv2-home-matches #matchGrid"),{namespace:"tcBlvDropdown",stopPropagationOnWrap:!0})}()):d.html('\n                    <div class="dv2-empty-state">\n                        <div style="font-size: 56px; margin-bottom: 16px; opacity: 0.3;">⚽</div>\n                        <div style="font-size: 15px;">Không có trận đấu nào</div>\n                    </div>\n                ')}(i.filter(e=>"Finished"!==e.status))}else $(".dv2-layout-tc.dv2-home-matches #matchGrid").html('\n                            <div class="dv2-empty-state">\n                                <div style="font-size: 56px; margin-bottom: 16px; opacity: 0.3;">⚽</div>\n                                <div>Không có dữ liệu</div>\n                            </div>\n                        ')},error:function(e){console.error("Error:",e),$(".dv2-layout-tc.dv2-home-matches #matchGrid").html('\n                        <div class="dv2-empty-state">\n                            <div style="font-size: 56px; margin-bottom: 16px; opacity: 0.3;">❌</div>\n                            <div>Lỗi tải dữ liệu</div>\n                        </div>\n                    ')}})}()});const a=DV2MatchSort.createSortedMatchesFunction({mode:"wc-first",liveStatuses:t,hotLeaguesRank:()=>e.hotLeaguesRank});window.goToMatchDetail=function goToMatchDetail(e){window.location.href=`/stream
1s?match=${e}`}}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery,Hls){function createNotFoundMatchOverlay_VB(e){const t=e?.matchInfo?.kickoff,a=e?.league?.name,n=e?.teams?.home?.name||"Home",i=e?.teams?.away?.name||"Away",o=function renderStatusMatch_VB(e){const t=new Date;new Date(t).setHours(0,0,0,0),new Date(t).setHours(23,59,59,999);const a=e instanceof Date?e:new Date(e);let n="";if(a>t)n=Math.round((a-t)/6e4)<=30?"sắp bắt đầu":"chưa diễn ra";else{const e=new Date(a);e.setHours(e.getHours()+2),n=t<=e?"đang diễn ra":"đã kết thúc"}return n}(t);return $(`\n            <div class="dv2-loading">\n                Trận đấu ${o}: <strong>${n} - ${i}</strong>\n                <div class="dv2-load-league">\n                    <span>Giải đấu: <strong>${a}</strong></span>\n                </div>\n                <div class="dv2-load-time">\n                    <span>Thời gian: ${formatTime_VB(t)} - ${getDateLabel_VB(t)}</span>\n                </div>\n            </div>\n        `)}function getDateLabel_VB(e){const t=new Date,a=new Date(t);a.setDate(a.getDate()+1);const n=new Date(e);return t.setHours(0,0,0,0),a.setHours(0,0,0,0),n.setHours(0,0,0,0),n.getTime()===t.getTime()?"Hôm nay":n.getTime()===a.getTime()?"Ngày mai":`${String(n.getDate()).padStart(2,"0")}/${String(n.getMonth()+1).padStart(2,"0")}`}function formatTime_VB(e){if(!e)return"";const t=new Date(e);return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}($=jQuery.noConflict())(document).ready(function(){$(".dv2-layout-vb.dv2-detail-livestream").length>0&&function renderDetailMatch_VB(){const e=$(".dv2-layout-vb.dv2-detail-livestream .dv2-video-wrapper"),t=$(".dv2-layout-vb.dv2-detail-livestream .dv2-match-info"),a="https://img.freepik.com/premium-photo/close-up-soccer-player-who-kicks-ball_207634-4089.jpg";let n=new URLSearchParams(window.location.search).get("match");if(n||(n="undefined"!=typeof DV2_MATCH_ID&&DV2_MATCH_ID?DV2_MATCH_ID:"2y8m4zh54p4zql0"),!n)return void e.html('<div class="dv2-notfound-video">❌ Không có ID livestream hợp lệ</div>');console.log("[VSC LIVE] Load livestream detail cho ID:",n);const i=$('\n    <div class="dv2-loading">\n      Đang tải video...\n    </div>\n  ');e.append(i);const o=$("<video>",{id:"liveVideo",controls:!0,autoplay:!0,muted:!0,playsinline:!0,poster:a});e.append(o),$.ajax({url:`https://vsc-apidev.helizones.com/api/data/lives/${n}`,method:"GET",success:function(a){console.log("[VSC LIVE] API response:",a);const n=a?.data;if(r=n||r,n){i.remove();const e=n?.teams?.home?.name,a=n?.teams?.away?.name,o=n?.teams?.home?.logo,s=n?.teams?.away?.logo,r=n?.league?.name,l=n?.league?.logo,d=n?.matchInfo?.kickoff,c=n?.score?.fulltime?.home,m=n?.score?.fulltime?.away,v=`\n                <div class="dv2-league">\n                    <img class="dv2-league-logo" id="leagueLogo" src="${l}" alt="League Logo">\n                    <span class="dv2-league-name" id="leagueName">${r}</span>\n                </div>\n                <div class="dv2-teams">\n                    <div class="dv2-team">\n                        <img class="dv2-home-logo" id="homeLogo" src="${o}" alt="Home Team">\n                        <span class="dv2-home-name" id="homeName">${e}</span>\n                    </div>\n                    <div class="dv2-score" id="score">${c} - ${m}</div>\n                    <div class="dv2-team">\n                        <img class="dv2-away-logo" id="awayLogo" src="${s}" alt="Away Team">\n                        <span class="dv2-away-name" id="awayName">${a}</span>\n                    </div>\n                </div>\n                <div class="dv2-match-time" id="matchTime">Thời gian diễn ra trận đấu: ${formatTime_VB(d)} - ${getDateLabel_VB(d)}</div>\n            `;t.append(v)}if(!n||!n.livestream)return e.html('<div class="dv2-not-loaded">🚫 Không có luồng livestream</div>'),void e.append(o);const s=new Date(n?.matchInfo?.kickoff);if(!Number.isNaN(s.getTime())&&s.getTime()-Date.now()>9e5){const t=createNotFoundMatchOverlay_VB(n);return void e.append(t)}const l=n?.livestream?.links[0]?.url||"";if(!l)return void e.html('<div class="dv2-not-loaded">Không tìm thấy video livestream</div>');const d=$(".dv2-stream-links"),c=Array.isArray(n?.livestream?.links)?n.livestream.links.map((e,t)=>`<span data-index="${t}" data-stream-url=${e.url}>Link ${t+1}</span>`):null;
1d.html(c),d.on("click","span",function(e){e.preventDefault(),e.stopPropagation(),initHLSPlayer($(this).data("stream-url"))}),window.DV2StreamTvc?.playBeforeStream?window.DV2StreamTvc.playBeforeStream(e,()=>initHLSPlayer(l)):initHLSPlayer(l)},error:function(t){console.error("[VSC LIVE] Lỗi khi gọi API:",t),e.html('<div class="dv2-not-loaded">Không thể tải dữ liệu livestream</div>')}});let s=null,r=null;function initHLSPlayer(t){if(!t)return;let n=!1;const showFallbackOverlay=()=>{if(n)return;if(n=!0,i.remove(),s){try{s.destroy()}catch(e){console.warn(e)}s=null}r&&e.append(createNotFoundMatchOverlay_VB(r));const t=$("<video>",{id:"liveVideo",controls:!0,autoplay:!1,muted:!0,playsinline:!0,poster:a});e.append(t)};if(s){try{s.destroy()}catch(e){console.warn(e)}s=null}if(Hls.isSupported()){const e=setTimeout(()=>showFallbackOverlay(),15e3);s=new Hls({maxBufferLength:10,liveSyncDuration:3,enableWorker:!0,xhrSetup:function(e,t){e.withCredentials=!1,e.referrerPolicy="no-referrer-when-downgrade"}}),s.loadSource(t),s.attachMedia(o[0]),s.on(Hls.Events.MANIFEST_PARSED,function(){clearTimeout(e),i.remove(),o[0].muted=!0,o[0].play().catch(()=>console.warn("Autoplay bị chặn"))}),s.on(Hls.Events.ERROR,function(t,a){a?.fatal&&(clearTimeout(e),showFallbackOverlay())}),o.off("error.vb").on("error.vb",showFallbackOverlay)}else if(o[0].canPlayType("application/vnd.apple.mpegurl")){const e=setTimeout(()=>showFallbackOverlay(),15e3);o.attr("src",t),o.off("loadedmetadata.vb").on("loadedmetadata.vb",function(){clearTimeout(e),i.remove(),o[0].play().catch(()=>console.warn("Autoplay bị chặn"))}),o.off("error.vb").on("error.vb",function(){clearTimeout(e),showFallbackOverlay()})}else showFallbackOverlay()}}()})}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery){($=jQuery.noConflict())(document).ready(function(){$(".dv2-layout-vb.dv2-result-matchs").length>0&&(function updateDateTime_VB(){const e=new Date;$(".dv2-layout-vb.dv2-result-matchs #currentDateTime").text(e.toLocaleDateString("vi-VN",{weekday:"long",year:"numeric",month:"long",day:"numeric"}))}(),function loadResultsData_VB(){const e=new Date,t=new Date(e);t.setDate(t.getDate()-1);const a={fromDate:t.toISOString().split("T")[0],toDate:e.toISOString().split("T")[0]};$.ajax({url:"https://vsc-apidev.helizones.com/api/data/lives/range-date",method:"POST",contentType:"application/json",data:JSON.stringify(a),success:function(e){if(e&&e.matches_by_date){const t=[];Object.keys(e.matches_by_date).forEach(a=>{t.push(...e.matches_by_date[a])}),function renderResultsPage_VB(e){const t=new Date,a=e.filter(e=>{const a=new Date(e.kickoff),n=new Date(a.getTime()+72e5);return t>n});a.sort((e,t)=>new Date(t.kickoff)-new Date(e.kickoff));const n=$(".dv2-layout-vb.dv2-result-matchs .dv2-results-container");if(n.empty(),0===a.length)return void n.html('\n                    <div class="dv2-empty-state">\n                        <div style="font-size: 56px; margin-bottom: 16px; opacity: 0.3;">⚽</div>\n                        <div style="font-size: 15px;">Chưa có trận đấu nào kết thúc</div>\n                    </div>\n                ');const i=function groupMatchesByLeague_VB(e){const t={};return e.forEach(e=>{const a=e?.league?.name||"Giải đấu khác";t[a]||(t[a]=[]),t[a].push(e)}),t}(a);
1Object.keys(i).forEach(e=>{const t=i[e],a=t[0]?.league?.logo||"",o=`\n                    <div class="dv2-league-section">\n                        <div class="dv2-league-header">\n                            ${a?`<img src="${a}" class="dv2-league-logo" alt="${e}">`:""}\n                            <h3 class="dv2-league-title">${e}</h3>\n                        </div>\n\n                        <div class="dv2-match-headers">\n                            <div></div>\n                            <div>Chủ nhà</div>\n                            <div>Tỷ số</div>\n                            <div>Khách</div>\n                            <div></div>\n                            <div>HT | FT</div>\n                        </div>\n\n                        ${t.map(e=>function renderMatchCard_VB(e){const t=function formatMatchTime_VB(e){const t=new Date(e);return`${String(t.getDate()).padStart(2,"0")}/${String(t.getMonth()+1).padStart(2,"0")} - ${t.toLocaleTimeString("vi-VN",{hour:"2-digit",minute:"2-digit"})}`}(e.kickoff),a=e?.teams?.home||{},n=e?.teams?.away||{},i=e?.score?.fulltime?.home??0,o=e?.score?.fulltime?.away??0,s=e?.score?.halftime?.home??0,r=e?.score?.halftime?.away??0,l=function generateStats_VB(e,t,a){return{htFt:`${a} - ${e}`,ht1:Math.floor(3*Math.random()),ft1:Math.floor(5*Math.random()),yellowTotal:Math.floor(7*Math.random()),yellow1:Math.floor(4*Math.random()),yellow2:Math.floor(4*Math.random()),redTotal:Math.floor(2*Math.random()),red1:Math.floor(2*Math.random()),red2:Math.floor(2*Math.random()),corner1:Math.floor(8*Math.random()),corner2:Math.floor(8*Math.random()),shot1:Math.floor(15*Math.random()),shot2:Math.floor(15*Math.random())}}(i,0,s);return`\n                <div class="dv2-match-card" \n                     data-match-id="${e.match_id||e.id}"\n                     onclick="goToMatchDetail('${e.match_id||e.id}')">\n                    \n                    \x3c!-- Time --\x3e\n                    <div class="dv2-time-col">\n                        <div class="dv2-match-time">${t}</div>\n                    </div>\n\n                    \x3c!-- Home team --\x3e\n                    <div class="dv2-team-home">\n                        <div class="dv2-team-name" style="text-align: right;">${a.name||"Home"}</div>\n                        <div class="dv2-team-logo">\n                            <img src="${a.logo}" \n                                 alt="${a.name}">\n                        </div>\n                    </div>\n\n                    \x3c!-- Score --\x3e\n                    <div class="dv2-score-col">\n                        <div class="dv2-score-box">\n                            <div class="dv2-score-number">${i}</div>\n                            <div class="dv2-score-separator">:</div>\n                            <div class="dv2-score-number">${o}</div>\n                        </div>\n                        <div class="dv2-halftime">HT ${s}:${r}</div>\n                    </div>\n\n                    \x3c!-- Away team --\x3e\n                    <div class="dv2-team-away">\n                        <div class="dv2-team-logo">\n                            <img src="${n.logo}" \n                                 alt="${n.name}">\n                        </div>\n                        <div class="dv2-team-name">${n.name||"Away"}</div>\n                    </div>\n\n                    \x3c!-- Highlight button --\x3e\n                    <div class="dv2-highlight-col">\n                        <button class="dv2-highlight-btn" \n                                onclick="event.stopPropagation(); viewHighlight('${e.match_id}')">\n                            XEM HIGHLIGHT\n                        </button>\n                    </div>\n\n                    \x3c!-- Stats --\x3e\n                    <div class="dv2-stats-col">\n                        \x3c!-- HT --\x3e\n                        <div class="dv2-stat-group">\n                            <div class="dv2-stat-main">${s} : ${r}</div>\n                            <div class="dv2-stat-label">HT</div>\n                        </div>\n\n                        \x3c!-- HT | FT --\x3e\n                        <div class="dv2-stat-group">\n                            <div class="dv2-stat-main" style="color: #10b981;">${l.htFt}</div>\n                            <div class="dv2-stat-detail">
1\n                                <span class="dv2-stat-value">${l.ht1} : ${l.ft1}</span>\n                            </div>\n                        </div>\n\n                        \x3c!-- Yellow cards --\x3e\n                        <div class="dv2-stat-group">\n                            <div class="dv2-stat-main" style="color: #fbbf24;">${l.yellowTotal}</div>\n                            <div class="dv2-stat-detail">\n                                <span class="dv2-stat-value">${l.yellow1} - ${l.yellow2}</span>\n                            </div>\n                        </div>\n\n                        \x3c!-- Red cards --\x3e\n                        <div class="dv2-stat-group">\n                            <div class="dv2-stat-main" style="color: #ef4444;">${l.redTotal}</div>\n                            <div class="dv2-stat-detail">\n                                <span class="dv2-stat-value">${l.red1} - ${l.red2}</span>\n                            </div>\n                        </div>\n\n                        \x3c!-- More stats --\x3e\n                        <div class="dv2-stat-group">\n                            <div class="dv2-stat-detail">\n                                <span class="dv2-stat-value">${l.corner1} - ${l.corner2}</span>\n                            </div>\n                            <div class="dv2-stat-detail">\n                                <span class="dv2-stat-value">${l.shot1} - ${l.shot2}</span>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            `}(e)).join("")}\n                    </div>\n                `;n.append(o)})}(t)}else $(".dv2-layout-vb.dv2-result-matchs .dv2-results-container").html('<div class="dv2-empty-state">Không có dữ liệu</div>')},error:function(e){console.error("Error:",e),$(".dv2-layout-vb.dv2-result-matchs .dv2-results-container").html('<div class="dv2-empty-state">Lỗi tải dữ liệu</div>')}})}())}),window.goToMatchDetail=function goToMatchDetail(e){window.location.href=`/streams/${e}`},window.viewHighlight=function viewHighlight(e){window.location.href=`/highlights/${e}`}}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery){function renderHomeMatches_VB(e,t="all"){const a=new Date,n=e.filter(e=>{const n=new Date(e.kickoff),i=new Date(n.getTime()+72e5);if("live"===t)return a>=n&&a<=i;if("today"===t){new Date(a).setHours(0,0,0,0);const e=new Date(a);return e.setHours(23,59,59,999),n>a&&n<=e}return i>=a}).sort((e,t)=>new Date(e.kickoff)-new Date(t.kickoff)),i=$(".dv2-layout-vb.dv2-calendar-matchs .dv2-home-container");if(i.empty(),!n.length)return void i.html('<div class="dv2-empty-state">Không có trận đấu</div>');const o=function groupMatchesByLeague_VB(e){const t={};return e.forEach(e=>{const a=e.league?.name||"Giải đấu khác";t[a]||(t[a]=[]),t[a].push(e)}),t}(n);Object.keys(o).forEach(e=>{const t=o[e][0]?.league?.logo||"",a=o[e].map(e=>function renderHomeMatchCard_VB(e){const t=new Date(e.kickoff),a=e.teams?.home||{},n=e.teams?.away||{},i=function formatMatchTime_VB(e){const t=new Date(e);return`${String(t.getDate()).padStart(2,"0")}/${String(t.getMonth()+1).padStart(2,"0")} - ${t.toLocaleTimeString("vi-VN",{hour:"2-digit",minute:"2-digit"})}`}(t),o=e?.livestream?.links;return`\n                <div class="dv2-match-card" onclick="goToMatchDetail('${e.match_id}')">\n                <div class="dv2-time-col">${i}</div>\n                <div class="dv2-teams-col">\n                    <div class="dv2-team">\n                    <div class="dv2-team-name" style="text-align: right;">${a.name}</div>\n                    <div class="dv2-team-logo"><img src="${a.logo}" alt="${a.name}"></div>\n                    </div>\n                    <div class="dv2-vs">vs</div>\n                    <div class="dv2-team">\n                    <div class="dv2-team-logo"><img src="${n.logo}" alt="${n.name}"></div>\n                    <div class="dv2-team-name">${n.name}</div>\n                    </div>\n                </div>\n                ${o.length>0?`\n                    <div class="dv2-commentators">\n                        ${o.slice(0,4).map(e=>`\n                            <div class="dv2-commentator" \n                                data-commentator-id="${e.commentatorId||""}"\n                                onclick="event.stopPropagation(); goToBLVPage('${e.commentatorId||""}')">\n                                <div class="dv2-commentator-avatar">\n                                    ${e.avatar?`<img src="${e.avatar}" alt="${e.commentator}">`:e.commentator.charAt(0)}\n                                </div>
1\n                                <span class="dv2-commentator-name">${e.commentator}</span>\n                            </div>\n                        `).join("")}\n                        ${o.length>4?`<div class="dv2-commentator-more">+${o.length-4}</div>`:""}\n                    </div>\n                `:""}\n                </div>\n            `}(e)).join("");i.append(`\n                    <div class="dv2-league-section">\n                        <div class="dv2-league-header">\n                        ${t?`<img src="${t}" class="dv2-league-logo">`:""}\n                        <div class="dv2-league-title">${e}</div>\n                        </div>\n                        ${a}\n                    </div>\n                `)})}($=jQuery.noConflict())(document).ready(()=>{$(".dv2-layout-vb.dv2-calendar-matchs").length>0&&(function updateDateTime_VB(){const e=new Date;$(".dv2-layout-vb.dv2-calendar-matchs #currentDateTime").text(e.toLocaleDateString("vi-VN",{weekday:"long",year:"numeric",month:"long",day:"numeric"}))}(),function loadHomeMatchesData_VB(){const e=new Date,t=new Date(e);t.setDate(e.getDate()+1);const a={fromDate:e.toISOString().split("T")[0],toDate:t.toISOString().split("T")[0]};$.ajax({url:"https://vsc-apidev.helizones.com/api/data/lives/range-date",method:"POST",contentType:"application/json",data:JSON.stringify(a),success:e=>{if(e&&e.matches_by_date){const t=[];Object.keys(e.matches_by_date).forEach(a=>t.push(...e.matches_by_date[a])),renderHomeMatches_VB(t),function setupFilterButtons_VB(e){$(".dv2-layout-vb.dv2-calendar-matchs .dv2-filter-btn").off("click").on("click",function(){$(".dv2-layout-vb.dv2-calendar-matchs .dv2-filter-btn").removeClass("active"),$(this).addClass("active"),renderHomeMatches_VB(e,$(this).data("filter"))})}(t)}else $(".dv2-layout-vb.dv2-calendar-matchs .dv2-home-container").html('<div class="dv2-empty-state">Không có dữ liệu</div>')},error:()=>$(".dv2-layout-vb.dv2-calendar-matchs .dv2-home-container").html('<div class="dv2-empty-state">Lỗi tải dữ liệu</div>')})}())}),window.goToMatchDetail=function goToMatchDetail(e){window.location.href=`/streams/${e}`}}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery){($=jQuery.noConflict())(document).ready(function(){$(".dv2-layout-vb.dv2-home-matchs").length>0&&function renderListMatchs_VB(){const e=$(".dv2-layout-vb.dv2-home-matchs"),t=e.find(".dv2-match-grid");0===e.find(".dv2-loading").length&&e.append('\n            <div class="dv2-loading">\n                <div class="dv2-spinner"></div>\n            </div>\n        ');const a=new Date,n=new Date;n.setDate(a.getDate()+7);const i={fromDate:a.toISOString().split("T")[0],toDate:n.toISOString().split("T")[0]};$.ajax({url:"https://vsc-apidev.helizones.com/api/data/lives/range-date",method:"POST",headers:{"Content-Type":"application/json"},data:JSON.stringify(i),dataType:"json",success:function(a){e.find(".dv2-loading").remove();const n=[];if(Object.values(a.matches_by_date||{}).forEach(e=>{Array.isArray(e)&&n.push(...e)}),!n.length)return void t.html('<div class="dv2-empty-state">Không có trận đấu nào trong 7 ngày tới</div>');const i=n.map(e=>{const t=e.kickoff?new Date(e.kickoff):null,a=t?new Date(t.getTime()+72e5):null,n=new Date;let i="Sắp diễn ra";return t&&n>=t&&n<=a&&e.livestream.available?i="LIVE":t&&n>a&&(i="Kết thúc"),{id:e.match_id,slug:e.slug||"",homeLogo:e?.teams?.home?.logo||"",awayLogo:e?.teams?.away?.logo||"",homeName:e?.teams?.home?.name||"Đội nhà",awayName:e?.teams?.away?.name||"Đội khách",kickoff:t,league:e?.league?.name||"Giải đấu",leagueLogo:e?.league?.logo||"",livestream:e.livestream,links:e?.livestream?.links||[],scoreHalftime:e?.score?.halftime||{home:"-",away:"-"},scoreFulltime:e?.score?.fulltime||{home:"-",away:"-"},status:i}}),o=new Date,s=[],r=[];i.forEach(e=>{const t=new Date(e.kickoff),a=new Date(t.getTime()+72e5);o>=t&&o<=a&&e.livestream.available?s.push(e):o<t&&r.push(e)});const l=[...s,...r];!function updateFilterCounts_VB(e){const t=new Date,a=new Date(t);a.setHours(0,0,0,0);const n=new Date(t);n.setHours(23,59,59,999);const i=new Date(a);i.setDate(a.getDate()+7);const o=e.filter(e=>e.kickoff>=a&&e.kickoff<=i).length,s=e.filter(e=>"LIVE"===e.status).length,r=e.filter(e=>e.kickoff>=a&&e.kickoff<=n).length;$('.dv2-layout-vb.dv2-home-matchs .dv2-filter-btn[data-filter="all"]').text(`Tất cả (${o})`),$('.dv2-layout-vb.dv2-home-matchs .dv2-filter-btn[data-filter="live"]').text(`Đang live (${s})`),$('.dv2-layout-vb.dv2-home-matchs .dv2-filter-btn[data-filter="today"]').text(`Hôm nay (${r})`)}(l),function setupFilterButtons_VB(e){$(".dv2-layout-vb.dv2-home-matchs .dv2-filter-btn").off("
1click").on("click",function(){$(".dv2-layout-vb.dv2-home-matchs .dv2-filter-btn").removeClass("dv2-active"),$(this).addClass("dv2-active");const t=$(this).data("filter");renderHomeMatches_VB(e,t)})}(l),renderHomeMatches_VB(l,"live")},error:function(e){console.error("[VSC LIVE] API error:",e),t.html('<div class="dv2-empty-state">Lỗi khi tải dữ liệu</div>')}})}()});let e=0,t=[];function renderHomeMatches_VB(a,n="live"){const i=new Date,o=new Date(i);o.setHours(0,0,0,0);const s=new Date(i);s.setHours(23,59,59,999);const r=new Date(o);r.setDate(o.getDate()+7);let l=a.filter(e=>"live"===n?"LIVE"===e.status:"today"===n?e.kickoff>=o&&e.kickoff<=s:"all"!==n||e.kickoff>=o&&e.kickoff<=r);l.sort((e,t)=>"LIVE"===e.status&&"LIVE"!==t.status?-1:"LIVE"!==e.status&&"LIVE"===t.status?1:new Date(e.kickoff)-new Date(t.kickoff)),t=l,e=0;const d=$(".dv2-layout-vb.dv2-home-matchs .dv2-match-grid");if(d.empty(),!l.length)return d.html('<div class="dv2-empty-state">\n                        <div style="font-size: 56px; opacity: 0.3;">⚽</div>\n                        <div style="font-size: 15px;">Không có trận đấu nào</div>\n                    </div>'),void $(".dv2-loadmore").hide();renderNextMatchesBatch_VB(),$(".dv2-layout-vb.dv2-home-matchs .dv2-load-more-btn").off("click").on("click",renderNextMatchesBatch_VB)}function renderNextMatchesBatch_VB(){const a=$(".dv2-layout-vb.dv2-home-matchs .dv2-match-grid"),n=t.slice(e,e+10);n.forEach(e=>{const t=$(function renderMatchCard_VB(e){const t=e.kickoff||"",a=function getDateLabel_VB(e){if(!e)return"";const t=new Date(e);return t.setHours(0,0,0,0),`${String(t.getDate()).padStart(2,"0")}/${String(t.getMonth()+1).padStart(2,"0")}`}(t),n=t?function formatTime_VB(e){if(!e)return"";const t=new Date(e);return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}(t):"",i="LIVE"===e.status?"dv2-status-live":"Sắp diễn ra"===e.status?"dv2-status-scheduled":"dv2-status-finished";return`\n        <div class="dv2-match-card" data-id="${e.id}">\n            <div class="dv2-match-header">\n                <div class="dv2-league-info">\n                    <span class="dv2-league-name">${e.league}</span>\n                </div>\n                <div style="display: flex; align-items: center; gap: 12px;">\n                    <span class="dv2-match-status ${i}">\n                        ${"LIVE"===e.status?"● LIVE":"Sắp diễn ra"===e.status?"Sắp diễn ra":"Kết thúc"}\n                    </span>\n                    <span class="dv2-match-time">${n} - ${a}</span>\n                </div>\n            </div>\n            <div class="dv2-match-content">\n                <div class="dv2-team">\n                <div class="dv2-team-name">${e.homeName}</div>\n                <div class="dv2-team-logo"><img src="${e.homeLogo}" alt="${e.homeName}"></div>\n                </div>\n                <div class="dv2-score-section">\n                    <div class="dv2-score">\n                        <div class="dv2-score-number">${e.scoreFulltime.home}</div>\n                        <div class="dv2-score-separator">:</div>\n                        <div class="dv2-score-number">${e.scoreFulltime.away}</div>\n                    </div>\n                    <div class="dv2-half-time">HT ${e.scoreHalftime.home} - ${e.scoreHalftime.away}</div>\n                </div>\n                <div class="dv2-team dv2-away">\n                <div class="dv2-team-name">${e.awayName}</div>\n                    <div class="dv2-team-logo"><img src="${e.awayLogo}" alt="${e.awayName}"></div>\n                </div>\n            </div>\n            <div class="dv2-blv-box">\n                ${(e?.links||[]).map(t=>`\n                    <a class="dv2-bottom-group" href="#" data-id="${e.id}">\n                        <span class="dv2-bottom-logo">\n                            <img class="dv2-image-blv" alt="${t.commentator}"\n                                src="${t.avatar}">\n                        </span>\n                        <span class="dv2-bottom-name dv2-ellipsis">${t.commentator}</span>\n                    </a>\n                `).join("")}\n            </div>\n        </div>\n    `}(e));a.append(t),setTimeout(()=>t.addClass("fade-in"),50)}),e+=n.length,e>=t.length?$(".dv2-layout-vb.dv2-home-matchs .dv2-loadmore").fadeOut(200):$(".dv2-layout-vb.dv2-home-matchs .dv2-loadmore").show()}$(document).on("click",".dv2-layout-vb.dv2-home-matchs .dv2-match-card",function(e){e.preventDefault();const t=$(this).data("id")||"";
1window.location.href=`/streams/${t}`})}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$){window.DV2=window.DV2||{};const e={hotLeaguesRank:new Map},t=["Chủ Nhật","Thứ 2","Thứ 3","Thứ 4","Thứ 5","Thứ 6","Thứ 7"],a=["interrupt","cut in half","first half","firsthalf","first-half","fh","half-time","half time","halftime","ht","second half","secondhalf","second-half","sh","extra time","extratime","extra time","et","overtime","overtime(deprecated)","ot","penalty","penalties","penalty shoot-out","penalty shootout"];DV2.formatDateDDMM=function(e){return e&&e instanceof Date?`${String(e.getDate()).padStart(2,"0")}/${String(e.getMonth()+1).padStart(2,"0")}`:""},DV2.getVietnameseDayLabel=function(e,a){if(!(e&&e instanceof Date))return"";if(0===a)return"Hôm nay";if(1===a)return"Ngày mai";const n=e.getDay();return t[n]||""},DV2.getDateString=function(e){return e&&e instanceof Date?`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`:""},DV2.formatTimeHHMM=function(e){if(!e)return"";const t="string"==typeof e?new Date(e):e;return t instanceof Date&&!isNaN(t.getTime())?`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`:""},DV2.getDateLabel=function(e){if(!e)return"";const t=new Date,a=new Date(t);a.setDate(a.getDate()+1);const n="string"==typeof e?new Date(e):e;return n instanceof Date&&!isNaN(n.getTime())?(t.setHours(0,0,0,0),a.setHours(0,0,0,0),n.setHours(0,0,0,0),n.getTime()===t.getTime()?"Hôm nay":n.getTime()===a.getTime()?"Ngày mai":DV2.formatDateDDMM(n)):""},DV2.normalizeMatchStatus=function(e){return e&&"string"==typeof e?e.toLowerCase().trim():""},DV2.isLiveStatus=function(e){const t=DV2.normalizeMatchStatus(e);return-1!==a.indexOf(t)},DV2.isFinishedStatus=function(e){const t=DV2.normalizeMatchStatus(e);return"finished"===t||"ft"===t||"end"===t},DV2.sortedMatchesFunction=DV2MatchSort.createSortedMatchesFunction({mode:"live-first-wc",liveStatuses:a,hotLeaguesRank:()=>DV2.appState.hotLeaguesRank}),DV2.isNotStartedStatus=function(e){const t=DV2.normalizeMatchStatus(e);return"not started"===t||"scheduled"===t},DV2.fetchMatchesByDateRange=function(t,a,n,i){if(!$||"function"!=typeof $.ajax)return console.error("[COMMON] jQuery is not available"),void(i&&i({message:"jQuery is not available"}));const o={fromDate:t,toDate:a};$.ajax({url:"https://vsc-apidev.helizones.com/api/data/lives/range-date",method:"POST",contentType:"application/json",data:JSON.stringify(o),success:function(e){n&&n(e)},error:function(e,t,a){console.error("[COMMON] API Error:",a),i&&i({xhr:e,status:t,error:a})}}),DV2HotLeagues.load({url:"https://vsc-apidev.helizones.com/api/data/lives/competitions/hot",ajax:$.ajax,setHotLeaguesRank:t=>{e.hotLeaguesRank=t,DV2.appState=e}})}}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery,Hls){$=jQuery.noConflict();const e="https://img.freepik.com/premium-photo/close-up-soccer-player-who-kicks-ball_207634-4089.jpg";function resolvePosterUrl_VB2(t){return DV2StreamKickoff.resolvePosterUrl(t,e)}function applyPosterForLink_VB2(t,a){DV2StreamKickoff.applyPosterForLink(t,a,e)}function shouldShowPreMatchOverlay_VB2(e){const t=new Date(e?.matchInfo?.kickoff);return!Number.isNaN(t.getTime())&&t.getTime()-Date.now()>9e5}function applyStreamVideoLayout_VB2(e){e?.length&&e.css({width:"100%",height:"auto",maxWidth:"100%",left:"",top:"",position:""})}function renderDetailMatch_VB2(){const t=$(".dv2-layout-vb2.dv2-detail-livestream"),a=t.find(".dv2-video-wrapper"),s=t.find(".dv2-layout-vb2-header"),r=t.find(".dv2-layout-vb2-footer"),l=function getMatchId_VB2(){let e=new URLSearchParams(window.location.search).get("match");return e||(e="undefined"!=typeof DV2_MATCH_ID&&DV2_MATCH_ID?DV2_MATCH_ID:"2y8m4zh54p4zql0"),e}(),d=`https://vsc-apidev.helizones.com/api/data/lives/${l}`;if(!l)return void showErrorVideo(a,"❌ Trận đấu này không  tồn tại!");console.log("[VSC LIVE] Match ID:",l);const c=a.find("#stream-player"),m=$("<video>",{id:"liveVideo",controls:!1,autoplay:!0,muted:!0,playsinline:!0,poster:e});c.empty().append(m),applyStreamVideoLayout_VB2(m),DV2_StreamChrome.initPlayerUi(a,m),applyStreamVideoLayout_VB2(m),showStreamLoa
1ding_VB2(a,"Đang tải thông tin trận đấu..."),$.ajax({url:d,method:"GET",success:function(e){const t=e?.data;if(!t)return void showErrorVideo(a,"Trận đấu này không tồn tại!");if(function startDetailScorePoll_VB2(e){e&&(o||(o=DV2MatchScorePoll.create({container:".dv2-layout-vb2.dv2-detail-livestream"})),o.sync(e),o.start())}(t),s.show(),r.show(),function renderHeader_VB2(e,t){const a=t?.teams?.home||{},n=t?.teams?.away||{},i=t?.league||{},o=t?.matchInfo?.kickoff,s=t?.matchInfo?.status||"-",r=t?.score?.fulltime?.home??0,l=t?.score?.fulltime?.away??0,d=`<strong>${function formatTime_VB2(e){return DV2StreamKickoff.formatTime(e)}(o)}</strong> ngày ${function getDateLabel_VB2(e){const t=new Date(e);return`${String(t.getDate()).padStart(2,"0")}/${String(t.getMonth()+1).padStart(2,"0")}/${t.getFullYear()}`}(o)}`,c=`\n    <h1>${a.name||"-"} vs ${n.name||"-"} - ${d}</h1>\n    <div class="dv2-layout-vb2-header-content">\n        <p class="dv2-layout-vb2-header-content-league">\n            <img src="${i.logo||""}" alt="${i.name||"-"}"\n                onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n            > ${i.name||"-"}\n        </p>\n        <div class="dv2-layout-vb2-header-content-info">\n            <div class="dv2-layout-vb2-header-content-info-home">\n            \n                ${a.name||"-"} <img onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'" src="${a.logo||""}" alt="${a.name||"-"}">\n            </div>\n            <div class="dv2-layout-vb2-header-content-info-detail">\n                <span>${statusMatchRender(s)}</span>\n                <p><span data-dv2-score-home>${r}</span> <span>-</span> <span data-dv2-score-away>${l}</span></p>\n                <div class="dv2-layout-vb2-header-content-info-detail-time">${d}</div>\n            </div>\n            <div class="dv2-layout-vb2-header-content-info-away">\n                <img onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'" src="${n.logo||""}" alt="${n.name||"-"}"> ${n.name||"-"}\n            </div>\n        </div>\n    </div>\n    `;e.html(c)}(s,t),function renderFooterStats_VB2(e,t){const a=t?.teams?.home?.name||"-",n=t?.teams?.away?.name||"-",i=t?.stats||{},o=t?.matchInfo?.kickoff,s=DV2StreamKickoff.renderTimeDisplay(o,{useFooterTitle:!0}),r=t?.league||{},l=`\n    <p>${s}</p>\n    <p><strong class="dv2-layout-vb2-footer-title">Giải đấu:</strong> <img src="${r.logo||""}" alt="${r.name||"-"}" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"> ${r.name||"-"}</p> \n    <div class="dv2-layout-vb2-footer-info">\n        <div class="vb2-table">\n            ${renderStatRow("Thông số",a,n,!0)}\n            ${renderStatRow("Kiểm soát bóng",`${i.possession?.home??0}%`,`${i.possession?.away??0}%`)}\n            ${renderStatRow("Cú sút trúng đích",i.shotsOnTarget?.home??0,i.shotsOnTarget?.away??0)}\n            ${renderStatRow("Phạt góc",i.corners?.home??0,i.corners?.away??0)}\n            ${renderStatRow("Phạm lỗi",i.fouls?.home??0,i.fouls?.away??0)}\n        </div>\n    </div>`;e.html(l),DV2StreamKickoff.startCountdown(o)}(r,t),initStreamOddsPanel_VB2(a,t),!t?.livestream)return hideStreamLoading_VB2(a),void showMatchPosterOverlay_VB2(a,t);const l=DV2StreamLinks.sortForDetail(t.livestream.links);let d=null;if(l.length>0){const e=DV2StreamLinks.resolveActiveLink(l);d=e.activeLink,i=d,applyPosterForLink_VB2(m,d),function initStreamLinks_VB2(e=[],t=0){DV2StreamLinks.bindSpanLinks({$container:$(".dv2-layout-vb2.dv2-detail-livestream .dv2-stream-links"),links:e,activeIndex:t,streamAttr:"data-stream",onSelect(e){const t=$("#liveVideo"),a=t.closest(".dv2-video-wrapper");if(i=e,applyPosterForLink_VB2(t,e),n&&initStreamOddsPanel_VB2(a,n),shouldShowPreMatchOverlay_VB2(n)||!e?.url)return DV2_StreamChrome.clearFullChrome(a),stopStreamPlayback_VB2(t),hideStreamLoading_VB2(a),void showMatchPosterOverlay_VB2(a,n);clearMatchOverlays_VB2(a),initHLSPlayer_VB2(e.url,t,n)}})}(l,e.activeIndex),n=t}if(shouldShowPreMatchOverlay_VB2(t)){const showPreMatchOverlay=()=>
1{DV2_StreamChrome.clearFullChrome(a),hideStreamLoading_VB2(a),showMatchPosterOverlay_VB2(a,t)};return void(window.DV2StreamTvc?.playBeforeStream?window.DV2StreamTvc.playBeforeStream(a,showPreMatchOverlay):showPreMatchOverlay())}if(d?.url){const startStream=()=>initHLSPlayer_VB2(d.url,m,t);window.DV2StreamTvc?.playBeforeStream?window.DV2StreamTvc.playBeforeStream(a,startStream):startStream()}},error:function(){showErrorVideo(a,"Có lỗi xảy ra!")}})}function renderStatRow(e,t,a,n=!1){return`\n    <div class="vb2-row ${n?"vb2-head":""}">\n        <div class="vb2-col">${e}</div>\n        <div class="vb2-col">${t}</div>\n        <div class="vb2-col">${a}</div>\n    </div>`}function onHlsStreamReady_VB2(e){clearMatchOverlays_VB2(e),applyStreamVideoLayout_VB2(e.find("video").first()),n&&DV2_StreamChrome.rememberOddsMatchData?.(e,n),DV2_StreamChrome.onHlsReady(e),applyStreamVideoLayout_VB2(e.find("video").first())}function initStreamOddsPanel_VB2(e,t){e?.length&&t&&(DV2_StreamChrome.rememberOddsMatchData?.(e,t),DV2_StreamChrome.initOddsPanel?.(e,t))}$(document).ready(function($){$(".dv2-layout-vb2.dv2-detail-livestream").length&&renderDetailMatch_VB2()});const t=12e3;function showStreamLoading_VB2(e,t="Đang tải luồng phát..."){if(!e?.length)return $();hideStreamLoading_VB2(e);const a=String(t||"Đang tải luồng phát...").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),n=$(`\n        <div class="dv2-stream-loading" role="status" aria-live="polite" aria-busy="true">\n            <div class="dv2-stream-loading__panel">\n                <div class="dv2-stream-loading__spinner" aria-hidden="true"></div>\n                <p class="dv2-stream-loading__text">${a}</p>\n            </div>\n        </div>\n    `);return DV2_StreamChrome.getOverlayMount(e).append(n),DV2_StreamChrome.syncVideoStageLayout(e),n}function hideStreamLoading_VB2(e){e?.find(".dv2-stream-loading").remove()}function bindStreamLoadingUntilPlaying_VB2(e,a,n){if(!e?.length||!a)return void n?.();let i=!1;const finish=()=>{i||(i=!0,a.removeEventListener("playing",onPlaying),a.removeEventListener("canplay",onCanPlay),clearTimeout(o),hideStreamLoading_VB2(e),n?.())},onPlaying=()=>finish(),onCanPlay=()=>{a.paused||finish()};a.addEventListener("playing",onPlaying),a.addEventListener("canplay",onCanPlay);const o=setTimeout(finish,t)}let a=null,n=null,i=null,o=null,s=0,r=null,l=null;function clearVb2PlaybackTimers(){r&&(clearTimeout(r),r=null),l&&(clearTimeout(l),l=null)}function initHLSPlayer_VB2(e,t,i=null){const o=i||n,d=t?.closest(".dv2-video-wrapper");s+=1;const c=s,isStalePlayback=()=>c!==s;if(clearMatchOverlays_VB2(d),clearVb2PlaybackTimers(),!e||!t?.length)return hideStreamLoading_VB2(d),void(o&&d?.length&&showMatchPosterOverlay_VB2(d,o));showStreamLoading_VB2(d,"Đang tải luồng phát...");let m=!1;const showFallbackOverlay=()=>{!isStalePlayback()&&!m&&o&&d.length&&(m=!0,DV2_StreamChrome.clearFullChrome(d),hideStreamLoading_VB2(d),showMatchPosterOverlay_VB2(d,o))};if(a){try{a.destroy()}catch(e){}a=null}const v=t[0];Hls.isSupported()?(r=setTimeout(()=>{isStalePlayback()||(console.warn("[VSC LIVE] Manifest load timeout"),showFallbackOverlay())},15e3),a=new Hls({maxBufferLength:10,liveSyncDuration:3,enableWorker:!0,xhrSetup:function(e,t){e.withCredentials=!1,e.referrerPolicy="no-referrer-when-downgrade"}}),a.loadSource(e),a.attachMedia(v),a.on(Hls.Events.MANIFEST_PARSED,()=>{isStalePlayback()||(clearVb2PlaybackTimers(),bindStreamLoadingUntilPlaying_VB2(d,v,()=>{isStalePlayback()||onHlsStreamReady_VB2(d)}),setTimeout(()=>tryAutoPlay(v),100))}),a.on(Hls.Events.ERROR,(e,t)=>{isStalePlayback()||t?.fatal&&(clearVb2PlaybackTimers(),showFallbackOverlay())}),v.addEventListener("error",()=>{isStalePlayback()||(clearVb2PlaybackTimers(),showFallbackOverlay())},{once:!0})):v.canPlayType("application/vnd.apple.mpegurl")&&(l=setTimeout(()=>{isStalePlayback()||(console.warn("[VSC LIVE] Native HLS load timeout"),showFallbackOverlay())},15e3),v.src=e,v.addEventListener("loadedmetadata",()=>
1{isStalePlayback()||(clearVb2PlaybackTimers(),bindStreamLoadingUntilPlaying_VB2(d,v,()=>{isStalePlayback()||onHlsStreamReady_VB2(d)}),setTimeout(()=>tryAutoPlay(v),100))}),v.addEventListener("error",()=>{isStalePlayback()||(clearVb2PlaybackTimers(),showFallbackOverlay())},{once:!0})),DV2_StreamChrome.initPlayerUi(d,t)}function tryAutoPlay(e){e.muted=!0;const t=$(e).closest(".dv2-video-wrapper");t.length&&DV2_StreamChrome.syncControlsState(t,$(e)),e.play().catch(()=>console.warn("Autoplay bị chặn"))}function stopStreamPlayback_VB2(e){if(s+=1,clearVb2PlaybackTimers(),a){try{a.destroy()}catch(e){}a=null}if(!e?.length)return;const t=e[0];t.pause(),t.removeAttribute("src"),"function"==typeof t.load&&t.load()}function ensurePosterVideo_VB2(e){if(!e?.length)return $();const t=e.find("#stream-player");let a=t.find("#liveVideo");return a.length||(a=e.find("#liveVideo")),a.length?(stopStreamPlayback_VB2(a),a.attr({poster:resolvePosterUrl_VB2(i),muted:!0,playsinline:!0}),a.prop({autoplay:!1,controls:!1})):(a=$("<video>",{id:"liveVideo",controls:!1,autoplay:!1,muted:!0,playsinline:!0,poster:resolvePosterUrl_VB2(i)}),t.length?t.empty().append(a):e.append(a)),DV2_StreamChrome.applyVideoControls(a),DV2_StreamChrome.ensureControlsBar(e),applyStreamVideoLayout_VB2(a),a}function clearMatchOverlays_VB2(e){e.find(".dv2-loading.dv2-match-overlay, .dv2-not-loaded.dv2-match-overlay").remove()}function showMatchPosterOverlay_VB2(e,t){if(e?.length){if(hideStreamLoading_VB2(e),e.find(".dv2-loading").not(".dv2-match-overlay").remove(),clearMatchOverlays_VB2(e),ensurePosterVideo_VB2(e),t){const a=function createNotFoundMatchOverlay_VB2(e){const t=e?.matchInfo?.kickoff,a=e?.league,n=e?.teams?.home?.name||"Home",i=e?.teams?.away?.name||"Away",o=e?.matchInfo?.status;return $(`\n            <div class="dv2-loading">\n                <span class="dv2-loading-status">${statusMatchRender(o)}</span>\n                Trận đấu: <strong>${n} - ${i}</strong>\n                <div class="dv2-load-league">\n                    <span>Giải đấu: <strong> <img src="${a.logo||""}" alt="${a.name||"-"}" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"> ${a.name||"-"}</strong></span>\n                </div>\n                <div class="dv2-load-time">\n                    <span>${DV2StreamKickoff.renderTimeDisplay(t)}</span>\n                </div>\n            </div>\n        `)}(t);a.addClass("dv2-match-overlay"),DV2_StreamChrome.getOverlayMount(e).append(a)}DV2_StreamChrome.bindEvents(e),DV2_StreamChrome.syncVideoStageLayout(e),DV2StreamKickoff.startCountdown(t?.matchInfo?.kickoff)}}function showErrorVideo(e,t=""){const a=e.hasClass("dv2-video-wrapper")?e:e.find(".dv2-video-wrapper").first();if(!a.length)return void e.html(`<div class="dv2-not-loaded"><div class="dv2-no-stream-title">${t}</div></div>`);hideStreamLoading_VB2(a),a.find(".dv2-loading").not(".dv2-match-overlay").remove(),clearMatchOverlays_VB2(a),ensurePosterVideo_VB2(a);const n=$(`\n        <div class="dv2-not-loaded dv2-match-overlay">\n            <div class="dv2-no-stream" id="noStreamMessage">\n                <div class="dv2-no-stream-icon">🚫</div>\n                <div class="dv2-no-stream-title">${t}</div>\n                <div class="dv2-no-stream-subtitle">\n                    Trận đấu này hiện chưa có luồng phát trực tiếp hoặc bị lỗi.<br>\n                    Vui lòng quay lại sau hoặc xem các trận đấu khác.\n                </div>\n            </div>\n        </div>\n    `);DV2_StreamChrome.getOverlayMount(a).append(n),DV2_StreamChrome.bindEvents(a),DV2_StreamChrome.syncVideoStageLayout(a)}function statusMatchRender(e){return{"not started":"Sắp diễn ra","to be determined":"Chưa xác định",delay:"Trì hoãn",interrupt:"Tạm dừng","cut in half":"Bị cắt hiệp",postponed:"Hoãn trận",suspended:"Tạm hoãn",abandoned:"Bỏ dở",cancel:"Hủy trận","abnormal(suggest hiding)":"Trạng thái bất thường","first half":"Đang thi đấu",firsthalf:"Đang thi đấu","first-half":"Đang thi đấu",fh:"Đang thi đấu","half-time":"Nghỉ giữa hiệp","half time":"Nghỉ giữa hiệp",halftime:"Nghỉ giữa hiệp",ht:"Nghỉ giữa hiệp","second half":"Đang thi đấu",secondhalf:"Đang thi đấu","second-half":"Đang thi đấu",sh:"Đang thi đấu","extra time":"Hiệp phụ",extratime:"Hiệp phụ",et:"Hiệp phụ",overtime:"Hiệp phụ","overtime(deprecated)":"Hiệp phụ",ot:"Hiệp phụ",penalty:"Luân lưu",penalties:"Luân lưu","penalty shoot-out":"Luân lưu","penalty shootout":"Luân lưu",finished:"Đã kết thúc",ft:"Đã kết thúc",end:"Đã kết thúc",walkover:"Thắng xử thua"}[e?e.toLowerCase():""]||"Không xác định"}}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery){$=jQuery.noConflict();let e=-1,t={},a=!1;function isNhaDaiLivestreamLink(e){if(!e)return!1;if(1e17===e.commentatorId)return!0;const t=String(e.commentator||"").trim().toLowerCase();return"nhà đài"===t||"nha dai"===t||"blv nhà đài"===t}function updateHeaderText(e){const t=$(".match_date_text");if(!t.length)return;const n=new Date(e+"T00:00:00"),i=new Date;i.setHours(0,0,0,0);const o=new Date(i);o.setDate(o.getDate()-1);const s=new Date(i);s.setDate(s.getDate()+1),n.setHours(0,0,0,0);let r="";
1const l=`${DV2.formatDateDDMM(n)}/${n.getFullYear()}`;if(r=n.getTime()===i.getTime()?`Hôm nay (${l})`:n.getTime()===o.getTime()?`Hôm qua (${l})`:n.getTime()===s.getTime()?`Ngày mai (${l})`:l,t.text(r),a){const e=$("#page-heading");e.length&&e.html(`TRỰC TIẾP LỊCH THI ĐẤU BÓNG ĐÁ ${r} CẬP NHẬT 24H VEBO TV`);const t=$("#page-description");t.length&&t.html(`Trực tiếp lịch thi đấu ${r} mới nhất sẽ được cập nhật liên tục 24h. Cứ khi nào có bóng đá thì BXH cũng sẽ được cập nhật ngay trong giờ đấu đang diễn ra. Các fan hâm mộ có thể theo dõi nhiều hơn nữa BXH các giải nhỏ cho tới giải to trên toàn thế giới tại VeboTV.`)}}function showLoading(){const e=$("#match_list_container");e.length&&(e.find(".match_box").remove(),e.find(".no-matches").remove(),e.find(".loading-container").remove(),e.append('\n    <div class="loading-container">\n      <div>\n        <div class="loading-spinner"></div>\n        <div class="loading-text">Đang tải dữ liệu...</div>\n      </div>\n    </div>\n  '))}function hideLoading(){const e=$("#match_list_container");e.length&&e.find(".loading-container").remove()}function isMatchLive(e){if(!e||!e.kickoff)return!1;const t=e.status||"";if(DV2.isLiveStatus(t))return!0;if(e.livestream&&e.livestream.available){const t=new Date,a=new Date(e.kickoff),n=new Date(a.getTime()+72e5);return a<=t&&t<=n}return!1}function renderMatchList(e,t){if(!Array.isArray(e)||0===e.length)return'<div class="no-matches">Không có trận đấu nào</div>';let n=[];if(n=a?e.filter(function(e){return!(!e||!e.status)&&(isMatchLive(e)||DV2.isNotStartedStatus(e.status))}):e.filter(function(e){return!(!e||!e.status)&&(DV2.isFinishedStatus(e.status)||isMatchLive(e))}),0===n.length)return'<div class="no-matches">Không có trận đấu nào</div>';const i=function groupMatchesByLeague(e){const t={};return e.forEach(function(e){const a=e.league?.id||"unknown",n=e.league?.name||"Unknown League";t[a]||(t[a]={league:e.league,leagueName:n,matches:[]}),t[a].matches.push(e)}),t}(n);
1Object.keys(i).forEach(function(e){const a=i[e];a.matches=function sortMatches(e,t){if(!Array.isArray(e)||0===e.length)return[];const a=new Date,n=t===DV2.getDateString(a);return e.slice().sort(function(e,t){if(n){const a=isMatchLive(e),n=isMatchLive(t);if(a&&!n)return-1;if(!a&&n)return 1;if(a&&n){const a=e.currentMinutes||0,n=t.currentMinutes||0;return a!==n?n-a:new Date(e.kickoff||0).getTime()-new Date(t.kickoff||0).getTime()}const i=new Date(e.kickoff||0).getTime();return new Date(t.kickoff||0).getTime()-i}return new Date(e.kickoff||0).getTime()-new Date(t.kickoff||0).getTime()})}(a.matches,t)});let o="";return DV2.sortedMatchesFunction(e).forEach(function(e){const t=DV2.appState.hotLeaguesRank.has(e.league.id);o+=`\n      <div class="match_box match_item--box ${t?"hot-match":""}">\n        <div class="mb_-header">\n          <span class="item-league match_item--league">\n            ${e.league?.logo?`\n              <i class="league-icon mr-2">\n                <img loading="lazy" class="match_item--league-icon" src="${e.league?.logo}" alt="${e.league?.name}"\n                  onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                 />\n              </i>\n            `:""}\n            <span class="item-league__name match_item--league-name">\n              ${e.league?.name}\n            </span>\n          </span>\n        </div>\n        <div class="match_list match_list-list match_item--list">\n    `,o+=function renderMatchItem(e){if(!e)return"";const t=e.match_id||"",a=e.slug||"",n=e.teams?.home||{},i=e.teams?.away||{},o=n.name||"",s=i.name||"",r=n.logo||"",l=i.logo||"",d=new Date(e.kickoff||""),c=DV2.formatTimeHHMM(d),m=function getMatchScore(e){return e&&e.score&&e.score.fulltime?{home:e.score.fulltime.home||0,away:e.score.fulltime.away||0}:{home:0,away:0}}(e),v=function getFirstCommentator(e){const t=e?.livestream?.links;return Array.isArray(t)&&t.length?(function sortLivestreamLinksPreferRealBlv(e){Array.isArray(e)&&e.sort((e,t)=>{const a=isNhaDaiLivestreamLink(e),n=isNhaDaiLivestreamLink(t);return a&&!n?1:!a&&n?-1:0})}(t),t[0]||null):null}(e),u=`/streams/${t||a}`,h=isMatchLive(e),p=v?.commentator||"",f=v?.avatar||"";let g="";const w=e.status||"",y=DV2.isFinishedStatus(w),S=DV2.isNotStartedStatus(w);if(h){const t=DV2.normalizeMatchStatus(w),a="half-time"===t||"halftime"===t||"ht"===t||"half time"===t,n=e.currentMinutes||0;g=`\n        <div class="badge-live">\n          <i class="dot"></i>Live\n        </div>\n        <div style="display: flex; gap: 6px;">\n          <div class="detail match_item--time">\n            <b>${c}</b>\n          </div>\n          <div class="time-loaded match_item--status">\n            <span class="match-status live">${a?"HT":`${n}'`}</span>\n          </div>\n        </div>\n        ${v?`\n          <div class="detail mt-2 match_item--commentator">\n            <img \n              onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n              src="${f}" alt="${p}" width="24" height="24"/>\n            ${p}\n          </div>\n        `:""}\n    `}else g=y?`\n        <div style="display: flex; gap: 6px; flex-direction: column;">\n          <div class="detail match_item--time">\n            <span class="match-status finished">Kết thúc</span>\n          </div>\n          <div class="match_item--status">\n            <span class="match-status">${c} ${DV2.formatDateDDMM(d)}</span>\n          </div>\n        </div>\n        ${v?`\n          <div class="detail mt-2 match_item--commentator">\n            <img\n                onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                src="${f}" alt="${p}" width="24" height="24"/>\n            ${p}\n          </div>\n        `:""}\n    `:S?`\n        <div style="display: flex; gap: 6px; flex-direction: column;">\n          <div class="detail match_item--time">\n            <span class="match-status scheduled">Chưa diễn ra</span>\n          </div>\n          <div class="match_item--status">
1\n            <span class="match-status">${c} ${DV2.formatDateDDMM(d)}</span>\n          </div>\n        </div>\n        ${v?`\n          <div class="detail mt-2 match_item--commentator">\n            <img \n            onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n            src="${f}" alt="${p}" width="24" height="24"/>\n            ${p}\n          </div>\n        `:""}\n    `:`\n        <div style="display: flex; gap: 6px; flex-direction: column;">\n          <div class="detail match_item--time">\n            <span class="match-status">${w}</span>\n          </div>\n          <div class="match_item--status">\n            <span class="match-status">${c} ${DV2.formatDateDDMM(d)}</span>\n          </div>\n        </div>\n        ${v?`\n          <div class="detail mt-2 match_item--commentator">\n            <img \n            onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n            src="${f}" alt="${p}" width="24" height="24"/>\n            ${p}\n          </div>\n        `:""}\n    `;return`\n    <div class="vitem vitem-vertical ${h?"vitem-live":""} match_item">\n      <a href="${u}" class="match-link match_item--link"></a>\n      <div class="vitem-info match_item--info">\n        ${g}\n      </div>\n      <div class="item-team match_item--team">\n        <div class="team team-home match_item--team-home">\n          <div class="team-logo match_item--home-logo">\n            <img class="team-logo-img" loading="lazy" src="${r}" \n            onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                 alt="${o} logo" />\n          </div>\n          <h3 class="team-name match_item--home-name">${o}</h3>\n          <div class="vitem-card ml-3"></div>\n        </div>\n        <div class="team team-away match_item--team-away">\n          <div class="team-logo match_item--away-logo">\n            <img class="team-logo-img" loading="lazy" src="${l}" \n            onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                 alt="${s} logo" />\n          </div>\n          <h3 class="team-name match_item--away-name">${s}</h3>\n          <div class="vitem-card ml-3"></div>\n        </div>\n      </div>\n      <div class="item-result match_item--result">\n        <div class="ir-col">\n          <div class="match_item--score-home">${m.home}</div>\n          <div class="match_item--score-away">${m.away}</div>\n        </div>\n      </div>\n      <div class="item-buttons match_item--button">\n        <div class="ibs-live">\n          <a href="${u}" class="btn btn-sm vebo2-btn-bet-hover">Xem ngay</a>\n        </div>\n        <div class="ibs-bet">\n          <a href="${window.DV2_LINK_BET}" target="_blank" rel="nofollow" class="btn btn-sm btn-betnow vebo2-btn-bet">Đặt cược</a>\n        </div>\n      </div>\n      <div class="clearfix"></div>\n    </div>\n  `}(e),o+="\n        </div>\n      </div>\n    "}),o}function loadMatchesForDate(e){const a=$("#match_list_container");if(!a.length)return;if(hideLoading(),!t[e])return a.find(".match_box").remove(),a.find(".no-matches").remove(),void a.append('<div class="no-matches" style="padding: 20px; text-align: center; color: #8e8f92;">Không có trận đấu nào trong ngày.</div>');const n=t[e];a.find(".match_box").remove(),a.find(".no-matches").remove();const i=renderMatchList(n,e);a.append(i)}$(document).ready(function(){if(void 0===window.DV2_PAGE_TYPE){const e=$(".content-area.dv2-layout-vb2");window.DV2_PAGE_TYPE=e.length&&e.attr("data-page-type")||""}a="lich-thi-dau-bong-da"===window.DV2_PAGE_TYPE,function renderDateList(){const t=$(".match_date--wrapper");if(!t.length)return;const n=new Date;let i="";if(a)for(let e=0;e<8;e++){const t=new Date(n);t.setDate(n.getDate()+e),t.setHours(0,0,0,0);let a=DV2.formatDateDDMM(t);0===e?a="Hôm nay":1===e&&(a="Ngày mai"),i+=`\n        <a href="javascript:void(0)" class="match_date--item ${0===e?"active":""}" data-date="${DV2.getDateString(t)}" data-index="${e}">\n          ${a}\n        </a>\n      `}else for(let e=7;e>=0;e--){const t=new Date(n);t.setDate(n.getDate()-e),t.setHours(0,0,0,0);let a=DV2.formatDateDDMM(t);0===e?a="Hôm nay":1===e&&(a="Hôm qua"),i+=`\n        <a href="javascript:void(0)" class="match_date--item ${0===e?"active":""}" data-date="${DV2.getDateString(t)}" data-index="${e}">\n          ${a}\n        </a>\n      `}t.html(i),e=0}(),function loadDataForAllDays(){const e=new Date,n=new Date(e),i=new Date(e);a?i.setDate(e.getDate()+7):n.setDate(e.getDate()-7),showLoading(),DV2.fetchMatchesByDateRange(DV2.getDateString(n),DV2.getDateString(i),function(a){if
1(hideLoading(),a&&a.matches_by_date){t=a.matches_by_date;const n=DV2.getDateString(e);loadMatchesForDate(n),updateHeaderText(n)}else{const e=$("#match_list_container");e.length&&e.append('<div class="no-matches" style="padding: 20px; text-align: center; color: #8e8f92;">Không có dữ liệu.</div>')}},function(e){hideLoading(),console.error("[KET QUA] Error loading data:",e);const t=$("#match_list_container");t.length&&t.append('<div class="no-matches" style="padding: 20px; text-align: center; color: #8e8f92;">Đã xảy ra lỗi khi tải dữ liệu.</div>')})}(),function setupDateClickHandlers(){$(document).on("click",".match_date--item",function(){const a=$(this),n=a.data("date"),i=parseInt(a.data("index"),10);if($(".match_date--item").removeClass("active"),a.addClass("active"),e=i,updateHeaderText(n),t[n])loadMatchesForDate(n);else{showLoading();const e=new Date(n+"T00:00:00"),a=new Date(e),i=new Date(e);DV2.fetchMatchesByDateRange(DV2.getDateString(a),DV2.getDateString(i),function(e){hideLoading(),e&&e.matches_by_date?(Object.assign(t,e.matches_by_date),loadMatchesForDate(n)):loadMatchesForDate(n)},function(e){hideLoading(),console.error("[KET QUA] Error loading data for date:",e),loadMatchesForDate(n)})}})}()})}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery){function getDaysToDisplay(){return function isMobile(){return window.innerWidth<=640}()?4:5}$=jQuery.noConflict();let e=-1,t={},a=!0;function renderDateList(){const t=$(".mdx_-list");if(!t.length)return;const a=new Date;let n="";const i=getDaysToDisplay();for(let t=0;t<i;t++){const i=new Date(a);i.setDate(a.getDate()+t),i.setHours(0,0,0,0);const o=DV2.formatDateDDMM(i),s=DV2.getVietnameseDayLabel(i,t),r=DV2.getDateString(i);n+=`\n      <a href="javascript:void(0)" class="item f-date ${t===e?"active":""}" data-date="${r}" data-index="${t}">\n        <span class="date-a date_of_day">${o}</span>\n        <span class="date-b date_of_week">${s}</span>\n      </a>\n    `}t.html(n)}function setupDateClickHandlers(){$(document).on("click",".mdx_-list .item.f-date",function(){const t=$(this),n=parseInt(t.data("index"),10);$(".mdx_-list .item.f-date").removeClass("active"),$(".btn-live").removeClass("active"),t.addClass("active"),e=n,a=!1,loadMatchesForDate(t.data("date"))})}function loadDataForAllDays(){const n=new Date,i=new Date(n),o=new Date(n),s=getDaysToDisplay();o.setDate(n.getDate()+s),DV2.fetchMatchesByDateRange(DV2.getDateString(i),DV2.getDateString(o),function(i){if(i&&i.matches_by_date)if(t=i.matches_by_date,updateLiveCountBadge(),a)loadLiveMatches();else{const t=new Date(n);t.setDate(n.getDate()+e),loadMatchesForDate(DV2.getDateString(t))}},function(e){console.error("[DATE LIST] Error loading data:",e)})}$(document).ready(function(){renderDateList(),loadDataForAllDays(),setupDateClickHandlers(),function setupLiveButtonHandler(){$(document).on("click",".btn-live",function(){const t=$(this);$(".mdx_-list .item.f-date").removeClass("active"),t.addClass("active"),e=-1,a=!0,loadLiveMatches()})}(),function setupResizeHandler(){let t,n=getDaysToDisplay();$(window).on("resize",function(){clearTimeout(t),t=setTimeout(function(){const t=getDaysToDisplay();t!==n&&(n=t,e>=t&&(e=-1,a=!0,$(".mdx_-list .item.f-date").removeClass("active"),$(".btn-live").addClass("active")),renderDateList(),setupDateClickHandlers(),loadDataForAllDays())},250)})}(),bindVb2BlvDropdownEvents_LTT()});const n=["delay","interrupt","cut in half"];function isExcludedMatchStatus(e){return n.includes(DV2.normalizeMatchStatus(e||""))}function isMatchLive(e){if(!e||!e.kickoff)return!1;const t=e.status||"";if(isExcludedMatchStatus(t))return!1;if(DV2.isLiveStatus(t))return!0;if(e.livestream&&e.livestream.available){const t=new Date,a=new Date(e.kickoff),n=new Date(a.getTime()+72e5);return a<=t&&t<=n}return!1}function escapeHtml_VB2(e){return String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function getDetailUrl_VB2(e,t){return window.DV2StreamLinks.getDetailUrl(e,t,{trailingSlash:!0})}function renderLttBlvAvatar(e,t){return`\n    <img\n      src="${escapeHtml_VB2(e?.avatar||"")}"\n      alt="${escapeHtml_VB2(t)}"\n      width="24"\n      height="24"\n      onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n    />\n  `}function bindVb2BlvDropdownEvents_LTT(){window.DV2BlvDropdown.bind($(".match_list_container"),{namespace:"vb2BlvDropdownLtt",documentCloseDelay:!0})}function filterFinishedMatches(e){return Array.isArray(e)?e.filter(function(e){return!e||!e.status||!isExcludedMatchStatus(e.status)&&!DV2.isFinishedStatus(e.status)}):[]}function renderMatchList(e){if(!Array.isArray(e)||0===e.length)return'<div class="no-matches">Không có trận đấu nào</div>';const t=filterFinishedMatches(e);if(0===t.length)return'<div class="no-matches">Không có trận đấu nào</div>';let a="";return DV2.sortedMatchesFunction(t).forEach(function(e){const t=DV2.a
1ppState.hotLeaguesRank.has(e.league.id);a+=`\n      <div class="match_box match_item--box ${t?"hot-match":""}">\n        <div class="mb_-header">\n          <span class="item-league match_item--league">\n            ${e.league?.logo?`\n              <i class="league-icon mr-2">\n                <img loading="lazy" class="match_item--league-icon" src="${e.league.logo}" alt="${e.league.name}"\n                  onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                 />\n              </i>\n            `:""}\n            <span class="item-league__name match_item--league-name">\n              ${e.league.name}\n            </span>\n          </span>\n        </div>\n        <div class="match_list match_list-list match_item--list">\n    `,a+=function renderMatchItem(e){if(!e)return"";const t=e.match_id||"",a=e.slug||"",n=e.teams?.home||{},i=e.teams?.away||{},o=n.name||"",s=i.name||"",r=n.logo||"",l=i.logo||"",d=new Date(e.kickoff||""),c=DV2.formatTimeHHMM(d),m=function formatMatchStatus(e){if(!e)return"Chưa diễn ra";const t=DV2.normalizeMatchStatus(e.status||"");return isMatchLive(e)||DV2.isLiveStatus(t)?"half-time"===t||"halftime"===t||"ht"===t||"half time"==t?"HT":"first half"===t?"Hiệp 1":"second half"===t?"Hiệp 2":"overtime"===t||"overtime(deprecated)"===t?"Hiệp phụ":"penalty shoot-out"===t||"penalty"===t?"Penalty":"Live":DV2.isFinishedStatus(t)?"FT":DV2.isNotStartedStatus(t)?"Chưa diễn ra":"delay"===t?"Hoãn":"interrupt"===t?"Tạm dừng":"cancel"===t?"Hủy":e.status||"Chưa diễn ra"}(e),v=isMatchLive(e),u=function getMatchScore(e){return e&&e.score&&e.score.fulltime?{home:e.score.fulltime.home||0,away:e.score.fulltime.away||0}:{home:0,away:0}}(e),h=`/streams/${t||a}`,p=v?"live":"pending",f=v?"Live":m,g=function buildCommentatorDropdown_VB2(e){const t=window.DV2BlvDropdown.getSortedLinks(e);return window.DV2BlvDropdown.build({match:e,links:t,getDetailUrl:getDetailUrl_VB2,escapeHtml:escapeHtml_VB2,menuPlacement:"down",emptyHtml:"",rootClass:"detail mt-2 match_item--commentator",renderToggle:({link:e,label:t})=>`\n      ${renderLttBlvAvatar(e,t)}\n      <span class="match_item--commentator-name">${escapeHtml_VB2(t)}</span>\n    `,renderItemContent:({link:e,label:t})=>`\n      ${renderLttBlvAvatar(e,t)}\n      <span class="match_item--commentator-name">${escapeHtml_VB2(t)}</span>\n    `})}(e);let w="";if(v){const t=DV2.normalizeMatchStatus(e.status||""),a="half-time"===t||"halftime"===t||"ht"===t||"half time"===t,n=e.currentMinutes||0;w=`\n        <div class="badge-live">\n          <i class="dot"></i>\n          ${f}\n        </div>\n        <div style="display: flex; gap: 6px">\n          <div class="detail match_item--time">\n            <b>${c}</b>\n          </div>\n          <div class="time-loaded match_item--status">\n            <span class="match-status ${p}">${a?"HT":`${n}'`}</span>\n          </div>\n        </div>\n    `}else{const e=new Date;w=`\n        <div style="display: flex; gap: 6px; flex-direction: column-reverse;">\n          <div class="detail">\n            <b>${c}${d.getFullYear()===e.getFullYear()&&d.getMonth()===e.getMonth()&&d.getDate()===e.getDate()?"":` ${DV2.formatDateDDMM(d)}`}</b>\n          </div>\n          <div class="time-loaded">\n            <span class="match-status pending">${m}</span>\n          </div>\n        </div>\n    `}return`\n    <div class="vitem vitem-vertical ${v?"vitem-live":""} match_item">\n      <a href="${h}" class="match-link match_item--link"></a>\n      <div class="vitem-info match_item--info">\n        ${w}\n        ${g}\n      </div>\n      <div class="item-team match_item--team">\n        <div class="team team-home match_item--team-home">\n          <div class="team-logo match_item--home-logo">\n            <img class="team-logo-img" loading="lazy" src="${r}" \n            onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                 alt="${o} logo" />\n          </div>\n          <h3 class="team-name match_item--home-name">${o}</h3>\n          <div class="vitem-card ml-3"></div>\n        </div>\n        <div class="team team-away match_item--team-away">\n          <div class="team-logo match_item--away-logo">\n            <img class="team-logo-img" loading="lazy" src="${l}" \n            onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                 alt="${s} logo" />\n          </div>\n          <h3 class="team-name match_item--away-name">${s}</h3>\n          <div class="vitem-card ml-3"></div>\n        </div>\n      </div>\n      <div class="item-result match_item--result">\n        <div class="ir-col">\n          ${v?`\n            <div class="match_item--score-home">${u.home}</div>\n            <div class="match_item--score-away">${u.away}</div> \n            `:'<div class="xspace">vs</div>'}\n        </div>\n      </div>\n      <div class="item-buttons match_item--button">\n        <div class="ibs-live">\n          <a href="${h}" class="btn btn-sm vebo2-btn-bet-hover">Xem ngay</a>\n        </div>\n        <div class="ibs-bet">\n          <a href="${window.DV2_LINK_BET}" target="_blank" rel="nofollow" class="btn btn-sm btn-betnow vebo2-btn-bet">Đặt cược</a>\n        </div>\n      </div>\n      <div class="clearfix"></div>\n    </div>\n  `}(e),a+="\n        </div>\n      </div>\n    "}),a}function updateLiveCountBadge(){const e=$(".badge-live-count");if(!e.length)return;let a=[];Object.keys(t).forEach(function(e){const n=t[e]||[];a=a.concat(n)});const n=filterFinishedMatches(a).filter(function(e){return isMatchLive(e)}).length;e.text(n)}function updateLiveCountForDate(e){updateLiveCountBadge()}function loadMatchesForDate(e){const a=$(".match_list_container");if(!a.length)return;if(!t[e])return a.find(".match_box").remove(),a.find(".no-matches").remove(),updateLiveCountForDate(),void a.append('<div class="no-matches" style="padding: 20px; text-align: center; color: #8e8f92;">Không có trận đấu nào trong ngày.</div>');const n=t[e];a.find(".match_box").remove(),a.find(".no-matches").remove();const i=renderMatchList(n);a.append(i),bindVb2BlvDropdownEvents_LTT(),updateLiveCountForDate()}function loadLiveMatches(){const e=$(".match_list_container");if(!e.length)return;let a=[];Object.keys(t).forEach(function(e){const n=t[e]||[];a=a.concat(n)});const n=a.filter(function(e){return isMatchLive(e)});if(e.find(".match_box").remove(),e.find(".no-matches").remove(),0===n.length)e.append('<div class="no-matches" style="padding: 20px; text-align: center; color: #8e8f92;">Hiện tại không có trận đấu nào đang diễn ra.</div>');else{const t=renderMatchList(n);e.append(t),bindVb2BlvDropdownEvents_LTT()}updateLiveCountBadge()}}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery,Hls,Swiper){function isNhaDaiLivestreamLink(e){if(!e)return!1;if(1e17===e.commentatorId)return!0;const t=String(e.commentator||"").trim().toLowerCase();return"nhà đài"===t||"nha dai"===t||"blv nhà đài"===t}$=jQuery.noConflict();const e={hotLeaguesRank:new Map},t=".dv2-layout-vb2.dv2-calendar-matchs";let a=null;const n=["half-time","half time","halftime","ht"],i=["interrupt","first half","firsthalf","first-half","fh","half-time","half time","halftime","ht","second half","secondhalf","second-half","sh","extra time","extratime","et","overtime","overtime(deprecated)","ot","penalty","penalties","penalty shoot-out","penalty shootout"];function destroyMatchLiveSwiper(){a&&(a.destroy(!0,!0),a=null)}$(document).ready(()=>{$(t).length>0&&function loadHomeMatchesData_VB2(){const s=new Date,r=new Date(s);r.setDate(s.getDate()+1);const l={fromDate:s.toISOString().split("T")[0],toDate:r.toISOString().split("T")[0]};$.ajax({url:"https://vsc-apidev.helizones.com/api/data/lives/range-date",method:"POST",contentType:"application/json",data:JSON.stringify(l),success:s=>{if(s&&s.matches_by_date){const r=[];
1Object.keys(s.matches_by_date).forEach(e=>r.push(...s.matches_by_date[e])),function renderHomeMatches_VB2(s,r="all"){const l=new Date,d=s.filter(e=>{const t=new Date(e.kickoff),a=new Date(t.getTime()+72e5);if("live"===r)return l>=t&&l<=a;if("today"===r){new Date(l).setHours(0,0,0,0);const e=new Date(l);return e.setHours(23,59,59,999),t>l&&t<=e}return a>=l}).sort((e,t)=>new Date(e.kickoff).getTime()-new Date(t.kickoff).getTime()),c=o(d),m=$(`${t} .swiper-wrapper`);if(m.empty(),!c.length)return destroyMatchLiveSwiper(),void m.html('<div class="dv2-empty-state">Không có trận đấu</div>');const v=c.map(t=>function renderHomeMatchCard_VB2(t){const a=new Date(t.kickoff).toLocaleTimeString("vn-VN",{hour:"2-digit",minute:"2-digit",hour12:!1}),o=t.teams?.home||{},s=t.score||{},r=t.teams?.away||{},l=t.league||{},d=e.hotLeaguesRank.has(t.league.id),c=function getPreferredLivestreamLink(e){const t=e?.livestream?.links;return Array.isArray(t)&&t.length?(function sortLivestreamLinksPreferRealBlv(e){Array.isArray(e)&&e.sort((e,t)=>{const a=isNhaDaiLivestreamLink(e),n=isNhaDaiLivestreamLink(t);return a&&!n?1:!a&&n?-1:0})}(t),t[0]||null):null}(t),m=i.includes(t.status.toLowerCase()),v=t.status.toLowerCase(),u=m?n.includes(v)?"HT":null!=t.currentMinutes&&""!==t.currentMinutes?`${t.currentMinutes}'`:"Live":"";return`\n                <div class="swiper-slide xitem xitem-big ${d?"hot-game":""}" >\n      <a href="/streams/${t?.match_id}" class="match-link"></a>\n      ${m?'<div class="stick stick-live"><i class="dot"></i>Live</div>':""}\n      <div class="xitem-header">\n        <div class="xleague">\n          <img\n            width="20"\n            height="20"\n            src="${l.logo}"\n            onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n            alt="${l.logo}"\n          />\n          ${l.name}\n        </div>\n      </div>\n      <div class="xitem-main">\n        <div class="team team-home" style="">\n          <div class="team-logo">\n            <img\n              src="${o.logo}"\n            onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n              alt="${o.logo}"\n              class="team-logo-img"\n              loading="lazy"\n            />\n          </div>\n          <div class="xname">\n            <h3 class="team-name">${o.name}</h3>\n            <div class="xcards"></div>\n          </div>\n        </div>\n        <div class="xinfo">\n          <div class="time-loaded">\n            <span class="match-status ${m?"live":""}">${u}</span>\n          </div>\n          <div class="result">${m?`<div>${s.fulltime.home}</div>\n            <div class="xspace">-</div>\n            <div>${s.fulltime.away}</div>`:"VS"}</div>\n          <div class="detail"><b>${a}</b></div>\n        </div>\n        <div class="team team-away">\n          <div class="team-logo">\n            <img\n              src="${r.logo}"\n              onerror="https://static.90pcdn.com/images/match.png"\n              alt="${r.logo}"\n              class="team-logo-img"\n              loading="lazy"\n            />\n          </div>\n          <div class="xname">\n            <h3 class="team-name">${r.name}</h3>\n            <div class="xcards"></div>\n          </div>\n        </div>\n      </div>\n      <div class="xitem-bottom">\n        <div class="xcommentator">\n          <img\n            src="${c?.avatar||""}"\n            width="32"\n            height="32"\n            style="border-radius: 50%; object-fit: contain"\n            onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n          />\n          ${c?.commentator||""}\n        </div>\n        <div class="xitem-buttons">\n          <div class="ibs-live">\n            <a href="/streams/${t.match_id}" class="btn btn-sm vebo2-btn-bet-hover">Xem ngay</a>\n          </div>\n          <div class="ibs-bet">\n            <a href="${window.DV2_LINK_BET}" target="_blank" rel="nofollow" class="btn btn-sm btn-betnow vebo2-btn-bet">Đặt cược</a>\n          </div>\n        </div>\n      </div>\n    </div>\n            `}(t)).join("");m.append(v),function initMatchLiveSwiper(e){destroyMatchLiveSwiper();const n=$(t),i=n.find(".mySwiper")[0];if(!i||e<1)return;const o=e>=3;a=new Swiper(i,{slidesPerView:1,spaceBetween:16,centeredSlides:!0,centeredSlidesB
1ounds:!0,initialSlide:Math.min(2,e-1),loop:o,autoplay:e>1&&{delay:3e3,disableOnInteraction:!1},navigation:{nextEl:n.find(".swiper-button-next")[0],prevEl:n.find(".swiper-button-prev")[0]},breakpoints:{768:{slidesPerView:1},1024:{slidesPerView:2}},observer:!0,observeSlideChildren:!0})}(c.length)}(r)}else $(".dv2-layout-vb2.dv2-calendar-matchs .swiper-wrapper").html('<div class="dv2-empty-state">Không có dữ liệu</div>')},error:()=>$(".dv2-layout-vb2.dv2-calendar-matchs .swiper-wrapper").html('<div class="dv2-empty-state">Lỗi tải dữ liệu</div>')}),DV2HotLeagues.load({ajax:$.ajax,setHotLeaguesRank:t=>{e.hotLeaguesRank=t}})}()});const o=DV2MatchSort.createSortedMatchesFunction({mode:"wc-first",liveStatuses:i,hotLeaguesRank:()=>e.hotLeaguesRank})}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery){function escapeHtml_VB2(e){return String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function getDetailUrl_VB2(e,t){return window.DV2StreamLinks.getDetailUrl(e,t,{trailingSlash:!0})}function renderVb2BlvAvatar(e,t){return`\n    <img\n      src="${escapeHtml_VB2(e?.avatar||"")}"\n      width="32"\n      height="32"\n      alt="${escapeHtml_VB2(t)}"\n      style="border-radius: 50%; object-fit: contain"\n      onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n    />\n  `}function bindVb2BlvDropdownEvents(){window.DV2BlvDropdown.bind($(".dv2-tam-diem-vb2.dv2-calendar-matchs .dv2-grid"),{namespace:"vb2BlvDropdown",documentCloseDelay:!0})}($=jQuery.noConflict())(document).ready(()=>{$(".dv2-tam-diem-vb2.dv2-calendar-matchs").length>0&&(bindVb2BlvDropdownEvents(),function loadHomeMatchesData_VB2(){const t=new Date,a=new Date(t);a.setDate(t.getDate()-1);const n=new Date(t);n.setDate(t.getDate()+1);const i={fromDate:a.toISOString().split("T")[0],toDate:n.toISOString().split("T")[0]};$.ajax({url:"https://vsc-apidev.helizones.com/api/data/lives/range-date",method:"POST",contentType:"application/json",data:JSON.stringify(i),success:e=>{if(e&&e.matches_by_date){const t=[];Object.keys(e.matches_by_date).forEach(a=>t.push(...e.matches_by_date[a]));const a=t.filter(e=>"Finished"!==e.status);renderHomeMatches_VB2(a),function setupFilterButtons_VB2(e){$(".dv2-tam-diem-vb2.dv2-calendar-matchs .dv2-filter-btn").off("click").on("click",function(){$(".dv2-tam-diem-vb2.dv2-calendar-matchs .dv2-filter-btn").removeClass("active"),$(this).addClass("active"),renderHomeMatches_VB2(e,$(this).data("filter"))})}(a)}else $(".dv2-tam-diem-vb2.dv2-calendar-matchs .dv2-grid").html('<div class="dv2-empty-state">Không có dữ liệu</div>')},error:()=>$(".dv2-tam-diem-vb2.dv2-calendar-matchs .dv2-grid").html('<div class="dv2-empty-state">Lỗi tải dữ liệu</div>')}),DV2HotLeagues.load({ajax:$.ajax,setHotLeaguesRank:t=>{e.hotLeaguesRank=t}})}())});const e={hotLeaguesRank:new Map},t=["half-time","half time","halftime","ht"],a=["first half","firsthalf","first-half","fh","half-time","half time","halftime","ht","second half","secondhalf","second-half","sh","extra time","extratime","extra time","et","overtime","overtime(deprecated)","ot","penalty","penalties","penalty shoot-out","penalty shootout"];const n=DV2MatchSort.createSortedMatchesFunction({mode:"wc-first",liveStatuses:a,hotLeaguesRank:()=>e.hotLeaguesRank});function renderHomeMatches_VB2(i,o="all"){const s=new Date,r=i.filter(e=>{const t=new Date(e.kickoff);if("live"===o)return a.includes(e.status.toLowerCase());if("today"===o){new Date(s).setHours(0,0,0,0);const n=new Date(s);return n.setHours(23,59,59,999),"Finished"!==e.status&&t>s&&t<=n||a.includes(e.status.toLowerCase())}return"tmr"===o?t.getDate()===s.getDate()+1:a.includes(e.status.toLowerCase())||t.getTime()>s.getTime()}).sort((e,t)=>new Date(e.kickoff).getTime()-new Date(t.kickoff).getTime()),l=n(r);console.log("sortedMatches",l);const d=$(".dv2-tam-diem-vb2.dv2-calendar-matchs .dv2-grid");if(d.empty(),!l.length)return void d.html('<div class="dv2-empty-state">Không có trận đấu</div>');const c=l.map(n=>function renderHomeMatchCard_VB2(n){const i=(new Date).toLocaleDateString("en-GB",{day:"2-digit",month:"2-digit"}),o=new Date(n.kickoff).toLocaleDateString("en-GB",{day:"2-digit",month:"2-digit"}),s=new Date(n.kickoff).toLocaleTimeString("vn-VN",{hour:"2-digit",minute:"2-digit",hour12:!1}),r=n.teams?.home||{},l=n.score||{},d=n.teams?.away||{},c=n.league||{},m=e.hotLeaguesRank.has(n.league.id),v=a.includes(n.status.toLowerCase()),u=i===o;return`\n                <div class="xitem xitem-big ${m?"hot-game":""}" >\n      <a href="/streams/${n?.match_id}" class="match-link"></a>\n      ${v?'<div class="stick stick-live">\n            <i class="dot"></i>Live\n          </div>':""}\n       \n      <div class="xitem-header">\n        <div class="xleague">\n          <img\n            width="20"\n            height="20"\n            src="${c.logo}"\n            alt="${c.logo}"\n             onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n          />\n          <p class="xleague-name">${c.name}</p>\n        </div>\n      </div>\n      <div class="xitem-main">\n        <div class="team team-home" style="">\n          <div class="team-logo">\n            <img\n              src="${r.logo}"\n              alt="${r.logo}"\n              class="team-logo-img"\n              loading="lazy"\n            onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n            />\n          </div>\n          <div class="xname">\n            <h3 class="team-name">${r.name}</h3>\n            <div class="xcards"></div>\n          </div>\n        </div>\n        <div class="xinfo">\n          <div class="time-loaded">
1\n           <span class="match-status live"> ${v?t.includes(n.status.toLowerCase())?"HT":null!=n.currentMinutes&&""!==n.currentMinutes?`${n.currentMinutes}'`:"Live":""}</span>\n          </div>\n          <div class="result">${v?` <div>${l.fulltime.home}</div>\n            <div class="xspace">-</div>\n            <div>${l.fulltime.away}</div>`:"VS"}\n          </div>\n          <div class="detail"><b>${s}</b></div>\n          ${u?"":`<div class="detail">\n                <b>${o}</b>\n              </div>`}\n        </div>\n        <div class="team team-away">\n          <div class="team-logo">\n            <img\n              src="${d.logo}"\n            onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n              alt="${d.logo}"\n              class="team-logo-img"\n              loading="lazy"\n            />\n          </div>\n          <div class="xname">\n            <h3 class="team-name">${d.name}</h3>\n            <div class="xcards"></div>\n          </div>\n        </div>\n      </div>\n      <div class="xitem-bottom">\n        ${function buildCommentatorDropdown_VB2(e){const t=window.DV2BlvDropdown.getSortedLinks(e);return window.DV2BlvDropdown.build({match:e,links:t,getDetailUrl:getDetailUrl_VB2,escapeHtml:escapeHtml_VB2,menuPlacement:"down",emptyHtml:"<div></div>",toggleClass:"xcommentator",renderToggle:({link:e,label:t})=>`\n      ${renderVb2BlvAvatar(e,t)}\n      <p class="xcommentator-name">${escapeHtml_VB2(t)}</p>\n    `,renderItemContent:({link:e,label:t})=>`\n      ${renderVb2BlvAvatar(e,t)}\n      <span class="xcommentator-name">${escapeHtml_VB2(t)}</span>\n    `})}(n)}\n        <div class="xitem-buttons">\n          <div class="ibs-live">\n            <a href="/streams/${n.match_id}" class="btn btn-sm vebo2-btn-bet-hover">Xem ngay</a>\n          </div>\n          <div class="ibs-bet">\n            <a href="${window.DV2_LINK_BET}" target="_blank" rel="nofollow" class="btn btn-sm btn-betnow vebo2-btn-bet">Đặt cược</a>\n          </div>\n        </div>\n      </div>\n    </div>\n            `}(n)).join("");d.append(`\n                        ${c}\n                `),bindVb2BlvDropdownEvents()}}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery,Hls){$=jQuery.noConflict();const e="https://img.freepik.com/premium-photo/close-up-soccer-player-who-kicks-ball_207634-4089.jpg",t=["first half","firsthalf","first-half","fh","half-time","half time","halftime","ht","second half","secondhalf","second-half","sh","extra time","extratime","extra time","et","overtime","overtime(deprecated)","ot","penalty","penalties","penalty shoot-out","penalty shootout"];let a=null,n=0,i=5e3,o=null,s=null,r=null,l=null,d=0,c=null,m=null;function applyPosterForActiveLink_CK2(){const t=document.getElementById("liveVideo");t&&DV2StreamKickoff.applyPosterForVideo(t,s,e)}function getStreamChrome_CK2(){return window.DV2_StreamChrome}function getStreamVideoWrapper_CK2(){return $(".dv2-layout-ck2 .dv2-video-wrapper").first()}function initStreamPlayerUi_CK2(e){const t=getStreamVideoWrapper_CK2(),a=getStreamChrome_CK2();t.length&&a&&a.initPlayerUi(t,e?$(e):t.find("video").first())}function onHlsStreamReady_CK2(){const e=getStreamChrome_CK2(),t=getStreamVideoWrapper_CK2();e&&t.length&&(o&&e.rememberOddsMatchData?.(t,o),e.onHlsReady(t))}function initStreamOddsPanel_CK2(e){const t=getStreamChrome_CK2(),a=getStreamVideoWrapper_CK2();t&&a.length&&e&&(t.rememberOddsMatchData?.(a,e),t.initOddsPanel?.(a,e))}function clearStreamChrome_CK2(){const e=getStreamChrome_CK2(),t=getStreamVideoWrapper_CK2();e&&t.length&&e.clearFullChrome(t)}function showStreamLoading_CK2(e,t="Đang tải luồng phát..."){if(!e?.length)return $();hideStreamLoading_CK2(e);const a=String(t||"Đang tải luồng phát...").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),n=$(`\n    <div class="dv2-stream-loading" role="status" aria-live="polite" aria-busy="true">\n      <div class="dv2-stream-loading__panel">\n        <div class="dv2-stream-loading__spinner" aria-hidden="true"></div>\n        <p class="dv2-stream-loading__text">${a}</p>\n      </div>\n    </div>\n  `);return e.append(n),n}
1function hideStreamLoading_CK2(e){(e?.length?e:getStreamVideoContainer_CK2()).find(".dv2-stream-loading").remove()}function bindStreamLoadingUntilPlaying_CK2(e,t,a){if(!e?.length||!t)return void a?.();let n=!1;const finish=()=>{n||(n=!0,t.removeEventListener("playing",onPlaying),t.removeEventListener("canplay",onCanPlay),clearTimeout(i),hideStreamLoading_CK2(e),a?.())},onPlaying=()=>finish(),onCanPlay=()=>{t.paused||finish()};t.addEventListener("playing",onPlaying),t.addEventListener("canplay",onCanPlay);const i=setTimeout(finish,12e3)}function clearCk2PlaybackTimers(){c&&(clearTimeout(c),c=null),m&&(clearTimeout(m),m=null)}function destroyCurrentHls_CK2(){if(l){try{l.destroy()}catch(e){}l=null}}function initHLSPlayer(e,t={}){const{enableRetry:i=!1,matchData:s=null}=t;o=s||o,d+=1;const r=d;clearCk2PlaybackTimers(),destroyCurrentHls_CK2();const l=getStreamVideoContainer_CK2();clearMatchOverlays_CK2(l),showStreamLoading_CK2(l,"Đang tải luồng phát...");const c=document.getElementById("liveVideo");c.autoplay=!0,c.muted=!0,initStreamPlayerUi_CK2(c),console.log("[VSC LIVE] Initializing HLS player "+(i?"with retry":"without retry")),i&&s?(n=0,a&&(clearTimeout(a),a=null),loadVideoCore(e,s,!0,r)):loadVideoCore(e,null,!1,r)}function loadVideoCore(t,r,v,u){const isStalePlayback=()=>u!==d;console.log(`[VSC LIVE] ${v?"Retrying":"Loading"} video (attempt ${v?n+1:1}${v?"/3":""})`);const h=getStreamVideoContainer_CK2();if(isStalePlayback())return;clearMatchOverlays_CK2(h),showStreamLoading_CK2(h,v&&n>0?`Đang thử lại luồng phát... (${n}/3)`:"Đang tải luồng phát...");const p=document.getElementById("liveVideo"),f=r||o;let g=!1;const showFallback=()=>{isStalePlayback()||g||!f||(g=!0,clearCk2PlaybackTimers(),a&&(clearTimeout(a),a=null),destroyCurrentHls_CK2(),hideStreamLoading_CK2(h),function showLiveMatchError(t){if(!t)return;clearStreamChrome_CK2();const a=$(".dv2-layout-ck2 #stream-player"),n=getStreamVideoContainer_CK2();a.empty();const i=document.createElement("video");i.id="liveVideo",i.controls=!1,i.autoplay=!1,i.muted=!0,i.playsInline=!0,i.setAttribute("playsinline","true"),i.poster=DV2StreamKickoff.resolvePosterUrl(s,e),i.style.width="100%",i.style.height="100%",i.style.objectFit="contain";const o=document.getElementById("stream-player");o.innerHTML="",o.appendChild(i),initStreamPlayerUi_CK2(i),renderMatchInfoCard(n,t,"live-error")}(f))};try{if(Hls.isSupported()){c=setTimeout(()=>{isStalePlayback()||(console.error("[VSC LIVE] Manifest load timeout"),showFallback())},15e3);const y=new Hls({maxBufferLength:10,liveSyncDuration:3,enableWorker:!0,xhrSetup:function(e,t){e.withCredentials=!1,e.referrerPolicy="no-referrer-when-downgrade"}});l=y,y.loadSource(t),y.attachMedia(p),y.on(Hls.Events.MANIFEST_PARSED,function(){isStalePlayback()||(console.log("[VSC LIVE] HLS manifest parsed successfully"),clearCk2PlaybackTimers(),a&&(clearTimeout(a),a=null),bindStreamLoadingUntilPlaying_CK2(h,p,()=>{isStalePlayback()||onHlsStreamReady_CK2()}),p.muted=!0,p.play().catch(e=>{console.warn("[VSC LIVE] Autoplay blocked:",e)}))}),y.on(Hls.Events.ERROR,function(e,o){if(!isStalePlayback()){if(console.error("[VSC LIVE] HLS error:",o),o?.fatal&&!v)return clearCk2PlaybackTimers(),void showFallback();o.fatal&&v&&(n++,n<3?(console.log(`[VSC LIVE] Retrying in 5 seconds... (${n}/3)`),a=setTimeout(()=>{isStalePlayback()||(destroyCurrentHls_CK2(),loadVideoCore(t,r,v,u))},i)):(console.error("[VSC LIVE] Max retries reached, showing live match info"),clearCk2PlaybackTimers(),a&&(clearTimeout(a),a=null),destroyCurrentHls_CK2(),showFallback()))}}),p.addEventListener("error",function(){isStalePlayback()||(clearCk2PlaybackTimers(),showFallback())},{once:!0})}else if(p.canPlayType("application/vnd.apple.mpegurl")){m=setTimeout(()=>{isStalePlayback()||(console.error("[VSC LIVE] Native HLS load timeout"),v||showFallback())},15e3),p.playsInline=!0,p.setAttribute("playsinline","true"),p.src=t;var w=!1;function tryPlaySafari(){isStalePlayback()||w||(w=!0,clearCk2PlaybackTimers(),a&&(clearTimeout(a),a=null),bindStreamLoadingUntilPlaying_CK2(h,p,()=>{isStalePlayback()||onHlsStreamReady_CK2()}),p.muted=!0,p.play().catch(e=>{console.warn("[VSC LIVE] Autoplay blocked on Safari:",e)}))}p.addEventListener("canplay",tryPlaySafari,{once:!0}),p.addEventListener("loadedmetadata",function(){setTimeout(function(){!w&&p.readyState>=1&&tryPlaySafari()},400)},{once:!0}),p.addEventListener("error",function(){isStalePlayback()||v||(clearCk2PlaybackTimers(),showFallback())},{once:!0}),v&&p.addEventListener("error",function(){isStalePlayback()||(console.error("[VSC LIVE] Video load error on Safari"),n++,n<3?a=setTimeout(()=>{isStalePlayback()||loadVideoCore(t,r,v,u)},i):(clearCk2PlaybackTimers(),showFallback()))})}else console.error("[VSC LIVE] HLS not supported and not Safari"),show
1Fallback()}catch(S){console.error("[VSC LIVE] Exception during video load:",S),v?(n++,n<3?a=setTimeout(()=>{isStalePlayback()||loadVideoCore(t,r,v,u)},i):(clearCk2PlaybackTimers(),showFallback())):showFallback()}}function getStreamVideoContainer_CK2(){return getStreamVideoWrapper_CK2()}function clearMatchOverlays_CK2(e){const t=e?.length?e:getStreamVideoContainer_CK2();t.length&&t.find("#simulate-the-match-content-center").remove()}function renderMatchInfoCard(e,t,a="countdown"){const{teams:n,league:i,matchInfo:o,score:s}=t,r=n?.home?.name||"Home Team",l=n?.away?.name||"Away Team",d=i?.name||"",c=o?.status||"Not Started";let m="";if("result"===a){const e=s?.fulltime?.home||0,t=s?.fulltime?.away||0,a=n?.home?.logo||"",i=n?.away?.logo||"";m=`\n      <li class="flex  w-12 h-auto items-center justify-center" style="flex-direction: row;">\n        ${a?`<img src="${a}" alt="${r}" style="width:50px;height:50px;border-radius:50%;" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'">`:""}\n        <span id="hEndScore" data-dv2-score-home>${e}</span>\n      </li>\n      <li class="vs">:</li>\n      <li class="flex w-12 h-auto items-center justify-center" style="flex-direction: row;">\n        <span id="gEndScore" data-dv2-score-away>${t}</span>\n        ${i?`<img src="${i}" alt="${l}" style="width:50px;height:50px;border-radius:50%;" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'">`:""}\n      </li>\n    `}else if("live-error"===a){const e=s?.fulltime?.home||0,t=s?.fulltime?.away||0,a=n?.home?.logo||"",i=n?.away?.logo||"";m=`\n      <li class="flex w-12 h-auto items-center justify-center" style="flex-direction: row;">\n        ${a?`<img src="${a}" alt="${r}" style="width:50px;height:50px;border-radius:50%;" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'">`:""}\n        <span id="hEndScore" data-dv2-score-home>${e}</span>\n      </li>\n      <li class="vs">:</li>\n      <li class="flex w-12 h-auto items-center justify-center" style="flex-direction: row;">\n        <span id="gEndScore" data-dv2-score-away>${t}</span>\n        ${i?`<img src="${i}" alt="${l}" style="width:50px;height:50px;border-radius:50%;" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'">`:""}\n      </li>\n    `}else{const e=o?.kickoff;m=`<li colspan="3">${DV2StreamKickoff.renderTimeDisplay(e)}</li>`}const v=`\n    <div id="simulate-the-match-content-center" class="flex flex-col justify-center items-center gap-4 p-4">\n      <div class="dataBox_pop">\n        <ul class="info">\n          <li style="display:flex; flex-direction:column; align-items:center;">\n            <div class="match-info__lname">${d}</div>\n            <h4>${c}</h4>\n            <ul class="timeBox">\n              ${m}\n            </ul>\n            <div class="teams flex gap-4 mt-2">\n              <div class="homeTeam" title="${r}">${r}</div>\n              <div class="vs">VS</div>\n              <div class="guestTeam" title="${l}">${l}</div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </div>\n  `;e.append(v),"countdown"===a&&t?.matchInfo?.kickoff&&DV2StreamKickoff.startCountdown(t.matchInfo.kickoff)}$(document).ready(function(){$(".dv2-layout-ck2 #stream-player").length>0&&function loadStreamData(){const a=function getMatchId_CK2(){let e=new URLSearchParams(window.location.search).get("match");return e||(e="undefined"!=typeof DV2_MATCH_ID&&DV2_MATCH_ID?DV2_MATCH_ID:"2y8m4zh54p4zql0"),e}(),n=getStreamVideoContainer_CK2();console.log("[VSC LIVE] Loading livestream detail for ID:",a);const i=document.createElement("video");i.id="liveVideo",i.controls=!1,i.autoplay=!1,i.muted=!0,i.playsInline=!0,i.setAttribute("playsinline","true"),i.poster=DV2StreamKickoff.resolvePosterUrl(s,e),i.style.width="100%",i.style.height="100%",i.style.objectFit="contain";const l=document.getElementById("stream-player");l.innerHTML="",l.appendChild(i),initStreamPlayerUi_CK2(i),showStreamLoading_CK2(n,"Đang tải thông tin trận đấu..."),$.ajax({url:`https://vsc-apidev.helizones.com/api/data/lives/${a}`,method:"GET",success:function(e){console.log("[VSC LIVE] API response:",e);const a=e?.data;if(!a)return;!function startDetailScorePoll_CK2(e){e&&(r||(r=DV2MatchScorePoll.create({container:".dv2-layout-ck2"})),r.sync(e),r.start())}
1(a),hideStreamLoading_CK2(n),initStreamOddsPanel_CK2(a);const i=function setupStreamLinks_CK2(e){const t=DV2StreamLinks.sortForDetail(e?.livestream?.links);if(!t.length)return null;o=e;const a=DV2StreamLinks.resolveActiveLink(t);return s=a.activeLink,function renderStreamLinks(e,t=0){const a=$(".dv2-stream-links-ck2");e&&0!==e.length&&(a.empty(),e.forEach((n,i)=>{const r=DV2StreamLinks.getBlvName(n,i),l=null!=n.liveId?String(n.liveId):"",d=$(`\n      <button type="button"\n        class="match_link--button py-1 px-3 font-semibold text-sm capitalize !text-[11px] lg:!text-sm border border-neutral-2 bg-btnlink text-neutral-4 flex items-center gap-1 flex-row-reverse !px-2 lg:!px-3 transition-all duration-150 bg-primary-1 text-white border-primary-1 hover:bg-primary-1 hover:text-white hover:border-primary-1 rounded-3xl \n        ${i===t?"active":""}"\n        data-link-index="${i}"\n        data-live-id="${l}"\n        data-stream-url="${n.url}">\n        <span class="inline-block">${r}</span>\n      </button>\n    `);d.on("click",function(){const t=Number($(this).attr("data-link-index")),n=e[t];if(DV2StreamLinks.navigateForLink(n))return;s=n,applyPosterForActiveLink_CK2();const i=$(this).attr("data-live-id");i&&DV2StreamLinks.updateLiveIdInUrl(i),a.find(".match_link--button").removeClass("active"),$(this).addClass("active");const r=getStreamVideoContainer_CK2(),l=$(this).data("stream-url");if(o&&initStreamOddsPanel_CK2(o),function shouldShowPreMatchOverlay_CK2(e){const t=new Date(e?.matchInfo?.kickoff);return!Number.isNaN(t.getTime())&&t.getTime()-Date.now()>9e5}(o)||!l)return clearStreamChrome_CK2(),clearMatchOverlays_CK2(r),void renderMatchInfoCard(r,o,"countdown");clearMatchOverlays_CK2(r),initHLSPlayer(l,{enableRetry:!1,matchData:o})}),a.append(d)}))}(t,a.activeIndex),applyPosterForActiveLink_CK2(),a}(a);applyPosterForActiveLink_CK2();const l=new Date(a?.matchInfo?.kickoff);if(!Number.isNaN(l.getTime())&&l.getTime()-Date.now()>9e5){const showCountdown=()=>{clearStreamChrome_CK2(),renderMatchInfoCard(n,a,"countdown")};return void(window.DV2StreamTvc?.playBeforeStream?window.DV2StreamTvc.playBeforeStream(n,showCountdown):showCountdown())}if("finished"===a?.matchInfo?.status?.toLowerCase())return clearStreamChrome_CK2(),void renderMatchInfoCard(n,a,"result");if(i?.activeLink?.url){const e=i.activeLink.url,o=t.includes(a?.matchInfo?.status?.toLowerCase()),startStream=()=>{initHLSPlayer(e,o?{enableRetry:!0,matchData:a}:{enableRetry:!1})};window.DV2StreamTvc?.playBeforeStream?window.DV2StreamTvc.playBeforeStream(n,startStream):startStream()}},error:function(e,t,a){console.error("[VSC LIVE] API error:",a),hideStreamLoading_CK2(n)}})}()})}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery,Hls){!function($){"use strict";var e="object"==typeof window.dv2Ck2Highlights&&window.dv2Ck2Highlights?window.dv2Ck2Highlights:{},t=e.apiUrl||"https://vsc-apidev.helizones.com/api/data/lives/highlights",a=e.fallbackThumb||("object"==typeof window.dv2Streaming&&window.dv2Streaming&&window.dv2Streaming.strings&&window.dv2Streaming.strings.fallbackThumb?window.dv2Streaming.strings.fallbackThumb:null)||"../../assets/images/highlight.webp",n={},i=0,o=0,s=!1,r=null,l="",d=null;function escapeHtml(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function buildCard(e){n[e.id]=e;var t=escapeHtml(e.title||""),i=escapeHtml(e.competitionName||""),o=function formatMatchDate(e){if(null==e||""===e)return"";var t=1e3*Number(e);return isFinite(t)?new Date(t).toLocaleDateString("en-US",{month:"long",day:"numeric",year:"numeric"}):""}(e.matchTimeEpoch),s=escapeHtml(function thumbSrc(e){var t=e.thumbnail;return t&&String(t).trim()?t:a}(e));return'<article class="ck2-card" role="listitem" tabindex="0" data-id="'+escapeHtml(e.id)+'"><div class="ck2-card-thumb"><img src="'+s+'" alt="" loading="lazy" onerror="this.onerror=null;this.src=\''+function escapeForSingleQuotedJs(e){return String(e).replace(/\\/g,"\\\\").replace(/'/g,"\\'")}(a)+'\'"><span class="ck2-play" aria-hidden="true"></span></div><div class="ck2-card-body"><p class="ck2-card-title">'+t+'</p><div class="ck2-card-meta"><span class="ck2-card-league">'+i+'</span><span class="ck2-card-date">'+escapeHtml(o)+"</span></div></div></article>"}function setLoading(e){s=e,$("#ck2Loading").prop("hidden",!e),$("#ck2LoadMore").prop("disabled",e)}function fetchPage(e){setLoading(!0),$("#ck2HighlightError").prop("hidden",!0).text("");var a={page:e,size:12};return l&&(a.search=l),$.ajax({url:t,method:"GET",data:a,dataType:"json"}).done(function(t){if(t&&1e3===t.code&&t.result){var a=t.result;o=a.totalPages||0,i=a.currentPage||e;var s=a.data||[];if(1===e&&($("#ck2HighlightGrid").empty(),n={}),1===e&&0===s.length)return $("#ck2HighlightEmpty").prop("hidden",!1),void $("#ck2LoadMore").prop("hidden",!0);$("#ck2HighlightEmpty").prop("hidden",!0);var r=s.map(buildCard).join("");$("#ck2HighlightGrid").append(r),function updateLoadMoreVisibility(){var e=i<o;$("#ck2LoadMore").prop("hidden",!e||0===o)}()}else $("#ck2HighlightError").prop("hidden",!1).text("Không tải được dữ liệu highlights.")}).fail(function(){$("#ck2HighlightError").prop("hidden",!1).text("Lỗi kết nối. Vui lòng thử lại sau.")}).always(function(){setLoading(!1)})}function destroyHls(){r&&(r.destroy(),r=null)}function closeModal(){var e=document.getElementById("ck2ModalVideo");destroyHls(),e.removeAttribute("src"),e.load(),$("#ck2VideoModal").prop("hidden",!0).attr("aria-hidden","true")}function onCardActivate(e){var t=n[e];t&&function openModal(e){var t=document.getElementById("ck2ModalVideo");destroyHls(),t.removeAttribute("src"),t.load(),$("#ck2ModalTitle").text(e.title||""),$("#ck2VideoModal").prop("hidden",!1).attr("aria-hidden","false");var a=e.url&&String(e.url).trim(),n=e.urlM3u8&&String(e.urlM3u8).trim();n&&window.Hls&&Hls.isSupported()?((r=new Hls({enableWorker:!0}
1)).attachMedia(t),r.on(Hls.Events.MEDIA_ATTACHED,function(){r.loadSource(n)}),r.on(Hls.Events.MANIFEST_PARSED,function(){t.play().catch(function(){})})):n&&t.canPlayType("application/vnd.apple.mpegurl")?(t.src=n,t.play().catch(function(){})):a?(t.src=a,t.play().catch(function(){})):$("#ck2ModalTitle").text((e.title||"")+" — Không phát được video trên trình duyệt này.")}(t)}$(function(){$("#ck2HighlightGrid").length&&(fetchPage(1),$("#ck2HighlightSearch").on("input",function(){var e=$(this).val();clearTimeout(d),d=setTimeout(function(){l=String(e).trim(),fetchPage(1)},350)}),$("#ck2LoadMore").on("click",function(){s||i>=o||fetchPage(i+1)}),$("#ck2HighlightGrid").on("click",".ck2-card",function(){onCardActivate($(this).data("id"))}),$("#ck2HighlightGrid").on("keydown",".ck2-card",function(e){"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),onCardActivate($(this).data("id")))}),$(document).on("click","[data-close-modal]",closeModal),$(document).on("keydown",function(e){"Escape"!==e.key||$("#ck2VideoModal").prop("hidden")||closeModal()}))})}(jQuery)}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery){$=jQuery.noConflict();const e={hotLeaguesRank:new Map};let t=null;function isNhaDaiLivestreamLink(e){if(!e)return!1;if(1e17===e.commentatorId)return!0;const t=String(e.commentator||"").trim().toLowerCase();return"nhà đài"===t||"nha dai"===t||"blv nhà đài"===t}$(document).ready(()=>{$(".dv2-ck2-home-featured-streams").length>0&&function loadHomeMatchesData_CK2(){const n=$(".dv2-ck2-home-featured-streams");if(n.empty(),function stopFeaturedMatchScorePolling(){t?.stop()}(),t?.destroy?.(),t=null,""!==("undefined"!=typeof DV2_MATCH_ID&&DV2_MATCH_ID?DV2_MATCH_ID:""))return void $.ajax({url:"https://vsc-apidev.helizones.com/api/data/lives/"+DV2_MATCH_ID,method:"GET",contentType:"application/json",success:e=>{if(e&&e.data)try{const t=renderHomeMatchCard_CK2(e.data);n.append(t),syncFeaturedMatchSnapshot(e.data),startFeaturedMatchScorePolling()}catch(e){console.error("[CK2 home-match] Render error:",e),n.html('<div class="dv2-empty-state">Lỗi hiển thị dữ liệu trận đấu.</div>')}else n.html('<div class="dv2-empty-state">Không có dữ liệu cho MATCH_ID.</div>')},error:()=>n.html('<div class="dv2-empty-state">Lỗi tải dữ liệu MATCH_ID</div>')});const i=new Date,o=new Date(i);o.setDate(i.getDate()+1);const s={fromDate:i.toISOString().split("T")[0],toDate:o.toISOString().split("T")[0]};function renderFirstFeaturedMatch(e){if("success"!==e?.status||!e?.matches_by_date)return void n.html('<div class="dv2-empty-state">Không có dữ liệu</div>');let t=[];Object.values(e.matches_by_date).forEach(e=>{t=t.concat(e)}),t=t.filter(e=>"finished"!==e?.status?.toLowerCase());const i=a(t);if(!i.length)return void n.html('<div class="dv2-empty-state">Hiện tại không có trận đấu nào đang diễn ra.</div>');const o=i[0],s=renderHomeMatchCard_CK2(o);n.append(s),syncFeaturedMatchSnapshot(o),startFeaturedMatchScorePolling()}DV2HotLeagues.load({ajax:$.ajax,setHotLeaguesRank:t=>{e.hotLeaguesRank=t}}).always(()=>{$.ajax({url:"https://vsc-apidev.helizones.com/api/data/lives/range-date",method:"POST",contentType:"application/json",data:JSON.stringify(s),success:renderFirstFeaturedMatch,error:()=>n.html('<div class="dv2-empty-state">Lỗi tải dữ liệu</div>')})})}()});const a=DV2MatchSort.createSortedMatchesFunction({mode:"wc-when-live-or-soon",liveStatuses:["first half","firsthalf","first-half","fh","half-time","half time","halftime","ht","second half","secondhalf","second-half","sh","extra time","extratime","extra time","et","overtime","overtime(deprecated)","ot","penalty","penalties","penalty shoot-out","penalty shootout"],hotLeaguesRank:()=>e.hotLeaguesRank,wcSoonMinutes:10});function syncFeaturedMatchSnapshot(e){t||(t=DV2MatchScorePoll.create({container:".dv2-ck2-home-featured-streams"})),t.sync(e)}function startFeaturedMatchScorePolling(){t?.start()}function renderHomeMatchCard_CK2(e){console.log(e);const t=new Date(e?.matchInfo?.kickoff??e?.kickoff).toLocaleTimeString("vi-VN",{hour:"2-digit",minute:"2-digit",day:"2-digit",month:"2-digit",year:"numeric",hour12:!1});console.log(t);const a=e?.teams?.home||{},n=e?.score||{},i=e?.teams?.away||{},o=e?.league||{},s=function normalizeMatchStats_CK2(e,t){const a={...t};if(!e||"object"!=typeof e)return a;for(const n of Object.keys(t))a[n]={home:e[n]?.home??t[n].home,away:e[n]?.away??t[n].away};return a}(e.stats,{possession:{home:0,away:0},shotsOnTarget:{home:0,away:0},corners:{home:0,away:0},fouls:{home:0,away:0}}),r=s.corners.home+s.corners.away,l=s.shotsOnTarget.home+s.shotsOnTarget.away,d=function getPreferredLivestreamLink(e){const t=e?.livestream?.links;return Array.isArray(t)&&t.length?(function sortLivestreamLinksPreferRealBlv(e){Array.isArray(e)&&e.sort((e,t)=>
1{const a=isNhaDaiLivestreamLink(e),n=isNhaDaiLivestreamLink(t);return a&&!n?1:!a&&n?-1:0})}(t),t[0]||null):null}(e),c=function getMatchIdFromMatch(e){return DV2MatchScorePoll.getMatchId(e)}(e),m=n?.fulltime?.home??0,v=n?.fulltime?.away??0;return`\n      <div class="flex flex-col xl:gap-4">\n        <div class="w-full">\n          <div class="pb-7 lg:pt-7 m-auto">\n            <div class="relative">\n              <a\n               href="/streams/${c}" \n                class="absolute top-0 left-0 w-full h-full z-10"\n              ></a>\n              <div\n                class="match-card-featured flex flex-col lg:flex-row gap-4 xl:gap-7 justify-center items-center"\n              >\n                <div\n                  class="match-info-primary text-white flex-1 w-full px-2 lg:px-0"\n                >\n                  <div class="event-league text-center md:pb-4">\n                    <div\n                      class="flex justify-center items-center gap-2 mb-2 md:mb-4 text-text"\n                    >\n                        <img\n                          onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                          width="20"\n                          height="20"\n                          src="${o.logo}"\n                          alt="${o.logo}"\n                        />\n                        ${o.name}\n                    </div>\n                    <div\n                      class="inline-flex gap-1.5 items-center font-semibold overflow-hidden hidden md:inline-flex rounded-3xl"\n                      style="background-color: #4986f7"\n                    >\n                      <img\n                        onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                        src=${d?.avatar||""}\n                        alt=${d?.commentator||""}\n                        class="w-8 h-8 rounded-full m-0.5"\n                      /><span class="pr-3 py-1 text-sm md:text-base py-2 !pr-4">${d?.commentator||""}</span>\n                       \n                    </div>\n                  </div>\n                  <div\n                    class="flex flex-row justify-between items-stretch gap-3 lg:gap-5 xl:gap-10 border-b border-gradient pb-4 mb-5"\n                  >\n                    <div\n                      class="flex-1 items-center justify-start flex flex-col lg:flex-row-reverse gap-2 lg:gap-4 text-center"\n                    >\n                      <div\n                        class="inline-flex justify-center items-center max-w-max p-2 lg:p-3 bg-[#5a5a5a] bg-opacity-25 rounded-full"\n                      >\n                        <img\n                          onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                          class="w-10 h-10 md:w-16 md:h-16 object-cover rounded-full flex"\n                          rel="nofollow"\n                          src="${a.logo}"\n                          alt="${a.logo}"\n                        />\n                      </div>\n                      <h5\n                        class="team-name text-base lg:text-2xl font-medium line-clamp-2 lg:text-right flex-1 min-h-10 lg:min-h-auto"\n                      >\n                        ${a.name}\n                      </h5>\n                    </div>\n                    <div\n                      class="text-2xl font-medium flex flex-col items-center justify-center gap-3"\n                    >\n                     ${e?.currentMinute??e?.currentMinutes?`<span class="time text-minute font-normal text-sm lg:text-base capitalize" data-dv2-score-minute>\n                           ${e?.currentMinute??e?.currentMinutes}'\n                         </span>`:""} <span\n                        ><span class="" data-dv2-score-home>${m}</span> -\x3c!-- --\x3e\n                        <span class="" data-dv2-score-away>${v}</span></span\n                      ><span class="time text-sm font-medium">${t}</span>\n                    </div>\n                    <div\n                      class="flex-1 items-center justify-start flex flex-col lg:flex-row gap-2 lg:gap-4 text-center"\n                    >\n                      <div\n                        class="inline-flex justify-center items-center max-w-max p-2 lg:p-3 bg-[#5a5a5a] bg-
1opacity-25 rounded-full"\n                      >\n                        <img\n                          onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                          class="w-10 h-10 md:w-16 md:h-16 object-cover rounded-full flex"\n                          rel="nofollow"\n                          src="${i.logo}"\n                          alt="${i.logo}"\n                        />\n                      </div>\n                      <h5\n                        class="team-name text-base lg:text-2xl font-medium line-clamp-2 lg:text-left flex-1 min-h-10 lg:min-h-auto"\n                      >\n                        ${i.name}\n                      </h5>\n                    </div>\n                  </div>\n                  <div class="flex gap-1 justify-between md:justify-center">\n                    <div\n                      class="inline-flex gap-1.5 items-center font-semibold overflow-hidden md:hidden rounded-3xl"\n                      style="background-color: #4986f7"\n                    >\n                      <img \n                        onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                        src="${d?.avatar||""}"\n                        alt="${d?.commentator||""}" class="w-8 h-8\n                        rounded-full m-0.5" /><span\n                        class="pr-3 py-1 text-xs py-2 !pr-4 whitespace-nowrap text-ellipsis overflow-hidden"\n                        >${d?.commentator||""}</span\n                      >\n                    </div>\n                    <div\n                      class="flex gap-1 shrink-0 justify-center z-10 relative"\n                    >\n                      <a class="cakhia-btn py-1 px-4 rounded-3xl font-semibold text-sm capitalize leading-5 bg-primary py-2 rounded-3xl cakhia-btn-hover"\n                        href="/streams/${c}">Trực tiếp</a>\n                      <a\n                        href="${window.DV2_LINK_BET}"\n                        target="_blank" rel="nofollow"\n                        class="cakhia-btn-bet text-white py-1 px-3 rounded-3xl font-semibold text-sm capitalize text-sm leading-5 bg-primary-1 py-2 px-5 rounded-3xl"\n                        >Đặt cược</a>\n                    </div>\n                  </div>\n                </div>\n                <div\n                  class="match-stats text-neutral-4 text-sm flex-col gap-2 xl:flex"\n                >\n                  <div\n                    class="o-row flex md:gap-4 xl:gap-7 items-center justify-between py-3 md:px-3 px-5 bg-stats rounded-2xl backdrop-blur-sm"\n                  >\n                    <div class="team team-home flex items-center gap-4">\n                      <span class="w-8" id="home-possession">${s?.possession?.home}%</span>\n                      <div\n                        class="md:w-16 xl:w-20 bg-neutral-2 rounded-full h-1.5 flex justify-end"\n                      >\n                        <div\n                          class="bg-neutral-3 h-1.5 rounded-full" id="home-possessionPercent"\n                          style="width: ${s?.possession?.home}%"\n                        ></div>\n                      </div>\n                    </div>\n                    <div class="title text-white capitalize text-xs xl:text-sm">\n                      Kiểm soát bóng\n                    </div>\n                    <div\n                      class="team team-away flex items-center gap-4 text-primary-1"\n                    >\n                      <div\n                        class="md:w-16 xl:w-20 bg-neutral-2 rounded-full h-1.5"\n                      >\n                        <div\n                          class="h-1.5 rounded-full bg-primary-1" id="away-possessionPercent"\n                          style="width: ${s?.possession?.away}%"\n                        ></div>\n                      </div>\n                      <span class="w-8 text-right" id="away-possession">${s?.possession?.away}%</span>\n                    </div>\n                  </div>\n                  <div\n                    class="o-row flex md:gap-4 xl:gap-7 items-center justify-between py-3 md:px-3 px-5 bg-stats rounded-2xl backdrop-blur-sm"\n                  >\n                    <div class="team team-home flex items-center gap-4">
1\n                      <span class="w-8" id="home-corners">${s?.corners?.home}</span>\n                      <div\n                        class="md:w-16 xl:w-20 bg-neutral-2 rounded-full h-1.5 flex justify-end"\n                      >\n                        <div\n                          class="bg-neutral-3 h-1.5 rounded-full" id="home-cornersPercent"\n                          style="width: ${0!==r?s?.corners?.home/r:0}"\n                        ></div>\n                      </div>\n                    </div>\n                    <div class="title text-white capitalize text-xs xl:text-sm">\n                      Góc\n                    </div>\n                    <div\n                      class="team team-away flex items-center gap-4 text-primary-1"\n                    >\n                      <div\n                        class="md:w-16 xl:w-20 bg-neutral-2 rounded-full h-1.5"\n                      >\n                        <div\n                          class="h-1.5 rounded-full bg-primary-1"  id="away-cornersPercent"\n                          style="width: ${0!==r?s?.corners?.away/r:0}"\n                        ></div>\n                      </div>\n                      <span class="w-8 text-right" id="away-corners">${s?.corners?.away}</span>\n                    </div>\n                  </div>\n                  <div\n                    class="o-row flex md:gap-4 xl:gap-7 items-center justify-between py-3 md:px-3 px-5 bg-stats rounded-2xl backdrop-blur-sm"\n                  >\n                    <div class="team team-home flex items-center gap-4">\n                      <span class="w-8">0</span>\n                      <div\n                        class="md:w-16 xl:w-20 bg-neutral-2 rounded-full h-1.5 flex justify-end"\n                      >\n                        <div\n                          class="bg-neutral-3 h-1.5 rounded-full"\n                          style="width: 0%"\n                        ></div>\n                      </div>\n                    </div>\n                    <div class="title text-white capitalize text-xs xl:text-sm">\n                      Thẻ vàng\n                    </div>\n                    <div\n                      class="team team-away flex items-center gap-4 text-primary-1"\n                    >\n                      <div\n                        class="md:w-16 xl:w-20 bg-neutral-2 rounded-full h-1.5"\n                      >\n                        <div\n                          class="h-1.5 rounded-full bg-primary-1"\n                          style="width: 0%"\n                        ></div>\n                      </div>\n                      <span class="w-8 text-right">0</span>\n                    </div>\n                  </div>\n                  <div\n                    class="o-row flex md:gap-4 xl:gap-7 items-center justify-between py-3 md:px-3 px-5 bg-stats rounded-2xl backdrop-blur-sm"\n                  >\n                    <div class="team team-home flex items-center gap-4">\n                      <span class="w-8">0</span>\n                      <div\n                        class="md:w-16 xl:w-20 bg-neutral-2 rounded-full h-1.5 flex justify-end"\n                      >\n                        <div\n                          class="bg-neutral-3 h-1.5 rounded-full"\n                          style="width: 0%"\n                        ></div>\n                      </div>\n                    </div>\n                    <div class="title text-white capitalize text-xs xl:text-sm">\n                      Thẻ đỏ\n                    </div>\n                    <div\n                      class="team team-away flex items-center gap-4 text-primary-1"\n                    >\n                      <div\n                        class="md:w-16 xl:w-20 bg-neutral-2 rounded-full h-1.5"\n                      >\n                        <div\n                          class="h-1.5 rounded-full bg-primary-1"\n                          style="width: 0%"\n                        ></div>\n                      </div>
1\n                      <span class="w-8 text-right">0</span>\n                    </div>\n                  </div>\n                  <div\n                    class="o-row flex md:gap-4 xl:gap-7 items-center justify-between py-3 md:px-3 px-5 bg-stats rounded-2xl backdrop-blur-sm"\n                  >\n                    <div class="team team-home flex items-center gap-4">\n                      <span class="w-8" id="home-shots">${s?.shotsOnTarget?.home}</span>\n                      <div\n                        class="md:w-16 xl:w-20 bg-neutral-2 rounded-full h-1.5 flex justify-end"\n                      >\n                        <div\n                          class="bg-neutral-3 h-1.5 rounded-full" id="home-shotsPercent"\n                          style="width: ${0!==l?s?.shotsOnTarget?.home/l:0}"\n                        ></div>\n                      </div>\n                    </div>\n                    <div class="title text-white capitalize text-xs xl:text-sm">\n                      Sút trúng đích\n                    </div>\n                    <div\n                      class="team team-away flex items-center gap-4 text-primary-1"\n                    >\n                      <div\n                        class="md:w-16 xl:w-20 bg-neutral-2 rounded-full h-1.5"\n                      >\n                        <div\n                          class="h-1.5 rounded-full bg-primary-1" id="away-shotsPercent"\n                          style="width: ${0!==l?s?.shotsOnTarget?.away/l:0}"\n                        ></div>\n                      </div>\n                      <span class="w-8 text-right" id="away-shots">${s?.shotsOnTarget?.away}</span>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n            `}}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery){($=jQuery.noConflict())(document).ready(()=>{$(".dv2-list-match").length>0&&async function loadHomeMatchesData_CK2(){const t=new Date,a=new Date(t),n=new Date(t);n.setDate(t.getDate()-1),a.setDate(t.getDate()+1);const i={fromDate:n.toISOString().split("T")[0],toDate:a.toISOString().split("T")[0]};$.ajax({url:"https://vsc-apidev.helizones.com/api/data/lives/range-date",method:"POST",contentType:"application/json",data:JSON.stringify(i),success:e=>{if(e&&e.matches_by_date){const t=[];Object.keys(e.matches_by_date).forEach(a=>t.push(...e.matches_by_date[a]));const a=t.filter(e=>"Finished"!==e.status);renderLiveMatch_CK2(a),function setupFilterButtons_CK2(e){$(".dv2-list-match .dv2-filter-btn").off("click").on("click",function(){$(".dv2-list-match .dv2-filter-btn").removeClass("from-[#FA764C] to-[#C84217]"),$(this).addClass("from-[#FA764C] to-[#C84217]"),renderLiveMatch_CK2(e,$(this).data("filter"))})}(a)}else $(".dv2-list-match").html('<div class="dv2-empty-state">Không có dữ liệu</div>')},error:()=>$(".dv2-list-match").html('<div class="dv2-empty-state">Lỗi tải dữ liệu</div>')}),DV2HotLeagues.load({ajax:$.ajax,setHotLeaguesRank:t=>{e.hotLeaguesRank=t}})}()});const e={hotLeaguesRank:new Map},t=["first half","firsthalf","first-half","fh","half-time","half time","halftime","ht","second half","secondhalf","second-half","sh","extra time","extratime","extra time","et","overtime","overtime(deprecated)","ot","penalty","penalties","penalty shoot-out","penalty shootout"],a=1e17;function isNhaDaiLivestreamLink(e){if(!e)return!1;if(e.commentatorId===a)return!0;const t=String(e.commentator||"").trim().toLowerCase();return"nhà đài"===t||"nha dai"===t||"blv nhà đài"===t}const n=DV2MatchSort.createSortedMatchesFunction({mode:"wc-first",liveStatuses:t,hotLeaguesRank:()=>e.hotLeaguesRank});function renderLiveMatch_CK2(a,i="all"){const o=new Date,s=a.filter(e=>{const a=new Date(e.kickoff);if("live"===i)return t.includes(e.status.toLowerCase());if("today"===i){new Date(o).setHours(0,0,0,0);const n=new Date(o);return n.setHours(23,59,59,999),"Finished"!==e.status&&a>o&&a<=n||t.includes(e.status.toLowerCase())}return"tmr"===i?a.getDate()===o.getDate()+1:t.includes(e.status.toLowerCase())||a.getTime()>o.getTime()}).sort((e,t)=>
1new Date(e.kickoff).getTime()-new Date(t.kickoff).getTime()),r=n(s),l=$(".dv2-container-ck2");if(l.empty(),!r.length)return void l.html('<div class="dv2-empty-state">Hiện tại không có trận đấu nào đang diễn ra.</div>');const d=r.map((a,n)=>function renderHomeMatchCard_VB2(a,n){const i=(new Date).toLocaleDateString("en-GB",{day:"2-digit",month:"2-digit"}),o=new Date(a.kickoff).toLocaleDateString("en-GB",{day:"2-digit",month:"2-digit"}),s=new Date(a.kickoff).toLocaleTimeString("vn-VN",{hour:"2-digit",minute:"2-digit",hour12:!1}),r=a.teams?.home||{},l=a.score||{},d=a.teams?.away||{},c=a.league||{},m=function getPreferredLivestreamLink(e){const t=e?.livestream?.links;return Array.isArray(t)&&t.length?(function sortLivestreamLinksPreferRealBlv(e){Array.isArray(e)&&e.sort((e,t)=>{const a=isNhaDaiLivestreamLink(e),n=isNhaDaiLivestreamLink(t);return a&&!n?1:!a&&n?-1:0})}(t),t[0]||null):null}(a),v=e.hotLeaguesRank.has(a.league.id),u=t.includes(a.status.toLowerCase()),h=i===o;return`\n        <div\n          class="match-info-primary text-white lg:flex lg:flex-row lg:items-center gap-5 lg:border-b border-0 lg:justify-between lg:py-5 lg:px-4 relative border-gradient-2 ${n%2==0?"bg-[#252E3F]":"bg-transparent"}"\n          >\n          <a class="absolute top-0 left-0 w-full h-full ${v?"ck2-list-match-hot":""}" href="/streams/${a?.match_id}"></a>\n          <div class="hidden lg:flex lg:flex-col-reverse 2xl:flex-row gap-2 lg:flex-1 lg:items-start 2xl:items-center">\n            <div class="w-full max-w-44 flex">\n              <div class="inline-flex gap-1.5 items-center font-semibold overflow-hidden text-xs rounded-3xl"\n                style="background-color:#4986F7"><img \n                  onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'" \n                  src=${m?.avatar||""}\n                  alt=${m?.commentator||""} class="w-8 h-8 rounded-full m-0.5"><span\n                  class="pr-3 py-1 whitespace-nowrap text-ellipsis overflow-hidden max-w-40">${m?.commentator||""}</span>\n              </div>\n            </div>\n            <div class="event-league pointer-events-none">\n              <div class="relative flex items-center gap-2 text-neutral-3">\n                <div class="flex items-center justify-center gap-2">\n                  <img width="20" height="20" src="${c.logo}" alt="${c.logo}" \n                    onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"/>\n                  <span class="text-sm line-clamp-2 max-w-36">${c.name}</span>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div class="lg:w-full lg:max-w-[500px] ">\n            <div class="event-league text-center p-3 pt-4 lg:hidden">\n              <div class="relative flex justify-center items-center gap-2 text-neutral-3">\n                <div class="flex items-center justify-center gap-2"> <img width="20" height="20" src="${c.logo}" onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                    alt="${c.logo}" />\n                  <span class="text-sm line-clamp-2 max-w-36">${c.name}</span>\n                </div>\n              </div>\n             ${u?' <div class="h-6 flex flex-1 absolute right-0">\n                <div class="flex items-center justify-center gap-1 live"><i class="fa-solid fa-circle" style="color: rgb(247 73 73)" \n                    aria-hidden="true"></i>\n                  <span class="text-sm text-primary font-semibold">Live</span>\n                </div>\n              </div>':""}\n             \n            </div>\n              <div\n              class="flex flex-row justify-center items-stretch gap-5 px-3 pb-3 mb-3 border-b border-gradient lg:p-0 lg:border-none lg:mb-0">\n              <div class="flex-1 items-center justify-start flex flex-col gap-4 text-center lg:flex-row">\n                <div class="inline-flex justify-center items-center max-w-max flex-1 basis-full"><img loading="lazy"\n                    class="w-12 h-12 object-cover rounded-full" rel="nofollow" src="${r.logo}" alt="${r.logo}"\n                    onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                    >\n                </div>\n                <h5 class="team-name text-sm font-medium line-clamp-2 min-h-10 lg:min-h-0 max-w-36 lg:text-left">\n                  ${r.name}</h5>\n              </div>\n              <div class="w-24">\n                <div class="text-2xl font-medium flex flex-col items-center justify-center gap-3"><span\n                    class="time text-minute font-normal text-sm lg:text-base capitalize"> ${a?.currentMinutes?`<span class="time text-minute font-normal text-sm lg:text-base capitalize">\n                      ${a?.currentMinutes}'\n                    </span>`:""}</span><span>${u?`${l.fulltime.home} - ${l.fulltime.away}
1`:"VS"}</span>\n                    </span>\n                    <span class="time text-sm  font-medium">${s} ${h?"":`${o}`}</span></div>\n              </div>\n              <div class="flex-1 items-center justify-start flex flex-col gap-4 text-center lg:flex-row-reverse">\n                <div class="inline-flex justify-center items-center max-w-max flex-1 basis-full"><img loading="lazy"\n                    class="w-12 h-12 object-cover rounded-full" rel="nofollow" src="${d.logo}" alt="${d.logo}"\n                      onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                    >\n                </div>\n                <h5 class="team-name text-sm font-medium line-clamp-2 min-h-10 lg:min-h-0 max-w-36 lg:text-right">\n                  ${d.name}</h5>\n              </div>\n            </div>\n          </div>\n          \n          <div class="flex justify-between items-center gap-2 px-3 pb-4 lg:flex-1 lg:justify-end lg:p-0 z-10 relative">\n            <div class="inline-flex gap-1.5 items-center font-semibold overflow-hidden lg:hidden text-xs rounded-3xl"\n              style="background-color:#4986F7"><img src=${m?.avatar||""} onerror="this.src='https://img.winfast.dev/assets/upload/football/team/images/teamicon.png'"\n                alt=${m?.commentator||""} class="w-8 h-8 rounded-full m-0.5"><span\n                class="pr-3 py-1 whitespace-nowrap text-ellipsis overflow-hidden">${m?.commentator||""}</span>\n            </div>\n            <div class="flex gap-1 shrink-0 lg:flex-col 2xl:flex-row lg:gap-2 z-10 relative text-center">\n           ${u?` <a\n                class="py-1 px-4 rounded-3xl font-semibold text-sm capitalize leading-5 bg-primary py-2 text-xs lg:text-sm lg:w-28 lg:leading-[22px] cakhia-btn-hover"\n                href="/streams/${a?.match_id}">Trực tiếp</a>`:'<button type="button" class="py-1 px-3 font-semibold text-sm capitalize  text-sm border py-2 lg:w-28 text-xs lg:text-sm text-neutral-3 border-neutral-3 rounded-3xl"><span class="inline-block">Sắp diễn ra</span></button>'}\n              <a href="${window.DV2_LINK_BET}"\n              target="_blank" rel="nofollow"\n              class="cakhia-btn-bet text-white py-1 px-3 rounded-3xl font-semibold text-sm capitalize text-sm leading-5 bg-primary-1 py-2 text-xs lg:text-sm">Đặt\n              cược</a>\n            </div>\n          </div>\n        </div>\n    </div>\n            `}(a,n)).join("");l.append(`\n                        ${d}\n                `)}}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper),function(window,$,jQuery){$=jQuery.noConflict();const e="https://vsc-apidev.helizones.com/api/data/",t={hotLeaguesRank:new Map};function isNhaDaiLivestreamLink(e){if(!e)return!1;if(1e17===e.commentatorId)return!0;const t=String(e.commentator||"").trim().toLowerCase();return"nhà đài"===t||"nha dai"===t||"blv nhà đài"===t}function escapeHtml(e){return String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function getDetailUrl(e,t){return window.DV2StreamLinks.getDetailUrl(e,t,{trailingSlash:!1})}function renderBlvAvatar(e,t,a){const n=e?.avatar;return n?`<img src="${escapeHtml(n)}" alt="${escapeHtml(t)}" class="${a}" onerror="this.style.display='none'">`:""}function buildCommentatorDropdown(e){const t=function getSortedCommentatorLinks(e){return window.DV2StreamLinks?.sortForDetail?window.DV2StreamLinks.sortForDetail(e?.livestream?.links):function sortLivestreamLinksPreferRealBlv(e){return Array.isArray(e)?(e.sort((e,t)=>{const a=isNhaDaiLivestreamLink(e),n=isNhaDaiLivestreamLink(t);return a&&!n?1:!a&&n?-1:0}),e):[]}(Array.isArray(e?.livestream?.links)?[...e.livestream.links]:[])}(e);return t.length?window.DV2BlvDropdown.build({match:e,links:t,getDetailUrl:getDetailUrl,escapeHtml:escapeHtml,menuPlacement:"up",toggleClass:"ck2-blv-dropdown__toggle--pill inline-flex gap-1.5 items-center font-semibold text-sm rounded-3xl",renderToggle:({link:e,label:t,esc:a})=>`\n      ${renderBlvAvatar(e,t,"w-8 h-8 rounded-full m-0.5")}
1\n      <span class="py-1 whitespace-nowrap text-ellipsis overflow-hidden max-w-[120px]">${a(t)}</span>\n    `,renderItemContent:({link:e,label:t,esc:a})=>`\n      ${renderBlvAvatar(e,t,"dv2-blv-dropdown__avatar")}\n      <span class="dv2-blv-dropdown__label">${a(t)}</span>\n    `}):'\n      <div class="inline-flex gap-1.5 items-center font-semibold overflow-hidden text-sm rounded-3xl" style="background-color: #4986f7">\n        <span class="pr-3 py-1 whitespace-nowrap text-ellipsis overflow-hidden">BLV Nhà Đài</span>\n      </div>\n    '}function bindCk2BlvDropdownEvents(){window.DV2BlvDropdown.bind($("#match_list_ck2_container"),{namespace:"ck2BlvDropdown"})}let a=[],n=0;$(document).ready(function(){!function loadSuggestedStreamData(){const o=new Date,s=new Date(o);s.setDate(o.getDate()+1);const r={fromDate:o.toISOString().split("T")[0],toDate:s.toISOString().split("T")[0]};console.log("[VSC LIVE] Loading suggested streams:",r),DV2HotLeagues.load({url:`${e}lives/competitions/hot`,ajax:$.ajax,setHotLeaguesRank:e=>{t.hotLeaguesRank=e}}),$.ajax({url:`${e}lives/range-date`,method:"POST",contentType:"application/json",data:JSON.stringify(r),success:function(e){if(console.log("[VSC LIVE] Suggested streams API response:",e),"success"===e?.status&&e?.matches_by_date){let t=[];Object.values(e.matches_by_date).forEach(e=>{t=t.concat(e)}),t=t.filter(e=>"finished"!==e?.status?.toLowerCase());const o=i(t);console.log("[VSC LIVE] Filtered and sorted matches:",o.length),console.log("[VSC LIVE] First few matches:",o.slice(0,3).map(e=>({id:e.match_id,status:e.status,teams:`${e.teams?.home?.name} vs ${e.teams?.away?.name}`,kickoff:e.kickoff}
1))),a=o,n=0,function initSuggestedStreams(){const e=$("#match_list_ck2_container");if(e.empty(),console.log("allMatchesGlobal",a),!a.length)return e.html('<div class="no-matches">Hiện tại không có trận đấu nào đang diễn ra.</div>'),void updateSuggestedLoadMoreVisibility();renderNextSuggestedBatch(),bindCk2BlvDropdownEvents(),$("#ck2SuggestedLoadMore").off("click").on("click",renderNextSuggestedBatch)}()}else console.error("[VSC LIVE] Invalid API response"),showError("Không thể tải danh sách trận đấu")},error:function(e,t,a){console.error("[VSC LIVE] API error:",a),showError("Có lỗi xảy ra khi tải dữ liệu")}})}()});const i=DV2MatchSort.createSortedMatchesFunction({mode:"wc-first",liveStatuses:["first half","firsthalf","first-half","fh","half-time","half time","halftime","ht","second half","secondhalf","second-half","sh","extra time","extratime","extra time","et","overtime","overtime(deprecated)","ot","penalty","penalties","penalty shoot-out","penalty shootout"],hotLeaguesRank:()=>t.hotLeaguesRank});function renderNextSuggestedBatch(){const e=$("#match_list_ck2_container"),i=a.slice(n,n+12);if(!i.length)return void updateSuggestedLoadMoreVisibility();let o="";i.forEach(e=>{o+=function generateMatchBlock(e){const a=e?.teams?.home,n=e?.teams?.away,i=e?.league,o=e?.score,s=e?.status?.toLowerCase()||"not started",r=["first half","firsthalf","first-half","fh","half-time","half time","halftime","ht","second half","secondhalf","second-half","sh","extra time","extratime","extra time","et","overtime","overtime(deprecated)","ot","penalty","penalties","penalty shoot-out","penalty shootout"].includes(s);let l="";l=r?e?.currentMinutes?`${e.currentMinutes}'`:function getCurrentMatchTime(e){const t=e?.status?.toLowerCase();return"first half"===t?"45+":"half-time"===t||"half time"===t?"HT":"second half"===t?"90+":"LIVE"}(e):"";const d=o?.fulltime?.home||0,c=o?.fulltime?.away||0,m=function getMatchId(e){return e?.match_id||e?.matchId||e?.id||e?.slug||""}(e);return`\n    <div class="match-info-primary w-full match_list--item ${t.hotLeaguesRank.has(e.league.id)?"hot-match":""} ">\n        <div class="bg-white text-black rounded-xl flex flex-col h-full">\n            <div class="relative flex-1">\n                <a class="match_item--link absolute top-0 left-0 w-full h-full"\n                    href="/streams/${m}"></a>\n                <div class="event-league text-center p-3 pt-2">\n                    <div class="flex justify-between items-center gap-2 text-neutral-3">\n                        <div class="text-primary font-medium flex items-center gap-1 uppercase flex-1">\n                            ${r?`<img decoding="async" src="${DV2_IMAGE_PATH}cakhia/hot.png" alt="hot" class="">Live`:""}\n                        </div>\n                        <div class="flex items-center justify-center gap-2">\n                            <img decoding="async" class="match_item--llogo icon-cup text-2xl leading-6" src="${i?.logo||""}" alt="${i?.name||""}" style="width: 24px; height: 24px;"/>\n                            <span class="match_item--lname text-sm whitespace-nowrap text-ellipsis overflow-hidden max-w-[150px]">\n                                ${i?.name||""}\n                            </span>\n                        </div>\n                        <div class="h-6 flex flex-1 justify-end"></div>\n                    </div>\n                </div>\n                <div class="flex flex-row justify-between items-stretch gap-3 px-2">\n                    <div class="flex-1 items-center justify-start flex flex-col gap-4 text-center">\n                        <div class="match_item--home-logo inline-flex justify-center items-center max-w-max">\n                            <img class="w-12 h-12 object-cover rounded-full" rel="nofollow"\n                                src="${a?.logo||""}"\n                                alt="${a?.name||""}">\n                        </div>\n                        <h5 class="match_item--home-name team-name text-sm lg:text-base lg:leading-5 font-medium line-clamp-2 min-h-10 lg:min-h-auto">\n                            ${a?.name||""}\n                        </h5>\n                    </div>\n                    <div class="text-2xl font-medium flex flex-col items-center justify-center gap-3">\n                        ${l?`<span class="match_item--current-time time text-minute font-normal text-sm lg:text-base capitalize">${l}</span>`:""}
1\n                        <span>\n                            ${r||"finished"===s?`<span class="match_item--home-score">${d}</span> - <span class="match_item--away-score">${c}</span>`:'<span class="">vs</span>'}\n                        </span>\n                        <span class="match_item--kickoff-time time text-sm font-medium">${function formatKickoffTime(e){if(!e)return"";const t=new Date(e);return`${t.getHours().toString().padStart(2,"0")}:${t.getMinutes().toString().padStart(2,"0")} ${t.getDate().toString().padStart(2,"0")}/${(t.getMonth()+1).toString().padStart(2,"0")}`}(e?.kickoff)}</span>\n                    </div>\n                    <div class="flex-1 items-center justify-start flex flex-col gap-4 text-center">\n                        <div class="match_item--away-logo inline-flex justify-center items-center max-w-max">\n                            <img loading="lazy" class="w-12 h-12 object-cover rounded-full" rel="nofollow"\n                                src="${n?.logo||""}"\n                                alt="${n?.name||""}">\n                        </div>\n                        <h5 class="match_item--away-name team-name text-sm lg:text-base lg:leading-5 font-medium line-clamp-2 min-h-10 lg:min-h-auto">\n                            ${n?.name||""}\n                        </h5>\n                    </div>\n                </div>\n            </div>\n            <div class="flex justify-between items-center gap-2 px-2 pb-2 text-white z-10 pt-3 mt-3 border-t border-gradient">\n                ${buildCommentatorDropdown(e)}\n                <div class="flex gap-1 shrink-0">\n                    <a class="${r?"py-1 px-4 rounded-3xl font-semibold text-sm capitalize leading-5 text-xs leading-6 bg-primary cakhia-btn-hover":"py-2 px-3 font-semibold text-sm capitalize  text-sm border text-xs border-neutral-3 text-neutral-3 rounded-3xl cakhia-btn-hover"} "\n                        href="/streams/${m}"\n                        <span class="inline-block">${r?"Trực tiếp":"Sắp diễn ra"}</span></a>\n                    <a href="${window.DV2_LINK_BET}" target="_blank" rel="nofollow" class="cakhia-btn-bet text-white py-1 px-3 rounded-3xl font-semibold text-sm capitalize text-sm leading-5 bg-primary-1 text-xs leading-6">Đặt cược</a>\n                </div>\n            </div>\n        </div>\n    </div>\n  `}(e)}),e.append(o),bindCk2BlvDropdownEvents(),n+=i.length,updateSuggestedLoadMoreVisibility()}function updateSuggestedLoadMoreVisibility(){const e=$("#ck2SuggestedLoadMore"),t=$(".ck2-suggested-streams-footer"),i=a.length>12&&n<a.length;e.length&&(i?(t.prop("hidden",!1).show(),e.prop("hidden",!1)):(t.prop("hidden",!0).hide(),e.prop("hidden",!0)))}function showError(e){$(".suggested-streams-container").html(`\n    <div class="error-message" style="color: red; text-align: center; padding: 20px;">\n      ${e}\n    </div>\n  `)}}(window,window.jQuery||window.$,window.jQuery||window.$,window.Hls,window.Swiper);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.