CINXE.COM

Review 20Bet Online Casino and Sports Betting Site for 2024

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Review 20Bet Online Casino and Sports Betting Site for 2024</title> <link rel="icon" href="/wp-content/uploads/2022/11/favicon.svg" sizes="32x32"/> <link rel="icon" href="/wp-content/uploads/2022/11/favicon.svg" sizes="192x192"/> <link rel="apple-touch-icon" href="/wp-content/uploads/2022/11/favicon.svg"/> <meta name="msapplication-TileImage" content="/wp-content/uploads/2022/11/favicon.svg"/> <style> /* montserrat-regular - latin-ext_latin */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 400; font-display: swap; src: url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-regular.eot'); /* IE9 Compat Modes */ src: local(''), url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-regular.woff') format('woff'), /* Modern Browsers */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-regular.svg#Montserrat') format('svg'); /* Legacy iOS */ } /* montserrat-600 - latin-ext_latin */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 600; font-display: swap; src: url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-600.eot'); /* IE9 Compat Modes */ src: local(''), url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-600.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-600.woff2') format('woff2'), /* Super Modern Browsers */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-600.woff') format('woff'), /* Modern Browsers */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-600.ttf') format('truetype'), /* Safari, Android, iOS */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-600.svg#Montserrat') format('svg'); /* Legacy iOS */ } /* montserrat-500 - latin-ext_latin */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 500; font-display: swap; src: url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-500.eot'); /* IE9 Compat Modes */ src: local(''), url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-500.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-500.woff2') format('woff2'), /* Super Modern Browsers */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-500.woff') format('woff'), /* Modern Browsers */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-500.ttf') format('truetype'), /* Safari, Android, iOS */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-500.svg#Montserrat') format('svg'); /* Legacy iOS */ } /* montserrat-700 - latin-ext_latin */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 700; font-display: swap; src: url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-700.eot'); /* IE9 Compat Modes */ src: local(''), url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-700.woff2') format('woff2'), /* Super Modern Browsers */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-700.woff') format('woff'), /* Modern Browsers */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ url('https://asian-bookies.net/wp-content/themes/bb/fonts/montserrat-v25-latin-ext_latin-700.svg#Montserrat') format('svg'); /* Legacy iOS */ } </style> <link rel="dns-prefetch" href="https://www.google-analytics.com"> <link rel="preconnect" href="https://www.google-analytics.com"> <link rel="dns-prefetch" href="https://www.googletagmanager.com"> <link rel="dns-prefetch" href="https://www.googletagmanager.com"> <link rel="dns-prefetch" href="https://images.dmca.com"> <link rel="preconnect" href="https://images.dmca.com"> <meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /> <style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style> <!-- This site is optimized with the Yoast SEO plugin v24.5 - https://yoast.com/wordpress/plugins/seo/ --> <meta name="description" content="20Bet online casino and bookmaker review in 2024! ⭐ Get a 20Bet Bonus! ✅ Is 20Bet a legal, safe and trusted gambling site for Asian Punters? ✅ Reg&amp;Bet with AsiaBetting.Online!" /> <link rel="canonical" href="https://asian-bookies.net/review/20bet/" /> <meta property="og:locale" content="en_GB" /> <meta property="og:type" content="article" /> <meta property="og:title" content="Review 20Bet Online Casino and Sports Betting Site for 2024" /> <meta property="og:description" content="20Bet online casino and bookmaker review in 2024! ⭐ Get a 20Bet Bonus! ✅ Is 20Bet a legal, safe and trusted gambling site for Asian Punters? ✅ Reg&amp;Bet with AsiaBetting.Online!" /> <meta property="og:url" content="https://asian-bookies.net/review/20bet/" /> <meta property="og:site_name" content="96 Bets Asia" /> <meta property="article:publisher" content="https://www.facebook.com/AsianBookiesNet" /> <meta property="article:modified_time" content="2024-04-14T19:55:23+00:00" /> <meta property="og:image" content="https://asian-bookies.net/wp-content/uploads/2023/06/logo.png" /> <meta property="og:image:width" content="267" /> <meta property="og:image:height" content="74" /> <meta property="og:image:type" content="image/png" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:site" content="@AsianBookiesNet" /> <script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"WebPage","@id":"https://asian-bookies.net/review/20bet/","url":"https://asian-bookies.net/review/20bet/","name":"Review 20Bet Online Casino and Sports Betting Site for 2024","isPartOf":{"@id":"https://asian-bookies.net/#website"},"datePublished":"2022-12-17T14:01:31+00:00","dateModified":"2024-04-14T19:55:23+00:00","description":"20Bet online casino and bookmaker review in 2024! ⭐ Get a 20Bet Bonus! ✅ Is 20Bet a legal, safe and trusted gambling site for Asian Punters? ✅ Reg&Bet with AsiaBetting.Online!","breadcrumb":{"@id":"https://asian-bookies.net/review/20bet/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https://asian-bookies.net/review/20bet/"]}]},{"@type":"BreadcrumbList","@id":"https://asian-bookies.net/review/20bet/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://asian-bookies.net/"},{"@type":"ListItem","position":2,"name":"Reviews","item":"https://asian-bookies.net/review/"},{"@type":"ListItem","position":3,"name":"20Bet"}]},{"@type":"WebSite","@id":"https://asian-bookies.net/#website","url":"https://asian-bookies.net/","name":"asian-bookies.net","description":"96 Bets Asia (Asian-Bookies.net)","publisher":{"@id":"https://asian-bookies.net/#organization"},"alternateName":"asian-bookies.net","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://asian-bookies.net/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https://asian-bookies.net/#organization","name":"Asian Bookies","alternateName":"asian-bookies.net","url":"https://asian-bookies.net/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https://asian-bookies.net/#/schema/logo/image/","url":"https://asian-bookies.net/wp-content/uploads/2023/03/logo_dark_purple_240-160.png","contentUrl":"https://asian-bookies.net/wp-content/uploads/2023/03/logo_dark_purple_240-160.png","width":240,"height":158,"caption":"Asian Bookies"},"image":{"@id":"https://asian-bookies.net/#/schema/logo/image/"},"sameAs":["https://www.facebook.com/AsianBookiesNet","https://x.com/AsianBookiesNet"]}]}</script> <!-- / Yoast SEO plugin. --> <script type="text/javascript"> /* <![CDATA[ */ window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/asian-bookies.net\/wp-includes\/js\/wp-emoji-release.min.js?ver=6.7.2"}}; /*! This file is auto-generated */ !function(i,n){var o,s,e;function c(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function p(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data),r=(e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0),new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data));return t.every(function(e,t){return e===r[t]})}function u(e,t,n){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\uddfa\ud83c\uddf3","\ud83c\uddfa\u200b\ud83c\uddf3")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!n(e,"\ud83d\udc26\u200d\u2b1b","\ud83d\udc26\u200b\u2b1b")}return!1}function f(e,t,n){var r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):i.createElement("canvas"),a=r.getContext("2d",{willReadFrequently:!0}),o=(a.textBaseline="top",a.font="600 32px Arial",{});return e.forEach(function(e){o[e]=t(a,e,n)}),o}function t(e){var t=i.createElement("script");t.src=e,t.defer=!0,i.head.appendChild(t)}"undefined"!=typeof Promise&&(o="wpEmojiSettingsSupports",s=["flag","emoji"],n.supports={everything:!0,everythingExceptFlag:!0},e=new Promise(function(e){i.addEventListener("DOMContentLoaded",e,{once:!0})}),new Promise(function(t){var n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"}),a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=function(e){c(n=e.data),a.terminate(),t(n)})}catch(e){}c(n=f(s,u,p))}t(n)}).then(function(e){for(var t in e)n.supports[t]=e[t],n.supports.everything=n.supports.everything&&n.supports[t],"flag"!==t&&(n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&n.supports[t]);n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&!n.supports.flag,n.DOMReady=!1,n.readyCallback=function(){n.DOMReady=!0}}).then(function(){return e}).then(function(){var e;n.supports.everything||(n.readyCallback(),(e=n.source||{}).concatemoji?t(e.concatemoji):e.wpemoji&&e.twemoji&&(t(e.twemoji),t(e.wpemoji)))}))}((window,document),window._wpemojiSettings); /* ]]> */ </script> <style id='wp-emoji-styles-inline-css' type='text/css'> img.wp-smiley, img.emoji { display: inline !important; border: none !important; box-shadow: none !important; height: 1em !important; width: 1em !important; margin: 0 0.07em !important; vertical-align: -0.1em !important; background: none !important; padding: 0 !important; } </style> <style id='safe-svg-svg-icon-style-inline-css' type='text/css'> .safe-svg-cover{text-align:center}.safe-svg-cover .safe-svg-inside{display:inline-block;max-width:100%}.safe-svg-cover svg{height:100%;max-height:100%;max-width:100%;width:100%} </style> <style id='classic-theme-styles-inline-css' type='text/css'> /*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} </style> <link rel='stylesheet' id='poka-review-vendor-css' href='https://asian-bookies.net/wp-content/plugins/poka-review/public/css/poka-review-vendor.min.css?ver=1.0.8' type='text/css' media='all' /> <link rel='stylesheet' id='poka-review-main-css' href='https://asian-bookies.net/wp-content/plugins/poka-review/public/css/poka-review-main.css?ver=1.0.8' type='text/css' media='all' /> <link rel='stylesheet' id='dashicons-css' href='https://asian-bookies.net/wp-includes/css/dashicons.min.css?ver=6.7.2' type='text/css' media='all' /> <link rel='stylesheet' id='swiper-css' href='https://asian-bookies.net/wp-content/themes/bb/dist/styles/swiper.css?ver=6.7.2' type='text/css' media='all' /> <link rel='stylesheet' id='styles-css' href='https://asian-bookies.net/wp-content/themes/bb/dist/styles/styles.min.css?v=67ba66ef92b42&#038;ver=6.7.2' type='text/css' media='all' /> <link rel="https://api.w.org/" href="https://asian-bookies.net/wp-json/" /><!-- Advance Canonical URL (Basic) --><link rel="canonical" href="https://asian-bookies.net/review/20bet/"><!-- Advance Canonical URL --><script>document.createElement( "picture" );if(!window.HTMLPictureElement && document.addEventListener) {window.addEventListener("DOMContentLoaded", function() {var s = document.createElement("script");s.src = "https://asian-bookies.net/wp-content/plugins/webp-express/js/picturefill.min.js";document.body.appendChild(s);});}</script><style type="text/css">/** Wednesday 28th June 2023 12:36:15 UTC (core) **//** THIS FILE IS AUTOMATICALLY GENERATED - DO NOT MAKE MANUAL EDITS! **//** Custom CSS should be added to Mega Menu > Menu Themes > Custom Styling **/.mega-menu-last-modified-1687955775 { content: 'Wednesday 28th June 2023 12:36:15 UTC'; }#mega-menu-wrap-main_menu, #mega-menu-wrap-main_menu #mega-menu-main_menu, #mega-menu-wrap-main_menu #mega-menu-main_menu ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-row, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-column, #mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu span.mega-menu-badge {transition: none;border-radius: 0;box-shadow: none;background: none;border: 0;bottom: auto;box-sizing: border-box;clip: auto;color: #666;display: block;float: none;font-family: inherit;font-size: 14px;height: auto;left: auto;line-height: 1.7;list-style-type: none;margin: 0;min-height: auto;max-height: none;min-width: auto;max-width: none;opacity: 1;outline: none;overflow: visible;padding: 0;position: relative;pointer-events: auto;right: auto;text-align: left;text-decoration: none;text-indent: 0;text-transform: none;transform: none;top: auto;vertical-align: baseline;visibility: inherit;width: auto;word-wrap: break-word;white-space: normal;}#mega-menu-wrap-main_menu:before, #mega-menu-wrap-main_menu #mega-menu-main_menu:before, #mega-menu-wrap-main_menu #mega-menu-main_menu ul.mega-sub-menu:before, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item:before, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-row:before, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-column:before, #mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link:before, #mega-menu-wrap-main_menu #mega-menu-main_menu span.mega-menu-badge:before, #mega-menu-wrap-main_menu:after, #mega-menu-wrap-main_menu #mega-menu-main_menu:after, #mega-menu-wrap-main_menu #mega-menu-main_menu ul.mega-sub-menu:after, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item:after, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-row:after, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-column:after, #mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link:after, #mega-menu-wrap-main_menu #mega-menu-main_menu span.mega-menu-badge:after {display: none;}#mega-menu-wrap-main_menu {border-radius: 0;}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu {background: #222;}}#mega-menu-wrap-main_menu.mega-keyboard-navigation .mega-menu-toggle:focus, #mega-menu-wrap-main_menu.mega-keyboard-navigation .mega-toggle-block:focus, #mega-menu-wrap-main_menu.mega-keyboard-navigation .mega-toggle-block a:focus, #mega-menu-wrap-main_menu.mega-keyboard-navigation .mega-toggle-block .mega-search input[type=text]:focus, #mega-menu-wrap-main_menu.mega-keyboard-navigation .mega-toggle-block button.mega-toggle-animated:focus, #mega-menu-wrap-main_menu.mega-keyboard-navigation #mega-menu-main_menu a:focus, #mega-menu-wrap-main_menu.mega-keyboard-navigation #mega-menu-main_menu span:focus, #mega-menu-wrap-main_menu.mega-keyboard-navigation #mega-menu-main_menu input:focus, #mega-menu-wrap-main_menu.mega-keyboard-navigation #mega-menu-main_menu li.mega-menu-item a.mega-menu-link:focus {outline: 3px solid #109cde;outline-offset: -3px;}#mega-menu-wrap-main_menu.mega-keyboard-navigation .mega-toggle-block button.mega-toggle-animated:focus {outline-offset: 2px;}#mega-menu-wrap-main_menu.mega-keyboard-navigation > li.mega-menu-item > a.mega-menu-link:focus {background: #333;color: #fff;font-weight: normal;text-decoration: none;border-color: #fff;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu.mega-keyboard-navigation > li.mega-menu-item > a.mega-menu-link:focus {color: #fff;background: #333;}}#mega-menu-wrap-main_menu #mega-menu-main_menu {visibility: visible;text-align: left;padding: 0px 0px 0px 0px;}#mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link {cursor: pointer;display: inline;}#mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link .mega-description-group {vertical-align: middle;display: inline-block;transition: none;}#mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link .mega-description-group .mega-menu-title, #mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link .mega-description-group .mega-menu-description {transition: none;line-height: 1.5;display: block;}#mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link .mega-description-group .mega-menu-description {font-style: italic;font-size: 0.8em;text-transform: none;font-weight: normal;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu li.mega-menu-item.mega-icon-left.mega-has-description.mega-has-icon > a.mega-menu-link {display: flex;align-items: center;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu li.mega-menu-item.mega-icon-left.mega-has-description.mega-has-icon > a.mega-menu-link:before {flex: 0 0 auto;align-self: flex-start;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-tabbed.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item.mega-icon-left.mega-has-description.mega-has-icon > a.mega-menu-link {display: block;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-icon-top > a.mega-menu-link {display: table-cell;vertical-align: middle;line-height: initial;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-icon-top > a.mega-menu-link:before {display: block;margin: 0 0 6px 0;text-align: center;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-icon-top > a.mega-menu-link > span.mega-title-below {display: inline-block;transition: none;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-icon-top > a.mega-menu-link {display: block;line-height: 40px;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-icon-top > a.mega-menu-link:before {display: inline-block;margin: 0 6px 0 0;text-align: left;}}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-icon-right > a.mega-menu-link:before {float: right;margin: 0 0 0 6px;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-animating > ul.mega-sub-menu {pointer-events: none;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-disable-link > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu li.mega-disable-link > a.mega-menu-link {cursor: inherit;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children.mega-disable-link > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > li.mega-menu-item-has-children.mega-disable-link > a.mega-menu-link {cursor: pointer;}#mega-menu-wrap-main_menu #mega-menu-main_menu p {margin-bottom: 10px;}#mega-menu-wrap-main_menu #mega-menu-main_menu input, #mega-menu-wrap-main_menu #mega-menu-main_menu img {max-width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item > ul.mega-sub-menu {display: block;visibility: hidden;opacity: 1;pointer-events: auto;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item > ul.mega-sub-menu {display: none;visibility: visible;opacity: 1;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-toggle-on > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu.mega-menu-item.mega-toggle-on ul.mega-sub-menu {display: block;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu.mega-menu-item.mega-toggle-on li.mega-hide-sub-menu-on-mobile > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-hide-sub-menu-on-mobile > ul.mega-sub-menu {display: none;}}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade"] li.mega-menu-item > ul.mega-sub-menu {opacity: 0;transition: opacity 200ms ease-in, visibility 200ms ease-in;}#mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade"].mega-no-js li.mega-menu-item:hover > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade"].mega-no-js li.mega-menu-item:focus > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade"] li.mega-menu-item.mega-toggle-on > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade"] li.mega-menu-item.mega-menu-megamenu.mega-toggle-on ul.mega-sub-menu {opacity: 1;}#mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade_up"] li.mega-menu-item.mega-menu-megamenu > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade_up"] li.mega-menu-item.mega-menu-flyout ul.mega-sub-menu {opacity: 0;transform: translate(0, 10px);transition: opacity 200ms ease-in, transform 200ms ease-in, visibility 200ms ease-in;}#mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade_up"].mega-no-js li.mega-menu-item:hover > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade_up"].mega-no-js li.mega-menu-item:focus > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade_up"] li.mega-menu-item.mega-toggle-on > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="fade_up"] li.mega-menu-item.mega-menu-megamenu.mega-toggle-on ul.mega-sub-menu {opacity: 1;transform: translate(0, 0);}#mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="slide_up"] li.mega-menu-item.mega-menu-megamenu > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="slide_up"] li.mega-menu-item.mega-menu-flyout ul.mega-sub-menu {transform: translate(0, 10px);transition: transform 200ms ease-in, visibility 200ms ease-in;}#mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="slide_up"].mega-no-js li.mega-menu-item:hover > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="slide_up"].mega-no-js li.mega-menu-item:focus > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="slide_up"] li.mega-menu-item.mega-toggle-on > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu[data-effect="slide_up"] li.mega-menu-item.mega-menu-megamenu.mega-toggle-on ul.mega-sub-menu {transform: translate(0, 0);}}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu li.mega-collapse-children > ul.mega-sub-menu {display: none;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu li.mega-collapse-children.mega-toggle-on > ul.mega-sub-menu {display: block;}#mega-menu-wrap-main_menu #mega-menu-main_menu.mega-no-js li.mega-menu-item:hover > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu.mega-no-js li.mega-menu-item:focus > ul.mega-sub-menu, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-toggle-on > ul.mega-sub-menu {visibility: visible;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu ul.mega-sub-menu {visibility: inherit;opacity: 1;display: block;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu li.mega-1-columns > ul.mega-sub-menu > li.mega-menu-item {float: left;width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu li.mega-2-columns > ul.mega-sub-menu > li.mega-menu-item {float: left;width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu li.mega-3-columns > ul.mega-sub-menu > li.mega-menu-item {float: left;width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu li.mega-4-columns > ul.mega-sub-menu > li.mega-menu-item {float: left;width: 25%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu li.mega-5-columns > ul.mega-sub-menu > li.mega-menu-item {float: left;width: 20%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-menu-megamenu ul.mega-sub-menu li.mega-6-columns > ul.mega-sub-menu > li.mega-menu-item {float: left;width: 16.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item a[class^='dashicons']:before {font-family: dashicons;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item a.mega-menu-link:before {display: inline-block;font: inherit;font-family: dashicons;position: static;margin: 0 6px 0 0px;vertical-align: top;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;color: inherit;background: transparent;height: auto;width: auto;top: auto;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-hide-text a.mega-menu-link:before {margin: 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item.mega-hide-text li.mega-menu-item a.mega-menu-link:before {margin: 0 6px 0 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-align-bottom-left.mega-toggle-on > a.mega-menu-link {border-radius: 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-align-bottom-right > ul.mega-sub-menu {right: 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-align-bottom-right.mega-toggle-on > a.mega-menu-link {border-radius: 0;}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu.mega-menu-item {position: static;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item {margin: 0 0px 0 0;display: inline-block;height: auto;vertical-align: middle;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-item-align-right {float: right;}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-item-align-right {margin: 0 0 0 0px;}}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-item-align-float-left {float: left;}}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item > a.mega-menu-link:focus {background: #333;color: #fff;font-weight: normal;text-decoration: none;border-color: #fff;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-toggle-on > a.mega-menu-link {background: #333;color: #fff;font-weight: normal;text-decoration: none;border-color: #fff;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-toggle-on > a.mega-menu-link {color: #fff;background: #333;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-current-menu-item > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-current-menu-ancestor > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-current-page-ancestor > a.mega-menu-link {background: #333;color: #fff;font-weight: normal;text-decoration: none;border-color: #fff;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-current-menu-item > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-current-menu-ancestor > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-current-page-ancestor > a.mega-menu-link {color: #fff;background: #333;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item > a.mega-menu-link {line-height: 40px;height: 40px;padding: 0px 10px 0px 10px;vertical-align: baseline;width: auto;display: block;color: #fff;text-transform: none;text-decoration: none;text-align: left;background: rgba(0, 0, 0, 0);border: 0;border-radius: 0;font-family: inherit;font-size: 14px;font-weight: normal;outline: none;}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-multi-line > a.mega-menu-link {line-height: inherit;display: table-cell;vertical-align: middle;}}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-multi-line > a.mega-menu-link br {display: none;}}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item {display: list-item;margin: 0;clear: both;border: 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item.mega-item-align-right {float: none;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-item > a.mega-menu-link {border-radius: 0;border: 0;margin: 0;line-height: 40px;height: 40px;padding: 0 10px;background: transparent;text-align: left;color: #fff;font-size: 14px;}}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row {width: 100%;float: left;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row .mega-menu-column {float: left;min-height: 1px;}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-1 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-2 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-2 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-3 {width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-3 {width: 66.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-3 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-4 {width: 25%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-4 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-4 {width: 75%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-4 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-5 {width: 20%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-5 {width: 40%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-5 {width: 60%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-5 {width: 80%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-5-of-5 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-6 {width: 16.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-6 {width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-6 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-6 {width: 66.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-5-of-6 {width: 83.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-6-of-6 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-7 {width: 14.28571%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-7 {width: 28.57143%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-7 {width: 42.85714%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-7 {width: 57.14286%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-5-of-7 {width: 71.42857%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-6-of-7 {width: 85.71429%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-7-of-7 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-8 {width: 12.5%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-8 {width: 25%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-8 {width: 37.5%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-8 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-5-of-8 {width: 62.5%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-6-of-8 {width: 75%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-7-of-8 {width: 87.5%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-8-of-8 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-9 {width: 11.11111%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-9 {width: 22.22222%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-9 {width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-9 {width: 44.44444%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-5-of-9 {width: 55.55556%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-6-of-9 {width: 66.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-7-of-9 {width: 77.77778%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-8-of-9 {width: 88.88889%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-9-of-9 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-10 {width: 10%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-10 {width: 20%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-10 {width: 30%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-10 {width: 40%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-5-of-10 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-6-of-10 {width: 60%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-7-of-10 {width: 70%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-8-of-10 {width: 80%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-9-of-10 {width: 90%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-10-of-10 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-11 {width: 9.09091%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-11 {width: 18.18182%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-11 {width: 27.27273%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-11 {width: 36.36364%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-5-of-11 {width: 45.45455%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-6-of-11 {width: 54.54545%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-7-of-11 {width: 63.63636%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-8-of-11 {width: 72.72727%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-9-of-11 {width: 81.81818%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-10-of-11 {width: 90.90909%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-11-of-11 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-1-of-12 {width: 8.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-2-of-12 {width: 16.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-3-of-12 {width: 25%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-4-of-12 {width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-5-of-12 {width: 41.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-6-of-12 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-7-of-12 {width: 58.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-8-of-12 {width: 66.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-9-of-12 {width: 75%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-10-of-12 {width: 83.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-11-of-12 {width: 91.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-columns-12-of-12 {width: 100%;}}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row > ul.mega-sub-menu > li.mega-menu-column {width: 100%;clear: both;}}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-row .mega-menu-column > ul.mega-sub-menu > li.mega-menu-item {padding: 15px 15px 15px 15px;width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu {z-index: 999;border-radius: 0;background: #f1f1f1;border: 0;padding: 0px 0px 0px 0px;position: absolute;width: 100%;max-width: none;left: 0;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu {float: left;position: static;width: 100%;}}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-1 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-2 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-2 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-3 {width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-3 {width: 66.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-3 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-4 {width: 25%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-4 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-4 {width: 75%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-4 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-5 {width: 20%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-5 {width: 40%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-5 {width: 60%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-5 {width: 80%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-5-of-5 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-6 {width: 16.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-6 {width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-6 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-6 {width: 66.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-5-of-6 {width: 83.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-6-of-6 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-7 {width: 14.28571%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-7 {width: 28.57143%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-7 {width: 42.85714%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-7 {width: 57.14286%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-5-of-7 {width: 71.42857%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-6-of-7 {width: 85.71429%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-7-of-7 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-8 {width: 12.5%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-8 {width: 25%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-8 {width: 37.5%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-8 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-5-of-8 {width: 62.5%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-6-of-8 {width: 75%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-7-of-8 {width: 87.5%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-8-of-8 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-9 {width: 11.11111%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-9 {width: 22.22222%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-9 {width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-9 {width: 44.44444%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-5-of-9 {width: 55.55556%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-6-of-9 {width: 66.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-7-of-9 {width: 77.77778%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-8-of-9 {width: 88.88889%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-9-of-9 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-10 {width: 10%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-10 {width: 20%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-10 {width: 30%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-10 {width: 40%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-5-of-10 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-6-of-10 {width: 60%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-7-of-10 {width: 70%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-8-of-10 {width: 80%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-9-of-10 {width: 90%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-10-of-10 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-11 {width: 9.09091%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-11 {width: 18.18182%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-11 {width: 27.27273%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-11 {width: 36.36364%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-5-of-11 {width: 45.45455%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-6-of-11 {width: 54.54545%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-7-of-11 {width: 63.63636%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-8-of-11 {width: 72.72727%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-9-of-11 {width: 81.81818%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-10-of-11 {width: 90.90909%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-11-of-11 {width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-1-of-12 {width: 8.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-2-of-12 {width: 16.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-3-of-12 {width: 25%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-4-of-12 {width: 33.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-5-of-12 {width: 41.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-6-of-12 {width: 50%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-7-of-12 {width: 58.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-8-of-12 {width: 66.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-9-of-12 {width: 75%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-10-of-12 {width: 83.33333%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-11-of-12 {width: 91.66667%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-columns-12-of-12 {width: 100%;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu .mega-description-group .mega-menu-description {margin: 5px 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item ul.mega-sub-menu {clear: both;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item ul.mega-sub-menu li.mega-menu-item ul.mega-sub-menu {margin-left: 10px;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu ul.mega-sub-menu ul.mega-sub-menu {margin-left: 10px;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item {color: #666;font-family: inherit;font-size: 14px;display: block;float: left;clear: none;padding: 15px 15px 15px 15px;vertical-align: top;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item.mega-menu-clear, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item.mega-menu-clear {clear: left;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item h4.mega-block-title, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item h4.mega-block-title {color: #555;font-family: inherit;font-size: 16px;text-transform: uppercase;text-decoration: none;font-weight: bold;text-align: left;margin: 0px 0px 0px 0px;padding: 0px 0px 5px 0px;vertical-align: top;display: block;visibility: inherit;border: 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item h4.mega-block-title:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item h4.mega-block-title:hover {border-color: rgba(0, 0, 0, 0);}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link {/* Mega Menu > Menu Themes > Mega Menus > Second Level Menu Items */color: #555;font-family: inherit;font-size: 16px;text-transform: uppercase;text-decoration: none;font-weight: bold;text-align: left;margin: 0px 0px 0px 0px;padding: 0px 0px 0px 0px;vertical-align: top;display: block;border: 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:hover {border-color: rgba(0, 0, 0, 0);}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:focus, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:focus {/* Mega Menu > Menu Themes > Mega Menus > Second Level Menu Items (Hover) */color: #555;font-weight: bold;text-decoration: none;background: rgba(0, 0, 0, 0);}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:hover > span.mega-title-below, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:hover > span.mega-title-below, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:focus > span.mega-title-below, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:focus > span.mega-title-below {text-decoration: none;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item > a.mega-menu-link {/* Mega Menu > Menu Themes > Mega Menus > Third Level Menu Items */color: #666;font-family: inherit;font-size: 14px;text-transform: none;text-decoration: none;font-weight: normal;text-align: left;margin: 0px 0px 0px 0px;padding: 0px 0px 0px 0px;vertical-align: top;display: block;border: 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item > a.mega-menu-link:hover {border-color: rgba(0, 0, 0, 0);}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item.mega-icon-left.mega-has-description.mega-has-icon > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item.mega-icon-left.mega-has-description.mega-has-icon > a.mega-menu-link {display: flex;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item > a.mega-menu-link:focus, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item li.mega-menu-item > a.mega-menu-link:focus {/* Mega Menu > Menu Themes > Mega Menus > Third Level Menu Items (Hover) */color: #666;font-weight: normal;text-decoration: none;background: rgba(0, 0, 0, 0);}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu {border: 0;padding: 10px;border-radius: 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-menu-item {width: 100%;clear: both;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu.mega-no-headers > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu.mega-no-headers > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link {color: #666;font-family: inherit;font-size: 14px;text-transform: none;text-decoration: none;font-weight: normal;margin: 0;border: 0;padding: 0px 0px 0px 0px;vertical-align: top;display: block;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu.mega-no-headers > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu.mega-no-headers > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:focus, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu.mega-no-headers > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu.mega-no-headers > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item > a.mega-menu-link:focus {color: #666;font-weight: normal;text-decoration: none;background: rgba(0, 0, 0, 0);}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu {z-index: 999;position: absolute;width: 250px;max-width: none;padding: 0px 0px 0px 0px;border: 0;background: #f1f1f1;border-radius: 0;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu {float: left;position: static;width: 100%;padding: 0;border: 0;border-radius: 0;}}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item {clear: both;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item a.mega-menu-link {display: block;background: #f1f1f1;color: #666;font-family: inherit;font-size: 14px;font-weight: normal;padding: 0px 10px 0px 10px;line-height: 35px;text-decoration: none;text-transform: none;vertical-align: baseline;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item:first-child > a.mega-menu-link {border-top-left-radius: 0px;border-top-right-radius: 0px;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item:first-child > a.mega-menu-link {border-top-left-radius: 0;border-top-right-radius: 0;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item:last-child > a.mega-menu-link {border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item:last-child > a.mega-menu-link {border-bottom-right-radius: 0;border-bottom-left-radius: 0;}}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item a.mega-menu-link:hover, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item a.mega-menu-link:focus {background: #ddd;font-weight: normal;text-decoration: none;color: #666;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item ul.mega-sub-menu {position: absolute;left: 100%;top: 0;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item ul.mega-sub-menu {position: static;left: 0;width: 100%;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item ul.mega-sub-menu a.mega-menu-link {padding-left: 20px;}#mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-flyout ul.mega-sub-menu li.mega-menu-item ul.mega-sub-menu ul.mega-sub-menu a.mega-menu-link {padding-left: 30px;}}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children > a.mega-menu-link > span.mega-indicator {display: inline-block;width: auto;background: transparent;position: relative;pointer-events: auto;left: auto;min-width: auto;font-size: inherit;padding: 0;margin: 0 0 0 6px;height: auto;line-height: inherit;color: inherit;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children > a.mega-menu-link > span.mega-indicator:after {content: '\f140';font-family: dashicons;font-weight: normal;display: inline-block;margin: 0;vertical-align: top;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;transform: rotate(0);color: inherit;position: relative;background: transparent;height: auto;width: auto;right: auto;line-height: inherit;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children li.mega-menu-item-has-children > a.mega-menu-link > span.mega-indicator {float: right;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children.mega-collapse-children.mega-toggle-on > a.mega-menu-link > span.mega-indicator:after {content: '\f142';}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children > a.mega-menu-link > span.mega-indicator {float: right;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children.mega-toggle-on > a.mega-menu-link > span.mega-indicator:after {content: '\f142';}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children.mega-hide-sub-menu-on-mobile > a.mega-menu-link > span.mega-indicator {display: none;}}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-megamenu:not(.mega-menu-tabbed) li.mega-menu-item-has-children:not(.mega-collapse-children) > a.mega-menu-link > span.mega-indicator, #mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-item-has-children.mega-hide-arrow > a.mega-menu-link > span.mega-indicator {display: none;}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-flyout li.mega-menu-item a.mega-menu-link > span.mega-indicator:after {content: '\f139';}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-flyout.mega-align-bottom-right li.mega-menu-item a.mega-menu-link {text-align: right;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-flyout.mega-align-bottom-right li.mega-menu-item a.mega-menu-link > span.mega-indicator {float: left;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-flyout.mega-align-bottom-right li.mega-menu-item a.mega-menu-link > span.mega-indicator:after {content: '\f141';margin: 0 6px 0 0;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-flyout.mega-align-bottom-right li.mega-menu-item a.mega-menu-link:before {float: right;margin: 0 0 0 6px;}#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-menu-flyout.mega-align-bottom-right ul.mega-sub-menu li.mega-menu-item ul.mega-sub-menu {left: -100%;top: 0;}}#mega-menu-wrap-main_menu #mega-menu-main_menu li[class^='mega-lang-item'] > a.mega-menu-link > img {display: inline;}#mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link > img.wpml-ls-flag, #mega-menu-wrap-main_menu #mega-menu-main_menu a.mega-menu-link > img.iclflag {display: inline;margin-right: 8px;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-hide-on-mobile, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-hide-on-mobile, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item.mega-hide-on-mobile {display: none;}}@media only screen and (min-width: 769px) {#mega-menu-wrap-main_menu #mega-menu-main_menu li.mega-hide-on-desktop, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu > li.mega-hide-on-desktop, #mega-menu-wrap-main_menu #mega-menu-main_menu > li.mega-menu-megamenu > ul.mega-sub-menu li.mega-menu-column > ul.mega-sub-menu > li.mega-menu-item.mega-hide-on-desktop {display: none;}}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu:after {content: "";display: table;clear: both;}}#mega-menu-wrap-main_menu .mega-menu-toggle {display: none;z-index: 1;cursor: pointer;background: #222;border-radius: 2px 2px 2px 2px;line-height: 40px;height: 40px;text-align: left;user-select: none;-webkit-tap-highlight-color: transparent;outline: none;white-space: nowrap;}#mega-menu-wrap-main_menu .mega-menu-toggle img {max-width: 100%;padding: 0;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu .mega-menu-toggle {display: -webkit-box;display: -ms-flexbox;display: -webkit-flex;display: flex;}}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-left, #mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-center, #mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-right {display: -webkit-box;display: -ms-flexbox;display: -webkit-flex;display: flex;-ms-flex-preferred-size: 33.33%;-webkit-flex-basis: 33.33%;flex-basis: 33.33%;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-left {-webkit-box-flex: 1;-ms-flex: 1;-webkit-flex: 1;flex: 1;-webkit-box-pack: start;-ms-flex-pack: start;-webkit-justify-content: flex-start;justify-content: flex-start;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-left .mega-toggle-block {margin-left: 6px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-left .mega-toggle-block:only-child {margin-right: 6px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-center {-webkit-box-pack: center;-ms-flex-pack: center;-webkit-justify-content: center;justify-content: center;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-center .mega-toggle-block {margin-left: 3px;margin-right: 3px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-right {-webkit-box-flex: 1;-ms-flex: 1;-webkit-flex: 1;flex: 1;-webkit-box-pack: end;-ms-flex-pack: end;-webkit-justify-content: flex-end;justify-content: flex-end;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-right .mega-toggle-block {margin-right: 6px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-blocks-right .mega-toggle-block:only-child {margin-left: 6px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block {display: -webkit-box;display: -ms-flexbox;display: -webkit-flex;display: flex;height: 100%;outline: 0;-webkit-align-self: center;-ms-flex-item-align: center;align-self: center;-ms-flex-negative: 0;-webkit-flex-shrink: 0;flex-shrink: 0;}@media only screen and (max-width: 768px) {#mega-menu-wrap-main_menu .mega-menu-toggle + #mega-menu-main_menu {background: #222;padding: 0px 0px 0px 0px;display: none;}#mega-menu-wrap-main_menu .mega-menu-toggle.mega-menu-open + #mega-menu-main_menu {display: block;}}#mega-menu-wrap-main_menu .mega-menu-toggle {/** Push menu onto new line **/}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 {/*! * Hamburgers * @description Tasty CSS-animated hamburgers * @author Jonathan Suh @jonsuh * @site https://jonsuh.com/hamburgers * @link https://github.com/jonsuh/hamburgers */cursor: pointer;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated {padding: 0;display: -webkit-box;display: -ms-flexbox;display: -webkit-flex;display: flex;cursor: pointer;transition-property: opacity, filter;transition-duration: 0.15s;transition-timing-function: linear;font: inherit;color: inherit;text-transform: none;background-color: transparent;border: 0;margin: 0;overflow: visible;transform: scale(0.8);align-self: center;outline: 0;background: none;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-box {width: 40px;height: 24px;display: inline-block;position: relative;outline: 0;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-inner {display: block;top: 50%;margin-top: -2px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-inner, #mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-inner::before, #mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-inner::after {width: 40px;height: 4px;background-color: #ddd;border-radius: 4px;position: absolute;transition-property: transform;transition-duration: 0.15s;transition-timing-function: ease;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-inner::before, #mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-inner::after {content: "";display: block;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-inner::before {top: -10px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-inner::after {bottom: -10px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-slider .mega-toggle-animated-inner {top: 2px;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-slider .mega-toggle-animated-inner::before {top: 10px;transition-property: transform, opacity;transition-timing-function: ease;transition-duration: 0.15s;}#mega-menu-wrap-main_menu .mega-menu-toggle .mega-toggle-block-0 .mega-toggle-animated-slider .mega-toggle-animated-inner::after {top: 20px;}#mega-menu-wrap-main_menu .mega-menu-toggle.mega-menu-open .mega-toggle-block-0 .mega-toggle-animated-slider .mega-toggle-animated-inner {transform: translate3d(0, 10px, 0) rotate(45deg);}#mega-menu-wrap-main_menu .mega-menu-toggle.mega-menu-open .mega-toggle-block-0 .mega-toggle-animated-slider .mega-toggle-animated-inner::before {transform: rotate(-45deg) translate3d(-5.71429px, -6px, 0);opacity: 0;}#mega-menu-wrap-main_menu .mega-menu-toggle.mega-menu-open .mega-toggle-block-0 .mega-toggle-animated-slider .mega-toggle-animated-inner::after {transform: translate3d(0, -20px, 0) rotate(-90deg);}#mega-menu-wrap-main_menu {clear: both;}.wp-block {}</style> </head> <body data-rsssl=1> <!-- Google tag (gtag.js) --> <script defer src="https://www.googletagmanager.com/gtag/js?id=G-2RPHT34J3M"></script> <script> window.addEventListener("load", function(event) { window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-2RPHT34J3M'); }); </script> <div class="site-header-wrapper -single -review-page "> <header class="site-header"> <div class="site-header__row container -big"> <div class="main-logo site-header__logo"> <a href="https://asian-bookies.net/"> <img width="267" height="54" src="https://asian-bookies.net/wp-content/themes/bb/images/logo.svg" alt="96 Bets Asia"> </a> </div> <button class="site-header__mob-menu-btn" title="Menu"><i></i></button> <div id="mega-menu-wrap-main_menu" class="mega-menu-wrap"><div class="mega-menu-toggle"><div class="mega-toggle-blocks-left"></div><div class="mega-toggle-blocks-center"></div><div class="mega-toggle-blocks-right"><div class='mega-toggle-block mega-menu-toggle-animated-block mega-toggle-block-0' id='mega-toggle-block-0'><button aria-label="Toggle Menu" class="mega-toggle-animated mega-toggle-animated-slider" type="button" aria-expanded="false"> <span class="mega-toggle-animated-box"> <span class="mega-toggle-animated-inner"></span> </span> </button></div></div></div><ul id="mega-menu-main_menu" class="mega-menu max-mega-menu mega-menu-horizontal mega-no-js" data-event="hover" data-effect="fade_up" data-effect-speed="200" data-effect-mobile="disabled" data-effect-speed-mobile="0" data-mobile-force-width="false" data-second-click="go" data-document-click="collapse" data-vertical-behaviour="standard" data-breakpoint="768" data-unbind="true" data-mobile-state="collapse_all" data-mobile-direction="vertical" data-hover-intent-timeout="300" data-hover-intent-interval="100"><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-home mega-menu-item-has-children mega-align-bottom-left mega-menu-flyout mega-menu-item-21801' id='mega-menu-item-21801'><a class="mega-menu-link" href="https://asian-bookies.net/" aria-expanded="false" tabindex="0">Betting Sites<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21803' id='mega-menu-item-21803'><a class="mega-menu-link" href="https://asian-bookies.net/asian-handicap/">Asian Handicap</a></li></ul> </li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-has-children mega-align-bottom-left mega-menu-flyout mega-menu-item-21836' id='mega-menu-item-21836'><a class="mega-menu-link" aria-expanded="false" tabindex="0">Countries<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21811' id='mega-menu-item-21811'><a class="mega-menu-link" href="https://asian-bookies.net/bangladesh/">Bangladesh</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21812' id='mega-menu-item-21812'><a class="mega-menu-link" href="https://asian-bookies.net/hong-kong/">Hong Kong</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21813' id='mega-menu-item-21813'><a class="mega-menu-link" href="https://asian-bookies.net/india/">India</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21815' id='mega-menu-item-21815'><a class="mega-menu-link" href="https://asian-bookies.net/indonesia/">Indonesia</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21816' id='mega-menu-item-21816'><a class="mega-menu-link" href="https://asian-bookies.net/japan/">Japan</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21817' id='mega-menu-item-21817'><a class="mega-menu-link" href="https://asian-bookies.net/korea/">Korea</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21818' id='mega-menu-item-21818'><a class="mega-menu-link" href="https://asian-bookies.net/malaysia/">Malaysia</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21820' id='mega-menu-item-21820'><a class="mega-menu-link" href="https://asian-bookies.net/philippines/">Philippines</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21828' id='mega-menu-item-21828'><a class="mega-menu-link" href="https://asian-bookies.net/singapore/">Singapore</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21830' id='mega-menu-item-21830'><a class="mega-menu-link" href="https://asian-bookies.net/thailand/">Thailand</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21819' id='mega-menu-item-21819'><a class="mega-menu-link" href="https://asian-bookies.net/vietnam/">Vietnam</a></li></ul> </li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-has-children mega-align-bottom-left mega-menu-flyout mega-menu-item-21834' id='mega-menu-item-21834'><a class="mega-menu-link" aria-expanded="false" tabindex="0">Sports<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21805' id='mega-menu-item-21805'><a class="mega-menu-link" href="https://asian-bookies.net/baseball/">Baseball</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-has-children mega-menu-item-21806' id='mega-menu-item-21806'><a class="mega-menu-link" href="https://asian-bookies.net/basketball/" aria-expanded="false">Basketball<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21821' id='mega-menu-item-21821'><a class="mega-menu-link" href="https://asian-bookies.net/philippines/betting-on-nba/">Betting on NBA</a></li> </ul> </li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21814' id='mega-menu-item-21814'><a class="mega-menu-link" href="https://asian-bookies.net/india/cricket/">Cricket</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21809' id='mega-menu-item-21809'><a class="mega-menu-link" href="https://asian-bookies.net/esports/">eSports</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21810' id='mega-menu-item-21810'><a class="mega-menu-link" href="https://asian-bookies.net/football/">Football</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21829' id='mega-menu-item-21829'><a class="mega-menu-link" href="https://asian-bookies.net/singapore/horse-racing/">Horse Racing</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21831' id='mega-menu-item-21831'><a class="mega-menu-link" href="https://asian-bookies.net/tennis/">Tennis</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21832' id='mega-menu-item-21832'><a class="mega-menu-link" href="https://asian-bookies.net/volleyball/">Volleyball</a></li></ul> </li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-has-children mega-align-bottom-left mega-menu-flyout mega-menu-item-21835' id='mega-menu-item-21835'><a class="mega-menu-link" aria-expanded="false" tabindex="0">Payments<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21823' id='mega-menu-item-21823'><a class="mega-menu-link" href="https://asian-bookies.net/payments/bkash/">bKash</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21824' id='mega-menu-item-21824'><a class="mega-menu-link" href="https://asian-bookies.net/payments/gcash/">GCash</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21825' id='mega-menu-item-21825'><a class="mega-menu-link" href="https://asian-bookies.net/payments/paypal/">PayPal</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21826' id='mega-menu-item-21826'><a class="mega-menu-link" href="https://asian-bookies.net/payments/paysafecard/">Paysafecard</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21827' id='mega-menu-item-21827'><a class="mega-menu-link" href="https://asian-bookies.net/payments/tether-usdt/">Tether (USDT)</a></li></ul> </li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-current-menu-ancestor mega-current-menu-parent mega-menu-item-has-children mega-align-bottom-left mega-menu-flyout mega-menu-item-21848' id='mega-menu-item-21848'><a class="mega-menu-link" href="/" aria-expanded="false" tabindex="0">Bookies<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21849' id='mega-menu-item-21849'><a class="mega-menu-link" href="/review/1xbet/">1xBet</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21850' id='mega-menu-item-21850'><a class="mega-menu-link" href="/review/22bet/">22Bet</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-current-menu-item mega-menu-item-21851' id='mega-menu-item-21851'><a class="mega-menu-link" href="/review/20bet/" aria-current="page">20Bet</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21852' id='mega-menu-item-21852'><a class="mega-menu-link" href="/review/4rabet/">4raBet</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21860' id='mega-menu-item-21860'><a class="mega-menu-link" href="/review/bc-game/">BC.game</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21858' id='mega-menu-item-21858'><a class="mega-menu-link" href="/review/betwinner/">Betwinner</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21854' id='mega-menu-item-21854'><a class="mega-menu-link" href="/review/crickex/">Crickex</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21859' id='mega-menu-item-21859'><a class="mega-menu-link" href="/review/dafabet/">Dafabet</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21853' id='mega-menu-item-21853'><a class="mega-menu-link" href="/review/m88/">M88 Mansion</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21856' id='mega-menu-item-21856'><a class="mega-menu-link" href="/review/melbet/">Melbet</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21857' id='mega-menu-item-21857'><a class="mega-menu-link" href="/review/mostbet/">Mostbet</a></li><li class='mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-21855' id='mega-menu-item-21855'><a class="mega-menu-link" href="/review/sportsbet-io/">Sportsbet.IO</a></li></ul> </li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-align-bottom-left mega-menu-flyout mega-menu-item-21807' id='mega-menu-item-21807'><a class="mega-menu-link" href="https://asian-bookies.net/casino/" tabindex="0">Casino</a></li><li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-has-children mega-align-bottom-left mega-menu-flyout mega-menu-item-21833' id='mega-menu-item-21833'><a class="mega-menu-link" href="https://asian-bookies.net/about-us/" aria-expanded="false" tabindex="0">About<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-post_type mega-menu-item-object-page mega-menu-item-21808' id='mega-menu-item-21808'><a class="mega-menu-link" href="https://asian-bookies.net/contacts/">Contact Us</a></li></ul> </li></ul></div> <div class="header-langs"> <button class="header-langs__current"> <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/themes/bb/images/flags/gb.png.webp" type="image/webp"><img src="https://asian-bookies.net/wp-content/themes/bb/images/flags/gb.png" alt="English" class="webpexpress-processed"></picture> <span>en</span> </button> <div class="header-langs__list"> <ul> <li class="lang-item lang-item-14 lang-item-en current-lang lang-item-first"><a lang="en-GB" hreflang="en-GB" href="https://asian-bookies.net/review/20bet/"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAMAAABBPP0LAAAAt1BMVEWSmb66z+18msdig8La3u+tYX9IaLc7W7BagbmcUW+kqMr/q6n+//+hsNv/lIr/jIGMnNLJyOP9/fyQttT/wb3/////aWn+YWF5kNT0oqz0i4ueqtIZNJjhvt/8gn//WVr/6+rN1+o9RKZwgcMPJpX/VFT9UEn+RUX8Ozv2Ly+FGzdYZrfU1e/8LS/lQkG/mbVUX60AE231hHtcdMb0mp3qYFTFwNu3w9prcqSURGNDaaIUMX5FNW5wYt7AAAAAjklEQVR4AR3HNUJEMQCGwf+L8RR36ajR+1+CEuvRdd8kK9MNAiRQNgJmVDAt1yM6kSzYVJUsPNssAk5N7ZFKjVNFAY4co6TAOI+kyQm+LFUEBEKKzuWUNB7rSH/rSnvOulOGk+QlXTBqMIrfYX4tSe2nP3iRa/KNK7uTmWJ5a9+erZ3d+18od4ytiZdvZyuKWy8o3UpTVAAAAABJRU5ErkJggg==" alt="" width="16" height="11" style="width: 16px; height: 11px;" /><span style="margin-left:0.3em;">English</span></a></li> </ul> </div> </div> </div> </header> </div> <div class="container"> <div class="review-page"> <div class="breadcrumbs -no-absolute -rev-page"><span><span><a href="https://asian-bookies.net/">Home</a></span> » <span><a href="https://asian-bookies.net/review/">Reviews</a></span> » <span class="breadcrumb_last" aria-current="page">20Bet</span></span></div> <div class="content-white block-content-padding block-content-lr-padding white-block-shadow review-page--header"> <div class="review-page--header__logo" style="background-color:#0d1d34"> <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet.png.webp" type="image/webp"><img width="293" height="136" src="https://asian-bookies.net/wp-content/uploads/2022/12/20bet.png" class="attachment-medium size-medium webpexpress-processed" alt="20bet" decoding="async"></picture> </div> <div class="review-page--header__data"> <h1>20Bet</h1> <div class="review-page--header__rating"> <div class="g-rp-rating--title">Overall Rating</div> <div class="g-rp-rating--grid"> <div class="main-stars-block"> <i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i> </div> <div class="g-rp-rating--val">4.9/5</div> </div> </div> </div> <div class="review-page--header__bonus"> <div class="g-rp-bonus"> <div class="g-rp-bonus--title">Bonus: </div> <div class="g-rp-bonus--val"> <span>+100%</span> Bonus up to <span>$100 USD</span> </div> </div> </div> <div class="review-page--header__last-b"> <div class="g-rp-last-update"> Last Updated: <span>April 14, 2024</span> </div> <div class="g-rp-more-link"> <a class="main-link-btn -ib" rel="nofollow" target="_blank" href="https://asian-bookies.net/go/20bet/" target="_blank" rel="nofollow" > <span class="big-label">VISIT WEBSITE</span> </a> </div> </div> </div> <div class="hero-toggle -rev-page"> <button class="hero-toggle__header"> <i class="icon-left"></i> <span>Table of content</span> <div class="icon-right-wrapper"> <i class="icon-right"></i> </div> </button> <div class="hero-toggle__content"> <ul class="single-toc--ul"> <li class="single-toc--li"> <a href="#review-of-20bet-bookmaker-and-online-casino">Review of 20Bet Bookmaker and Online Casino</a> </li> <li class="single-toc--li"> <a href="#about-20bet-company">About 20Bet Company</a> </li> <li class="single-toc--li"> <a href="#quick-advantages-to-play-games-at-20bet">Quick Advantages to Play Games at 20Bet</a> </li> <li class="single-toc--li"> <a href="#sportsbook-20bet">Sportsbook 20Bet</a> </li> <li class="single-toc--li"> <a href="#live-betting-in-20bet">Live Betting in 20Bet</a> </li> <li class="single-toc--li"> <a href="#available-types-of-bets-on-20bet">Available Types of Bets on 20Bet</a> </li> <li class="single-toc--li"> <a href="#additional-betting-tools">Additional Betting Tools</a> </li> <li class="single-toc--li"> <a href="#how-to-place-bets-at-20bet">How to Place Bets at 20Bet?</a> </li> <li class="single-toc--li"> <a href="#our-experience-of-betting-on-20bet">Our Experience of Betting on 20Bet</a> </li> <li class="single-toc--li"> <a href="#20bet-online-casino">20Bet Online Casino</a> </li> <li class="single-toc--li"> <a href="#providers-slot-games-available-at-20bet">Providers Slot Games Available at 20Bet</a> </li> <li class="single-toc--li"> <a href="#does-20bet-have-asian-and-hunting-slots-games">Does 20Bet Have Asian and Hunting Slots Games?</a> </li> <li class="single-toc--li"> <a href="#top-casino-games-available-at-20bet">Top Casino Games Available at 20Bet</a> </li> <li class="single-toc--li"> <a href="#live-casino-at-20bet">Live Casino at 20Bet</a> </li> <li class="single-toc--li"> <a href="#live-games-providers-in-20bet">Live Games Providers in 20Bet</a> </li> <li class="single-toc--li"> <a href="#advantages-of-live-casino-games-at-20bet">Advantages of Live Casino Games at 20Bet</a> </li> <li class="single-toc--li"> <a href="#instant-games-at-20bet">Instant Games at 20Bet</a> </li> <li class="single-toc--li"> <a href="#how-to-start-playing-at-casino-20bet">How to Start Playing at Casino 20Bet</a> </li> <li class="single-toc--li"> <a href="#our-experience-of-gambling-in-casino-20bet">Our Experience of Gambling in Casino 20Bet</a> </li> <li class="single-toc--li"> <a href="#20bet-online-poker-room">20Bet Online Poker Room</a> </li> <li class="single-toc--li"> <a href="#20bet-welcome-bonus">20Bet Welcome Bonus</a> </li> <li class="single-toc--li"> <a href="#20bet-bonuses-and-promotions">20Bet Bonuses and Promotions</a> </li> <li class="single-toc--li"> <a href="#promo-codes-how-to-get-and-use-promocodes-at-20bet">Promo Codes: How to get and use promocodes at 20Bet?</a> </li> <li class="single-toc--li"> <a href="#20bet-payment-methods">20Bet Payment Methods</a> </li> <li class="single-toc--li"> <a href="#registration-at-20bet-how-to-sing-up">Registration at 20Bet: How to Sing Up?</a> </li> <li class="single-toc--li"> <a href="#20bet-account-verification-instruction">20Bet Account Verification Instruction</a> </li> <li class="single-toc--li"> <a href="#20bet-mobile-app-for-android-and-ios">20Bet Mobile App for Android and iOS</a> </li> <li class="single-toc--li"> <a href="#tips-and-best-practice-for-playing-at-20bet">Tips and Best Practice for playing at 20Bet</a> </li> <li class="single-toc--li"> <a href="#20bet-mobile-website">20Bet Mobile Website</a> </li> <li class="single-toc--li"> <a href="#20bet-license-and-fairness">20Bet License and Fairness</a> </li> <li class="single-toc--li"> <a href="#20bet-customer-support">20Bet Customer support</a> </li> <li class="single-toc--li"> <a href="#final-opinion-on-20bet-as-bookmaker-and-online-casino">Final Opinion on 20Bet as bookmaker and online casino</a> </li> <li class="single-toc--li"> <a href="#sports">Sports</a> </li> <li class="single-toc--li"> <a href="#odds-formats">Odds Format's</a> </li> <li class="single-toc--li"> <a href="#accepted-cryptocurrencies">Accepted Cryptocurrencies</a> </li> <li class="single-toc--li"> <a href="#available-games">Available Games</a> </li> <li class="single-toc--li"> <a href="#supported-languages">Supported Languages</a> </li> <li class="single-toc--li"> <a href="#20bet-gallery-visual-and-usability">20Bet gallery: Visual and Usability</a> </li> <li class="single-toc--li"> <a href="#faq-about-20bet">FAQ about 20Bet:</a> </li> </ul> </div> </div> <div class="review-page--content"> <main> <div id="review-of-20bet-bookmaker-and-online-casino" class="auto-scroll-block content-white block-content-padding block-content-lr-padding white-block-shadow mb30"> <div class="g-rp-rep-block-title mobile-show"> <i class="rev-icon"></i> <div> <h2 id="review-of-20bet-bookmaker-and-online-casino">Review of 20Bet Bookmaker and Online Casino</h2> <div class="g-rp-rep-block-title__short-desc"></div> </div> </div> <div class="rev-page-first-block"> <div class="rev-page-first-block--content"> <div class="g-rp-rep-block-title mobile-hide"> <i class="rev-icon"></i> <div> <h2 id="review-of-20bet-bookmaker-and-online-casino">Review of 20Bet Bookmaker and Online Casino</h2> <div class="g-rp-rep-block-title__short-desc"></div> </div> </div> <article class="post-entry"> <p><span style="font-weight: 400;">In this comprehensive review of 20Bet, a leading bookmaker and online casino, we navigate its diverse aspects, from registration to payments, gaming, and customer support. Ideal for gambling enthusiasts and novices alike, the article provides useful insights into the platform&#8217;s offerings, including its VIP program and mobile compatibility. Readers will learn about 20Bet&#8217;s legality, fairness, and betting practices. This review serves as a valuable guide for those considering online betting or casino gaming and aims to provide an unbiased assessment of 20Bet&#8217;s services.</span></p> <p><strong>Review of the bookmaker and online casino 20Bet is also available in other languages:</strong></p> <ul> <li class="lang-item lang-item-28 lang-item-ja"><strong><a lang="ja" href="https://asian-bookies.net/ja/reviews/20bet-japan/" hreflang="ja">日本語</a></strong></li> <li class="lang-item lang-item-33 lang-item-vi"><strong><a lang="vi" href="https://asian-bookies.net/vi/reviews/20bet-vietnam/" hreflang="vi">Tiếng Việt</a></strong></li> <li class="lang-item lang-item-38 lang-item-th"><strong><a lang="th" href="https://asian-bookies.net/th/reviews/20bet-thailand/" hreflang="th">ไทย</a></strong></li> <li class="lang-item lang-item-48 lang-item-bn"><strong><a lang="bn-BD" href="https://asian-bookies.net/bn/reviews/20bet-bangladesh/" hreflang="bn-BD">বাংলা</a></strong></li> <li class="lang-item lang-item-58 lang-item-tl"><strong><a lang="tl" href="https://asian-bookies.net/tl/reviews/20bet-philippines/" hreflang="tl">Tagalog</a></strong></li> </ul> <h2 id="about-20bet-company"><span style="font-weight: 400;">About 20Bet Company</span></h2> <p><span style="font-weight: 400;">Founded in 2018, 20Bet is operated by TechSolutions (CY) Group Limited, a name synonymous with reliable and diverse betting avenues. The bookmaker extends a rich selection of sports betting markets that caters to gamblers of all kinds. From American Football to Winter Sports and even Chess, there&#8217;s a line for everyone. For the eSports fans, 20Bet does not disappoint with lines for games like CS:GO, Dota 2, and League of Legends. Their casino offerings, underpinned by Soft-Labs software, complement their betting services, offering players a comprehensive gambling experience.</span></p> <p><picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-2.png.webp 2880w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-2-970x481.png.webp 970w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-2-1170x580.png.webp 1170w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-2-768x381.png.webp 768w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-2-1536x762.png.webp 1536w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-2-2048x1015.png.webp 2048w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-2-1000x496.png.webp 1000w" sizes="(max-width: 2880px) 100vw, 2880px" type="image/webp"><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-16792 webpexpress-processed" src="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-2.png" alt="20bet" width="2880" height="1428" srcset="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-2.png 2880w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-2-970x481.png 970w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-2-1170x580.png 1170w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-2-768x381.png 768w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-2-1536x762.png 1536w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-2-2048x1015.png 2048w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-2-1000x496.png 1000w" sizes="(max-width: 2880px) 100vw, 2880px"></picture></p> <h2 id="quick-advantages-to-play-games-at-20bet"><span style="font-weight: 400;">Quick Advantages to Play Games at 20Bet</span></h2> <p><span style="font-weight: 400;">Our tests of 20Bet have shown that this platform excels in numerous areas. Accessible via various platforms like PC, Mobile, and Tablet, 20Bet ensures its users can wager on-the-go, an advantage for punters looking to place bets at their convenience. Betting features include partial and full cash out, live streaming, and accommodating betting limits ranging from a minimum bet of $0.10 to a max profit of $100,000 per bet. It&#8217;s noteworthy to mention that they offer several types of odds, including American, Decimal, and Fractional.</span></p> <p><span style="font-weight: 400;">As for the online casino section, a wide range of games, including betting, live casino, and e-sports, keep casino 20Bet users entertained. The fact that the casino caters to multiple currencies, combined with its multi-language support, makes 20Bet a truly global platform.</span></p> <h2 id="sportsbook-20bet"><span style="font-weight: 400;">Sportsbook 20Bet</span></h2> <p><span style="font-weight: 400;">At the sportsbook 20Bet, you are greeted by a compelling variety of betting markets. The sportsbook offers a gamut of betting options that serve to entice both novice and experienced gamblers, elevating the thrill of wagering.</span></p> <p><picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-sports.png.webp 2880w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-sports-970x439.png.webp 970w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-sports-1170x529.png.webp 1170w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-sports-768x347.png.webp 768w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-sports-1536x694.png.webp 1536w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-sports-2048x926.png.webp 2048w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-sports-1000x452.png.webp 1000w" sizes="(max-width: 2880px) 100vw, 2880px" type="image/webp"><img decoding="async" class="aligncenter size-full wp-image-16797 webpexpress-processed" src="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-sports.png" alt="20bet-sports" width="2880" height="1302" srcset="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-sports.png 2880w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-sports-970x439.png 970w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-sports-1170x529.png 1170w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-sports-768x347.png 768w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-sports-1536x694.png 1536w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-sports-2048x926.png 2048w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-sports-1000x452.png 1000w" sizes="(max-width: 2880px) 100vw, 2880px"></picture></p> <h3 id="most-popular-sports-betting-markets-in-20bet"><span style="font-weight: 400;">Most Popular Sports Betting Markets in 20Bet</span></h3> <p><span style="font-weight: 400;">Stepping into the popular sports markets on the 20Bet betting site, you are bound to notice the immense diversity that it offers. We have analyzed and listed some of the crowd favorites.</span></p> <ul> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Football Betting in 20Bet:</strong> For the football fanats, 20Bet extends a comprehensive market. Drawing on our experience, we found the odds offered for different leagues and tournaments globally are competitive, promising generous returns for the keen punter. Additionally, it offers intriguing alternative handicap bets, adding a new dimension to traditional <a href="https://asian-bookies.net/football-betting-sites/">football betting</a> on 20Bet.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Basketball:</strong> Another dynamic market on 20Bet bets is <a href="https://asian-bookies.net/philippines-nba/">basketball</a>. The range covers various leagues around the world, from the NBA to European championships, providing a wide array of options for basketball enthusiasts. The <a href="https://asian-bookies.net/basketball-handicap/">alternative handicap basketball</a> selections provide an additional layer of intrigue and excitement to betting.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Cricket:</strong> Not leaving the cricket lovers behind, 20Bet sportsbook has something for them too. Be it the World Cup or the <a href="https://asian-bookies.net/ipl-betting-sites/">IPL</a>, the platform offers exhaustive cricket betting lines. The competitive odds coupled with the live streaming feature promises an engrossing wagering experience.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong> eSports:</strong> A standout feature of the bookmaker 20Bet is its eSports market. A rising trend among younger punters, eSports betting is well catered to, offering lines for popular games like <a href="https://asian-bookies.net/esports-betting-sites/cs-go/">CS:GO</a>, <a href="/esports-betting-sites/dota-2/">Dota 2</a>, and <a href="/esports-betting-sites/lol-league-of-legends/">League of Legends</a>. Our tests have shown that eSports betting on 20Bet is as exciting and engaging as traditional sports betting, with the added benefit of appealing to the tech-savvy generation.</span></li> </ul> <h3 id="other-betting-markets-available-in-20bet"><span style="font-weight: 400;">Other Betting Markets Available in 20Bet</span></h3> <p><span style="font-weight: 400;">Beyond the crowd favorites, the bookmaker 20Bet displays a commendable range in their sportsbook. From the fast-paced thrills of Formula 1 and Motor Sports to the more nuanced strategies of Chess and Snooker, 20Bet delivers a wide range of sports markets to suit any punter&#8217;s preference. More unconventional markets such as Bandy, Floorball, and Pesapallo, attest to the bookmaker&#8217;s efforts to cater to diverse tastes and global betting trends.</span></p> <h2 id="live-betting-in-20bet"><span style="font-weight: 400;">Live Betting in 20Bet</span></h2> <p><span style="font-weight: 400;">The adrenaline of live betting 20Bet cannot be overstated. This sportsbook provides punters with the unique opportunity to place wagers as the action unfolds. In-play betting 20Bet is an exciting feature that offers dynamic odds, which change in real-time as the event progresses. This real-time betting option not only heightens the excitement of gambling but also allows seasoned punters to leverage their game understanding and make informed bets as they observe the game.</span></p> <p><picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-live.png.webp 2880w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-live-970x389.png.webp 970w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-live-1170x469.png.webp 1170w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-live-768x308.png.webp 768w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-live-1536x615.png.webp 1536w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-live-2048x821.png.webp 2048w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-live-1000x401.png.webp 1000w" sizes="(max-width: 2880px) 100vw, 2880px" type="image/webp"><img decoding="async" class="aligncenter size-full wp-image-16795 webpexpress-processed" src="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live.png" alt="20bet-live" width="2880" height="1154" srcset="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live.png 2880w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live-970x389.png 970w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live-1170x469.png 1170w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live-768x308.png 768w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live-1536x615.png 1536w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live-2048x821.png 2048w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live-1000x401.png 1000w" sizes="(max-width: 2880px) 100vw, 2880px"></picture></p> <h3 id="live-streaming-in-20bet"><span style="font-weight: 400;">Live Streaming in 20Bet</span></h3> <p><span style="font-weight: 400;">Complementing the live bets 20Bet offers, is their live streaming feature. The ability to stream matches live while placing bets provides an all-encompassing betting experience. It is important to note, however, that this feature is only available for certain events. Nevertheless, the integration of 20Bet live streaming with in-play betting augments the betting experience by allowing punters to make real-time decisions based on live action, thereby offering an immersive, interactive, and exciting gambling environment.</span></p> <h2 id="available-types-of-bets-on-20bet"><span style="font-weight: 400;">Available Types of Bets on 20Bet</span></h2> <p><span style="font-weight: 400;">20Bet extends a wide array of bet types to its users. Punters can make straightforward single bets or opt for more complex betting strategies. Among these are accumulator bets, where bettors can combine multiple selections into one wager, thereby significantly amplifying the potential payout. 20Bet also accommodates various systems of bets, that provide the flexibility to win even if not all selections are correct.</span></p> <h2 id="additional-betting-tools"><span style="font-weight: 400;">Additional Betting Tools</span></h2> <p><span style="font-weight: 400;">To further enhance their betting platform, 20Bet provides a range of additional tools designed to assist punters in their wagering journey. The 20Bet cash out feature is one such tool that allows bettors to retrieve their stakes before the conclusion of an event. This feature is beneficial when the bet is not progressing as expected and the punter wants to minimize losses. Another notable tool offered is the 20Bet bet builder. It enables punters to create personalized bets by combining different markets within the same event into a single wager, giving users more control over their betting experience. These features, from in-play betting to a host of betting types, make 20Bet a well-rounded platform for both newcomers and seasoned gamblers alike.</span></p> <h2 id="how-to-place-bets-at-20bet"><span style="font-weight: 400;">How to Place Bets at 20Bet?</span></h2> <p><span style="font-weight: 400;">Placing wagers at 20Bet is a straightforward and intuitive process. Punters start by registering an account on the platform. After completing the registration and logging in, they can navigate to the &#8216;Sports&#8217; or &#8216;eSports&#8217; sections where all available events are displayed. Bettors choose their desired sport and event, select the market they wish to bet on, and their choice appears in the betting slip on the right side of the screen. They then input their desired wager amount in the betting slip, confirm the bet, and it&#8217;s done!</span></p> <h3 id="how-to-place-stakes-at-20bet-with-the-app"><span style="font-weight: 400;">How to Place Stakes at 20Bet with the App?</span></h3> <p><span style="font-weight: 400;">Placing bets using the 20Bet app is just as seamless as the website. After downloading and installing the app from either the Google Play Store for Android or App Store for iOS, users log in using their account credentials. The app&#8217;s user-friendly interface allows for easy navigation. Punters select their desired sports or eSports event, pick the specific market they wish to wager on, enter the stake amount on the digital betting slip, and confirm their bet. The app&#8217;s layout ensures that even novice gamblers can effortlessly place bets, making the 20Bet betting experience accessible and convenient, even on the go.</span></p> <h2 id="our-experience-of-betting-on-20bet"><span style="font-weight: 400;">Our Experience of Betting on 20Bet</span></h2> <p><span style="font-weight: 400;">We approached 20Bet with a 500 USDT budget and a clear strategy in mind. The goal was to explore two distinct betting types &#8211; a prematch bet and an in-play bet &#8211; to offer a comprehensive assessment of 20Bet&#8217;s betting experience.</span></p> <p><span style="font-weight: 400;">For our prematch bet, we turned our attention to basketball, one of the sports we are most knowledgeable about. An NBA game between the Los Angeles Lakers and the Boston Celtics was looming on the horizon, and we were eager to place our stakes. Considering the recent form and home-court advantage, we decided to put 250 USDT on a Point Spread bet favoring the Lakers. 20Bet’s platform made it easy to select our desired market and place our bet, enhancing our overall experience.</span></p> <p><span style="font-weight: 400;">After monitoring the basketball game&#8217;s progress, we shifted our focus to a live eSports event &#8211; a CS: GO match at the ESL Pro League. We had 250 USDT left and decided to try our luck with an in-play bet. Given the unpredictable nature of eSports and the thrill of live betting, we took a riskier path. A head-to-head battle was underway between Team Vitality and Astralis. Despite Astralis having the upper hand at the moment, we chose to bet on Team Vitality for a comeback victory, staking our remaining 250 USDT on this outcome.</span></p> <p><span style="font-weight: 400;">The strategy here was to strike a balance between a calculated, safer prematch bet and an adventurous in-play bet. Our choices were influenced by a blend of current game dynamics, historical data, and gut instinct.</span></p> <p><span style="font-weight: 400;">Win or lose, our betting experience on 20Bet was seamless, exciting, and engaging. The platform provided a wide range of markets, allowing us to devise and execute our strategy easily. Regardless of the outcome, the thrill of the process and the smooth user experience made our review venture a successful one.</span></p> <h2 id="20bet-online-casino"><span style="font-weight: 400;">20Bet Online Casino</span></h2> <p><span style="font-weight: 400;">The online casino 20Bet is an equally impressive facet of the site. Boasting a rich collection of games, punters can effortlessly switch from the sportsbook to immersive casino play in mere moments.</span></p> <p><picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-casino.png.webp 2880w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-casino-970x419.png.webp 970w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-casino-1170x506.png.webp 1170w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-casino-768x332.png.webp 768w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-casino-1536x664.png.webp 1536w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-casino-2048x885.png.webp 2048w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-casino-1000x432.png.webp 1000w" sizes="(max-width: 2880px) 100vw, 2880px" type="image/webp"><img decoding="async" class="aligncenter size-full wp-image-16794 webpexpress-processed" src="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-casino.png" alt="20bet-casino" width="2880" height="1245" srcset="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-casino.png 2880w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-casino-970x419.png 970w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-casino-1170x506.png 1170w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-casino-768x332.png 768w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-casino-1536x664.png 1536w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-casino-2048x885.png 2048w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-casino-1000x432.png 1000w" sizes="(max-width: 2880px) 100vw, 2880px"></picture></p> <p><span style="font-weight: 400;">The casino is composed of various genres to satisfy a wide spectrum of gambling preferences. From classic table games like blackjack and roulette to vibrant slot machines, poker variations, and live dealer options, 20Bet provides a comprehensive gambling site to keep all players entertained.</span></p> <h2 id="providers-slot-games-available-at-20bet"><span style="font-weight: 400;">Providers Slot Games Available at 20Bet</span></h2> <p><span style="font-weight: 400;">One factor that significantly contributes to the casino&#8217;s appeal is the assortment of slot games supplied by leading developers. Our research has shown that 20Bet is powered by industry giants like NetEnt, Amatic, Evolution Gaming and Play&#8217;n GO, among others. These partnerships ensure the continuous inflow of high-quality and technologically advanced slot games that cater to a variety of themes and betting ranges.</span></p> <h2 id="does-20bet-have-asian-and-hunting-slots-games"><span style="font-weight: 400;">Does 20Bet Have Asian and Hunting Slots Games?</span></h2> <p><span style="font-weight: 400;">A significant aspect of 20Bet is the versatility of the slot portfolio, which caters to the diverse tastes of gamblers. For players who prefer Asian-themed slots, there&#8217;s no shortage of games with such motifs. From slots inspired by Chinese folklore to those reflecting Japanese culture, the choice is substantial.</span></p> <p><span style="font-weight: 400;">Moreover, hunting-themed games are also included in 20Bet&#8217;s offerings. Players can immerse themselves in the wild adventures these games provide, ranging from hunts in African savannas to those in dense rainforests.</span></p> <h2 id="top-casino-games-available-at-20bet"><span style="font-weight: 400;">Top Casino Games Available at 20Bet</span></h2> <p><span style="font-weight: 400;">While the slot section is indeed a central attraction, 20Bet doesn&#8217;t compromise on the range and quality of other casino games. For table game aficionados, variants of roulette, blackjack, and poker abound, alongside baccarat and other popular games.</span></p> <p><span style="font-weight: 400;">Our tests have shown that the online casino 20Bet is a place that appeals to a wide variety of players. With user-friendly design and high-quality games from renowned providers, the platform ensures a top-tier gambling experience for players worldwide.</span></p> <h2 id="live-casino-at-20bet"><span style="font-weight: 400;">Live Casino at 20Bet</span></h2> <p><span style="font-weight: 400;">For those who crave the buzz of a real casino but love the comfort of home, the live casino at 20Bet is a dream come true. In our analysis, we&#8217;ve found it offers a variety of live dealer games for players, recreating the authentic casino ambiance right on your screen.</span></p> <h2 id="live-games-providers-in-20bet"><span style="font-weight: 400;">Live Games Providers in 20Bet</span></h2> <p><span style="font-weight: 400;">The live games in 20Bet are furnished by the industry&#8217;s leading live gaming providers such as Evolution Gaming, Pragmatic Play Live and others popular providers, ensuring a seamless and interactive experience. They are known for their high-definition video streaming, multi-angle views, and engaging hosts, all of which make you feel as if you&#8217;re playing right in a brick-and-mortar casino.</span></p> <h2 id="advantages-of-live-casino-games-at-20bet"><span style="font-weight: 400;">Advantages of Live Casino Games at 20Bet</span></h2> <p><span style="font-weight: 400;">When we tried out the live dealer games on 20Bet, several benefits stood out. Firstly, the wide range of games on offer, from blackjack and roulette to baccarat and poker, caters to different player preferences. Whether you&#8217;re a high roller or prefer low stakes, the options are there for you.</span></p> <p><span style="font-weight: 400;">Secondly, playing with real dealers on 20Bet brings an unmatched level of realism. You get the chance to interact with the dealer and other players, bringing a social aspect that&#8217;s often missed in online gaming.</span></p> <p><picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-live-casino.png.webp 2880w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-live-casino-970x417.png.webp 970w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-live-casino-1170x503.png.webp 1170w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-live-casino-768x330.png.webp 768w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-live-casino-1536x660.png.webp 1536w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-live-casino-2048x880.png.webp 2048w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-live-casino-1000x430.png.webp 1000w" sizes="(max-width: 2880px) 100vw, 2880px" type="image/webp"><img decoding="async" class="aligncenter size-full wp-image-16796 webpexpress-processed" src="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live-casino.png" alt="20bet-live-casino" width="2880" height="1237" srcset="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live-casino.png 2880w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live-casino-970x417.png 970w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live-casino-1170x503.png 1170w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live-casino-768x330.png 768w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live-casino-1536x660.png 1536w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live-casino-2048x880.png 2048w, https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live-casino-1000x430.png 1000w" sizes="(max-width: 2880px) 100vw, 2880px"></picture></p> <p><span style="font-weight: 400;">Lastly, 20Bet&#8217;s live casino is accessible round the clock, enabling players to enjoy their favorite games at any time. This availability, combined with the excitement of playing in real time, makes live gaming on 20Bet an exhilarating experience.</span></p> <p><span style="font-weight: 400;">As our experience has shown, 20Bet&#8217;s live casino effectively bridges the gap between the convenience of online gaming and the engaging atmosphere of a physical casino. The blend of wide-ranging games, top-notch providers, and the immersive experience make 20Bet&#8217;s live dealer offerings a fantastic choice for all casino enthusiasts.</span></p> <h2 id="instant-games-at-20bet"><span style="font-weight: 400;">Instant Games at 20Bet</span></h2> <p><span style="font-weight: 400;">When it comes to instant gratification, 20Bet is the platform to beat. With a suite of quick betting games available, players looking for a speedy thrill will find plenty to entertain.</span></p> <h3 id="aviator-20bet"><span style="font-weight: 400;">Aviator 20Bet</span></h3> <p><span style="font-weight: 400;">Among the various instant options, the Aviator game at 20Bet stands out. Based on our expertise, Aviator combines the rush of a crash game with simple gameplay, making it a firm favorite. The premise is straightforward &#8211; the further the plane flies, the higher your multiplier. You decide when to cash out, but wait too long, and the plane might crash, wiping out your stake. This mix of strategy, risk, and reward is what makes Aviator a top pick for players who enjoy a swift, engaging challenge.</span></p> <h3 id="jetx-20bet"><span style="font-weight: 400;">JetX 20Bet</span></h3> <p><span style="font-weight: 400;">Another quick betting option that&#8217;s gaining popularity is JetX. Like Aviator, JetX is a crash game, but this time, you&#8217;re riding a rocket. The aim is to jump off the rocket with your winnings before it explodes. JetX&#8217;s vibrant graphics, fast-paced gameplay, and the added thrill of the ticking time bomb make it an exciting choice for punters craving a quick adrenaline hit.</span></p> <h2 id="how-to-start-playing-at-casino-20bet"><span style="font-weight: 400;">How to Start Playing at Casino 20Bet</span></h2> <p><span style="font-weight: 400;">Getting started at Casino 20Bet is a breeze, even for those new to online gambling. The first step is to create an account. Simply head to the 20Bet homepage, click the &#8220;Register&#8221; button, and follow the straightforward prompts. You&#8217;ll need to provide some basic personal information, choose a username and password, and confirm that you&#8217;re of legal gambling age.</span></p> <p><span style="font-weight: 400;">Once your account is set up, depositing funds is the next step. Navigate to the &#8220;Cashier&#8221; section where you&#8217;ll see an array of safe and secure payment methods available. Choose your preferred method, input the amount you want to deposit, and proceed with the transaction. Once your deposit is successful, your gaming journey can begin.</span></p> <p><span style="font-weight: 400;">Remember, whether you&#8217;re interested in placing stakes on sports or trying your luck in the online casino, always gamble responsibly.</span></p> <h3 id="how-to-start-playing-at-20bet-via-app"><span style="font-weight: 400;">How to Start Playing at 20Bet via App</span></h3> <p><span style="font-weight: 400;">For those who prefer to gamble on the go, 20Bet also offers a mobile app, providing access to all the same great features found on the desktop site.</span></p> <p><span style="font-weight: 400;">Starting to play on 20Bet via the app is equally simple. Firstly, download the app from your device&#8217;s app store, then open it up and register for an account, following the same process as above. If you already have an account, just use your existing login details.</span></p> <p><span style="font-weight: 400;">Depositing funds on the app is a seamless process. Access the &#8220;Cashier&#8221; from the app&#8217;s menu, choose your deposit method, enter the amount, and confirm the transaction. Once your account is funded, you&#8217;re ready to dive into the thrilling world of 20Bet betting, whether your passion lies in sports, casino games, or live dealer experiences.</span></p> <h2 id="our-experience-of-gambling-in-casino-20bet"><span style="font-weight: 400;">Our Experience of Gambling in Casino 20Bet</span></h2> <p><span style="font-weight: 400;">Having the opportunity to experience a real-life online casino session with 20Bet was quite the thrill for our team. Our mission was clear; we had 500 USDT to play and review two casino games. The chosen games were a slot game and a live game to provide a comprehensive view of the platform&#8217;s offerings.</span></p> <p><span style="font-weight: 400;">The first stop was at the slot games section, where we settled for &#8220;Book of Dead&#8221; from Play’n GO, known for its attractive graphics and engaging gameplay. The strategy was simple: start with small stakes, gradually increase, and bet big if a winning streak appears. We started with 10 USDT bets, warmed up to the game, and as we hit a series of wins, we raised the stakes to 50 USDT. The unpredictability of the game was captivating, and though we had a few losses, we ended with a slight overall profit. The user-friendly interface of 20Bet made the experience smooth and enjoyable.</span></p> <p><span style="font-weight: 400;">Next, we turned our focus to the live games section and chose Live Blackjack for its blend of skill and chance. With 250 USDT left, we decided to mix up our strategy: half the budget for careful, low-risk bets, and the other half for higher stakes, unpredictable bets. We spent the first half of our budget on playing cautiously. Then, we took a leap of faith, placing higher stakes and trusting our intuition more than the statistics. Although we did lose a couple of bets, we also hit some big wins, balancing out our losses and adding to the excitement of the live casino experience.</span></p> <p><span style="font-weight: 400;">In both games, we experienced the thrill of highs and lows that come with gambling. 20Bet offered an immersive, enjoyable, and seamless gaming experience, regardless of the game&#8217;s outcome. The broad array of games, user-friendly interface, and the suspense of each bet make 20Bet an online casino worth visiting.</span></p> <h2 id="20bet-online-poker-room"><span style="font-weight: 400;">20Bet Online Poker Room</span></h2> <p><span style="font-weight: 400;">When it comes to poker, 20Bet doesn&#8217;t disappoint. Our tests showed that the 20Bet poker room is designed to cater to players of all skill levels. It provides a robust platform that allows for smooth navigation and gameplay, all under the assurance of fair play. The games run smoothly, even during peak hours, showing the efficiency of the platform. So, if you&#8217;re eager to try online poker at 20Bet, you&#8217;re in for a treat.</span></p> <h3 id="poker-types-available-on-20bet"><span style="font-weight: 400;">Poker Types Available on 20Bet</span></h3> <p><span style="font-weight: 400;">Variety is the spice of life, and 20Bet takes this to heart. It provides a range of poker variants that keep players engaged. From the popular Texas Hold&#8217;em to Omaha and Seven-Card Stud, the options are diverse. The availability of these different versions allows players to select games based on their preference and expertise.</span></p> <p><span style="font-weight: 400;">Further, there&#8217;s an opportunity for players to learn and try new variations of poker, enriching their skills and experiences. The platform provides comprehensive guides on the rules and strategies of each game type. So, beginners or those looking to branch out from their usual poker variant can do so with ease.</span></p> <h3 id="poker-tournaments-at-20bet"><span style="font-weight: 400;">Poker Tournaments at 20Bet</span></h3> <p><span style="font-weight: 400;">Poker enthusiasts know there&#8217;s nothing quite like the thrill of a tournament. The anticipation, the competitive spirit, and the potential for significant winnings make it an exhilarating experience. 20Bet provides ample opportunities for such excitement through its well-structured and frequent poker tournaments.</span></p> <p><span style="font-weight: 400;">Offering both Sit &amp; Go&#8217;s and scheduled tournaments, the platform ensures players can participate in the type of competition that suits their style and availability. The prize pools are enticing, and the structure of the tournaments caters to varying skill levels. Whether you&#8217;re a seasoned pro or a newcomer to the poker scene, there&#8217;s a place for you at 20Bet&#8217;s poker tables.</span></p> <h2 id="20bet-welcome-bonus"><span style="font-weight: 400;">20Bet Welcome Bonus</span></h2> <p><span style="font-weight: 400;">One of the most attractive aspects of 20Bet is their enticing welcome bonus, which sets a positive tone for all new members. The 20Bet welcome bonus serves as a solid starting point, providing an initial bankroll boost that allows new players to explore a variety of betting options.</span></p> <p>&nbsp;</p> <h3 id="bonus-wagering-requirements"><span style="font-weight: 400;">Bonus Wagering Requirements</span></h3> <p><span style="font-weight: 400;">The bonus wagering requirements are carefully designed to ensure a balanced gaming environment. These conditions state that the bonus amount must be wagered a certain number of times before it becomes eligible for withdrawal. It is advisable to carefully review these requirements to maximize the potential benefits of your bonus.</span></p> <h2 id="20bet-bonuses-and-promotions"><span style="font-weight: 400;">20Bet Bonuses and Promotions</span></h2> <p><span style="font-weight: 400;">20Bet bonuses do not stop at the welcome offer. The platform ensures an exciting betting journey with a variety of ongoing promotions. The promotions 20Bet offers are updated frequently, appealing to a broad spectrum of players, from casual bettors to high rollers. These promotions are creatively structured to add an extra layer of thrill to your betting experience while offering substantial rewards.</span></p> <p><picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/promotions-1.png.webp 2880w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/promotions-1-970x480.png.webp 970w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/promotions-1-1170x579.png.webp 1170w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/promotions-1-768x380.png.webp 768w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/promotions-1-1536x760.png.webp 1536w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/promotions-1-2048x1013.png.webp 2048w, https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/promotions-1-1000x495.png.webp 1000w" sizes="(max-width: 2880px) 100vw, 2880px" type="image/webp"><img decoding="async" class="aligncenter size-full wp-image-16798 webpexpress-processed" src="https://asian-bookies.net/wp-content/uploads/2022/12/promotions-1.png" alt="promotions" width="2880" height="1425" srcset="https://asian-bookies.net/wp-content/uploads/2022/12/promotions-1.png 2880w, https://asian-bookies.net/wp-content/uploads/2022/12/promotions-1-970x480.png 970w, https://asian-bookies.net/wp-content/uploads/2022/12/promotions-1-1170x579.png 1170w, https://asian-bookies.net/wp-content/uploads/2022/12/promotions-1-768x380.png 768w, https://asian-bookies.net/wp-content/uploads/2022/12/promotions-1-1536x760.png 1536w, https://asian-bookies.net/wp-content/uploads/2022/12/promotions-1-2048x1013.png 2048w, https://asian-bookies.net/wp-content/uploads/2022/12/promotions-1-1000x495.png 1000w" sizes="(max-width: 2880px) 100vw, 2880px"></picture></p> <h3 id="bonus-100-up-to-100e"><span style="font-weight: 400;">Bonus &#8216;100% UP TO 100€&#8217;</span></h3> <p><span style="font-weight: 400;">As a warm welcome to its platform, 20Bet offers a significant first deposit bonus for sports betting. Exclusively available to new players who make their initial deposit and select this offer, the bonus amounts to 100% up to 100€.</span></p> <p><span style="font-weight: 400;">To qualify for this offer, a minimum deposit of 10 EUR is required, which should be made in a single transaction. It&#8217;s important to note that only one first deposit bonus is granted per customer, ensuring that all players benefit equally from this promotion.</span></p> <h4 id="bonus-100-up-to-100e-wagering-requirements"><span style="font-weight: 400;">Bonus &#8216;100% UP TO 100€&#8217; Wagering Requirements</span></h4> <p><span style="font-weight: 400;">Once your first deposit is made, the bonus will automatically be credited to your account, unless you&#8217;ve opted out by ticking the &#8220;No bonus&#8221; box. This additional sum enhances your betting capabilities, allowing you to explore more options and place higher bets.</span></p> <p><span style="font-weight: 400;">However, like all good things, this bonus comes with certain conditions. The wagering requirement entails betting 5x the bonus amount in accumulator bets. Each of these bets must contain at least two selections with total odds of 2 or higher.</span></p> <p><span style="font-weight: 400;">In order to withdraw funds from your account, the bonus must first be redeemed or wagered. If a withdrawal is requested while the bonus is still active, the bonus will be forfeited. Furthermore, this bonus must be wagered within a period of 7 days.</span></p> <p><span style="font-weight: 400;">This enticing offer ensures a boost to your initial betting capital, enabling you to kickstart your betting journey on 20Bet.</span></p> <h3 id="bonus-100-up-to-120e"><span style="font-weight: 400;">Bonus &#8216;100% UP TO 120€&#8217;</span></h3> <p><span style="font-weight: 400;">To augment the fun for its new casino players, 20Bet proffers a handsome first deposit bonus of 100% up to 120€. Registration is effortless, and with a minimum deposit of 20€, you can activate your bonus and start enjoying a range of casino games.</span></p> <p><span style="font-weight: 400;">This 20Bet welcome bonus has been tailored exclusively for new players making their first deposit and can increase your playing capital to as much as 240€, thus amplifying the potential for bigger wins.</span></p> <p><span style="font-weight: 400;">In addition to the match-up bonus, 20Bet further treats its new players to 120 free spins, delivered in four installments of 30 spins over four days. The first set is added immediately after the bonus activation, followed by 30 more each day for the next three days, giving you an extended chance at potential wins.</span></p> <h4 id="bonus-100-up-to-120e-wagering-requirements"><span style="font-weight: 400;">Bonus &#8216;100% UP TO 120€&#8217; Wagering Requirements</span></h4> <p><span style="font-weight: 400;">These free spins come with a 40x wagering requirement on winnings. This means that the amount you win from the free spins needs to be wagered 40 times before it can be withdrawn.</span></p> <p><span style="font-weight: 400;">As with all bonuses, it&#8217;s crucial to be mindful of the terms and conditions that apply. Remember, you need to be over 18 and of legal gambling age to be eligible for these promotions. This bonus, like all 20Bet bonuses, adheres to the general terms and conditions, ensuring a fair and transparent gaming environment for all players.</span></p> <h3 id="bonus-boost-your-odds"><span style="font-weight: 400;">Bonus &#8216;Boost your odds!&#8217;</span></h3> <p><span style="font-weight: 400;">In addition to its appealing welcome bonus, 20Bet offers its players an exciting promotion that can boost their winnings on combo bets by up to 100%. This promotion is known as the Combobooster, where you can construct a multibet of at least three events, each having minimum odds of 1.2.</span></p> <p><span style="font-weight: 400;">As the number of events in your multibet increases, so does the bonus booster. For instance, a multibet with three events garners a 1.05 bonus odds booster, while a multibet with 20 events can double your winnings with a 2.00 bonus odds booster.</span></p> <h4 id="bonus-boost-your-odds-wagering-requirements"><span style="font-weight: 400;">Bonus &#8216;Boost your odds!&#8217; Wagering Requirements</span></h4> <p><span style="font-weight: 400;">This feature kicks in automatically when at least three qualifying selections are added to your bet slip, and it applies to up to 20 selections. The terms and conditions explicitly state that bets on Asian totals and handicaps do not qualify for this promotion.</span></p> <p><span style="font-weight: 400;">In essence, this 20Bet bonus can significantly elevate your potential winnings, bringing an extra layer of excitement to your betting experience. It&#8217;s also important to note that the winnings from this promotion are credited to the real balance.</span></p> <h3 id="bonus-sport-vip-program"><span style="font-weight: 400;">Bonus &#8216;Sport VIP-program&#8217;</span></h3> <p><span style="font-weight: 400;">20Bet provides its users with an appealing sport VIP program that offers significant benefits. This program is automatically activated for each client and starts at the first level, with six levels available each calendar month.</span></p> <p><span style="font-weight: 400;">The sport VIP program operates on a compoints (CP) system. These points are awarded for placing bets on sports events. For each 3 EUR wagered, you gain 1 CP, with minimum odds of 1.3. These points then allow you to level up through the VIP program, offering higher rewards at each stage.</span></p> <h4 id="bonus-sport-vip-program-wagering-requirements"><span style="font-weight: 400;">Bonus &#8216;Sport VIP-program&#8217; Wagering Requirements</span></h4> <p><span style="font-weight: 400;">At the start of each new month, your VIP level resets, and the accumulated CPs convert into a bonus balance. This bonus can then be exchanged for freebets, with a rate of 1 EUR for every 100 CP. This means that you can earn up to 5,000 EUR in freebets per month, thus boosting your betting potential.</span></p> <p><span style="font-weight: 400;">Winnings on bets placed using your free bet will be paid as withdrawable funds, credited to your main balance. However, the free bet bonus itself cannot be withdrawn alongside these winnings.</span></p> <h3 id="bonus-slots-vip-program"><span style="font-weight: 400;">Bonus &#8216;Slots VIP-program&#8217;</span></h3> <p><span style="font-weight: 400;">20Bet offers an automatic participation in the VIP program for casino games to all players after they make their first deposit.</span></p> <p><span style="font-weight: 400;">The casino VIP program uses a system of Compoints (CPs) too. You earn these points by placing bets. For every 20 EUR you bet, you are credited with 1 CP. Please note that the bets contributing to CP accrual are only those made in slots. These CPs can be exchanged at a rate of 1 EUR for 100 CPs.</span></p> <h4 id="bonus-slots-vip-program-wagering-requirements"><span style="font-weight: 400;">Bonus &#8216;Slots VIP-program&#8217; Wagering Requirements</span></h4> <p><span style="font-weight: 400;">Please be aware, bets placed in table games and live dealer games do not count towards bonus wagering requirements. Also, bets placed with bonus funds do not count towards CP accrual.</span></p> <p><span style="font-weight: 400;">All the rewards you earn from this VIP program come with a wagering requirement. Any reward you earn has to be wagered 3X before you can withdraw it. Funds resulting from exchanging CPs into real money are credited with a lower wagering requirement of х1.</span></p> <h2 id="promo-codes-how-to-get-and-use-promocodes-at-20bet"><span style="font-weight: 400;">Promo Codes: How to get and use promocodes at 20Bet?</span></h2> <p><span style="font-weight: 400;">Using promo codes at 20Bet is an incredibly user-friendly experience, seamlessly enhancing your betting or gaming activities. 20Bet promocode offerings are a common feature, aimed at elevating the user experience through numerous bonuses and incentives. These codes are generally made available through various promotional campaigns run by 20Bet, and occasionally, they can also be found on affiliate sites. Once you&#8217;ve got hold of a 20Bet promocode, using it is a breeze. All you need to do is enter the promo code into the designated field when making a deposit or registering an account. The benefits linked to the promo codes 20Bet offers are instantly applied, providing a boost to your betting or gaming capital.</span></p> <h2 id="20bet-payment-methods"><span style="font-weight: 400;">20Bet Payment Methods</span></h2> <p><span style="font-weight: 400;">20Bet understands the importance of a smooth, reliable and diversified transaction process for its users. The wide range of deposit and withdrawal methods available at 20Bet is a testament to their commitment to providing an accessible and convenient betting environment.</span></p> <h3 id="available-deposit-and-withdrawal-methods-at-20bet"><span style="font-weight: 400;">Available deposit and withdrawal methods at 20Bet</span></h3> <p><span style="font-weight: 400;">20Bet caters to a global audience, and this is evident in their comprehensive list of payment methods. The platform supports numerous deposit methods, ranging from traditional options like Visa and MasterCard to more modern digital payment solutions like Neteller, Skrill, and various cryptocurrencies. This ensures that users from different regions and with different financial preferences can easily add funds to their 20Bet accounts.</span></p> <p><span style="font-weight: 400;">As for withdrawal methods, 20Bet is equally accommodating. Players can withdraw funds using the same methods as deposits, ensuring a seamless and efficient process.</span></p> <h3 id="deposit-and-withdrawal-limits-at-20bet"><span style="font-weight: 400;">Deposit and withdrawal limits at 20Bet</span></h3> <p><span style="font-weight: 400;">Understanding the deposit and withdrawal limits at 20Bet is crucial to managing your betting activities effectively. The minimum deposit for 20Bet is quite affordable, making it accessible for casual gamers and those with strict bankroll management strategies. On the other hand, 20Bet also considers high-rollers with a generous maximum deposit limit.</span></p> <p><span style="font-weight: 400;">Currency mostly used is the Euro, and has an average deposit and withdrawal range between €10 and €5,000. The maximum a gamer can withdraw presented in the following table:</span></p> <table> <tbody> <tr> <td><span style="font-weight: 400;">Per day</span></td> <td><span style="font-weight: 400;">€4,000</span></td> </tr> <tr> <td><span style="font-weight: 400;">Per week</span></td> <td><span style="font-weight: 400;">€10,000</span></td> </tr> <tr> <td><span style="font-weight: 400;">Per month</span></td> <td><span style="font-weight: 400;">€40,000</span></td> </tr> </tbody> </table> <h3 id="how-to-deposit-money-at-20bet"><span style="font-weight: 400;">How to deposit money at 20Bet?</span></h3> <p><span style="font-weight: 400;">Depositing money at 20Bet is a straightforward process. After logging in, you navigate to the &#8220;deposit&#8221; section in your account. From there, you select your preferred deposit method from the available options. Next, you enter the amount you wish to deposit, ensuring it meets the minimum deposit requirement at 20Bet. After confirming the transaction, the funds are immediately credited to your 20Bet account, and you&#8217;re ready to start betting.</span></p> <h3 id="how-to-withdraw-money-from-20bet"><span style="font-weight: 400;">How to withdraw money from 20Bet?</span></h3> <p><span style="font-weight: 400;">Withdrawing money from 20Bet is as simple as making a deposit. In the withdrawal section of your account, you select your desired withdrawal method from the options provided. You then enter the amount you wish to withdraw, noting that it must be within the minimum and maximum withdrawal limits set by 20Bet. After confirming the transaction, the withdrawal process begins. While withdrawal times can vary depending on the method chosen, 20Bet is committed to processing withdrawals as swiftly as possible.</span></p> <h2 id="registration-at-20bet-how-to-sing-up"><span style="font-weight: 400;">Registration at 20Bet: How to Sing Up?</span></h2> <p><span style="font-weight: 400;">Initiating your betting journey with 20Bet is a straightforward and hassle-free process. Let&#8217;s break it down step by step to guide you on how to sign up at 20Bet.</span></p> <ul> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Step 1: Visit 20Bet</strong> – Start by visiting the official 20Bet site or access their platform through a mirror link if needed. You can easily find these links through a basic web search.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Step 2: Sign Up</strong> – On the homepage, you&#8217;ll see a &#8216;Sign Up&#8217; button, usually at the top right corner. Click on this button to initiate the registration process. You&#8217;ll be redirected to a registration form that requires you to fill in your personal details like name, email address, country of residence, and preferred currency. Remember to make sure all the information entered is accurate.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Step 3: Make a Deposit</strong> – Once you&#8217;ve completed the registration form and created your 20Bet login credentials, you&#8217;ll be asked to deposit funds into your new account. The platform provides a variety of deposit methods to cater to different users. Choose the one that suits you best and follow the prompts to complete the transaction.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><strong>Step 4: Place Stakes</strong> – With your account funded, you can now place your bets. Browse through the sports events or casino games available at 20Bet, select your preferred stakes, and confirm your bets.</span></li> </ul> <h3 id="registration-requirements"><span style="font-weight: 400;">Registration Requirements</span></h3> <p><span style="font-weight: 400;">It&#8217;s important to note that to register at 20Bet, you must be at least 18 years old, as per the site&#8217;s terms and conditions. Moreover, 20Bet require additional age verification.</span></p> <h3 id="how-to-register-with-mobile-app"><span style="font-weight: 400;">How to register with mobile app?</span></h3> <p><span style="font-weight: 400;">If you prefer wagering on the go, 20Bet has a mobile app for that. The sign-up process on the mobile app is identical to the one on the official site. Download the app, tap on &#8216;Sign In&#8217;, fill in your details, make a deposit, and you&#8217;re ready to bet.</span></p> <h3 id="how-to-get-a-welcome-bonus-20bet-with-registration"><span style="font-weight: 400;">How to Get a Welcome Bonus 20Bet with Registration?</span></h3> <p><span style="font-weight: 400;">20Bet offers a welcome bonus to its new users. After you register, make your first deposit and select the welcome bonus option. The bonus will be automatically added to your account, ready to be used in your bets.</span></p> <h2 id="20bet-account-verification-instruction"><span style="font-weight: 400;">20Bet Account Verification Instruction</span></h2> <p><span style="font-weight: 400;">To secure its platform and maintain compliance with legal regulations, 20Bet requires its users to complete an account verification process. This process involves providing documentation that verifies your identity, age, and residence.</span></p> <p><span style="font-weight: 400;">Once you&#8217;ve registered an account with 20Bet, you&#8217;ll receive an email with instructions on how to verify your account.</span></p> <p><span style="font-weight: 400;">Also, you&#8217;ll need to provide a form of photo identification, such as a passport or driver&#8217;s license, to verify your identity and age. To confirm your place of residence, you may be asked for a utility bill, bank statement, or a similar document showing your address.</span></p> <p><span style="font-weight: 400;">You can usually upload these documents directly through the 20Bet site or app. Make sure that the documents you provide are clearly readable and that the relevant information isn&#8217;t obscured.</span></p> <p><span style="font-weight: 400;">Once you&#8217;ve submitted your documents, 20Bet&#8217;s verification team will review them.</span></p> <h2 id="20bet-mobile-app-for-android-and-ios"><span style="font-weight: 400;">20Bet Mobile App for Android and iOS</span></h2> <p><span style="font-weight: 400;">For those who prefer to bet on the move, 20Bet offers an excellent mobile app for both Android and iOS devices. This app lets users have access to all the features of the 20Bet website, ensuring seamless sports betting and casino experiences, even when on the go.</span></p> <h3 id="system-requirements-20bet-app-for-android-and-ios"><span style="font-weight: 400;">System Requirements 20Bet App for Android and iOS</span></h3> <p><span style="font-weight: 400;">In terms of system requirements, the 20Bet app for Android requires your device to be running on Android 5.0 or higher, while the iOS version requires iOS 9.0 or later, making the app compatible with a wide range of modern smartphones and tablets.</span></p> <h3 id="how-to-download-20bet-apk-for-android"><span style="font-weight: 400;">How to download 20Bet APK for Android?</span></h3> <p><span style="font-weight: 400;">For Android users, the process to download the 20Bet APK is slightly different as the app is not available on the Google Play Store due to its policies on real money gambling apps. Instead, you&#8217;ll need to download the APK file directly from the 20Bet website. Make sure to allow downloads from unknown sources in your device&#8217;s security settings to successfully download the APK file.</span></p> <h3 id="how-to-install-20bet-app-on-android"><span style="font-weight: 400;">How to install 20Bet App on Android?</span></h3> <p><span style="font-weight: 400;">Once the APK file is downloaded, you can install the 20Bet app on your Android device by clicking on the downloaded file and following the instructions provided. Please note that you might need to verify the install manually due to Android&#8217;s security protocols regarding apps installed from outside the Play Store.</span></p> <h3 id="how-to-download-and-install-20bet-app-on-ios"><span style="font-weight: 400;">How to download and install 20Bet App on iOS?</span></h3> <p><span style="font-weight: 400;">If you&#8217;re using an iOS device, the process is more straightforward as the 20Bet app is available on the App Store. You can download and install the app by simply searching for &#8220;20Bet&#8221; in the App Store and clicking on the &#8220;Get&#8221; button.</span></p> <h3 id="how-to-update-20bet-app"><span style="font-weight: 400;">How to Update 20Bet App?</span></h3> <p><span style="font-weight: 400;">Regardless of whether you&#8217;re using an Android or iOS device, you&#8217;ll need to keep your 20Bet app up-to-date to ensure you have access to the latest features and security improvements. You can usually update the app through the same means as you installed it, either via the Play Store, App Store, or 20Bet&#8217;s website in the case of Android APKs.</span></p> <h2 id="tips-and-best-practice-for-playing-at-20bet"><span style="font-weight: 400;">Tips and Best Practice for playing at 20Bet</span></h2> <p><span style="font-weight: 400;">When playing at 20Bet, a couple of tips and best practices can enhance your overall gaming and betting experience. Firstly, familiarize yourself with the games or sports you intend to bet on. Understanding the rules and strategies involved in the game will increase your chances of winning.</span></p> <p><span style="font-weight: 400;">Secondly, always take advantage of 20Bet&#8217;s promotions and bonuses. These offers can boost your initial deposit, giving you more funds to play with. Always check the terms and conditions, though, as these promotions come with wagering requirements.</span></p> <p><span style="font-weight: 400;">Moreover, utilize the 20Bet VIP loyalty program to earn compoints (CPs) which can be exchanged for freebets or casino credits. This is a great way to maximize your gameplay while increasing your potential rewards.</span></p> <p><span style="font-weight: 400;">Next, manage your bankroll wisely. Don&#8217;t bet more than you can afford to lose, and consider setting a budget to keep your betting habits under control.</span></p> <p><span style="font-weight: 400;">Lastly, verify your account as soon as possible. 20Bet account verification is a straightforward process and helps to ensure smooth transactions and security for your account.</span></p> <h2 id="20bet-mobile-website"><span style="font-weight: 400;">20Bet Mobile Website</span></h2> <p><span style="font-weight: 400;">Navigating through the 20Bet mobile website is quite intuitive and user-friendly. The website&#8217;s design is sleek and adapts perfectly to the screen size of any mobile device, providing an excellent user experience. The mobile website retains all the functionalities of the desktop version, including sports betting, casino games, live casino, promotions, and customer support. It&#8217;s easy to log in, make deposits and withdrawals, place bets, or interact with the support team.</span></p> <h3 id="how-to-use-the-20bet-mobile-website"><span style="font-weight: 400;">How to use the 20Bet Mobile Website?</span></h3> <p><span style="font-weight: 400;">To use the 20Bet mobile website, simply enter the 20Bet URL in your mobile browser. Once the website loads, you can use your 20Bet login details to sign in. If you&#8217;re new, you can even register directly from your mobile device. The website is structured such that you can easily find the sports betting section, casino games, your account details, and customer support.</span></p> <h2 id="20bet-license-and-fairness"><span style="font-weight: 400;">20Bet License and Fairness</span></h2> <p><span style="font-weight: 400;">Moving on to the platform&#8217;s legitimacy, 20Bet operates under a license from the Curacao eGaming Licensing Authority. This ensures that all operations on the site meet the standard gambling regulations and practices. 20Bet is committed to ensuring fairness in all its games and betting options. It uses Random Number Generator (RNG) technology for its casino games, which guarantees unbiased results and an equal chance of winning for all players.</span></p> <h2 id="20bet-customer-support"><span style="font-weight: 400;">20Bet Customer support</span></h2> <p><span style="font-weight: 400;">In case you run into any issues or have any queries, 20Bet&#8217;s customer support is readily available to assist. The customer support team can be contacted through live chat or email. The live chat option is easily accessible from any page of the website, providing instant responses. If your query is not urgent, or if you require a more detailed response, you can opt for the email support. The support team is quite professional, responsive, and strives to resolve all customer issues promptly.</span></p> <h2 id="final-opinion-on-20bet-as-bookmaker-and-online-casino"><span style="font-weight: 400;">Final Opinion on 20Bet as bookmaker and online casino</span></h2> <p><span style="font-weight: 400;">Overall, 20Bet solidifies its place as an exceptional online casino and bookmaker with a wide range of offerings. Its multitude of payment methods caters to a global audience, while the seamless registration and verification process provide a user-friendly experience. The availability of a VIP loyalty program demonstrates a commendable commitment to customer engagement. Notably, their adaptability to mobile platforms, both through the app and mobile website, ensures convenience and accessibility for players on the go. However, the absence of a no-deposit bonus might be a minor setback for some. Still, 20Bet appears to be a sound choice for both betting enthusiasts and online casino players, balancing legality, fairness, and customer support in an attractive package.</span></p> <p> <strong> <em>Read this page in other languages:</em> </strong> </p> <ul> <li> <a href="https://asian-bookies.net/hi/?post_type=prp_reviews&p=14641">हिन्दी: 20Bet &#8211; India</a> </li> <li> <a href="https://asian-bookies.net/ja/?post_type=prp_reviews&p=13395">日本語: 20Bet Japan</a> </li> <li> <a href="https://asian-bookies.net/vi/?post_type=prp_reviews&p=13410">Tiếng Việt: 20Bet &#8211; Vietnam</a> </li> <li> <a href="https://asian-bookies.net/th/?post_type=prp_reviews&p=13399">ไทย: 20Bet &#8211; Thailand</a> </li> <li> <a href="https://asian-bookies.net/bn/?post_type=prp_reviews&p=13396">বাংলা: 20Bet- Bangladesh</a> </li> <li> <a href="https://asian-bookies.net/tl/?post_type=prp_reviews&p=13397">Tagalog: 20Bet &#8211; Philippines</a> </li> </ul> <h2 id="sports">Sports</h2> <div class="g-toggle-list g-toggle-list--w-icon"><ul> <li > <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/Winz-io-сasino.png.webp" type="image/webp"><img src="https://asian-bookies.net/wp-content/uploads/2022/12/Winz-io-сasino.png" alt="Winz-io-сasino" class="webpexpress-processed"></picture> <span>Cricket</span> </li> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/12/mobile_banner.webp" alt=""> <span>Football</span> </li> </ul></div> <h2 id="odds-formats">Odds Format's</h2> <div class="g-toggle-list g-toggle-list--w-icon"><ul> <li > <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/european-union.png.webp" type="image/webp"><img src="https://asian-bookies.net/wp-content/uploads/2022/12/european-union.png" alt="decimal odds" class="webpexpress-processed"></picture> <span>Decimal (European)</span> </li> <li > <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/united-kingdom.png.webp" type="image/webp"><img src="https://asian-bookies.net/wp-content/uploads/2022/12/united-kingdom.png" alt="United-kingdom - en" class="webpexpress-processed"></picture> <span>Fractional (UK, Britain)</span> </li> <li > <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/hong-kong.png.webp" type="image/webp"><img src="https://asian-bookies.net/wp-content/uploads/2022/12/hong-kong.png" alt="hong-kong odds" class="webpexpress-processed"></picture> <span>Hong Kong</span> </li> <li > <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/indonesia.png.webp" type="image/webp"><img src="https://asian-bookies.net/wp-content/uploads/2022/12/indonesia.png" alt="indonesia odds" class="webpexpress-processed"></picture> <span>Indonesian</span> </li> <li > <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/malaysia.png.webp" type="image/webp"><img src="https://asian-bookies.net/wp-content/uploads/2022/12/malaysia.png" alt="malaysian odds" class="webpexpress-processed"></picture> <span>Malaysian</span> </li> <li > <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/america.png.webp" type="image/webp"><img src="https://asian-bookies.net/wp-content/uploads/2022/12/america.png" alt="moneyline odds" class="webpexpress-processed"></picture> <span>Moneyline (American)</span> </li> </ul></div> <h2 id="accepted-cryptocurrencies">Accepted Cryptocurrencies</h2> <div class="g-toggle-list g-toggle-list--w-icon"><ul> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/EUR.svg" alt=""> <span>EUR</span> </li> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/USD.svg" alt=""> <span>USD</span> </li> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/BTC.svg" alt=""> <span>BTC</span> </li> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/ETH.svg" alt=""> <span>ETH</span> </li> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/LTC.svg" alt=""> <span>LTC</span> </li> <li > <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2023/02/dogecoin.png.webp" type="image/webp"><img src="https://asian-bookies.net/wp-content/uploads/2023/02/dogecoin.png" alt="doge" class="webpexpress-processed"></picture> <span>DOGE</span> </li> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/USDT.svg" alt=""> <span>USDT</span> </li> </ul></div> <h2 id="available-games">Available Games</h2> <div class="g-toggle-list g-toggle-list--w-icon"><ul> <li > <i class="list-check-icon"></i> <span>Sports Betting</span> </li> <li > <i class="list-check-icon"></i> <span>Poker</span> </li> <li > <i class="list-check-icon"></i> <span>BlackJack</span> </li> <li > <i class="list-check-icon"></i> <span>Roulette</span> </li> <li > <i class="list-check-icon"></i> <span>Bingo</span> </li> <li > <i class="list-check-icon"></i> <span>Baccarat</span> </li> </ul></div> <h2 id="supported-languages">Supported Languages</h2> <div class="g-toggle-list g-toggle-list--w-icon"><ul> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/Rectangle-1162.svg" alt=""> <span>English</span> </li> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/Rectangle-1162-2.svg" alt=""> <span>German</span> </li> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/Rectangle-1163-1.svg" alt=""> <span>Portuguese</span> </li> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/Rectangle-1163-6.svg" alt=""> <span>Polish</span> </li> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/Rectangle-1162-4.svg" alt=""> <span>Japanese</span> </li> <li > <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/11/Rectangle-1162.jpg.webp" type="image/webp"><img src="https://asian-bookies.net/wp-content/uploads/2022/11/Rectangle-1162.jpg" alt="" class="webpexpress-processed"></picture> <span>Italian</span> </li> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/Rectangle-1162-1.svg" alt=""> <span>French</span> </li> <li > <img src="https://asian-bookies.net/wp-content/uploads/2022/11/Rectangle-1162-1-1.svg" alt=""> <span>Hungarian</span> </li> <li class="g-toggle-list__hide-elem"> <img src="https://asian-bookies.net/wp-content/uploads/2022/11/Rectangle-1163-5.svg" alt=""> <span>Vietnamese</span> </li> <li class="g-toggle-list__hide-elem"> <img src="https://asian-bookies.net/wp-content/uploads/2022/11/Rectangle-1162-3-1.svg" alt=""> <span>Hindi</span> </li> <li class="g-toggle-list__hide-elem"> <img src="https://asian-bookies.net/wp-content/uploads/2022/11/Chinese.svg" alt=""> <span>Chinese</span> </li> <li class="btn-li"> <button class="g-toggle-list__btn">+6</button> </li> </ul></div> <div class="pros-cons-block -small-fs"> <div class="pros-cons-block__block -pros"> <div class="pros-cons-block__title">Pros</div> <div class="pros-cons-block__content"><ul> <li><span style="font-weight: 400;"> Global Access: Available worldwide with few country restrictions.</span></li> <li><span style="font-weight: 400;">Broad Range of Sports and Events: Covers over 30 sports, and offers 40,000+ events per month.</span></li> <li><span style="font-weight: 400;">High Payouts: Promises 95%+ payout on top events and leagues.</span></li> <li><span style="font-weight: 400;">Versatile Betting Options: Supports diverse bets like Asian Handicaps, Card and Corner bets, and offers both Full/Partial Cash Out options.</span></li> <li><span style="font-weight: 400;">User-Centric Features: Provides live streaming, Quick Bet feature, and fast markets.</span></li> <li><span style="font-weight: 400;">Flexible Payments: Supports both standard and cryptocurrencies with a low minimum deposit of €/$10.</span></li> <li><span style="font-weight: 400;">Multilingual Support: The platform operates in 15+ languages, enhancing accessibility.</span></li> <li><span style="font-weight: 400;">Round-the-Clock Customer Service: Offers 24/7 customer support to help bettors.</span></li> </ul> </div> </div> <div class="pros-cons-block__block -cons"> <div class="pros-cons-block__title">Cons</div> <div class="pros-cons-block__content"><ul> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Limited License: Operates under a Curacao license, which might not offer the same level of regulation as other jurisdictions.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Payout rate: some users might also be disappointed with the platform&#8217;s average overall payout rate.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Withdrawal Limitations: Caps withdrawals at €4,000/day.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Restricted Bonuses: No bonuses for crypto account holders and users from Sweden &amp; Finland.</span></li> </ul> </div> </div> </div> </article> </div> <div class="rev-page-first-block--side"> <div class="review-page--side-rating--wrapper"> <div class="review-page--side-rating"> <div class="rp-side-rating__val">4.9/5</div> <div class="main-stars-block rp-side-rating__stars"> <i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i> </div> <div class="rp-side-rating__title"> Overall Rating </div> </div> <div class="review-page--side-rating--items"> <div class="li"> <div class="label">Bonuses</div> <div class="val-grid"> <div class="main-stars-block"> <i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i> </div> <span class="rating-val">5/5</span> </div> </div> <div class="li"> <div class="label">Look &amp; Feel</div> <div class="val-grid"> <div class="main-stars-block"> <i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i> </div> <span class="rating-val">5/5</span> </div> </div> <div class="li"> <div class="label">Licensing &amp; Safety</div> <div class="val-grid"> <div class="main-stars-block"> <i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i> </div> <span class="rating-val">5/5</span> </div> </div> <div class="li"> <div class="label">Game Selection</div> <div class="val-grid"> <div class="main-stars-block"> <i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i> </div> <span class="rating-val">5/5</span> </div> </div> <div class="li"> <div class="label">Payment Options</div> <div class="val-grid"> <div class="main-stars-block"> <i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i> </div> <span class="rating-val">5/5</span> </div> </div> <div class="li"> <div class="label">Customer Support</div> <div class="val-grid"> <div class="main-stars-block"> <i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="icon-half green"></i> </div> <span class="rating-val">4.5/5</span> </div> </div> <div class="li"> <div class="label">Сustomer Reviews</div> <div class="val-grid"> <div class="main-stars-block"> <i class="icon-empty green"></i><i class="icon-empty green"></i><i class="icon-empty green"></i><i class="icon-empty green"></i><i class="icon-empty green"></i> </div> <span class="rating-val">0/5</span> </div> </div> </div> </div> <div class="review-page--side-rating---data"> <div class="line"> <label class="label">Website</label> <span class="val"> <a aria-label="Go to 20Bet betting site" href="https://asian-bookies.net/go/20bet/" rel="nofollow" target="_blank">20bet.com</a> </span> </div> <div class="line"> <label class="label">Established</label> <span class="val"> TechSolutions Group NV </span> </div> <div class="line"> <label class="label">License</label> <span class="val"> Curacao </span> </div> <div class="line"> <label class="label">Bonus</label> <span class="val"> <span>+100%</span> Bonus up to <span>$100 USD</span> </span> </div> <div class="line"> <label class="label">Wagering Requirement</label> <span class="val"> 20x </span> </div> <div class="line"> <label class="label">No Deposit Bonus</label> <span class="val"> No </span> </div> <div class="line"> <label class="label">Live Chat</label> <span class="val"> Yes </span> </div> <div class="line"> <div class="label">Bonus %</div> <div class="val"> 100% </div> </div> <div class="line"> <div class="label">Min.dep in $</div> <div class="val"> 10 USD </div> </div> <div class="line"> <div class="label">Payments </div> <div class="val"> Astropay, AstroPayCard, Bank Transfer, Bitcoin, Dogecoin, Ecopayz, ethereum, eZeewallet, Interac, Jeton, Klarna, LiteCoin, Mastercard, Mifinity, MuchBetter, Neteller, Paycos, Paysefecard, Rapid Transfer, Skrill, Sofort, Sticpay, Tether, Tron, Utorg, Visa, Zimpler </div> </div> <div class="line"> <div class="label">Credit cards</div> <div class="val"> Accepted </div> </div> <div class="line"> <div class="label">Withdraw time </div> <div class="val"> 0-48 house </div> </div> <div class="line"> <div class="label">Cashout Times</div> <div class="val"> 0-72 house </div> </div> <div class="line"> <div class="label">Email Support </div> <div class="val"> <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fc8f898c8c938e88bcceccbe9988d29f9391">[email&#160;protected]</a> </div> </div> </div> <div class="review-page--side-rating--add-rev" role="button"> <i></i> <div class="add-rev--title">Customer too?</div> <div class="add-rev--btn">LEAVE YOUR REVIEW</div> </div> <a class="review-page--side-cta" rel="nofollow" target="_blank" href="https://asian-bookies.net/go/20bet/"> <div class="review-page--side-cta__logo" style="background-color:#0d1d34"> <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet.png.webp" type="image/webp"><img width="293" height="136" src="https://asian-bookies.net/wp-content/uploads/2022/12/20bet.png" class="attachment-medium size-medium webpexpress-processed" alt="20bet" decoding="async"></picture> </div> <div class="add-rev--title">Go to 20Bet</div> </a> </div> </div> </div> <h2 id="20bet-gallery-visual-and-usability">20Bet gallery: Visual and Usability</h2><div class="screens-block"> <div data-fslightbox data-fslightbox="gallery" data-index="0" href="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-2.png" class="screens-block__item" role="button"> <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-2-350x204.png.webp" type="image/webp"><img loading="lazy" src="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-2-350x204.png" alt="20bet" class="webpexpress-processed"></picture> </div> <div data-fslightbox data-fslightbox="gallery" data-index="1" href="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-bettors-tournament.png" class="screens-block__item" role="button"> <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-bettors-tournament-350x204.png.webp" type="image/webp"><img loading="lazy" src="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-bettors-tournament-350x204.png" alt="20bet-bettors-tournament" class="webpexpress-processed"></picture> </div> <div data-fslightbox data-fslightbox="gallery" data-index="2" href="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-casino.png" class="screens-block__item" role="button"> <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-casino-350x204.png.webp" type="image/webp"><img loading="lazy" src="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-casino-350x204.png" alt="20bet-casino" class="webpexpress-processed"></picture> </div> <div data-fslightbox data-fslightbox="gallery" data-index="3" href="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live.png" class="screens-block__item" role="button"> <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-live-350x204.png.webp" type="image/webp"><img loading="lazy" src="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live-350x204.png" alt="20bet-live" class="webpexpress-processed"></picture> </div> <div data-fslightbox data-fslightbox="gallery" data-index="4" href="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live-casino.png" class="screens-block__item" role="button"> <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-live-casino-350x204.png.webp" type="image/webp"><img loading="lazy" src="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-live-casino-350x204.png" alt="20bet-live-casino" class="webpexpress-processed"></picture> </div> <div data-fslightbox data-fslightbox="gallery" data-index="5" href="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-sports.png" class="screens-block__item -hide-elem -btn-elem" role="button"> <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/20bet-sports-350x204.png.webp" type="image/webp"><img loading="lazy" src="https://asian-bookies.net/wp-content/uploads/2022/12/20bet-sports-350x204.png" alt="20bet-sports" class="webpexpress-processed"></picture> <button class="screens-block__btn"> <i></i> <span>Show more</span> </button> </div> <div data-fslightbox data-fslightbox="gallery" data-index="6" href="https://asian-bookies.net/wp-content/uploads/2022/12/promotions-1.png" class="screens-block__item -hide-elem" role="button"> <picture><source srcset="https://asian-bookies.net/wp-content/webp-express/webp-images/uploads/2022/12/promotions-1-350x204.png.webp" type="image/webp"><img loading="lazy" src="https://asian-bookies.net/wp-content/uploads/2022/12/promotions-1-350x204.png" alt="promotions" class="webpexpress-processed"></picture> </div> </div> <div id="faq-about-20bet" class="auto-scroll-block content-white block-content-padding block-content-lr-padding white-block-shadow mb30" itemscope itemtype="https://schema.org/FAQPage" > <div class="g-rp-rep-block-title"> <i class="faq-icon"></i> <div> <h2>FAQ about 20Bet:</h2> <div class="g-rp-rep-block-title__short-desc"></div> </div> </div> <div class="rev-page-faq"> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">Is betting at 20Bet betting site legal?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">Yes, betting at 20Bet is legal. The platform holds a license, ensuring its operations are compliant with legal standards.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">Which requirements for play at 20Bet?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">To play at 20Bet, you must be at least 18 years old and complete the registration process and verification.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">Is it possible to bet or play without registration on 20Bet?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">No, 20Bet requires registration before you can place bets or play casino games. This is to ensure user safety and compliance with regulatory requirements.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">Can I register multiple accounts in 20Bet?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">No, 20Bet only allows one account per person. Multiple accounts are against the platform&#8217;s terms and conditions.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">Is there a no deposit bonus for signing up with the 20Bet?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">As of now, 20Bet doesn&#8217;t offer a no-deposit bonus. Any bonus or promotion requires an initial deposit.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">Will I be able to get a welcome bonus for signing up on mobile?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">Yes, you can receive welcome bonuses, but only after making the first deposit, regardless of the device you use for signing up.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">Is the 20Bet app free to download?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">Yes, the 20Bet app is free to download. You can find it on the official 20Bet website or in the respective app stores for iOS and Android.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">How to play online without the 20Bet app for iOS or Android?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">Without the 20Bet app, you can still play online using the 20Bet mobile website, which is designed to be user-friendly on all devices.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">What deposit and withdrawal methods does the brand have?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">20Bet offers a wide range of deposit and withdrawal methods, including credit/debit cards, e-wallets, bank transfers, and cryptocurrency.</span></p> </div> </div> </div> <div class="yellow-bg-block rev-page-faq__item" itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">What is the minimum deposit for a brand?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text"> <p><span style="font-weight: 400;">The minimum deposit is currently €/$10.</span></p> </div> </div> </div> </div> </div> <div id="add-comment"> <div class="g-rev-page-comment-form "> <div class="g-rev-page-comment-form--title"> Post your review </div> <div class="g-rev-page-comment-form--desc">Everybody will see your review</div> <form class="add-comment" data-comment="0" data-post="5968" > <input type="hidden" id="add_comment_form_nonce" name="add_comment_form_nonce" value="5c2577932b" /><input type="hidden" name="_wp_http_referer" value="/review/20bet/" /> <div> <div class="g-rev-page-comment-form--input-group"> <input type="text" require name="name" placeholder="Your name"> <input type="text" require name="email" placeholder="Your E-mail"> </div> <textarea name="comment" require placeholder="Your comment..."></textarea> </div> <div> <div class="comment-rating-options"> <div class="comment-rating-options--title">Your grade out of 5</div> <div class="comment-rating-options--desc">Optional</div> <div class="comment-rating-options--val">N/A</div> <input type="range" name="rating" class="comment-rating-range" min="0" max="5" value="0" step="1"> </div> </div> <div> <div class="comment-form-errrors"></div> <button class="g-rev-page-comment-form--btn">Send</button> </div> </form> </div> </div> </main> </div> </div> </div> <button class="to-top-btn"><i></i></button> <footer class="site-footer"> <div class="site-footer--row container"> <div class="site-footer__logo"> <img src="https://asian-bookies.net/wp-content/themes/bb/images/logo.svg" alt="96 Bets Asia"> <div class="site-footer__copyr-txt"> AsiaBetting.Online is an independent site with reviews and ratings of betting sites and casinos. We conduct our own research and live tests of online platforms and websites. Based on our own experience, we write reviews and make ratings in which we give you information about betting and gambling, and the experience of our team. We earn commissions and this allows our site and team to continue to operate. But these commissions have no impact on our ratings, reviews and rankings. Gamble responsibly. We remind our readers that we only provide independent information, but you make your own decisions and are responsible for them when you gamble. If you need help with gambling addiction you can contact one of the organizations listed below. Their logos are clickable and lead directly to their official websites. </div> </div> <div class="site-footer__menues"> <div class="footer-menu -first"> <div class="footer-menu__title">Top Ratings</div> <nav class="footer-menu-list"><ul id="menu-top-ratings" class="menu"><li id="menu-item-19953" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-19953"><a href="https://asian-bookies.net/asian-handicap/">Asian Handicap</a></li> <li id="menu-item-19954" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-19954"><a href="https://asian-bookies.net/casino/">Asian Casinos</a></li> <li id="menu-item-21837" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21837"><a href="https://asian-bookies.net/bangladesh/">Bangladesh</a></li> <li id="menu-item-21838" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21838"><a href="https://asian-bookies.net/hong-kong/">Hong Kong</a></li> <li id="menu-item-21839" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21839"><a href="https://asian-bookies.net/india/">India</a></li> <li id="menu-item-21840" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21840"><a href="https://asian-bookies.net/indonesia/">Indonesia</a></li> <li id="menu-item-21841" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21841"><a href="https://asian-bookies.net/japan/">Japan</a></li> <li id="menu-item-21842" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21842"><a href="https://asian-bookies.net/korea/">Korea</a></li> <li id="menu-item-21843" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21843"><a href="https://asian-bookies.net/malaysia/">Malaysia</a></li> <li id="menu-item-21844" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21844"><a href="https://asian-bookies.net/vietnam/">Vietnam</a></li> <li id="menu-item-21845" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21845"><a href="https://asian-bookies.net/philippines/">Philippines</a></li> <li id="menu-item-21846" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21846"><a href="https://asian-bookies.net/singapore/">Singapore</a></li> <li id="menu-item-21847" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-21847"><a href="https://asian-bookies.net/thailand/">Thailand</a></li> </ul></nav> </div> <div class="footer-menu"> <div class="footer-menu__title">Info Pages</div> <nav class="footer-menu-list"><ul id="menu-info-pages" class="menu"><li id="menu-item-5569" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-5569"><a href="https://asian-bookies.net/about-us/">About Us</a></li> <li id="menu-item-84" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-84"><a href="https://asian-bookies.net/authors/">Authors &#038; Our team</a></li> <li id="menu-item-1111" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1111"><a href="https://asian-bookies.net/contacts/">Contact Us</a></li> </ul></nav> </div> </div> <div class="site-footer__bottom--logos"> <a class="logo-item" target="_blank" rel="nofollow" href="https://www.begambleaware.org/" title="BeGambleAware"> <img src="/wp-content/uploads/2022/12/bgmblawr.png" alt="BeGambleAware"> </a> <a class="logo-item" target="_blank" rel="nofollow" href="https://www.gamblingtherapy.org/" title="Gambling Therapy"> <img src="/wp-content/uploads/2022/12/gambl-therapy.png" alt="Gambling Therapy"> </a> <a class="logo-item" target="_blank" rel="nofollow" href="https://www.gamcare.org.uk/" title="GamCare"> <img src="/wp-content/uploads/2022/12/gamcare.png" alt="GamCare"> </a> <a class="logo-item" target="_blank" rel="nofollow" href="https://www.taketimetothink.co.uk/" title="Take Time To Think"> <img src="/wp-content/uploads/2022/12/taketimetothink.svg" alt="Take Time To Think"> </a> <a class="logo-item -hide-mob" target="_blank" rel="nofollow" href="https://www.gamstop.co.uk/" title="GAMSTOP"> <img src="/wp-content/uploads/2022/12/gamstop.png" alt="GAMSTOP"> </a> <a class="logo-item -hide-mob" target="_blank" rel="nofollow" href="https://quitgamble.com/" title="Quit Gamble"> <img src="/wp-content/uploads/2022/12/QuitGamble.png" alt="Quit Gamble"> </a> <a class="logo-item -hide-mob" target="_blank" rel="nofollow" href="https://www.pagcor.ph/regulatory/responsible-gaming.php" title="PACGOR"> <img src="/wp-content/uploads/2022/12/pagcor.png" alt="PACGOR"> </a> <a class="logo-item -hide-mob" target="_blank" rel="nofollow" href="https://ibia.bet/" title="International Betting Integrity Association"> <img src="/wp-content/uploads/2022/12/InternationalBettingIntegrity.svg" alt="International Betting Integrity Association"> </a> <a class="logo-item -hide-mob" target="_blank" rel="nofollow" href="https://ecogra.org/" title="eCORGA"> <img src="/wp-content/uploads/2022/12/ecorga.png" alt="eCORGA"> </a> <a class="logo-item -hide-mob" target="_blank" rel="nofollow" href="https://www.gamblingcommission.gov.uk/" title="Gambling Commission"> <img src="/wp-content/uploads/2022/12/gambling-commission.svg" alt="Gambling Commission"> </a> <div class="site-footer__bottom--logos--btn-toggle" role="button"> <span>View more +</span> </div> </div> <div class="site-footer__bottom-copyr container"> <div class="site-footer--dmcs-grid"> <a href="//www.dmca.com/Protection/Status.aspx?ID=2b8039f0-cb42-49a9-bb24-ef5811fcb356" title="DMCA.com Protection Status" class="dmca-badge"> <img width="150" height="30" src ="https://images.dmca.com/Badges/dmca_protected_sml_120n.png?ID=2b8039f0-cb42-49a9-bb24-ef5811fcb356" alt="DMCA.com Protection Status" /></a> <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script><script src="https://images.dmca.com/Badges/DMCABadgeHelper.min.js"> </script> <a href="https://www.trustpilot.com/review/asian-bookies.net" target="_blank" rel="nofollow" title="AsiaBetting.Online on Trustpilot" > <img src="/wp-content/uploads/2022/12/trustpilot.png" alt="Asian Bookies on Trustpilot"> </a> <img src="/wp-content/uploads/2022/12/gpwa.png" alt="AsiaBetting.Online on GPWA"> </div> <div class="c-t"> Copyright © 2025 – AsiaBetting.Online </div> </div> </div> </footer> <div class="g-popup-block"> <div class="container"> <div class="row"> <div class="g-popup-block__content"> <div class="g-popup-block__logo" style="background-color:#ffffff"> <a href="https://asian-bookies.net/go/1xbet/"> <img width="171" height="80" src="https://asian-bookies.net/wp-content/uploads/2022/11/1xbet.webp" class="attachment-review-teaser-image size-review-teaser-image" alt="1xbet - bookmaker logo" decoding="async" loading="lazy" /> </a> </div> <div class="g-rating-block"> <div class="title-score">5<span> / 5</span></div><div class="main-stars-block"><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i><i class="green"></i></div> </div> <div class="g-title-bonus-block"> <div class="prp-title">Bonus:</div> <div class="prp-col-bonus"> <span>100%</span> Bonus up to <span>$110 USD</span> <br>+ <span>150</span> Free Spins </div> </div> <div class="g-play-now-btn"> <a class="main-link-btn -ib-important" href="https://asian-bookies.net/go/1xbet/"> <span class="big-label">Play now!</span> <span class="small-label">Go to 1xBet</span> </a> </div> <button class="g-popup-block__close-btn"></button> </div> </div> </div> </div> <div class="g-comment-thank-block"> <div class="g-comment-thank-block--content"> <img src="https://asian-bookies.net/wp-content/themes/bb/images/thanks-img.svg" alt="Thanks for comment"> <div class="h2">Thank you!</div> <p>Your review has been sent for moderation</p> <button class="thanks-btn">Go back</button> </div> </div> <script type="text/javascript" src="https://asian-bookies.net/wp-content/themes/bb/dist/js/fslightbox.js?v=67ba66ef92b5a&amp;ver=6.7.2" id="fslightbox-js"></script> <script type="text/javascript" id="scripts-js-extra"> /* <![CDATA[ */ var ajax = {"url":"https:\/\/asian-bookies.net\/wp-admin\/admin-ajax.php","nonce":"96d5a588b5"}; /* ]]> */ </script> <script type="text/javascript" src="https://asian-bookies.net/wp-content/themes/bb/dist/js/scripts.min.js?v=67ba66ef92b65&amp;ver=6.7.2" id="scripts-js"></script> <script type="text/javascript"> (function() { var expirationDate = new Date(); expirationDate.setTime( expirationDate.getTime() + 31536000 * 1000 ); document.cookie = "pll_language=en; expires=" + expirationDate.toUTCString() + "; path=/; secure; SameSite=Lax"; }()); </script> <script> !function (e, t) { "object" == typeof exports && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : (e = "undefined" != typeof globalThis ? globalThis : e || self).Swiper = t() }(this, (function () { "use strict"; function e(e) { return null !== e && "object" == typeof e && "constructor" in e && e.constructor === Object } function t(s, a) { void 0 === s && (s = {}), void 0 === a && (a = {}), Object.keys(a).forEach((i => { void 0 === s[i] ? s[i] = a[i] : e(a[i]) && e(s[i]) && Object.keys(a[i]).length > 0 && t(s[i], a[i]) })) } const s = { body: {}, addEventListener() { }, removeEventListener() { }, activeElement: { blur() { }, nodeName: "" }, querySelector: () => null, querySelectorAll: () => [], getElementById: () => null, createEvent: () => ({ initEvent() { } }), createElement: () => ({ children: [], childNodes: [], style: {}, setAttribute() { }, getElementsByTagName: () => [] }), createElementNS: () => ({}), importNode: () => null, location: { hash: "", host: "", hostname: "", href: "", origin: "", pathname: "", protocol: "", search: "" } }; function a() { const e = "undefined" != typeof document ? document : {}; return t(e, s), e } const i = { document: s, navigator: { userAgent: "" }, location: { hash: "", host: "", hostname: "", href: "", origin: "", pathname: "", protocol: "", search: "" }, history: { replaceState() { }, pushState() { }, go() { }, back() { } }, CustomEvent: function () { return this }, addEventListener() { }, removeEventListener() { }, getComputedStyle: () => ({ getPropertyValue: () => "" }), Image() { }, Date() { }, screen: {}, setTimeout() { }, clearTimeout() { }, matchMedia: () => ({}), requestAnimationFrame: e => "undefined" == typeof setTimeout ? (e(), null) : setTimeout(e, 0), cancelAnimationFrame(e) { "undefined" != typeof setTimeout && clearTimeout(e) } }; function r() { const e = "undefined" != typeof window ? window : {}; return t(e, i), e } class n extends Array { constructor(e) { "number" == typeof e ? super(e) : (super(...e || []), function (e) { const t = e.__proto__; Object.defineProperty(e, "__proto__", { get: () => t, set(e) { t.__proto__ = e } }) }(this)) } } function l(e) { void 0 === e && (e = []); const t = []; return e.forEach((e => { Array.isArray(e) ? t.push(...l(e)) : t.push(e) })), t } function o(e, t) { return Array.prototype.filter.call(e, t) } function d(e, t) { const s = r(), i = a(); let l = []; if (!t && e instanceof n) return e; if (!e) return new n(l); if ("string" == typeof e) { const s = e.trim(); if (s.indexOf("<") >= 0 && s.indexOf(">") >= 0) { let e = "div"; 0 === s.indexOf("<li") && (e = "ul"), 0 === s.indexOf("<tr") && (e = "tbody"), 0 !== s.indexOf("<td") && 0 !== s.indexOf("<th") || (e = "tr"), 0 === s.indexOf("<tbody") && (e = "table"), 0 === s.indexOf("<option") && (e = "select"); const t = i.createElement(e); t.innerHTML = s; for (let e = 0; e < t.childNodes.length; e += 1)l.push(t.childNodes[e]) } else l = function (e, t) { if ("string" != typeof e) return [e]; const s = [], a = t.querySelectorAll(e); for (let e = 0; e < a.length; e += 1)s.push(a[e]); return s }(e.trim(), t || i) } else if (e.nodeType || e === s || e === i) l.push(e); else if (Array.isArray(e)) { if (e instanceof n) return e; l = e } return new n(function (e) { const t = []; for (let s = 0; s < e.length; s += 1)-1 === t.indexOf(e[s]) && t.push(e[s]); return t }(l)) } d.fn = n.prototype; const c = { addClass: function () { for (var e = arguments.length, t = new Array(e), s = 0; s < e; s++)t[s] = arguments[s]; const a = l(t.map((e => e.split(" ")))); return this.forEach((e => { e.classList.add(...a) })), this }, removeClass: function () { for (var e = arguments.length, t = new Array(e), s = 0; s < e; s++)t[s] = arguments[s]; const a = l(t.map((e => e.split(" ")))); return this.forEach((e => { e.classList.remove(...a) })), this }, hasClass: function () { for (var e = arguments.length, t = new Array(e), s = 0; s < e; s++)t[s] = arguments[s]; const a = l(t.map((e => e.split(" ")))); return o(this, (e => a.filter((t => e.classList.contains(t))).length > 0)).length > 0 }, toggleClass: function () { for (var e = arguments.length, t = new Array(e), s = 0; s < e; s++)t[s] = arguments[s]; const a = l(t.map((e => e.split(" ")))); this.forEach((e => { a.forEach((t => { e.classList.toggle(t) })) })) }, attr: function (e, t) { if (1 === arguments.length && "string" == typeof e) return this[0] ? this[0].getAttribute(e) : void 0; for (let s = 0; s < this.length; s += 1)if (2 === arguments.length) this[s].setAttribute(e, t); else for (const t in e) this[s][t] = e[t], this[s].setAttribute(t, e[t]); return this }, removeAttr: function (e) { for (let t = 0; t < this.length; t += 1)this[t].removeAttribute(e); return this }, transform: function (e) { for (let t = 0; t < this.length; t += 1)this[t].style.transform = e; return this }, transition: function (e) { for (let t = 0; t < this.length; t += 1)this[t].style.transitionDuration = "string" != typeof e ? `${e}ms` : e; return this }, on: function () { for (var e = arguments.length, t = new Array(e), s = 0; s < e; s++)t[s] = arguments[s]; let [a, i, r, n] = t; function l(e) { const t = e.target; if (!t) return; const s = e.target.dom7EventData || []; if (s.indexOf(e) < 0 && s.unshift(e), d(t).is(i)) r.apply(t, s); else { const e = d(t).parents(); for (let t = 0; t < e.length; t += 1)d(e[t]).is(i) && r.apply(e[t], s) } } function o(e) { const t = e && e.target && e.target.dom7EventData || []; t.indexOf(e) < 0 && t.unshift(e), r.apply(this, t) } "function" == typeof t[1] && ([a, r, n] = t, i = void 0), n || (n = !1); const c = a.split(" "); let p; for (let e = 0; e < this.length; e += 1) { const t = this[e]; if (i) for (p = 0; p < c.length; p += 1) { const e = c[p]; t.dom7LiveListeners || (t.dom7LiveListeners = {}), t.dom7LiveListeners[e] || (t.dom7LiveListeners[e] = []), t.dom7LiveListeners[e].push({ listener: r, proxyListener: l }), t.addEventListener(e, l, n) } else for (p = 0; p < c.length; p += 1) { const e = c[p]; t.dom7Listeners || (t.dom7Listeners = {}), t.dom7Listeners[e] || (t.dom7Listeners[e] = []), t.dom7Listeners[e].push({ listener: r, proxyListener: o }), t.addEventListener(e, o, n) } } return this }, off: function () { for (var e = arguments.length, t = new Array(e), s = 0; s < e; s++)t[s] = arguments[s]; let [a, i, r, n] = t; "function" == typeof t[1] && ([a, r, n] = t, i = void 0), n || (n = !1); const l = a.split(" "); for (let e = 0; e < l.length; e += 1) { const t = l[e]; for (let e = 0; e < this.length; e += 1) { const s = this[e]; let a; if (!i && s.dom7Listeners ? a = s.dom7Listeners[t] : i && s.dom7LiveListeners && (a = s.dom7LiveListeners[t]), a && a.length) for (let e = a.length - 1; e >= 0; e -= 1) { const i = a[e]; r && i.listener === r || r && i.listener && i.listener.dom7proxy && i.listener.dom7proxy === r ? (s.removeEventListener(t, i.proxyListener, n), a.splice(e, 1)) : r || (s.removeEventListener(t, i.proxyListener, n), a.splice(e, 1)) } } } return this }, trigger: function () { const e = r(); for (var t = arguments.length, s = new Array(t), a = 0; a < t; a++)s[a] = arguments[a]; const i = s[0].split(" "), n = s[1]; for (let t = 0; t < i.length; t += 1) { const a = i[t]; for (let t = 0; t < this.length; t += 1) { const i = this[t]; if (e.CustomEvent) { const t = new e.CustomEvent(a, { detail: n, bubbles: !0, cancelable: !0 }); i.dom7EventData = s.filter(((e, t) => t > 0)), i.dispatchEvent(t), i.dom7EventData = [], delete i.dom7EventData } } } return this }, transitionEnd: function (e) { const t = this; return e && t.on("transitionend", (function s(a) { a.target === this && (e.call(this, a), t.off("transitionend", s)) })), this }, outerWidth: function (e) { if (this.length > 0) { if (e) { const e = this.styles(); return this[0].offsetWidth + parseFloat(e.getPropertyValue("margin-right")) + parseFloat(e.getPropertyValue("margin-left")) } return this[0].offsetWidth } return null }, outerHeight: function (e) { if (this.length > 0) { if (e) { const e = this.styles(); return this[0].offsetHeight + parseFloat(e.getPropertyValue("margin-top")) + parseFloat(e.getPropertyValue("margin-bottom")) } return this[0].offsetHeight } return null }, styles: function () { const e = r(); return this[0] ? e.getComputedStyle(this[0], null) : {} }, offset: function () { if (this.length > 0) { const e = r(), t = a(), s = this[0], i = s.getBoundingClientRect(), n = t.body, l = s.clientTop || n.clientTop || 0, o = s.clientLeft || n.clientLeft || 0, d = s === e ? e.scrollY : s.scrollTop, c = s === e ? e.scrollX : s.scrollLeft; return { top: i.top + d - l, left: i.left + c - o } } return null }, css: function (e, t) { const s = r(); let a; if (1 === arguments.length) { if ("string" != typeof e) { for (a = 0; a < this.length; a += 1)for (const t in e) this[a].style[t] = e[t]; return this } if (this[0]) return s.getComputedStyle(this[0], null).getPropertyValue(e) } if (2 === arguments.length && "string" == typeof e) { for (a = 0; a < this.length; a += 1)this[a].style[e] = t; return this } return this }, each: function (e) { return e ? (this.forEach(((t, s) => { e.apply(t, [t, s]) })), this) : this }, html: function (e) { if (void 0 === e) return this[0] ? this[0].innerHTML : null; for (let t = 0; t < this.length; t += 1)this[t].innerHTML = e; return this }, text: function (e) { if (void 0 === e) return this[0] ? this[0].textContent.trim() : null; for (let t = 0; t < this.length; t += 1)this[t].textContent = e; return this }, is: function (e) { const t = r(), s = a(), i = this[0]; let l, o; if (!i || void 0 === e) return !1; if ("string" == typeof e) { if (i.matches) return i.matches(e); if (i.webkitMatchesSelector) return i.webkitMatchesSelector(e); if (i.msMatchesSelector) return i.msMatchesSelector(e); for (l = d(e), o = 0; o < l.length; o += 1)if (l[o] === i) return !0; return !1 } if (e === s) return i === s; if (e === t) return i === t; if (e.nodeType || e instanceof n) { for (l = e.nodeType ? [e] : e, o = 0; o < l.length; o += 1)if (l[o] === i) return !0; return !1 } return !1 }, index: function () { let e, t = this[0]; if (t) { for (e = 0; null !== (t = t.previousSibling);)1 === t.nodeType && (e += 1); return e } }, eq: function (e) { if (void 0 === e) return this; const t = this.length; if (e > t - 1) return d([]); if (e < 0) { const s = t + e; return d(s < 0 ? [] : [this[s]]) } return d([this[e]]) }, append: function () { let e; const t = a(); for (let s = 0; s < arguments.length; s += 1) { e = s < 0 || arguments.length <= s ? void 0 : arguments[s]; for (let s = 0; s < this.length; s += 1)if ("string" == typeof e) { const a = t.createElement("div"); for (a.innerHTML = e; a.firstChild;)this[s].appendChild(a.firstChild) } else if (e instanceof n) for (let t = 0; t < e.length; t += 1)this[s].appendChild(e[t]); else this[s].appendChild(e) } return this }, prepend: function (e) { const t = a(); let s, i; for (s = 0; s < this.length; s += 1)if ("string" == typeof e) { const a = t.createElement("div"); for (a.innerHTML = e, i = a.childNodes.length - 1; i >= 0; i -= 1)this[s].insertBefore(a.childNodes[i], this[s].childNodes[0]) } else if (e instanceof n) for (i = 0; i < e.length; i += 1)this[s].insertBefore(e[i], this[s].childNodes[0]); else this[s].insertBefore(e, this[s].childNodes[0]); return this }, next: function (e) { return this.length > 0 ? e ? this[0].nextElementSibling && d(this[0].nextElementSibling).is(e) ? d([this[0].nextElementSibling]) : d([]) : this[0].nextElementSibling ? d([this[0].nextElementSibling]) : d([]) : d([]) }, nextAll: function (e) { const t = []; let s = this[0]; if (!s) return d([]); for (; s.nextElementSibling;) { const a = s.nextElementSibling; e ? d(a).is(e) && t.push(a) : t.push(a), s = a } return d(t) }, prev: function (e) { if (this.length > 0) { const t = this[0]; return e ? t.previousElementSibling && d(t.previousElementSibling).is(e) ? d([t.previousElementSibling]) : d([]) : t.previousElementSibling ? d([t.previousElementSibling]) : d([]) } return d([]) }, prevAll: function (e) { const t = []; let s = this[0]; if (!s) return d([]); for (; s.previousElementSibling;) { const a = s.previousElementSibling; e ? d(a).is(e) && t.push(a) : t.push(a), s = a } return d(t) }, parent: function (e) { const t = []; for (let s = 0; s < this.length; s += 1)null !== this[s].parentNode && (e ? d(this[s].parentNode).is(e) && t.push(this[s].parentNode) : t.push(this[s].parentNode)); return d(t) }, parents: function (e) { const t = []; for (let s = 0; s < this.length; s += 1) { let a = this[s].parentNode; for (; a;)e ? d(a).is(e) && t.push(a) : t.push(a), a = a.parentNode } return d(t) }, closest: function (e) { let t = this; return void 0 === e ? d([]) : (t.is(e) || (t = t.parents(e).eq(0)), t) }, find: function (e) { const t = []; for (let s = 0; s < this.length; s += 1) { const a = this[s].querySelectorAll(e); for (let e = 0; e < a.length; e += 1)t.push(a[e]) } return d(t) }, children: function (e) { const t = []; for (let s = 0; s < this.length; s += 1) { const a = this[s].children; for (let s = 0; s < a.length; s += 1)e && !d(a[s]).is(e) || t.push(a[s]) } return d(t) }, filter: function (e) { return d(o(this, e)) }, remove: function () { for (let e = 0; e < this.length; e += 1)this[e].parentNode && this[e].parentNode.removeChild(this[e]); return this } }; function p(e, t) { return void 0 === t && (t = 0), setTimeout(e, t) } function u() { return Date.now() } function h(e, t) { void 0 === t && (t = "x"); const s = r(); let a, i, n; const l = function (e) { const t = r(); let s; return t.getComputedStyle && (s = t.getComputedStyle(e, null)), !s && e.currentStyle && (s = e.currentStyle), s || (s = e.style), s }(e); return s.WebKitCSSMatrix ? (i = l.transform || l.webkitTransform, i.split(",").length > 6 && (i = i.split(", ").map((e => e.replace(",", "."))).join(", ")), n = new s.WebKitCSSMatrix("none" === i ? "" : i)) : (n = l.MozTransform || l.OTransform || l.MsTransform || l.msTransform || l.transform || l.getPropertyValue("transform").replace("translate(", "matrix(1, 0, 0, 1,"), a = n.toString().split(",")), "x" === t && (i = s.WebKitCSSMatrix ? n.m41 : 16 === a.length ? parseFloat(a[12]) : parseFloat(a[4])), "y" === t && (i = s.WebKitCSSMatrix ? n.m42 : 16 === a.length ? parseFloat(a[13]) : parseFloat(a[5])), i || 0 } function m(e) { return "object" == typeof e && null !== e && e.constructor && "Object" === Object.prototype.toString.call(e).slice(8, -1) } function f(e) { return "undefined" != typeof window && void 0 !== window.HTMLElement ? e instanceof HTMLElement : e && (1 === e.nodeType || 11 === e.nodeType) } function g() { const e = Object(arguments.length <= 0 ? void 0 : arguments[0]), t = ["__proto__", "constructor", "prototype"]; for (let s = 1; s < arguments.length; s += 1) { const a = s < 0 || arguments.length <= s ? void 0 : arguments[s]; if (null != a && !f(a)) { const s = Object.keys(Object(a)).filter((e => t.indexOf(e) < 0)); for (let t = 0, i = s.length; t < i; t += 1) { const i = s[t], r = Object.getOwnPropertyDescriptor(a, i); void 0 !== r && r.enumerable && (m(e[i]) && m(a[i]) ? a[i].__swiper__ ? e[i] = a[i] : g(e[i], a[i]) : !m(e[i]) && m(a[i]) ? (e[i] = {}, a[i].__swiper__ ? e[i] = a[i] : g(e[i], a[i])) : e[i] = a[i]) } } } return e } function v(e, t, s) { e.style.setProperty(t, s) } function w(e) { let { swiper: t, targetPosition: s, side: a } = e; const i = r(), n = -t.translate; let l, o = null; const d = t.params.speed; t.wrapperEl.style.scrollSnapType = "none", i.cancelAnimationFrame(t.cssModeFrameID); const c = s > n ? "next" : "prev", p = (e, t) => "next" === c && e >= t || "prev" === c && e <= t, u = () => { l = (new Date).getTime(), null === o && (o = l); const e = Math.max(Math.min((l - o) / d, 1), 0), r = .5 - Math.cos(e * Math.PI) / 2; let c = n + r * (s - n); if (p(c, s) && (c = s), t.wrapperEl.scrollTo({ [a]: c }), p(c, s)) return t.wrapperEl.style.overflow = "hidden", t.wrapperEl.style.scrollSnapType = "", setTimeout((() => { t.wrapperEl.style.overflow = "", t.wrapperEl.scrollTo({ [a]: c }) })), void i.cancelAnimationFrame(t.cssModeFrameID); t.cssModeFrameID = i.requestAnimationFrame(u) }; u() } let b, x, y; function E() { return b || (b = function () { const e = r(), t = a(); return { smoothScroll: t.documentElement && "scrollBehavior" in t.documentElement.style, touch: !!("ontouchstart" in e || e.DocumentTouch && t instanceof e.DocumentTouch), passiveListener: function () { let t = !1; try { const s = Object.defineProperty({}, "passive", { get() { t = !0 } }); e.addEventListener("testPassiveListener", null, s) } catch (e) { } return t }(), gestures: "ongesturestart" in e } }()), b } function C(e) { return void 0 === e && (e = {}), x || (x = function (e) { let { userAgent: t } = void 0 === e ? {} : e; const s = E(), a = r(), i = a.navigator.platform, n = t || a.navigator.userAgent, l = { ios: !1, android: !1 }, o = a.screen.width, d = a.screen.height, c = n.match(/(Android);?[\s\/]+([\d.]+)?/); let p = n.match(/(iPad).*OS\s([\d_]+)/); const u = n.match(/(iPod)(.*OS\s([\d_]+))?/), h = !p && n.match(/(iPhone\sOS|iOS)\s([\d_]+)/), m = "Win32" === i; let f = "MacIntel" === i; return !p && f && s.touch && ["1024x1366", "1366x1024", "834x1194", "1194x834", "834x1112", "1112x834", "768x1024", "1024x768", "820x1180", "1180x820", "810x1080", "1080x810"].indexOf(`${o}x${d}`) >= 0 && (p = n.match(/(Version)\/([\d.]+)/), p || (p = [0, 1, "13_0_0"]), f = !1), c && !m && (l.os = "android", l.android = !0), (p || h || u) && (l.os = "ios", l.ios = !0), l }(e)), x } function T() { return y || (y = function () { const e = r(); return { isSafari: function () { const t = e.navigator.userAgent.toLowerCase(); return t.indexOf("safari") >= 0 && t.indexOf("chrome") < 0 && t.indexOf("android") < 0 }(), isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(e.navigator.userAgent) } }()), y } Object.keys(c).forEach((e => { Object.defineProperty(d.fn, e, { value: c[e], writable: !0 }) })); var $ = { on(e, t, s) { const a = this; if (!a.eventsListeners || a.destroyed) return a; if ("function" != typeof t) return a; const i = s ? "unshift" : "push"; return e.split(" ").forEach((e => { a.eventsListeners[e] || (a.eventsListeners[e] = []), a.eventsListeners[e][i](t) })), a }, once(e, t, s) { const a = this; if (!a.eventsListeners || a.destroyed) return a; if ("function" != typeof t) return a; function i() { a.off(e, i), i.__emitterProxy && delete i.__emitterProxy; for (var s = arguments.length, r = new Array(s), n = 0; n < s; n++)r[n] = arguments[n]; t.apply(a, r) } return i.__emitterProxy = t, a.on(e, i, s) }, onAny(e, t) { const s = this; if (!s.eventsListeners || s.destroyed) return s; if ("function" != typeof e) return s; const a = t ? "unshift" : "push"; return s.eventsAnyListeners.indexOf(e) < 0 && s.eventsAnyListeners[a](e), s }, offAny(e) { const t = this; if (!t.eventsListeners || t.destroyed) return t; if (!t.eventsAnyListeners) return t; const s = t.eventsAnyListeners.indexOf(e); return s >= 0 && t.eventsAnyListeners.splice(s, 1), t }, off(e, t) { const s = this; return !s.eventsListeners || s.destroyed ? s : s.eventsListeners ? (e.split(" ").forEach((e => { void 0 === t ? s.eventsListeners[e] = [] : s.eventsListeners[e] && s.eventsListeners[e].forEach(((a, i) => { (a === t || a.__emitterProxy && a.__emitterProxy === t) && s.eventsListeners[e].splice(i, 1) })) })), s) : s }, emit() { const e = this; if (!e.eventsListeners || e.destroyed) return e; if (!e.eventsListeners) return e; let t, s, a; for (var i = arguments.length, r = new Array(i), n = 0; n < i; n++)r[n] = arguments[n]; "string" == typeof r[0] || Array.isArray(r[0]) ? (t = r[0], s = r.slice(1, r.length), a = e) : (t = r[0].events, s = r[0].data, a = r[0].context || e), s.unshift(a); return (Array.isArray(t) ? t : t.split(" ")).forEach((t => { e.eventsAnyListeners && e.eventsAnyListeners.length && e.eventsAnyListeners.forEach((e => { e.apply(a, [t, ...s]) })), e.eventsListeners && e.eventsListeners[t] && e.eventsListeners[t].forEach((e => { e.apply(a, s) })) })), e } }; var S = { updateSize: function () { const e = this; let t, s; const a = e.$el; t = void 0 !== e.params.width && null !== e.params.width ? e.params.width : a[0].clientWidth, s = void 0 !== e.params.height && null !== e.params.height ? e.params.height : a[0].clientHeight, 0 === t && e.isHorizontal() || 0 === s && e.isVertical() || (t = t - parseInt(a.css("padding-left") || 0, 10) - parseInt(a.css("padding-right") || 0, 10), s = s - parseInt(a.css("padding-top") || 0, 10) - parseInt(a.css("padding-bottom") || 0, 10), Number.isNaN(t) && (t = 0), Number.isNaN(s) && (s = 0), Object.assign(e, { width: t, height: s, size: e.isHorizontal() ? t : s })) }, updateSlides: function () { const e = this; function t(t) { return e.isHorizontal() ? t : { width: "height", "margin-top": "margin-left", "margin-bottom ": "margin-right", "margin-left": "margin-top", "margin-right": "margin-bottom", "padding-left": "padding-top", "padding-right": "padding-bottom", marginRight: "marginBottom" }[t] } function s(e, s) { return parseFloat(e.getPropertyValue(t(s)) || 0) } const a = e.params, { $wrapperEl: i, size: r, rtlTranslate: n, wrongRTL: l } = e, o = e.virtual && a.virtual.enabled, d = o ? e.virtual.slides.length : e.slides.length, c = i.children(`.${e.params.slideClass}`), p = o ? e.virtual.slides.length : c.length; let u = []; const h = [], m = []; let f = a.slidesOffsetBefore; "function" == typeof f && (f = a.slidesOffsetBefore.call(e)); let g = a.slidesOffsetAfter; "function" == typeof g && (g = a.slidesOffsetAfter.call(e)); const w = e.snapGrid.length, b = e.slidesGrid.length; let x = a.spaceBetween, y = -f, E = 0, C = 0; if (void 0 === r) return; "string" == typeof x && x.indexOf("%") >= 0 && (x = parseFloat(x.replace("%", "")) / 100 * r), e.virtualSize = -x, n ? c.css({ marginLeft: "", marginBottom: "", marginTop: "" }) : c.css({ marginRight: "", marginBottom: "", marginTop: "" }), a.centeredSlides && a.cssMode && (v(e.wrapperEl, "--swiper-centered-offset-before", ""), v(e.wrapperEl, "--swiper-centered-offset-after", "")); const T = a.grid && a.grid.rows > 1 && e.grid; let $; T && e.grid.initSlides(p); const S = "auto" === a.slidesPerView && a.breakpoints && Object.keys(a.breakpoints).filter((e => void 0 !== a.breakpoints[e].slidesPerView)).length > 0; for (let i = 0; i < p; i += 1) { $ = 0; const n = c.eq(i); if (T && e.grid.updateSlide(i, n, p, t), "none" !== n.css("display")) { if ("auto" === a.slidesPerView) { S && (c[i].style[t("width")] = ""); const r = getComputedStyle(n[0]), l = n[0].style.transform, o = n[0].style.webkitTransform; if (l && (n[0].style.transform = "none"), o && (n[0].style.webkitTransform = "none"), a.roundLengths) $ = e.isHorizontal() ? n.outerWidth(!0) : n.outerHeight(!0); else { const e = s(r, "width"), t = s(r, "padding-left"), a = s(r, "padding-right"), i = s(r, "margin-left"), l = s(r, "margin-right"), o = r.getPropertyValue("box-sizing"); if (o && "border-box" === o) $ = e + i + l; else { const { clientWidth: s, offsetWidth: r } = n[0]; $ = e + t + a + i + l + (r - s) } } l && (n[0].style.transform = l), o && (n[0].style.webkitTransform = o), a.roundLengths && ($ = Math.floor($)) } else $ = (r - (a.slidesPerView - 1) * x) / a.slidesPerView, a.roundLengths && ($ = Math.floor($)), c[i] && (c[i].style[t("width")] = `${$}px`); c[i] && (c[i].swiperSlideSize = $), m.push($), a.centeredSlides ? (y = y + $ / 2 + E / 2 + x, 0 === E && 0 !== i && (y = y - r / 2 - x), 0 === i && (y = y - r / 2 - x), Math.abs(y) < .001 && (y = 0), a.roundLengths && (y = Math.floor(y)), C % a.slidesPerGroup == 0 && u.push(y), h.push(y)) : (a.roundLengths && (y = Math.floor(y)), (C - Math.min(e.params.slidesPerGroupSkip, C)) % e.params.slidesPerGroup == 0 && u.push(y), h.push(y), y = y + $ + x), e.virtualSize += $ + x, E = $, C += 1 } } if (e.virtualSize = Math.max(e.virtualSize, r) + g, n && l && ("slide" === a.effect || "coverflow" === a.effect) && i.css({ width: `${e.virtualSize + a.spaceBetween}px` }), a.setWrapperSize && i.css({ [t("width")]: `${e.virtualSize + a.spaceBetween}px` }), T && e.grid.updateWrapperSize($, u, t), !a.centeredSlides) { const t = []; for (let s = 0; s < u.length; s += 1) { let i = u[s]; a.roundLengths && (i = Math.floor(i)), u[s] <= e.virtualSize - r && t.push(i) } u = t, Math.floor(e.virtualSize - r) - Math.floor(u[u.length - 1]) > 1 && u.push(e.virtualSize - r) } if (0 === u.length && (u = [0]), 0 !== a.spaceBetween) { const s = e.isHorizontal() && n ? "marginLeft" : t("marginRight"); c.filter(((e, t) => !a.cssMode || t !== c.length - 1)).css({ [s]: `${x}px` }) } if (a.centeredSlides && a.centeredSlidesBounds) { let e = 0; m.forEach((t => { e += t + (a.spaceBetween ? a.spaceBetween : 0) })), e -= a.spaceBetween; const t = e - r; u = u.map((e => e < 0 ? -f : e > t ? t + g : e)) } if (a.centerInsufficientSlides) { let e = 0; if (m.forEach((t => { e += t + (a.spaceBetween ? a.spaceBetween : 0) })), e -= a.spaceBetween, e < r) { const t = (r - e) / 2; u.forEach(((e, s) => { u[s] = e - t })), h.forEach(((e, s) => { h[s] = e + t })) } } if (Object.assign(e, { slides: c, snapGrid: u, slidesGrid: h, slidesSizesGrid: m }), a.centeredSlides && a.cssMode && !a.centeredSlidesBounds) { v(e.wrapperEl, "--swiper-centered-offset-before", -u[0] + "px"), v(e.wrapperEl, "--swiper-centered-offset-after", e.size / 2 - m[m.length - 1] / 2 + "px"); const t = -e.snapGrid[0], s = -e.slidesGrid[0]; e.snapGrid = e.snapGrid.map((e => e + t)), e.slidesGrid = e.slidesGrid.map((e => e + s)) } if (p !== d && e.emit("slidesLengthChange"), u.length !== w && (e.params.watchOverflow && e.checkOverflow(), e.emit("snapGridLengthChange")), h.length !== b && e.emit("slidesGridLengthChange"), a.watchSlidesProgress && e.updateSlidesOffset(), !(o || a.cssMode || "slide" !== a.effect && "fade" !== a.effect)) { const t = `${a.containerModifierClass}backface-hidden`, s = e.$el.hasClass(t); p <= a.maxBackfaceHiddenSlides ? s || e.$el.addClass(t) : s && e.$el.removeClass(t) } }, updateAutoHeight: function (e) { const t = this, s = [], a = t.virtual && t.params.virtual.enabled; let i, r = 0; "number" == typeof e ? t.setTransition(e) : !0 === e && t.setTransition(t.params.speed); const n = e => a ? t.slides.filter((t => parseInt(t.getAttribute("data-swiper-slide-index"), 10) === e))[0] : t.slides.eq(e)[0]; if ("auto" !== t.params.slidesPerView && t.params.slidesPerView > 1) if (t.params.centeredSlides) (t.visibleSlides || d([])).each((e => { s.push(e) })); else for (i = 0; i < Math.ceil(t.params.slidesPerView); i += 1) { const e = t.activeIndex + i; if (e > t.slides.length && !a) break; s.push(n(e)) } else s.push(n(t.activeIndex)); for (i = 0; i < s.length; i += 1)if (void 0 !== s[i]) { const e = s[i].offsetHeight; r = e > r ? e : r } (r || 0 === r) && t.$wrapperEl.css("height", `${r}px`) }, updateSlidesOffset: function () { const e = this, t = e.slides; for (let s = 0; s < t.length; s += 1)t[s].swiperSlideOffset = e.isHorizontal() ? t[s].offsetLeft : t[s].offsetTop }, updateSlidesProgress: function (e) { void 0 === e && (e = this && this.translate || 0); const t = this, s = t.params, { slides: a, rtlTranslate: i, snapGrid: r } = t; if (0 === a.length) return; void 0 === a[0].swiperSlideOffset && t.updateSlidesOffset(); let n = -e; i && (n = e), a.removeClass(s.slideVisibleClass), t.visibleSlidesIndexes = [], t.visibleSlides = []; for (let e = 0; e < a.length; e += 1) { const l = a[e]; let o = l.swiperSlideOffset; s.cssMode && s.centeredSlides && (o -= a[0].swiperSlideOffset); const d = (n + (s.centeredSlides ? t.minTranslate() : 0) - o) / (l.swiperSlideSize + s.spaceBetween), c = (n - r[0] + (s.centeredSlides ? t.minTranslate() : 0) - o) / (l.swiperSlideSize + s.spaceBetween), p = -(n - o), u = p + t.slidesSizesGrid[e]; (p >= 0 && p < t.size - 1 || u > 1 && u <= t.size || p <= 0 && u >= t.size) && (t.visibleSlides.push(l), t.visibleSlidesIndexes.push(e), a.eq(e).addClass(s.slideVisibleClass)), l.progress = i ? -d : d, l.originalProgress = i ? -c : c } t.visibleSlides = d(t.visibleSlides) }, updateProgress: function (e) { const t = this; if (void 0 === e) { const s = t.rtlTranslate ? -1 : 1; e = t && t.translate && t.translate * s || 0 } const s = t.params, a = t.maxTranslate() - t.minTranslate(); let { progress: i, isBeginning: r, isEnd: n } = t; const l = r, o = n; 0 === a ? (i = 0, r = !0, n = !0) : (i = (e - t.minTranslate()) / a, r = i <= 0, n = i >= 1), Object.assign(t, { progress: i, isBeginning: r, isEnd: n }), (s.watchSlidesProgress || s.centeredSlides && s.autoHeight) && t.updateSlidesProgress(e), r && !l && t.emit("reachBeginning toEdge"), n && !o && t.emit("reachEnd toEdge"), (l && !r || o && !n) && t.emit("fromEdge"), t.emit("progress", i) }, updateSlidesClasses: function () { const e = this, { slides: t, params: s, $wrapperEl: a, activeIndex: i, realIndex: r } = e, n = e.virtual && s.virtual.enabled; let l; t.removeClass(`${s.slideActiveClass} ${s.slideNextClass} ${s.slidePrevClass} ${s.slideDuplicateActiveClass} ${s.slideDuplicateNextClass} ${s.slideDuplicatePrevClass}`), l = n ? e.$wrapperEl.find(`.${s.slideClass}[data-swiper-slide-index="${i}"]`) : t.eq(i), l.addClass(s.slideActiveClass), s.loop && (l.hasClass(s.slideDuplicateClass) ? a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${r}"]`).addClass(s.slideDuplicateActiveClass) : a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${r}"]`).addClass(s.slideDuplicateActiveClass)); let o = l.nextAll(`.${s.slideClass}`).eq(0).addClass(s.slideNextClass); s.loop && 0 === o.length && (o = t.eq(0), o.addClass(s.slideNextClass)); let d = l.prevAll(`.${s.slideClass}`).eq(0).addClass(s.slidePrevClass); s.loop && 0 === d.length && (d = t.eq(-1), d.addClass(s.slidePrevClass)), s.loop && (o.hasClass(s.slideDuplicateClass) ? a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${o.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicateNextClass) : a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${o.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicateNextClass), d.hasClass(s.slideDuplicateClass) ? a.children(`.${s.slideClass}:not(.${s.slideDuplicateClass})[data-swiper-slide-index="${d.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicatePrevClass) : a.children(`.${s.slideClass}.${s.slideDuplicateClass}[data-swiper-slide-index="${d.attr("data-swiper-slide-index")}"]`).addClass(s.slideDuplicatePrevClass)), e.emitSlidesClasses() }, updateActiveIndex: function (e) { const t = this, s = t.rtlTranslate ? t.translate : -t.translate, { slidesGrid: a, snapGrid: i, params: r, activeIndex: n, realIndex: l, snapIndex: o } = t; let d, c = e; if (void 0 === c) { for (let e = 0; e < a.length; e += 1)void 0 !== a[e + 1] ? s >= a[e] && s < a[e + 1] - (a[e + 1] - a[e]) / 2 ? c = e : s >= a[e] && s < a[e + 1] && (c = e + 1) : s >= a[e] && (c = e); r.normalizeSlideIndex && (c < 0 || void 0 === c) && (c = 0) } if (i.indexOf(s) >= 0) d = i.indexOf(s); else { const e = Math.min(r.slidesPerGroupSkip, c); d = e + Math.floor((c - e) / r.slidesPerGroup) } if (d >= i.length && (d = i.length - 1), c === n) return void (d !== o && (t.snapIndex = d, t.emit("snapIndexChange"))); const p = parseInt(t.slides.eq(c).attr("data-swiper-slide-index") || c, 10); Object.assign(t, { snapIndex: d, realIndex: p, previousIndex: n, activeIndex: c }), t.emit("activeIndexChange"), t.emit("snapIndexChange"), l !== p && t.emit("realIndexChange"), (t.initialized || t.params.runCallbacksOnInit) && t.emit("slideChange") }, updateClickedSlide: function (e) { const t = this, s = t.params, a = d(e).closest(`.${s.slideClass}`)[0]; let i, r = !1; if (a) for (let e = 0; e < t.slides.length; e += 1)if (t.slides[e] === a) { r = !0, i = e; break } if (!a || !r) return t.clickedSlide = void 0, void (t.clickedIndex = void 0); t.clickedSlide = a, t.virtual && t.params.virtual.enabled ? t.clickedIndex = parseInt(d(a).attr("data-swiper-slide-index"), 10) : t.clickedIndex = i, s.slideToClickedSlide && void 0 !== t.clickedIndex && t.clickedIndex !== t.activeIndex && t.slideToClickedSlide() } }; var M = { getTranslate: function (e) { void 0 === e && (e = this.isHorizontal() ? "x" : "y"); const { params: t, rtlTranslate: s, translate: a, $wrapperEl: i } = this; if (t.virtualTranslate) return s ? -a : a; if (t.cssMode) return a; let r = h(i[0], e); return s && (r = -r), r || 0 }, setTranslate: function (e, t) { const s = this, { rtlTranslate: a, params: i, $wrapperEl: r, wrapperEl: n, progress: l } = s; let o, d = 0, c = 0; s.isHorizontal() ? d = a ? -e : e : c = e, i.roundLengths && (d = Math.floor(d), c = Math.floor(c)), i.cssMode ? n[s.isHorizontal() ? "scrollLeft" : "scrollTop"] = s.isHorizontal() ? -d : -c : i.virtualTranslate || r.transform(`translate3d(${d}px, ${c}px, 0px)`), s.previousTranslate = s.translate, s.translate = s.isHorizontal() ? d : c; const p = s.maxTranslate() - s.minTranslate(); o = 0 === p ? 0 : (e - s.minTranslate()) / p, o !== l && s.updateProgress(e), s.emit("setTranslate", s.translate, t) }, minTranslate: function () { return -this.snapGrid[0] }, maxTranslate: function () { return -this.snapGrid[this.snapGrid.length - 1] }, translateTo: function (e, t, s, a, i) { void 0 === e && (e = 0), void 0 === t && (t = this.params.speed), void 0 === s && (s = !0), void 0 === a && (a = !0); const r = this, { params: n, wrapperEl: l } = r; if (r.animating && n.preventInteractionOnTransition) return !1; const o = r.minTranslate(), d = r.maxTranslate(); let c; if (c = a && e > o ? o : a && e < d ? d : e, r.updateProgress(c), n.cssMode) { const e = r.isHorizontal(); if (0 === t) l[e ? "scrollLeft" : "scrollTop"] = -c; else { if (!r.support.smoothScroll) return w({ swiper: r, targetPosition: -c, side: e ? "left" : "top" }), !0; l.scrollTo({ [e ? "left" : "top"]: -c, behavior: "smooth" }) } return !0 } return 0 === t ? (r.setTransition(0), r.setTranslate(c), s && (r.emit("beforeTransitionStart", t, i), r.emit("transitionEnd"))) : (r.setTransition(t), r.setTranslate(c), s && (r.emit("beforeTransitionStart", t, i), r.emit("transitionStart")), r.animating || (r.animating = !0, r.onTranslateToWrapperTransitionEnd || (r.onTranslateToWrapperTransitionEnd = function (e) { r && !r.destroyed && e.target === this && (r.$wrapperEl[0].removeEventListener("transitionend", r.onTranslateToWrapperTransitionEnd), r.$wrapperEl[0].removeEventListener("webkitTransitionEnd", r.onTranslateToWrapperTransitionEnd), r.onTranslateToWrapperTransitionEnd = null, delete r.onTranslateToWrapperTransitionEnd, s && r.emit("transitionEnd")) }), r.$wrapperEl[0].addEventListener("transitionend", r.onTranslateToWrapperTransitionEnd), r.$wrapperEl[0].addEventListener("webkitTransitionEnd", r.onTranslateToWrapperTransitionEnd))), !0 } }; function P(e) { let { swiper: t, runCallbacks: s, direction: a, step: i } = e; const { activeIndex: r, previousIndex: n } = t; let l = a; if (l || (l = r > n ? "next" : r < n ? "prev" : "reset"), t.emit(`transition${i}`), s && r !== n) { if ("reset" === l) return void t.emit(`slideResetTransition${i}`); t.emit(`slideChangeTransition${i}`), "next" === l ? t.emit(`slideNextTransition${i}`) : t.emit(`slidePrevTransition${i}`) } } var k = { slideTo: function (e, t, s, a, i) { if (void 0 === e && (e = 0), void 0 === t && (t = this.params.speed), void 0 === s && (s = !0), "number" != typeof e && "string" != typeof e) throw new Error(`The 'index' argument cannot have type other than 'number' or 'string'. [${typeof e}] given.`); if ("string" == typeof e) { const t = parseInt(e, 10); if (!isFinite(t)) throw new Error(`The passed-in 'index' (string) couldn't be converted to 'number'. [${e}] given.`); e = t } const r = this; let n = e; n < 0 && (n = 0); const { params: l, snapGrid: o, slidesGrid: d, previousIndex: c, activeIndex: p, rtlTranslate: u, wrapperEl: h, enabled: m } = r; if (r.animating && l.preventInteractionOnTransition || !m && !a && !i) return !1; const f = Math.min(r.params.slidesPerGroupSkip, n); let g = f + Math.floor((n - f) / r.params.slidesPerGroup); g >= o.length && (g = o.length - 1); const v = -o[g]; if (l.normalizeSlideIndex) for (let e = 0; e < d.length; e += 1) { const t = -Math.floor(100 * v), s = Math.floor(100 * d[e]), a = Math.floor(100 * d[e + 1]); void 0 !== d[e + 1] ? t >= s && t < a - (a - s) / 2 ? n = e : t >= s && t < a && (n = e + 1) : t >= s && (n = e) } if (r.initialized && n !== p) { if (!r.allowSlideNext && v < r.translate && v < r.minTranslate()) return !1; if (!r.allowSlidePrev && v > r.translate && v > r.maxTranslate() && (p || 0) !== n) return !1 } let b; if (n !== (c || 0) && s && r.emit("beforeSlideChangeStart"), r.updateProgress(v), b = n > p ? "next" : n < p ? "prev" : "reset", u && -v === r.translate || !u && v === r.translate) return r.updateActiveIndex(n), l.autoHeight && r.updateAutoHeight(), r.updateSlidesClasses(), "slide" !== l.effect && r.setTranslate(v), "reset" !== b && (r.transitionStart(s, b), r.transitionEnd(s, b)), !1; if (l.cssMode) { const e = r.isHorizontal(), s = u ? v : -v; if (0 === t) { const t = r.virtual && r.params.virtual.enabled; t && (r.wrapperEl.style.scrollSnapType = "none", r._immediateVirtual = !0), h[e ? "scrollLeft" : "scrollTop"] = s, t && requestAnimationFrame((() => { r.wrapperEl.style.scrollSnapType = "", r._swiperImmediateVirtual = !1 })) } else { if (!r.support.smoothScroll) return w({ swiper: r, targetPosition: s, side: e ? "left" : "top" }), !0; h.scrollTo({ [e ? "left" : "top"]: s, behavior: "smooth" }) } return !0 } return r.setTransition(t), r.setTranslate(v), r.updateActiveIndex(n), r.updateSlidesClasses(), r.emit("beforeTransitionStart", t, a), r.transitionStart(s, b), 0 === t ? r.transitionEnd(s, b) : r.animating || (r.animating = !0, r.onSlideToWrapperTransitionEnd || (r.onSlideToWrapperTransitionEnd = function (e) { r && !r.destroyed && e.target === this && (r.$wrapperEl[0].removeEventListener("transitionend", r.onSlideToWrapperTransitionEnd), r.$wrapperEl[0].removeEventListener("webkitTransitionEnd", r.onSlideToWrapperTransitionEnd), r.onSlideToWrapperTransitionEnd = null, delete r.onSlideToWrapperTransitionEnd, r.transitionEnd(s, b)) }), r.$wrapperEl[0].addEventListener("transitionend", r.onSlideToWrapperTransitionEnd), r.$wrapperEl[0].addEventListener("webkitTransitionEnd", r.onSlideToWrapperTransitionEnd)), !0 }, slideToLoop: function (e, t, s, a) { if (void 0 === e && (e = 0), void 0 === t && (t = this.params.speed), void 0 === s && (s = !0), "string" == typeof e) { const t = parseInt(e, 10); if (!isFinite(t)) throw new Error(`The passed-in 'index' (string) couldn't be converted to 'number'. [${e}] given.`); e = t } const i = this; let r = e; return i.params.loop && (r += i.loopedSlides), i.slideTo(r, t, s, a) }, slideNext: function (e, t, s) { void 0 === e && (e = this.params.speed), void 0 === t && (t = !0); const a = this, { animating: i, enabled: r, params: n } = a; if (!r) return a; let l = n.slidesPerGroup; "auto" === n.slidesPerView && 1 === n.slidesPerGroup && n.slidesPerGroupAuto && (l = Math.max(a.slidesPerViewDynamic("current", !0), 1)); const o = a.activeIndex < n.slidesPerGroupSkip ? 1 : l; if (n.loop) { if (i && n.loopPreventsSlide) return !1; a.loopFix(), a._clientLeft = a.$wrapperEl[0].clientLeft } return n.rewind && a.isEnd ? a.slideTo(0, e, t, s) : a.slideTo(a.activeIndex + o, e, t, s) }, slidePrev: function (e, t, s) { void 0 === e && (e = this.params.speed), void 0 === t && (t = !0); const a = this, { params: i, animating: r, snapGrid: n, slidesGrid: l, rtlTranslate: o, enabled: d } = a; if (!d) return a; if (i.loop) { if (r && i.loopPreventsSlide) return !1; a.loopFix(), a._clientLeft = a.$wrapperEl[0].clientLeft } function c(e) { return e < 0 ? -Math.floor(Math.abs(e)) : Math.floor(e) } const p = c(o ? a.translate : -a.translate), u = n.map((e => c(e))); let h = n[u.indexOf(p) - 1]; if (void 0 === h && i.cssMode) { let e; n.forEach(((t, s) => { p >= t && (e = s) })), void 0 !== e && (h = n[e > 0 ? e - 1 : e]) } let m = 0; if (void 0 !== h && (m = l.indexOf(h), m < 0 && (m = a.activeIndex - 1), "auto" === i.slidesPerView && 1 === i.slidesPerGroup && i.slidesPerGroupAuto && (m = m - a.slidesPerViewDynamic("previous", !0) + 1, m = Math.max(m, 0))), i.rewind && a.isBeginning) { const i = a.params.virtual && a.params.virtual.enabled && a.virtual ? a.virtual.slides.length - 1 : a.slides.length - 1; return a.slideTo(i, e, t, s) } return a.slideTo(m, e, t, s) }, slideReset: function (e, t, s) { return void 0 === e && (e = this.params.speed), void 0 === t && (t = !0), this.slideTo(this.activeIndex, e, t, s) }, slideToClosest: function (e, t, s, a) { void 0 === e && (e = this.params.speed), void 0 === t && (t = !0), void 0 === a && (a = .5); const i = this; let r = i.activeIndex; const n = Math.min(i.params.slidesPerGroupSkip, r), l = n + Math.floor((r - n) / i.params.slidesPerGroup), o = i.rtlTranslate ? i.translate : -i.translate; if (o >= i.snapGrid[l]) { const e = i.snapGrid[l]; o - e > (i.snapGrid[l + 1] - e) * a && (r += i.params.slidesPerGroup) } else { const e = i.snapGrid[l - 1]; o - e <= (i.snapGrid[l] - e) * a && (r -= i.params.slidesPerGroup) } return r = Math.max(r, 0), r = Math.min(r, i.slidesGrid.length - 1), i.slideTo(r, e, t, s) }, slideToClickedSlide: function () { const e = this, { params: t, $wrapperEl: s } = e, a = "auto" === t.slidesPerView ? e.slidesPerViewDynamic() : t.slidesPerView; let i, r = e.clickedIndex; if (t.loop) { if (e.animating) return; i = parseInt(d(e.clickedSlide).attr("data-swiper-slide-index"), 10), t.centeredSlides ? r < e.loopedSlides - a / 2 || r > e.slides.length - e.loopedSlides + a / 2 ? (e.loopFix(), r = s.children(`.${t.slideClass}[data-swiper-slide-index="${i}"]:not(.${t.slideDuplicateClass})`).eq(0).index(), p((() => { e.slideTo(r) }))) : e.slideTo(r) : r > e.slides.length - a ? (e.loopFix(), r = s.children(`.${t.slideClass}[data-swiper-slide-index="${i}"]:not(.${t.slideDuplicateClass})`).eq(0).index(), p((() => { e.slideTo(r) }))) : e.slideTo(r) } else e.slideTo(r) } }; var z = { loopCreate: function () { const e = this, t = a(), { params: s, $wrapperEl: i } = e, r = i.children().length > 0 ? d(i.children()[0].parentNode) : i; r.children(`.${s.slideClass}.${s.slideDuplicateClass}`).remove(); let n = r.children(`.${s.slideClass}`); if (s.loopFillGroupWithBlank) { const e = s.slidesPerGroup - n.length % s.slidesPerGroup; if (e !== s.slidesPerGroup) { for (let a = 0; a < e; a += 1) { const e = d(t.createElement("div")).addClass(`${s.slideClass} ${s.slideBlankClass}`); r.append(e) } n = r.children(`.${s.slideClass}`) } } "auto" !== s.slidesPerView || s.loopedSlides || (s.loopedSlides = n.length), e.loopedSlides = Math.ceil(parseFloat(s.loopedSlides || s.slidesPerView, 10)), e.loopedSlides += s.loopAdditionalSlides, e.loopedSlides > n.length && e.params.loopedSlidesLimit && (e.loopedSlides = n.length); const l = [], o = []; n.each(((e, t) => { d(e).attr("data-swiper-slide-index", t) })); for (let t = 0; t < e.loopedSlides; t += 1) { const e = t - Math.floor(t / n.length) * n.length; o.push(n.eq(e)[0]), l.unshift(n.eq(n.length - e - 1)[0]) } for (let e = 0; e < o.length; e += 1)r.append(d(o[e].cloneNode(!0)).addClass(s.slideDuplicateClass)); for (let e = l.length - 1; e >= 0; e -= 1)r.prepend(d(l[e].cloneNode(!0)).addClass(s.slideDuplicateClass)) }, loopFix: function () { const e = this; e.emit("beforeLoopFix"); const { activeIndex: t, slides: s, loopedSlides: a, allowSlidePrev: i, allowSlideNext: r, snapGrid: n, rtlTranslate: l } = e; let o; e.allowSlidePrev = !0, e.allowSlideNext = !0; const d = -n[t] - e.getTranslate(); if (t < a) { o = s.length - 3 * a + t, o += a; e.slideTo(o, 0, !1, !0) && 0 !== d && e.setTranslate((l ? -e.translate : e.translate) - d) } else if (t >= s.length - a) { o = -s.length + t + a, o += a; e.slideTo(o, 0, !1, !0) && 0 !== d && e.setTranslate((l ? -e.translate : e.translate) - d) } e.allowSlidePrev = i, e.allowSlideNext = r, e.emit("loopFix") }, loopDestroy: function () { const { $wrapperEl: e, params: t, slides: s } = this; e.children(`.${t.slideClass}.${t.slideDuplicateClass},.${t.slideClass}.${t.slideBlankClass}`).remove(), s.removeAttr("data-swiper-slide-index") } }; function L(e) { const t = this, s = a(), i = r(), n = t.touchEventsData, { params: l, touches: o, enabled: c } = t; if (!c) return; if (t.animating && l.preventInteractionOnTransition) return; !t.animating && l.cssMode && l.loop && t.loopFix(); let p = e; p.originalEvent && (p = p.originalEvent); let h = d(p.target); if ("wrapper" === l.touchEventsTarget && !h.closest(t.wrapperEl).length) return; if (n.isTouchEvent = "touchstart" === p.type, !n.isTouchEvent && "which" in p && 3 === p.which) return; if (!n.isTouchEvent && "button" in p && p.button > 0) return; if (n.isTouched && n.isMoved) return; const m = !!l.noSwipingClass && "" !== l.noSwipingClass, f = e.composedPath ? e.composedPath() : e.path; m && p.target && p.target.shadowRoot && f && (h = d(f[0])); const g = l.noSwipingSelector ? l.noSwipingSelector : `.${l.noSwipingClass}`, v = !(!p.target || !p.target.shadowRoot); if (l.noSwiping && (v ? function (e, t) { return void 0 === t && (t = this), function t(s) { if (!s || s === a() || s === r()) return null; s.assignedSlot && (s = s.assignedSlot); const i = s.closest(e); return i || s.getRootNode ? i || t(s.getRootNode().host) : null }(t) }(g, h[0]) : h.closest(g)[0])) return void (t.allowClick = !0); if (l.swipeHandler && !h.closest(l.swipeHandler)[0]) return; o.currentX = "touchstart" === p.type ? p.targetTouches[0].pageX : p.pageX, o.currentY = "touchstart" === p.type ? p.targetTouches[0].pageY : p.pageY; const w = o.currentX, b = o.currentY, x = l.edgeSwipeDetection || l.iOSEdgeSwipeDetection, y = l.edgeSwipeThreshold || l.iOSEdgeSwipeThreshold; if (x && (w <= y || w >= i.innerWidth - y)) { if ("prevent" !== x) return; e.preventDefault() } if (Object.assign(n, { isTouched: !0, isMoved: !1, allowTouchCallbacks: !0, isScrolling: void 0, startMoving: void 0 }), o.startX = w, o.startY = b, n.touchStartTime = u(), t.allowClick = !0, t.updateSize(), t.swipeDirection = void 0, l.threshold > 0 && (n.allowThresholdMove = !1), "touchstart" !== p.type) { let e = !0; h.is(n.focusableElements) && (e = !1, "SELECT" === h[0].nodeName && (n.isTouched = !1)), s.activeElement && d(s.activeElement).is(n.focusableElements) && s.activeElement !== h[0] && s.activeElement.blur(); const a = e && t.allowTouchMove && l.touchStartPreventDefault; !l.touchStartForcePreventDefault && !a || h[0].isContentEditable || p.preventDefault() } t.params.freeMode && t.params.freeMode.enabled && t.freeMode && t.animating && !l.cssMode && t.freeMode.onTouchStart(), t.emit("touchStart", p) } function O(e) { const t = a(), s = this, i = s.touchEventsData, { params: r, touches: n, rtlTranslate: l, enabled: o } = s; if (!o) return; let c = e; if (c.originalEvent && (c = c.originalEvent), !i.isTouched) return void (i.startMoving && i.isScrolling && s.emit("touchMoveOpposite", c)); if (i.isTouchEvent && "touchmove" !== c.type) return; const p = "touchmove" === c.type && c.targetTouches && (c.targetTouches[0] || c.changedTouches[0]), h = "touchmove" === c.type ? p.pageX : c.pageX, m = "touchmove" === c.type ? p.pageY : c.pageY; if (c.preventedByNestedSwiper) return n.startX = h, void (n.startY = m); if (!s.allowTouchMove) return d(c.target).is(i.focusableElements) || (s.allowClick = !1), void (i.isTouched && (Object.assign(n, { startX: h, startY: m, currentX: h, currentY: m }), i.touchStartTime = u())); if (i.isTouchEvent && r.touchReleaseOnEdges && !r.loop) if (s.isVertical()) { if (m < n.startY && s.translate <= s.maxTranslate() || m > n.startY && s.translate >= s.minTranslate()) return i.isTouched = !1, void (i.isMoved = !1) } else if (h < n.startX && s.translate <= s.maxTranslate() || h > n.startX && s.translate >= s.minTranslate()) return; if (i.isTouchEvent && t.activeElement && c.target === t.activeElement && d(c.target).is(i.focusableElements)) return i.isMoved = !0, void (s.allowClick = !1); if (i.allowTouchCallbacks && s.emit("touchMove", c), c.targetTouches && c.targetTouches.length > 1) return; n.currentX = h, n.currentY = m; const f = n.currentX - n.startX, g = n.currentY - n.startY; if (s.params.threshold && Math.sqrt(f ** 2 + g ** 2) < s.params.threshold) return; if (void 0 === i.isScrolling) { let e; s.isHorizontal() && n.currentY === n.startY || s.isVertical() && n.currentX === n.startX ? i.isScrolling = !1 : f * f + g * g >= 25 && (e = 180 * Math.atan2(Math.abs(g), Math.abs(f)) / Math.PI, i.isScrolling = s.isHorizontal() ? e > r.touchAngle : 90 - e > r.touchAngle) } if (i.isScrolling && s.emit("touchMoveOpposite", c), void 0 === i.startMoving && (n.currentX === n.startX && n.currentY === n.startY || (i.startMoving = !0)), i.isScrolling) return void (i.isTouched = !1); if (!i.startMoving) return; s.allowClick = !1, !r.cssMode && c.cancelable && c.preventDefault(), r.touchMoveStopPropagation && !r.nested && c.stopPropagation(), i.isMoved || (r.loop && !r.cssMode && s.loopFix(), i.startTranslate = s.getTranslate(), s.setTransition(0), s.animating && s.$wrapperEl.trigger("webkitTransitionEnd transitionend"), i.allowMomentumBounce = !1, !r.grabCursor || !0 !== s.allowSlideNext && !0 !== s.allowSlidePrev || s.setGrabCursor(!0), s.emit("sliderFirstMove", c)), s.emit("sliderMove", c), i.isMoved = !0; let v = s.isHorizontal() ? f : g; n.diff = v, v *= r.touchRatio, l && (v = -v), s.swipeDirection = v > 0 ? "prev" : "next", i.currentTranslate = v + i.startTranslate; let w = !0, b = r.resistanceRatio; if (r.touchReleaseOnEdges && (b = 0), v > 0 && i.currentTranslate > s.minTranslate() ? (w = !1, r.resistance && (i.currentTranslate = s.minTranslate() - 1 + (-s.minTranslate() + i.startTranslate + v) ** b)) : v < 0 && i.currentTranslate < s.maxTranslate() && (w = !1, r.resistance && (i.currentTranslate = s.maxTranslate() + 1 - (s.maxTranslate() - i.startTranslate - v) ** b)), w && (c.preventedByNestedSwiper = !0), !s.allowSlideNext && "next" === s.swipeDirection && i.currentTranslate < i.startTranslate && (i.currentTranslate = i.startTranslate), !s.allowSlidePrev && "prev" === s.swipeDirection && i.currentTranslate > i.startTranslate && (i.currentTranslate = i.startTranslate), s.allowSlidePrev || s.allowSlideNext || (i.currentTranslate = i.startTranslate), r.threshold > 0) { if (!(Math.abs(v) > r.threshold || i.allowThresholdMove)) return void (i.currentTranslate = i.startTranslate); if (!i.allowThresholdMove) return i.allowThresholdMove = !0, n.startX = n.currentX, n.startY = n.currentY, i.currentTranslate = i.startTranslate, void (n.diff = s.isHorizontal() ? n.currentX - n.startX : n.currentY - n.startY) } r.followFinger && !r.cssMode && ((r.freeMode && r.freeMode.enabled && s.freeMode || r.watchSlidesProgress) && (s.updateActiveIndex(), s.updateSlidesClasses()), s.params.freeMode && r.freeMode.enabled && s.freeMode && s.freeMode.onTouchMove(), s.updateProgress(i.currentTranslate), s.setTranslate(i.currentTranslate)) } function I(e) { const t = this, s = t.touchEventsData, { params: a, touches: i, rtlTranslate: r, slidesGrid: n, enabled: l } = t; if (!l) return; let o = e; if (o.originalEvent && (o = o.originalEvent), s.allowTouchCallbacks && t.emit("touchEnd", o), s.allowTouchCallbacks = !1, !s.isTouched) return s.isMoved && a.grabCursor && t.setGrabCursor(!1), s.isMoved = !1, void (s.startMoving = !1); a.grabCursor && s.isMoved && s.isTouched && (!0 === t.allowSlideNext || !0 === t.allowSlidePrev) && t.setGrabCursor(!1); const d = u(), c = d - s.touchStartTime; if (t.allowClick) { const e = o.path || o.composedPath && o.composedPath(); t.updateClickedSlide(e && e[0] || o.target), t.emit("tap click", o), c < 300 && d - s.lastClickTime < 300 && t.emit("doubleTap doubleClick", o) } if (s.lastClickTime = u(), p((() => { t.destroyed || (t.allowClick = !0) })), !s.isTouched || !s.isMoved || !t.swipeDirection || 0 === i.diff || s.currentTranslate === s.startTranslate) return s.isTouched = !1, s.isMoved = !1, void (s.startMoving = !1); let h; if (s.isTouched = !1, s.isMoved = !1, s.startMoving = !1, h = a.followFinger ? r ? t.translate : -t.translate : -s.currentTranslate, a.cssMode) return; if (t.params.freeMode && a.freeMode.enabled) return void t.freeMode.onTouchEnd({ currentPos: h }); let m = 0, f = t.slidesSizesGrid[0]; for (let e = 0; e < n.length; e += e < a.slidesPerGroupSkip ? 1 : a.slidesPerGroup) { const t = e < a.slidesPerGroupSkip - 1 ? 1 : a.slidesPerGroup; void 0 !== n[e + t] ? h >= n[e] && h < n[e + t] && (m = e, f = n[e + t] - n[e]) : h >= n[e] && (m = e, f = n[n.length - 1] - n[n.length - 2]) } let g = null, v = null; a.rewind && (t.isBeginning ? v = t.params.virtual && t.params.virtual.enabled && t.virtual ? t.virtual.slides.length - 1 : t.slides.length - 1 : t.isEnd && (g = 0)); const w = (h - n[m]) / f, b = m < a.slidesPerGroupSkip - 1 ? 1 : a.slidesPerGroup; if (c > a.longSwipesMs) { if (!a.longSwipes) return void t.slideTo(t.activeIndex); "next" === t.swipeDirection && (w >= a.longSwipesRatio ? t.slideTo(a.rewind && t.isEnd ? g : m + b) : t.slideTo(m)), "prev" === t.swipeDirection && (w > 1 - a.longSwipesRatio ? t.slideTo(m + b) : null !== v && w < 0 && Math.abs(w) > a.longSwipesRatio ? t.slideTo(v) : t.slideTo(m)) } else { if (!a.shortSwipes) return void t.slideTo(t.activeIndex); t.navigation && (o.target === t.navigation.nextEl || o.target === t.navigation.prevEl) ? o.target === t.navigation.nextEl ? t.slideTo(m + b) : t.slideTo(m) : ("next" === t.swipeDirection && t.slideTo(null !== g ? g : m + b), "prev" === t.swipeDirection && t.slideTo(null !== v ? v : m)) } } function A() { const e = this, { params: t, el: s } = e; if (s && 0 === s.offsetWidth) return; t.breakpoints && e.setBreakpoint(); const { allowSlideNext: a, allowSlidePrev: i, snapGrid: r } = e; e.allowSlideNext = !0, e.allowSlidePrev = !0, e.updateSize(), e.updateSlides(), e.updateSlidesClasses(), ("auto" === t.slidesPerView || t.slidesPerView > 1) && e.isEnd && !e.isBeginning && !e.params.centeredSlides ? e.slideTo(e.slides.length - 1, 0, !1, !0) : e.slideTo(e.activeIndex, 0, !1, !0), e.autoplay && e.autoplay.running && e.autoplay.paused && e.autoplay.run(), e.allowSlidePrev = i, e.allowSlideNext = a, e.params.watchOverflow && r !== e.snapGrid && e.checkOverflow() } function D(e) { const t = this; t.enabled && (t.allowClick || (t.params.preventClicks && e.preventDefault(), t.params.preventClicksPropagation && t.animating && (e.stopPropagation(), e.stopImmediatePropagation()))) } function G() { const e = this, { wrapperEl: t, rtlTranslate: s, enabled: a } = e; if (!a) return; let i; e.previousTranslate = e.translate, e.isHorizontal() ? e.translate = -t.scrollLeft : e.translate = -t.scrollTop, 0 === e.translate && (e.translate = 0), e.updateActiveIndex(), e.updateSlidesClasses(); const r = e.maxTranslate() - e.minTranslate(); i = 0 === r ? 0 : (e.translate - e.minTranslate()) / r, i !== e.progress && e.updateProgress(s ? -e.translate : e.translate), e.emit("setTranslate", e.translate, !1) } let N = !1; function B() { } const H = (e, t) => { const s = a(), { params: i, touchEvents: r, el: n, wrapperEl: l, device: o, support: d } = e, c = !!i.nested, p = "on" === t ? "addEventListener" : "removeEventListener", u = t; if (d.touch) { const t = !("touchstart" !== r.start || !d.passiveListener || !i.passiveListeners) && { passive: !0, capture: !1 }; n[p](r.start, e.onTouchStart, t), n[p](r.move, e.onTouchMove, d.passiveListener ? { passive: !1, capture: c } : c), n[p](r.end, e.onTouchEnd, t), r.cancel && n[p](r.cancel, e.onTouchEnd, t) } else n[p](r.start, e.onTouchStart, !1), s[p](r.move, e.onTouchMove, c), s[p](r.end, e.onTouchEnd, !1); (i.preventClicks || i.preventClicksPropagation) && n[p]("click", e.onClick, !0), i.cssMode && l[p]("scroll", e.onScroll), i.updateOnWindowResize ? e[u](o.ios || o.android ? "resize orientationchange observerUpdate" : "resize observerUpdate", A, !0) : e[u]("observerUpdate", A, !0) }; var X = { attachEvents: function () { const e = this, t = a(), { params: s, support: i } = e; e.onTouchStart = L.bind(e), e.onTouchMove = O.bind(e), e.onTouchEnd = I.bind(e), s.cssMode && (e.onScroll = G.bind(e)), e.onClick = D.bind(e), i.touch && !N && (t.addEventListener("touchstart", B), N = !0), H(e, "on") }, detachEvents: function () { H(this, "off") } }; const Y = (e, t) => e.grid && t.grid && t.grid.rows > 1; var R = { addClasses: function () { const e = this, { classNames: t, params: s, rtl: a, $el: i, device: r, support: n } = e, l = function (e, t) { const s = []; return e.forEach((e => { "object" == typeof e ? Object.keys(e).forEach((a => { e[a] && s.push(t + a) })) : "string" == typeof e && s.push(t + e) })), s }(["initialized", s.direction, { "pointer-events": !n.touch }, { "free-mode": e.params.freeMode && s.freeMode.enabled }, { autoheight: s.autoHeight }, { rtl: a }, { grid: s.grid && s.grid.rows > 1 }, { "grid-column": s.grid && s.grid.rows > 1 && "column" === s.grid.fill }, { android: r.android }, { ios: r.ios }, { "css-mode": s.cssMode }, { centered: s.cssMode && s.centeredSlides }, { "watch-progress": s.watchSlidesProgress }], s.containerModifierClass); t.push(...l), i.addClass([...t].join(" ")), e.emitContainerClasses() }, removeClasses: function () { const { $el: e, classNames: t } = this; e.removeClass(t.join(" ")), this.emitContainerClasses() } }; var W = { init: !0, direction: "horizontal", touchEventsTarget: "wrapper", initialSlide: 0, speed: 300, cssMode: !1, updateOnWindowResize: !0, resizeObserver: !0, nested: !1, createElements: !1, enabled: !0, focusableElements: "input, select, option, textarea, button, video, label", width: null, height: null, preventInteractionOnTransition: !1, userAgent: null, url: null, edgeSwipeDetection: !1, edgeSwipeThreshold: 20, autoHeight: !1, setWrapperSize: !1, virtualTranslate: !1, effect: "slide", breakpoints: void 0, breakpointsBase: "window", spaceBetween: 0, slidesPerView: 1, slidesPerGroup: 1, slidesPerGroupSkip: 0, slidesPerGroupAuto: !1, centeredSlides: !1, centeredSlidesBounds: !1, slidesOffsetBefore: 0, slidesOffsetAfter: 0, normalizeSlideIndex: !0, centerInsufficientSlides: !1, watchOverflow: !0, roundLengths: !1, touchRatio: 1, touchAngle: 45, simulateTouch: !0, shortSwipes: !0, longSwipes: !0, longSwipesRatio: .5, longSwipesMs: 300, followFinger: !0, allowTouchMove: !0, threshold: 0, touchMoveStopPropagation: !1, touchStartPreventDefault: !0, touchStartForcePreventDefault: !1, touchReleaseOnEdges: !1, uniqueNavElements: !0, resistance: !0, resistanceRatio: .85, watchSlidesProgress: !1, grabCursor: !1, preventClicks: !0, preventClicksPropagation: !0, slideToClickedSlide: !1, preloadImages: !0, updateOnImagesReady: !0, loop: !1, loopAdditionalSlides: 0, loopedSlides: null, loopedSlidesLimit: !0, loopFillGroupWithBlank: !1, loopPreventsSlide: !0, rewind: !1, allowSlidePrev: !0, allowSlideNext: !0, swipeHandler: null, noSwiping: !0, noSwipingClass: "swiper-no-swiping", noSwipingSelector: null, passiveListeners: !0, maxBackfaceHiddenSlides: 10, containerModifierClass: "swiper-", slideClass: "swiper-slide", slideBlankClass: "swiper-slide-invisible-blank", slideActiveClass: "swiper-slide-active", slideDuplicateActiveClass: "swiper-slide-duplicate-active", slideVisibleClass: "swiper-slide-visible", slideDuplicateClass: "swiper-slide-duplicate", slideNextClass: "swiper-slide-next", slideDuplicateNextClass: "swiper-slide-duplicate-next", slidePrevClass: "swiper-slide-prev", slideDuplicatePrevClass: "swiper-slide-duplicate-prev", wrapperClass: "swiper-wrapper", runCallbacksOnInit: !0, _emitClasses: !1 }; function q(e, t) { return function (s) { void 0 === s && (s = {}); const a = Object.keys(s)[0], i = s[a]; "object" == typeof i && null !== i ? (["navigation", "pagination", "scrollbar"].indexOf(a) >= 0 && !0 === e[a] && (e[a] = { auto: !0 }), a in e && "enabled" in i ? (!0 === e[a] && (e[a] = { enabled: !0 }), "object" != typeof e[a] || "enabled" in e[a] || (e[a].enabled = !0), e[a] || (e[a] = { enabled: !1 }), g(t, s)) : g(t, s)) : g(t, s) } } const j = { eventsEmitter: $, update: S, translate: M, transition: { setTransition: function (e, t) { const s = this; s.params.cssMode || s.$wrapperEl.transition(e), s.emit("setTransition", e, t) }, transitionStart: function (e, t) { void 0 === e && (e = !0); const s = this, { params: a } = s; a.cssMode || (a.autoHeight && s.updateAutoHeight(), P({ swiper: s, runCallbacks: e, direction: t, step: "Start" })) }, transitionEnd: function (e, t) { void 0 === e && (e = !0); const s = this, { params: a } = s; s.animating = !1, a.cssMode || (s.setTransition(0), P({ swiper: s, runCallbacks: e, direction: t, step: "End" })) } }, slide: k, loop: z, grabCursor: { setGrabCursor: function (e) { const t = this; if (t.support.touch || !t.params.simulateTouch || t.params.watchOverflow && t.isLocked || t.params.cssMode) return; const s = "container" === t.params.touchEventsTarget ? t.el : t.wrapperEl; s.style.cursor = "move", s.style.cursor = e ? "grabbing" : "grab" }, unsetGrabCursor: function () { const e = this; e.support.touch || e.params.watchOverflow && e.isLocked || e.params.cssMode || (e["container" === e.params.touchEventsTarget ? "el" : "wrapperEl"].style.cursor = "") } }, events: X, breakpoints: { setBreakpoint: function () { const e = this, { activeIndex: t, initialized: s, loopedSlides: a = 0, params: i, $el: r } = e, n = i.breakpoints; if (!n || n && 0 === Object.keys(n).length) return; const l = e.getBreakpoint(n, e.params.breakpointsBase, e.el); if (!l || e.currentBreakpoint === l) return; const o = (l in n ? n[l] : void 0) || e.originalParams, d = Y(e, i), c = Y(e, o), p = i.enabled; d && !c ? (r.removeClass(`${i.containerModifierClass}grid ${i.containerModifierClass}grid-column`), e.emitContainerClasses()) : !d && c && (r.addClass(`${i.containerModifierClass}grid`), (o.grid.fill && "column" === o.grid.fill || !o.grid.fill && "column" === i.grid.fill) && r.addClass(`${i.containerModifierClass}grid-column`), e.emitContainerClasses()), ["navigation", "pagination", "scrollbar"].forEach((t => { const s = i[t] && i[t].enabled, a = o[t] && o[t].enabled; s && !a && e[t].disable(), !s && a && e[t].enable() })); const u = o.direction && o.direction !== i.direction, h = i.loop && (o.slidesPerView !== i.slidesPerView || u); u && s && e.changeDirection(), g(e.params, o); const m = e.params.enabled; Object.assign(e, { allowTouchMove: e.params.allowTouchMove, allowSlideNext: e.params.allowSlideNext, allowSlidePrev: e.params.allowSlidePrev }), p && !m ? e.disable() : !p && m && e.enable(), e.currentBreakpoint = l, e.emit("_beforeBreakpoint", o), h && s && (e.loopDestroy(), e.loopCreate(), e.updateSlides(), e.slideTo(t - a + e.loopedSlides, 0, !1)), e.emit("breakpoint", o) }, getBreakpoint: function (e, t, s) { if (void 0 === t && (t = "window"), !e || "container" === t && !s) return; let a = !1; const i = r(), n = "window" === t ? i.innerHeight : s.clientHeight, l = Object.keys(e).map((e => { if ("string" == typeof e && 0 === e.indexOf("@")) { const t = parseFloat(e.substr(1)); return { value: n * t, point: e } } return { value: e, point: e } })); l.sort(((e, t) => parseInt(e.value, 10) - parseInt(t.value, 10))); for (let e = 0; e < l.length; e += 1) { const { point: r, value: n } = l[e]; "window" === t ? i.matchMedia(`(min-width: ${n}px)`).matches && (a = r) : n <= s.clientWidth && (a = r) } return a || "max" } }, checkOverflow: { checkOverflow: function () { const e = this, { isLocked: t, params: s } = e, { slidesOffsetBefore: a } = s; if (a) { const t = e.slides.length - 1, s = e.slidesGrid[t] + e.slidesSizesGrid[t] + 2 * a; e.isLocked = e.size > s } else e.isLocked = 1 === e.snapGrid.length; !0 === s.allowSlideNext && (e.allowSlideNext = !e.isLocked), !0 === s.allowSlidePrev && (e.allowSlidePrev = !e.isLocked), t && t !== e.isLocked && (e.isEnd = !1), t !== e.isLocked && e.emit(e.isLocked ? "lock" : "unlock") } }, classes: R, images: { loadImage: function (e, t, s, a, i, n) { const l = r(); let o; function c() { n && n() } d(e).parent("picture")[0] || e.complete && i ? c() : t ? (o = new l.Image, o.onload = c, o.onerror = c, a && (o.sizes = a), s && (o.srcset = s), t && (o.src = t)) : c() }, preloadImages: function () { const e = this; function t() { null != e && e && !e.destroyed && (void 0 !== e.imagesLoaded && (e.imagesLoaded += 1), e.imagesLoaded === e.imagesToLoad.length && (e.params.updateOnImagesReady && e.update(), e.emit("imagesReady"))) } e.imagesToLoad = e.$el.find("img"); for (let s = 0; s < e.imagesToLoad.length; s += 1) { const a = e.imagesToLoad[s]; e.loadImage(a, a.currentSrc || a.getAttribute("src"), a.srcset || a.getAttribute("srcset"), a.sizes || a.getAttribute("sizes"), !0, t) } } } }, _ = {}; class V { constructor() { let e, t; for (var s = arguments.length, a = new Array(s), i = 0; i < s; i++)a[i] = arguments[i]; if (1 === a.length && a[0].constructor && "Object" === Object.prototype.toString.call(a[0]).slice(8, -1) ? t = a[0] : [e, t] = a, t || (t = {}), t = g({}, t), e && !t.el && (t.el = e), t.el && d(t.el).length > 1) { const e = []; return d(t.el).each((s => { const a = g({}, t, { el: s }); e.push(new V(a)) })), e } const r = this; r.__swiper__ = !0, r.support = E(), r.device = C({ userAgent: t.userAgent }), r.browser = T(), r.eventsListeners = {}, r.eventsAnyListeners = [], r.modules = [...r.__modules__], t.modules && Array.isArray(t.modules) && r.modules.push(...t.modules); const n = {}; r.modules.forEach((e => { e({ swiper: r, extendParams: q(t, n), on: r.on.bind(r), once: r.once.bind(r), off: r.off.bind(r), emit: r.emit.bind(r) }) })); const l = g({}, W, n); return r.params = g({}, l, _, t), r.originalParams = g({}, r.params), r.passedParams = g({}, t), r.params && r.params.on && Object.keys(r.params.on).forEach((e => { r.on(e, r.params.on[e]) })), r.params && r.params.onAny && r.onAny(r.params.onAny), r.$ = d, Object.assign(r, { enabled: r.params.enabled, el: e, classNames: [], slides: d(), slidesGrid: [], snapGrid: [], slidesSizesGrid: [], isHorizontal: () => "horizontal" === r.params.direction, isVertical: () => "vertical" === r.params.direction, activeIndex: 0, realIndex: 0, isBeginning: !0, isEnd: !1, translate: 0, previousTranslate: 0, progress: 0, velocity: 0, animating: !1, allowSlideNext: r.params.allowSlideNext, allowSlidePrev: r.params.allowSlidePrev, touchEvents: function () { const e = ["touchstart", "touchmove", "touchend", "touchcancel"], t = ["pointerdown", "pointermove", "pointerup"]; return r.touchEventsTouch = { start: e[0], move: e[1], end: e[2], cancel: e[3] }, r.touchEventsDesktop = { start: t[0], move: t[1], end: t[2] }, r.support.touch || !r.params.simulateTouch ? r.touchEventsTouch : r.touchEventsDesktop }(), touchEventsData: { isTouched: void 0, isMoved: void 0, allowTouchCallbacks: void 0, touchStartTime: void 0, isScrolling: void 0, currentTranslate: void 0, startTranslate: void 0, allowThresholdMove: void 0, focusableElements: r.params.focusableElements, lastClickTime: u(), clickTimeout: void 0, velocities: [], allowMomentumBounce: void 0, isTouchEvent: void 0, startMoving: void 0 }, allowClick: !0, allowTouchMove: r.params.allowTouchMove, touches: { startX: 0, startY: 0, currentX: 0, currentY: 0, diff: 0 }, imagesToLoad: [], imagesLoaded: 0 }), r.emit("_swiper"), r.params.init && r.init(), r } enable() { const e = this; e.enabled || (e.enabled = !0, e.params.grabCursor && e.setGrabCursor(), e.emit("enable")) } disable() { const e = this; e.enabled && (e.enabled = !1, e.params.grabCursor && e.unsetGrabCursor(), e.emit("disable")) } setProgress(e, t) { const s = this; e = Math.min(Math.max(e, 0), 1); const a = s.minTranslate(), i = (s.maxTranslate() - a) * e + a; s.translateTo(i, void 0 === t ? 0 : t), s.updateActiveIndex(), s.updateSlidesClasses() } emitContainerClasses() { const e = this; if (!e.params._emitClasses || !e.el) return; const t = e.el.className.split(" ").filter((t => 0 === t.indexOf("swiper") || 0 === t.indexOf(e.params.containerModifierClass))); e.emit("_containerClasses", t.join(" ")) } getSlideClasses(e) { const t = this; return t.destroyed ? "" : e.className.split(" ").filter((e => 0 === e.indexOf("swiper-slide") || 0 === e.indexOf(t.params.slideClass))).join(" ") } emitSlidesClasses() { const e = this; if (!e.params._emitClasses || !e.el) return; const t = []; e.slides.each((s => { const a = e.getSlideClasses(s); t.push({ slideEl: s, classNames: a }), e.emit("_slideClass", s, a) })), e.emit("_slideClasses", t) } slidesPerViewDynamic(e, t) { void 0 === e && (e = "current"), void 0 === t && (t = !1); const { params: s, slides: a, slidesGrid: i, slidesSizesGrid: r, size: n, activeIndex: l } = this; let o = 1; if (s.centeredSlides) { let e, t = a[l].swiperSlideSize; for (let s = l + 1; s < a.length; s += 1)a[s] && !e && (t += a[s].swiperSlideSize, o += 1, t > n && (e = !0)); for (let s = l - 1; s >= 0; s -= 1)a[s] && !e && (t += a[s].swiperSlideSize, o += 1, t > n && (e = !0)) } else if ("current" === e) for (let e = l + 1; e < a.length; e += 1) { (t ? i[e] + r[e] - i[l] < n : i[e] - i[l] < n) && (o += 1) } else for (let e = l - 1; e >= 0; e -= 1) { i[l] - i[e] < n && (o += 1) } return o } update() { const e = this; if (!e || e.destroyed) return; const { snapGrid: t, params: s } = e; function a() { const t = e.rtlTranslate ? -1 * e.translate : e.translate, s = Math.min(Math.max(t, e.maxTranslate()), e.minTranslate()); e.setTranslate(s), e.updateActiveIndex(), e.updateSlidesClasses() } let i; s.breakpoints && e.setBreakpoint(), e.updateSize(), e.updateSlides(), e.updateProgress(), e.updateSlidesClasses(), e.params.freeMode && e.params.freeMode.enabled ? (a(), e.params.autoHeight && e.updateAutoHeight()) : (i = ("auto" === e.params.slidesPerView || e.params.slidesPerView > 1) && e.isEnd && !e.params.centeredSlides ? e.slideTo(e.slides.length - 1, 0, !1, !0) : e.slideTo(e.activeIndex, 0, !1, !0), i || a()), s.watchOverflow && t !== e.snapGrid && e.checkOverflow(), e.emit("update") } changeDirection(e, t) { void 0 === t && (t = !0); const s = this, a = s.params.direction; return e || (e = "horizontal" === a ? "vertical" : "horizontal"), e === a || "horizontal" !== e && "vertical" !== e || (s.$el.removeClass(`${s.params.containerModifierClass}${a}`).addClass(`${s.params.containerModifierClass}${e}`), s.emitContainerClasses(), s.params.direction = e, s.slides.each((t => { "vertical" === e ? t.style.width = "" : t.style.height = "" })), s.emit("changeDirection"), t && s.update()), s } changeLanguageDirection(e) { const t = this; t.rtl && "rtl" === e || !t.rtl && "ltr" === e || (t.rtl = "rtl" === e, t.rtlTranslate = "horizontal" === t.params.direction && t.rtl, t.rtl ? (t.$el.addClass(`${t.params.containerModifierClass}rtl`), t.el.dir = "rtl") : (t.$el.removeClass(`${t.params.containerModifierClass}rtl`), t.el.dir = "ltr"), t.update()) } mount(e) { const t = this; if (t.mounted) return !0; const s = d(e || t.params.el); if (!(e = s[0])) return !1; e.swiper = t; const i = () => `.${(t.params.wrapperClass || "").trim().split(" ").join(".")}`; let r = (() => { if (e && e.shadowRoot && e.shadowRoot.querySelector) { const t = d(e.shadowRoot.querySelector(i())); return t.children = e => s.children(e), t } return s.children ? s.children(i()) : d(s).children(i()) })(); if (0 === r.length && t.params.createElements) { const e = a().createElement("div"); r = d(e), e.className = t.params.wrapperClass, s.append(e), s.children(`.${t.params.slideClass}`).each((e => { r.append(e) })) } return Object.assign(t, { $el: s, el: e, $wrapperEl: r, wrapperEl: r[0], mounted: !0, rtl: "rtl" === e.dir.toLowerCase() || "rtl" === s.css("direction"), rtlTranslate: "horizontal" === t.params.direction && ("rtl" === e.dir.toLowerCase() || "rtl" === s.css("direction")), wrongRTL: "-webkit-box" === r.css("display") }), !0 } init(e) { const t = this; if (t.initialized) return t; return !1 === t.mount(e) || (t.emit("beforeInit"), t.params.breakpoints && t.setBreakpoint(), t.addClasses(), t.params.loop && t.loopCreate(), t.updateSize(), t.updateSlides(), t.params.watchOverflow && t.checkOverflow(), t.params.grabCursor && t.enabled && t.setGrabCursor(), t.params.preloadImages && t.preloadImages(), t.params.loop ? t.slideTo(t.params.initialSlide + t.loopedSlides, 0, t.params.runCallbacksOnInit, !1, !0) : t.slideTo(t.params.initialSlide, 0, t.params.runCallbacksOnInit, !1, !0), t.attachEvents(), t.initialized = !0, t.emit("init"), t.emit("afterInit")), t } destroy(e, t) { void 0 === e && (e = !0), void 0 === t && (t = !0); const s = this, { params: a, $el: i, $wrapperEl: r, slides: n } = s; return void 0 === s.params || s.destroyed || (s.emit("beforeDestroy"), s.initialized = !1, s.detachEvents(), a.loop && s.loopDestroy(), t && (s.removeClasses(), i.removeAttr("style"), r.removeAttr("style"), n && n.length && n.removeClass([a.slideVisibleClass, a.slideActiveClass, a.slideNextClass, a.slidePrevClass].join(" ")).removeAttr("style").removeAttr("data-swiper-slide-index")), s.emit("destroy"), Object.keys(s.eventsListeners).forEach((e => { s.off(e) })), !1 !== e && (s.$el[0].swiper = null, function (e) { const t = e; Object.keys(t).forEach((e => { try { t[e] = null } catch (e) { } try { delete t[e] } catch (e) { } })) }(s)), s.destroyed = !0), null } static extendDefaults(e) { g(_, e) } static get extendedDefaults() { return _ } static get defaults() { return W } static installModule(e) { V.prototype.__modules__ || (V.prototype.__modules__ = []); const t = V.prototype.__modules__; "function" == typeof e && t.indexOf(e) < 0 && t.push(e) } static use(e) { return Array.isArray(e) ? (e.forEach((e => V.installModule(e))), V) : (V.installModule(e), V) } } function F(e, t, s, i) { const r = a(); return e.params.createElements && Object.keys(i).forEach((a => { if (!s[a] && !0 === s.auto) { let n = e.$el.children(`.${i[a]}`)[0]; n || (n = r.createElement("div"), n.className = i[a], e.$el.append(n)), s[a] = n, t[a] = n } })), s } function U(e) { return void 0 === e && (e = ""), `.${e.trim().replace(/([\.:!\/])/g, "\\$1").replace(/ /g, ".")}` } function K(e) { const t = this, { $wrapperEl: s, params: a } = t; if (a.loop && t.loopDestroy(), "object" == typeof e && "length" in e) for (let t = 0; t < e.length; t += 1)e[t] && s.append(e[t]); else s.append(e); a.loop && t.loopCreate(), a.observer || t.update() } function Z(e) { const t = this, { params: s, $wrapperEl: a, activeIndex: i } = t; s.loop && t.loopDestroy(); let r = i + 1; if ("object" == typeof e && "length" in e) { for (let t = 0; t < e.length; t += 1)e[t] && a.prepend(e[t]); r = i + e.length } else a.prepend(e); s.loop && t.loopCreate(), s.observer || t.update(), t.slideTo(r, 0, !1) } function Q(e, t) { const s = this, { $wrapperEl: a, params: i, activeIndex: r } = s; let n = r; i.loop && (n -= s.loopedSlides, s.loopDestroy(), s.slides = a.children(`.${i.slideClass}`)); const l = s.slides.length; if (e <= 0) return void s.prependSlide(t); if (e >= l) return void s.appendSlide(t); let o = n > e ? n + 1 : n; const d = []; for (let t = l - 1; t >= e; t -= 1) { const e = s.slides.eq(t); e.remove(), d.unshift(e) } if ("object" == typeof t && "length" in t) { for (let e = 0; e < t.length; e += 1)t[e] && a.append(t[e]); o = n > e ? n + t.length : n } else a.append(t); for (let e = 0; e < d.length; e += 1)a.append(d[e]); i.loop && s.loopCreate(), i.observer || s.update(), i.loop ? s.slideTo(o + s.loopedSlides, 0, !1) : s.slideTo(o, 0, !1) } function J(e) { const t = this, { params: s, $wrapperEl: a, activeIndex: i } = t; let r = i; s.loop && (r -= t.loopedSlides, t.loopDestroy(), t.slides = a.children(`.${s.slideClass}`)); let n, l = r; if ("object" == typeof e && "length" in e) { for (let s = 0; s < e.length; s += 1)n = e[s], t.slides[n] && t.slides.eq(n).remove(), n < l && (l -= 1); l = Math.max(l, 0) } else n = e, t.slides[n] && t.slides.eq(n).remove(), n < l && (l -= 1), l = Math.max(l, 0); s.loop && t.loopCreate(), s.observer || t.update(), s.loop ? t.slideTo(l + t.loopedSlides, 0, !1) : t.slideTo(l, 0, !1) } function ee() { const e = this, t = []; for (let s = 0; s < e.slides.length; s += 1)t.push(s); e.removeSlide(t) } function te(e) { const { effect: t, swiper: s, on: a, setTranslate: i, setTransition: r, overwriteParams: n, perspective: l, recreateShadows: o, getEffectParams: d } = e; let c; a("beforeInit", (() => { if (s.params.effect !== t) return; s.classNames.push(`${s.params.containerModifierClass}${t}`), l && l() && s.classNames.push(`${s.params.containerModifierClass}3d`); const e = n ? n() : {}; Object.assign(s.params, e), Object.assign(s.originalParams, e) })), a("setTranslate", (() => { s.params.effect === t && i() })), a("setTransition", ((e, a) => { s.params.effect === t && r(a) })), a("transitionEnd", (() => { if (s.params.effect === t && o) { if (!d || !d().slideShadows) return; s.slides.each((e => { s.$(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").remove() })), o() } })), a("virtualUpdate", (() => { s.params.effect === t && (s.slides.length || (c = !0), requestAnimationFrame((() => { c && s.slides && s.slides.length && (i(), c = !1) }))) })) } function se(e, t) { return e.transformEl ? t.find(e.transformEl).css({ "backface-visibility": "hidden", "-webkit-backface-visibility": "hidden" }) : t } function ae(e) { let { swiper: t, duration: s, transformEl: a, allSlides: i } = e; const { slides: r, activeIndex: n, $wrapperEl: l } = t; if (t.params.virtualTranslate && 0 !== s) { let e, s = !1; e = i ? a ? r.find(a) : r : a ? r.eq(n).find(a) : r.eq(n), e.transitionEnd((() => { if (s) return; if (!t || t.destroyed) return; s = !0, t.animating = !1; const e = ["webkitTransitionEnd", "transitionend"]; for (let t = 0; t < e.length; t += 1)l.trigger(e[t]) })) } } function ie(e, t, s) { const a = "swiper-slide-shadow" + (s ? `-${s}` : ""), i = e.transformEl ? t.find(e.transformEl) : t; let r = i.children(`.${a}`); return r.length || (r = d(`<div class="swiper-slide-shadow${s ? `-${s}` : ""}"></div>`), i.append(r)), r } Object.keys(j).forEach((e => { Object.keys(j[e]).forEach((t => { V.prototype[t] = j[e][t] })) })), V.use([function (e) { let { swiper: t, on: s, emit: a } = e; const i = r(); let n = null, l = null; const o = () => { t && !t.destroyed && t.initialized && (a("beforeResize"), a("resize")) }, d = () => { t && !t.destroyed && t.initialized && a("orientationchange") }; s("init", (() => { t.params.resizeObserver && void 0 !== i.ResizeObserver ? t && !t.destroyed && t.initialized && (n = new ResizeObserver((e => { l = i.requestAnimationFrame((() => { const { width: s, height: a } = t; let i = s, r = a; e.forEach((e => { let { contentBoxSize: s, contentRect: a, target: n } = e; n && n !== t.el || (i = a ? a.width : (s[0] || s).inlineSize, r = a ? a.height : (s[0] || s).blockSize) })), i === s && r === a || o() })) })), n.observe(t.el)) : (i.addEventListener("resize", o), i.addEventListener("orientationchange", d)) })), s("destroy", (() => { l && i.cancelAnimationFrame(l), n && n.unobserve && t.el && (n.unobserve(t.el), n = null), i.removeEventListener("resize", o), i.removeEventListener("orientationchange", d) })) }, function (e) { let { swiper: t, extendParams: s, on: a, emit: i } = e; const n = [], l = r(), o = function (e, t) { void 0 === t && (t = {}); const s = new (l.MutationObserver || l.WebkitMutationObserver)((e => { if (1 === e.length) return void i("observerUpdate", e[0]); const t = function () { i("observerUpdate", e[0]) }; l.requestAnimationFrame ? l.requestAnimationFrame(t) : l.setTimeout(t, 0) })); s.observe(e, { attributes: void 0 === t.attributes || t.attributes, childList: void 0 === t.childList || t.childList, characterData: void 0 === t.characterData || t.characterData }), n.push(s) }; s({ observer: !1, observeParents: !1, observeSlideChildren: !1 }), a("init", (() => { if (t.params.observer) { if (t.params.observeParents) { const e = t.$el.parents(); for (let t = 0; t < e.length; t += 1)o(e[t]) } o(t.$el[0], { childList: t.params.observeSlideChildren }), o(t.$wrapperEl[0], { attributes: !1 }) } })), a("destroy", (() => { n.forEach((e => { e.disconnect() })), n.splice(0, n.length) })) }]); const re = [function (e) { let t, { swiper: s, extendParams: a, on: i, emit: r } = e; function n(e, t) { const a = s.params.virtual; if (a.cache && s.virtual.cache[t]) return s.virtual.cache[t]; const i = a.renderSlide ? d(a.renderSlide.call(s, e, t)) : d(`<div class="${s.params.slideClass}" data-swiper-slide-index="${t}">${e}</div>`); return i.attr("data-swiper-slide-index") || i.attr("data-swiper-slide-index", t), a.cache && (s.virtual.cache[t] = i), i } function l(e) { const { slidesPerView: t, slidesPerGroup: a, centeredSlides: i } = s.params, { addSlidesBefore: l, addSlidesAfter: o } = s.params.virtual, { from: d, to: c, slides: p, slidesGrid: u, offset: h } = s.virtual; s.params.cssMode || s.updateActiveIndex(); const m = s.activeIndex || 0; let f, g, v; f = s.rtlTranslate ? "right" : s.isHorizontal() ? "left" : "top", i ? (g = Math.floor(t / 2) + a + o, v = Math.floor(t / 2) + a + l) : (g = t + (a - 1) + o, v = a + l); const w = Math.max((m || 0) - v, 0), b = Math.min((m || 0) + g, p.length - 1), x = (s.slidesGrid[w] || 0) - (s.slidesGrid[0] || 0); function y() { s.updateSlides(), s.updateProgress(), s.updateSlidesClasses(), s.lazy && s.params.lazy.enabled && s.lazy.load(), r("virtualUpdate") } if (Object.assign(s.virtual, { from: w, to: b, offset: x, slidesGrid: s.slidesGrid }), d === w && c === b && !e) return s.slidesGrid !== u && x !== h && s.slides.css(f, `${x}px`), s.updateProgress(), void r("virtualUpdate"); if (s.params.virtual.renderExternal) return s.params.virtual.renderExternal.call(s, { offset: x, from: w, to: b, slides: function () { const e = []; for (let t = w; t <= b; t += 1)e.push(p[t]); return e }() }), void (s.params.virtual.renderExternalUpdate ? y() : r("virtualUpdate")); const E = [], C = []; if (e) s.$wrapperEl.find(`.${s.params.slideClass}`).remove(); else for (let e = d; e <= c; e += 1)(e < w || e > b) && s.$wrapperEl.find(`.${s.params.slideClass}[data-swiper-slide-index="${e}"]`).remove(); for (let t = 0; t < p.length; t += 1)t >= w && t <= b && (void 0 === c || e ? C.push(t) : (t > c && C.push(t), t < d && E.push(t))); C.forEach((e => { s.$wrapperEl.append(n(p[e], e)) })), E.sort(((e, t) => t - e)).forEach((e => { s.$wrapperEl.prepend(n(p[e], e)) })), s.$wrapperEl.children(".swiper-slide").css(f, `${x}px`), y() } a({ virtual: { enabled: !1, slides: [], cache: !0, renderSlide: null, renderExternal: null, renderExternalUpdate: !0, addSlidesBefore: 0, addSlidesAfter: 0 } }), s.virtual = { cache: {}, from: void 0, to: void 0, slides: [], offset: 0, slidesGrid: [] }, i("beforeInit", (() => { s.params.virtual.enabled && (s.virtual.slides = s.params.virtual.slides, s.classNames.push(`${s.params.containerModifierClass}virtual`), s.params.watchSlidesProgress = !0, s.originalParams.watchSlidesProgress = !0, s.params.initialSlide || l()) })), i("setTranslate", (() => { s.params.virtual.enabled && (s.params.cssMode && !s._immediateVirtual ? (clearTimeout(t), t = setTimeout((() => { l() }), 100)) : l()) })), i("init update resize", (() => { s.params.virtual.enabled && s.params.cssMode && v(s.wrapperEl, "--swiper-virtual-size", `${s.virtualSize}px`) })), Object.assign(s.virtual, { appendSlide: function (e) { if ("object" == typeof e && "length" in e) for (let t = 0; t < e.length; t += 1)e[t] && s.virtual.slides.push(e[t]); else s.virtual.slides.push(e); l(!0) }, prependSlide: function (e) { const t = s.activeIndex; let a = t + 1, i = 1; if (Array.isArray(e)) { for (let t = 0; t < e.length; t += 1)e[t] && s.virtual.slides.unshift(e[t]); a = t + e.length, i = e.length } else s.virtual.slides.unshift(e); if (s.params.virtual.cache) { const e = s.virtual.cache, t = {}; Object.keys(e).forEach((s => { const a = e[s], r = a.attr("data-swiper-slide-index"); r && a.attr("data-swiper-slide-index", parseInt(r, 10) + i), t[parseInt(s, 10) + i] = a })), s.virtual.cache = t } l(!0), s.slideTo(a, 0) }, removeSlide: function (e) { if (null == e) return; let t = s.activeIndex; if (Array.isArray(e)) for (let a = e.length - 1; a >= 0; a -= 1)s.virtual.slides.splice(e[a], 1), s.params.virtual.cache && delete s.virtual.cache[e[a]], e[a] < t && (t -= 1), t = Math.max(t, 0); else s.virtual.slides.splice(e, 1), s.params.virtual.cache && delete s.virtual.cache[e], e < t && (t -= 1), t = Math.max(t, 0); l(!0), s.slideTo(t, 0) }, removeAllSlides: function () { s.virtual.slides = [], s.params.virtual.cache && (s.virtual.cache = {}), l(!0), s.slideTo(0, 0) }, update: l }) }, function (e) { let { swiper: t, extendParams: s, on: i, emit: n } = e; const l = a(), o = r(); function c(e) { if (!t.enabled) return; const { rtlTranslate: s } = t; let a = e; a.originalEvent && (a = a.originalEvent); const i = a.keyCode || a.charCode, r = t.params.keyboard.pageUpDown, d = r && 33 === i, c = r && 34 === i, p = 37 === i, u = 39 === i, h = 38 === i, m = 40 === i; if (!t.allowSlideNext && (t.isHorizontal() && u || t.isVertical() && m || c)) return !1; if (!t.allowSlidePrev && (t.isHorizontal() && p || t.isVertical() && h || d)) return !1; if (!(a.shiftKey || a.altKey || a.ctrlKey || a.metaKey || l.activeElement && l.activeElement.nodeName && ("input" === l.activeElement.nodeName.toLowerCase() || "textarea" === l.activeElement.nodeName.toLowerCase()))) { if (t.params.keyboard.onlyInViewport && (d || c || p || u || h || m)) { let e = !1; if (t.$el.parents(`.${t.params.slideClass}`).length > 0 && 0 === t.$el.parents(`.${t.params.slideActiveClass}`).length) return; const a = t.$el, i = a[0].clientWidth, r = a[0].clientHeight, n = o.innerWidth, l = o.innerHeight, d = t.$el.offset(); s && (d.left -= t.$el[0].scrollLeft); const c = [[d.left, d.top], [d.left + i, d.top], [d.left, d.top + r], [d.left + i, d.top + r]]; for (let t = 0; t < c.length; t += 1) { const s = c[t]; if (s[0] >= 0 && s[0] <= n && s[1] >= 0 && s[1] <= l) { if (0 === s[0] && 0 === s[1]) continue; e = !0 } } if (!e) return } t.isHorizontal() ? ((d || c || p || u) && (a.preventDefault ? a.preventDefault() : a.returnValue = !1), ((c || u) && !s || (d || p) && s) && t.slideNext(), ((d || p) && !s || (c || u) && s) && t.slidePrev()) : ((d || c || h || m) && (a.preventDefault ? a.preventDefault() : a.returnValue = !1), (c || m) && t.slideNext(), (d || h) && t.slidePrev()), n("keyPress", i) } } function p() { t.keyboard.enabled || (d(l).on("keydown", c), t.keyboard.enabled = !0) } function u() { t.keyboard.enabled && (d(l).off("keydown", c), t.keyboard.enabled = !1) } t.keyboard = { enabled: !1 }, s({ keyboard: { enabled: !1, onlyInViewport: !0, pageUpDown: !0 } }), i("init", (() => { t.params.keyboard.enabled && p() })), i("destroy", (() => { t.keyboard.enabled && u() })), Object.assign(t.keyboard, { enable: p, disable: u }) }, function (e) { let { swiper: t, extendParams: s, on: a, emit: i } = e; const n = r(); let l; s({ mousewheel: { enabled: !1, releaseOnEdges: !1, invert: !1, forceToAxis: !1, sensitivity: 1, eventsTarget: "container", thresholdDelta: null, thresholdTime: null } }), t.mousewheel = { enabled: !1 }; let o, c = u(); const h = []; function m() { t.enabled && (t.mouseEntered = !0) } function f() { t.enabled && (t.mouseEntered = !1) } function g(e) { return !(t.params.mousewheel.thresholdDelta && e.delta < t.params.mousewheel.thresholdDelta) && (!(t.params.mousewheel.thresholdTime && u() - c < t.params.mousewheel.thresholdTime) && (e.delta >= 6 && u() - c < 60 || (e.direction < 0 ? t.isEnd && !t.params.loop || t.animating || (t.slideNext(), i("scroll", e.raw)) : t.isBeginning && !t.params.loop || t.animating || (t.slidePrev(), i("scroll", e.raw)), c = (new n.Date).getTime(), !1))) } function v(e) { let s = e, a = !0; if (!t.enabled) return; const r = t.params.mousewheel; t.params.cssMode && s.preventDefault(); let n = t.$el; if ("container" !== t.params.mousewheel.eventsTarget && (n = d(t.params.mousewheel.eventsTarget)), !t.mouseEntered && !n[0].contains(s.target) && !r.releaseOnEdges) return !0; s.originalEvent && (s = s.originalEvent); let c = 0; const m = t.rtlTranslate ? -1 : 1, f = function (e) { let t = 0, s = 0, a = 0, i = 0; return "detail" in e && (s = e.detail), "wheelDelta" in e && (s = -e.wheelDelta / 120), "wheelDeltaY" in e && (s = -e.wheelDeltaY / 120), "wheelDeltaX" in e && (t = -e.wheelDeltaX / 120), "axis" in e && e.axis === e.HORIZONTAL_AXIS && (t = s, s = 0), a = 10 * t, i = 10 * s, "deltaY" in e && (i = e.deltaY), "deltaX" in e && (a = e.deltaX), e.shiftKey && !a && (a = i, i = 0), (a || i) && e.deltaMode && (1 === e.deltaMode ? (a *= 40, i *= 40) : (a *= 800, i *= 800)), a && !t && (t = a < 1 ? -1 : 1), i && !s && (s = i < 1 ? -1 : 1), { spinX: t, spinY: s, pixelX: a, pixelY: i } }(s); if (r.forceToAxis) if (t.isHorizontal()) { if (!(Math.abs(f.pixelX) > Math.abs(f.pixelY))) return !0; c = -f.pixelX * m } else { if (!(Math.abs(f.pixelY) > Math.abs(f.pixelX))) return !0; c = -f.pixelY } else c = Math.abs(f.pixelX) > Math.abs(f.pixelY) ? -f.pixelX * m : -f.pixelY; if (0 === c) return !0; r.invert && (c = -c); let v = t.getTranslate() + c * r.sensitivity; if (v >= t.minTranslate() && (v = t.minTranslate()), v <= t.maxTranslate() && (v = t.maxTranslate()), a = !!t.params.loop || !(v === t.minTranslate() || v === t.maxTranslate()), a && t.params.nested && s.stopPropagation(), t.params.freeMode && t.params.freeMode.enabled) { const e = { time: u(), delta: Math.abs(c), direction: Math.sign(c) }, a = o && e.time < o.time + 500 && e.delta <= o.delta && e.direction === o.direction; if (!a) { o = void 0, t.params.loop && t.loopFix(); let n = t.getTranslate() + c * r.sensitivity; const d = t.isBeginning, u = t.isEnd; if (n >= t.minTranslate() && (n = t.minTranslate()), n <= t.maxTranslate() && (n = t.maxTranslate()), t.setTransition(0), t.setTranslate(n), t.updateProgress(), t.updateActiveIndex(), t.updateSlidesClasses(), (!d && t.isBeginning || !u && t.isEnd) && t.updateSlidesClasses(), t.params.freeMode.sticky) { clearTimeout(l), l = void 0, h.length >= 15 && h.shift(); const s = h.length ? h[h.length - 1] : void 0, a = h[0]; if (h.push(e), s && (e.delta > s.delta || e.direction !== s.direction)) h.splice(0); else if (h.length >= 15 && e.time - a.time < 500 && a.delta - e.delta >= 1 && e.delta <= 6) { const s = c > 0 ? .8 : .2; o = e, h.splice(0), l = p((() => { t.slideToClosest(t.params.speed, !0, void 0, s) }), 0) } l || (l = p((() => { o = e, h.splice(0), t.slideToClosest(t.params.speed, !0, void 0, .5) }), 500)) } if (a || i("scroll", s), t.params.autoplay && t.params.autoplayDisableOnInteraction && t.autoplay.stop(), n === t.minTranslate() || n === t.maxTranslate()) return !0 } } else { const s = { time: u(), delta: Math.abs(c), direction: Math.sign(c), raw: e }; h.length >= 2 && h.shift(); const a = h.length ? h[h.length - 1] : void 0; if (h.push(s), a ? (s.direction !== a.direction || s.delta > a.delta || s.time > a.time + 150) && g(s) : g(s), function (e) { const s = t.params.mousewheel; if (e.direction < 0) { if (t.isEnd && !t.params.loop && s.releaseOnEdges) return !0 } else if (t.isBeginning && !t.params.loop && s.releaseOnEdges) return !0; return !1 }(s)) return !0 } return s.preventDefault ? s.preventDefault() : s.returnValue = !1, !1 } function w(e) { let s = t.$el; "container" !== t.params.mousewheel.eventsTarget && (s = d(t.params.mousewheel.eventsTarget)), s[e]("mouseenter", m), s[e]("mouseleave", f), s[e]("wheel", v) } function b() { return t.params.cssMode ? (t.wrapperEl.removeEventListener("wheel", v), !0) : !t.mousewheel.enabled && (w("on"), t.mousewheel.enabled = !0, !0) } function x() { return t.params.cssMode ? (t.wrapperEl.addEventListener(event, v), !0) : !!t.mousewheel.enabled && (w("off"), t.mousewheel.enabled = !1, !0) } a("init", (() => { !t.params.mousewheel.enabled && t.params.cssMode && x(), t.params.mousewheel.enabled && b() })), a("destroy", (() => { t.params.cssMode && b(), t.mousewheel.enabled && x() })), Object.assign(t.mousewheel, { enable: b, disable: x }) }, function (e) { let { swiper: t, extendParams: s, on: a, emit: i } = e; function r(e) { let s; return e && (s = d(e), t.params.uniqueNavElements && "string" == typeof e && s.length > 1 && 1 === t.$el.find(e).length && (s = t.$el.find(e))), s } function n(e, s) { const a = t.params.navigation; e && e.length > 0 && (e[s ? "addClass" : "removeClass"](a.disabledClass), e[0] && "BUTTON" === e[0].tagName && (e[0].disabled = s), t.params.watchOverflow && t.enabled && e[t.isLocked ? "addClass" : "removeClass"](a.lockClass)) } function l() { if (t.params.loop) return; const { $nextEl: e, $prevEl: s } = t.navigation; n(s, t.isBeginning && !t.params.rewind), n(e, t.isEnd && !t.params.rewind) } function o(e) { e.preventDefault(), (!t.isBeginning || t.params.loop || t.params.rewind) && (t.slidePrev(), i("navigationPrev")) } function c(e) { e.preventDefault(), (!t.isEnd || t.params.loop || t.params.rewind) && (t.slideNext(), i("navigationNext")) } function p() { const e = t.params.navigation; if (t.params.navigation = F(t, t.originalParams.navigation, t.params.navigation, { nextEl: "swiper-button-next", prevEl: "swiper-button-prev" }), !e.nextEl && !e.prevEl) return; const s = r(e.nextEl), a = r(e.prevEl); s && s.length > 0 && s.on("click", c), a && a.length > 0 && a.on("click", o), Object.assign(t.navigation, { $nextEl: s, nextEl: s && s[0], $prevEl: a, prevEl: a && a[0] }), t.enabled || (s && s.addClass(e.lockClass), a && a.addClass(e.lockClass)) } function u() { const { $nextEl: e, $prevEl: s } = t.navigation; e && e.length && (e.off("click", c), e.removeClass(t.params.navigation.disabledClass)), s && s.length && (s.off("click", o), s.removeClass(t.params.navigation.disabledClass)) } s({ navigation: { nextEl: null, prevEl: null, hideOnClick: !1, disabledClass: "swiper-button-disabled", hiddenClass: "swiper-button-hidden", lockClass: "swiper-button-lock", navigationDisabledClass: "swiper-navigation-disabled" } }), t.navigation = { nextEl: null, $nextEl: null, prevEl: null, $prevEl: null }, a("init", (() => { !1 === t.params.navigation.enabled ? h() : (p(), l()) })), a("toEdge fromEdge lock unlock", (() => { l() })), a("destroy", (() => { u() })), a("enable disable", (() => { const { $nextEl: e, $prevEl: s } = t.navigation; e && e[t.enabled ? "removeClass" : "addClass"](t.params.navigation.lockClass), s && s[t.enabled ? "removeClass" : "addClass"](t.params.navigation.lockClass) })), a("click", ((e, s) => { const { $nextEl: a, $prevEl: r } = t.navigation, n = s.target; if (t.params.navigation.hideOnClick && !d(n).is(r) && !d(n).is(a)) { if (t.pagination && t.params.pagination && t.params.pagination.clickable && (t.pagination.el === n || t.pagination.el.contains(n))) return; let e; a ? e = a.hasClass(t.params.navigation.hiddenClass) : r && (e = r.hasClass(t.params.navigation.hiddenClass)), i(!0 === e ? "navigationShow" : "navigationHide"), a && a.toggleClass(t.params.navigation.hiddenClass), r && r.toggleClass(t.params.navigation.hiddenClass) } })); const h = () => { t.$el.addClass(t.params.navigation.navigationDisabledClass), u() }; Object.assign(t.navigation, { enable: () => { t.$el.removeClass(t.params.navigation.navigationDisabledClass), p(), l() }, disable: h, update: l, init: p, destroy: u }) }, function (e) { let { swiper: t, extendParams: s, on: a, emit: i } = e; const r = "swiper-pagination"; let n; s({ pagination: { el: null, bulletElement: "span", clickable: !1, hideOnClick: !1, renderBullet: null, renderProgressbar: null, renderFraction: null, renderCustom: null, progressbarOpposite: !1, type: "bullets", dynamicBullets: !1, dynamicMainBullets: 1, formatFractionCurrent: e => e, formatFractionTotal: e => e, bulletClass: `${r}-bullet`, bulletActiveClass: `${r}-bullet-active`, modifierClass: `${r}-`, currentClass: `${r}-current`, totalClass: `${r}-total`, hiddenClass: `${r}-hidden`, progressbarFillClass: `${r}-progressbar-fill`, progressbarOppositeClass: `${r}-progressbar-opposite`, clickableClass: `${r}-clickable`, lockClass: `${r}-lock`, horizontalClass: `${r}-horizontal`, verticalClass: `${r}-vertical`, paginationDisabledClass: `${r}-disabled` } }), t.pagination = { el: null, $el: null, bullets: [] }; let l = 0; function o() { return !t.params.pagination.el || !t.pagination.el || !t.pagination.$el || 0 === t.pagination.$el.length } function c(e, s) { const { bulletActiveClass: a } = t.params.pagination; e[s]().addClass(`${a}-${s}`)[s]().addClass(`${a}-${s}-${s}`) } function p() { const e = t.rtl, s = t.params.pagination; if (o()) return; const a = t.virtual && t.params.virtual.enabled ? t.virtual.slides.length : t.slides.length, r = t.pagination.$el; let p; const u = t.params.loop ? Math.ceil((a - 2 * t.loopedSlides) / t.params.slidesPerGroup) : t.snapGrid.length; if (t.params.loop ? (p = Math.ceil((t.activeIndex - t.loopedSlides) / t.params.slidesPerGroup), p > a - 1 - 2 * t.loopedSlides && (p -= a - 2 * t.loopedSlides), p > u - 1 && (p -= u), p < 0 && "bullets" !== t.params.paginationType && (p = u + p)) : p = void 0 !== t.snapIndex ? t.snapIndex : t.activeIndex || 0, "bullets" === s.type && t.pagination.bullets && t.pagination.bullets.length > 0) { const a = t.pagination.bullets; let i, o, u; if (s.dynamicBullets && (n = a.eq(0)[t.isHorizontal() ? "outerWidth" : "outerHeight"](!0), r.css(t.isHorizontal() ? "width" : "height", n * (s.dynamicMainBullets + 4) + "px"), s.dynamicMainBullets > 1 && void 0 !== t.previousIndex && (l += p - (t.previousIndex - t.loopedSlides || 0), l > s.dynamicMainBullets - 1 ? l = s.dynamicMainBullets - 1 : l < 0 && (l = 0)), i = Math.max(p - l, 0), o = i + (Math.min(a.length, s.dynamicMainBullets) - 1), u = (o + i) / 2), a.removeClass(["", "-next", "-next-next", "-prev", "-prev-prev", "-main"].map((e => `${s.bulletActiveClass}${e}`)).join(" ")), r.length > 1) a.each((e => { const t = d(e), a = t.index(); a === p && t.addClass(s.bulletActiveClass), s.dynamicBullets && (a >= i && a <= o && t.addClass(`${s.bulletActiveClass}-main`), a === i && c(t, "prev"), a === o && c(t, "next")) })); else { const e = a.eq(p), r = e.index(); if (e.addClass(s.bulletActiveClass), s.dynamicBullets) { const e = a.eq(i), n = a.eq(o); for (let e = i; e <= o; e += 1)a.eq(e).addClass(`${s.bulletActiveClass}-main`); if (t.params.loop) if (r >= a.length) { for (let e = s.dynamicMainBullets; e >= 0; e -= 1)a.eq(a.length - e).addClass(`${s.bulletActiveClass}-main`); a.eq(a.length - s.dynamicMainBullets - 1).addClass(`${s.bulletActiveClass}-prev`) } else c(e, "prev"), c(n, "next"); else c(e, "prev"), c(n, "next") } } if (s.dynamicBullets) { const i = Math.min(a.length, s.dynamicMainBullets + 4), r = (n * i - n) / 2 - u * n, l = e ? "right" : "left"; a.css(t.isHorizontal() ? l : "top", `${r}px`) } } if ("fraction" === s.type && (r.find(U(s.currentClass)).text(s.formatFractionCurrent(p + 1)), r.find(U(s.totalClass)).text(s.formatFractionTotal(u))), "progressbar" === s.type) { let e; e = s.progressbarOpposite ? t.isHorizontal() ? "vertical" : "horizontal" : t.isHorizontal() ? "horizontal" : "vertical"; const a = (p + 1) / u; let i = 1, n = 1; "horizontal" === e ? i = a : n = a, r.find(U(s.progressbarFillClass)).transform(`translate3d(0,0,0) scaleX(${i}) scaleY(${n})`).transition(t.params.speed) } "custom" === s.type && s.renderCustom ? (r.html(s.renderCustom(t, p + 1, u)), i("paginationRender", r[0])) : i("paginationUpdate", r[0]), t.params.watchOverflow && t.enabled && r[t.isLocked ? "addClass" : "removeClass"](s.lockClass) } function u() { const e = t.params.pagination; if (o()) return; const s = t.virtual && t.params.virtual.enabled ? t.virtual.slides.length : t.slides.length, a = t.pagination.$el; let r = ""; if ("bullets" === e.type) { let i = t.params.loop ? Math.ceil((s - 2 * t.loopedSlides) / t.params.slidesPerGroup) : t.snapGrid.length; t.params.freeMode && t.params.freeMode.enabled && !t.params.loop && i > s && (i = s); for (let s = 0; s < i; s += 1)e.renderBullet ? r += e.renderBullet.call(t, s, e.bulletClass) : r += `<${e.bulletElement} class="${e.bulletClass}"></${e.bulletElement}>`; a.html(r), t.pagination.bullets = a.find(U(e.bulletClass)) } "fraction" === e.type && (r = e.renderFraction ? e.renderFraction.call(t, e.currentClass, e.totalClass) : `<span class="${e.currentClass}"></span> / <span class="${e.totalClass}"></span>`, a.html(r)), "progressbar" === e.type && (r = e.renderProgressbar ? e.renderProgressbar.call(t, e.progressbarFillClass) : `<span class="${e.progressbarFillClass}"></span>`, a.html(r)), "custom" !== e.type && i("paginationRender", t.pagination.$el[0]) } function h() { t.params.pagination = F(t, t.originalParams.pagination, t.params.pagination, { el: "swiper-pagination" }); const e = t.params.pagination; if (!e.el) return; let s = d(e.el); 0 !== s.length && (t.params.uniqueNavElements && "string" == typeof e.el && s.length > 1 && (s = t.$el.find(e.el), s.length > 1 && (s = s.filter((e => d(e).parents(".swiper")[0] === t.el)))), "bullets" === e.type && e.clickable && s.addClass(e.clickableClass), s.addClass(e.modifierClass + e.type), s.addClass(t.isHorizontal() ? e.horizontalClass : e.verticalClass), "bullets" === e.type && e.dynamicBullets && (s.addClass(`${e.modifierClass}${e.type}-dynamic`), l = 0, e.dynamicMainBullets < 1 && (e.dynamicMainBullets = 1)), "progressbar" === e.type && e.progressbarOpposite && s.addClass(e.progressbarOppositeClass), e.clickable && s.on("click", U(e.bulletClass), (function (e) { e.preventDefault(); let s = d(this).index() * t.params.slidesPerGroup; t.params.loop && (s += t.loopedSlides), t.slideTo(s) })), Object.assign(t.pagination, { $el: s, el: s[0] }), t.enabled || s.addClass(e.lockClass)) } function m() { const e = t.params.pagination; if (o()) return; const s = t.pagination.$el; s.removeClass(e.hiddenClass), s.removeClass(e.modifierClass + e.type), s.removeClass(t.isHorizontal() ? e.horizontalClass : e.verticalClass), t.pagination.bullets && t.pagination.bullets.removeClass && t.pagination.bullets.removeClass(e.bulletActiveClass), e.clickable && s.off("click", U(e.bulletClass)) } a("init", (() => { !1 === t.params.pagination.enabled ? f() : (h(), u(), p()) })), a("activeIndexChange", (() => { (t.params.loop || void 0 === t.snapIndex) && p() })), a("snapIndexChange", (() => { t.params.loop || p() })), a("slidesLengthChange", (() => { t.params.loop && (u(), p()) })), a("snapGridLengthChange", (() => { t.params.loop || (u(), p()) })), a("destroy", (() => { m() })), a("enable disable", (() => { const { $el: e } = t.pagination; e && e[t.enabled ? "removeClass" : "addClass"](t.params.pagination.lockClass) })), a("lock unlock", (() => { p() })), a("click", ((e, s) => { const a = s.target, { $el: r } = t.pagination; if (t.params.pagination.el && t.params.pagination.hideOnClick && r && r.length > 0 && !d(a).hasClass(t.params.pagination.bulletClass)) { if (t.navigation && (t.navigation.nextEl && a === t.navigation.nextEl || t.navigation.prevEl && a === t.navigation.prevEl)) return; const e = r.hasClass(t.params.pagination.hiddenClass); i(!0 === e ? "paginationShow" : "paginationHide"), r.toggleClass(t.params.pagination.hiddenClass) } })); const f = () => { t.$el.addClass(t.params.pagination.paginationDisabledClass), t.pagination.$el && t.pagination.$el.addClass(t.params.pagination.paginationDisabledClass), m() }; Object.assign(t.pagination, { enable: () => { t.$el.removeClass(t.params.pagination.paginationDisabledClass), t.pagination.$el && t.pagination.$el.removeClass(t.params.pagination.paginationDisabledClass), h(), u(), p() }, disable: f, render: u, update: p, init: h, destroy: m }) }, function (e) { let { swiper: t, extendParams: s, on: i, emit: r } = e; const n = a(); let l, o, c, u, h = !1, m = null, f = null; function g() { if (!t.params.scrollbar.el || !t.scrollbar.el) return; const { scrollbar: e, rtlTranslate: s, progress: a } = t, { $dragEl: i, $el: r } = e, n = t.params.scrollbar; let l = o, d = (c - o) * a; s ? (d = -d, d > 0 ? (l = o - d, d = 0) : -d + o > c && (l = c + d)) : d < 0 ? (l = o + d, d = 0) : d + o > c && (l = c - d), t.isHorizontal() ? (i.transform(`translate3d(${d}px, 0, 0)`), i[0].style.width = `${l}px`) : (i.transform(`translate3d(0px, ${d}px, 0)`), i[0].style.height = `${l}px`), n.hide && (clearTimeout(m), r[0].style.opacity = 1, m = setTimeout((() => { r[0].style.opacity = 0, r.transition(400) }), 1e3)) } function v() { if (!t.params.scrollbar.el || !t.scrollbar.el) return; const { scrollbar: e } = t, { $dragEl: s, $el: a } = e; s[0].style.width = "", s[0].style.height = "", c = t.isHorizontal() ? a[0].offsetWidth : a[0].offsetHeight, u = t.size / (t.virtualSize + t.params.slidesOffsetBefore - (t.params.centeredSlides ? t.snapGrid[0] : 0)), o = "auto" === t.params.scrollbar.dragSize ? c * u : parseInt(t.params.scrollbar.dragSize, 10), t.isHorizontal() ? s[0].style.width = `${o}px` : s[0].style.height = `${o}px`, a[0].style.display = u >= 1 ? "none" : "", t.params.scrollbar.hide && (a[0].style.opacity = 0), t.params.watchOverflow && t.enabled && e.$el[t.isLocked ? "addClass" : "removeClass"](t.params.scrollbar.lockClass) } function w(e) { return t.isHorizontal() ? "touchstart" === e.type || "touchmove" === e.type ? e.targetTouches[0].clientX : e.clientX : "touchstart" === e.type || "touchmove" === e.type ? e.targetTouches[0].clientY : e.clientY } function b(e) { const { scrollbar: s, rtlTranslate: a } = t, { $el: i } = s; let r; r = (w(e) - i.offset()[t.isHorizontal() ? "left" : "top"] - (null !== l ? l : o / 2)) / (c - o), r = Math.max(Math.min(r, 1), 0), a && (r = 1 - r); const n = t.minTranslate() + (t.maxTranslate() - t.minTranslate()) * r; t.updateProgress(n), t.setTranslate(n), t.updateActiveIndex(), t.updateSlidesClasses() } function x(e) { const s = t.params.scrollbar, { scrollbar: a, $wrapperEl: i } = t, { $el: n, $dragEl: o } = a; h = !0, l = e.target === o[0] || e.target === o ? w(e) - e.target.getBoundingClientRect()[t.isHorizontal() ? "left" : "top"] : null, e.preventDefault(), e.stopPropagation(), i.transition(100), o.transition(100), b(e), clearTimeout(f), n.transition(0), s.hide && n.css("opacity", 1), t.params.cssMode && t.$wrapperEl.css("scroll-snap-type", "none"), r("scrollbarDragStart", e) } function y(e) { const { scrollbar: s, $wrapperEl: a } = t, { $el: i, $dragEl: n } = s; h && (e.preventDefault ? e.preventDefault() : e.returnValue = !1, b(e), a.transition(0), i.transition(0), n.transition(0), r("scrollbarDragMove", e)) } function E(e) { const s = t.params.scrollbar, { scrollbar: a, $wrapperEl: i } = t, { $el: n } = a; h && (h = !1, t.params.cssMode && (t.$wrapperEl.css("scroll-snap-type", ""), i.transition("")), s.hide && (clearTimeout(f), f = p((() => { n.css("opacity", 0), n.transition(400) }), 1e3)), r("scrollbarDragEnd", e), s.snapOnRelease && t.slideToClosest()) } function C(e) { const { scrollbar: s, touchEventsTouch: a, touchEventsDesktop: i, params: r, support: l } = t, o = s.$el; if (!o) return; const d = o[0], c = !(!l.passiveListener || !r.passiveListeners) && { passive: !1, capture: !1 }, p = !(!l.passiveListener || !r.passiveListeners) && { passive: !0, capture: !1 }; if (!d) return; const u = "on" === e ? "addEventListener" : "removeEventListener"; l.touch ? (d[u](a.start, x, c), d[u](a.move, y, c), d[u](a.end, E, p)) : (d[u](i.start, x, c), n[u](i.move, y, c), n[u](i.end, E, p)) } function T() { const { scrollbar: e, $el: s } = t; t.params.scrollbar = F(t, t.originalParams.scrollbar, t.params.scrollbar, { el: "swiper-scrollbar" }); const a = t.params.scrollbar; if (!a.el) return; let i = d(a.el); t.params.uniqueNavElements && "string" == typeof a.el && i.length > 1 && 1 === s.find(a.el).length && (i = s.find(a.el)), i.addClass(t.isHorizontal() ? a.horizontalClass : a.verticalClass); let r = i.find(`.${t.params.scrollbar.dragClass}`); 0 === r.length && (r = d(`<div class="${t.params.scrollbar.dragClass}"></div>`), i.append(r)), Object.assign(e, { $el: i, el: i[0], $dragEl: r, dragEl: r[0] }), a.draggable && t.params.scrollbar.el && t.scrollbar.el && C("on"), i && i[t.enabled ? "removeClass" : "addClass"](t.params.scrollbar.lockClass) } function $() { const e = t.params.scrollbar, s = t.scrollbar.$el; s && s.removeClass(t.isHorizontal() ? e.horizontalClass : e.verticalClass), t.params.scrollbar.el && t.scrollbar.el && C("off") } s({ scrollbar: { el: null, dragSize: "auto", hide: !1, draggable: !1, snapOnRelease: !0, lockClass: "swiper-scrollbar-lock", dragClass: "swiper-scrollbar-drag", scrollbarDisabledClass: "swiper-scrollbar-disabled", horizontalClass: "swiper-scrollbar-horizontal", verticalClass: "swiper-scrollbar-vertical" } }), t.scrollbar = { el: null, dragEl: null, $el: null, $dragEl: null }, i("init", (() => { !1 === t.params.scrollbar.enabled ? S() : (T(), v(), g()) })), i("update resize observerUpdate lock unlock", (() => { v() })), i("setTranslate", (() => { g() })), i("setTransition", ((e, s) => { !function (e) { t.params.scrollbar.el && t.scrollbar.el && t.scrollbar.$dragEl.transition(e) }(s) })), i("enable disable", (() => { const { $el: e } = t.scrollbar; e && e[t.enabled ? "removeClass" : "addClass"](t.params.scrollbar.lockClass) })), i("destroy", (() => { $() })); const S = () => { t.$el.addClass(t.params.scrollbar.scrollbarDisabledClass), t.scrollbar.$el && t.scrollbar.$el.addClass(t.params.scrollbar.scrollbarDisabledClass), $() }; Object.assign(t.scrollbar, { enable: () => { t.$el.removeClass(t.params.scrollbar.scrollbarDisabledClass), t.scrollbar.$el && t.scrollbar.$el.removeClass(t.params.scrollbar.scrollbarDisabledClass), T(), v(), g() }, disable: S, updateSize: v, setTranslate: g, init: T, destroy: $ }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ parallax: { enabled: !1 } }); const i = (e, s) => { const { rtl: a } = t, i = d(e), r = a ? -1 : 1, n = i.attr("data-swiper-parallax") || "0"; let l = i.attr("data-swiper-parallax-x"), o = i.attr("data-swiper-parallax-y"); const c = i.attr("data-swiper-parallax-scale"), p = i.attr("data-swiper-parallax-opacity"); if (l || o ? (l = l || "0", o = o || "0") : t.isHorizontal() ? (l = n, o = "0") : (o = n, l = "0"), l = l.indexOf("%") >= 0 ? parseInt(l, 10) * s * r + "%" : l * s * r + "px", o = o.indexOf("%") >= 0 ? parseInt(o, 10) * s + "%" : o * s + "px", null != p) { const e = p - (p - 1) * (1 - Math.abs(s)); i[0].style.opacity = e } if (null == c) i.transform(`translate3d(${l}, ${o}, 0px)`); else { const e = c - (c - 1) * (1 - Math.abs(s)); i.transform(`translate3d(${l}, ${o}, 0px) scale(${e})`) } }, r = () => { const { $el: e, slides: s, progress: a, snapGrid: r } = t; e.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((e => { i(e, a) })), s.each(((e, s) => { let n = e.progress; t.params.slidesPerGroup > 1 && "auto" !== t.params.slidesPerView && (n += Math.ceil(s / 2) - a * (r.length - 1)), n = Math.min(Math.max(n, -1), 1), d(e).find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((e => { i(e, n) })) })) }; a("beforeInit", (() => { t.params.parallax.enabled && (t.params.watchSlidesProgress = !0, t.originalParams.watchSlidesProgress = !0) })), a("init", (() => { t.params.parallax.enabled && r() })), a("setTranslate", (() => { t.params.parallax.enabled && r() })), a("setTransition", ((e, s) => { t.params.parallax.enabled && function (e) { void 0 === e && (e = t.params.speed); const { $el: s } = t; s.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((t => { const s = d(t); let a = parseInt(s.attr("data-swiper-parallax-duration"), 10) || e; 0 === e && (a = 0), s.transition(a) })) }(s) })) }, function (e) { let { swiper: t, extendParams: s, on: a, emit: i } = e; const n = r(); s({ zoom: { enabled: !1, maxRatio: 3, minRatio: 1, toggle: !0, containerClass: "swiper-zoom-container", zoomedSlideClass: "swiper-slide-zoomed" } }), t.zoom = { enabled: !1 }; let l, o, c, p = 1, u = !1; const m = { $slideEl: void 0, slideWidth: void 0, slideHeight: void 0, $imageEl: void 0, $imageWrapEl: void 0, maxRatio: 3 }, f = { isTouched: void 0, isMoved: void 0, currentX: void 0, currentY: void 0, minX: void 0, minY: void 0, maxX: void 0, maxY: void 0, width: void 0, height: void 0, startX: void 0, startY: void 0, touchesStart: {}, touchesCurrent: {} }, g = { x: void 0, y: void 0, prevPositionX: void 0, prevPositionY: void 0, prevTime: void 0 }; let v = 1; function w(e) { if (e.targetTouches.length < 2) return 1; const t = e.targetTouches[0].pageX, s = e.targetTouches[0].pageY, a = e.targetTouches[1].pageX, i = e.targetTouches[1].pageY; return Math.sqrt((a - t) ** 2 + (i - s) ** 2) } function b(e) { const s = t.support, a = t.params.zoom; if (o = !1, c = !1, !s.gestures) { if ("touchstart" !== e.type || "touchstart" === e.type && e.targetTouches.length < 2) return; o = !0, m.scaleStart = w(e) } m.$slideEl && m.$slideEl.length || (m.$slideEl = d(e.target).closest(`.${t.params.slideClass}`), 0 === m.$slideEl.length && (m.$slideEl = t.slides.eq(t.activeIndex)), m.$imageEl = m.$slideEl.find(`.${a.containerClass}`).eq(0).find("picture, img, svg, canvas, .swiper-zoom-target").eq(0), m.$imageWrapEl = m.$imageEl.parent(`.${a.containerClass}`), m.maxRatio = m.$imageWrapEl.attr("data-swiper-zoom") || a.maxRatio, 0 !== m.$imageWrapEl.length) ? (m.$imageEl && m.$imageEl.transition(0), u = !0) : m.$imageEl = void 0 } function x(e) { const s = t.support, a = t.params.zoom, i = t.zoom; if (!s.gestures) { if ("touchmove" !== e.type || "touchmove" === e.type && e.targetTouches.length < 2) return; c = !0, m.scaleMove = w(e) } m.$imageEl && 0 !== m.$imageEl.length ? (s.gestures ? i.scale = e.scale * p : i.scale = m.scaleMove / m.scaleStart * p, i.scale > m.maxRatio && (i.scale = m.maxRatio - 1 + (i.scale - m.maxRatio + 1) ** .5), i.scale < a.minRatio && (i.scale = a.minRatio + 1 - (a.minRatio - i.scale + 1) ** .5), m.$imageEl.transform(`translate3d(0,0,0) scale(${i.scale})`)) : "gesturechange" === e.type && b(e) } function y(e) { const s = t.device, a = t.support, i = t.params.zoom, r = t.zoom; if (!a.gestures) { if (!o || !c) return; if ("touchend" !== e.type || "touchend" === e.type && e.changedTouches.length < 2 && !s.android) return; o = !1, c = !1 } m.$imageEl && 0 !== m.$imageEl.length && (r.scale = Math.max(Math.min(r.scale, m.maxRatio), i.minRatio), m.$imageEl.transition(t.params.speed).transform(`translate3d(0,0,0) scale(${r.scale})`), p = r.scale, u = !1, 1 === r.scale && (m.$slideEl = void 0)) } function E(e) { const s = t.zoom; if (!m.$imageEl || 0 === m.$imageEl.length) return; if (t.allowClick = !1, !f.isTouched || !m.$slideEl) return; f.isMoved || (f.width = m.$imageEl[0].offsetWidth, f.height = m.$imageEl[0].offsetHeight, f.startX = h(m.$imageWrapEl[0], "x") || 0, f.startY = h(m.$imageWrapEl[0], "y") || 0, m.slideWidth = m.$slideEl[0].offsetWidth, m.slideHeight = m.$slideEl[0].offsetHeight, m.$imageWrapEl.transition(0)); const a = f.width * s.scale, i = f.height * s.scale; if (!(a < m.slideWidth && i < m.slideHeight)) { if (f.minX = Math.min(m.slideWidth / 2 - a / 2, 0), f.maxX = -f.minX, f.minY = Math.min(m.slideHeight / 2 - i / 2, 0), f.maxY = -f.minY, f.touchesCurrent.x = "touchmove" === e.type ? e.targetTouches[0].pageX : e.pageX, f.touchesCurrent.y = "touchmove" === e.type ? e.targetTouches[0].pageY : e.pageY, !f.isMoved && !u) { if (t.isHorizontal() && (Math.floor(f.minX) === Math.floor(f.startX) && f.touchesCurrent.x < f.touchesStart.x || Math.floor(f.maxX) === Math.floor(f.startX) && f.touchesCurrent.x > f.touchesStart.x)) return void (f.isTouched = !1); if (!t.isHorizontal() && (Math.floor(f.minY) === Math.floor(f.startY) && f.touchesCurrent.y < f.touchesStart.y || Math.floor(f.maxY) === Math.floor(f.startY) && f.touchesCurrent.y > f.touchesStart.y)) return void (f.isTouched = !1) } e.cancelable && e.preventDefault(), e.stopPropagation(), f.isMoved = !0, f.currentX = f.touchesCurrent.x - f.touchesStart.x + f.startX, f.currentY = f.touchesCurrent.y - f.touchesStart.y + f.startY, f.currentX < f.minX && (f.currentX = f.minX + 1 - (f.minX - f.currentX + 1) ** .8), f.currentX > f.maxX && (f.currentX = f.maxX - 1 + (f.currentX - f.maxX + 1) ** .8), f.currentY < f.minY && (f.currentY = f.minY + 1 - (f.minY - f.currentY + 1) ** .8), f.currentY > f.maxY && (f.currentY = f.maxY - 1 + (f.currentY - f.maxY + 1) ** .8), g.prevPositionX || (g.prevPositionX = f.touchesCurrent.x), g.prevPositionY || (g.prevPositionY = f.touchesCurrent.y), g.prevTime || (g.prevTime = Date.now()), g.x = (f.touchesCurrent.x - g.prevPositionX) / (Date.now() - g.prevTime) / 2, g.y = (f.touchesCurrent.y - g.prevPositionY) / (Date.now() - g.prevTime) / 2, Math.abs(f.touchesCurrent.x - g.prevPositionX) < 2 && (g.x = 0), Math.abs(f.touchesCurrent.y - g.prevPositionY) < 2 && (g.y = 0), g.prevPositionX = f.touchesCurrent.x, g.prevPositionY = f.touchesCurrent.y, g.prevTime = Date.now(), m.$imageWrapEl.transform(`translate3d(${f.currentX}px, ${f.currentY}px,0)`) } } function C() { const e = t.zoom; m.$slideEl && t.previousIndex !== t.activeIndex && (m.$imageEl && m.$imageEl.transform("translate3d(0,0,0) scale(1)"), m.$imageWrapEl && m.$imageWrapEl.transform("translate3d(0,0,0)"), e.scale = 1, p = 1, m.$slideEl = void 0, m.$imageEl = void 0, m.$imageWrapEl = void 0) } function T(e) { const s = t.zoom, a = t.params.zoom; if (m.$slideEl || (e && e.target && (m.$slideEl = d(e.target).closest(`.${t.params.slideClass}`)), m.$slideEl || (t.params.virtual && t.params.virtual.enabled && t.virtual ? m.$slideEl = t.$wrapperEl.children(`.${t.params.slideActiveClass}`) : m.$slideEl = t.slides.eq(t.activeIndex)), m.$imageEl = m.$slideEl.find(`.${a.containerClass}`).eq(0).find("picture, img, svg, canvas, .swiper-zoom-target").eq(0), m.$imageWrapEl = m.$imageEl.parent(`.${a.containerClass}`)), !m.$imageEl || 0 === m.$imageEl.length || !m.$imageWrapEl || 0 === m.$imageWrapEl.length) return; let i, r, l, o, c, u, h, g, v, w, b, x, y, E, C, T, $, S; t.params.cssMode && (t.wrapperEl.style.overflow = "hidden", t.wrapperEl.style.touchAction = "none"), m.$slideEl.addClass(`${a.zoomedSlideClass}`), void 0 === f.touchesStart.x && e ? (i = "touchend" === e.type ? e.changedTouches[0].pageX : e.pageX, r = "touchend" === e.type ? e.changedTouches[0].pageY : e.pageY) : (i = f.touchesStart.x, r = f.touchesStart.y), s.scale = m.$imageWrapEl.attr("data-swiper-zoom") || a.maxRatio, p = m.$imageWrapEl.attr("data-swiper-zoom") || a.maxRatio, e ? ($ = m.$slideEl[0].offsetWidth, S = m.$slideEl[0].offsetHeight, l = m.$slideEl.offset().left + n.scrollX, o = m.$slideEl.offset().top + n.scrollY, c = l + $ / 2 - i, u = o + S / 2 - r, v = m.$imageEl[0].offsetWidth, w = m.$imageEl[0].offsetHeight, b = v * s.scale, x = w * s.scale, y = Math.min($ / 2 - b / 2, 0), E = Math.min(S / 2 - x / 2, 0), C = -y, T = -E, h = c * s.scale, g = u * s.scale, h < y && (h = y), h > C && (h = C), g < E && (g = E), g > T && (g = T)) : (h = 0, g = 0), m.$imageWrapEl.transition(300).transform(`translate3d(${h}px, ${g}px,0)`), m.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${s.scale})`) } function $() { const e = t.zoom, s = t.params.zoom; m.$slideEl || (t.params.virtual && t.params.virtual.enabled && t.virtual ? m.$slideEl = t.$wrapperEl.children(`.${t.params.slideActiveClass}`) : m.$slideEl = t.slides.eq(t.activeIndex), m.$imageEl = m.$slideEl.find(`.${s.containerClass}`).eq(0).find("picture, img, svg, canvas, .swiper-zoom-target").eq(0), m.$imageWrapEl = m.$imageEl.parent(`.${s.containerClass}`)), m.$imageEl && 0 !== m.$imageEl.length && m.$imageWrapEl && 0 !== m.$imageWrapEl.length && (t.params.cssMode && (t.wrapperEl.style.overflow = "", t.wrapperEl.style.touchAction = ""), e.scale = 1, p = 1, m.$imageWrapEl.transition(300).transform("translate3d(0,0,0)"), m.$imageEl.transition(300).transform("translate3d(0,0,0) scale(1)"), m.$slideEl.removeClass(`${s.zoomedSlideClass}`), m.$slideEl = void 0) } function S(e) { const s = t.zoom; s.scale && 1 !== s.scale ? $() : T(e) } function M() { const e = t.support; return { passiveListener: !("touchstart" !== t.touchEvents.start || !e.passiveListener || !t.params.passiveListeners) && { passive: !0, capture: !1 }, activeListenerWithCapture: !e.passiveListener || { passive: !1, capture: !0 } } } function P() { return `.${t.params.slideClass}` } function k(e) { const { passiveListener: s } = M(), a = P(); t.$wrapperEl[e]("gesturestart", a, b, s), t.$wrapperEl[e]("gesturechange", a, x, s), t.$wrapperEl[e]("gestureend", a, y, s) } function z() { l || (l = !0, k("on")) } function L() { l && (l = !1, k("off")) } function O() { const e = t.zoom; if (e.enabled) return; e.enabled = !0; const s = t.support, { passiveListener: a, activeListenerWithCapture: i } = M(), r = P(); s.gestures ? (t.$wrapperEl.on(t.touchEvents.start, z, a), t.$wrapperEl.on(t.touchEvents.end, L, a)) : "touchstart" === t.touchEvents.start && (t.$wrapperEl.on(t.touchEvents.start, r, b, a), t.$wrapperEl.on(t.touchEvents.move, r, x, i), t.$wrapperEl.on(t.touchEvents.end, r, y, a), t.touchEvents.cancel && t.$wrapperEl.on(t.touchEvents.cancel, r, y, a)), t.$wrapperEl.on(t.touchEvents.move, `.${t.params.zoom.containerClass}`, E, i) } function I() { const e = t.zoom; if (!e.enabled) return; const s = t.support; e.enabled = !1; const { passiveListener: a, activeListenerWithCapture: i } = M(), r = P(); s.gestures ? (t.$wrapperEl.off(t.touchEvents.start, z, a), t.$wrapperEl.off(t.touchEvents.end, L, a)) : "touchstart" === t.touchEvents.start && (t.$wrapperEl.off(t.touchEvents.start, r, b, a), t.$wrapperEl.off(t.touchEvents.move, r, x, i), t.$wrapperEl.off(t.touchEvents.end, r, y, a), t.touchEvents.cancel && t.$wrapperEl.off(t.touchEvents.cancel, r, y, a)), t.$wrapperEl.off(t.touchEvents.move, `.${t.params.zoom.containerClass}`, E, i) } Object.defineProperty(t.zoom, "scale", { get: () => v, set(e) { if (v !== e) { const t = m.$imageEl ? m.$imageEl[0] : void 0, s = m.$slideEl ? m.$slideEl[0] : void 0; i("zoomChange", e, t, s) } v = e } }), a("init", (() => { t.params.zoom.enabled && O() })), a("destroy", (() => { I() })), a("touchStart", ((e, s) => { t.zoom.enabled && function (e) { const s = t.device; m.$imageEl && 0 !== m.$imageEl.length && (f.isTouched || (s.android && e.cancelable && e.preventDefault(), f.isTouched = !0, f.touchesStart.x = "touchstart" === e.type ? e.targetTouches[0].pageX : e.pageX, f.touchesStart.y = "touchstart" === e.type ? e.targetTouches[0].pageY : e.pageY)) }(s) })), a("touchEnd", ((e, s) => { t.zoom.enabled && function () { const e = t.zoom; if (!m.$imageEl || 0 === m.$imageEl.length) return; if (!f.isTouched || !f.isMoved) return f.isTouched = !1, void (f.isMoved = !1); f.isTouched = !1, f.isMoved = !1; let s = 300, a = 300; const i = g.x * s, r = f.currentX + i, n = g.y * a, l = f.currentY + n; 0 !== g.x && (s = Math.abs((r - f.currentX) / g.x)), 0 !== g.y && (a = Math.abs((l - f.currentY) / g.y)); const o = Math.max(s, a); f.currentX = r, f.currentY = l; const d = f.width * e.scale, c = f.height * e.scale; f.minX = Math.min(m.slideWidth / 2 - d / 2, 0), f.maxX = -f.minX, f.minY = Math.min(m.slideHeight / 2 - c / 2, 0), f.maxY = -f.minY, f.currentX = Math.max(Math.min(f.currentX, f.maxX), f.minX), f.currentY = Math.max(Math.min(f.currentY, f.maxY), f.minY), m.$imageWrapEl.transition(o).transform(`translate3d(${f.currentX}px, ${f.currentY}px,0)`) }() })), a("doubleTap", ((e, s) => { !t.animating && t.params.zoom.enabled && t.zoom.enabled && t.params.zoom.toggle && S(s) })), a("transitionEnd", (() => { t.zoom.enabled && t.params.zoom.enabled && C() })), a("slideChange", (() => { t.zoom.enabled && t.params.zoom.enabled && t.params.cssMode && C() })), Object.assign(t.zoom, { enable: O, disable: I, in: T, out: $, toggle: S }) }, function (e) { let { swiper: t, extendParams: s, on: a, emit: i } = e; s({ lazy: { checkInView: !1, enabled: !1, loadPrevNext: !1, loadPrevNextAmount: 1, loadOnTransitionStart: !1, scrollingElement: "", elementClass: "swiper-lazy", loadingClass: "swiper-lazy-loading", loadedClass: "swiper-lazy-loaded", preloaderClass: "swiper-lazy-preloader" } }), t.lazy = {}; let n = !1, l = !1; function o(e, s) { void 0 === s && (s = !0); const a = t.params.lazy; if (void 0 === e) return; if (0 === t.slides.length) return; const r = t.virtual && t.params.virtual.enabled ? t.$wrapperEl.children(`.${t.params.slideClass}[data-swiper-slide-index="${e}"]`) : t.slides.eq(e), n = r.find(`.${a.elementClass}:not(.${a.loadedClass}):not(.${a.loadingClass})`); !r.hasClass(a.elementClass) || r.hasClass(a.loadedClass) || r.hasClass(a.loadingClass) || n.push(r[0]), 0 !== n.length && n.each((e => { const n = d(e); n.addClass(a.loadingClass); const l = n.attr("data-background"), c = n.attr("data-src"), p = n.attr("data-srcset"), u = n.attr("data-sizes"), h = n.parent("picture"); t.loadImage(n[0], c || l, p, u, !1, (() => { if (null != t && t && (!t || t.params) && !t.destroyed) { if (l ? (n.css("background-image", `url("${l}")`), n.removeAttr("data-background")) : (p && (n.attr("srcset", p), n.removeAttr("data-srcset")), u && (n.attr("sizes", u), n.removeAttr("data-sizes")), h.length && h.children("source").each((e => { const t = d(e); t.attr("data-srcset") && (t.attr("srcset", t.attr("data-srcset")), t.removeAttr("data-srcset")) })), c && (n.attr("src", c), n.removeAttr("data-src"))), n.addClass(a.loadedClass).removeClass(a.loadingClass), r.find(`.${a.preloaderClass}`).remove(), t.params.loop && s) { const e = r.attr("data-swiper-slide-index"); if (r.hasClass(t.params.slideDuplicateClass)) { o(t.$wrapperEl.children(`[data-swiper-slide-index="${e}"]:not(.${t.params.slideDuplicateClass})`).index(), !1) } else { o(t.$wrapperEl.children(`.${t.params.slideDuplicateClass}[data-swiper-slide-index="${e}"]`).index(), !1) } } i("lazyImageReady", r[0], n[0]), t.params.autoHeight && t.updateAutoHeight() } })), i("lazyImageLoad", r[0], n[0]) })) } function c() { const { $wrapperEl: e, params: s, slides: a, activeIndex: i } = t, r = t.virtual && s.virtual.enabled, n = s.lazy; let c = s.slidesPerView; function p(t) { if (r) { if (e.children(`.${s.slideClass}[data-swiper-slide-index="${t}"]`).length) return !0 } else if (a[t]) return !0; return !1 } function u(e) { return r ? d(e).attr("data-swiper-slide-index") : d(e).index() } if ("auto" === c && (c = 0), l || (l = !0), t.params.watchSlidesProgress) e.children(`.${s.slideVisibleClass}`).each((e => { o(r ? d(e).attr("data-swiper-slide-index") : d(e).index()) })); else if (c > 1) for (let e = i; e < i + c; e += 1)p(e) && o(e); else o(i); if (n.loadPrevNext) if (c > 1 || n.loadPrevNextAmount && n.loadPrevNextAmount > 1) { const e = n.loadPrevNextAmount, t = Math.ceil(c), s = Math.min(i + t + Math.max(e, t), a.length), r = Math.max(i - Math.max(t, e), 0); for (let e = i + t; e < s; e += 1)p(e) && o(e); for (let e = r; e < i; e += 1)p(e) && o(e) } else { const t = e.children(`.${s.slideNextClass}`); t.length > 0 && o(u(t)); const a = e.children(`.${s.slidePrevClass}`); a.length > 0 && o(u(a)) } } function p() { const e = r(); if (!t || t.destroyed) return; const s = t.params.lazy.scrollingElement ? d(t.params.lazy.scrollingElement) : d(e), a = s[0] === e, i = a ? e.innerWidth : s[0].offsetWidth, l = a ? e.innerHeight : s[0].offsetHeight, o = t.$el.offset(), { rtlTranslate: u } = t; let h = !1; u && (o.left -= t.$el[0].scrollLeft); const m = [[o.left, o.top], [o.left + t.width, o.top], [o.left, o.top + t.height], [o.left + t.width, o.top + t.height]]; for (let e = 0; e < m.length; e += 1) { const t = m[e]; if (t[0] >= 0 && t[0] <= i && t[1] >= 0 && t[1] <= l) { if (0 === t[0] && 0 === t[1]) continue; h = !0 } } const f = !("touchstart" !== t.touchEvents.start || !t.support.passiveListener || !t.params.passiveListeners) && { passive: !0, capture: !1 }; h ? (c(), s.off("scroll", p, f)) : n || (n = !0, s.on("scroll", p, f)) } a("beforeInit", (() => { t.params.lazy.enabled && t.params.preloadImages && (t.params.preloadImages = !1) })), a("init", (() => { t.params.lazy.enabled && (t.params.lazy.checkInView ? p() : c()) })), a("scroll", (() => { t.params.freeMode && t.params.freeMode.enabled && !t.params.freeMode.sticky && c() })), a("scrollbarDragMove resize _freeModeNoMomentumRelease", (() => { t.params.lazy.enabled && (t.params.lazy.checkInView ? p() : c()) })), a("transitionStart", (() => { t.params.lazy.enabled && (t.params.lazy.loadOnTransitionStart || !t.params.lazy.loadOnTransitionStart && !l) && (t.params.lazy.checkInView ? p() : c()) })), a("transitionEnd", (() => { t.params.lazy.enabled && !t.params.lazy.loadOnTransitionStart && (t.params.lazy.checkInView ? p() : c()) })), a("slideChange", (() => { const { lazy: e, cssMode: s, watchSlidesProgress: a, touchReleaseOnEdges: i, resistanceRatio: r } = t.params; e.enabled && (s || a && (i || 0 === r)) && c() })), a("destroy", (() => { t.$el && t.$el.find(`.${t.params.lazy.loadingClass}`).removeClass(t.params.lazy.loadingClass) })), Object.assign(t.lazy, { load: c, loadInSlide: o }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; function i(e, t) { const s = function () { let e, t, s; return (a, i) => { for (t = -1, e = a.length; e - t > 1;)s = e + t >> 1, a[s] <= i ? t = s : e = s; return e } }(); let a, i; return this.x = e, this.y = t, this.lastIndex = e.length - 1, this.interpolate = function (e) { return e ? (i = s(this.x, e), a = i - 1, (e - this.x[a]) * (this.y[i] - this.y[a]) / (this.x[i] - this.x[a]) + this.y[a]) : 0 }, this } function r() { t.controller.control && t.controller.spline && (t.controller.spline = void 0, delete t.controller.spline) } s({ controller: { control: void 0, inverse: !1, by: "slide" } }), t.controller = { control: void 0 }, a("beforeInit", (() => { t.controller.control = t.params.controller.control })), a("update", (() => { r() })), a("resize", (() => { r() })), a("observerUpdate", (() => { r() })), a("setTranslate", ((e, s, a) => { t.controller.control && t.controller.setTranslate(s, a) })), a("setTransition", ((e, s, a) => { t.controller.control && t.controller.setTransition(s, a) })), Object.assign(t.controller, { setTranslate: function (e, s) { const a = t.controller.control; let r, n; const l = t.constructor; function o(e) { const s = t.rtlTranslate ? -t.translate : t.translate; "slide" === t.params.controller.by && (!function (e) { t.controller.spline || (t.controller.spline = t.params.loop ? new i(t.slidesGrid, e.slidesGrid) : new i(t.snapGrid, e.snapGrid)) }(e), n = -t.controller.spline.interpolate(-s)), n && "container" !== t.params.controller.by || (r = (e.maxTranslate() - e.minTranslate()) / (t.maxTranslate() - t.minTranslate()), n = (s - t.minTranslate()) * r + e.minTranslate()), t.params.controller.inverse && (n = e.maxTranslate() - n), e.updateProgress(n), e.setTranslate(n, t), e.updateActiveIndex(), e.updateSlidesClasses() } if (Array.isArray(a)) for (let e = 0; e < a.length; e += 1)a[e] !== s && a[e] instanceof l && o(a[e]); else a instanceof l && s !== a && o(a) }, setTransition: function (e, s) { const a = t.constructor, i = t.controller.control; let r; function n(s) { s.setTransition(e, t), 0 !== e && (s.transitionStart(), s.params.autoHeight && p((() => { s.updateAutoHeight() })), s.$wrapperEl.transitionEnd((() => { i && (s.params.loop && "slide" === t.params.controller.by && s.loopFix(), s.transitionEnd()) }))) } if (Array.isArray(i)) for (r = 0; r < i.length; r += 1)i[r] !== s && i[r] instanceof a && n(i[r]); else i instanceof a && s !== i && n(i) } }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ a11y: { enabled: !0, notificationClass: "swiper-notification", prevSlideMessage: "Previous slide", nextSlideMessage: "Next slide", firstSlideMessage: "This is the first slide", lastSlideMessage: "This is the last slide", paginationBulletMessage: "Go to slide {{index}}", slideLabelMessage: "{{index}} / {{slidesLength}}", containerMessage: null, containerRoleDescriptionMessage: null, itemRoleDescriptionMessage: null, slideRole: "group", id: null } }), t.a11y = { clicked: !1 }; let i = null; function r(e) { const t = i; 0 !== t.length && (t.html(""), t.html(e)) } function n(e) { e.attr("tabIndex", "0") } function l(e) { e.attr("tabIndex", "-1") } function o(e, t) { e.attr("role", t) } function c(e, t) { e.attr("aria-roledescription", t) } function p(e, t) { e.attr("aria-label", t) } function u(e) { e.attr("aria-disabled", !0) } function h(e) { e.attr("aria-disabled", !1) } function m(e) { if (13 !== e.keyCode && 32 !== e.keyCode) return; const s = t.params.a11y, a = d(e.target); t.navigation && t.navigation.$nextEl && a.is(t.navigation.$nextEl) && (t.isEnd && !t.params.loop || t.slideNext(), t.isEnd ? r(s.lastSlideMessage) : r(s.nextSlideMessage)), t.navigation && t.navigation.$prevEl && a.is(t.navigation.$prevEl) && (t.isBeginning && !t.params.loop || t.slidePrev(), t.isBeginning ? r(s.firstSlideMessage) : r(s.prevSlideMessage)), t.pagination && a.is(U(t.params.pagination.bulletClass)) && a[0].click() } function f() { return t.pagination && t.pagination.bullets && t.pagination.bullets.length } function g() { return f() && t.params.pagination.clickable } const v = (e, t, s) => { n(e), "BUTTON" !== e[0].tagName && (o(e, "button"), e.on("keydown", m)), p(e, s), function (e, t) { e.attr("aria-controls", t) }(e, t) }, w = () => { t.a11y.clicked = !0 }, b = () => { requestAnimationFrame((() => { requestAnimationFrame((() => { t.a11y.clicked = !1 })) })) }, x = e => { if (t.a11y.clicked) return; const s = e.target.closest(`.${t.params.slideClass}`); if (!s || !t.slides.includes(s)) return; const a = t.slides.indexOf(s) === t.activeIndex, i = t.params.watchSlidesProgress && t.visibleSlides && t.visibleSlides.includes(s); a || i || (t.isHorizontal() ? t.el.scrollLeft = 0 : t.el.scrollTop = 0, t.slideTo(t.slides.indexOf(s), 0)) }, y = () => { const e = t.params.a11y; e.itemRoleDescriptionMessage && c(d(t.slides), e.itemRoleDescriptionMessage), e.slideRole && o(d(t.slides), e.slideRole); const s = t.params.loop ? t.slides.filter((e => !e.classList.contains(t.params.slideDuplicateClass))).length : t.slides.length; e.slideLabelMessage && t.slides.each(((a, i) => { const r = d(a), n = t.params.loop ? parseInt(r.attr("data-swiper-slide-index"), 10) : i; p(r, e.slideLabelMessage.replace(/\{\{index\}\}/, n + 1).replace(/\{\{slidesLength\}\}/, s)) })) }, E = () => { const e = t.params.a11y; t.$el.append(i); const s = t.$el; e.containerRoleDescriptionMessage && c(s, e.containerRoleDescriptionMessage), e.containerMessage && p(s, e.containerMessage); const a = t.$wrapperEl, r = e.id || a.attr("id") || `swiper-wrapper-${n = 16, void 0 === n && (n = 16), "x".repeat(n).replace(/x/g, (() => Math.round(16 * Math.random()).toString(16)))}`; var n; const l = t.params.autoplay && t.params.autoplay.enabled ? "off" : "polite"; var o; let d, u; o = r, a.attr("id", o), function (e, t) { e.attr("aria-live", t) }(a, l), y(), t.navigation && t.navigation.$nextEl && (d = t.navigation.$nextEl), t.navigation && t.navigation.$prevEl && (u = t.navigation.$prevEl), d && d.length && v(d, r, e.nextSlideMessage), u && u.length && v(u, r, e.prevSlideMessage), g() && t.pagination.$el.on("keydown", U(t.params.pagination.bulletClass), m), t.$el.on("focus", x, !0), t.$el.on("pointerdown", w, !0), t.$el.on("pointerup", b, !0) }; a("beforeInit", (() => { i = d(`<span class="${t.params.a11y.notificationClass}" aria-live="assertive" aria-atomic="true"></span>`) })), a("afterInit", (() => { t.params.a11y.enabled && E() })), a("slidesLengthChange snapGridLengthChange slidesGridLengthChange", (() => { t.params.a11y.enabled && y() })), a("fromEdge toEdge afterInit lock unlock", (() => { t.params.a11y.enabled && function () { if (t.params.loop || t.params.rewind || !t.navigation) return; const { $nextEl: e, $prevEl: s } = t.navigation; s && s.length > 0 && (t.isBeginning ? (u(s), l(s)) : (h(s), n(s))), e && e.length > 0 && (t.isEnd ? (u(e), l(e)) : (h(e), n(e))) }() })), a("paginationUpdate", (() => { t.params.a11y.enabled && function () { const e = t.params.a11y; f() && t.pagination.bullets.each((s => { const a = d(s); t.params.pagination.clickable && (n(a), t.params.pagination.renderBullet || (o(a, "button"), p(a, e.paginationBulletMessage.replace(/\{\{index\}\}/, a.index() + 1)))), a.is(`.${t.params.pagination.bulletActiveClass}`) ? a.attr("aria-current", "true") : a.removeAttr("aria-current") })) }() })), a("destroy", (() => { t.params.a11y.enabled && function () { let e, s; i && i.length > 0 && i.remove(), t.navigation && t.navigation.$nextEl && (e = t.navigation.$nextEl), t.navigation && t.navigation.$prevEl && (s = t.navigation.$prevEl), e && e.off("keydown", m), s && s.off("keydown", m), g() && t.pagination.$el.off("keydown", U(t.params.pagination.bulletClass), m), t.$el.off("focus", x, !0), t.$el.off("pointerdown", w, !0), t.$el.off("pointerup", b, !0) }() })) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ history: { enabled: !1, root: "", replaceState: !1, key: "slides", keepQuery: !1 } }); let i = !1, n = {}; const l = e => e.toString().replace(/\s+/g, "-").replace(/[^\w-]+/g, "").replace(/--+/g, "-").replace(/^-+/, "").replace(/-+$/, ""), o = e => { const t = r(); let s; s = e ? new URL(e) : t.location; const a = s.pathname.slice(1).split("/").filter((e => "" !== e)), i = a.length; return { key: a[i - 2], value: a[i - 1] } }, d = (e, s) => { const a = r(); if (!i || !t.params.history.enabled) return; let n; n = t.params.url ? new URL(t.params.url) : a.location; const o = t.slides.eq(s); let d = l(o.attr("data-history")); if (t.params.history.root.length > 0) { let s = t.params.history.root; "/" === s[s.length - 1] && (s = s.slice(0, s.length - 1)), d = `${s}/${e}/${d}` } else n.pathname.includes(e) || (d = `${e}/${d}`); t.params.history.keepQuery && (d += n.search); const c = a.history.state; c && c.value === d || (t.params.history.replaceState ? a.history.replaceState({ value: d }, null, d) : a.history.pushState({ value: d }, null, d)) }, c = (e, s, a) => { if (s) for (let i = 0, r = t.slides.length; i < r; i += 1) { const r = t.slides.eq(i); if (l(r.attr("data-history")) === s && !r.hasClass(t.params.slideDuplicateClass)) { const s = r.index(); t.slideTo(s, e, a) } } else t.slideTo(0, e, a) }, p = () => { n = o(t.params.url), c(t.params.speed, n.value, !1) }; a("init", (() => { t.params.history.enabled && (() => { const e = r(); if (t.params.history) { if (!e.history || !e.history.pushState) return t.params.history.enabled = !1, void (t.params.hashNavigation.enabled = !0); i = !0, n = o(t.params.url), (n.key || n.value) && (c(0, n.value, t.params.runCallbacksOnInit), t.params.history.replaceState || e.addEventListener("popstate", p)) } })() })), a("destroy", (() => { t.params.history.enabled && (() => { const e = r(); t.params.history.replaceState || e.removeEventListener("popstate", p) })() })), a("transitionEnd _freeModeNoMomentumRelease", (() => { i && d(t.params.history.key, t.activeIndex) })), a("slideChange", (() => { i && t.params.cssMode && d(t.params.history.key, t.activeIndex) })) }, function (e) { let { swiper: t, extendParams: s, emit: i, on: n } = e, l = !1; const o = a(), c = r(); s({ hashNavigation: { enabled: !1, replaceState: !1, watchState: !1 } }); const p = () => { i("hashChange"); const e = o.location.hash.replace("#", ""); if (e !== t.slides.eq(t.activeIndex).attr("data-hash")) { const s = t.$wrapperEl.children(`.${t.params.slideClass}[data-hash="${e}"]`).index(); if (void 0 === s) return; t.slideTo(s) } }, u = () => { if (l && t.params.hashNavigation.enabled) if (t.params.hashNavigation.replaceState && c.history && c.history.replaceState) c.history.replaceState(null, null, `#${t.slides.eq(t.activeIndex).attr("data-hash")}` || ""), i("hashSet"); else { const e = t.slides.eq(t.activeIndex), s = e.attr("data-hash") || e.attr("data-history"); o.location.hash = s || "", i("hashSet") } }; n("init", (() => { t.params.hashNavigation.enabled && (() => { if (!t.params.hashNavigation.enabled || t.params.history && t.params.history.enabled) return; l = !0; const e = o.location.hash.replace("#", ""); if (e) { const s = 0; for (let a = 0, i = t.slides.length; a < i; a += 1) { const i = t.slides.eq(a); if ((i.attr("data-hash") || i.attr("data-history")) === e && !i.hasClass(t.params.slideDuplicateClass)) { const e = i.index(); t.slideTo(e, s, t.params.runCallbacksOnInit, !0) } } } t.params.hashNavigation.watchState && d(c).on("hashchange", p) })() })), n("destroy", (() => { t.params.hashNavigation.enabled && t.params.hashNavigation.watchState && d(c).off("hashchange", p) })), n("transitionEnd _freeModeNoMomentumRelease", (() => { l && u() })), n("slideChange", (() => { l && t.params.cssMode && u() })) }, function (e) { let t, { swiper: s, extendParams: i, on: r, emit: n } = e; function l() { if (!s.size) return s.autoplay.running = !1, void (s.autoplay.paused = !1); const e = s.slides.eq(s.activeIndex); let a = s.params.autoplay.delay; e.attr("data-swiper-autoplay") && (a = e.attr("data-swiper-autoplay") || s.params.autoplay.delay), clearTimeout(t), t = p((() => { let e; s.params.autoplay.reverseDirection ? s.params.loop ? (s.loopFix(), e = s.slidePrev(s.params.speed, !0, !0), n("autoplay")) : s.isBeginning ? s.params.autoplay.stopOnLastSlide ? d() : (e = s.slideTo(s.slides.length - 1, s.params.speed, !0, !0), n("autoplay")) : (e = s.slidePrev(s.params.speed, !0, !0), n("autoplay")) : s.params.loop ? (s.loopFix(), e = s.slideNext(s.params.speed, !0, !0), n("autoplay")) : s.isEnd ? s.params.autoplay.stopOnLastSlide ? d() : (e = s.slideTo(0, s.params.speed, !0, !0), n("autoplay")) : (e = s.slideNext(s.params.speed, !0, !0), n("autoplay")), (s.params.cssMode && s.autoplay.running || !1 === e) && l() }), a) } function o() { return void 0 === t && (!s.autoplay.running && (s.autoplay.running = !0, n("autoplayStart"), l(), !0)) } function d() { return !!s.autoplay.running && (void 0 !== t && (t && (clearTimeout(t), t = void 0), s.autoplay.running = !1, n("autoplayStop"), !0)) } function c(e) { s.autoplay.running && (s.autoplay.paused || (t && clearTimeout(t), s.autoplay.paused = !0, 0 !== e && s.params.autoplay.waitForTransition ? ["transitionend", "webkitTransitionEnd"].forEach((e => { s.$wrapperEl[0].addEventListener(e, h) })) : (s.autoplay.paused = !1, l()))) } function u() { const e = a(); "hidden" === e.visibilityState && s.autoplay.running && c(), "visible" === e.visibilityState && s.autoplay.paused && (l(), s.autoplay.paused = !1) } function h(e) { s && !s.destroyed && s.$wrapperEl && e.target === s.$wrapperEl[0] && (["transitionend", "webkitTransitionEnd"].forEach((e => { s.$wrapperEl[0].removeEventListener(e, h) })), s.autoplay.paused = !1, s.autoplay.running ? l() : d()) } function m() { s.params.autoplay.disableOnInteraction ? d() : (n("autoplayPause"), c()), ["transitionend", "webkitTransitionEnd"].forEach((e => { s.$wrapperEl[0].removeEventListener(e, h) })) } function f() { s.params.autoplay.disableOnInteraction || (s.autoplay.paused = !1, n("autoplayResume"), l()) } s.autoplay = { running: !1, paused: !1 }, i({ autoplay: { enabled: !1, delay: 3e3, waitForTransition: !0, disableOnInteraction: !0, stopOnLastSlide: !1, reverseDirection: !1, pauseOnMouseEnter: !1 } }), r("init", (() => { if (s.params.autoplay.enabled) { o(); a().addEventListener("visibilitychange", u), s.params.autoplay.pauseOnMouseEnter && (s.$el.on("mouseenter", m), s.$el.on("mouseleave", f)) } })), r("beforeTransitionStart", ((e, t, a) => { s.autoplay.running && (a || !s.params.autoplay.disableOnInteraction ? s.autoplay.pause(t) : d()) })), r("sliderFirstMove", (() => { s.autoplay.running && (s.params.autoplay.disableOnInteraction ? d() : c()) })), r("touchEnd", (() => { s.params.cssMode && s.autoplay.paused && !s.params.autoplay.disableOnInteraction && l() })), r("destroy", (() => { s.$el.off("mouseenter", m), s.$el.off("mouseleave", f), s.autoplay.running && d(); a().removeEventListener("visibilitychange", u) })), Object.assign(s.autoplay, { pause: c, run: l, start: o, stop: d }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ thumbs: { swiper: null, multipleActiveThumbs: !0, autoScrollOffset: 0, slideThumbActiveClass: "swiper-slide-thumb-active", thumbsContainerClass: "swiper-thumbs" } }); let i = !1, r = !1; function n() { const e = t.thumbs.swiper; if (!e || e.destroyed) return; const s = e.clickedIndex, a = e.clickedSlide; if (a && d(a).hasClass(t.params.thumbs.slideThumbActiveClass)) return; if (null == s) return; let i; if (i = e.params.loop ? parseInt(d(e.clickedSlide).attr("data-swiper-slide-index"), 10) : s, t.params.loop) { let e = t.activeIndex; t.slides.eq(e).hasClass(t.params.slideDuplicateClass) && (t.loopFix(), t._clientLeft = t.$wrapperEl[0].clientLeft, e = t.activeIndex); const s = t.slides.eq(e).prevAll(`[data-swiper-slide-index="${i}"]`).eq(0).index(), a = t.slides.eq(e).nextAll(`[data-swiper-slide-index="${i}"]`).eq(0).index(); i = void 0 === s ? a : void 0 === a ? s : a - e < e - s ? a : s } t.slideTo(i) } function l() { const { thumbs: e } = t.params; if (i) return !1; i = !0; const s = t.constructor; if (e.swiper instanceof s) t.thumbs.swiper = e.swiper, Object.assign(t.thumbs.swiper.originalParams, { watchSlidesProgress: !0, slideToClickedSlide: !1 }), Object.assign(t.thumbs.swiper.params, { watchSlidesProgress: !0, slideToClickedSlide: !1 }); else if (m(e.swiper)) { const a = Object.assign({}, e.swiper); Object.assign(a, { watchSlidesProgress: !0, slideToClickedSlide: !1 }), t.thumbs.swiper = new s(a), r = !0 } return t.thumbs.swiper.$el.addClass(t.params.thumbs.thumbsContainerClass), t.thumbs.swiper.on("tap", n), !0 } function o(e) { const s = t.thumbs.swiper; if (!s || s.destroyed) return; const a = "auto" === s.params.slidesPerView ? s.slidesPerViewDynamic() : s.params.slidesPerView; let i = 1; const r = t.params.thumbs.slideThumbActiveClass; if (t.params.slidesPerView > 1 && !t.params.centeredSlides && (i = t.params.slidesPerView), t.params.thumbs.multipleActiveThumbs || (i = 1), i = Math.floor(i), s.slides.removeClass(r), s.params.loop || s.params.virtual && s.params.virtual.enabled) for (let e = 0; e < i; e += 1)s.$wrapperEl.children(`[data-swiper-slide-index="${t.realIndex + e}"]`).addClass(r); else for (let e = 0; e < i; e += 1)s.slides.eq(t.realIndex + e).addClass(r); const n = t.params.thumbs.autoScrollOffset, l = n && !s.params.loop; if (t.realIndex !== s.realIndex || l) { let i, r, o = s.activeIndex; if (s.params.loop) { s.slides.eq(o).hasClass(s.params.slideDuplicateClass) && (s.loopFix(), s._clientLeft = s.$wrapperEl[0].clientLeft, o = s.activeIndex); const e = s.slides.eq(o).prevAll(`[data-swiper-slide-index="${t.realIndex}"]`).eq(0).index(), a = s.slides.eq(o).nextAll(`[data-swiper-slide-index="${t.realIndex}"]`).eq(0).index(); i = void 0 === e ? a : void 0 === a ? e : a - o == o - e ? s.params.slidesPerGroup > 1 ? a : o : a - o < o - e ? a : e, r = t.activeIndex > t.previousIndex ? "next" : "prev" } else i = t.realIndex, r = i > t.previousIndex ? "next" : "prev"; l && (i += "next" === r ? n : -1 * n), s.visibleSlidesIndexes && s.visibleSlidesIndexes.indexOf(i) < 0 && (s.params.centeredSlides ? i = i > o ? i - Math.floor(a / 2) + 1 : i + Math.floor(a / 2) - 1 : i > o && s.params.slidesPerGroup, s.slideTo(i, e ? 0 : void 0)) } } t.thumbs = { swiper: null }, a("beforeInit", (() => { const { thumbs: e } = t.params; e && e.swiper && (l(), o(!0)) })), a("slideChange update resize observerUpdate", (() => { o() })), a("setTransition", ((e, s) => { const a = t.thumbs.swiper; a && !a.destroyed && a.setTransition(s) })), a("beforeDestroy", (() => { const e = t.thumbs.swiper; e && !e.destroyed && r && e.destroy() })), Object.assign(t.thumbs, { init: l, update: o }) }, function (e) { let { swiper: t, extendParams: s, emit: a, once: i } = e; s({ freeMode: { enabled: !1, momentum: !0, momentumRatio: 1, momentumBounce: !0, momentumBounceRatio: 1, momentumVelocityRatio: 1, sticky: !1, minimumVelocity: .02 } }), Object.assign(t, { freeMode: { onTouchStart: function () { const e = t.getTranslate(); t.setTranslate(e), t.setTransition(0), t.touchEventsData.velocities.length = 0, t.freeMode.onTouchEnd({ currentPos: t.rtl ? t.translate : -t.translate }) }, onTouchMove: function () { const { touchEventsData: e, touches: s } = t; 0 === e.velocities.length && e.velocities.push({ position: s[t.isHorizontal() ? "startX" : "startY"], time: e.touchStartTime }), e.velocities.push({ position: s[t.isHorizontal() ? "currentX" : "currentY"], time: u() }) }, onTouchEnd: function (e) { let { currentPos: s } = e; const { params: r, $wrapperEl: n, rtlTranslate: l, snapGrid: o, touchEventsData: d } = t, c = u() - d.touchStartTime; if (s < -t.minTranslate()) t.slideTo(t.activeIndex); else if (s > -t.maxTranslate()) t.slides.length < o.length ? t.slideTo(o.length - 1) : t.slideTo(t.slides.length - 1); else { if (r.freeMode.momentum) { if (d.velocities.length > 1) { const e = d.velocities.pop(), s = d.velocities.pop(), a = e.position - s.position, i = e.time - s.time; t.velocity = a / i, t.velocity /= 2, Math.abs(t.velocity) < r.freeMode.minimumVelocity && (t.velocity = 0), (i > 150 || u() - e.time > 300) && (t.velocity = 0) } else t.velocity = 0; t.velocity *= r.freeMode.momentumVelocityRatio, d.velocities.length = 0; let e = 1e3 * r.freeMode.momentumRatio; const s = t.velocity * e; let c = t.translate + s; l && (c = -c); let p, h = !1; const m = 20 * Math.abs(t.velocity) * r.freeMode.momentumBounceRatio; let f; if (c < t.maxTranslate()) r.freeMode.momentumBounce ? (c + t.maxTranslate() < -m && (c = t.maxTranslate() - m), p = t.maxTranslate(), h = !0, d.allowMomentumBounce = !0) : c = t.maxTranslate(), r.loop && r.centeredSlides && (f = !0); else if (c > t.minTranslate()) r.freeMode.momentumBounce ? (c - t.minTranslate() > m && (c = t.minTranslate() + m), p = t.minTranslate(), h = !0, d.allowMomentumBounce = !0) : c = t.minTranslate(), r.loop && r.centeredSlides && (f = !0); else if (r.freeMode.sticky) { let e; for (let t = 0; t < o.length; t += 1)if (o[t] > -c) { e = t; break } c = Math.abs(o[e] - c) < Math.abs(o[e - 1] - c) || "next" === t.swipeDirection ? o[e] : o[e - 1], c = -c } if (f && i("transitionEnd", (() => { t.loopFix() })), 0 !== t.velocity) { if (e = l ? Math.abs((-c - t.translate) / t.velocity) : Math.abs((c - t.translate) / t.velocity), r.freeMode.sticky) { const s = Math.abs((l ? -c : c) - t.translate), a = t.slidesSizesGrid[t.activeIndex]; e = s < a ? r.speed : s < 2 * a ? 1.5 * r.speed : 2.5 * r.speed } } else if (r.freeMode.sticky) return void t.slideToClosest(); r.freeMode.momentumBounce && h ? (t.updateProgress(p), t.setTransition(e), t.setTranslate(c), t.transitionStart(!0, t.swipeDirection), t.animating = !0, n.transitionEnd((() => { t && !t.destroyed && d.allowMomentumBounce && (a("momentumBounce"), t.setTransition(r.speed), setTimeout((() => { t.setTranslate(p), n.transitionEnd((() => { t && !t.destroyed && t.transitionEnd() })) }), 0)) }))) : t.velocity ? (a("_freeModeNoMomentumRelease"), t.updateProgress(c), t.setTransition(e), t.setTranslate(c), t.transitionStart(!0, t.swipeDirection), t.animating || (t.animating = !0, n.transitionEnd((() => { t && !t.destroyed && t.transitionEnd() })))) : t.updateProgress(c), t.updateActiveIndex(), t.updateSlidesClasses() } else { if (r.freeMode.sticky) return void t.slideToClosest(); r.freeMode && a("_freeModeNoMomentumRelease") } (!r.freeMode.momentum || c >= r.longSwipesMs) && (t.updateProgress(), t.updateActiveIndex(), t.updateSlidesClasses()) } } } }) }, function (e) { let t, s, a, { swiper: i, extendParams: r } = e; r({ grid: { rows: 1, fill: "column" } }), i.grid = { initSlides: e => { const { slidesPerView: r } = i.params, { rows: n, fill: l } = i.params.grid; s = t / n, a = Math.floor(e / n), t = Math.floor(e / n) === e / n ? e : Math.ceil(e / n) * n, "auto" !== r && "row" === l && (t = Math.max(t, r * n)) }, updateSlide: (e, r, n, l) => { const { slidesPerGroup: o, spaceBetween: d } = i.params, { rows: c, fill: p } = i.params.grid; let u, h, m; if ("row" === p && o > 1) { const s = Math.floor(e / (o * c)), a = e - c * o * s, i = 0 === s ? o : Math.min(Math.ceil((n - s * c * o) / c), o); m = Math.floor(a / i), h = a - m * i + s * o, u = h + m * t / c, r.css({ "-webkit-order": u, order: u }) } else "column" === p ? (h = Math.floor(e / c), m = e - h * c, (h > a || h === a && m === c - 1) && (m += 1, m >= c && (m = 0, h += 1))) : (m = Math.floor(e / s), h = e - m * s); r.css(l("margin-top"), 0 !== m ? d && `${d}px` : "") }, updateWrapperSize: (e, s, a) => { const { spaceBetween: r, centeredSlides: n, roundLengths: l } = i.params, { rows: o } = i.params.grid; if (i.virtualSize = (e + r) * t, i.virtualSize = Math.ceil(i.virtualSize / o) - r, i.$wrapperEl.css({ [a("width")]: `${i.virtualSize + r}px` }), n) { s.splice(0, s.length); const e = []; for (let t = 0; t < s.length; t += 1) { let a = s[t]; l && (a = Math.floor(a)), s[t] < i.virtualSize + s[0] && e.push(a) } s.push(...e) } } } }, function (e) { let { swiper: t } = e; Object.assign(t, { appendSlide: K.bind(t), prependSlide: Z.bind(t), addSlide: Q.bind(t), removeSlide: J.bind(t), removeAllSlides: ee.bind(t) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ fadeEffect: { crossFade: !1, transformEl: null } }), te({ effect: "fade", swiper: t, on: a, setTranslate: () => { const { slides: e } = t, s = t.params.fadeEffect; for (let a = 0; a < e.length; a += 1) { const e = t.slides.eq(a); let i = -e[0].swiperSlideOffset; t.params.virtualTranslate || (i -= t.translate); let r = 0; t.isHorizontal() || (r = i, i = 0); const n = t.params.fadeEffect.crossFade ? Math.max(1 - Math.abs(e[0].progress), 0) : 1 + Math.min(Math.max(e[0].progress, -1), 0); se(s, e).css({ opacity: n }).transform(`translate3d(${i}px, ${r}px, 0px)`) } }, setTransition: e => { const { transformEl: s } = t.params.fadeEffect; (s ? t.slides.find(s) : t.slides).transition(e), ae({ swiper: t, duration: e, transformEl: s, allSlides: !0 }) }, overwriteParams: () => ({ slidesPerView: 1, slidesPerGroup: 1, watchSlidesProgress: !0, spaceBetween: 0, virtualTranslate: !t.params.cssMode }) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ cubeEffect: { slideShadows: !0, shadow: !0, shadowOffset: 20, shadowScale: .94 } }); const i = (e, t, s) => { let a = s ? e.find(".swiper-slide-shadow-left") : e.find(".swiper-slide-shadow-top"), i = s ? e.find(".swiper-slide-shadow-right") : e.find(".swiper-slide-shadow-bottom"); 0 === a.length && (a = d(`<div class="swiper-slide-shadow-${s ? "left" : "top"}"></div>`), e.append(a)), 0 === i.length && (i = d(`<div class="swiper-slide-shadow-${s ? "right" : "bottom"}"></div>`), e.append(i)), a.length && (a[0].style.opacity = Math.max(-t, 0)), i.length && (i[0].style.opacity = Math.max(t, 0)) }; te({ effect: "cube", swiper: t, on: a, setTranslate: () => { const { $el: e, $wrapperEl: s, slides: a, width: r, height: n, rtlTranslate: l, size: o, browser: c } = t, p = t.params.cubeEffect, u = t.isHorizontal(), h = t.virtual && t.params.virtual.enabled; let m, f = 0; p.shadow && (u ? (m = s.find(".swiper-cube-shadow"), 0 === m.length && (m = d('<div class="swiper-cube-shadow"></div>'), s.append(m)), m.css({ height: `${r}px` })) : (m = e.find(".swiper-cube-shadow"), 0 === m.length && (m = d('<div class="swiper-cube-shadow"></div>'), e.append(m)))); for (let e = 0; e < a.length; e += 1) { const t = a.eq(e); let s = e; h && (s = parseInt(t.attr("data-swiper-slide-index"), 10)); let r = 90 * s, n = Math.floor(r / 360); l && (r = -r, n = Math.floor(-r / 360)); const d = Math.max(Math.min(t[0].progress, 1), -1); let c = 0, m = 0, g = 0; s % 4 == 0 ? (c = 4 * -n * o, g = 0) : (s - 1) % 4 == 0 ? (c = 0, g = 4 * -n * o) : (s - 2) % 4 == 0 ? (c = o + 4 * n * o, g = o) : (s - 3) % 4 == 0 && (c = -o, g = 3 * o + 4 * o * n), l && (c = -c), u || (m = c, c = 0); const v = `rotateX(${u ? 0 : -r}deg) rotateY(${u ? r : 0}deg) translate3d(${c}px, ${m}px, ${g}px)`; d <= 1 && d > -1 && (f = 90 * s + 90 * d, l && (f = 90 * -s - 90 * d)), t.transform(v), p.slideShadows && i(t, d, u) } if (s.css({ "-webkit-transform-origin": `50% 50% -${o / 2}px`, "transform-origin": `50% 50% -${o / 2}px` }), p.shadow) if (u) m.transform(`translate3d(0px, ${r / 2 + p.shadowOffset}px, ${-r / 2}px) rotateX(90deg) rotateZ(0deg) scale(${p.shadowScale})`); else { const e = Math.abs(f) - 90 * Math.floor(Math.abs(f) / 90), t = 1.5 - (Math.sin(2 * e * Math.PI / 360) / 2 + Math.cos(2 * e * Math.PI / 360) / 2), s = p.shadowScale, a = p.shadowScale / t, i = p.shadowOffset; m.transform(`scale3d(${s}, 1, ${a}) translate3d(0px, ${n / 2 + i}px, ${-n / 2 / a}px) rotateX(-90deg)`) } const g = c.isSafari || c.isWebView ? -o / 2 : 0; s.transform(`translate3d(0px,0,${g}px) rotateX(${t.isHorizontal() ? 0 : f}deg) rotateY(${t.isHorizontal() ? -f : 0}deg)`), s[0].style.setProperty("--swiper-cube-translate-z", `${g}px`) }, setTransition: e => { const { $el: s, slides: a } = t; a.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e), t.params.cubeEffect.shadow && !t.isHorizontal() && s.find(".swiper-cube-shadow").transition(e) }, recreateShadows: () => { const e = t.isHorizontal(); t.slides.each((t => { const s = Math.max(Math.min(t.progress, 1), -1); i(d(t), s, e) })) }, getEffectParams: () => t.params.cubeEffect, perspective: () => !0, overwriteParams: () => ({ slidesPerView: 1, slidesPerGroup: 1, watchSlidesProgress: !0, resistanceRatio: 0, spaceBetween: 0, centeredSlides: !1, virtualTranslate: !0 }) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ flipEffect: { slideShadows: !0, limitRotation: !0, transformEl: null } }); const i = (e, s, a) => { let i = t.isHorizontal() ? e.find(".swiper-slide-shadow-left") : e.find(".swiper-slide-shadow-top"), r = t.isHorizontal() ? e.find(".swiper-slide-shadow-right") : e.find(".swiper-slide-shadow-bottom"); 0 === i.length && (i = ie(a, e, t.isHorizontal() ? "left" : "top")), 0 === r.length && (r = ie(a, e, t.isHorizontal() ? "right" : "bottom")), i.length && (i[0].style.opacity = Math.max(-s, 0)), r.length && (r[0].style.opacity = Math.max(s, 0)) }; te({ effect: "flip", swiper: t, on: a, setTranslate: () => { const { slides: e, rtlTranslate: s } = t, a = t.params.flipEffect; for (let r = 0; r < e.length; r += 1) { const n = e.eq(r); let l = n[0].progress; t.params.flipEffect.limitRotation && (l = Math.max(Math.min(n[0].progress, 1), -1)); const o = n[0].swiperSlideOffset; let d = -180 * l, c = 0, p = t.params.cssMode ? -o - t.translate : -o, u = 0; t.isHorizontal() ? s && (d = -d) : (u = p, p = 0, c = -d, d = 0), n[0].style.zIndex = -Math.abs(Math.round(l)) + e.length, a.slideShadows && i(n, l, a); const h = `translate3d(${p}px, ${u}px, 0px) rotateX(${c}deg) rotateY(${d}deg)`; se(a, n).transform(h) } }, setTransition: e => { const { transformEl: s } = t.params.flipEffect; (s ? t.slides.find(s) : t.slides).transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e), ae({ swiper: t, duration: e, transformEl: s }) }, recreateShadows: () => { const e = t.params.flipEffect; t.slides.each((s => { const a = d(s); let r = a[0].progress; t.params.flipEffect.limitRotation && (r = Math.max(Math.min(s.progress, 1), -1)), i(a, r, e) })) }, getEffectParams: () => t.params.flipEffect, perspective: () => !0, overwriteParams: () => ({ slidesPerView: 1, slidesPerGroup: 1, watchSlidesProgress: !0, spaceBetween: 0, virtualTranslate: !t.params.cssMode }) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ coverflowEffect: { rotate: 50, stretch: 0, depth: 100, scale: 1, modifier: 1, slideShadows: !0, transformEl: null } }), te({ effect: "coverflow", swiper: t, on: a, setTranslate: () => { const { width: e, height: s, slides: a, slidesSizesGrid: i } = t, r = t.params.coverflowEffect, n = t.isHorizontal(), l = t.translate, o = n ? e / 2 - l : s / 2 - l, d = n ? r.rotate : -r.rotate, c = r.depth; for (let e = 0, t = a.length; e < t; e += 1) { const t = a.eq(e), s = i[e], l = (o - t[0].swiperSlideOffset - s / 2) / s, p = "function" == typeof r.modifier ? r.modifier(l) : l * r.modifier; let u = n ? d * p : 0, h = n ? 0 : d * p, m = -c * Math.abs(p), f = r.stretch; "string" == typeof f && -1 !== f.indexOf("%") && (f = parseFloat(r.stretch) / 100 * s); let g = n ? 0 : f * p, v = n ? f * p : 0, w = 1 - (1 - r.scale) * Math.abs(p); Math.abs(v) < .001 && (v = 0), Math.abs(g) < .001 && (g = 0), Math.abs(m) < .001 && (m = 0), Math.abs(u) < .001 && (u = 0), Math.abs(h) < .001 && (h = 0), Math.abs(w) < .001 && (w = 0); const b = `translate3d(${v}px,${g}px,${m}px) rotateX(${h}deg) rotateY(${u}deg) scale(${w})`; if (se(r, t).transform(b), t[0].style.zIndex = 1 - Math.abs(Math.round(p)), r.slideShadows) { let e = n ? t.find(".swiper-slide-shadow-left") : t.find(".swiper-slide-shadow-top"), s = n ? t.find(".swiper-slide-shadow-right") : t.find(".swiper-slide-shadow-bottom"); 0 === e.length && (e = ie(r, t, n ? "left" : "top")), 0 === s.length && (s = ie(r, t, n ? "right" : "bottom")), e.length && (e[0].style.opacity = p > 0 ? p : 0), s.length && (s[0].style.opacity = -p > 0 ? -p : 0) } } }, setTransition: e => { const { transformEl: s } = t.params.coverflowEffect; (s ? t.slides.find(s) : t.slides).transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e) }, perspective: () => !0, overwriteParams: () => ({ watchSlidesProgress: !0 }) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ creativeEffect: { transformEl: null, limitProgress: 1, shadowPerProgress: !1, progressMultiplier: 1, perspective: !0, prev: { translate: [0, 0, 0], rotate: [0, 0, 0], opacity: 1, scale: 1 }, next: { translate: [0, 0, 0], rotate: [0, 0, 0], opacity: 1, scale: 1 } } }); const i = e => "string" == typeof e ? e : `${e}px`; te({ effect: "creative", swiper: t, on: a, setTranslate: () => { const { slides: e, $wrapperEl: s, slidesSizesGrid: a } = t, r = t.params.creativeEffect, { progressMultiplier: n } = r, l = t.params.centeredSlides; if (l) { const e = a[0] / 2 - t.params.slidesOffsetBefore || 0; s.transform(`translateX(calc(50% - ${e}px))`) } for (let s = 0; s < e.length; s += 1) { const a = e.eq(s), o = a[0].progress, d = Math.min(Math.max(a[0].progress, -r.limitProgress), r.limitProgress); let c = d; l || (c = Math.min(Math.max(a[0].originalProgress, -r.limitProgress), r.limitProgress)); const p = a[0].swiperSlideOffset, u = [t.params.cssMode ? -p - t.translate : -p, 0, 0], h = [0, 0, 0]; let m = !1; t.isHorizontal() || (u[1] = u[0], u[0] = 0); let f = { translate: [0, 0, 0], rotate: [0, 0, 0], scale: 1, opacity: 1 }; d < 0 ? (f = r.next, m = !0) : d > 0 && (f = r.prev, m = !0), u.forEach(((e, t) => { u[t] = `calc(${e}px + (${i(f.translate[t])} * ${Math.abs(d * n)}))` })), h.forEach(((e, t) => { h[t] = f.rotate[t] * Math.abs(d * n) })), a[0].style.zIndex = -Math.abs(Math.round(o)) + e.length; const g = u.join(", "), v = `rotateX(${h[0]}deg) rotateY(${h[1]}deg) rotateZ(${h[2]}deg)`, w = c < 0 ? `scale(${1 + (1 - f.scale) * c * n})` : `scale(${1 - (1 - f.scale) * c * n})`, b = c < 0 ? 1 + (1 - f.opacity) * c * n : 1 - (1 - f.opacity) * c * n, x = `translate3d(${g}) ${v} ${w}`; if (m && f.shadow || !m) { let e = a.children(".swiper-slide-shadow"); if (0 === e.length && f.shadow && (e = ie(r, a)), e.length) { const t = r.shadowPerProgress ? d * (1 / r.limitProgress) : d; e[0].style.opacity = Math.min(Math.max(Math.abs(t), 0), 1) } } const y = se(r, a); y.transform(x).css({ opacity: b }), f.origin && y.css("transform-origin", f.origin) } }, setTransition: e => { const { transformEl: s } = t.params.creativeEffect; (s ? t.slides.find(s) : t.slides).transition(e).find(".swiper-slide-shadow").transition(e), ae({ swiper: t, duration: e, transformEl: s, allSlides: !0 }) }, perspective: () => t.params.creativeEffect.perspective, overwriteParams: () => ({ watchSlidesProgress: !0, virtualTranslate: !t.params.cssMode }) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ cardsEffect: { slideShadows: !0, transformEl: null, rotate: !0, perSlideRotate: 2, perSlideOffset: 8 } }), te({ effect: "cards", swiper: t, on: a, setTranslate: () => { const { slides: e, activeIndex: s } = t, a = t.params.cardsEffect, { startTranslate: i, isTouched: r } = t.touchEventsData, n = t.translate; for (let l = 0; l < e.length; l += 1) { const o = e.eq(l), d = o[0].progress, c = Math.min(Math.max(d, -4), 4); let p = o[0].swiperSlideOffset; t.params.centeredSlides && !t.params.cssMode && t.$wrapperEl.transform(`translateX(${t.minTranslate()}px)`), t.params.centeredSlides && t.params.cssMode && (p -= e[0].swiperSlideOffset); let u = t.params.cssMode ? -p - t.translate : -p, h = 0; const m = -100 * Math.abs(c); let f = 1, g = -a.perSlideRotate * c, v = a.perSlideOffset - .75 * Math.abs(c); const w = t.virtual && t.params.virtual.enabled ? t.virtual.from + l : l, b = (w === s || w === s - 1) && c > 0 && c < 1 && (r || t.params.cssMode) && n < i, x = (w === s || w === s + 1) && c < 0 && c > -1 && (r || t.params.cssMode) && n > i; if (b || x) { const e = (1 - Math.abs((Math.abs(c) - .5) / .5)) ** .5; g += -28 * c * e, f += -.5 * e, v += 96 * e, h = -25 * e * Math.abs(c) + "%" } if (u = c < 0 ? `calc(${u}px + (${v * Math.abs(c)}%))` : c > 0 ? `calc(${u}px + (-${v * Math.abs(c)}%))` : `${u}px`, !t.isHorizontal()) { const e = h; h = u, u = e } const y = c < 0 ? "" + (1 + (1 - f) * c) : "" + (1 - (1 - f) * c), E = `\n translate3d(${u}, ${h}, ${m}px)\n rotateZ(${a.rotate ? g : 0}deg)\n scale(${y})\n `; if (a.slideShadows) { let e = o.find(".swiper-slide-shadow"); 0 === e.length && (e = ie(a, o)), e.length && (e[0].style.opacity = Math.min(Math.max((Math.abs(c) - .5) / .5, 0), 1)) } o[0].style.zIndex = -Math.abs(Math.round(d)) + e.length; se(a, o).transform(E) } }, setTransition: e => { const { transformEl: s } = t.params.cardsEffect; (s ? t.slides.find(s) : t.slides).transition(e).find(".swiper-slide-shadow").transition(e), ae({ swiper: t, duration: e, transformEl: s }) }, perspective: () => !0, overwriteParams: () => ({ watchSlidesProgress: !0, virtualTranslate: !t.params.cssMode }) }) }]; return V.use(re), V })); </script> <script> var swiper = new Swiper(".latest-news", { loop: false, slidesPerView: 1, slidesPerGroup: 1, spaceBetween: 30, navigation: { nextEl: ".latest-news .s-button-next", prevEl: ".latest-news .s-button-prev", }, breakpoints: { 999: { slidesPerView: 3, slidesPerGroup: 3, spaceBetween: 30, }, 768: { slidesPerView: 2, slidesPerGroup: 2, spaceBetween: 30, } } }); </script> <script> var swiper = new Swiper(".g-review-page-slider", { loop: false, slidesPerView: 1, slidesPerGroup: 1, spaceBetween: 30, navigation: { nextEl: ".g-review-page-slider .g-button-next", prevEl: ".g-review-page-slider .g-button-prev", }, pagination: { el: ".g-review-page-slider .g-pagination", dynamicBullets: false, } }); </script> </body> </html> <!-- Dynamic page generated in 0.613 seconds. --> <!-- Cached page generated by WP-Super-Cache on 2025-02-23 00:08:15 --> <!-- Compression = gzip -->

Pages: 1 2 3 4 5 6 7 8 9 10