diff --git a/assets/js/lcp-beacon.js b/assets/js/lcp-beacon.js new file mode 100644 index 0000000000..120879662b --- /dev/null +++ b/assets/js/lcp-beacon.js @@ -0,0 +1,315 @@ +class RocketLcpBeacon { + constructor( config ) { + this.config = config; + this.performanceImages = []; + } + + init() { + if ( ! this._isValidPreconditions() ) { + this._finalize(); + return; + } + + // Use _generateLcpCandidates method to get all the elements in the viewport. + const above_the_fold_images = this._generateLcpCandidates( Infinity ); + if ( above_the_fold_images ) { + this._initWithFirstElementWithInfo( above_the_fold_images ); + this._fillATFWithoutDuplications( above_the_fold_images ); + } + + this._saveFinalResultIntoDB(); + } + + _isValidPreconditions() { + // Check the screensize first because starting any logic. + if ( this._isNotValidScreensize() ) { + this._logMessage('Bailing out because screen size is not acceptable'); + return false; + } + + if ( this._isGeneratedBefore() ) { + this._logMessage('Bailing out because data is already available'); + return false; + } + + return true; + } + + _isGeneratedBefore() { + // AJAX call to check if there are any records for the current URL. + let data_check = new FormData(); + data_check.append('action', 'rocket_check_lcp'); + data_check.append('rocket_lcp_nonce', this.config.nonce); + data_check.append('url', this.config.url); + data_check.append('is_mobile', this.config.is_mobile); + + const lcp_data_response = fetch(this.config.ajax_url, { + method: "POST", + credentials: 'same-origin', + body: data_check + }); + + return lcp_data_response.success; + } + + _isNotValidScreensize() { + // Check screen size + const screenWidth = window.innerWidth || document.documentElement.clientWidth; + const screenHeight= window.innerHeight || document.documentElement.clientHeight; + + const isNotValidForMobile = this.config.is_mobile && + ( screenWidth > this.config.width_threshold || screenHeight > this.config.height_threshold ); + const isNotValidForDesktop = !this.config.is_mobile && + ( screenWidth < this.config.width_threshold || screenHeight < this.config.height_threshold ); + + return isNotValidForMobile || isNotValidForDesktop; + } + + _generateLcpCandidates( count ) { + const lcpElements = document.querySelectorAll( this.config.elements ); + + if ( lcpElements.length <= 0 ) { + return []; + } + + const potentialCandidates = Array.from( lcpElements ); + + const topCandidates = potentialCandidates.map(element => { + const rect = element.getBoundingClientRect(); + return { + element: element, + rect: rect, + }; + }).filter(item => { + return ( + item.rect.width > 0 && + item.rect.height > 0 && + this._isIntersecting(item.rect) + ); + }) + .map(item => ({ + item, + area: this._getElementArea(item.rect), + elementInfo: this._getElementInfo(item.element), + })) + .sort((a, b) => b.area - a.area) + .slice(0, count); + + return topCandidates.map(candidate => ({ + element: candidate.item.element, + elementInfo: candidate.elementInfo, + })); + } + + _isIntersecting(rect) { + // Check if any part of the image is within the viewport + return ( + rect.bottom >= 0 && + rect.right >= 0 && + rect.top <= (window.innerHeight || document.documentElement.clientHeight) && + rect.left <= (window.innerWidth || document.documentElement.clientWidth) + ); + } + + _getElementArea(rect) { + const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left); + const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top); + + return visibleWidth * visibleHeight; + } + + _getElementInfo(element) { + const nodeName = element.nodeName.toLowerCase(); + const element_info = { + type: "", + src: "", + srcset: "", + sizes: "", + sources: [], + bg_set: [], + current_src: "" + }; + + const css_bg_url_rgx = /url\(\s*?['"]?\s*?(\S+?)\s*?["']?\s*?\)\s*?([a-zA-Z0-9\s]*[x|dpcm|dpi|dppx]?)/ig; + + if (nodeName === "img" && element.srcset) { + element_info.type = "img-srcset"; + element_info.src = element.src; + element_info.srcset = element.srcset; // capture srcset + element_info.sizes = element.sizes; // capture sizes + element_info.current_src = element.currentSrc; + } else if (nodeName === "img") { + element_info.type = "img"; + element_info.src = element.src; + element_info.current_src = element.currentSrc; + } else if (nodeName === "video") { + element_info.type = "img"; + const source = element.querySelector('source'); + element_info.src = element.poster || (source ? source.src : ''); + element_info.current_src = element_info.src; + } else if (nodeName === "svg") { + const imageElement = element.querySelector('image'); + if (imageElement) { + element_info.type = "img"; + element_info.src = imageElement.getAttribute('href') || ''; + element_info.current_src = element_info.src; + } + } else if (nodeName === "picture") { + element_info.type = "picture"; + const img = element.querySelector('img:not(picture>img)'); + element_info.src = img ? img.src : ""; + element_info.sources = Array.from(element.querySelectorAll('source')).map(source => ({ + srcset: source.srcset || '', + media: source.media || '' + })); + } else { + const computed_style = window.getComputedStyle(element, null); + const bg_props = [ + computed_style.getPropertyValue("background-image"), + getComputedStyle(element, ":after").getPropertyValue("background-image"), + getComputedStyle(element, ":before").getPropertyValue("background-image") + ]; + + const full_bg_prop = bg_props.filter(prop => prop !== "none").join(""); + element_info.type = "bg-img"; + if (full_bg_prop.includes("image-set(")) { + element_info.type = "bg-img-set"; + } + if (!full_bg_prop || full_bg_prop === "") { + return null; + } + + const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)]; + element_info.bg_set = matches.map(m => m[1] ? {src: m[1].trim() + (m[2] ? " " + m[2].trim() : "")} : {}); + // Check if bg_set array is populated with empty objects + if (element_info.bg_set.every(item => item.src === "")) { + // If bg_set array is populated with empty objects, populate it with the URLs from the matches array + element_info.bg_set = matches.map(m => m[1] ? {src: m[1].trim()} : {}); + } + + if (element_info.bg_set.length > 0) { + element_info.src = element_info.bg_set[0].src; + if (element_info.type === "bg-img-set") { + element_info.src = element_info.bg_set; + } + } + } + + return element_info; + } + + _initWithFirstElementWithInfo(elements) { + const firstElementWithInfo = elements.find(item => item.elementInfo !== null); + + if ( ! firstElementWithInfo ) { + this._logMessage("No LCP candidate found."); + this.performanceImages = []; + return; + } + + this.performanceImages = [{ + ...firstElementWithInfo.elementInfo, + label: "lcp", + }]; + } + + _fillATFWithoutDuplications(elements) { + elements.forEach(({ element, elementInfo }) => { + if ( this._isDuplicateImage(element) ) { + return; + } + + this.performanceImages.push({ ...elementInfo, label: "above-the-fold" }); + }); + } + + _isDuplicateImage(image) { + const elementInfo = this._getElementInfo(image); + + if (elementInfo === null) { + return false; + } + + const isImageOrVideo = + elementInfo.type === "img" || + elementInfo.type === "img-srcset" || + elementInfo.type === "video"; + + const isBgImageOrPicture = + elementInfo.type === "bg-img" || + elementInfo.type === "bg-img-set" || + elementInfo.type === "picture"; + + return (isImageOrVideo || isBgImageOrPicture) + && + this.performanceImages.some(item => item.src === elementInfo.src); + } + + _saveFinalResultIntoDB() { + if ( ! this.performanceImages ) { + return; + } + + const data = new FormData(); + data.append('action', 'rocket_lcp'); + data.append('rocket_lcp_nonce', this.config.nonce); + data.append('url', this.config.url); + data.append('is_mobile', this.config.is_mobile); + data.append('images', JSON.stringify(this.performanceImages)); + data.append('status', 'success'); + + fetch(rocket_lcp_data.ajax_url, { + method: "POST", + credentials: 'same-origin', + body: data, + headers: { + 'wpr-saas-no-intercept': true + } + }) + .then((response) => response.json()) + .then((data) => { + this._logMessage(data); + }) + .catch((error) => { + this._logMessage(error); + }) + .finally(() => { + this._finalize(); + }); + } + + _finalize() { + const beaconscript = document.querySelector('[data-name="wpr-lcp-beacon"]'); + beaconscript.setAttribute('beacon-completed', 'true'); + } + + _logMessage( msg ) { + if ( ! this.config.debug ) { + return; + } + console.log( msg ); + } + + static run() { + if ( !window.rocket_lcp_data ) { + return; + } + + const instance = new RocketLcpBeacon( window.rocket_lcp_data ); + + if (document.readyState !== 'loading') { + setTimeout(() => { + instance.init(); + }, 500); + return; + } + + document.addEventListener("DOMContentLoaded", () => { + setTimeout(() => { + instance.init(); + }, 500); + }); + } +} + +RocketLcpBeacon.run(); \ No newline at end of file diff --git a/assets/js/lcp-beacon.js.min.map b/assets/js/lcp-beacon.js.min.map new file mode 100644 index 0000000000..16eb99076d --- /dev/null +++ b/assets/js/lcp-beacon.js.min.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["lcp-beacon.js"],"sourcesContent":["!function n(r,s,o){function c(t,e){if(!s[t]){if(!r[t]){var i=\"function\"==typeof require&&require;if(!e&&i)return i(t,!0);if(a)return a(t,!0);throw(e=new Error(\"Cannot find module '\"+t+\"'\")).code=\"MODULE_NOT_FOUND\",e}i=s[t]={exports:{}},r[t][0].call(i.exports,function(e){return c(r[t][1][e]||e)},i,i.exports,n,r,s,o)}return s[t].exports}for(var a=\"function\"==typeof require&&require,e=0;ethis.config.width_threshold||t>this.config.height_threshold),e=!this.config.is_mobile&&(e{var t=e.getBoundingClientRect();return{element:e,rect:t}}).filter(e=>0({item:e,area:this._getElementArea(e.rect),elementInfo:this._getElementInfo(e.element)})).sort((e,t)=>t.area-e.area).slice(0,e).map(e=>({element:e.item.element,elementInfo:e.elementInfo}))}_isIntersecting(e){return 0<=e.bottom&&0<=e.right&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}_getElementArea(e){return Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left)*Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top)}_getElementInfo(e){var t=e.nodeName.toLowerCase(),i={type:\"\",src:\"\",srcset:\"\",sizes:\"\",sources:[],bg_set:[],current_src:\"\"};if(\"img\"===t&&e.srcset)i.type=\"img-srcset\",i.src=e.src,i.srcset=e.srcset,i.sizes=e.sizes,i.current_src=e.currentSrc;else if(\"img\"===t)i.type=\"img\",i.src=e.src,i.current_src=e.currentSrc;else if(\"video\"===t){i.type=\"img\";var n=e.querySelector(\"source\");i.src=e.poster||(n?n.src:\"\"),i.current_src=i.src}else if(\"svg\"===t)(n=e.querySelector(\"image\"))&&(i.type=\"img\",i.src=n.getAttribute(\"href\")||\"\",i.current_src=i.src);else if(\"picture\"===t)i.type=\"picture\",n=e.querySelector(\"img:not(picture>img)\"),i.src=n?n.src:\"\",i.sources=Array.from(e.querySelectorAll(\"source\")).map(e=>({srcset:e.srcset||\"\",media:e.media||\"\"}));else{if(t=[window.getComputedStyle(e,null).getPropertyValue(\"background-image\"),getComputedStyle(e,\":after\").getPropertyValue(\"background-image\"),getComputedStyle(e,\":before\").getPropertyValue(\"background-image\")].filter(e=>\"none\"!==e).join(\"\"),i.type=\"bg-img\",t.includes(\"image-set(\")&&(i.type=\"bg-img-set\"),!t||\"\"===t)return null;n=[...t.matchAll(/url\\(\\s*?['\"]?\\s*?(\\S+?)\\s*?[\"']?\\s*?\\)\\s*?([a-zA-Z0-9\\s]*[x|dpcm|dpi|dppx]?)/gi)],i.bg_set=n.map(e=>e[1]?{src:e[1].trim()+(e[2]?\" \"+e[2].trim():\"\")}:{}),i.bg_set.every(e=>\"\"===e.src)&&(i.bg_set=n.map(e=>e[1]?{src:e[1].trim()}:{})),0null!==e.elementInfo))?this.performanceImages=[{...e.elementInfo,label:\"lcp\"}]:(this._logMessage(\"No LCP candidate found.\"),this.performanceImages=[])}_fillATFWithoutDuplications(e){e.forEach(e=>{var{element:e,elementInfo:t}=e;this._isDuplicateImage(e)||this.performanceImages.push({...t,label:\"above-the-fold\"})})}_isDuplicateImage(e){const t=this._getElementInfo(e);var i;return null!==t&&(e=\"img\"===t.type||\"img-srcset\"===t.type||\"video\"===t.type,i=\"bg-img\"===t.type||\"bg-img-set\"===t.type||\"picture\"===t.type,e||i)&&this.performanceImages.some(e=>e.src===t.src)}_saveFinalResultIntoDB(){var e;this.performanceImages&&((e=new FormData).append(\"action\",\"rocket_lcp\"),e.append(\"rocket_lcp_nonce\",this.config.nonce),e.append(\"url\",this.config.url),e.append(\"is_mobile\",this.config.is_mobile),e.append(\"images\",JSON.stringify(this.performanceImages)),e.append(\"status\",\"success\"),fetch(rocket_lcp_data.ajax_url,{method:\"POST\",credentials:\"same-origin\",body:e,headers:{\"wpr-saas-no-intercept\":!0}}).then(e=>e.json()).then(e=>{this._logMessage(e)}).catch(e=>{this._logMessage(e)}).finally(()=>{this._finalize()}))}_finalize(){document.querySelector('[data-name=\"wpr-lcp-beacon\"]').setAttribute(\"beacon-completed\",\"true\")}_logMessage(e){this.config.debug&&console.log(e)}static run(){if(window.rocket_lcp_data){const e=new n(window.rocket_lcp_data);\"loading\"!==document.readyState?setTimeout(()=>{e.init()},500):document.addEventListener(\"DOMContentLoaded\",()=>{setTimeout(()=>{e.init()},500)})}}}).run()},{}]},{},[1]);"],"file":"lcp-beacon.js"} \ No newline at end of file diff --git a/assets/js/lcp-beacon.min.js b/assets/js/lcp-beacon.min.js new file mode 100644 index 0000000000..d15b911ce8 --- /dev/null +++ b/assets/js/lcp-beacon.min.js @@ -0,0 +1,2 @@ +!function n(r,s,o){function c(t,e){if(!s[t]){if(!r[t]){var i="function"==typeof require&&require;if(!e&&i)return i(t,!0);if(a)return a(t,!0);throw(e=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",e}i=s[t]={exports:{}},r[t][0].call(i.exports,function(e){return c(r[t][1][e]||e)},i,i.exports,n,r,s,o)}return s[t].exports}for(var a="function"==typeof require&&require,e=0;ethis.config.width_threshold||t>this.config.height_threshold),e=!this.config.is_mobile&&(e{var t=e.getBoundingClientRect();return{element:e,rect:t}}).filter(e=>0({item:e,area:this._getElementArea(e.rect),elementInfo:this._getElementInfo(e.element)})).sort((e,t)=>t.area-e.area).slice(0,e).map(e=>({element:e.item.element,elementInfo:e.elementInfo}))}_isIntersecting(e){return 0<=e.bottom&&0<=e.right&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}_getElementArea(e){return Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left)*Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top)}_getElementInfo(e){var t=e.nodeName.toLowerCase(),i={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""};if("img"===t&&e.srcset)i.type="img-srcset",i.src=e.src,i.srcset=e.srcset,i.sizes=e.sizes,i.current_src=e.currentSrc;else if("img"===t)i.type="img",i.src=e.src,i.current_src=e.currentSrc;else if("video"===t){i.type="img";var n=e.querySelector("source");i.src=e.poster||(n?n.src:""),i.current_src=i.src}else if("svg"===t)(n=e.querySelector("image"))&&(i.type="img",i.src=n.getAttribute("href")||"",i.current_src=i.src);else if("picture"===t)i.type="picture",n=e.querySelector("img:not(picture>img)"),i.src=n?n.src:"",i.sources=Array.from(e.querySelectorAll("source")).map(e=>({srcset:e.srcset||"",media:e.media||""}));else{if(t=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(e=>"none"!==e).join(""),i.type="bg-img",t.includes("image-set(")&&(i.type="bg-img-set"),!t||""===t)return null;n=[...t.matchAll(/url\(\s*?['"]?\s*?(\S+?)\s*?["']?\s*?\)\s*?([a-zA-Z0-9\s]*[x|dpcm|dpi|dppx]?)/gi)],i.bg_set=n.map(e=>e[1]?{src:e[1].trim()+(e[2]?" "+e[2].trim():"")}:{}),i.bg_set.every(e=>""===e.src)&&(i.bg_set=n.map(e=>e[1]?{src:e[1].trim()}:{})),0null!==e.elementInfo))?this.performanceImages=[{...e.elementInfo,label:"lcp"}]:(this._logMessage("No LCP candidate found."),this.performanceImages=[])}_fillATFWithoutDuplications(e){e.forEach(e=>{var{element:e,elementInfo:t}=e;this._isDuplicateImage(e)||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const t=this._getElementInfo(e);var i;return null!==t&&(e="img"===t.type||"img-srcset"===t.type||"video"===t.type,i="bg-img"===t.type||"bg-img-set"===t.type||"picture"===t.type,e||i)&&this.performanceImages.some(e=>e.src===t.src)}_saveFinalResultIntoDB(){var e;this.performanceImages&&((e=new FormData).append("action","rocket_lcp"),e.append("rocket_lcp_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),e.append("images",JSON.stringify(this.performanceImages)),e.append("status","success"),fetch(rocket_lcp_data.ajax_url,{method:"POST",credentials:"same-origin",body:e,headers:{"wpr-saas-no-intercept":!0}}).then(e=>e.json()).then(e=>{this._logMessage(e)}).catch(e=>{this._logMessage(e)}).finally(()=>{this._finalize()}))}_finalize(){document.querySelector('[data-name="wpr-lcp-beacon"]').setAttribute("beacon-completed","true")}_logMessage(e){this.config.debug&&console.log(e)}static run(){if(window.rocket_lcp_data){const e=new n(window.rocket_lcp_data);"loading"!==document.readyState?setTimeout(()=>{e.init()},500):document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{e.init()},500)})}}}).run()},{}]},{},[1]); +//# sourceMappingURL=lcp-beacon.js.map diff --git a/assets/js/wpr-admin.js b/assets/js/wpr-admin.js index c88498fb77..9d446ed267 100644 --- a/assets/js/wpr-admin.js +++ b/assets/js/wpr-admin.js @@ -320,8 +320,8 @@ function initializeClock(id, endtime) { function rucssTimer(id, endtime) { const timer = document.getElementById(id); - const notice = document.getElementById('rocket-notice-rucss-processing'); - const success = document.getElementById('rocket-notice-rucss-success'); + const notice = document.getElementById('rocket-notice-saas-processing'); + const success = document.getElementById('rocket-notice-saas-success'); if (timer === null) { return; diff --git a/assets/js/wpr-admin.js.min.map b/assets/js/wpr-admin.js.min.map index 03338cb447..b9b613cd9c 100644 --- a/assets/js/wpr-admin.js.min.map +++ b/assets/js/wpr-admin.js.min.map @@ -1 +1 @@ -{"version":3,"names":[],"mappings":"","sources":["wpr-admin.js"],"sourcesContent":["!function s(n,r,a){function o(e,t){if(!r[e]){if(!n[e]){var i=\"function\"==typeof require&&require;if(!t&&i)return i(e,!0);if(l)return l(e,!0);throw(i=new Error(\"Cannot find module '\"+e+\"'\")).code=\"MODULE_NOT_FOUND\",i}i=r[e]={exports:{}},n[e][0].call(i.exports,function(t){return o(n[e][1][t]||t)},i,i.exports,s,n,r,a)}return r[e].exports}for(var l=\"function\"==typeof require&&require,t=0;t{i.append(\"\"+t+\": \"),i.append(e[t].message),i.append(\"
\")}):i.append('
'+e.message+\"
\")}})}),r(\"#wpr_enable_mobile_cache\").on(\"click\",function(t){t.preventDefault(),r(\"#wpr_enable_mobile_cache\").addClass(\"wpr-isLoading\"),r.post(ajaxurl,{action:\"rocket_enable_mobile_cache\",_ajax_nonce:rocket_ajax_data.nonce},function(t){t.success&&(r(\"#wpr_enable_mobile_cache\").hide(),r(\"#wpr_mobile_cache_default\").hide(),r(\"#wpr_mobile_cache_response\").show(),r(\"#wpr_enable_mobile_cache\").removeClass(\"wpr-isLoading\"),r(\"#cache_mobile\").val(1),r(\"#do_caching_mobile_files\").val(1))})})})},{}],2:[function(t,e,i){\"use strict\";t(\"../lib/greensock/TweenLite.min.js\"),t(\"../lib/greensock/TimelineLite.min.js\"),t(\"../lib/greensock/easing/EasePack.min.js\"),t(\"../lib/greensock/plugins/CSSPlugin.min.js\"),t(\"../lib/greensock/plugins/ScrollToPlugin.min.js\"),t(\"../global/pageManager.js\"),t(\"../global/main.js\"),t(\"../global/fields.js\"),t(\"../global/beacon.js\"),t(\"../global/ajax.js\"),t(\"../global/rocketcdn.js\"),t(\"../global/countdown.js\")},{\"../global/ajax.js\":1,\"../global/beacon.js\":3,\"../global/countdown.js\":4,\"../global/fields.js\":5,\"../global/main.js\":6,\"../global/pageManager.js\":7,\"../global/rocketcdn.js\":8,\"../lib/greensock/TimelineLite.min.js\":9,\"../lib/greensock/TweenLite.min.js\":10,\"../lib/greensock/easing/EasePack.min.js\":11,\"../lib/greensock/plugins/CSSPlugin.min.js\":12,\"../lib/greensock/plugins/ScrollToPlugin.min.js\":13}],3:[function(t,e,i){\"use strict\";var s=jQuery;s(document).ready(function(){\"Beacon\"in window&&s(\".wpr-infoAction--help\").on(\"click\",function(t){var e=s(this).data(\"beacon-id\");return 0!==(e=(e=e).split(\",\")).length&&(1{o(t).attr(\"checked\",i?null:\"checked\")});else{const r=o(e).closest(\".wpr-list\").find(\".wpr-main-checkbox\");var n=o.map(s,t=>{if(void 0!==o(t).attr(\"checked\"))return t});r.attr(\"checked\",n.length===s.length?\"checked\":null)}}),0{let i=o(e).parents(\".wpr-list\");var s=i.find(\".wpr-list-body input[type=checkbox]:not(:checked)\").length;o(e).attr(\"checked\",s<=0?\"checked\":null)})})},{}],6:[function(t,e,i){\"use strict\";var c=jQuery;c(document).ready(function(){var t=c(\".wpr-notice\");c(\"#wpr-congratulations-notice\").on(\"click\",function(){return(new TimelineLite).to(t,1,{autoAlpha:0,x:40,ease:Power4.easeOut}).to(t,.6,{height:0,marginTop:0,ease:Power4.easeOut},\"=-.4\").set(t,{display:\"none\"}),!1}),c(\".rocket-analytics-data-container\").hide(),c(\".rocket-preview-analytics-data\").on(\"click\",function(t){t.preventDefault(),c(this).parent().next(\".rocket-analytics-data-container\").toggle()}),c(\".wpr-toggle-button\").each(function(){var t=c(this),e=t.closest(\".wpr-fieldsContainer-fieldset\").find(\".wpr-radio :checkbox\"),i=c('[href=\"'+t.attr(\"href\")+'\"].wpr-menuItem');e.on(\"change\",function(){e.is(\":checked\")?(i.css(\"display\",\"block\"),t.css(\"display\",\"inline-block\")):(i.css(\"display\",\"none\"),t.css(\"display\",\"none\"))}).trigger(\"change\")});var e=c(\".wpr-Popin-Analytics\"),i=c(\".wpr-Popin-overlay\"),s=c(\".wpr-Popin-Analytics-close\"),n=c(\".wpr-Popin-Analytics .wpr-button\");function r(){(new TimelineLite).fromTo(e,.6,{autoAlpha:1,marginTop:0},{autoAlpha:0,marginTop:-24,ease:Power4.easeOut}).fromTo(i,.6,{autoAlpha:1},{autoAlpha:0,ease:Power4.easeOut},\"=-.5\").set(e,{display:\"none\"}).set(i,{display:\"none\"})}c(\".wpr-js-popin\").on(\"click\",function(t){return t.preventDefault(),(new TimelineLite).set(e,{display:\"block\"}).set(i,{display:\"block\"}).fromTo(i,.6,{autoAlpha:0},{autoAlpha:1,ease:Power4.easeOut}).fromTo(e,.6,{autoAlpha:0,marginTop:-24},{autoAlpha:1,marginTop:0,ease:Power4.easeOut},\"=-.5\"),!1}),s.on(\"click\",function(t){return t.preventDefault(),r(),!1}),n.on(\"click\",function(t){return t.preventDefault(),r(),c(\"#analytics_enabled\").prop(\"checked\",!0),c(\"#analytics_enabled\").trigger(\"change\"),!1}),c(\"#analytics_enabled\").on(\"change\",function(){c(\".wpr-rocket-analytics-cta\").toggleClass(\"wpr-isHidden\")});var a=c(\".wpr-Popin-Upgrade\"),n=c(\".wpr-Popin-Upgrade-close\");c(\".wpr-popin-upgrade-toggle\").on(\"click\",function(t){return t.preventDefault(),(new TimelineLite).set(a,{display:\"block\"}).set(i,{display:\"block\"}).fromTo(i,.6,{autoAlpha:0},{autoAlpha:1,ease:Power4.easeOut}).fromTo(a,.6,{autoAlpha:0,marginTop:-24},{autoAlpha:1,marginTop:0,ease:Power4.easeOut},\"=-.5\"),!1}),n.on(\"click\",function(){return(new TimelineLite).fromTo(a,.6,{autoAlpha:1,marginTop:0},{autoAlpha:0,marginTop:-24,ease:Power4.easeOut}).fromTo(i,.6,{autoAlpha:1},{autoAlpha:0,ease:Power4.easeOut},\"=-.5\").set(a,{display:\"none\"}).set(i,{display:\"none\"}),!1});var o=c(\".wpr-Sidebar\");c(\".wpr-js-tips\").on(\"change\",function(){c(this).is(\":checked\")?(o.css(\"display\",\"block\"),localStorage.setItem(\"wpr-show-sidebar\",\"on\")):(o.css(\"display\",\"none\"),localStorage.setItem(\"wpr-show-sidebar\",\"off\"))}),document.getElementById(\"LKgOcCRpwmAj\")?c(\".wpr-adblock\").css(\"display\",\"none\"):c(\".wpr-adblock\").css(\"display\",\"block\");var l=c(\".wpr-adblock\");c(\".wpr-adblock-close\").on(\"click\",function(){return(new TimelineLite).to(l,1,{autoAlpha:0,x:40,ease:Power4.easeOut}).to(l,.4,{height:0,marginTop:0,ease:Power4.easeOut},\"=-.4\").set(l,{display:\"none\"}),!1})})},{}],7:[function(t,e,i){\"use strict\";function s(t){var e,i=this;this.$body=document.querySelector(\".wpr-body\"),this.$menuItems=document.querySelectorAll(\".wpr-menuItem\"),this.$submitButton=document.querySelector(\".wpr-Content > form > #wpr-options-submit\"),this.$pages=document.querySelectorAll(\".wpr-Page\"),this.$sidebar=document.querySelector(\".wpr-Sidebar\"),this.$content=document.querySelector(\".wpr-Content\"),this.$tips=document.querySelector(\".wpr-Content-tips\"),this.$links=document.querySelectorAll(\".wpr-body a\"),this.$menuItem=null,this.$page=null,this.pageId=null,this.bodyTop=0,this.buttonText=this.$submitButton.value,i.getBodyTop(),window.onhashchange=function(){i.detectID()},window.location.hash?(this.bodyTop=0,this.detectID()):(e=localStorage.getItem(\"wpr-hash\"),this.bodyTop=0,e?(window.location.hash=e,this.detectID()):(this.$menuItems[0].classList.add(\"isActive\"),localStorage.setItem(\"wpr-hash\",\"dashboard\"),window.location.hash=\"#dashboard\"));for(var s=0;s{a.querySelectorAll(\".wpr-rocketcdn-open\").forEach(t=>{t.addEventListener(\"click\",t=>{t.preventDefault()})}),function(){var t=\"\";t+=\"action=rocketcdn_process_status\";const e=r(t+=\"&nonce=\"+rocket_ajax_data.nonce);e.onreadystatechange=()=>{e.readyState===XMLHttpRequest.DONE&&200===e.status&&!0===JSON.parse(e.responseText).success&&MicroModal.show(\"wpr-rocketcdn-modal\")}}(),MicroModal.init({disableScroll:!0})}),s.addEventListener(\"load\",()=>{let t=a.querySelector(\"#wpr-rocketcdn-open-cta\"),e=a.querySelector(\"#wpr-rocketcdn-close-cta\"),i=a.querySelector(\"#wpr-rocketcdn-cta-small\"),s=a.querySelector(\"#wpr-rocketcdn-cta\");function n(t){var e=\"\";return e+=\"action=toggle_rocketcdn_cta\",e+=\"&status=\"+t,e+=\"&nonce=\"+rocket_ajax_data.nonce}null!==t&&null!==i&&null!==s&&t.addEventListener(\"click\",t=>{t.preventDefault(),i.classList.add(\"wpr-isHidden\"),s.classList.remove(\"wpr-isHidden\"),r(n(\"big\"))}),null!==e&&null!==i&&null!==s&&e.addEventListener(\"click\",t=>{t.preventDefault(),i.classList.remove(\"wpr-isHidden\"),s.classList.add(\"wpr-isHidden\"),r(n(\"small\"))})}),s.onmessage=t=>{var e,i,s=rocket_ajax_data.origin_url;t.origin===s&&((e=t.data).hasOwnProperty(\"cdnFrameHeight\")&&(a.getElementById(\"rocketcdn-iframe\").style.height=e.cdnFrameHeight+\"px\"),(i=t.data).hasOwnProperty(\"cdnFrameClose\")&&(MicroModal.close(\"wpr-rocketcdn-modal\"),i.hasOwnProperty(\"cdn_page_message\")&&-1!==[\"iframe-payment-success\",\"iframe-unsubscribe-success\"].indexOf(i.cdn_page_message)&&a.location.reload()),function(t,e){let i=a.querySelector(\"#rocketcdn-iframe\").contentWindow;if(t.hasOwnProperty(\"rocketcdn_token\")){var s=\"\";s+=\"action=save_rocketcdn_token\",s+=\"&value=\"+t.rocketcdn_token;const n=r(s+=\"&nonce=\"+rocket_ajax_data.nonce);n.onreadystatechange=()=>{var t;n.readyState===XMLHttpRequest.DONE&&200===n.status&&(t=JSON.parse(n.responseText),i.postMessage({success:t.success,data:t.data,rocketcdn:!0},e))}}else{s={process:\"subscribe\",message:\"token_not_received\"};i.postMessage({success:!1,data:s,rocketcdn:!0},e)}}(t.data,s),(e=t.data).hasOwnProperty(\"rocketcdn_process\")&&(i=\"\",i+=\"action=rocketcdn_process_set\",i+=\"&status=\"+e.rocketcdn_process,r(i+=\"&nonce=\"+rocket_ajax_data.nonce)),function(t,e){let i=a.querySelector(\"#rocketcdn-iframe\").contentWindow;if(t.hasOwnProperty(\"rocketcdn_url\")){var s=\"\";s+=\"action=rocketcdn_enable\",s+=\"&cdn_url=\"+t.rocketcdn_url;const n=r(s+=\"&nonce=\"+rocket_ajax_data.nonce);n.onreadystatechange=()=>{var t;n.readyState===XMLHttpRequest.DONE&&200===n.status&&(t=JSON.parse(n.responseText),i.postMessage({success:t.success,data:t.data,rocketcdn:!0},e))}}}(t.data,s),function(t,e){let i=a.querySelector(\"#rocketcdn-iframe\").contentWindow;if(t.hasOwnProperty(\"rocketcdn_disable\")){t=\"\";t+=\"action=rocketcdn_disable\";const s=r(t+=\"&nonce=\"+rocket_ajax_data.nonce);s.onreadystatechange=()=>{var t;s.readyState===XMLHttpRequest.DONE&&200===s.status&&(t=JSON.parse(s.responseText),i.postMessage({success:t.success,data:t.data,rocketcdn:!0},e))}}}(t.data,s),(s=t.data).hasOwnProperty(\"rocketcdn_validate_token\")&&s.hasOwnProperty(\"rocketcdn_validate_cname\")&&(t=\"\",t+=\"action=rocketcdn_validate_token_cname\",t+=\"&cdn_url=\"+s.rocketcdn_validate_cname,t+=\"&cdn_token=\"+s.rocketcdn_validate_token,r(t+=\"&nonce=\"+rocket_ajax_data.nonce)))}},{}],9:[function(t,e,i){\"use strict\";(window._gsQueue||(window._gsQueue=[])).push(function(){window._gsDefine(\"TimelineLite\",[\"core.Animation\",\"core.SimpleTimeline\",\"TweenLite\"],function(h,u,p){function d(t){u.call(this,t),this._labels={},this.autoRemoveChildren=!0===this.vars.autoRemoveChildren,this.smoothChildTiming=!0===this.vars.smoothChildTiming,this._sortChildren=!0,this._onUpdate=this.vars.onUpdate;var e,i,s=this.vars;for(i in s)e=s[i],g(e)&&-1!==e.join(\"\").indexOf(\"{self}\")&&(s[i]=this._swapSelfInParams(e));g(s.tweens)&&this.add(s.tweens,0,s.align,s.stagger)}function _(t){var e,i={};for(e in t)i[e]=t[e];return i}function n(t,e,i,s){t._timeline.pause(t._startTime),e&&e.apply(s||t._timeline,i||v)}var f=1e-10,m=p._internals.isSelector,g=p._internals.isArray,v=[],a=window._gsDefine.globals,w=v.slice,t=d.prototype=new u;return d.version=\"1.12.1\",t.constructor=d,t.kill()._gc=!1,t.to=function(t,e,i,s){var n=i.repeat&&a.TweenMax||p;return e?this.add(new n(t,e,i),s):this.set(t,i,s)},t.from=function(t,e,i,s){return this.add((i.repeat&&a.TweenMax||p).from(t,e,i),s)},t.fromTo=function(t,e,i,s,n){var r=s.repeat&&a.TweenMax||p;return e?this.add(r.fromTo(t,e,i,s),n):this.set(t,s,n)},t.staggerTo=function(t,e,i,s,n,r,a,o){var l,c=new d({onComplete:r,onCompleteParams:a,onCompleteScope:o,smoothChildTiming:this.smoothChildTiming});for(\"string\"==typeof t&&(t=p.selector(t)||t),m(t)&&(t=w.call(t,0)),s=s||0,l=0;t.length>l;l++)i.startAt&&(i.startAt=_(i.startAt)),c.to(t[l],e,_(i),l*s);return this.add(c,n)},t.staggerFrom=function(t,e,i,s,n,r,a,o){return i.immediateRender=0!=i.immediateRender,i.runBackwards=!0,this.staggerTo(t,e,i,s,n,r,a,o)},t.staggerFromTo=function(t,e,i,s,n,r,a,o,l){return s.startAt=i,s.immediateRender=0!=s.immediateRender&&0!=i.immediateRender,this.staggerTo(t,e,s,n,r,a,o,l)},t.call=function(t,e,i,s){return this.add(p.delayedCall(0,t,e,i),s)},t.set=function(t,e,i){return i=this._parseTimeOrLabel(i,0,!0),null==e.immediateRender&&(e.immediateRender=i===this._time&&!this._paused),this.add(new p(t,0,e),i)},d.exportRoot=function(t,e){null==(t=t||{}).smoothChildTiming&&(t.smoothChildTiming=!0);var i,s,n=new d(t),t=n._timeline;for(null==e&&(e=!0),t._remove(n,!0),n._startTime=0,n._rawPrevTime=n._time=n._totalTime=t._time,i=t._first;i;)s=i._next,e&&i instanceof p&&i.target===i.vars.onComplete||n.add(i,i._startTime-i._delay),i=s;return t.add(n,0),n},t.add=function(t,e,i,s){var n,r,a,o,l,c;if(\"number\"!=typeof e&&(e=this._parseTimeOrLabel(e,0,!0,t)),!(t instanceof h)){if(t instanceof Array||t&&t.push&&g(t)){for(i=i||\"normal\",s=s||0,n=e,r=t.length,a=0;at._startTime;l._timeline;)c&&l._timeline.smoothChildTiming?l.totalTime(l._totalTime,!0):l._gc&&l._enabled(!0,!1),l=l._timeline;return this},t.remove=function(t){if(t instanceof h)return this._remove(t,!1);if(t instanceof Array||t&&t.push&&g(t)){for(var e=t.length;-1<--e;)this.remove(t[e]);return this}return\"string\"==typeof t?this.removeLabel(t):this.kill(null,t)},t._remove=function(t,e){u.prototype._remove.call(this,t,e);e=this._last;return e?this._time>e._startTime+e._totalDuration/e._timeScale&&(this._time=this.duration(),this._totalTime=this._totalDuration):this._time=this._totalTime=this._duration=this._totalDuration=0,this},t.append=function(t,e){return this.add(t,this._parseTimeOrLabel(null,e,!0,t))},t.insert=t.insertMultiple=function(t,e,i,s){return this.add(t,e||0,i,s)},t.appendMultiple=function(t,e,i,s){return this.add(t,this._parseTimeOrLabel(null,e,!0,t),i,s)},t.addLabel=function(t,e){return this._labels[t]=this._parseTimeOrLabel(e),this},t.addPause=function(t,e,i,s){return this.call(n,[\"{self}\",e,i,s],this,t)},t.removeLabel=function(t){return delete this._labels[t],this},t.getLabelTime=function(t){return null!=this._labels[t]?this._labels[t]:-1},t._parseTimeOrLabel=function(t,e,i,s){var n;if(s instanceof h&&s.timeline===this)this.remove(s);else if(s&&(s instanceof Array||s.push&&g(s)))for(n=s.length;-1<--n;)s[n]instanceof h&&s[n].timeline===this&&this.remove(s[n]);if(\"string\"==typeof e)return this._parseTimeOrLabel(e,i&&\"number\"==typeof t&&null==this._labels[e]?t-this.duration():0,i);if(e=e||0,\"string\"!=typeof t||!isNaN(t)&&null==this._labels[t])null==t&&(t=this.duration());else{if(-1===(n=t.indexOf(\"=\")))return null==this._labels[t]?i?this._labels[t]=this.duration()+e:e:this._labels[t]+e;e=parseInt(t.charAt(n-1)+\"1\",10)*Number(t.substr(n+1)),t=1f&&(a=\"onReverseComplete\"))),this._rawPrevTime=this._duration||!e||t||this._rawPrevTime===t?t:f,t=l+1e-4):t<1e-7?(((this._totalTime=this._time=0)!==c||0===this._duration&&this._rawPrevTime!==f&&(0=c)for(s=this._first;s&&(r=s._next,!this._paused||p);)(s._active||s._startTime<=this._time&&!s._paused&&!s._gc)&&(s._reversed?s.render((s._dirty?s.totalDuration():s._totalDuration)-(t-s._startTime)*s._timeScale,e,i):s.render((t-s._startTime)*s._timeScale,e,i)),s=r;else for(s=this._last;s&&(r=s._prev,!this._paused||p);)(s._active||c>=s._startTime&&!s._paused&&!s._gc)&&(s._reversed?s.render((s._dirty?s.totalDuration():s._totalDuration)-(t-s._startTime)*s._timeScale,e,i):s.render((t-s._startTime)*s._timeScale,e,i)),s=r;this._onUpdate&&(e||this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||v)),a&&(this._gc||h!==this._startTime&&u===this._timeScale||!(0===this._time||l>=this.totalDuration())||(n&&(this._timeline.autoRemoveChildren&&this._enabled(!1,!1),this._active=!1),!e&&this.vars[a]&&this.vars[a].apply(this.vars[a+\"Scope\"]||this,this.vars[a+\"Params\"]||v)))}},t._hasPausedChild=function(){for(var t=this._first;t;){if(t._paused||t instanceof d&&t._hasPausedChild())return!0;t=t._next}return!1},t.getChildren=function(t,e,i,s){s=s||-9999999999;for(var n=[],r=this._first,a=0;r;)s>r._startTime||(r instanceof p?!1!==e&&(n[a++]=r):(!1!==i&&(n[a++]=r),!1!==t&&(a=(n=n.concat(r.getChildren(!0,e,i))).length))),r=r._next;return n},t.getTweensOf=function(t,e){var i,s,n=this._gc,r=[],a=0;for(n&&this._enabled(!0,!0),s=(i=p.getTweensOf(t)).length;-1<--s;)(i[s].timeline===this||e&&this._contains(i[s]))&&(r[a++]=i[s]);return n&&this._enabled(!1,!0),r},t._contains=function(t){for(var e=t.timeline;e;){if(e===this)return!0;e=e.timeline}return!1},t.shiftChildren=function(t,e,i){i=i||0;for(var s,n=this._first,r=this._labels;n;)n._startTime>=i&&(n._startTime+=t),n=n._next;if(e)for(s in r)r[s]>=i&&(r[s]+=t);return this._uncache(!0)},t._kill=function(t,e){if(!t&&!e)return this._enabled(!1,!1);for(var i=e?this.getTweensOf(e):this.getChildren(!0,!0,!1),s=i.length,n=!1;-1<--s;)i[s]._kill(t,e)&&(n=!0);return n},t.clear=function(t){var e=this.getChildren(!1,!0,!0),i=e.length;for(this._time=this._totalTime=0;-1<--i;)e[i]._enabled(!1,!1);return!1!==t&&(this._labels={}),this._uncache(!0)},t.invalidate=function(){for(var t=this._first;t;)t.invalidate(),t=t._next;return this},t._enabled=function(t,e){if(t===this._gc)for(var i=this._first;i;)i._enabled(t,!0),i=i._next;return u.prototype._enabled.call(this,t,e)},t.duration=function(t){return arguments.length?(0!==this.duration()&&0!==t&&this.timeScale(this._duration/t),this):(this._dirty&&this.totalDuration(),this._duration)},t.totalDuration=function(t){if(arguments.length)return 0!==this.totalDuration()&&0!==t&&this.timeScale(this._totalDuration/t),this;if(this._dirty){for(var e,i,s=0,n=this._last,r=999999999999;n;)e=n._prev,n._dirty&&n.totalDuration(),n._startTime>r&&this._sortChildren&&!n._paused?this.add(n,n._startTime-n._delay):r=n._startTime,n._startTime<0&&!n._paused&&(s-=n._startTime,this._timeline.smoothChildTiming&&(this._startTime+=n._startTime/this._timeScale),this.shiftChildren(-n._startTime,!1,-9999999999),r=0),s<(i=n._startTime+n._totalDuration/n._timeScale)&&(s=i),n=e;this._duration=this._totalDuration=s,this._dirty=!1}return this._totalDuration},t.usesFrames=function(){for(var t=this._timeline;t._timeline;)t=t._timeline;return t===h._rootFramesTimeline},t.rawTime=function(){return this._paused?this._totalTime:(this._timeline.rawTime()-this._startTime)*this._timeScale},d},!0)}),window._gsDefine&&window._gsQueue.pop()()},{}],10:[function(t,Q,e){\"use strict\";!function(p){var e,i,d=p.GreenSockGlobals||p;if(!d.TweenLite){var _,f=function(t){for(var e=t.split(\".\"),i=d,s=0;e.length>s;s++)i[e[s]]=i=i[e[s]]||{};return i},u=f(\"com.greensock\"),m=1e-10,o=[].slice,g=function(){},h=(e=Object.prototype.toString,i=e.call([]),function(t){return null!=t&&(t instanceof Array||\"object\"==typeof t&&!!t.push&&e.call(t)===i)}),v={},w=function(o,l,c,h){this.sc=v[o]?v[o].sc:[],(v[o]=this).gsClass=null,this.func=c;var u=[];this.check=function(t){for(var e,i,s,n,r=l.length,a=r;-1<--r;)(e=v[l[r]]||new w(l[r],[])).gsClass?(u[r]=e.gsClass,a--):t&&e.sc.push(this);if(0===a&&c)for(s=(i=(\"com.greensock.\"+o).split(\".\")).pop(),n=f(i.join(\".\"))[s]=this.gsClass=c.apply(c,u),h&&(d[s]=n,\"function\"==typeof define&&define.amd?define((p.GreenSockAMDPath?p.GreenSockAMDPath+\"/\":\"\")+o.split(\".\").join(\"/\"),[],function(){return n}):void 0!==Q&&Q.exports&&(Q.exports=n)),r=0;this.sc.length>r;r++)this.sc[r].check()},this.check(!0)},s=p._gsDefine=function(t,e,i,s){return new w(t,e,i,s)},y=u._class=function(t,e,i){return e=e||function(){},s(t,[],function(){return e},i),e};s.globals=d;var t,n=[0,0,1,1],x=[],b=y(\"easing.Ease\",function(t,e,i,s){this._func=t,this._type=i||0,this._power=s||0,this._params=e?n.concat(e):n},!0),T=b.map={},r=b.register=function(t,e,i,s){for(var n,r,a,o,l=e.split(\",\"),c=l.length,h=(i||\"easeIn,easeOut,easeInOut\").split(\",\");-1<--c;)for(r=l[c],n=s?y(\"easing.\"+r,null,!0):u.easing[r]||{},a=h.length;-1<--a;)o=h[a],T[r+\".\"+o]=T[o+r]=n[o]=t.getRatio?t:t[o]||new t};for((t=b.prototype)._calcEnd=!1,t.getRatio=function(t){if(this._func)return this._params[0]=t,this._func.apply(null,this._params);var e=this._type,i=this._power,s=1===e?1-t:2===e?t:t<.5?2*t:2*(1-t);return 1===i?s*=s:2===i?s*=s*s:3===i?s*=s*s*s:4===i&&(s*=s*s*s*s),1===e?1-s:2===e?s:t<.5?s/2:1-s/2},l=(a=[\"Linear\",\"Quad\",\"Cubic\",\"Quart\",\"Quint,Strong\"]).length;-1<--l;)t=a[l]+\",Power\"+l,r(new b(null,null,1,l),t,\"easeOut\",!0),r(new b(null,null,2,l),t,\"easeIn\"+(0===l?\",easeNone\":\"\")),r(new b(null,null,3,l),t,\"easeInOut\");T.linear=u.easing.Linear.easeIn,T.swing=u.easing.Quad.easeInOut;var k=y(\"events.EventDispatcher\",function(t){this._listeners={},this._eventTarget=t||this});(t=k.prototype).addEventListener=function(t,e,i,s,n){n=n||0;var r,a,o=this._listeners[t],l=0;for(null==o&&(this._listeners[t]=o=[]),a=o.length;-1<--a;)(r=o[a]).c===e&&r.s===i?o.splice(a,1):0===l&&n>r.pr&&(l=a+1);o.splice(l,0,{c:e,s:i,up:s,pr:n}),this!==A||_||A.wake()},t.removeEventListener=function(t,e){var i,s=this._listeners[t];if(s)for(i=s.length;-1<--i;)if(s[i].c===e)return void s.splice(i,1)},t.dispatchEvent=function(t){var e,i,s,n=this._listeners[t];if(n)for(e=n.length,i=this._eventTarget;-1<--e;)(s=n[e]).up?s.c.call(s.s||i,{type:t,target:i}):s.c.call(s.s||i)};for(var a,P=p.requestAnimationFrame,S=p.cancelAnimationFrame,O=Date.now||function(){return(new Date).getTime()},C=O(),l=(a=[\"ms\",\"moz\",\"webkit\",\"o\"]).length;-1<--l&&!P;)P=p[a[l]+\"RequestAnimationFrame\"],S=p[a[l]+\"CancelAnimationFrame\"]||p[a[l]+\"CancelRequestAnimationFrame\"];y(\"Ticker\",function(t,e){var s,n,r,a,o,l=this,c=O(),i=!1!==e&&P,h=500,u=33,p=function(t){var e,i=O()-C;h=i&&i+this.totalDuration()/this._timeScale>t},t._enabled=function(t,e){return _||A.wake(),this._gc=!t,this._active=this.isActive(),!0!==e&&(t&&!this.timeline?this._timeline.add(this,this._startTime-this._delay):!t&&this.timeline&&this._timeline._remove(this,!0)),!1},t._kill=function(){return this._enabled(!1,!1)},t.kill=function(t,e){return this._kill(t,e),this},t._uncache=function(t){for(var e=t?this:this.timeline;e;)e._dirty=!0,e=e.timeline;return this},t._swapSelfInParams=function(t){for(var e=t.length,i=t.concat();-1<--e;)\"{self}\"===t[e]&&(i[e]=this);return i},t.eventCallback=function(t,e,i,s){if(\"on\"===(t||\"\").substr(0,2)){var n=this.vars;if(1===arguments.length)return n[t];null==e?delete n[t]:(n[t]=e,n[t+\"Params\"]=h(i)&&-1!==i.join(\"\").indexOf(\"{self}\")?this._swapSelfInParams(i):i,n[t+\"Scope\"]=s),\"onUpdate\"===t&&(this._onUpdate=e)}return this},t.delay=function(t){return arguments.length?(this._timeline.smoothChildTiming&&this.startTime(this._startTime+t-this._delay),this._delay=t,this):this._delay},t.duration=function(t){return arguments.length?(this._duration=this._totalDuration=t,this._uncache(!0),this._timeline.smoothChildTiming&&0this._duration?this._duration:t,e)):this._time},t.totalTime=function(t,e,i){if(_||A.wake(),!arguments.length)return this._totalTime;if(this._timeline){if(t<0&&!i&&(t+=this.totalDuration()),this._timeline.smoothChildTiming){this._dirty&&this.totalDuration();var s=this._totalDuration,n=this._timeline;if(ss;)i=i._prev;return i?(t._next=i._next,i._next=t):(t._next=this._first,this._first=t),t._next?t._next._prev=t:this._last=t,t._prev=i,this._timeline&&this._uncache(!0),this},t._remove=function(t,e){return t.timeline===this&&(e||t._enabled(!1,!0),t.timeline=null,t._prev?t._prev._next=t._next:this._first===t&&(this._first=t._next),t._next?t._next._prev=t._prev:this._last===t&&(this._last=t._prev),this._timeline&&this._uncache(!0)),this},t.render=function(t,e,i){var s,n=this._first;for(this._totalTime=this._time=this._rawPrevTime=t;n;)s=n._next,(n._active||t>=n._startTime&&!n._paused)&&(n._reversed?n.render((n._dirty?n.totalDuration():n._totalDuration)-(t-n._startTime)*n._timeScale,e,i):n.render((t-n._startTime)*n._timeScale,e,i)),n=s},t.rawTime=function(){return _||A.wake(),this._totalTime};var I=y(\"TweenLite\",function(t,e,i){if(c.call(this,e,i),this.render=I.prototype.render,null==t)throw\"Cannot tween a null target.\";this.target=t=\"string\"==typeof t&&I.selector(t)||t;var s,n,r,i=t.jquery||t.length&&t!==p&&t[0]&&(t[0]===p||t[0].nodeType&&t[0].style&&!t.nodeType),a=this.vars.overwrite;if(this._overwrite=a=null==a?F[I.defaultOverwrite]:\"number\"==typeof a?a>>0:F[a],(i||t instanceof Array||t.push&&h(t))&&\"number\"!=typeof t[0])for(this._targets=r=o.call(t,0),this._propLookup=[],this._siblings=[],s=0;r.length>s;s++)(n=r[s])?\"string\"!=typeof n?n.length&&n!==p&&n[0]&&(n[0]===p||n[0].nodeType&&n[0].style&&!n.nodeType)?(r.splice(s--,1),this._targets=r=r.concat(o.call(n,0))):(this._siblings[s]=H(n,this,!1),1===a&&1=a._startTime&&a._startTime+a.totalDuration()/a._timeScale>c&&((p||!a._initted)&&c-a._startTime<=2e-10||(h[u++]=a)));for(d=u;-1<--d;)a=h[d],2===s&&a._kill(i,t)&&(r=!0),(2!==s||!a._firstPT&&a._initted)&&a._enabled(!1,!1)&&(r=!0);return r},W=function(t,e,i){for(var s=t._timeline,n=s._timeScale,r=t._startTime;s._timeline;){if(r+=s._startTime,n*=s._timeScale,s._paused)return-100;s=s._timeline}return e<(r/=n)?r-e:i&&r===e||!t._initted&&r-e<2*m?m:(r+=t.totalDuration()/t._timeScale/n)>e+m?0:r-e-m};t._init=function(){var t,e,i,s,n,r=this.vars,a=this._overwrittenProps,o=this._duration,l=!!r.immediateRender,c=r.ease;if(r.startAt){for(s in this._startAt&&(this._startAt.render(-1,!0),this._startAt.kill()),n={},r.startAt)n[s]=r.startAt[s];if(n.overwrite=!1,n.immediateRender=!0,n.lazy=l&&!1!==r.lazy,n.startAt=n.delay=null,this._startAt=I.to(this.target,0,n),l)if(0o.pr;)s=s._next;(o._prev=s?s._prev:r)?o._prev._next=o:n=o,(o._next=s)?s._prev=o:r=o,o=a}o=e._firstPT=n}for(;o;)o.pg&&\"function\"==typeof o.t[t]&&o.t[t]()&&(i=!0),o=o._next;return i},V.activate=function(t){for(var e=t.length;-1<--e;)t[e].API===V.API&&(E[(new t[e])._propName]=t[e]);return!0},s.plugin=function(t){if(!(t&&t.propName&&t.init&&t.API))throw\"illegal plugin definition.\";var e,i=t.propName,s=t.priority||0,n=t.overwriteProps,r={init:\"_onInitTween\",set:\"setRatio\",kill:\"_kill\",round:\"_roundProps\",initAll:\"_onInitAllProps\"},a=y(\"plugins.\"+i.charAt(0).toUpperCase()+i.substr(1)+\"Plugin\",function(){V.call(this,i,s),this._overwriteProps=n||[]},!0===t.global),o=a.prototype=new V(i);for(e in(o.constructor=a).API=t.API,r)\"function\"==typeof t[e]&&(o[r[e]]=t[e]);return a.version=t.version,V.activate([a]),a},a=p._gsQueue){for(l=0;a.length>l;l++)a[l]();for(t in v)v[t].func||p.console.log(\"GSAP encountered missing dependency: com.greensock.\"+t)}_=!1}}(window)},{}],11:[function(t,e,i){\"use strict\";(window._gsQueue||(window._gsQueue=[])).push(function(){window._gsDefine(\"easing.Back\",[\"easing.Ease\"],function(m){function t(t,e){var i=c(\"easing.\"+t,function(){},!0);return(t=i.prototype=new m).constructor=i,t.getRatio=e,i}function e(t,e,i,s){return s=c(\"easing.\"+t,{easeOut:new e,easeIn:new i,easeInOut:new s},!0),h(s,t),s}function g(t,e,i){this.t=t,this.v=e,i&&(((this.next=i).prev=this).c=i.v-e,this.gap=i.t-t)}function i(t,e){var i=c(\"easing.\"+t,function(t){this._p1=t||0===t?t:1.70158,this._p2=1.525*this._p1},!0);return(t=i.prototype=new m).constructor=i,t.getRatio=e,t.config=function(t){return new i(t)},i}var s,n,r=window.GreenSockGlobals||window,a=r.com.greensock,o=2*Math.PI,l=Math.PI/2,c=a._class,h=m.register||function(){},u=e(\"Back\",i(\"BackOut\",function(t){return--t*t*((this._p1+1)*t+this._p1)+1}),i(\"BackIn\",function(t){return t*t*((this._p1+1)*t-this._p1)}),i(\"BackInOut\",function(t){return(t*=2)<1?.5*t*t*((this._p2+1)*t-this._p2):.5*((t-=2)*t*((this._p2+1)*t+this._p2)+2)})),p=c(\"easing.SlowMo\",function(t,e,i){e=e||0===e?e:.7,null==t?t=.7:1t?this._calcEnd?1-(t=1-t/this._p1)*t:e-(t=1-t/this._p1)*t*t*t*e:t>this._p3?this._calcEnd?1-(t=(t-this._p3)/this._p1)*t:e+(t-e)*(t=(t-this._p3)/this._p1)*t*t*t:this._calcEnd?1:e},p.ease=new p(.7,.7),a.config=p.config=function(t,e,i){return new p(t,e,i)},(a=(s=c(\"easing.SteppedEase\",function(t){this._p1=1/(t=t||1),this._p2=t+1},!0)).prototype=new m).constructor=s,a.getRatio=function(t){return t<0?t=0:1<=t&&(t=.999999999),(this._p2*t>>0)*this._p1},a.config=s.config=function(t){return new s(t)},(a=(n=c(\"easing.RoughEase\",function(t){for(var e,i,s,n,r,a,o=(t=t||{}).taper||\"none\",l=[],c=0,h=0|(t.points||20),u=h,p=!1!==t.randomize,d=!0===t.clamp,_=t.template instanceof m?t.template:null,f=\"number\"==typeof t.strength?.4*t.strength:.4;-1<--u;)e=p?Math.random():1/h*u,i=_?_.getRatio(e):e,s=\"none\"===o?f:\"out\"===o?(n=1-e)*n*f:\"in\"===o?e*e*f:.5*(n=e<.5?2*e:2*(1-e))*n*f,p?i+=Math.random()*s-.5*s:u%2?i+=.5*s:i-=.5*s,d&&(1e.t){for(;e.next&&t>=e.t;)e=e.next;e=e.prev}else for(;e.prev&&e.t>=t;)e=e.prev;return(this._prev=e).v+(t-e.t)/e.gap*e.c},a.config=function(t){return new n(t)},n.ease=new n,e(\"Bounce\",t(\"BounceOut\",function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}),t(\"BounceIn\",function(t){return 1/2.75>(t=1-t)?1-7.5625*t*t:t<2/2.75?1-(7.5625*(t-=1.5/2.75)*t+.75):t<2.5/2.75?1-(7.5625*(t-=2.25/2.75)*t+.9375):1-(7.5625*(t-=2.625/2.75)*t+.984375)}),t(\"BounceInOut\",function(t){var e=t<.5;return t=(t=e?1-2*t:2*t-1)<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,e?.5*(1-t):.5*t+.5})),e(\"Circ\",t(\"CircOut\",function(t){return Math.sqrt(1- --t*t)}),t(\"CircIn\",function(t){return-(Math.sqrt(1-t*t)-1)}),t(\"CircInOut\",function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)})),e(\"Elastic\",(a=function(t,e,i){var s=c(\"easing.\"+t,function(t,e){this._p1=t||1,this._p2=e||i,this._p3=this._p2/o*(Math.asin(1/this._p1)||0)},!0),t=s.prototype=new m;return t.constructor=s,t.getRatio=e,t.config=function(t,e){return new s(t,e)},s})(\"ElasticOut\",function(t){return this._p1*Math.pow(2,-10*t)*Math.sin((t-this._p3)*o/this._p2)+1},.3),a(\"ElasticIn\",function(t){return-(this._p1*Math.pow(2,10*--t)*Math.sin((t-this._p3)*o/this._p2))},.3),a(\"ElasticInOut\",function(t){return(t*=2)<1?-.5*this._p1*Math.pow(2,10*--t)*Math.sin((t-this._p3)*o/this._p2):.5*this._p1*Math.pow(2,-10*--t)*Math.sin((t-this._p3)*o/this._p2)+1},.45)),e(\"Expo\",t(\"ExpoOut\",function(t){return 1-Math.pow(2,-10*t)}),t(\"ExpoIn\",function(t){return Math.pow(2,10*(t-1))-.001}),t(\"ExpoInOut\",function(t){return(t*=2)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*(t-1)))})),e(\"Sine\",t(\"SineOut\",function(t){return Math.sin(t*l)}),t(\"SineIn\",function(t){return 1-Math.cos(t*l)}),t(\"SineInOut\",function(t){return-.5*(Math.cos(Math.PI*t)-1)})),c(\"easing.EaseLookup\",{find:function(t){return m.map[t]}},!0),h(r.SlowMo,\"SlowMo\",\"ease,\"),h(n,\"RoughEase\",\"ease,\"),h(s,\"SteppedEase\",\"ease,\"),u},!0)}),window._gsDefine&&window._gsQueue.pop()()},{}],12:[function(t,e,i){\"use strict\";(window._gsQueue||(window._gsQueue=[])).push(function(){window._gsDefine(\"plugins.CSSPlugin\",[\"plugins.TweenPlugin\",\"TweenLite\"],function(r,p){function N(){r.call(this,\"css\"),this._overwriteProps.length=0,this.setRatio=N.prototype.setRatio}var d,x,b,u,_={},t=N.prototype=new r(\"css\");(t.constructor=N).version=\"1.12.1\",N.API=2,N.defaultTransformPerspective=0,N.defaultSkewType=\"compensated\",N.suffixMap={top:t=\"px\",right:t,bottom:t,left:t,width:t,height:t,fontSize:t,padding:t,margin:t,perspective:t,lineHeight:\"\"};function n(t,e){return e.toUpperCase()}function a(t){return L.test(\"string\"==typeof t?t:(t.currentStyle||t.style).filter||\"\")?parseFloat(RegExp.$1)/100:1}function f(t){window.console&&console.log(t)}function T(t,e){var i,s,n=(e=e||Z).style;if(void 0!==n[t])return t;for(t=t.charAt(0).toUpperCase()+t.substr(1),i=[\"O\",\"Moz\",\"ms\",\"Ms\",\"Webkit\"],s=5;-1<--s&&void 0===n[i[s]+t];);return 0<=s?(tt=\"-\"+(et=3===s?\"ms\":i[s]).toLowerCase()+\"-\",et+t):null}function m(t,e){var i,s={};if(e=e||it(t,null))if(i=e.length)for(;-1<--i;)s[e[i].replace(Y,n)]=e.getPropertyValue(e[i]);else for(i in e)s[i]=e[i];else if(e=t.currentStyle||t.style)for(i in e)\"string\"==typeof i&&void 0===s[i]&&(s[i.replace(Y,n)]=e[i]);return J||(s.opacity=a(t)),t=Pt(t,e,!1),s.rotation=t.rotation,s.skewX=t.skewX,s.scaleX=t.scaleX,s.scaleY=t.scaleY,s.x=t.x,s.y=t.y,Tt&&(s.z=t.z,s.rotationX=t.rotationX,s.rotationY=t.rotationY,s.scaleZ=t.scaleZ),s.filters&&delete s.filters,s}function g(t,e,i,s,n){var r,a,o,l={},c=t.style;for(a in i)\"cssText\"!==a&&\"length\"!==a&&isNaN(a)&&(e[a]!==(r=i[a])||n&&n[a])&&-1===a.indexOf(\"Origin\")&&(\"number\"==typeof r||\"string\"==typeof r)&&(l[a]=\"auto\"!==r||\"left\"!==a&&\"top\"!==a?\"\"!==r&&\"auto\"!==r&&\"none\"!==r||\"string\"!=typeof e[a]||\"\"===e[a].replace(D,\"\")?r:0:rt(t,a),void 0!==c[a]&&(o=new pt(c,a,c[a],o)));if(s)for(a in s)\"className\"!==a&&(l[a]=s[a]);return{difs:l,firstMPT:o}}function v(t,e){var i=(t=null==t||\"\"===t||\"auto\"===t||\"auto auto\"===t?\"0 0\":t).split(\" \"),s=-1!==t.indexOf(\"left\")?\"0%\":-1!==t.indexOf(\"right\")?\"100%\":i[0];return null==(t=-1!==t.indexOf(\"top\")?\"0%\":-1!==t.indexOf(\"bottom\")?\"100%\":i[1])?t=\"0\":\"center\"===t&&(t=\"50%\"),(\"center\"===s||isNaN(parseFloat(s))&&-1===(s+\"\").indexOf(\"=\"))&&(s=\"50%\"),e&&(e.oxp=-1!==s.indexOf(\"%\"),e.oyp=-1!==t.indexOf(\"%\"),e.oxr=\"=\"===s.charAt(1),e.oyr=\"=\"===t.charAt(1),e.ox=parseFloat(s.replace(D,\"\")),e.oy=parseFloat(t.replace(D,\"\"))),s+\" \"+t+(2>16,255&t>>8,255&t]:(\",\"===t.charAt(t.length-1)&&(t=t.substr(0,t.length-1)),lt[t]||(\"#\"===t.charAt(0)?(4===t.length&&(t=\"#\"+(e=t.charAt(1))+e+(i=t.charAt(2))+i+(r=t.charAt(3))+r),[(t=parseInt(t.substr(1),16))>>16,255&t>>8,255&t]):(\"hsl\"===t.substr(0,3)?(t=t.match(A),s=Number(t[0])%360/360,n=Number(t[1])/100,e=2*(r=Number(t[2])/100)-(i=r<=.5?r*(1+n):r+n-r*n),3a\",!!(i=i.getElementsByTagName(\"a\")[0])&&/^0.55/.test(i.style.opacity)),tt=\"\",et=\"\",it=Q.defaultView?Q.defaultView.getComputedStyle:function(){},st=N.getStyle=function(t,e,i,s,n){var r;return J||\"opacity\"!==e?(!s&&t.style[e]?r=t.style[e]:(i=i||it(t))?r=i[e]||i.getPropertyValue(e)||i.getPropertyValue(e.replace(z,\"-$1\").toLowerCase()):t.currentStyle&&(r=t.currentStyle[e]),null==n||r&&\"none\"!==r&&\"auto\"!==r&&\"auto auto\"!==r?r:n):a(t)},nt=s.convertToPixels=function(t,e,i,s,n){if(\"px\"===s||!s)return i;if(\"auto\"===s||!i)return 0;var r,a,o,l=$.test(e),c=t,h=Z.style,u=i<0;if(u&&(i=-i),\"%\"===s&&-1!==e.indexOf(\"border\"))r=i/100*(l?t.clientWidth:t.clientHeight);else{if(h.cssText=\"border:0 solid red;position:\"+st(t,\"position\")+\";line-height:0;\",\"%\"!==s&&c.appendChild)h[l?\"borderLeftWidth\":\"borderTopWidth\"]=i+s;else{if(a=(c=t.parentNode||Q.body)._gsCache,o=p.ticker.frame,a&&l&&a.time===o)return a.width*i/100;h[l?\"width\":\"height\"]=i+s}c.appendChild(Z),r=parseFloat(Z[l?\"offsetWidth\":\"offsetHeight\"]),c.removeChild(Z),l&&\"%\"===s&&!1!==N.cacheWidths&&((a=c._gsCache=c._gsCache||{}).time=o,a.width=r/i*100),0!==r||n||(r=nt(t,e,i,s,!0))}return u?-r:r},rt=s.calculateOffset=function(t,e,i){if(\"absolute\"!==st(t,\"position\",i))return 0;var s=\"left\"===e?\"Left\":\"Top\",i=st(t,\"margin\"+s,i);return t[\"offset\"+s]-(nt(t,e,parseFloat(i),i.replace(j,\"\"))||0)},at={width:[\"Left\",\"Right\"],height:[\"Top\",\"Bottom\"]},ot=[\"marginLeft\",\"marginRight\",\"marginTop\",\"marginBottom\"],lt={aqua:[0,255,255],lime:[0,255,0],silver:[192,192,192],black:[0,0,0],maroon:[128,0,0],teal:[0,128,128],blue:[0,0,255],navy:[0,0,128],white:[255,255,255],fuchsia:[255,0,255],olive:[128,128,0],yellow:[255,255,0],orange:[255,165,0],gray:[128,128,128],purple:[128,0,128],green:[0,128,0],red:[255,0,0],pink:[255,192,203],cyan:[0,255,255],transparent:[255,255,255,0]},ct=\"(?:\\\\b(?:(?:rgb|rgba|hsl|hsla)\\\\(.+?\\\\))|\\\\B#.+?\\\\b\";for(t in lt)ct+=\"|\"+t+\"\\\\b\";function ht(t,e,r,a){if(null==t)return function(t){return t};var o,l=e?(t.match(ct)||[\"\"])[0]:\"\",c=t.split(l).join(\"\").match(I)||[],h=t.substr(0,t.indexOf(c[0])),u=\")\"===t.charAt(t.length-1)?\")\":\"\",p=-1!==t.indexOf(\" \")?\" \":\",\",d=c.length,_=0s;s++)n[s]=o(n[s]);return n.join(\",\")}if(e=(t.match(ct)||[l])[0],s=(i=t.split(e).join(\"\").match(I)||[]).length,d>s--)for(;d>++s;)i[s]=r?i[0|(s-1)/2]:c[s];return h+i.join(p)+p+e+u+(-1!==t.indexOf(\"inset\")?\" inset\":\"\")}:function(t){var e,i,s;if(\"number\"==typeof t)t+=_;else if(a&&H.test(t)){for(i=t.replace(H,\"|\").split(\"|\"),s=0;i.length>s;s++)i[s]=o(i[s]);return i.join(\",\")}if(s=(e=t.match(I)||[]).length,d>s--)for(;d>++s;)e[s]=r?e[0|(s-1)/2]:c[s];return h+e.join(p)+u}:function(t){return t}}function ut(c){return c=c.split(\",\"),function(t,e,i,s,n,r,a){var o,l=(e+\"\").split(\" \");for(a={},o=0;o<4;o++)a[c[o]]=l[o]=l[o]||l[(o-1)/2>>0];return s.parse(t,a,n,r)}}var ct=RegExp(ct+\")\",\"gi\"),pt=(s._setPluginRatio=function(t){this.plugin.setRatio(t);for(var e,i,s,n,r=this.data,a=r.proxy,o=r.firstMPT;o;)e=a[o.v],o.r?e=Math.round(e):e<1e-6&&-1e-6s;s++)n+=i[\"xn\"+s]+i[\"xs\"+(s+1)];i.e=n}}else i.e=i.s+i.xs0;o=o._next}},function(t,e,i,s,n){this.t=t,this.p=e,this.v=i,this.r=n,s&&((s._prev=this)._next=s)}),dt=(s._parseToProxy=function(t,e,i,s,n,r){var a,o,l,c,h=s,u={},p={},d=i._transform,_=V;for(i._transform=null,V=e,s=n=i.parse(t,e,s,n),V=_,r&&(i._transform=d,h&&(h._prev=null,h._prev&&(h._prev._next=null)));s&&s!==h;){if(s.type<=1&&(p[o=s.p]=s.s+s.c,u[o]=s.s,r||(c=new pt(s,\"s\",o,c,s.r),s.c=0),1===s.type))for(a=s.l;0<--a;)p[o=s.p+\"_\"+(l=\"xn\"+a)]=s.data[l],u[o]=s[l],r||(c=new pt(s,l,o,c,s.rxp[l]));s=s._next}return{proxy:u,end:p,firstMPT:c,pt:n}},s.CSSPropTween=function(t,e,i,s,n,r,a,o,l,c,h){this.t=t,this.p=e,this.s=i,this.c=s,this.n=a||e,t instanceof dt||u.push(this.n),this.r=o,this.type=r||0,l&&(this.pr=l,d=!0),this.b=void 0===c?i:c,this.e=void 0===h?i+s:h,n&&((this._next=n)._prev=this)}),_t=N.parseComplex=function(t,e,i,s,n,r,a,o,l,c){a=new dt(t,e,0,0,a,c?2:1,null,!1,o,i=i||r||\"\",s),s+=\"\";var h,u,p,d,_,f,m,g,v,w,y,x=i.split(\", \").join(\",\").split(\" \"),b=s.split(\", \").join(\",\").split(\" \"),T=x.length,k=!1!==O;for(-1===s.indexOf(\",\")&&-1===i.indexOf(\",\")||(x=x.join(\" \").replace(H,\", \").split(\" \"),b=b.join(\" \").replace(H,\", \").split(\" \"),T=x.length),T!==b.length&&(T=(x=(r||\"\").split(\" \")).length),a.plugin=l,a.setRatio=c,h=0;hu;u++)w=f[u],v=d.indexOf(w,p),a.appendXtra(d.substr(p,v-p),Number(w),P(m[u],w),\"\",k&&\"px\"===d.substr(v+w.length,2),0===u),p=v+w.length;a[\"xs\"+a.l]+=d.substr(p)}else a[\"xs\"+a.l]+=a.l?\" \"+d:d;if(-1!==s.indexOf(\"=\")&&a.data){for(y=a.xs0+a.data.s,h=1;a.l>h;h++)y+=a[\"xs\"+h]+a.data[\"xn\"+h];a.e=y+a[\"xs\"+h]}return a.l||(a.type=-1,a.xs0=a.e),a.xfirst||a},ft=9;for((t=dt.prototype).l=t.pr=0;0<--ft;)t[\"xn\"+ft]=0,t[\"xs\"+ft]=\"\";t.xs0=\"\",t._next=t._prev=t.xfirst=t.data=t.plugin=t.setRatio=t.rxp=null,t.appendXtra=function(t,e,i,s,n,r){var a=this,o=a.l;return a[\"xs\"+o]+=r&&o?\" \"+t:t||\"\",i||0===o||a.plugin?(a.l++,a.type=a.setRatio?2:1,a[\"xs\"+a.l]=s||\"\",0s;s++)e.prefix=0===s&&e.prefix,e.defaultValue=i[s]||r,new mt(n[s],e)};(t=mt.prototype).parseComplex=function(t,e,i,s,n,r){var a,o,l,c,h,u=this.keyword;if(this.multi&&(H.test(i)||H.test(e)?(o=e.replace(H,\"|\").split(\"|\"),l=i.replace(H,\"|\").split(\"|\")):u&&(o=[e],l=[i])),l){for(c=(l.length>o.length?l:o).length,a=0;aI[r]&&I[r]>-j&&(I[r]=0);return i&&(t._gsTransform=I),I},St=s.set3DTransformRatio=function(t){var e,i,s,n,r,a,o,l,c,h,u,p,d,_,f,m,g,v,w,y,x,b,T=this.data,k=this.t.style,P=T.rotation*U,S=T.scaleX,O=T.scaleY,C=T.scaleZ,A=T.perspective;if(1!==t&&0!==t||\"auto\"!==T.force3D||T.rotationY||T.rotationX||1!==C||A||T.z){if(M&&(S<1e-4&&-1e-4y;y++)this.p.indexOf(\"border\")&&(f[y]=T(f[y])),-1!==(o=a=st(t,f[y],b,!1,\"0px\")).indexOf(\" \")&&(o=(a=o.split(\" \"))[0],a=a[1]),l=r=w[y],d=parseFloat(o),_=o.substr((d+\"\").length),(h=\"\"===(h=(u=\"=\"===l.charAt(1))?(c=parseInt(l.charAt(0)+\"1\",10),l=l.substr(2),c*=parseFloat(l),l.substr((c+\"\").length-(c<0?1:0))||\"\"):(c=parseFloat(l),l.substr((c+\"\").length)))?x[i]||_:h)!==_&&(p=nt(t,\"borderLeft\",d,_),d=nt(t,\"borderTop\",d,_),a=\"%\"===h?(o=p/g*100+\"%\",d/v*100+\"%\"):\"em\"===h?(o=p/(_=nt(t,\"borderLeft\",1,\"em\"))+\"em\",d/_+\"em\"):(o=p+\"px\",d+\"px\"),u&&(l=parseFloat(o)+c+h,r=parseFloat(a)+c+h)),n=_t(m,f[y],o+\" \"+a,l+\" \"+r,!1,\"0px\",n);return n},prefix:!0,formatter:ht(\"0px 0px 0px 0px\",!1,!0)}),gt(\"backgroundPosition\",{defaultValue:\"0 0\",parser:function(t,e,i,s,n,r){var a,o,l,c,h,u,p=\"background-position\",d=b||it(t,null),_=this.format((d?C?d.getPropertyValue(p+\"-x\")+\" \"+d.getPropertyValue(p+\"-y\"):d.getPropertyValue(p):t.currentStyle.backgroundPositionX+\" \"+t.currentStyle.backgroundPositionY)||\"0 0\"),e=this.format(e);if(-1!==_.indexOf(\"%\")!=(-1!==e.indexOf(\"%\"))&&((u=st(t,\"backgroundImage\").replace(F,\"\"))&&\"none\"!==u)){for(a=_.split(\" \"),o=e.split(\" \"),G.setAttribute(\"src\",u),l=2;-1<--l;)(c=-1!==(_=a[l]).indexOf(\"%\"))!=(-1!==o[l].indexOf(\"%\"))&&(h=0===l?t.offsetWidth-G.width:t.offsetHeight-G.height,a[l]=c?parseFloat(_)/100*h+\"px\":parseFloat(_)/h*100+\"%\");_=a.join(\" \")}return this.parseComplex(t.style,_,e,n,r)},formatter:v}),gt(\"backgroundSize\",{defaultValue:\"0 0\",formatter:v}),gt(\"perspective\",{defaultValue:\"0px\",prefix:!0}),gt(\"perspectiveOrigin\",{defaultValue:\"50% 50%\",prefix:!0}),gt(\"transformStyle\",{prefix:!0}),gt(\"backfaceVisibility\",{prefix:!0}),gt(\"userSelect\",{prefix:!0}),gt(\"margin\",{parser:ut(\"marginTop,marginRight,marginBottom,marginLeft\")}),gt(\"padding\",{parser:ut(\"paddingTop,paddingRight,paddingBottom,paddingLeft\")}),gt(\"clip\",{defaultValue:\"rect(0px,0px,0px,0px)\",parser:function(t,e,i,s,n,r){var a,o;return e=C<9?(a=t.currentStyle,o=C<8?\" \":\",\",a=\"rect(\"+a.clipTop+o+a.clipRight+o+a.clipBottom+o+a.clipLeft+\")\",this.format(e).split(\",\").join(o)):(a=this.format(st(t,this.p,b,!1,this.dflt)),this.format(e)),this.parseComplex(t.style,a,e,n,r)}}),gt(\"textShadow\",{defaultValue:\"0px 0px 0px #999\",color:!0,multi:!0}),gt(\"autoRound,strictUnits\",{parser:function(t,e,i,s,n){return n}}),gt(\"border\",{defaultValue:\"0px solid #000\",parser:function(t,e,i,s,n,r){return this.parseComplex(t.style,this.format(st(t,\"borderTopWidth\",b,!1,\"0px\")+\" \"+st(t,\"borderTopStyle\",b,!1,\"solid\")+\" \"+st(t,\"borderTopColor\",b,!1,\"#000\")),this.format(e),n,r)},color:!0,formatter:function(t){var e=t.split(\" \");return e[0]+\" \"+(e[1]||\"solid\")+\" \"+(t.match(ct)||[\"#000\"])[0]}}),gt(\"borderWidth\",{parser:ut(\"borderTopWidth,borderRightWidth,borderBottomWidth,borderLeftWidth\")}),gt(\"float,cssFloat,styleFloat\",{parser:function(t,e,i,s,n){var r=t.style,t=\"cssFloat\"in r?\"cssFloat\":\"styleFloat\";return new dt(r,t,0,0,n,-1,i,!1,0,r[t],e)}});function Ct(t){var e,i=this.t,s=i.filter||st(this.data,\"filter\"),t=0|this.s+this.c*t;(e=100==t?-1===s.indexOf(\"atrix(\")&&-1===s.indexOf(\"radient(\")&&-1===s.indexOf(\"oader(\")?(i.removeAttribute(\"filter\"),!st(this.data,\"filter\")):(i.filter=s.replace(l,\"\"),!0):e)||(this.xn1&&(i.filter=s=s||\"alpha(opacity=\"+t+\")\"),-1===s.indexOf(\"pacity\")?0==t&&this.xn1||(i.filter=s+\" alpha(opacity=\"+t+\")\"):i.filter=s.replace(L,\"opacity=\"+t))}gt(\"opacity,alpha,autoAlpha\",{defaultValue:\"1\",parser:function(t,e,i,s,n,r){var a=parseFloat(st(t,\"opacity\",b,!1,\"1\")),o=t.style,l=\"autoAlpha\"===i;return\"string\"==typeof e&&\"=\"===e.charAt(1)&&(e=(\"-\"===e.charAt(0)?-1:1)*parseFloat(e.substr(2))+a),l&&1===a&&\"hidden\"===st(t,\"visibility\",b)&&0!==e&&(a=0),J?n=new dt(o,\"opacity\",a,e-a,n):((n=new dt(o,\"opacity\",100*a,100*(e-a),n)).xn1=l?1:0,o.zoom=1,n.type=2,n.b=\"alpha(opacity=\"+n.s+\")\",n.e=\"alpha(opacity=\"+(n.s+n.c)+\")\",n.data=t,n.plugin=r,n.setRatio=Ct),l&&((n=new dt(o,\"visibility\",0,0,n,-1,null,!1,0,0!==a?\"inherit\":\"hidden\",0===e?\"hidden\":\"inherit\")).xs0=\"inherit\",s._overwriteProps.push(n.n),s._overwriteProps.push(i)),n}});function At(t,e){e&&(t.removeProperty?(\"ms\"===e.substr(0,2)&&(e=\"M\"+e.substr(1)),t.removeProperty(e.replace(z,\"-$1\").toLowerCase())):t.removeAttribute(e))}function Mt(t){if(this.t._gsClassPT=this,1===t||0===t){this.t.setAttribute(\"class\",0===t?this.b:this.e);for(var e=this.data,i=this.t.style;e;)e.v?i[e.p]=e.v:At(i,e.p),e=e._next;1===t&&this.t._gsClassPT===this&&(this.t._gsClassPT=null)}else this.t.getAttribute(\"class\")!==this.e&&this.t.setAttribute(\"class\",this.e)}gt(\"className\",{parser:function(t,e,i,s,n,r,a){var o,l,c,h=t.getAttribute(\"class\")||\"\",u=t.style.cssText;if((n=s._classNamePT=new dt(t,i,0,0,n,2)).setRatio=Mt,n.pr=-11,d=!0,n.b=h,o=m(t,b),i=t._gsClassPT){for(l={},c=i.data;c;)l[c.p]=1,c=c._next;i.setRatio(1)}return(t._gsClassPT=n).e=\"=\"!==e.charAt(1)?e:h.replace(RegExp(\"\\\\s*\\\\b\"+e.substr(2)+\"\\\\b\"),\"\")+(\"+\"===e.charAt(0)?\" \"+e.substr(2):\"\"),s._tween._duration&&(t.setAttribute(\"class\",n.e),a=g(t,o,m(t),a,l),t.setAttribute(\"class\",h),n.data=a.firstMPT,t.style.cssText=u,n=n.xfirst=s.parse(t,a.difs,n,r)),n}});function Rt(t){if((1===t||0===t)&&this.data._totalTime===this.data._totalDuration&&\"isFromStart\"!==this.data.data){var e,i,s,n,r=this.t.style,a=_.transform.parse;if(\"all\"===this.e)n=!(r.cssText=\"\");else for(s=(e=this.e.split(\",\")).length;-1<--s;)i=e[s],_[i]&&(_[i].parse===a?n=!0:i=\"transformOrigin\"===i?bt:_[i].p),At(r,i);n&&(At(r,yt),this.t._gsTransform&&delete this.t._gsTransform)}}for(gt(\"clearProps\",{parser:function(t,e,i,s,n){return(n=new dt(t,i,0,0,n,2)).setRatio=Rt,n.e=e,n.pr=-10,n.data=s._tween,d=!0,n}}),t=\"bezier,throwProps,physicsProps,physics2D\".split(\",\"),ft=t.length;ft--;)!function(t){var l;_[t]||(l=t.charAt(0).toUpperCase()+t.substr(1)+\"Plugin\",gt(t,{parser:function(t,e,i,s,n,r,a){var o=(window.GreenSockGlobals||window).com.greensock.plugins[l];return o?(o._cssRegister(),_[i].parse(t,e,i,s,n,r,a)):(f(\"Error: \"+l+\" js file not loaded.\"),n)}}))}(t[ft]);(t=N.prototype)._firstPT=null,t._onInitTween=function(t,e,i){if(!t.nodeType)return!1;this._target=t,this._tween=i,this._vars=e,O=e.autoRound,d=!1,x=e.suffixMap||N.suffixMap,b=it(t,\"\"),u=this._overwriteProps;var s,n,r,a,o,l,i=t.style;if(c&&\"\"===i.zIndex&&(\"auto\"!==(l=st(t,\"zIndex\",b))&&\"\"!==l||this._addLazySet(i,\"zIndex\",0)),\"string\"==typeof e&&(r=i.cssText,l=m(t,b),i.cssText=r+\";\"+e,l=g(t,l,m(t)).difs,!J&&X.test(e)&&(l.opacity=parseFloat(RegExp.$1)),e=l,i.cssText=r),this._firstPT=s=this.parse(t,e,null),this._transformType){for(l=3===this._transformType,yt?h&&(c=!0,\"\"===i.zIndex&&(\"auto\"!==(e=st(t,\"zIndex\",b))&&\"\"!==e||this._addLazySet(i,\"zIndex\",0)),k&&this._addLazySet(i,\"WebkitBackfaceVisibility\",this._vars.WebkitBackfaceVisibility||(l?\"visible\":\"hidden\"))):i.zoom=1,n=s;n&&n._next;)n=n._next;i=new dt(t,\"transform\",0,0,null,2),this._linkCSSP(i,null,n),i.setRatio=l&&Tt?St:yt?Ot:vt,i.data=this._transform||Pt(t,b,!0),u.pop()}if(d){for(;s;){for(o=s._next,n=r;n&&n.pr>s.pr;)n=n._next;(s._prev=n?n._prev:a)?s._prev._next=s:r=s,(s._next=n)?n._prev=s:a=s,s=o}this._firstPT=r}return!0},t.parse=function(t,e,i,s){var n,r,a,o,l,c,h,u,p=t.style;for(n in e)l=e[n],u=_[n],u?i=u.parse(t,l,n,this,i,s,e):(o=st(t,n,b)+\"\",h=\"string\"==typeof l,\"color\"===n||\"fill\"===n||\"stroke\"===n||-1!==n.indexOf(\"Color\")||h&&E.test(l)?(h||(l=S(l),l=(3s;s++)i+=n[\"xn\"+s]+n[\"xs\"+(s+1)];n.t[n.p]=i}else-1===n.type?n.t[n.p]=n.xs0:n.setRatio&&n.setRatio(t);else n.t[n.p]=e+n.xs0;n=n._next}else for(;n;)2!==n.type?n.t[n.p]=n.b:n.setRatio(t),n=n._next;else for(;n;)2!==n.type?n.t[n.p]=n.e:n.setRatio(t),n=n._next},t._enableTransforms=function(t){this._transformType=t||3===this._transformType?3:2,this._transform=this._transform||Pt(this._target,b,!0)};function It(){this.t[this.p]=this.e,this.data._linkCSSP(this,this._next,null,!0)}t._addLazySet=function(t,e,i){e=this._firstPT=new dt(t,e,0,0,this._firstPT,2);e.e=i,e.setRatio=It,e.data=this},t._linkCSSP=function(t,e,i,s){return t&&(e&&(e._prev=t),t._next&&(t._next._prev=t._prev),t._prev?t._prev._next=t._next:this._firstPT===t&&(this._firstPT=t._next,s=!0),i?i._next=t:s||null!==this._firstPT||(this._firstPT=t),t._next=e,t._prev=i),t},t._kill=function(t){var e,i,s,n=t;if(t.autoAlpha||t.alpha){for(i in n={},t)n[i]=t[i];n.opacity=1,n.autoAlpha&&(n.visibility=1)}return t.className&&(e=this._classNamePT)&&((s=e.xfirst)&&s._prev?this._linkCSSP(s._prev,e._next,s._prev._prev):s===this._firstPT&&(this._firstPT=e._next),e._next&&this._linkCSSP(e._next,e._next._next,s._prev),this._classNamePT=null),r.prototype._kill.call(this,n)};function Dt(t,e,i){var s,n,r,a;if(t.slice)for(n=t.length;-1<--n;)Dt(t[n],e,i);else for(n=(s=t.childNodes).length;-1<--n;)a=(r=s[n]).type,r.style&&(e.push(m(r)),i&&i.push(r)),1!==a&&9!==a&&11!==a||!r.childNodes.length||Dt(r,e,i)}return N.cascadeTo=function(t,e,i){var s,n,r,a=p.to(t,e,i),o=[a],l=[],c=[],h=[],u=p._internals.reservedProps;for(t=a._targets||a.target,Dt(t,l,h),a.render(e,!0),Dt(t,c),a.render(0,!0),a._enabled(!0),s=h.length;-1<--s;)if((n=g(h[s],l[s],c[s])).firstMPT){for(r in n=n.difs,i)u[r]&&(n[r]=i[r]);o.push(p.to(h[s],e,n))}return o},r.activate([N]),N},!0)}),window._gsDefine&&window._gsQueue.pop()()},{}],13:[function(t,e,i){\"use strict\";(window._gsQueue||(window._gsQueue=[])).push(function(){function n(t,e){var i=\"x\"===e?\"Width\":\"Height\",s=\"scroll\"+i,n=\"client\"+i,e=document.body;return t===a||t===r||t===e?Math.max(r[s],e[s])-(a[\"inner\"+i]||Math.max(r[n],e[n])):t[s]-t[\"offset\"+i]}var r=document.documentElement,a=window,t=window._gsDefine.plugin({propName:\"scrollTo\",API:2,version:\"1.7.3\",init:function(t,e,i){return this._wdw=t===a,this._target=t,this._tween=i,this._autoKill=!1!==(e=\"object\"!=typeof e?{y:e}:e).autoKill,this.x=this.xPrev=this.getX(),this.y=this.yPrev=this.getY(),null!=e.x?(this._addTween(this,\"x\",this.x,\"max\"===e.x?n(t,\"x\"):e.x,\"scrollTo_x\",!0),this._overwriteProps.push(\"scrollTo_x\")):this.skipX=!0,null!=e.y?(this._addTween(this,\"y\",this.y,\"max\"===e.y?n(t,\"y\"):e.y,\"scrollTo_y\",!0),this._overwriteProps.push(\"scrollTo_y\")):this.skipY=!0,!0},set:function(t){this._super.setRatio.call(this,t);var e=this._wdw||!this.skipX?this.getX():this.xPrev,i=this._wdw||!this.skipY?this.getY():this.yPrev,s=i-this.yPrev,t=e-this.xPrev;this._autoKill&&(!this.skipX&&(7e&&(this.skipX=!0),!this.skipY&&(7i&&(this.skipY=!0),this.skipX&&this.skipY&&this._tween.kill()),this._wdw?a.scrollTo(this.skipX?e:this.x,this.skipY?i:this.y):(this.skipY||(this._target.scrollTop=this.y),this.skipX||(this._target.scrollLeft=this.x)),this.xPrev=this.x,this.yPrev=this.y}}),e=t.prototype;t.max=n,e.getX=function(){return this._wdw?null!=a.pageXOffset?a.pageXOffset:(null!=r.scrollLeft?r:document.body).scrollLeft:this._target.scrollLeft},e.getY=function(){return this._wdw?null!=a.pageYOffset?a.pageYOffset:(null!=r.scrollTop?r:document.body).scrollTop:this._target.scrollTop},e._kill=function(t){return t.scrollTo_x&&(this.skipX=!0),t.scrollTo_y&&(this.skipY=!0),this._super._kill.call(this,t)}}),window._gsDefine&&window._gsQueue.pop()()},{}]},{},[2]);"],"file":"wpr-admin.js"} \ No newline at end of file +{"version":3,"names":[],"mappings":"","sources":["wpr-admin.js"],"sourcesContent":["!function s(n,r,a){function o(e,t){if(!r[e]){if(!n[e]){var i=\"function\"==typeof require&&require;if(!t&&i)return i(e,!0);if(l)return l(e,!0);throw(i=new Error(\"Cannot find module '\"+e+\"'\")).code=\"MODULE_NOT_FOUND\",i}i=r[e]={exports:{}},n[e][0].call(i.exports,function(t){return o(n[e][1][t]||t)},i,i.exports,s,n,r,a)}return r[e].exports}for(var l=\"function\"==typeof require&&require,t=0;t{i.append(\"\"+t+\": \"),i.append(e[t].message),i.append(\"
\")}):i.append('
'+e.message+\"
\")}})}),r(\"#wpr_enable_mobile_cache\").on(\"click\",function(t){t.preventDefault(),r(\"#wpr_enable_mobile_cache\").addClass(\"wpr-isLoading\"),r.post(ajaxurl,{action:\"rocket_enable_mobile_cache\",_ajax_nonce:rocket_ajax_data.nonce},function(t){t.success&&(r(\"#wpr_enable_mobile_cache\").hide(),r(\"#wpr_mobile_cache_default\").hide(),r(\"#wpr_mobile_cache_response\").show(),r(\"#wpr_enable_mobile_cache\").removeClass(\"wpr-isLoading\"),r(\"#cache_mobile\").val(1),r(\"#do_caching_mobile_files\").val(1))})})})},{}],2:[function(t,e,i){\"use strict\";t(\"../lib/greensock/TweenLite.min.js\"),t(\"../lib/greensock/TimelineLite.min.js\"),t(\"../lib/greensock/easing/EasePack.min.js\"),t(\"../lib/greensock/plugins/CSSPlugin.min.js\"),t(\"../lib/greensock/plugins/ScrollToPlugin.min.js\"),t(\"../global/pageManager.js\"),t(\"../global/main.js\"),t(\"../global/fields.js\"),t(\"../global/beacon.js\"),t(\"../global/ajax.js\"),t(\"../global/rocketcdn.js\"),t(\"../global/countdown.js\")},{\"../global/ajax.js\":1,\"../global/beacon.js\":3,\"../global/countdown.js\":4,\"../global/fields.js\":5,\"../global/main.js\":6,\"../global/pageManager.js\":7,\"../global/rocketcdn.js\":8,\"../lib/greensock/TimelineLite.min.js\":9,\"../lib/greensock/TweenLite.min.js\":10,\"../lib/greensock/easing/EasePack.min.js\":11,\"../lib/greensock/plugins/CSSPlugin.min.js\":12,\"../lib/greensock/plugins/ScrollToPlugin.min.js\":13}],3:[function(t,e,i){\"use strict\";var s=jQuery;s(document).ready(function(){\"Beacon\"in window&&s(\".wpr-infoAction--help\").on(\"click\",function(t){var e=s(this).data(\"beacon-id\");return 0!==(e=(e=e).split(\",\")).length&&(1{o(t).attr(\"checked\",i?null:\"checked\")});else{const r=o(e).closest(\".wpr-list\").find(\".wpr-main-checkbox\");var n=o.map(s,t=>{if(void 0!==o(t).attr(\"checked\"))return t});r.attr(\"checked\",n.length===s.length?\"checked\":null)}}),0{let i=o(e).parents(\".wpr-list\");var s=i.find(\".wpr-list-body input[type=checkbox]:not(:checked)\").length;o(e).attr(\"checked\",s<=0?\"checked\":null)})})},{}],6:[function(t,e,i){\"use strict\";var c=jQuery;c(document).ready(function(){var t=c(\".wpr-notice\");c(\"#wpr-congratulations-notice\").on(\"click\",function(){return(new TimelineLite).to(t,1,{autoAlpha:0,x:40,ease:Power4.easeOut}).to(t,.6,{height:0,marginTop:0,ease:Power4.easeOut},\"=-.4\").set(t,{display:\"none\"}),!1}),c(\".rocket-analytics-data-container\").hide(),c(\".rocket-preview-analytics-data\").on(\"click\",function(t){t.preventDefault(),c(this).parent().next(\".rocket-analytics-data-container\").toggle()}),c(\".wpr-toggle-button\").each(function(){var t=c(this),e=t.closest(\".wpr-fieldsContainer-fieldset\").find(\".wpr-radio :checkbox\"),i=c('[href=\"'+t.attr(\"href\")+'\"].wpr-menuItem');e.on(\"change\",function(){e.is(\":checked\")?(i.css(\"display\",\"block\"),t.css(\"display\",\"inline-block\")):(i.css(\"display\",\"none\"),t.css(\"display\",\"none\"))}).trigger(\"change\")});var e=c(\".wpr-Popin-Analytics\"),i=c(\".wpr-Popin-overlay\"),s=c(\".wpr-Popin-Analytics-close\"),n=c(\".wpr-Popin-Analytics .wpr-button\");function r(){(new TimelineLite).fromTo(e,.6,{autoAlpha:1,marginTop:0},{autoAlpha:0,marginTop:-24,ease:Power4.easeOut}).fromTo(i,.6,{autoAlpha:1},{autoAlpha:0,ease:Power4.easeOut},\"=-.5\").set(e,{display:\"none\"}).set(i,{display:\"none\"})}c(\".wpr-js-popin\").on(\"click\",function(t){return t.preventDefault(),(new TimelineLite).set(e,{display:\"block\"}).set(i,{display:\"block\"}).fromTo(i,.6,{autoAlpha:0},{autoAlpha:1,ease:Power4.easeOut}).fromTo(e,.6,{autoAlpha:0,marginTop:-24},{autoAlpha:1,marginTop:0,ease:Power4.easeOut},\"=-.5\"),!1}),s.on(\"click\",function(t){return t.preventDefault(),r(),!1}),n.on(\"click\",function(t){return t.preventDefault(),r(),c(\"#analytics_enabled\").prop(\"checked\",!0),c(\"#analytics_enabled\").trigger(\"change\"),!1}),c(\"#analytics_enabled\").on(\"change\",function(){c(\".wpr-rocket-analytics-cta\").toggleClass(\"wpr-isHidden\")});var a=c(\".wpr-Popin-Upgrade\"),n=c(\".wpr-Popin-Upgrade-close\");c(\".wpr-popin-upgrade-toggle\").on(\"click\",function(t){return t.preventDefault(),(new TimelineLite).set(a,{display:\"block\"}).set(i,{display:\"block\"}).fromTo(i,.6,{autoAlpha:0},{autoAlpha:1,ease:Power4.easeOut}).fromTo(a,.6,{autoAlpha:0,marginTop:-24},{autoAlpha:1,marginTop:0,ease:Power4.easeOut},\"=-.5\"),!1}),n.on(\"click\",function(){return(new TimelineLite).fromTo(a,.6,{autoAlpha:1,marginTop:0},{autoAlpha:0,marginTop:-24,ease:Power4.easeOut}).fromTo(i,.6,{autoAlpha:1},{autoAlpha:0,ease:Power4.easeOut},\"=-.5\").set(a,{display:\"none\"}).set(i,{display:\"none\"}),!1});var o=c(\".wpr-Sidebar\");c(\".wpr-js-tips\").on(\"change\",function(){c(this).is(\":checked\")?(o.css(\"display\",\"block\"),localStorage.setItem(\"wpr-show-sidebar\",\"on\")):(o.css(\"display\",\"none\"),localStorage.setItem(\"wpr-show-sidebar\",\"off\"))}),document.getElementById(\"LKgOcCRpwmAj\")?c(\".wpr-adblock\").css(\"display\",\"none\"):c(\".wpr-adblock\").css(\"display\",\"block\");var l=c(\".wpr-adblock\");c(\".wpr-adblock-close\").on(\"click\",function(){return(new TimelineLite).to(l,1,{autoAlpha:0,x:40,ease:Power4.easeOut}).to(l,.4,{height:0,marginTop:0,ease:Power4.easeOut},\"=-.4\").set(l,{display:\"none\"}),!1})})},{}],7:[function(t,e,i){\"use strict\";function s(t){var e,i=this;this.$body=document.querySelector(\".wpr-body\"),this.$menuItems=document.querySelectorAll(\".wpr-menuItem\"),this.$submitButton=document.querySelector(\".wpr-Content > form > #wpr-options-submit\"),this.$pages=document.querySelectorAll(\".wpr-Page\"),this.$sidebar=document.querySelector(\".wpr-Sidebar\"),this.$content=document.querySelector(\".wpr-Content\"),this.$tips=document.querySelector(\".wpr-Content-tips\"),this.$links=document.querySelectorAll(\".wpr-body a\"),this.$menuItem=null,this.$page=null,this.pageId=null,this.bodyTop=0,this.buttonText=this.$submitButton.value,i.getBodyTop(),window.onhashchange=function(){i.detectID()},window.location.hash?(this.bodyTop=0,this.detectID()):(e=localStorage.getItem(\"wpr-hash\"),this.bodyTop=0,e?(window.location.hash=e,this.detectID()):(this.$menuItems[0].classList.add(\"isActive\"),localStorage.setItem(\"wpr-hash\",\"dashboard\"),window.location.hash=\"#dashboard\"));for(var s=0;s{a.querySelectorAll(\".wpr-rocketcdn-open\").forEach(t=>{t.addEventListener(\"click\",t=>{t.preventDefault()})}),function(){var t=\"\";t+=\"action=rocketcdn_process_status\";const e=r(t+=\"&nonce=\"+rocket_ajax_data.nonce);e.onreadystatechange=()=>{e.readyState===XMLHttpRequest.DONE&&200===e.status&&!0===JSON.parse(e.responseText).success&&MicroModal.show(\"wpr-rocketcdn-modal\")}}(),MicroModal.init({disableScroll:!0})}),s.addEventListener(\"load\",()=>{let t=a.querySelector(\"#wpr-rocketcdn-open-cta\"),e=a.querySelector(\"#wpr-rocketcdn-close-cta\"),i=a.querySelector(\"#wpr-rocketcdn-cta-small\"),s=a.querySelector(\"#wpr-rocketcdn-cta\");function n(t){var e=\"\";return e+=\"action=toggle_rocketcdn_cta\",e+=\"&status=\"+t,e+=\"&nonce=\"+rocket_ajax_data.nonce}null!==t&&null!==i&&null!==s&&t.addEventListener(\"click\",t=>{t.preventDefault(),i.classList.add(\"wpr-isHidden\"),s.classList.remove(\"wpr-isHidden\"),r(n(\"big\"))}),null!==e&&null!==i&&null!==s&&e.addEventListener(\"click\",t=>{t.preventDefault(),i.classList.remove(\"wpr-isHidden\"),s.classList.add(\"wpr-isHidden\"),r(n(\"small\"))})}),s.onmessage=t=>{var e,i,s=rocket_ajax_data.origin_url;t.origin===s&&((e=t.data).hasOwnProperty(\"cdnFrameHeight\")&&(a.getElementById(\"rocketcdn-iframe\").style.height=e.cdnFrameHeight+\"px\"),(i=t.data).hasOwnProperty(\"cdnFrameClose\")&&(MicroModal.close(\"wpr-rocketcdn-modal\"),i.hasOwnProperty(\"cdn_page_message\")&&-1!==[\"iframe-payment-success\",\"iframe-unsubscribe-success\"].indexOf(i.cdn_page_message)&&a.location.reload()),function(t,e){let i=a.querySelector(\"#rocketcdn-iframe\").contentWindow;if(t.hasOwnProperty(\"rocketcdn_token\")){var s=\"\";s+=\"action=save_rocketcdn_token\",s+=\"&value=\"+t.rocketcdn_token;const n=r(s+=\"&nonce=\"+rocket_ajax_data.nonce);n.onreadystatechange=()=>{var t;n.readyState===XMLHttpRequest.DONE&&200===n.status&&(t=JSON.parse(n.responseText),i.postMessage({success:t.success,data:t.data,rocketcdn:!0},e))}}else{s={process:\"subscribe\",message:\"token_not_received\"};i.postMessage({success:!1,data:s,rocketcdn:!0},e)}}(t.data,s),(e=t.data).hasOwnProperty(\"rocketcdn_process\")&&(i=\"\",i+=\"action=rocketcdn_process_set\",i+=\"&status=\"+e.rocketcdn_process,r(i+=\"&nonce=\"+rocket_ajax_data.nonce)),function(t,e){let i=a.querySelector(\"#rocketcdn-iframe\").contentWindow;if(t.hasOwnProperty(\"rocketcdn_url\")){var s=\"\";s+=\"action=rocketcdn_enable\",s+=\"&cdn_url=\"+t.rocketcdn_url;const n=r(s+=\"&nonce=\"+rocket_ajax_data.nonce);n.onreadystatechange=()=>{var t;n.readyState===XMLHttpRequest.DONE&&200===n.status&&(t=JSON.parse(n.responseText),i.postMessage({success:t.success,data:t.data,rocketcdn:!0},e))}}}(t.data,s),function(t,e){let i=a.querySelector(\"#rocketcdn-iframe\").contentWindow;if(t.hasOwnProperty(\"rocketcdn_disable\")){t=\"\";t+=\"action=rocketcdn_disable\";const s=r(t+=\"&nonce=\"+rocket_ajax_data.nonce);s.onreadystatechange=()=>{var t;s.readyState===XMLHttpRequest.DONE&&200===s.status&&(t=JSON.parse(s.responseText),i.postMessage({success:t.success,data:t.data,rocketcdn:!0},e))}}}(t.data,s),(s=t.data).hasOwnProperty(\"rocketcdn_validate_token\")&&s.hasOwnProperty(\"rocketcdn_validate_cname\")&&(t=\"\",t+=\"action=rocketcdn_validate_token_cname\",t+=\"&cdn_url=\"+s.rocketcdn_validate_cname,t+=\"&cdn_token=\"+s.rocketcdn_validate_token,r(t+=\"&nonce=\"+rocket_ajax_data.nonce)))}},{}],9:[function(t,e,i){\"use strict\";(window._gsQueue||(window._gsQueue=[])).push(function(){window._gsDefine(\"TimelineLite\",[\"core.Animation\",\"core.SimpleTimeline\",\"TweenLite\"],function(h,u,p){function d(t){u.call(this,t),this._labels={},this.autoRemoveChildren=!0===this.vars.autoRemoveChildren,this.smoothChildTiming=!0===this.vars.smoothChildTiming,this._sortChildren=!0,this._onUpdate=this.vars.onUpdate;var e,i,s=this.vars;for(i in s)e=s[i],g(e)&&-1!==e.join(\"\").indexOf(\"{self}\")&&(s[i]=this._swapSelfInParams(e));g(s.tweens)&&this.add(s.tweens,0,s.align,s.stagger)}function _(t){var e,i={};for(e in t)i[e]=t[e];return i}function n(t,e,i,s){t._timeline.pause(t._startTime),e&&e.apply(s||t._timeline,i||v)}var f=1e-10,m=p._internals.isSelector,g=p._internals.isArray,v=[],a=window._gsDefine.globals,w=v.slice,t=d.prototype=new u;return d.version=\"1.12.1\",t.constructor=d,t.kill()._gc=!1,t.to=function(t,e,i,s){var n=i.repeat&&a.TweenMax||p;return e?this.add(new n(t,e,i),s):this.set(t,i,s)},t.from=function(t,e,i,s){return this.add((i.repeat&&a.TweenMax||p).from(t,e,i),s)},t.fromTo=function(t,e,i,s,n){var r=s.repeat&&a.TweenMax||p;return e?this.add(r.fromTo(t,e,i,s),n):this.set(t,s,n)},t.staggerTo=function(t,e,i,s,n,r,a,o){var l,c=new d({onComplete:r,onCompleteParams:a,onCompleteScope:o,smoothChildTiming:this.smoothChildTiming});for(\"string\"==typeof t&&(t=p.selector(t)||t),m(t)&&(t=w.call(t,0)),s=s||0,l=0;t.length>l;l++)i.startAt&&(i.startAt=_(i.startAt)),c.to(t[l],e,_(i),l*s);return this.add(c,n)},t.staggerFrom=function(t,e,i,s,n,r,a,o){return i.immediateRender=0!=i.immediateRender,i.runBackwards=!0,this.staggerTo(t,e,i,s,n,r,a,o)},t.staggerFromTo=function(t,e,i,s,n,r,a,o,l){return s.startAt=i,s.immediateRender=0!=s.immediateRender&&0!=i.immediateRender,this.staggerTo(t,e,s,n,r,a,o,l)},t.call=function(t,e,i,s){return this.add(p.delayedCall(0,t,e,i),s)},t.set=function(t,e,i){return i=this._parseTimeOrLabel(i,0,!0),null==e.immediateRender&&(e.immediateRender=i===this._time&&!this._paused),this.add(new p(t,0,e),i)},d.exportRoot=function(t,e){null==(t=t||{}).smoothChildTiming&&(t.smoothChildTiming=!0);var i,s,n=new d(t),t=n._timeline;for(null==e&&(e=!0),t._remove(n,!0),n._startTime=0,n._rawPrevTime=n._time=n._totalTime=t._time,i=t._first;i;)s=i._next,e&&i instanceof p&&i.target===i.vars.onComplete||n.add(i,i._startTime-i._delay),i=s;return t.add(n,0),n},t.add=function(t,e,i,s){var n,r,a,o,l,c;if(\"number\"!=typeof e&&(e=this._parseTimeOrLabel(e,0,!0,t)),!(t instanceof h)){if(t instanceof Array||t&&t.push&&g(t)){for(i=i||\"normal\",s=s||0,n=e,r=t.length,a=0;at._startTime;l._timeline;)c&&l._timeline.smoothChildTiming?l.totalTime(l._totalTime,!0):l._gc&&l._enabled(!0,!1),l=l._timeline;return this},t.remove=function(t){if(t instanceof h)return this._remove(t,!1);if(t instanceof Array||t&&t.push&&g(t)){for(var e=t.length;-1<--e;)this.remove(t[e]);return this}return\"string\"==typeof t?this.removeLabel(t):this.kill(null,t)},t._remove=function(t,e){u.prototype._remove.call(this,t,e);e=this._last;return e?this._time>e._startTime+e._totalDuration/e._timeScale&&(this._time=this.duration(),this._totalTime=this._totalDuration):this._time=this._totalTime=this._duration=this._totalDuration=0,this},t.append=function(t,e){return this.add(t,this._parseTimeOrLabel(null,e,!0,t))},t.insert=t.insertMultiple=function(t,e,i,s){return this.add(t,e||0,i,s)},t.appendMultiple=function(t,e,i,s){return this.add(t,this._parseTimeOrLabel(null,e,!0,t),i,s)},t.addLabel=function(t,e){return this._labels[t]=this._parseTimeOrLabel(e),this},t.addPause=function(t,e,i,s){return this.call(n,[\"{self}\",e,i,s],this,t)},t.removeLabel=function(t){return delete this._labels[t],this},t.getLabelTime=function(t){return null!=this._labels[t]?this._labels[t]:-1},t._parseTimeOrLabel=function(t,e,i,s){var n;if(s instanceof h&&s.timeline===this)this.remove(s);else if(s&&(s instanceof Array||s.push&&g(s)))for(n=s.length;-1<--n;)s[n]instanceof h&&s[n].timeline===this&&this.remove(s[n]);if(\"string\"==typeof e)return this._parseTimeOrLabel(e,i&&\"number\"==typeof t&&null==this._labels[e]?t-this.duration():0,i);if(e=e||0,\"string\"!=typeof t||!isNaN(t)&&null==this._labels[t])null==t&&(t=this.duration());else{if(-1===(n=t.indexOf(\"=\")))return null==this._labels[t]?i?this._labels[t]=this.duration()+e:e:this._labels[t]+e;e=parseInt(t.charAt(n-1)+\"1\",10)*Number(t.substr(n+1)),t=1f&&(a=\"onReverseComplete\"))),this._rawPrevTime=this._duration||!e||t||this._rawPrevTime===t?t:f,t=l+1e-4):t<1e-7?(((this._totalTime=this._time=0)!==c||0===this._duration&&this._rawPrevTime!==f&&(0=c)for(s=this._first;s&&(r=s._next,!this._paused||p);)(s._active||s._startTime<=this._time&&!s._paused&&!s._gc)&&(s._reversed?s.render((s._dirty?s.totalDuration():s._totalDuration)-(t-s._startTime)*s._timeScale,e,i):s.render((t-s._startTime)*s._timeScale,e,i)),s=r;else for(s=this._last;s&&(r=s._prev,!this._paused||p);)(s._active||c>=s._startTime&&!s._paused&&!s._gc)&&(s._reversed?s.render((s._dirty?s.totalDuration():s._totalDuration)-(t-s._startTime)*s._timeScale,e,i):s.render((t-s._startTime)*s._timeScale,e,i)),s=r;this._onUpdate&&(e||this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||v)),a&&(this._gc||h!==this._startTime&&u===this._timeScale||!(0===this._time||l>=this.totalDuration())||(n&&(this._timeline.autoRemoveChildren&&this._enabled(!1,!1),this._active=!1),!e&&this.vars[a]&&this.vars[a].apply(this.vars[a+\"Scope\"]||this,this.vars[a+\"Params\"]||v)))}},t._hasPausedChild=function(){for(var t=this._first;t;){if(t._paused||t instanceof d&&t._hasPausedChild())return!0;t=t._next}return!1},t.getChildren=function(t,e,i,s){s=s||-9999999999;for(var n=[],r=this._first,a=0;r;)s>r._startTime||(r instanceof p?!1!==e&&(n[a++]=r):(!1!==i&&(n[a++]=r),!1!==t&&(a=(n=n.concat(r.getChildren(!0,e,i))).length))),r=r._next;return n},t.getTweensOf=function(t,e){var i,s,n=this._gc,r=[],a=0;for(n&&this._enabled(!0,!0),s=(i=p.getTweensOf(t)).length;-1<--s;)(i[s].timeline===this||e&&this._contains(i[s]))&&(r[a++]=i[s]);return n&&this._enabled(!1,!0),r},t._contains=function(t){for(var e=t.timeline;e;){if(e===this)return!0;e=e.timeline}return!1},t.shiftChildren=function(t,e,i){i=i||0;for(var s,n=this._first,r=this._labels;n;)n._startTime>=i&&(n._startTime+=t),n=n._next;if(e)for(s in r)r[s]>=i&&(r[s]+=t);return this._uncache(!0)},t._kill=function(t,e){if(!t&&!e)return this._enabled(!1,!1);for(var i=e?this.getTweensOf(e):this.getChildren(!0,!0,!1),s=i.length,n=!1;-1<--s;)i[s]._kill(t,e)&&(n=!0);return n},t.clear=function(t){var e=this.getChildren(!1,!0,!0),i=e.length;for(this._time=this._totalTime=0;-1<--i;)e[i]._enabled(!1,!1);return!1!==t&&(this._labels={}),this._uncache(!0)},t.invalidate=function(){for(var t=this._first;t;)t.invalidate(),t=t._next;return this},t._enabled=function(t,e){if(t===this._gc)for(var i=this._first;i;)i._enabled(t,!0),i=i._next;return u.prototype._enabled.call(this,t,e)},t.duration=function(t){return arguments.length?(0!==this.duration()&&0!==t&&this.timeScale(this._duration/t),this):(this._dirty&&this.totalDuration(),this._duration)},t.totalDuration=function(t){if(arguments.length)return 0!==this.totalDuration()&&0!==t&&this.timeScale(this._totalDuration/t),this;if(this._dirty){for(var e,i,s=0,n=this._last,r=999999999999;n;)e=n._prev,n._dirty&&n.totalDuration(),n._startTime>r&&this._sortChildren&&!n._paused?this.add(n,n._startTime-n._delay):r=n._startTime,n._startTime<0&&!n._paused&&(s-=n._startTime,this._timeline.smoothChildTiming&&(this._startTime+=n._startTime/this._timeScale),this.shiftChildren(-n._startTime,!1,-9999999999),r=0),s<(i=n._startTime+n._totalDuration/n._timeScale)&&(s=i),n=e;this._duration=this._totalDuration=s,this._dirty=!1}return this._totalDuration},t.usesFrames=function(){for(var t=this._timeline;t._timeline;)t=t._timeline;return t===h._rootFramesTimeline},t.rawTime=function(){return this._paused?this._totalTime:(this._timeline.rawTime()-this._startTime)*this._timeScale},d},!0)}),window._gsDefine&&window._gsQueue.pop()()},{}],10:[function(t,Q,e){\"use strict\";!function(p){var e,i,d=p.GreenSockGlobals||p;if(!d.TweenLite){var _,f=function(t){for(var e=t.split(\".\"),i=d,s=0;e.length>s;s++)i[e[s]]=i=i[e[s]]||{};return i},u=f(\"com.greensock\"),m=1e-10,o=[].slice,g=function(){},h=(e=Object.prototype.toString,i=e.call([]),function(t){return null!=t&&(t instanceof Array||\"object\"==typeof t&&!!t.push&&e.call(t)===i)}),v={},w=function(o,l,c,h){this.sc=v[o]?v[o].sc:[],(v[o]=this).gsClass=null,this.func=c;var u=[];this.check=function(t){for(var e,i,s,n,r=l.length,a=r;-1<--r;)(e=v[l[r]]||new w(l[r],[])).gsClass?(u[r]=e.gsClass,a--):t&&e.sc.push(this);if(0===a&&c)for(s=(i=(\"com.greensock.\"+o).split(\".\")).pop(),n=f(i.join(\".\"))[s]=this.gsClass=c.apply(c,u),h&&(d[s]=n,\"function\"==typeof define&&define.amd?define((p.GreenSockAMDPath?p.GreenSockAMDPath+\"/\":\"\")+o.split(\".\").join(\"/\"),[],function(){return n}):void 0!==Q&&Q.exports&&(Q.exports=n)),r=0;this.sc.length>r;r++)this.sc[r].check()},this.check(!0)},s=p._gsDefine=function(t,e,i,s){return new w(t,e,i,s)},y=u._class=function(t,e,i){return e=e||function(){},s(t,[],function(){return e},i),e};s.globals=d;var t,n=[0,0,1,1],x=[],b=y(\"easing.Ease\",function(t,e,i,s){this._func=t,this._type=i||0,this._power=s||0,this._params=e?n.concat(e):n},!0),T=b.map={},r=b.register=function(t,e,i,s){for(var n,r,a,o,l=e.split(\",\"),c=l.length,h=(i||\"easeIn,easeOut,easeInOut\").split(\",\");-1<--c;)for(r=l[c],n=s?y(\"easing.\"+r,null,!0):u.easing[r]||{},a=h.length;-1<--a;)o=h[a],T[r+\".\"+o]=T[o+r]=n[o]=t.getRatio?t:t[o]||new t};for((t=b.prototype)._calcEnd=!1,t.getRatio=function(t){if(this._func)return this._params[0]=t,this._func.apply(null,this._params);var e=this._type,i=this._power,s=1===e?1-t:2===e?t:t<.5?2*t:2*(1-t);return 1===i?s*=s:2===i?s*=s*s:3===i?s*=s*s*s:4===i&&(s*=s*s*s*s),1===e?1-s:2===e?s:t<.5?s/2:1-s/2},l=(a=[\"Linear\",\"Quad\",\"Cubic\",\"Quart\",\"Quint,Strong\"]).length;-1<--l;)t=a[l]+\",Power\"+l,r(new b(null,null,1,l),t,\"easeOut\",!0),r(new b(null,null,2,l),t,\"easeIn\"+(0===l?\",easeNone\":\"\")),r(new b(null,null,3,l),t,\"easeInOut\");T.linear=u.easing.Linear.easeIn,T.swing=u.easing.Quad.easeInOut;var k=y(\"events.EventDispatcher\",function(t){this._listeners={},this._eventTarget=t||this});(t=k.prototype).addEventListener=function(t,e,i,s,n){n=n||0;var r,a,o=this._listeners[t],l=0;for(null==o&&(this._listeners[t]=o=[]),a=o.length;-1<--a;)(r=o[a]).c===e&&r.s===i?o.splice(a,1):0===l&&n>r.pr&&(l=a+1);o.splice(l,0,{c:e,s:i,up:s,pr:n}),this!==A||_||A.wake()},t.removeEventListener=function(t,e){var i,s=this._listeners[t];if(s)for(i=s.length;-1<--i;)if(s[i].c===e)return void s.splice(i,1)},t.dispatchEvent=function(t){var e,i,s,n=this._listeners[t];if(n)for(e=n.length,i=this._eventTarget;-1<--e;)(s=n[e]).up?s.c.call(s.s||i,{type:t,target:i}):s.c.call(s.s||i)};for(var a,P=p.requestAnimationFrame,S=p.cancelAnimationFrame,O=Date.now||function(){return(new Date).getTime()},C=O(),l=(a=[\"ms\",\"moz\",\"webkit\",\"o\"]).length;-1<--l&&!P;)P=p[a[l]+\"RequestAnimationFrame\"],S=p[a[l]+\"CancelAnimationFrame\"]||p[a[l]+\"CancelRequestAnimationFrame\"];y(\"Ticker\",function(t,e){var s,n,r,a,o,l=this,c=O(),i=!1!==e&&P,h=500,u=33,p=function(t){var e,i=O()-C;h=i&&i+this.totalDuration()/this._timeScale>t},t._enabled=function(t,e){return _||A.wake(),this._gc=!t,this._active=this.isActive(),!0!==e&&(t&&!this.timeline?this._timeline.add(this,this._startTime-this._delay):!t&&this.timeline&&this._timeline._remove(this,!0)),!1},t._kill=function(){return this._enabled(!1,!1)},t.kill=function(t,e){return this._kill(t,e),this},t._uncache=function(t){for(var e=t?this:this.timeline;e;)e._dirty=!0,e=e.timeline;return this},t._swapSelfInParams=function(t){for(var e=t.length,i=t.concat();-1<--e;)\"{self}\"===t[e]&&(i[e]=this);return i},t.eventCallback=function(t,e,i,s){if(\"on\"===(t||\"\").substr(0,2)){var n=this.vars;if(1===arguments.length)return n[t];null==e?delete n[t]:(n[t]=e,n[t+\"Params\"]=h(i)&&-1!==i.join(\"\").indexOf(\"{self}\")?this._swapSelfInParams(i):i,n[t+\"Scope\"]=s),\"onUpdate\"===t&&(this._onUpdate=e)}return this},t.delay=function(t){return arguments.length?(this._timeline.smoothChildTiming&&this.startTime(this._startTime+t-this._delay),this._delay=t,this):this._delay},t.duration=function(t){return arguments.length?(this._duration=this._totalDuration=t,this._uncache(!0),this._timeline.smoothChildTiming&&0this._duration?this._duration:t,e)):this._time},t.totalTime=function(t,e,i){if(_||A.wake(),!arguments.length)return this._totalTime;if(this._timeline){if(t<0&&!i&&(t+=this.totalDuration()),this._timeline.smoothChildTiming){this._dirty&&this.totalDuration();var s=this._totalDuration,n=this._timeline;if(ss;)i=i._prev;return i?(t._next=i._next,i._next=t):(t._next=this._first,this._first=t),t._next?t._next._prev=t:this._last=t,t._prev=i,this._timeline&&this._uncache(!0),this},t._remove=function(t,e){return t.timeline===this&&(e||t._enabled(!1,!0),t.timeline=null,t._prev?t._prev._next=t._next:this._first===t&&(this._first=t._next),t._next?t._next._prev=t._prev:this._last===t&&(this._last=t._prev),this._timeline&&this._uncache(!0)),this},t.render=function(t,e,i){var s,n=this._first;for(this._totalTime=this._time=this._rawPrevTime=t;n;)s=n._next,(n._active||t>=n._startTime&&!n._paused)&&(n._reversed?n.render((n._dirty?n.totalDuration():n._totalDuration)-(t-n._startTime)*n._timeScale,e,i):n.render((t-n._startTime)*n._timeScale,e,i)),n=s},t.rawTime=function(){return _||A.wake(),this._totalTime};var I=y(\"TweenLite\",function(t,e,i){if(c.call(this,e,i),this.render=I.prototype.render,null==t)throw\"Cannot tween a null target.\";this.target=t=\"string\"==typeof t&&I.selector(t)||t;var s,n,r,i=t.jquery||t.length&&t!==p&&t[0]&&(t[0]===p||t[0].nodeType&&t[0].style&&!t.nodeType),a=this.vars.overwrite;if(this._overwrite=a=null==a?F[I.defaultOverwrite]:\"number\"==typeof a?a>>0:F[a],(i||t instanceof Array||t.push&&h(t))&&\"number\"!=typeof t[0])for(this._targets=r=o.call(t,0),this._propLookup=[],this._siblings=[],s=0;r.length>s;s++)(n=r[s])?\"string\"!=typeof n?n.length&&n!==p&&n[0]&&(n[0]===p||n[0].nodeType&&n[0].style&&!n.nodeType)?(r.splice(s--,1),this._targets=r=r.concat(o.call(n,0))):(this._siblings[s]=H(n,this,!1),1===a&&1=a._startTime&&a._startTime+a.totalDuration()/a._timeScale>c&&((p||!a._initted)&&c-a._startTime<=2e-10||(h[u++]=a)));for(d=u;-1<--d;)a=h[d],2===s&&a._kill(i,t)&&(r=!0),(2!==s||!a._firstPT&&a._initted)&&a._enabled(!1,!1)&&(r=!0);return r},W=function(t,e,i){for(var s=t._timeline,n=s._timeScale,r=t._startTime;s._timeline;){if(r+=s._startTime,n*=s._timeScale,s._paused)return-100;s=s._timeline}return e<(r/=n)?r-e:i&&r===e||!t._initted&&r-e<2*m?m:(r+=t.totalDuration()/t._timeScale/n)>e+m?0:r-e-m};t._init=function(){var t,e,i,s,n,r=this.vars,a=this._overwrittenProps,o=this._duration,l=!!r.immediateRender,c=r.ease;if(r.startAt){for(s in this._startAt&&(this._startAt.render(-1,!0),this._startAt.kill()),n={},r.startAt)n[s]=r.startAt[s];if(n.overwrite=!1,n.immediateRender=!0,n.lazy=l&&!1!==r.lazy,n.startAt=n.delay=null,this._startAt=I.to(this.target,0,n),l)if(0o.pr;)s=s._next;(o._prev=s?s._prev:r)?o._prev._next=o:n=o,(o._next=s)?s._prev=o:r=o,o=a}o=e._firstPT=n}for(;o;)o.pg&&\"function\"==typeof o.t[t]&&o.t[t]()&&(i=!0),o=o._next;return i},V.activate=function(t){for(var e=t.length;-1<--e;)t[e].API===V.API&&(E[(new t[e])._propName]=t[e]);return!0},s.plugin=function(t){if(!(t&&t.propName&&t.init&&t.API))throw\"illegal plugin definition.\";var e,i=t.propName,s=t.priority||0,n=t.overwriteProps,r={init:\"_onInitTween\",set:\"setRatio\",kill:\"_kill\",round:\"_roundProps\",initAll:\"_onInitAllProps\"},a=y(\"plugins.\"+i.charAt(0).toUpperCase()+i.substr(1)+\"Plugin\",function(){V.call(this,i,s),this._overwriteProps=n||[]},!0===t.global),o=a.prototype=new V(i);for(e in(o.constructor=a).API=t.API,r)\"function\"==typeof t[e]&&(o[r[e]]=t[e]);return a.version=t.version,V.activate([a]),a},a=p._gsQueue){for(l=0;a.length>l;l++)a[l]();for(t in v)v[t].func||p.console.log(\"GSAP encountered missing dependency: com.greensock.\"+t)}_=!1}}(window)},{}],11:[function(t,e,i){\"use strict\";(window._gsQueue||(window._gsQueue=[])).push(function(){window._gsDefine(\"easing.Back\",[\"easing.Ease\"],function(m){function t(t,e){var i=c(\"easing.\"+t,function(){},!0);return(t=i.prototype=new m).constructor=i,t.getRatio=e,i}function e(t,e,i,s){return s=c(\"easing.\"+t,{easeOut:new e,easeIn:new i,easeInOut:new s},!0),h(s,t),s}function g(t,e,i){this.t=t,this.v=e,i&&(((this.next=i).prev=this).c=i.v-e,this.gap=i.t-t)}function i(t,e){var i=c(\"easing.\"+t,function(t){this._p1=t||0===t?t:1.70158,this._p2=1.525*this._p1},!0);return(t=i.prototype=new m).constructor=i,t.getRatio=e,t.config=function(t){return new i(t)},i}var s,n,r=window.GreenSockGlobals||window,a=r.com.greensock,o=2*Math.PI,l=Math.PI/2,c=a._class,h=m.register||function(){},u=e(\"Back\",i(\"BackOut\",function(t){return--t*t*((this._p1+1)*t+this._p1)+1}),i(\"BackIn\",function(t){return t*t*((this._p1+1)*t-this._p1)}),i(\"BackInOut\",function(t){return(t*=2)<1?.5*t*t*((this._p2+1)*t-this._p2):.5*((t-=2)*t*((this._p2+1)*t+this._p2)+2)})),p=c(\"easing.SlowMo\",function(t,e,i){e=e||0===e?e:.7,null==t?t=.7:1t?this._calcEnd?1-(t=1-t/this._p1)*t:e-(t=1-t/this._p1)*t*t*t*e:t>this._p3?this._calcEnd?1-(t=(t-this._p3)/this._p1)*t:e+(t-e)*(t=(t-this._p3)/this._p1)*t*t*t:this._calcEnd?1:e},p.ease=new p(.7,.7),a.config=p.config=function(t,e,i){return new p(t,e,i)},(a=(s=c(\"easing.SteppedEase\",function(t){this._p1=1/(t=t||1),this._p2=t+1},!0)).prototype=new m).constructor=s,a.getRatio=function(t){return t<0?t=0:1<=t&&(t=.999999999),(this._p2*t>>0)*this._p1},a.config=s.config=function(t){return new s(t)},(a=(n=c(\"easing.RoughEase\",function(t){for(var e,i,s,n,r,a,o=(t=t||{}).taper||\"none\",l=[],c=0,h=0|(t.points||20),u=h,p=!1!==t.randomize,d=!0===t.clamp,_=t.template instanceof m?t.template:null,f=\"number\"==typeof t.strength?.4*t.strength:.4;-1<--u;)e=p?Math.random():1/h*u,i=_?_.getRatio(e):e,s=\"none\"===o?f:\"out\"===o?(n=1-e)*n*f:\"in\"===o?e*e*f:.5*(n=e<.5?2*e:2*(1-e))*n*f,p?i+=Math.random()*s-.5*s:u%2?i+=.5*s:i-=.5*s,d&&(1e.t){for(;e.next&&t>=e.t;)e=e.next;e=e.prev}else for(;e.prev&&e.t>=t;)e=e.prev;return(this._prev=e).v+(t-e.t)/e.gap*e.c},a.config=function(t){return new n(t)},n.ease=new n,e(\"Bounce\",t(\"BounceOut\",function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}),t(\"BounceIn\",function(t){return 1/2.75>(t=1-t)?1-7.5625*t*t:t<2/2.75?1-(7.5625*(t-=1.5/2.75)*t+.75):t<2.5/2.75?1-(7.5625*(t-=2.25/2.75)*t+.9375):1-(7.5625*(t-=2.625/2.75)*t+.984375)}),t(\"BounceInOut\",function(t){var e=t<.5;return t=(t=e?1-2*t:2*t-1)<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,e?.5*(1-t):.5*t+.5})),e(\"Circ\",t(\"CircOut\",function(t){return Math.sqrt(1- --t*t)}),t(\"CircIn\",function(t){return-(Math.sqrt(1-t*t)-1)}),t(\"CircInOut\",function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)})),e(\"Elastic\",(a=function(t,e,i){var s=c(\"easing.\"+t,function(t,e){this._p1=t||1,this._p2=e||i,this._p3=this._p2/o*(Math.asin(1/this._p1)||0)},!0),t=s.prototype=new m;return t.constructor=s,t.getRatio=e,t.config=function(t,e){return new s(t,e)},s})(\"ElasticOut\",function(t){return this._p1*Math.pow(2,-10*t)*Math.sin((t-this._p3)*o/this._p2)+1},.3),a(\"ElasticIn\",function(t){return-(this._p1*Math.pow(2,10*--t)*Math.sin((t-this._p3)*o/this._p2))},.3),a(\"ElasticInOut\",function(t){return(t*=2)<1?-.5*this._p1*Math.pow(2,10*--t)*Math.sin((t-this._p3)*o/this._p2):.5*this._p1*Math.pow(2,-10*--t)*Math.sin((t-this._p3)*o/this._p2)+1},.45)),e(\"Expo\",t(\"ExpoOut\",function(t){return 1-Math.pow(2,-10*t)}),t(\"ExpoIn\",function(t){return Math.pow(2,10*(t-1))-.001}),t(\"ExpoInOut\",function(t){return(t*=2)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*(t-1)))})),e(\"Sine\",t(\"SineOut\",function(t){return Math.sin(t*l)}),t(\"SineIn\",function(t){return 1-Math.cos(t*l)}),t(\"SineInOut\",function(t){return-.5*(Math.cos(Math.PI*t)-1)})),c(\"easing.EaseLookup\",{find:function(t){return m.map[t]}},!0),h(r.SlowMo,\"SlowMo\",\"ease,\"),h(n,\"RoughEase\",\"ease,\"),h(s,\"SteppedEase\",\"ease,\"),u},!0)}),window._gsDefine&&window._gsQueue.pop()()},{}],12:[function(t,e,i){\"use strict\";(window._gsQueue||(window._gsQueue=[])).push(function(){window._gsDefine(\"plugins.CSSPlugin\",[\"plugins.TweenPlugin\",\"TweenLite\"],function(r,p){function N(){r.call(this,\"css\"),this._overwriteProps.length=0,this.setRatio=N.prototype.setRatio}var d,x,b,u,_={},t=N.prototype=new r(\"css\");(t.constructor=N).version=\"1.12.1\",N.API=2,N.defaultTransformPerspective=0,N.defaultSkewType=\"compensated\",N.suffixMap={top:t=\"px\",right:t,bottom:t,left:t,width:t,height:t,fontSize:t,padding:t,margin:t,perspective:t,lineHeight:\"\"};function n(t,e){return e.toUpperCase()}function a(t){return L.test(\"string\"==typeof t?t:(t.currentStyle||t.style).filter||\"\")?parseFloat(RegExp.$1)/100:1}function f(t){window.console&&console.log(t)}function T(t,e){var i,s,n=(e=e||Z).style;if(void 0!==n[t])return t;for(t=t.charAt(0).toUpperCase()+t.substr(1),i=[\"O\",\"Moz\",\"ms\",\"Ms\",\"Webkit\"],s=5;-1<--s&&void 0===n[i[s]+t];);return 0<=s?(tt=\"-\"+(et=3===s?\"ms\":i[s]).toLowerCase()+\"-\",et+t):null}function m(t,e){var i,s={};if(e=e||it(t,null))if(i=e.length)for(;-1<--i;)s[e[i].replace(Y,n)]=e.getPropertyValue(e[i]);else for(i in e)s[i]=e[i];else if(e=t.currentStyle||t.style)for(i in e)\"string\"==typeof i&&void 0===s[i]&&(s[i.replace(Y,n)]=e[i]);return J||(s.opacity=a(t)),t=Pt(t,e,!1),s.rotation=t.rotation,s.skewX=t.skewX,s.scaleX=t.scaleX,s.scaleY=t.scaleY,s.x=t.x,s.y=t.y,Tt&&(s.z=t.z,s.rotationX=t.rotationX,s.rotationY=t.rotationY,s.scaleZ=t.scaleZ),s.filters&&delete s.filters,s}function g(t,e,i,s,n){var r,a,o,l={},c=t.style;for(a in i)\"cssText\"!==a&&\"length\"!==a&&isNaN(a)&&(e[a]!==(r=i[a])||n&&n[a])&&-1===a.indexOf(\"Origin\")&&(\"number\"==typeof r||\"string\"==typeof r)&&(l[a]=\"auto\"!==r||\"left\"!==a&&\"top\"!==a?\"\"!==r&&\"auto\"!==r&&\"none\"!==r||\"string\"!=typeof e[a]||\"\"===e[a].replace(D,\"\")?r:0:rt(t,a),void 0!==c[a]&&(o=new pt(c,a,c[a],o)));if(s)for(a in s)\"className\"!==a&&(l[a]=s[a]);return{difs:l,firstMPT:o}}function v(t,e){var i=(t=null==t||\"\"===t||\"auto\"===t||\"auto auto\"===t?\"0 0\":t).split(\" \"),s=-1!==t.indexOf(\"left\")?\"0%\":-1!==t.indexOf(\"right\")?\"100%\":i[0];return null==(t=-1!==t.indexOf(\"top\")?\"0%\":-1!==t.indexOf(\"bottom\")?\"100%\":i[1])?t=\"0\":\"center\"===t&&(t=\"50%\"),(\"center\"===s||isNaN(parseFloat(s))&&-1===(s+\"\").indexOf(\"=\"))&&(s=\"50%\"),e&&(e.oxp=-1!==s.indexOf(\"%\"),e.oyp=-1!==t.indexOf(\"%\"),e.oxr=\"=\"===s.charAt(1),e.oyr=\"=\"===t.charAt(1),e.ox=parseFloat(s.replace(D,\"\")),e.oy=parseFloat(t.replace(D,\"\"))),s+\" \"+t+(2>16,255&t>>8,255&t]:(\",\"===t.charAt(t.length-1)&&(t=t.substr(0,t.length-1)),lt[t]||(\"#\"===t.charAt(0)?(4===t.length&&(t=\"#\"+(e=t.charAt(1))+e+(i=t.charAt(2))+i+(r=t.charAt(3))+r),[(t=parseInt(t.substr(1),16))>>16,255&t>>8,255&t]):(\"hsl\"===t.substr(0,3)?(t=t.match(A),s=Number(t[0])%360/360,n=Number(t[1])/100,e=2*(r=Number(t[2])/100)-(i=r<=.5?r*(1+n):r+n-r*n),3a\",!!(i=i.getElementsByTagName(\"a\")[0])&&/^0.55/.test(i.style.opacity)),tt=\"\",et=\"\",it=Q.defaultView?Q.defaultView.getComputedStyle:function(){},st=N.getStyle=function(t,e,i,s,n){var r;return J||\"opacity\"!==e?(!s&&t.style[e]?r=t.style[e]:(i=i||it(t))?r=i[e]||i.getPropertyValue(e)||i.getPropertyValue(e.replace(z,\"-$1\").toLowerCase()):t.currentStyle&&(r=t.currentStyle[e]),null==n||r&&\"none\"!==r&&\"auto\"!==r&&\"auto auto\"!==r?r:n):a(t)},nt=s.convertToPixels=function(t,e,i,s,n){if(\"px\"===s||!s)return i;if(\"auto\"===s||!i)return 0;var r,a,o,l=$.test(e),c=t,h=Z.style,u=i<0;if(u&&(i=-i),\"%\"===s&&-1!==e.indexOf(\"border\"))r=i/100*(l?t.clientWidth:t.clientHeight);else{if(h.cssText=\"border:0 solid red;position:\"+st(t,\"position\")+\";line-height:0;\",\"%\"!==s&&c.appendChild)h[l?\"borderLeftWidth\":\"borderTopWidth\"]=i+s;else{if(a=(c=t.parentNode||Q.body)._gsCache,o=p.ticker.frame,a&&l&&a.time===o)return a.width*i/100;h[l?\"width\":\"height\"]=i+s}c.appendChild(Z),r=parseFloat(Z[l?\"offsetWidth\":\"offsetHeight\"]),c.removeChild(Z),l&&\"%\"===s&&!1!==N.cacheWidths&&((a=c._gsCache=c._gsCache||{}).time=o,a.width=r/i*100),0!==r||n||(r=nt(t,e,i,s,!0))}return u?-r:r},rt=s.calculateOffset=function(t,e,i){if(\"absolute\"!==st(t,\"position\",i))return 0;var s=\"left\"===e?\"Left\":\"Top\",i=st(t,\"margin\"+s,i);return t[\"offset\"+s]-(nt(t,e,parseFloat(i),i.replace(j,\"\"))||0)},at={width:[\"Left\",\"Right\"],height:[\"Top\",\"Bottom\"]},ot=[\"marginLeft\",\"marginRight\",\"marginTop\",\"marginBottom\"],lt={aqua:[0,255,255],lime:[0,255,0],silver:[192,192,192],black:[0,0,0],maroon:[128,0,0],teal:[0,128,128],blue:[0,0,255],navy:[0,0,128],white:[255,255,255],fuchsia:[255,0,255],olive:[128,128,0],yellow:[255,255,0],orange:[255,165,0],gray:[128,128,128],purple:[128,0,128],green:[0,128,0],red:[255,0,0],pink:[255,192,203],cyan:[0,255,255],transparent:[255,255,255,0]},ct=\"(?:\\\\b(?:(?:rgb|rgba|hsl|hsla)\\\\(.+?\\\\))|\\\\B#.+?\\\\b\";for(t in lt)ct+=\"|\"+t+\"\\\\b\";function ht(t,e,r,a){if(null==t)return function(t){return t};var o,l=e?(t.match(ct)||[\"\"])[0]:\"\",c=t.split(l).join(\"\").match(I)||[],h=t.substr(0,t.indexOf(c[0])),u=\")\"===t.charAt(t.length-1)?\")\":\"\",p=-1!==t.indexOf(\" \")?\" \":\",\",d=c.length,_=0s;s++)n[s]=o(n[s]);return n.join(\",\")}if(e=(t.match(ct)||[l])[0],s=(i=t.split(e).join(\"\").match(I)||[]).length,d>s--)for(;d>++s;)i[s]=r?i[0|(s-1)/2]:c[s];return h+i.join(p)+p+e+u+(-1!==t.indexOf(\"inset\")?\" inset\":\"\")}:function(t){var e,i,s;if(\"number\"==typeof t)t+=_;else if(a&&H.test(t)){for(i=t.replace(H,\"|\").split(\"|\"),s=0;i.length>s;s++)i[s]=o(i[s]);return i.join(\",\")}if(s=(e=t.match(I)||[]).length,d>s--)for(;d>++s;)e[s]=r?e[0|(s-1)/2]:c[s];return h+e.join(p)+u}:function(t){return t}}function ut(c){return c=c.split(\",\"),function(t,e,i,s,n,r,a){var o,l=(e+\"\").split(\" \");for(a={},o=0;o<4;o++)a[c[o]]=l[o]=l[o]||l[(o-1)/2>>0];return s.parse(t,a,n,r)}}var ct=RegExp(ct+\")\",\"gi\"),pt=(s._setPluginRatio=function(t){this.plugin.setRatio(t);for(var e,i,s,n,r=this.data,a=r.proxy,o=r.firstMPT;o;)e=a[o.v],o.r?e=Math.round(e):e<1e-6&&-1e-6s;s++)n+=i[\"xn\"+s]+i[\"xs\"+(s+1)];i.e=n}}else i.e=i.s+i.xs0;o=o._next}},function(t,e,i,s,n){this.t=t,this.p=e,this.v=i,this.r=n,s&&((s._prev=this)._next=s)}),dt=(s._parseToProxy=function(t,e,i,s,n,r){var a,o,l,c,h=s,u={},p={},d=i._transform,_=V;for(i._transform=null,V=e,s=n=i.parse(t,e,s,n),V=_,r&&(i._transform=d,h&&(h._prev=null,h._prev&&(h._prev._next=null)));s&&s!==h;){if(s.type<=1&&(p[o=s.p]=s.s+s.c,u[o]=s.s,r||(c=new pt(s,\"s\",o,c,s.r),s.c=0),1===s.type))for(a=s.l;0<--a;)p[o=s.p+\"_\"+(l=\"xn\"+a)]=s.data[l],u[o]=s[l],r||(c=new pt(s,l,o,c,s.rxp[l]));s=s._next}return{proxy:u,end:p,firstMPT:c,pt:n}},s.CSSPropTween=function(t,e,i,s,n,r,a,o,l,c,h){this.t=t,this.p=e,this.s=i,this.c=s,this.n=a||e,t instanceof dt||u.push(this.n),this.r=o,this.type=r||0,l&&(this.pr=l,d=!0),this.b=void 0===c?i:c,this.e=void 0===h?i+s:h,n&&((this._next=n)._prev=this)}),_t=N.parseComplex=function(t,e,i,s,n,r,a,o,l,c){a=new dt(t,e,0,0,a,c?2:1,null,!1,o,i=i||r||\"\",s),s+=\"\";var h,u,p,d,_,f,m,g,v,w,y,x=i.split(\", \").join(\",\").split(\" \"),b=s.split(\", \").join(\",\").split(\" \"),T=x.length,k=!1!==O;for(-1===s.indexOf(\",\")&&-1===i.indexOf(\",\")||(x=x.join(\" \").replace(H,\", \").split(\" \"),b=b.join(\" \").replace(H,\", \").split(\" \"),T=x.length),T!==b.length&&(T=(x=(r||\"\").split(\" \")).length),a.plugin=l,a.setRatio=c,h=0;hu;u++)w=f[u],v=d.indexOf(w,p),a.appendXtra(d.substr(p,v-p),Number(w),P(m[u],w),\"\",k&&\"px\"===d.substr(v+w.length,2),0===u),p=v+w.length;a[\"xs\"+a.l]+=d.substr(p)}else a[\"xs\"+a.l]+=a.l?\" \"+d:d;if(-1!==s.indexOf(\"=\")&&a.data){for(y=a.xs0+a.data.s,h=1;a.l>h;h++)y+=a[\"xs\"+h]+a.data[\"xn\"+h];a.e=y+a[\"xs\"+h]}return a.l||(a.type=-1,a.xs0=a.e),a.xfirst||a},ft=9;for((t=dt.prototype).l=t.pr=0;0<--ft;)t[\"xn\"+ft]=0,t[\"xs\"+ft]=\"\";t.xs0=\"\",t._next=t._prev=t.xfirst=t.data=t.plugin=t.setRatio=t.rxp=null,t.appendXtra=function(t,e,i,s,n,r){var a=this,o=a.l;return a[\"xs\"+o]+=r&&o?\" \"+t:t||\"\",i||0===o||a.plugin?(a.l++,a.type=a.setRatio?2:1,a[\"xs\"+a.l]=s||\"\",0s;s++)e.prefix=0===s&&e.prefix,e.defaultValue=i[s]||r,new mt(n[s],e)};(t=mt.prototype).parseComplex=function(t,e,i,s,n,r){var a,o,l,c,h,u=this.keyword;if(this.multi&&(H.test(i)||H.test(e)?(o=e.replace(H,\"|\").split(\"|\"),l=i.replace(H,\"|\").split(\"|\")):u&&(o=[e],l=[i])),l){for(c=(l.length>o.length?l:o).length,a=0;aI[r]&&I[r]>-j&&(I[r]=0);return i&&(t._gsTransform=I),I},St=s.set3DTransformRatio=function(t){var e,i,s,n,r,a,o,l,c,h,u,p,d,_,f,m,g,v,w,y,x,b,T=this.data,k=this.t.style,P=T.rotation*U,S=T.scaleX,O=T.scaleY,C=T.scaleZ,A=T.perspective;if(1!==t&&0!==t||\"auto\"!==T.force3D||T.rotationY||T.rotationX||1!==C||A||T.z){if(M&&(S<1e-4&&-1e-4y;y++)this.p.indexOf(\"border\")&&(f[y]=T(f[y])),-1!==(o=a=st(t,f[y],b,!1,\"0px\")).indexOf(\" \")&&(o=(a=o.split(\" \"))[0],a=a[1]),l=r=w[y],d=parseFloat(o),_=o.substr((d+\"\").length),(h=\"\"===(h=(u=\"=\"===l.charAt(1))?(c=parseInt(l.charAt(0)+\"1\",10),l=l.substr(2),c*=parseFloat(l),l.substr((c+\"\").length-(c<0?1:0))||\"\"):(c=parseFloat(l),l.substr((c+\"\").length)))?x[i]||_:h)!==_&&(p=nt(t,\"borderLeft\",d,_),d=nt(t,\"borderTop\",d,_),a=\"%\"===h?(o=p/g*100+\"%\",d/v*100+\"%\"):\"em\"===h?(o=p/(_=nt(t,\"borderLeft\",1,\"em\"))+\"em\",d/_+\"em\"):(o=p+\"px\",d+\"px\"),u&&(l=parseFloat(o)+c+h,r=parseFloat(a)+c+h)),n=_t(m,f[y],o+\" \"+a,l+\" \"+r,!1,\"0px\",n);return n},prefix:!0,formatter:ht(\"0px 0px 0px 0px\",!1,!0)}),gt(\"backgroundPosition\",{defaultValue:\"0 0\",parser:function(t,e,i,s,n,r){var a,o,l,c,h,u,p=\"background-position\",d=b||it(t,null),_=this.format((d?C?d.getPropertyValue(p+\"-x\")+\" \"+d.getPropertyValue(p+\"-y\"):d.getPropertyValue(p):t.currentStyle.backgroundPositionX+\" \"+t.currentStyle.backgroundPositionY)||\"0 0\"),e=this.format(e);if(-1!==_.indexOf(\"%\")!=(-1!==e.indexOf(\"%\"))&&((u=st(t,\"backgroundImage\").replace(F,\"\"))&&\"none\"!==u)){for(a=_.split(\" \"),o=e.split(\" \"),G.setAttribute(\"src\",u),l=2;-1<--l;)(c=-1!==(_=a[l]).indexOf(\"%\"))!=(-1!==o[l].indexOf(\"%\"))&&(h=0===l?t.offsetWidth-G.width:t.offsetHeight-G.height,a[l]=c?parseFloat(_)/100*h+\"px\":parseFloat(_)/h*100+\"%\");_=a.join(\" \")}return this.parseComplex(t.style,_,e,n,r)},formatter:v}),gt(\"backgroundSize\",{defaultValue:\"0 0\",formatter:v}),gt(\"perspective\",{defaultValue:\"0px\",prefix:!0}),gt(\"perspectiveOrigin\",{defaultValue:\"50% 50%\",prefix:!0}),gt(\"transformStyle\",{prefix:!0}),gt(\"backfaceVisibility\",{prefix:!0}),gt(\"userSelect\",{prefix:!0}),gt(\"margin\",{parser:ut(\"marginTop,marginRight,marginBottom,marginLeft\")}),gt(\"padding\",{parser:ut(\"paddingTop,paddingRight,paddingBottom,paddingLeft\")}),gt(\"clip\",{defaultValue:\"rect(0px,0px,0px,0px)\",parser:function(t,e,i,s,n,r){var a,o;return e=C<9?(a=t.currentStyle,o=C<8?\" \":\",\",a=\"rect(\"+a.clipTop+o+a.clipRight+o+a.clipBottom+o+a.clipLeft+\")\",this.format(e).split(\",\").join(o)):(a=this.format(st(t,this.p,b,!1,this.dflt)),this.format(e)),this.parseComplex(t.style,a,e,n,r)}}),gt(\"textShadow\",{defaultValue:\"0px 0px 0px #999\",color:!0,multi:!0}),gt(\"autoRound,strictUnits\",{parser:function(t,e,i,s,n){return n}}),gt(\"border\",{defaultValue:\"0px solid #000\",parser:function(t,e,i,s,n,r){return this.parseComplex(t.style,this.format(st(t,\"borderTopWidth\",b,!1,\"0px\")+\" \"+st(t,\"borderTopStyle\",b,!1,\"solid\")+\" \"+st(t,\"borderTopColor\",b,!1,\"#000\")),this.format(e),n,r)},color:!0,formatter:function(t){var e=t.split(\" \");return e[0]+\" \"+(e[1]||\"solid\")+\" \"+(t.match(ct)||[\"#000\"])[0]}}),gt(\"borderWidth\",{parser:ut(\"borderTopWidth,borderRightWidth,borderBottomWidth,borderLeftWidth\")}),gt(\"float,cssFloat,styleFloat\",{parser:function(t,e,i,s,n){var r=t.style,t=\"cssFloat\"in r?\"cssFloat\":\"styleFloat\";return new dt(r,t,0,0,n,-1,i,!1,0,r[t],e)}});function Ct(t){var e,i=this.t,s=i.filter||st(this.data,\"filter\"),t=0|this.s+this.c*t;(e=100==t?-1===s.indexOf(\"atrix(\")&&-1===s.indexOf(\"radient(\")&&-1===s.indexOf(\"oader(\")?(i.removeAttribute(\"filter\"),!st(this.data,\"filter\")):(i.filter=s.replace(l,\"\"),!0):e)||(this.xn1&&(i.filter=s=s||\"alpha(opacity=\"+t+\")\"),-1===s.indexOf(\"pacity\")?0==t&&this.xn1||(i.filter=s+\" alpha(opacity=\"+t+\")\"):i.filter=s.replace(L,\"opacity=\"+t))}gt(\"opacity,alpha,autoAlpha\",{defaultValue:\"1\",parser:function(t,e,i,s,n,r){var a=parseFloat(st(t,\"opacity\",b,!1,\"1\")),o=t.style,l=\"autoAlpha\"===i;return\"string\"==typeof e&&\"=\"===e.charAt(1)&&(e=(\"-\"===e.charAt(0)?-1:1)*parseFloat(e.substr(2))+a),l&&1===a&&\"hidden\"===st(t,\"visibility\",b)&&0!==e&&(a=0),J?n=new dt(o,\"opacity\",a,e-a,n):((n=new dt(o,\"opacity\",100*a,100*(e-a),n)).xn1=l?1:0,o.zoom=1,n.type=2,n.b=\"alpha(opacity=\"+n.s+\")\",n.e=\"alpha(opacity=\"+(n.s+n.c)+\")\",n.data=t,n.plugin=r,n.setRatio=Ct),l&&((n=new dt(o,\"visibility\",0,0,n,-1,null,!1,0,0!==a?\"inherit\":\"hidden\",0===e?\"hidden\":\"inherit\")).xs0=\"inherit\",s._overwriteProps.push(n.n),s._overwriteProps.push(i)),n}});function At(t,e){e&&(t.removeProperty?(\"ms\"===e.substr(0,2)&&(e=\"M\"+e.substr(1)),t.removeProperty(e.replace(z,\"-$1\").toLowerCase())):t.removeAttribute(e))}function Mt(t){if(this.t._gsClassPT=this,1===t||0===t){this.t.setAttribute(\"class\",0===t?this.b:this.e);for(var e=this.data,i=this.t.style;e;)e.v?i[e.p]=e.v:At(i,e.p),e=e._next;1===t&&this.t._gsClassPT===this&&(this.t._gsClassPT=null)}else this.t.getAttribute(\"class\")!==this.e&&this.t.setAttribute(\"class\",this.e)}gt(\"className\",{parser:function(t,e,i,s,n,r,a){var o,l,c,h=t.getAttribute(\"class\")||\"\",u=t.style.cssText;if((n=s._classNamePT=new dt(t,i,0,0,n,2)).setRatio=Mt,n.pr=-11,d=!0,n.b=h,o=m(t,b),i=t._gsClassPT){for(l={},c=i.data;c;)l[c.p]=1,c=c._next;i.setRatio(1)}return(t._gsClassPT=n).e=\"=\"!==e.charAt(1)?e:h.replace(RegExp(\"\\\\s*\\\\b\"+e.substr(2)+\"\\\\b\"),\"\")+(\"+\"===e.charAt(0)?\" \"+e.substr(2):\"\"),s._tween._duration&&(t.setAttribute(\"class\",n.e),a=g(t,o,m(t),a,l),t.setAttribute(\"class\",h),n.data=a.firstMPT,t.style.cssText=u,n=n.xfirst=s.parse(t,a.difs,n,r)),n}});function Rt(t){if((1===t||0===t)&&this.data._totalTime===this.data._totalDuration&&\"isFromStart\"!==this.data.data){var e,i,s,n,r=this.t.style,a=_.transform.parse;if(\"all\"===this.e)n=!(r.cssText=\"\");else for(s=(e=this.e.split(\",\")).length;-1<--s;)i=e[s],_[i]&&(_[i].parse===a?n=!0:i=\"transformOrigin\"===i?bt:_[i].p),At(r,i);n&&(At(r,yt),this.t._gsTransform&&delete this.t._gsTransform)}}for(gt(\"clearProps\",{parser:function(t,e,i,s,n){return(n=new dt(t,i,0,0,n,2)).setRatio=Rt,n.e=e,n.pr=-10,n.data=s._tween,d=!0,n}}),t=\"bezier,throwProps,physicsProps,physics2D\".split(\",\"),ft=t.length;ft--;)!function(t){var l;_[t]||(l=t.charAt(0).toUpperCase()+t.substr(1)+\"Plugin\",gt(t,{parser:function(t,e,i,s,n,r,a){var o=(window.GreenSockGlobals||window).com.greensock.plugins[l];return o?(o._cssRegister(),_[i].parse(t,e,i,s,n,r,a)):(f(\"Error: \"+l+\" js file not loaded.\"),n)}}))}(t[ft]);(t=N.prototype)._firstPT=null,t._onInitTween=function(t,e,i){if(!t.nodeType)return!1;this._target=t,this._tween=i,this._vars=e,O=e.autoRound,d=!1,x=e.suffixMap||N.suffixMap,b=it(t,\"\"),u=this._overwriteProps;var s,n,r,a,o,l,i=t.style;if(c&&\"\"===i.zIndex&&(\"auto\"!==(l=st(t,\"zIndex\",b))&&\"\"!==l||this._addLazySet(i,\"zIndex\",0)),\"string\"==typeof e&&(r=i.cssText,l=m(t,b),i.cssText=r+\";\"+e,l=g(t,l,m(t)).difs,!J&&X.test(e)&&(l.opacity=parseFloat(RegExp.$1)),e=l,i.cssText=r),this._firstPT=s=this.parse(t,e,null),this._transformType){for(l=3===this._transformType,yt?h&&(c=!0,\"\"===i.zIndex&&(\"auto\"!==(e=st(t,\"zIndex\",b))&&\"\"!==e||this._addLazySet(i,\"zIndex\",0)),k&&this._addLazySet(i,\"WebkitBackfaceVisibility\",this._vars.WebkitBackfaceVisibility||(l?\"visible\":\"hidden\"))):i.zoom=1,n=s;n&&n._next;)n=n._next;i=new dt(t,\"transform\",0,0,null,2),this._linkCSSP(i,null,n),i.setRatio=l&&Tt?St:yt?Ot:vt,i.data=this._transform||Pt(t,b,!0),u.pop()}if(d){for(;s;){for(o=s._next,n=r;n&&n.pr>s.pr;)n=n._next;(s._prev=n?n._prev:a)?s._prev._next=s:r=s,(s._next=n)?n._prev=s:a=s,s=o}this._firstPT=r}return!0},t.parse=function(t,e,i,s){var n,r,a,o,l,c,h,u,p=t.style;for(n in e)l=e[n],u=_[n],u?i=u.parse(t,l,n,this,i,s,e):(o=st(t,n,b)+\"\",h=\"string\"==typeof l,\"color\"===n||\"fill\"===n||\"stroke\"===n||-1!==n.indexOf(\"Color\")||h&&E.test(l)?(h||(l=S(l),l=(3s;s++)i+=n[\"xn\"+s]+n[\"xs\"+(s+1)];n.t[n.p]=i}else-1===n.type?n.t[n.p]=n.xs0:n.setRatio&&n.setRatio(t);else n.t[n.p]=e+n.xs0;n=n._next}else for(;n;)2!==n.type?n.t[n.p]=n.b:n.setRatio(t),n=n._next;else for(;n;)2!==n.type?n.t[n.p]=n.e:n.setRatio(t),n=n._next},t._enableTransforms=function(t){this._transformType=t||3===this._transformType?3:2,this._transform=this._transform||Pt(this._target,b,!0)};function It(){this.t[this.p]=this.e,this.data._linkCSSP(this,this._next,null,!0)}t._addLazySet=function(t,e,i){e=this._firstPT=new dt(t,e,0,0,this._firstPT,2);e.e=i,e.setRatio=It,e.data=this},t._linkCSSP=function(t,e,i,s){return t&&(e&&(e._prev=t),t._next&&(t._next._prev=t._prev),t._prev?t._prev._next=t._next:this._firstPT===t&&(this._firstPT=t._next,s=!0),i?i._next=t:s||null!==this._firstPT||(this._firstPT=t),t._next=e,t._prev=i),t},t._kill=function(t){var e,i,s,n=t;if(t.autoAlpha||t.alpha){for(i in n={},t)n[i]=t[i];n.opacity=1,n.autoAlpha&&(n.visibility=1)}return t.className&&(e=this._classNamePT)&&((s=e.xfirst)&&s._prev?this._linkCSSP(s._prev,e._next,s._prev._prev):s===this._firstPT&&(this._firstPT=e._next),e._next&&this._linkCSSP(e._next,e._next._next,s._prev),this._classNamePT=null),r.prototype._kill.call(this,n)};function Dt(t,e,i){var s,n,r,a;if(t.slice)for(n=t.length;-1<--n;)Dt(t[n],e,i);else for(n=(s=t.childNodes).length;-1<--n;)a=(r=s[n]).type,r.style&&(e.push(m(r)),i&&i.push(r)),1!==a&&9!==a&&11!==a||!r.childNodes.length||Dt(r,e,i)}return N.cascadeTo=function(t,e,i){var s,n,r,a=p.to(t,e,i),o=[a],l=[],c=[],h=[],u=p._internals.reservedProps;for(t=a._targets||a.target,Dt(t,l,h),a.render(e,!0),Dt(t,c),a.render(0,!0),a._enabled(!0),s=h.length;-1<--s;)if((n=g(h[s],l[s],c[s])).firstMPT){for(r in n=n.difs,i)u[r]&&(n[r]=i[r]);o.push(p.to(h[s],e,n))}return o},r.activate([N]),N},!0)}),window._gsDefine&&window._gsQueue.pop()()},{}],13:[function(t,e,i){\"use strict\";(window._gsQueue||(window._gsQueue=[])).push(function(){function n(t,e){var i=\"x\"===e?\"Width\":\"Height\",s=\"scroll\"+i,n=\"client\"+i,e=document.body;return t===a||t===r||t===e?Math.max(r[s],e[s])-(a[\"inner\"+i]||Math.max(r[n],e[n])):t[s]-t[\"offset\"+i]}var r=document.documentElement,a=window,t=window._gsDefine.plugin({propName:\"scrollTo\",API:2,version:\"1.7.3\",init:function(t,e,i){return this._wdw=t===a,this._target=t,this._tween=i,this._autoKill=!1!==(e=\"object\"!=typeof e?{y:e}:e).autoKill,this.x=this.xPrev=this.getX(),this.y=this.yPrev=this.getY(),null!=e.x?(this._addTween(this,\"x\",this.x,\"max\"===e.x?n(t,\"x\"):e.x,\"scrollTo_x\",!0),this._overwriteProps.push(\"scrollTo_x\")):this.skipX=!0,null!=e.y?(this._addTween(this,\"y\",this.y,\"max\"===e.y?n(t,\"y\"):e.y,\"scrollTo_y\",!0),this._overwriteProps.push(\"scrollTo_y\")):this.skipY=!0,!0},set:function(t){this._super.setRatio.call(this,t);var e=this._wdw||!this.skipX?this.getX():this.xPrev,i=this._wdw||!this.skipY?this.getY():this.yPrev,s=i-this.yPrev,t=e-this.xPrev;this._autoKill&&(!this.skipX&&(7e&&(this.skipX=!0),!this.skipY&&(7i&&(this.skipY=!0),this.skipX&&this.skipY&&this._tween.kill()),this._wdw?a.scrollTo(this.skipX?e:this.x,this.skipY?i:this.y):(this.skipY||(this._target.scrollTop=this.y),this.skipX||(this._target.scrollLeft=this.x)),this.xPrev=this.x,this.yPrev=this.y}}),e=t.prototype;t.max=n,e.getX=function(){return this._wdw?null!=a.pageXOffset?a.pageXOffset:(null!=r.scrollLeft?r:document.body).scrollLeft:this._target.scrollLeft},e.getY=function(){return this._wdw?null!=a.pageYOffset?a.pageYOffset:(null!=r.scrollTop?r:document.body).scrollTop:this._target.scrollTop},e._kill=function(t){return t.scrollTo_x&&(this.skipX=!0),t.scrollTo_y&&(this.skipY=!0),this._super._kill.call(this,t)}}),window._gsDefine&&window._gsQueue.pop()()},{}]},{},[2]);"],"file":"wpr-admin.js"} \ No newline at end of file diff --git a/assets/js/wpr-admin.min.js b/assets/js/wpr-admin.min.js index 8deb7d6061..c733bac992 100644 --- a/assets/js/wpr-admin.min.js +++ b/assets/js/wpr-admin.min.js @@ -1,2 +1,2 @@ -!function s(n,r,a){function o(e,t){if(!r[e]){if(!n[e]){var i="function"==typeof require&&require;if(!t&&i)return i(e,!0);if(l)return l(e,!0);throw(i=new Error("Cannot find module '"+e+"'")).code="MODULE_NOT_FOUND",i}i=r[e]={exports:{}},n[e][0].call(i.exports,function(t){return o(n[e][1][t]||t)},i,i.exports,s,n,r,a)}return r[e].exports}for(var l="function"==typeof require&&require,t=0;t{i.append(""+t+": "),i.append(e[t].message),i.append("
")}):i.append('
'+e.message+"
")}})}),r("#wpr_enable_mobile_cache").on("click",function(t){t.preventDefault(),r("#wpr_enable_mobile_cache").addClass("wpr-isLoading"),r.post(ajaxurl,{action:"rocket_enable_mobile_cache",_ajax_nonce:rocket_ajax_data.nonce},function(t){t.success&&(r("#wpr_enable_mobile_cache").hide(),r("#wpr_mobile_cache_default").hide(),r("#wpr_mobile_cache_response").show(),r("#wpr_enable_mobile_cache").removeClass("wpr-isLoading"),r("#cache_mobile").val(1),r("#do_caching_mobile_files").val(1))})})})},{}],2:[function(t,e,i){"use strict";t("../lib/greensock/TweenLite.min.js"),t("../lib/greensock/TimelineLite.min.js"),t("../lib/greensock/easing/EasePack.min.js"),t("../lib/greensock/plugins/CSSPlugin.min.js"),t("../lib/greensock/plugins/ScrollToPlugin.min.js"),t("../global/pageManager.js"),t("../global/main.js"),t("../global/fields.js"),t("../global/beacon.js"),t("../global/ajax.js"),t("../global/rocketcdn.js"),t("../global/countdown.js")},{"../global/ajax.js":1,"../global/beacon.js":3,"../global/countdown.js":4,"../global/fields.js":5,"../global/main.js":6,"../global/pageManager.js":7,"../global/rocketcdn.js":8,"../lib/greensock/TimelineLite.min.js":9,"../lib/greensock/TweenLite.min.js":10,"../lib/greensock/easing/EasePack.min.js":11,"../lib/greensock/plugins/CSSPlugin.min.js":12,"../lib/greensock/plugins/ScrollToPlugin.min.js":13}],3:[function(t,e,i){"use strict";var s=jQuery;s(document).ready(function(){"Beacon"in window&&s(".wpr-infoAction--help").on("click",function(t){var e=s(this).data("beacon-id");return 0!==(e=(e=e).split(",")).length&&(1{o(t).attr("checked",i?null:"checked")});else{const r=o(e).closest(".wpr-list").find(".wpr-main-checkbox");var n=o.map(s,t=>{if(void 0!==o(t).attr("checked"))return t});r.attr("checked",n.length===s.length?"checked":null)}}),0{let i=o(e).parents(".wpr-list");var s=i.find(".wpr-list-body input[type=checkbox]:not(:checked)").length;o(e).attr("checked",s<=0?"checked":null)})})},{}],6:[function(t,e,i){"use strict";var c=jQuery;c(document).ready(function(){var t=c(".wpr-notice");c("#wpr-congratulations-notice").on("click",function(){return(new TimelineLite).to(t,1,{autoAlpha:0,x:40,ease:Power4.easeOut}).to(t,.6,{height:0,marginTop:0,ease:Power4.easeOut},"=-.4").set(t,{display:"none"}),!1}),c(".rocket-analytics-data-container").hide(),c(".rocket-preview-analytics-data").on("click",function(t){t.preventDefault(),c(this).parent().next(".rocket-analytics-data-container").toggle()}),c(".wpr-toggle-button").each(function(){var t=c(this),e=t.closest(".wpr-fieldsContainer-fieldset").find(".wpr-radio :checkbox"),i=c('[href="'+t.attr("href")+'"].wpr-menuItem');e.on("change",function(){e.is(":checked")?(i.css("display","block"),t.css("display","inline-block")):(i.css("display","none"),t.css("display","none"))}).trigger("change")});var e=c(".wpr-Popin-Analytics"),i=c(".wpr-Popin-overlay"),s=c(".wpr-Popin-Analytics-close"),n=c(".wpr-Popin-Analytics .wpr-button");function r(){(new TimelineLite).fromTo(e,.6,{autoAlpha:1,marginTop:0},{autoAlpha:0,marginTop:-24,ease:Power4.easeOut}).fromTo(i,.6,{autoAlpha:1},{autoAlpha:0,ease:Power4.easeOut},"=-.5").set(e,{display:"none"}).set(i,{display:"none"})}c(".wpr-js-popin").on("click",function(t){return t.preventDefault(),(new TimelineLite).set(e,{display:"block"}).set(i,{display:"block"}).fromTo(i,.6,{autoAlpha:0},{autoAlpha:1,ease:Power4.easeOut}).fromTo(e,.6,{autoAlpha:0,marginTop:-24},{autoAlpha:1,marginTop:0,ease:Power4.easeOut},"=-.5"),!1}),s.on("click",function(t){return t.preventDefault(),r(),!1}),n.on("click",function(t){return t.preventDefault(),r(),c("#analytics_enabled").prop("checked",!0),c("#analytics_enabled").trigger("change"),!1}),c("#analytics_enabled").on("change",function(){c(".wpr-rocket-analytics-cta").toggleClass("wpr-isHidden")});var a=c(".wpr-Popin-Upgrade"),n=c(".wpr-Popin-Upgrade-close");c(".wpr-popin-upgrade-toggle").on("click",function(t){return t.preventDefault(),(new TimelineLite).set(a,{display:"block"}).set(i,{display:"block"}).fromTo(i,.6,{autoAlpha:0},{autoAlpha:1,ease:Power4.easeOut}).fromTo(a,.6,{autoAlpha:0,marginTop:-24},{autoAlpha:1,marginTop:0,ease:Power4.easeOut},"=-.5"),!1}),n.on("click",function(){return(new TimelineLite).fromTo(a,.6,{autoAlpha:1,marginTop:0},{autoAlpha:0,marginTop:-24,ease:Power4.easeOut}).fromTo(i,.6,{autoAlpha:1},{autoAlpha:0,ease:Power4.easeOut},"=-.5").set(a,{display:"none"}).set(i,{display:"none"}),!1});var o=c(".wpr-Sidebar");c(".wpr-js-tips").on("change",function(){c(this).is(":checked")?(o.css("display","block"),localStorage.setItem("wpr-show-sidebar","on")):(o.css("display","none"),localStorage.setItem("wpr-show-sidebar","off"))}),document.getElementById("LKgOcCRpwmAj")?c(".wpr-adblock").css("display","none"):c(".wpr-adblock").css("display","block");var l=c(".wpr-adblock");c(".wpr-adblock-close").on("click",function(){return(new TimelineLite).to(l,1,{autoAlpha:0,x:40,ease:Power4.easeOut}).to(l,.4,{height:0,marginTop:0,ease:Power4.easeOut},"=-.4").set(l,{display:"none"}),!1})})},{}],7:[function(t,e,i){"use strict";function s(t){var e,i=this;this.$body=document.querySelector(".wpr-body"),this.$menuItems=document.querySelectorAll(".wpr-menuItem"),this.$submitButton=document.querySelector(".wpr-Content > form > #wpr-options-submit"),this.$pages=document.querySelectorAll(".wpr-Page"),this.$sidebar=document.querySelector(".wpr-Sidebar"),this.$content=document.querySelector(".wpr-Content"),this.$tips=document.querySelector(".wpr-Content-tips"),this.$links=document.querySelectorAll(".wpr-body a"),this.$menuItem=null,this.$page=null,this.pageId=null,this.bodyTop=0,this.buttonText=this.$submitButton.value,i.getBodyTop(),window.onhashchange=function(){i.detectID()},window.location.hash?(this.bodyTop=0,this.detectID()):(e=localStorage.getItem("wpr-hash"),this.bodyTop=0,e?(window.location.hash=e,this.detectID()):(this.$menuItems[0].classList.add("isActive"),localStorage.setItem("wpr-hash","dashboard"),window.location.hash="#dashboard"));for(var s=0;s{a.querySelectorAll(".wpr-rocketcdn-open").forEach(t=>{t.addEventListener("click",t=>{t.preventDefault()})}),function(){var t="";t+="action=rocketcdn_process_status";const e=r(t+="&nonce="+rocket_ajax_data.nonce);e.onreadystatechange=()=>{e.readyState===XMLHttpRequest.DONE&&200===e.status&&!0===JSON.parse(e.responseText).success&&MicroModal.show("wpr-rocketcdn-modal")}}(),MicroModal.init({disableScroll:!0})}),s.addEventListener("load",()=>{let t=a.querySelector("#wpr-rocketcdn-open-cta"),e=a.querySelector("#wpr-rocketcdn-close-cta"),i=a.querySelector("#wpr-rocketcdn-cta-small"),s=a.querySelector("#wpr-rocketcdn-cta");function n(t){var e="";return e+="action=toggle_rocketcdn_cta",e+="&status="+t,e+="&nonce="+rocket_ajax_data.nonce}null!==t&&null!==i&&null!==s&&t.addEventListener("click",t=>{t.preventDefault(),i.classList.add("wpr-isHidden"),s.classList.remove("wpr-isHidden"),r(n("big"))}),null!==e&&null!==i&&null!==s&&e.addEventListener("click",t=>{t.preventDefault(),i.classList.remove("wpr-isHidden"),s.classList.add("wpr-isHidden"),r(n("small"))})}),s.onmessage=t=>{var e,i,s=rocket_ajax_data.origin_url;t.origin===s&&((e=t.data).hasOwnProperty("cdnFrameHeight")&&(a.getElementById("rocketcdn-iframe").style.height=e.cdnFrameHeight+"px"),(i=t.data).hasOwnProperty("cdnFrameClose")&&(MicroModal.close("wpr-rocketcdn-modal"),i.hasOwnProperty("cdn_page_message")&&-1!==["iframe-payment-success","iframe-unsubscribe-success"].indexOf(i.cdn_page_message)&&a.location.reload()),function(t,e){let i=a.querySelector("#rocketcdn-iframe").contentWindow;if(t.hasOwnProperty("rocketcdn_token")){var s="";s+="action=save_rocketcdn_token",s+="&value="+t.rocketcdn_token;const n=r(s+="&nonce="+rocket_ajax_data.nonce);n.onreadystatechange=()=>{var t;n.readyState===XMLHttpRequest.DONE&&200===n.status&&(t=JSON.parse(n.responseText),i.postMessage({success:t.success,data:t.data,rocketcdn:!0},e))}}else{s={process:"subscribe",message:"token_not_received"};i.postMessage({success:!1,data:s,rocketcdn:!0},e)}}(t.data,s),(e=t.data).hasOwnProperty("rocketcdn_process")&&(i="",i+="action=rocketcdn_process_set",i+="&status="+e.rocketcdn_process,r(i+="&nonce="+rocket_ajax_data.nonce)),function(t,e){let i=a.querySelector("#rocketcdn-iframe").contentWindow;if(t.hasOwnProperty("rocketcdn_url")){var s="";s+="action=rocketcdn_enable",s+="&cdn_url="+t.rocketcdn_url;const n=r(s+="&nonce="+rocket_ajax_data.nonce);n.onreadystatechange=()=>{var t;n.readyState===XMLHttpRequest.DONE&&200===n.status&&(t=JSON.parse(n.responseText),i.postMessage({success:t.success,data:t.data,rocketcdn:!0},e))}}}(t.data,s),function(t,e){let i=a.querySelector("#rocketcdn-iframe").contentWindow;if(t.hasOwnProperty("rocketcdn_disable")){t="";t+="action=rocketcdn_disable";const s=r(t+="&nonce="+rocket_ajax_data.nonce);s.onreadystatechange=()=>{var t;s.readyState===XMLHttpRequest.DONE&&200===s.status&&(t=JSON.parse(s.responseText),i.postMessage({success:t.success,data:t.data,rocketcdn:!0},e))}}}(t.data,s),(s=t.data).hasOwnProperty("rocketcdn_validate_token")&&s.hasOwnProperty("rocketcdn_validate_cname")&&(t="",t+="action=rocketcdn_validate_token_cname",t+="&cdn_url="+s.rocketcdn_validate_cname,t+="&cdn_token="+s.rocketcdn_validate_token,r(t+="&nonce="+rocket_ajax_data.nonce)))}},{}],9:[function(t,e,i){"use strict";(window._gsQueue||(window._gsQueue=[])).push(function(){window._gsDefine("TimelineLite",["core.Animation","core.SimpleTimeline","TweenLite"],function(h,u,p){function d(t){u.call(this,t),this._labels={},this.autoRemoveChildren=!0===this.vars.autoRemoveChildren,this.smoothChildTiming=!0===this.vars.smoothChildTiming,this._sortChildren=!0,this._onUpdate=this.vars.onUpdate;var e,i,s=this.vars;for(i in s)e=s[i],g(e)&&-1!==e.join("").indexOf("{self}")&&(s[i]=this._swapSelfInParams(e));g(s.tweens)&&this.add(s.tweens,0,s.align,s.stagger)}function _(t){var e,i={};for(e in t)i[e]=t[e];return i}function n(t,e,i,s){t._timeline.pause(t._startTime),e&&e.apply(s||t._timeline,i||v)}var f=1e-10,m=p._internals.isSelector,g=p._internals.isArray,v=[],a=window._gsDefine.globals,w=v.slice,t=d.prototype=new u;return d.version="1.12.1",t.constructor=d,t.kill()._gc=!1,t.to=function(t,e,i,s){var n=i.repeat&&a.TweenMax||p;return e?this.add(new n(t,e,i),s):this.set(t,i,s)},t.from=function(t,e,i,s){return this.add((i.repeat&&a.TweenMax||p).from(t,e,i),s)},t.fromTo=function(t,e,i,s,n){var r=s.repeat&&a.TweenMax||p;return e?this.add(r.fromTo(t,e,i,s),n):this.set(t,s,n)},t.staggerTo=function(t,e,i,s,n,r,a,o){var l,c=new d({onComplete:r,onCompleteParams:a,onCompleteScope:o,smoothChildTiming:this.smoothChildTiming});for("string"==typeof t&&(t=p.selector(t)||t),m(t)&&(t=w.call(t,0)),s=s||0,l=0;t.length>l;l++)i.startAt&&(i.startAt=_(i.startAt)),c.to(t[l],e,_(i),l*s);return this.add(c,n)},t.staggerFrom=function(t,e,i,s,n,r,a,o){return i.immediateRender=0!=i.immediateRender,i.runBackwards=!0,this.staggerTo(t,e,i,s,n,r,a,o)},t.staggerFromTo=function(t,e,i,s,n,r,a,o,l){return s.startAt=i,s.immediateRender=0!=s.immediateRender&&0!=i.immediateRender,this.staggerTo(t,e,s,n,r,a,o,l)},t.call=function(t,e,i,s){return this.add(p.delayedCall(0,t,e,i),s)},t.set=function(t,e,i){return i=this._parseTimeOrLabel(i,0,!0),null==e.immediateRender&&(e.immediateRender=i===this._time&&!this._paused),this.add(new p(t,0,e),i)},d.exportRoot=function(t,e){null==(t=t||{}).smoothChildTiming&&(t.smoothChildTiming=!0);var i,s,n=new d(t),t=n._timeline;for(null==e&&(e=!0),t._remove(n,!0),n._startTime=0,n._rawPrevTime=n._time=n._totalTime=t._time,i=t._first;i;)s=i._next,e&&i instanceof p&&i.target===i.vars.onComplete||n.add(i,i._startTime-i._delay),i=s;return t.add(n,0),n},t.add=function(t,e,i,s){var n,r,a,o,l,c;if("number"!=typeof e&&(e=this._parseTimeOrLabel(e,0,!0,t)),!(t instanceof h)){if(t instanceof Array||t&&t.push&&g(t)){for(i=i||"normal",s=s||0,n=e,r=t.length,a=0;at._startTime;l._timeline;)c&&l._timeline.smoothChildTiming?l.totalTime(l._totalTime,!0):l._gc&&l._enabled(!0,!1),l=l._timeline;return this},t.remove=function(t){if(t instanceof h)return this._remove(t,!1);if(t instanceof Array||t&&t.push&&g(t)){for(var e=t.length;-1<--e;)this.remove(t[e]);return this}return"string"==typeof t?this.removeLabel(t):this.kill(null,t)},t._remove=function(t,e){u.prototype._remove.call(this,t,e);e=this._last;return e?this._time>e._startTime+e._totalDuration/e._timeScale&&(this._time=this.duration(),this._totalTime=this._totalDuration):this._time=this._totalTime=this._duration=this._totalDuration=0,this},t.append=function(t,e){return this.add(t,this._parseTimeOrLabel(null,e,!0,t))},t.insert=t.insertMultiple=function(t,e,i,s){return this.add(t,e||0,i,s)},t.appendMultiple=function(t,e,i,s){return this.add(t,this._parseTimeOrLabel(null,e,!0,t),i,s)},t.addLabel=function(t,e){return this._labels[t]=this._parseTimeOrLabel(e),this},t.addPause=function(t,e,i,s){return this.call(n,["{self}",e,i,s],this,t)},t.removeLabel=function(t){return delete this._labels[t],this},t.getLabelTime=function(t){return null!=this._labels[t]?this._labels[t]:-1},t._parseTimeOrLabel=function(t,e,i,s){var n;if(s instanceof h&&s.timeline===this)this.remove(s);else if(s&&(s instanceof Array||s.push&&g(s)))for(n=s.length;-1<--n;)s[n]instanceof h&&s[n].timeline===this&&this.remove(s[n]);if("string"==typeof e)return this._parseTimeOrLabel(e,i&&"number"==typeof t&&null==this._labels[e]?t-this.duration():0,i);if(e=e||0,"string"!=typeof t||!isNaN(t)&&null==this._labels[t])null==t&&(t=this.duration());else{if(-1===(n=t.indexOf("=")))return null==this._labels[t]?i?this._labels[t]=this.duration()+e:e:this._labels[t]+e;e=parseInt(t.charAt(n-1)+"1",10)*Number(t.substr(n+1)),t=1f&&(a="onReverseComplete"))),this._rawPrevTime=this._duration||!e||t||this._rawPrevTime===t?t:f,t=l+1e-4):t<1e-7?(((this._totalTime=this._time=0)!==c||0===this._duration&&this._rawPrevTime!==f&&(0=c)for(s=this._first;s&&(r=s._next,!this._paused||p);)(s._active||s._startTime<=this._time&&!s._paused&&!s._gc)&&(s._reversed?s.render((s._dirty?s.totalDuration():s._totalDuration)-(t-s._startTime)*s._timeScale,e,i):s.render((t-s._startTime)*s._timeScale,e,i)),s=r;else for(s=this._last;s&&(r=s._prev,!this._paused||p);)(s._active||c>=s._startTime&&!s._paused&&!s._gc)&&(s._reversed?s.render((s._dirty?s.totalDuration():s._totalDuration)-(t-s._startTime)*s._timeScale,e,i):s.render((t-s._startTime)*s._timeScale,e,i)),s=r;this._onUpdate&&(e||this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||v)),a&&(this._gc||h!==this._startTime&&u===this._timeScale||!(0===this._time||l>=this.totalDuration())||(n&&(this._timeline.autoRemoveChildren&&this._enabled(!1,!1),this._active=!1),!e&&this.vars[a]&&this.vars[a].apply(this.vars[a+"Scope"]||this,this.vars[a+"Params"]||v)))}},t._hasPausedChild=function(){for(var t=this._first;t;){if(t._paused||t instanceof d&&t._hasPausedChild())return!0;t=t._next}return!1},t.getChildren=function(t,e,i,s){s=s||-9999999999;for(var n=[],r=this._first,a=0;r;)s>r._startTime||(r instanceof p?!1!==e&&(n[a++]=r):(!1!==i&&(n[a++]=r),!1!==t&&(a=(n=n.concat(r.getChildren(!0,e,i))).length))),r=r._next;return n},t.getTweensOf=function(t,e){var i,s,n=this._gc,r=[],a=0;for(n&&this._enabled(!0,!0),s=(i=p.getTweensOf(t)).length;-1<--s;)(i[s].timeline===this||e&&this._contains(i[s]))&&(r[a++]=i[s]);return n&&this._enabled(!1,!0),r},t._contains=function(t){for(var e=t.timeline;e;){if(e===this)return!0;e=e.timeline}return!1},t.shiftChildren=function(t,e,i){i=i||0;for(var s,n=this._first,r=this._labels;n;)n._startTime>=i&&(n._startTime+=t),n=n._next;if(e)for(s in r)r[s]>=i&&(r[s]+=t);return this._uncache(!0)},t._kill=function(t,e){if(!t&&!e)return this._enabled(!1,!1);for(var i=e?this.getTweensOf(e):this.getChildren(!0,!0,!1),s=i.length,n=!1;-1<--s;)i[s]._kill(t,e)&&(n=!0);return n},t.clear=function(t){var e=this.getChildren(!1,!0,!0),i=e.length;for(this._time=this._totalTime=0;-1<--i;)e[i]._enabled(!1,!1);return!1!==t&&(this._labels={}),this._uncache(!0)},t.invalidate=function(){for(var t=this._first;t;)t.invalidate(),t=t._next;return this},t._enabled=function(t,e){if(t===this._gc)for(var i=this._first;i;)i._enabled(t,!0),i=i._next;return u.prototype._enabled.call(this,t,e)},t.duration=function(t){return arguments.length?(0!==this.duration()&&0!==t&&this.timeScale(this._duration/t),this):(this._dirty&&this.totalDuration(),this._duration)},t.totalDuration=function(t){if(arguments.length)return 0!==this.totalDuration()&&0!==t&&this.timeScale(this._totalDuration/t),this;if(this._dirty){for(var e,i,s=0,n=this._last,r=999999999999;n;)e=n._prev,n._dirty&&n.totalDuration(),n._startTime>r&&this._sortChildren&&!n._paused?this.add(n,n._startTime-n._delay):r=n._startTime,n._startTime<0&&!n._paused&&(s-=n._startTime,this._timeline.smoothChildTiming&&(this._startTime+=n._startTime/this._timeScale),this.shiftChildren(-n._startTime,!1,-9999999999),r=0),s<(i=n._startTime+n._totalDuration/n._timeScale)&&(s=i),n=e;this._duration=this._totalDuration=s,this._dirty=!1}return this._totalDuration},t.usesFrames=function(){for(var t=this._timeline;t._timeline;)t=t._timeline;return t===h._rootFramesTimeline},t.rawTime=function(){return this._paused?this._totalTime:(this._timeline.rawTime()-this._startTime)*this._timeScale},d},!0)}),window._gsDefine&&window._gsQueue.pop()()},{}],10:[function(t,Q,e){"use strict";!function(p){var e,i,d=p.GreenSockGlobals||p;if(!d.TweenLite){var _,f=function(t){for(var e=t.split("."),i=d,s=0;e.length>s;s++)i[e[s]]=i=i[e[s]]||{};return i},u=f("com.greensock"),m=1e-10,o=[].slice,g=function(){},h=(e=Object.prototype.toString,i=e.call([]),function(t){return null!=t&&(t instanceof Array||"object"==typeof t&&!!t.push&&e.call(t)===i)}),v={},w=function(o,l,c,h){this.sc=v[o]?v[o].sc:[],(v[o]=this).gsClass=null,this.func=c;var u=[];this.check=function(t){for(var e,i,s,n,r=l.length,a=r;-1<--r;)(e=v[l[r]]||new w(l[r],[])).gsClass?(u[r]=e.gsClass,a--):t&&e.sc.push(this);if(0===a&&c)for(s=(i=("com.greensock."+o).split(".")).pop(),n=f(i.join("."))[s]=this.gsClass=c.apply(c,u),h&&(d[s]=n,"function"==typeof define&&define.amd?define((p.GreenSockAMDPath?p.GreenSockAMDPath+"/":"")+o.split(".").join("/"),[],function(){return n}):void 0!==Q&&Q.exports&&(Q.exports=n)),r=0;this.sc.length>r;r++)this.sc[r].check()},this.check(!0)},s=p._gsDefine=function(t,e,i,s){return new w(t,e,i,s)},y=u._class=function(t,e,i){return e=e||function(){},s(t,[],function(){return e},i),e};s.globals=d;var t,n=[0,0,1,1],x=[],b=y("easing.Ease",function(t,e,i,s){this._func=t,this._type=i||0,this._power=s||0,this._params=e?n.concat(e):n},!0),T=b.map={},r=b.register=function(t,e,i,s){for(var n,r,a,o,l=e.split(","),c=l.length,h=(i||"easeIn,easeOut,easeInOut").split(",");-1<--c;)for(r=l[c],n=s?y("easing."+r,null,!0):u.easing[r]||{},a=h.length;-1<--a;)o=h[a],T[r+"."+o]=T[o+r]=n[o]=t.getRatio?t:t[o]||new t};for((t=b.prototype)._calcEnd=!1,t.getRatio=function(t){if(this._func)return this._params[0]=t,this._func.apply(null,this._params);var e=this._type,i=this._power,s=1===e?1-t:2===e?t:t<.5?2*t:2*(1-t);return 1===i?s*=s:2===i?s*=s*s:3===i?s*=s*s*s:4===i&&(s*=s*s*s*s),1===e?1-s:2===e?s:t<.5?s/2:1-s/2},l=(a=["Linear","Quad","Cubic","Quart","Quint,Strong"]).length;-1<--l;)t=a[l]+",Power"+l,r(new b(null,null,1,l),t,"easeOut",!0),r(new b(null,null,2,l),t,"easeIn"+(0===l?",easeNone":"")),r(new b(null,null,3,l),t,"easeInOut");T.linear=u.easing.Linear.easeIn,T.swing=u.easing.Quad.easeInOut;var k=y("events.EventDispatcher",function(t){this._listeners={},this._eventTarget=t||this});(t=k.prototype).addEventListener=function(t,e,i,s,n){n=n||0;var r,a,o=this._listeners[t],l=0;for(null==o&&(this._listeners[t]=o=[]),a=o.length;-1<--a;)(r=o[a]).c===e&&r.s===i?o.splice(a,1):0===l&&n>r.pr&&(l=a+1);o.splice(l,0,{c:e,s:i,up:s,pr:n}),this!==A||_||A.wake()},t.removeEventListener=function(t,e){var i,s=this._listeners[t];if(s)for(i=s.length;-1<--i;)if(s[i].c===e)return void s.splice(i,1)},t.dispatchEvent=function(t){var e,i,s,n=this._listeners[t];if(n)for(e=n.length,i=this._eventTarget;-1<--e;)(s=n[e]).up?s.c.call(s.s||i,{type:t,target:i}):s.c.call(s.s||i)};for(var a,P=p.requestAnimationFrame,S=p.cancelAnimationFrame,O=Date.now||function(){return(new Date).getTime()},C=O(),l=(a=["ms","moz","webkit","o"]).length;-1<--l&&!P;)P=p[a[l]+"RequestAnimationFrame"],S=p[a[l]+"CancelAnimationFrame"]||p[a[l]+"CancelRequestAnimationFrame"];y("Ticker",function(t,e){var s,n,r,a,o,l=this,c=O(),i=!1!==e&&P,h=500,u=33,p=function(t){var e,i=O()-C;h=i&&i+this.totalDuration()/this._timeScale>t},t._enabled=function(t,e){return _||A.wake(),this._gc=!t,this._active=this.isActive(),!0!==e&&(t&&!this.timeline?this._timeline.add(this,this._startTime-this._delay):!t&&this.timeline&&this._timeline._remove(this,!0)),!1},t._kill=function(){return this._enabled(!1,!1)},t.kill=function(t,e){return this._kill(t,e),this},t._uncache=function(t){for(var e=t?this:this.timeline;e;)e._dirty=!0,e=e.timeline;return this},t._swapSelfInParams=function(t){for(var e=t.length,i=t.concat();-1<--e;)"{self}"===t[e]&&(i[e]=this);return i},t.eventCallback=function(t,e,i,s){if("on"===(t||"").substr(0,2)){var n=this.vars;if(1===arguments.length)return n[t];null==e?delete n[t]:(n[t]=e,n[t+"Params"]=h(i)&&-1!==i.join("").indexOf("{self}")?this._swapSelfInParams(i):i,n[t+"Scope"]=s),"onUpdate"===t&&(this._onUpdate=e)}return this},t.delay=function(t){return arguments.length?(this._timeline.smoothChildTiming&&this.startTime(this._startTime+t-this._delay),this._delay=t,this):this._delay},t.duration=function(t){return arguments.length?(this._duration=this._totalDuration=t,this._uncache(!0),this._timeline.smoothChildTiming&&0this._duration?this._duration:t,e)):this._time},t.totalTime=function(t,e,i){if(_||A.wake(),!arguments.length)return this._totalTime;if(this._timeline){if(t<0&&!i&&(t+=this.totalDuration()),this._timeline.smoothChildTiming){this._dirty&&this.totalDuration();var s=this._totalDuration,n=this._timeline;if(ss;)i=i._prev;return i?(t._next=i._next,i._next=t):(t._next=this._first,this._first=t),t._next?t._next._prev=t:this._last=t,t._prev=i,this._timeline&&this._uncache(!0),this},t._remove=function(t,e){return t.timeline===this&&(e||t._enabled(!1,!0),t.timeline=null,t._prev?t._prev._next=t._next:this._first===t&&(this._first=t._next),t._next?t._next._prev=t._prev:this._last===t&&(this._last=t._prev),this._timeline&&this._uncache(!0)),this},t.render=function(t,e,i){var s,n=this._first;for(this._totalTime=this._time=this._rawPrevTime=t;n;)s=n._next,(n._active||t>=n._startTime&&!n._paused)&&(n._reversed?n.render((n._dirty?n.totalDuration():n._totalDuration)-(t-n._startTime)*n._timeScale,e,i):n.render((t-n._startTime)*n._timeScale,e,i)),n=s},t.rawTime=function(){return _||A.wake(),this._totalTime};var I=y("TweenLite",function(t,e,i){if(c.call(this,e,i),this.render=I.prototype.render,null==t)throw"Cannot tween a null target.";this.target=t="string"==typeof t&&I.selector(t)||t;var s,n,r,i=t.jquery||t.length&&t!==p&&t[0]&&(t[0]===p||t[0].nodeType&&t[0].style&&!t.nodeType),a=this.vars.overwrite;if(this._overwrite=a=null==a?F[I.defaultOverwrite]:"number"==typeof a?a>>0:F[a],(i||t instanceof Array||t.push&&h(t))&&"number"!=typeof t[0])for(this._targets=r=o.call(t,0),this._propLookup=[],this._siblings=[],s=0;r.length>s;s++)(n=r[s])?"string"!=typeof n?n.length&&n!==p&&n[0]&&(n[0]===p||n[0].nodeType&&n[0].style&&!n.nodeType)?(r.splice(s--,1),this._targets=r=r.concat(o.call(n,0))):(this._siblings[s]=H(n,this,!1),1===a&&1=a._startTime&&a._startTime+a.totalDuration()/a._timeScale>c&&((p||!a._initted)&&c-a._startTime<=2e-10||(h[u++]=a)));for(d=u;-1<--d;)a=h[d],2===s&&a._kill(i,t)&&(r=!0),(2!==s||!a._firstPT&&a._initted)&&a._enabled(!1,!1)&&(r=!0);return r},W=function(t,e,i){for(var s=t._timeline,n=s._timeScale,r=t._startTime;s._timeline;){if(r+=s._startTime,n*=s._timeScale,s._paused)return-100;s=s._timeline}return e<(r/=n)?r-e:i&&r===e||!t._initted&&r-e<2*m?m:(r+=t.totalDuration()/t._timeScale/n)>e+m?0:r-e-m};t._init=function(){var t,e,i,s,n,r=this.vars,a=this._overwrittenProps,o=this._duration,l=!!r.immediateRender,c=r.ease;if(r.startAt){for(s in this._startAt&&(this._startAt.render(-1,!0),this._startAt.kill()),n={},r.startAt)n[s]=r.startAt[s];if(n.overwrite=!1,n.immediateRender=!0,n.lazy=l&&!1!==r.lazy,n.startAt=n.delay=null,this._startAt=I.to(this.target,0,n),l)if(0o.pr;)s=s._next;(o._prev=s?s._prev:r)?o._prev._next=o:n=o,(o._next=s)?s._prev=o:r=o,o=a}o=e._firstPT=n}for(;o;)o.pg&&"function"==typeof o.t[t]&&o.t[t]()&&(i=!0),o=o._next;return i},V.activate=function(t){for(var e=t.length;-1<--e;)t[e].API===V.API&&(E[(new t[e])._propName]=t[e]);return!0},s.plugin=function(t){if(!(t&&t.propName&&t.init&&t.API))throw"illegal plugin definition.";var e,i=t.propName,s=t.priority||0,n=t.overwriteProps,r={init:"_onInitTween",set:"setRatio",kill:"_kill",round:"_roundProps",initAll:"_onInitAllProps"},a=y("plugins."+i.charAt(0).toUpperCase()+i.substr(1)+"Plugin",function(){V.call(this,i,s),this._overwriteProps=n||[]},!0===t.global),o=a.prototype=new V(i);for(e in(o.constructor=a).API=t.API,r)"function"==typeof t[e]&&(o[r[e]]=t[e]);return a.version=t.version,V.activate([a]),a},a=p._gsQueue){for(l=0;a.length>l;l++)a[l]();for(t in v)v[t].func||p.console.log("GSAP encountered missing dependency: com.greensock."+t)}_=!1}}(window)},{}],11:[function(t,e,i){"use strict";(window._gsQueue||(window._gsQueue=[])).push(function(){window._gsDefine("easing.Back",["easing.Ease"],function(m){function t(t,e){var i=c("easing."+t,function(){},!0);return(t=i.prototype=new m).constructor=i,t.getRatio=e,i}function e(t,e,i,s){return s=c("easing."+t,{easeOut:new e,easeIn:new i,easeInOut:new s},!0),h(s,t),s}function g(t,e,i){this.t=t,this.v=e,i&&(((this.next=i).prev=this).c=i.v-e,this.gap=i.t-t)}function i(t,e){var i=c("easing."+t,function(t){this._p1=t||0===t?t:1.70158,this._p2=1.525*this._p1},!0);return(t=i.prototype=new m).constructor=i,t.getRatio=e,t.config=function(t){return new i(t)},i}var s,n,r=window.GreenSockGlobals||window,a=r.com.greensock,o=2*Math.PI,l=Math.PI/2,c=a._class,h=m.register||function(){},u=e("Back",i("BackOut",function(t){return--t*t*((this._p1+1)*t+this._p1)+1}),i("BackIn",function(t){return t*t*((this._p1+1)*t-this._p1)}),i("BackInOut",function(t){return(t*=2)<1?.5*t*t*((this._p2+1)*t-this._p2):.5*((t-=2)*t*((this._p2+1)*t+this._p2)+2)})),p=c("easing.SlowMo",function(t,e,i){e=e||0===e?e:.7,null==t?t=.7:1t?this._calcEnd?1-(t=1-t/this._p1)*t:e-(t=1-t/this._p1)*t*t*t*e:t>this._p3?this._calcEnd?1-(t=(t-this._p3)/this._p1)*t:e+(t-e)*(t=(t-this._p3)/this._p1)*t*t*t:this._calcEnd?1:e},p.ease=new p(.7,.7),a.config=p.config=function(t,e,i){return new p(t,e,i)},(a=(s=c("easing.SteppedEase",function(t){this._p1=1/(t=t||1),this._p2=t+1},!0)).prototype=new m).constructor=s,a.getRatio=function(t){return t<0?t=0:1<=t&&(t=.999999999),(this._p2*t>>0)*this._p1},a.config=s.config=function(t){return new s(t)},(a=(n=c("easing.RoughEase",function(t){for(var e,i,s,n,r,a,o=(t=t||{}).taper||"none",l=[],c=0,h=0|(t.points||20),u=h,p=!1!==t.randomize,d=!0===t.clamp,_=t.template instanceof m?t.template:null,f="number"==typeof t.strength?.4*t.strength:.4;-1<--u;)e=p?Math.random():1/h*u,i=_?_.getRatio(e):e,s="none"===o?f:"out"===o?(n=1-e)*n*f:"in"===o?e*e*f:.5*(n=e<.5?2*e:2*(1-e))*n*f,p?i+=Math.random()*s-.5*s:u%2?i+=.5*s:i-=.5*s,d&&(1e.t){for(;e.next&&t>=e.t;)e=e.next;e=e.prev}else for(;e.prev&&e.t>=t;)e=e.prev;return(this._prev=e).v+(t-e.t)/e.gap*e.c},a.config=function(t){return new n(t)},n.ease=new n,e("Bounce",t("BounceOut",function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}),t("BounceIn",function(t){return 1/2.75>(t=1-t)?1-7.5625*t*t:t<2/2.75?1-(7.5625*(t-=1.5/2.75)*t+.75):t<2.5/2.75?1-(7.5625*(t-=2.25/2.75)*t+.9375):1-(7.5625*(t-=2.625/2.75)*t+.984375)}),t("BounceInOut",function(t){var e=t<.5;return t=(t=e?1-2*t:2*t-1)<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,e?.5*(1-t):.5*t+.5})),e("Circ",t("CircOut",function(t){return Math.sqrt(1- --t*t)}),t("CircIn",function(t){return-(Math.sqrt(1-t*t)-1)}),t("CircInOut",function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)})),e("Elastic",(a=function(t,e,i){var s=c("easing."+t,function(t,e){this._p1=t||1,this._p2=e||i,this._p3=this._p2/o*(Math.asin(1/this._p1)||0)},!0),t=s.prototype=new m;return t.constructor=s,t.getRatio=e,t.config=function(t,e){return new s(t,e)},s})("ElasticOut",function(t){return this._p1*Math.pow(2,-10*t)*Math.sin((t-this._p3)*o/this._p2)+1},.3),a("ElasticIn",function(t){return-(this._p1*Math.pow(2,10*--t)*Math.sin((t-this._p3)*o/this._p2))},.3),a("ElasticInOut",function(t){return(t*=2)<1?-.5*this._p1*Math.pow(2,10*--t)*Math.sin((t-this._p3)*o/this._p2):.5*this._p1*Math.pow(2,-10*--t)*Math.sin((t-this._p3)*o/this._p2)+1},.45)),e("Expo",t("ExpoOut",function(t){return 1-Math.pow(2,-10*t)}),t("ExpoIn",function(t){return Math.pow(2,10*(t-1))-.001}),t("ExpoInOut",function(t){return(t*=2)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*(t-1)))})),e("Sine",t("SineOut",function(t){return Math.sin(t*l)}),t("SineIn",function(t){return 1-Math.cos(t*l)}),t("SineInOut",function(t){return-.5*(Math.cos(Math.PI*t)-1)})),c("easing.EaseLookup",{find:function(t){return m.map[t]}},!0),h(r.SlowMo,"SlowMo","ease,"),h(n,"RoughEase","ease,"),h(s,"SteppedEase","ease,"),u},!0)}),window._gsDefine&&window._gsQueue.pop()()},{}],12:[function(t,e,i){"use strict";(window._gsQueue||(window._gsQueue=[])).push(function(){window._gsDefine("plugins.CSSPlugin",["plugins.TweenPlugin","TweenLite"],function(r,p){function N(){r.call(this,"css"),this._overwriteProps.length=0,this.setRatio=N.prototype.setRatio}var d,x,b,u,_={},t=N.prototype=new r("css");(t.constructor=N).version="1.12.1",N.API=2,N.defaultTransformPerspective=0,N.defaultSkewType="compensated",N.suffixMap={top:t="px",right:t,bottom:t,left:t,width:t,height:t,fontSize:t,padding:t,margin:t,perspective:t,lineHeight:""};function n(t,e){return e.toUpperCase()}function a(t){return L.test("string"==typeof t?t:(t.currentStyle||t.style).filter||"")?parseFloat(RegExp.$1)/100:1}function f(t){window.console&&console.log(t)}function T(t,e){var i,s,n=(e=e||Z).style;if(void 0!==n[t])return t;for(t=t.charAt(0).toUpperCase()+t.substr(1),i=["O","Moz","ms","Ms","Webkit"],s=5;-1<--s&&void 0===n[i[s]+t];);return 0<=s?(tt="-"+(et=3===s?"ms":i[s]).toLowerCase()+"-",et+t):null}function m(t,e){var i,s={};if(e=e||it(t,null))if(i=e.length)for(;-1<--i;)s[e[i].replace(Y,n)]=e.getPropertyValue(e[i]);else for(i in e)s[i]=e[i];else if(e=t.currentStyle||t.style)for(i in e)"string"==typeof i&&void 0===s[i]&&(s[i.replace(Y,n)]=e[i]);return J||(s.opacity=a(t)),t=Pt(t,e,!1),s.rotation=t.rotation,s.skewX=t.skewX,s.scaleX=t.scaleX,s.scaleY=t.scaleY,s.x=t.x,s.y=t.y,Tt&&(s.z=t.z,s.rotationX=t.rotationX,s.rotationY=t.rotationY,s.scaleZ=t.scaleZ),s.filters&&delete s.filters,s}function g(t,e,i,s,n){var r,a,o,l={},c=t.style;for(a in i)"cssText"!==a&&"length"!==a&&isNaN(a)&&(e[a]!==(r=i[a])||n&&n[a])&&-1===a.indexOf("Origin")&&("number"==typeof r||"string"==typeof r)&&(l[a]="auto"!==r||"left"!==a&&"top"!==a?""!==r&&"auto"!==r&&"none"!==r||"string"!=typeof e[a]||""===e[a].replace(D,"")?r:0:rt(t,a),void 0!==c[a]&&(o=new pt(c,a,c[a],o)));if(s)for(a in s)"className"!==a&&(l[a]=s[a]);return{difs:l,firstMPT:o}}function v(t,e){var i=(t=null==t||""===t||"auto"===t||"auto auto"===t?"0 0":t).split(" "),s=-1!==t.indexOf("left")?"0%":-1!==t.indexOf("right")?"100%":i[0];return null==(t=-1!==t.indexOf("top")?"0%":-1!==t.indexOf("bottom")?"100%":i[1])?t="0":"center"===t&&(t="50%"),("center"===s||isNaN(parseFloat(s))&&-1===(s+"").indexOf("="))&&(s="50%"),e&&(e.oxp=-1!==s.indexOf("%"),e.oyp=-1!==t.indexOf("%"),e.oxr="="===s.charAt(1),e.oyr="="===t.charAt(1),e.ox=parseFloat(s.replace(D,"")),e.oy=parseFloat(t.replace(D,""))),s+" "+t+(2>16,255&t>>8,255&t]:(","===t.charAt(t.length-1)&&(t=t.substr(0,t.length-1)),lt[t]||("#"===t.charAt(0)?(4===t.length&&(t="#"+(e=t.charAt(1))+e+(i=t.charAt(2))+i+(r=t.charAt(3))+r),[(t=parseInt(t.substr(1),16))>>16,255&t>>8,255&t]):("hsl"===t.substr(0,3)?(t=t.match(A),s=Number(t[0])%360/360,n=Number(t[1])/100,e=2*(r=Number(t[2])/100)-(i=r<=.5?r*(1+n):r+n-r*n),3a",!!(i=i.getElementsByTagName("a")[0])&&/^0.55/.test(i.style.opacity)),tt="",et="",it=Q.defaultView?Q.defaultView.getComputedStyle:function(){},st=N.getStyle=function(t,e,i,s,n){var r;return J||"opacity"!==e?(!s&&t.style[e]?r=t.style[e]:(i=i||it(t))?r=i[e]||i.getPropertyValue(e)||i.getPropertyValue(e.replace(z,"-$1").toLowerCase()):t.currentStyle&&(r=t.currentStyle[e]),null==n||r&&"none"!==r&&"auto"!==r&&"auto auto"!==r?r:n):a(t)},nt=s.convertToPixels=function(t,e,i,s,n){if("px"===s||!s)return i;if("auto"===s||!i)return 0;var r,a,o,l=$.test(e),c=t,h=Z.style,u=i<0;if(u&&(i=-i),"%"===s&&-1!==e.indexOf("border"))r=i/100*(l?t.clientWidth:t.clientHeight);else{if(h.cssText="border:0 solid red;position:"+st(t,"position")+";line-height:0;","%"!==s&&c.appendChild)h[l?"borderLeftWidth":"borderTopWidth"]=i+s;else{if(a=(c=t.parentNode||Q.body)._gsCache,o=p.ticker.frame,a&&l&&a.time===o)return a.width*i/100;h[l?"width":"height"]=i+s}c.appendChild(Z),r=parseFloat(Z[l?"offsetWidth":"offsetHeight"]),c.removeChild(Z),l&&"%"===s&&!1!==N.cacheWidths&&((a=c._gsCache=c._gsCache||{}).time=o,a.width=r/i*100),0!==r||n||(r=nt(t,e,i,s,!0))}return u?-r:r},rt=s.calculateOffset=function(t,e,i){if("absolute"!==st(t,"position",i))return 0;var s="left"===e?"Left":"Top",i=st(t,"margin"+s,i);return t["offset"+s]-(nt(t,e,parseFloat(i),i.replace(j,""))||0)},at={width:["Left","Right"],height:["Top","Bottom"]},ot=["marginLeft","marginRight","marginTop","marginBottom"],lt={aqua:[0,255,255],lime:[0,255,0],silver:[192,192,192],black:[0,0,0],maroon:[128,0,0],teal:[0,128,128],blue:[0,0,255],navy:[0,0,128],white:[255,255,255],fuchsia:[255,0,255],olive:[128,128,0],yellow:[255,255,0],orange:[255,165,0],gray:[128,128,128],purple:[128,0,128],green:[0,128,0],red:[255,0,0],pink:[255,192,203],cyan:[0,255,255],transparent:[255,255,255,0]},ct="(?:\\b(?:(?:rgb|rgba|hsl|hsla)\\(.+?\\))|\\B#.+?\\b";for(t in lt)ct+="|"+t+"\\b";function ht(t,e,r,a){if(null==t)return function(t){return t};var o,l=e?(t.match(ct)||[""])[0]:"",c=t.split(l).join("").match(I)||[],h=t.substr(0,t.indexOf(c[0])),u=")"===t.charAt(t.length-1)?")":"",p=-1!==t.indexOf(" ")?" ":",",d=c.length,_=0s;s++)n[s]=o(n[s]);return n.join(",")}if(e=(t.match(ct)||[l])[0],s=(i=t.split(e).join("").match(I)||[]).length,d>s--)for(;d>++s;)i[s]=r?i[0|(s-1)/2]:c[s];return h+i.join(p)+p+e+u+(-1!==t.indexOf("inset")?" inset":"")}:function(t){var e,i,s;if("number"==typeof t)t+=_;else if(a&&H.test(t)){for(i=t.replace(H,"|").split("|"),s=0;i.length>s;s++)i[s]=o(i[s]);return i.join(",")}if(s=(e=t.match(I)||[]).length,d>s--)for(;d>++s;)e[s]=r?e[0|(s-1)/2]:c[s];return h+e.join(p)+u}:function(t){return t}}function ut(c){return c=c.split(","),function(t,e,i,s,n,r,a){var o,l=(e+"").split(" ");for(a={},o=0;o<4;o++)a[c[o]]=l[o]=l[o]||l[(o-1)/2>>0];return s.parse(t,a,n,r)}}var ct=RegExp(ct+")","gi"),pt=(s._setPluginRatio=function(t){this.plugin.setRatio(t);for(var e,i,s,n,r=this.data,a=r.proxy,o=r.firstMPT;o;)e=a[o.v],o.r?e=Math.round(e):e<1e-6&&-1e-6s;s++)n+=i["xn"+s]+i["xs"+(s+1)];i.e=n}}else i.e=i.s+i.xs0;o=o._next}},function(t,e,i,s,n){this.t=t,this.p=e,this.v=i,this.r=n,s&&((s._prev=this)._next=s)}),dt=(s._parseToProxy=function(t,e,i,s,n,r){var a,o,l,c,h=s,u={},p={},d=i._transform,_=V;for(i._transform=null,V=e,s=n=i.parse(t,e,s,n),V=_,r&&(i._transform=d,h&&(h._prev=null,h._prev&&(h._prev._next=null)));s&&s!==h;){if(s.type<=1&&(p[o=s.p]=s.s+s.c,u[o]=s.s,r||(c=new pt(s,"s",o,c,s.r),s.c=0),1===s.type))for(a=s.l;0<--a;)p[o=s.p+"_"+(l="xn"+a)]=s.data[l],u[o]=s[l],r||(c=new pt(s,l,o,c,s.rxp[l]));s=s._next}return{proxy:u,end:p,firstMPT:c,pt:n}},s.CSSPropTween=function(t,e,i,s,n,r,a,o,l,c,h){this.t=t,this.p=e,this.s=i,this.c=s,this.n=a||e,t instanceof dt||u.push(this.n),this.r=o,this.type=r||0,l&&(this.pr=l,d=!0),this.b=void 0===c?i:c,this.e=void 0===h?i+s:h,n&&((this._next=n)._prev=this)}),_t=N.parseComplex=function(t,e,i,s,n,r,a,o,l,c){a=new dt(t,e,0,0,a,c?2:1,null,!1,o,i=i||r||"",s),s+="";var h,u,p,d,_,f,m,g,v,w,y,x=i.split(", ").join(",").split(" "),b=s.split(", ").join(",").split(" "),T=x.length,k=!1!==O;for(-1===s.indexOf(",")&&-1===i.indexOf(",")||(x=x.join(" ").replace(H,", ").split(" "),b=b.join(" ").replace(H,", ").split(" "),T=x.length),T!==b.length&&(T=(x=(r||"").split(" ")).length),a.plugin=l,a.setRatio=c,h=0;hu;u++)w=f[u],v=d.indexOf(w,p),a.appendXtra(d.substr(p,v-p),Number(w),P(m[u],w),"",k&&"px"===d.substr(v+w.length,2),0===u),p=v+w.length;a["xs"+a.l]+=d.substr(p)}else a["xs"+a.l]+=a.l?" "+d:d;if(-1!==s.indexOf("=")&&a.data){for(y=a.xs0+a.data.s,h=1;a.l>h;h++)y+=a["xs"+h]+a.data["xn"+h];a.e=y+a["xs"+h]}return a.l||(a.type=-1,a.xs0=a.e),a.xfirst||a},ft=9;for((t=dt.prototype).l=t.pr=0;0<--ft;)t["xn"+ft]=0,t["xs"+ft]="";t.xs0="",t._next=t._prev=t.xfirst=t.data=t.plugin=t.setRatio=t.rxp=null,t.appendXtra=function(t,e,i,s,n,r){var a=this,o=a.l;return a["xs"+o]+=r&&o?" "+t:t||"",i||0===o||a.plugin?(a.l++,a.type=a.setRatio?2:1,a["xs"+a.l]=s||"",0s;s++)e.prefix=0===s&&e.prefix,e.defaultValue=i[s]||r,new mt(n[s],e)};(t=mt.prototype).parseComplex=function(t,e,i,s,n,r){var a,o,l,c,h,u=this.keyword;if(this.multi&&(H.test(i)||H.test(e)?(o=e.replace(H,"|").split("|"),l=i.replace(H,"|").split("|")):u&&(o=[e],l=[i])),l){for(c=(l.length>o.length?l:o).length,a=0;aI[r]&&I[r]>-j&&(I[r]=0);return i&&(t._gsTransform=I),I},St=s.set3DTransformRatio=function(t){var e,i,s,n,r,a,o,l,c,h,u,p,d,_,f,m,g,v,w,y,x,b,T=this.data,k=this.t.style,P=T.rotation*U,S=T.scaleX,O=T.scaleY,C=T.scaleZ,A=T.perspective;if(1!==t&&0!==t||"auto"!==T.force3D||T.rotationY||T.rotationX||1!==C||A||T.z){if(M&&(S<1e-4&&-1e-4y;y++)this.p.indexOf("border")&&(f[y]=T(f[y])),-1!==(o=a=st(t,f[y],b,!1,"0px")).indexOf(" ")&&(o=(a=o.split(" "))[0],a=a[1]),l=r=w[y],d=parseFloat(o),_=o.substr((d+"").length),(h=""===(h=(u="="===l.charAt(1))?(c=parseInt(l.charAt(0)+"1",10),l=l.substr(2),c*=parseFloat(l),l.substr((c+"").length-(c<0?1:0))||""):(c=parseFloat(l),l.substr((c+"").length)))?x[i]||_:h)!==_&&(p=nt(t,"borderLeft",d,_),d=nt(t,"borderTop",d,_),a="%"===h?(o=p/g*100+"%",d/v*100+"%"):"em"===h?(o=p/(_=nt(t,"borderLeft",1,"em"))+"em",d/_+"em"):(o=p+"px",d+"px"),u&&(l=parseFloat(o)+c+h,r=parseFloat(a)+c+h)),n=_t(m,f[y],o+" "+a,l+" "+r,!1,"0px",n);return n},prefix:!0,formatter:ht("0px 0px 0px 0px",!1,!0)}),gt("backgroundPosition",{defaultValue:"0 0",parser:function(t,e,i,s,n,r){var a,o,l,c,h,u,p="background-position",d=b||it(t,null),_=this.format((d?C?d.getPropertyValue(p+"-x")+" "+d.getPropertyValue(p+"-y"):d.getPropertyValue(p):t.currentStyle.backgroundPositionX+" "+t.currentStyle.backgroundPositionY)||"0 0"),e=this.format(e);if(-1!==_.indexOf("%")!=(-1!==e.indexOf("%"))&&((u=st(t,"backgroundImage").replace(F,""))&&"none"!==u)){for(a=_.split(" "),o=e.split(" "),G.setAttribute("src",u),l=2;-1<--l;)(c=-1!==(_=a[l]).indexOf("%"))!=(-1!==o[l].indexOf("%"))&&(h=0===l?t.offsetWidth-G.width:t.offsetHeight-G.height,a[l]=c?parseFloat(_)/100*h+"px":parseFloat(_)/h*100+"%");_=a.join(" ")}return this.parseComplex(t.style,_,e,n,r)},formatter:v}),gt("backgroundSize",{defaultValue:"0 0",formatter:v}),gt("perspective",{defaultValue:"0px",prefix:!0}),gt("perspectiveOrigin",{defaultValue:"50% 50%",prefix:!0}),gt("transformStyle",{prefix:!0}),gt("backfaceVisibility",{prefix:!0}),gt("userSelect",{prefix:!0}),gt("margin",{parser:ut("marginTop,marginRight,marginBottom,marginLeft")}),gt("padding",{parser:ut("paddingTop,paddingRight,paddingBottom,paddingLeft")}),gt("clip",{defaultValue:"rect(0px,0px,0px,0px)",parser:function(t,e,i,s,n,r){var a,o;return e=C<9?(a=t.currentStyle,o=C<8?" ":",",a="rect("+a.clipTop+o+a.clipRight+o+a.clipBottom+o+a.clipLeft+")",this.format(e).split(",").join(o)):(a=this.format(st(t,this.p,b,!1,this.dflt)),this.format(e)),this.parseComplex(t.style,a,e,n,r)}}),gt("textShadow",{defaultValue:"0px 0px 0px #999",color:!0,multi:!0}),gt("autoRound,strictUnits",{parser:function(t,e,i,s,n){return n}}),gt("border",{defaultValue:"0px solid #000",parser:function(t,e,i,s,n,r){return this.parseComplex(t.style,this.format(st(t,"borderTopWidth",b,!1,"0px")+" "+st(t,"borderTopStyle",b,!1,"solid")+" "+st(t,"borderTopColor",b,!1,"#000")),this.format(e),n,r)},color:!0,formatter:function(t){var e=t.split(" ");return e[0]+" "+(e[1]||"solid")+" "+(t.match(ct)||["#000"])[0]}}),gt("borderWidth",{parser:ut("borderTopWidth,borderRightWidth,borderBottomWidth,borderLeftWidth")}),gt("float,cssFloat,styleFloat",{parser:function(t,e,i,s,n){var r=t.style,t="cssFloat"in r?"cssFloat":"styleFloat";return new dt(r,t,0,0,n,-1,i,!1,0,r[t],e)}});function Ct(t){var e,i=this.t,s=i.filter||st(this.data,"filter"),t=0|this.s+this.c*t;(e=100==t?-1===s.indexOf("atrix(")&&-1===s.indexOf("radient(")&&-1===s.indexOf("oader(")?(i.removeAttribute("filter"),!st(this.data,"filter")):(i.filter=s.replace(l,""),!0):e)||(this.xn1&&(i.filter=s=s||"alpha(opacity="+t+")"),-1===s.indexOf("pacity")?0==t&&this.xn1||(i.filter=s+" alpha(opacity="+t+")"):i.filter=s.replace(L,"opacity="+t))}gt("opacity,alpha,autoAlpha",{defaultValue:"1",parser:function(t,e,i,s,n,r){var a=parseFloat(st(t,"opacity",b,!1,"1")),o=t.style,l="autoAlpha"===i;return"string"==typeof e&&"="===e.charAt(1)&&(e=("-"===e.charAt(0)?-1:1)*parseFloat(e.substr(2))+a),l&&1===a&&"hidden"===st(t,"visibility",b)&&0!==e&&(a=0),J?n=new dt(o,"opacity",a,e-a,n):((n=new dt(o,"opacity",100*a,100*(e-a),n)).xn1=l?1:0,o.zoom=1,n.type=2,n.b="alpha(opacity="+n.s+")",n.e="alpha(opacity="+(n.s+n.c)+")",n.data=t,n.plugin=r,n.setRatio=Ct),l&&((n=new dt(o,"visibility",0,0,n,-1,null,!1,0,0!==a?"inherit":"hidden",0===e?"hidden":"inherit")).xs0="inherit",s._overwriteProps.push(n.n),s._overwriteProps.push(i)),n}});function At(t,e){e&&(t.removeProperty?("ms"===e.substr(0,2)&&(e="M"+e.substr(1)),t.removeProperty(e.replace(z,"-$1").toLowerCase())):t.removeAttribute(e))}function Mt(t){if(this.t._gsClassPT=this,1===t||0===t){this.t.setAttribute("class",0===t?this.b:this.e);for(var e=this.data,i=this.t.style;e;)e.v?i[e.p]=e.v:At(i,e.p),e=e._next;1===t&&this.t._gsClassPT===this&&(this.t._gsClassPT=null)}else this.t.getAttribute("class")!==this.e&&this.t.setAttribute("class",this.e)}gt("className",{parser:function(t,e,i,s,n,r,a){var o,l,c,h=t.getAttribute("class")||"",u=t.style.cssText;if((n=s._classNamePT=new dt(t,i,0,0,n,2)).setRatio=Mt,n.pr=-11,d=!0,n.b=h,o=m(t,b),i=t._gsClassPT){for(l={},c=i.data;c;)l[c.p]=1,c=c._next;i.setRatio(1)}return(t._gsClassPT=n).e="="!==e.charAt(1)?e:h.replace(RegExp("\\s*\\b"+e.substr(2)+"\\b"),"")+("+"===e.charAt(0)?" "+e.substr(2):""),s._tween._duration&&(t.setAttribute("class",n.e),a=g(t,o,m(t),a,l),t.setAttribute("class",h),n.data=a.firstMPT,t.style.cssText=u,n=n.xfirst=s.parse(t,a.difs,n,r)),n}});function Rt(t){if((1===t||0===t)&&this.data._totalTime===this.data._totalDuration&&"isFromStart"!==this.data.data){var e,i,s,n,r=this.t.style,a=_.transform.parse;if("all"===this.e)n=!(r.cssText="");else for(s=(e=this.e.split(",")).length;-1<--s;)i=e[s],_[i]&&(_[i].parse===a?n=!0:i="transformOrigin"===i?bt:_[i].p),At(r,i);n&&(At(r,yt),this.t._gsTransform&&delete this.t._gsTransform)}}for(gt("clearProps",{parser:function(t,e,i,s,n){return(n=new dt(t,i,0,0,n,2)).setRatio=Rt,n.e=e,n.pr=-10,n.data=s._tween,d=!0,n}}),t="bezier,throwProps,physicsProps,physics2D".split(","),ft=t.length;ft--;)!function(t){var l;_[t]||(l=t.charAt(0).toUpperCase()+t.substr(1)+"Plugin",gt(t,{parser:function(t,e,i,s,n,r,a){var o=(window.GreenSockGlobals||window).com.greensock.plugins[l];return o?(o._cssRegister(),_[i].parse(t,e,i,s,n,r,a)):(f("Error: "+l+" js file not loaded."),n)}}))}(t[ft]);(t=N.prototype)._firstPT=null,t._onInitTween=function(t,e,i){if(!t.nodeType)return!1;this._target=t,this._tween=i,this._vars=e,O=e.autoRound,d=!1,x=e.suffixMap||N.suffixMap,b=it(t,""),u=this._overwriteProps;var s,n,r,a,o,l,i=t.style;if(c&&""===i.zIndex&&("auto"!==(l=st(t,"zIndex",b))&&""!==l||this._addLazySet(i,"zIndex",0)),"string"==typeof e&&(r=i.cssText,l=m(t,b),i.cssText=r+";"+e,l=g(t,l,m(t)).difs,!J&&X.test(e)&&(l.opacity=parseFloat(RegExp.$1)),e=l,i.cssText=r),this._firstPT=s=this.parse(t,e,null),this._transformType){for(l=3===this._transformType,yt?h&&(c=!0,""===i.zIndex&&("auto"!==(e=st(t,"zIndex",b))&&""!==e||this._addLazySet(i,"zIndex",0)),k&&this._addLazySet(i,"WebkitBackfaceVisibility",this._vars.WebkitBackfaceVisibility||(l?"visible":"hidden"))):i.zoom=1,n=s;n&&n._next;)n=n._next;i=new dt(t,"transform",0,0,null,2),this._linkCSSP(i,null,n),i.setRatio=l&&Tt?St:yt?Ot:vt,i.data=this._transform||Pt(t,b,!0),u.pop()}if(d){for(;s;){for(o=s._next,n=r;n&&n.pr>s.pr;)n=n._next;(s._prev=n?n._prev:a)?s._prev._next=s:r=s,(s._next=n)?n._prev=s:a=s,s=o}this._firstPT=r}return!0},t.parse=function(t,e,i,s){var n,r,a,o,l,c,h,u,p=t.style;for(n in e)l=e[n],u=_[n],u?i=u.parse(t,l,n,this,i,s,e):(o=st(t,n,b)+"",h="string"==typeof l,"color"===n||"fill"===n||"stroke"===n||-1!==n.indexOf("Color")||h&&E.test(l)?(h||(l=S(l),l=(3s;s++)i+=n["xn"+s]+n["xs"+(s+1)];n.t[n.p]=i}else-1===n.type?n.t[n.p]=n.xs0:n.setRatio&&n.setRatio(t);else n.t[n.p]=e+n.xs0;n=n._next}else for(;n;)2!==n.type?n.t[n.p]=n.b:n.setRatio(t),n=n._next;else for(;n;)2!==n.type?n.t[n.p]=n.e:n.setRatio(t),n=n._next},t._enableTransforms=function(t){this._transformType=t||3===this._transformType?3:2,this._transform=this._transform||Pt(this._target,b,!0)};function It(){this.t[this.p]=this.e,this.data._linkCSSP(this,this._next,null,!0)}t._addLazySet=function(t,e,i){e=this._firstPT=new dt(t,e,0,0,this._firstPT,2);e.e=i,e.setRatio=It,e.data=this},t._linkCSSP=function(t,e,i,s){return t&&(e&&(e._prev=t),t._next&&(t._next._prev=t._prev),t._prev?t._prev._next=t._next:this._firstPT===t&&(this._firstPT=t._next,s=!0),i?i._next=t:s||null!==this._firstPT||(this._firstPT=t),t._next=e,t._prev=i),t},t._kill=function(t){var e,i,s,n=t;if(t.autoAlpha||t.alpha){for(i in n={},t)n[i]=t[i];n.opacity=1,n.autoAlpha&&(n.visibility=1)}return t.className&&(e=this._classNamePT)&&((s=e.xfirst)&&s._prev?this._linkCSSP(s._prev,e._next,s._prev._prev):s===this._firstPT&&(this._firstPT=e._next),e._next&&this._linkCSSP(e._next,e._next._next,s._prev),this._classNamePT=null),r.prototype._kill.call(this,n)};function Dt(t,e,i){var s,n,r,a;if(t.slice)for(n=t.length;-1<--n;)Dt(t[n],e,i);else for(n=(s=t.childNodes).length;-1<--n;)a=(r=s[n]).type,r.style&&(e.push(m(r)),i&&i.push(r)),1!==a&&9!==a&&11!==a||!r.childNodes.length||Dt(r,e,i)}return N.cascadeTo=function(t,e,i){var s,n,r,a=p.to(t,e,i),o=[a],l=[],c=[],h=[],u=p._internals.reservedProps;for(t=a._targets||a.target,Dt(t,l,h),a.render(e,!0),Dt(t,c),a.render(0,!0),a._enabled(!0),s=h.length;-1<--s;)if((n=g(h[s],l[s],c[s])).firstMPT){for(r in n=n.difs,i)u[r]&&(n[r]=i[r]);o.push(p.to(h[s],e,n))}return o},r.activate([N]),N},!0)}),window._gsDefine&&window._gsQueue.pop()()},{}],13:[function(t,e,i){"use strict";(window._gsQueue||(window._gsQueue=[])).push(function(){function n(t,e){var i="x"===e?"Width":"Height",s="scroll"+i,n="client"+i,e=document.body;return t===a||t===r||t===e?Math.max(r[s],e[s])-(a["inner"+i]||Math.max(r[n],e[n])):t[s]-t["offset"+i]}var r=document.documentElement,a=window,t=window._gsDefine.plugin({propName:"scrollTo",API:2,version:"1.7.3",init:function(t,e,i){return this._wdw=t===a,this._target=t,this._tween=i,this._autoKill=!1!==(e="object"!=typeof e?{y:e}:e).autoKill,this.x=this.xPrev=this.getX(),this.y=this.yPrev=this.getY(),null!=e.x?(this._addTween(this,"x",this.x,"max"===e.x?n(t,"x"):e.x,"scrollTo_x",!0),this._overwriteProps.push("scrollTo_x")):this.skipX=!0,null!=e.y?(this._addTween(this,"y",this.y,"max"===e.y?n(t,"y"):e.y,"scrollTo_y",!0),this._overwriteProps.push("scrollTo_y")):this.skipY=!0,!0},set:function(t){this._super.setRatio.call(this,t);var e=this._wdw||!this.skipX?this.getX():this.xPrev,i=this._wdw||!this.skipY?this.getY():this.yPrev,s=i-this.yPrev,t=e-this.xPrev;this._autoKill&&(!this.skipX&&(7e&&(this.skipX=!0),!this.skipY&&(7i&&(this.skipY=!0),this.skipX&&this.skipY&&this._tween.kill()),this._wdw?a.scrollTo(this.skipX?e:this.x,this.skipY?i:this.y):(this.skipY||(this._target.scrollTop=this.y),this.skipX||(this._target.scrollLeft=this.x)),this.xPrev=this.x,this.yPrev=this.y}}),e=t.prototype;t.max=n,e.getX=function(){return this._wdw?null!=a.pageXOffset?a.pageXOffset:(null!=r.scrollLeft?r:document.body).scrollLeft:this._target.scrollLeft},e.getY=function(){return this._wdw?null!=a.pageYOffset?a.pageYOffset:(null!=r.scrollTop?r:document.body).scrollTop:this._target.scrollTop},e._kill=function(t){return t.scrollTo_x&&(this.skipX=!0),t.scrollTo_y&&(this.skipY=!0),this._super._kill.call(this,t)}}),window._gsDefine&&window._gsQueue.pop()()},{}]},{},[2]); +!function s(n,r,a){function o(e,t){if(!r[e]){if(!n[e]){var i="function"==typeof require&&require;if(!t&&i)return i(e,!0);if(l)return l(e,!0);throw(i=new Error("Cannot find module '"+e+"'")).code="MODULE_NOT_FOUND",i}i=r[e]={exports:{}},n[e][0].call(i.exports,function(t){return o(n[e][1][t]||t)},i,i.exports,s,n,r,a)}return r[e].exports}for(var l="function"==typeof require&&require,t=0;t{i.append(""+t+": "),i.append(e[t].message),i.append("
")}):i.append('
'+e.message+"
")}})}),r("#wpr_enable_mobile_cache").on("click",function(t){t.preventDefault(),r("#wpr_enable_mobile_cache").addClass("wpr-isLoading"),r.post(ajaxurl,{action:"rocket_enable_mobile_cache",_ajax_nonce:rocket_ajax_data.nonce},function(t){t.success&&(r("#wpr_enable_mobile_cache").hide(),r("#wpr_mobile_cache_default").hide(),r("#wpr_mobile_cache_response").show(),r("#wpr_enable_mobile_cache").removeClass("wpr-isLoading"),r("#cache_mobile").val(1),r("#do_caching_mobile_files").val(1))})})})},{}],2:[function(t,e,i){"use strict";t("../lib/greensock/TweenLite.min.js"),t("../lib/greensock/TimelineLite.min.js"),t("../lib/greensock/easing/EasePack.min.js"),t("../lib/greensock/plugins/CSSPlugin.min.js"),t("../lib/greensock/plugins/ScrollToPlugin.min.js"),t("../global/pageManager.js"),t("../global/main.js"),t("../global/fields.js"),t("../global/beacon.js"),t("../global/ajax.js"),t("../global/rocketcdn.js"),t("../global/countdown.js")},{"../global/ajax.js":1,"../global/beacon.js":3,"../global/countdown.js":4,"../global/fields.js":5,"../global/main.js":6,"../global/pageManager.js":7,"../global/rocketcdn.js":8,"../lib/greensock/TimelineLite.min.js":9,"../lib/greensock/TweenLite.min.js":10,"../lib/greensock/easing/EasePack.min.js":11,"../lib/greensock/plugins/CSSPlugin.min.js":12,"../lib/greensock/plugins/ScrollToPlugin.min.js":13}],3:[function(t,e,i){"use strict";var s=jQuery;s(document).ready(function(){"Beacon"in window&&s(".wpr-infoAction--help").on("click",function(t){var e=s(this).data("beacon-id");return 0!==(e=(e=e).split(",")).length&&(1{o(t).attr("checked",i?null:"checked")});else{const r=o(e).closest(".wpr-list").find(".wpr-main-checkbox");var n=o.map(s,t=>{if(void 0!==o(t).attr("checked"))return t});r.attr("checked",n.length===s.length?"checked":null)}}),0{let i=o(e).parents(".wpr-list");var s=i.find(".wpr-list-body input[type=checkbox]:not(:checked)").length;o(e).attr("checked",s<=0?"checked":null)})})},{}],6:[function(t,e,i){"use strict";var c=jQuery;c(document).ready(function(){var t=c(".wpr-notice");c("#wpr-congratulations-notice").on("click",function(){return(new TimelineLite).to(t,1,{autoAlpha:0,x:40,ease:Power4.easeOut}).to(t,.6,{height:0,marginTop:0,ease:Power4.easeOut},"=-.4").set(t,{display:"none"}),!1}),c(".rocket-analytics-data-container").hide(),c(".rocket-preview-analytics-data").on("click",function(t){t.preventDefault(),c(this).parent().next(".rocket-analytics-data-container").toggle()}),c(".wpr-toggle-button").each(function(){var t=c(this),e=t.closest(".wpr-fieldsContainer-fieldset").find(".wpr-radio :checkbox"),i=c('[href="'+t.attr("href")+'"].wpr-menuItem');e.on("change",function(){e.is(":checked")?(i.css("display","block"),t.css("display","inline-block")):(i.css("display","none"),t.css("display","none"))}).trigger("change")});var e=c(".wpr-Popin-Analytics"),i=c(".wpr-Popin-overlay"),s=c(".wpr-Popin-Analytics-close"),n=c(".wpr-Popin-Analytics .wpr-button");function r(){(new TimelineLite).fromTo(e,.6,{autoAlpha:1,marginTop:0},{autoAlpha:0,marginTop:-24,ease:Power4.easeOut}).fromTo(i,.6,{autoAlpha:1},{autoAlpha:0,ease:Power4.easeOut},"=-.5").set(e,{display:"none"}).set(i,{display:"none"})}c(".wpr-js-popin").on("click",function(t){return t.preventDefault(),(new TimelineLite).set(e,{display:"block"}).set(i,{display:"block"}).fromTo(i,.6,{autoAlpha:0},{autoAlpha:1,ease:Power4.easeOut}).fromTo(e,.6,{autoAlpha:0,marginTop:-24},{autoAlpha:1,marginTop:0,ease:Power4.easeOut},"=-.5"),!1}),s.on("click",function(t){return t.preventDefault(),r(),!1}),n.on("click",function(t){return t.preventDefault(),r(),c("#analytics_enabled").prop("checked",!0),c("#analytics_enabled").trigger("change"),!1}),c("#analytics_enabled").on("change",function(){c(".wpr-rocket-analytics-cta").toggleClass("wpr-isHidden")});var a=c(".wpr-Popin-Upgrade"),n=c(".wpr-Popin-Upgrade-close");c(".wpr-popin-upgrade-toggle").on("click",function(t){return t.preventDefault(),(new TimelineLite).set(a,{display:"block"}).set(i,{display:"block"}).fromTo(i,.6,{autoAlpha:0},{autoAlpha:1,ease:Power4.easeOut}).fromTo(a,.6,{autoAlpha:0,marginTop:-24},{autoAlpha:1,marginTop:0,ease:Power4.easeOut},"=-.5"),!1}),n.on("click",function(){return(new TimelineLite).fromTo(a,.6,{autoAlpha:1,marginTop:0},{autoAlpha:0,marginTop:-24,ease:Power4.easeOut}).fromTo(i,.6,{autoAlpha:1},{autoAlpha:0,ease:Power4.easeOut},"=-.5").set(a,{display:"none"}).set(i,{display:"none"}),!1});var o=c(".wpr-Sidebar");c(".wpr-js-tips").on("change",function(){c(this).is(":checked")?(o.css("display","block"),localStorage.setItem("wpr-show-sidebar","on")):(o.css("display","none"),localStorage.setItem("wpr-show-sidebar","off"))}),document.getElementById("LKgOcCRpwmAj")?c(".wpr-adblock").css("display","none"):c(".wpr-adblock").css("display","block");var l=c(".wpr-adblock");c(".wpr-adblock-close").on("click",function(){return(new TimelineLite).to(l,1,{autoAlpha:0,x:40,ease:Power4.easeOut}).to(l,.4,{height:0,marginTop:0,ease:Power4.easeOut},"=-.4").set(l,{display:"none"}),!1})})},{}],7:[function(t,e,i){"use strict";function s(t){var e,i=this;this.$body=document.querySelector(".wpr-body"),this.$menuItems=document.querySelectorAll(".wpr-menuItem"),this.$submitButton=document.querySelector(".wpr-Content > form > #wpr-options-submit"),this.$pages=document.querySelectorAll(".wpr-Page"),this.$sidebar=document.querySelector(".wpr-Sidebar"),this.$content=document.querySelector(".wpr-Content"),this.$tips=document.querySelector(".wpr-Content-tips"),this.$links=document.querySelectorAll(".wpr-body a"),this.$menuItem=null,this.$page=null,this.pageId=null,this.bodyTop=0,this.buttonText=this.$submitButton.value,i.getBodyTop(),window.onhashchange=function(){i.detectID()},window.location.hash?(this.bodyTop=0,this.detectID()):(e=localStorage.getItem("wpr-hash"),this.bodyTop=0,e?(window.location.hash=e,this.detectID()):(this.$menuItems[0].classList.add("isActive"),localStorage.setItem("wpr-hash","dashboard"),window.location.hash="#dashboard"));for(var s=0;s{a.querySelectorAll(".wpr-rocketcdn-open").forEach(t=>{t.addEventListener("click",t=>{t.preventDefault()})}),function(){var t="";t+="action=rocketcdn_process_status";const e=r(t+="&nonce="+rocket_ajax_data.nonce);e.onreadystatechange=()=>{e.readyState===XMLHttpRequest.DONE&&200===e.status&&!0===JSON.parse(e.responseText).success&&MicroModal.show("wpr-rocketcdn-modal")}}(),MicroModal.init({disableScroll:!0})}),s.addEventListener("load",()=>{let t=a.querySelector("#wpr-rocketcdn-open-cta"),e=a.querySelector("#wpr-rocketcdn-close-cta"),i=a.querySelector("#wpr-rocketcdn-cta-small"),s=a.querySelector("#wpr-rocketcdn-cta");function n(t){var e="";return e+="action=toggle_rocketcdn_cta",e+="&status="+t,e+="&nonce="+rocket_ajax_data.nonce}null!==t&&null!==i&&null!==s&&t.addEventListener("click",t=>{t.preventDefault(),i.classList.add("wpr-isHidden"),s.classList.remove("wpr-isHidden"),r(n("big"))}),null!==e&&null!==i&&null!==s&&e.addEventListener("click",t=>{t.preventDefault(),i.classList.remove("wpr-isHidden"),s.classList.add("wpr-isHidden"),r(n("small"))})}),s.onmessage=t=>{var e,i,s=rocket_ajax_data.origin_url;t.origin===s&&((e=t.data).hasOwnProperty("cdnFrameHeight")&&(a.getElementById("rocketcdn-iframe").style.height=e.cdnFrameHeight+"px"),(i=t.data).hasOwnProperty("cdnFrameClose")&&(MicroModal.close("wpr-rocketcdn-modal"),i.hasOwnProperty("cdn_page_message")&&-1!==["iframe-payment-success","iframe-unsubscribe-success"].indexOf(i.cdn_page_message)&&a.location.reload()),function(t,e){let i=a.querySelector("#rocketcdn-iframe").contentWindow;if(t.hasOwnProperty("rocketcdn_token")){var s="";s+="action=save_rocketcdn_token",s+="&value="+t.rocketcdn_token;const n=r(s+="&nonce="+rocket_ajax_data.nonce);n.onreadystatechange=()=>{var t;n.readyState===XMLHttpRequest.DONE&&200===n.status&&(t=JSON.parse(n.responseText),i.postMessage({success:t.success,data:t.data,rocketcdn:!0},e))}}else{s={process:"subscribe",message:"token_not_received"};i.postMessage({success:!1,data:s,rocketcdn:!0},e)}}(t.data,s),(e=t.data).hasOwnProperty("rocketcdn_process")&&(i="",i+="action=rocketcdn_process_set",i+="&status="+e.rocketcdn_process,r(i+="&nonce="+rocket_ajax_data.nonce)),function(t,e){let i=a.querySelector("#rocketcdn-iframe").contentWindow;if(t.hasOwnProperty("rocketcdn_url")){var s="";s+="action=rocketcdn_enable",s+="&cdn_url="+t.rocketcdn_url;const n=r(s+="&nonce="+rocket_ajax_data.nonce);n.onreadystatechange=()=>{var t;n.readyState===XMLHttpRequest.DONE&&200===n.status&&(t=JSON.parse(n.responseText),i.postMessage({success:t.success,data:t.data,rocketcdn:!0},e))}}}(t.data,s),function(t,e){let i=a.querySelector("#rocketcdn-iframe").contentWindow;if(t.hasOwnProperty("rocketcdn_disable")){t="";t+="action=rocketcdn_disable";const s=r(t+="&nonce="+rocket_ajax_data.nonce);s.onreadystatechange=()=>{var t;s.readyState===XMLHttpRequest.DONE&&200===s.status&&(t=JSON.parse(s.responseText),i.postMessage({success:t.success,data:t.data,rocketcdn:!0},e))}}}(t.data,s),(s=t.data).hasOwnProperty("rocketcdn_validate_token")&&s.hasOwnProperty("rocketcdn_validate_cname")&&(t="",t+="action=rocketcdn_validate_token_cname",t+="&cdn_url="+s.rocketcdn_validate_cname,t+="&cdn_token="+s.rocketcdn_validate_token,r(t+="&nonce="+rocket_ajax_data.nonce)))}},{}],9:[function(t,e,i){"use strict";(window._gsQueue||(window._gsQueue=[])).push(function(){window._gsDefine("TimelineLite",["core.Animation","core.SimpleTimeline","TweenLite"],function(h,u,p){function d(t){u.call(this,t),this._labels={},this.autoRemoveChildren=!0===this.vars.autoRemoveChildren,this.smoothChildTiming=!0===this.vars.smoothChildTiming,this._sortChildren=!0,this._onUpdate=this.vars.onUpdate;var e,i,s=this.vars;for(i in s)e=s[i],g(e)&&-1!==e.join("").indexOf("{self}")&&(s[i]=this._swapSelfInParams(e));g(s.tweens)&&this.add(s.tweens,0,s.align,s.stagger)}function _(t){var e,i={};for(e in t)i[e]=t[e];return i}function n(t,e,i,s){t._timeline.pause(t._startTime),e&&e.apply(s||t._timeline,i||v)}var f=1e-10,m=p._internals.isSelector,g=p._internals.isArray,v=[],a=window._gsDefine.globals,w=v.slice,t=d.prototype=new u;return d.version="1.12.1",t.constructor=d,t.kill()._gc=!1,t.to=function(t,e,i,s){var n=i.repeat&&a.TweenMax||p;return e?this.add(new n(t,e,i),s):this.set(t,i,s)},t.from=function(t,e,i,s){return this.add((i.repeat&&a.TweenMax||p).from(t,e,i),s)},t.fromTo=function(t,e,i,s,n){var r=s.repeat&&a.TweenMax||p;return e?this.add(r.fromTo(t,e,i,s),n):this.set(t,s,n)},t.staggerTo=function(t,e,i,s,n,r,a,o){var l,c=new d({onComplete:r,onCompleteParams:a,onCompleteScope:o,smoothChildTiming:this.smoothChildTiming});for("string"==typeof t&&(t=p.selector(t)||t),m(t)&&(t=w.call(t,0)),s=s||0,l=0;t.length>l;l++)i.startAt&&(i.startAt=_(i.startAt)),c.to(t[l],e,_(i),l*s);return this.add(c,n)},t.staggerFrom=function(t,e,i,s,n,r,a,o){return i.immediateRender=0!=i.immediateRender,i.runBackwards=!0,this.staggerTo(t,e,i,s,n,r,a,o)},t.staggerFromTo=function(t,e,i,s,n,r,a,o,l){return s.startAt=i,s.immediateRender=0!=s.immediateRender&&0!=i.immediateRender,this.staggerTo(t,e,s,n,r,a,o,l)},t.call=function(t,e,i,s){return this.add(p.delayedCall(0,t,e,i),s)},t.set=function(t,e,i){return i=this._parseTimeOrLabel(i,0,!0),null==e.immediateRender&&(e.immediateRender=i===this._time&&!this._paused),this.add(new p(t,0,e),i)},d.exportRoot=function(t,e){null==(t=t||{}).smoothChildTiming&&(t.smoothChildTiming=!0);var i,s,n=new d(t),t=n._timeline;for(null==e&&(e=!0),t._remove(n,!0),n._startTime=0,n._rawPrevTime=n._time=n._totalTime=t._time,i=t._first;i;)s=i._next,e&&i instanceof p&&i.target===i.vars.onComplete||n.add(i,i._startTime-i._delay),i=s;return t.add(n,0),n},t.add=function(t,e,i,s){var n,r,a,o,l,c;if("number"!=typeof e&&(e=this._parseTimeOrLabel(e,0,!0,t)),!(t instanceof h)){if(t instanceof Array||t&&t.push&&g(t)){for(i=i||"normal",s=s||0,n=e,r=t.length,a=0;at._startTime;l._timeline;)c&&l._timeline.smoothChildTiming?l.totalTime(l._totalTime,!0):l._gc&&l._enabled(!0,!1),l=l._timeline;return this},t.remove=function(t){if(t instanceof h)return this._remove(t,!1);if(t instanceof Array||t&&t.push&&g(t)){for(var e=t.length;-1<--e;)this.remove(t[e]);return this}return"string"==typeof t?this.removeLabel(t):this.kill(null,t)},t._remove=function(t,e){u.prototype._remove.call(this,t,e);e=this._last;return e?this._time>e._startTime+e._totalDuration/e._timeScale&&(this._time=this.duration(),this._totalTime=this._totalDuration):this._time=this._totalTime=this._duration=this._totalDuration=0,this},t.append=function(t,e){return this.add(t,this._parseTimeOrLabel(null,e,!0,t))},t.insert=t.insertMultiple=function(t,e,i,s){return this.add(t,e||0,i,s)},t.appendMultiple=function(t,e,i,s){return this.add(t,this._parseTimeOrLabel(null,e,!0,t),i,s)},t.addLabel=function(t,e){return this._labels[t]=this._parseTimeOrLabel(e),this},t.addPause=function(t,e,i,s){return this.call(n,["{self}",e,i,s],this,t)},t.removeLabel=function(t){return delete this._labels[t],this},t.getLabelTime=function(t){return null!=this._labels[t]?this._labels[t]:-1},t._parseTimeOrLabel=function(t,e,i,s){var n;if(s instanceof h&&s.timeline===this)this.remove(s);else if(s&&(s instanceof Array||s.push&&g(s)))for(n=s.length;-1<--n;)s[n]instanceof h&&s[n].timeline===this&&this.remove(s[n]);if("string"==typeof e)return this._parseTimeOrLabel(e,i&&"number"==typeof t&&null==this._labels[e]?t-this.duration():0,i);if(e=e||0,"string"!=typeof t||!isNaN(t)&&null==this._labels[t])null==t&&(t=this.duration());else{if(-1===(n=t.indexOf("=")))return null==this._labels[t]?i?this._labels[t]=this.duration()+e:e:this._labels[t]+e;e=parseInt(t.charAt(n-1)+"1",10)*Number(t.substr(n+1)),t=1f&&(a="onReverseComplete"))),this._rawPrevTime=this._duration||!e||t||this._rawPrevTime===t?t:f,t=l+1e-4):t<1e-7?(((this._totalTime=this._time=0)!==c||0===this._duration&&this._rawPrevTime!==f&&(0=c)for(s=this._first;s&&(r=s._next,!this._paused||p);)(s._active||s._startTime<=this._time&&!s._paused&&!s._gc)&&(s._reversed?s.render((s._dirty?s.totalDuration():s._totalDuration)-(t-s._startTime)*s._timeScale,e,i):s.render((t-s._startTime)*s._timeScale,e,i)),s=r;else for(s=this._last;s&&(r=s._prev,!this._paused||p);)(s._active||c>=s._startTime&&!s._paused&&!s._gc)&&(s._reversed?s.render((s._dirty?s.totalDuration():s._totalDuration)-(t-s._startTime)*s._timeScale,e,i):s.render((t-s._startTime)*s._timeScale,e,i)),s=r;this._onUpdate&&(e||this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||v)),a&&(this._gc||h!==this._startTime&&u===this._timeScale||!(0===this._time||l>=this.totalDuration())||(n&&(this._timeline.autoRemoveChildren&&this._enabled(!1,!1),this._active=!1),!e&&this.vars[a]&&this.vars[a].apply(this.vars[a+"Scope"]||this,this.vars[a+"Params"]||v)))}},t._hasPausedChild=function(){for(var t=this._first;t;){if(t._paused||t instanceof d&&t._hasPausedChild())return!0;t=t._next}return!1},t.getChildren=function(t,e,i,s){s=s||-9999999999;for(var n=[],r=this._first,a=0;r;)s>r._startTime||(r instanceof p?!1!==e&&(n[a++]=r):(!1!==i&&(n[a++]=r),!1!==t&&(a=(n=n.concat(r.getChildren(!0,e,i))).length))),r=r._next;return n},t.getTweensOf=function(t,e){var i,s,n=this._gc,r=[],a=0;for(n&&this._enabled(!0,!0),s=(i=p.getTweensOf(t)).length;-1<--s;)(i[s].timeline===this||e&&this._contains(i[s]))&&(r[a++]=i[s]);return n&&this._enabled(!1,!0),r},t._contains=function(t){for(var e=t.timeline;e;){if(e===this)return!0;e=e.timeline}return!1},t.shiftChildren=function(t,e,i){i=i||0;for(var s,n=this._first,r=this._labels;n;)n._startTime>=i&&(n._startTime+=t),n=n._next;if(e)for(s in r)r[s]>=i&&(r[s]+=t);return this._uncache(!0)},t._kill=function(t,e){if(!t&&!e)return this._enabled(!1,!1);for(var i=e?this.getTweensOf(e):this.getChildren(!0,!0,!1),s=i.length,n=!1;-1<--s;)i[s]._kill(t,e)&&(n=!0);return n},t.clear=function(t){var e=this.getChildren(!1,!0,!0),i=e.length;for(this._time=this._totalTime=0;-1<--i;)e[i]._enabled(!1,!1);return!1!==t&&(this._labels={}),this._uncache(!0)},t.invalidate=function(){for(var t=this._first;t;)t.invalidate(),t=t._next;return this},t._enabled=function(t,e){if(t===this._gc)for(var i=this._first;i;)i._enabled(t,!0),i=i._next;return u.prototype._enabled.call(this,t,e)},t.duration=function(t){return arguments.length?(0!==this.duration()&&0!==t&&this.timeScale(this._duration/t),this):(this._dirty&&this.totalDuration(),this._duration)},t.totalDuration=function(t){if(arguments.length)return 0!==this.totalDuration()&&0!==t&&this.timeScale(this._totalDuration/t),this;if(this._dirty){for(var e,i,s=0,n=this._last,r=999999999999;n;)e=n._prev,n._dirty&&n.totalDuration(),n._startTime>r&&this._sortChildren&&!n._paused?this.add(n,n._startTime-n._delay):r=n._startTime,n._startTime<0&&!n._paused&&(s-=n._startTime,this._timeline.smoothChildTiming&&(this._startTime+=n._startTime/this._timeScale),this.shiftChildren(-n._startTime,!1,-9999999999),r=0),s<(i=n._startTime+n._totalDuration/n._timeScale)&&(s=i),n=e;this._duration=this._totalDuration=s,this._dirty=!1}return this._totalDuration},t.usesFrames=function(){for(var t=this._timeline;t._timeline;)t=t._timeline;return t===h._rootFramesTimeline},t.rawTime=function(){return this._paused?this._totalTime:(this._timeline.rawTime()-this._startTime)*this._timeScale},d},!0)}),window._gsDefine&&window._gsQueue.pop()()},{}],10:[function(t,Q,e){"use strict";!function(p){var e,i,d=p.GreenSockGlobals||p;if(!d.TweenLite){var _,f=function(t){for(var e=t.split("."),i=d,s=0;e.length>s;s++)i[e[s]]=i=i[e[s]]||{};return i},u=f("com.greensock"),m=1e-10,o=[].slice,g=function(){},h=(e=Object.prototype.toString,i=e.call([]),function(t){return null!=t&&(t instanceof Array||"object"==typeof t&&!!t.push&&e.call(t)===i)}),v={},w=function(o,l,c,h){this.sc=v[o]?v[o].sc:[],(v[o]=this).gsClass=null,this.func=c;var u=[];this.check=function(t){for(var e,i,s,n,r=l.length,a=r;-1<--r;)(e=v[l[r]]||new w(l[r],[])).gsClass?(u[r]=e.gsClass,a--):t&&e.sc.push(this);if(0===a&&c)for(s=(i=("com.greensock."+o).split(".")).pop(),n=f(i.join("."))[s]=this.gsClass=c.apply(c,u),h&&(d[s]=n,"function"==typeof define&&define.amd?define((p.GreenSockAMDPath?p.GreenSockAMDPath+"/":"")+o.split(".").join("/"),[],function(){return n}):void 0!==Q&&Q.exports&&(Q.exports=n)),r=0;this.sc.length>r;r++)this.sc[r].check()},this.check(!0)},s=p._gsDefine=function(t,e,i,s){return new w(t,e,i,s)},y=u._class=function(t,e,i){return e=e||function(){},s(t,[],function(){return e},i),e};s.globals=d;var t,n=[0,0,1,1],x=[],b=y("easing.Ease",function(t,e,i,s){this._func=t,this._type=i||0,this._power=s||0,this._params=e?n.concat(e):n},!0),T=b.map={},r=b.register=function(t,e,i,s){for(var n,r,a,o,l=e.split(","),c=l.length,h=(i||"easeIn,easeOut,easeInOut").split(",");-1<--c;)for(r=l[c],n=s?y("easing."+r,null,!0):u.easing[r]||{},a=h.length;-1<--a;)o=h[a],T[r+"."+o]=T[o+r]=n[o]=t.getRatio?t:t[o]||new t};for((t=b.prototype)._calcEnd=!1,t.getRatio=function(t){if(this._func)return this._params[0]=t,this._func.apply(null,this._params);var e=this._type,i=this._power,s=1===e?1-t:2===e?t:t<.5?2*t:2*(1-t);return 1===i?s*=s:2===i?s*=s*s:3===i?s*=s*s*s:4===i&&(s*=s*s*s*s),1===e?1-s:2===e?s:t<.5?s/2:1-s/2},l=(a=["Linear","Quad","Cubic","Quart","Quint,Strong"]).length;-1<--l;)t=a[l]+",Power"+l,r(new b(null,null,1,l),t,"easeOut",!0),r(new b(null,null,2,l),t,"easeIn"+(0===l?",easeNone":"")),r(new b(null,null,3,l),t,"easeInOut");T.linear=u.easing.Linear.easeIn,T.swing=u.easing.Quad.easeInOut;var k=y("events.EventDispatcher",function(t){this._listeners={},this._eventTarget=t||this});(t=k.prototype).addEventListener=function(t,e,i,s,n){n=n||0;var r,a,o=this._listeners[t],l=0;for(null==o&&(this._listeners[t]=o=[]),a=o.length;-1<--a;)(r=o[a]).c===e&&r.s===i?o.splice(a,1):0===l&&n>r.pr&&(l=a+1);o.splice(l,0,{c:e,s:i,up:s,pr:n}),this!==A||_||A.wake()},t.removeEventListener=function(t,e){var i,s=this._listeners[t];if(s)for(i=s.length;-1<--i;)if(s[i].c===e)return void s.splice(i,1)},t.dispatchEvent=function(t){var e,i,s,n=this._listeners[t];if(n)for(e=n.length,i=this._eventTarget;-1<--e;)(s=n[e]).up?s.c.call(s.s||i,{type:t,target:i}):s.c.call(s.s||i)};for(var a,P=p.requestAnimationFrame,S=p.cancelAnimationFrame,O=Date.now||function(){return(new Date).getTime()},C=O(),l=(a=["ms","moz","webkit","o"]).length;-1<--l&&!P;)P=p[a[l]+"RequestAnimationFrame"],S=p[a[l]+"CancelAnimationFrame"]||p[a[l]+"CancelRequestAnimationFrame"];y("Ticker",function(t,e){var s,n,r,a,o,l=this,c=O(),i=!1!==e&&P,h=500,u=33,p=function(t){var e,i=O()-C;h=i&&i+this.totalDuration()/this._timeScale>t},t._enabled=function(t,e){return _||A.wake(),this._gc=!t,this._active=this.isActive(),!0!==e&&(t&&!this.timeline?this._timeline.add(this,this._startTime-this._delay):!t&&this.timeline&&this._timeline._remove(this,!0)),!1},t._kill=function(){return this._enabled(!1,!1)},t.kill=function(t,e){return this._kill(t,e),this},t._uncache=function(t){for(var e=t?this:this.timeline;e;)e._dirty=!0,e=e.timeline;return this},t._swapSelfInParams=function(t){for(var e=t.length,i=t.concat();-1<--e;)"{self}"===t[e]&&(i[e]=this);return i},t.eventCallback=function(t,e,i,s){if("on"===(t||"").substr(0,2)){var n=this.vars;if(1===arguments.length)return n[t];null==e?delete n[t]:(n[t]=e,n[t+"Params"]=h(i)&&-1!==i.join("").indexOf("{self}")?this._swapSelfInParams(i):i,n[t+"Scope"]=s),"onUpdate"===t&&(this._onUpdate=e)}return this},t.delay=function(t){return arguments.length?(this._timeline.smoothChildTiming&&this.startTime(this._startTime+t-this._delay),this._delay=t,this):this._delay},t.duration=function(t){return arguments.length?(this._duration=this._totalDuration=t,this._uncache(!0),this._timeline.smoothChildTiming&&0this._duration?this._duration:t,e)):this._time},t.totalTime=function(t,e,i){if(_||A.wake(),!arguments.length)return this._totalTime;if(this._timeline){if(t<0&&!i&&(t+=this.totalDuration()),this._timeline.smoothChildTiming){this._dirty&&this.totalDuration();var s=this._totalDuration,n=this._timeline;if(ss;)i=i._prev;return i?(t._next=i._next,i._next=t):(t._next=this._first,this._first=t),t._next?t._next._prev=t:this._last=t,t._prev=i,this._timeline&&this._uncache(!0),this},t._remove=function(t,e){return t.timeline===this&&(e||t._enabled(!1,!0),t.timeline=null,t._prev?t._prev._next=t._next:this._first===t&&(this._first=t._next),t._next?t._next._prev=t._prev:this._last===t&&(this._last=t._prev),this._timeline&&this._uncache(!0)),this},t.render=function(t,e,i){var s,n=this._first;for(this._totalTime=this._time=this._rawPrevTime=t;n;)s=n._next,(n._active||t>=n._startTime&&!n._paused)&&(n._reversed?n.render((n._dirty?n.totalDuration():n._totalDuration)-(t-n._startTime)*n._timeScale,e,i):n.render((t-n._startTime)*n._timeScale,e,i)),n=s},t.rawTime=function(){return _||A.wake(),this._totalTime};var I=y("TweenLite",function(t,e,i){if(c.call(this,e,i),this.render=I.prototype.render,null==t)throw"Cannot tween a null target.";this.target=t="string"==typeof t&&I.selector(t)||t;var s,n,r,i=t.jquery||t.length&&t!==p&&t[0]&&(t[0]===p||t[0].nodeType&&t[0].style&&!t.nodeType),a=this.vars.overwrite;if(this._overwrite=a=null==a?F[I.defaultOverwrite]:"number"==typeof a?a>>0:F[a],(i||t instanceof Array||t.push&&h(t))&&"number"!=typeof t[0])for(this._targets=r=o.call(t,0),this._propLookup=[],this._siblings=[],s=0;r.length>s;s++)(n=r[s])?"string"!=typeof n?n.length&&n!==p&&n[0]&&(n[0]===p||n[0].nodeType&&n[0].style&&!n.nodeType)?(r.splice(s--,1),this._targets=r=r.concat(o.call(n,0))):(this._siblings[s]=H(n,this,!1),1===a&&1=a._startTime&&a._startTime+a.totalDuration()/a._timeScale>c&&((p||!a._initted)&&c-a._startTime<=2e-10||(h[u++]=a)));for(d=u;-1<--d;)a=h[d],2===s&&a._kill(i,t)&&(r=!0),(2!==s||!a._firstPT&&a._initted)&&a._enabled(!1,!1)&&(r=!0);return r},W=function(t,e,i){for(var s=t._timeline,n=s._timeScale,r=t._startTime;s._timeline;){if(r+=s._startTime,n*=s._timeScale,s._paused)return-100;s=s._timeline}return e<(r/=n)?r-e:i&&r===e||!t._initted&&r-e<2*m?m:(r+=t.totalDuration()/t._timeScale/n)>e+m?0:r-e-m};t._init=function(){var t,e,i,s,n,r=this.vars,a=this._overwrittenProps,o=this._duration,l=!!r.immediateRender,c=r.ease;if(r.startAt){for(s in this._startAt&&(this._startAt.render(-1,!0),this._startAt.kill()),n={},r.startAt)n[s]=r.startAt[s];if(n.overwrite=!1,n.immediateRender=!0,n.lazy=l&&!1!==r.lazy,n.startAt=n.delay=null,this._startAt=I.to(this.target,0,n),l)if(0o.pr;)s=s._next;(o._prev=s?s._prev:r)?o._prev._next=o:n=o,(o._next=s)?s._prev=o:r=o,o=a}o=e._firstPT=n}for(;o;)o.pg&&"function"==typeof o.t[t]&&o.t[t]()&&(i=!0),o=o._next;return i},V.activate=function(t){for(var e=t.length;-1<--e;)t[e].API===V.API&&(E[(new t[e])._propName]=t[e]);return!0},s.plugin=function(t){if(!(t&&t.propName&&t.init&&t.API))throw"illegal plugin definition.";var e,i=t.propName,s=t.priority||0,n=t.overwriteProps,r={init:"_onInitTween",set:"setRatio",kill:"_kill",round:"_roundProps",initAll:"_onInitAllProps"},a=y("plugins."+i.charAt(0).toUpperCase()+i.substr(1)+"Plugin",function(){V.call(this,i,s),this._overwriteProps=n||[]},!0===t.global),o=a.prototype=new V(i);for(e in(o.constructor=a).API=t.API,r)"function"==typeof t[e]&&(o[r[e]]=t[e]);return a.version=t.version,V.activate([a]),a},a=p._gsQueue){for(l=0;a.length>l;l++)a[l]();for(t in v)v[t].func||p.console.log("GSAP encountered missing dependency: com.greensock."+t)}_=!1}}(window)},{}],11:[function(t,e,i){"use strict";(window._gsQueue||(window._gsQueue=[])).push(function(){window._gsDefine("easing.Back",["easing.Ease"],function(m){function t(t,e){var i=c("easing."+t,function(){},!0);return(t=i.prototype=new m).constructor=i,t.getRatio=e,i}function e(t,e,i,s){return s=c("easing."+t,{easeOut:new e,easeIn:new i,easeInOut:new s},!0),h(s,t),s}function g(t,e,i){this.t=t,this.v=e,i&&(((this.next=i).prev=this).c=i.v-e,this.gap=i.t-t)}function i(t,e){var i=c("easing."+t,function(t){this._p1=t||0===t?t:1.70158,this._p2=1.525*this._p1},!0);return(t=i.prototype=new m).constructor=i,t.getRatio=e,t.config=function(t){return new i(t)},i}var s,n,r=window.GreenSockGlobals||window,a=r.com.greensock,o=2*Math.PI,l=Math.PI/2,c=a._class,h=m.register||function(){},u=e("Back",i("BackOut",function(t){return--t*t*((this._p1+1)*t+this._p1)+1}),i("BackIn",function(t){return t*t*((this._p1+1)*t-this._p1)}),i("BackInOut",function(t){return(t*=2)<1?.5*t*t*((this._p2+1)*t-this._p2):.5*((t-=2)*t*((this._p2+1)*t+this._p2)+2)})),p=c("easing.SlowMo",function(t,e,i){e=e||0===e?e:.7,null==t?t=.7:1t?this._calcEnd?1-(t=1-t/this._p1)*t:e-(t=1-t/this._p1)*t*t*t*e:t>this._p3?this._calcEnd?1-(t=(t-this._p3)/this._p1)*t:e+(t-e)*(t=(t-this._p3)/this._p1)*t*t*t:this._calcEnd?1:e},p.ease=new p(.7,.7),a.config=p.config=function(t,e,i){return new p(t,e,i)},(a=(s=c("easing.SteppedEase",function(t){this._p1=1/(t=t||1),this._p2=t+1},!0)).prototype=new m).constructor=s,a.getRatio=function(t){return t<0?t=0:1<=t&&(t=.999999999),(this._p2*t>>0)*this._p1},a.config=s.config=function(t){return new s(t)},(a=(n=c("easing.RoughEase",function(t){for(var e,i,s,n,r,a,o=(t=t||{}).taper||"none",l=[],c=0,h=0|(t.points||20),u=h,p=!1!==t.randomize,d=!0===t.clamp,_=t.template instanceof m?t.template:null,f="number"==typeof t.strength?.4*t.strength:.4;-1<--u;)e=p?Math.random():1/h*u,i=_?_.getRatio(e):e,s="none"===o?f:"out"===o?(n=1-e)*n*f:"in"===o?e*e*f:.5*(n=e<.5?2*e:2*(1-e))*n*f,p?i+=Math.random()*s-.5*s:u%2?i+=.5*s:i-=.5*s,d&&(1e.t){for(;e.next&&t>=e.t;)e=e.next;e=e.prev}else for(;e.prev&&e.t>=t;)e=e.prev;return(this._prev=e).v+(t-e.t)/e.gap*e.c},a.config=function(t){return new n(t)},n.ease=new n,e("Bounce",t("BounceOut",function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}),t("BounceIn",function(t){return 1/2.75>(t=1-t)?1-7.5625*t*t:t<2/2.75?1-(7.5625*(t-=1.5/2.75)*t+.75):t<2.5/2.75?1-(7.5625*(t-=2.25/2.75)*t+.9375):1-(7.5625*(t-=2.625/2.75)*t+.984375)}),t("BounceInOut",function(t){var e=t<.5;return t=(t=e?1-2*t:2*t-1)<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,e?.5*(1-t):.5*t+.5})),e("Circ",t("CircOut",function(t){return Math.sqrt(1- --t*t)}),t("CircIn",function(t){return-(Math.sqrt(1-t*t)-1)}),t("CircInOut",function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)})),e("Elastic",(a=function(t,e,i){var s=c("easing."+t,function(t,e){this._p1=t||1,this._p2=e||i,this._p3=this._p2/o*(Math.asin(1/this._p1)||0)},!0),t=s.prototype=new m;return t.constructor=s,t.getRatio=e,t.config=function(t,e){return new s(t,e)},s})("ElasticOut",function(t){return this._p1*Math.pow(2,-10*t)*Math.sin((t-this._p3)*o/this._p2)+1},.3),a("ElasticIn",function(t){return-(this._p1*Math.pow(2,10*--t)*Math.sin((t-this._p3)*o/this._p2))},.3),a("ElasticInOut",function(t){return(t*=2)<1?-.5*this._p1*Math.pow(2,10*--t)*Math.sin((t-this._p3)*o/this._p2):.5*this._p1*Math.pow(2,-10*--t)*Math.sin((t-this._p3)*o/this._p2)+1},.45)),e("Expo",t("ExpoOut",function(t){return 1-Math.pow(2,-10*t)}),t("ExpoIn",function(t){return Math.pow(2,10*(t-1))-.001}),t("ExpoInOut",function(t){return(t*=2)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*(t-1)))})),e("Sine",t("SineOut",function(t){return Math.sin(t*l)}),t("SineIn",function(t){return 1-Math.cos(t*l)}),t("SineInOut",function(t){return-.5*(Math.cos(Math.PI*t)-1)})),c("easing.EaseLookup",{find:function(t){return m.map[t]}},!0),h(r.SlowMo,"SlowMo","ease,"),h(n,"RoughEase","ease,"),h(s,"SteppedEase","ease,"),u},!0)}),window._gsDefine&&window._gsQueue.pop()()},{}],12:[function(t,e,i){"use strict";(window._gsQueue||(window._gsQueue=[])).push(function(){window._gsDefine("plugins.CSSPlugin",["plugins.TweenPlugin","TweenLite"],function(r,p){function N(){r.call(this,"css"),this._overwriteProps.length=0,this.setRatio=N.prototype.setRatio}var d,x,b,u,_={},t=N.prototype=new r("css");(t.constructor=N).version="1.12.1",N.API=2,N.defaultTransformPerspective=0,N.defaultSkewType="compensated",N.suffixMap={top:t="px",right:t,bottom:t,left:t,width:t,height:t,fontSize:t,padding:t,margin:t,perspective:t,lineHeight:""};function n(t,e){return e.toUpperCase()}function a(t){return L.test("string"==typeof t?t:(t.currentStyle||t.style).filter||"")?parseFloat(RegExp.$1)/100:1}function f(t){window.console&&console.log(t)}function T(t,e){var i,s,n=(e=e||Z).style;if(void 0!==n[t])return t;for(t=t.charAt(0).toUpperCase()+t.substr(1),i=["O","Moz","ms","Ms","Webkit"],s=5;-1<--s&&void 0===n[i[s]+t];);return 0<=s?(tt="-"+(et=3===s?"ms":i[s]).toLowerCase()+"-",et+t):null}function m(t,e){var i,s={};if(e=e||it(t,null))if(i=e.length)for(;-1<--i;)s[e[i].replace(Y,n)]=e.getPropertyValue(e[i]);else for(i in e)s[i]=e[i];else if(e=t.currentStyle||t.style)for(i in e)"string"==typeof i&&void 0===s[i]&&(s[i.replace(Y,n)]=e[i]);return J||(s.opacity=a(t)),t=Pt(t,e,!1),s.rotation=t.rotation,s.skewX=t.skewX,s.scaleX=t.scaleX,s.scaleY=t.scaleY,s.x=t.x,s.y=t.y,Tt&&(s.z=t.z,s.rotationX=t.rotationX,s.rotationY=t.rotationY,s.scaleZ=t.scaleZ),s.filters&&delete s.filters,s}function g(t,e,i,s,n){var r,a,o,l={},c=t.style;for(a in i)"cssText"!==a&&"length"!==a&&isNaN(a)&&(e[a]!==(r=i[a])||n&&n[a])&&-1===a.indexOf("Origin")&&("number"==typeof r||"string"==typeof r)&&(l[a]="auto"!==r||"left"!==a&&"top"!==a?""!==r&&"auto"!==r&&"none"!==r||"string"!=typeof e[a]||""===e[a].replace(D,"")?r:0:rt(t,a),void 0!==c[a]&&(o=new pt(c,a,c[a],o)));if(s)for(a in s)"className"!==a&&(l[a]=s[a]);return{difs:l,firstMPT:o}}function v(t,e){var i=(t=null==t||""===t||"auto"===t||"auto auto"===t?"0 0":t).split(" "),s=-1!==t.indexOf("left")?"0%":-1!==t.indexOf("right")?"100%":i[0];return null==(t=-1!==t.indexOf("top")?"0%":-1!==t.indexOf("bottom")?"100%":i[1])?t="0":"center"===t&&(t="50%"),("center"===s||isNaN(parseFloat(s))&&-1===(s+"").indexOf("="))&&(s="50%"),e&&(e.oxp=-1!==s.indexOf("%"),e.oyp=-1!==t.indexOf("%"),e.oxr="="===s.charAt(1),e.oyr="="===t.charAt(1),e.ox=parseFloat(s.replace(D,"")),e.oy=parseFloat(t.replace(D,""))),s+" "+t+(2>16,255&t>>8,255&t]:(","===t.charAt(t.length-1)&&(t=t.substr(0,t.length-1)),lt[t]||("#"===t.charAt(0)?(4===t.length&&(t="#"+(e=t.charAt(1))+e+(i=t.charAt(2))+i+(r=t.charAt(3))+r),[(t=parseInt(t.substr(1),16))>>16,255&t>>8,255&t]):("hsl"===t.substr(0,3)?(t=t.match(A),s=Number(t[0])%360/360,n=Number(t[1])/100,e=2*(r=Number(t[2])/100)-(i=r<=.5?r*(1+n):r+n-r*n),3a",!!(i=i.getElementsByTagName("a")[0])&&/^0.55/.test(i.style.opacity)),tt="",et="",it=Q.defaultView?Q.defaultView.getComputedStyle:function(){},st=N.getStyle=function(t,e,i,s,n){var r;return J||"opacity"!==e?(!s&&t.style[e]?r=t.style[e]:(i=i||it(t))?r=i[e]||i.getPropertyValue(e)||i.getPropertyValue(e.replace(z,"-$1").toLowerCase()):t.currentStyle&&(r=t.currentStyle[e]),null==n||r&&"none"!==r&&"auto"!==r&&"auto auto"!==r?r:n):a(t)},nt=s.convertToPixels=function(t,e,i,s,n){if("px"===s||!s)return i;if("auto"===s||!i)return 0;var r,a,o,l=$.test(e),c=t,h=Z.style,u=i<0;if(u&&(i=-i),"%"===s&&-1!==e.indexOf("border"))r=i/100*(l?t.clientWidth:t.clientHeight);else{if(h.cssText="border:0 solid red;position:"+st(t,"position")+";line-height:0;","%"!==s&&c.appendChild)h[l?"borderLeftWidth":"borderTopWidth"]=i+s;else{if(a=(c=t.parentNode||Q.body)._gsCache,o=p.ticker.frame,a&&l&&a.time===o)return a.width*i/100;h[l?"width":"height"]=i+s}c.appendChild(Z),r=parseFloat(Z[l?"offsetWidth":"offsetHeight"]),c.removeChild(Z),l&&"%"===s&&!1!==N.cacheWidths&&((a=c._gsCache=c._gsCache||{}).time=o,a.width=r/i*100),0!==r||n||(r=nt(t,e,i,s,!0))}return u?-r:r},rt=s.calculateOffset=function(t,e,i){if("absolute"!==st(t,"position",i))return 0;var s="left"===e?"Left":"Top",i=st(t,"margin"+s,i);return t["offset"+s]-(nt(t,e,parseFloat(i),i.replace(j,""))||0)},at={width:["Left","Right"],height:["Top","Bottom"]},ot=["marginLeft","marginRight","marginTop","marginBottom"],lt={aqua:[0,255,255],lime:[0,255,0],silver:[192,192,192],black:[0,0,0],maroon:[128,0,0],teal:[0,128,128],blue:[0,0,255],navy:[0,0,128],white:[255,255,255],fuchsia:[255,0,255],olive:[128,128,0],yellow:[255,255,0],orange:[255,165,0],gray:[128,128,128],purple:[128,0,128],green:[0,128,0],red:[255,0,0],pink:[255,192,203],cyan:[0,255,255],transparent:[255,255,255,0]},ct="(?:\\b(?:(?:rgb|rgba|hsl|hsla)\\(.+?\\))|\\B#.+?\\b";for(t in lt)ct+="|"+t+"\\b";function ht(t,e,r,a){if(null==t)return function(t){return t};var o,l=e?(t.match(ct)||[""])[0]:"",c=t.split(l).join("").match(I)||[],h=t.substr(0,t.indexOf(c[0])),u=")"===t.charAt(t.length-1)?")":"",p=-1!==t.indexOf(" ")?" ":",",d=c.length,_=0s;s++)n[s]=o(n[s]);return n.join(",")}if(e=(t.match(ct)||[l])[0],s=(i=t.split(e).join("").match(I)||[]).length,d>s--)for(;d>++s;)i[s]=r?i[0|(s-1)/2]:c[s];return h+i.join(p)+p+e+u+(-1!==t.indexOf("inset")?" inset":"")}:function(t){var e,i,s;if("number"==typeof t)t+=_;else if(a&&H.test(t)){for(i=t.replace(H,"|").split("|"),s=0;i.length>s;s++)i[s]=o(i[s]);return i.join(",")}if(s=(e=t.match(I)||[]).length,d>s--)for(;d>++s;)e[s]=r?e[0|(s-1)/2]:c[s];return h+e.join(p)+u}:function(t){return t}}function ut(c){return c=c.split(","),function(t,e,i,s,n,r,a){var o,l=(e+"").split(" ");for(a={},o=0;o<4;o++)a[c[o]]=l[o]=l[o]||l[(o-1)/2>>0];return s.parse(t,a,n,r)}}var ct=RegExp(ct+")","gi"),pt=(s._setPluginRatio=function(t){this.plugin.setRatio(t);for(var e,i,s,n,r=this.data,a=r.proxy,o=r.firstMPT;o;)e=a[o.v],o.r?e=Math.round(e):e<1e-6&&-1e-6s;s++)n+=i["xn"+s]+i["xs"+(s+1)];i.e=n}}else i.e=i.s+i.xs0;o=o._next}},function(t,e,i,s,n){this.t=t,this.p=e,this.v=i,this.r=n,s&&((s._prev=this)._next=s)}),dt=(s._parseToProxy=function(t,e,i,s,n,r){var a,o,l,c,h=s,u={},p={},d=i._transform,_=V;for(i._transform=null,V=e,s=n=i.parse(t,e,s,n),V=_,r&&(i._transform=d,h&&(h._prev=null,h._prev&&(h._prev._next=null)));s&&s!==h;){if(s.type<=1&&(p[o=s.p]=s.s+s.c,u[o]=s.s,r||(c=new pt(s,"s",o,c,s.r),s.c=0),1===s.type))for(a=s.l;0<--a;)p[o=s.p+"_"+(l="xn"+a)]=s.data[l],u[o]=s[l],r||(c=new pt(s,l,o,c,s.rxp[l]));s=s._next}return{proxy:u,end:p,firstMPT:c,pt:n}},s.CSSPropTween=function(t,e,i,s,n,r,a,o,l,c,h){this.t=t,this.p=e,this.s=i,this.c=s,this.n=a||e,t instanceof dt||u.push(this.n),this.r=o,this.type=r||0,l&&(this.pr=l,d=!0),this.b=void 0===c?i:c,this.e=void 0===h?i+s:h,n&&((this._next=n)._prev=this)}),_t=N.parseComplex=function(t,e,i,s,n,r,a,o,l,c){a=new dt(t,e,0,0,a,c?2:1,null,!1,o,i=i||r||"",s),s+="";var h,u,p,d,_,f,m,g,v,w,y,x=i.split(", ").join(",").split(" "),b=s.split(", ").join(",").split(" "),T=x.length,k=!1!==O;for(-1===s.indexOf(",")&&-1===i.indexOf(",")||(x=x.join(" ").replace(H,", ").split(" "),b=b.join(" ").replace(H,", ").split(" "),T=x.length),T!==b.length&&(T=(x=(r||"").split(" ")).length),a.plugin=l,a.setRatio=c,h=0;hu;u++)w=f[u],v=d.indexOf(w,p),a.appendXtra(d.substr(p,v-p),Number(w),P(m[u],w),"",k&&"px"===d.substr(v+w.length,2),0===u),p=v+w.length;a["xs"+a.l]+=d.substr(p)}else a["xs"+a.l]+=a.l?" "+d:d;if(-1!==s.indexOf("=")&&a.data){for(y=a.xs0+a.data.s,h=1;a.l>h;h++)y+=a["xs"+h]+a.data["xn"+h];a.e=y+a["xs"+h]}return a.l||(a.type=-1,a.xs0=a.e),a.xfirst||a},ft=9;for((t=dt.prototype).l=t.pr=0;0<--ft;)t["xn"+ft]=0,t["xs"+ft]="";t.xs0="",t._next=t._prev=t.xfirst=t.data=t.plugin=t.setRatio=t.rxp=null,t.appendXtra=function(t,e,i,s,n,r){var a=this,o=a.l;return a["xs"+o]+=r&&o?" "+t:t||"",i||0===o||a.plugin?(a.l++,a.type=a.setRatio?2:1,a["xs"+a.l]=s||"",0s;s++)e.prefix=0===s&&e.prefix,e.defaultValue=i[s]||r,new mt(n[s],e)};(t=mt.prototype).parseComplex=function(t,e,i,s,n,r){var a,o,l,c,h,u=this.keyword;if(this.multi&&(H.test(i)||H.test(e)?(o=e.replace(H,"|").split("|"),l=i.replace(H,"|").split("|")):u&&(o=[e],l=[i])),l){for(c=(l.length>o.length?l:o).length,a=0;aI[r]&&I[r]>-j&&(I[r]=0);return i&&(t._gsTransform=I),I},St=s.set3DTransformRatio=function(t){var e,i,s,n,r,a,o,l,c,h,u,p,d,_,f,m,g,v,w,y,x,b,T=this.data,k=this.t.style,P=T.rotation*U,S=T.scaleX,O=T.scaleY,C=T.scaleZ,A=T.perspective;if(1!==t&&0!==t||"auto"!==T.force3D||T.rotationY||T.rotationX||1!==C||A||T.z){if(M&&(S<1e-4&&-1e-4y;y++)this.p.indexOf("border")&&(f[y]=T(f[y])),-1!==(o=a=st(t,f[y],b,!1,"0px")).indexOf(" ")&&(o=(a=o.split(" "))[0],a=a[1]),l=r=w[y],d=parseFloat(o),_=o.substr((d+"").length),(h=""===(h=(u="="===l.charAt(1))?(c=parseInt(l.charAt(0)+"1",10),l=l.substr(2),c*=parseFloat(l),l.substr((c+"").length-(c<0?1:0))||""):(c=parseFloat(l),l.substr((c+"").length)))?x[i]||_:h)!==_&&(p=nt(t,"borderLeft",d,_),d=nt(t,"borderTop",d,_),a="%"===h?(o=p/g*100+"%",d/v*100+"%"):"em"===h?(o=p/(_=nt(t,"borderLeft",1,"em"))+"em",d/_+"em"):(o=p+"px",d+"px"),u&&(l=parseFloat(o)+c+h,r=parseFloat(a)+c+h)),n=_t(m,f[y],o+" "+a,l+" "+r,!1,"0px",n);return n},prefix:!0,formatter:ht("0px 0px 0px 0px",!1,!0)}),gt("backgroundPosition",{defaultValue:"0 0",parser:function(t,e,i,s,n,r){var a,o,l,c,h,u,p="background-position",d=b||it(t,null),_=this.format((d?C?d.getPropertyValue(p+"-x")+" "+d.getPropertyValue(p+"-y"):d.getPropertyValue(p):t.currentStyle.backgroundPositionX+" "+t.currentStyle.backgroundPositionY)||"0 0"),e=this.format(e);if(-1!==_.indexOf("%")!=(-1!==e.indexOf("%"))&&((u=st(t,"backgroundImage").replace(F,""))&&"none"!==u)){for(a=_.split(" "),o=e.split(" "),G.setAttribute("src",u),l=2;-1<--l;)(c=-1!==(_=a[l]).indexOf("%"))!=(-1!==o[l].indexOf("%"))&&(h=0===l?t.offsetWidth-G.width:t.offsetHeight-G.height,a[l]=c?parseFloat(_)/100*h+"px":parseFloat(_)/h*100+"%");_=a.join(" ")}return this.parseComplex(t.style,_,e,n,r)},formatter:v}),gt("backgroundSize",{defaultValue:"0 0",formatter:v}),gt("perspective",{defaultValue:"0px",prefix:!0}),gt("perspectiveOrigin",{defaultValue:"50% 50%",prefix:!0}),gt("transformStyle",{prefix:!0}),gt("backfaceVisibility",{prefix:!0}),gt("userSelect",{prefix:!0}),gt("margin",{parser:ut("marginTop,marginRight,marginBottom,marginLeft")}),gt("padding",{parser:ut("paddingTop,paddingRight,paddingBottom,paddingLeft")}),gt("clip",{defaultValue:"rect(0px,0px,0px,0px)",parser:function(t,e,i,s,n,r){var a,o;return e=C<9?(a=t.currentStyle,o=C<8?" ":",",a="rect("+a.clipTop+o+a.clipRight+o+a.clipBottom+o+a.clipLeft+")",this.format(e).split(",").join(o)):(a=this.format(st(t,this.p,b,!1,this.dflt)),this.format(e)),this.parseComplex(t.style,a,e,n,r)}}),gt("textShadow",{defaultValue:"0px 0px 0px #999",color:!0,multi:!0}),gt("autoRound,strictUnits",{parser:function(t,e,i,s,n){return n}}),gt("border",{defaultValue:"0px solid #000",parser:function(t,e,i,s,n,r){return this.parseComplex(t.style,this.format(st(t,"borderTopWidth",b,!1,"0px")+" "+st(t,"borderTopStyle",b,!1,"solid")+" "+st(t,"borderTopColor",b,!1,"#000")),this.format(e),n,r)},color:!0,formatter:function(t){var e=t.split(" ");return e[0]+" "+(e[1]||"solid")+" "+(t.match(ct)||["#000"])[0]}}),gt("borderWidth",{parser:ut("borderTopWidth,borderRightWidth,borderBottomWidth,borderLeftWidth")}),gt("float,cssFloat,styleFloat",{parser:function(t,e,i,s,n){var r=t.style,t="cssFloat"in r?"cssFloat":"styleFloat";return new dt(r,t,0,0,n,-1,i,!1,0,r[t],e)}});function Ct(t){var e,i=this.t,s=i.filter||st(this.data,"filter"),t=0|this.s+this.c*t;(e=100==t?-1===s.indexOf("atrix(")&&-1===s.indexOf("radient(")&&-1===s.indexOf("oader(")?(i.removeAttribute("filter"),!st(this.data,"filter")):(i.filter=s.replace(l,""),!0):e)||(this.xn1&&(i.filter=s=s||"alpha(opacity="+t+")"),-1===s.indexOf("pacity")?0==t&&this.xn1||(i.filter=s+" alpha(opacity="+t+")"):i.filter=s.replace(L,"opacity="+t))}gt("opacity,alpha,autoAlpha",{defaultValue:"1",parser:function(t,e,i,s,n,r){var a=parseFloat(st(t,"opacity",b,!1,"1")),o=t.style,l="autoAlpha"===i;return"string"==typeof e&&"="===e.charAt(1)&&(e=("-"===e.charAt(0)?-1:1)*parseFloat(e.substr(2))+a),l&&1===a&&"hidden"===st(t,"visibility",b)&&0!==e&&(a=0),J?n=new dt(o,"opacity",a,e-a,n):((n=new dt(o,"opacity",100*a,100*(e-a),n)).xn1=l?1:0,o.zoom=1,n.type=2,n.b="alpha(opacity="+n.s+")",n.e="alpha(opacity="+(n.s+n.c)+")",n.data=t,n.plugin=r,n.setRatio=Ct),l&&((n=new dt(o,"visibility",0,0,n,-1,null,!1,0,0!==a?"inherit":"hidden",0===e?"hidden":"inherit")).xs0="inherit",s._overwriteProps.push(n.n),s._overwriteProps.push(i)),n}});function At(t,e){e&&(t.removeProperty?("ms"===e.substr(0,2)&&(e="M"+e.substr(1)),t.removeProperty(e.replace(z,"-$1").toLowerCase())):t.removeAttribute(e))}function Mt(t){if(this.t._gsClassPT=this,1===t||0===t){this.t.setAttribute("class",0===t?this.b:this.e);for(var e=this.data,i=this.t.style;e;)e.v?i[e.p]=e.v:At(i,e.p),e=e._next;1===t&&this.t._gsClassPT===this&&(this.t._gsClassPT=null)}else this.t.getAttribute("class")!==this.e&&this.t.setAttribute("class",this.e)}gt("className",{parser:function(t,e,i,s,n,r,a){var o,l,c,h=t.getAttribute("class")||"",u=t.style.cssText;if((n=s._classNamePT=new dt(t,i,0,0,n,2)).setRatio=Mt,n.pr=-11,d=!0,n.b=h,o=m(t,b),i=t._gsClassPT){for(l={},c=i.data;c;)l[c.p]=1,c=c._next;i.setRatio(1)}return(t._gsClassPT=n).e="="!==e.charAt(1)?e:h.replace(RegExp("\\s*\\b"+e.substr(2)+"\\b"),"")+("+"===e.charAt(0)?" "+e.substr(2):""),s._tween._duration&&(t.setAttribute("class",n.e),a=g(t,o,m(t),a,l),t.setAttribute("class",h),n.data=a.firstMPT,t.style.cssText=u,n=n.xfirst=s.parse(t,a.difs,n,r)),n}});function Rt(t){if((1===t||0===t)&&this.data._totalTime===this.data._totalDuration&&"isFromStart"!==this.data.data){var e,i,s,n,r=this.t.style,a=_.transform.parse;if("all"===this.e)n=!(r.cssText="");else for(s=(e=this.e.split(",")).length;-1<--s;)i=e[s],_[i]&&(_[i].parse===a?n=!0:i="transformOrigin"===i?bt:_[i].p),At(r,i);n&&(At(r,yt),this.t._gsTransform&&delete this.t._gsTransform)}}for(gt("clearProps",{parser:function(t,e,i,s,n){return(n=new dt(t,i,0,0,n,2)).setRatio=Rt,n.e=e,n.pr=-10,n.data=s._tween,d=!0,n}}),t="bezier,throwProps,physicsProps,physics2D".split(","),ft=t.length;ft--;)!function(t){var l;_[t]||(l=t.charAt(0).toUpperCase()+t.substr(1)+"Plugin",gt(t,{parser:function(t,e,i,s,n,r,a){var o=(window.GreenSockGlobals||window).com.greensock.plugins[l];return o?(o._cssRegister(),_[i].parse(t,e,i,s,n,r,a)):(f("Error: "+l+" js file not loaded."),n)}}))}(t[ft]);(t=N.prototype)._firstPT=null,t._onInitTween=function(t,e,i){if(!t.nodeType)return!1;this._target=t,this._tween=i,this._vars=e,O=e.autoRound,d=!1,x=e.suffixMap||N.suffixMap,b=it(t,""),u=this._overwriteProps;var s,n,r,a,o,l,i=t.style;if(c&&""===i.zIndex&&("auto"!==(l=st(t,"zIndex",b))&&""!==l||this._addLazySet(i,"zIndex",0)),"string"==typeof e&&(r=i.cssText,l=m(t,b),i.cssText=r+";"+e,l=g(t,l,m(t)).difs,!J&&X.test(e)&&(l.opacity=parseFloat(RegExp.$1)),e=l,i.cssText=r),this._firstPT=s=this.parse(t,e,null),this._transformType){for(l=3===this._transformType,yt?h&&(c=!0,""===i.zIndex&&("auto"!==(e=st(t,"zIndex",b))&&""!==e||this._addLazySet(i,"zIndex",0)),k&&this._addLazySet(i,"WebkitBackfaceVisibility",this._vars.WebkitBackfaceVisibility||(l?"visible":"hidden"))):i.zoom=1,n=s;n&&n._next;)n=n._next;i=new dt(t,"transform",0,0,null,2),this._linkCSSP(i,null,n),i.setRatio=l&&Tt?St:yt?Ot:vt,i.data=this._transform||Pt(t,b,!0),u.pop()}if(d){for(;s;){for(o=s._next,n=r;n&&n.pr>s.pr;)n=n._next;(s._prev=n?n._prev:a)?s._prev._next=s:r=s,(s._next=n)?n._prev=s:a=s,s=o}this._firstPT=r}return!0},t.parse=function(t,e,i,s){var n,r,a,o,l,c,h,u,p=t.style;for(n in e)l=e[n],u=_[n],u?i=u.parse(t,l,n,this,i,s,e):(o=st(t,n,b)+"",h="string"==typeof l,"color"===n||"fill"===n||"stroke"===n||-1!==n.indexOf("Color")||h&&E.test(l)?(h||(l=S(l),l=(3s;s++)i+=n["xn"+s]+n["xs"+(s+1)];n.t[n.p]=i}else-1===n.type?n.t[n.p]=n.xs0:n.setRatio&&n.setRatio(t);else n.t[n.p]=e+n.xs0;n=n._next}else for(;n;)2!==n.type?n.t[n.p]=n.b:n.setRatio(t),n=n._next;else for(;n;)2!==n.type?n.t[n.p]=n.e:n.setRatio(t),n=n._next},t._enableTransforms=function(t){this._transformType=t||3===this._transformType?3:2,this._transform=this._transform||Pt(this._target,b,!0)};function It(){this.t[this.p]=this.e,this.data._linkCSSP(this,this._next,null,!0)}t._addLazySet=function(t,e,i){e=this._firstPT=new dt(t,e,0,0,this._firstPT,2);e.e=i,e.setRatio=It,e.data=this},t._linkCSSP=function(t,e,i,s){return t&&(e&&(e._prev=t),t._next&&(t._next._prev=t._prev),t._prev?t._prev._next=t._next:this._firstPT===t&&(this._firstPT=t._next,s=!0),i?i._next=t:s||null!==this._firstPT||(this._firstPT=t),t._next=e,t._prev=i),t},t._kill=function(t){var e,i,s,n=t;if(t.autoAlpha||t.alpha){for(i in n={},t)n[i]=t[i];n.opacity=1,n.autoAlpha&&(n.visibility=1)}return t.className&&(e=this._classNamePT)&&((s=e.xfirst)&&s._prev?this._linkCSSP(s._prev,e._next,s._prev._prev):s===this._firstPT&&(this._firstPT=e._next),e._next&&this._linkCSSP(e._next,e._next._next,s._prev),this._classNamePT=null),r.prototype._kill.call(this,n)};function Dt(t,e,i){var s,n,r,a;if(t.slice)for(n=t.length;-1<--n;)Dt(t[n],e,i);else for(n=(s=t.childNodes).length;-1<--n;)a=(r=s[n]).type,r.style&&(e.push(m(r)),i&&i.push(r)),1!==a&&9!==a&&11!==a||!r.childNodes.length||Dt(r,e,i)}return N.cascadeTo=function(t,e,i){var s,n,r,a=p.to(t,e,i),o=[a],l=[],c=[],h=[],u=p._internals.reservedProps;for(t=a._targets||a.target,Dt(t,l,h),a.render(e,!0),Dt(t,c),a.render(0,!0),a._enabled(!0),s=h.length;-1<--s;)if((n=g(h[s],l[s],c[s])).firstMPT){for(r in n=n.difs,i)u[r]&&(n[r]=i[r]);o.push(p.to(h[s],e,n))}return o},r.activate([N]),N},!0)}),window._gsDefine&&window._gsQueue.pop()()},{}],13:[function(t,e,i){"use strict";(window._gsQueue||(window._gsQueue=[])).push(function(){function n(t,e){var i="x"===e?"Width":"Height",s="scroll"+i,n="client"+i,e=document.body;return t===a||t===r||t===e?Math.max(r[s],e[s])-(a["inner"+i]||Math.max(r[n],e[n])):t[s]-t["offset"+i]}var r=document.documentElement,a=window,t=window._gsDefine.plugin({propName:"scrollTo",API:2,version:"1.7.3",init:function(t,e,i){return this._wdw=t===a,this._target=t,this._tween=i,this._autoKill=!1!==(e="object"!=typeof e?{y:e}:e).autoKill,this.x=this.xPrev=this.getX(),this.y=this.yPrev=this.getY(),null!=e.x?(this._addTween(this,"x",this.x,"max"===e.x?n(t,"x"):e.x,"scrollTo_x",!0),this._overwriteProps.push("scrollTo_x")):this.skipX=!0,null!=e.y?(this._addTween(this,"y",this.y,"max"===e.y?n(t,"y"):e.y,"scrollTo_y",!0),this._overwriteProps.push("scrollTo_y")):this.skipY=!0,!0},set:function(t){this._super.setRatio.call(this,t);var e=this._wdw||!this.skipX?this.getX():this.xPrev,i=this._wdw||!this.skipY?this.getY():this.yPrev,s=i-this.yPrev,t=e-this.xPrev;this._autoKill&&(!this.skipX&&(7e&&(this.skipX=!0),!this.skipY&&(7i&&(this.skipY=!0),this.skipX&&this.skipY&&this._tween.kill()),this._wdw?a.scrollTo(this.skipX?e:this.x,this.skipY?i:this.y):(this.skipY||(this._target.scrollTop=this.y),this.skipX||(this._target.scrollLeft=this.x)),this.xPrev=this.x,this.yPrev=this.y}}),e=t.prototype;t.max=n,e.getX=function(){return this._wdw?null!=a.pageXOffset?a.pageXOffset:(null!=r.scrollLeft?r:document.body).scrollLeft:this._target.scrollLeft},e.getY=function(){return this._wdw?null!=a.pageYOffset?a.pageYOffset:(null!=r.scrollTop?r:document.body).scrollTop:this._target.scrollTop},e._kill=function(t){return t.scrollTo_x&&(this.skipX=!0),t.scrollTo_y&&(this.skipY=!0),this._super._kill.call(this,t)}}),window._gsDefine&&window._gsQueue.pop()()},{}]},{},[2]); //# sourceMappingURL=wpr-admin.js.map diff --git a/dynamic-lists-delayjs.json b/dynamic-lists-delayjs.json index 9a52eb0a85..04aa1d5dcb 100644 --- a/dynamic-lists-delayjs.json +++ b/dynamic-lists-delayjs.json @@ -1 +1 @@ -{"plugins":{"ffc21030-519a-4853-8cea-49f959e82731":{"id":"plugin:def67a2c1ddd6df2353e4772b6fd4e5b","title":"Additional Variation Images Gallery for WooCommerce","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/woo-variation-gallery\/assets\/js\/slick.min.js","\/woo-variation-gallery\/assets\/js\/frontend.min.js","\/wp-includes\/js\/underscore.min.js","variation_custom_fields"],"is_default":0,"condition":"woo-variation-gallery\/woo-variation-gallery.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"0e7dc253-acd0-4421-877f-a7101d848717":{"id":"plugin:4b82cc7379d46c6272f5d556bb264eec","title":"Advanced Ads","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/uploads\/(.*).js","advanced_ads_ready","advadsCfpQueue","adsbygoogle","adservice.google","\/advanced-ads(.*)","advads_items","advads_tracking_ads"],"is_default":0,"condition":"advanced-ads\/advanced-ads.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"a4d5c058-9120-47ee-977c-f30f83fb1a75":{"id":"plugin:a076fbb79772f497349a76ee74a7f708","title":"All-in-one Compliance for GDPR \/ CCPA Cookie Consent","type":"plugin","icon":"","exclusions":["iubenda_cs.js","var _iub"],"is_default":0,"condition":"iubenda-cookie-law-solution\/iubenda_cookie_solution.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"79a5082f-821a-4a4b-a0e3-caaf22cf3f75":{"id":"plugin:9bdceaa1bb89135730a3b2aa4db94c22","title":"AMO Team Showcase","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/amo-team-showcase\/public\/js\/wookmark.js","\/amo-team-showcase\/public\/js\/amo-team-showcase-public.js","\/wp-includes\/js\/imagesloaded.min.js","amoTeamVars"],"is_default":0,"condition":"amo-team-showcase\/amo-team-showcase.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"90c7fd90-3adf-4cb7-8a92-845bdbd95d27":{"title":"Anti-Spam by CleanTalk - Prevent console error","condition":"cleantalk-spam-protect\/cleantalk.php","exclusions":["ctPublicFunctions","ctPublic"],"icon_url":"","type":"plugin","id":"plugin:ed2ade77cd44e21b1703b093c002a903","is_default":0,"created_at":1699370420},"e054f840-700a-4549-bbba-485473a53f71":{"title":"AnWP Football Leagues - Calendar Widget","condition":"football-leagues-by-anwppro\/anwp-football-leagues.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/football-leagues-by-anwppro\/(.*)","\/football-leagues-by-anwppro-premium-premium\/(.*)","window.AnWPFLPro","window.AnWPFLTabulator","\/elementor\/assets\/lib\/flatpickr\/flatpickr.min.js"],"icon_url":"","type":"plugin","id":"plugin:e7581089f33fdf0a970d5c5deb16ff50","is_default":0,"created_at":1708535321},"1d058cae-4460-4354-bab3-a96445650bd8":{"id":"plugin:b739df50f3f5bf400075f17dca652517","title":"AnyWhere Elementor Pro","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/anywhere-elementor-pro\/build\/index.js"],"is_default":0,"condition":"anywhere-elementor-pro\/anywhere-elementor-pro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"8a1614c7-55b1-4b6d-88e5-6e8ddc630dae":{"id":"plugin:46741e77eaf4d13a0c80be6b86379758","title":"Astra - Pro Addon","type":"plugin","icon":"","exclusions":["\/astra-addon\/astra-addon-(.*).js"],"is_default":0,"condition":"astra-addon\/astra-addon.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"37d96403-f9ea-4481-b2f8-374d7c93e61a":{"id":"plugin:ccd87807930a1856717fd276c336db9a","title":"Beaver Builder","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/uploads\/bb-plugin\/","\/bb-plugin\/js\/yui3.min.js","\/wp-includes\/js\/imagesloaded.min.js","\/bb-plugin\/js\/fl-slideshow.min.js"],"is_default":0,"condition":"beaver-builder-lite-version\/fl-builder.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"f83dbf3b-783e-4ef9-9b18-8a469ca7102d":{"title":"Bloom","condition":"bloom\/bloom.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/bloom\/"],"icon_url":"","type":"plugin","id":"plugin:e57cdfbc09f4e0f7445c279d9f580bdd","is_default":0,"created_at":1685189070},"135aadd2-cd4a-44ae-8dcf-801f3f2316c0":{"id":"plugin:055ef01accbad6378e3d1a4965600964","title":"Booked","type":"plugin","icon":"","exclusions":["\/booked\/","\/js\/jquery\/ui\/datepicker.min.js"],"is_default":0,"condition":"booked\/booked.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"ddfee9b0-e5a9-4d3f-8c21-b999cbb61c33":{"id":"plugin:492f9b0d55f3bf07c68e915ea1dfb72a","title":"Bookly","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/bookly-responsive-appointment-booking-tool\/frontend\/","window.bookly"],"is_default":0,"condition":"bookly-responsive-appointment-booking-tool\/main.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"7a013fd6-0881-4dbe-8e93-33edefe7f717":{"title":"Borlabs Cookie","condition":"borlabs-cookie\/borlabs-cookie.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","borlabsCookieConfig","borlabs-cookie.min.js","borlabsCookieContentBlocker","BorlabsCookieBox","allFbWidgets","\/borlabs-cookie\/assets\/javascript\/","borlabs-cookie-config"],"icon_url":"","type":"plugin","id":"plugin:e1ec2daca513de476bd3dae79366e9ab","is_default":0,"created_at":1702497952},"3999e680-4049-4494-945c-768cecc1a2c4":{"id":"plugin:43019d66af7b41e65bb602c01e10c6a0","title":"Brizy","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/brizy\/public\/editor-build\/(.*)-wp\/editor\/js\/group-(.*).js","\/brizy\/public\/editor-build\/(.*)-wp\/editor\/js\/preview.js","Brizy.emit"],"is_default":0,"condition":"brizy\/brizy.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"af4d9357-3def-42a1-86b7-419553444b4d":{"id":"plugin:5c317f9f244597d8f236ecb7d8e41752","title":"Carousel Upsells and Related Product for WooCommerce","type":"plugin","icon":"","exclusions":["\/carousel-upsells-and-related-product-for-woocommerce\/assets\/js\/glide.min.js","carusel_poduct_related"],"is_default":0,"condition":"carousel-upsells-and-related-product-for-woocommerce\/ffxf-woo-glide-related-and-upsells.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"1d866d90-5451-43ba-a4d1-75b64f9235e1":{"id":"plugin:0a3a29603ebac8fe0808f64f5c8edbb2","title":"clickskeks.at Cookiebanner","type":"plugin","icon":"","exclusions":["clickskeks"],"is_default":0,"condition":"clickskeks\/index.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"c09695cc-2387-4416-881a-c0b392188a26":{"title":"Complianz","condition":"complianz-gdpr\/complianz-gpdr.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","complianz"],"icon_url":"","type":"plugin","id":"plugin:a766f95208154cd69a3e15150a42f325","is_default":0,"created_at":1685188788},"b5e146fc-0b7c-4c6c-a631-8da246d3bd89":{"title":"Conerstone Builder - Fix mobile menu","condition":"cornerstone\/cornerstone.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/cornerstone\/assets\/js\/site\/cs-classic.(.*).js"],"icon_url":"","type":"plugin","id":"plugin:f8f8c81535b5e0073aa3c56b6dd3df5b","is_default":0,"created_at":1708614275},"7e551e3b-fbe4-4235-87a9-b476bc9e2020":{"id":"plugin:949b1b923d51d10a2fb67a2a39d166b3","title":"Content Egg","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/content-egg\/res\/js\/morrisjs\/morris.min.js","\/content-egg\/res\/js\/morrisjs\/raphael.min.js","Morris.Area"],"is_default":0,"condition":"content-egg\/content-egg.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"7fbca6c5-9239-4550-a755-6f041f867a57":{"title":"Cookie Notice & Compliance for GDPR \/ CCPA","condition":"cookie-notice\/cookie-notice.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/cookie-notice\/","var cnArgs"],"icon_url":"","type":"plugin","id":"plugin:213d0f883ae27aefb3a7937656bbd11e","is_default":0,"created_at":1681379736},"26722567-fe35-44b5-a5a7-fb0f3a38c3f2":{"id":"plugin:1d10ad30bbcf0fd4b26e9625a07abcfc","title":"Cookiebot CMP","type":"plugin","icon":"","exclusions":["consent.cookiebot.com"],"is_default":0,"condition":"cookiebot\/cookiebot.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"74110e36-89e5-440d-bec3-7133da3277c2":{"id":"plugin:edcf103293ceab711e999d419d038ca1","title":"Coupon Referral Program","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/coupon-referral-program\/","\/wp-includes\/js\/jquery\/ui\/draggable.min.js"],"is_default":0,"condition":"coupon-referral-program\/coupon-referral-program.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"ed63e02f-d6c5-481a-bcb9-aae15f72aa21":{"id":"plugin:c3e26264dcfd25802805b4fd1a2a449c","title":"Crisp - Live Chat and Chatbot","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","CRISP_RUNTIME_CONFIG","l.js"],"is_default":0,"condition":"crisp\/crisp.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"a8eb622b-279c-4f84-86e0-785e9497add7":{"id":"plugin:6e4bf949e12f0bebfefb48f6c316102a","title":"Custom Twitter Feeds pro","type":"plugin","icon":"","exclusions":["\/custom-twitter-feeds-pro\/js\/ctf-scripts.min.js"],"is_default":0,"condition":"custom-twitter-feeds-pro\/custom-twitter-feed.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"1624ef15-e25b-406d-bdf9-d4b78d7a59e7":{"title":"Customer Reviews for WooCommerce Plugin","condition":"customer-reviews-woocommerce\/ivole.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/customer-reviews-woocommerce\/js\/colcade.js"],"icon_url":"","type":"plugin","id":"plugin:1f893b343e72ce55e6c9013fbda172fa","is_default":0,"created_at":1704734788},"396cc03a-8946-4ee8-ab15-7e48261df79a":{"title":"Divi - Carousel Module 2.0","condition":"dg-divi-carousel","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/wp-content\/plugins\/dg-divi-carousel\/"],"icon_url":"","type":"plugin","id":"plugin:fcd789b7d02699f89720aa5ff3627912","is_default":0,"created_at":1709126476},"c15fe3b3-0eaa-48f9-bf04-0e778b1f8c63":{"title":"Divi - Supreme","condition":"supreme-modules-for-divi\/supreme-modules-for-divi.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js",".dipi_preloader_wrapper_outer","\/Divi\/js\/scripts.min.js","\/Divi\/js\/custom.unified.js","\/js\/magnific-popup.js","var DIVI","\/supreme-modules-for-divi\/"],"icon_url":"","type":"plugin","id":"plugin:b5489ae4d8b949f536d6dd2e5b0c1a95","is_default":0,"created_at":1679738701},"dd31451b-989a-4517-b02a-e2c2e2023366":{"id":"plugin:5caed322df984bbfd3ecb506cf12b688","title":"Divi Den Pro","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/ddpro\/build\/freddie\/js\/freddieScriptPageTransition.js","\/ddpro\/build\/freddie\/js\/freddieScriptsHeaders.js","\/ddpro\/build\/freddie\/js\/freddieScriptsContents.js","\/ddpro\/build\/freddie\/js\/gsap\/gsap.min.js"],"is_default":0,"condition":"ddpro\/ddpro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"2b006370-cc90-42c1-9656-a30fbfbc91c6":{"id":"plugin:402d9b241b04934dd30f32e7ba490e63","title":"Divi Mobile","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","divi-menu","dm_nav"],"is_default":0,"condition":"divi-mobile\/divi-mobile.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"666bbed9-7ce3-457c-ad6e-b5e056d05010":{"title":"Divi Overlays","condition":"divi-overlays\/divi-overlays.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js",".dipi_preloader_wrapper_outer","\/Divi\/js\/scripts.min.js","\/Divi\/js\/custom.unified.js","var DIVI","\/divi-overlays\/"],"icon_url":"","type":"plugin","id":"plugin:1c828c93d87298d2a27c76e13d0880ba","is_default":0,"created_at":1679738664},"42a404af-7792-44be-9baa-565dc3baf25d":{"title":"Divi Pixel","condition":"divi-pixel\/divi-pixel.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js",".dipi_preloader_wrapper_outer","\/divi-pixel\/dist\/public\/js\/hamburger.min.js"],"icon_url":"","type":"plugin","id":"plugin:dd2494945a487a6cc74d3ab1b2137ccb","is_default":0,"created_at":1686859169},"85f5c099-c481-4c38-bbb9-8b76113bdfd5":{"title":"Divi Supreme Pro","condition":"supreme-modules-pro-for-divi\/supreme-modules-pro-for-divi.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","elm.style.display","\/supreme-modules-pro-for-divi\/includes\/modules\/ImageCarousel\/frontend.min.js","\/supreme-modules-pro-for-divi\/public\/js\/swiper-bundle.min.js"],"icon_url":"","type":"plugin","id":"plugin:3d5f0ae7751702fd1bb490fcf991a334","is_default":0,"created_at":1695118162},"0b78d762-c7be-45de-9aae-0c5078ec0619":{"id":"plugin:b5fc0101608d0b0627268dc49e3e1f8f","title":"Divi Toolbox","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","jQuery('.preloader')","\/divi-toolbox\/assets\/js\/toolbox-scripts.js"],"is_default":0,"condition":"divi-toolbox\/divi-toolbox.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"31a34440-1383-40c4-8920-effcf99f2165":{"title":"Dracula Dark Mode","condition":"dracula-dark-mode-premium\/plugin.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/wp-content\/plugins\/dracula-dark-mode-premium\/assets\/js\/dark-mode.js","\/wp-content\/plugins\/dracula-dark-mode-premium\/assets\/js\/frontend.js","\/wp-includes\/js\/dist\/vendor\/react-dom.min.js","\/wp-includes\/js\/dist\/vendor\/react.min.js","\/wp-includes\/js\/dist\/api-fetch.min.js","\/wp-includes\/js\/dist\/hooks.min.js","\/wp-includes\/js\/dist\/i18n.min.js","draculaDarkMode"],"icon_url":"","type":"plugin","id":"plugin:5e8a5d8d3830136d84d0f3676f1bf5a5","is_default":0,"created_at":1704210236},"8baba0f8-4449-47d8-a87d-9b6a116e7684":{"title":"Dynamic Pricing & Discounts Lite for WooCommerce","condition":"woo-dynamic-pricing-discounts-lite\/dynamic-pricing-discounts-lite-for-woocommerce.php","exclusions":["\/woo-dynamic-pricing-discounts-lite\/assets\/OwlCarousel\/dist\/owl.carousel.min.js","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js"],"icon_url":"","type":"plugin","id":"plugin:185062bf08db42515488e1853d1f4917","is_default":0,"created_at":1677857247},"0fa129f2-5869-4db7-9bf0-69e4b3549ee2":{"id":"plugin:27478327aa44075a86176fad95640d76","title":"Dynamic Product Gallery for WooCommerce","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/woocommerce-dynamic-gallery\/","a3revWCDynamicGallery"],"is_default":0,"condition":"woocommerce-dynamic-gallery\/wc_dynamic_gallery_woocommerce.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"9958c6be-2f67-4791-95c3-a7ad96d599c0":{"title":"Dynamic Product Gallery Premium for WooCommerce","condition":"woocommerce-dynamic-gallery-pro\/wc_dynamic_gallery_woocommerce.php","exclusions":["\/jquery-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?$","\/jquery-migrate(.*)(.min|.slim|.slim.min)?.js(\\?(.*))?$","\/woocommerce-dynamic-gallery-pro\/assets\/js\/mygallery\/jquery.a3-dgallery.js","settings_defaults_","a3revWCDynamicGallery"],"icon_url":"","type":"plugin","id":"plugin:11dc02a76019f00422f4ac85f47f5135","is_default":0,"created_at":1683208937},"ce26ed21-1be5-481f-80d4-31edfac6d890":{"title":"Dynamic.ooo - Dynamic Content for Elementor","condition":"dynamic-content-for-elementor\/dynamic-content-for-elementor.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","\/wp-includes\/js\/imagesloaded.min.js","ElementorProFrontendConfig","elementorFrontendConfig","\/dynamic-content-for-elementor\/assets\/","\/wp-includes\/js\/dist\/hooks.min.js","\/wp-includes\/js\/dist\/i18n.min.js"],"icon_url":"","type":"plugin","id":"plugin:d2bd5b348abe016bdc722acce7755062","is_default":0,"created_at":1683355024},"6a3161a6-1a6f-457a-a9ee-54b376981927":{"id":"plugin:ee1dec033c6481a77fe88de5bef1a02d","title":"Easy Table of Contents","type":"plugin","icon":"","exclusions":["\/easy-table-of-contents\/assets\/js\/front.min.js"],"is_default":0,"condition":"easy-table-of-contents\/easy-table-of-contents.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"25a534a0-2c1f-4cf4-9e19-7941bc032b3a":{"title":"Ecwid Ecommerce Shopping Cart","condition":"ecwid-shopping-cart\/ecwid-shopping-cart.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","app.ecwid.com\/script.js","\/ecwid-shopping-cart\/js\/frontend.js","\/ecwid-shopping-cart\/js\/static-page.js","ecwidParamswindow.ec","jQuery.mobile","xSearch","xCategoriesV2","xProductBrowser","Ecwid.init"],"icon_url":"","type":"plugin","id":"plugin:41c8f5f0ab00cb39654aedd783d194e0","is_default":0,"created_at":1704734846},"40464325-5bae-4a20-bc97-553499e09a73":{"title":"Elementor","condition":"elementor\/elementor.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","\/wp-includes\/js\/imagesloaded.min.js","ElementorProFrontendConfig","elementorFrontendConfig","\/happy-elementor-addons-pro\/","\/header-footer-elementor\/inc\/js\/frontend.js","\/wp-includes\/js\/jquery\/ui\/core.min.js","\/wp-includes\/js\/dist\/api-fetch.min.js","\/wp-includes\/js\/dist\/hooks.min.js","\/wp-includes\/js\/dist\/i18n.min.js"],"icon_url":"","type":"plugin","id":"plugin:1d15783218a3137bec4ee8df5353e218","is_default":0,"created_at":1694425872},"ac86b64c-c80a-4053-894d-6caa8b4fdce8":{"title":"Elementor Loop Carrousel","condition":"elementor\/elementor.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/jquery\/ui\/core.min.js","\/wp-includes\/js\/dist\/api-fetch.min.js","\/wp-includes\/js\/dist\/hooks.min.js","\/wp-includes\/js\/dist\/i18n.min.js"],"icon_url":"","type":"plugin","id":"plugin:0eb8d0bbd1c7ca05ac133ea634f676b7","is_default":0,"created_at":1694442056},"a8fc9fd1-f6d3-41eb-abe9-ef176de6d7e2":{"title":"Elementor - Lazy Load Background Images","condition":"elementor\/elementor.php","exclusions":["lazyloadRunObserver"],"icon_url":"","type":"plugin","id":"plugin:bf248cb2876558452a566c5dd89262b8","is_default":0,"created_at":1694453032},"1948aff5-7850-4979-91fa-0ce181484508":{"id":"plugin:de658ae6c2d05a5a4a947efecf5e0c16","title":"Elementor Custom Skin","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/ele-custom-skin(.*)\/assets\/js\/"],"is_default":0,"condition":"ele-custom-skin\/ele-custom-skin.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"25708299-c596-4416-8ad8-740aee0f2752":{"title":"Elementor Pro","condition":"elementor-pro\/elementor-pro.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","\/wp-includes\/js\/imagesloaded.min.js","ElementorProFrontendConfig","elementorFrontendConfig","\/happy-elementor-addons-pro\/","\/header-footer-elementor\/inc\/js\/frontend.js"],"icon_url":"","type":"plugin","id":"plugin:030ad23e3851ed7adfa7b9b6c13cf5a6","is_default":0,"created_at":1679490021},"f34dd874-4b34-41e6-a31c-ece3c1efbffc":{"id":"plugin:305581ad4294a30eeb1247982f626005","title":"Elementor Pro - SmartMenus","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor-pro\/assets\/lib\/smartmenus\/jquery.smartmenus.min.js","\/elementor-pro\/assets\/js\/preloaded-elements-handlers.min.js"],"is_default":0,"condition":"elementor-pro\/elementor-pro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"111cc8b2-0be9-438b-9aa3-7f1e301a5697":{"id":"plugin:5ae9f5d99224d5ebc7d0c0bbf5b99787","title":"Elementor Pro - User Cache","type":"plugin","icon":"","exclusions":["\/wp-includes\/js\/underscore.min.js","\/wp-includes\/js\/jquery\/ui\/core.min.js","\/wp-includes\/js\/backbone.min.js","elementorAdminBarConfig","elementorCommonConfig","elementorWebCliConfig","elementorDevToolsConfig"],"is_default":0,"condition":"elementor-pro\/elementor-pro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"c1713bf8-e0c3-4cb5-8b3f-841b06aa87ed":{"title":"ElementsKit Lite - Megamenu","condition":"elementskit-lite\/elementskit-lite.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/elementskit(.*)\/"],"icon_url":"","type":"plugin","id":"plugin:b91fed2fc4478dbb7067742c1ee4691b","is_default":0,"created_at":1683270249},"706ff35d-8e33-4b04-a986-346faff704e9":{"id":"plugin:417192424139d89fb2a5b1ee1f2b9613","title":"Essential Addons for Elementor","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/essential-addons(-for)?-elementor(-lite)?\/.*(.min)?.js"],"is_default":0,"condition":"essential-addons-for-elementor-lite\/essential_adons_elementor.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"b38556dc-2bc4-430f-9c55-7191cf7773db":{"id":"plugin:057757d0593ad9d2dc58124f0077a5df","title":"Essential Addons for Elementor Pro","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/essential-addons(-for)?-elementor(-lite)?\/.*(.min)?.js"],"is_default":0,"condition":"essential-addons-elementor\/essential_adons_elementor.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"719b988f-0d60-40c2-ba46-88f943119cb1":{"id":"plugin:c8e6c490f6438f566ade600c33531a85","title":"Essential Grid","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/essential-grid\/","lightboxOptions"],"is_default":0,"condition":"essential-grid\/essential-grid.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"47d3d2ab-160d-4b07-ac25-8250b9e6a951":{"id":"plugin:dafd19fa48a1fef890dc4348052fcb75","title":"EventON Lite","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/eventon-lite\/assets\/js\/(.*)"],"is_default":0,"condition":"eventon-lite\/eventon.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"219968d7-cf1f-4ee0-917a-db35dcc93a3e":{"id":"plugin:49ff465628fc3cb6d7f23ff81d9b8339","title":"FacetWP","type":"plugin","icon":"","exclusions":["\/facetwp\/assets\/js\/dist\/front.min.js","window.FWP_"],"is_default":0,"condition":"facetwp\/index.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"acce5701-5917-48d5-83ab-3e626aa420c5":{"id":"plugin:78a1c88a56fa957c802074b6418c6fac","title":"FacetWP - Flyout menu","type":"plugin","icon":"","exclusions":["\/facetwp-flyout\/assets\/js\/front.js"],"is_default":0,"condition":"facetwp-flyout\/facetwp-flyout.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"081461cf-dbd0-42f3-9557-10cdc16cf145":{"title":"FiboFilters Premium","condition":"fibofilters-pro\/fibofilters.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/fibofilters-pro\/build\/front-pro\/front.js"],"icon_url":"","type":"plugin","id":"plugin:d9f62725f1470d35c3f220645bc2e473","is_default":0,"created_at":1709923289},"f2a5b95f-1a22-46d2-8b72-42a53e46ae3f":{"id":"plugin:5d7555892a3a9968fde3fa3a335fc3d8","title":"FiboSearch - Ajax Search for WooCommerce","type":"plugin","icon":"","exclusions":["\/wp-includes\/js\/jquery\/jquery.js","\/wp-includes\/js\/jquery\/jquery-migrate.js","\/ajax-search-for-woocommerce-premium\/assets\/js\/search.js"],"is_default":0,"condition":"ajax-search-for-woocommerce\/ajax-search-for-woocommerce.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"7d1404e9-be76-449c-87aa-919557abe82d":{"id":"plugin:ad46179e8b0584abaf52056b846da227","title":"FlexBlock","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/flo-flex-builder\/dist\/flex-public.min.js","flexDebug"],"is_default":0,"condition":"flo-flex-builder\/flo-flex-builder.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"b9c6a2dc-b226-4e2c-b85e-29ee55b8f751":{"id":"plugin:567a2b15db30ef6bd4904e4317139aac","title":"Fluent Forms","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/fluentform\/public\/js\/(.*).js","\/fluentformpro\/public\/js\/(.*).js"],"is_default":0,"condition":"fluentform\/fluentform.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"10874f8a-2855-4e80-bc46-e484589b76a8":{"id":"plugin:e78c153103f698b2b34892332d6b3b62","title":"Flying Images","type":"plugin","icon":"","exclusions":["flyingImages"],"is_default":0,"condition":"nazy-load\/flying-images.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"53958499-dacd-41d6-93bc-1534fe7d9eda":{"id":"plugin:5a0e40a6c5783856893b803189de1404","title":"FooGallery Premium","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/plugins\/foobox-image-lightbox\/free\/js\/foobox.free.min.js","\/plugins\/foogallery-premium\/pro\/extensions\/default-templates\/shared\/js\/foogallery.min.js"],"is_default":0,"condition":"foogallery-premium\/foogallery.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"7870d704-2024-4622-838c-fad37d5c6753":{"id":"plugin:ebb5efb57b19ae60e734e456ca2df3f8","title":"Formidable Forms","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","frmSigs","\/formidable-signature\/js\/frm.signature.min.js"],"is_default":0,"condition":"formidable\/formidable.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"3f24f9b3-e59e-400f-a784-999f93f60fab":{"id":"plugin:0b08523445b8869a67ca40e777704692","title":"Forminator","type":"plugin","icon":"","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","forminatorFront","\/forminator\/build\/front\/front.multi.min.js","\/forminator\/assets\/js\/library\/jquery.validate.min.js","\/forminator\/assets\/forminator-ui\/js\/forminator-form.min.js","\/forminator\/assets\/forminator-ui\/js\/select2.full.min.js","\/wp-includes\/js\/jquery\/ui\/datepicker.min.js","\/wp-includes\/js\/dist\/vendor\/moment.min.js"],"is_default":0,"condition":"forminator\/forminator.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"3a600ded-3454-48fb-9811-46afa2ab3c05":{"id":"plugin:5759bf0d47ac3457485314b381a9b528","title":"GDPR Cookie Compliance","type":"plugin","icon":"","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/gdpr-cookie-compliance\/dist\/scripts\/main.js"],"is_default":0,"condition":"gdpr-cookie-compliance\/moove-gdpr.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"e21aaa5e-7354-471d-ab86-85f99f48830c":{"id":"plugin:ffb40036ab0583218561de7c28c6bd9b","title":"GDPR Cookie Consent","type":"plugin","icon":"","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/public\/js\/cookie-law-info-public.js","Cli_Data"],"is_default":0,"condition":"webtoffee-gdpr-cookie-consent\/cookie-law-info.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"c11ca4ea-1a23-49ee-9a6b-1e549de50ea2":{"id":"plugin:3877953c5ec1e66db92ad844ae8ebafc","title":"Getwid - Gutenberg Blocks","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/wp-includes\/js\/jquery\/ui\/tabs.min.js","\/wp-includes\/js\/jquery\/ui\/core.min.js"],"is_default":0,"condition":"getwid\/getwid.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"79b33eb9-bc92-4d8a-afd8-1c61e70bed8f":{"title":"GiveWP","condition":"give\/give.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/give\/assets\/dist\/js\/give.js","\/wp-includes\/js\/dist\/api-fetch.min.js","\/wp-includes\/js\/dist\/hooks.min.js","\/wp-includes\/js\/dist\/i18n.min.js"],"icon_url":"","type":"plugin","id":"plugin:0fb3af06fc5c710a670220b054c292c5","is_default":0,"created_at":1706652232},"3773bb33-b168-4f68-9963-512da24ac4da":{"title":"GoodLayers Core","condition":"goodlayers-core\/goodlayers-core.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/goodlayers-core\/plugins\/script.js","\/goodlayers-core\/include\/js\/page-builder.js"],"icon_url":"","type":"plugin","id":"plugin:5f124509a56ca2e0644246919ec70434","is_default":0,"created_at":1704734904},"2adabe9b-6e03-4a67-959f-492813d40f69":{"title":"Google Tag Manager for WooCommerce PRO","condition":"gtm-ecommerce-woo-pro\/gtm-ecommerce-woo-pro.php","exclusions":["\/gtm-ecommerce-woo-pro\/assets\/gtm-ecommerce-woo-pro.js"],"icon_url":"","type":"plugin","id":"plugin:e54fd4313007b6fedf8ab4df0e05277a","is_default":0,"created_at":1691218549},"7bf261ac-89d4-492f-8a3d-1c5809b9579a":{"title":"Gravity Forms","condition":"gravityforms\/gravityforms.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/gravityforms\/","gform","recaptcha","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/wp-includes\/js\/plupload\/plupload.min.js","\/wp-includes\/js\/plupload\/moxie.min.js"],"icon_url":"","type":"plugin","id":"plugin:7a1c1606d094f6bff83c0ee155908367","is_default":0,"created_at":1694457903},"12340193-5c35-4b0d-b0bc-bea690cf1cae":{"id":"plugin:2f3112dd98c39aeb6bde618c9026a29f","title":"Green Forms","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","leform.min.js","leform_customjs_handlers","leform_ajax_url"],"is_default":0,"condition":"green-forms\/green-forms.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"4d20b427-47cf-4cdf-91c7-ff53602d3b2a":{"id":"plugin:0eb769dddc58f998e913345841b1d0b3","title":"GTM4WP","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","dataLayer"],"is_default":0,"condition":"duracelltomi-google-tag-manager\/duracelltomi-google-tag-manager-for-wordpress.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"a2b3c237-728c-49d6-882a-e3885444e9b4":{"id":"plugin:3b085ccda851ccf129d9506462f0cd65","title":"GTranslate","type":"plugin","icon":"","exclusions":["translate.google.com","googleTranslateElementInit"],"is_default":0,"condition":"gtranslate\/gtranslate.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"40cd9336-e73f-4a61-a7f6-27ec1ca6892c":{"id":"plugin:e1f17c1eac230219e6fec3ac07406a0d","title":"HBook","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/hbook\/","hb_booking_form_data","hb_max_date"],"is_default":0,"condition":"hbook\/hbook.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"192224c7-df72-4e3d-8f13-3206ac5b2e90":{"title":"Helper - OpenAI Chatbot for WordPress","condition":"\/helper\/index.php","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/helper\/js\/helper.min.js","mdpHelper"],"icon_url":"","type":"plugin","id":"plugin:07311d992a8a9d6af91e4766d2cb9ac9","is_default":0,"created_at":1691599768},"99cfbb2e-5678-42c2-928f-5cb09d7e43da":{"id":"plugin:269c5766fba124a838ac012a4b5a1a13","title":"HUSKY - Products Filter for WooCommerce","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/woocommerce-products-filter\/(.*)","woof"],"is_default":0,"condition":"woocommerce-products-filter\/index.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"3a964eac-4aeb-49a7-9fd6-4c31b2645dee":{"id":"plugin:d457acfec0f86aac6733f1446f4fc94f","title":"Instagram Feed Pro","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/instagram-feed-pro\/js\/sbi-scripts.min.js","sb_instagram_js_options"],"is_default":0,"condition":"instagram-feed-pro\/instagram-feed.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"8f9f4788-1b8d-468b-b291-1fcbd48618b9":{"id":"plugin:513b0c0ec8e12130af9b4bbbb17d7275","title":"Interactive Geo Maps","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/interactive-geo-maps-premium\/assets\/public\/map-service\/app.min.js","\/interactive-geo-maps\/assets\/public\/map-service\/app.js","iMapsData","cdn.amcharts.com\/lib\/"],"is_default":0,"condition":"interactive-geo-maps\/interactive-geo-maps.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"cf650ca3-afa0-4a13-9e4f-f7cca19abac6":{"title":"Ivory Search","condition":"add-search-to-menu\/add-search-to-menu.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/add-search-to-menu\/public\/js\/ivory-search.min.js"],"icon_url":"","type":"plugin","id":"plugin:7430e9d2c985ae0a3339a7b7e1acc318","is_default":0,"created_at":1677852711},"17a5dd54-1f5e-4d57-a56d-a8a970651954":{"id":"plugin:1c8a1e1ba89a601f88654f094139b469","title":"JetBlocks","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/jet-blocks\/assets\/js\/jet-blocks.min.js"],"is_default":0,"condition":"jet-blocks\/jet-blocks.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"b6f78c90-9823-459a-8dc1-1257e5f0d4e3":{"id":"plugin:dac9ec782180f33d0fcc7c4e0e569b9d","title":"JetBlog","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor-pro\/","\/elementor\/","\/jet-blog\/","ElementorProFrontendConfig","elementorFrontendConfig","hasJetBlogPlaylist"],"is_default":0,"condition":"jet-blog\/jet-blog.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"e17173d8-6ef8-4e27-ba0f-379c9aea7eda":{"id":"plugin:0fe8895d1da5247b73a5d0b482df4ac4","title":"JetElements","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/jet-elements\/","hasJetBlogPlaylist","jetElements","\/wp-includes\/js\/jquery\/ui\/"],"is_default":0,"condition":"jet-elements\/jet-elements.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"cfd77501-9c9e-4f11-b994-0178a592fc08":{"title":"JetEngine","condition":"jet-engine\/jet-engine.php","exclusions":["\/jet-engine\/"],"icon_url":"","type":"plugin","id":"plugin:bc998e71546860c8c7f70c45a6c18972","is_default":0,"created_at":1686208296},"36fed829-a2d9-41b5-94f6-2c3b9f07a94e":{"id":"plugin:433a3173f2d06f7d02c7b91c06ed215d","title":"JetMenu","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor-pro\/","\/elementor\/","\/jet-blog\/assets\/js\/lib\/slick\/slick.min.js","\/jet-elements\/","\/jet-menu\/","elementorFrontendConfig","ElementorProFrontendConfig","hasJetBlogPlaylist","JetEngineSettings","jetMenuPublicSettings","\/jet-reviews\/assets\/js\/lib\/vue.min.js"],"is_default":0,"condition":"jet-menu\/jet-menu.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"580cfed7-f034-4e39-bc7a-cdd01923ce87":{"id":"plugin:51714cfdb43f231a1c93e7cffb1007ab","title":"JetPopup","type":"plugin","icon":"","exclusions":["\/jet-popup\/assets\/js\/lib\/anime-js\/anime.min.js","\/jet-popup\/assets\/js\/jet-popup-frontend.js","\/jet-woo-builder\/","var jetPopupData"],"is_default":0,"condition":"jet-popup\/jet-popup.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"d9cd2730-12e2-42d7-a082-6f0efcd466cc":{"id":"plugin:df3bc4b6a8a9f28a5ba24cb7496bbc72","title":"JetProductGallery","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/jet-woo-product-gallery\/assets\/lib\/swiper\/swiper.min.js","\/jet-woo-product-gallery\/assets\/js\/jet-woo-product-gallery.min.js"],"is_default":0,"condition":"jet-woo-product-gallery\/jet-woo-product-gallery.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"544aa37b-4d52-4182-99e8-abe23585da14":{"id":"plugin:5921fc95965ac7fccb7296957bd9abff","title":"JetReviews","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/jet-reviews\/assets\/js\/jet-reviews-frontend.js","\/jet-reviews\/assets\/js\/lib\/vue.min.js","jetReviewsWidget"],"is_default":0,"condition":"jet-reviews\/jet-reviews.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"963c7804-eede-4570-bd63-67066588b758":{"title":"JetSearch - Search results popup","condition":"jet-search\/jet-search.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/jet-search\/assets\/lib\/chosen\/chosen.jquery.min.js","\/jet-search\/assets\/js\/jet-search.js","\/jet-search\/assets\/lib\/jet-plugins\/jet-plugins.js"],"icon_url":"","type":"plugin","id":"plugin:13e8760379022187de982df2226a5be4","is_default":0,"created_at":1708541675},"a8460089-34b4-4f8f-8694-5d92fa48aa82":{"title":"JetSmartFilters","condition":"jet-smart-filters\/jet-smart-filters.php","exclusions":["jetOffcanvasInitialized"],"icon_url":"","type":"plugin","id":"plugin:0cd63a514de1f1acb88e2bde65c4bc8d","is_default":0,"created_at":1694447256},"fe3c4915-6f8b-49b7-aa9c-c97b264d9f12":{"id":"plugin:a346b60514ef52afeffc6e2ef2793da3","title":"JetSticky","type":"plugin","icon":"","exclusions":["\/jetsticky-for-elementor\/"],"is_default":0,"condition":"jetsticky-for-elementor\/jetsticky-for-elementor.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"853479dc-fff5-47cf-9a60-bf9b00f71fc4":{"title":"JetTabs for Elementor","condition":"jet-tabs\/jet-tabs.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/elementor\/","\/elementor-pro\/","\/wp-includes\/js\/imagesloaded.min.js","ElementorProFrontendConfig","elementorFrontendConfig","\/wp-content\/plugins\/jet-tabs\/assets\/js\/jet-tabs-frontend.min.js"],"icon_url":"","type":"plugin","id":"plugin:d887a6ffea25d759e8aecdb6b78917f7","is_default":0,"created_at":1697130971},"b7f89562-230c-4f63-8360-7aad6df31e02":{"id":"plugin:829272546b040d5aaeeeaf976b6cd4ec","title":"JetTricks","type":"plugin","icon":"","exclusions":["\/jet-tricks\/"],"is_default":0,"condition":"jet-tricks\/jet-tricks.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"90451e2a-553a-4496-9fa4-cffedbe69d43":{"id":"plugin:f44f3dbd09149f57db370e4132b057db","title":"JetWoo Widgets For Elementor","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/jetwoo-widgets-for-elementor\/assets\/js\/jet-woo-widgets.js","\/jet-woo-builder\/assets\/js\/jet-woo-builder.min.js","\/jet-woo-builder\/assets\/js\/frontend.min.js","\/wp-includes\/js\/imagesloaded.min.js"],"is_default":0,"condition":"jet-woo-builder\/jet-woo-builder.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"944718c2-48c6-4f53-aaa2-460d07e033cc":{"id":"plugin:ed318a971f8a047bed5b02ad546a9c18","title":"JetWooBuilder","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/dist\/hooks.min.js","\/wp-includes\/js\/dist\/i18n.min.js","\/elementor-pro\/","\/elementor\/","elementorFrontendConfig","ElementorProFrontendConfig","JetEngineSettings","\/jet-woo-builder\/","\/jet-woo-builder-custom-quantity-selectors-main\/assets\/js\/main.js"],"is_default":0,"condition":"jet-woo-builder\/jet-woo-builder.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"f5b62f59-1dae-4cdf-ac3f-f5e846fc9918":{"id":"plugin:9562e253cd4ac2b1e1f70e32cb4e32dc","title":"Layer Slider","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/LayerSlider\/assets\/static\/layerslider\/js\/layerslider.utils.js","\/LayerSlider\/assets\/static\/layerslider\/js\/layerslider.kreaturamedia.jquery.js","\/LayerSlider\/assets\/static\/layerslider\/js\/layerslider.transitions.js","initLayerSlider"],"is_default":0,"condition":"LayerSlider\/layerslider.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"e2be718d-83a2-4fa0-bc98-f0df52be3dc1":{"id":"plugin:1425e2735306796fe1539d9184a77e10","title":"LoftLoader Pro","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","loftloader.min.js"],"is_default":0,"condition":"loftloader-pro\/loftloader-pro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"cfa18552-656e-453c-9e14-c07522dc6598":{"id":"plugin:0bf67b8ba84771e1a367fe24590ef09c","title":"MailUp for WordPress","type":"plugin","icon":"","exclusions":["\/mailup-email-and-newsletter-subscription-form\/public\/js\/mailup-public.js","mailup-js-extra"],"is_default":0,"condition":"mailup-email-and-newsletter-subscription-form\/mailup.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"c5330c66-ba7b-45b1-87e4-ce590ab005dd":{"id":"plugin:10d0de28911c5f66463b9c8783f8148a","title":"Maintenance","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/maintenance\/"],"is_default":0,"condition":"maintenance\/maintenance.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"267aef71-afa0-4848-b6f8-3e1ca15c3a23":{"id":"plugin:9460789bdfe77425c895f130991a4cb4","title":"Maps Marker Pro","type":"plugin","icon":"","exclusions":["\/maps-marker-pro\/js\/mapsmarkerpro.js","var mapsMarkerPro"],"is_default":0,"condition":"maps-marker-pro\/maps-marker-pro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"b5a88b63-e906-49b3-8134-420139915ea6":{"title":"Master Popups","condition":"master-popups\/master-popups.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/plugins\/master-popups\/assets\/public\/js\/master-popups-libs.min.js"],"icon_url":"","type":"plugin","id":"plugin:8fd7bd2c8b0a33e62798573abd12be63","is_default":0,"created_at":1681305305},"4be41549-bf4d-4c49-8346-0f8a3b88fdba":{"id":"plugin:de888634cc4bd51576eed319d5a528fd","title":"Master Slider","type":"plugin","icon":"","exclusions":["masterslider"],"is_default":0,"condition":"master-slider\/master-slider.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"087bee18-7cd1-4c10-8acc-19e1b7c4f4cd":{"id":"plugin:b71309a89bf3c8b558b6fca5d6531919","title":"Max Mega Menu","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/hoverIntent.min.js","\/megamenu\/js\/maxmegamenu.js","var megamenu"],"is_default":0,"condition":"megamenu\/megamenu.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"cf22f0b9-01f4-409e-8a93-ad6743095abd":{"id":"plugin:94a7bae84ef2816494be4af66c577bfc","title":"Meta Slider","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/ml-slider\/","var metaslider"],"is_default":0,"condition":"ml-slider\/ml-slider.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"bb2cbc0d-20da-415e-8218-c17f1db53579":{"title":"Monarch","condition":"monarch\/monarch.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","dt-place-monarch-icons"],"icon_url":"","type":"plugin","id":"plugin:b7335d6d6d5c5134ea10ac2d9b04226c","is_default":0,"created_at":1677853476},"a98d6a80-4610-4ede-bd33-c3e15bed0a95":{"id":"plugin:4f8651262425ef6d7c223c68a2ec2063","title":"Monster Insights","type":"plugin","icon":"","exclusions":["__gtagTracker","monsterinsights_frontend","\/google-analytics-for-wordpress\/assets\/js\/frontend-gtag.min.js"],"is_default":0,"condition":"google-analytics-for-wordpress\/googleanalytics.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"26e1a36e-7a03-449e-8ecc-e42c41ca291c":{"id":"plugin:f8fc66b302dec2327bdec0434a3b275b","title":"Motion.page","type":"plugin","icon":"","exclusions":["\/motionpage\/core\/includes\/assets\/js\/(.*)","\/motionpage\/core\/includes\/assets\/js\/gsap\/(.*)","\/motionpage\/assets\/js\/(.*)","\/motionpage\/assets\/js\/gsap\/(.*)"],"is_default":0,"condition":"motionpage\/motionpage.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"459fd663-7f80-45fd-8308-d3484981e161":{"title":"Ninja Forms","condition":"ninja-forms\/ninja-forms.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/underscore.min.js","\/wp-includes\/js\/backbone.min.js","\/wp-includes\/js\/jquery\/ui\/core.min.js","\/ninja-forms\/assets\/js\/min\/front-end-deps.js","\/ninja-forms\/assets\/js\/min\/front-end.js","nf-"],"icon_url":"","type":"plugin","id":"plugin:1d3ae9c1a96d5062616968b81eef319d","is_default":0,"created_at":1703190792},"c97440dd-7592-40e7-8c98-dac20d39808f":{"id":"plugin:723a588dcd49285ea9f7404e2379b47f","title":"Ninja Tables","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/ninja-tables(.*)\/assets\/","\/ninja-tables(.*)\/public\/","\/wp-includes\/js\/dist\/vendor\/moment.min.js","ninja_table_instance_","ninja_filter_","ninja_table_ready_init_table_id"],"is_default":0,"condition":"ninja-tables\/ninja-tables.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"ebc01f06-8c35-47fa-9c63-8959c5cbd915":{"id":"plugin:f41a52ab1dd50a81cd3a5e341af0007c","title":"NotificationX","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/notificationx\/assets\/public\/js\/(.*).js","notificationXArr"],"is_default":0,"condition":"notificationx\/notificationx.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"3aaf4a1b-591a-48b7-8d60-e6d65c0f94c9":{"id":"plugin:be8fc72a8b8e8eb5958be13737cff47c","title":"Ocean Elementor Widgets","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/ocean-elementor-widgets\/"],"is_default":0,"condition":"ocean-elementor-widgets\/ocean-elementor-widgets.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"f053a7d3-62b0-4312-b0ca-6ff63380eb0b":{"id":"plugin:1a14afe852fefe7b22ccad3893672a29","title":"One Click Accessibility","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/pojo-accessibility\/assets\/js\/app.min.js"],"is_default":0,"condition":"pojo-accessibility\/pojo-accessibility.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"61e11800-48a9-4354-8a4c-ac9a2b4b033a":{"id":"plugin:b9ed0fe6f2cdbd305691a6b857f4b3dc","title":"OoohBoi Steroids for Elementor","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/ooohboi-steroids-for-elementor\/"],"is_default":0,"condition":"ooohboi-steroids-for-elementor\/ooohboi-steroids.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"560b78a2-f051-490b-9dc6-a602dece0d81":{"id":"plugin:f1ff18a3e04c4e0995fca9cabffe57a7","title":"Optimole","type":"plugin","icon":"","exclusions":["optimoleData"],"is_default":0,"condition":"optimole-wp\/optimole-wp.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"b0fda458-4bf2-41e9-a159-60d4bb6102a6":{"id":"plugin:48ec18bd3f59772d98f85dddab75e305","title":"OSM - OpenStreetMap","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/osm\/js\/OL\/","\/osm\/js\/osm-v3-plugin-lib.js","vectorM"],"is_default":0,"condition":"osm\/osm.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"3743ed67-e0d1-4243-bb1f-ee48a445dd10":{"id":"plugin:9eacf0b76484af0259cd788f4923f20c","title":"OxyExtras","type":"plugin","icon":"","exclusions":["vime","vime.esm.js"],"is_default":0,"condition":"oxyextras\/plugin.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"52a21e27-af5b-4476-8d6d-54c323fd1443":{"id":"plugin:e852555c4b4789d78a96d76f503b3262","title":"Oxygen Builder","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/component-framework\/vendor\/aos\/aos.js","AOS.init","oxygen_init_pro_menu","oxy-pro-menu-show-dropdown","oxy-shape-divider","oxygenVSBInitToggleJs"],"is_default":0,"condition":"oxygen\/functions.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"ebd282b9-e175-4b83-90a2-fe12389ccd11":{"id":"plugin:6f9419e58ec86c94e7698aaaaf9dc715","title":"PageLoader by Bonfire","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/pageloader-by-bonfire\/pageloader.js","bonfire-pageloader-overlay"],"is_default":0,"condition":"pageloader-by-bonfire\/pageloader-by-bonfire.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"0baf6353-aa70-41a9-a3bc-d89870a5839b":{"id":"plugin:3a4c4518eb0f60108ab4934fab27d335","title":"PDF Embedder","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/pdf-embedder\/js\/(.*).js"],"is_default":0,"condition":"pdf-embedder\/pdf_embedder.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"cba51ec1-87cc-44eb-b12b-d652e3446507":{"id":"plugin:4f90aca5957cccbf623e3bbc31afa204","title":"Perfect Brands for WooCommerce","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/perfect-woocommerce-brands\/assets\/lib\/slick\/slick.min.js","\/perfect-woocommerce-brands\/assets\/js\/functions-frontend.min.js"],"is_default":0,"condition":"perfect-woocommerce-brands\/perfect-woocommerce-brands.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"808e7a4e-025c-4fae-bf82-de3716e5eb0d":{"id":"plugin:84fe214646388d7c021dda25003ac165","title":"Photonic","type":"plugin","icon":"","exclusions":["\/photonic\/include\/js\/front-end\/module\/photonic-baguettebox.min.js"],"is_default":0,"condition":"photonic\/photonic.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"936aff7d-a8ac-4473-a7b5-4b1611b6c557":{"id":"plugin:6838be282f853f71be282783cb1c162b","title":"Pixel Caffein","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/pixel-caffeine\/build\/frontend.js","aepc_pixel"],"is_default":0,"condition":"pixel-caffeine\/pixel-caffeine.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"ab3a4ef5-2732-4b46-a7c3-17b4e9405cd1":{"id":"plugin:afe0eb7c64d4556a7111c56dd8c4d307","title":"Pixel Manager for WooCommerce","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/woocommerce-pixel-manager-pro\/js\/public\/","wpm"],"is_default":0,"condition":"woocommerce-pixel-manager-pro\/woocommerce-pixel-manager.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"2774f964-50b2-425e-8a30-0a02f421b7e4":{"id":"plugin:38d4b2986868f543639cd1ebc3e510aa","title":"Popup Builder","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/popup-builder\/public\/js\/(.*).js","\/popupbuilder-exit-intent\/public\/javascript\/ExitIntent.js","var sgpbPublicUrl","SGPB_POPUP_PARAMS"],"is_default":0,"condition":"popup-builder\/popup-builder.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"82dbb1e5-31f9-43d7-b522-52819aa49ba5":{"id":"plugin:786717922362642f34a7ff58e919bd95","title":"Popup Maker","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/jquery\/ui\/core.min.js","\/pum\/pum-site-scripts.js","pum","\/plugins\/popup-maker\/assets\/js\/site.min.js"],"is_default":0,"condition":"popup-maker\/popup-maker.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"48e08305-1f1c-4ef4-9f13-24af1b155abc":{"id":"plugin:17831cbb64e469c7f66224c8c63d0a58","title":"PowerPack Addons for Elementor","type":"plugin","icon":"","exclusions":["\/powerpack-lite-for-elementor\/assets\/js\/min\/frontend.min.js"],"is_default":0,"condition":"powerpack-lite-for-elementor\/powerpack-lite-elementor.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"e037ae2f-e36b-4f1a-ada8-eb8fde6746f2":{"id":"plugin:80e1283ea1afead3ca904fad792643c5","title":"Preloader Plus","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/preloader-plus\/(.*)"],"is_default":0,"condition":"preloader-plus\/preloader-plus.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"90fed478-e89a-455c-8371-836bee58fb81":{"title":"Premium Addons for Elementor","condition":"premium-addons-for-elementor\/premium-addons-for-elementor.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/premium-addons-for-elementor\/assets\/frontend\/min-js\/premium-addons.min.js","\/premium-addons-for-elementor\/assets\/frontend\/min-js\/isotope.min.js","\/premium-addons-elementor\/pa-frontend-(.*).min.js","\/premium-addons-for-elementor\/assets\/frontend\/min-js\/slick.min.js","\/premium-addons-pro\/assets\/frontend\/min-js\/tooltipster.min.js","window.scopes_array","lottie.min.js","\/premium-addons-for-elementor\/assets\/frontend\/min-js\/premium-nav-menu.min.js"],"icon_url":"","type":"plugin","id":"plugin:debbfbbcbdf9ffb465bbc40008d99f02","is_default":0,"created_at":1693315214},"7e43c261-77be-48fc-b25a-8953a654ae85":{"id":"plugin:100a0382fcf3d1b6b22da928bce46ea8","title":"Presto Player","type":"plugin","icon":"","exclusions":["\/wp-includes\/js\/dist\/vendor\/regenerator-runtime.min.js","\/presto-player\/dist\/components\/web-components\/web-components.esm.js","\/presto-player\/src\/player\/player-static.js","var player","\/wp-includes\/js\/dist\/api-fetch.min.js","\/wp-includes\/js\/dist\/hooks.min.js","\/wp-includes\/js\/dist\/i18n.min.js"],"is_default":0,"condition":"presto-player\/presto-player.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"3d6f509f-d040-4279-9a2f-a4e6eae1e9df":{"id":"plugin:c0fce700121492b566517e68301db382","title":"Price Based on Country for WooCommerce Pro","type":"plugin","icon":"","exclusions":["\/woocommerce-product-price-based-on-countries\/assets\/js\/ajax-geolocation.min.js","\/woocommerce-price-based-country-pro-addon\/assets\/js\/currency-switcher.min.js","add-to-cart.min.js","cart-fragments.min.js"],"is_default":0,"condition":"woocommerce-price-based-country-pro-addon\/woocommerce-price-based-country-pro-addon.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"b970bc8a-bcbe-4d08-8ac0-a6853ab3f036":{"id":"plugin:f1ecfe258440b371124999ca3bfbfff3","title":"Prime Slider","type":"plugin","icon":"","exclusions":["\/plugins\/bdthemes-prime-slider-lite\/assets\/js\/bdt-uikit.min.js"],"is_default":0,"condition":"bdthemes-prime-slider-lite\/bdthemes-prime-slider.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"e5458963-f167-4b68-88e4-77dd39af2842":{"id":"plugin:29ea8f4dd72f5a5c5927917fb0665a05","title":"PRO Elements","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/pro-elements\/"],"is_default":0,"condition":"pro-elements\/pro-elements.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"b119ad72-f498-4576-bb71-9e6d8c37b68f":{"title":"Product Filter by WBW (for WooCommerce)","condition":"woo-product-filter\/woo-product-filter.php","exclusions":["\/jquery-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?$","\/jquery-migrate(.*)(.min|.slim|.slim.min)?.js(\\?(.*))?$","\/wp-content\/plugins\/woo-product-filter\/modules\/woofilters\/js\/frontend.woofilters.js","\/wp-includes\/js\/jquery\/ui\/mouse.min.js","\/wp-includes\/js\/jquery\/ui\/core.min.js","\/wp-includes\/js\/jquery\/ui\/slider.min.js"],"icon_url":"","type":"plugin","id":"plugin:e57ad91e0d94fab011353af544873743","is_default":0,"created_at":1685686062},"7b779aca-e497-4da3-8e51-fa12837d15ab":{"title":"Product Filters for WooCommerce","condition":"woocommerce-product-filters\/woocommerce-product-filters.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/woocommerce-product-filters\/","\/woocommerce\/assets\/js\/accounting\/accounting.min.js","\/wp-includes\/js\/jquery\/ui\/","wcpf-load-project","WCPFData"],"icon_url":"","type":"plugin","id":"plugin:719469f1c977f7109d3d6ee21ecd5a16","is_default":0,"created_at":1691235154},"2b2a51f2-bd47-4591-92d8-4a690bce5d99":{"id":"plugin:a898898b2b0ea2cd82e20a6d3a3aa47b","title":"Product Gallery Slider for WooCommerce","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/twist\/assets\/js\/slick.min.js","wpgs-public-js-after"],"is_default":0,"condition":"twist\/twist.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"062c5be3-e5ea-4958-9619-44e3410f237e":{"title":"Product Video Gallery for Woocommerce","condition":"product-video-gallery-slider-for-woocommerce\/product-video-gallery-slider-for-woocommerce.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/product-video-gallery-slider-for-woocommerce\/public\/js\/nickx.front.js"],"icon_url":"","type":"plugin","id":"plugin:bbc653a91f0635cd2edb0b741aa62b85","is_default":0,"created_at":1693512477},"34d225a4-688c-476b-846b-420774160d6b":{"id":"plugin:e0b123d324c6fc85b8682660c34f8829","title":"Rank Math SEO","type":"plugin","icon":"","exclusions":["local_ga_js"],"is_default":0,"condition":"seo-by-rank-math\/rank-math.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"02305ca0-2c2a-4eef-a802-b8a942771ecc":{"title":"Retainful","condition":"retainful-next-order-coupon-for-woocommerce\/retainful-next-order-coupon-for-woocommerce.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/retainful-next-order-coupon-for-woocommerce\/src\/premium\/assets\/js\/atc-popup.min.js","\/retainful-next-order-coupon-for-woocommerce\/src\/premium\/assets\/js\/exit-intent-popup.js","retainful.com","rnoc-add-to-cart-js-before","rnoc_redirect_coupon_popup"],"icon_url":"","type":"plugin","id":"plugin:f9fdee19ba6aed961d96d86e1521a761","is_default":0,"created_at":1679331508},"b4055250-5813-400f-b663-d390fee989e4":{"id":"plugin:d6a4d07d1b4022d886df52322dcd8a6f","title":"Revolution Slider","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/revslider\/public\/assets\/js\/","\/revslider-(.*)-addon\/","setREVStartSize","rev_slider_","revslider_","window.RS_MODULES"],"is_default":0,"condition":"revslider\/revslider.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"0b4e061a-b366-4d5a-a00e-bded4b107133":{"title":"Royal Elementor Addons","condition":"royal-elementor-addons\/wpr-addons.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/royal-elementor-addons\/assets\/js\/frontend.min.js","\/royal-elementor-addons\/assets\/js\/lib\/jarallax\/jarallax.min.js"],"icon_url":"","type":"plugin","id":"plugin:c4b464373716d7ac8e3cfb019aaa6102","is_default":0,"created_at":1688124503},"1b19ec89-171a-4f85-8c4b-b1bcfc6b1433":{"id":"plugin:5e3f85d8c82cc184b945415d1a862601","title":"Sassy Social Share","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/sassy-social-share\/public\/js\/sassy-social-share-public.js","heateorSssLoadEvent"],"is_default":0,"condition":"sassy-social-share\/sassy-social-share.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"f5899925-2ab7-43b6-abc4-51b76d664ca6":{"title":"Scrollsequence","condition":"scrollsequence-pro\/scrollsequence-pro.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/scrollsequence-pro\/public\/js\/gsap__premium_only.js","\/scrollsequence-pro\/public\/js\/gsap-scrolltrigger__premium_only.js","\/scrollsequence-pro\/public\/js\/ssq-lib__premium_only.js","scrollsequence-input-script"],"icon_url":"","type":"plugin","id":"plugin:3df51830b6b80668fc342c8dcea495cf","is_default":0,"created_at":1678111131},"043827fc-3df8-45d6-9cd2-14fbe962987a":{"id":"plugin:9d60b5d2de4d828b78c7b088024377d6","title":"ShiftNav Pro - Responsive Mobile Menu","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/shiftnav-pro\/assets\/js\/shiftnav(.*).js"],"is_default":0,"condition":"shiftnav-pro\/shiftnav.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"bcbaf240-e76f-4620-b7d5-4852c46d4be7":{"id":"plugin:56279bd768c8f27ad1972b6774738bcf","title":"ShiftNav \u2013 Responsive Mobile Menu","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/shiftnav-responsive-mobile-menu\/"],"is_default":0,"condition":"shiftnav-responsive-mobile-menu\/shiftnav-responsive-mobile-menu.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"bbe0543b-b5af-467b-a90d-e2975d892d8d":{"title":"Short Pixel Adaptive Image","condition":"shortpixel-adaptive-images\/short-pixel-ai.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/shortpixel-adaptive-images\/assets\/js\/ai(.*).min.js","spai_settings"],"icon_url":"","type":"plugin","id":"plugin:1bc7ac87d8ab2301a1b904919dc7a798","is_default":0,"created_at":1704734942},"543ab43a-6bd3-4948-a09e-3b95e7c9209d":{"title":"Showcase IDX","condition":"showcase-idx\/showcaseidx.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","SIDX","search.showcaseidx.com\/js\/app-(.*).js","cdn.shortpixel.ai"],"icon_url":"","type":"plugin","id":"plugin:ce4dea8ddc3caa8d00e95cec3202d32a","is_default":0,"created_at":1704734988},"a16bcab7-1169-46b9-a425-b091478d8312":{"id":"plugin:3ea7d9f75ad03620b0bce2517bd5b8d1","title":"Side Cart WooCommerce","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/plugins\/woocommerce\/assets\/js\/frontend\/cart-fragments.min.js","\/plugins\/woocommerce\/assets\/js\/frontend\/add-to-cart.min.js","\/plugins\/woocommerce\/assets\/js\/jquery-blockui\/jquery.blockUI.min.js","\/plugins\/woocommerce\/assets\/js\/js-cookie\/js.cookie.min.js"],"is_default":0,"condition":"side-cart-woocommerce\/xoo-wsc-main.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"521f748e-cf09-4019-bd28-b52daef5f16f":{"id":"plugin:7843983bf90dbae16c6e889382c71b23","title":"Simple Banner","type":"plugin","icon":"","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/simple-banner\/","simpleBannerScriptParams"],"is_default":0,"condition":"simple-banner\/simple-banner.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"76026e82-d9cf-482c-b480-55c57693a184":{"id":"plugin:b6825f971d35a5515d095564a2e40936","title":"Site Kit by Google","type":"plugin","icon":"","exclusions":["google-analytics.com\/analytics.js","ga\\( '","ga\\('","\/gtag\/js","gtag\\(","\/gtm.js"],"is_default":0,"condition":"google-site-kit\/google-site-kit.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"79c458d7-f7f7-4072-919d-ad337bde6ae3":{"title":"Slick Menu","condition":"slick-menu\/slick-menu.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/slick-menu\/"],"icon_url":"","type":"plugin","id":"plugin:5ce5dfecdc9d3292c69a1413bbd17d3c","is_default":0,"created_at":1704735027},"99cf4942-49ea-4687-b156-405ed1ce1cfa":{"title":"Slide Anything","condition":"slide-anything\/slide-anything.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/slide-anything\/owl-carousel\/owl.carousel.min.js","owl_goto.trigger"],"icon_url":"","type":"plugin","id":"plugin:fff874cc48b80940210228c975df395c","is_default":0,"created_at":1702907355},"dd0ea584-0c99-4c30-b46d-da35b94c9f0a":{"title":"Slider by Soliloquy","condition":"soliloquy-lite\/soliloquy-lite.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","soliloquy-min.js","soliloquy_slider"],"icon_url":"","type":"plugin","id":"plugin:ffb5f8cc0ea17886dbd05f601ca3eec0","is_default":0,"created_at":1704735068},"ecb2fffc-d289-4f68-ae94-71131f17deee":{"title":"Smart Slider 3","condition":"smart-slider-3\/smart-slider-3.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/smart-slider-3\/(.*).js","_N2"],"icon_url":"","type":"plugin","id":"plugin:2f373822dceb191c31c8ad2183d51869","is_default":0,"created_at":1704735119},"284ede43-bf80-419e-8414-46c26cb746f0":{"title":"Smart Slider 3 Pro","condition":"nextend-smart-slider3-pro\/nextend-smart-slider3-pro.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/SmartSlider3\/(.*).js","_N2"],"icon_url":"","type":"plugin","id":"plugin:720ec9fbbd8a52ce525959a68a5310b3","is_default":0,"created_at":1704735152},"be70034f-def5-4771-9b3f-662eb218da2a":{"title":"Spectra - Show Slider Images","condition":"ultimate-addons-for-gutenberg\/ultimate-addons-for-gutenberg.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/ultimate-addons-for-gutenberg\/assets\/js\/spectra-animations.min.js","\/ultimate-addons-for-gutenberg\/assets\/js\/post.min.js","\/ultimate-addons-for-gutenberg\/assets\/js\/aos.min.js","\/slick.min.js","\/imagesloaded.min.js","UAGBPostCarousel"],"icon_url":"","type":"plugin","id":"plugin:af16af31f83a874b9d0a9570d9c15ff7","is_default":0,"created_at":1706824485},"c3334c29-4160-42df-a1ce-f8aeeaee8668":{"title":"Super Socializer","condition":"super-socializer\/super_socializer.php","exclusions":["theChamp","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js"],"icon_url":"","type":"plugin","id":"plugin:660defe26748470c3a47366cd4012579","is_default":0,"created_at":1677853633},"f18b4242-fe3f-4e2b-bfc9-ac2fb3939a90":{"title":"Superfly Menu","condition":"superfly-menu\/main.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate((.*?)(.min?)?).js","\/superfly-menu\/includes\/vendor\/looks_awesome\/icon_manager\/js\/md5.js","\/superfly-menu\/includes\/vendor\/looks_awesome\/icon_manager\/js\/util.js","\/superfly-menu\/js\/public.min.js","window.SFM_is_mobile","var SFM_skew_disabled","var SFM_template"],"icon_url":"","type":"plugin","id":"plugin:ccb15175093bc6c437b78797f0698a7b","is_default":0,"created_at":1684301673},"1a05c00a-8562-45bc-80e8-987a4574b1c9":{"title":"Symplr Ads","condition":"symplr-ads\/symplr-plugin.php","exclusions":["\/symplr-ads\/","cdns.symplr.de"],"icon_url":"","type":"plugin","id":"plugin:3b6d39e28a87e86c4659491e2368ff61","is_default":0,"created_at":1692199959},"858d2d7f-bdac-4d27-ba26-baa9ace96ba4":{"id":"plugin:7d93008296bb5c7c43d4cba185ed2632","title":"Tabby Responsive Tabs","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/tabby-responsive-tabs\/js\/tabby.js","RESPONSIVEUI"],"is_default":0,"condition":"tabby-responsive-tabs\/tabby-responsive-tabs.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"e44a5c93-bb77-4624-a121-d846905137ea":{"id":"plugin:2f563bbb7e92363ec3fb2989a1c7dffe","title":"The Plus Addons for Elementor","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/theplus-addons\/(.*)"],"is_default":0,"condition":"the-plus-addons-for-elementor-page-builder\/theplus_elementor_addon.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"2bbac961-b000-4802-ae97-d52472ec6750":{"title":"The Plus Addons for Elementor Premium","condition":"theplus_elementor_addon\/theplus_elementor_addon.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/wp-content\/plugins\/theplus_elementor_addon\/","\/elementor\/","\/elementor-pro\/","\/wp-includes\/js\/imagesloaded.min.js","ElementorProFrontendConfig","elementorFrontendConfig"],"icon_url":"","type":"plugin","id":"plugin:6e127deaaeefbe57ff945b1f9e274518","is_default":0,"created_at":1688143611},"666b45e8-749c-4140-bd17-e1cd589e03ee":{"id":"plugin:b9c418b47c986935a1151ab9b42f8971","title":"ThemeREX Addons","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/trx_addons\/js\/__scripts-full.js","\/trx_addons\/components\/cpt\/layouts\/shortcodes\/menu\/superfish.min.js"],"is_default":0,"condition":"trx_addons\/trx_addons.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"a750cada-eb58-4df4-9966-21c8a69332ba":{"id":"plugin:75af9efe22c5cc776636266feb55adf1","title":"Thrive Architect","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js"],"is_default":0,"condition":"thrive-visual-editor\/thrive-visual-editor.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"13714cde-680e-4ca4-8607-c35952d6a5f2":{"title":"Thrive Comments","condition":"thrive-comments\/thrive-comments.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/thrive-leads\/","window.TL_Const","var ml=","\/thrive-comments\/assets\/js\/","ThriveComments","\/wp-includes\/js\/underscore.min.js","\/wp-includes\/js\/backbone.min.js"],"icon_url":"","type":"plugin","id":"plugin:6a72d06ca2f6a888b0d9d5ea93af2edc","is_default":0,"created_at":1677852974},"aa7ca898-499f-4f04-b419-3de199996969":{"id":"plugin:b84d82c02cade64ade00712b9c5652aa","title":"Thrive Leads","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/thrive-leads\/","window.TL_Const","var ml=","\/thrive-comments\/assets\/js\/","ThriveComments","\/wp-includes\/js\/underscore.min.js","\/wp-includes\/js\/backbone.min.js"],"is_default":0,"condition":"thrive-leads\/thrive-leads.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"9eee297a-8241-4ef2-af97-46074bd0898c":{"id":"plugin:5bb61b0559b0a3fd578315b553451327","title":"Thrive Quiz Builder","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js"],"is_default":0,"condition":"thrive-quiz-builder\/thrive-quiz-builder.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"c2f3ec2a-5b09-4845-aa95-84841783fbfc":{"id":"plugin:a7f3e5206abff19ca7cf142260181738","title":"Thrive Ultimatum","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/thrive-ultimatum\/","var TVE_Ult_"],"is_default":0,"condition":"thrive-ultimatum\/thrive-ultimatum.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"d48b8d2f-e071-4a30-840a-306154a115a0":{"id":"plugin:f57be2014b6a489d053f8367fa6c0f9f","title":"Tidio Chat","type":"plugin","icon":"","exclusions":["document.tidioChatCode"],"is_default":0,"condition":"tidio-live-chat\/tidio-elements.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"cb6d33ed-7eb4-4ff9-9ad0-7fc54fbecf6f":{"id":"plugin:c9e0485ec256d4a6a8d92a98c18d76fc","title":"Toolset Blocks","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","toolsetCommonEs.fontToHead","toolsetCommonEs.styleToHead","\/toolset-blocks\/vendor\/toolset\/blocks\/public\/js\/frontend.js","\/toolset-blocks\/vendor\/toolset\/common-es\/public\/toolset-common-es-frontend.js","\/toolset-blocks\/public\/js\/views-frontend.js","\/wp-includes\/js\/underscore.min.js"],"is_default":0,"condition":"toolset-blocks\/wp-views.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"4bac6350-0925-49fb-904a-372f22fd6baf":{"id":"plugin:71beda322b37f7fc7d456822493cb972","title":"Top Bar Pro","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/plugins\/topbar-pro\/js\/tpbr_front.min.js","\/plugins\/topbar-pro\/js\/jquery.cookie.js"],"is_default":0,"condition":"topbar-pro\/topbar_pro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"033486e7-0ddc-4915-a848-31504d00448e":{"title":"Twenty20 Image Before-After","condition":"twenty20\/ttwenty.php","exclusions":["\/twenty20\/assets\/js\/(.*).js","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","twentytwenty-container"],"icon_url":"","type":"plugin","id":"plugin:23441bba9d3602bc932d697c7cb8aa1f","is_default":0,"created_at":1677858089},"7675a34d-006e-4672-99d5-a81e1b8e47f9":{"id":"plugin:3d59cc34167a7f8123e66b627148e0b7","title":"UberMenu","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/ubermenu\/assets\/js\/ubermenu.min.js"],"is_default":0,"condition":"ubermenu\/ubermenu.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"8233178a-e7b3-43ce-b193-bd0d9c960933":{"id":"plugin:86424c46157c1c7e2e1571055813beee","title":"Ultimate Addons for Elementor","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/ultimate-elementor\/assets\/lib\/slick\/slick.min.js","\/ultimate-elementor\/assets\/min-js\/uael-frontend.min.js","\/ultimate-elementor\/assets\/lib\/isotope\/isotope.min.js","\/ultimate-elementor\/assets\/lib\/jquery-element-resize\/jquery_resize.min.js","\/ultimate-elementor\/assets\/lib\/fancybox\/jquery_fancybox.min.js","\/ultimate-elementor\/assets\/lib\/justifiedgallery\/justifiedgallery.min.js","\/elementor-pro\/assets\/js\/frontend.min.js","\/wp-includes\/js\/imagesloaded.min.js","\/js_composer\/assets\/js\/dist\/js_composer_front.min.js","\/elementor\/assets\/lib\/swiper\/swiper.min.js","\/nasa-core\/assets\/js\/min\/jquery.slick.min.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig"],"is_default":0,"condition":"ultimate-elementor\/ultimate-elementor.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"8bddf484-6c78-4147-a4e6-d3039904e5f6":{"title":"Ultimate Addons for Elementor - Mobile Menu","condition":"ultimate-elementor\/ultimate-elementor.php","exclusions":["\/jquery-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?$","\/jquery-migrate(.*)(.min|.slim|.slim.min)?.js(\\?(.*))?$","\/ultimate-elementor\/assets\/js\/uael-nav-menu.js","\/ultimate-elementor\/assets\/min-js\/uael-nav-menu.min.js"],"icon_url":"","type":"plugin","id":"plugin:70cfade3a7adbb54196f6acccc5a176f","is_default":0,"created_at":1694771327},"028504f7-b1cd-4318-8a6d-ce186197e89d":{"id":"plugin:0f0a91f0c454021a5ff9fc25c3ed419f","title":"Ultimate Addons for WPBakery Page Builder","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/Ultimate_VC_Addons\/assets\/"],"is_default":0,"condition":"Ultimate_VC_Addons\/Ultimate_VC_Addons.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"5754af3d-a6af-49eb-b731-bdd82f26dc4e":{"id":"plugin:34db8636812bad84c8aea037c2ddc8c2","title":"Ultimate Responsive Image Slider","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","sliderPro"],"is_default":0,"condition":"ultimate-responsive-image-slider\/ultimate-responsive-image-slider.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"78ae882d-ae31-4179-b677-8893814938c7":{"title":"Unlimited Elements for Elementor Premium - Slider","condition":"unlimited-elements-for-elementor-premium\/unlimited-elements-pro.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/unlimited-elements-for-elementor-premium\/","uc_"],"icon_url":"","type":"plugin","id":"plugin:17260bc347b8c29bee0010e9ec164184","is_default":0,"created_at":1683270377},"051cbfbb-7ad2-4f06-a493-3cf423a80904":{"id":"plugin:6717ef5673a956bc08ca4a5117065d53","title":"Variation Swatches for WooCommerce","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/jquery\/ui\/","\/woo-variation-swatches\/","\/woo-variation-swatches-pro\/","underscore.min.js"],"is_default":0,"condition":"woo-variation-swatches\/woo-variation-swatches.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"6879caba-7224-4eca-bcb2-370785b495ea":{"id":"plugin:57597b7683e01892932083413f085134","title":"Web Accessibility By accessiBe","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/accessibe\/","acsbJS"],"is_default":0,"condition":"accessibe\/accessiebe.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"bd6732fe-4c2b-40a1-9035-8464057e2da5":{"title":"WooCommerce - Cart Fragments","condition":"woocommerce\/woocommerce.php","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/woocommerce\/assets\/js\/frontend\/cart-fragments.min.js","\/woocommerce\/assets\/js\/js-cookie\/js.cookie.min.js"],"icon_url":"","type":"plugin","id":"plugin:201de694c6fc28c8d580a3b2ca484218","is_default":0,"created_at":1680937567},"d044900d-07e1-4533-9516-33106efcb259":{"title":"WooCommerce - Product description","condition":"woocommerce\/woocommerce.php","exclusions":["\/plugins\/woocommerce\/assets\/js\/frontend\/single-product.min.js","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js"],"icon_url":"","type":"plugin","id":"plugin:a82644b4c9417ea3a240939a73344700","is_default":0,"created_at":1679309756},"bff953b1-2213-4666-8112-76a84a3cc207":{"title":"WooCommerce - Product Gallery","condition":"woocommerce\/woocommerce.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/woocommerce\/?(.*)\/assets\/js\/zoom\/jquery.zoom(.min)?.js","\/woocommerce\/?(.*)\/assets\/js\/photoswipe\/","\/woocommerce\/?(.*)\/assets\/js\/flexslider\/jquery.flexslider(.min)?.js","\/woocommerce\/?(.*)\/assets\/js\/frontend\/single-product(.min)?.js","wc_single_product_params"],"icon_url":"","type":"plugin","id":"plugin:7665868ff97c265628f376523a4f9ecc","is_default":0,"created_at":1686579689},"016e6ddf-c6e7-49ec-bd3f-2585d9e45895":{"title":"WooCommerce - Select2 library","condition":"woocommerce\/woocommerce.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/woocommerce\/assets\/js\/select2\/select2(.*).js"],"icon_url":"","type":"plugin","id":"plugin:4bca670bd5d55dd24b17fb0193b0891e","is_default":0,"created_at":1681459540},"b9b2c6d7-944f-4ae3-ae04-c9e2204b9dab":{"id":"plugin:9165c768e978d6ad3f696db8c78ccbb2","title":"WooCommerce Attribute Swatches","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/iconic-woo-attribute-swatches-premium\/assets\/frontend\/js\/main.min.js","\/iconic-woo-attribute-swatches-premium\/assets\/vendor\/flickity\/flickity.pkgd.min.js","iconic_was_vars"],"is_default":0,"condition":"iconic-woo-attribute-swatches-premium\/iconic-woo-attribute-swatches.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"4506c5e9-7349-44c9-9967-34370c83facb":{"title":"WooCommerce Bookings","condition":"woocommerce-bookings\/woocommerce-bookings.php","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/woocommerce-bookings\/dist\/frontend.js","\/wp-includes\/js\/dist\/date.min.js","\/wp-includes\/js\/dist\/vendor\/moment.min.js","\/wp-includes\/js\/jquery\/ui\/datepicker.min.js","\/wp-includes\/js\/underscore.min.js","\/woocommerce\/assets\/js\/jquery-blockui\/jquery.blockUI.min.js","\/wp-includes\/js\/dist\/hooks.min.js"],"icon_url":"","type":"plugin","id":"plugin:14dec6d289b9977fa3a74116feecebcc","is_default":0,"created_at":1693998405},"fec9cd04-c358-45da-a1a8-1668b964016b":{"id":"plugin:456f3b849ba3b6647246aca9d7cdaed5","title":"WooCommerce Product Reviews Pro","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","wc_product_reviews_pro","\/woocommerce-product-reviews-pro\/assets\/js\/frontend\/wc-product-reviews-pro-frontend.min.js","\/woocommerce\/assets\/js\/jquery-tiptip\/jquery.tipTip.min.js"],"is_default":0,"condition":"woocommerce-product-reviews-pro\/woocommerce-product-reviews-pro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"551a9399-627f-4978-9bae-5cc8e0aefc82":{"id":"plugin:c8577e74eef3b082fb6403760d53f68c","title":"WooCommerce TM Extra Product Options","type":"plugin","icon":"","exclusions":["\/woocommerce-tm-extra-product-options\/assets\/js\/epo.min.js","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/jquery\/ui\/core.min.js","\/wp-includes\/js\/jquery\/ui\/mouse.min.js","\/wp-includes\/js\/jquery\/ui\/slider.min.js","\/wp-includes\/js\/underscore.min.js","\/wp-includes\/js\/wp-util.min.js","\/wp-includes\/js\/dist\/hooks.js","\/wp-includes\/js\/dist\/i18n.js"],"is_default":0,"condition":"woocommerce-tm-extra-product-options\/tm-woo-extra-product-options.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"3cac4650-6a52-448e-8e48-e99a772a59a2":{"id":"plugin:c6e6cab8c80fa3fe57d609f72d2d5c56","title":"WooLentor","type":"plugin","icon":"","exclusions":["\/woolementor\/assets\/third-party\/slick\/slick.min.js","\/woolentor-addons","woolentor_addons"],"is_default":0,"condition":"woolentor-addons\/woolentor_addons_elementor.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"21af073d-d2ec-4d46-bbda-2c69f87f3f98":{"title":"Woolentor - Fix product gallery","condition":"woolentor-addons\/woolentor_addons_elementor.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)",".woolentor-learg-img","\/woolentor-addons\/assets\/js\/slick.min.js","\/woolentor-addons-pro\/assets\/lib\/js\/tippy.min.js"],"icon_url":"","type":"plugin","id":"plugin:c5315e06dfc353cd57f85a60abe4e320","is_default":0,"created_at":1700061004},"67aeb4cb-1a00-4d10-a00c-34888b4c0dba":{"title":"WooThumbs for WooCommerce","condition":"woothumbs-premium\/woothumbs-premium.php","exclusions":["\/wp-includes\/js\/dist\/hooks.min.js","\/wp-includes\/js\/underscore.min.js","\/wp-includes\/js\/wp-embed.min.js","\/wp-includes\/js\/wp-util.min.js","\/woothumbs-premium\/(.*)"],"icon_url":"","type":"plugin","id":"plugin:b97b1d3f627769e1dd8305aa25af993c","is_default":0,"created_at":1679065404},"c7a14763-88d0-4344-a6af-e0a8dc5fa8d5":{"id":"plugin:31b9e812a025e5750a6ef0980ee7d2db","title":"WordPress Mega Menu \u2013 QuadMenu","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/quadmenu","#private-menu","#public-menu"],"is_default":0,"condition":"quadmenu\/quadmenu.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"f699fdbd-84a7-4f24-b729-3e4a4f83a4dd":{"id":"plugin:601f8fc7d10cad1c2ec2949c0d9b1651","title":"WP Armour","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/honeypot\/includes\/js\/wpa.js","\/wp-armour-extended\/includes\/js\/wpae.js","wpa_hidden_field","wpa_add_test"],"is_default":0,"condition":"wp-armour-extended\/wp-armour-extended.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"6a28aae5-ef91-43fc-8204-92e3a25642b4":{"id":"plugin:5728f3b9856dfe37a36ab15b0a637198","title":"WP Go Maps","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","maps.googleapis.com"],"is_default":0,"condition":"wp-google-maps\/wpGoogleMaps.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"c9b991d1-a653-404b-be85-e276b1814e7d":{"title":"WP Google Map Pro","condition":"wp-google-map-gold\/wp-google-map-gold.php","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","maps.google.com\/maps\/api\/js","\/wp-includes\/js\/masonry.min.js","\/wp-google-map-gold\/(.*)"],"icon_url":"","type":"plugin","id":"plugin:dc12a9b7b9c4c7ce3c532b6b377739f2","is_default":0,"created_at":1677858391},"1f8f9fbf-fbf0-4e3a-b77c-af0fa47e950d":{"id":"plugin:87f572f5f0ec143a8fceba77d0616197","title":"WP Google Maps Pro","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-google-maps(.*)","maps.googleapis.com","mgl_","wpgmza"],"is_default":0,"condition":"wp-google-maps-pro\/wp-google-maps-pro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"41e4b98c-e63f-4800-a478-02592562322b":{"id":"plugin:3735ca768ede98b25795f4cb057ff4ed","title":"WP iCal Availability","type":"plugin","icon":"","exclusions":["\/wp-ical-availability\/js\/custom-select.js","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-ical-availability\/"],"is_default":0,"condition":"wp-ical-availability\/wp-ical-availability.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"2b06c5b8-dc32-4bb0-8504-3a9f1c3a1ec0":{"title":"WP MapIt","condition":"wp-mapit\/wp_mapit.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-mapit\/wp_mapit\/js\/leaflet.js","\/wp-mapit\/wp_mapit\/js\/wp_mapit_multipin.js"],"icon_url":"","type":"plugin","id":"plugin:ba8d1c7f294a3f5b593556eb3b0bc7d9","is_default":0,"created_at":1679331261},"2039eafd-1c11-4e21-a61b-30857f291ae3":{"id":"plugin:927b8bf7806f2d287559b86a0b455a59","title":"WP Responsive Menu","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-responsive-menu\/(.*)"],"is_default":0,"condition":"wp-responsive-menu\/wp-responsive-menu.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"e06be942-cccd-4b2d-a268-06dc78f0b820":{"title":"WP Search with Algolia","condition":"wp-search-with-algolia\/algolia.php","exclusions":["\/wp-search-with-algolia\/js\/algoliasearch\/dist\/algoliasearch-lite.umd.js","\/wp-search-with-algolia\/js\/autocomplete-noconflict.js","\/wp-search-with-algolia\/js\/autocomplete.js\/dist\/autocomplete.min.js","var algolia"],"icon_url":"","type":"plugin","id":"plugin:43267e659d599fbb6b42c719b49bb7a7","is_default":0,"created_at":1677857180},"4fc2a7ae-b9e6-410e-93cf-e6d1962add6a":{"title":"WP Smart Preloader","condition":"wp-smart-preloader\/wp-preloader.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-smart-preloader\/assets\/js\/wsp-main-script(.min)?.js"],"icon_url":"","type":"plugin","id":"plugin:4fb90fc73fc2b5d1e37ea2dadfd3cef3","is_default":0,"created_at":1704204597},"7ecf40ce-2bcd-412c-bb01-9e71fecf6be8":{"title":"WP Store Locator","condition":"wp-store-locator\/wp-store-locator.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-store-locator\/","\/wp-includes\/js\/underscore.min.js","maps.google.com"],"icon_url":"","type":"plugin","id":"plugin:d37bb5054a24471ca1675d9ab49d01b0","is_default":0,"created_at":1704735183},"7a1d19a2-3a48-40ab-8051-f642fc63ce2d":{"title":"WP Ultimate Post Grid","condition":"wp-ultimate-post-grid\/wp-ultimate-post-grid.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?$","\/wp-ultimate-post-grid\/dist\/public.js","\/wp-ultimate-post-grid-premium\/dist\/public-premium.js","wpupg_grid_args"],"icon_url":"","type":"plugin","id":"plugin:e24341fef49bd64b89682d583218c108","is_default":0,"created_at":1686597940},"76c86163-ddf3-4113-b620-de9d5058f505":{"title":"WPBakery Page Builder","condition":"js_composer\/js_composer.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/js_composer\/assets\/js\/dist\/js_composer_front.min.js"],"icon_url":"","type":"plugin","id":"plugin:517d7d24da9a7072ed389d0fb30374a0","is_default":0,"created_at":1704404852},"0b8ff2c0-c3cd-4ec1-b7f5-c7751de6101b":{"title":"WPBakery Page Builder - Carousel","condition":"js_composer\/js_composer.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/js_composer\/assets\/lib\/vc_carousel\/js\/vc_carousel.min.js"],"icon_url":"","type":"plugin","id":"plugin:76336ed3f04df091e669f89d908ef2ed","is_default":0,"created_at":1704405212},"4f5e5b98-c326-4b9f-9ada-3b257862132c":{"id":"plugin:1ec7138c950c355e7af60d49c81139fc","title":"wpDataTables","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wpdatatables\/","highcharts"],"is_default":0,"condition":"wpdatatables\/wpdatatables.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"18be1b8c-0bc4-4a01-abc6-a127aff380c6":{"id":"plugin:c62ca58ea081c1271de8dadfa7daac69","title":"WPForms","type":"plugin","icon":"","exclusions":["\/wpforms-offline-forms\/assets\/js\/wpforms-offline-forms.min.js","wpforms-offline-forms-js-extra","wpformsRecaptchaLoad"],"is_default":0,"condition":"wpforms\/wpforms.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"8a3cacb6-81bd-456a-a1cc-a4025f8e5234":{"id":"plugin:0992ac952c0a05bb35e18b1d5744d346","title":"WPForms Lite","type":"plugin","icon":"","exclusions":["wpformsRecaptchaLoad","\/wpforms-offline-forms\/assets\/js\/wpforms-offline-forms.min.js","wpforms-offline-forms-js-extra"],"is_default":0,"condition":"wpforms-lite\/wpforms.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"98bbd410-5b01-4244-a8eb-715765180328":{"title":"XL WooCommerce Sales Triggers","condition":"xl-woocommerce-sales-triggers\/xl-woocommerce-sales-triggers.php","exclusions":["\/xl-woocommerce-sales-triggers\/assets\/js\/wcst_combined.min.js","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js"],"icon_url":"","type":"plugin","id":"plugin:ba9e526ddb0157e69757530c6b18b714","is_default":0,"created_at":1677856813},"bf9f9620-dd0e-4e6f-9a45-4eb78a148f42":{"id":"plugin:58663fc781232169e865f6fe7cf1afaa","title":"YITH WooCommerce Ajax Product Filter","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/yith-woocommerce-ajax-navigation\/assets\/js\/yith-wcan-shortcodes.min.js"],"is_default":0,"condition":"yith-woocommerce-ajax-navigation\/init.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"b053279d-e07c-438c-bb3e-3a1f4f5d7c5e":{"id":"plugin:68b637fd247e40c8e135e4771d739b07","title":"YITH WooCommerce AJAX Product Filter Premium","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/yith-woocommerce-ajax-product-filter-premium\/assets\/js\/yith-wcan-shortcodes.min.js"],"is_default":0,"condition":"yith-woocommerce-ajax-product-filter-premium\/init.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"62056165-8bd9-4ff0-b21f-e4ed0ae45fae":{"title":"YITH WooCommerce Points and Rewards","condition":"yith-woocommerce-points-and-rewards-premium\/init.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/yith-woocommerce-points-and-rewards-premium\/assets\/js\/frontend.min.js","\/woo-variation-swatches-pro\/assets\/js\/add-to-cart-variation.min.js"],"icon_url":"","type":"plugin","id":"plugin:4acc87d4eb72c86cdea76d180b61a098","is_default":0,"created_at":1709917756},"d94dbbf3-bcab-4e47-9fbb-6b3a7cf92787":{"title":"Yotpo Social Reviews for Woocommerce","condition":"yotpo-social-reviews-for-woocommerce\/wc_yotpo.php","exclusions":["\/yotpo-social-reviews-for-woocommerce\/assets\/js\/headerScript.js"],"icon_url":"","type":"plugin","id":"plugin:45ab742b3fccbd04d7bc973c8582be87","is_default":0,"created_at":1680686421}},"themes":{"9aeea459-91d3-44b6-8a26-b883dca8b402":{"title":"Agensy - Load page without User Interaction","condition":"agensy","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/themes\/agensy\/js\/scripts.js","\/themes\/agensy\/js\/scripts-single.js","\/themes\/agensy\/js\/wow.min.js","\/themes\/agensy\/js\/TweenMax.min.js","\/themes\/agensy\/js\/swiper.min.js","\/plugins\/visualcomposer\/assets\/lib\/bower\/isotope\/dist\/isotope.pkgd.min.js","\/wp-includes\/js\/imagesloaded.min.js"],"icon_url":"","type":"theme","id":"theme:7ab7dfeb0db9c0c74c020be318c2e6d9","is_default":0,"created_at":1707317936},"9c623554-5834-4669-9e96-1b894c1939b2":{"id":"theme:0193ea55fce2ada93b262f2824008c0f","title":"Andaman","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/andaman\/assets\/js\/","\/wp-andaman-plugins\/shortcodes\/vc_extend\/"],"is_default":0,"condition":"andaman","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"7374c5a5-69f8-460f-b44f-dee884a824cd":{"id":"theme:24cbda63f1b898ade5562ab4ec6d97a5","title":"Artale","type":"theme","icon":"","exclusions":["\/artale-elementor\/assets\/js\/modulobox.js","\/artale-elementor\/assets\/js\/artale-elementor.js","\/artale\/js\/jquery-stellar.js","\/artale\/js\/core\/artale-plugins.js","\/artale\/js\/core\/artale-custom.js","var loader"],"is_default":0,"condition":"artale","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"23b01203-2a70-4394-9326-d59824def2d7":{"title":"Ashe Pro Premium","condition":"ashe-pro-premium","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/ashe-pro-premium\/"],"icon_url":"","type":"theme","id":"theme:4791da3cbbd1ed86253a087f0287aeb4","is_default":0,"created_at":1704912793},"03a9cc62-c167-447d-beb2-65c76c96b056":{"title":"Astra","condition":"astra","exclusions":["\/astra\/assets\/js\/minified\/frontend.min.js"],"icon_url":"","type":"theme","id":"theme:3cce5f3eaf76e098ba8e28f7bbba3f92","is_default":0,"created_at":1702486947},"2a2b54cb-8e1d-49d2-bfca-93eee231e470":{"id":"theme:72a8d63e59c10bdf512a62b862d143a7","title":"Astra - Carousel","type":"theme","icon":"","exclusions":["var astra","\/astra\/assets\/js\/minified\/style.min.js"],"is_default":0,"condition":"astra","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"7783361f-66fc-4d95-a054-4e9545bb5b48":{"title":"Auteur","condition":"g5plus-auteur","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/g5plus-auteur\/assets\/js\/core.min.js","\/g5plus-auteur\/assets\/vendors\/","\/auteur-framework\/libs\/smart-framework\/assets\/vendors\/perfect-scrollbar\/js\/perfect-scrollbar.jquery.min.js","\/wp-includes\/js\/imagesloaded.min.js"],"icon_url":"","type":"theme","id":"theme:6207fe478e269e7547bda70a46607a49","is_default":0,"created_at":1679737107},"4c618038-8fc7-4d48-8d41-a32da14e5c1e":{"title":"AutoTrader","condition":"autotrader","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/autotrader\/(.*).js"],"icon_url":"","type":"theme","id":"theme:046dfeee2b77390c53e0e7f93b6a3792","is_default":0,"created_at":1679736741},"18f04f23-35a0-4c45-8cb6-a91d57ca1790":{"id":"theme:835da12f43373029659f766920e81b47","title":"Avada - Animations & mobile-specific actions","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/uploads\/fusion-scripts\/(.*).js","window.off_canvas_","\/plugins\/fusion-builder\/","\/plugins\/fusion-core\/","\/Avada\/includes\/"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"90135867-1b95-498b-80d6-f5dbf2f6b318":{"title":"Avada - FAQ shortcode","condition":"Avada","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/plugins\/fusion-core\/js\/min\/avada-faqs.js"],"icon_url":"","type":"theme","id":"theme:b084708c80d8582546e5430219aa4670","is_default":0,"created_at":1678277160},"d23b5bb1-1d7f-4109-bf69-b20a2be2d337":{"id":"theme:5e7a2248e1a53d9bb27b187deb541248","title":"Avada - Fusion carousel","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/includes\/lib\/assets\/min\/js\/library\/jquery.carouFredSel.js","\/includes\/lib\/assets\/min\/js\/general\/fusion-carousel.js","fusionCarouselVars"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"98dfa8c1-e72a-4cef-a0b2-8f0c322490fc":{"id":"theme:f16fb109027f4994a7649a8b1663e6f7","title":"Avada - Fusion form","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/fusion-builder\/assets\/js\/min\/general\/fusion-form.js","\/fusion-builder\/assets\/js\/min\/general\/fusion-form-logics.js","\/includes\/lib\/assets\/min\/js\/library\/cssua.js","\/includes\/lib\/assets\/min\/js\/general\/fusion.js","\/includes\/lib\/assets\/min\/js\/library\/modernizr.js"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"026801fa-af67-47ba-b966-347693f0585f":{"id":"theme:33f50696d353d8bd4eb59ff6e8f44c97","title":"Avada - Fusion grid gallery","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/fusion-builder\/assets\/js\/min\/general\/fusion-gallery.js","\/includes\/lib\/assets\/min\/js\/library\/imagesLoaded.js","\/includes\/lib\/assets\/min\/js\/library\/isotope.js","\/includes\/lib\/assets\/min\/js\/library\/packery.js","\/includes\/lib\/assets\/min\/js\/library\/lazysizes.js"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"c8349314-15a3-481e-973b-e4d936e4420e":{"id":"theme:56fa9993a573540c83eda9c49fae5e3c","title":"Avada - Fusion slider","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/fusion-core\/js\/min\/avada-fusion-slider.js","\/Avada\/includes\/"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"7a04bc85-0fec-4487-ae05-bb2e5d8d0420":{"title":"Avada - Load Portfolio on pageload","condition":"Avada","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/library\/packery.js","\/library\/isotope.js","\/library\/imagesLoaded.js","\/general\/fusion-lightbox.js","\/fusion-core\/js\/min\/avada-portfolio.js"],"icon_url":"","type":"theme","id":"theme:c3f0ed4d94499b68c77d95db37d1d399","is_default":0,"created_at":1696601814},"55bd510c-78aa-49d5-8304-8be2ee2ab0da":{"id":"theme:2189c1c769d65cfc2182e4822847071b","title":"Avada - Mobile menu","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/assets\/min\/js\/general\/avada-menu.js","\/includes\/lib\/assets\/min\/js\/library\/modernizr.js","\/includes\/lib\/assets\/min\/js\/library\/jquery.easing.js"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"ddf00672-c35c-4b68-aeca-925e68bf12b2":{"id":"theme:97a185f08af70c39c7e221faab0f73eb","title":"Avada - OffCanvas","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/uploads\/fusion-scripts\/(.*).min.js","window.off_canvas_"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"17544cc3-9d3a-4611-bc5d-44d04e2786fa":{"title":"Avada - Show the Portfolio grid on page load","condition":"Avada","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/includes\/lib\/assets\/min\/js\/library\/imagesLoaded.js","\/includes\/lib\/assets\/min\/js\/library\/isotope.js","\/includes\/lib\/assets\/min\/js\/library\/lazysizes.js","\/includes\/lib\/assets\/min\/js\/library\/modernizr.js","\/includes\/lib\/assets\/min\/js\/library\/packery.js","\/fusion-core\/js\/min\/avada-portfolio.js","avadaPortfolioVars"],"icon_url":"","type":"theme","id":"theme:9d1a9b0c2ca20fca764a82f197b962fd","is_default":0,"created_at":1696601823},"c6c3347c-14e0-4766-afa5-df33a47f5a5a":{"id":"theme:3ff44421b404c5efffa25e78e479e4ea","title":"Avada - Sticky menu","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/Avada\/assets\/min\/js\/general\/avada-menu.js"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"232596c1-6a6a-4fe8-a5c3-a60fa74a9456":{"id":"theme:0d727d80bb132f17c737e55883fe4be0","title":"Avada - WooCommerce product gallery","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/assets\/min\/js\/general\/avada-woo-product-images.js","\/includes\/lib\/assets\/min\/js\/library\/jquery.flexslider.js"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"95ece7e4-3b19-45e5-aa28-14f833c9afca":{"title":"Avesa","condition":"avesa","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/avesa\/js\/main.js","\/avesa\/js\/isotope.js","\/sw_core\/js\/slick.min.js","\/avesa\/js\/bootstrap-datetimepicker.min.js","\/avesa\/js\/bootstrap.min.js"],"icon_url":"","type":"theme","id":"theme:aad8bfcc594eec02e3b0d635198dee5e","is_default":0,"created_at":1679737993},"f2bfe477-4e45-4e52-a7d9-4d0ba3a92258":{"title":"Besa","condition":"besa","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/besa\/js\/"],"icon_url":"","type":"theme","id":"theme:c238e89523c46ca28b08e401f42f6ccc","is_default":0,"created_at":1679738204},"bd94908c-8138-4995-986b-47ec66494bdd":{"title":"BeTheme","condition":"betheme","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/betheme\/","mfn","\/wp-includes\/js\/jquery\/ui\/tabs.min.js","\/wp-includes\/js\/jquery\/ui\/core.min.js"],"icon_url":"","type":"theme","id":"theme:b99156eb9eeb357c0a70bd3bda6861cc","is_default":0,"created_at":1679738639},"190d2f1a-72a6-40ca-b08a-5c7ee7b0a6a5":{"title":"Bosa Online Education - Fixes animations and preloader","condition":"bosa-online-education","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/bosa\/assets\/js\/jquery.slicknav.min.js","\/bosa\/assets\/slick\/slick.min.js","\/bosa\/assets\/js\/navigation.js","\/bosa\/assets\/js\/custom.min.js","\/bosa\/assets\/js\/theia-sticky-sidebar.min.js"],"icon_url":"","type":"theme","id":"theme:5430bf7b83c83a3687b3b7b437e961b0","is_default":0,"created_at":1708371742},"6fb2b9d7-6ecc-4260-999c-938fbebdbf01":{"id":"theme:de8504b73ea228d0ea9bbce69752092e","title":"Bridge","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/bridge-creative\/bridge\/js\/","\/wp-includes\/js\/"],"is_default":0,"condition":"bridge","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"1dd63427-b4c9-4596-b952-ac711e3637f9":{"title":"Bridge - Load elements without user interaction","condition":"bridge","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/wp-content\/themes\/bridge\/js\/default.min.js","\/wp-content\/themes\/bridge\/js\/plugins.js","\/wp-content\/themes\/bridge\/js\/default_dynamic.js","\/wp-content\/themes\/bridge\/js\/jquery.touchSwipe.min.js"],"icon_url":"","type":"theme","id":"theme:ad9b810efd365ad9a27987d2912b94cd","is_default":0,"created_at":1710252260},"65698b6b-85dd-41ef-8fd7-718f1e983dba":{"title":"Car Dealer","condition":"cardealer","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/jquery\/(.*)","\/cardealer\/js\/(.*)"],"icon_url":"","type":"theme","id":"theme:b1111424fff61af8d1e152dcdd6810f6","is_default":0,"created_at":1679737517},"3927d724-5a0a-402b-a838-858d30b54ea9":{"title":"Cardea - Show Page Content on Load","condition":"cardea-wp","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/themes\/cardea-wp\/js\/main.js","\/themes\/cardea-wp\/js\/jquery.sticky.js","\/themes\/cardea-wp\/js\/jquery.fitvids.js","\/themes\/cardea-wp\/js\/jquery.smartmenus.min.js"],"icon_url":"","type":"theme","id":"theme:d65d1a8303b0c7508278884520e4bec7","is_default":0,"created_at":1698677525},"087fb457-a09d-4140-84bd-c9bc1e8195b7":{"title":"CheerUp","condition":"cheerup","exclusions":["\/cheerup\/js\/jquery.sticky-sidebar.js","\/cheerup\/js\/object-fit-images.js","\/cheerup\/js\/jquery.fitvids.js","\/cheerup\/js\/jquery.mfp-lightbox.js","\/cheerup\/js\/ie-polyfills.js","\/cheerup\/js\/theme.js","\/wp-includes\/js\/imagesloaded.min.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/wp-includes\/js\/jquery\/jquery.min.js"],"icon_url":"","type":"theme","id":"theme:13bcf562f45afb245dc4f76fecfba6d6","is_default":0,"created_at":1696429398},"eb86aedb-91e6-480c-b76c-756ac1da41be":{"title":"Clover","condition":"clover-theme","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/clover-theme\/"],"icon_url":"","type":"theme","id":"theme:89372f3d9321ae09c94488592084da29","is_default":0,"created_at":1679738878},"6e90b649-5736-497f-9bc6-515900cfea8a":{"title":"Divi - Animations","condition":"Divi","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js",".dipi_preloader_wrapper_outer","\/Divi\/js\/scripts.min.js","\/Divi\/js\/custom.unified.js","\/js\/magnific-popup.js","var DIVI"],"icon_url":"","type":"theme","id":"theme:c0abf30dba4ff13db836d1b01685953a","is_default":0,"created_at":1679737389},"70916c43-4e02-4932-b6aa-91a1815bc755":{"title":"Divi - Background video","condition":"Divi","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate.min.js","\/Divi\/js\/custom.unified.js","\/js\/mediaelement\/(.*)","mejs"],"icon_url":"","type":"theme","id":"theme:c7edea41ae6716291e2d32a2ab429209","is_default":0,"created_at":1679738240},"08531785-9818-4e30-903e-564637a2ad7a":{"title":"Divi - Counter module","condition":"Divi","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js",".dipi_preloader_wrapper_outer","\/Divi\/js\/scripts.min.js","\/Divi\/js\/custom.unified.js","\/js\/magnific-popup.js","var DIVI","\/Divi\/includes\/builder\/feature\/dynamic-assets\/assets\/js\/easypiechart.js"],"icon_url":"","type":"theme","id":"theme:2c46b9f5a770f260c3f7115bb330b2d5","is_default":0,"created_at":1679736810},"b996762a-84ef-440d-a089-73a187936fbf":{"title":"Divi - Mobile menu","condition":"Divi","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate.min.js","\/Divi\/js\/scripts.min.js","\/Divi\/js\/custom.unified.js"],"icon_url":"","type":"theme","id":"theme:b9116994f4e4b9b9fa574440c00d2f0d","is_default":0,"created_at":1679738580},"ae096e1e-9c36-46ad-a3d1-c26ea507276b":{"title":"Divi - Sticky elements","condition":"Divi","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js",".dipi_preloader_wrapper_outer","\/Divi\/js\/scripts.min.js","\/Divi\/includes\/builder\/feature\/dynamic-assets\/assets\/js\/sticky-elements.js","var DIVI"],"icon_url":"","type":"theme","id":"theme:8b62db03c90245f3e690335b079b05dc","is_default":0,"created_at":1679737191},"349f31f0-dd10-41d3-b0a4-9c5df64879f8":{"title":"Divi - Sticky menu","condition":"Divi","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/js\/jquery\/jquery-migrate.min.js","\/Divi\/js\/scripts.min.js","\/Divi\/includes\/builder\/feature\/dynamic-assets\/assets\/js\/magnific-popup.js","jqueryParams","firstHeader"],"icon_url":"","type":"theme","id":"theme:b7b84aca0f0dc6a1ced31d38626c50ea","is_default":0,"created_at":1679738821},"59563458-5f04-4959-b3e2-53e49e169d67":{"title":"Divi - WooCommerce Single Product Images","condition":"Divi","exclusions":["\/Divi\/js\/scripts.min.js"],"icon_url":"","type":"theme","id":"theme:f9c5bdba8b39fc877b41dea00fa756f9","is_default":0,"created_at":1684342262},"6426539e-4e43-4fef-ab5a-3eb7b2a8b057":{"title":"Eikra","condition":"eikra","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate.min.js","\/eikra\/assets\/js\/","EikraObj"],"icon_url":"","type":"theme","id":"theme:55d2581ad975eb6325bc97fc3d3b0cb8","is_default":0,"created_at":1679738450},"59020bd6-069f-4f2d-afa2-fbdefa03211c":{"title":"Ekko","condition":"ekko","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/ekko\/"],"icon_url":"","type":"theme","id":"theme:2c06f4a1949f8ba4e77042a47674fd9e","is_default":0,"created_at":1679737803},"d82f5cdd-c5d3-4596-94dc-1e25aaff2083":{"title":"Elessi","condition":"elessi-theme","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elessi-theme\/assets\/js\/min\/functions.min.js","\/elessi-theme\/assets\/js\/min\/main.min.js"],"icon_url":"","type":"theme","id":"theme:d5d2b7fda7b8a2b5b91d430f7602e230","is_default":0,"created_at":1679737773},"f0587c21-54d0-429d-8efe-18a93dacb18d":{"id":"theme:5fc04cc678cb54567aedb51027933002","title":"Enfold","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/dynamic_avia\/avia-footer-scripts-(.*).js","var avia_is_mobile"],"is_default":0,"condition":"enfold","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"cc0550cb-918e-419d-b4f2-1809cf666dbb":{"id":"theme:eb759a03d0ca292c948f09d004a2963f","title":"Enfold - LayerSlider","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","layerslider"],"is_default":0,"condition":"enfold","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"ec883654-4f63-4fae-a3ef-923dcbc2426d":{"title":"Enfold - Shortcodes","condition":"enfold","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/enfold\/js\/avia.js","\/enfold\/js\/shortcodes.js","\/enfold\/config-templatebuilder\/avia-shortcodes\/","\/enfold\/js\/avia-compat.js","\/enfold\/js\/waypoints\/waypoints.min.js","\/enfold\/js\/avia-snippet-(.*).js"],"icon_url":"","type":"theme","id":"theme:072fc4077d7071791d774d6ddbf5dc2a","is_default":0,"created_at":1684519716},"fe3546f0-be3e-4173-8992-a7f6f203b82f":{"title":"Envision","condition":"envision","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/envision\/lib\/js\/app.min.js","var CloudFwOp"],"is_default":1,"icon_url":"","type":"theme","id":"theme:fc5f7d69b646ed95835badc0fc23bc11","created_at":1679737494},"d997b942-19de-4710-9c81-79d3c65cbd76":{"id":"theme:047f009f2a1f4cdf2088c46be47e385b","title":"Ewebot","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/gt3-themes-core\/","\/uploads\/gt3-assets\/js\/(.*)","\/wp-includes\/js\/imagesloaded.min.js"],"is_default":0,"condition":"ewebot","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"53d29aec-8ae4-4273-b748-f5bd52dfe177":{"title":"Farvis","condition":"farvis","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/farvis\/"],"icon_url":"","type":"theme","id":"theme:26bff2f3a6ff6347d35edf5c77a35687","is_default":0,"created_at":1679737972},"fb01246b-a5f8-4021-b514-c02cf55e80bd":{"title":"Flatsome","condition":"flatsome","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/flatsome\/assets\/js\/flatsome.js","\/flatsome\/assets\/libs\/packery.pkgd.min.js","\/flatsome\/assets\/js\/woocommerce.js"],"icon_url":"","type":"theme","id":"theme:26fb1cf80f074ca199d8a7e94c5fc796","is_default":0,"created_at":1679738732},"4d65dc12-9ce7-4171-94a7-9821fd95240e":{"id":"theme:28a6f8b3319c107a34603be0f01a4bcf","title":"Flatsome - Google map","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","maps.googleapis.com","google.maps.LatLng","\/wp-includes\/js\/hoverIntent.min.js"],"is_default":0,"condition":"flatsome","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"890e15b6-c66b-4a9e-9b7d-55417df94916":{"title":"Flatsome - Images","condition":"flatsome","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/flatsome\/inc\/integrations\/wp-rocket\/flatsome-wp-rocket.js","\/flatsome\/assets\/js\/flatsome.js","\/flatsome\/inc\/extensions\/flatsome-lazy-load\/flatsome-lazy-load.js"],"icon_url":"","type":"theme","id":"theme:f2d60aad9f2f5395e3e145cf8f8ab165","is_default":0,"created_at":1679737691},"cb54d070-8ee0-4c35-9fa9-b2bac73ccf39":{"title":"Frida","condition":"frida","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/frida\/"],"icon_url":"","type":"theme","id":"theme:109ddf56796a5133e12279f3daa5ff62","is_default":0,"created_at":1679738013},"9e78539a-03d9-442b-ab94-dd3b7a9658e4":{"id":"theme:80a330247d61d729fcd78dc01de6ed2f","title":"GeneratePress - Mobile menu","type":"theme","icon":"","exclusions":["\/generatepress\/assets\/js\/menu.min.js","generatepressMenu","\/gp-premium\/menu-plus\/functions\/js\/offside.min.js"],"is_default":0,"condition":"generatepress","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"6373bbb2-877c-4075-b6e4-7c58d686b25c":{"title":"HealthFirst - Prevent console errors","condition":"healthfirst","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/wp-includes\/js\/hoverIntent.min.js","\/wp-content\/plugins\/healthfirst-core\/assets\/js\/healthfirst-core.min.js","\/wp-content\/plugins\/healthfirst-core\/assets\/plugins\/modernizr\/modernizr.js","\/wp-content\/plugins\/healthfirst-core\/assets\/plugins\/perfect-scrollbar\/perfect-scrollbar.jquery.min.js","\/wp-content\/themes\/healthfirst\/assets\/js\/main.min.js","\/wp-content\/themes\/healthfirst\/assets\/plugins\/waitforimages\/jquery.waitforimages.js"],"icon_url":"","type":"theme","id":"theme:d244b3c692f8d023048207dbe9eb84da","is_default":0,"created_at":1699370973},"2c72e7e6-cb77-44e9-af87-d5c42ae6db52":{"title":"Honor - WPBakery fix","condition":"honor","exclusions":["\/honor\/js\/__scripts.js","HONOR_STORAGE","\/js_composer\/"],"icon_url":"","type":"theme","id":"theme:9f228373ff4d172655dbf5cb3b1bc23a","is_default":0,"created_at":1679736895},"9309d1d3-1035-4a2c-8ced-075bc3ff9957":{"title":"HotelMaster","condition":"hotelmaster","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/hotelmaster\/javascript\/gdlr-script.js","\/hotelmaster\/plugins\/dl-menu\/modernizr.custom.js","\/hotelmaster\/plugins\/dl-menu\/jquery.dlmenu.js","\/hotelmaster\/plugins\/superfish\/js\/superfish.js","\/hotelmaster\/plugins\/jquery.easing.js"],"icon_url":"","type":"theme","id":"theme:978eaddad3b1047e479407b6d92197aa","is_default":0,"created_at":1679738595},"4a09f745-cbb1-47c8-b50a-c8014d5d1335":{"id":"theme:e813a548bceac6765a1cdf2316f1a6ab","title":"HotelMaster - Blog","type":"theme","icon":"","exclusions":["\/wp-includes\/js\/masonry.min.js","\/gp-premium\/blog\/functions\/js\/scripts.min.js","\/wp-includes\/js\/imagesloaded.min.js"],"is_default":0,"condition":"hotelmaster","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"f2d8f704-ec68-4278-9ca2-885daa0c1ce5":{"id":"theme:398a264e302e42640553681e8759cd07","title":"HotelMaster - Masonry","type":"theme","icon":"","exclusions":["\/gp-premium\/menu-plus\/functions\/js\/offside.min.js","offSide"],"is_default":0,"condition":"hotelmaster","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"92b2e258-1f44-41c1-b1bd-f117f61ee49d":{"title":"Jannah Theme - Fix masonry grid","condition":"jannah","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/wp-includes\/js\/masonry.min.js","\/wp-includes\/js\/jquery\/jquery.masonry.min.js","tie-"],"icon_url":"","type":"theme","id":"theme:35f7f183089309f52046377ca65e905a","is_default":0,"created_at":1699642920},"df52436c-53d6-461a-b81a-cd0b21680524":{"title":"JNews","condition":"jnews","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate.min.js","\/jnews\/assets\/js\/","jnews","jfla"],"icon_url":"","type":"theme","id":"theme:5d90e451984f9d894b1aabb0d00f30a2","is_default":0,"created_at":1679738860},"87ed69a2-3295-4fad-a82e-eeb02925a5dc":{"title":"Jobify","condition":"jobify","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/jobify\/js\/jobify.min.js","\/jobify\/js\/select2.full.min.js"],"icon_url":"","type":"theme","id":"theme:592006aa4562a6915e344e5e2a09e5ee","is_default":0,"created_at":1704735224},"28a0b1ea-8d2f-4931-a48a-166b8df8a773":{"title":"JOYN","condition":"joyn","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/swift-framework\/includes\/page-builder\/frontend-assets\/js\/lib\/modernizr-custom.js","\/swift-framework\/includes\/page-builder\/frontend-assets\/js\/spb-functions.min.js","\/swift-framework\/includes\/swift-slider\/assets\/js\/swift-slider.min.js","\/swift-framework\/public\/js\/lib\/imagesloaded.pkgd.min.js","\/joyn\/js\/owl.carousel.min.js","\/joyn\/js\/theme-scripts.js","\/joyn\/js\/functions.js"],"icon_url":"","type":"theme","id":"theme:c395470ad2d4d681836cd942bbb03120","is_default":0,"created_at":1679738527},"542be60a-2346-4740-9a41-8a580c4f013c":{"title":"Juno Toys","condition":"junotoys","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate.min.js","\/junotoys\/fw\/js\/core.init.js","\/junotoys\/fw\/js\/core.utils.js","\/junotoys\/fw\/js\/superfish.js","\/junotoys\/fw\/js\/swiper\/swiper.js","\/trx_utils\/shortcodes\/theme.shortcodes.js","\/wp-includes\/js\/jquery\/ui\/(.*)"],"icon_url":"","type":"theme","id":"theme:2acab38e8356d36355bb81d931e7fba4","is_default":0,"created_at":1679737788},"06167710-10c7-446e-a08b-ce676e444102":{"title":"Jupiter","condition":"jupiter","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/jupiter\/","\/wp-includes\/js\/underscore.min.js","WebFont.load"],"icon_url":"","type":"theme","id":"theme:89c5c30498c2989611f9044be006197c","is_default":0,"created_at":1679738430},"5d042e1f-7e62-4ec4-ba31-30d396004522":{"title":"JupiterX","condition":"jupiterx","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/jupiterx\/(.*).js","\/wp-includes\/js\/underscore.min.js","WebFont.load"],"icon_url":"","type":"theme","id":"theme:b06632962a4948d4944fd8d79ffbfceb","is_default":0,"created_at":1679737312},"c4b030ea-66a1-4729-85bf-a484e373a316":{"title":"Kadence","condition":"kadence","exclusions":["\/kadence\/assets\/js\/navigation.min.js","mobile_menu_breakpoint","kadenceConfig"],"icon_url":"","type":"theme","id":"theme:4b7907ee68218db279648da9bf7102d1","is_default":0,"created_at":1704735260},"20c605b4-3e3a-4bb0-a5e5-a08e2cb0f31f":{"title":"Kalium","condition":"kalium","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/kalium\/assets\/js\/main.min.js","mobile_menu_breakpoint","var _k"],"icon_url":"","type":"theme","id":"theme:1fcb99a1ab06e1e36635365ed3e59ce5","is_default":0,"created_at":1679737406},"e1e04a7d-635a-4e28-83d9-e345ce40e354":{"title":"Kava","condition":"kava","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/kava\/assets\/js\/theme-script.js"],"icon_url":"","type":"theme","id":"theme:359d67efbf530c998245225dd3245a88","is_default":0,"created_at":1679738609},"e833c36e-ee89-4924-b608-3f28327c2f85":{"title":"Lay","condition":"lay","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/backbone.min.js","\/wp-includes\/js\/underscore.min.js","\/lay\/","\/laytheme-carousel\/","window.laytheme"],"icon_url":"","type":"theme","id":"theme:7c718c6da874ea6e4b27c6d70bc4e7e8","is_default":0,"created_at":1679737453},"2df2ef47-a833-4711-ba54-48dc62586f37":{"id":"theme:85d9922ac61ed833fd047a67029df8e5","title":"LazaNews","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/jquery.custom.js"],"is_default":0,"condition":"lazanews","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"9443304a-34e9-4700-a03a-5f8f62f83ed1":{"title":"Listeo","condition":"listeo","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/listeo\/js\/"],"icon_url":"","type":"theme","id":"theme:db7da585545001f5ae614a2810f08f3a","is_default":0,"created_at":1679737244},"77afa73c-c4a8-42a8-aaee-43f6a761364e":{"title":"ListingPro","condition":"listingpro","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/listingpro\/assets\/lib\/jquerym.menu\/js\/jquery.mmenu.min.all.js","\/listingpro\/assets\/lib\/Magnific-Popup-master\/jquery.magnific-popup.min.js","\/listingpro\/assets\/js\/select2.full.min.js","\/listingpro\/assets\/js\/jquery.city-autocomplete.js","\/listingpro\/assets\/js\/chosen.jquery.min.js","\/listingpro\/assets\/lib\/bootstrap\/js\/bootstrap-slider.js","\/listingpro\/assets\/js\/jquery-ui.js","\/listingpro\/assets\/js\/mapbox.js","\/listingpro\/assets\/js\/main.js","\/listingpro\/assets\/js\/leaflet.markercluster.js","maps"],"icon_url":"","type":"theme","id":"theme:0b365e43dfc65d2b1b70fac6510c7c9c","is_default":0,"created_at":1679737938},"01b369b5-b578-4314-8e95-40b67a41d75a":{"title":"Master Study","condition":"masterstudy","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/masterstudy\/assets\/js\/custom.js","\/masterstudy\/assets\/vendors\/jquery.fancybox.min.js","\/masterstudy\/assets\/js\/select2.full.min.js"],"icon_url":"","type":"theme","id":"theme:0ee224c20e4ef7d546733d933db598f2","is_default":0,"created_at":1704735299},"6b000cc7-d33b-4109-9c39-6119a5d81cde":{"title":"Maya","condition":"maya","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/maya\/js\/jquery.mobilemenu.js","\/maya\/js\/jquery.custom.js","\/maya\/core\/includes\/js\/jquery.tipsy.js"],"icon_url":"","type":"theme","id":"theme:719fe28004fcdd81a820602924aa8074","is_default":0,"created_at":1679737916},"ef3c76d6-1041-473d-81ea-a5a6e8c86735":{"title":"MH Magazine","condition":"mh-magazine","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/mh-magazine\/"],"icon_url":"","type":"theme","id":"theme:2a0cd6efc2f46be69de61712729a2ec9","is_default":0,"created_at":1679737743},"9cbb2777-5524-43b8-af36-692b27452c0d":{"title":"Minimog","condition":"minimog","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/minimog\/"],"icon_url":"","type":"theme","id":"theme:61c0c235042359ee7d2a9035e79a7da2","is_default":0,"created_at":1679738135},"7eb81c74-8062-4a6c-bf66-b7c5bc160141":{"title":"Moozo Elementor","condition":"moozo-elementor","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/moozo-elementor\/assets\/js\/countdown.js","\/moozo-elementor\/assets\/vendor\/countdown\/countdown.min.js"],"icon_url":"","type":"theme","id":"theme:2ddb538c8e6b6c766fffd0d5c861fd82","is_default":0,"created_at":1679738623},"e90b7bfa-9ff6-4e1a-bf29-6207d55fdd39":{"title":"Motor","condition":"motor","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/motor\/js\/"],"icon_url":"","type":"theme","id":"theme:b33538179f5661a86cbe327a1793e199","is_default":0,"created_at":1683973354},"445e625a-f955-41fa-84de-65d9ea19be07":{"title":"My Listing","condition":"my-listing","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/my-listing\/assets\/","\/wp-includes\/js\/dist\/vendor\/moment.min.js","maps.googleapis.com","MyListing","_Explore_Settings"],"icon_url":"","type":"theme","id":"theme:afacb777229ddf5cabceacc64948057d","is_default":0,"created_at":1679737725},"00b8cd2d-2781-4fbb-ac5d-00750ba94ac9":{"title":"Neve - Mobile menu","condition":"neve","exclusions":["\/neve\/assets\/js\/build\/modern\/frontend.js"],"icon_url":"","type":"theme","id":"theme:5ae731cc06dd9284f8172675a6fe81ab","is_default":0,"created_at":1679738714},"483abc54-f1fc-47dc-bfc1-a269c7d1c849":{"title":"Newspaper - Images","condition":"Newspaper","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","tagdiv_theme.min.js","tdBlocksArray","\/wp-includes\/js\/underscore.min.js","\/td-cloud-library\/assets\/js\/","\/npm\/slick-carousel@1.8.1\/slick\/slick.min.js","tdb-gallery-wrap","tdBlocksArray","tdb_"],"icon_url":"","type":"theme","id":"theme:649ff22527bac2b1c8e0115cd3851d53","is_default":0,"created_at":1695805761},"50db8d14-d421-4237-be14-a6f7b5c11ec5":{"title":"Newspaper - Slider & YouTube","condition":"Newspaper","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","tagdiv_theme.min.js","tdBlocksArray","tdb_globals","td_youtube_list_ids","iosSlider","\/td-cloud-library\/assets\/js\/js_files_for_front.min.js","\/wp-includes\/js\/underscore.min.js","\/td-cloud-library\/assets\/js\/","\/npm\/slick-carousel@1.8.1\/slick\/slick.min.js","tdb-gallery-wrap","tdBlocksArray","tdb_"],"icon_url":"","type":"theme","id":"theme:7e2eeee57ae458c5959342eda6526bf1","is_default":0,"created_at":1695805747},"514f4c30-2b67-4648-960e-dfe1cc401ca5":{"title":"Niva","condition":"niva","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/niva\/js\/","\/sweetthemes-framework\/js\/","mt_typed"],"icon_url":"","type":"theme","id":"theme:c4838f73a344b829ed626635e210dcf4","is_default":0,"created_at":1679738256},"e67ee504-c3b1-455e-88ab-1fae8c830652":{"title":"OceanWP","condition":"oceanwp","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/oceanwp\/"],"icon_url":"","type":"theme","id":"theme:db37af4b7d12695d37d9256313a5f37a","is_default":0,"created_at":1679737552},"e44e240a-8765-4f4f-b67e-d54e4b727506":{"title":"OceanWP - Mobile menu","condition":"oceanwp","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/ocean-side-panel\/assets\/js\/side-panel.min.js","\/oceanwp\/assets\/js\/theme.vanilla.min.js"],"icon_url":"","type":"theme","id":"theme:9babbcd52b2ce558d299a06cd1130a11","is_default":0,"created_at":1679738463},"897b0100-958d-4a02-b6b2-1e753e9869f4":{"title":"PenNews","condition":"pennews","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/pennews\/js\/script.min.js","\/pennews\/js\/script.lib.min.js"],"icon_url":"","type":"theme","id":"theme:02811fa00bc1471bb5be0457ce0ee005","is_default":0,"created_at":1704735339},"edd3ba03-e0fd-4b6e-911b-60b29f3471bf":{"title":"Pharmacy Mentor","condition":"pharmacymentor","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/pharmacymentor\/"],"icon_url":"","type":"theme","id":"theme:3188aaf1ef2c39937450f2a14ebb1174","is_default":0,"created_at":1679738214},"725415ff-cc76-45cc-a131-3170e5aa30fc":{"title":"Porto","condition":"porto","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/jquery\/ui\/","\/porto\/js\/theme.js","\/porto\/js\/theme.min.js"],"icon_url":"","type":"theme","id":"theme:8493f398f200c8dffe60d46439dd3360","is_default":0,"created_at":1679737758},"2c19bcec-f3ff-4873-bfd7-db6bc0f6433c":{"title":"Porto - Owl Carousel","condition":"porto","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/wp-includes\/js\/jquery\/ui\/","\/porto\/js\/theme(|.min).js","\/porto\/js\/libs\/owl.carousel(|.min).js","\/porto\/js\/theme-async(|.min).js","\/prettyPhoto\/jquery.prettyPhoto(|.min).js"],"icon_url":"","type":"theme","id":"theme:f34f5199fb7fca78852cd3fb7758f178","is_default":0,"created_at":1687527252},"5b11ec89-1cb2-4793-8b77-79e917e810a0":{"title":"Pro Theme - Fix menu and accordions","condition":"pro","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/pro\/cornerstone\/assets\/js\/site\/cs-classic.(.*).js"],"icon_url":"","type":"theme","id":"theme:8f30d70dd2d9a0386445aef8fdd534a9","is_default":0,"created_at":1708100602},"31347ccb-f69e-4cd3-bd47-b80ce14ac76e":{"title":"ProPhoto","condition":"prophoto7","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/prophoto7\/js\/bundle.front.js","\/wp-includes\/js\/underscore.min.js","PROPHOTO"],"icon_url":"","type":"theme","id":"theme:a5836a56c4472fade4dc6ebfe2281554","is_default":0,"created_at":1679737425},"a8208c04-865c-49aa-ab96-41e378d391c8":{"title":"Publisher","condition":"publisher","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/publisher\/js\/"],"icon_url":"","type":"theme","id":"theme:32c73be0cb175da278c8e2af0811b0d1","is_default":0,"created_at":1679738169},"a0d69f3d-1356-4a1d-a600-2f2f788b8a9a":{"title":"REHub","condition":"rehub-theme","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/rehub-theme\/js\/custom_floatpanel.js"],"icon_url":"","type":"theme","id":"theme:321af1febb74f488cf911380893739b2","is_default":0,"created_at":1679738502},"8b74bbe5-7f32-42df-908f-78c99a8cad82":{"title":"Rey","condition":"rey","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/rey\/scripts-(.*).js","\/rey-core\/assets\/js\/"],"icon_url":"","type":"theme","id":"theme:e46567cd0f3ec9b37e7230dc87eac367","is_default":0,"created_at":1679737011},"5c9115d3-bcbd-49d6-8feb-4880d2b82bfe":{"title":"Rife Free","condition":"rife-free","exclusions":["\/rife-free\/js\/script.min.js","\/rife-free\/js\/isotope.pkgd.min.js","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","var reJS"],"icon_url":"","type":"theme","id":"theme:74a449954de79625eccc6750e87af8f6","is_default":0,"created_at":1679738107},"6542b2fd-1f91-4862-aa18-11eecc02faaf":{"title":"Roisin","condition":"roisin","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/themes\/roisin\/assets\/js\/main.min.js","\/plugins\/roisin-core\/assets\/js\/roisin-core.min.js","\/wp-includes\/js\/hoverIntent.min.js"],"icon_url":"","type":"theme","id":"theme:8f38fe58034772931110930b91cb6797","is_default":0,"created_at":1685964523},"5a192ad9-d150-4aa0-8efc-d68131cb7a37":{"title":"Sahifa - Mobile Menu","condition":"sahifa","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/themes\/sahifa\/js\/ilightbox.packed.js","\/translate_a\/element.js"],"icon_url":"","type":"theme","id":"theme:06ebe49f4c1e5b04cece831f8bb198a3","is_default":0,"created_at":1687540363},"7ae9d978-d63c-4a58-beb3-418bebb5b23c":{"title":"Salient","condition":"salient","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/salient\/","winW > bodyW"],"icon_url":"","type":"theme","id":"theme:b3e12d57ac23897be1bb2c673e3fc761","is_default":0,"created_at":1704735382},"35aaa6c5-4a37-4161-b504-fb3ebc4b1148":{"title":"Salient - Nectar slider","condition":"salient","exclusions":["\/salient-nectar-slider\/js\/nectar-slider.js","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js"],"icon_url":"","type":"theme","id":"theme:d612db1dd8dc76faa6a36a9ebfd336dc","is_default":0,"created_at":1704735415},"84c95206-3e59-4eb3-a0c9-e2231a1c0a48":{"title":"SEO Lounge","condition":"seolounge","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?$","\/js_composer\/assets\/js\/dist\/js_composer_front.min.js","\/seolounge\/js\/radiantthemes-custom.js","\/seolounge\/js\/radiantthemes-core.min.js"],"icon_url":"","type":"theme","id":"theme:3d72b779d9c4ba6b51cc5b245b141433","is_default":0,"created_at":1691695809},"cd44aa56-088a-40dd-bf1e-f835efa68626":{"title":"Shoptimizer","condition":"shoptimizer","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/shoptimizer\/assets\/js\/lazyload-bg.js","\/shoptimizer\/assets\/js\/main.min.js"],"icon_url":"","type":"theme","id":"theme:6c32b43f4da639e5901574fac6b7d387","is_default":0,"created_at":1679737143},"d2c48a48-430a-4eea-bc05-99b66f1f6a7b":{"title":"SmartMag","condition":"smart-mag","exclusions":["\/smart-mag\/js\/lazyload.js"],"icon_url":"","type":"theme","id":"theme:23d6b7878bd0087addb067db3fa39864","is_default":0,"created_at":1679738490},"dd0d9133-ef17-4dac-b174-9f25d535838f":{"title":"Soledad","condition":"soledad","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/soledad\/js\/main.js","\/soledad\/js\/more-post.js","\/soledad\/js\/libs-script.min.js"],"icon_url":"","type":"theme","id":"theme:d3f78b26c2d11c99230171cc6378d06e","is_default":0,"created_at":1679737664},"3b85dd6e-9534-477e-9b15-940d0e155c8d":{"title":"Spacious - Mobile Menu","condition":"spacious","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/spacious\/js\/navigation.js"],"icon_url":"","type":"theme","id":"theme:d423c1f002b10b8682ee24d616b19c9c","is_default":0,"created_at":1703192854},"d657dc56-5c04-439a-8987-401f89a65bf9":{"title":"Stockholm","condition":"stockholm","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/stockholm\/js\/"],"icon_url":"","type":"theme","id":"theme:fcfff492e00727b63cf5dff9f59bc2a4","is_default":0,"created_at":1679738378},"121f9b1b-d3cd-4dde-915e-0b348abf6687":{"title":"Storefront","condition":"storefront","exclusions":["\/storefront\/assets\/js\/navigation.min.js"],"icon_url":"","type":"theme","id":"theme:f0dca7e4eaedf573d4664be249845942","is_default":0,"created_at":1679738793},"41cfc83f-ff02-4a35-a3b7-e92db213b224":{"title":"StreamTube","condition":"streamtube","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/streamtube\/","\/streamtube-core\/"],"icon_url":"","type":"theme","id":"theme:9772ccddd470688f6bc6aee86e34d29b","is_default":0,"created_at":1679331431},"aec0a548-4c6b-400a-80ed-19a49e0faef0":{"title":"The7","condition":"dt-the7","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","loader-removed","\/Ultimate_VC_Addons\/assets\/min-js\/","\/dt-the7\/","\/js_composer\/"],"icon_url":"","type":"theme","id":"theme:7934c689fd20e30b6bfc69bb9d46cb63","is_default":0,"created_at":1679737892},"538354ff-d69f-40be-b0cc-df3790599dd2":{"title":"TheGem","condition":"thegem","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/thegem\/js\/","gemSettings","thegemSlideshow","tgpLazyItemsOptions"],"icon_url":"","type":"theme","id":"theme:153c54fe73897da838ce39152b1db5a8","is_default":0,"created_at":1679738477},"84d95a79-270c-4223-b459-bb49c6acfaf1":{"title":"Theme Electiman - Mobile Menu","condition":"electiman","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/themes\/electiman\/assets\/js\/navigation.js","\/themes\/electiman\/assets\/js\/theme-pluginjs.js","\/themes\/electiman\/assets\/js\/theme.js","\/themes\/electiman\/assets\/js\/slick.min.js","\/themes\/electiman\/venobox\/venobox.min.js","\/themes\/electiman\/assets\/js\/owl.carousel.min.js","\/wp-includes\/js\/imagesloaded.min.js"],"icon_url":"","type":"theme","id":"theme:a59c888391c869ed4f3417c02d71fe15","is_default":0,"created_at":1702923332},"3a59bf59-4fe5-4690-8ab7-33e6a976e2e3":{"title":"Thrive Theme Builder","condition":"thrive-theme","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/thrive-visual-editor\/editor\/js\/dist\/modules\/(.*).js","TVE_Event_Manager_Registered_Callbacks","ThriveGlobal","TCB_Front","TL_Front","TVE_Ult","thrive-","thrive_","tve_","tve-"],"icon_url":"","type":"theme","id":"theme:7492fc8f8a90ad7ef680d9c560da2b0f","is_default":0,"created_at":1710767440},"68f2de3b-e2b8-4edf-b82f-93fd7834c65f":{"title":"Total","condition":"Total","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/Total\/assets\/js\/total.min.js"],"icon_url":"","type":"theme","id":"theme:96b0141273eabab320119c467cdcaf17","is_default":0,"created_at":1679737571},"6dc1cb35-6b50-4da0-9834-dddf169edaa6":{"id":"theme:7c37c885d7fecf788f635734f99e8610","title":"Townhub","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/townhub-add-ons\/assets\/js\/(.*)","\/wp-includes\/js\/dist\/vendor\/react.js","\/wp-includes\/js\/dist\/vendor\/react-dom.js"],"is_default":0,"condition":"townhub","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"f484f86b-e316-4871-9322-dee3925349fe":{"title":"Travel Monster - Owl Carousel","condition":"travel-monster","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/wp-content\/plugins\/wp-travel-engine\/assets\/lib\/owl-carousel(.*)\/owl.carousel(|.min).js","var isRtl"],"icon_url":"","type":"theme","id":"theme:d3e8da87b3affd399205438fbc8a4f05","is_default":0,"created_at":1690822771},"3ec96c3f-a6bf-4748-9b7e-78864bd24add":{"title":"uDesign - Mobile Menu","condition":"u-design","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/wp-content\/themes\/u-design\/assets\/js\/theme.min.js","\/wp-content\/themes\/u-design\/framework\/assets\/js\/framework.min.js","\/wp-content\/themes\/u-design\/framework\/assets\/js\/framework-async.min.js"],"icon_url":"","type":"theme","id":"theme:31ce70b0a02f8720a86d993816676943","is_default":0,"created_at":1699292981},"cb523239-27cc-461e-973d-c984a83223ac":{"title":"uDesign - Show Page Content on Load","condition":"u-design","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/wp-content\/themes\/u-design\/assets\/js\/theme.min.js","\/wp-content\/themes\/u-design\/framework\/assets\/js\/framework.min.js"],"icon_url":"","type":"theme","id":"theme:c55edd40ad3f9321da577dad70bb130c","is_default":0,"created_at":1698778683},"14cb0a85-8bee-491e-99d7-5f20a07f4bdd":{"title":"Uncode","condition":"uncode","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/uncode\/library\/js\/init(.min)?.js","\/uncode\/library\/js\/plugins(.min)?.js","\/uncode\/library\/js\/app(.min)?.js","\/uncode\/library\/js\/woocommerce-uncode(.min)?.js","\/wp-includes\/js\/mediaelement\/mediaelement-and-player.min.js","initHeader","initBox","fixMenuHeight","initRow"],"icon_url":"","type":"theme","id":"theme:18ba19b98aefbb6c0fde6c6bf92e9cfc","is_default":0,"created_at":1679738154},"a1fbf155-720a-4704-9794-d6749ad6df59":{"title":"Vivo theme - Fix blank page","condition":"vivo","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/vivo\/framework\/assets\/js\/bt_framework_misc.js"],"icon_url":"","type":"theme","id":"theme:a140e640fed504586e24e7c0df30376b","is_default":0,"created_at":1704308662},"88e96479-1aa2-4adc-8f07-20bc0368a63f":{"title":"Werkstatt","condition":"werkstatt","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/js\/underscore.min.js","\/werkstatt\/assets\/js\/vendor.min.js","\/werkstatt\/assets\/js\/fullscreen.min.js","\/werkstatt\/assets\/js\/app.min.js"],"icon_url":"","type":"theme","id":"theme:38faa29db5a07b8fef6aee9cc11cafec","is_default":0,"created_at":1679737639},"60c4110b-a960-4d44-b619-6d79514dbf75":{"title":"Woodmart","condition":"woodmart","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/imagesloaded.min.js","\/woodmart\/js\/scripts\/wc\/","\/woodmart\/js\/scripts\/global\/","\/woodmart\/js\/libs\/owl.carousel.min.js","\/woodmart\/js\/libs\/owl.carousel.js","\/woodmart\/js\/libs\/slick.js","\/woodmart\/js\/libs\/autocomplete.min.js"],"icon_url":"","type":"theme","id":"theme:06338f13cb89e5309ad2eb7e4d457be4","is_default":0,"created_at":1695633901},"a4547b5b-10ab-407c-969c-269fddec07b8":{"title":"Woodmart - Cart Fragments","condition":"woodmart","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/woocommerce\/assets\/js\/frontend\/cart-fragments.min.js","\/woocommerce\/assets\/js\/js-cookie\/js.cookie.min.js","\/woodmart\/js\/scripts\/wc\/updateCartFragmentsFix.js"],"icon_url":"","type":"theme","id":"theme:591f4f1b2e86b1e987cd8789df3ffce3","is_default":0,"created_at":1700584689},"119ebd1c-6b46-4f07-8d6a-3498d9c8814f":{"title":"XStore","condition":"xstore","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/xstore\/js\/","\/et-core-plugin\/packages\/st-woo-swatches\/public\/js\/frontend.min.js"],"icon_url":"","type":"theme","id":"theme:3de9d9ba385200548f177d9c704ae92a","is_default":0,"created_at":1679738190},"9a7a548c-07a1-4dff-93fc-6e8230b67853":{"id":"theme:119d329456073aa10969d7cbd9760f28","title":"YOOtheme Pro","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","uikit.min.js"],"is_default":0,"condition":"yootheme","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"f74c499e-b7d9-4590-8671-379f51f468c8":{"title":"Zeen","condition":"zeen","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/zeen\/assets\/js\/","\/js.cookie.min.js"],"icon_url":"","type":"theme","id":"theme:acb52844f996627788836366404a3245","is_default":0,"created_at":1679737859}},"scripts":{"dd0c5a5b-ec56-49f9-9aa4-89e1e3a6a28a":{"title":"Amazon Ads","exclusions":["amazon-adsystem.com"],"icon_url":"","type":"script","id":"script:b82a5936d8ea0745016caeb71629ae5d","is_default":0,"created_at":1681390276},"980edf32-c64b-4370-bf23-c62b079e71c3":{"title":"Google AdSense","exclusions":["adsbygoogle"],"icon_url":"","type":"script","id":"script:0206e6040c8ff64b8d6ee5fef2ce1c90","is_default":0,"created_at":1681377840},"2499bb90-0753-4b2b-9bd4-1525f94c7437":{"title":"Google Analytics","exclusions":["google-analytics.com\/analytics.js","ga\\( '","ga\\('"],"icon_url":"","type":"script","id":"script:d86cf69a8b82547a94ca3f6a307cf9a6","is_default":0,"created_at":1681388311},"6f460036-3106-4b8c-9951-d32de9b1258f":{"title":"Google Maps","exclusions":["maps.googleapis.com","maps.google.com"],"icon_url":"","type":"script","id":"script:4d60ab2c6d11d753267484006c23e54c","is_default":0,"created_at":1681390259},"ac2d5720-9418-468c-80a0-3874ee743c0f":{"title":"Google Optimize","exclusions":["a,s,y,n,c,h,i,d,e","googleoptimize.com\/optimize.js","async-hide"],"icon_url":"","type":"script","id":"script:031a0cece38c4739df67f910dcabf1bd","is_default":0,"created_at":1681390261},"122e6ebb-51fd-477f-97fb-559593f1a48b":{"title":"Google Recaptcha","exclusions":["recaptcha"],"icon_url":"","type":"script","id":"script:032cb16577cbf07bc7c02bac83bd936d","is_default":0,"created_at":1681390264},"219277ae-b2ac-4d42-913d-eaea40985295":{"title":"Google Tag Manager","exclusions":["\/gtag\/js","gtag\\(","\/gtm.js","async-hide"],"icon_url":"","type":"script","id":"script:1d3c65b2b03ef35e14df6b163ea3a1f6","is_default":0,"created_at":1681390266},"f632e3f4-20e6-471e-a78d-86afbea63586":{"title":"HubSpot","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","js.hsforms.net","hbspt.forms.create"],"icon_url":"","type":"script","id":"script:de4bd8ef4675ebb85a055955de76d0ee","is_default":0,"created_at":1679331623},"5d606add-ffb8-4a06-b295-5f722710fbfd":{"title":"Refari","exclusions":["widget.refari.co","refari"],"icon_url":"","type":"script","id":"script:a705e197b13b47e72a105c923e044358","is_default":0,"created_at":1683797056},"742ec14a-27a1-4789-b9c8-a9c3a3cf7042":{"title":"Reviews.io","exclusions":["\/carousel-inline-iframeless\/dist.js","carouselInlineWidget"],"icon_url":"","type":"script","id":"script:4df445c576f45889506ba175a4c39fdc","is_default":0,"created_at":1684389426},"05d3eb78-f574-49be-95e1-3f11714005d1":{"id":"script:ce7566d1d08cc094b74cf283cf9c56a5","title":"Stripe","type":"script","icon":"","exclusions":["js.stripe.com"],"is_default":0,"condition":"","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"ce9a3865-9efa-4e98-ae10-4f842a4ecc22":{"title":"Typeform","exclusions":["\/next\/embed.js"],"icon_url":"","type":"script","id":"script:cd3889ae3b96f891186ae270dbbcc9bb","is_default":0,"created_at":1709838856},"b56bf06c-2f8c-4757-b536-a689fb0e75f9":{"title":"Typekit","exclusions":["typekit"],"icon_url":"","type":"script","id":"script:7815e38b93e3b500a632681bd594bd61","is_default":0,"created_at":1681390268},"49c38c0a-43b9-4237-88cb-57ddd519f0ad":{"title":"Venatus Media","exclusions":["\/ad-manager.min.js","__vm_add"],"icon_url":"","type":"script","id":"script:abe11528732aed9a19a97e73b242faa5","is_default":0,"created_at":1681390272},"2c1d0998-8ab5-478c-8eb9-9e375b46363e":{"title":"Wistia","exclusions":["fast.wistia.com"],"icon_url":"","type":"script","id":"script:9a0111f8c3186c1cb3113587c660c041","is_default":0,"created_at":1681390274},"0627fe24-7e9d-400f-b064-d98bec2ba85e":{"id":"script:dbd1875130c71eb4b2ef768ad18d820c","title":"Yandex Ads","type":"script","icon":"","exclusions":["yandex.ru","window.yaContextCb"],"is_default":0,"condition":"","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""}}} \ No newline at end of file +{"plugins":{"ffc21030-519a-4853-8cea-49f959e82731":{"id":"plugin:def67a2c1ddd6df2353e4772b6fd4e5b","title":"Additional Variation Images Gallery for WooCommerce","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/woo-variation-gallery\/assets\/js\/slick.min.js","\/woo-variation-gallery\/assets\/js\/frontend.min.js","\/wp-includes\/js\/underscore.min.js","variation_custom_fields"],"is_default":0,"condition":"woo-variation-gallery\/woo-variation-gallery.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"0e7dc253-acd0-4421-877f-a7101d848717":{"id":"plugin:4b82cc7379d46c6272f5d556bb264eec","title":"Advanced Ads","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/uploads\/(.*).js","advanced_ads_ready","advadsCfpQueue","adsbygoogle","adservice.google","\/advanced-ads(.*)","advads_items","advads_tracking_ads"],"is_default":0,"condition":"advanced-ads\/advanced-ads.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"a4d5c058-9120-47ee-977c-f30f83fb1a75":{"id":"plugin:a076fbb79772f497349a76ee74a7f708","title":"All-in-one Compliance for GDPR \/ CCPA Cookie Consent","type":"plugin","icon":"","exclusions":["iubenda_cs.js","var _iub"],"is_default":0,"condition":"iubenda-cookie-law-solution\/iubenda_cookie_solution.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"79a5082f-821a-4a4b-a0e3-caaf22cf3f75":{"id":"plugin:9bdceaa1bb89135730a3b2aa4db94c22","title":"AMO Team Showcase","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/amo-team-showcase\/public\/js\/wookmark.js","\/amo-team-showcase\/public\/js\/amo-team-showcase-public.js","\/wp-includes\/js\/imagesloaded.min.js","amoTeamVars"],"is_default":0,"condition":"amo-team-showcase\/amo-team-showcase.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"90c7fd90-3adf-4cb7-8a92-845bdbd95d27":{"title":"Anti-Spam by CleanTalk - Prevent console error","condition":"cleantalk-spam-protect\/cleantalk.php","exclusions":["ctPublicFunctions","ctPublic"],"icon_url":"","type":"plugin","id":"plugin:ed2ade77cd44e21b1703b093c002a903","is_default":0,"created_at":1699370420},"e054f840-700a-4549-bbba-485473a53f71":{"title":"AnWP Football Leagues - Calendar Widget","condition":"football-leagues-by-anwppro\/anwp-football-leagues.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/football-leagues-by-anwppro\/(.*)","\/football-leagues-by-anwppro-premium-premium\/(.*)","window.AnWPFLPro","window.AnWPFLTabulator","\/elementor\/assets\/lib\/flatpickr\/flatpickr.min.js"],"icon_url":"","type":"plugin","id":"plugin:e7581089f33fdf0a970d5c5deb16ff50","is_default":0,"created_at":1708535321},"1d058cae-4460-4354-bab3-a96445650bd8":{"id":"plugin:b739df50f3f5bf400075f17dca652517","title":"AnyWhere Elementor Pro","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/anywhere-elementor-pro\/build\/index.js"],"is_default":0,"condition":"anywhere-elementor-pro\/anywhere-elementor-pro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"8a1614c7-55b1-4b6d-88e5-6e8ddc630dae":{"id":"plugin:46741e77eaf4d13a0c80be6b86379758","title":"Astra - Pro Addon","type":"plugin","icon":"","exclusions":["\/astra-addon\/astra-addon-(.*).js"],"is_default":0,"condition":"astra-addon\/astra-addon.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"37d96403-f9ea-4481-b2f8-374d7c93e61a":{"id":"plugin:ccd87807930a1856717fd276c336db9a","title":"Beaver Builder","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/uploads\/bb-plugin\/","\/bb-plugin\/js\/yui3.min.js","\/wp-includes\/js\/imagesloaded.min.js","\/bb-plugin\/js\/fl-slideshow.min.js"],"is_default":0,"condition":"beaver-builder-lite-version\/fl-builder.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"f83dbf3b-783e-4ef9-9b18-8a469ca7102d":{"title":"Bloom","condition":"bloom\/bloom.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/bloom\/"],"icon_url":"","type":"plugin","id":"plugin:e57cdfbc09f4e0f7445c279d9f580bdd","is_default":0,"created_at":1685189070},"135aadd2-cd4a-44ae-8dcf-801f3f2316c0":{"id":"plugin:055ef01accbad6378e3d1a4965600964","title":"Booked","type":"plugin","icon":"","exclusions":["\/booked\/","\/js\/jquery\/ui\/datepicker.min.js"],"is_default":0,"condition":"booked\/booked.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"ddfee9b0-e5a9-4d3f-8c21-b999cbb61c33":{"id":"plugin:492f9b0d55f3bf07c68e915ea1dfb72a","title":"Bookly","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/bookly-responsive-appointment-booking-tool\/frontend\/","window.bookly"],"is_default":0,"condition":"bookly-responsive-appointment-booking-tool\/main.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"7a013fd6-0881-4dbe-8e93-33edefe7f717":{"title":"Borlabs Cookie","condition":"borlabs-cookie\/borlabs-cookie.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","borlabsCookieConfig","borlabs-cookie.min.js","borlabsCookieContentBlocker","BorlabsCookieBox","allFbWidgets","\/borlabs-cookie\/assets\/javascript\/","borlabs-cookie-config"],"icon_url":"","type":"plugin","id":"plugin:e1ec2daca513de476bd3dae79366e9ab","is_default":0,"created_at":1702497952},"3999e680-4049-4494-945c-768cecc1a2c4":{"id":"plugin:43019d66af7b41e65bb602c01e10c6a0","title":"Brizy","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/brizy\/public\/editor-build\/(.*)-wp\/editor\/js\/group-(.*).js","\/brizy\/public\/editor-build\/(.*)-wp\/editor\/js\/preview.js","Brizy.emit"],"is_default":0,"condition":"brizy\/brizy.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"af4d9357-3def-42a1-86b7-419553444b4d":{"id":"plugin:5c317f9f244597d8f236ecb7d8e41752","title":"Carousel Upsells and Related Product for WooCommerce","type":"plugin","icon":"","exclusions":["\/carousel-upsells-and-related-product-for-woocommerce\/assets\/js\/glide.min.js","carusel_poduct_related"],"is_default":0,"condition":"carousel-upsells-and-related-product-for-woocommerce\/ffxf-woo-glide-related-and-upsells.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"1d866d90-5451-43ba-a4d1-75b64f9235e1":{"id":"plugin:0a3a29603ebac8fe0808f64f5c8edbb2","title":"clickskeks.at Cookiebanner","type":"plugin","icon":"","exclusions":["clickskeks"],"is_default":0,"condition":"clickskeks\/index.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"c09695cc-2387-4416-881a-c0b392188a26":{"title":"Complianz","condition":"complianz-gdpr\/complianz-gpdr.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","complianz"],"icon_url":"","type":"plugin","id":"plugin:a766f95208154cd69a3e15150a42f325","is_default":0,"created_at":1685188788},"b5e146fc-0b7c-4c6c-a631-8da246d3bd89":{"title":"Conerstone Builder - Fix mobile menu","condition":"cornerstone\/cornerstone.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/cornerstone\/assets\/js\/site\/cs-classic.(.*).js"],"icon_url":"","type":"plugin","id":"plugin:f8f8c81535b5e0073aa3c56b6dd3df5b","is_default":0,"created_at":1708614275},"7e551e3b-fbe4-4235-87a9-b476bc9e2020":{"id":"plugin:949b1b923d51d10a2fb67a2a39d166b3","title":"Content Egg","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/content-egg\/res\/js\/morrisjs\/morris.min.js","\/content-egg\/res\/js\/morrisjs\/raphael.min.js","Morris.Area"],"is_default":0,"condition":"content-egg\/content-egg.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"7fbca6c5-9239-4550-a755-6f041f867a57":{"title":"Cookie Notice & Compliance for GDPR \/ CCPA","condition":"cookie-notice\/cookie-notice.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/cookie-notice\/","var cnArgs"],"icon_url":"","type":"plugin","id":"plugin:213d0f883ae27aefb3a7937656bbd11e","is_default":0,"created_at":1681379736},"26722567-fe35-44b5-a5a7-fb0f3a38c3f2":{"id":"plugin:1d10ad30bbcf0fd4b26e9625a07abcfc","title":"Cookiebot CMP","type":"plugin","icon":"","exclusions":["consent.cookiebot.com"],"is_default":0,"condition":"cookiebot\/cookiebot.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"74110e36-89e5-440d-bec3-7133da3277c2":{"id":"plugin:edcf103293ceab711e999d419d038ca1","title":"Coupon Referral Program","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/coupon-referral-program\/","\/wp-includes\/js\/jquery\/ui\/draggable.min.js"],"is_default":0,"condition":"coupon-referral-program\/coupon-referral-program.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"ed63e02f-d6c5-481a-bcb9-aae15f72aa21":{"id":"plugin:c3e26264dcfd25802805b4fd1a2a449c","title":"Crisp - Live Chat and Chatbot","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","CRISP_RUNTIME_CONFIG","l.js"],"is_default":0,"condition":"crisp\/crisp.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"a8eb622b-279c-4f84-86e0-785e9497add7":{"id":"plugin:6e4bf949e12f0bebfefb48f6c316102a","title":"Custom Twitter Feeds pro","type":"plugin","icon":"","exclusions":["\/custom-twitter-feeds-pro\/js\/ctf-scripts.min.js"],"is_default":0,"condition":"custom-twitter-feeds-pro\/custom-twitter-feed.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"1624ef15-e25b-406d-bdf9-d4b78d7a59e7":{"title":"Customer Reviews for WooCommerce Plugin","condition":"customer-reviews-woocommerce\/ivole.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/customer-reviews-woocommerce\/js\/colcade.js"],"icon_url":"","type":"plugin","id":"plugin:1f893b343e72ce55e6c9013fbda172fa","is_default":0,"created_at":1704734788},"396cc03a-8946-4ee8-ab15-7e48261df79a":{"title":"Divi - Carousel Module 2.0","condition":"dg-divi-carousel","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/wp-content\/plugins\/dg-divi-carousel\/"],"icon_url":"","type":"plugin","id":"plugin:fcd789b7d02699f89720aa5ff3627912","is_default":0,"created_at":1709126476},"c15fe3b3-0eaa-48f9-bf04-0e778b1f8c63":{"title":"Divi - Supreme","condition":"supreme-modules-for-divi\/supreme-modules-for-divi.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js",".dipi_preloader_wrapper_outer","\/Divi\/js\/scripts.min.js","\/Divi\/js\/custom.unified.js","\/js\/magnific-popup.js","var DIVI","\/supreme-modules-for-divi\/"],"icon_url":"","type":"plugin","id":"plugin:b5489ae4d8b949f536d6dd2e5b0c1a95","is_default":0,"created_at":1679738701},"dd31451b-989a-4517-b02a-e2c2e2023366":{"id":"plugin:5caed322df984bbfd3ecb506cf12b688","title":"Divi Den Pro","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/ddpro\/build\/freddie\/js\/freddieScriptPageTransition.js","\/ddpro\/build\/freddie\/js\/freddieScriptsHeaders.js","\/ddpro\/build\/freddie\/js\/freddieScriptsContents.js","\/ddpro\/build\/freddie\/js\/gsap\/gsap.min.js"],"is_default":0,"condition":"ddpro\/ddpro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"2b006370-cc90-42c1-9656-a30fbfbc91c6":{"id":"plugin:402d9b241b04934dd30f32e7ba490e63","title":"Divi Mobile","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","divi-menu","dm_nav"],"is_default":0,"condition":"divi-mobile\/divi-mobile.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"666bbed9-7ce3-457c-ad6e-b5e056d05010":{"title":"Divi Overlays","condition":"divi-overlays\/divi-overlays.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js",".dipi_preloader_wrapper_outer","\/Divi\/js\/scripts.min.js","\/Divi\/js\/custom.unified.js","var DIVI","\/divi-overlays\/"],"icon_url":"","type":"plugin","id":"plugin:1c828c93d87298d2a27c76e13d0880ba","is_default":0,"created_at":1679738664},"42a404af-7792-44be-9baa-565dc3baf25d":{"title":"Divi Pixel","condition":"divi-pixel\/divi-pixel.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js",".dipi_preloader_wrapper_outer","\/divi-pixel\/dist\/public\/js\/hamburger.min.js"],"icon_url":"","type":"plugin","id":"plugin:dd2494945a487a6cc74d3ab1b2137ccb","is_default":0,"created_at":1686859169},"85f5c099-c481-4c38-bbb9-8b76113bdfd5":{"title":"Divi Supreme Pro","condition":"supreme-modules-pro-for-divi\/supreme-modules-pro-for-divi.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","elm.style.display","\/supreme-modules-pro-for-divi\/includes\/modules\/ImageCarousel\/frontend.min.js","\/supreme-modules-pro-for-divi\/public\/js\/swiper-bundle.min.js"],"icon_url":"","type":"plugin","id":"plugin:3d5f0ae7751702fd1bb490fcf991a334","is_default":0,"created_at":1695118162},"0b78d762-c7be-45de-9aae-0c5078ec0619":{"id":"plugin:b5fc0101608d0b0627268dc49e3e1f8f","title":"Divi Toolbox","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","jQuery('.preloader')","\/divi-toolbox\/assets\/js\/toolbox-scripts.js"],"is_default":0,"condition":"divi-toolbox\/divi-toolbox.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"31a34440-1383-40c4-8920-effcf99f2165":{"title":"Dracula Dark Mode","condition":"dracula-dark-mode-premium\/plugin.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/wp-content\/plugins\/dracula-dark-mode-premium\/assets\/js\/dark-mode.js","\/wp-content\/plugins\/dracula-dark-mode-premium\/assets\/js\/frontend.js","\/wp-includes\/js\/dist\/vendor\/react-dom.min.js","\/wp-includes\/js\/dist\/vendor\/react.min.js","\/wp-includes\/js\/dist\/api-fetch.min.js","\/wp-includes\/js\/dist\/hooks.min.js","\/wp-includes\/js\/dist\/i18n.min.js","draculaDarkMode"],"icon_url":"","type":"plugin","id":"plugin:5e8a5d8d3830136d84d0f3676f1bf5a5","is_default":0,"created_at":1704210236},"8baba0f8-4449-47d8-a87d-9b6a116e7684":{"title":"Dynamic Pricing & Discounts Lite for WooCommerce","condition":"woo-dynamic-pricing-discounts-lite\/dynamic-pricing-discounts-lite-for-woocommerce.php","exclusions":["\/woo-dynamic-pricing-discounts-lite\/assets\/OwlCarousel\/dist\/owl.carousel.min.js","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js"],"icon_url":"","type":"plugin","id":"plugin:185062bf08db42515488e1853d1f4917","is_default":0,"created_at":1677857247},"0fa129f2-5869-4db7-9bf0-69e4b3549ee2":{"id":"plugin:27478327aa44075a86176fad95640d76","title":"Dynamic Product Gallery for WooCommerce","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/woocommerce-dynamic-gallery\/","a3revWCDynamicGallery"],"is_default":0,"condition":"woocommerce-dynamic-gallery\/wc_dynamic_gallery_woocommerce.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"9958c6be-2f67-4791-95c3-a7ad96d599c0":{"title":"Dynamic Product Gallery Premium for WooCommerce","condition":"woocommerce-dynamic-gallery-pro\/wc_dynamic_gallery_woocommerce.php","exclusions":["\/jquery-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?$","\/jquery-migrate(.*)(.min|.slim|.slim.min)?.js(\\?(.*))?$","\/woocommerce-dynamic-gallery-pro\/assets\/js\/mygallery\/jquery.a3-dgallery.js","settings_defaults_","a3revWCDynamicGallery"],"icon_url":"","type":"plugin","id":"plugin:11dc02a76019f00422f4ac85f47f5135","is_default":0,"created_at":1683208937},"ce26ed21-1be5-481f-80d4-31edfac6d890":{"title":"Dynamic.ooo - Dynamic Content for Elementor","condition":"dynamic-content-for-elementor\/dynamic-content-for-elementor.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","\/wp-includes\/js\/imagesloaded.min.js","ElementorProFrontendConfig","elementorFrontendConfig","\/dynamic-content-for-elementor\/assets\/","\/wp-includes\/js\/dist\/hooks.min.js","\/wp-includes\/js\/dist\/i18n.min.js"],"icon_url":"","type":"plugin","id":"plugin:d2bd5b348abe016bdc722acce7755062","is_default":0,"created_at":1683355024},"6a3161a6-1a6f-457a-a9ee-54b376981927":{"id":"plugin:ee1dec033c6481a77fe88de5bef1a02d","title":"Easy Table of Contents","type":"plugin","icon":"","exclusions":["\/easy-table-of-contents\/assets\/js\/front.min.js"],"is_default":0,"condition":"easy-table-of-contents\/easy-table-of-contents.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"25a534a0-2c1f-4cf4-9e19-7941bc032b3a":{"title":"Ecwid Ecommerce Shopping Cart","condition":"ecwid-shopping-cart\/ecwid-shopping-cart.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","app.ecwid.com\/script.js","\/ecwid-shopping-cart\/js\/frontend.js","\/ecwid-shopping-cart\/js\/static-page.js","ecwidParamswindow.ec","jQuery.mobile","xSearch","xCategoriesV2","xProductBrowser","Ecwid.init"],"icon_url":"","type":"plugin","id":"plugin:41c8f5f0ab00cb39654aedd783d194e0","is_default":0,"created_at":1704734846},"40464325-5bae-4a20-bc97-553499e09a73":{"title":"Elementor","condition":"elementor\/elementor.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","\/wp-includes\/js\/imagesloaded.min.js","ElementorProFrontendConfig","elementorFrontendConfig","\/happy-elementor-addons-pro\/","\/header-footer-elementor\/inc\/js\/frontend.js","\/wp-includes\/js\/jquery\/ui\/core.min.js","\/wp-includes\/js\/dist\/api-fetch.min.js","\/wp-includes\/js\/dist\/hooks.min.js","\/wp-includes\/js\/dist\/i18n.min.js"],"icon_url":"","type":"plugin","id":"plugin:1d15783218a3137bec4ee8df5353e218","is_default":0,"created_at":1694425872},"ac86b64c-c80a-4053-894d-6caa8b4fdce8":{"title":"Elementor Loop Carrousel","condition":"elementor\/elementor.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/jquery\/ui\/core.min.js","\/wp-includes\/js\/dist\/api-fetch.min.js","\/wp-includes\/js\/dist\/hooks.min.js","\/wp-includes\/js\/dist\/i18n.min.js"],"icon_url":"","type":"plugin","id":"plugin:0eb8d0bbd1c7ca05ac133ea634f676b7","is_default":0,"created_at":1694442056},"a8fc9fd1-f6d3-41eb-abe9-ef176de6d7e2":{"title":"Elementor - Lazy Load Background Images","condition":"elementor\/elementor.php","exclusions":["lazyloadRunObserver"],"icon_url":"","type":"plugin","id":"plugin:bf248cb2876558452a566c5dd89262b8","is_default":0,"created_at":1694453032},"1948aff5-7850-4979-91fa-0ce181484508":{"id":"plugin:de658ae6c2d05a5a4a947efecf5e0c16","title":"Elementor Custom Skin","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/ele-custom-skin(.*)\/assets\/js\/"],"is_default":0,"condition":"ele-custom-skin\/ele-custom-skin.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"25708299-c596-4416-8ad8-740aee0f2752":{"title":"Elementor Pro","condition":"elementor-pro\/elementor-pro.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","\/wp-includes\/js\/imagesloaded.min.js","ElementorProFrontendConfig","elementorFrontendConfig","\/happy-elementor-addons-pro\/","\/header-footer-elementor\/inc\/js\/frontend.js"],"icon_url":"","type":"plugin","id":"plugin:030ad23e3851ed7adfa7b9b6c13cf5a6","is_default":0,"created_at":1679490021},"f34dd874-4b34-41e6-a31c-ece3c1efbffc":{"id":"plugin:305581ad4294a30eeb1247982f626005","title":"Elementor Pro - SmartMenus","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor-pro\/assets\/lib\/smartmenus\/jquery.smartmenus.min.js","\/elementor-pro\/assets\/js\/preloaded-elements-handlers.min.js"],"is_default":0,"condition":"elementor-pro\/elementor-pro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"111cc8b2-0be9-438b-9aa3-7f1e301a5697":{"id":"plugin:5ae9f5d99224d5ebc7d0c0bbf5b99787","title":"Elementor Pro - User Cache","type":"plugin","icon":"","exclusions":["\/wp-includes\/js\/underscore.min.js","\/wp-includes\/js\/jquery\/ui\/core.min.js","\/wp-includes\/js\/backbone.min.js","elementorAdminBarConfig","elementorCommonConfig","elementorWebCliConfig","elementorDevToolsConfig"],"is_default":0,"condition":"elementor-pro\/elementor-pro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"c1713bf8-e0c3-4cb5-8b3f-841b06aa87ed":{"title":"ElementsKit Lite - Megamenu","condition":"elementskit-lite\/elementskit-lite.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/elementskit(.*)\/"],"icon_url":"","type":"plugin","id":"plugin:b91fed2fc4478dbb7067742c1ee4691b","is_default":0,"created_at":1683270249},"706ff35d-8e33-4b04-a986-346faff704e9":{"id":"plugin:417192424139d89fb2a5b1ee1f2b9613","title":"Essential Addons for Elementor","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/essential-addons(-for)?-elementor(-lite)?\/.*(.min)?.js"],"is_default":0,"condition":"essential-addons-for-elementor-lite\/essential_adons_elementor.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"b38556dc-2bc4-430f-9c55-7191cf7773db":{"id":"plugin:057757d0593ad9d2dc58124f0077a5df","title":"Essential Addons for Elementor Pro","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/essential-addons(-for)?-elementor(-lite)?\/.*(.min)?.js"],"is_default":0,"condition":"essential-addons-elementor\/essential_adons_elementor.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"719b988f-0d60-40c2-ba46-88f943119cb1":{"id":"plugin:c8e6c490f6438f566ade600c33531a85","title":"Essential Grid","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/essential-grid\/","lightboxOptions"],"is_default":0,"condition":"essential-grid\/essential-grid.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"47d3d2ab-160d-4b07-ac25-8250b9e6a951":{"id":"plugin:dafd19fa48a1fef890dc4348052fcb75","title":"EventON Lite","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/eventon-lite\/assets\/js\/(.*)"],"is_default":0,"condition":"eventon-lite\/eventon.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"219968d7-cf1f-4ee0-917a-db35dcc93a3e":{"id":"plugin:49ff465628fc3cb6d7f23ff81d9b8339","title":"FacetWP","type":"plugin","icon":"","exclusions":["\/facetwp\/assets\/js\/dist\/front.min.js","window.FWP_"],"is_default":0,"condition":"facetwp\/index.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"acce5701-5917-48d5-83ab-3e626aa420c5":{"id":"plugin:78a1c88a56fa957c802074b6418c6fac","title":"FacetWP - Flyout menu","type":"plugin","icon":"","exclusions":["\/facetwp-flyout\/assets\/js\/front.js"],"is_default":0,"condition":"facetwp-flyout\/facetwp-flyout.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"081461cf-dbd0-42f3-9557-10cdc16cf145":{"title":"FiboFilters Premium","condition":"fibofilters-pro\/fibofilters.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/fibofilters-pro\/build\/front-pro\/front.js"],"icon_url":"","type":"plugin","id":"plugin:d9f62725f1470d35c3f220645bc2e473","is_default":0,"created_at":1709923289},"f2a5b95f-1a22-46d2-8b72-42a53e46ae3f":{"id":"plugin:5d7555892a3a9968fde3fa3a335fc3d8","title":"FiboSearch - Ajax Search for WooCommerce","type":"plugin","icon":"","exclusions":["\/wp-includes\/js\/jquery\/jquery.js","\/wp-includes\/js\/jquery\/jquery-migrate.js","\/ajax-search-for-woocommerce-premium\/assets\/js\/search.js"],"is_default":0,"condition":"ajax-search-for-woocommerce\/ajax-search-for-woocommerce.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"7d1404e9-be76-449c-87aa-919557abe82d":{"id":"plugin:ad46179e8b0584abaf52056b846da227","title":"FlexBlock","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/flo-flex-builder\/dist\/flex-public.min.js","flexDebug"],"is_default":0,"condition":"flo-flex-builder\/flo-flex-builder.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"b9c6a2dc-b226-4e2c-b85e-29ee55b8f751":{"id":"plugin:567a2b15db30ef6bd4904e4317139aac","title":"Fluent Forms","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/fluentform\/public\/js\/(.*).js","\/fluentformpro\/public\/js\/(.*).js"],"is_default":0,"condition":"fluentform\/fluentform.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"10874f8a-2855-4e80-bc46-e484589b76a8":{"id":"plugin:e78c153103f698b2b34892332d6b3b62","title":"Flying Images","type":"plugin","icon":"","exclusions":["flyingImages"],"is_default":0,"condition":"nazy-load\/flying-images.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"53958499-dacd-41d6-93bc-1534fe7d9eda":{"id":"plugin:5a0e40a6c5783856893b803189de1404","title":"FooGallery Premium","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/plugins\/foobox-image-lightbox\/free\/js\/foobox.free.min.js","\/plugins\/foogallery-premium\/pro\/extensions\/default-templates\/shared\/js\/foogallery.min.js"],"is_default":0,"condition":"foogallery-premium\/foogallery.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"7870d704-2024-4622-838c-fad37d5c6753":{"id":"plugin:ebb5efb57b19ae60e734e456ca2df3f8","title":"Formidable Forms","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","frmSigs","\/formidable-signature\/js\/frm.signature.min.js"],"is_default":0,"condition":"formidable\/formidable.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"3f24f9b3-e59e-400f-a784-999f93f60fab":{"id":"plugin:0b08523445b8869a67ca40e777704692","title":"Forminator","type":"plugin","icon":"","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","forminatorFront","\/forminator\/build\/front\/front.multi.min.js","\/forminator\/assets\/js\/library\/jquery.validate.min.js","\/forminator\/assets\/forminator-ui\/js\/forminator-form.min.js","\/forminator\/assets\/forminator-ui\/js\/select2.full.min.js","\/wp-includes\/js\/jquery\/ui\/datepicker.min.js","\/wp-includes\/js\/dist\/vendor\/moment.min.js"],"is_default":0,"condition":"forminator\/forminator.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"3a600ded-3454-48fb-9811-46afa2ab3c05":{"id":"plugin:5759bf0d47ac3457485314b381a9b528","title":"GDPR Cookie Compliance","type":"plugin","icon":"","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/gdpr-cookie-compliance\/dist\/scripts\/main.js"],"is_default":0,"condition":"gdpr-cookie-compliance\/moove-gdpr.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"e21aaa5e-7354-471d-ab86-85f99f48830c":{"id":"plugin:ffb40036ab0583218561de7c28c6bd9b","title":"GDPR Cookie Consent","type":"plugin","icon":"","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/public\/js\/cookie-law-info-public.js","Cli_Data"],"is_default":0,"condition":"webtoffee-gdpr-cookie-consent\/cookie-law-info.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"c11ca4ea-1a23-49ee-9a6b-1e549de50ea2":{"id":"plugin:3877953c5ec1e66db92ad844ae8ebafc","title":"Getwid - Gutenberg Blocks","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/wp-includes\/js\/jquery\/ui\/tabs.min.js","\/wp-includes\/js\/jquery\/ui\/core.min.js"],"is_default":0,"condition":"getwid\/getwid.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"79b33eb9-bc92-4d8a-afd8-1c61e70bed8f":{"title":"GiveWP","condition":"give\/give.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/give\/assets\/dist\/js\/give.js","\/wp-includes\/js\/dist\/api-fetch.min.js","\/wp-includes\/js\/dist\/hooks.min.js","\/wp-includes\/js\/dist\/i18n.min.js"],"icon_url":"","type":"plugin","id":"plugin:0fb3af06fc5c710a670220b054c292c5","is_default":0,"created_at":1706652232},"3773bb33-b168-4f68-9963-512da24ac4da":{"title":"GoodLayers Core","condition":"goodlayers-core\/goodlayers-core.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/goodlayers-core\/plugins\/script.js","\/goodlayers-core\/include\/js\/page-builder.js"],"icon_url":"","type":"plugin","id":"plugin:5f124509a56ca2e0644246919ec70434","is_default":0,"created_at":1704734904},"2adabe9b-6e03-4a67-959f-492813d40f69":{"title":"Google Tag Manager for WooCommerce PRO","condition":"gtm-ecommerce-woo-pro\/gtm-ecommerce-woo-pro.php","exclusions":["\/gtm-ecommerce-woo-pro\/assets\/gtm-ecommerce-woo-pro.js"],"icon_url":"","type":"plugin","id":"plugin:e54fd4313007b6fedf8ab4df0e05277a","is_default":0,"created_at":1691218549},"7bf261ac-89d4-492f-8a3d-1c5809b9579a":{"title":"Gravity Forms","condition":"gravityforms\/gravityforms.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/gravityforms\/","gform","recaptcha","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/wp-includes\/js\/plupload\/plupload.min.js","\/wp-includes\/js\/plupload\/moxie.min.js"],"icon_url":"","type":"plugin","id":"plugin:7a1c1606d094f6bff83c0ee155908367","is_default":0,"created_at":1694457903},"12340193-5c35-4b0d-b0bc-bea690cf1cae":{"id":"plugin:2f3112dd98c39aeb6bde618c9026a29f","title":"Green Forms","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","leform.min.js","leform_customjs_handlers","leform_ajax_url"],"is_default":0,"condition":"green-forms\/green-forms.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"4d20b427-47cf-4cdf-91c7-ff53602d3b2a":{"id":"plugin:0eb769dddc58f998e913345841b1d0b3","title":"GTM4WP","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","dataLayer"],"is_default":0,"condition":"duracelltomi-google-tag-manager\/duracelltomi-google-tag-manager-for-wordpress.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"a2b3c237-728c-49d6-882a-e3885444e9b4":{"id":"plugin:3b085ccda851ccf129d9506462f0cd65","title":"GTranslate","type":"plugin","icon":"","exclusions":["translate.google.com","googleTranslateElementInit"],"is_default":0,"condition":"gtranslate\/gtranslate.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"40cd9336-e73f-4a61-a7f6-27ec1ca6892c":{"id":"plugin:e1f17c1eac230219e6fec3ac07406a0d","title":"HBook","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/hbook\/","hb_booking_form_data","hb_max_date"],"is_default":0,"condition":"hbook\/hbook.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"192224c7-df72-4e3d-8f13-3206ac5b2e90":{"title":"Helper - OpenAI Chatbot for WordPress","condition":"\/helper\/index.php","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/helper\/js\/helper.min.js","mdpHelper"],"icon_url":"","type":"plugin","id":"plugin:07311d992a8a9d6af91e4766d2cb9ac9","is_default":0,"created_at":1691599768},"99cfbb2e-5678-42c2-928f-5cb09d7e43da":{"id":"plugin:269c5766fba124a838ac012a4b5a1a13","title":"HUSKY - Products Filter for WooCommerce","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/woocommerce-products-filter\/(.*)","woof"],"is_default":0,"condition":"woocommerce-products-filter\/index.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"3a964eac-4aeb-49a7-9fd6-4c31b2645dee":{"id":"plugin:d457acfec0f86aac6733f1446f4fc94f","title":"Instagram Feed Pro","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/instagram-feed-pro\/js\/sbi-scripts.min.js","sb_instagram_js_options"],"is_default":0,"condition":"instagram-feed-pro\/instagram-feed.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"8f9f4788-1b8d-468b-b291-1fcbd48618b9":{"id":"plugin:513b0c0ec8e12130af9b4bbbb17d7275","title":"Interactive Geo Maps","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/interactive-geo-maps-premium\/assets\/public\/map-service\/app.min.js","\/interactive-geo-maps\/assets\/public\/map-service\/app.js","iMapsData","cdn.amcharts.com\/lib\/"],"is_default":0,"condition":"interactive-geo-maps\/interactive-geo-maps.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"cf650ca3-afa0-4a13-9e4f-f7cca19abac6":{"title":"Ivory Search","condition":"add-search-to-menu\/add-search-to-menu.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/add-search-to-menu\/public\/js\/ivory-search.min.js"],"icon_url":"","type":"plugin","id":"plugin:7430e9d2c985ae0a3339a7b7e1acc318","is_default":0,"created_at":1677852711},"17a5dd54-1f5e-4d57-a56d-a8a970651954":{"id":"plugin:1c8a1e1ba89a601f88654f094139b469","title":"JetBlocks","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/jet-blocks\/assets\/js\/jet-blocks.min.js"],"is_default":0,"condition":"jet-blocks\/jet-blocks.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"b6f78c90-9823-459a-8dc1-1257e5f0d4e3":{"id":"plugin:dac9ec782180f33d0fcc7c4e0e569b9d","title":"JetBlog","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor-pro\/","\/elementor\/","\/jet-blog\/","ElementorProFrontendConfig","elementorFrontendConfig","hasJetBlogPlaylist"],"is_default":0,"condition":"jet-blog\/jet-blog.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"e17173d8-6ef8-4e27-ba0f-379c9aea7eda":{"id":"plugin:0fe8895d1da5247b73a5d0b482df4ac4","title":"JetElements","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/jet-elements\/","hasJetBlogPlaylist","jetElements","\/wp-includes\/js\/jquery\/ui\/"],"is_default":0,"condition":"jet-elements\/jet-elements.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"cfd77501-9c9e-4f11-b994-0178a592fc08":{"title":"JetEngine","condition":"jet-engine\/jet-engine.php","exclusions":["\/jet-engine\/"],"icon_url":"","type":"plugin","id":"plugin:bc998e71546860c8c7f70c45a6c18972","is_default":0,"created_at":1686208296},"36fed829-a2d9-41b5-94f6-2c3b9f07a94e":{"id":"plugin:433a3173f2d06f7d02c7b91c06ed215d","title":"JetMenu","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor-pro\/","\/elementor\/","\/jet-blog\/assets\/js\/lib\/slick\/slick.min.js","\/jet-elements\/","\/jet-menu\/","elementorFrontendConfig","ElementorProFrontendConfig","hasJetBlogPlaylist","JetEngineSettings","jetMenuPublicSettings","\/jet-reviews\/assets\/js\/lib\/vue.min.js"],"is_default":0,"condition":"jet-menu\/jet-menu.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"580cfed7-f034-4e39-bc7a-cdd01923ce87":{"id":"plugin:51714cfdb43f231a1c93e7cffb1007ab","title":"JetPopup","type":"plugin","icon":"","exclusions":["\/jet-popup\/assets\/js\/lib\/anime-js\/anime.min.js","\/jet-popup\/assets\/js\/jet-popup-frontend.js","\/jet-woo-builder\/","var jetPopupData"],"is_default":0,"condition":"jet-popup\/jet-popup.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"d9cd2730-12e2-42d7-a082-6f0efcd466cc":{"id":"plugin:df3bc4b6a8a9f28a5ba24cb7496bbc72","title":"JetProductGallery","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/jet-woo-product-gallery\/assets\/lib\/swiper\/swiper.min.js","\/jet-woo-product-gallery\/assets\/js\/jet-woo-product-gallery.min.js"],"is_default":0,"condition":"jet-woo-product-gallery\/jet-woo-product-gallery.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"544aa37b-4d52-4182-99e8-abe23585da14":{"id":"plugin:5921fc95965ac7fccb7296957bd9abff","title":"JetReviews","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/jet-reviews\/assets\/js\/jet-reviews-frontend.js","\/jet-reviews\/assets\/js\/lib\/vue.min.js","jetReviewsWidget"],"is_default":0,"condition":"jet-reviews\/jet-reviews.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"963c7804-eede-4570-bd63-67066588b758":{"title":"JetSearch - Search results popup","condition":"jet-search\/jet-search.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/jet-search\/assets\/lib\/chosen\/chosen.jquery.min.js","\/jet-search\/assets\/js\/jet-search.js","\/jet-search\/assets\/lib\/jet-plugins\/jet-plugins.js"],"icon_url":"","type":"plugin","id":"plugin:13e8760379022187de982df2226a5be4","is_default":0,"created_at":1708541675},"a8460089-34b4-4f8f-8694-5d92fa48aa82":{"title":"JetSmartFilters","condition":"jet-smart-filters\/jet-smart-filters.php","exclusions":["jetOffcanvasInitialized"],"icon_url":"","type":"plugin","id":"plugin:0cd63a514de1f1acb88e2bde65c4bc8d","is_default":0,"created_at":1694447256},"fe3c4915-6f8b-49b7-aa9c-c97b264d9f12":{"id":"plugin:a346b60514ef52afeffc6e2ef2793da3","title":"JetSticky","type":"plugin","icon":"","exclusions":["\/jetsticky-for-elementor\/"],"is_default":0,"condition":"jetsticky-for-elementor\/jetsticky-for-elementor.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"853479dc-fff5-47cf-9a60-bf9b00f71fc4":{"title":"JetTabs for Elementor","condition":"jet-tabs\/jet-tabs.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/elementor\/","\/elementor-pro\/","\/wp-includes\/js\/imagesloaded.min.js","ElementorProFrontendConfig","elementorFrontendConfig","\/wp-content\/plugins\/jet-tabs\/assets\/js\/jet-tabs-frontend.min.js"],"icon_url":"","type":"plugin","id":"plugin:d887a6ffea25d759e8aecdb6b78917f7","is_default":0,"created_at":1697130971},"b7f89562-230c-4f63-8360-7aad6df31e02":{"id":"plugin:829272546b040d5aaeeeaf976b6cd4ec","title":"JetTricks","type":"plugin","icon":"","exclusions":["\/jet-tricks\/"],"is_default":0,"condition":"jet-tricks\/jet-tricks.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"90451e2a-553a-4496-9fa4-cffedbe69d43":{"id":"plugin:f44f3dbd09149f57db370e4132b057db","title":"JetWoo Widgets For Elementor","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/jetwoo-widgets-for-elementor\/assets\/js\/jet-woo-widgets.js","\/jet-woo-builder\/assets\/js\/jet-woo-builder.min.js","\/jet-woo-builder\/assets\/js\/frontend.min.js","\/wp-includes\/js\/imagesloaded.min.js"],"is_default":0,"condition":"jet-woo-builder\/jet-woo-builder.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"944718c2-48c6-4f53-aaa2-460d07e033cc":{"id":"plugin:ed318a971f8a047bed5b02ad546a9c18","title":"JetWooBuilder","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/dist\/hooks.min.js","\/wp-includes\/js\/dist\/i18n.min.js","\/elementor-pro\/","\/elementor\/","elementorFrontendConfig","ElementorProFrontendConfig","JetEngineSettings","\/jet-woo-builder\/","\/jet-woo-builder-custom-quantity-selectors-main\/assets\/js\/main.js"],"is_default":0,"condition":"jet-woo-builder\/jet-woo-builder.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"f5b62f59-1dae-4cdf-ac3f-f5e846fc9918":{"id":"plugin:9562e253cd4ac2b1e1f70e32cb4e32dc","title":"Layer Slider","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/LayerSlider\/assets\/static\/layerslider\/js\/layerslider.utils.js","\/LayerSlider\/assets\/static\/layerslider\/js\/layerslider.kreaturamedia.jquery.js","\/LayerSlider\/assets\/static\/layerslider\/js\/layerslider.transitions.js","initLayerSlider"],"is_default":0,"condition":"LayerSlider\/layerslider.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"e2be718d-83a2-4fa0-bc98-f0df52be3dc1":{"id":"plugin:1425e2735306796fe1539d9184a77e10","title":"LoftLoader Pro","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","loftloader.min.js"],"is_default":0,"condition":"loftloader-pro\/loftloader-pro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"cfa18552-656e-453c-9e14-c07522dc6598":{"id":"plugin:0bf67b8ba84771e1a367fe24590ef09c","title":"MailUp for WordPress","type":"plugin","icon":"","exclusions":["\/mailup-email-and-newsletter-subscription-form\/public\/js\/mailup-public.js","mailup-js-extra"],"is_default":0,"condition":"mailup-email-and-newsletter-subscription-form\/mailup.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"c5330c66-ba7b-45b1-87e4-ce590ab005dd":{"id":"plugin:10d0de28911c5f66463b9c8783f8148a","title":"Maintenance","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/maintenance\/"],"is_default":0,"condition":"maintenance\/maintenance.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"267aef71-afa0-4848-b6f8-3e1ca15c3a23":{"id":"plugin:9460789bdfe77425c895f130991a4cb4","title":"Maps Marker Pro","type":"plugin","icon":"","exclusions":["\/maps-marker-pro\/js\/mapsmarkerpro.js","var mapsMarkerPro"],"is_default":0,"condition":"maps-marker-pro\/maps-marker-pro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"b5a88b63-e906-49b3-8134-420139915ea6":{"title":"Master Popups","condition":"master-popups\/master-popups.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/plugins\/master-popups\/assets\/public\/js\/master-popups-libs.min.js"],"icon_url":"","type":"plugin","id":"plugin:8fd7bd2c8b0a33e62798573abd12be63","is_default":0,"created_at":1681305305},"4be41549-bf4d-4c49-8346-0f8a3b88fdba":{"id":"plugin:de888634cc4bd51576eed319d5a528fd","title":"Master Slider","type":"plugin","icon":"","exclusions":["masterslider"],"is_default":0,"condition":"master-slider\/master-slider.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"087bee18-7cd1-4c10-8acc-19e1b7c4f4cd":{"id":"plugin:b71309a89bf3c8b558b6fca5d6531919","title":"Max Mega Menu","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/hoverIntent.min.js","\/megamenu\/js\/maxmegamenu.js","var megamenu"],"is_default":0,"condition":"megamenu\/megamenu.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"cf22f0b9-01f4-409e-8a93-ad6743095abd":{"id":"plugin:94a7bae84ef2816494be4af66c577bfc","title":"Meta Slider","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/ml-slider\/","var metaslider"],"is_default":0,"condition":"ml-slider\/ml-slider.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"bb2cbc0d-20da-415e-8218-c17f1db53579":{"title":"Monarch","condition":"monarch\/monarch.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","dt-place-monarch-icons"],"icon_url":"","type":"plugin","id":"plugin:b7335d6d6d5c5134ea10ac2d9b04226c","is_default":0,"created_at":1677853476},"a98d6a80-4610-4ede-bd33-c3e15bed0a95":{"id":"plugin:4f8651262425ef6d7c223c68a2ec2063","title":"Monster Insights","type":"plugin","icon":"","exclusions":["__gtagTracker","monsterinsights_frontend","\/google-analytics-for-wordpress\/assets\/js\/frontend-gtag.min.js"],"is_default":0,"condition":"google-analytics-for-wordpress\/googleanalytics.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"26e1a36e-7a03-449e-8ecc-e42c41ca291c":{"id":"plugin:f8fc66b302dec2327bdec0434a3b275b","title":"Motion.page","type":"plugin","icon":"","exclusions":["\/motionpage\/core\/includes\/assets\/js\/(.*)","\/motionpage\/core\/includes\/assets\/js\/gsap\/(.*)","\/motionpage\/assets\/js\/(.*)","\/motionpage\/assets\/js\/gsap\/(.*)"],"is_default":0,"condition":"motionpage\/motionpage.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"459fd663-7f80-45fd-8308-d3484981e161":{"title":"Ninja Forms","condition":"ninja-forms\/ninja-forms.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/underscore.min.js","\/wp-includes\/js\/backbone.min.js","\/wp-includes\/js\/jquery\/ui\/core.min.js","\/ninja-forms\/assets\/js\/min\/front-end-deps.js","\/ninja-forms\/assets\/js\/min\/front-end.js","nf-"],"icon_url":"","type":"plugin","id":"plugin:1d3ae9c1a96d5062616968b81eef319d","is_default":0,"created_at":1703190792},"c97440dd-7592-40e7-8c98-dac20d39808f":{"id":"plugin:723a588dcd49285ea9f7404e2379b47f","title":"Ninja Tables","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/ninja-tables(.*)\/assets\/","\/ninja-tables(.*)\/public\/","\/wp-includes\/js\/dist\/vendor\/moment.min.js","ninja_table_instance_","ninja_filter_","ninja_table_ready_init_table_id"],"is_default":0,"condition":"ninja-tables\/ninja-tables.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"ebc01f06-8c35-47fa-9c63-8959c5cbd915":{"id":"plugin:f41a52ab1dd50a81cd3a5e341af0007c","title":"NotificationX","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/notificationx\/assets\/public\/js\/(.*).js","notificationXArr"],"is_default":0,"condition":"notificationx\/notificationx.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"3aaf4a1b-591a-48b7-8d60-e6d65c0f94c9":{"id":"plugin:be8fc72a8b8e8eb5958be13737cff47c","title":"Ocean Elementor Widgets","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/ocean-elementor-widgets\/"],"is_default":0,"condition":"ocean-elementor-widgets\/ocean-elementor-widgets.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"f053a7d3-62b0-4312-b0ca-6ff63380eb0b":{"id":"plugin:1a14afe852fefe7b22ccad3893672a29","title":"One Click Accessibility","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/pojo-accessibility\/assets\/js\/app.min.js"],"is_default":0,"condition":"pojo-accessibility\/pojo-accessibility.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"61e11800-48a9-4354-8a4c-ac9a2b4b033a":{"id":"plugin:b9ed0fe6f2cdbd305691a6b857f4b3dc","title":"OoohBoi Steroids for Elementor","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/ooohboi-steroids-for-elementor\/"],"is_default":0,"condition":"ooohboi-steroids-for-elementor\/ooohboi-steroids.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"560b78a2-f051-490b-9dc6-a602dece0d81":{"id":"plugin:f1ff18a3e04c4e0995fca9cabffe57a7","title":"Optimole","type":"plugin","icon":"","exclusions":["optimoleData"],"is_default":0,"condition":"optimole-wp\/optimole-wp.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"b0fda458-4bf2-41e9-a159-60d4bb6102a6":{"id":"plugin:48ec18bd3f59772d98f85dddab75e305","title":"OSM - OpenStreetMap","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/osm\/js\/OL\/","\/osm\/js\/osm-v3-plugin-lib.js","vectorM"],"is_default":0,"condition":"osm\/osm.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"3743ed67-e0d1-4243-bb1f-ee48a445dd10":{"id":"plugin:9eacf0b76484af0259cd788f4923f20c","title":"OxyExtras","type":"plugin","icon":"","exclusions":["vime","vime.esm.js"],"is_default":0,"condition":"oxyextras\/plugin.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"52a21e27-af5b-4476-8d6d-54c323fd1443":{"id":"plugin:e852555c4b4789d78a96d76f503b3262","title":"Oxygen Builder","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/component-framework\/vendor\/aos\/aos.js","AOS.init","oxygen_init_pro_menu","oxy-pro-menu-show-dropdown","oxy-shape-divider","oxygenVSBInitToggleJs"],"is_default":0,"condition":"oxygen\/functions.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"ebd282b9-e175-4b83-90a2-fe12389ccd11":{"id":"plugin:6f9419e58ec86c94e7698aaaaf9dc715","title":"PageLoader by Bonfire","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/pageloader-by-bonfire\/pageloader.js","bonfire-pageloader-overlay"],"is_default":0,"condition":"pageloader-by-bonfire\/pageloader-by-bonfire.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"0baf6353-aa70-41a9-a3bc-d89870a5839b":{"id":"plugin:3a4c4518eb0f60108ab4934fab27d335","title":"PDF Embedder","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/pdf-embedder\/js\/(.*).js"],"is_default":0,"condition":"pdf-embedder\/pdf_embedder.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"cba51ec1-87cc-44eb-b12b-d652e3446507":{"id":"plugin:4f90aca5957cccbf623e3bbc31afa204","title":"Perfect Brands for WooCommerce","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/perfect-woocommerce-brands\/assets\/lib\/slick\/slick.min.js","\/perfect-woocommerce-brands\/assets\/js\/functions-frontend.min.js"],"is_default":0,"condition":"perfect-woocommerce-brands\/perfect-woocommerce-brands.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"808e7a4e-025c-4fae-bf82-de3716e5eb0d":{"id":"plugin:84fe214646388d7c021dda25003ac165","title":"Photonic","type":"plugin","icon":"","exclusions":["\/photonic\/include\/js\/front-end\/module\/photonic-baguettebox.min.js"],"is_default":0,"condition":"photonic\/photonic.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"936aff7d-a8ac-4473-a7b5-4b1611b6c557":{"id":"plugin:6838be282f853f71be282783cb1c162b","title":"Pixel Caffein","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/pixel-caffeine\/build\/frontend.js","aepc_pixel"],"is_default":0,"condition":"pixel-caffeine\/pixel-caffeine.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"ab3a4ef5-2732-4b46-a7c3-17b4e9405cd1":{"id":"plugin:afe0eb7c64d4556a7111c56dd8c4d307","title":"Pixel Manager for WooCommerce","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/woocommerce-pixel-manager-pro\/js\/public\/","wpm"],"is_default":0,"condition":"woocommerce-pixel-manager-pro\/woocommerce-pixel-manager.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"2774f964-50b2-425e-8a30-0a02f421b7e4":{"id":"plugin:38d4b2986868f543639cd1ebc3e510aa","title":"Popup Builder","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/popup-builder\/public\/js\/(.*).js","\/popupbuilder-exit-intent\/public\/javascript\/ExitIntent.js","var sgpbPublicUrl","SGPB_POPUP_PARAMS"],"is_default":0,"condition":"popup-builder\/popup-builder.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"82dbb1e5-31f9-43d7-b522-52819aa49ba5":{"id":"plugin:786717922362642f34a7ff58e919bd95","title":"Popup Maker","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/jquery\/ui\/core.min.js","\/pum\/pum-site-scripts.js","pum","\/plugins\/popup-maker\/assets\/js\/site.min.js"],"is_default":0,"condition":"popup-maker\/popup-maker.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"48e08305-1f1c-4ef4-9f13-24af1b155abc":{"id":"plugin:17831cbb64e469c7f66224c8c63d0a58","title":"PowerPack Addons for Elementor","type":"plugin","icon":"","exclusions":["\/powerpack-lite-for-elementor\/assets\/js\/min\/frontend.min.js"],"is_default":0,"condition":"powerpack-lite-for-elementor\/powerpack-lite-elementor.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"e037ae2f-e36b-4f1a-ada8-eb8fde6746f2":{"id":"plugin:80e1283ea1afead3ca904fad792643c5","title":"Preloader Plus","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/preloader-plus\/(.*)"],"is_default":0,"condition":"preloader-plus\/preloader-plus.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"90fed478-e89a-455c-8371-836bee58fb81":{"title":"Premium Addons for Elementor","condition":"premium-addons-for-elementor\/premium-addons-for-elementor.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/premium-addons-for-elementor\/assets\/frontend\/min-js\/premium-addons.min.js","\/premium-addons-for-elementor\/assets\/frontend\/min-js\/isotope.min.js","\/premium-addons-elementor\/pa-frontend-(.*).min.js","\/premium-addons-for-elementor\/assets\/frontend\/min-js\/slick.min.js","\/premium-addons-pro\/assets\/frontend\/min-js\/tooltipster.min.js","window.scopes_array","lottie.min.js","\/premium-addons-for-elementor\/assets\/frontend\/min-js\/premium-nav-menu.min.js"],"icon_url":"","type":"plugin","id":"plugin:debbfbbcbdf9ffb465bbc40008d99f02","is_default":0,"created_at":1693315214},"7e43c261-77be-48fc-b25a-8953a654ae85":{"id":"plugin:100a0382fcf3d1b6b22da928bce46ea8","title":"Presto Player","type":"plugin","icon":"","exclusions":["\/wp-includes\/js\/dist\/vendor\/regenerator-runtime.min.js","\/presto-player\/dist\/components\/web-components\/web-components.esm.js","\/presto-player\/src\/player\/player-static.js","var player","\/wp-includes\/js\/dist\/api-fetch.min.js","\/wp-includes\/js\/dist\/hooks.min.js","\/wp-includes\/js\/dist\/i18n.min.js"],"is_default":0,"condition":"presto-player\/presto-player.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"3d6f509f-d040-4279-9a2f-a4e6eae1e9df":{"id":"plugin:c0fce700121492b566517e68301db382","title":"Price Based on Country for WooCommerce Pro","type":"plugin","icon":"","exclusions":["\/woocommerce-product-price-based-on-countries\/assets\/js\/ajax-geolocation.min.js","\/woocommerce-price-based-country-pro-addon\/assets\/js\/currency-switcher.min.js","add-to-cart.min.js","cart-fragments.min.js"],"is_default":0,"condition":"woocommerce-price-based-country-pro-addon\/woocommerce-price-based-country-pro-addon.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"b970bc8a-bcbe-4d08-8ac0-a6853ab3f036":{"id":"plugin:f1ecfe258440b371124999ca3bfbfff3","title":"Prime Slider","type":"plugin","icon":"","exclusions":["\/plugins\/bdthemes-prime-slider-lite\/assets\/js\/bdt-uikit.min.js"],"is_default":0,"condition":"bdthemes-prime-slider-lite\/bdthemes-prime-slider.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"e5458963-f167-4b68-88e4-77dd39af2842":{"id":"plugin:29ea8f4dd72f5a5c5927917fb0665a05","title":"PRO Elements","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/pro-elements\/"],"is_default":0,"condition":"pro-elements\/pro-elements.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"b119ad72-f498-4576-bb71-9e6d8c37b68f":{"title":"Product Filter by WBW (for WooCommerce)","condition":"woo-product-filter\/woo-product-filter.php","exclusions":["\/jquery-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?$","\/jquery-migrate(.*)(.min|.slim|.slim.min)?.js(\\?(.*))?$","\/wp-content\/plugins\/woo-product-filter\/modules\/woofilters\/js\/frontend.woofilters.js","\/wp-includes\/js\/jquery\/ui\/mouse.min.js","\/wp-includes\/js\/jquery\/ui\/core.min.js","\/wp-includes\/js\/jquery\/ui\/slider.min.js"],"icon_url":"","type":"plugin","id":"plugin:e57ad91e0d94fab011353af544873743","is_default":0,"created_at":1685686062},"7b779aca-e497-4da3-8e51-fa12837d15ab":{"title":"Product Filters for WooCommerce","condition":"woocommerce-product-filters\/woocommerce-product-filters.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/woocommerce-product-filters\/","\/woocommerce\/assets\/js\/accounting\/accounting.min.js","\/wp-includes\/js\/jquery\/ui\/","wcpf-load-project","WCPFData"],"icon_url":"","type":"plugin","id":"plugin:719469f1c977f7109d3d6ee21ecd5a16","is_default":0,"created_at":1691235154},"2b2a51f2-bd47-4591-92d8-4a690bce5d99":{"id":"plugin:a898898b2b0ea2cd82e20a6d3a3aa47b","title":"Product Gallery Slider for WooCommerce","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/twist\/assets\/js\/slick.min.js","wpgs-public-js-after"],"is_default":0,"condition":"twist\/twist.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"062c5be3-e5ea-4958-9619-44e3410f237e":{"title":"Product Video Gallery for Woocommerce","condition":"product-video-gallery-slider-for-woocommerce\/product-video-gallery-slider-for-woocommerce.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/product-video-gallery-slider-for-woocommerce\/public\/js\/nickx.front.js"],"icon_url":"","type":"plugin","id":"plugin:bbc653a91f0635cd2edb0b741aa62b85","is_default":0,"created_at":1693512477},"34d225a4-688c-476b-846b-420774160d6b":{"id":"plugin:e0b123d324c6fc85b8682660c34f8829","title":"Rank Math SEO","type":"plugin","icon":"","exclusions":["local_ga_js"],"is_default":0,"condition":"seo-by-rank-math\/rank-math.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"02305ca0-2c2a-4eef-a802-b8a942771ecc":{"title":"Retainful","condition":"retainful-next-order-coupon-for-woocommerce\/retainful-next-order-coupon-for-woocommerce.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/retainful-next-order-coupon-for-woocommerce\/src\/premium\/assets\/js\/atc-popup.min.js","\/retainful-next-order-coupon-for-woocommerce\/src\/premium\/assets\/js\/exit-intent-popup.js","retainful.com","rnoc-add-to-cart-js-before","rnoc_redirect_coupon_popup"],"icon_url":"","type":"plugin","id":"plugin:f9fdee19ba6aed961d96d86e1521a761","is_default":0,"created_at":1679331508},"b4055250-5813-400f-b663-d390fee989e4":{"id":"plugin:d6a4d07d1b4022d886df52322dcd8a6f","title":"Revolution Slider","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/revslider\/public\/assets\/js\/","\/revslider-(.*)-addon\/","setREVStartSize","rev_slider_","revslider_","window.RS_MODULES"],"is_default":0,"condition":"revslider\/revslider.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"0b4e061a-b366-4d5a-a00e-bded4b107133":{"title":"Royal Elementor Addons","condition":"royal-elementor-addons\/wpr-addons.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/royal-elementor-addons\/assets\/js\/frontend.min.js","\/royal-elementor-addons\/assets\/js\/lib\/jarallax\/jarallax.min.js"],"icon_url":"","type":"plugin","id":"plugin:c4b464373716d7ac8e3cfb019aaa6102","is_default":0,"created_at":1688124503},"1b19ec89-171a-4f85-8c4b-b1bcfc6b1433":{"id":"plugin:5e3f85d8c82cc184b945415d1a862601","title":"Sassy Social Share","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/sassy-social-share\/public\/js\/sassy-social-share-public.js","heateorSssLoadEvent"],"is_default":0,"condition":"sassy-social-share\/sassy-social-share.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"f5899925-2ab7-43b6-abc4-51b76d664ca6":{"title":"Scrollsequence","condition":"scrollsequence-pro\/scrollsequence-pro.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/scrollsequence-pro\/public\/js\/gsap__premium_only.js","\/scrollsequence-pro\/public\/js\/gsap-scrolltrigger__premium_only.js","\/scrollsequence-pro\/public\/js\/ssq-lib__premium_only.js","scrollsequence-input-script"],"icon_url":"","type":"plugin","id":"plugin:3df51830b6b80668fc342c8dcea495cf","is_default":0,"created_at":1678111131},"043827fc-3df8-45d6-9cd2-14fbe962987a":{"id":"plugin:9d60b5d2de4d828b78c7b088024377d6","title":"ShiftNav Pro - Responsive Mobile Menu","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/shiftnav-pro\/assets\/js\/shiftnav(.*).js"],"is_default":0,"condition":"shiftnav-pro\/shiftnav.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"bcbaf240-e76f-4620-b7d5-4852c46d4be7":{"id":"plugin:56279bd768c8f27ad1972b6774738bcf","title":"ShiftNav \u2013 Responsive Mobile Menu","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/shiftnav-responsive-mobile-menu\/"],"is_default":0,"condition":"shiftnav-responsive-mobile-menu\/shiftnav-responsive-mobile-menu.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"bbe0543b-b5af-467b-a90d-e2975d892d8d":{"title":"Short Pixel Adaptive Image","condition":"shortpixel-adaptive-images\/short-pixel-ai.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/shortpixel-adaptive-images\/assets\/js\/ai(.*).min.js","spai_settings"],"icon_url":"","type":"plugin","id":"plugin:1bc7ac87d8ab2301a1b904919dc7a798","is_default":0,"created_at":1704734942},"543ab43a-6bd3-4948-a09e-3b95e7c9209d":{"title":"Showcase IDX","condition":"showcase-idx\/showcaseidx.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","SIDX","search.showcaseidx.com\/js\/app-(.*).js","cdn.shortpixel.ai"],"icon_url":"","type":"plugin","id":"plugin:ce4dea8ddc3caa8d00e95cec3202d32a","is_default":0,"created_at":1704734988},"a16bcab7-1169-46b9-a425-b091478d8312":{"id":"plugin:3ea7d9f75ad03620b0bce2517bd5b8d1","title":"Side Cart WooCommerce","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/plugins\/woocommerce\/assets\/js\/frontend\/cart-fragments.min.js","\/plugins\/woocommerce\/assets\/js\/frontend\/add-to-cart.min.js","\/plugins\/woocommerce\/assets\/js\/jquery-blockui\/jquery.blockUI.min.js","\/plugins\/woocommerce\/assets\/js\/js-cookie\/js.cookie.min.js"],"is_default":0,"condition":"side-cart-woocommerce\/xoo-wsc-main.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"521f748e-cf09-4019-bd28-b52daef5f16f":{"id":"plugin:7843983bf90dbae16c6e889382c71b23","title":"Simple Banner","type":"plugin","icon":"","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/simple-banner\/","simpleBannerScriptParams"],"is_default":0,"condition":"simple-banner\/simple-banner.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"76026e82-d9cf-482c-b480-55c57693a184":{"id":"plugin:b6825f971d35a5515d095564a2e40936","title":"Site Kit by Google","type":"plugin","icon":"","exclusions":["google-analytics.com\/analytics.js","ga\\( '","ga\\('","\/gtag\/js","gtag\\(","\/gtm.js"],"is_default":0,"condition":"google-site-kit\/google-site-kit.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"79c458d7-f7f7-4072-919d-ad337bde6ae3":{"title":"Slick Menu","condition":"slick-menu\/slick-menu.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/slick-menu\/"],"icon_url":"","type":"plugin","id":"plugin:5ce5dfecdc9d3292c69a1413bbd17d3c","is_default":0,"created_at":1704735027},"99cf4942-49ea-4687-b156-405ed1ce1cfa":{"title":"Slide Anything","condition":"slide-anything\/slide-anything.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/slide-anything\/owl-carousel\/owl.carousel.min.js","owl_goto.trigger"],"icon_url":"","type":"plugin","id":"plugin:fff874cc48b80940210228c975df395c","is_default":0,"created_at":1702907355},"dd0ea584-0c99-4c30-b46d-da35b94c9f0a":{"title":"Slider by Soliloquy","condition":"soliloquy-lite\/soliloquy-lite.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","soliloquy-min.js","soliloquy_slider"],"icon_url":"","type":"plugin","id":"plugin:ffb5f8cc0ea17886dbd05f601ca3eec0","is_default":0,"created_at":1704735068},"ecb2fffc-d289-4f68-ae94-71131f17deee":{"title":"Smart Slider 3","condition":"smart-slider-3\/smart-slider-3.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/smart-slider-3\/(.*).js","_N2"],"icon_url":"","type":"plugin","id":"plugin:2f373822dceb191c31c8ad2183d51869","is_default":0,"created_at":1704735119},"284ede43-bf80-419e-8414-46c26cb746f0":{"title":"Smart Slider 3 Pro","condition":"nextend-smart-slider3-pro\/nextend-smart-slider3-pro.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/SmartSlider3\/(.*).js","_N2"],"icon_url":"","type":"plugin","id":"plugin:720ec9fbbd8a52ce525959a68a5310b3","is_default":0,"created_at":1704735152},"be70034f-def5-4771-9b3f-662eb218da2a":{"title":"Spectra - Show Slider Images","condition":"ultimate-addons-for-gutenberg\/ultimate-addons-for-gutenberg.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/ultimate-addons-for-gutenberg\/assets\/js\/spectra-animations.min.js","\/ultimate-addons-for-gutenberg\/assets\/js\/post.min.js","\/ultimate-addons-for-gutenberg\/assets\/js\/aos.min.js","\/slick.min.js","\/imagesloaded.min.js","UAGBPostCarousel"],"icon_url":"","type":"plugin","id":"plugin:af16af31f83a874b9d0a9570d9c15ff7","is_default":0,"created_at":1706824485},"c3334c29-4160-42df-a1ce-f8aeeaee8668":{"title":"Super Socializer","condition":"super-socializer\/super_socializer.php","exclusions":["theChamp","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js"],"icon_url":"","type":"plugin","id":"plugin:660defe26748470c3a47366cd4012579","is_default":0,"created_at":1677853633},"f18b4242-fe3f-4e2b-bfc9-ac2fb3939a90":{"title":"Superfly Menu","condition":"superfly-menu\/main.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate((.*?)(.min?)?).js","\/superfly-menu\/includes\/vendor\/looks_awesome\/icon_manager\/js\/md5.js","\/superfly-menu\/includes\/vendor\/looks_awesome\/icon_manager\/js\/util.js","\/superfly-menu\/js\/public.min.js","window.SFM_is_mobile","var SFM_skew_disabled","var SFM_template"],"icon_url":"","type":"plugin","id":"plugin:ccb15175093bc6c437b78797f0698a7b","is_default":0,"created_at":1684301673},"1a05c00a-8562-45bc-80e8-987a4574b1c9":{"title":"Symplr Ads","condition":"symplr-ads\/symplr-plugin.php","exclusions":["\/symplr-ads\/","cdns.symplr.de"],"icon_url":"","type":"plugin","id":"plugin:3b6d39e28a87e86c4659491e2368ff61","is_default":0,"created_at":1692199959},"858d2d7f-bdac-4d27-ba26-baa9ace96ba4":{"id":"plugin:7d93008296bb5c7c43d4cba185ed2632","title":"Tabby Responsive Tabs","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/tabby-responsive-tabs\/js\/tabby.js","RESPONSIVEUI"],"is_default":0,"condition":"tabby-responsive-tabs\/tabby-responsive-tabs.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"e44a5c93-bb77-4624-a121-d846905137ea":{"id":"plugin:2f563bbb7e92363ec3fb2989a1c7dffe","title":"The Plus Addons for Elementor","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/theplus-addons\/(.*)"],"is_default":0,"condition":"the-plus-addons-for-elementor-page-builder\/theplus_elementor_addon.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"2bbac961-b000-4802-ae97-d52472ec6750":{"title":"The Plus Addons for Elementor Premium","condition":"theplus_elementor_addon\/theplus_elementor_addon.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/wp-content\/plugins\/theplus_elementor_addon\/","\/elementor\/","\/elementor-pro\/","\/wp-includes\/js\/imagesloaded.min.js","ElementorProFrontendConfig","elementorFrontendConfig"],"icon_url":"","type":"plugin","id":"plugin:6e127deaaeefbe57ff945b1f9e274518","is_default":0,"created_at":1688143611},"666b45e8-749c-4140-bd17-e1cd589e03ee":{"id":"plugin:b9c418b47c986935a1151ab9b42f8971","title":"ThemeREX Addons","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/trx_addons\/js\/__scripts-full.js","\/trx_addons\/components\/cpt\/layouts\/shortcodes\/menu\/superfish.min.js"],"is_default":0,"condition":"trx_addons\/trx_addons.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"a750cada-eb58-4df4-9966-21c8a69332ba":{"id":"plugin:75af9efe22c5cc776636266feb55adf1","title":"Thrive Architect","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js"],"is_default":0,"condition":"thrive-visual-editor\/thrive-visual-editor.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"13714cde-680e-4ca4-8607-c35952d6a5f2":{"title":"Thrive Comments","condition":"thrive-comments\/thrive-comments.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/thrive-leads\/","window.TL_Const","var ml=","\/thrive-comments\/assets\/js\/","ThriveComments","\/wp-includes\/js\/underscore.min.js","\/wp-includes\/js\/backbone.min.js"],"icon_url":"","type":"plugin","id":"plugin:6a72d06ca2f6a888b0d9d5ea93af2edc","is_default":0,"created_at":1677852974},"aa7ca898-499f-4f04-b419-3de199996969":{"id":"plugin:b84d82c02cade64ade00712b9c5652aa","title":"Thrive Leads","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/thrive-leads\/","window.TL_Const","var ml=","\/thrive-comments\/assets\/js\/","ThriveComments","\/wp-includes\/js\/underscore.min.js","\/wp-includes\/js\/backbone.min.js"],"is_default":0,"condition":"thrive-leads\/thrive-leads.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"9eee297a-8241-4ef2-af97-46074bd0898c":{"id":"plugin:5bb61b0559b0a3fd578315b553451327","title":"Thrive Quiz Builder","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js"],"is_default":0,"condition":"thrive-quiz-builder\/thrive-quiz-builder.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"c2f3ec2a-5b09-4845-aa95-84841783fbfc":{"id":"plugin:a7f3e5206abff19ca7cf142260181738","title":"Thrive Ultimatum","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/thrive-ultimatum\/","var TVE_Ult_"],"is_default":0,"condition":"thrive-ultimatum\/thrive-ultimatum.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"d48b8d2f-e071-4a30-840a-306154a115a0":{"id":"plugin:f57be2014b6a489d053f8367fa6c0f9f","title":"Tidio Chat","type":"plugin","icon":"","exclusions":["document.tidioChatCode"],"is_default":0,"condition":"tidio-live-chat\/tidio-elements.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"cb6d33ed-7eb4-4ff9-9ad0-7fc54fbecf6f":{"id":"plugin:c9e0485ec256d4a6a8d92a98c18d76fc","title":"Toolset Blocks","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","toolsetCommonEs.fontToHead","toolsetCommonEs.styleToHead","\/toolset-blocks\/vendor\/toolset\/blocks\/public\/js\/frontend.js","\/toolset-blocks\/vendor\/toolset\/common-es\/public\/toolset-common-es-frontend.js","\/toolset-blocks\/public\/js\/views-frontend.js","\/wp-includes\/js\/underscore.min.js"],"is_default":0,"condition":"toolset-blocks\/wp-views.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"4bac6350-0925-49fb-904a-372f22fd6baf":{"id":"plugin:71beda322b37f7fc7d456822493cb972","title":"Top Bar Pro","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/plugins\/topbar-pro\/js\/tpbr_front.min.js","\/plugins\/topbar-pro\/js\/jquery.cookie.js"],"is_default":0,"condition":"topbar-pro\/topbar_pro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"033486e7-0ddc-4915-a848-31504d00448e":{"title":"Twenty20 Image Before-After","condition":"twenty20\/ttwenty.php","exclusions":["\/twenty20\/assets\/js\/(.*).js","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","twentytwenty-container"],"icon_url":"","type":"plugin","id":"plugin:23441bba9d3602bc932d697c7cb8aa1f","is_default":0,"created_at":1677858089},"7675a34d-006e-4672-99d5-a81e1b8e47f9":{"id":"plugin:3d59cc34167a7f8123e66b627148e0b7","title":"UberMenu","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/ubermenu\/assets\/js\/ubermenu.min.js"],"is_default":0,"condition":"ubermenu\/ubermenu.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"8233178a-e7b3-43ce-b193-bd0d9c960933":{"id":"plugin:86424c46157c1c7e2e1571055813beee","title":"Ultimate Addons for Elementor","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/ultimate-elementor\/assets\/lib\/slick\/slick.min.js","\/ultimate-elementor\/assets\/min-js\/uael-frontend.min.js","\/ultimate-elementor\/assets\/lib\/isotope\/isotope.min.js","\/ultimate-elementor\/assets\/lib\/jquery-element-resize\/jquery_resize.min.js","\/ultimate-elementor\/assets\/lib\/fancybox\/jquery_fancybox.min.js","\/ultimate-elementor\/assets\/lib\/justifiedgallery\/justifiedgallery.min.js","\/elementor-pro\/assets\/js\/frontend.min.js","\/wp-includes\/js\/imagesloaded.min.js","\/js_composer\/assets\/js\/dist\/js_composer_front.min.js","\/elementor\/assets\/lib\/swiper\/swiper.min.js","\/nasa-core\/assets\/js\/min\/jquery.slick.min.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig"],"is_default":0,"condition":"ultimate-elementor\/ultimate-elementor.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"8bddf484-6c78-4147-a4e6-d3039904e5f6":{"title":"Ultimate Addons for Elementor - Mobile Menu","condition":"ultimate-elementor\/ultimate-elementor.php","exclusions":["\/jquery-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?$","\/jquery-migrate(.*)(.min|.slim|.slim.min)?.js(\\?(.*))?$","\/ultimate-elementor\/assets\/js\/uael-nav-menu.js","\/ultimate-elementor\/assets\/min-js\/uael-nav-menu.min.js"],"icon_url":"","type":"plugin","id":"plugin:70cfade3a7adbb54196f6acccc5a176f","is_default":0,"created_at":1694771327},"028504f7-b1cd-4318-8a6d-ce186197e89d":{"id":"plugin:0f0a91f0c454021a5ff9fc25c3ed419f","title":"Ultimate Addons for WPBakery Page Builder","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/Ultimate_VC_Addons\/assets\/"],"is_default":0,"condition":"Ultimate_VC_Addons\/Ultimate_VC_Addons.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"5754af3d-a6af-49eb-b731-bdd82f26dc4e":{"id":"plugin:34db8636812bad84c8aea037c2ddc8c2","title":"Ultimate Responsive Image Slider","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","sliderPro"],"is_default":0,"condition":"ultimate-responsive-image-slider\/ultimate-responsive-image-slider.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"78ae882d-ae31-4179-b677-8893814938c7":{"title":"Unlimited Elements for Elementor Premium - Slider","condition":"unlimited-elements-for-elementor-premium\/unlimited-elements-pro.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elementor\/","\/elementor-pro\/","ElementorProFrontendConfig","elementorFrontendConfig","\/unlimited-elements-for-elementor-premium\/","uc_"],"icon_url":"","type":"plugin","id":"plugin:17260bc347b8c29bee0010e9ec164184","is_default":0,"created_at":1683270377},"051cbfbb-7ad2-4f06-a493-3cf423a80904":{"id":"plugin:6717ef5673a956bc08ca4a5117065d53","title":"Variation Swatches for WooCommerce","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/jquery\/ui\/","\/woo-variation-swatches\/","\/woo-variation-swatches-pro\/","underscore.min.js"],"is_default":0,"condition":"woo-variation-swatches\/woo-variation-swatches.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"6879caba-7224-4eca-bcb2-370785b495ea":{"id":"plugin:57597b7683e01892932083413f085134","title":"Web Accessibility By accessiBe","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/accessibe\/","acsbJS"],"is_default":0,"condition":"accessibe\/accessiebe.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"bd6732fe-4c2b-40a1-9035-8464057e2da5":{"title":"WooCommerce - Cart Fragments","condition":"woocommerce\/woocommerce.php","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/woocommerce\/assets\/js\/frontend\/cart-fragments.min.js","\/woocommerce\/assets\/js\/js-cookie\/js.cookie.min.js"],"icon_url":"","type":"plugin","id":"plugin:201de694c6fc28c8d580a3b2ca484218","is_default":0,"created_at":1680937567},"d044900d-07e1-4533-9516-33106efcb259":{"title":"WooCommerce - Product description","condition":"woocommerce\/woocommerce.php","exclusions":["\/plugins\/woocommerce\/assets\/js\/frontend\/single-product.min.js","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js"],"icon_url":"","type":"plugin","id":"plugin:a82644b4c9417ea3a240939a73344700","is_default":0,"created_at":1679309756},"bff953b1-2213-4666-8112-76a84a3cc207":{"title":"WooCommerce - Product Gallery","condition":"woocommerce\/woocommerce.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/woocommerce\/?(.*)\/assets\/js\/zoom\/jquery.zoom(.min)?.js","\/woocommerce\/?(.*)\/assets\/js\/photoswipe\/","\/woocommerce\/?(.*)\/assets\/js\/flexslider\/jquery.flexslider(.min)?.js","\/woocommerce\/?(.*)\/assets\/js\/frontend\/single-product(.min)?.js","wc_single_product_params"],"icon_url":"","type":"plugin","id":"plugin:7665868ff97c265628f376523a4f9ecc","is_default":0,"created_at":1686579689},"016e6ddf-c6e7-49ec-bd3f-2585d9e45895":{"title":"WooCommerce - Select2 library","condition":"woocommerce\/woocommerce.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/woocommerce\/assets\/js\/select2\/select2(.*).js"],"icon_url":"","type":"plugin","id":"plugin:4bca670bd5d55dd24b17fb0193b0891e","is_default":0,"created_at":1681459540},"b9b2c6d7-944f-4ae3-ae04-c9e2204b9dab":{"id":"plugin:9165c768e978d6ad3f696db8c78ccbb2","title":"WooCommerce Attribute Swatches","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/iconic-woo-attribute-swatches-premium\/assets\/frontend\/js\/main.min.js","\/iconic-woo-attribute-swatches-premium\/assets\/vendor\/flickity\/flickity.pkgd.min.js","iconic_was_vars"],"is_default":0,"condition":"iconic-woo-attribute-swatches-premium\/iconic-woo-attribute-swatches.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"4506c5e9-7349-44c9-9967-34370c83facb":{"title":"WooCommerce Bookings","condition":"woocommerce-bookings\/woocommerce-bookings.php","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/woocommerce-bookings\/dist\/frontend.js","\/wp-includes\/js\/dist\/date.min.js","\/wp-includes\/js\/dist\/vendor\/moment.min.js","\/wp-includes\/js\/jquery\/ui\/datepicker.min.js","\/wp-includes\/js\/underscore.min.js","\/woocommerce\/assets\/js\/jquery-blockui\/jquery.blockUI.min.js","\/wp-includes\/js\/dist\/hooks.min.js"],"icon_url":"","type":"plugin","id":"plugin:14dec6d289b9977fa3a74116feecebcc","is_default":0,"created_at":1693998405},"fec9cd04-c358-45da-a1a8-1668b964016b":{"id":"plugin:456f3b849ba3b6647246aca9d7cdaed5","title":"WooCommerce Product Reviews Pro","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","wc_product_reviews_pro","\/woocommerce-product-reviews-pro\/assets\/js\/frontend\/wc-product-reviews-pro-frontend.min.js","\/woocommerce\/assets\/js\/jquery-tiptip\/jquery.tipTip.min.js"],"is_default":0,"condition":"woocommerce-product-reviews-pro\/woocommerce-product-reviews-pro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"551a9399-627f-4978-9bae-5cc8e0aefc82":{"id":"plugin:c8577e74eef3b082fb6403760d53f68c","title":"WooCommerce TM Extra Product Options","type":"plugin","icon":"","exclusions":["\/woocommerce-tm-extra-product-options\/assets\/js\/epo.min.js","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/jquery\/ui\/core.min.js","\/wp-includes\/js\/jquery\/ui\/mouse.min.js","\/wp-includes\/js\/jquery\/ui\/slider.min.js","\/wp-includes\/js\/underscore.min.js","\/wp-includes\/js\/wp-util.min.js","\/wp-includes\/js\/dist\/hooks.js","\/wp-includes\/js\/dist\/i18n.js"],"is_default":0,"condition":"woocommerce-tm-extra-product-options\/tm-woo-extra-product-options.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"3cac4650-6a52-448e-8e48-e99a772a59a2":{"id":"plugin:c6e6cab8c80fa3fe57d609f72d2d5c56","title":"WooLentor","type":"plugin","icon":"","exclusions":["\/woolementor\/assets\/third-party\/slick\/slick.min.js","\/woolentor-addons","woolentor_addons"],"is_default":0,"condition":"woolentor-addons\/woolentor_addons_elementor.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"21af073d-d2ec-4d46-bbda-2c69f87f3f98":{"title":"Woolentor - Fix product gallery","condition":"woolentor-addons\/woolentor_addons_elementor.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)",".woolentor-learg-img","\/woolentor-addons\/assets\/js\/slick.min.js","\/woolentor-addons-pro\/assets\/lib\/js\/tippy.min.js"],"icon_url":"","type":"plugin","id":"plugin:c5315e06dfc353cd57f85a60abe4e320","is_default":0,"created_at":1700061004},"67aeb4cb-1a00-4d10-a00c-34888b4c0dba":{"title":"WooThumbs for WooCommerce","condition":"woothumbs-premium\/woothumbs-premium.php","exclusions":["\/wp-includes\/js\/dist\/hooks.min.js","\/wp-includes\/js\/underscore.min.js","\/wp-includes\/js\/wp-embed.min.js","\/wp-includes\/js\/wp-util.min.js","\/woothumbs-premium\/(.*)"],"icon_url":"","type":"plugin","id":"plugin:b97b1d3f627769e1dd8305aa25af993c","is_default":0,"created_at":1679065404},"c7a14763-88d0-4344-a6af-e0a8dc5fa8d5":{"id":"plugin:31b9e812a025e5750a6ef0980ee7d2db","title":"WordPress Mega Menu \u2013 QuadMenu","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/quadmenu","#private-menu","#public-menu"],"is_default":0,"condition":"quadmenu\/quadmenu.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"f699fdbd-84a7-4f24-b729-3e4a4f83a4dd":{"id":"plugin:601f8fc7d10cad1c2ec2949c0d9b1651","title":"WP Armour","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/honeypot\/includes\/js\/wpa.js","\/wp-armour-extended\/includes\/js\/wpae.js","wpa_hidden_field","wpa_add_test"],"is_default":0,"condition":"wp-armour-extended\/wp-armour-extended.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"6a28aae5-ef91-43fc-8204-92e3a25642b4":{"id":"plugin:5728f3b9856dfe37a36ab15b0a637198","title":"WP Go Maps","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","maps.googleapis.com"],"is_default":0,"condition":"wp-google-maps\/wpGoogleMaps.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"c9b991d1-a653-404b-be85-e276b1814e7d":{"title":"WP Google Map Pro","condition":"wp-google-map-gold\/wp-google-map-gold.php","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","maps.google.com\/maps\/api\/js","\/wp-includes\/js\/masonry.min.js","\/wp-google-map-gold\/(.*)"],"icon_url":"","type":"plugin","id":"plugin:dc12a9b7b9c4c7ce3c532b6b377739f2","is_default":0,"created_at":1677858391},"1f8f9fbf-fbf0-4e3a-b77c-af0fa47e950d":{"id":"plugin:87f572f5f0ec143a8fceba77d0616197","title":"WP Google Maps Pro","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-google-maps(.*)","maps.googleapis.com","mgl_","wpgmza"],"is_default":0,"condition":"wp-google-maps-pro\/wp-google-maps-pro.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"41e4b98c-e63f-4800-a478-02592562322b":{"id":"plugin:3735ca768ede98b25795f4cb057ff4ed","title":"WP iCal Availability","type":"plugin","icon":"","exclusions":["\/wp-ical-availability\/js\/custom-select.js","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-ical-availability\/"],"is_default":0,"condition":"wp-ical-availability\/wp-ical-availability.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"2b06c5b8-dc32-4bb0-8504-3a9f1c3a1ec0":{"title":"WP MapIt","condition":"wp-mapit\/wp_mapit.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-mapit\/wp_mapit\/js\/leaflet.js","\/wp-mapit\/wp_mapit\/js\/wp_mapit_multipin.js"],"icon_url":"","type":"plugin","id":"plugin:ba8d1c7f294a3f5b593556eb3b0bc7d9","is_default":0,"created_at":1679331261},"2039eafd-1c11-4e21-a61b-30857f291ae3":{"id":"plugin:927b8bf7806f2d287559b86a0b455a59","title":"WP Responsive Menu","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-responsive-menu\/(.*)"],"is_default":0,"condition":"wp-responsive-menu\/wp-responsive-menu.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"e06be942-cccd-4b2d-a268-06dc78f0b820":{"title":"WP Search with Algolia","condition":"wp-search-with-algolia\/algolia.php","exclusions":["\/wp-search-with-algolia\/js\/algoliasearch\/dist\/algoliasearch-lite.umd.js","\/wp-search-with-algolia\/js\/autocomplete-noconflict.js","\/wp-search-with-algolia\/js\/autocomplete.js\/dist\/autocomplete.min.js","var algolia"],"icon_url":"","type":"plugin","id":"plugin:43267e659d599fbb6b42c719b49bb7a7","is_default":0,"created_at":1677857180},"4fc2a7ae-b9e6-410e-93cf-e6d1962add6a":{"title":"WP Smart Preloader","condition":"wp-smart-preloader\/wp-preloader.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-smart-preloader\/assets\/js\/wsp-main-script(.min)?.js"],"icon_url":"","type":"plugin","id":"plugin:4fb90fc73fc2b5d1e37ea2dadfd3cef3","is_default":0,"created_at":1704204597},"7ecf40ce-2bcd-412c-bb01-9e71fecf6be8":{"title":"WP Store Locator","condition":"wp-store-locator\/wp-store-locator.php","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-store-locator\/","\/wp-includes\/js\/underscore.min.js","maps.google.com"],"icon_url":"","type":"plugin","id":"plugin:d37bb5054a24471ca1675d9ab49d01b0","is_default":0,"created_at":1704735183},"7a1d19a2-3a48-40ab-8051-f642fc63ce2d":{"title":"WP Ultimate Post Grid","condition":"wp-ultimate-post-grid\/wp-ultimate-post-grid.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?$","\/wp-ultimate-post-grid\/dist\/public.js","\/wp-ultimate-post-grid-premium\/dist\/public-premium.js","wpupg_grid_args"],"icon_url":"","type":"plugin","id":"plugin:e24341fef49bd64b89682d583218c108","is_default":0,"created_at":1686597940},"76c86163-ddf3-4113-b620-de9d5058f505":{"title":"WPBakery Page Builder","condition":"js_composer\/js_composer.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/js_composer\/assets\/js\/dist\/js_composer_front.min.js"],"icon_url":"","type":"plugin","id":"plugin:517d7d24da9a7072ed389d0fb30374a0","is_default":0,"created_at":1704404852},"0b8ff2c0-c3cd-4ec1-b7f5-c7751de6101b":{"title":"WPBakery Page Builder - Carousel","condition":"js_composer\/js_composer.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/js_composer\/assets\/lib\/vc_carousel\/js\/vc_carousel.min.js"],"icon_url":"","type":"plugin","id":"plugin:76336ed3f04df091e669f89d908ef2ed","is_default":0,"created_at":1704405212},"4f5e5b98-c326-4b9f-9ada-3b257862132c":{"id":"plugin:1ec7138c950c355e7af60d49c81139fc","title":"wpDataTables","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wpdatatables\/","highcharts"],"is_default":0,"condition":"wpdatatables\/wpdatatables.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"18be1b8c-0bc4-4a01-abc6-a127aff380c6":{"id":"plugin:c62ca58ea081c1271de8dadfa7daac69","title":"WPForms","type":"plugin","icon":"","exclusions":["\/wpforms-offline-forms\/assets\/js\/wpforms-offline-forms.min.js","wpforms-offline-forms-js-extra","wpformsRecaptchaLoad"],"is_default":0,"condition":"wpforms\/wpforms.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"8a3cacb6-81bd-456a-a1cc-a4025f8e5234":{"id":"plugin:0992ac952c0a05bb35e18b1d5744d346","title":"WPForms Lite","type":"plugin","icon":"","exclusions":["wpformsRecaptchaLoad","\/wpforms-offline-forms\/assets\/js\/wpforms-offline-forms.min.js","wpforms-offline-forms-js-extra"],"is_default":0,"condition":"wpforms-lite\/wpforms.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"98bbd410-5b01-4244-a8eb-715765180328":{"title":"XL WooCommerce Sales Triggers","condition":"xl-woocommerce-sales-triggers\/xl-woocommerce-sales-triggers.php","exclusions":["\/xl-woocommerce-sales-triggers\/assets\/js\/wcst_combined.min.js","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js"],"icon_url":"","type":"plugin","id":"plugin:ba9e526ddb0157e69757530c6b18b714","is_default":0,"created_at":1677856813},"bf9f9620-dd0e-4e6f-9a45-4eb78a148f42":{"id":"plugin:58663fc781232169e865f6fe7cf1afaa","title":"YITH WooCommerce Ajax Product Filter","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/yith-woocommerce-ajax-navigation\/assets\/js\/yith-wcan-shortcodes.min.js"],"is_default":0,"condition":"yith-woocommerce-ajax-navigation\/init.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"b053279d-e07c-438c-bb3e-3a1f4f5d7c5e":{"id":"plugin:68b637fd247e40c8e135e4771d739b07","title":"YITH WooCommerce AJAX Product Filter Premium","type":"plugin","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/yith-woocommerce-ajax-product-filter-premium\/assets\/js\/yith-wcan-shortcodes.min.js"],"is_default":0,"condition":"yith-woocommerce-ajax-product-filter-premium\/init.php","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"62056165-8bd9-4ff0-b21f-e4ed0ae45fae":{"title":"YITH WooCommerce Points and Rewards","condition":"yith-woocommerce-points-and-rewards-premium\/init.php","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/yith-woocommerce-points-and-rewards-premium\/assets\/js\/frontend.min.js","\/woo-variation-swatches-pro\/assets\/js\/add-to-cart-variation.min.js"],"icon_url":"","type":"plugin","id":"plugin:4acc87d4eb72c86cdea76d180b61a098","is_default":0,"created_at":1709917756},"d94dbbf3-bcab-4e47-9fbb-6b3a7cf92787":{"title":"Yotpo Social Reviews for Woocommerce","condition":"yotpo-social-reviews-for-woocommerce\/wc_yotpo.php","exclusions":["\/yotpo-social-reviews-for-woocommerce\/assets\/js\/headerScript.js"],"icon_url":"","type":"plugin","id":"plugin:45ab742b3fccbd04d7bc973c8582be87","is_default":0,"created_at":1680686421}},"themes":{"9aeea459-91d3-44b6-8a26-b883dca8b402":{"title":"Agensy - Load page without User Interaction","condition":"agensy","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/themes\/agensy\/js\/scripts.js","\/themes\/agensy\/js\/scripts-single.js","\/themes\/agensy\/js\/wow.min.js","\/themes\/agensy\/js\/TweenMax.min.js","\/themes\/agensy\/js\/swiper.min.js","\/plugins\/visualcomposer\/assets\/lib\/bower\/isotope\/dist\/isotope.pkgd.min.js","\/wp-includes\/js\/imagesloaded.min.js"],"icon_url":"","type":"theme","id":"theme:7ab7dfeb0db9c0c74c020be318c2e6d9","is_default":0,"created_at":1707317936},"9c623554-5834-4669-9e96-1b894c1939b2":{"id":"theme:0193ea55fce2ada93b262f2824008c0f","title":"Andaman","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/andaman\/assets\/js\/","\/wp-andaman-plugins\/shortcodes\/vc_extend\/"],"is_default":0,"condition":"andaman","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"7374c5a5-69f8-460f-b44f-dee884a824cd":{"id":"theme:24cbda63f1b898ade5562ab4ec6d97a5","title":"Artale","type":"theme","icon":"","exclusions":["\/artale-elementor\/assets\/js\/modulobox.js","\/artale-elementor\/assets\/js\/artale-elementor.js","\/artale\/js\/jquery-stellar.js","\/artale\/js\/core\/artale-plugins.js","\/artale\/js\/core\/artale-custom.js","var loader"],"is_default":0,"condition":"artale","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"23b01203-2a70-4394-9326-d59824def2d7":{"title":"Ashe Pro Premium","condition":"ashe-pro-premium","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/ashe-pro-premium\/"],"icon_url":"","type":"theme","id":"theme:4791da3cbbd1ed86253a087f0287aeb4","is_default":0,"created_at":1704912793},"03a9cc62-c167-447d-beb2-65c76c96b056":{"title":"Astra","condition":"astra","exclusions":["\/astra\/assets\/js\/minified\/frontend.min.js"],"icon_url":"","type":"theme","id":"theme:3cce5f3eaf76e098ba8e28f7bbba3f92","is_default":0,"created_at":1702486947},"2a2b54cb-8e1d-49d2-bfca-93eee231e470":{"id":"theme:72a8d63e59c10bdf512a62b862d143a7","title":"Astra - Carousel","type":"theme","icon":"","exclusions":["var astra","\/astra\/assets\/js\/minified\/style.min.js"],"is_default":0,"condition":"astra","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"7783361f-66fc-4d95-a054-4e9545bb5b48":{"title":"Auteur","condition":"g5plus-auteur","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/g5plus-auteur\/assets\/js\/core.min.js","\/g5plus-auteur\/assets\/vendors\/","\/auteur-framework\/libs\/smart-framework\/assets\/vendors\/perfect-scrollbar\/js\/perfect-scrollbar.jquery.min.js","\/wp-includes\/js\/imagesloaded.min.js"],"icon_url":"","type":"theme","id":"theme:6207fe478e269e7547bda70a46607a49","is_default":0,"created_at":1679737107},"4c618038-8fc7-4d48-8d41-a32da14e5c1e":{"title":"AutoTrader","condition":"autotrader","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/autotrader\/(.*).js"],"icon_url":"","type":"theme","id":"theme:046dfeee2b77390c53e0e7f93b6a3792","is_default":0,"created_at":1679736741},"18f04f23-35a0-4c45-8cb6-a91d57ca1790":{"id":"theme:835da12f43373029659f766920e81b47","title":"Avada - Animations & mobile-specific actions","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/uploads\/fusion-scripts\/(.*).js","window.off_canvas_","\/plugins\/fusion-builder\/","\/plugins\/fusion-core\/","\/Avada\/includes\/"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"90135867-1b95-498b-80d6-f5dbf2f6b318":{"title":"Avada - FAQ shortcode","condition":"Avada","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/plugins\/fusion-core\/js\/min\/avada-faqs.js"],"icon_url":"","type":"theme","id":"theme:b084708c80d8582546e5430219aa4670","is_default":0,"created_at":1678277160},"d23b5bb1-1d7f-4109-bf69-b20a2be2d337":{"id":"theme:5e7a2248e1a53d9bb27b187deb541248","title":"Avada - Fusion carousel","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/includes\/lib\/assets\/min\/js\/library\/jquery.carouFredSel.js","\/includes\/lib\/assets\/min\/js\/general\/fusion-carousel.js","fusionCarouselVars"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"98dfa8c1-e72a-4cef-a0b2-8f0c322490fc":{"id":"theme:f16fb109027f4994a7649a8b1663e6f7","title":"Avada - Fusion form","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/fusion-builder\/assets\/js\/min\/general\/fusion-form.js","\/fusion-builder\/assets\/js\/min\/general\/fusion-form-logics.js","\/includes\/lib\/assets\/min\/js\/library\/cssua.js","\/includes\/lib\/assets\/min\/js\/general\/fusion.js","\/includes\/lib\/assets\/min\/js\/library\/modernizr.js"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"026801fa-af67-47ba-b966-347693f0585f":{"id":"theme:33f50696d353d8bd4eb59ff6e8f44c97","title":"Avada - Fusion grid gallery","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/fusion-builder\/assets\/js\/min\/general\/fusion-gallery.js","\/includes\/lib\/assets\/min\/js\/library\/imagesLoaded.js","\/includes\/lib\/assets\/min\/js\/library\/isotope.js","\/includes\/lib\/assets\/min\/js\/library\/packery.js","\/includes\/lib\/assets\/min\/js\/library\/lazysizes.js"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"c8349314-15a3-481e-973b-e4d936e4420e":{"id":"theme:56fa9993a573540c83eda9c49fae5e3c","title":"Avada - Fusion slider","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/fusion-core\/js\/min\/avada-fusion-slider.js","\/Avada\/includes\/"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"7a04bc85-0fec-4487-ae05-bb2e5d8d0420":{"title":"Avada - Load Portfolio on pageload","condition":"Avada","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/library\/packery.js","\/library\/isotope.js","\/library\/imagesLoaded.js","\/general\/fusion-lightbox.js","\/fusion-core\/js\/min\/avada-portfolio.js"],"icon_url":"","type":"theme","id":"theme:c3f0ed4d94499b68c77d95db37d1d399","is_default":0,"created_at":1696601814},"55bd510c-78aa-49d5-8304-8be2ee2ab0da":{"id":"theme:2189c1c769d65cfc2182e4822847071b","title":"Avada - Mobile menu","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/assets\/min\/js\/general\/avada-menu.js","\/includes\/lib\/assets\/min\/js\/library\/modernizr.js","\/includes\/lib\/assets\/min\/js\/library\/jquery.easing.js"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"ddf00672-c35c-4b68-aeca-925e68bf12b2":{"id":"theme:97a185f08af70c39c7e221faab0f73eb","title":"Avada - OffCanvas","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/uploads\/fusion-scripts\/(.*).min.js","window.off_canvas_"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"17544cc3-9d3a-4611-bc5d-44d04e2786fa":{"title":"Avada - Show the Portfolio grid on page load","condition":"Avada","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/includes\/lib\/assets\/min\/js\/library\/imagesLoaded.js","\/includes\/lib\/assets\/min\/js\/library\/isotope.js","\/includes\/lib\/assets\/min\/js\/library\/lazysizes.js","\/includes\/lib\/assets\/min\/js\/library\/modernizr.js","\/includes\/lib\/assets\/min\/js\/library\/packery.js","\/fusion-core\/js\/min\/avada-portfolio.js","avadaPortfolioVars"],"icon_url":"","type":"theme","id":"theme:9d1a9b0c2ca20fca764a82f197b962fd","is_default":0,"created_at":1696601823},"c6c3347c-14e0-4766-afa5-df33a47f5a5a":{"id":"theme:3ff44421b404c5efffa25e78e479e4ea","title":"Avada - Sticky menu","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/Avada\/assets\/min\/js\/general\/avada-menu.js"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"232596c1-6a6a-4fe8-a5c3-a60fa74a9456":{"id":"theme:0d727d80bb132f17c737e55883fe4be0","title":"Avada - WooCommerce product gallery","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/assets\/min\/js\/general\/avada-woo-product-images.js","\/includes\/lib\/assets\/min\/js\/library\/jquery.flexslider.js"],"is_default":0,"condition":"Avada","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"95ece7e4-3b19-45e5-aa28-14f833c9afca":{"title":"Avesa","condition":"avesa","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/avesa\/js\/main.js","\/avesa\/js\/isotope.js","\/sw_core\/js\/slick.min.js","\/avesa\/js\/bootstrap-datetimepicker.min.js","\/avesa\/js\/bootstrap.min.js"],"icon_url":"","type":"theme","id":"theme:aad8bfcc594eec02e3b0d635198dee5e","is_default":0,"created_at":1679737993},"f2bfe477-4e45-4e52-a7d9-4d0ba3a92258":{"title":"Besa","condition":"besa","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/besa\/js\/"],"icon_url":"","type":"theme","id":"theme:c238e89523c46ca28b08e401f42f6ccc","is_default":0,"created_at":1679738204},"bd94908c-8138-4995-986b-47ec66494bdd":{"title":"BeTheme","condition":"betheme","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/betheme\/","mfn","\/wp-includes\/js\/jquery\/ui\/tabs.min.js","\/wp-includes\/js\/jquery\/ui\/core.min.js"],"icon_url":"","type":"theme","id":"theme:b99156eb9eeb357c0a70bd3bda6861cc","is_default":0,"created_at":1679738639},"190d2f1a-72a6-40ca-b08a-5c7ee7b0a6a5":{"title":"Bosa Online Education - Fixes animations and preloader","condition":"bosa-online-education","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/bosa\/assets\/js\/jquery.slicknav.min.js","\/bosa\/assets\/slick\/slick.min.js","\/bosa\/assets\/js\/navigation.js","\/bosa\/assets\/js\/custom.min.js","\/bosa\/assets\/js\/theia-sticky-sidebar.min.js"],"icon_url":"","type":"theme","id":"theme:5430bf7b83c83a3687b3b7b437e961b0","is_default":0,"created_at":1708371742},"6fb2b9d7-6ecc-4260-999c-938fbebdbf01":{"id":"theme:de8504b73ea228d0ea9bbce69752092e","title":"Bridge","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/bridge-creative\/bridge\/js\/","\/wp-includes\/js\/"],"is_default":0,"condition":"bridge","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"1dd63427-b4c9-4596-b952-ac711e3637f9":{"title":"Bridge - Load elements without user interaction","condition":"bridge","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/wp-content\/themes\/bridge\/js\/default.min.js","\/wp-content\/themes\/bridge\/js\/plugins.js","\/wp-content\/themes\/bridge\/js\/default_dynamic.js","\/wp-content\/themes\/bridge\/js\/jquery.touchSwipe.min.js"],"icon_url":"","type":"theme","id":"theme:ad9b810efd365ad9a27987d2912b94cd","is_default":0,"created_at":1710252260},"65698b6b-85dd-41ef-8fd7-718f1e983dba":{"title":"Car Dealer","condition":"cardealer","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/jquery\/(.*)","\/cardealer\/js\/(.*)"],"icon_url":"","type":"theme","id":"theme:b1111424fff61af8d1e152dcdd6810f6","is_default":0,"created_at":1679737517},"3927d724-5a0a-402b-a838-858d30b54ea9":{"title":"Cardea - Show Page Content on Load","condition":"cardea-wp","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/themes\/cardea-wp\/js\/main.js","\/themes\/cardea-wp\/js\/jquery.sticky.js","\/themes\/cardea-wp\/js\/jquery.fitvids.js","\/themes\/cardea-wp\/js\/jquery.smartmenus.min.js"],"icon_url":"","type":"theme","id":"theme:d65d1a8303b0c7508278884520e4bec7","is_default":0,"created_at":1698677525},"087fb457-a09d-4140-84bd-c9bc1e8195b7":{"title":"CheerUp","condition":"cheerup","exclusions":["\/cheerup\/js\/jquery.sticky-sidebar.js","\/cheerup\/js\/object-fit-images.js","\/cheerup\/js\/jquery.fitvids.js","\/cheerup\/js\/jquery.mfp-lightbox.js","\/cheerup\/js\/ie-polyfills.js","\/cheerup\/js\/theme.js","\/wp-includes\/js\/imagesloaded.min.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/wp-includes\/js\/jquery\/jquery.min.js"],"icon_url":"","type":"theme","id":"theme:13bcf562f45afb245dc4f76fecfba6d6","is_default":0,"created_at":1696429398},"eb86aedb-91e6-480c-b76c-756ac1da41be":{"title":"Clover","condition":"clover-theme","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/clover-theme\/"],"icon_url":"","type":"theme","id":"theme:89372f3d9321ae09c94488592084da29","is_default":0,"created_at":1679738878},"6e90b649-5736-497f-9bc6-515900cfea8a":{"title":"Divi - Animations","condition":"Divi","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js",".dipi_preloader_wrapper_outer","\/Divi\/js\/scripts.min.js","\/Divi\/js\/custom.unified.js","\/js\/magnific-popup.js","var DIVI"],"icon_url":"","type":"theme","id":"theme:c0abf30dba4ff13db836d1b01685953a","is_default":0,"created_at":1679737389},"70916c43-4e02-4932-b6aa-91a1815bc755":{"title":"Divi - Background video","condition":"Divi","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate.min.js","\/Divi\/js\/custom.unified.js","\/js\/mediaelement\/(.*)","mejs"],"icon_url":"","type":"theme","id":"theme:c7edea41ae6716291e2d32a2ab429209","is_default":0,"created_at":1679738240},"08531785-9818-4e30-903e-564637a2ad7a":{"title":"Divi - Counter module","condition":"Divi","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js",".dipi_preloader_wrapper_outer","\/Divi\/js\/scripts.min.js","\/Divi\/js\/custom.unified.js","\/js\/magnific-popup.js","var DIVI","\/Divi\/includes\/builder\/feature\/dynamic-assets\/assets\/js\/easypiechart.js"],"icon_url":"","type":"theme","id":"theme:2c46b9f5a770f260c3f7115bb330b2d5","is_default":0,"created_at":1679736810},"b996762a-84ef-440d-a089-73a187936fbf":{"title":"Divi - Mobile menu","condition":"Divi","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate.min.js","\/Divi\/js\/scripts.min.js","\/Divi\/js\/custom.unified.js"],"icon_url":"","type":"theme","id":"theme:b9116994f4e4b9b9fa574440c00d2f0d","is_default":0,"created_at":1679738580},"ae096e1e-9c36-46ad-a3d1-c26ea507276b":{"title":"Divi - Sticky elements","condition":"Divi","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js",".dipi_preloader_wrapper_outer","\/Divi\/js\/scripts.min.js","\/Divi\/includes\/builder\/feature\/dynamic-assets\/assets\/js\/sticky-elements.js","var DIVI"],"icon_url":"","type":"theme","id":"theme:8b62db03c90245f3e690335b079b05dc","is_default":0,"created_at":1679737191},"349f31f0-dd10-41d3-b0a4-9c5df64879f8":{"title":"Divi - Sticky menu","condition":"Divi","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/js\/jquery\/jquery-migrate.min.js","\/Divi\/js\/scripts.min.js","\/Divi\/includes\/builder\/feature\/dynamic-assets\/assets\/js\/magnific-popup.js","jqueryParams","firstHeader"],"icon_url":"","type":"theme","id":"theme:b7b84aca0f0dc6a1ced31d38626c50ea","is_default":0,"created_at":1679738821},"59563458-5f04-4959-b3e2-53e49e169d67":{"title":"Divi - WooCommerce Single Product Images","condition":"Divi","exclusions":["\/Divi\/js\/scripts.min.js"],"icon_url":"","type":"theme","id":"theme:f9c5bdba8b39fc877b41dea00fa756f9","is_default":0,"created_at":1684342262},"6426539e-4e43-4fef-ab5a-3eb7b2a8b057":{"title":"Eikra","condition":"eikra","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate.min.js","\/eikra\/assets\/js\/","EikraObj"],"icon_url":"","type":"theme","id":"theme:55d2581ad975eb6325bc97fc3d3b0cb8","is_default":0,"created_at":1679738450},"59020bd6-069f-4f2d-afa2-fbdefa03211c":{"title":"Ekko","condition":"ekko","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/ekko\/"],"icon_url":"","type":"theme","id":"theme:2c06f4a1949f8ba4e77042a47674fd9e","is_default":0,"created_at":1679737803},"d82f5cdd-c5d3-4596-94dc-1e25aaff2083":{"title":"Elessi","condition":"elessi-theme","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/elessi-theme\/assets\/js\/min\/functions.min.js","\/elessi-theme\/assets\/js\/min\/main.min.js"],"icon_url":"","type":"theme","id":"theme:d5d2b7fda7b8a2b5b91d430f7602e230","is_default":0,"created_at":1679737773},"f0587c21-54d0-429d-8efe-18a93dacb18d":{"id":"theme:5fc04cc678cb54567aedb51027933002","title":"Enfold","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/dynamic_avia\/avia-footer-scripts-(.*).js","var avia_is_mobile"],"is_default":0,"condition":"enfold","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"cc0550cb-918e-419d-b4f2-1809cf666dbb":{"id":"theme:eb759a03d0ca292c948f09d004a2963f","title":"Enfold - LayerSlider","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","layerslider"],"is_default":0,"condition":"enfold","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"ec883654-4f63-4fae-a3ef-923dcbc2426d":{"title":"Enfold - Shortcodes","condition":"enfold","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/enfold\/js\/avia.js","\/enfold\/js\/shortcodes.js","\/enfold\/config-templatebuilder\/avia-shortcodes\/","\/enfold\/js\/avia-compat.js","\/enfold\/js\/waypoints\/waypoints.min.js","\/enfold\/js\/avia-snippet-(.*).js"],"icon_url":"","type":"theme","id":"theme:072fc4077d7071791d774d6ddbf5dc2a","is_default":0,"created_at":1684519716},"fe3546f0-be3e-4173-8992-a7f6f203b82f":{"title":"Envision","condition":"envision","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/envision\/lib\/js\/app.min.js","var CloudFwOp"],"is_default":1,"icon_url":"","type":"theme","id":"theme:fc5f7d69b646ed95835badc0fc23bc11","created_at":1679737494},"d997b942-19de-4710-9c81-79d3c65cbd76":{"id":"theme:047f009f2a1f4cdf2088c46be47e385b","title":"Ewebot","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/gt3-themes-core\/","\/uploads\/gt3-assets\/js\/(.*)","\/wp-includes\/js\/imagesloaded.min.js"],"is_default":0,"condition":"ewebot","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"53d29aec-8ae4-4273-b748-f5bd52dfe177":{"title":"Farvis","condition":"farvis","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/farvis\/"],"icon_url":"","type":"theme","id":"theme:26bff2f3a6ff6347d35edf5c77a35687","is_default":0,"created_at":1679737972},"fb01246b-a5f8-4021-b514-c02cf55e80bd":{"title":"Flatsome","condition":"flatsome","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/flatsome\/assets\/js\/flatsome.js","\/flatsome\/assets\/libs\/packery.pkgd.min.js","\/flatsome\/assets\/js\/woocommerce.js"],"icon_url":"","type":"theme","id":"theme:26fb1cf80f074ca199d8a7e94c5fc796","is_default":0,"created_at":1679738732},"4d65dc12-9ce7-4171-94a7-9821fd95240e":{"id":"theme:28a6f8b3319c107a34603be0f01a4bcf","title":"Flatsome - Google map","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","maps.googleapis.com","google.maps.LatLng","\/wp-includes\/js\/hoverIntent.min.js"],"is_default":0,"condition":"flatsome","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"890e15b6-c66b-4a9e-9b7d-55417df94916":{"title":"Flatsome - Images","condition":"flatsome","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/flatsome\/inc\/integrations\/wp-rocket\/flatsome-wp-rocket.js","\/flatsome\/assets\/js\/flatsome.js","\/flatsome\/inc\/extensions\/flatsome-lazy-load\/flatsome-lazy-load.js"],"icon_url":"","type":"theme","id":"theme:f2d60aad9f2f5395e3e145cf8f8ab165","is_default":0,"created_at":1679737691},"cb54d070-8ee0-4c35-9fa9-b2bac73ccf39":{"title":"Frida","condition":"frida","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/frida\/"],"icon_url":"","type":"theme","id":"theme:109ddf56796a5133e12279f3daa5ff62","is_default":0,"created_at":1679738013},"9e78539a-03d9-442b-ab94-dd3b7a9658e4":{"id":"theme:80a330247d61d729fcd78dc01de6ed2f","title":"GeneratePress - Mobile menu","type":"theme","icon":"","exclusions":["\/generatepress\/assets\/js\/menu.min.js","generatepressMenu","\/gp-premium\/menu-plus\/functions\/js\/offside.min.js"],"is_default":0,"condition":"generatepress","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"6373bbb2-877c-4075-b6e4-7c58d686b25c":{"title":"HealthFirst - Prevent console errors","condition":"healthfirst","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/wp-includes\/js\/hoverIntent.min.js","\/wp-content\/plugins\/healthfirst-core\/assets\/js\/healthfirst-core.min.js","\/wp-content\/plugins\/healthfirst-core\/assets\/plugins\/modernizr\/modernizr.js","\/wp-content\/plugins\/healthfirst-core\/assets\/plugins\/perfect-scrollbar\/perfect-scrollbar.jquery.min.js","\/wp-content\/themes\/healthfirst\/assets\/js\/main.min.js","\/wp-content\/themes\/healthfirst\/assets\/plugins\/waitforimages\/jquery.waitforimages.js"],"icon_url":"","type":"theme","id":"theme:d244b3c692f8d023048207dbe9eb84da","is_default":0,"created_at":1699370973},"2c72e7e6-cb77-44e9-af87-d5c42ae6db52":{"title":"Honor - WPBakery fix","condition":"honor","exclusions":["\/honor\/js\/__scripts.js","HONOR_STORAGE","\/js_composer\/"],"icon_url":"","type":"theme","id":"theme:9f228373ff4d172655dbf5cb3b1bc23a","is_default":0,"created_at":1679736895},"9309d1d3-1035-4a2c-8ced-075bc3ff9957":{"title":"HotelMaster","condition":"hotelmaster","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/hotelmaster\/javascript\/gdlr-script.js","\/hotelmaster\/plugins\/dl-menu\/modernizr.custom.js","\/hotelmaster\/plugins\/dl-menu\/jquery.dlmenu.js","\/hotelmaster\/plugins\/superfish\/js\/superfish.js","\/hotelmaster\/plugins\/jquery.easing.js"],"icon_url":"","type":"theme","id":"theme:978eaddad3b1047e479407b6d92197aa","is_default":0,"created_at":1679738595},"4a09f745-cbb1-47c8-b50a-c8014d5d1335":{"id":"theme:e813a548bceac6765a1cdf2316f1a6ab","title":"HotelMaster - Blog","type":"theme","icon":"","exclusions":["\/wp-includes\/js\/masonry.min.js","\/gp-premium\/blog\/functions\/js\/scripts.min.js","\/wp-includes\/js\/imagesloaded.min.js"],"is_default":0,"condition":"hotelmaster","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"f2d8f704-ec68-4278-9ca2-885daa0c1ce5":{"id":"theme:398a264e302e42640553681e8759cd07","title":"HotelMaster - Masonry","type":"theme","icon":"","exclusions":["\/gp-premium\/menu-plus\/functions\/js\/offside.min.js","offSide"],"is_default":0,"condition":"hotelmaster","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"92b2e258-1f44-41c1-b1bd-f117f61ee49d":{"title":"Jannah Theme - Fix masonry grid","condition":"jannah","exclusions":["\/wp-includes\/js\/jquery\/jquery.min.js","\/wp-includes\/js\/masonry.min.js","\/wp-includes\/js\/jquery\/jquery.masonry.min.js","tie-"],"icon_url":"","type":"theme","id":"theme:35f7f183089309f52046377ca65e905a","is_default":0,"created_at":1699642920},"df52436c-53d6-461a-b81a-cd0b21680524":{"title":"JNews","condition":"jnews","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate.min.js","\/jnews\/assets\/js\/","jnews","jfla"],"icon_url":"","type":"theme","id":"theme:5d90e451984f9d894b1aabb0d00f30a2","is_default":0,"created_at":1679738860},"87ed69a2-3295-4fad-a82e-eeb02925a5dc":{"title":"Jobify","condition":"jobify","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/jobify\/js\/jobify.min.js","\/jobify\/js\/select2.full.min.js"],"icon_url":"","type":"theme","id":"theme:592006aa4562a6915e344e5e2a09e5ee","is_default":0,"created_at":1704735224},"28a0b1ea-8d2f-4931-a48a-166b8df8a773":{"title":"JOYN","condition":"joyn","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/swift-framework\/includes\/page-builder\/frontend-assets\/js\/lib\/modernizr-custom.js","\/swift-framework\/includes\/page-builder\/frontend-assets\/js\/spb-functions.min.js","\/swift-framework\/includes\/swift-slider\/assets\/js\/swift-slider.min.js","\/swift-framework\/public\/js\/lib\/imagesloaded.pkgd.min.js","\/joyn\/js\/owl.carousel.min.js","\/joyn\/js\/theme-scripts.js","\/joyn\/js\/functions.js"],"icon_url":"","type":"theme","id":"theme:c395470ad2d4d681836cd942bbb03120","is_default":0,"created_at":1679738527},"542be60a-2346-4740-9a41-8a580c4f013c":{"title":"Juno Toys","condition":"junotoys","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate.min.js","\/junotoys\/fw\/js\/core.init.js","\/junotoys\/fw\/js\/core.utils.js","\/junotoys\/fw\/js\/superfish.js","\/junotoys\/fw\/js\/swiper\/swiper.js","\/trx_utils\/shortcodes\/theme.shortcodes.js","\/wp-includes\/js\/jquery\/ui\/(.*)"],"icon_url":"","type":"theme","id":"theme:2acab38e8356d36355bb81d931e7fba4","is_default":0,"created_at":1679737788},"06167710-10c7-446e-a08b-ce676e444102":{"title":"Jupiter","condition":"jupiter","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/jupiter\/","\/wp-includes\/js\/underscore.min.js","WebFont.load"],"icon_url":"","type":"theme","id":"theme:89c5c30498c2989611f9044be006197c","is_default":0,"created_at":1679738430},"5d042e1f-7e62-4ec4-ba31-30d396004522":{"title":"JupiterX","condition":"jupiterx","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/jupiterx\/(.*).js","\/wp-includes\/js\/underscore.min.js","WebFont.load"],"icon_url":"","type":"theme","id":"theme:b06632962a4948d4944fd8d79ffbfceb","is_default":0,"created_at":1679737312},"c4b030ea-66a1-4729-85bf-a484e373a316":{"title":"Kadence","condition":"kadence","exclusions":["\/kadence\/assets\/js\/navigation.min.js","mobile_menu_breakpoint","kadenceConfig"],"icon_url":"","type":"theme","id":"theme:4b7907ee68218db279648da9bf7102d1","is_default":0,"created_at":1704735260},"20c605b4-3e3a-4bb0-a5e5-a08e2cb0f31f":{"title":"Kalium","condition":"kalium","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/kalium\/assets\/js\/main.min.js","mobile_menu_breakpoint","var _k"],"icon_url":"","type":"theme","id":"theme:1fcb99a1ab06e1e36635365ed3e59ce5","is_default":0,"created_at":1679737406},"e1e04a7d-635a-4e28-83d9-e345ce40e354":{"title":"Kava","condition":"kava","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/kava\/assets\/js\/theme-script.js"],"icon_url":"","type":"theme","id":"theme:359d67efbf530c998245225dd3245a88","is_default":0,"created_at":1679738609},"e833c36e-ee89-4924-b608-3f28327c2f85":{"title":"Lay","condition":"lay","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/backbone.min.js","\/wp-includes\/js\/underscore.min.js","\/lay\/","\/laytheme-carousel\/","window.laytheme"],"icon_url":"","type":"theme","id":"theme:7c718c6da874ea6e4b27c6d70bc4e7e8","is_default":0,"created_at":1679737453},"2df2ef47-a833-4711-ba54-48dc62586f37":{"id":"theme:85d9922ac61ed833fd047a67029df8e5","title":"LazaNews","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/jquery.custom.js"],"is_default":0,"condition":"lazanews","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"9443304a-34e9-4700-a03a-5f8f62f83ed1":{"title":"Listeo","condition":"listeo","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/listeo\/js\/"],"icon_url":"","type":"theme","id":"theme:db7da585545001f5ae614a2810f08f3a","is_default":0,"created_at":1679737244},"77afa73c-c4a8-42a8-aaee-43f6a761364e":{"title":"ListingPro","condition":"listingpro","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/listingpro\/assets\/lib\/jquerym.menu\/js\/jquery.mmenu.min.all.js","\/listingpro\/assets\/lib\/Magnific-Popup-master\/jquery.magnific-popup.min.js","\/listingpro\/assets\/js\/select2.full.min.js","\/listingpro\/assets\/js\/jquery.city-autocomplete.js","\/listingpro\/assets\/js\/chosen.jquery.min.js","\/listingpro\/assets\/lib\/bootstrap\/js\/bootstrap-slider.js","\/listingpro\/assets\/js\/jquery-ui.js","\/listingpro\/assets\/js\/mapbox.js","\/listingpro\/assets\/js\/main.js","\/listingpro\/assets\/js\/leaflet.markercluster.js","maps"],"icon_url":"","type":"theme","id":"theme:0b365e43dfc65d2b1b70fac6510c7c9c","is_default":0,"created_at":1679737938},"01b369b5-b578-4314-8e95-40b67a41d75a":{"title":"Master Study","condition":"masterstudy","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/masterstudy\/assets\/js\/custom.js","\/masterstudy\/assets\/vendors\/jquery.fancybox.min.js","\/masterstudy\/assets\/js\/select2.full.min.js"],"icon_url":"","type":"theme","id":"theme:0ee224c20e4ef7d546733d933db598f2","is_default":0,"created_at":1704735299},"6b000cc7-d33b-4109-9c39-6119a5d81cde":{"title":"Maya","condition":"maya","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/maya\/js\/jquery.mobilemenu.js","\/maya\/js\/jquery.custom.js","\/maya\/core\/includes\/js\/jquery.tipsy.js"],"icon_url":"","type":"theme","id":"theme:719fe28004fcdd81a820602924aa8074","is_default":0,"created_at":1679737916},"ef3c76d6-1041-473d-81ea-a5a6e8c86735":{"title":"MH Magazine","condition":"mh-magazine","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/mh-magazine\/"],"icon_url":"","type":"theme","id":"theme:2a0cd6efc2f46be69de61712729a2ec9","is_default":0,"created_at":1679737743},"9cbb2777-5524-43b8-af36-692b27452c0d":{"title":"Minimog","condition":"minimog","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/minimog\/"],"icon_url":"","type":"theme","id":"theme:61c0c235042359ee7d2a9035e79a7da2","is_default":0,"created_at":1679738135},"7eb81c74-8062-4a6c-bf66-b7c5bc160141":{"title":"Moozo Elementor","condition":"moozo-elementor","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/moozo-elementor\/assets\/js\/countdown.js","\/moozo-elementor\/assets\/vendor\/countdown\/countdown.min.js"],"icon_url":"","type":"theme","id":"theme:2ddb538c8e6b6c766fffd0d5c861fd82","is_default":0,"created_at":1679738623},"e90b7bfa-9ff6-4e1a-bf29-6207d55fdd39":{"title":"Motor","condition":"motor","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/motor\/js\/"],"icon_url":"","type":"theme","id":"theme:b33538179f5661a86cbe327a1793e199","is_default":0,"created_at":1683973354},"445e625a-f955-41fa-84de-65d9ea19be07":{"title":"My Listing","condition":"my-listing","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/my-listing\/assets\/","\/wp-includes\/js\/dist\/vendor\/moment.min.js","maps.googleapis.com","MyListing","_Explore_Settings"],"icon_url":"","type":"theme","id":"theme:afacb777229ddf5cabceacc64948057d","is_default":0,"created_at":1679737725},"00b8cd2d-2781-4fbb-ac5d-00750ba94ac9":{"title":"Neve - Mobile menu","condition":"neve","exclusions":["\/neve\/assets\/js\/build\/modern\/frontend.js"],"icon_url":"","type":"theme","id":"theme:5ae731cc06dd9284f8172675a6fe81ab","is_default":0,"created_at":1679738714},"483abc54-f1fc-47dc-bfc1-a269c7d1c849":{"title":"Newspaper - Images","condition":"Newspaper","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","tagdiv_theme.min.js","tdBlocksArray","\/wp-includes\/js\/underscore.min.js","\/td-cloud-library\/assets\/js\/","\/npm\/slick-carousel@1.8.1\/slick\/slick.min.js","tdb-gallery-wrap","tdBlocksArray","tdb_"],"icon_url":"","type":"theme","id":"theme:649ff22527bac2b1c8e0115cd3851d53","is_default":0,"created_at":1695805761},"50db8d14-d421-4237-be14-a6f7b5c11ec5":{"title":"Newspaper - Slider & YouTube","condition":"Newspaper","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","tagdiv_theme.min.js","tdBlocksArray","tdb_globals","td_youtube_list_ids","iosSlider","\/td-cloud-library\/assets\/js\/js_files_for_front.min.js","\/wp-includes\/js\/underscore.min.js","\/td-cloud-library\/assets\/js\/","\/npm\/slick-carousel@1.8.1\/slick\/slick.min.js","tdb-gallery-wrap","tdBlocksArray","tdb_"],"icon_url":"","type":"theme","id":"theme:7e2eeee57ae458c5959342eda6526bf1","is_default":0,"created_at":1695805747},"514f4c30-2b67-4648-960e-dfe1cc401ca5":{"title":"Niva","condition":"niva","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/niva\/js\/","\/sweetthemes-framework\/js\/","mt_typed"],"icon_url":"","type":"theme","id":"theme:c4838f73a344b829ed626635e210dcf4","is_default":0,"created_at":1679738256},"e67ee504-c3b1-455e-88ab-1fae8c830652":{"title":"OceanWP","condition":"oceanwp","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/oceanwp\/"],"icon_url":"","type":"theme","id":"theme:db37af4b7d12695d37d9256313a5f37a","is_default":0,"created_at":1679737552},"e44e240a-8765-4f4f-b67e-d54e4b727506":{"title":"OceanWP - Mobile menu","condition":"oceanwp","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/ocean-side-panel\/assets\/js\/side-panel.min.js","\/oceanwp\/assets\/js\/theme.vanilla.min.js"],"icon_url":"","type":"theme","id":"theme:9babbcd52b2ce558d299a06cd1130a11","is_default":0,"created_at":1679738463},"897b0100-958d-4a02-b6b2-1e753e9869f4":{"title":"PenNews","condition":"pennews","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/pennews\/js\/script.min.js","\/pennews\/js\/script.lib.min.js"],"icon_url":"","type":"theme","id":"theme:02811fa00bc1471bb5be0457ce0ee005","is_default":0,"created_at":1704735339},"edd3ba03-e0fd-4b6e-911b-60b29f3471bf":{"title":"Pharmacy Mentor","condition":"pharmacymentor","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/pharmacymentor\/"],"icon_url":"","type":"theme","id":"theme:3188aaf1ef2c39937450f2a14ebb1174","is_default":0,"created_at":1679738214},"725415ff-cc76-45cc-a131-3170e5aa30fc":{"title":"Porto","condition":"porto","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/jquery\/ui\/","\/porto\/js\/theme.js","\/porto\/js\/theme.min.js"],"icon_url":"","type":"theme","id":"theme:8493f398f200c8dffe60d46439dd3360","is_default":0,"created_at":1679737758},"2c19bcec-f3ff-4873-bfd7-db6bc0f6433c":{"title":"Porto - Owl Carousel","condition":"porto","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/wp-includes\/js\/jquery\/ui\/","\/porto\/js\/theme(|.min).js","\/porto\/js\/libs\/owl.carousel(|.min).js","\/porto\/js\/theme-async(|.min).js","\/prettyPhoto\/jquery.prettyPhoto(|.min).js"],"icon_url":"","type":"theme","id":"theme:f34f5199fb7fca78852cd3fb7758f178","is_default":0,"created_at":1687527252},"5b11ec89-1cb2-4793-8b77-79e917e810a0":{"title":"Pro Theme - Fix menu and accordions","condition":"pro","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/pro\/cornerstone\/assets\/js\/site\/cs-classic.(.*).js"],"icon_url":"","type":"theme","id":"theme:8f30d70dd2d9a0386445aef8fdd534a9","is_default":0,"created_at":1708100602},"31347ccb-f69e-4cd3-bd47-b80ce14ac76e":{"title":"ProPhoto","condition":"prophoto7","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/prophoto7\/js\/bundle.front.js","\/wp-includes\/js\/underscore.min.js","PROPHOTO"],"icon_url":"","type":"theme","id":"theme:a5836a56c4472fade4dc6ebfe2281554","is_default":0,"created_at":1679737425},"a8208c04-865c-49aa-ab96-41e378d391c8":{"title":"Publisher","condition":"publisher","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","\/publisher\/js\/"],"icon_url":"","type":"theme","id":"theme:32c73be0cb175da278c8e2af0811b0d1","is_default":0,"created_at":1679738169},"a0d69f3d-1356-4a1d-a600-2f2f788b8a9a":{"title":"REHub","condition":"rehub-theme","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/rehub-theme\/js\/custom_floatpanel.js"],"icon_url":"","type":"theme","id":"theme:321af1febb74f488cf911380893739b2","is_default":0,"created_at":1679738502},"8b74bbe5-7f32-42df-908f-78c99a8cad82":{"title":"Rey","condition":"rey","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/rey\/scripts-(.*).js","\/rey-core\/assets\/js\/"],"icon_url":"","type":"theme","id":"theme:e46567cd0f3ec9b37e7230dc87eac367","is_default":0,"created_at":1679737011},"5c9115d3-bcbd-49d6-8feb-4880d2b82bfe":{"title":"Rife Free","condition":"rife-free","exclusions":["\/rife-free\/js\/script.min.js","\/rife-free\/js\/isotope.pkgd.min.js","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","var reJS"],"icon_url":"","type":"theme","id":"theme:74a449954de79625eccc6750e87af8f6","is_default":0,"created_at":1679738107},"6542b2fd-1f91-4862-aa18-11eecc02faaf":{"title":"Roisin","condition":"roisin","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/themes\/roisin\/assets\/js\/main.min.js","\/plugins\/roisin-core\/assets\/js\/roisin-core.min.js","\/wp-includes\/js\/hoverIntent.min.js"],"icon_url":"","type":"theme","id":"theme:8f38fe58034772931110930b91cb6797","is_default":0,"created_at":1685964523},"5a192ad9-d150-4aa0-8efc-d68131cb7a37":{"title":"Sahifa - Mobile Menu","condition":"sahifa","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/themes\/sahifa\/js\/ilightbox.packed.js","\/translate_a\/element.js"],"icon_url":"","type":"theme","id":"theme:06ebe49f4c1e5b04cece831f8bb198a3","is_default":0,"created_at":1687540363},"7ae9d978-d63c-4a58-beb3-418bebb5b23c":{"title":"Salient","condition":"salient","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/salient\/","winW > bodyW"],"icon_url":"","type":"theme","id":"theme:b3e12d57ac23897be1bb2c673e3fc761","is_default":0,"created_at":1704735382},"35aaa6c5-4a37-4161-b504-fb3ebc4b1148":{"title":"Salient - Nectar slider","condition":"salient","exclusions":["\/salient-nectar-slider\/js\/nectar-slider.js","\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js"],"icon_url":"","type":"theme","id":"theme:d612db1dd8dc76faa6a36a9ebfd336dc","is_default":0,"created_at":1704735415},"84c95206-3e59-4eb3-a0c9-e2231a1c0a48":{"title":"SEO Lounge","condition":"seolounge","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?$","\/js_composer\/assets\/js\/dist\/js_composer_front.min.js","\/seolounge\/js\/radiantthemes-custom.js","\/seolounge\/js\/radiantthemes-core.min.js"],"icon_url":"","type":"theme","id":"theme:3d72b779d9c4ba6b51cc5b245b141433","is_default":0,"created_at":1691695809},"cd44aa56-088a-40dd-bf1e-f835efa68626":{"title":"Shoptimizer","condition":"shoptimizer","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/shoptimizer\/assets\/js\/lazyload-bg.js","\/shoptimizer\/assets\/js\/main.min.js"],"icon_url":"","type":"theme","id":"theme:6c32b43f4da639e5901574fac6b7d387","is_default":0,"created_at":1679737143},"d2c48a48-430a-4eea-bc05-99b66f1f6a7b":{"title":"SmartMag","condition":"smart-mag","exclusions":["\/smart-mag\/js\/lazyload.js"],"icon_url":"","type":"theme","id":"theme:23d6b7878bd0087addb067db3fa39864","is_default":0,"created_at":1679738490},"dd0d9133-ef17-4dac-b174-9f25d535838f":{"title":"Soledad","condition":"soledad","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/soledad\/js\/main.js","\/soledad\/js\/more-post.js","\/soledad\/js\/libs-script.min.js"],"icon_url":"","type":"theme","id":"theme:d3f78b26c2d11c99230171cc6378d06e","is_default":0,"created_at":1679737664},"3b85dd6e-9534-477e-9b15-940d0e155c8d":{"title":"Spacious - Mobile Menu","condition":"spacious","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/spacious\/js\/navigation.js"],"icon_url":"","type":"theme","id":"theme:d423c1f002b10b8682ee24d616b19c9c","is_default":0,"created_at":1703192854},"d657dc56-5c04-439a-8987-401f89a65bf9":{"title":"Stockholm","condition":"stockholm","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/stockholm\/js\/"],"icon_url":"","type":"theme","id":"theme:fcfff492e00727b63cf5dff9f59bc2a4","is_default":0,"created_at":1679738378},"121f9b1b-d3cd-4dde-915e-0b348abf6687":{"title":"Storefront","condition":"storefront","exclusions":["\/storefront\/assets\/js\/navigation.min.js"],"icon_url":"","type":"theme","id":"theme:f0dca7e4eaedf573d4664be249845942","is_default":0,"created_at":1679738793},"41cfc83f-ff02-4a35-a3b7-e92db213b224":{"title":"StreamTube","condition":"streamtube","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/streamtube\/","\/streamtube-core\/"],"icon_url":"","type":"theme","id":"theme:9772ccddd470688f6bc6aee86e34d29b","is_default":0,"created_at":1679331431},"aec0a548-4c6b-400a-80ed-19a49e0faef0":{"title":"The7","condition":"dt-the7","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/wp-includes\/js\/jquery\/jquery-migrate.min.js","loader-removed","\/Ultimate_VC_Addons\/assets\/min-js\/","\/dt-the7\/","\/js_composer\/"],"icon_url":"","type":"theme","id":"theme:7934c689fd20e30b6bfc69bb9d46cb63","is_default":0,"created_at":1679737892},"538354ff-d69f-40be-b0cc-df3790599dd2":{"title":"TheGem","condition":"thegem","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/thegem\/js\/","gemSettings","thegemSlideshow","tgpLazyItemsOptions"],"icon_url":"","type":"theme","id":"theme:153c54fe73897da838ce39152b1db5a8","is_default":0,"created_at":1679738477},"84d95a79-270c-4223-b459-bb49c6acfaf1":{"title":"Theme Electiman - Mobile Menu","condition":"electiman","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/themes\/electiman\/assets\/js\/navigation.js","\/themes\/electiman\/assets\/js\/theme-pluginjs.js","\/themes\/electiman\/assets\/js\/theme.js","\/themes\/electiman\/assets\/js\/slick.min.js","\/themes\/electiman\/venobox\/venobox.min.js","\/themes\/electiman\/assets\/js\/owl.carousel.min.js","\/wp-includes\/js\/imagesloaded.min.js"],"icon_url":"","type":"theme","id":"theme:a59c888391c869ed4f3417c02d71fe15","is_default":0,"created_at":1702923332},"3a59bf59-4fe5-4690-8ab7-33e6a976e2e3":{"title":"Thrive Theme Builder","condition":"thrive-theme","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/thrive-visual-editor\/editor\/js\/dist\/modules\/(.*).js","TVE_Event_Manager_Registered_Callbacks","ThriveGlobal","TCB_Front","TL_Front","TVE_Ult","thrive-","thrive_","tve_","tve-"],"icon_url":"","type":"theme","id":"theme:7492fc8f8a90ad7ef680d9c560da2b0f","is_default":0,"created_at":1710767440},"68f2de3b-e2b8-4edf-b82f-93fd7834c65f":{"title":"Total","condition":"Total","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/Total\/assets\/js\/total.min.js"],"icon_url":"","type":"theme","id":"theme:96b0141273eabab320119c467cdcaf17","is_default":0,"created_at":1679737571},"6dc1cb35-6b50-4da0-9834-dddf169edaa6":{"id":"theme:7c37c885d7fecf788f635734f99e8610","title":"Townhub","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/townhub-add-ons\/assets\/js\/(.*)","\/wp-includes\/js\/dist\/vendor\/react.js","\/wp-includes\/js\/dist\/vendor\/react-dom.js"],"is_default":0,"condition":"townhub","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"f484f86b-e316-4871-9322-dee3925349fe":{"title":"Travel Monster - Owl Carousel","condition":"travel-monster","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/wp-content\/plugins\/wp-travel-engine\/assets\/lib\/owl-carousel(.*)\/owl.carousel(|.min).js","var isRtl"],"icon_url":"","type":"theme","id":"theme:d3e8da87b3affd399205438fbc8a4f05","is_default":0,"created_at":1690822771},"3ec96c3f-a6bf-4748-9b7e-78864bd24add":{"title":"uDesign - Mobile Menu","condition":"u-design","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/wp-content\/themes\/u-design\/assets\/js\/theme.min.js","\/wp-content\/themes\/u-design\/framework\/assets\/js\/framework.min.js","\/wp-content\/themes\/u-design\/framework\/assets\/js\/framework-async.min.js"],"icon_url":"","type":"theme","id":"theme:31ce70b0a02f8720a86d993816676943","is_default":0,"created_at":1699292981},"cb523239-27cc-461e-973d-c984a83223ac":{"title":"uDesign - Show Page Content on Load","condition":"u-design","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>|$)","\/wp-content\/themes\/u-design\/assets\/js\/theme.min.js","\/wp-content\/themes\/u-design\/framework\/assets\/js\/framework.min.js"],"icon_url":"","type":"theme","id":"theme:c55edd40ad3f9321da577dad70bb130c","is_default":0,"created_at":1698778683},"14cb0a85-8bee-491e-99d7-5f20a07f4bdd":{"title":"Uncode","condition":"uncode","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/uncode\/library\/js\/init(.min)?.js","\/uncode\/library\/js\/plugins(.min)?.js","\/uncode\/library\/js\/app(.min)?.js","\/uncode\/library\/js\/woocommerce-uncode(.min)?.js","\/wp-includes\/js\/mediaelement\/mediaelement-and-player.min.js","initHeader","initBox","fixMenuHeight","initRow"],"icon_url":"","type":"theme","id":"theme:18ba19b98aefbb6c0fde6c6bf92e9cfc","is_default":0,"created_at":1679738154},"a1fbf155-720a-4704-9794-d6749ad6df59":{"title":"Vivo theme - Fix blank page","condition":"vivo","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/vivo\/framework\/assets\/js\/bt_framework_misc.js"],"icon_url":"","type":"theme","id":"theme:a140e640fed504586e24e7c0df30376b","is_default":0,"created_at":1704308662},"88e96479-1aa2-4adc-8f07-20bc0368a63f":{"title":"Werkstatt","condition":"werkstatt","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/js\/underscore.min.js","\/werkstatt\/assets\/js\/vendor.min.js","\/werkstatt\/assets\/js\/fullscreen.min.js","\/werkstatt\/assets\/js\/app.min.js"],"icon_url":"","type":"theme","id":"theme:38faa29db5a07b8fef6aee9cc11cafec","is_default":0,"created_at":1679737639},"60c4110b-a960-4d44-b619-6d79514dbf75":{"title":"Woodmart","condition":"woodmart","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/wp-includes\/js\/imagesloaded.min.js","\/woodmart\/js\/scripts\/wc\/","\/woodmart\/js\/scripts\/global\/","\/woodmart\/js\/libs\/owl.carousel.min.js","\/woodmart\/js\/libs\/owl.carousel.js","\/woodmart\/js\/libs\/slick.js","\/woodmart\/js\/libs\/autocomplete.min.js"],"icon_url":"","type":"theme","id":"theme:06338f13cb89e5309ad2eb7e4d457be4","is_default":0,"created_at":1695633901},"a4547b5b-10ab-407c-969c-269fddec07b8":{"title":"Woodmart - Cart Fragments","condition":"woodmart","exclusions":["\\\/jquery(-migrate)?-?([0-9.]+)?(.min|.slim|.slim.min)?.js(\\?(.*))?( |'|\"|>)","\/woocommerce\/assets\/js\/frontend\/cart-fragments.min.js","\/woocommerce\/assets\/js\/js-cookie\/js.cookie.min.js","\/woodmart\/js\/scripts\/wc\/updateCartFragmentsFix.js"],"icon_url":"","type":"theme","id":"theme:591f4f1b2e86b1e987cd8789df3ffce3","is_default":0,"created_at":1700584689},"119ebd1c-6b46-4f07-8d6a-3498d9c8814f":{"title":"XStore","condition":"xstore","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/xstore\/js\/","\/et-core-plugin\/packages\/st-woo-swatches\/public\/js\/frontend.min.js"],"icon_url":"","type":"theme","id":"theme:3de9d9ba385200548f177d9c704ae92a","is_default":0,"created_at":1679738190},"9a7a548c-07a1-4dff-93fc-6e8230b67853":{"id":"theme:119d329456073aa10969d7cbd9760f28","title":"YOOtheme Pro","type":"theme","icon":"","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","uikit.min.js"],"is_default":0,"condition":"yootheme","created_at":1676435704,"updated_at":"2023-02-15T04:32:17.000000Z","icon_url":""},"f74c499e-b7d9-4590-8671-379f51f468c8":{"title":"Zeen","condition":"zeen","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","\/zeen\/assets\/js\/","\/js.cookie.min.js"],"icon_url":"","type":"theme","id":"theme:acb52844f996627788836366404a3245","is_default":0,"created_at":1679737859}},"scripts":{"dd0c5a5b-ec56-49f9-9aa4-89e1e3a6a28a":{"title":"Amazon Ads","exclusions":["amazon-adsystem.com"],"icon_url":"","type":"script","id":"script:b82a5936d8ea0745016caeb71629ae5d","is_default":0,"created_at":1681390276},"980edf32-c64b-4370-bf23-c62b079e71c3":{"title":"Google AdSense","exclusions":["adsbygoogle"],"icon_url":"","type":"script","id":"script:0206e6040c8ff64b8d6ee5fef2ce1c90","is_default":0,"created_at":1681377840},"2499bb90-0753-4b2b-9bd4-1525f94c7437":{"title":"Google Analytics","exclusions":["google-analytics.com\/analytics.js","ga\\( '","ga\\('"],"icon_url":"","type":"script","id":"script:d86cf69a8b82547a94ca3f6a307cf9a6","is_default":0,"created_at":1681388311},"6f460036-3106-4b8c-9951-d32de9b1258f":{"title":"Google Maps","exclusions":["maps.googleapis.com","maps.google.com"],"icon_url":"","type":"script","id":"script:4d60ab2c6d11d753267484006c23e54c","is_default":0,"created_at":1681390259},"ac2d5720-9418-468c-80a0-3874ee743c0f":{"title":"Google Optimize","exclusions":["a,s,y,n,c,h,i,d,e","googleoptimize.com\/optimize.js","async-hide"],"icon_url":"","type":"script","id":"script:031a0cece38c4739df67f910dcabf1bd","is_default":0,"created_at":1681390261},"122e6ebb-51fd-477f-97fb-559593f1a48b":{"title":"Google Recaptcha","exclusions":["recaptcha"],"icon_url":"","type":"script","id":"script:032cb16577cbf07bc7c02bac83bd936d","is_default":0,"created_at":1681390264},"219277ae-b2ac-4d42-913d-eaea40985295":{"title":"Google Tag Manager","exclusions":["\/gtag\/js","gtag\\(","\/gtm.js","async-hide"],"icon_url":"","type":"script","id":"script:1d3c65b2b03ef35e14df6b163ea3a1f6","is_default":0,"created_at":1681390266},"f632e3f4-20e6-471e-a78d-86afbea63586":{"title":"HubSpot","exclusions":["\/jquery-?[0-9.](.*)(.min|.slim|.slim.min)?.js","\/jquery-migrate(.min)?.js","js.hsforms.net","hbspt.forms.create"],"icon_url":"","type":"script","id":"script:de4bd8ef4675ebb85a055955de76d0ee","is_default":0,"created_at":1679331623},"5d606add-ffb8-4a06-b295-5f722710fbfd":{"title":"Refari","exclusions":["widget.refari.co","refari"],"icon_url":"","type":"script","id":"script:a705e197b13b47e72a105c923e044358","is_default":0,"created_at":1683797056},"742ec14a-27a1-4789-b9c8-a9c3a3cf7042":{"title":"Reviews.io","exclusions":["\/carousel-inline-iframeless\/dist.js","carouselInlineWidget"],"icon_url":"","type":"script","id":"script:4df445c576f45889506ba175a4c39fdc","is_default":0,"created_at":1684389426},"05d3eb78-f574-49be-95e1-3f11714005d1":{"id":"script:ce7566d1d08cc094b74cf283cf9c56a5","title":"Stripe","type":"script","icon":"","exclusions":["js.stripe.com"],"is_default":0,"condition":"","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""},"ce9a3865-9efa-4e98-ae10-4f842a4ecc22":{"title":"Typeform","exclusions":["\/next\/embed.js"],"icon_url":"","type":"script","id":"script:cd3889ae3b96f891186ae270dbbcc9bb","is_default":0,"created_at":1709838856},"b56bf06c-2f8c-4757-b536-a689fb0e75f9":{"title":"Typekit","exclusions":["typekit"],"icon_url":"","type":"script","id":"script:7815e38b93e3b500a632681bd594bd61","is_default":0,"created_at":1681390268},"49c38c0a-43b9-4237-88cb-57ddd519f0ad":{"title":"Venatus Media","exclusions":["\/ad-manager.min.js","__vm_add"],"icon_url":"","type":"script","id":"script:abe11528732aed9a19a97e73b242faa5","is_default":0,"created_at":1681390272},"2c1d0998-8ab5-478c-8eb9-9e375b46363e":{"title":"Wistia","exclusions":["fast.wistia.com"],"icon_url":"","type":"script","id":"script:9a0111f8c3186c1cb3113587c660c041","is_default":0,"created_at":1681390274},"0627fe24-7e9d-400f-b064-d98bec2ba85e":{"id":"script:dbd1875130c71eb4b2ef768ad18d820c","title":"Yandex Ads","type":"script","icon":"","exclusions":["yandex.ru","window.yaContextCb"],"is_default":0,"condition":"","created_at":1676435704,"updated_at":"2023-02-15T04:32:16.000000Z","icon_url":""}}} diff --git a/dynamic-lists.json b/dynamic-lists.json index cecdd4ae70..3412f3af41 100644 --- a/dynamic-lists.json +++ b/dynamic-lists.json @@ -1 +1 @@ -{"rucss_inline_atts_exclusions":["rocket-lazyload-inline-css","divi-style-parent-inline-inline-css","gsf-custom-css","extra-style-inline-inline-css","woodmart-inline-css-inline-css","woodmart_shortcodes-custom-css","rs-plugin-settings-inline-css","divi-style-inline-inline-css","tcb-post-list-dynamic-style","n2-ss-","wpcf7-","siteorigin-panels-layouts-footer","xstore-inline-css-inline-css","assets.reviews.io","ezoicCSS","stk-"],"rucss_inline_content_exclusions":[".wp-container-",".wp-elements-","#wpv-expandable-",".custom-content-","#thb-",".et_pb_text_dap_","#gdlr-core-shape-divider","#ultib3-",".uvc-wrap-",".jet-listing-dynamic-post-",".vcex_",".wprm-advanced-list-",".adsslot_",".jnews_",".cp-info-bar.content-","#stockie-custom-","#ohio-custom-",".uid-","#wpfMainWrapper","#penci_","#penci-",".wpbs_s","#apcore_","#apress_","#zolo_",".extended-products-grid#style-",".preloader#style-preloader-",".thegem-heading-",".thegem-button-",".thegem-custom-",".thegem-popup-","#pattern-","#thegem-video-frame-","#thegem-",".qwery_inline_",".dcgd_submit_button",".irs-bar",".gallery-grid-",".cmplz-hidden","#sqbquizouter","#start_sqbquizouter",".flo-header--",".trx_addons_inline_",".wpp-cardview-compact",".e-loop-item-",".tiered-pricing-plain-text"],"defer_js_inline_exclusions":["DOMContentLoaded","document.write","window.lazyLoadOptions","N.N2_","rev_slider_wrapper","FB3D_CLIENT_LOCALE","ewww_webp_supported","anr_captcha_field_div","renderInvisibleReCaptcha","bookingInProgress"],"defer_js_external_exclusions":["gist.github.com","content.jwplatform.com","js.hsforms.net","www.uplaunch.com","google.com\/recaptcha","widget.reviews.co.uk","verify.authorize.net\/anetseal","lib\/admin\/assets\/lib\/webfont\/webfont.min.js","app.mailerlite.com","widget.reviews.io","simplybook.(.*)\/v2\/widget\/widget.js","\/wp-includes\/js\/dist\/i18n.min.js","\/wp-content\/plugins\/wpfront-notification-bar\/js\/wpfront-notification-bar(.*).js","\/wp-content\/plugins\/oxygen\/component-framework\/vendor\/aos\/aos.js","\/wp-content\/plugins\/ewww-image-optimizer\/includes\/check-webp(.min)?.js","static.mailerlite.com\/data\/(.*).js","cdn.voxpow.com\/static\/libs\/v1\/(.*).js","cdn.voxpow.com\/media\/trackers\/js\/(.*).js","use.typekit.net","www.idxhome.com","\/wp-includes\/js\/dist\/vendor\/lodash(.min)?.js","\/wp-includes\/js\/dist\/api-fetch(.min)?.js","\/wp-includes\/js\/dist\/i18n(.min)?.js","\/wp-includes\/js\/dist\/vendor\/wp-polyfill(.min)?.js","\/wp-includes\/js\/dist\/url(.min)?.js","\/wp-includes\/js\/dist\/hooks(.min)?.js","www.paypal.com\/sdk\/js","js-eu1.hsforms.net","yanovis.Voucher.js","\/carousel-upsells-and-related-product-for-woocommerce\/assets\/js\/glide.min.js","use.typekit.com","\/artale\/modules\/kirki\/assets\/webfont.js","\/api\/scripts\/lb_cs.js","js.hscta.net\/cta\/current.js","widget.refari.co","player.vdocipher.com","\/wp-content\/plugins\/wp-rocket\/assets\/js\/lcp-beacon(.min)?.js"],"delay_js_exclusions":["nowprocket","\/wp-includes\/js\/wp-embed.min.js","lazyLoadOptions","lazyLoadThumb","wp-rocket\/assets\/js\/lazyload\/(.*)","et_core_page_resource_fallback","window.\\$us === undefined","js-extra","fusionNavIsCollapsed","\/assets\/js\/smush-lazy-load","eio_lazy_vars","\\\/lazysizes(\\.min|-pre|-post)?\\.js","document\\.body\\.classList\\.remove\\(\"no-js\"\\)","document\\.documentElement\\.className\\.replace\\( 'no-js', 'js' \\)","et_animation_data","wpforms_settings","var nfForms","\/\/stats.wp.com","_stq.push","fluent_form_ff_form_instance_","cpLoadCSS","ninja_column_","var rbs_gallery_","var lepopup_","var billing_additional_field","var gtm4wp","var dataLayer_content","\/ewww-image-optimizer\/includes\/load[_-]webp(\\.min)?.js","\/ewww-image-optimizer\/includes\/check-webp(\\.min)?.js","ewww_webp_supported","\/dist\/js\/browser-redirect\/app.js","\/perfmatters\/js\/lazyload.min.js","lazyLoadInstance","scripts.mediavine.com\/tags\/","initCubePortfolio","simpli.fi","gforms_recaptcha_","\/jetpack-boost\/vendor\/automattic\/jetpack-lazy-images\/(.*)","jetpack-lazy-images-js-enabled","jetpack-boost-critical-css","wpformsRecaptchaCallback","booking-suedtirol-js","wpcp_css_disable_selection","\/gravityforms\/js\/conditional_logic.min.js","statcounter.com\/counter\/counter.js","var sc_project","\/jetpack\/jetpack_vendor\/automattic\/jetpack-lazy-images\/(.*)","\/themify-builder\/themify\/js\/modules\/fallback(\\.min)?.js","handlePixMessage","var corner_video","cdn.pixfuture.com\/hb_v2.js","cdn.pixfuture.com\/pbix.js","served-by.pixfuture.com\/www\/delivery\/ads.js","served-by.pixfuture.com\/www\/delivery\/headerbid_sticky_refresh.js","serv-vdo.pixfuture.com\/vpaid\/ads.js","wprRemoveCPCSS","window.jdgmSettings","\/photonic\/include\/js\/front-end\/nomodule\/photonic-baguettebox.min.js","\/photonic\/include\/ext\/baguettebox\/baguettebox.min.js","window.wsf_form_json_config","et_link_options_data","FuseboxPlayerAPIKey","js.hscta.net\/cta\/current.js","hbspt.cta.load","consent.cookiebot.com\/uc.js","\/woofilter-pro\/woofilterpro\/js\/ion.rangeSlider.min.js","barra.r7.com\/barra.js","rocket_css_lazyload_launch","#wpr-lazyload-bg","\/wp-content\/plugins\/wp-rocket\/assets\/js\/lcp-beacon(.min)?.js"],"js_minify_external":["html5.js","show_ads.js","histats.com\/js","ws.amazon.com\/widgets","\/ads\/","intensedebate.com","scripts.chitika.net\/","jotform.com\/","gist.github.com","forms.aweber.com","video.unrulymedia.com","stats.wp.com","stats.wordpress.com","widget.rafflecopter.com","widget-prime.rafflecopter.com","releases.flowplayer.org","c.ad6media.fr","cdn.stickyadstv.com","www.smava.de","contextual.media.net","app.getresponse.com","adserver.reklamstore.com","s0.wp.com","wprp.zemanta.com","files.bannersnack.com","smarticon.geotrust.com","js.gleam.io","ir-na.amazon-adsystem.com","web.ventunotech.com","verify.authorize.net","ads.themoneytizer.com","embed.finanzcheck.de","imagesrv.adition.com","js.juicyads.com","form.jotformeu.com","speakerdeck.com","content.jwplatform.com","ads.investingchannel.com","app.ecwid.com","www.industriejobs.de","s.gravatar.com","googlesyndication.com","a.optmstr.com","a.optmnstr.com","a.opmnstr.com","adthrive.com","mediavine.com","js.hsforms.net","googleadservices.com","f.convertkit.com","recaptcha\/api.js","mailmunch.co","apps.shareaholic.com","dsms0mj1bbhn4.cloudfront.net","nutrifox.com","code.tidio.co","www.uplaunch.com","widget.reviewability.com","embed-cdn.gettyimages.com\/widgets.js","app.mailerlite.com","ck.page","cdn.jsdelivr.net\/gh\/AmauriC\/","static.klaviyo.com\/onsite\/js\/klaviyo.js","a.omappapi.com\/app\/js\/api.min.js","static.zdassets.com","feedbackcompany.com\/widgets\/feedback-company-widget.min.js","widget.gleamjs.io","phonewagon.com","simplybook.asia\/v2\/widget\/widget.js","simplybook.it\/v2\/widget\/widget.js","simplybook.me\/v2\/widget\/widget.js","static.botsrv.com\/website\/js\/widget2.36cf1446.js","static.mailerlite.com\/data\/","cdn.voxpow.com","loader.knack.com","embed.lpcontent.net\/leadboxes\/current\/embed.js","cc.cdn.civiccomputing.com\/9\/cookieControl-9.x.min.js","cse.google.com\/cse.js","kit.fontawesome.com","cdn.jsdelivr.net\/npm\/mathjax@3\/es5\/tex-mml-chtml.js","static.leadpages.net\/leadbars\/current\/embed.js","booqable.com\/v2\/booqable.js","googleoptimize.com","cdna.hubpeople.com\/js\/widget_standalone_two_modes.js","s3.tradingview.com","www.vbt.io\/ext\/vbtforms.js","cdn.callrail.com","documentcloud.adobe.com\/view-sdk\/main.js","static.cleverpush.com","js.afterpay.com","cdn.enable.co.il\/licenses\/enable-","hcaptcha.com\/1\/api.js","voucher.getavo.it\/public\/js\/yanovis.Voucher.js","js-eu1.hsforms.net","statcounter.com\/counter\/counter.js","snapppt.com","use.typekit.com","secure.gravatar.com\/js\/gprofiles.js","cdn.jsdelivr.net\/npm\/hockeystack","widget.prod.faslet.net","ga.getresponse.com\/script\/ga.js","cognitoforms.com","usercentrics.eu","cdn.amcharts.com","umami","cdn.popt.in\/pixel.js","m2d.m2.ai","pubguru.net","trustindex.io","cdnjs.cloudflare.com\/ajax\/libs\/prism\/","podigee-podcast-player.js","tarteaucitron.io\/load.js","osm.klarnaservices.com\/lib.js","mein.clickskeks.at\/app.js","barra.r7.com\/barra.js","widget.refari.co","widget.reviews.co.uk","player.vdocipher.com","www.instagram.com\/embed.js","smartframe.io","challenges.cloudflare.com\/turnstile\/","script.roboassist.ai","cdn.hu-manity.co","daumcdn.net\/mapjsapi\/bundle\/postcode\/prod\/postcode.v2.js","consent.cookiebot.com\/uc.js"],"js_move_after_combine":["map_fusion_map_","ec:addProduct","ec:addImpression","clear_better_facebook_comments","vc-row-destroy-equal-heights-","dfd-icon-list-","SFM_template","WLTChangeState","wlt_star_","wlt_pop_distance_","smart_list_tip","gd-wgt-pagi-","data-rf-id=","tvc_po=","scrapeazon","startclock","it_logo_field_owl-box_","td_live_css_uid","wpvl_paramReplace","tdAjaxCount","mec_skin_","_wca","_taboola","fbq('trackCustom'","fbq('track'","data.token","sharrre","dfads_ajax_load_ads","tie_postviews","wmp_update","h5ab-print-article","gform_ajax_frame_","gform_post_render","mts_view_count","act_css_tooltip","window.SLB","wpt_view_count","var dateNow","gallery_product_",".flo-block-slideshow-","data='api-key=ct-","ip_common_function()","(\"style#gsf-custom-css\").append","a3revWCDynamicGallery_","#owl-carousel-instagram-","window.FlowFlowOpts","jQuery('.td_uid_","jQuery(\".slider-","#dfd-vcard-widget-","#sf-instagram-widget-",".woocommerce-tabs-","penci_megamenu__","vc_prepareHoverBox","wp-temp-form-div","_wswebinarsystem_already_","#views-extra-css\").text","fusetag.setTargeting","hit.uptrendsdata.com","callback:window.renderBadge","test_run_nf_conditional_logic","cb_nombre","$('.fl-node-","function($){google_maps_","$(\"#myCarousel","et_animation_data=","current_url=\"","CustomEvent.prototype=window.Event.prototype","electro-wc-product-gallery","woof_is_mobile","jQuery('.videonextup","wpp_params","us.templateDirectoryUri=",".fat-gallery-item",".ratingbox","user_rating.prototype.eraseCookie","test_run_nf_conditional","dpsp-networks-btns-wrapper","pa_woo_product_info","sharing_enabled_on_post_via_metabox","#product-search-field-","GOTMLS_login_offset","berocket_aapf_time_to_fix_products_style","window.vc_googleMapsPointer","sinceID_","#ut-background-video-ut-section","+window.comment_tab_width+","dfd-button-hover-in","wpseo-address-wrapper","platform.stumbleupon.com","#woo_pp_ec_button_mini_cart","#supercarousel","blockClass","tdbMenuItem","tdbSearchItem","best_seller_badge","jQuery('#product-top-bar","fb_desc-","FC_regenerate_captcha","wp_post_blocks_vars.listed_posts=[","captcha-hash","mapdata={",".ywpc-char-",").countdowntimer(","jQuery(\"#td_uid_","find('#td_uid_","variation_estimate_msg"],"js_excluded_inline":["document.write","google_ad","edToolbar","gtag","_gaq.push","_gaLt","GoogleAnalyticsObject","syntaxhighlighter","adsbygoogle","ci_cap_","_stq","nonce","post_id","LogHuman","idcomments_acct","ch_client","sc_online_t","_stq","bannersnack_embed","vtn_player_type","ven_video_key","ANS_customer_id","tdBlock","tdLocalCache","wpRestNonce","\"url\":","lazyLoadOptions","adthrive","loadCSS","google_tag_params","clicky_custom","clicky_site_ids","NSLPopupCenter","_paq","gtm","dataLayer","RecaptchaLoad","WPCOM_sharing_counts","jetpack_remote_comment","subscribe-field","contextly","_mmunch","gt_request_uri","doGTranslate","docTitle","bs_ajax_paginate_","bs_deferred_loading_","theChampRedirectionUrl","theChampFBCommentUrl","theChampTwitterRedirect","theChampRegRedirectionUrl","ESSB_CACHE_URL","oneall_social_login_providers_","betterads_screen_width","woocommerce_wishlist_add_to_wishlist_url","arf_conditional_logic","heateorSsHorSharingShortUrl","TL_Const","bimber_front_microshare","setAttribute(\"id\"","setAttribute( \"id\"","TribeEventsPro","peepsotimedata","wphc_data","hc_rand_id","RBL_ADD","AfsAnalyticsObject","_thriveCurrentPost","esc_login_url","fwduvpMainPlaylist","Bibblio.initRelatedContent","showUFC()","#iphorm-","#fancy-","ult-carousel-","theChampLJAuthUrl","f._fbq","Insticator","w2dc_js_objects","cherry_ajax","ad_block_","elementorFrontendConfig","zeen_","disqusIdentifier","currentAjaxUrl","geodir_event_call_calendar_","atatags-","hbspt.forms.create","function(c,h,i,m,p)","dataTable({","rankMath = {","_atrk_opts","quicklinkOptions","ct_checkjs_","WP_Statistics_http","penci_block_","omapi_localized","omapi_data","OptinMonsterApp","tminusnow","nfForms","galleries.gallery_","wcj_evt.prodID","advads_tracking_ads","advadsGATracking.postContext","woopack_config","ulp_content_id","wp-cumulus\/tagcloud.swf?r=","ctSetCookie('ct_checkjs'","woof_really_curr_tax","uLogin.customInit","i18n_no_matching_variations_text","alsp_map_markers_attrs","var inc_opt =","iworks_upprev","yith_wcevti_tickets","window.metrilo.ensure_cbuid","metrilo.event","wordpress_page_root","wcct_info","Springbot.product_id","pysWooProductData","dfd-heading","owl=$(\"#","penci_megamenu","fts_security","algoliaAutocomplete","avia_framework_globals","tabs.easyResponsiveTabs","searchlocationHeader","yithautocomplete","data-parallax-speed","currency_data=","cedexisData","function reenableButton","#wpnbio-show","e.Newsletter2GoTrackingObject","var categories_","\"+nRemaining+\"","cartsguru_cart_token","after_share_easyoptin","location_data.push","thirstyFunctions.isThirstyLink","styles: ' #custom-menu-","function svc_center_","#svc_carousel2_container_","advads.move","elementid","advads_has_ads","wpseo_map_init","mdf_current_page_url","tptn_tracker","dpsp_pin_button_data","searchwp_live_search_params","wpp_params","top.location,thispage","selection+pagelink","ic_window_resolution","PHP.wp_p_id","ShopifyBuy.UI.onReady(client)","orig_request_uri","gie.widgets.load","Adman.Flash","PHP.wp_p_id","window.broadstreetKeywords","var productId =","var flatsomeVars","wc_product_block_data","static.mailerlite.com","amzn_assoc","_bs_getParameterByName","_stq.push","h._remove","var FlowFlowOpts","var WCPFData =","var _beeketing","var _statcounter","var actions =","var current_url","var object_name","var the_ajax_script","var wc_cart_fragments_params","var woocommerce_params","var wpml_cookies","wc_add_to_cart_params","window.broadstreetKeywords","window.wc_ga_pro.available_gateways","xa.prototype","HOUZEZ_ajaxcalls_vars","w2dc_maps_objects","w2dc_controller_args_array","w2dc_map_markers_attrs","YT.Player","WPFC.data","function current_video_","var videodiv","var slider_wppasrotate","wppas_ga","var blockClass","tarteaucitron","pw_brand_product_list","tminusCountDown","pysWooSelectContentData","wpvq_ans89733","_isp_version","price_range_data","window.FeedbackCompanyWidgets","woocs_current_currency","woo_variation_swatches_options","woocommerce_price_slider_params","scriptParams","form-adv-pagination","borlabsCookiePrioritize","urls_wpwidgetpolylang","quickViewNonce","frontendscripts_params","nj-facebook-messenger","var fb_mess_position","init_particles_row_background_script","setREVStartSize","fl-node","PPAccordion","soliloquy_","wprevpublicjs_script_vars","DTGS_NONCE_FRONTEND","et_animation_data","archives-dropdown","loftloaderCache","SmartSliderSimple","var nectarLove","var incOpt","RocketBrowserCompatibilityChecker","RocketPreloadLinksConfig","placementVersionId","var useEdit","var DTGS_NONCE_FRONTEND","n2jQuery","et_core_api_spam_recaptcha","cnArgs","__CF$cv$params","trustbox_settings","aepro","cdn.jst.ai","w2dc_fields_in_categories","jetMenuPublicSettings","JetTricksSettings","aepc_pixel","avadaWooCommerceVars","var isb","fcaPcPost","csrf_token","icwp_wpsf_vars_lpantibot","wpvViewHead","ed_school_plugin","aps_comp_","guaven_woos","__lm_redirect_to","__wpdm_view_count","bookacti.booking_system","nfFrontEnd","view_quote_cart_link","__eae_decode_emails","divioverlays_ajaxurl","var _EPYT_","#ins-heading-","#ins-button-","tve_frontend_options","lb24.src","amazon_Login_accessToken","porto_infinite_scroll",".adace-loader-","adace_load_","tagGroupsAccordiontaggroupscloudaccordion","tagGroupsTabstaggroupscloudtabs","jrRelatedWidgets","UNCODE.initRow","amp_mobile_redirect_disabled","wpgdprcData","wpml_browser_redirect_params","swPreRegister","kboard_settings","ct_ultimate_gdpr_cookie","wcpv_registration_local","www.idxhome.com","arf_footer_cl_logic_call","reload_attached_coupons","var ftpp","forminatorFront","_EPYT_","edd_free_downloads_vars","edd_stripe_vars","var ASP","ecwidOriginalTitle","defaultCategoryId","translation-revision-date","google_conversion_id","hbspt","var marker_locations_","var AdmMyAjax","ifso_page_url","referrer_for_pageload","WoocommerceWidget\/woocommerceWidget.js","var ht_ctc_chat_var","spuvar","var wpilFrontend","urls_polylangREPLACETOID","e.setAttribute('unselectable',on);","try{Typekit.load","iMapsData","var wpforms_user_journey","rocket_lazyload_css_data","wcStoreApiNonceTimestamp","createNonceMiddleware"],"cache_ignored_parameters":["utm_source","utm_medium","utm_campaign","utm_expid","utm_term","utm_content","utm_id","utm_source_platform","utm_creative_format","utm_marketing_tactic","mtm_source","mtm_medium","mtm_campaign","mtm_keyword","mtm_cid","mtm_content","pk_source","pk_medium","pk_campaign","pk_keyword","pk_cid","pk_content","fb_action_ids","fb_action_types","fb_source","fbclid","campaignid","adgroupid","adid","gclid","age-verified","ao_noptimize","usqp","cn-reloaded","_ga","sscid","gclsrc","_gl","mc_cid","mc_eid","_bta_tid","_bta_c","trk_contact","trk_msg","trk_module","trk_sid","gdfms","gdftrk","gdffi","_ke","_kx","redirect_log_mongo_id","redirect_mongo_id","sb_referer_host","mkwid","pcrid","ef_id","s_kwcid","msclkid","dm_i","epik","pp","gbraid","wbraid","ssp_iabi","ssp_iaba","gad","vgo_ee","gad_source"],"preload_exclusions":["void\\(.*;","(.*)__trashed(.*)","\/jet-menu\/(.*)","\/jet-popup\/(.*)"],"exclude_js_files":["\/wp-includes\/js\/dist\/i18n.min.js","\/interactive-3d-flipbook-powered-physics-engine\/assets\/js\/html2canvas.min.js","\/interactive-3d-flipbook-powered-physics-engine\/assets\/js\/pdf.min.js","\/interactive-3d-flipbook-powered-physics-engine\/assets\/js\/three.min.js","\/interactive-3d-flipbook-powered-physics-engine\/assets\/js\/3d-flip-book.min.js","\/google-site-kit\/dist\/assets\/js\/(.*).js","\/wp-live-chat-support\/public\/js\/callus(.*).js","\/borlabs-cookie\/assets\/javascript\/(.*).js","\/wp-content\/plugins\/wp-rocket\/assets\/js\/lcp-beacon(.min)?.js","\/woocommerce-bookings\/dist\/frontend.js"],"staging_domains":[".wpengine.com",".wpenginepowered.com",".pantheonsite.io",".flywheelsites.com",".flywheelstaging.com",".kinsta.com",".kinsta.cloud",".cloudwaysapps.com",".azurewebsites.net",".wpserveur.net","-liquidwebsites.com",".myftpupload.com",".dream.press",".sg-host.com",".platformsh.site",".wpstage.net",".bigscoots-staging.com",".wpsc.site",".runcloud.link",".onrocket.site",".singlestaging.com",".myraidbox.de",".instawp.xyz",".instawp.co",".instawp.link",".instawp.app",".hstgr.cloud",".myhostpoint.ch"]} \ No newline at end of file +{"rucss_inline_atts_exclusions":["rocket-lazyload-inline-css","divi-style-parent-inline-inline-css","gsf-custom-css","extra-style-inline-inline-css","woodmart-inline-css-inline-css","woodmart_shortcodes-custom-css","rs-plugin-settings-inline-css","divi-style-inline-inline-css","tcb-post-list-dynamic-style","n2-ss-","wpcf7-","siteorigin-panels-layouts-footer","xstore-inline-css-inline-css","assets.reviews.io","ezoicCSS"],"rucss_inline_content_exclusions":[".wp-container-",".wp-elements-","#wpv-expandable-",".custom-content-","#thb-",".et_pb_text_dap_","#gdlr-core-shape-divider","#ultib3-",".uvc-wrap-",".jet-listing-dynamic-post-",".vcex_",".wprm-advanced-list-",".adsslot_",".jnews_",".cp-info-bar.content-","#stockie-custom-","#ohio-custom-",".uid-","#wpfMainWrapper","#penci_","#penci-",".wpbs_s","#apcore_","#apress_","#zolo_",".extended-products-grid#style-",".preloader#style-preloader-",".thegem-heading-",".thegem-button-",".thegem-custom-",".thegem-popup-","#pattern-","#thegem-video-frame-","#thegem-",".qwery_inline_",".dcgd_submit_button",".irs-bar",".gallery-grid-",".cmplz-hidden","#sqbquizouter","#start_sqbquizouter",".flo-header--",".trx_addons_inline_"],"defer_js_inline_exclusions":["DOMContentLoaded","document.write","window.lazyLoadOptions","N.N2_","rev_slider_wrapper","FB3D_CLIENT_LOCALE","ewww_webp_supported","anr_captcha_field_div","renderInvisibleReCaptcha","bookingInProgress"],"defer_js_external_exclusions":["gist.github.com","content.jwplatform.com","js.hsforms.net","www.uplaunch.com","google.com\/recaptcha","widget.reviews.co.uk","verify.authorize.net\/anetseal","lib\/admin\/assets\/lib\/webfont\/webfont.min.js","app.mailerlite.com","widget.reviews.io","simplybook.(.*)\/v2\/widget\/widget.js","\/wp-includes\/js\/dist\/i18n.min.js","\/wp-content\/plugins\/wpfront-notification-bar\/js\/wpfront-notification-bar(.*).js","\/wp-content\/plugins\/oxygen\/component-framework\/vendor\/aos\/aos.js","\/wp-content\/plugins\/ewww-image-optimizer\/includes\/check-webp(.min)?.js","static.mailerlite.com\/data\/(.*).js","cdn.voxpow.com\/static\/libs\/v1\/(.*).js","cdn.voxpow.com\/media\/trackers\/js\/(.*).js","use.typekit.net","www.idxhome.com","\/wp-includes\/js\/dist\/vendor\/lodash(.min)?.js","\/wp-includes\/js\/dist\/api-fetch(.min)?.js","\/wp-includes\/js\/dist\/i18n(.min)?.js","\/wp-includes\/js\/dist\/vendor\/wp-polyfill(.min)?.js","\/wp-includes\/js\/dist\/url(.min)?.js","\/wp-includes\/js\/dist\/hooks(.min)?.js","www.paypal.com\/sdk\/js","js-eu1.hsforms.net","yanovis.Voucher.js","\/carousel-upsells-and-related-product-for-woocommerce\/assets\/js\/glide.min.js","use.typekit.com","\/artale\/modules\/kirki\/assets\/webfont.js","\/api\/scripts\/lb_cs.js","js.hscta.net\/cta\/current.js","widget.refari.co","player.vdocipher.com"],"delay_js_exclusions":["nowprocket","\/wp-includes\/js\/wp-embed.min.js","lazyLoadOptions","lazyLoadThumb","wp-rocket\/assets\/js\/lazyload\/(.*)","et_core_page_resource_fallback","window.\\$us === undefined","js-extra","fusionNavIsCollapsed","\/assets\/js\/smush-lazy-load","eio_lazy_vars","\\\/lazysizes(\\.min|-pre|-post)?\\.js","document\\.body\\.classList\\.remove\\(\"no-js\"\\)","document\\.documentElement\\.className\\.replace\\( 'no-js', 'js' \\)","et_animation_data","wpforms_settings","var nfForms","\/\/stats.wp.com","_stq.push","fluent_form_ff_form_instance_","cpLoadCSS","ninja_column_","var rbs_gallery_","var lepopup_","var billing_additional_field","var gtm4wp","var dataLayer_content","\/ewww-image-optimizer\/includes\/load[_-]webp(\\.min)?.js","\/ewww-image-optimizer\/includes\/check-webp(\\.min)?.js","ewww_webp_supported","\/dist\/js\/browser-redirect\/app.js","\/perfmatters\/js\/lazyload.min.js","lazyLoadInstance","scripts.mediavine.com\/tags\/","initCubePortfolio","simpli.fi","gforms_recaptcha_","\/jetpack-boost\/vendor\/automattic\/jetpack-lazy-images\/(.*)","jetpack-lazy-images-js-enabled","jetpack-boost-critical-css","wpformsRecaptchaCallback","booking-suedtirol-js","wpcp_css_disable_selection","\/gravityforms\/js\/conditional_logic.min.js","statcounter.com\/counter\/counter.js","var sc_project","\/jetpack\/jetpack_vendor\/automattic\/jetpack-lazy-images\/(.*)","\/themify-builder\/themify\/js\/modules\/fallback(\\.min)?.js","handlePixMessage","var corner_video","cdn.pixfuture.com\/hb_v2.js","cdn.pixfuture.com\/pbix.js","served-by.pixfuture.com\/www\/delivery\/ads.js","served-by.pixfuture.com\/www\/delivery\/headerbid_sticky_refresh.js","serv-vdo.pixfuture.com\/vpaid\/ads.js","wprRemoveCPCSS","window.jdgmSettings","\/photonic\/include\/js\/front-end\/nomodule\/photonic-baguettebox.min.js","\/photonic\/include\/ext\/baguettebox\/baguettebox.min.js","window.wsf_form_json_config","et_link_options_data","FuseboxPlayerAPIKey","js.hscta.net\/cta\/current.js","hbspt.cta.load","consent.cookiebot.com\/uc.js","\/woofilter-pro\/woofilterpro\/js\/ion.rangeSlider.min.js","barra.r7.com\/barra.js","rocket_css_lazyload_launch","#wpr-lazyload-bg","\/borlabs-cookie\/assets\/javascript\/","borlabs-cookie-config"],"js_minify_external":["html5.js","show_ads.js","histats.com\/js","ws.amazon.com\/widgets","\/ads\/","intensedebate.com","scripts.chitika.net\/","jotform.com\/","gist.github.com","forms.aweber.com","video.unrulymedia.com","stats.wp.com","stats.wordpress.com","widget.rafflecopter.com","widget-prime.rafflecopter.com","releases.flowplayer.org","c.ad6media.fr","cdn.stickyadstv.com","www.smava.de","contextual.media.net","app.getresponse.com","adserver.reklamstore.com","s0.wp.com","wprp.zemanta.com","files.bannersnack.com","smarticon.geotrust.com","js.gleam.io","ir-na.amazon-adsystem.com","web.ventunotech.com","verify.authorize.net","ads.themoneytizer.com","embed.finanzcheck.de","imagesrv.adition.com","js.juicyads.com","form.jotformeu.com","speakerdeck.com","content.jwplatform.com","ads.investingchannel.com","app.ecwid.com","www.industriejobs.de","s.gravatar.com","googlesyndication.com","a.optmstr.com","a.optmnstr.com","a.opmnstr.com","adthrive.com","mediavine.com","js.hsforms.net","googleadservices.com","f.convertkit.com","recaptcha\/api.js","mailmunch.co","apps.shareaholic.com","dsms0mj1bbhn4.cloudfront.net","nutrifox.com","code.tidio.co","www.uplaunch.com","widget.reviewability.com","embed-cdn.gettyimages.com\/widgets.js","app.mailerlite.com","ck.page","cdn.jsdelivr.net\/gh\/AmauriC\/","static.klaviyo.com\/onsite\/js\/klaviyo.js","a.omappapi.com\/app\/js\/api.min.js","static.zdassets.com","feedbackcompany.com\/widgets\/feedback-company-widget.min.js","widget.gleamjs.io","phonewagon.com","simplybook.asia\/v2\/widget\/widget.js","simplybook.it\/v2\/widget\/widget.js","simplybook.me\/v2\/widget\/widget.js","static.botsrv.com\/website\/js\/widget2.36cf1446.js","static.mailerlite.com\/data\/","cdn.voxpow.com","loader.knack.com","embed.lpcontent.net\/leadboxes\/current\/embed.js","cc.cdn.civiccomputing.com\/9\/cookieControl-9.x.min.js","cse.google.com\/cse.js","kit.fontawesome.com","cdn.jsdelivr.net\/npm\/mathjax@3\/es5\/tex-mml-chtml.js","static.leadpages.net\/leadbars\/current\/embed.js","booqable.com\/v2\/booqable.js","googleoptimize.com","cdna.hubpeople.com\/js\/widget_standalone_two_modes.js","s3.tradingview.com","www.vbt.io\/ext\/vbtforms.js","cdn.callrail.com","documentcloud.adobe.com\/view-sdk\/main.js","static.cleverpush.com","js.afterpay.com","cdn.enable.co.il\/licenses\/enable-","hcaptcha.com\/1\/api.js","voucher.getavo.it\/public\/js\/yanovis.Voucher.js","js-eu1.hsforms.net","statcounter.com\/counter\/counter.js","snapppt.com","use.typekit.com","secure.gravatar.com\/js\/gprofiles.js","cdn.jsdelivr.net\/npm\/hockeystack","widget.prod.faslet.net","ga.getresponse.com\/script\/ga.js","cognitoforms.com","usercentrics.eu","cdn.amcharts.com","umami","cdn.popt.in\/pixel.js","m2d.m2.ai","pubguru.net","trustindex.io","cdnjs.cloudflare.com\/ajax\/libs\/prism\/","podigee-podcast-player.js","tarteaucitron.io\/load.js","osm.klarnaservices.com\/lib.js","mein.clickskeks.at\/app.js","barra.r7.com\/barra.js","widget.refari.co","widget.reviews.co.uk","player.vdocipher.com","www.instagram.com\/embed.js","smartframe.io","challenges.cloudflare.com\/turnstile\/"],"js_move_after_combine":["map_fusion_map_","ec:addProduct","ec:addImpression","clear_better_facebook_comments","vc-row-destroy-equal-heights-","dfd-icon-list-","SFM_template","WLTChangeState","wlt_star_","wlt_pop_distance_","smart_list_tip","gd-wgt-pagi-","data-rf-id=","tvc_po=","scrapeazon","startclock","it_logo_field_owl-box_","td_live_css_uid","wpvl_paramReplace","tdAjaxCount","mec_skin_","_wca","_taboola","fbq('trackCustom'","fbq('track'","data.token","sharrre","dfads_ajax_load_ads","tie_postviews","wmp_update","h5ab-print-article","gform_ajax_frame_","gform_post_render","mts_view_count","act_css_tooltip","window.SLB","wpt_view_count","var dateNow","gallery_product_",".flo-block-slideshow-","data='api-key=ct-","ip_common_function()","(\"style#gsf-custom-css\").append","a3revWCDynamicGallery_","#owl-carousel-instagram-","window.FlowFlowOpts","jQuery('.td_uid_","jQuery(\".slider-","#dfd-vcard-widget-","#sf-instagram-widget-",".woocommerce-tabs-","penci_megamenu__","vc_prepareHoverBox","wp-temp-form-div","_wswebinarsystem_already_","#views-extra-css\").text","fusetag.setTargeting","hit.uptrendsdata.com","callback:window.renderBadge","test_run_nf_conditional_logic","cb_nombre","$('.fl-node-","function($){google_maps_","$(\"#myCarousel","et_animation_data=","current_url=\"","CustomEvent.prototype=window.Event.prototype","electro-wc-product-gallery","woof_is_mobile","jQuery('.videonextup","wpp_params","us.templateDirectoryUri=",".fat-gallery-item",".ratingbox","user_rating.prototype.eraseCookie","test_run_nf_conditional","dpsp-networks-btns-wrapper","pa_woo_product_info","sharing_enabled_on_post_via_metabox","#product-search-field-","GOTMLS_login_offset","berocket_aapf_time_to_fix_products_style","window.vc_googleMapsPointer","sinceID_","#ut-background-video-ut-section","+window.comment_tab_width+","dfd-button-hover-in","wpseo-address-wrapper","platform.stumbleupon.com","#woo_pp_ec_button_mini_cart","#supercarousel","blockClass","tdbMenuItem","tdbSearchItem","best_seller_badge","jQuery('#product-top-bar","fb_desc-","FC_regenerate_captcha","wp_post_blocks_vars.listed_posts=[","captcha-hash","mapdata={",".ywpc-char-",").countdowntimer(","jQuery(\"#td_uid_","find('#td_uid_","variation_estimate_msg"],"js_excluded_inline":["document.write","google_ad","edToolbar","gtag","_gaq.push","_gaLt","GoogleAnalyticsObject","syntaxhighlighter","adsbygoogle","ci_cap_","_stq","nonce","post_id","LogHuman","idcomments_acct","ch_client","sc_online_t","_stq","bannersnack_embed","vtn_player_type","ven_video_key","ANS_customer_id","tdBlock","tdLocalCache","wpRestNonce","\"url\":","lazyLoadOptions","adthrive","loadCSS","google_tag_params","clicky_custom","clicky_site_ids","NSLPopupCenter","_paq","gtm","dataLayer","RecaptchaLoad","WPCOM_sharing_counts","jetpack_remote_comment","subscribe-field","contextly","_mmunch","gt_request_uri","doGTranslate","docTitle","bs_ajax_paginate_","bs_deferred_loading_","theChampRedirectionUrl","theChampFBCommentUrl","theChampTwitterRedirect","theChampRegRedirectionUrl","ESSB_CACHE_URL","oneall_social_login_providers_","betterads_screen_width","woocommerce_wishlist_add_to_wishlist_url","arf_conditional_logic","heateorSsHorSharingShortUrl","TL_Const","bimber_front_microshare","setAttribute(\"id\"","setAttribute( \"id\"","TribeEventsPro","peepsotimedata","wphc_data","hc_rand_id","RBL_ADD","AfsAnalyticsObject","_thriveCurrentPost","esc_login_url","fwduvpMainPlaylist","Bibblio.initRelatedContent","showUFC()","#iphorm-","#fancy-","ult-carousel-","theChampLJAuthUrl","f._fbq","Insticator","w2dc_js_objects","cherry_ajax","ad_block_","elementorFrontendConfig","zeen_","disqusIdentifier","currentAjaxUrl","geodir_event_call_calendar_","atatags-","hbspt.forms.create","function(c,h,i,m,p)","dataTable({","rankMath = {","_atrk_opts","quicklinkOptions","ct_checkjs_","WP_Statistics_http","penci_block_","omapi_localized","omapi_data","OptinMonsterApp","tminusnow","nfForms","galleries.gallery_","wcj_evt.prodID","advads_tracking_ads","advadsGATracking.postContext","woopack_config","ulp_content_id","wp-cumulus\/tagcloud.swf?r=","ctSetCookie('ct_checkjs'","woof_really_curr_tax","uLogin.customInit","i18n_no_matching_variations_text","alsp_map_markers_attrs","var inc_opt =","iworks_upprev","yith_wcevti_tickets","window.metrilo.ensure_cbuid","metrilo.event","wordpress_page_root","wcct_info","Springbot.product_id","pysWooProductData","dfd-heading","owl=$(\"#","penci_megamenu","fts_security","algoliaAutocomplete","avia_framework_globals","tabs.easyResponsiveTabs","searchlocationHeader","yithautocomplete","data-parallax-speed","currency_data=","cedexisData","function reenableButton","#wpnbio-show","e.Newsletter2GoTrackingObject","var categories_","\"+nRemaining+\"","cartsguru_cart_token","after_share_easyoptin","location_data.push","thirstyFunctions.isThirstyLink","styles: ' #custom-menu-","function svc_center_","#svc_carousel2_container_","advads.move","elementid","advads_has_ads","wpseo_map_init","mdf_current_page_url","tptn_tracker","dpsp_pin_button_data","searchwp_live_search_params","wpp_params","top.location,thispage","selection+pagelink","ic_window_resolution","PHP.wp_p_id","ShopifyBuy.UI.onReady(client)","orig_request_uri","gie.widgets.load","Adman.Flash","PHP.wp_p_id","window.broadstreetKeywords","var productId =","var flatsomeVars","wc_product_block_data","static.mailerlite.com","amzn_assoc","_bs_getParameterByName","_stq.push","h._remove","var FlowFlowOpts","var WCPFData =","var _beeketing","var _statcounter","var actions =","var current_url","var object_name","var the_ajax_script","var wc_cart_fragments_params","var woocommerce_params","var wpml_cookies","wc_add_to_cart_params","window.broadstreetKeywords","window.wc_ga_pro.available_gateways","xa.prototype","HOUZEZ_ajaxcalls_vars","w2dc_maps_objects","w2dc_controller_args_array","w2dc_map_markers_attrs","YT.Player","WPFC.data","function current_video_","var videodiv","var slider_wppasrotate","wppas_ga","var blockClass","tarteaucitron","pw_brand_product_list","tminusCountDown","pysWooSelectContentData","wpvq_ans89733","_isp_version","price_range_data","window.FeedbackCompanyWidgets","woocs_current_currency","woo_variation_swatches_options","woocommerce_price_slider_params","scriptParams","form-adv-pagination","borlabsCookiePrioritize","urls_wpwidgetpolylang","quickViewNonce","frontendscripts_params","nj-facebook-messenger","var fb_mess_position","init_particles_row_background_script","setREVStartSize","fl-node","PPAccordion","soliloquy_","wprevpublicjs_script_vars","DTGS_NONCE_FRONTEND","et_animation_data","archives-dropdown","loftloaderCache","SmartSliderSimple","var nectarLove","var incOpt","RocketBrowserCompatibilityChecker","RocketPreloadLinksConfig","placementVersionId","var useEdit","var DTGS_NONCE_FRONTEND","n2jQuery","et_core_api_spam_recaptcha","cnArgs","__CF$cv$params","trustbox_settings","aepro","cdn.jst.ai","w2dc_fields_in_categories","jetMenuPublicSettings","JetTricksSettings","aepc_pixel","avadaWooCommerceVars","var isb","fcaPcPost","csrf_token","icwp_wpsf_vars_lpantibot","wpvViewHead","ed_school_plugin","aps_comp_","guaven_woos","__lm_redirect_to","__wpdm_view_count","bookacti.booking_system","nfFrontEnd","view_quote_cart_link","__eae_decode_emails","divioverlays_ajaxurl","var _EPYT_","#ins-heading-","#ins-button-","tve_frontend_options","lb24.src","amazon_Login_accessToken","porto_infinite_scroll",".adace-loader-","adace_load_","tagGroupsAccordiontaggroupscloudaccordion","tagGroupsTabstaggroupscloudtabs","jrRelatedWidgets","UNCODE.initRow","amp_mobile_redirect_disabled","wpgdprcData","wpml_browser_redirect_params","swPreRegister","kboard_settings","ct_ultimate_gdpr_cookie","wcpv_registration_local","www.idxhome.com","arf_footer_cl_logic_call","reload_attached_coupons","var ftpp","forminatorFront","_EPYT_","edd_free_downloads_vars","edd_stripe_vars","var ASP","ecwidOriginalTitle","defaultCategoryId","translation-revision-date","google_conversion_id","hbspt","var marker_locations_","var AdmMyAjax","ifso_page_url","referrer_for_pageload","WoocommerceWidget\/woocommerceWidget.js","var ht_ctc_chat_var","spuvar","var wpilFrontend","urls_polylangREPLACETOID","e.setAttribute('unselectable',on);","try{Typekit.load","iMapsData","var wpforms_user_journey","rocket_lazyload_css_data"],"cache_ignored_parameters":["utm_source","utm_medium","utm_campaign","utm_expid","utm_term","utm_content","utm_id","utm_source_platform","utm_creative_format","utm_marketing_tactic","mtm_source","mtm_medium","mtm_campaign","mtm_keyword","mtm_cid","mtm_content","pk_source","pk_medium","pk_campaign","pk_keyword","pk_cid","pk_content","fb_action_ids","fb_action_types","fb_source","fbclid","campaignid","adgroupid","adid","gclid","age-verified","ao_noptimize","usqp","cn-reloaded","_ga","sscid","gclsrc","_gl","mc_cid","mc_eid","_bta_tid","_bta_c","trk_contact","trk_msg","trk_module","trk_sid","gdfms","gdftrk","gdffi","_ke","_kx","redirect_log_mongo_id","redirect_mongo_id","sb_referer_host","mkwid","pcrid","ef_id","s_kwcid","msclkid","dm_i","epik","pp","gbraid","wbraid","ssp_iabi","ssp_iaba","gad","vgo_ee"],"preload_exclusions":["void\\(.*;","(.*)__trashed(.*)","\/jet-menu\/(.*)","\/jet-popup\/(.*)"],"exclude_js_files":["\/wp-includes\/js\/dist\/i18n.min.js","\/interactive-3d-flipbook-powered-physics-engine\/assets\/js\/html2canvas.min.js","\/interactive-3d-flipbook-powered-physics-engine\/assets\/js\/pdf.min.js","\/interactive-3d-flipbook-powered-physics-engine\/assets\/js\/three.min.js","\/interactive-3d-flipbook-powered-physics-engine\/assets\/js\/3d-flip-book.min.js","\/google-site-kit\/dist\/assets\/js\/(.*).js","\/wp-live-chat-support\/public\/js\/callus(.*).js","\/borlabs-cookie\/assets\/javascript\/(.*).js"],"staging_domains":[".wpengine.com",".wpenginepowered.com",".pantheonsite.io",".flywheelsites.com",".flywheelstaging.com",".kinsta.com",".kinsta.cloud",".cloudwaysapps.com",".azurewebsites.net",".wpserveur.net","-liquidwebsites.com",".myftpupload.com",".dream.press",".sg-host.com",".platformsh.site",".wpstage.net",".bigscoots-staging.com",".wpsc.site",".runcloud.link",".onrocket.site",".singlestaging.com",".myraidbox.de",".instawp.xyz",".instawp.co",".instawp.link",".instawp.app"]} diff --git a/gulpfile.js b/gulpfile.js index 7a97ba5367..7aea5167a2 100755 --- a/gulpfile.js +++ b/gulpfile.js @@ -195,11 +195,26 @@ const bundleLazyloadJsWithoutWatch = () => { .pipe(gulp.dest('assets/js')) } +const bundleLcpBeaconWithoutWatch = () => { + var bundle = browserify({ + entries: './assets/js/lcp-beacon.js', + debug: true + }).transform(babel); + + return bundle.bundle() + .pipe(source('lcp-beacon.js')) + .pipe(buffer()) + .pipe(uglify()) + .pipe(sourcemaps.init({loadMaps: false})) + .pipe(sourcemaps.write('./')) + .pipe(rename({suffix: '.min'})) + .pipe(gulp.dest('assets/js')); +} + exports.bundleLazyloadJsWithoutWatch = bundleLazyloadJsWithoutWatch; // Run build without watching: watching keeps git actions stuck on 'build' -gulp.task('run:build', gulp.parallel(bundleJsWithoutWatch, bundleLazyloadJsWithoutWatch, 'run:build:sass')); - +gulp.task('run:build', gulp.parallel(bundleJsWithoutWatch, bundleLazyloadJsWithoutWatch, bundleLcpBeaconWithoutWatch, 'run:build:sass')); /** * Compiles a standalone script file. * diff --git a/inc/3rd-party/plugins/nginx-helper.php b/inc/3rd-party/plugins/nginx-helper.php index cb565ebe86..e6726a88fe 100644 --- a/inc/3rd-party/plugins/nginx-helper.php +++ b/inc/3rd-party/plugins/nginx-helper.php @@ -153,6 +153,6 @@ function rocket_clean_nginx_helper_cache() { * @since 3.12.3 */ add_action( 'rocket_rucss_after_clearing_usedcss', 'rocket_clean_nginx_cache_url' ); - add_action( 'rocket_rucss_complete_job_status', 'rocket_clean_nginx_helper_cache' ); + add_action( 'rocket_saas_complete_job_status', 'rocket_clean_nginx_helper_cache' ); endif; diff --git a/inc/Addon/Varnish/Subscriber.php b/inc/Addon/Varnish/Subscriber.php index 2a48fd9e5f..6b1e9fa1d8 100644 --- a/inc/Addon/Varnish/Subscriber.php +++ b/inc/Addon/Varnish/Subscriber.php @@ -44,7 +44,7 @@ public static function get_subscribed_events() { 'before_rocket_clean_file' => [ 'clean_file' ], 'rocket_rucss_after_clearing_usedcss' => [ 'clean_file' ], 'before_rocket_clean_home' => [ 'clean_home', 10, 2 ], - 'rocket_rucss_complete_job_status' => [ 'clean_file' ], + 'rocket_saas_complete_job_status' => [ 'clean_file' ], ]; } diff --git a/inc/Engine/Activation/Activation.php b/inc/Engine/Activation/Activation.php index f40133eddd..eee3cdd299 100644 --- a/inc/Engine/Activation/Activation.php +++ b/inc/Engine/Activation/Activation.php @@ -6,6 +6,9 @@ use WP_Rocket\Dependencies\League\Container\Container; use WP_Rocket\ServiceProvider\Options as OptionsServiceProvider; use WP_Rocket\Engine\Preload\Activation\ServiceProvider as PreloadActivationServiceProvider; +use WP_Rocket\Engine\License\ServiceProvider as LicenseServiceProvider; +use WP_Rocket\Logger\ServiceProvider as LoggerServiceProvider; +use WP_Rocket\Engine\Media\AboveTheFold\Activation\ServiceProvider as AboveTheFoldActivationServiceProvider; use WP_Rocket\ThirdParty\Hostings\HostResolver; use WP_Rocket\ThirdParty\Hostings\ServiceProvider as HostingsServiceProvider; @@ -26,6 +29,7 @@ class Activation { 'wp_cache', 'action_scheduler_check', 'preload_activation', + 'atf_activation', ]; /** @@ -43,6 +47,10 @@ public static function activate_plugin() { $container->addServiceProvider( new PreloadActivationServiceProvider() ); $container->addServiceProvider( new ServiceProvider() ); $container->addServiceProvider( new HostingsServiceProvider() ); + $container->addServiceProvider( new LicenseServiceProvider() ); + $container->addServiceProvider( new LoggerServiceProvider() ); + $container->get( 'logger' ); + $container->addServiceProvider( new AboveTheFoldActivationServiceProvider() ); $host_type = HostResolver::get_host_service(); diff --git a/inc/Engine/Cache/PurgeActionsSubscriber.php b/inc/Engine/Cache/PurgeActionsSubscriber.php index e3df5a823c..bed2dcae19 100644 --- a/inc/Engine/Cache/PurgeActionsSubscriber.php +++ b/inc/Engine/Cache/PurgeActionsSubscriber.php @@ -53,7 +53,7 @@ public static function get_subscribed_events() { [ 'purge_dates_archives' ], [ 'purge_post_terms_urls' ], ], - 'rocket_rucss_complete_job_status' => [ 'purge_url_cache', 100 ], + 'rocket_saas_complete_job_status' => [ 'purge_url_cache', 100 ], 'rocket_rucss_after_clearing_usedcss' => 'purge_url_cache', 'rocket_after_save_dynamic_lists' => 'purge_cache_after_saving_dynamic_lists', 'update_option_' . $slug => [ 'purge_cache_reject_uri_partially', 10, 2 ], diff --git a/inc/Engine/Common/Database/Queries/AbstractQuery.php b/inc/Engine/Common/Database/Queries/AbstractQuery.php new file mode 100644 index 0000000000..19b93879d9 --- /dev/null +++ b/inc/Engine/Common/Database/Queries/AbstractQuery.php @@ -0,0 +1,645 @@ +table_exists() ) { + return false; + } + + $query = $this->query( + [ + 'url' => untrailingslashit( $url ), + 'is_mobile' => $is_mobile, + ] + ); + + if ( empty( $query[0] ) ) { + return false; + } + + return $query[0]; + } + + /** + * Get single row by ID. + * + * @param int $row_id DB Row ID. + * + * @return array|false + */ + public function get_row_by_id( int $row_id ) { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return false; + } + + $query = $this->query( + [ + 'id' => $row_id, + ] + ); + + if ( empty( $query ) ) { + return false; + } + + return $query; + } + + /** + * Get all rows with the same url (desktop and mobile versions). + * + * @param string $url Page url. + * + * @return array|false + */ + public function get_rows_by_url( string $url ) { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return false; + } + + $query = $this->query( + [ + 'url' => untrailingslashit( $url ), + ] + ); + + if ( empty( $query ) ) { + return false; + } + + return $query; + } + + /** + * Fetch on submit jobs. + * + * @param int $count Number of jobs to fetch. + * @return array|int + */ + public function get_on_submit_jobs( int $count = 100 ) { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return []; + } + + $in_progress_count = $this->query( + [ + 'count' => true, + 'status' => [ 'in-progress' ], + ] + ); + $pending_count = $this->query( + [ + 'count' => true, + 'status' => [ 'pending' ], + ] + ); + + $processing_count = $in_progress_count + $pending_count; + + if ( 0 !== $count && $processing_count >= $count ) { + return []; + } + + $query_params = [ + 'status' => 'to-submit', + 'orderby' => 'modified', + 'order' => 'asc', + ]; + + if ( 0 !== $count ) { + $query_params['number'] = ( $count - $processing_count ); + } + + return $this->query( $query_params ); + } + + /** + * Create new DB row for specific url. + * + * @param string $url Current page url. + * @param string $job_id API job_id. + * @param string $queue_name API Queue name. + * @param bool $is_mobile if the request is for mobile page. + * + * @return bool + */ + public function create_new_job( string $url, string $job_id = '', string $queue_name = '', bool $is_mobile = false ) { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return false; + } + + $item = [ + 'url' => untrailingslashit( $url ), + 'is_mobile' => $is_mobile, + 'job_id' => $job_id, + 'queue_name' => $queue_name, + 'status' => 'to-submit', + 'retries' => 0, + 'last_accessed' => current_time( 'mysql', true ), + ]; + + $result = $this->add_item( $item ); + + /** + * Fires after a new job has been added. + * + * @param mixed $is_success New job status: ID of inserted row if successfully added; false otherwise. + * @param string $timestamp Current timestamp. + */ + do_action( 'rocket_last_rucss_job_added_time', $result, current_time( 'mysql', true ) ); + + return $result; + } + + /** + * Get pending jobs. + * + * @param int $count Number of rows. + * + * @return array + */ + public function get_pending_jobs( int $count = 100 ) { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return []; + } + + $inprogress_count = $this->query( + [ + 'count' => true, + 'status' => 'in-progress', + ] + ); + + if ( $inprogress_count >= $count ) { + return []; + } + + return $this->query( + [ + 'number' => ( $count - $inprogress_count ), + 'status' => 'pending', + 'job_id__not_in' => [ + 'not_in' => '', + ], + 'orderby' => 'modified', + 'order' => 'asc', + ] + ); + } + + /** + * Increment retries number and change status back to pending. + * + * @param string $url Url from DB row. + * @param boolean $is_mobile Is mobile from DB row. + * @param string $error_code error code. + * @param string $error_message error message. + * + * @return bool|int + */ + public function increment_retries( string $url, bool $is_mobile, string $error_code, string $error_message ) { + if ( ! $this->is_allowed() ) { + return false; + } + + $db = $this->get_db(); + + $prefixed_table_name = $db->prefix . $this->table_name; + + $old = $this->get_row( $url, $is_mobile ); + + $retries = 0; + $previous_message = ''; + + if ( $old ) { + $retries = $old->retries; + $previous_message = $old->error_message; + } + + $data = [ + 'retries' => $retries + 1, + 'status' => 'pending', + 'error_message' => $previous_message . ' - ' . current_time( 'mysql', true ) . " {$error_code}: {$error_message}", + ]; + + $where = [ + 'url' => untrailingslashit( $url ), + 'is_mobile' => $is_mobile, + ]; + + return $db->update( $prefixed_table_name, $data, $where ); + } + + /** + * Update Job ID. + * + * @param int $id DB row ID. + * @param int $new_job_id new job id. + * + * @return bool + */ + public function update_job_id( $id, $new_job_id ) { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return false; + } + + $update_data['job_id'] = $new_job_id; + return $this->update_item( $id, $update_data ); + } + + /** + * Change the status to be in-progress. + * + * @param string $url Url from DB row. + * @param boolean $is_mobile Is mobile from DB row. + * @return bool|int + */ + public function make_status_inprogress( string $url, bool $is_mobile ) { + if ( ! $this->is_allowed() ) { + return false; + } + + $db = $this->get_db(); + + $prefixed_table_name = $db->prefix . $this->table_name; + $where = [ + 'url' => untrailingslashit( $url ), + 'is_mobile' => $is_mobile, + ]; + + return $db->update( $prefixed_table_name, [ 'status' => 'in-progress' ], $where ); + } + + /** + * Reset the job and add new job_id pending. + * + * @param int $id DB row ID. + * @param string $job_id API job_id. + * + * @return bool + */ + public function reset_job( int $id, string $job_id = '' ) { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return false; + } + + return $this->update_item( + $id, + [ + 'job_id' => $job_id, + 'status' => 'to-submit', + 'error_code' => '', + 'error_message' => '', + 'retries' => 0, + 'modified' => current_time( 'mysql', true ), + 'submitted_at' => current_time( 'mysql', true ), + ] + ); + } + + /** + * Change the status to be failed. + * + * @param string $url Url from DB row. + * @param boolean $is_mobile Is mobile from DB row. + * @param string $error_code error code. + * @param string $error_message error message. + * + * @return bool|int + */ + public function make_status_failed( string $url, bool $is_mobile, string $error_code, string $error_message ) { + if ( ! $this->is_allowed() ) { + return false; + } + + $db = $this->get_db(); + + $prefixed_table_name = $db->prefix . $this->table_name; + + $old = $this->get_row( $url, $is_mobile ); + + $previous_message = $old ? $old->error_message : ''; + + $data = [ + 'status' => 'failed', + 'error_code' => $error_code, + 'error_message' => $previous_message . ' - ' . current_time( 'mysql', true ) . " {$error_code}: {$error_message}", + ]; + + $where = [ + 'url' => untrailingslashit( $url ), + 'is_mobile' => $is_mobile, + ]; + + return $db->update( $prefixed_table_name, $data, $where ); + } + + /** + * Update row last_accessed date to current date. + * + * @param int $id Used CSS id. + * + * @return bool + */ + public function update_last_accessed( int $id ): bool { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return false; + } + + return (bool) $this->update_item( + $id, + [ + 'last_accessed' => current_time( 'mysql', true ), + ] + ); + } + + /** + * Delete DB row by url. + * + * @param string $url Page url to be deleted. + * + * @return bool + */ + public function delete_by_url( string $url ) { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return false; + } + + $items = $this->get_rows_by_url( $url ); + + if ( ! $items ) { + return false; + } + + $deleted = true; + foreach ( $items as $item ) { + $deleted = $deleted && $this->delete_item( $item->id ); + } + + return $deleted; + } + + /** + * Get the count of not completed rows. + * + * @return int + */ + public function get_not_completed_count() { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return 0; + } + + return $this->query( + [ + 'count' => true, + 'status__in' => [ 'pending', 'in-progress' ], + ] + ); + } + + /** + * Get the count of completed rows. + * + * @return int + */ + public function get_completed_count() { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return 0; + } + + return $this->query( + [ + 'count' => true, + 'status' => 'completed', + ] + ); + } + + /** + * Get all failed rows. + * + * @param float $delay delay before the urls are deleted. + * @param string $unit unit from the delay. + * @return array|false + */ + public function get_failed_rows( float $delay = 3, string $unit = 'days' ) { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return false; + } + + $query = $this->query( + [ + 'status' => 'failed', + 'date_query' => [ + [ + 'column' => 'modified', + 'before' => "$delay $unit ago", + 'inclusive' => true, + ], + ], + ], + false + ); + + if ( empty( $query ) ) { + return false; + } + + return $query; + } + + /** + * Revert status to pending. + * + * @param integer $id Used CSS id. + * @return boolean + */ + public function revert_to_pending( int $id ): bool { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return false; + } + + return (bool) $this->update_item( + $id, + [ + 'error_code' => '', + 'error_message' => '', + 'retries' => 0, + 'status' => 'pending', + 'modified' => current_time( 'mysql', true ), + ] + ); + } + + /** + * Returns the current status of the table; true if it exists, false otherwise. + * + * @return boolean + */ + protected function table_exists(): bool { + if ( self::$table_exists ) { + return true; + } + + // Get the database interface. + $db = $this->get_db(); + + // Bail if no database interface is available. + if ( empty( $db ) ) { + return false; + } + + // Query statement. + $query = 'SHOW TABLES LIKE %s'; + $like = $db->esc_like( $db->{$this->table_name} ); + $prepared = $db->prepare( $query, $like ); + $result = $db->get_var( $prepared ); + + // Does the table exist? + $exists = $this->is_success( $result ); + + if ( $exists ) { + self::$table_exists = $exists; + } + + return $exists; + } + + /** + * Change the status to be pending. + * + * @param string $url DB row url. + * @param string $job_id API job_id. + * @param string $queue_name API Queue name. + * @param bool $is_mobile if the request is for mobile page. + * @return bool|int + */ + public function make_status_pending( string $url, string $job_id = '', string $queue_name = '', bool $is_mobile = false ) { + if ( ! $this->is_allowed() ) { + return false; + } + + $db = $this->get_db(); + + $prefixed_table_name = $db->prefix . $this->table_name; + $data = [ + 'job_id' => $job_id, + 'queue_name' => $queue_name, + 'status' => 'pending', + 'is_mobile' => $is_mobile, + 'submitted_at' => current_time( 'mysql', true ), + ]; + + $where = [ + 'url' => untrailingslashit( $url ), + 'is_mobile' => $is_mobile, + ]; + + return $db->update( $prefixed_table_name, $data, $where ); + } + + /** + * Update the error message. + * + * @param string $url DB row url. + * @param boolean $is_mobile Is mobile from DB row. + * @param int $code Response code. + * @param string $message Response message. + * @param string $previous_message Previous saved message. + * + * @return bool|int + */ + public function update_message( string $url, bool $is_mobile, int $code, string $message, string $previous_message = '' ) { + if ( ! $this->is_allowed() ) { + return false; + } + + $db = $this->get_db(); + + $prefixed_table_name = $db->prefix . $this->table_name; + + $data = [ 'error_message' => $previous_message . ' - ' . current_time( 'mysql', true ) . " {$code}: {$message}" ]; + + $where = [ + 'url' => untrailingslashit( $url ), + 'is_mobile' => $is_mobile, + ]; + + return $db->update( $prefixed_table_name, $data, $where ); + } + + /** + * Updates the next_retry_time field + * + * @param string $url DB row url. + * @param boolean $is_mobile Is mobile from DB row. + * @param string|int $next_retry_time timestamp or mysql format date. + * + * @return bool|int either it is saved or not. + */ + public function update_next_retry_time( string $url, bool $is_mobile, $next_retry_time ) { + if ( ! $this->is_allowed() ) { + return false; + } + + $db = $this->get_db(); + + $prefixed_table_name = $db->prefix . $this->table_name; + + if ( is_string( $next_retry_time ) && strtotime( $next_retry_time ) ) { + // If $next_retry_time is a valid date string, convert it to a timestamp. + $next_retry_time = strtotime( $next_retry_time ); + } elseif ( ! is_numeric( $next_retry_time ) ) { + // If it's not numeric and not a valid date string, return false. + return false; + } + + $data = [ 'next_retry_time' => gmdate( 'Y-m-d H:i:s', $next_retry_time ) ]; + + $where = [ + 'url' => untrailingslashit( $url ), + 'is_mobile' => $is_mobile, + ]; + + return $db->update( $prefixed_table_name, $data, $where ); + } + + /** + * Check if db action can be processed. + * + * @return boolean + */ + private function is_allowed() { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return false; + } + + // Bail if no database interface is available. + if ( empty( $this->get_db() ) ) { + return false; + } + + return true; + } +} diff --git a/inc/Engine/Common/Database/TableInterface.php b/inc/Engine/Common/Database/TableInterface.php new file mode 100644 index 0000000000..17715f8f8b --- /dev/null +++ b/inc/Engine/Common/Database/TableInterface.php @@ -0,0 +1,40 @@ +schema_data ) { + return; + } + + $this->schema = $this->schema_data; + } + + /** + * Delete all rows which were not accessed in the last month. + * + * @return bool|int + */ + public function delete_old_rows() { + if ( ! $this->exists() ) { + return false; + } + // Get the database interface. + $db = $this->get_db(); + + // Bail if no database interface is available. + if ( empty( $db ) ) { + return false; + } + + /** + * Filters the old RUCSS deletion interval + * + * @param int $delete_interval Old RUCSS deletion interval in months + */ + $delete_interval = (int) apply_filters( 'rocket_saas_delete_interval', 1 ); + + if ( $delete_interval <= 0 ) { + return false; + } + + $prefixed_table_name = $this->apply_prefix( $this->table_name ); + $query = "DELETE FROM `$prefixed_table_name` WHERE `last_accessed` <= date_sub(now(), interval $delete_interval month)"; + $rows_affected = $db->query( $query ); + + return $rows_affected; + } + + /** + * Get all rows which were not accessed in the last month. + * + * @return array + */ + public function get_old_rows(): array { + if ( ! $this->exists() ) { + return false; + } + // Get the database interface. + $db = $this->get_db(); + + // Bail if no database interface is available. + if ( empty( $db ) ) { + return false; + } + + $prefixed_table_name = $this->apply_prefix( $this->table_name ); + $query = "SELECT * FROM `$prefixed_table_name` WHERE `last_accessed` <= date_sub(now(), interval 1 month)"; + $rows_affected = $db->get_results( $query ); + + return $rows_affected; + } + + /** + * Remove all completed rows. + * + * @return bool|int + */ + public function remove_all_completed_rows() { + if ( ! $this->exists() ) { + return false; + } + // Get the database interface. + $db = $this->get_db(); + + // Bail if no database interface is available. + if ( empty( $db ) ) { + return false; + } + + $prefixed_table_name = $this->apply_prefix( $this->table_name ); + return $db->query( "DELETE FROM `$prefixed_table_name` WHERE status IN ( 'failed', 'completed' )" ); + } + + /** + * Returns name from table. + * + * @return string + */ + public function get_name() { + return $this->apply_prefix( $this->table_name ); + } + + /** + * Trigger recreation of cache table if not exist. + * + * @return void + */ + public function maybe_trigger_recreate_table() { + if ( $this->exists() ) { + return; + } + + delete_option( $this->db_version_key ); + } +} diff --git a/inc/Engine/Optimization/RUCSS/Frontend/APIClient.php b/inc/Engine/Common/JobManager/APIHandler/APIClient.php similarity index 64% rename from inc/Engine/Optimization/RUCSS/Frontend/APIClient.php rename to inc/Engine/Common/JobManager/APIHandler/APIClient.php index e70e1b2124..afcfdaff97 100644 --- a/inc/Engine/Optimization/RUCSS/Frontend/APIClient.php +++ b/inc/Engine/Common/JobManager/APIHandler/APIClient.php @@ -1,11 +1,13 @@ 1, + 'no_optimize' => 1, + ], + user_trailingslashit( $url ) + ); + + /** + * Filter the url that is sent to Saas when RUCSS and LCP/ATF is on. + * + * @param string $url contains the URL that is sent to Saas. + */ + $url = apply_filters( 'rocket_saas_api_queued_url', $url ); + $args = [ 'body' => [ - 'url' => add_query_arg( - [ - 'nowprocket' => 1, - 'no_optimize' => 1, - ], - user_trailingslashit( $url ) - ), + 'url' => $url, 'config' => $options, ], 'timeout' => 5, ]; + $this->logger::debug( + 'Add to queue request arguments', + $args + ); + $sent = $this->handle_post( $args ); if ( ! $sent ) { - return [ + $output = [ 'code' => $this->response_code, 'message' => $this->error_message, ]; + + $this->logger::error( + 'Add to queue request failure', + $output + ); + return $output; } $default = [ @@ -56,6 +85,11 @@ public function add_to_queue( string $url, array $options ): array { ]; $result = json_decode( $this->response_body, true ); + $this->logger::debug( + 'Add to queue response body', + $result + ); + if ( key_exists( 'code', $result ) && 401 === $result['code'] ) { update_option( 'wp_rocket_no_licence', true ); update_rocket_option( 'remove_unused_css', 0 ); @@ -95,8 +129,12 @@ public function get_queue_job_status( $job_id, $queue_name, $is_home = false ) { 'status' => 'failed', 'message' => 'No message. Defaulted in get_queue_job_status', 'contents' => [ - 'success' => false, - 'shakedCSS' => '', + 'success' => false, + 'shakedCSS' => '', + 'above_the_fold_result' => [ + 'lcp' => [], + 'images_above_fold' => [], + ], ], ]; diff --git a/inc/Engine/Optimization/RUCSS/AbstractAPIClient.php b/inc/Engine/Common/JobManager/APIHandler/AbstractAPIClient.php similarity index 97% rename from inc/Engine/Optimization/RUCSS/AbstractAPIClient.php rename to inc/Engine/Common/JobManager/APIHandler/AbstractAPIClient.php index 119b33c21b..1b8543f2fe 100644 --- a/inc/Engine/Optimization/RUCSS/AbstractAPIClient.php +++ b/inc/Engine/Common/JobManager/APIHandler/AbstractAPIClient.php @@ -1,11 +1,10 @@ job_processor = $job_processor; + $this->factories = $factories; + } + + /** + * Return an array of events that this subscriber listens to. + * + * @return array + */ + public static function get_subscribed_events(): array { + return [ + 'rocket_saas_pending_jobs' => 'process_pending_jobs', + 'rocket_saas_on_submit_jobs' => 'process_on_submit_jobs', + 'rocket_saas_job_check_status' => [ 'check_job_status', 10, 3 ], + 'rocket_saas_clean_rows_time_event' => 'cron_clean_rows', + 'cron_schedules' => 'add_interval', + 'rocket_deactivation' => 'on_deactivation', + 'rocket_remove_saas_failed_jobs' => 'cron_remove_failed_jobs', + 'init' => [ + [ 'schedule_clean_not_commonly_used_rows' ], + [ 'schedule_pending_jobs' ], + [ 'initialize_rucss_queue_runner' ], + [ 'schedule_removing_failed_jobs' ], + [ 'schedule_on_submit_jobs' ], + ], + 'wp_rocket_upgrade' => [ 'unschedule_rucss_cron', 13, 2 ], + ]; + } + + /** + * Schedules cron to clean not commonly used rows. + * + * @since 3.9 + * + * @return void + */ + public function schedule_clean_not_commonly_used_rows() { + if ( ! $this->job_processor->is_allowed() ) { + return; + } + + if ( wp_next_scheduled( 'rocket_saas_clean_rows_time_event' ) ) { + return; + } + + wp_schedule_event( time(), 'weekly', 'rocket_saas_clean_rows_time_event' ); + } + + /** + * Initialize the queue runner for our SaaS. + * + * @return void + */ + public function initialize_rucss_queue_runner() { + if ( ! $this->job_processor->is_allowed() ) { + return; + } + + RUCSSQueueRunner::instance()->init(); + } + + /** + * Process pending jobs with Cron iteration. + * + * @return void + */ + public function process_pending_jobs() { + $this->job_processor->process_pending_jobs(); + } + + /** + * Process on submit jobs with Cron iteration. + * + * @return void + */ + public function process_on_submit_jobs() { + $this->job_processor->process_on_submit_jobs(); + } + + /** + * Cron callback for deleting old rows in both table databases. + * + * @since 3.9 + * + * @return void + */ + public function cron_clean_rows() { + if ( ! $this->is_deletion_enabled() ) { + return; + } + + foreach ( $this->factories as $factory ) { + if ( $factory->manager()->is_allowed() ) { + $factory->table()->delete_old_rows(); + } + } + } + + /** + * Cron callback for removing failed jobs. + * + * @return void + */ + public function cron_remove_failed_jobs() { + $this->job_processor->clear_failed_urls(); + } + + /** + * Handle job status by DB url and is_mobile. + * + * @param string $url Url from DB row. + * @param boolean $is_mobile Is mobile from DB row. + * @param string $optimization_type The type of optimization request to send. + * + * @return void + */ + public function check_job_status( string $url, bool $is_mobile, string $optimization_type ) { + $this->job_processor->check_job_status( $url, $is_mobile, $optimization_type ); + } + + /** + * Adds new interval for SaaS pending jobs cron + * + * @since 3.11.3 + * + * @param array[] $schedules An array of non-default cron schedule arrays. + * + * @return array + */ + public function add_interval( $schedules ) { + if ( ! $this->job_processor->is_allowed() ) { + return $schedules; + } + + /** + * Filters the cron interval. + * + * @since 3.11 + * + * @param int $interval Interval in seconds. + */ + $interval = apply_filters( 'rocket_saas_pending_jobs_cron_interval', 1 * rocket_get_constant( 'MINUTE_IN_SECONDS', 60 ) ); + + $schedules['rocket_saas_pending_jobs'] = [ + 'interval' => $interval, + 'display' => esc_html__( 'WP Rocket process pending jobs', 'rocket' ), + ]; + + $default_interval = 3 * rocket_get_constant( 'DAY_IN_SECONDS', 86400 ); + /** + * Filters the cron interval for clearing failed jobs. + * + * @param int $interval Interval in seconds. + */ + $interval = apply_filters( 'rocket_remove_saas_failed_jobs_cron_interval', $default_interval ); + $interval = (bool) $interval ? $interval : $default_interval; + + $schedules['rocket_remove_saas_failed_jobs'] = [ + 'interval' => $interval, + 'display' => esc_html__( 'WP Rocket clear failed jobs', 'rocket' ), + ]; + + /** + * Filters the cron interval for processing on submit jobs. + * + * @param int $interval Interval in seconds. + */ + $interval = (int) apply_filters( 'rocket_remove_saas_on_submit_jobs_cron_interval', 1 * rocket_get_constant( 'MINUTE_IN_SECONDS', 60 ) ); + + $schedules['rocket_saas_on_submit_jobs'] = [ + 'interval' => $interval, + 'display' => esc_html__( 'WP Rocket process on submit jobs', 'rocket' ), + ]; + + return $schedules; + } + + /** + * Schedule on submit jobs. + * + * @return void + */ + public function schedule_on_submit_jobs() { + if ( + ! $this->job_processor->is_allowed() + && + wp_next_scheduled( 'rocket_saas_on_submit_jobs' ) + ) { + wp_clear_scheduled_hook( 'rocket_saas_on_submit_jobs' ); + + return; + } + + if ( ! $this->job_processor->is_allowed() ) { + return; + } + + if ( wp_next_scheduled( 'rocket_saas_on_submit_jobs' ) ) { + return; + } + + wp_schedule_event( time(), 'rocket_saas_on_submit_jobs', 'rocket_saas_on_submit_jobs' ); + } + + /** + * Schedules cron to get SaaS pendings jobs. + * + * @since 3.11.3 + * + * @return void + */ + public function schedule_pending_jobs() { + if ( + ! $this->job_processor->is_allowed() + && + wp_next_scheduled( 'rocket_saas_pending_jobs' ) + ) { + wp_clear_scheduled_hook( 'rocket_saas_pending_jobs' ); + + return; + } + + if ( ! $this->job_processor->is_allowed() ) { + return; + } + + if ( wp_next_scheduled( 'rocket_saas_pending_jobs' ) ) { + return; + } + + wp_schedule_event( time(), 'rocket_saas_pending_jobs', 'rocket_saas_pending_jobs' ); + } + + /** + * Schedules cron to remove failed jobs. + * + * @return void + */ + public function schedule_removing_failed_jobs() { + if ( + ! $this->job_processor->is_allowed() + && + wp_next_scheduled( 'rocket_remove_saas_failed_jobs' ) + ) { + wp_clear_scheduled_hook( 'rocket_remove_saas_failed_jobs' ); + + return; + } + + if ( ! $this->job_processor->is_allowed() ) { + return; + } + + if ( wp_next_scheduled( 'rocket_remove_saas_failed_jobs' ) ) { + return; + } + + wp_schedule_event( time(), 'rocket_remove_saas_failed_jobs', 'rocket_remove_saas_failed_jobs' ); + } + + /** + * Clear schedule of SaaS CRONs on deactivation. + * + * @return void + */ + public function on_deactivation() { + wp_clear_scheduled_hook( 'action_scheduler_run_queue_rucss', [ 'WP Cron' ] ); + } + + /** + * Checks if the SaaS deletion is enabled. + * + * @return bool + */ + protected function is_deletion_enabled(): bool { + /** + * Filters the enable SaaS job deletion value + * + * @param bool $delete_saas_jobs True to enable deletion, false otherwise. + */ + return (bool) apply_filters( 'rocket_saas_deletion_enabled', true ); + } + + /** + * Unschedule old rucss crons. + * + * @since 3.16 + * + * @param string $new_version New plugin version. + * @param string $old_version Previous plugin version. + * + * @return void + */ + public function unschedule_rucss_cron( $new_version, $old_version ) { + if ( version_compare( $old_version, '3.16', '>=' ) ) { + return; + } + + wp_clear_scheduled_hook( 'rocket_rucss_on_submit_jobs' ); + wp_clear_scheduled_hook( 'rocket_rucss_pending_jobs' ); + wp_clear_scheduled_hook( 'rocket_remove_rucss_failed_jobs' ); + wp_clear_scheduled_hook( 'rocket_rucss_clean_rows_time_event' ); + } +} diff --git a/inc/Engine/Common/JobManager/JobProcessor.php b/inc/Engine/Common/JobManager/JobProcessor.php new file mode 100644 index 0000000000..02eabf23e0 --- /dev/null +++ b/inc/Engine/Common/JobManager/JobProcessor.php @@ -0,0 +1,594 @@ +factories = $factories; + $this->queue = $queue; + $this->strategy_factory = $strategy_factory; + $this->api = $api; + $this->wpr_clock = $clock; + } + + /** + * Determine if action is allowed. + * + * @return boolean + */ + public function is_allowed(): bool { + if ( ! $this->factories ) { + return false; + } + + $is_allowed = []; + + foreach ( $this->factories as $factory ) { + $is_allowed[] = $factory->manager()->is_allowed(); + } + + return (bool) array_sum( $is_allowed ); + } + + /** + * Process pending jobs inside cron iteration. + * + * @return void + */ + public function process_pending_jobs() { + /** + * Fires at the start of the process pending jobs. + * + * @param string $current_time Current time. + */ + do_action( 'rocket_rucss_process_pending_jobs_start', $this->wpr_clock->current_time( 'mysql', true ) ); + $this->logger::debug( 'RUCSS: Start processing pending jobs inside cron.' ); + + if ( ! $this->is_allowed() ) { + $this->logger::debug( 'Stop processing cron iteration for pending jobs.' ); + + return; + } + + $this->logger::debug( 'Start processing pending jobs inside cron.' ); + + // Get some items from the DB with status=pending & job_id isn't empty. + + /** + * Filters the pending jobs count. + * + * @since 3.11 + * + * @param int $rows Number of rows to grab with each CRON iteration. + */ + $rows = apply_filters( 'rocket_saas_pending_jobs_cron_rows_count', 100 ); + + $pending_jobs = $this->get_jobs( $rows, 'pending' ); + + if ( ! $pending_jobs ) { + return; + } + + foreach ( $pending_jobs as $row ) { + $current_time = $this->wpr_clock->current_time( 'timestamp', true ); + if ( $row->next_retry_time < $current_time ) { + $optimization_type = $this->get_optimization_type( $row ); + // Change status to in-progress. + $this->make_status_inprogress( $row->url, $row->is_mobile, $optimization_type ); + $this->queue->add_job_status_check_async( $row->url, $row->is_mobile, $optimization_type ); + } + } + + /** + * Fires at the end of the process pending jobs. + * + * @param string $current_time Current time. + */ + do_action( 'rocket_rucss_process_pending_jobs_end', $this->wpr_clock->current_time( 'mysql', true ) ); + } + + /** + * Check job status by DB row ID. + * + * @param string $url Url from DB row. + * @param boolean $is_mobile Is mobile from DB row. + * @param string $optimization_type The type of optimization request to send. + * + * @return void + */ + public function check_job_status( string $url, bool $is_mobile, string $optimization_type ) { + + $row_details = $this->get_single_job( $url, $is_mobile, $optimization_type ); + if ( ! $row_details ) { + $this->logger::debug( 'Url - ' . $url . ' not found for is_mobile - ' . (int) $is_mobile ); + // Nothing in DB, bailout. + return; + } + + // Send the request to get the job status from SaaS. + $job_details = $this->api->get_queue_job_status( $row_details->job_id, $row_details->queue_name, Utils::is_home( $row_details->url ) ); + + foreach ( $this->factories as $factory ) { + $factory->manager()->validate_and_fail( $job_details, $row_details, $optimization_type ); + } + + if ( + 200 !== (int) $job_details['code'] + ) { + $this->logger::debug( 'Job status failed for url: ' . $row_details->url, $job_details ); + $this->decide_strategy( $row_details, $job_details, $optimization_type ); + + return; + } + /** + * Unlock preload URL. + * + * @param string $url URL to unlock + */ + do_action( 'rocket_preload_unlock_url', $row_details->url ); + + foreach ( $this->factories as $factory ) { + $factory->manager()->process( $job_details, $row_details, $optimization_type ); + } + + /** + * Fires after successfully processing the SaaS jobs. + * + * @param string $url Optimized Url. + * @param array $job_details Result of the request to get the job status from SaaS. + */ + do_action( 'rocket_saas_complete_job_status', $row_details->url, $job_details ); + } + + /** + * Process on submit jobs. + * + * @return void + */ + public function process_on_submit_jobs() { + $this->logger::debug( 'Start processing on submit jobs for adding jobs to queue.' ); + + /** + * Fires at the start of the process on submit jobs. + * + * @param string $current_time Current time. + */ + do_action( 'rocket_rucss_process_on_submit_jobs_start', $this->wpr_clock->current_time( 'mysql', true ) ); + + if ( ! $this->is_allowed() ) { + $this->logger::debug( 'Stop processing cron iteration for to-submit jobs.' ); + + return; + } + + /** + * Pending rows cont. + * + * @param int $count Number of rows. + */ + $pending_job = (int) apply_filters( 'rocket_saas_pending_jobs_cron_rows_count', 100 ); + + /** + * Maximum processing rows. + * + * @param int $max Max processing rows. + */ + $max_pending_rows = (int) apply_filters( 'rocket_saas_max_pending_jobs', 3 * $pending_job, $pending_job ); + $rows = $this->get_jobs( $max_pending_rows, 'submit' ); + + if ( ! $rows ) { + return; + } + + foreach ( $rows as $row ) { + $optimization_type = $this->get_optimization_type( $row ); + $response = $this->send_api( $row->url, (bool) $row->is_mobile, $optimization_type ); + + if ( false === $response || ! isset( $response['contents'], $response['contents']['jobId'], $response['contents']['queueName'] ) ) { + + $this->make_status_failed( $row->url, $row->is_mobile, '', '', $optimization_type ); + continue; + } + + /** + * Lock preload URL. + * + * @param string $url URL to lock + */ + do_action( 'rocket_preload_lock_url', $row->url ); + + $this->make_status_pending( + $row->url, + $response['contents']['jobId'], + $response['contents']['queueName'], + (bool) $row->is_mobile, + $optimization_type + ); + } + + $this->logger::debug( 'End processing on submit jobs for adding jobs to queue.' ); + /** + * Fires at the end of the process pending jobs. + * + * @param string $current_time Current time. + */ + do_action( 'rocket_rucss_process_pending_jobs_end', $this->wpr_clock->current_time( 'mysql', true ) ); + } + + /** + * Send the job to the API. + * + * @param string $url URL to work on. + * @param bool $is_mobile Is the page for mobile. + * @param string $optimization_type The type of optimization request to send. + * @return array|false + */ + protected function send_api( string $url, bool $is_mobile, string $optimization_type ) { + $config = [ + 'is_mobile' => $is_mobile, + 'is_home' => Utils::is_home( $url ), + ]; + + $config = $this->set_request_params( $config, $optimization_type ); + + $add_to_queue_response = $this->api->add_to_queue( $url, $config ); + + if ( 200 !== $add_to_queue_response['code'] ) { + $this->logger::error( + 'Error when contacting the SaaS API.', + [ + 'SaaS error', + 'url' => $url, + 'code' => $add_to_queue_response['code'], + 'message' => $add_to_queue_response['message'], + ] + ); + + return false; + } + + return $add_to_queue_response; + } + + /** + * Set request parameters + * + * @param array $config Array of request parameters. + * @param string $optimization_type The type of optimization applied for the current job. + * @return array + */ + public function set_request_params( array $config, string $optimization_type ): array { + list($updated_config, $optimization_list, $request_param) = [ [], [], [] ]; + + foreach ( $this->factories as $factory ) { + if ( $optimization_type === $factory->manager()->get_optimization_type() ) { + $config = array_merge( $config, $factory->manager()->set_request_param() ); + + return $config; + } + + $request_param = $factory->manager()->set_request_param(); + + $optimization_list = array_merge( $optimization_list, $request_param['optimization_list'] ); + $updated_config = array_merge( $request_param, $updated_config ); + } + + if ( ! $updated_config ) { + $updated_config['optimization_list'] = $optimization_list; + } + + return $updated_config; + } + + /** + * Clear failed urls. + * + * @return void + */ + public function clear_failed_urls(): void { + /** + * Delay before failed saas jobs are deleted. + * + * @param string $delay delay before failed saas jobs are deleted. + */ + $delay = (string) apply_filters( 'rocket_delay_remove_saas_failed_jobs', '3 days' ); + + if ( '' === $delay || '0' === $delay ) { + $delay = '3 days'; + } + $parts = explode( ' ', $delay ); + + $value = 3; + $unit = 'days'; + + if ( count( $parts ) === 2 && $parts[0] >= 0 ) { + $value = (float) $parts[0]; + $unit = $parts[1]; + } + + foreach ( $this->factories as $factory ) { + if ( $factory->manager()->is_allowed() ) { + $failed_urls = $factory->manager()->clear_failed_jobs( $value, $unit ); + + $hook = 'rocket_' . $factory->manager()->get_optimization_type() . '_after_clearing_failed_url'; + + /** + * Fires after clearing failed urls. + * + * @param array $urls Failed urls. + */ + do_action( $hook, $failed_urls ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals + } + } + } + + /** + * Change the status to be in-progress. + * + * @param string $url Url from DB row. + * @param boolean $is_mobile Is mobile from DB row. + * @param string $optimization_type The type of optimization applied for the current job. + * @return void + */ + private function make_status_inprogress( string $url, bool $is_mobile, string $optimization_type ): void { + foreach ( $this->factories as $factory ) { + $factory->manager()->make_status_inprogress( $url, $is_mobile, $optimization_type ); + } + } + + /** + * Get single job. + * + * @param string $url Url from DB row. + * @param boolean $is_mobile Is mobile from DB row. + * @param string $optimization_type The type of optimization applied for the current job. + * + * @return bool|object + */ + private function get_single_job( string $url, bool $is_mobile, string $optimization_type ) { + $job = []; + + foreach ( $this->factories as $factory ) { + if ( $optimization_type === $factory->manager()->get_optimization_type() ) { + return $factory->manager()->get_single_job( $url, $is_mobile ); + } + } + + $job = $this->factories[0]->manager()->get_single_job( $url, $is_mobile ); + + return ( ! $job ? [] : $job ); + } + + /** + * Decide jobs to get. + * + * @param integer $num_rows Number of rows to grab with each CRON iteration. + * @param string $type Type of job to get. + * @return array + */ + public function get_jobs( int $num_rows, string $type ): array { + $allowed_types = [ 'pending', 'submit' ]; + + if ( ! in_array( $type, $allowed_types, true ) ) { + return []; + } + + $rows = []; + + switch ( $type ) { + case 'pending': + foreach ( $this->factories as $factory ) { + $rows = array_merge( $rows, $factory->manager()->get_pending_jobs( $num_rows ) ); + } + break; + case 'submit': + foreach ( $this->factories as $factory ) { + $rows = array_merge( $rows, $factory->manager()->get_on_submit_jobs( $num_rows ) ); + } + break; + } + + if ( ! $rows ) { + return []; + } + + // Get distinct rows. + return $this->get_distinct( $rows ); + } + + /** + * Get rows common to jobs. + * + * @param array $rows Merged DB Rows of jobs. + * @return array + */ + private function get_common_jobs( array $rows ): array { + list($occurrences, $duplicates) = [ [], [] ]; + + foreach ( $rows as $row ) { + $key = $row->url . '|' . ( (bool) $row->is_mobile ?? 'null' ); + + if ( ! isset( $occurrences[ $key ] ) ) { + $occurrences[ $key ] = 1; + + continue; + } + + ++$occurrences[ $key ]; + + if ( 2 === $occurrences[ $key ] ) { + // Add new is_common property to the object and add object to duplicate. + $row->is_common = true; + $duplicates[] = $row; + } + } + + return $duplicates; + } + + /** + * Get distinct rows merged from both jobs. + * + * @param array $rows Merged DB Rows of jobs. + * @return array + */ + private function get_distinct( array $rows ): array { + // Get jobs common to both optimizations. + $common_rows = $this->get_common_jobs( $rows ); + + if ( ! $common_rows ) { + return $rows; + } + + $index = 0; + + foreach ( $rows as $row ) { + foreach ( $common_rows as $common_row ) { + if ( $row->url === $common_row->url && (bool) $row->is_mobile === (bool) $common_row->is_mobile ) { + // Remove the common row that is without the new is_common property. + unset( $rows[ $index ] ); + } + } + + ++$index; + } + + return array_merge( $rows, $common_rows ); + } + + /** + * Get the optimization type requested. + * + * @param object $row DB Row. + * @return string + */ + public function get_optimization_type( $row ): string { + $optimization_type = 'all'; + + if ( isset( $row->is_common ) ) { + return $optimization_type; + } + + foreach ( $this->factories as $factory ) { + $type = $factory->manager()->get_optimization_type_from_row( $row ); + + if ( is_string( $type ) ) { + $optimization_type = $type; + break; + } + } + + return $optimization_type; + } + + /** + * Decide with job strategy to apply based on the optimization type. + * + * @param object $row_details DB Row of job. + * @param array $job_details Job details from the API. + * @param string $optimization_type The type of optimization applied for the current job. + * @return void + */ + private function decide_strategy( $row_details, array $job_details, string $optimization_type ): void { + foreach ( $this->factories as $factory ) { + if ( $optimization_type === $factory->manager()->get_optimization_type() ) { + $this->strategy_factory->manage( $row_details, $job_details, $factory->manager() ); + break; + } + + $this->strategy_factory->manage( $row_details, $job_details, $factory->manager() ); + } + } + + /** + * Change the job status to be failed. + * + * @param string $url Url from DB row. + * @param boolean $is_mobile Is mobile from DB row. + * @param string $error_code error code. + * @param string $error_message error message. + * @param string $optimization_type The type of optimization applied for the current job. + * @return void + */ + private function make_status_failed( string $url, bool $is_mobile, string $error_code, string $error_message, $optimization_type ): void { + foreach ( $this->factories as $factory ) { + $factory->manager()->make_status_failed( $url, $is_mobile, $error_code, $error_message, $optimization_type ); + } + } + + /** + * Change the job status to be pending. + * + * @param string $url Url from DB row. + * @param string $job_id API job_id. + * @param string $queue_name API Queue name. + * @param boolean $is_mobile if the request is for mobile page. + * @param string $optimization_type The type of optimization applied for the current job. + * @return void + */ + private function make_status_pending( string $url, string $job_id, string $queue_name, bool $is_mobile, string $optimization_type ): void { + foreach ( $this->factories as $factory ) { + $factory->manager()->make_status_pending( $url, $job_id, $queue_name, $is_mobile, $optimization_type ); + } + } +} diff --git a/inc/Engine/Common/JobManager/Managers/AbstractManager.php b/inc/Engine/Common/JobManager/Managers/AbstractManager.php new file mode 100644 index 0000000000..f22c0749ae --- /dev/null +++ b/inc/Engine/Common/JobManager/Managers/AbstractManager.php @@ -0,0 +1,223 @@ +context->is_allowed() ) { + return false; + } + + if ( ! $optimization_type ) { + return true; + } + + return in_array( $optimization_type, [ 'all', $this->optimization_type ], true ); + } + + /** + * Query object. + * + * @return object + */ + public function query() { + return $this->query; + } + + /** + * Return type of optimization. + * + * @return string + */ + public function get_optimization_type(): string { + return $this->optimization_type; + } + + /** + * Send the request to add url into the queue. + * + * @param string $url page URL. + * @param bool $is_mobile page is for mobile. + * + * @return void + */ + public function add_url_to_the_queue( string $url, bool $is_mobile ): void { + if ( ! $this->is_allowed() ) { + return; + } + + $row = $this->query->get_row( $url, (bool) $is_mobile ); + + if ( empty( $row ) ) { + $this->query->create_new_job( $url, '', '', $is_mobile ); + return; + } + $this->query->reset_job( (int) $row->id ); + } + + /** + * Clear failed jobs. + * + * @param float $delay delay before the urls are deleted. + * @param string $unit unit from the delay. + * @return array + */ + public function clear_failed_jobs( float $delay, string $unit ): array { + $rows = $this->query->get_failed_rows( $delay, $unit ); + + if ( empty( $rows ) ) { + return []; + } + + $failed_urls = []; + + foreach ( $rows as $row ) { + $failed_urls[] = $row->url; + + $id = (int) $row->id; + + if ( empty( $id ) ) { + continue; + } + + $this->add_url_to_the_queue( $row->url, (bool) $row->is_mobile ); + } + + return $failed_urls; + } + + /** + * Change the status to be in-progress. + * + * @param string $url Url from DB row. + * @param boolean $is_mobile Is mobile from DB row. + * @param string $optimization_type The type of optimization applied for the current job. + * @return void + */ + public function make_status_inprogress( string $url, bool $is_mobile, string $optimization_type ): void { + if ( ! $this->is_allowed( $optimization_type ) ) { + return; + } + + $this->query->make_status_inprogress( $url, $is_mobile ); + } + + /** + * Get single job. + * + * @param string $url Url from DB row. + * @param boolean $is_mobile Is mobile from DB row. + * @return bool|object + */ + public function get_single_job( string $url, bool $is_mobile ) { + return $this->query->get_row( $url, $is_mobile ); + } + + /** + * Get on submit jobs based on enabled option. + * + * @param integer $num_rows Number of rows to grab with each CRON iteration. + * @return array|int + */ + public function get_on_submit_jobs( int $num_rows ): array { + return $this->query->get_on_submit_jobs( $num_rows ); + } + + /** + * Change the job status to be failed. + * + * @param string $url Url from DB row. + * @param boolean $is_mobile Is mobile from DB row. + * @param string $error_code error code. + * @param string $error_message error message. + * @param string $optimization_type The type of optimization applied for the current job. + * @return void + */ + public function make_status_failed( string $url, bool $is_mobile, string $error_code, string $error_message, string $optimization_type = '' ): void { + if ( ! $this->is_allowed( $optimization_type ) ) { + return; + } + + $this->query->make_status_failed( $url, $is_mobile, $error_code, $error_message ); + } + + /** + * Change the job status to be pending. + * + * @param string $url Url from DB row. + * @param string $job_id API job_id. + * @param string $queue_name API Queue name. + * @param boolean $is_mobile if the request is for mobile page. + * @param string $optimization_type The type of optimization applied for the current job. + * @return void + */ + public function make_status_pending( string $url, string $job_id, string $queue_name, bool $is_mobile, string $optimization_type ): void { + if ( ! $this->is_allowed( $optimization_type ) ) { + return; + } + + $this->query->make_status_pending( $url, $job_id, $queue_name, $is_mobile ); + } + + /** + * Increment retries number and change status back to pending. + * + * @param string $url Url from DB row. + * @param boolean $is_mobile Is mobile from DB row. + * @param string $error_code error code. + * @param string $error_message error message. + * + * @return void + */ + public function increment_retries( string $url, bool $is_mobile, string $error_code, string $error_message ): void { + if ( ! $this->is_allowed() ) { + return; + } + + $this->query->increment_retries( $url, $is_mobile, $error_code, $error_message ); + } + + /** + * Update the error message. + * + * @param string $url Url from DB row. + * @param boolean $is_mobile Is mobile from DB row. + * @param string $error_code error code. + * @param string $error_message error message. + * @param string $previous_message Previous saved message. + * + * @return void + */ + public function update_message( string $url, bool $is_mobile, string $error_code, string $error_message, string $previous_message ): void { + if ( ! $this->is_allowed() ) { + return; + } + + $this->query->update_message( $url, $is_mobile, $error_code, $error_message, $previous_message ); + } + + /** + * Updates the next_retry_time field + * + * @param string $url Url from DB row. + * @param boolean $is_mobile Is mobile from DB row. + * @param string|int $next_retry_time timestamp or mysql format date. + * + * @return void + */ + public function update_next_retry_time( string $url, bool $is_mobile, $next_retry_time ): void { + if ( ! $this->is_allowed() ) { + return; + } + + $this->query->update_next_retry_time( $url, $is_mobile, $next_retry_time ); + } +} diff --git a/inc/Engine/Common/JobManager/Managers/ManagerInterface.php b/inc/Engine/Common/JobManager/Managers/ManagerInterface.php new file mode 100644 index 0000000000..e989183cba --- /dev/null +++ b/inc/Engine/Common/JobManager/Managers/ManagerInterface.php @@ -0,0 +1,49 @@ +add_async( - 'rocket_rucss_job_check_status', + 'rocket_saas_job_check_status', [ - $usedcss_row_id, + $url, + $is_mobile, + $optimization_type, ] ); } diff --git a/inc/Engine/Common/JobManager/ServiceProvider.php b/inc/Engine/Common/JobManager/ServiceProvider.php new file mode 100644 index 0000000000..e12ff10ba9 --- /dev/null +++ b/inc/Engine/Common/JobManager/ServiceProvider.php @@ -0,0 +1,91 @@ +provides, true ); + } + + /** + * Registers the classes in the container + * + * @return void + */ + public function register(): void { + + $factories = [ + $this->getContainer()->get( 'rucss_factory' ), + ]; + + $this->getContainer()->add( 'wpr_clock', WPRClock::class ); + + $this->getContainer()->add( 'retry_strategy_context', RetryContext::class ); + + $this->getContainer()->add( 'retry_strategy_factory', StrategyFactory::class ) + ->addArgument( $this->getContainer()->get( 'wpr_clock' ) ); + + $this->getContainer()->add( 'queue', Queue::class ); + + $this->getContainer()->add( 'api_client', APIClient::class ) + ->addArgument( $this->getContainer()->get( 'options' ) ); + + $this->getContainer()->addShared( 'job_processor', JobProcessor::class ) + ->addArguments( + [ + $factories, + $this->getContainer()->get( 'queue' ), + $this->getContainer()->get( 'retry_strategy_factory' ), + $this->getContainer()->get( 'api_client' ), + $this->getContainer()->get( 'wpr_clock' ), + ] + ); + + $this->getContainer()->addShared( 'cron_subscriber', CronSubscriber::class ) + ->addArguments( + [ + $this->getContainer()->get( 'job_processor' ), + $factories, + ] + ); + } +} diff --git a/inc/Engine/Optimization/RUCSS/Strategy/Context/RetryContext.php b/inc/Engine/Common/JobManager/Strategy/Context/RetryContext.php similarity index 81% rename from inc/Engine/Optimization/RUCSS/Strategy/Context/RetryContext.php rename to inc/Engine/Common/JobManager/Strategy/Context/RetryContext.php index 87a8daafc9..b7ef8e43dd 100644 --- a/inc/Engine/Optimization/RUCSS/Strategy/Context/RetryContext.php +++ b/inc/Engine/Common/JobManager/Strategy/Context/RetryContext.php @@ -1,8 +1,8 @@ clock = $clock; + } + /** + * Manage the whole process, to determine which strategy to adopt.. + * + * @param object $row_details DB Row of a job. + * @param array $job_details Job information from the API. + * @param ManagerInterface $manager Job Manager. + * + * @return void + */ + public function manage( $row_details, $job_details, ManagerInterface $manager ): void { + + switch ( $job_details['code'] ) { + case 408: + $strategy = new ResetRetryProcess( $manager ); + break; + case 500: + case 422: + case 404: + case 401: + $strategy = new JobSetFail( $manager ); + break; + default: + $strategy = new DefaultProcess( $manager, $this->clock ); + break; + } + + $context = new RetryContext(); + $context->set_strategy( $strategy ); + $context->execute( $row_details, $job_details ); + } +} diff --git a/inc/Engine/Optimization/RUCSS/Strategy/Strategies/DefaultProcess.php b/inc/Engine/Common/JobManager/Strategy/Strategies/DefaultProcess.php similarity index 68% rename from inc/Engine/Optimization/RUCSS/Strategy/Strategies/DefaultProcess.php rename to inc/Engine/Common/JobManager/Strategy/Strategies/DefaultProcess.php index 6922ac0ffc..425d47063a 100644 --- a/inc/Engine/Optimization/RUCSS/Strategy/Strategies/DefaultProcess.php +++ b/inc/Engine/Common/JobManager/Strategy/Strategies/DefaultProcess.php @@ -1,20 +1,21 @@ used_css_query = $used_css_query; - $this->clock = $clock; + public function __construct( ManagerInterface $manager, WPRClock $clock ) { + $this->manager = $manager; + $this->clock = $clock; /** * Filter the array containing the time needed to wait for each retry. @@ -75,6 +76,7 @@ public function __construct( UsedCSS_Query $used_css_query, WPRClock $clock ) { * @return void */ public function execute( object $row_details, array $job_details ): void { + if ( $row_details->retries >= count( $this->time_table_retry ) ) { /** * Unlock preload URL. @@ -83,12 +85,12 @@ public function execute( object $row_details, array $job_details ): void { */ do_action( 'rocket_preload_unlock_url', $row_details->url ); - $this->used_css_query->make_status_failed( $row_details->id, strval( $job_details['code'] ), $job_details['message'] ); + $this->manager->make_status_failed( $row_details->url, $row_details->is_mobile, $job_details['code'], $job_details['message'] ); return; } - $this->used_css_query->increment_retries( $row_details->id, (int) $job_details['code'], $job_details['message'] ); + $this->manager->increment_retries( $row_details->url, $row_details->is_mobile, $job_details['code'], $job_details['message'] ); $rucss_retry_duration = $this->time_table_retry[ $row_details->retries ] ?? $this->default_waiting_retry; // Default to 30 minutes. @@ -105,7 +107,7 @@ public function execute( object $row_details, array $job_details ): void { // update the `next_retry_time` column. $next_retry_time = $this->clock->current_time( 'timestamp', true ) + $rucss_retry_duration; - $this->used_css_query->update_message( $row_details->id, $job_details['code'], $job_details['message'], $row_details->error_message ); - $this->used_css_query->update_next_retry_time( (int) $row_details->id, $next_retry_time ); + $this->manager->update_message( $row_details->url, $row_details->is_mobile, $job_details['code'], $job_details['message'], $row_details->error_message ); + $this->manager->update_next_retry_time( $row_details->url, $row_details->is_mobile, $next_retry_time ); } } diff --git a/inc/Engine/Common/JobManager/Strategy/Strategies/JobSetFail.php b/inc/Engine/Common/JobManager/Strategy/Strategies/JobSetFail.php new file mode 100644 index 0000000000..8aa5bc553e --- /dev/null +++ b/inc/Engine/Common/JobManager/Strategy/Strategies/JobSetFail.php @@ -0,0 +1,45 @@ +manager = $manager; + } + + /** + * Execute the strategy process. + * + * @param object $row_details Row details of the job. + * @param array $job_details Job details from the API. + * + * @return void + */ + public function execute( object $row_details, array $job_details ): void { + /** + * Unlock preload URL. + * + * @param string $url URL to unlock + */ + do_action( 'rocket_preload_unlock_url', $row_details->url ); + + $this->manager->make_status_failed( $row_details->url, $row_details->is_mobile, strval( $job_details['code'] ), $job_details['message'] ); + } +} diff --git a/inc/Engine/Common/JobManager/Strategy/Strategies/ResetRetryProcess.php b/inc/Engine/Common/JobManager/Strategy/Strategies/ResetRetryProcess.php new file mode 100644 index 0000000000..73de517844 --- /dev/null +++ b/inc/Engine/Common/JobManager/Strategy/Strategies/ResetRetryProcess.php @@ -0,0 +1,38 @@ +manager = $manager; + } + + /** + * Execute the strategy process. + * + * @param object $row_details Row details of the job. + * @param array $job_details Job details from the API. + * + * @return void + */ + public function execute( object $row_details, array $job_details ): void { + $this->manager->add_url_to_the_queue( $row_details->url, $row_details->is_mobile ); + } +} diff --git a/inc/Engine/Optimization/RUCSS/Strategy/Strategies/StrategyInterface.php b/inc/Engine/Common/JobManager/Strategy/Strategies/StrategyInterface.php similarity index 81% rename from inc/Engine/Optimization/RUCSS/Strategy/Strategies/StrategyInterface.php rename to inc/Engine/Common/JobManager/Strategy/Strategies/StrategyInterface.php index bd67ed0399..601c1ca6c2 100644 --- a/inc/Engine/Optimization/RUCSS/Strategy/Strategies/StrategyInterface.php +++ b/inc/Engine/Common/JobManager/Strategy/Strategies/StrategyInterface.php @@ -1,6 +1,6 @@ user->renewal_url; } + + /** + * Checks if the user license has expired for more than 15 days + * + * @return boolean + */ + public function is_license_expired_grace_period() { + if ( $this->is_license_expired() && ( time() - $this->get_license_expiration() > 15 * 24 * 60 * 60 ) ) { + return true; + } + + return false; + } } diff --git a/inc/Engine/Media/AboveTheFold/AJAX/Controller.php b/inc/Engine/Media/AboveTheFold/AJAX/Controller.php new file mode 100644 index 0000000000..9b85244571 --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/AJAX/Controller.php @@ -0,0 +1,186 @@ +query = $query; + $this->context = $context; + } + + /** + * Add LCP data to the database + * + * @return bool + */ + public function add_lcp_data() { + check_ajax_referer( 'rocket_lcp', 'rocket_lcp_nonce' ); + + if ( ! $this->context->is_allowed() ) { + wp_send_json_error( 'not allowed' ); + return; + } + + $url = isset( $_POST['url'] ) ? untrailingslashit( esc_url_raw( wp_unslash( $_POST['url'] ) ) ) : ''; + $is_mobile = isset( $_POST['is_mobile'] ) ? filter_var( wp_unslash( $_POST['is_mobile'] ), FILTER_VALIDATE_BOOLEAN ) : false; + $images = isset( $_POST['images'] ) ? json_decode( sanitize_text_field( wp_unslash( $_POST['images'] ) ) ) : []; + $lcp = 'not found'; + $viewport = []; + + /** + * Filters the maximum number of ATF images being saved into the database. + * + * @param int $max_number Maximum number to allow. + * @param string $url Current page url. + * @param string[]|array $images Current list of ATF images. + */ + $max_atf_images_number = (int) apply_filters( 'rocket_atf_images_number', 20, $url, $images ); + if ( 0 >= $max_atf_images_number ) { + $max_atf_images_number = 1; + } + + $keys = [ 'bg_set', 'src' ]; + + foreach ( (array) $images as $image ) { + if ( isset( $image->type ) ) { + $image_object = $this->create_object( $image, $keys ); + + if ( 'lcp' === $image->label && null !== $image_object ) { + $lcp = $image_object; + } elseif ( 'above-the-fold' === $image->label && null !== $image_object ) { + if ( 0 === $max_atf_images_number ) { + continue; + } + + $viewport[] = $image_object; + + --$max_atf_images_number; + } + } + } + + $row = $this->query->get_row( $url, $is_mobile ); + + if ( ! empty( $row ) ) { + wp_send_json_error( 'item already in the database' ); + return; + } + + $item = [ + 'url' => $url, + 'is_mobile' => $is_mobile, + 'status' => 'completed', + 'lcp' => ( is_array( $lcp ) || is_object( $lcp ) ) ? wp_json_encode( $lcp ) : $lcp, + 'viewport' => wp_json_encode( $viewport ), + 'last_accessed' => current_time( 'mysql', true ), + ]; + + $result = $this->query->add_item( $item ); + + if ( ! $result ) { + wp_send_json_error( 'error when adding the entry to the database' ); + return; + } + + wp_send_json_success( $item ); + } + + /** + * Creates an object with the 'type' property and the first key that exists in the image object. + * + * @param object $image The image object. + * @param array $keys An array of keys in the order of their priority. + * + * @return object|null Returns an object with the 'type' property and the first key that exists in the image object. If none of the keys exist in the image object, it returns null. + */ + private function create_object( $image, $keys ) { + $object = new \stdClass(); + $object->type = $image->type ?? 'img'; + + switch ( $object->type ) { + case 'img-srcset': + // If the type is 'img-srcset', add all the required parameters to the object. + $object->src = $this->is_relative( $image->src ) ? sanitize_text_field( $image->src ) : esc_url_raw( $image->src ); + $object->srcset = $image->srcset; + $object->sizes = $image->sizes; + break; + case 'picture': + $object->src = $this->is_relative( $image->src ) ? sanitize_text_field( $image->src ) : esc_url_raw( $image->src ); + $object->sources = $image->sources; + break; + default: + // For other types, add the first non-empty key to the object. + foreach ( $keys as $key ) { + if ( isset( $image->$key ) && ! empty( $image->$key ) ) { + $object->$key = $image->$key; + break; + } + } + break; + } + + // If none of the keys exist in the image object, return null. + if ( count( (array) $object ) <= 1 ) { + return null; + } + + return $object; + } + + /** + * Checks if there is existing LCP data for the current URL and device type. + * + * This method is called via AJAX. It checks if there is existing LCP data for the current URL and device type. + * If the data exists, it returns a JSON success response with true. If the data does not exist, it returns a JSON success response with false. + * If the context is not allowed, it returns a JSON error response with false. + * + * @return void + */ + public function check_lcp_data() { + check_ajax_referer( 'rocket_lcp', 'rocket_lcp_nonce' ); + + if ( ! $this->context->is_allowed() ) { + wp_send_json_error( false ); + return; + } + + $url = isset( $_POST['url'] ) ? untrailingslashit( esc_url_raw( wp_unslash( $_POST['url'] ) ) ) : ''; + $is_mobile = isset( $_POST['is_mobile'] ) ? filter_var( wp_unslash( $_POST['is_mobile'] ), FILTER_VALIDATE_BOOLEAN ) : false; + + $row = $this->query->get_row( $url, $is_mobile ); + + if ( ! empty( $row ) ) { + wp_send_json_success( 'data already exists' ); + return; + } + + wp_send_json_error( 'data does not exist' ); + } +} diff --git a/inc/Engine/Media/AboveTheFold/AJAX/Subscriber.php b/inc/Engine/Media/AboveTheFold/AJAX/Subscriber.php new file mode 100644 index 0000000000..6a070c454b --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/AJAX/Subscriber.php @@ -0,0 +1,56 @@ +controller = $controller; + } + + /** + * Array of events this subscriber listens to + * + * @return array + */ + public static function get_subscribed_events() { + return [ + 'wp_ajax_rocket_lcp' => 'add_lcp_data', + 'wp_ajax_nopriv_rocket_lcp' => 'add_lcp_data', + 'wp_ajax_rocket_check_lcp' => 'check_lcp_data', + 'wp_ajax_nopriv_rocket_check_lcp' => 'check_lcp_data', + ]; + } + + /** + * Callback for data received from lcp script + * + * @return void + */ + public function add_lcp_data() { + $this->controller->add_lcp_data(); + } + + /** + * Callback for checking lcp data + * + * @return void + */ + public function check_lcp_data() { + $this->controller->check_lcp_data(); + } +} diff --git a/inc/Engine/Media/AboveTheFold/Activation/Activation.php b/inc/Engine/Media/AboveTheFold/Activation/Activation.php new file mode 100644 index 0000000000..8ea9c1bff8 --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/Activation/Activation.php @@ -0,0 +1,55 @@ +controller = $controller; + $this->context = $context; + } + + /** + * Add actions on activation. + */ + public function activate() { + add_action( 'rocket_after_activation', [ $this, 'warm_up' ] ); + } + + /** + * Start warm up. + * + * @return void + */ + public function warm_up() { + if ( ! $this->context->is_allowed() ) { + return; + } + + $this->controller->warm_up(); + } +} diff --git a/inc/Engine/Media/AboveTheFold/Activation/ServiceProvider.php b/inc/Engine/Media/AboveTheFold/Activation/ServiceProvider.php new file mode 100644 index 0000000000..b1f9a4d20e --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/Activation/ServiceProvider.php @@ -0,0 +1,71 @@ +provides, true ); + } + + /** + * Registers items with the container + * + * @return void + */ + public function register(): void { + $this->getContainer()->add( 'atf_context', Context::class ); + + $this->getContainer()->add( 'warmup_apiclient', APIClient::class ) + ->addArgument( $this->getContainer()->get( 'options' ) ); + + $this->getContainer()->add( 'warmup_controller', WarmUpController::class ) + ->addArguments( + [ + $this->getContainer()->get( 'atf_context' ), + $this->getContainer()->get( 'options' ), + $this->getContainer()->get( 'warmup_apiclient' ), + $this->getContainer()->get( 'user' ), + ] + ); + + $this->getContainer()->add( 'atf_activation', Activation::class ) + ->addArguments( + [ + $this->getContainer()->get( 'warmup_controller' ), + $this->getContainer()->get( 'atf_context' ), + ] + ); + } +} diff --git a/inc/Engine/Media/AboveTheFold/Admin/Controller.php b/inc/Engine/Media/AboveTheFold/Admin/Controller.php new file mode 100644 index 0000000000..a1ebd78e26 --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/Admin/Controller.php @@ -0,0 +1,168 @@ +table = $table; + $this->query = $query; + $this->context = $context; + } + + /** + * Truncate delete ATF DB table. + * + * @return void + */ + public function truncate_atf() { + if ( ! $this->context->is_allowed() ) { + return; + } + + $this->delete_rows(); + } + + /** + * Deletes the rows from the table + * + * @return void + */ + private function delete_rows() { + if ( 0 < $this->query->get_not_completed_count() ) { + $this->table->remove_all_completed_rows(); + return; + } + + $this->table->truncate_atf_table(); + + /** + * Fires after clearing lcp & atf data. + */ + do_action( 'rocket_after_clear_atf' ); + } + + /** + * Delete ATF row on update Post or delete post. + * + * @param int $post_id The post ID. + * + * @return void + */ + public function delete_post_atf( $post_id ) { + if ( ! $this->context->is_allowed() ) { + return; + } + + $url = get_permalink( $post_id ); + + if ( false === $url ) { + return; + } + + $this->query->delete_by_url( untrailingslashit( $url ) ); + } + + /** + * Deletes the ATF when updating a term + * + * @param int $term_id the term ID. + * + * @return void + */ + public function delete_term_atf( $term_id ) { + if ( ! $this->context->is_allowed() ) { + return; + } + + $url = get_term_link( (int) $term_id ); + + if ( is_wp_error( $url ) ) { + return; + } + + $this->query->delete_by_url( untrailingslashit( $url ) ); + } + + /** + * Deletes rows when triggering clean from admin + * + * @param array $clean An array containing the status and message. + * + * @return array + */ + public function truncate_atf_admin( $clean ) { + if ( ! $this->context->is_allowed() ) { + return $clean; + } + + if ( ! current_user_can( 'rocket_manage_options' ) ) { + return [ + 'status' => 'die', + ]; + } + + $this->delete_rows(); + + return [ + 'status' => 'success', + 'message' => sprintf( + // translators: %1$s = plugin name. + __( '%1$s: Critical images cleared!', 'rocket' ), + 'WP Rocket' + ), + ]; + } + + /** + * Cleans rows for the current URL. + * + * @return void + */ + public function clean_url() { + if ( ! current_user_can( 'rocket_manage_options' ) ) { + wp_nonce_ays( '' ); + } + + $url = wp_get_referer(); + + if ( 0 !== strpos( $url, 'http' ) ) { + $parse_url = get_rocket_parse_url( untrailingslashit( home_url() ) ); + $url = $parse_url['scheme'] . '://' . $parse_url['host'] . $url; + } + + $this->query->delete_by_url( untrailingslashit( $url ) ); + } +} diff --git a/inc/Engine/Media/AboveTheFold/Admin/Subscriber.php b/inc/Engine/Media/AboveTheFold/Admin/Subscriber.php new file mode 100644 index 0000000000..bc1ca32a9e --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/Admin/Subscriber.php @@ -0,0 +1,96 @@ +controller = $controller; + } + + /** + * Array of events this subscriber listens to + * + * @return array + */ + public static function get_subscribed_events(): array { + return [ + 'switch_theme' => 'truncate_atf', + 'permalink_structure_changed' => 'truncate_atf', + 'rocket_domain_options_changed' => 'truncate_atf', + 'wp_trash_post' => 'delete_post_atf', + 'delete_post' => 'delete_post_atf', + 'clean_post_cache' => 'delete_post_atf', + 'wp_update_comment_count' => 'delete_post_atf', + 'edit_term' => 'delete_term_atf', + 'pre_delete_term' => 'delete_term_atf', + 'rocket_saas_clean_all' => 'truncate_atf_admin', + 'rocket_saas_clean_url' => 'clean_url', + ]; + } + + /** + * Truncate delete ATF DB table. + * + * @return void + */ + public function truncate_atf() { + $this->controller->truncate_atf(); + } + + /** + * Delete ATF row on update Post or delete post. + * + * @param int $post_id The post ID. + * + * @return void + */ + public function delete_post_atf( $post_id ) { + $this->controller->delete_post_atf( $post_id ); + } + + /** + * Delete ATF row on update or delete term. + * + * @param int $term_id the term ID. + * + * @return void + */ + public function delete_term_atf( $term_id ) { + $this->controller->delete_term_atf( $term_id ); + } + + /** + * Deletes rows when triggering clean from admin + * + * @param array $clean An array containing the status and message. + * + * @return array + */ + public function truncate_atf_admin( $clean ) { + return $this->controller->truncate_atf_admin( $clean ); + } + + /** + * Cleans rows for the current URL. + * + * @return void + */ + public function clean_url() { + $this->controller->clean_url(); + } +} diff --git a/inc/Engine/Media/AboveTheFold/Context/Context.php b/inc/Engine/Media/AboveTheFold/Context/Context.php new file mode 100644 index 0000000000..edb3a385d4 --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/Context/Context.php @@ -0,0 +1,34 @@ +query = $query; + } + + /** + * Schedules the 'above the fold' cleanup to run daily if it's not already scheduled. + */ + public function schedule_atf_cleanup() { + if ( ! wp_next_scheduled( 'rocket_atf_cleanup' ) ) { + wp_schedule_event( time(), 'daily', 'rocket_atf_cleanup' ); + } + } + + /** + * Executes the 'above the fold' cleanup. + * It gets the current date and subtracts the interval (default to 1 month) from it. + * Then it deletes the rows with 'failed' status or not accessed since the interval. + */ + public function atf_cleanup() { + // Delete the rows with failed status or not accessed. + $this->query->delete_old_rows(); + } + + /** + * Unschedules the 'above the fold' cleanup, preventing it from running at the previously scheduled time. + */ + public function unschedule_atf_cleanup() { + $timestamp = wp_next_scheduled( 'rocket_atf_cleanup' ); + if ( $timestamp ) { + wp_unschedule_event( $timestamp, 'rocket_atf_cleanup' ); + } + } +} diff --git a/inc/Engine/Media/AboveTheFold/Cron/Subscriber.php b/inc/Engine/Media/AboveTheFold/Cron/Subscriber.php new file mode 100644 index 0000000000..5eea55118e --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/Cron/Subscriber.php @@ -0,0 +1,70 @@ +controller = $controller; + } + + /** + * Returns an array of events that this class subscribes to. + * + * @return array An associative array where the keys are the event names and the values are the method names to call when the event is triggered. + */ + public static function get_subscribed_events() { + return [ + 'rocket_atf_cleanup' => 'atf_cleanup', + 'init' => 'schedule_atf_cleanup', + 'rocket_deactivation' => 'unschedule_atf_cleanup', + ]; + } + + /** + * Executes the 'above the fold' cleanup. + * + * @return void + */ + public function atf_cleanup() { + $this->controller->atf_cleanup(); + } + + /** + * Schedules the 'above the fold' cleanup to run at a later time. + * + * @return void + */ + public function schedule_atf_cleanup() { + $this->controller->schedule_atf_cleanup(); + } + + /** + * Unschedules the 'above the fold' cleanup, preventing it from running at the previously scheduled time. + * + * @return void + */ + public function unschedule_atf_cleanup() { + $this->controller->unschedule_atf_cleanup(); + } +} diff --git a/inc/Engine/Media/AboveTheFold/Database/Queries/AboveTheFold.php b/inc/Engine/Media/AboveTheFold/Database/Queries/AboveTheFold.php new file mode 100644 index 0000000000..74d539fa47 --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/Database/Queries/AboveTheFold.php @@ -0,0 +1,140 @@ +table_exists() ) { + return false; + } + + // Get the database interface. + $db = $this->get_db(); + + // Bail if no database interface is available. + if ( empty( $db ) ) { + return false; + } + + $prefixed_table_name = $db->prefix . $this->table_name; + + $data = [ + 'status' => 'completed', + 'lcp' => $data['lcp'], + 'viewport' => $data['viewport'], + ]; + + $where = [ + 'url' => untrailingslashit( $url ), + 'is_mobile' => $is_mobile, + ]; + + return $db->update( $prefixed_table_name, $data, $where ); + } + + /** + * Delete all rows which were not accessed in the last month. + * + * @return bool|int + */ + public function delete_old_rows() { + // Get the database interface. + $db = $this->get_db(); + + // Bail if no database interface is available. + if ( empty( $db ) ) { + return false; + } + + /** + * Filters the interval (in months) to determine when an Above The Fold (ATF) entry is considered 'old'. + * Old ATF entries are eligible for deletion. By default, an ATF entry is considered old if it hasn't been accessed in the last month. + * + * @param int $delete_interval The interval in months after which an ATF entry is considered old. Default is 1 month. + */ + $delete_interval = (int) apply_filters( 'rocket_atf_cleanup_interval', 1 ); + + if ( $delete_interval <= 0 ) { + return false; + } + + $prefixed_table_name = $db->prefix . $this->table_name; + $query = "DELETE FROM `$prefixed_table_name` WHERE status = 'failed' OR `last_accessed` <= date_sub(now(), interval $delete_interval month)"; + $rows_affected = $db->query( $query ); + + return $rows_affected; + } +} diff --git a/inc/Engine/Media/AboveTheFold/Database/Rows/AboveTheFold.php b/inc/Engine/Media/AboveTheFold/Database/Rows/AboveTheFold.php new file mode 100644 index 0000000000..3b4b6d7081 --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/Database/Rows/AboveTheFold.php @@ -0,0 +1,112 @@ +id = (int) $this->id; + $this->url = (string) $this->url; + $this->lcp = (string) $this->lcp; + $this->viewport = (string) $this->viewport; + $this->error_message = (string) $this->error_message; + $this->is_mobile = (bool) $this->is_mobile; + $this->status = (string) $this->status; + $this->modified = empty( $this->modified ) ? 0 : strtotime( (string) $this->modified ); + $this->last_accessed = empty( $this->last_accessed ) ? 0 : strtotime( (string) $this->last_accessed ); + } + + /** + * Checks if the object has a valid LCP (Largest Contentful Paint) value. + * + * @return bool Returns true if the object's status is 'completed' and the LCP value is not empty or 'not found', false otherwise. + */ + public function has_lcp() { + if ( 'completed' !== $this->status ) { + return false; + } + + if ( empty( $this->lcp ) ) { + return false; + } + + if ( 'not found' === $this->lcp ) { + return false; + } + + return true; + } +} diff --git a/inc/Engine/Media/AboveTheFold/Database/Schemas/AboveTheFold.php b/inc/Engine/Media/AboveTheFold/Database/Schemas/AboveTheFold.php new file mode 100644 index 0000000000..a626230029 --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/Database/Schemas/AboveTheFold.php @@ -0,0 +1,111 @@ + 'id', + 'type' => 'bigint', + 'length' => '20', + 'unsigned' => true, + 'extra' => 'auto_increment', + 'primary' => true, + 'sortable' => true, + ], + + // URL column. + [ + 'name' => 'url', + 'type' => 'varchar', + 'length' => '2000', + 'default' => '', + 'cache_key' => true, + 'searchable' => true, + 'sortable' => true, + ], + + // LCP column. + [ + 'name' => 'lcp', + 'type' => 'longtext', + 'default' => '', + 'cache_key' => false, + 'searchable' => true, + 'sortable' => true, + ], + + // Viewport column. + [ + 'name' => 'viewport', + 'type' => 'longtext', + 'default' => '', + 'cache_key' => false, + 'searchable' => true, + 'sortable' => true, + ], + + // IS_MOBILE column. + [ + 'name' => 'is_mobile', + 'type' => 'tinyint', + 'length' => '1', + 'default' => 0, + 'cache_key' => true, + 'searchable' => true, + 'sortable' => true, + ], + + // error_message column. + [ + 'name' => 'error_message', + 'type' => 'longtext', + 'default' => null, + 'cache_key' => false, + 'searchable' => true, + 'sortable' => true, + ], + + // STATUS column. + [ + 'name' => 'status', + 'type' => 'varchar', + 'length' => '255', + 'default' => null, + 'cache_key' => true, + 'searchable' => true, + 'sortable' => false, + ], + + // MODIFIED column. + [ + 'name' => 'modified', + 'type' => 'timestamp', + 'default' => '0000-00-00 00:00:00', + 'created' => true, + 'date_query' => true, + 'sortable' => true, + ], + + // LAST_ACCESSED column. + [ + 'name' => 'last_accessed', + 'type' => 'timestamp', + 'default' => '0000-00-00 00:00:00', + 'created' => true, + 'date_query' => true, + 'sortable' => true, + ], + ]; +} diff --git a/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php b/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php new file mode 100644 index 0000000000..01f40efa6d --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php @@ -0,0 +1,102 @@ + value array of versions => methods. + * + * @var array + */ + protected $upgrades = [ + 20240313 => 'delete_old_atf_implementation', + ]; + /** + * Table schema data. + * + * @var string + */ + protected $schema_data = " + id bigint(20) unsigned NOT NULL AUTO_INCREMENT, + url varchar(2000) NOT NULL default '', + is_mobile tinyint(1) NOT NULL default 0, + lcp longtext default '', + viewport longtext default '', + error_message longtext NULL default NULL, + status varchar(255) NOT NULL default '', + modified timestamp NOT NULL default '0000-00-00 00:00:00', + last_accessed timestamp NOT NULL default '0000-00-00 00:00:00', + PRIMARY KEY (id), + KEY url (url(150), is_mobile), + KEY modified (modified), + KEY last_accessed (last_accessed), + INDEX `status_index` (`status`(191))"; + + /** + * Truncate DB table. + * + * @return bool + */ + public function truncate_atf_table(): bool { + if ( ! $this->exists() ) { + return false; + } + + return $this->truncate(); + } + + /** + * This function is responsible for deleting old columns from the 'wpr_above_the_fold' table. + * The columns to be deleted are: 'error_code', 'retries', 'job_id', 'queue_name', 'submitted_at', 'next_retry_time'. + * + * @return bool Returns true if all specified columns are successfully deleted or do not exist, false otherwise. + */ + public function delete_old_atf_implementation() { + // An array of column names to be deleted. + $columns_to_delete = [ 'error_code', 'retries', 'job_id', 'queue_name', 'submitted_at', 'next_retry_time' ]; + + // A flag to indicate the success of the operation. It is initially set to true. + $is_successful = true; + + // Iterate over each column name in the array. + foreach ( $columns_to_delete as $column ) { + // Check if the column exists in the table. + if ( $this->column_exists( $column ) ) { + // If the column exists, attempt to delete it. + $query_result = $this->get_db()->query( "ALTER TABLE `{$this->table_name}` DROP COLUMN `{$column}`" ); + + // If the deletion query fails, set the success flag to false. + if ( false === $query_result ) { + $is_successful = false; + } + } + } + + // Return the success flag. If all deletion queries were successful (or the columns did not exist), this will be true. If any query failed, this will be false. + return $is_successful; + } +} diff --git a/inc/Engine/Media/AboveTheFold/Frontend/Controller.php b/inc/Engine/Media/AboveTheFold/Frontend/Controller.php new file mode 100644 index 0000000000..58d110e9c8 --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/Frontend/Controller.php @@ -0,0 +1,497 @@ +options = $options; + $this->query = $query; + $this->context = $context; + $this->filesystem = $filesystem ?: rocket_direct_filesystem(); + } + + /** + * Optimize the LCP image + * + * @param string $html HTML content. + * + * @return string + */ + public function lcp( $html ): string { + if ( ! $this->context->is_allowed() ) { + return $html; + } + + global $wp; + + $url = untrailingslashit( home_url( add_query_arg( [], $wp->request ) ) ); + $is_mobile = $this->is_mobile(); + $row = $this->query->get_row( $url, $is_mobile ); + + if ( empty( $row ) ) { + return $this->inject_beacon( $html, $url, $is_mobile ); + } + + if ( ! $row->has_lcp() ) { + return $html; + } + + return $this->preload_lcp( $html, $row ); + } + + /** + * Preload the LCP image + * + * @param string $html HTML content. + * @param object $row Corresponding DB row. + * + * @return string + */ + private function preload_lcp( $html, $row ) { + if ( rocket_bypass() ) { // Bail out if rocket_bypass() returns true. + return $html; + } + + if ( ! preg_match( '##', $html, $matches ) ) { + return $html; + } + + $title = $matches[0]; + $preload = $title; + + $lcp = json_decode( $row->lcp ); + + $preload .= $this->preload_tag( $lcp ); + + $replace = preg_replace( '#' . $title . '#', $preload, $html, 1 ); + $replace = $this->set_fetchpriority( $lcp, $replace ); + + return $replace; + } + + /** + * Builds the preload tag + * + * @param object $lcp LCP object. + * + * @return string + */ + private function preload_tag( $lcp ): string { + $tags = $this->generate_lcp_link_tag_with_sources( $lcp ); + return $tags['tags']; + } + + /** + * Alters the preload element tag (img|img-srcset) + * + * @param object $lcp LCP object. + * @param string $html HTML content. + * @return string + */ + private function set_fetchpriority( $lcp, string $html ): string { + $allowed_types = [ + 'img', + 'img-srcset', + 'picture', + ]; + + if ( empty( $lcp ) || empty( $lcp->type ) || ! in_array( $lcp->type, $allowed_types, true ) ) { + return $html; + } + + $url = preg_quote( $lcp->src, '/' ); + $html = preg_replace_callback( + '#]*?\s+)?src=["\']' . $url . '["\'](?:\s+[^>]*?)?>#', + function ( $matches ) { + // Check if the fetchpriority attribute already exists. + if ( preg_match( '/fetchpriority\s*=\s*[\'"]([^\'"]+)[\'"]/i', $matches[0] ) ) { + // If it exists, don't modify the tag. + return $matches[0]; + } + + // If it doesn't exist, add the fetchpriority attribute. + return preg_replace( '/context->is_allowed() ) { + return $exclusions; + } + + list($atf, $lcp) = [ [], [] ]; + + global $wp; + + $url = untrailingslashit( home_url( add_query_arg( [], $wp->request ) ) ); + + $row = $this->query->get_row( $url, $this->is_mobile() ); + + if ( ! $row ) { + return $exclusions; + } + + if ( $row->lcp && 'not found' !== $row->lcp ) { + $lcp = $this->generate_lcp_link_tag_with_sources( json_decode( $row->lcp ) ); + $lcp = $lcp['sources']; + $lcp = $this->get_path_for_exclusion( $lcp ); + } + + if ( $row->viewport && 'not found' !== $row->viewport ) { + $atf = $this->get_atf_sources( json_decode( $row->viewport ) ); + $atf = $this->get_path_for_exclusion( $atf ); + } + + $exclusions = array_merge( $exclusions, $lcp, $atf ); + + // Remove lcp candidate from the atf array. + $exclusions = array_unique( $exclusions ); + + return $exclusions; + } + + /** + * Get only the url path to exclude. + * + * @param array $exclusions Array of exclusions. + * @return array + */ + private function get_path_for_exclusion( array $exclusions ): array { + $exclusions = array_map( + function ( $exclusion ) { + $exclusion = wp_parse_url( $exclusion ); + return ltrim( $exclusion['path'], '/' ); + }, + $exclusions + ); + + return $exclusions; + } + + /** + * Generate preload link tags with sources for LCP. + * + * @param object $lcp LCP Object. + * @return array + */ + private function generate_lcp_link_tag_with_sources( $lcp ): array { + $pairs = [ + 'tags' => '', + 'sources' => [], + ]; + + if ( ! $lcp && ! is_object( $lcp ) ) { + return $pairs; + } + + $tag = ''; + $start_tag = 'type ) { + case 'img': + $sources[] = $lcp->src; + $tag .= $start_tag . 'href="' . ( $this->is_relative( $lcp->src ) ? esc_attr( $lcp->src ) : esc_url( $lcp->src ) ) . '"' . $end_tag; + break; + case 'img-srcset': + $sources[] = $lcp->src; + $tag .= $start_tag . 'href="' . ( $this->is_relative( $lcp->src ) ? esc_attr( $lcp->src ) : esc_url( $lcp->src ) ) . '" imagesrcset="' . esc_attr( $lcp->srcset ) . '" imagesizes="' . esc_attr( $lcp->sizes ) . '"' . $end_tag; + break; + case 'bg-img-set': + foreach ( $lcp->bg_set as $set ) { + $sources[] = $set->src; + } + + $tag .= $start_tag . 'imagesrcset="' . esc_attr( implode( ',', $sources ) ) . '"' . $end_tag; + break; + case 'bg-img': + foreach ( $lcp->bg_set as $set ) { + $sources[] = $set->src; + + $tag .= $start_tag . 'href="' . ( $this->is_relative( $set->src ) ? esc_attr( $set->src ) : esc_url( $set->src ) ) . '"' . $end_tag; + } + break; + case 'picture': + $result = $this->generate_source_tags( $lcp, $start_tag, $end_tag ); + $sources = $result['sources']; + $tag .= $result['tag']; + break; + } + + $pairs['tags'] = $tag; + $pairs['sources'] = $sources; + + return $pairs; + } + + /** + * Get above the fold images sources. + * + * @param array $atfs Above the fold object. + * @return array + */ + private function get_atf_sources( array $atfs ): array { + if ( ! $atfs && ! is_array( $atfs ) ) { + return []; + } + + $sources = []; + + foreach ( $atfs as $atf ) { + switch ( $atf->type ) { + case 'img': + case 'img-srcset': + $sources[] = $atf->src; + break; + case 'bg-img-set': + case 'bg-img': + foreach ( $atf->bg_set as $set ) { + $sources[] = $set->src; + } + break; + case 'picture': + if ( ! empty( $atf->sources ) ) { + foreach ( $atf->sources as $source ) { + $sources[] = $source->srcset; + } + } + $sources[] = $atf->src; + break; + } + } + + return $sources; + } + + /** + * Determines if the page is mobile and separate cache for mobile files is enabled. + * + * @return bool + */ + private function is_mobile(): bool { + return $this->options->get( 'cache_mobile', 0 ) + && $this->options->get( 'do_caching_mobile_files', 0 ) + && wp_is_mobile(); + } + + /** + * The `inject_beacon` function is used to inject a JavaScript beacon into the HTML content. + * + * @param string $html The HTML content where the beacon will be injected. + * @param string $url The current URL. + * @param bool $is_mobile True for mobile device, false otherwise. + * + * @return string The modified HTML content with the beacon script injected just before the closing body tag. + */ + public function inject_beacon( $html, $url, $is_mobile ): string { + $min = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min'; + + if ( ! $this->filesystem->exists( rocket_get_constant( 'WP_ROCKET_ASSETS_JS_PATH' ) . 'lcp-beacon' . $min . '.js' ) ) { + return $html; + } + + $default_width_threshold = $is_mobile ? 393 : 1600; + $default_height_threshold = $is_mobile ? 830 : 700; + /** + * Filters the width threshold for the LCP beacon. + * + * @param int $width_threshold The width threshold. Default is 393 for mobile and 1920 for others. + * @param bool $is_mobile True if the current device is mobile, false otherwise. + * @param string $url The current URL. + * + * @return int The filtered width threshold. + */ + $width_threshold = apply_filters( 'rocket_lcp_width_threshold', $default_width_threshold, $is_mobile, $url ); + + /** + * Filters the height threshold for the LCP beacon. + * + * @param int $height_threshold The height threshold. Default is 830 for mobile and 1080 for others. + * @param bool $is_mobile True if the current device is mobile, false otherwise. + * @param string $url The current URL. + * + * @return int The filtered height threshold. + */ + $height_threshold = apply_filters( 'rocket_lcp_height_threshold', $default_height_threshold, $is_mobile, $url ); + + if ( ! is_int( $width_threshold ) ) { + $width_threshold = $default_width_threshold; + } + + if ( ! is_int( $height_threshold ) ) { + $height_threshold = $default_height_threshold; + } + + $data = [ + 'ajax_url' => admin_url( 'admin-ajax.php' ), + 'nonce' => wp_create_nonce( 'rocket_lcp' ), + 'url' => $url, + 'is_mobile' => $is_mobile, + 'elements' => $this->lcp_atf_elements(), + 'width_threshold' => $width_threshold, + 'height_threshold' => $height_threshold, + 'debug' => rocket_get_constant( 'WP_ROCKET_DEBUG' ), + ]; + + $inline_script = ''; + + // Get the URL of the script. + $script_url = rocket_get_constant( 'WP_ROCKET_ASSETS_JS_URL' ) . 'lcp-beacon' . $min . '.js'; + + // Create the script tag. + $script_tag = ""; // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript + + // Append the script tag just before the closing body tag. + return str_replace( '', $inline_script . $script_tag . '', $html ); + } + + /** + * Generates the source tags for the given LCP object. + * + * This method is used to generate the source tags for the given LCP object. It iterates over the sources of the LCP object, + * and for each source, it generates a media query and adds the source to the sources array. It also constructs a tag string + * with the source and media query. If a previous max-width is found, it is used to update the media query. The method also + * handles the case where a max-width is found in the source's media attribute. + * + * @param object $lcp The LCP object containing the sources. + * @param string $start_tag The starting tag for each source. + * @param string $end_tag The ending tag for each source. + * + * @return array An associative array containing the sources array and the tag string. + */ + private function generate_source_tags( $lcp, $start_tag, $end_tag ) { + // Initialize the previous max-width to null. + $prev_max_width = null; + // Initialize the sources array and the tag string. + $sources = []; + $tag = ''; + + // Iterate over the sources in the LCP object. + foreach ( $lcp->sources as $source ) { + // Get the media attribute of the source. + $media = $source->media; + // If a previous max-width is found, update the media query. + if ( null !== $prev_max_width ) { + $media = '(min-width: ' . ( $prev_max_width + 0.1 ) . 'px) and ' . $media; + } + // Add the source to the sources array. + $sources[] = $source->srcset; + // Append the source and media query to the tag string. + $tag .= $start_tag . 'href="' . $source->srcset . '" media="' . $media . '"' . $end_tag; + // If a max-width is found in the source's media attribute, update the previous max-width. + if ( preg_match( '/\(max-width: (\d+(\.\d+)?)px\)/', $source->media, $matches ) ) { + $prev_max_width = floatval( $matches[1] ); + } + } + // If a previous max-width is found, update the media query and add the LCP source to the sources array and the tag string. + if ( null !== $prev_max_width ) { + $media = '(min-width: ' . ( $prev_max_width + 0.1 ) . 'px)'; + $sources[] = $lcp->src; + $tag .= $start_tag . 'href="' . $lcp->src . '" media="' . $media . '"' . $end_tag; + } + + // Return an associative array containing the sources array and the tag string. + return [ + 'sources' => $sources, + 'tag' => $tag, + ]; + } + + /** + * Returns a comma-separated list of elements to be considered for the lcp/above-the-fold optimization. + * + * @return string + */ + private function lcp_atf_elements(): string { + $elements = [ + 'img', + 'video', + 'picture', + 'p', + 'main', + 'div', + 'li', + 'svg', + ]; + + $default_elements = $elements; + + /** + * Filters the array of elements + * + * @since 3.16 + * + * @param array $formats Array of elements + */ + $elements = apply_filters( 'rocket_atf_elements', $elements ); + + if ( ! is_array( $elements ) ) { + $elements = $default_elements; + } + + $elements = array_filter( $elements, 'is_string' ); + + return implode( ', ', $elements ); + } +} diff --git a/inc/Engine/Media/AboveTheFold/Frontend/Subscriber.php b/inc/Engine/Media/AboveTheFold/Frontend/Subscriber.php new file mode 100644 index 0000000000..949ed7f8c2 --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/Frontend/Subscriber.php @@ -0,0 +1,59 @@ +controller = $controller; + } + + /** + * Array of events to listen to + * + * @return array + */ + public static function get_subscribed_events() { + return [ + 'rocket_buffer' => [ 'lcp', 17 ], + 'rocket_lazyload_excluded_src' => 'add_exclusions', + 'rocket_critical_image_saas_visit_buffer' => [ 'lcp', 17 ], + ]; + } + + /** + * Optimize the LCP image + * + * @param string $html HTML content. + * + * @return string + */ + public function lcp( $html ): string { + return $this->controller->lcp( $html ); + } + + /** + * Add above the fold images to lazyload exclusions + * + * @param array $exclusions Array of excluded patterns. + * + * @return array + */ + public function add_exclusions( $exclusions ): array { + return $this->controller->add_exclusions( $exclusions ); + } +} diff --git a/inc/Engine/Media/AboveTheFold/ServiceProvider.php b/inc/Engine/Media/AboveTheFold/ServiceProvider.php new file mode 100644 index 0000000000..d0070d6756 --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/ServiceProvider.php @@ -0,0 +1,118 @@ +provides, true ); + } + + /** + * Registers the classes in the container + * + * @return void + */ + public function register(): void { + $this->getContainer()->addShared( 'atf_table', ATFTable::class ); + $this->getContainer()->add( 'atf_query', ATFQuery::class ); + $this->getContainer()->add( 'atf_context', Context::class ); + + $this->getContainer()->get( 'atf_table' ); + + $this->getContainer()->add( 'atf_controller', FrontController::class ) + ->addArguments( + [ + $this->getContainer()->get( 'options' ), + $this->getContainer()->get( 'atf_query' ), + $this->getContainer()->get( 'atf_context' ), + ] + ); + + $this->getContainer()->addShared( 'atf_subscriber', FrontSubscriber::class ) + ->addArgument( $this->getContainer()->get( 'atf_controller' ) ); + $this->getContainer()->add( 'atf_admin_controller', AdminController::class ) + ->addArgument( $this->getContainer()->get( 'atf_table' ) ) + ->addArgument( $this->getContainer()->get( 'atf_query' ) ) + ->addArgument( $this->getContainer()->get( 'atf_context' ) ); + $this->getContainer()->addShared( 'atf_admin_subscriber', AdminSubscriber::class ) + ->addArgument( $this->getContainer()->get( 'atf_admin_controller' ) ); + + $this->getContainer()->add( 'atf_cron_controller', CronController::class ) + ->addArgument( $this->getContainer()->get( 'atf_query' ) ); + $this->getContainer()->addShared( 'atf_cron_subscriber', CronSubscriber::class ) + ->addArgument( $this->getContainer()->get( 'atf_cron_controller' ) ); + + $this->getContainer()->add( 'atf_ajax_controller', AJAXController::class ) + ->addArguments( + [ + $this->getContainer()->get( 'atf_query' ), + $this->getContainer()->get( 'atf_context' ), + ] + ); + + $this->getContainer()->addShared( 'atf_ajax_subscriber', AJAXSubscriber::class ) + ->addArgument( $this->getContainer()->get( 'atf_ajax_controller' ) ); + + $this->getContainer()->add( 'warmup_apiclient', APIClient::class ) + ->addArgument( $this->getContainer()->get( 'options' ) ); + $this->getContainer()->add( 'warmup_controller', WarmUpController::class ) + ->addArguments( + [ + $this->getContainer()->get( 'atf_context' ), + $this->getContainer()->get( 'options' ), + $this->getContainer()->get( 'warmup_apiclient' ), + $this->getContainer()->get( 'user' ), + ] + ); + $this->getContainer()->addShared( 'warmup_subscriber', WarmUpSubscriber::class ) + ->addArgument( $this->getContainer()->get( 'warmup_controller' ) ); + } +} diff --git a/inc/Engine/Media/AboveTheFold/WarmUp/APIClient.php b/inc/Engine/Media/AboveTheFold/WarmUp/APIClient.php new file mode 100644 index 0000000000..f6112a9944 --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/WarmUp/APIClient.php @@ -0,0 +1,34 @@ + 1, + ], + $url + ); + + $config = [ + 'optimization_list' => '', + 'is_home' => $is_home, + ]; + + return $this->add_to_queue( $url, $config ); + } +} diff --git a/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php b/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php new file mode 100644 index 0000000000..8852469dac --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php @@ -0,0 +1,214 @@ +context = $context; + $this->options = $options; + $this->api_client = $api_client; + $this->user = $user; + } + + /** + * Send links for warm up. + * + * @return void + */ + public function warm_up(): void { + if ( (bool) $this->options->get( 'remove_unused_css', 0 ) ) { + return; + } + + if ( ! $this->context->is_allowed() ) { + return; + } + + $this->send_to_saas( $this->fetch_links() ); + } + + /** + * Fetch links from homepage. + * + * @return array + */ + public function fetch_links(): array { + if ( $this->user->is_license_expired_grace_period() ) { + return []; + } + + $home_url = home_url(); + $args = [ + 'user-agent' => 'WP Rocket/Pre-fetch Home Links', + 'timeout' => 60, + ]; + + $response = wp_remote_get( $home_url, $args ); + + if ( 200 !== wp_remote_retrieve_response_code( $response ) ) { + return []; + } + + $html = wp_remote_retrieve_body( $response ); + + if ( ! preg_match_all( '/]*?\s+)?href=(["\'])(.*?)\1/', $html, $matches ) ) { + return []; + } + + $links = $matches[2]; + + // Cater for relative urls. + $links = array_map( + function ( $link ) { + $link_path = wp_parse_url( $link ); + + // Return if absolute url. + if ( isset( $link_path['path'], $link_path['scheme'] ) ) { + return $link; + } + + // Transform to absolute url if relative. + if ( isset( $link_path['path'] ) ) { + return home_url( $link ); + } + + return $link; + }, + $links + ); + + $reject_uri_pattern = '/(?:.+/)?feed(?:/(?:.+/?)?)?$|/(?:.+/)?embed/|/wc-api/v(.*)|/(index.php/)?(.*)wp-json(/.*|$)'; + + // Filter links. + $links = array_filter( + $links, + function ( $link ) use ( $home_url, $reject_uri_pattern ) { + $link_host = wp_parse_url( $link ); + $site_host = wp_parse_url( $home_url ); + /** + * Check for valid link. + * Check that no external link. + * Check that it's not home. + */ + $is_valid_url = wp_http_validate_url( $link ); + $is_same_host = isset( $link_host['host'] ) ? $link_host['host'] === $site_host['host'] : false; + $is_not_home = ! Utils::is_home( $link ); + $is_not_excluded_uri = ! (bool) preg_match( '#' . $reject_uri_pattern . '#i', $link ); + + return $is_valid_url && $is_same_host && $is_not_home && $is_not_excluded_uri; + } + ); + + // Remove duplicate links. + $links = array_unique( $links ); + + $default_limit = 10; + + /** + * Filters the number of links to return from the homepage. + * + * @param int $links_limit number of links to return. + */ + $links_limit = apply_filters( 'rocket_atf_warmup_links_number', $default_limit ); + + if ( ! is_int( $links_limit ) || $links_limit < 1 ) { + $links_limit = $default_limit; + } + + $links = array_slice( $links, 0, $links_limit ); + // Add home url to the list of links. + $links[] = home_url(); + + return $links; + } + + /** + * Send fetched links to SaaS to do the warmup. + * + * @param array $links Array of links to be sent. + * @return void + */ + private function send_to_saas( $links ) { + if ( empty( $links ) ) { + return; + } + + /** + * Filter the delay between each request. + * + * @param int $delay_between the defined delay. + * + * @returns int + */ + $delay_between = (int) apply_filters( 'rocket_delay_between_requests', 500000 ); + + foreach ( $links as $link ) { + $this->api_client->add_to_atf_queue( $link ); + + usleep( $delay_between ); + } + } + + /** + * Add wpr_imagedimensions to URL query. + * + * @param string $url URL to be sent. + * + * @return string + */ + public function add_wpr_imagedimensions_query_arg( string $url ): string { + if ( ! $this->context->is_allowed() ) { + return $url; + } + + return add_query_arg( + [ + 'wpr_imagedimensions' => 1, + ], + $url + ); + } +} diff --git a/inc/Engine/Media/AboveTheFold/WarmUp/Subscriber.php b/inc/Engine/Media/AboveTheFold/WarmUp/Subscriber.php new file mode 100644 index 0000000000..b7c26d3dd5 --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/WarmUp/Subscriber.php @@ -0,0 +1,72 @@ +controller = $controller; + } + + /** + * Array of events this subscriber listens to + * + * @return array + */ + public static function get_subscribed_events(): array { + return [ + 'wp_rocket_upgrade' => [ 'warm_up_on_update', 10, 2 ], + 'rocket_after_clear_atf' => 'warm_up', + 'rocket_saas_api_queued_url' => 'add_wpr_imagedimensions_query_arg', + ]; + } + + /** + * Process links fetched from homepage. + * + * @return void + */ + public function warm_up(): void { + $this->controller->warm_up(); + } + + /** + * Process links fetched from homepage on update. + * + * @param string $new_version New plugin version. + * @param string $old_version Previous plugin version. + * + * @return void + */ + public function warm_up_on_update( $new_version, $old_version ) { + if ( version_compare( $old_version, '3.16', '>=' ) ) { + return; + } + $this->controller->warm_up(); + } + + /** + * Add image dimensions query parameter to URL. + * + * @param string $url URL to be sent. + * + * @return string + */ + public function add_wpr_imagedimensions_query_arg( string $url ): string { + return $this->controller->add_wpr_imagedimensions_query_arg( $url ); + } +} diff --git a/inc/Engine/Media/ImageDimensions/Subscriber.php b/inc/Engine/Media/ImageDimensions/Subscriber.php index 40de9b38e0..43503c2f6b 100755 --- a/inc/Engine/Media/ImageDimensions/Subscriber.php +++ b/inc/Engine/Media/ImageDimensions/Subscriber.php @@ -2,6 +2,7 @@ namespace WP_Rocket\Engine\Media\ImageDimensions; +use WP_Rocket\Buffer\Tests; use WP_Rocket\Event_Management\Subscriber_Interface; /** @@ -18,13 +19,22 @@ class Subscriber implements Subscriber_Interface { */ private $dimensions; + /** + * Buffer tests to run against current page, to decide if we can start the buffer or not. + * + * @var Tests + */ + private $buffer_tests; + /** * Subscriber constructor. * * @param ImageDimensions $dimensions Images dimensions class that handles all business logic. + * @param Tests $buffer_tests Buffer tests instance. */ - public function __construct( ImageDimensions $dimensions ) { - $this->dimensions = $dimensions; + public function __construct( ImageDimensions $dimensions, Tests $buffer_tests ) { + $this->dimensions = $dimensions; + $this->buffer_tests = $buffer_tests; } /** @@ -34,7 +44,9 @@ public function __construct( ImageDimensions $dimensions ) { */ public static function get_subscribed_events() { return [ - 'rocket_buffer' => [ 'specify_image_dimensions', 17 ], + 'rocket_buffer' => [ 'specify_image_dimensions', 17 ], + 'template_redirect' => [ 'start_image_dimensions_buffer', 3 ], + 'rocket_critical_image_saas_visit_buffer' => 'specify_image_dimensions', ]; } @@ -52,4 +64,38 @@ public function specify_image_dimensions( $buffer ) { return $this->dimensions->specify_image_dimensions( $buffer ); } + + /** + * Update images that have no width/height with real dimentions for the SaaS + * + * @param string $buffer Page HTML content. + * + * @return string Page HTML content after update. + */ + public function prepare_critical_image_saas_visit( $buffer ) { + if ( ! isset( $_GET['wpr_imagedimensions'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended + return $buffer; + } + + return apply_filters( 'rocket_critical_image_saas_visit_buffer', $buffer ); + } + + /** + * Start image dimensions buffer to add + * + * @return void + */ + public function start_image_dimensions_buffer() { + if ( empty( $_GET['wpr_imagedimensions'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended + return; + } + + if ( ! $this->buffer_tests->can_process_any_buffer() ) { + return; + } + + add_filter( 'rocket_specify_image_dimensions', '__return_true' ); + + ob_start( [ $this, 'prepare_critical_image_saas_visit' ] ); + } } diff --git a/inc/Engine/Media/Lazyload/CSS/Front/Extractor.php b/inc/Engine/Media/Lazyload/CSS/Front/Extractor.php index 565eec52a6..15c1ae8d8b 100644 --- a/inc/Engine/Media/Lazyload/CSS/Front/Extractor.php +++ b/inc/Engine/Media/Lazyload/CSS/Front/Extractor.php @@ -3,10 +3,12 @@ namespace WP_Rocket\Engine\Media\Lazyload\CSS\Front; use WP_Rocket\Engine\Optimization\RegexTrait; +use WP_Rocket\Engine\Optimization\UrlTrait; class Extractor { use RegexTrait; + use UrlTrait; /** * Comment mapping. @@ -342,14 +344,4 @@ protected function is_url_external( string $url ): bool { return $host !== $home_host; } - - /** - * Check if the URL is relative. - * - * @param string $url URL to check. - * @return bool - */ - protected function is_relative( string $url ): bool { - return preg_match( '/^\./', $url ); - } } diff --git a/inc/Engine/Media/ServiceProvider.php b/inc/Engine/Media/ServiceProvider.php index a29830dceb..306d9295e2 100644 --- a/inc/Engine/Media/ServiceProvider.php +++ b/inc/Engine/Media/ServiceProvider.php @@ -1,6 +1,8 @@ getContainer()->get( 'options' ); + $this->getContainer()->add( 'config', Config::class ) + ->addArgument( [ 'config_dir_path' => rocket_get_constant( 'WP_ROCKET_CONFIG_PATH' ) ] ); + $this->getContainer()->add( 'tests', Tests::class ) + ->addArgument( $this->getContainer()->get( 'config' ) ); + $this->getContainer()->add( 'lazyload_assets', Assets::class ); $this->getContainer()->add( 'lazyload_image', Image::class ); $this->getContainer()->add( 'lazyload_iframe', Iframe::class ); @@ -72,6 +81,7 @@ public function register(): void { ->addArgument( $options ); $this->getContainer()->addShared( 'image_dimensions_subscriber', ImageDimensionsSubscriber::class ) ->addArgument( $this->getContainer()->get( 'image_dimensions' ) ) + ->addArgument( $this->getContainer()->get( 'tests' ) ) ->addTag( 'front_subscriber' ); $this->getContainer()->addShared( 'image_dimensions_admin_subscriber', ImageDimensionsAdminSubscriber::class ) ->addArgument( $this->getContainer()->get( 'image_dimensions' ) ) diff --git a/inc/Engine/Optimization/RUCSS/Admin/Database.php b/inc/Engine/Optimization/RUCSS/Admin/Database.php index 83419dff06..59af63527a 100644 --- a/inc/Engine/Optimization/RUCSS/Admin/Database.php +++ b/inc/Engine/Optimization/RUCSS/Admin/Database.php @@ -56,7 +56,7 @@ public function delete_old_used_css() { return; } - $this->rucss_usedcss_table->delete_old_used_css(); + $this->rucss_usedcss_table->delete_old_rows(); } /** @@ -68,7 +68,7 @@ public function get_old_used_css(): array { if ( ! $this->rucss_usedcss_table->exists() ) { return []; } - return $this->rucss_usedcss_table->get_old_used_css(); + return $this->rucss_usedcss_table->get_old_rows(); } /** diff --git a/inc/Engine/Optimization/RUCSS/Admin/Settings.php b/inc/Engine/Optimization/RUCSS/Admin/Settings.php index 7fd3bf6e1e..786dd75391 100644 --- a/inc/Engine/Optimization/RUCSS/Admin/Settings.php +++ b/inc/Engine/Optimization/RUCSS/Admin/Settings.php @@ -90,50 +90,6 @@ public function sanitize_options( array $input, AdminSettings $settings ): array return $input; } - /** - * Add Clean used CSS link to WP Rocket admin bar item - * - * @since 3.9 - * - * @param \WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference. - * - * @return void - */ - public function add_clean_used_css_menu_item( $wp_admin_bar ) { - if ( 'local' === wp_get_environment_type() ) { - return; - } - - if ( ! current_user_can( 'rocket_remove_unused_css' ) ) { - return; - } - - if ( ! is_admin() ) { - return; - } - - if ( ! $this->is_enabled() ) { - return; - } - - $referer = ''; - $action = 'rocket_clear_usedcss'; - - if ( ! empty( $_SERVER['REQUEST_URI'] ) ) { - $referer_url = filter_var( wp_unslash( $_SERVER['REQUEST_URI'] ), FILTER_SANITIZE_URL ); - $referer = '&_wp_http_referer=' . rawurlencode( remove_query_arg( 'fl_builder', $referer_url ) ); - } - - $wp_admin_bar->add_menu( - [ - 'parent' => 'wp-rocket', - 'id' => 'clean-used-css', - 'title' => __( 'Clear Used CSS', 'rocket' ), - 'href' => wp_nonce_url( admin_url( "admin-post.php?action={$action}{$referer}" ), $action ), - ] - ); - } - /** * Set optimize css delivery value * @@ -184,128 +140,6 @@ public function set_optimize_css_delivery_method_value( $field_args ): array { return $field_args; } - /** - * Displays the RUCSS currently processing notice - * - * @since 3.11 - * - * @return void - */ - public function display_processing_notice() { - - if ( $this->has_saas_error_notice() ) { - return; - } - - if ( ! $this->can_display_notice() ) { - return; - } - - if ( ! $this->used_css->exists() ) { - return; - } - - $transient = get_transient( 'rocket_rucss_processing' ); - - if ( false === $transient ) { - return; - } - - $current_time = time(); - - if ( $transient < $current_time ) { - return; - } - - $remaining = $transient - $current_time; - - $message = sprintf( - // translators: %1$s = plugin name, %2$s = number of seconds. - __( '%1$s: Please wait %2$s seconds. The Remove Unused CSS service is processing your pages.', 'rocket' ), - 'WP Rocket', - '' . $remaining . '' - ); - - rocket_notice_html( - [ - 'status' => 'info', - 'message' => $message, - 'id' => 'rocket-notice-rucss-processing', - ] - ); - } - - /** - * Displays the RUCSS success notice - * - * @since 3.11 - * - * @return void - */ - public function display_success_notice() { - - if ( ! $this->can_display_notice() ) { - return; - } - - if ( ! $this->used_css->exists() ) { - return; - } - - if ( $this->has_saas_error_notice() ) { - return; - } - - $boxes = get_user_meta( get_current_user_id(), 'rocket_boxes', true ); - - if ( in_array( 'rucss_success_notice', (array) $boxes, true ) ) { - return; - } - - $transient = get_transient( 'rocket_rucss_processing' ); - $class = ''; - - if ( false !== $transient ) { - $class = 'hidden'; - } - - $message = sprintf( - // translators: %1$s = plugin name, %2$s = number of URLs, %3$s = number of seconds. - __( '%1$s: The Used CSS of your homepage has been processed. WP Rocket will continue to generate Used CSS for up to %2$s URLs per %3$s second(s).', 'rocket' ), - 'WP Rocket', - apply_filters( 'rocket_rucss_pending_jobs_cron_rows_count', 100 ), - apply_filters( 'rocket_rucss_pending_jobs_cron_interval', MINUTE_IN_SECONDS ) - ); - - if ( ! $this->options->get( 'manual_preload', 0 ) ) { - $message .= ' ' . sprintf( - // translators: %1$s = opening link tag, %2$s = closing link tag. - __( 'We suggest enabling %1$sPreload%2$s for the fastest results.', 'rocket' ), - '', - '' - ); - } - - $beacon = $this->beacon->get_suggest( 'async_opti' ); - - $message .= '
' . sprintf( - // translators: %1$s = opening link tag, %2$s = closing link tag. - __( 'To learn more about the process check our %1$sdocumentation%2$s.', 'rocket' ), - '', - '' - ); - - rocket_notice_html( - [ - 'message' => $message, - 'dismissible' => $class, - 'id' => 'rocket-notice-rucss-success', - 'dismiss_button' => 'rucss_success_notice', - 'dismiss_button_class' => 'button-primary', - ] - ); - } - /** * Checks if we can display the RUCSS notices * @@ -341,36 +175,6 @@ private function can_display_notice( $check_enabled = true ): bool { return true; } - /** - * Adds the notice end time to WP Rocket localize script data - * - * @since 3.11 - * - * @param array $data Localize script data. - * - * @return array - */ - public function add_localize_script_data( $data ): array { - if ( ! is_array( $data ) ) { - $data = (array) $data; - } - - if ( ! $this->is_enabled() ) { - return $data; - } - - $transient = get_transient( 'rocket_rucss_processing' ); - - if ( false === $transient ) { - return $data; - } - - $data['notice_end_time'] = $transient; - $data['cron_disabled'] = rocket_get_constant( 'DISABLE_WP_CRON', false ); - - return $data; - } - /** * Disables combine CSS if RUCSS is enabled when updating to 3.11 * @@ -431,103 +235,6 @@ public function update_safelist_items( $old_version ) { update_option( 'wp_rocket_settings', $options ); } - /** - * Display a notification on wrong license. - * - * @return void - */ - public function display_wrong_license_notice() { - if ( ! $this->can_display_notice( false ) ) { - return; - } - - $main_message = __( "We couldn't generate the used CSS because you're using a nulled version of WP Rocket. You need an active license to use the Remove Unused CSS feature and further improve your website's performance.", 'rocket' ); - $cta_message = sprintf( - // translators: %1$s = promo percentage. - __( 'Click here to get a WP Rocket single license at %1$s off!', 'rocket' ), - '10%%' - ); - - $message = sprintf( - // translators: %1$s = plugin name, %2$s = opening anchor tag, %3$s = closing anchor tag. - "%1\$s:

$main_message

%2\$s$cta_message%3\$s", - 'WP Rocket', - '', - '' - ); - - rocket_notice_html( - [ - 'status' => 'error', - 'dismissible' => '', - 'message' => $message, - 'id' => 'rocket-notice-rucss-wrong-licence', - ] - ); - } - - /** - * Display an error notice when the connection to the server fails - * - * @return void - */ - public function display_saas_error_notice() { - - if ( ! $this->has_saas_error_notice() ) { - $boxes = get_user_meta( get_current_user_id(), 'rocket_boxes', true ); - if ( in_array( 'rucss_saas_error_notice', (array) $boxes, true ) ) { - unset( $boxes['rucss_saas_error_notice'] ); - update_user_meta( get_current_user_id(), 'rocket_boxes', $boxes ); - } - - return; - } - - if ( ! $this->can_display_notice() ) { - return; - } - - $boxes = get_user_meta( get_current_user_id(), 'rocket_boxes', true ); - - if ( in_array( 'rucss_error_notice', (array) $boxes, true ) ) { - return; - } - - $firewall_beacon = $this->beacon->get_suggest( 'rucss_firewall_ips' ); - - $main_message = sprintf( - // translators: %1$s = open tag, %2$s = closing tag. - __( 'It seems a security plugin or the server\'s firewall prevents WP Rocket from accessing the Remove Unused CSS generator. IPs listed %1$shere in our documentation%2$s should be added to your allowlists:', 'rocket' ), - '', - '' - ); - - $security_message = __( '- In the security plugin, if you are using one', 'rocket' ); - $firewall_message = __( "- In the server's firewall. Your host can help you with this", 'rocket' ); - - $message = "WP Rocket: $main_message
  • $security_message
  • $firewall_message
"; - - rocket_notice_html( - [ - 'status' => 'error', - 'message' => $message, - 'dismissible' => '', - 'id' => 'rocket-notice-rucss-error-http', - 'dismiss_button' => 'rucss_error_notice', - 'dismiss_button_class' => 'button-primary', - ] - ); - } - - /** - * Is the error notice present. - * - * @return bool - */ - public function has_saas_error_notice() { - return (bool) get_transient( 'wp_rocket_rucss_errors_count' ); - } - /** * Display a notice on table missing. * diff --git a/inc/Engine/Optimization/RUCSS/Admin/Subscriber.php b/inc/Engine/Optimization/RUCSS/Admin/Subscriber.php index 0cccd50854..5881c65c11 100644 --- a/inc/Engine/Optimization/RUCSS/Admin/Subscriber.php +++ b/inc/Engine/Optimization/RUCSS/Admin/Subscriber.php @@ -3,11 +3,10 @@ namespace WP_Rocket\Engine\Optimization\RUCSS\Admin; -use WP_Rocket\Engine\Optimization\RUCSS\Controller\Queue; +use WP_Rocket\Engine\Common\JobManager\Queue\Queue; use WP_Rocket\Engine\Common\Queue\RUCSSQueueRunner; use WP_Rocket\Engine\Optimization\RUCSS\Controller\UsedCSS; use WP_Rocket\Event_Management\Subscriber_Interface; -use WP_Admin_Bar; class Subscriber implements Subscriber_Interface { /** @@ -77,26 +76,14 @@ public static function get_subscribed_events(): array { 'wp_update_comment_count' => 'delete_used_css_on_update_or_delete', 'edit_term' => 'delete_term_used_css', 'pre_delete_term' => 'delete_term_used_css', - 'admin_post_rocket_clear_usedcss' => 'truncate_used_css_handler', - 'admin_post_rocket_clear_usedcss_url' => 'clear_url_usedcss', 'admin_notices' => [ - [ 'clear_usedcss_result' ], - [ 'display_processing_notice' ], - [ 'display_success_notice' ], - [ 'display_wrong_license_notice' ], - [ 'display_saas_error_notice' ], [ 'display_no_table_notice' ], [ 'notice_write_permissions' ], ], - 'rocket_admin_bar_items' => [ - [ 'add_clean_used_css_menu_item' ], - [ 'add_clear_usedcss_bar_item' ], - ], 'rocket_before_add_field_to_settings' => [ [ 'set_optimize_css_delivery_value', 10, 1 ], [ 'set_optimize_css_delivery_method_value', 10, 1 ], ], - 'rocket_localize_admin_script' => 'add_localize_script_data', 'wp_rocket_upgrade' => [ [ 'set_option_on_update', 14, 2 ], [ 'update_safelist_items', 15, 2 ], @@ -109,6 +96,8 @@ public static function get_subscribed_events(): array { 'admin_head-tools_page_action-scheduler' => 'delete_as_tables_transient_on_tools_page', 'pre_get_rocket_option_remove_unused_css' => 'disable_russ_on_wrong_license', 'rocket_before_rollback' => 'cancel_queues', + 'rocket_saas_clean_all' => [ 'truncate', 11 ], + 'rocket_saas_clean_url' => [ 'clean_url', 11 ], ]; } @@ -259,99 +248,33 @@ public function clean_used_css_and_cache( $old_value, $value ) { } /** - * Truncate used_css table when clicking on the dashboard button. + * Deletes rows when triggering clean from admin * - * @since 3.9 + * @param array $clean An array containing the status and message. * - * @return void + * @return array */ - public function truncate_used_css_handler() { - if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( sanitize_key( $_GET['_wpnonce'] ), 'rocket_clear_usedcss' ) ) { - wp_nonce_ays( '' ); - } - - if ( ! current_user_can( 'rocket_remove_unused_css' ) ) { - rocket_get_constant( 'WP_ROCKET_IS_TESTING', false ) ? wp_die() : exit; - } - + public function truncate( $clean ) { if ( ! $this->settings->is_enabled() ) { - set_transient( - 'rocket_clear_usedcss_response', - [ - 'status' => 'error', - 'message' => sprintf( - // translators: %1$s = plugin name. - __( '%1$s: Used CSS option is not enabled!', 'rocket' ), - 'WP Rocket' - ), - ] - ); - - wp_safe_redirect( esc_url_raw( wp_get_referer() ) ); - rocket_get_constant( 'WP_ROCKET_IS_TESTING', false ) ? wp_die() : exit; + return $clean; } - rocket_clean_domain(); - - $this->delete_used_css_rows(); - - rocket_dismiss_box( 'rocket_warning_plugin_modification' ); - - set_transient( - 'rocket_clear_usedcss_response', - [ - 'status' => 'success', - 'message' => sprintf( - // translators: %1$s = plugin name. - __( '%1$s: Used CSS cache cleared!', 'rocket' ), - 'WP Rocket' - ), - ] - ); - - $this->set_notice_transient(); - - wp_safe_redirect( esc_url_raw( wp_get_referer() ) ); - rocket_get_constant( 'WP_ROCKET_IS_TESTING', false ) ? wp_die() : exit; - } - - /** - * Show admin notice after clearing used_css table. - * - * @since 3.9 - * - * @return void - */ - public function clear_usedcss_result() { if ( ! current_user_can( 'rocket_remove_unused_css' ) ) { - return; - } - - if ( ! $this->settings->is_enabled() ) { - return; - } - - $response = get_transient( 'rocket_clear_usedcss_response' ); - if ( ! $response ) { - return; + return [ + 'status' => 'die', + ]; } - delete_transient( 'rocket_clear_usedcss_response' ); - - rocket_notice_html( $response ); - } + $this->delete_used_css_rows(); - /** - * Add Clean used CSS link to WP Rocket admin bar item - * - * @since 3.9 - * - * @param \WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference. - * - * @return void - */ - public function add_clean_used_css_menu_item( $wp_admin_bar ) { - $this->settings->add_clean_used_css_menu_item( $wp_admin_bar ); + return [ + 'status' => 'success', + 'message' => sprintf( + // translators: %1$s = plugin name. + __( '%1$s: Used CSS cache cleared!', 'rocket' ), + 'WP Rocket' + ), + ]; } /** @@ -381,93 +304,11 @@ public function set_optimize_css_delivery_method_value( $field_args ): array { } /** - * Displays the RUCSS currently processing notice - * - * @since 3.11 - * - * @return void - */ - public function display_processing_notice() { - $this->settings->display_processing_notice(); - } - - /** - * Displays the RUCSS success notice - * - * @since 3.11 - * - * @return void - */ - public function display_success_notice() { - $this->settings->display_success_notice(); - } - - /** - * Display a notification on wrong license. - * - * @return void - */ - public function display_wrong_license_notice() { - $transient = get_option( 'wp_rocket_no_licence' ); - - if ( ! $transient ) { - return; - } - - $this->settings->display_wrong_license_notice(); - } - - /** - * Display error notice when connection to SAAS fails - * - * @return void - */ - public function display_saas_error_notice() { - $this->settings->display_saas_error_notice(); - } - - - /** - * Display admin notice when detecting any missed Action scheduler tables. - * - * @since 3.11.0.3 - * - * @return void - */ - public function display_as_missed_tables_notice() { - $screen = get_current_screen(); - - if ( isset( $screen->id ) && 'tools_page_action-scheduler' === $screen->id ) { - return; - } - - if ( $this->is_valid_as_tables() ) { - return; - } - - $this->settings->display_as_missed_tables_notice(); - } - - /** - * Adds the notice end time to WP Rocket localize script data - * - * @since 3.11 - * - * @param array $data Localize script data. - * @return array - */ - public function add_localize_script_data( $data ): array { - return $this->settings->add_localize_script_data( $data ); - } - - /** - * Clear UsedCSS for the current URL. + * Clean UsedCSS for the current URL. * * @return void */ - public function clear_url_usedcss() { - check_admin_referer( 'rocket_clear_usedcss_url' ); - + public function clean_url() { if ( ! current_user_can( 'rocket_remove_unused_css' ) ) { wp_nonce_ays( '' ); } @@ -480,20 +321,6 @@ public function clear_url_usedcss() { } $this->used_css->clear_url_usedcss( $url ); - - wp_safe_redirect( esc_url_raw( wp_get_referer() ) ); - rocket_get_constant( 'WP_ROCKET_IS_TESTING', false ) ? wp_die() : exit; - } - - /** - * Add clear UsedCSS adminbar item. - * - * @param WP_Admin_Bar $wp_admin_bar Adminbar object. - * - * @return void - */ - public function add_clear_usedcss_bar_item( WP_Admin_Bar $wp_admin_bar ) { - $this->used_css->add_clear_usedcss_bar_item( $wp_admin_bar ); } /** @@ -590,12 +417,12 @@ public function maybe_set_processing_transient( $old_value, $value ) { */ private function set_notice_transient() { set_transient( - 'rocket_rucss_processing', + 'rocket_saas_processing', time() + 90, 1.5 * MINUTE_IN_SECONDS ); - rocket_renew_box( 'rucss_success_notice' ); + rocket_renew_box( 'saas_success_notice' ); } /** @@ -745,16 +572,16 @@ public function maybe_delete_transient( $old_value, $value ) { } /** - * Checks if the RUCSS deletion is enabled. + * Checks if the SaaS deletion is enabled. * * @return bool */ protected function is_deletion_enabled(): bool { /** - * Filters the enable RUCSS deletion value + * Filters the enable SaaS deletion value * - * @param bool $delete_rucss True to enable deletion, false otherwise. + * @param bool $delete_saas_jobs True to enable deletion, false otherwise. */ - return (bool) apply_filters( 'rocket_rucss_deletion_enabled', true ); + return (bool) apply_filters( 'rocket_saas_deletion_enabled', true ); } } diff --git a/inc/Engine/Optimization/RUCSS/Context/RUCSSContextSaas.php b/inc/Engine/Optimization/RUCSS/Context/RUCSSContextSaas.php new file mode 100644 index 0000000000..9e192731dd --- /dev/null +++ b/inc/Engine/Optimization/RUCSS/Context/RUCSSContextSaas.php @@ -0,0 +1,23 @@ +run_common_checks( [ 'option' => 'remove_unused_css' ] ); + + if ( ! $is_allowed ) { + return false; + } + + return true; + } +} diff --git a/inc/Engine/Optimization/RUCSS/Context/RUCSSOptimizeContext.php b/inc/Engine/Optimization/RUCSS/Context/RUCSSOptimizeContext.php index 9413ac06d3..c2a8126cc4 100644 --- a/inc/Engine/Optimization/RUCSS/Context/RUCSSOptimizeContext.php +++ b/inc/Engine/Optimization/RUCSS/Context/RUCSSOptimizeContext.php @@ -10,6 +10,7 @@ class RUCSSOptimizeContext extends AbstractContext { * Check if the operation is allowed. * * @param array $data Data to provide to the context. + * * @return bool */ public function is_allowed( array $data = [] ): bool { @@ -21,18 +22,10 @@ public function is_allowed( array $data = [] ): bool { ] ); - if ( 'local' === wp_get_environment_type() ) { - return false; - } - if ( ! current_user_can( 'rocket_remove_unused_css' ) ) { return false; } - if ( is_admin() ) { - return false; - } - if ( ! $is_allowed ) { return false; } diff --git a/inc/Engine/Optimization/RUCSS/Controller/UsedCSS.php b/inc/Engine/Optimization/RUCSS/Controller/UsedCSS.php index fd78a1ce54..24be25a08c 100644 --- a/inc/Engine/Optimization/RUCSS/Controller/UsedCSS.php +++ b/inc/Engine/Optimization/RUCSS/Controller/UsedCSS.php @@ -4,24 +4,16 @@ namespace WP_Rocket\Engine\Optimization\RUCSS\Controller; use WP_Rocket\Admin\Options_Data; -use WP_Rocket\Engine\Common\Clock\WPRClock; use WP_Rocket\Engine\Common\Context\ContextInterface; -use WP_Rocket\Engine\Common\Queue\QueueInterface; use WP_Rocket\Engine\Optimization\CSSTrait; use WP_Rocket\Engine\Optimization\DynamicLists\DefaultLists\DataManager; use WP_Rocket\Engine\Optimization\RegexTrait; use WP_Rocket\Engine\Optimization\RUCSS\Database\Queries\UsedCSS as UsedCSS_Query; -use WP_Rocket\Engine\Optimization\RUCSS\Frontend\APIClient; -use WP_Admin_Bar; -use WP_Rocket\Engine\Optimization\RUCSS\Strategy\Factory\StrategyFactory; -use WP_Rocket\Logger\LoggerAware; -use WP_Rocket\Logger\LoggerAwareInterface; +use WP_Rocket\Engine\Common\JobManager\Managers\ManagerInterface; - -class UsedCSS implements LoggerAwareInterface { +class UsedCSS { use RegexTrait; use CSSTrait; - use LoggerAware; /** * UsedCss Query instance. @@ -37,20 +29,6 @@ class UsedCSS implements LoggerAwareInterface { */ protected $options; - /** - * APIClient instance - * - * @var APIClient - */ - private $api; - - /** - * Queue instance. - * - * @var QueueInterface - */ - private $queue; - /** * DataManager instance * @@ -72,13 +50,6 @@ class UsedCSS implements LoggerAwareInterface { */ protected $context; - /** - * RUCSS optimize url context. - * - * @var ContextInterface - */ - protected $optimize_url_context; - /** * External exclusions list, can be urls or attributes. * @@ -101,55 +72,36 @@ class UsedCSS implements LoggerAwareInterface { private $inline_content_exclusions = []; /** - * Retry Strategy Factory + * Above the fold Job Manager. * - * @var StrategyFactory + * @var ManagerInterface */ - protected $strategy_factory; - - /** - * Clock instance. - * - * @var WPRClock - */ - protected $wpr_clock; + private $manager; /** * Instantiate the class. * * @param Options_Data $options Options instance. * @param UsedCSS_Query $used_css_query Usedcss Query instance. - * @param APIClient $api APIClient instance. - * @param QueueInterface $queue Queue instance. * @param DataManager $data_manager DataManager instance. * @param Filesystem $filesystem Filesystem instance. * @param ContextInterface $context RUCSS context. - * @param ContextInterface $optimize_url_context RUCSS optimize url context. - * @param StrategyFactory $strategy_factory Strategy Factory used for RUCSS retry process. - * @param WPRClock $clock Clock object instance. + * @param ManagerInterface $manager RUCSS manager. */ public function __construct( Options_Data $options, UsedCSS_Query $used_css_query, - APIClient $api, - QueueInterface $queue, DataManager $data_manager, Filesystem $filesystem, ContextInterface $context, - ContextInterface $optimize_url_context, - StrategyFactory $strategy_factory, - WPRClock $clock + ManagerInterface $manager ) { - $this->options = $options; - $this->used_css_query = $used_css_query; - $this->api = $api; - $this->queue = $queue; - $this->data_manager = $data_manager; - $this->filesystem = $filesystem; - $this->context = $context; - $this->optimize_url_context = $optimize_url_context; - $this->strategy_factory = $strategy_factory; - $this->wpr_clock = $clock; + $this->options = $options; + $this->used_css_query = $used_css_query; + $this->data_manager = $data_manager; + $this->filesystem = $filesystem; + $this->context = $context; + $this->manager = $manager; } /** @@ -189,7 +141,7 @@ public function treeshake( string $html ): string { $used_css = $this->used_css_query->get_row( $url, $is_mobile ); if ( empty( $used_css ) ) { - $this->add_url_to_the_queue( $url, $is_mobile ); + $this->manager->add_url_to_the_queue( $url, $is_mobile ); return $html; } @@ -213,22 +165,6 @@ public function treeshake( string $html ): string { return $html; } - /** - * Send the request to add url into the queue. - * - * @param string $url page URL. - * @param bool $is_mobile page is for mobile. - * - * @return void - */ - public function add_url_to_the_queue( string $url, bool $is_mobile ) { - $used_css_row = $this->used_css_query->get_row( $url, $is_mobile ); - if ( empty( $used_css_row ) ) { - $this->used_css_query->create_new_job( $url, '', '', $is_mobile ); - return; - } - $this->used_css_query->reset_job( (int) $used_css_row->id ); - } /** * Delete used css based on URL. * @@ -470,235 +406,6 @@ private function is_mobile(): bool { && wp_is_mobile(); } - /** - * Check if current page is the home page. - * - * @param string $url Current page url. - * - * @return bool - */ - private function is_home( string $url ): bool { - /** - * Filters the home url. - * - * @since 3.11.4 - * - * @param string $home_url home url. - * @param string $url url of current page. - */ - $home_url = apply_filters( 'rocket_rucss_is_home_url', home_url(), $url ); - return untrailingslashit( $url ) === untrailingslashit( $home_url ); - } - - /** - * Process pending jobs inside cron iteration. - * - * @return void - */ - public function process_pending_jobs() { - /** - * Fires at the start of the process pending jobs. - * - * @param string $current_time Current time. - */ - - do_action( 'rocket_rucss_process_pending_jobs_start', $this->wpr_clock->current_time( 'mysql', true ) ); - $this->logger::debug( 'RUCSS: Start processing pending jobs inside cron.' ); - - if ( ! $this->is_enabled() ) { - $this->logger::debug( 'RUCSS: Stop processing cron iteration because option is disabled.' ); - - return; - } - - // Get some items from the DB with status=pending & job_id isn't empty. - - /** - * Filters the pending jobs count. - * - * @since 3.11 - * - * @param int $rows Number of rows to grab with each CRON iteration. - */ - $rows = apply_filters( 'rocket_rucss_pending_jobs_cron_rows_count', 100 ); - - $this->logger::debug( "RUCSS: Start getting number of {$rows} pending jobs." ); - - $pending_jobs = $this->used_css_query->get_pending_jobs( $rows ); - if ( ! $pending_jobs ) { - $this->logger::debug( 'RUCSS: No pending jobs are there.' ); - - return; - } - - foreach ( $pending_jobs as $used_css_row ) { - $current_time = $this->wpr_clock->current_time( 'timestamp', true ); - if ( strtotime( $used_css_row->next_retry_time ) < $current_time ) { - $this->logger::debug( "RUCSS: Send the job for url {$used_css_row->url} to Async task to check its job status." ); - - // Change status to in-progress. - $this->used_css_query->make_status_inprogress( (int) $used_css_row->id ); - $this->queue->add_job_status_check_async( (int) $used_css_row->id ); - } - } - - /** - * Fires at the end of the process pending jobs. - * - * @param string $current_time Current time. - */ - do_action( 'rocket_rucss_process_pending_jobs_end', $this->wpr_clock->current_time( 'mysql', true ) ); - } - - /** - * Check job status by DB row ID. - * - * @param int $id DB Row ID. - * - * @return void - */ - public function check_job_status( int $id ) { - $this->logger::debug( 'RUCSS: Start checking job status for row ID: ' . $id ); - - $row_details = $this->used_css_query->get_item( $id ); - if ( ! $row_details ) { - $this->logger::debug( 'RUCSS: Row ID not found ', compact( 'id' ) ); - - // Nothing in DB, bailout. - return; - } - - // Send the request to get the job status from SaaS. - $job_details = $this->api->get_queue_job_status( $row_details->job_id, $row_details->queue_name, $this->is_home( $row_details->url ) ); - - /** - * Filters the rocket min rucss css result size. - * - * @since 3.13.3 - * - * @param int min size. - */ - $min_rucss_size = apply_filters( 'rocket_min_rucss_size', 150 ); - if ( ! is_numeric( $min_rucss_size ) ) { - $min_rucss_size = 150; - } - - if ( isset( $job_details['contents']['shakedCSS_size'] ) && intval( $job_details['contents']['shakedCSS_size'] ) < $min_rucss_size ) { - $message = 'RUCSS: shakedCSS size is less than ' . $min_rucss_size; - $this->logger::error( $message ); - $this->used_css_query->make_status_failed( $id, '500', $message ); - return; - } - - if ( - 200 !== (int) $job_details['code'] - ) { - $this->logger::debug( 'RUCSS: Job status failed for url: ' . $row_details->url, $job_details ); - $this->strategy_factory->manage( $row_details, $job_details ); - - return; - } - /** - * Unlock preload URL. - * - * @param string $url URL to unlock - */ - do_action( 'rocket_preload_unlock_url', $row_details->url ); - - $css = $this->apply_font_display_swap( $job_details['contents']['shakedCSS'] ); - - /** - * RUCSS hash. - * - * @param string $hash RUCSS hash. - * @param string $css RUCSS content. - * @param UsedCSSRow $row_details Job details. - */ - $hash = (string) apply_filters( 'rocket_rucss_hash', md5( $css ), $css, $row_details ); - - if ( ! $this->filesystem->write_used_css( $hash, $css ) ) { - $message = 'RUCSS: Could not write used CSS to the filesystem: ' . $row_details->url; - $this->logger::error( $message ); - $this->used_css_query->make_status_failed( $id, '', $message ); - - return; - } - - // Everything is fine, save the usedcss into DB, change status to completed and reset queue_name and job_id. - $this->logger::debug( 'RUCSS: Save used CSS for url: ' . $row_details->url ); - - $this->used_css_query->make_status_completed( $id, $hash ); - - /** - * Fires after successfully saving the used CSS for an URL - * - * @param string $current_time Current time. - */ - do_action( 'rocket_rucss_check_job_status_end', $this->wpr_clock->current_time( 'mysql', true ) ); - - /** - * Fires after successfully saving the used CSS for an URL - * - * @param string $url URL used to generated the used CSS. - * @param array $job_details Result of the request to get the job status from SaaS. - */ - do_action( 'rocket_rucss_complete_job_status', $row_details->url, $job_details ); - } - - /** - * Add clear UsedCSS adminbar item. - * - * @param WP_Admin_Bar $wp_admin_bar Adminbar object. - * - * @return void - */ - public function add_clear_usedcss_bar_item( WP_Admin_Bar $wp_admin_bar ) { - global $post; - - if ( ! $this->optimize_url_context->is_allowed() ) { - return; - } - - /** - * Filters the rocket `clear used css of this url` option on admin bar menu. - * - * @since 3.12.1 - * - * @param bool $should_skip Should skip adding `clear used css of this url` option in admin bar. - * @param type $post Post object. - */ - if ( apply_filters( 'rocket_skip_admin_bar_clear_used_css_option', false, $post ) ) { - return; - } - - $referer = ''; - $action = 'rocket_clear_usedcss_url'; - - if ( ! empty( $_SERVER['REQUEST_URI'] ) ) { - $referer_url = filter_var( wp_unslash( $_SERVER['REQUEST_URI'] ), FILTER_SANITIZE_URL ); - - /** - * Filters to act on the referer url for the admin bar. - * - * @param string $uri Current uri - */ - $referer = (string) apply_filters( 'rocket_admin_bar_referer', esc_url( $referer_url ) ); - $referer = '&_wp_http_referer=' . rawurlencode( remove_query_arg( 'fl_builder', $referer ) ); - } - - /** - * Clear usedCSS for this URL (frontend). - */ - $wp_admin_bar->add_menu( - [ - 'parent' => 'wp-rocket', - 'id' => 'clear-usedcss-url', - 'title' => __( 'Clear Used CSS of this URL', 'rocket' ), - 'href' => wp_nonce_url( admin_url( 'admin-post.php?action=' . $action . $referer ), $action ), - ] - ); - } - /** * Clear specific url. * @@ -728,59 +435,6 @@ public function get_not_completed_count() { return $this->used_css_query->get_not_completed_count(); } - /** - * Clear failed urls. - * - * @return void - */ - public function clear_failed_urls() { - /** - * Delay before failed rucss jobs are deleted. - * - * @param string $delay delay before failed rucss jobs are deleted. - */ - $delay = (string) apply_filters( 'rocket_delay_remove_rucss_failed_jobs', '3 days' ); - - if ( '' === $delay || '0' === $delay ) { - $delay = '3 days'; - } - $parts = explode( ' ', $delay ); - - $value = 3; - $unit = 'days'; - - if ( count( $parts ) === 2 && $parts[0] >= 0 ) { - $value = (float) $parts[0]; - $unit = $parts[1]; - } - $rows = $this->used_css_query->get_failed_rows( $value, $unit ); - - if ( empty( $rows ) ) { - return; - } - - $failed_urls = []; - - foreach ( $rows as $row ) { - $failed_urls[] = $row->url; - - $id = (int) $row->id; - - if ( empty( $id ) ) { - continue; - } - - $this->add_url_to_the_queue( $row->url, (bool) $row->is_mobile ); - } - - /** - * Fires after clearing failed urls. - * - * @param array $urls Failed urls. - */ - do_action( 'rocket_rucss_after_clearing_failed_url', $failed_urls ); - } - /** * Add preload links for the fonts in the used CSS * @@ -1035,121 +689,4 @@ static function ( $item ) { public function has_one_completed_row_at_least() { return $this->used_css_query->get_completed_count() > 0; } - - /** - * Process on submit jobs. - * - * @return void - */ - public function process_on_submit_jobs() { - /** - * Fires at the start of the process on submit jobs. - * - * @param string $current_time Current time. - */ - do_action( 'rocket_rucss_process_on_submit_jobs_start', $this->wpr_clock->current_time( 'mysql', true ) ); - if ( ! $this->is_enabled() ) { - $this->logger::debug( 'RUCSS: Stop processing cron iteration because option is disabled.' ); - - return; - } - - /** - * Pending rows cont. - * - * @param int $count Number of rows. - */ - $pending_job = (int) apply_filters( 'rocket_rucss_pending_jobs_cron_rows_count', 100 ); - - /** - * Maximum processing rows. - * - * @param int $max Max processing rows. - */ - $max_pending_rows = (int) apply_filters( 'rocket_rucss_max_pending_jobs', 3 * $pending_job, $pending_job ); - $rows = $this->used_css_query->get_on_submit_jobs( $max_pending_rows ); - - foreach ( $rows as $row ) { - $response = $this->send_api( $row->url, (bool) $row->is_mobile ); - if ( false === $response || ! isset( $response['contents'], $response['contents']['jobId'], $response['contents']['queueName'] ) ) { - - $this->used_css_query->make_status_failed( (int) $row->id, '', '' ); - continue; - } - - /** - * Lock preload URL. - * - * @param string $url URL to lock - */ - do_action( 'rocket_preload_lock_url', $row->url ); - - $this->used_css_query->make_status_pending( - (int) $row->id, - $response['contents']['jobId'], - $response['contents']['queueName'], - (bool) $row->is_mobile - ); - } - - /** - * Fires at the end of the process on submit jobs. - * - * @param string $current_time Current time. - */ - do_action( 'rocket_rucss_process_on_submit_jobs_end', $this->wpr_clock->current_time( 'mysql', true ) ); - } - - /** - * Send the job to the API. - * - * @param string $url URL to work on. - * @param bool $is_mobile Is the page for mobile. - * @return array|false - */ - protected function send_api( string $url, bool $is_mobile ) { - /** - * Filters the RUCSS safelist - * - * @since 3.11 - * - * @param array $safelist Array of safelist values. - */ - $safelist = apply_filters( 'rocket_rucss_safelist', $this->options->get( 'remove_unused_css_safelist', [] ) ); - - /** - * Filters the styles attributes to be skipped (blocked) by RUCSS. - * - * @since 3.14 - * - * @param array $skipped_attr Array of safelist values. - */ - $skipped_attr = apply_filters( 'rocket_rucss_skip_styles_with_attr', [] ); - $skipped_attr = ( is_array( $skipped_attr ) ) ? $skipped_attr : []; - - $config = [ - 'treeshake' => 1, - 'rucss_safelist' => $safelist, - 'skip_attr' => $skipped_attr, - 'is_mobile' => $is_mobile, - 'is_home' => $this->is_home( $url ), - ]; - - $add_to_queue_response = $this->api->add_to_queue( $url, $config ); - if ( 200 !== $add_to_queue_response['code'] ) { - $this->logger::error( - 'Error when contacting the RUCSS API.', - [ - 'rucss error', - 'url' => $url, - 'code' => $add_to_queue_response['code'], - 'message' => $add_to_queue_response['message'], - ] - ); - - return false; - } - - return $add_to_queue_response; - } } diff --git a/inc/Engine/Optimization/RUCSS/Cron/Subscriber.php b/inc/Engine/Optimization/RUCSS/Cron/Subscriber.php index 4a772022ac..82a3b6b583 100644 --- a/inc/Engine/Optimization/RUCSS/Cron/Subscriber.php +++ b/inc/Engine/Optimization/RUCSS/Cron/Subscriber.php @@ -4,34 +4,33 @@ namespace WP_Rocket\Engine\Optimization\RUCSS\Cron; use WP_Rocket\Event_Management\Subscriber_Interface; -use WP_Rocket\Engine\Common\Queue\RUCSSQueueRunner; -use WP_Rocket\Engine\Optimization\RUCSS\Admin\Database; -use WP_Rocket\Engine\Optimization\RUCSS\Controller\UsedCSS; +use WP_Rocket\Engine\Common\JobManager\JobProcessor; +use WP_Rocket\Engine\Optimization\RUCSS\Database\Queries\UsedCSS as UsedCSS_Query; class Subscriber implements Subscriber_Interface { /** - * UsedCss instance + * JobProcessor instance * - * @var UsedCSS + * @var JobProcessor */ - private $used_css; + private $job_processor; /** - * Database instance + * UsedCss Query instance. * - * @var Database + * @var UsedCSS_Query */ - private $database; + private $used_css_query; /** * Instantiate the class * - * @param UsedCSS $used_css UsedCSS instance. - * @param Database $database Database instance. + * @param JobProcessor $job_processor JobProcessor instance. + * @param UsedCSS_Query $used_css_query Usedcss Query instance. */ - public function __construct( UsedCSS $used_css, Database $database ) { - $this->used_css = $used_css; - $this->database = $database; + public function __construct( JobProcessor $job_processor, UsedCSS_Query $used_css_query ) { + $this->job_processor = $job_processor; + $this->used_css_query = $used_css_query; } /** @@ -41,268 +40,23 @@ public function __construct( UsedCSS $used_css, Database $database ) { */ public static function get_subscribed_events(): array { return [ - 'rocket_rucss_pending_jobs' => 'process_pending_jobs', - 'rocket_rucss_on_submit_jobs' => 'process_on_submit_jobs', - 'rocket_rucss_job_check_status' => 'check_job_status', - 'rocket_rucss_clean_rows_time_event' => 'cron_clean_rows', - 'cron_schedules' => 'add_interval', - 'rocket_deactivation' => 'on_deactivation', - 'rocket_remove_rucss_failed_jobs' => 'cron_remove_failed_jobs', - 'init' => [ - [ 'schedule_clean_not_commonly_used_rows' ], - [ 'schedule_pending_jobs' ], - [ 'initialize_rucss_queue_runner' ], - [ 'schedule_removing_failed_jobs' ], - [ 'schedule_on_submit_jobs' ], - ], + 'rocket_rucss_job_check_status' => 'check_job_status', ]; } /** - * Schedules cron to clean not commonly used RUCSS rows. - * - * @since 3.9 - * - * @return void - */ - public function schedule_clean_not_commonly_used_rows() { - if ( ! $this->used_css->is_enabled() ) { - return; - } - - if ( wp_next_scheduled( 'rocket_rucss_clean_rows_time_event' ) ) { - return; - } - - wp_schedule_event( time(), 'weekly', 'rocket_rucss_clean_rows_time_event' ); - } - - /** - * Initialize the queue runner for our RUCSS. - * - * @return void - */ - public function initialize_rucss_queue_runner() { - if ( ! $this->used_css->is_enabled() ) { - return; - } - - RUCSSQueueRunner::instance()->init(); - } - - /** - * Process pending jobs with Cron iteration. - * - * @return void - */ - public function process_pending_jobs() { - $this->used_css->process_pending_jobs(); - } - - /** - * Process on submit jobs with Cron iteration. - * - * @return void - */ - public function process_on_submit_jobs() { - $this->used_css->process_on_submit_jobs(); - } - - /** - * Cron callback for deleting old rows in both table databases. - * - * @since 3.9 - * - * @return void - */ - public function cron_clean_rows() { - if ( ! $this->is_deletion_enabled() ) { - return; - } - - $this->database->delete_old_used_css(); - } - - /** - * Cron callback for removing failed jobs. - * - * @return void - */ - public function cron_remove_failed_jobs() { - $this->used_css->clear_failed_urls(); - } - - /** - * Handle job status by DB row ID. - * - * @param int $row_id DB Row ID. - * - * @return void - */ - public function check_job_status( int $row_id ) { - $this->used_css->check_job_status( $row_id ); - } - - /** - * Adds new interval for RUCSS pending jobs cron - * - * @since 3.11.3 - * - * @param array[] $schedules An array of non-default cron schedule arrays. - * - * @return array - */ - public function add_interval( $schedules ) { - if ( ! $this->used_css->is_enabled() ) { - return $schedules; - } - - /** - * Filters the cron interval. - * - * @since 3.11 - * - * @param int $interval Interval in seconds. - */ - $interval = apply_filters( 'rocket_rucss_pending_jobs_cron_interval', 1 * rocket_get_constant( 'MINUTE_IN_SECONDS', 60 ) ); - - $schedules['rocket_rucss_pending_jobs'] = [ - 'interval' => $interval, - 'display' => esc_html__( 'WP Rocket Remove Unused CSS pending jobs', 'rocket' ), - ]; - - $default_interval = 3 * rocket_get_constant( 'DAY_IN_SECONDS', 86400 ); - /** - * Filters the cron interval for clearing failed jobs. - * - * @param int $interval Interval in seconds. - */ - $interval = apply_filters( 'rocket_remove_rucss_failed_jobs_cron_interval', $default_interval ); - $interval = (bool) $interval ? $interval : $default_interval; - - $schedules['rocket_remove_rucss_failed_jobs'] = [ - 'interval' => $interval, - 'display' => esc_html__( 'WP Rocket clear Remove Unused CSS failed jobs', 'rocket' ), - ]; - - /** - * Filters the cron interval for processing on submit jobs. - * - * @param int $interval Interval in seconds. - */ - $interval = (int) apply_filters( 'rocket_remove_rucss_on_submit_jobs_cron_interval', 1 * rocket_get_constant( 'MINUTE_IN_SECONDS', 60 ) ); - - $schedules['rocket_rucss_on_submit_jobs'] = [ - 'interval' => $interval, - 'display' => esc_html__( 'WP Rocket procees on submit jobs', 'rocket' ), - ]; - - return $schedules; - } - - /** - * Schedule on submit jobs. - * - * @return void - */ - public function schedule_on_submit_jobs() { - if ( - ! $this->used_css->is_enabled() - && - wp_next_scheduled( 'rocket_rucss_on_submit_jobs' ) - ) { - wp_clear_scheduled_hook( 'rocket_rucss_on_submit_jobs' ); - - return; - } - - if ( ! $this->used_css->is_enabled() ) { - return; - } - - if ( wp_next_scheduled( 'rocket_rucss_on_submit_jobs' ) ) { - return; - } - - wp_schedule_event( time(), 'rocket_rucss_on_submit_jobs', 'rocket_rucss_on_submit_jobs' ); - } - - /** - * Schedules cron to get RUCSS pendings jobs. - * - * @since 3.11.3 + * Handle old rucss job during upgrade from versions < 3.16. * + * @param integer $row_id DB Row ID. * @return void */ - public function schedule_pending_jobs() { - if ( - ! $this->used_css->is_enabled() - && - wp_next_scheduled( 'rocket_rucss_pending_jobs' ) - ) { - wp_clear_scheduled_hook( 'rocket_rucss_pending_jobs' ); + public function check_job_status( int $row_id ): void { + $row = $this->used_css_query->get_row_by_id( $row_id ); + if ( ! $row ) { return; } - if ( ! $this->used_css->is_enabled() ) { - return; - } - - if ( wp_next_scheduled( 'rocket_rucss_pending_jobs' ) ) { - return; - } - - wp_schedule_event( time(), 'rocket_rucss_pending_jobs', 'rocket_rucss_pending_jobs' ); - } - - /** - * Schedules cron to remove failed jobs. - * - * @return void - */ - public function schedule_removing_failed_jobs() { - if ( - ! $this->used_css->is_enabled() - && - wp_next_scheduled( 'rocket_remove_rucss_failed_jobs' ) - ) { - wp_clear_scheduled_hook( 'rocket_remove_rucss_failed_jobs' ); - - return; - } - - if ( ! $this->used_css->is_enabled() ) { - return; - } - - if ( wp_next_scheduled( 'rocket_remove_rucss_failed_jobs' ) ) { - return; - } - - wp_schedule_event( time(), 'rocket_remove_rucss_failed_jobs', 'rocket_remove_rucss_failed_jobs' ); - } - - /** - * Clear schedule of RUCSS CRONs on deactivation. - * - * @return void - */ - public function on_deactivation() { - wp_clear_scheduled_hook( 'action_scheduler_run_queue_rucss', [ 'WP Cron' ] ); - } - - /** - * Checks if the RUCSS deletion is enabled. - * - * @return bool - */ - protected function is_deletion_enabled(): bool { - /** - * Filters the enable RUCSS deletion value - * - * @param bool $delete_rucss True to enable deletion, false otherwise. - */ - return (bool) apply_filters( 'rocket_rucss_deletion_enabled', true ); + $this->job_processor->check_job_status( $row->url, $row->is_mobile, 'rucss' ); } } diff --git a/inc/Engine/Optimization/RUCSS/Database/Queries/UsedCSS.php b/inc/Engine/Optimization/RUCSS/Database/Queries/UsedCSS.php index cf6024e128..89ed6188bf 100644 --- a/inc/Engine/Optimization/RUCSS/Database/Queries/UsedCSS.php +++ b/inc/Engine/Optimization/RUCSS/Database/Queries/UsedCSS.php @@ -2,14 +2,14 @@ namespace WP_Rocket\Engine\Optimization\RUCSS\Database\Queries; -use WP_Rocket\Dependencies\Database\Query; +use WP_Rocket\Engine\Common\Database\Queries\AbstractQuery; use WP_Rocket\Engine\Optimization\RUCSS\Database\Row\UsedCSS as UsedCSSRow; use WP_Rocket\Engine\Optimization\RUCSS\Database\Schemas\UsedCSS as UsedCSSSchema; /** * RUCSS UsedCSS Query. */ -class UsedCSS extends Query { +class UsedCSS extends AbstractQuery { /** * Name of the database table to query. @@ -69,332 +69,41 @@ class UsedCSS extends Query { */ protected $item_shape = UsedCSSRow::class; - /** - * Table status. - * - * @var boolean - */ - public static $table_exists = false; - - /** - * Get pending jobs. - * - * @param int $count Number of rows. - * - * @return array - */ - public function get_pending_jobs( int $count = 100 ) { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return []; - } - - $inprogress_count = $this->query( - [ - 'count' => true, - 'status' => 'in-progress', - ] - ); - - if ( $inprogress_count >= $count ) { - return []; - } - - return $this->query( - [ - 'number' => ( $count - $inprogress_count ), - 'status' => 'pending', - 'fields' => [ - 'id', - 'url', - 'next_retry_time', - ], - 'job_id__not_in' => [ - 'not_in' => '', - ], - 'orderby' => 'modified', - 'order' => 'asc', - ] - ); - } - - /** - * Fetch on submit jobs. - * - * @param int $count Number of jobs to fetch. - * @return array|int - */ - public function get_on_submit_jobs( int $count = 100 ) { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return []; - } - - $in_progress_count = $this->query( - [ - 'count' => true, - 'status' => [ 'in-progress' ], - ] - ); - $pending_count = $this->query( - [ - 'count' => true, - 'status' => [ 'pending' ], - ] - ); - - $processing_count = $in_progress_count + $pending_count; - - if ( 0 !== $count && $processing_count >= $count ) { - return []; - } - - $query_params = [ - 'status' => 'to-submit', - 'orderby' => 'modified', - 'order' => 'asc', - ]; - - if ( 0 !== $count ) { - $query_params['number'] = ( $count - $processing_count ); - } - - return $this->query( $query_params ); - } - - /** - * Increment retries number and change status back to pending. - * - * @param int $id DB row ID. - * @param int $error_code error code. - * @param string $error_message error message. - * - * @return bool - */ - public function increment_retries( $id, int $error_code, string $error_message ) { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return false; - } - - $old = $this->get_item( $id ); - - $retries = 0; - $previous_message = ''; - - if ( $old ) { - $retries = $old->retries; - $previous_message = $old->error_message; - } - - $update_data = [ - 'retries' => $retries + 1, - 'status' => 'pending', - 'error_message' => $previous_message . ' - ' . current_time( 'mysql', true ) . " {$error_code}: {$error_message}", - ]; - - return $this->update_item( $id, $update_data ); - } - - /** - * Update Job ID. - * - * @param int $id DB row ID. - * @param int $new_job_id new job id. - * - * @return bool - */ - public function update_job_id( $id, $new_job_id ) { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return false; - } - - $update_data['job_id'] = $new_job_id; - return $this->update_item( $id, $update_data ); - } - - /** - * Create new DB row for specific url. - * - * @param string $url Current page url. - * @param string $job_id API job_id. - * @param string $queue_name API Queue name. - * @param bool $is_mobile if the request is for mobile page. - * - * @return bool - */ - public function create_new_job( string $url, string $job_id = '', string $queue_name = '', bool $is_mobile = false ) { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return false; - } - - $item = [ - 'url' => untrailingslashit( $url ), - 'is_mobile' => $is_mobile, - 'job_id' => $job_id, - 'queue_name' => $queue_name, - 'status' => 'to-submit', - 'retries' => 0, - 'last_accessed' => current_time( 'mysql', true ), - ]; - - $result = $this->add_item( $item ); - - /** - * Fires after a new job has been added. - * - * @param mixed $is_success New job status: ID of inserted row if successfully added; false otherwise. - * @param string $timestamp Current timestamp. - */ - do_action( 'rocket_last_rucss_job_added_time', $result, current_time( 'mysql', true ) ); - - return $result; - } - - /** - * Change the status to be in-progress. - * - * @param int $id DB row ID. - * - * @return bool - */ - public function make_status_inprogress( int $id ) { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return false; - } - - return $this->update_item( - $id, - [ - 'status' => 'in-progress', - ] - ); - } - - /** - * Reset the job and add new job_id pending. - * - * @param int $id DB row ID. - * @param string $job_id API job_id. - * - * @return bool - */ - public function reset_job( int $id, string $job_id = '' ) { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return false; - } - - return $this->update_item( - $id, - [ - 'job_id' => $job_id, - 'status' => 'to-submit', - 'error_code' => '', - 'error_message' => '', - 'retries' => 0, - 'modified' => current_time( 'mysql', true ), - 'submitted_at' => current_time( 'mysql', true ), - ] - ); - } - - /** - * Change the status to be failed. - * - * @param int $id DB row ID. - * @param string $error_code error code. - * @param string $error_message error message. - * - * @return bool - */ - public function make_status_failed( int $id, string $error_code, string $error_message ) { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return false; - } - - $old = $this->get_item( $id ); - - $previous_message = $old ? $old->error_message : ''; - - return $this->update_item( - $id, - [ - 'status' => 'failed', - 'error_code' => $error_code, - 'error_message' => $previous_message . ' - ' . current_time( 'mysql', true ) . " {$error_code}: {$error_message}", - ] - ); - } - /** * Complete a job. * - * @param int $id DB row ID. - * @param string $hash Hash. + * @param string $url Url from DB row. + * @param boolean $is_mobile Is mobile from DB row. + * @param string $hash Hash. * * @return bool */ - public function make_status_completed( int $id, string $hash = '' ) { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return false; - } - - return $this->update_item( - $id, - [ - 'hash' => $hash, - 'status' => 'completed', - ] - ); - } - - /** - * Get Used CSS for specific url. - * - * @param string $url Page Url. - * @param bool $is_mobile if the request is for mobile page. - * - * @return false|mixed - */ - public function get_row( string $url, bool $is_mobile = false ) { + public function make_status_completed( string $url, bool $is_mobile, string $hash = '' ) { if ( ! self::$table_exists && ! $this->table_exists() ) { return false; } - $query = $this->query( - [ - 'url' => untrailingslashit( $url ), - 'is_mobile' => $is_mobile, - ] - ); + // Get the database interface. + $db = $this->get_db(); - if ( empty( $query[0] ) ) { + // Bail if no database interface is available. + if ( empty( $db ) ) { return false; } - return $query[0]; - } - - /** - * Get all rows with the same url (desktop and mobile versions). - * - * @param string $url Page url. - * - * @return array|false - */ - public function get_rows_by_url( string $url ) { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return false; - } + $prefixed_table_name = $db->prefix . $this->table_name; - $query = $this->query( - [ - 'url' => untrailingslashit( $url ), - ] - ); + $data = [ + 'hash' => $hash, + 'status' => 'completed', + ]; - if ( empty( $query ) ) { - return false; - } + $where = [ + 'url' => untrailingslashit( $url ), + 'is_mobile' => $is_mobile, + ]; - return $query; + return $db->update( $prefixed_table_name, $data, $where ); } /** @@ -416,247 +125,4 @@ public function count_rows_by_hash( string $hash ): int { ] ); } - - /** - * Update UsedCSS Row last_accessed date to current date. - * - * @param int $id Used CSS id. - * - * @return bool - */ - public function update_last_accessed( int $id ): bool { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return false; - } - - return (bool) $this->update_item( - $id, - [ - 'last_accessed' => current_time( 'mysql', true ), - ] - ); - } - - /** - * Delete DB row by url. - * - * @param string $url Page url to be deleted. - * - * @return bool - */ - public function delete_by_url( string $url ) { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return false; - } - - $items = $this->get_rows_by_url( $url ); - - if ( ! $items ) { - return false; - } - - $deleted = true; - foreach ( $items as $item ) { - $deleted = $deleted && $this->delete_item( $item->id ); - } - - return $deleted; - } - - /** - * Get the count of not completed rows. - * - * @return int - */ - public function get_not_completed_count() { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return 0; - } - - return $this->query( - [ - 'count' => true, - 'status__in' => [ 'pending', 'in-progress' ], - ] - ); - } - - /** - * Get the count of completed rows. - * - * @return int - */ - public function get_completed_count() { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return 0; - } - - return $this->query( - [ - 'count' => true, - 'status' => 'completed', - ] - ); - } - - /** - * Get all failed rows. - * - * @param float $delay delay before the urls are deleted. - * @param string $unit unit from the delay. - * @return array|false - */ - public function get_failed_rows( float $delay = 3, string $unit = 'days' ) { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return false; - } - - $query = $this->query( - [ - 'status' => 'failed', - 'date_query' => [ - [ - 'column' => 'modified', - 'before' => "$delay $unit ago", - 'inclusive' => true, - ], - ], - ], - false - ); - - if ( empty( $query ) ) { - return false; - } - - return $query; - } - - /** - * Revert status to pending. - * - * @param integer $id Used CSS id. - * @return boolean - */ - public function revert_to_pending( int $id ): bool { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return false; - } - - return (bool) $this->update_item( - $id, - [ - 'error_code' => '', - 'error_message' => '', - 'retries' => 0, - 'status' => 'pending', - 'modified' => current_time( 'mysql', true ), - ] - ); - } - - /** - * Returns the current status of `wpr_rucss_used_css` table; true if it exists, false otherwise. - * - * @return boolean - */ - private function table_exists(): bool { - - if ( self::$table_exists ) { - return true; - } - - // Get the database interface. - $db = $this->get_db(); - - // Bail if no database interface is available. - if ( empty( $db ) ) { - return false; - } - - // Query statement. - $query = 'SHOW TABLES LIKE %s'; - $like = $db->esc_like( $db->{$this->table_name} ); - $prepared = $db->prepare( $query, $like ); - $result = $db->get_var( $prepared ); - - // Does the table exist? - $exists = $this->is_success( $result ); - - if ( $exists ) { - self::$table_exists = $exists; - } - - return $exists; - } - - /** - * Update the error message. - * - * @param int $job_id Job ID. - * @param int $code Response code. - * @param string $message Response message. - * @param string $previous_message Previous saved message. - * - * @return bool - */ - public function update_message( int $job_id, int $code, string $message, string $previous_message = '' ): bool { - return $this->update_item( - $job_id, - [ - 'error_message' => $previous_message . ' - ' . current_time( 'mysql', true ) . " {$code}: {$message}", - ] - ); - } - - /** - * Updates the next_retry_time field - * - * @param mixed $job_id the job id. - * @param string|int $next_retry_time timestamp or mysql format date. - * - * @return bool either it is saved or not. - */ - public function update_next_retry_time( $job_id, $next_retry_time ): bool { - if ( is_string( $next_retry_time ) && strtotime( $next_retry_time ) ) { - // If $next_retry_time is a valid date string, convert it to a timestamp. - $next_retry_time = strtotime( $next_retry_time ); - } elseif ( ! is_numeric( $next_retry_time ) ) { - // If it's not numeric and not a valid date string, return false. - return false; - } - - return $this->update_item( - $job_id, - [ - 'next_retry_time' => gmdate( 'Y-m-d H:i:s', $next_retry_time ), - ] - ); - } - - /** - * Change the status to be pending. - * - * @param int $id DB row ID. - * @param string $job_id API job_id. - * @param string $queue_name API Queue name. - * @param bool $is_mobile if the request is for mobile page. - * @return bool - */ - public function make_status_pending( int $id, string $job_id = '', string $queue_name = '', bool $is_mobile = false ) { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return false; - } - - return $this->update_item( - $id, - [ - 'job_id' => $job_id, - 'queue_name' => $queue_name, - 'status' => 'pending', - 'is_mobile' => $is_mobile, - 'submitted_at' => current_time( 'mysql', true ), - ] - ); - } } diff --git a/inc/Engine/Optimization/RUCSS/Database/Tables/UsedCSS.php b/inc/Engine/Optimization/RUCSS/Database/Tables/UsedCSS.php index 18eaac6477..6bf714a8bf 100644 --- a/inc/Engine/Optimization/RUCSS/Database/Tables/UsedCSS.php +++ b/inc/Engine/Optimization/RUCSS/Database/Tables/UsedCSS.php @@ -2,12 +2,12 @@ namespace WP_Rocket\Engine\Optimization\RUCSS\Database\Tables; -use WP_Rocket\Dependencies\Database\Table; +use WP_Rocket\Engine\Common\Database\Tables\AbstractTable; /** * RUCSS UsedCSS Table. */ -class UsedCSS extends Table { +class UsedCSS extends AbstractTable { /** * Table name @@ -46,98 +46,34 @@ class UsedCSS extends Table { ]; /** - * Instantiate class. - */ - public function __construct() { - parent::__construct(); - add_action( 'admin_init', [ $this, 'maybe_trigger_recreate_table' ], 9 ); - add_action( 'init', [ $this, 'maybe_upgrade' ] ); - } - - /** - * Setup the database schema - * - * @return void - */ - protected function set_schema() { - $this->schema = " - id bigint(20) unsigned NOT NULL AUTO_INCREMENT, - url varchar(2000) NOT NULL default '', - css longtext default NULL, - hash varchar(32) default '', - error_code varchar(32) NULL default NULL, - error_message longtext NULL default NULL, - unprocessedcss longtext NULL, - retries tinyint(1) NOT NULL default 1, - is_mobile tinyint(1) NOT NULL default 0, - job_id varchar(255) NOT NULL default '', - queue_name varchar(255) NOT NULL default '', - status varchar(255) NOT NULL default '', - modified timestamp NOT NULL default '0000-00-00 00:00:00', - last_accessed timestamp NOT NULL default '0000-00-00 00:00:00', - submitted_at timestamp NULL, - next_retry_time timestamp NOT NULL default '0000-00-00 00:00:00', - PRIMARY KEY (id), - KEY url (url(150), is_mobile), - KEY modified (modified), - KEY last_accessed (last_accessed), - INDEX `status_index` (`status`(191)), - INDEX `error_code_index` (`error_code`(32)), - KEY hash (hash)"; - } - - /** - * Delete all used_css which were not accessed in the last month. + * Table schema data. * - * @return bool|int + * @var string */ - public function delete_old_used_css() { - // Get the database interface. - $db = $this->get_db(); - - // Bail if no database interface is available. - if ( empty( $db ) ) { - return false; - } - - /** - * Filters the old RUCSS deletion interval - * - * @param int $delete_interval Old RUCSS deletion interval in months - */ - $delete_interval = (int) apply_filters( 'rocket_rucss_delete_interval', 1 ); - - if ( $delete_interval <= 0 ) { - return false; - } - - $prefixed_table_name = $this->apply_prefix( $this->table_name ); - $query = "DELETE FROM `$prefixed_table_name` WHERE `last_accessed` <= date_sub(now(), interval $delete_interval month)"; - $rows_affected = $db->query( $query ); - - return $rows_affected; - } - - /** - * Get all used_css which were not accessed in the last month. - * - * @return array - */ - public function get_old_used_css(): array { - // Get the database interface. - $db = $this->get_db(); - - // Bail if no database interface is available. - if ( empty( $db ) ) { - return false; - } - - $prefixed_table_name = $this->apply_prefix( $this->table_name ); - $query = "SELECT * FROM `$prefixed_table_name` WHERE `last_accessed` <= date_sub(now(), interval 1 month)"; - $rows_affected = $db->get_results( $query ); - - return $rows_affected; - } + protected $schema_data = " + id bigint(20) unsigned NOT NULL AUTO_INCREMENT, + url varchar(2000) NOT NULL default '', + css longtext default NULL, + hash varchar(32) default '', + error_code varchar(32) NULL default NULL, + error_message longtext NULL default NULL, + unprocessedcss longtext NULL, + retries tinyint(1) NOT NULL default 1, + is_mobile tinyint(1) NOT NULL default 0, + job_id varchar(255) NOT NULL default '', + queue_name varchar(255) NOT NULL default '', + status varchar(255) NOT NULL default '', + modified timestamp NOT NULL default '0000-00-00 00:00:00', + last_accessed timestamp NOT NULL default '0000-00-00 00:00:00', + submitted_at timestamp NULL, + next_retry_time timestamp NOT NULL default '0000-00-00 00:00:00', + PRIMARY KEY (id), + KEY url (url(150), is_mobile), + KEY modified (modified), + KEY last_accessed (last_accessed), + INDEX `status_index` (`status`(191)), + INDEX `error_code_index` (`error_code`(32)), + KEY hash (hash)"; /** * Add queue columns. @@ -226,46 +162,6 @@ protected function make_status_column_index_instead_queue_name() { return $this->is_success( $index_added ); } - /** - * Remove all completed rows. - * - * @return bool|int - */ - public function remove_all_completed_rows() { - // Get the database interface. - $db = $this->get_db(); - - // Bail if no database interface is available. - if ( empty( $db ) ) { - return false; - } - - $prefixed_table_name = $this->apply_prefix( $this->table_name ); - return $db->query( "DELETE FROM `$prefixed_table_name` WHERE status IN ( 'failed', 'completed' )" ); - } - - /** - * Returns name from table. - * - * @return string - */ - public function get_name() { - return $this->apply_prefix( $this->table_name ); - } - - /** - * Trigger recreation of cache table if not exist. - * - * @return void - */ - public function maybe_trigger_recreate_table() { - if ( $this->exists() ) { - return; - } - - delete_option( $this->db_version_key ); - } - /** * Add error columns * diff --git a/inc/Engine/Optimization/RUCSS/Jobs/Factory.php b/inc/Engine/Optimization/RUCSS/Jobs/Factory.php new file mode 100644 index 0000000000..ccb4fd8307 --- /dev/null +++ b/inc/Engine/Optimization/RUCSS/Jobs/Factory.php @@ -0,0 +1,54 @@ +manager = $manager; + $this->table = $table; + } + + /** + * RUCSS job manager. + * + * @return ManagerInterface + */ + public function manager(): ManagerInterface { + return $this->manager; + } + + /** + * RUCSS Table. + * + * @return TableInterface + */ + public function table(): TableInterface { + return $this->table; + } +} diff --git a/inc/Engine/Optimization/RUCSS/Jobs/Manager.php b/inc/Engine/Optimization/RUCSS/Jobs/Manager.php new file mode 100644 index 0000000000..91f16d6417 --- /dev/null +++ b/inc/Engine/Optimization/RUCSS/Jobs/Manager.php @@ -0,0 +1,222 @@ +query = $query; + $this->filesystem = $filesystem; + $this->context = $context; + $this->options = $options; + } + + /** + * Get pending jobs from db. + * + * @param integer $num_rows Number of rows to grab. + * @return array + */ + public function get_pending_jobs( int $num_rows ): array { + $this->logger::debug( "RUCSS: Start getting number of {$num_rows} pending jobs." ); + + $pending_jobs = $this->query->get_pending_jobs( $num_rows ); + + if ( ! $pending_jobs ) { + $this->logger::debug( 'RUCSS: No pending jobs are there.' ); + + return []; + } + + return $pending_jobs; + } + + /** + * Validate SaaS response and fail job. + * + * @param array $job_details Details related to the job.. + * @param object $row_details Details related to the row. + * @param string $optimization_type The type of optimization applied for the current job. + * + * @return void + */ + public function validate_and_fail( array $job_details, $row_details, string $optimization_type ): void { + if ( 'all' !== $optimization_type || $this->optimization_type !== $optimization_type ) { + return; + } + + /** + * Filters the rocket min rucss css result size. + * + * @since 3.13.3 + * + * @param int min size. + */ + $min_rucss_size = apply_filters( 'rocket_min_rucss_size', 150 ); + if ( ! is_numeric( $min_rucss_size ) ) { + $min_rucss_size = 150; + } + + if ( isset( $job_details['contents']['shakedCSS_size'] ) && intval( $job_details['contents']['shakedCSS_size'] ) < $min_rucss_size ) { + $message = 'RUCSS: shakedCSS size is less than ' . $min_rucss_size; + $this->logger::error( $message ); + $this->make_status_failed( $row_details->url, $row_details->is_mobile, '500', $message ); + + $this->can_process = false; + } + } + + /** + * Process SaaS response. + * + * @param array $job_details Details related to the job.. + * @param object $row_details Details related to the row. + * @param string $optimization_type The type of optimization applied for the current job. + * + * @return void + */ + public function process( array $job_details, $row_details, string $optimization_type ): void { + if ( ! $this->is_allowed( $optimization_type ) || ! $this->can_process ) { + return; + } + + $css = $this->apply_font_display_swap( $job_details['contents']['shakedCSS'] ); + + /** + * RUCSS hash. + * + * @param string $hash RUCSS hash. + * @param string $css RUCSS content. + * @param UsedCSSRow $row_details Job details. + */ + $hash = (string) apply_filters( 'rocket_rucss_hash', md5( $css ), $css, $row_details ); + + if ( ! $this->filesystem->write_used_css( $hash, $css ) ) { + $message = 'RUCSS: Could not write used CSS to the filesystem: ' . $row_details->url; + $this->logger::error( $message ); + $this->query->make_status_failed( $row_details->url, $row_details->is_mobile, '', $job_details['message'] ); + + return; + } + + // Everything is fine, save the usedcss into DB, change status to completed and reset queue_name and job_id. + $this->logger::debug( 'RUCSS: Save used CSS for url: ' . $row_details->url ); + $this->query->make_status_completed( $row_details->url, $row_details->is_mobile, $hash ); + } + + /** + * Set the request parameter to be sent to the SaaS + * + * @return array + */ + public function set_request_param(): array { + /** + * Filters the RUCSS safelist + * + * @since 3.11 + * + * @param array $safelist Array of safelist values. + */ + $safelist = apply_filters( 'rocket_rucss_safelist', $this->options->get( 'remove_unused_css_safelist', [] ) ); + + /** + * Filters the styles attributes to be skipped (blocked) by RUCSS. + * + * @since 3.14 + * + * @param array $skipped_attr Array of safelist values. + */ + $skipped_attr = apply_filters( 'rocket_rucss_skip_styles_with_attr', [] ); + $skipped_attr = ( is_array( $skipped_attr ) ) ? $skipped_attr : []; + + return [ + 'rucss_safelist' => $safelist, + 'skip_attr' => $skipped_attr, + 'optimization_list' => [ + 'rucss', + ], + ]; + } + + /** + * Get the optimization type from the DB Row. + * + * @param object $row DB Row Object. + * @return boolean|string + */ + public function get_optimization_type_from_row( $row ) { + if ( ! isset( $row->css ) ) { + return false; + } + + return $this->optimization_type; + } +} diff --git a/inc/Engine/Optimization/RUCSS/ServiceProvider.php b/inc/Engine/Optimization/RUCSS/ServiceProvider.php index e885a21a9d..3e4bef6c37 100644 --- a/inc/Engine/Optimization/RUCSS/ServiceProvider.php +++ b/inc/Engine/Optimization/RUCSS/ServiceProvider.php @@ -3,23 +3,18 @@ use WP_Rocket\Dependencies\League\Container\ServiceProvider\AbstractServiceProvider; use WP_Rocket\Engine\Optimization\RUCSS\Admin\{Database, OptionSubscriber, Settings}; -use WP_Rocket\Engine\Common\Clock\WPRClock; use WP_Rocket\Engine\Optimization\RUCSS\Admin\Subscriber as AdminSubscriber; use WP_Rocket\Engine\Optimization\RUCSS\Context\RUCSSContext; use WP_Rocket\Engine\Optimization\RUCSS\Context\RUCSSOptimizeContext; use WP_Rocket\Engine\Optimization\RUCSS\Controller\Filesystem; -use WP_Rocket\Engine\Optimization\RUCSS\Controller\Queue; +use WP_Rocket\Engine\Common\JobManager\Queue\Queue; use WP_Rocket\Engine\Optimization\RUCSS\Controller\UsedCSS as UsedCSSController; -use WP_Rocket\Engine\Optimization\RUCSS\Cron\Subscriber as CronSubscriber; use WP_Rocket\Engine\Optimization\RUCSS\Database\Queries\UsedCSS as UsedCSSQuery; use WP_Rocket\Engine\Optimization\RUCSS\Database\Tables\UsedCSS as UsedCSSTable; -use WP_Rocket\Engine\Optimization\RUCSS\Frontend\APIClient; use WP_Rocket\Engine\Optimization\RUCSS\Frontend\Subscriber as FrontendSubscriber; -use WP_Rocket\Engine\Optimization\RUCSS\Strategy\Context\RetryContext; -use WP_Rocket\Engine\Optimization\RUCSS\Strategy\Factory\StrategyFactory; -use WP_Rocket\Engine\Optimization\RUCSS\Strategy\Strategies\DefaultProcess; -use WP_Rocket\Engine\Optimization\RUCSS\Strategy\Strategies\JobSetFail; -use WP_Rocket\Engine\Optimization\RUCSS\Strategy\Strategies\ResetRetryProcess; +use WP_Rocket\Engine\Optimization\RUCSS\Jobs\{Manager, Factory}; +use WP_Rocket\Engine\Optimization\RUCSS\Context\RUCSSContextSaas; +use WP_Rocket\Engine\Optimization\RUCSS\Cron\Subscriber as CronSubscriber; /** * Service provider for the WP Rocket RUCSS @@ -35,19 +30,18 @@ class ServiceProvider extends AbstractServiceProvider { 'rucss_database', 'rucss_option_subscriber', 'rucss_admin_subscriber', - 'rucss_frontend_api_client', 'rucss_used_css', 'rucss_used_css_query', 'rucss_frontend_subscriber', 'rucss_queue', 'rucss_filesystem', - 'rucss_cron_subscriber', 'rucss_used_css_controller', - 'rucss_retry_strategy_factory', - 'rucss_retry_strategy_job_found_no_result', - 'rucss_retry_strategy_job_not_found', - 'rucss_retry_strategy_reset_retry', - 'rucss_retry_strategy_context', + 'rucss_manager', + 'rucss_context_saas', + 'rucss_factory', + 'rucss_cron_subscriber', + 'rucss_context', + 'rucss_optimize_context', ]; /** @@ -78,8 +72,6 @@ public function register(): void { ->addArgument( $this->getContainer()->get( 'rucss_usedcss_table' ) ); $this->getContainer()->add( 'rucss_used_css_query', UsedCSSQuery::class ); - $this->getContainer()->add( 'rucss_frontend_api_client', APIClient::class ) - ->addArgument( $this->getContainer()->get( 'options' ) ); $this->getContainer()->add( 'rucss_queue', Queue::class ); $this->getContainer()->add( 'rucss_filesystem', Filesystem::class ) ->addArgument( rocket_get_constant( 'WP_ROCKET_USED_CSS_PATH' ) ) @@ -92,34 +84,34 @@ public function register(): void { $this->getContainer()->add( 'rucss_optimize_context', RUCSSOptimizeContext::class ) ->addArgument( $this->getContainer()->get( 'options' ) ); - $this->getContainer()->add( 'wpr_clock', WPRClock::class ); + $this->getContainer()->add( 'rucss_context_saas', RUCSSContextSaas::class ) + ->addArgument( $this->getContainer()->get( 'options' ) ); - $this->getContainer()->add( 'rucss_retry_strategy_factory', StrategyFactory::class ) - ->addArgument( $this->getContainer()->get( 'rucss_used_css_query' ) ) - ->addArgument( $this->getContainer()->get( 'wpr_clock' ) ); + $this->getContainer()->add( 'rucss_manager', Manager::class ) + ->addArguments( + [ + $this->getContainer()->get( 'rucss_used_css_query' ), + $this->getContainer()->get( 'rucss_filesystem' ), + $this->getContainer()->get( 'rucss_context_saas' ), + $this->getContainer()->get( 'options' ), + ] + ); + + $this->getContainer()->addShared( 'rucss_factory', Factory::class ) + ->addArguments( + [ + $this->getContainer()->get( 'rucss_manager' ), + $this->getContainer()->get( 'rucss_usedcss_table' ), + ] + ); $this->getContainer()->add( 'rucss_used_css_controller', UsedCSSController::class ) ->addArgument( $this->getContainer()->get( 'options' ) ) ->addArgument( $this->getContainer()->get( 'rucss_used_css_query' ) ) - ->addArgument( $this->getContainer()->get( 'rucss_frontend_api_client' ) ) - ->addArgument( $this->getContainer()->get( 'rucss_queue' ) ) ->addArgument( $this->getContainer()->get( 'dynamic_lists_defaultlists_data_manager' ) ) ->addArgument( $this->getContainer()->get( 'rucss_filesystem' ) ) ->addArgument( $this->getContainer()->get( 'rucss_context' ) ) - ->addArgument( $this->getContainer()->get( 'rucss_optimize_context' ) ) - ->addArgument( $this->getContainer()->get( 'rucss_retry_strategy_factory' ) ) - ->addArgument( $this->getContainer()->get( 'wpr_clock' ) ); - - $this->getContainer()->add( 'rucss_retry_strategy_default_process', DefaultProcess::class ) - ->addArgument( $this->getContainer()->get( 'rucss_used_css_query' ) ); - - $this->getContainer()->add( 'rucss_retry_strategy_job_set_fail', JobSetFail::class ) - ->addArgument( $this->getContainer()->get( 'rucss_used_css_query' ) ); - - $this->getContainer()->add( 'rucss_retry_strategy_reset_retry', ResetRetryProcess::class ) - ->addArgument( $this->getContainer()->get( 'rucss_used_css_query' ) ); - - $this->getContainer()->add( 'rucss_retry_strategy_context', RetryContext::class ); + ->addArgument( $this->getContainer()->get( 'rucss_manager' ) ); $this->getContainer()->addShared( 'rucss_option_subscriber', OptionSubscriber::class ) ->addArgument( $this->getContainer()->get( 'rucss_settings' ) ); @@ -131,8 +123,9 @@ public function register(): void { $this->getContainer()->addShared( 'rucss_frontend_subscriber', FrontendSubscriber::class ) ->addArgument( $this->getContainer()->get( 'rucss_used_css_controller' ) ) ->addArgument( $this->getContainer()->get( 'rucss_context' ) ); + $this->getContainer()->addShared( 'rucss_cron_subscriber', CronSubscriber::class ) - ->addArgument( $this->getContainer()->get( 'rucss_used_css_controller' ) ) - ->addArgument( $this->getContainer()->get( 'rucss_database' ) ); + ->addArgument( $this->getContainer()->get( 'job_processor' ) ) + ->addArgument( $this->getContainer()->get( 'rucss_used_css_query' ) ); } } diff --git a/inc/Engine/Optimization/RUCSS/Strategy/Factory/StrategyFactory.php b/inc/Engine/Optimization/RUCSS/Strategy/Factory/StrategyFactory.php deleted file mode 100644 index 1fd4ecf088..0000000000 --- a/inc/Engine/Optimization/RUCSS/Strategy/Factory/StrategyFactory.php +++ /dev/null @@ -1,73 +0,0 @@ -used_css_query = $used_css_query; - $this->clock = $clock; - } - /** - * Manage the whole process, to determine which strategy to adopt.. - * - * @param object $row_details DB Row of a job. - * @param array $job_details Job information from the API. - * - * @return void - */ - public function manage( $row_details, $job_details ): void { - - switch ( $job_details['code'] ) { - case 408: - $strategy = new ResetRetryProcess( $this->used_css_query ); - break; - case 500: - case 422: - case 404: - case 401: - $strategy = new JobSetFail( $this->used_css_query ); - break; - default: - $strategy = new DefaultProcess( $this->used_css_query, $this->clock ); - break; - } - - $context = new RetryContext(); - $context->set_strategy( $strategy ); - $context->execute( $row_details, $job_details ); - } -} diff --git a/inc/Engine/Optimization/RUCSS/Strategy/Strategies/JobSetFail.php b/inc/Engine/Optimization/RUCSS/Strategy/Strategies/JobSetFail.php deleted file mode 100644 index a4e63fa2fd..0000000000 --- a/inc/Engine/Optimization/RUCSS/Strategy/Strategies/JobSetFail.php +++ /dev/null @@ -1,45 +0,0 @@ -used_css_query = $used_css_query; - } - - /** - * Execute the strategy process. - * - * @param object $row_details Row details of the job. - * @param array $job_details Job details from the API. - * - * @return void - */ - public function execute( object $row_details, array $job_details ): void { - /** - * Unlock preload URL. - * - * @param string $url URL to unlock - */ - do_action( 'rocket_preload_unlock_url', $row_details->url ); - - $this->used_css_query->make_status_failed( $row_details->id, strval( $job_details['code'] ), $job_details['message'] ); - } -} diff --git a/inc/Engine/Optimization/RUCSS/Strategy/Strategies/ResetRetryProcess.php b/inc/Engine/Optimization/RUCSS/Strategy/Strategies/ResetRetryProcess.php deleted file mode 100644 index 3e531448f9..0000000000 --- a/inc/Engine/Optimization/RUCSS/Strategy/Strategies/ResetRetryProcess.php +++ /dev/null @@ -1,43 +0,0 @@ -used_css_query = $used_css_query; - } - - /** - * Execute the strategy process. - * - * @param object $row_details Row details of the job. - * @param array $job_details Job details from the API. - * - * @return void - */ - public function execute( object $row_details, array $job_details ): void { - $used_css_row = $this->used_css_query->get_row( $row_details->url, (bool) $row_details->is_mobile ); - if ( empty( $used_css_row ) ) { - $this->used_css_query->create_new_job( $row_details->url, '', '', $row_details->is_mobile ); - return; - } - $this->used_css_query->reset_job( (int) $used_css_row->id ); - } -} diff --git a/inc/Engine/Optimization/ServiceProvider.php b/inc/Engine/Optimization/ServiceProvider.php index 38512164f9..255f6ac2aa 100644 --- a/inc/Engine/Optimization/ServiceProvider.php +++ b/inc/Engine/Optimization/ServiceProvider.php @@ -1,9 +1,7 @@ getContainer()->get( 'options' ); $filesystem = rocket_direct_filesystem(); - $this->getContainer()->add( 'config', Config::class ) - ->addArgument( [ 'config_dir_path' => rocket_get_constant( 'WP_ROCKET_CONFIG_PATH' ) ] ); - $this->getContainer()->add( 'tests', Tests::class ) - ->addArgument( $this->getContainer()->get( 'config' ) ); $this->getContainer()->add( 'buffer_optimization', Optimization::class ) ->addArgument( $this->getContainer()->get( 'tests' ) ); $this->getContainer()->addShared( 'buffer_subscriber', BufferSubscriber::class ) diff --git a/inc/Engine/Optimization/UrlTrait.php b/inc/Engine/Optimization/UrlTrait.php index efb5e1e6ef..07e5b08c30 100644 --- a/inc/Engine/Optimization/UrlTrait.php +++ b/inc/Engine/Optimization/UrlTrait.php @@ -127,4 +127,14 @@ protected function get_file_content( $file ) { } return rocket_direct_filesystem()->get_contents( $file ); } + + /** + * Check if the URL is relative. + * + * @param string $url URL to check. + * @return bool + */ + protected function is_relative( string $url ): bool { + return ! empty( preg_match( '/^\./', $url ) ) || empty( wp_parse_url( $url, PHP_URL_HOST ) ); + } } diff --git a/inc/Engine/Preload/Subscriber.php b/inc/Engine/Preload/Subscriber.php index 9ca37efad5..baf5289363 100644 --- a/inc/Engine/Preload/Subscriber.php +++ b/inc/Engine/Preload/Subscriber.php @@ -107,7 +107,7 @@ public static function get_subscribed_events() { 'permalink_structure_changed' => 'on_permalink_changed', 'rocket_domain_changed' => 'on_permalink_changed', 'wp_rocket_upgrade' => [ 'on_update', 16, 2 ], - 'rocket_rucss_complete_job_status' => 'clean_url', + 'rocket_saas_complete_job_status' => 'clean_url', 'rocket_rucss_after_clearing_usedcss' => [ 'clean_url', 20 ], 'rocket_after_automatic_cache_purge' => 'preload_after_automatic_cache_purge', 'after_rocket_clean_post' => [ 'clean_partial_cache', 10, 3 ], @@ -127,6 +127,7 @@ public static function get_subscribed_events() { [ 'add_cache_reject_uri_to_excluded' ], ], 'rocket_rucss_after_clearing_failed_url' => [ 'clean_urls', 20 ], + 'rocket_atf_after_clearing_failed_url' => [ 'clean_urls', 20 ], 'transition_post_status' => [ 'remove_private_post', 10, 3 ], 'rocket_preload_exclude' => [ 'exclude_private_url', 10, 2 ], ]; diff --git a/inc/Engine/Saas/Admin/AdminBar.php b/inc/Engine/Saas/Admin/AdminBar.php new file mode 100644 index 0000000000..cc513e67e2 --- /dev/null +++ b/inc/Engine/Saas/Admin/AdminBar.php @@ -0,0 +1,209 @@ +options = $options; + $this->atf_context = $atf_context; + $this->rucss_url_context = $rucss_url_context; + } + + /** + * Add clean SaaS data to WP Rocket admin bar menu + * + * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference. + * + * @return void + */ + public function add_clean_saas_menu_item( $wp_admin_bar ) { + if ( 'local' === wp_get_environment_type() ) { + return; + } + + if ( ! is_admin() ) { + return; + } + + if ( + ! $this->atf_context->is_allowed() + && + ! (bool) $this->options->get( 'remove_unused_css', 0 ) + ) { + return; + } + + $title = __( 'Clear Critical Images', 'rocket' ); + + if ( + (bool) $this->options->get( 'remove_unused_css', 0 ) + && + current_user_can( 'rocket_remove_unused_css' ) + ) { + $title = __( 'Clear Used CSS', 'rocket' ); + } + + $referer = ''; + $action = 'rocket_clean_saas'; + + if ( ! empty( $_SERVER['REQUEST_URI'] ) ) { + $referer_url = filter_var( wp_unslash( $_SERVER['REQUEST_URI'] ), FILTER_SANITIZE_URL ); + $referer = '&_wp_http_referer=' . rawurlencode( remove_query_arg( 'fl_builder', $referer_url ) ); + } + + $wp_admin_bar->add_menu( + [ + 'parent' => 'wp-rocket', + 'id' => 'clean-saas', + 'title' => $title, + 'href' => wp_nonce_url( admin_url( "admin-post.php?action={$action}{$referer}" ), $action ), + ] + ); + } + + /** + * Add clean SaaS URL data to WP Rocket admin bar menu + * + * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference. + * + * @return void + */ + public function add_clean_url_menu_item( WP_Admin_Bar $wp_admin_bar ) { + global $post; + + if ( 'local' === wp_get_environment_type() ) { + return; + } + + if ( is_admin() ) { + return; + } + + if ( + $post + && + ! rocket_can_display_options() + ) { + return; + } + + if ( ! $this->atf_context->is_allowed() + && + ! $this->rucss_url_context->is_allowed() + ) { + return; + } + + /** + * Filters the rocket `clear used css of this url` option on admin bar menu. + * + * @since 3.12.1 + * + * @param bool $should_skip Should skip adding `clear used css of this url` option in admin bar. + * @param type $post Post object. + */ + if ( apply_filters( 'rocket_skip_admin_bar_clear_used_css_option', false, $post ) ) { + return; + } + + $referer = ''; + $action = 'rocket_clean_saas_url'; + + if ( ! empty( $_SERVER['REQUEST_URI'] ) ) { + $referer_url = filter_var( wp_unslash( $_SERVER['REQUEST_URI'] ), FILTER_SANITIZE_URL ); + + /** + * Filters to act on the referer url for the admin bar. + * + * @param string $uri Current uri. + */ + $referer = (string) apply_filters( 'rocket_admin_bar_referer', esc_url( $referer_url ) ); + $referer = '&_wp_http_referer=' . rawurlencode( remove_query_arg( 'fl_builder', $referer ) ); + } + $title = __( 'Clear Critical Images of this URL', 'rocket' ); + + if ( $this->rucss_url_context->is_allowed() ) { + $title = __( 'Clear Used CSS of this URL', 'rocket' ); + } + + $wp_admin_bar->add_menu( + [ + 'parent' => 'wp-rocket', + 'id' => 'clear-saas-url', + 'title' => $title, + 'href' => wp_nonce_url( admin_url( 'admin-post.php?action=' . $action . $referer ), $action ), + ] + ); + } + + /** + * Display the dashboard button to clean SaaS features + * + * @return void + */ + public function display_dashboard_button() { + if ( 'local' === wp_get_environment_type() ) { + return; + } + + if ( ! $this->atf_context->is_allowed() + && + ! $this->rucss_url_context->is_allowed() + ) { + return; + } + + $title = __( 'Critical Images Cache', 'rocket' ); + $label = esc_html__( 'Clear Critical Images', 'rocket' ); + + if ( $this->rucss_url_context->is_allowed() ) { + $title = __( 'Remove Used CSS Cache', 'rocket' ); + $label = esc_html__( 'Clear Used CSS', 'rocket' ); + } + + $data = [ + 'action' => 'rocket_clean_saas', + 'title' => $title, + 'label' => $label, + ]; + + echo $this->generate( 'sections/clean-section', $data ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } +} diff --git a/inc/Engine/Saas/Admin/Clean.php b/inc/Engine/Saas/Admin/Clean.php new file mode 100644 index 0000000000..413e1c764c --- /dev/null +++ b/inc/Engine/Saas/Admin/Clean.php @@ -0,0 +1,73 @@ +options = $options; + $this->beacon = $beacon; + $this->atf_context = $atf_context; + } + + /** + * Show admin notice after clearing SaaS tables. + * + * @return void + */ + public function clean_saas_result() { + if ( ! current_user_can( 'rocket_manage_options' ) ) { + return; + } + + if ( + ! $this->options->get( 'remove_unused_css', 0 ) + && + ! $this->atf_context->is_allowed() + ) { + return; + } + + $response = get_transient( 'rocket_saas_clean_message' ); + + if ( ! $response ) { + return; + } + + delete_transient( 'rocket_saas_clean_message' ); + + rocket_notice_html( $response ); + } + + /** + * Displays the SaaS currently processing notice + * + * @return void + */ + public function display_processing_notice() { + if ( $this->has_saas_error_notice() ) { + return; + } + + if ( ! $this->can_display_notice() ) { + return; + } + + $transient = get_transient( 'rocket_saas_processing' ); + + if ( false === $transient ) { + return; + } + + $current_time = time(); + + if ( $transient < $current_time ) { + return; + } + + $remaining = $transient - $current_time; + + $message = sprintf( + // translators: %1$s = plugin name, %2$s = number of seconds. + __( '%1$s: Please wait %2$s seconds. The Remove Unused CSS service is processing your pages, the plugin is optimizing LCP and the images above the fold.', 'rocket' ), + 'WP Rocket', + '' . $remaining . '' + ); + + rocket_notice_html( + [ + 'status' => 'info', + 'message' => $message, + 'id' => 'rocket-notice-saas-processing', + ] + ); + } + + /** + * Displays the SaaS success notice + * + * @return void + */ + public function display_success_notice() { + if ( ! $this->can_display_notice() ) { + return; + } + + if ( $this->has_saas_error_notice() ) { + return; + } + + $boxes = get_user_meta( get_current_user_id(), 'rocket_boxes', true ); + + if ( in_array( 'saas_success_notice', (array) $boxes, true ) ) { + return; + } + + $transient = get_transient( 'rocket_saas_processing' ); + $class = ''; + + if ( false !== $transient || ( ! $this->options->get( 'remove_unused_css', 0 ) ) ) { + $class = 'hidden'; + } + + $message = sprintf( + // translators: %1$s = plugin name, %2$s = number of URLs, %3$s = number of seconds. + __( + '%1$s: The LCP element has been optimized, and the images above the fold were excluded from lazyload. The Used CSS of your homepage has been processed. + WP Rocket will continue to generate Used CSS for up to %2$s URLs per %3$s second(s).', + 'rocket' + ), + 'WP Rocket', + apply_filters( 'rocket_rucss_pending_jobs_cron_rows_count', 100 ), + apply_filters( 'rocket_rucss_pending_jobs_cron_interval', MINUTE_IN_SECONDS ) + ); + + if ( ! $this->options->get( 'manual_preload', 0 ) ) { + $message .= ' ' . sprintf( + // translators: %1$s = opening link tag, %2$s = closing link tag. + __( 'We suggest enabling %1$sPreload%2$s for the fastest results.', 'rocket' ), + '', + '' + ); + } + + $beacon = $this->beacon->get_suggest( 'async_opti' ); + + $message .= '
' . sprintf( + // translators: %1$s = opening link tag, %2$s = closing link tag. + __( 'To learn more about the process check our %1$sdocumentation%2$s.', 'rocket' ), + '', + '' + ); + + rocket_notice_html( + [ + 'message' => $message, + 'dismissible' => $class, + 'id' => 'rocket-notice-saas-success', + 'dismiss_button' => 'saas_success_notice', + 'dismiss_button_class' => 'button-primary', + ] + ); + } + + /** + * Adds the notice end time to WP Rocket localize script data + * + * @since 3.11 + * + * @param array $data Localize script data. + * + * @return array + */ + public function add_localize_script_data( $data ): array { + if ( ! is_array( $data ) ) { + $data = (array) $data; + } + + if ( + ! $this->options->get( 'remove_unused_css', 0 ) + && + ! $this->atf_context->is_allowed() + ) { + return $data; + } + + $transient = get_transient( 'rocket_saas_processing' ); + + if ( false === $transient ) { + return $data; + } + + $data['notice_end_time'] = $transient; + $data['cron_disabled'] = rocket_get_constant( 'DISABLE_WP_CRON', false ); + + return $data; + } + + /** + * Display a notification on wrong license. + * + * @return void + */ + public function display_wrong_license_notice() { + $transient = get_option( 'wp_rocket_no_licence' ); + + if ( ! $transient ) { + return; + } + + if ( ! $this->can_display_notice() ) { + return; + } + + $main_message = __( "We couldn't generate the used CSS because you're using a nulled version of WP Rocket. You need an active license to use the Remove Unused CSS feature and further improve your website's performance.", 'rocket' ); + $cta_message = sprintf( + // translators: %1$s = promo percentage. + __( 'Click here to get a WP Rocket single license at %1$s off!', 'rocket' ), + '10%%' + ); + + $message = sprintf( + // translators: %1$s = plugin name, %2$s = opening anchor tag, %3$s = closing anchor tag. + "%1\$s:

$main_message

%2\$s$cta_message%3\$s", + 'WP Rocket', + '', + '' + ); + + rocket_notice_html( + [ + 'status' => 'error', + 'dismissible' => '', + 'message' => $message, + 'id' => 'rocket-notice-rucss-wrong-licence', + ] + ); + } + + /** + * Display an error notice when the connection to the server fails + * + * @return void + */ + public function display_saas_error_notice() { + + if ( ! $this->has_saas_error_notice() ) { + $boxes = get_user_meta( get_current_user_id(), 'rocket_boxes', true ); + if ( in_array( 'rucss_saas_error_notice', (array) $boxes, true ) ) { + unset( $boxes['rucss_saas_error_notice'] ); + update_user_meta( get_current_user_id(), 'rocket_boxes', $boxes ); + } + + return; + } + + if ( ! $this->can_display_notice() ) { + return; + } + + $boxes = get_user_meta( get_current_user_id(), 'rocket_boxes', true ); + + if ( in_array( 'saas_error_notice', (array) $boxes, true ) ) { + return; + } + + $firewall_beacon = $this->beacon->get_suggest( 'rucss_firewall_ips' ); + + $main_message = sprintf( + // translators: %1$s = open tag, %2$s = closing tag. + __( 'It seems a security plugin or the server\'s firewall prevents WP Rocket from accessing the SaaS features. IPs listed %1$shere in our documentation%2$s should be added to your allowlists:', 'rocket' ), + '', + '' + ); + + $security_message = __( '- In the security plugin, if you are using one', 'rocket' ); + $firewall_message = __( "- In the server's firewall. Your host can help you with this", 'rocket' ); + + $message = "WP Rocket: $main_message
  • $security_message
  • $firewall_message
"; + + rocket_notice_html( + [ + 'status' => 'error', + 'message' => $message, + 'dismissible' => '', + 'id' => 'rocket-notice-rucss-error-http', + 'dismiss_button' => 'saas_error_notice', + 'dismiss_button_class' => 'button-primary', + ] + ); + } + + /** + * Checks if we can display the SaaS notices + * + * @return bool + */ + private function can_display_notice(): bool { + $screen = get_current_screen(); + + if ( + isset( $screen->id ) + && + 'settings_page_wprocket' !== $screen->id + ) { + return false; + } + + if ( ! current_user_can( 'rocket_manage_options' ) ) { + return false; + } + + return true; + } + + /** + * Is the error notice present. + * + * @return bool + */ + private function has_saas_error_notice() { + return (bool) get_transient( 'wp_rocket_rucss_errors_count' ); + } +} diff --git a/inc/Engine/Saas/Admin/Subscriber.php b/inc/Engine/Saas/Admin/Subscriber.php new file mode 100644 index 0000000000..dce5e9475d --- /dev/null +++ b/inc/Engine/Saas/Admin/Subscriber.php @@ -0,0 +1,173 @@ +admin_bar = $admin_bar; + $this->clean = $clean; + $this->notices = $notices; + } + + /** + * Array of events this subscriber listens to + * + * @return array + */ + public static function get_subscribed_events(): array { + return [ + 'rocket_admin_bar_items' => [ + [ 'add_clean_saas_menu_item' ], + [ 'add_clean_url_menu_item' ], + ], + 'admin_post_rocket_clean_saas' => 'clean_saas', + 'admin_post_rocket_clean_saas_url' => 'clean_url_saas', + 'admin_notices' => [ + [ 'clean_saas_result' ], + [ 'display_processing_notice' ], + [ 'display_success_notice' ], + [ 'display_wrong_license_notice' ], + [ 'display_saas_error_notice' ], + ], + 'rocket_localize_admin_script' => 'add_localize_script_data', + 'rocket_dashboard_actions' => 'display_dashboard_button', + ]; + } + + /** + * Add clean SaaS data to WP Rocket admin bar menu + * + * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference. + * + * @return void + */ + public function add_clean_saas_menu_item( WP_Admin_Bar $wp_admin_bar ) { + $this->admin_bar->add_clean_saas_menu_item( $wp_admin_bar ); + } + + /** + * Add clean SaaS URL data to WP Rocket admin bar menu + * + * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference. + * + * @return void + */ + public function add_clean_url_menu_item( WP_Admin_Bar $wp_admin_bar ) { + $this->admin_bar->add_clean_url_menu_item( $wp_admin_bar ); + } + + /** + * Truncate SaaS tables when clicking on the dashboard button + * + * @return void + */ + public function clean_saas() { + $this->clean->clean_saas(); + } + + /** + * Clean SaaS for the current URL. + * + * @return void + */ + public function clean_url_saas() { + $this->clean->clean_url_saas(); + } + + /** + * Show admin notice after clearing SaaS tables. + * + * @return void + */ + public function clean_saas_result() { + $this->notices->clean_saas_result(); + } + + /** + * Displays the SaaS currently processing notice + * + * @return void + */ + public function display_processing_notice() { + $this->notices->display_processing_notice(); + } + + /** + * Displays the SaaS success notice + * + * @return void + */ + public function display_success_notice() { + $this->notices->display_success_notice(); + } + + /** + * Display a notification on wrong license. + * + * @return void + */ + public function display_wrong_license_notice() { + $this->notices->display_wrong_license_notice(); + } + + /** + * Display an error notice when the connection to the server fails + * + * @return void + */ + public function display_saas_error_notice() { + $this->notices->display_saas_error_notice(); + } + + /** + * Adds the notice end time to WP Rocket localize script data + * + * @param array $data Localize script data. + * + * @return array + */ + public function add_localize_script_data( $data ): array { + return $this->notices->add_localize_script_data( $data ); + } + + /** + * Display the dashboard button to clean SaaS features + * + * @return void + */ + public function display_dashboard_button() { + $this->admin_bar->display_dashboard_button(); + } +} diff --git a/inc/Engine/Saas/ServiceProvider.php b/inc/Engine/Saas/ServiceProvider.php new file mode 100644 index 0000000000..9b59335b51 --- /dev/null +++ b/inc/Engine/Saas/ServiceProvider.php @@ -0,0 +1,58 @@ +provides, true ); + } + + /** + * Registers items with the container + * + * @return void + */ + public function register(): void { + $this->getContainer()->add( 'sass_admin_bar', Adminbar::class ) + ->addArgument( $this->getContainer()->get( 'options' ) ) + ->addArgument( $this->getContainer()->get( 'atf_context' ) ) + ->addArgument( $this->getContainer()->get( 'rucss_optimize_context' ) ) + ->addArgument( $this->getContainer()->get( 'template_path' ) . '/settings' ); + $this->getContainer()->add( 'sass_clean', Clean::class ); + $this->getContainer()->add( 'sass_notices', Notices::class ) + ->addArgument( $this->getContainer()->get( 'options' ) ) + ->addArgument( $this->getContainer()->get( 'beacon' ) ) + ->addArgument( $this->getContainer()->get( 'atf_context' ) ); + $this->getContainer()->addShared( 'saas_admin_subscriber', Subscriber::class ) + ->addArgument( $this->getContainer()->get( 'sass_admin_bar' ) ) + ->addArgument( $this->getContainer()->get( 'sass_clean' ) ) + ->addArgument( $this->getContainer()->get( 'sass_notices' ) ); + } +} diff --git a/inc/Engine/WPRocketUninstall.php b/inc/Engine/WPRocketUninstall.php index c98dfe2385..eec668fc7b 100644 --- a/inc/Engine/WPRocketUninstall.php +++ b/inc/Engine/WPRocketUninstall.php @@ -1,8 +1,8 @@ cache_path = trailingslashit( $cache_path ); - $this->config_path = $config_path; - $this->rucss_usedcss_table = $rucss_usedcss_table; - $this->rocket_cache = $rocket_cache; + public function __construct( $cache_path, $config_path, $rucss_usedcss_table, $rocket_cache, $atf_table ) { + $this->cache_path = trailingslashit( $cache_path ); + $this->config_path = $config_path; + $this->tables = [ + $rucss_usedcss_table, + $rocket_cache, + $atf_table, + ]; } /** * Deletes all plugin data and files on uninstall. * * @since 3.5.2 - * @author Remy Perona * * @return void */ @@ -167,18 +163,23 @@ public function uninstall() { $this->delete_plugin_data(); $this->delete_cache_files(); $this->delete_config_files(); - $this->drop_rucss_database_tables(); - $this->delete_preload_table(); + + foreach ( $this->tables as $table ) { + $this->delete_table( $table ); + } } /** - * Drop RUCSS database tables. + * Deletes a table + * + * @param Table $table Table instance. * * @return void */ - private function drop_rucss_database_tables() { - // If the table exist, then drop the table. - $this->drop_rucss_current_site_tables(); + private function delete_table( $table ) { + if ( $table->exists() ) { + $table->uninstall(); + } if ( ! is_multisite() ) { return; @@ -187,26 +188,18 @@ private function drop_rucss_database_tables() { foreach ( get_sites( [ 'fields' => 'ids' ] ) as $site_id ) { switch_to_blog( $site_id ); - $this->drop_rucss_current_site_tables(); + if ( $table->exists() ) { + $table->uninstall(); + } restore_current_blog(); } } - /** - * Drop RUCSS tables for current active site. - */ - private function drop_rucss_current_site_tables() { - if ( $this->rucss_usedcss_table->exists() ) { - $this->rucss_usedcss_table->uninstall(); - } - } - /** * Deletes WP Rocket options, transients and events. * * @since 3.5.2 - * @author Remy Perona * * @return void */ @@ -233,7 +226,6 @@ private function delete_plugin_data() { * Deletes all WP Rocket cache files. * * @since 3.5.2 - * @author Remy Perona * * @return void */ @@ -247,7 +239,6 @@ private function delete_cache_files() { * Deletes all WP Rocket config files. * * @since 3.5.2 - * @author Remy Perona * * @return void */ @@ -255,36 +246,10 @@ private function delete_config_files() { $this->delete( $this->config_path ); } - /** - * Drop preload tables. - */ - private function delete_preload_table() { - // If the table exist, then drop the table. - - if ( $this->rocket_cache->exists() ) { - $this->rocket_cache->uninstall(); - } - - if ( ! is_multisite() ) { - return; - } - - foreach ( get_sites( [ 'fields' => 'ids' ] ) as $site_id ) { - switch_to_blog( $site_id ); - - if ( $this->rocket_cache->exists() ) { - $this->rocket_cache->uninstall(); - } - - restore_current_blog(); - } - } - /** * Recursively deletes files and directories. * * @since 3.5.2 - * @author Remy Perona * * @param string $file Path to file or directory. */ diff --git a/inc/Plugin.php b/inc/Plugin.php index be8964f7d9..104258d8ce 100644 --- a/inc/Plugin.php +++ b/inc/Plugin.php @@ -7,6 +7,7 @@ use WP_Rocket\Admin\Options; use WP_Rocket\Engine\Admin\API\ServiceProvider as APIServiceProvider; use WP_Rocket\Engine\Common\ExtractCSS\ServiceProvider as CommmonExtractCSSServiceProvider; +use WP_Rocket\Engine\Common\JobManager\ServiceProvider as JobManagerServiceProvider; use WP_Rocket\Engine\Media\Lazyload\CSS\ServiceProvider as LazyloadCSSServiceProvider; use WP_Rocket\Engine\Media\Lazyload\CSS\Admin\ServiceProvider as AdminLazyloadCSSServiceProvider; use WP_Rocket\Event_Management\Event_Manager; @@ -29,6 +30,7 @@ use WP_Rocket\Engine\Heartbeat\ServiceProvider as HeartbeatServiceProvider; use WP_Rocket\Engine\License\ServiceProvider as LicenseServiceProvider; use WP_Rocket\Engine\Media\ServiceProvider as MediaServiceProvider; +use WP_Rocket\Engine\Media\AboveTheFold\ServiceProvider as ATFServiceProvider; use WP_Rocket\Engine\Optimization\AdminServiceProvider as OptimizationAdminServiceProvider; use WP_Rocket\Engine\Optimization\DeferJS\ServiceProvider as DeferJSServiceProvider; use WP_Rocket\Engine\Optimization\DelayJS\ServiceProvider as DelayJSServiceProvider; @@ -38,6 +40,7 @@ use WP_Rocket\Engine\Plugin\ServiceProvider as PluginServiceProvider; use WP_Rocket\Engine\Preload\Links\ServiceProvider as PreloadLinksServiceProvider; use WP_Rocket\Engine\Preload\ServiceProvider as PreloadServiceProvider; +use WP_Rocket\Engine\Saas\ServiceProvider as SaasAdminServiceProvider; use WP_Rocket\Engine\Support\ServiceProvider as SupportServiceProvider; use WP_Rocket\ServiceProvider\Common_Subscribers; use WP_Rocket\ServiceProvider\Options as OptionsServiceProvider; @@ -298,6 +301,9 @@ private function init_common_subscribers() { $this->container->addServiceProvider( new CommmonExtractCSSServiceProvider() ); $this->container->addServiceProvider( new LazyloadCSSServiceProvider() ); $this->container->addServiceProvider( new DebugServiceProvider() ); + $this->container->addServiceProvider( new ATFServiceProvider() ); + $this->container->addServiceProvider( new JobManagerServiceProvider() ); + $this->container->addServiceProvider( new SaasAdminServiceProvider() ); $common_subscribers = [ 'license_subscriber', @@ -334,7 +340,6 @@ private function init_common_subscribers() { 'rucss_admin_subscriber', 'rucss_option_subscriber', 'rucss_frontend_subscriber', - 'rucss_cron_subscriber', 'preload_subscriber', 'preload_front_subscriber', 'preload_links_admin_subscriber', @@ -379,8 +384,16 @@ private function init_common_subscribers() { 'wpgeotargeting', 'lazyload_css_subscriber', 'weglot', + 'atf_subscriber', + 'cron_subscriber', + 'atf_admin_subscriber', + 'atf_ajax_subscriber', 'contactform7', 'debug_subscriber', + 'rucss_cron_subscriber', + 'atf_cron_subscriber', + 'saas_admin_subscriber', + 'warmup_subscriber', ]; $host_type = HostResolver::get_host_service(); diff --git a/inc/ThirdParty/Hostings/Kinsta.php b/inc/ThirdParty/Hostings/Kinsta.php index d3b30e576d..fdc8bbf729 100644 --- a/inc/ThirdParty/Hostings/Kinsta.php +++ b/inc/ThirdParty/Hostings/Kinsta.php @@ -26,7 +26,7 @@ public static function get_subscribed_events() { $events['rocket_after_clean_domain'] = 'clean_kinsta_cache'; $events['after_rocket_clean_post'] = 'clean_kinsta_post_cache'; $events['rocket_rucss_after_clearing_usedcss'] = 'clean_kinsta_cache_url'; - $events['rocket_rucss_complete_job_status'] = 'clean_kinsta_cache_url'; + $events['rocket_saas_complete_job_status'] = 'clean_kinsta_cache_url'; $events['after_rocket_clean_home'] = [ 'clean_kinsta_cache_home', 10, 2 ]; $events['after_rocket_clean_file'] = 'clean_kinsta_cache_url'; $events['wp_rocket_loaded'] = 'remove_partial_purge_hooks'; diff --git a/inc/ThirdParty/Hostings/SpinUpWP.php b/inc/ThirdParty/Hostings/SpinUpWP.php index 9655ed262f..5cdb196ebf 100644 --- a/inc/ThirdParty/Hostings/SpinUpWP.php +++ b/inc/ThirdParty/Hostings/SpinUpWP.php @@ -30,7 +30,7 @@ public static function get_subscribed_events() { 'wp_rocket_loaded' => 'remove_actions', 'after_rocket_clean_file' => 'purge_url', 'rocket_rucss_after_clearing_usedcss' => 'purge_url', - 'rocket_rucss_complete_job_status' => 'purge_url', + 'rocket_saas_complete_job_status' => 'purge_url', 'after_rocket_clean_term' => [ 'purge_term_urls', 10, 2 ], 'rocket_after_clean_terms' => 'purge_urls', ]; diff --git a/inc/ThirdParty/Plugins/CDN/Cloudflare.php b/inc/ThirdParty/Plugins/CDN/Cloudflare.php index c3f7d4ec04..d68dc3ad71 100644 --- a/inc/ThirdParty/Plugins/CDN/Cloudflare.php +++ b/inc/ThirdParty/Plugins/CDN/Cloudflare.php @@ -72,7 +72,7 @@ public static function get_subscribed_events() { 'pre_get_rocket_option_do_cloudflare' => 'disable_cloudflare_option', 'rocket_after_clean_domain' => 'purge_cloudflare', 'after_rocket_clean_files' => 'purge_cloudflare_partial', - 'rocket_rucss_complete_job_status' => 'purge_cloudflare_after_usedcss', + 'rocket_saas_complete_job_status' => 'purge_cloudflare_after_usedcss', 'rocket_rucss_after_clearing_usedcss' => 'purge_cloudflare_after_usedcss', 'admin_post_rocket_enable_separate_mobile_cache' => 'enable_separate_mobile_cache', 'rocket_cdn_helper_addons' => 'add_cdn_helper_message', diff --git a/inc/ThirdParty/Plugins/I18n/TranslatePress.php b/inc/ThirdParty/Plugins/I18n/TranslatePress.php index 80727133a7..53c8edc7cf 100644 --- a/inc/ThirdParty/Plugins/I18n/TranslatePress.php +++ b/inc/ThirdParty/Plugins/I18n/TranslatePress.php @@ -19,7 +19,7 @@ public static function get_subscribed_events() { } return [ - 'rocket_rucss_is_home_url' => [ 'detect_homepage', 10, 2 ], + 'rocket_saas_is_home_url' => [ 'detect_homepage', 10, 2 ], 'rocket_has_i18n' => 'is_translatepress', 'rocket_i18n_admin_bar_menu' => 'add_langs_to_admin_bar', 'rocket_i18n_current_language' => 'set_current_language', diff --git a/inc/admin/options.php b/inc/admin/options.php index 3ca5c29606..8dc4c58633 100755 --- a/inc/admin/options.php +++ b/inc/admin/options.php @@ -168,13 +168,17 @@ function ( $excluded ) use ( $pattern_field, $label, $is_form_submit, &$errors ) } // Clear WP Rocket database optimize cron if the setting has been modified. - if ( ( isset( $newvalue['schedule_automatic_cleanup'], $oldvalue['schedule_automatic_cleanup'] ) && $newvalue['schedule_automatic_cleanup'] !== $oldvalue['schedule_automatic_cleanup'] ) || ( ( isset( $newvalue['automatic_cleanup_frequency'], $oldvalue['automatic_cleanup_frequency'] ) && $newvalue['automatic_cleanup_frequency'] !== $oldvalue['automatic_cleanup_frequency'] ) ) ) { + if ( + ( ( isset( $newvalue['schedule_automatic_cleanup'], $oldvalue['schedule_automatic_cleanup'] ) && $newvalue['schedule_automatic_cleanup'] !== $oldvalue['schedule_automatic_cleanup'] ) ) + || ( ( isset( $newvalue['automatic_cleanup_frequency'], $oldvalue['automatic_cleanup_frequency'] ) && $newvalue['automatic_cleanup_frequency'] !== $oldvalue['automatic_cleanup_frequency'] ) ) + ) { if ( wp_next_scheduled( 'rocket_database_optimization_time_event' ) ) { wp_clear_scheduled_hook( 'rocket_database_optimization_time_event' ); } } // Regenerate the minify key if JS files have been modified. + // phpcs:ignore Universal.Operators.StrictComparisons.LooseNotEqual if ( ( isset( $newvalue['minify_js'], $oldvalue['minify_js'] ) && $newvalue['minify_js'] != $oldvalue['minify_js'] ) // phpcs:ignore Universal.Operators.StrictComparisons.LooseNotEqual || diff --git a/inc/classes/Buffer/class-tests.php b/inc/classes/Buffer/class-tests.php index c7ef1c661f..f1568bc976 100644 --- a/inc/classes/Buffer/class-tests.php +++ b/inc/classes/Buffer/class-tests.php @@ -133,14 +133,11 @@ public function __construct( Config $config, array $args = [] ) { /** ----------------------------------------------------------------------------------------- */ /** - * Tell if the process should be initiated. - * - * @since 3.3 - * @author Grégory Viguier + * Tell if any buffer process should be initiated. * * @return bool */ - public function can_init_process() { + public function can_process_any_buffer() { $this->last_error = []; // Don't process robots.txt && .htaccess files (it has happened sometimes with weird server configuration). @@ -178,6 +175,22 @@ public function can_init_process() { return false; } + return true; + } + + /** + * Tell if the process should be initiated. + * + * @since 3.3 + * @author Grégory Viguier + * + * @return bool + */ + public function can_init_process() { + if ( ! $this->can_process_any_buffer() ) { + return false; + } + if ( ! $this->has_test() ) { $this->last_error = []; return true; diff --git a/inc/classes/class-abstract-render.php b/inc/classes/class-abstract-render.php index 578aed9a6b..c804996549 100644 --- a/inc/classes/class-abstract-render.php +++ b/inc/classes/class-abstract-render.php @@ -124,7 +124,7 @@ public function render_action_button( $type, $action, $args = [] ) { case 'rocket_export': case 'rocket_generate_critical_css': case 'rocket_purge_rocketcdn': - case 'rocket_clear_usedcss': + case 'rocket_clean_saas': $referer = ''; if ( ! empty( $_SERVER['REQUEST_URI'] ) ) { diff --git a/inc/functions/htaccess.php b/inc/functions/htaccess.php index 9ffb6a88b3..79953e4f49 100755 --- a/inc/functions/htaccess.php +++ b/inc/functions/htaccess.php @@ -52,7 +52,7 @@ function flush_rocket_htaccess( $remove_rules = false ) { // phpcs:ignore WordPr if ( $perms ) { chmod( $filename, $perms | 0644 ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_chmod } - } elseif ( ! is_writable( $filename ) ) { // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_is_writable + } elseif ( ! is_writable( $filename ) ) { // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_is_writable return false; } diff --git a/src/js/global/countdown.js b/src/js/global/countdown.js index d7824a3bf7..94bd692185 100644 --- a/src/js/global/countdown.js +++ b/src/js/global/countdown.js @@ -48,8 +48,8 @@ function initializeClock(id, endtime) { function rucssTimer(id, endtime) { const timer = document.getElementById(id); - const notice = document.getElementById('rocket-notice-rucss-processing'); - const success = document.getElementById('rocket-notice-rucss-success'); + const notice = document.getElementById('rocket-notice-saas-processing'); + const success = document.getElementById('rocket-notice-saas-success'); if (timer === null) { return; diff --git a/tests/Fixtures/inc/Engine/CDN/CDN/HTML/siteURLWithPath/rewrite.html b/tests/Fixtures/inc/Engine/CDN/CDN/HTML/siteURLWithPath/rewrite.html index d6ec9948d9..fb00ad8b31 100644 --- a/tests/Fixtures/inc/Engine/CDN/CDN/HTML/siteURLWithPath/rewrite.html +++ b/tests/Fixtures/inc/Engine/CDN/CDN/HTML/siteURLWithPath/rewrite.html @@ -106,7 +106,7 @@ .wp-block-cover .wp-block-cover__inner-container h6 { color: #000000; } - + + + + +
+

(img-set-css-background-images)Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi gravida diam in tristique feugiat. In in metus faucibus, condimentum turpis ac, congue mauris. Integer ac varius erat, nec imperdiet odio. Maecenas sit amet dapibus risus. Pellentesque scelerisque cursus lacus a tristique. Maecenas bibendum, erat vitae interdum hendrerit, nibh diam convallis risus, nec sollicitudin est neque eu nunc. Aenean condimentum viverra est a congue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec viverra erat mauris, scelerisque interdum nisl hendrerit eu.

+
+ +
+

(img-set-css-background-images)Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi gravida diam in tristique feugiat. In in metus faucibus, condimentum turpis ac, congue mauris. Integer ac varius erat, nec imperdiet odio. Maecenas sit amet dapibus risus. Pellentesque scelerisque cursus lacus a tristique. Maecenas bibendum, erat vitae interdum hendrerit, nibh diam convallis risus, nec sollicitudin est neque eu nunc. Aenean condimentum viverra est a congue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec viverra erat mauris, scelerisque interdum nisl hendrerit eu.

+
+ + + + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_bg_responsive_webkit_template.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_bg_responsive_webkit_template.php new file mode 100644 index 0000000000..8d66d0b5f5 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_bg_responsive_webkit_template.php @@ -0,0 +1,55 @@ + + + + + + + lcp_bg_responsive_template + + + +
+

(webkit-BG-images-external-domain)Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi gravida diam in tristique feugiat. In in metus faucibus, condimentum turpis ac, congue mauris. Integer ac varius erat, nec imperdiet odio. Maecenas sit amet dapibus risus. Pellentesque scelerisque cursus lacus a tristique. Maecenas bibendum, erat vitae interdum hendrerit, nibh diam convallis risus, nec sollicitudin est neque eu nunc. Aenean condimentum viverra est a congue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec viverra erat mauris, scelerisque interdum nisl hendrerit eu.

+
+
+

(webkit2-BG-images-external-domain)Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi gravida diam in tristique feugiat. In in metus faucibus, condimentum turpis ac, congue mauris. Integer ac varius erat, nec imperdiet odio. Maecenas sit amet dapibus risus. Pellentesque scelerisque cursus lacus a tristique. Maecenas bibendum, erat vitae interdum hendrerit, nibh diam convallis risus, nec sollicitudin est neque eu nunc. Aenean condimentum viverra est a congue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec viverra erat mauris, scelerisque interdum nisl hendrerit eu.

+
+ +
+

(webkit3-BG-images-external-domain)Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi gravida diam in tristique feugiat. In in metus faucibus, condimentum turpis ac, congue mauris. Integer ac varius erat, nec imperdiet odio. Maecenas sit amet dapibus risus. Pellentesque scelerisque cursus lacus a tristique. Maecenas bibendum, erat vitae interdum hendrerit, nibh diam convallis risus, nec sollicitudin est neque eu nunc. Aenean condimentum viverra est a congue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec viverra erat mauris, scelerisque interdum nisl hendrerit eu.

+
+ + + + + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_layered_bg.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_layered_bg.php new file mode 100644 index 0000000000..f1cd6c2f33 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_layered_bg.php @@ -0,0 +1,34 @@ + + + + + + + lcp_layered_bg + + + + +
+

(bg-layared-css-background-images)Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi gravida diam in tristique feugiat. In in metus faucibus, condimentum turpis ac, congue mauris. Integer ac varius erat, nec imperdiet odio. Maecenas sit amet dapibus risus. Pellentesque scelerisque cursus lacus a tristique. Maecenas bibendum, erat vitae interdum hendrerit, nibh diam convallis risus, nec sollicitudin est neque eu nunc. Aenean condimentum viverra est a congue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec viverra erat mauris, scelerisque interdum nisl hendrerit eu.

+
+ + + + + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_picture.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_picture.php new file mode 100644 index 0000000000..8a4df9fbfe --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_picture.php @@ -0,0 +1,29 @@ + + + + + + + lcp_responsive_bg + + + +
+ + + + + +
+ + + + + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_responsive.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_responsive.php new file mode 100644 index 0000000000..322a17f9cc --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_responsive.php @@ -0,0 +1,25 @@ + + + + + + + lcp_responsive_bg + + + +
+ A rad wolf +
+ + + + + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_single_bg.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_single_bg.php new file mode 100644 index 0000000000..921b30d496 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_single_bg.php @@ -0,0 +1,33 @@ + + + + + + + lcp_single_bg + + + + +
+

(img-single-css-background-image)Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi gravida diam in tristique feugiat. In in metus faucibus, condimentum turpis ac, congue mauris. Integer ac varius erat, nec imperdiet odio. Maecenas sit amet dapibus risus. Pellentesque scelerisque cursus lacus a tristique. Maecenas bibendum, erat vitae interdum hendrerit, nibh diam convallis risus, nec sollicitudin est neque eu nunc. Aenean condimentum viverra est a congue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec viverra erat mauris, scelerisque interdum nisl hendrerit eu.

+
+ + + + + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_w_bg_image_lcp.html b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_w_bg_image_lcp.html new file mode 100644 index 0000000000..4f3f51e61f --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_w_bg_image_lcp.html @@ -0,0 +1,17 @@ + + + Test + + + +
+ image2 + image3 + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_w_img_lcp.html b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_w_img_lcp.html new file mode 100644 index 0000000000..f776a50625 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_w_img_lcp.html @@ -0,0 +1,10 @@ + + + Test + + + + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_w_picture_img_lcp.html b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_w_picture_img_lcp.html new file mode 100644 index 0000000000..a52a68e59c --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_w_picture_img_lcp.html @@ -0,0 +1,12 @@ + + + Test + + + + + + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output.html b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output.html new file mode 100644 index 0000000000..d053460b53 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output.html @@ -0,0 +1,7 @@ + + + Test + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_bg_responsive_imgset_template.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_bg_responsive_imgset_template.php new file mode 100644 index 0000000000..68f7551be0 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_bg_responsive_imgset_template.php @@ -0,0 +1,50 @@ + + + + + + + lcp_bg_responsive_template + + + + +
+

(img-set-css-background-images)Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi gravida diam in tristique feugiat. In in metus faucibus, condimentum turpis ac, congue mauris. Integer ac varius erat, nec imperdiet odio. Maecenas sit amet dapibus risus. Pellentesque scelerisque cursus lacus a tristique. Maecenas bibendum, erat vitae interdum hendrerit, nibh diam convallis risus, nec sollicitudin est neque eu nunc. Aenean condimentum viverra est a congue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec viverra erat mauris, scelerisque interdum nisl hendrerit eu.

+
+ +
+

(img-set-css-background-images)Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi gravida diam in tristique feugiat. In in metus faucibus, condimentum turpis ac, congue mauris. Integer ac varius erat, nec imperdiet odio. Maecenas sit amet dapibus risus. Pellentesque scelerisque cursus lacus a tristique. Maecenas bibendum, erat vitae interdum hendrerit, nibh diam convallis risus, nec sollicitudin est neque eu nunc. Aenean condimentum viverra est a congue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec viverra erat mauris, scelerisque interdum nisl hendrerit eu.

+
+ + + + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_bg_responsive_webkit_template.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_bg_responsive_webkit_template.php new file mode 100644 index 0000000000..10335dd88b --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_bg_responsive_webkit_template.php @@ -0,0 +1,55 @@ + + + + + + + lcp_bg_responsive_template + + + +
+

(webkit-BG-images-external-domain)Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi gravida diam in tristique feugiat. In in metus faucibus, condimentum turpis ac, congue mauris. Integer ac varius erat, nec imperdiet odio. Maecenas sit amet dapibus risus. Pellentesque scelerisque cursus lacus a tristique. Maecenas bibendum, erat vitae interdum hendrerit, nibh diam convallis risus, nec sollicitudin est neque eu nunc. Aenean condimentum viverra est a congue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec viverra erat mauris, scelerisque interdum nisl hendrerit eu.

+
+
+

(webkit2-BG-images-external-domain)Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi gravida diam in tristique feugiat. In in metus faucibus, condimentum turpis ac, congue mauris. Integer ac varius erat, nec imperdiet odio. Maecenas sit amet dapibus risus. Pellentesque scelerisque cursus lacus a tristique. Maecenas bibendum, erat vitae interdum hendrerit, nibh diam convallis risus, nec sollicitudin est neque eu nunc. Aenean condimentum viverra est a congue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec viverra erat mauris, scelerisque interdum nisl hendrerit eu.

+
+ +
+

(webkit3-BG-images-external-domain)Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi gravida diam in tristique feugiat. In in metus faucibus, condimentum turpis ac, congue mauris. Integer ac varius erat, nec imperdiet odio. Maecenas sit amet dapibus risus. Pellentesque scelerisque cursus lacus a tristique. Maecenas bibendum, erat vitae interdum hendrerit, nibh diam convallis risus, nec sollicitudin est neque eu nunc. Aenean condimentum viverra est a congue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec viverra erat mauris, scelerisque interdum nisl hendrerit eu.

+
+ + + + + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_layered_bg.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_layered_bg.php new file mode 100644 index 0000000000..b876cb99bf --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_layered_bg.php @@ -0,0 +1,34 @@ + + + + + + + lcp_layered_bg + + + + +
+

(bg-layared-css-background-images)Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi gravida diam in tristique feugiat. In in metus faucibus, condimentum turpis ac, congue mauris. Integer ac varius erat, nec imperdiet odio. Maecenas sit amet dapibus risus. Pellentesque scelerisque cursus lacus a tristique. Maecenas bibendum, erat vitae interdum hendrerit, nibh diam convallis risus, nec sollicitudin est neque eu nunc. Aenean condimentum viverra est a congue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec viverra erat mauris, scelerisque interdum nisl hendrerit eu.

+
+ + + + + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_picture.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_picture.php new file mode 100644 index 0000000000..847fd3a842 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_picture.php @@ -0,0 +1,29 @@ + + + + + + + lcp_responsive_bg + + + +
+ + + + + +
+ + + + + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_responsive.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_responsive.php new file mode 100644 index 0000000000..abb86dcb2a --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_responsive.php @@ -0,0 +1,25 @@ + + + + + + + lcp_responsive_bg + + + +
+ A rad wolf +
+ + + + + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_single_bg.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_single_bg.php new file mode 100644 index 0000000000..c79a2a6615 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_single_bg.php @@ -0,0 +1,33 @@ + + + + + + + lcp_single_bg + + + + +
+

(img-single-css-background-image)Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi gravida diam in tristique feugiat. In in metus faucibus, condimentum turpis ac, congue mauris. Integer ac varius erat, nec imperdiet odio. Maecenas sit amet dapibus risus. Pellentesque scelerisque cursus lacus a tristique. Maecenas bibendum, erat vitae interdum hendrerit, nibh diam convallis risus, nec sollicitudin est neque eu nunc. Aenean condimentum viverra est a congue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec viverra erat mauris, scelerisque interdum nisl hendrerit eu.

+
+ + + + + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_beacon.html b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_beacon.html new file mode 100644 index 0000000000..3efc371d25 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_beacon.html @@ -0,0 +1,7 @@ + + + Test + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_bg_image_lcp.html b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_bg_image_lcp.html new file mode 100644 index 0000000000..2194716718 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_bg_image_lcp.html @@ -0,0 +1,17 @@ + + + Test + + + +
+ image2 + image3 + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_img_lcp.html b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_img_lcp.html new file mode 100644 index 0000000000..571d05d1a4 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_img_lcp.html @@ -0,0 +1,10 @@ + + + Test + + + + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_picture_img_lcp.html b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_picture_img_lcp.html new file mode 100644 index 0000000000..5ed03dd1b2 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_picture_img_lcp.html @@ -0,0 +1,12 @@ + + + Test + + + + + + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_preload.html b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_preload.html new file mode 100644 index 0000000000..80be8140bc --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_preload.html @@ -0,0 +1,7 @@ + + + Test + + + + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/lcp.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/lcp.php new file mode 100644 index 0000000000..c41f24493b --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/lcp.php @@ -0,0 +1,256 @@ + [ + 'shouldAddBeaconToPage' => [ + 'config' => [ + 'html' => $html_input, + 'row' => null, + ], + 'expected' => $html_output_with_beacon, + ], + 'shouldNotAddBeaconToPage' => [ + 'config' => [ + 'html' => $html_input, + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image.jpg', + ] ), + 'viewport' => json_encode( [ + 0 => (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image2.jpg', + ], + ] ), + ], + ], + 'expected' => $html_output_with_preload, + ], + 'shouldNotAddBeaconToPageWhenLcpFailed' => [ + 'config' => [ + 'html' => $html_input, + 'row' => [ + 'status' => 'failed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + ] ), + 'viewport' => json_encode( [ + ] ), + ], + ], + 'expected' => $html_output, + ], + 'shouldPreloadLcpResponsiveImgset' => [ + 'config' => [ + 'html' => file_get_contents(__DIR__ . '/HTML/input_lcp_bg_responsive_imgset_template.php'), + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'bg-img-set', + 'bg_set' => [ + ['src' => "http://example.org/wp-content/rocket-test-data/images/lcp/testavif.avif 1dppx"], + ['src' => "http://example.org/wp-content/rocket-test-data/images/lcp/testwebp.webp 2dppx"] + ] + ]), + 'viewport' => json_encode ( [] ), + ], + ], + 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_bg_responsive_imgset_template.php'), + ], + 'shouldPreloadLcpResponsiveWebkit' => [ + 'config' => [ + 'html' => file_get_contents(__DIR__ . '/HTML/input_lcp_bg_responsive_webkit_template.php'), + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'bg-img-set', + 'bg_set' => [ + ['src' => "https://fastly.picsum.photos/id/976/200/300.jpg?hmac=s1Uz9fgJv32r8elfaIYn7pLpQXps7X9oYNwC5XirhO8 1dppx"], + ['src' => "https://rocketlabsqa.ovh/wp-content/rocket-test-data/images/fixtheissue.jpg 2dppx"] + ] + ]), + 'viewport' => json_encode ( [] ), + ], + ], + 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_bg_responsive_webkit_template.php'), + ], + 'shouldPreloadLcpLayeredBackground' => [ + 'config' => [ + 'html' => file_get_contents(__DIR__ . '/HTML/input_lcp_layered_bg.php'), + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'bg-img', + 'bg_set' => [ + ['src' => "https://fastly.picsum.photos/id/976/200/300.jpg?hmac=s1Uz9fgJv32r8elfaIYn7pLpQXps7X9oYNwC5XirhO8"], + ['src' => "https://rocketlabsqa.ovh/wp-content/rocket-test-data/images/fixtheissue.jpg"] + ] + ]), + 'viewport' => json_encode ( [] ), + ], + ], + 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_layered_bg.php'), + ], + 'shouldPreloadLcpSingleBackground' => [ + 'config' => [ + 'html' => file_get_contents(__DIR__ . '/HTML/input_lcp_single_bg.php'), + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'bg-img', + 'bg_set' => [ + ['src' => "http://example.org/wp-content/rocket-test-data/images/lcp/testavif.avif"], + ] + ]), + 'viewport' => json_encode ( [] ), + ], + ], + 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_single_bg.php'), + ], + 'shouldPreloadLcpResponsiveImage' => [ + 'config' => [ + 'html' => file_get_contents(__DIR__ . '/HTML/input_lcp_responsive.php'), + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'img-srcset', + 'src' => 'wolf.jpg', + "srcset" => "wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w", + "sizes" => "50vw", + ]), + 'viewport' => json_encode ( [] ), + ], + ], + 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_responsive.php'), + ], + ], + 'shouldPreloadPictureTag' => [ + 'config' => [ + 'html' => file_get_contents(__DIR__ . '/HTML/input_lcp_picture.php'), + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'picture', + 'src' => 'large_cat.jpg', + 'sources' => [ + [ + 'srcset' => 'small_cat.jpg', + 'media' => '(max-width: 400px)' + ], + [ + 'srcset' => 'medium_cat.jpg', + 'media' => '(max-width: 800px)' + ] + ] + ]), + 'viewport' => json_encode ( [] ), + ], + ], + 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_picture.php'), + ], + 'shouldNotApplyFetchPriorityToTheWrongElement' => [ + 'config' => [ + 'html' => $html_input_with_bg_image_lcp, + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image.jpg', + ] ), + 'viewport' => json_encode( [ + 0 => (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image2.jpg', + ], + 1 => (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image3.jpg', + ], + ] ), + ], + ], + 'expected' => $html_output_with_bg_image_lcp, + ], + 'shouldApplyFetchPriorityToTheImgTagWithPictureElement' => [ + 'config' => [ + 'html' => $html_input_with_picture_img_lcp, + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image.jpg', + ] ), + 'viewport' => json_encode( [ + 0 => (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image2.jpg', + ], + 1 => (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image3.jpg', + ], + ] ), + ], + ], + 'expected' => $html_output_with_picture_img_lcp, + ], + 'shouldApplyFetchPriorityToTheImgElement' => [ + 'config' => [ + 'html' => $html_input_with_img_lcp, + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image.jpg', + ] ), + 'viewport' => json_encode( [ + 0 => (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image2.jpg', + ], + 1 => (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image3.jpg', + ], + ] ), + ], + ], + 'expected' => $html_output_with_img_lcp, + ], + 'shouldNotDoAnythingIfNoLcp' => [ + 'config' => [ + 'html' => $html_input, + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => 'not found', + 'viewport' => json_encode( [ + ] ), + ], + ], + 'expected' => $html_output, + ], +]; diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Controller/addWPRImageDimensionQueryArg.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Controller/addWPRImageDimensionQueryArg.php new file mode 100644 index 0000000000..7722da99e4 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Controller/addWPRImageDimensionQueryArg.php @@ -0,0 +1,18 @@ + [ + 'config' => [ + 'filter' => false, + 'url' => 'http://example.com' + ], + 'expected' => 'http://example.com', + ], + 'testShoulDoReturnArgument' => [ + 'config' => [ + 'filter' => true, + 'url' => 'http://example.com' + ], + 'expected' => 'http://example.com/?wpr_imagedimensions=1', + ], +]; diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Controller/fetchLinks.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Controller/fetchLinks.php new file mode 100644 index 0000000000..a344ec0335 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Controller/fetchLinks.php @@ -0,0 +1,274 @@ +'; +$html_no_valid_links = 'Goto TopClick Bait'; +$html_valid_links_among_invalid_links = 'Goto TopClick BaitHello WorldAnother DayRich Dad Poor Dad'; +$html_external_links = 'Hello WorldAnother DayRich Dad Poor Dad'; +$html_valid_links_among_external_links = 'Hello WorldAnother DayRich Dad Poor DadHello WorldAnother DayRich Dad Poor Dad'; +$html_links_without_duplicate = 'Hello WorldAnother DayRich Dad Poor DadHello WorldAnother DayRich Dad Poor DadBuy (He came to set the captives free) - Rebecca Brown'; +$html_links_with_relative_url = 'Hello WorldAnother DayRich Dad Poor DadBuy (He came to set the captives free) - Rebecca Brown'; +$html_with_ten_links_and_home = 'Hello World 2Hello World 3Hello World 4Hello World 5Hello World 6Hello World 7Hello World 8Hello World 9Rich Dad Poor DadBuy (He came to set the captives free) - Rebecca BrownHome'; +$html_with_external_links_before_internal = ''; +$html_with_rss_feed_rest_api = 'RSS FeedRest APIHello World 4Hello World 5Hello World 6Hello World 7Hello World 8Hello World 9Rich Dad Poor DadBuy (He came to set the captives free) - Rebecca BrownHome'; + +return [ + 'shouldReturnEmptyWhenLicenseExpired' => [ + 'config' => [ + 'license_expired' => true, + 'headers' => [ + 'user-agent' => 'WP Rocket/Pre-fetch Home Links', + 'timeout' => 60, + ], + 'response' => [ + 'response' => [ + 'code' => 500, + ], + ], + ], + 'expected' => [], + ], + 'shouldReturnEmptyWhenNot200' => [ + 'config' => [ + 'license_expired' => false, + 'headers' => [ + 'user-agent' => 'WP Rocket/Pre-fetch Home Links', + 'timeout' => 60, + ], + 'response' => [ + 'response' => [ + 'code' => 500, + ], + ], + ], + 'expected' => [], + ], + 'shouldReturnEmptyWhenNoFoundLinks' => [ + 'config' => [ + 'license_expired' => false, + 'headers' => [ + 'user-agent' => 'WP Rocket/Pre-fetch Home Links', + 'timeout' => 60, + ], + 'found_link' => false, + 'response' => [ + 'body' => $html_no_found_links, + 'response' => [ + 'code' => 200, + ], + ], + ], + 'expected' => [], + ], + 'shouldReturnOnlyHomeWithNoValidLinks' => [ + 'config' => [ + 'license_expired' => false, + 'headers' => [ + 'user-agent' => 'WP Rocket/Pre-fetch Home Links', + 'timeout' => 60, + ], + 'found_link' => true, + 'response' => [ + 'body' => $html_no_valid_links, + 'response' => [ + 'code' => 200, + ], + ], + ], + 'expected' => [ + 'https://example.org', + ], + ], + 'shouldReturnValidLinksAmongInvalidLinks' => [ + 'config' => [ + 'license_expired' => false, + 'headers' => [ + 'user-agent' => 'WP Rocket/Pre-fetch Home Links', + 'timeout' => 60, + ], + 'found_link' => true, + 'response' => [ + 'body' => $html_valid_links_among_invalid_links, + 'response' => [ + 'code' => 200, + ], + ], + ], + 'expected' => [ + 'https://example.org/hello-world', + 'https://example.org/another-day', + 'https://example.org/rich-dad-poor-dad', + 'https://example.org', + ], + ], + 'shouldReturnOnlyHomeWithExternalLinks' => [ + 'config' => [ + 'license_expired' => false, + 'headers' => [ + 'user-agent' => 'WP Rocket/Pre-fetch Home Links', + 'timeout' => 60, + ], + 'found_link' => true, + 'response' => [ + 'body' => $html_external_links, + 'response' => [ + 'code' => 200, + ], + ], + ], + 'expected' => [ + 'https://example.org', + ], + ], + 'shouldReturnValidLinksAmongExternalLinks' => [ + 'config' => [ + 'license_expired' => false, + 'headers' => [ + 'user-agent' => 'WP Rocket/Pre-fetch Home Links', + 'timeout' => 60, + ], + 'found_link' => true, + 'response' => [ + 'body' => $html_valid_links_among_external_links, + 'response' => [ + 'code' => 200, + ], + ], + ], + 'expected' => [ + 'https://example.org/hello-world', + 'https://example.org/another-day', + 'https://example.org/rich-dad-poor-dad', + 'https://example.org', + ], + ], + 'shouldReturnLinksWithoutDuplicate' => [ + 'config' => [ + 'license_expired' => false, + 'headers' => [ + 'user-agent' => 'WP Rocket/Pre-fetch Home Links', + 'timeout' => 60, + ], + 'found_link' => true, + 'response' => [ + 'body' => $html_links_without_duplicate, + 'response' => [ + 'code' => 200, + ], + ], + ], + 'expected' => [ + 'https://example.org/hello-world', + 'https://example.org/another-day', + 'https://example.org/rich-dad-poor-dad', + 'https://example.org/rebecca-brown-he-came-to-set-the-captives-free', + 'https://example.org', + ], + ], + 'shouldReturnLinksWithRelativeUrl' => [ + 'config' => [ + 'license_expired' => false, + 'headers' => [ + 'user-agent' => 'WP Rocket/Pre-fetch Home Links', + 'timeout' => 60, + ], + 'found_link' => true, + 'response' => [ + 'body' => $html_links_with_relative_url, + 'response' => [ + 'code' => 200, + ], + ], + ], + 'expected' => [ + 'https://example.org/hello-world', + 'https://example.org/another-day', + 'https://example.org/rich-dad-poor-dad', + 'https://example.org/rebecca-brown-he-came-to-set-the-captives-free', + 'https://example.org', + ], + ], + 'shouldReturnTenLinksPlusHome' => [ + 'config' => [ + 'license_expired' => false, + 'headers' => [ + 'user-agent' => 'WP Rocket/Pre-fetch Home Links', + 'timeout' => 60, + ], + 'found_link' => true, + 'response' => [ + 'body' => $html_with_ten_links_and_home, + 'response' => [ + 'code' => 200, + ], + ], + ], + 'expected' => [ + 'https://example.org/hello-world-2', + 'https://example.org/hello-world-3', + 'https://example.org/hello-world-4', + 'https://example.org/hello-world-5', + 'https://example.org/hello-world-6', + 'https://example.org/hello-world-7', + 'https://example.org/hello-world-8', + 'https://example.org/hello-world-9', + 'https://example.org/rich-dad-poor-dad', + 'https://example.org/rebecca-brown-he-came-to-set-the-captives-free', + 'https://example.org', + ], + ], + 'shouldReturnTenLinksWithExternalLinksBeforeInternal' => [ + 'config' => [ + 'license_expired' => false, + 'headers' => [ + 'user-agent' => 'WP Rocket/Pre-fetch Home Links', + 'timeout' => 60, + ], + 'found_link' => true, + 'response' => [ + 'body' => $html_with_external_links_before_internal, + 'response' => [ + 'code' => 200, + ], + ], + ], + 'expected' => [ + 'https://example.org/delay-js-script-add-to-any', + 'https://example.org/accordion-toggle', + 'https://example.org/cover-galleries', + 'https://example.org/countdown-timer', + 'https://example.org/cover-galleries-2', + 'https://example.org/cover-galleries-3', + 'https://example.org/cover-galleries-4', + 'https://example.org/cover-galleries-5', + 'https://example.org/cover-galleries-6', + 'https://example.org/cover-galleries-7', + 'https://example.org', + ], + ], + 'shouldReturnLinksWithoutRSSAndRestAPILink' => [ + 'config' => [ + 'license_expired' => false, + 'headers' => [ + 'user-agent' => 'WP Rocket/Pre-fetch Home Links', + 'timeout' => 60, + ], + 'found_link' => true, + 'response' => [ + 'body' => $html_with_rss_feed_rest_api, + 'response' => [ + 'code' => 200, + ], + ], + ], + 'expected' => [ + 'https://example.org/hello-world-4', + 'https://example.org/hello-world-5', + 'https://example.org/hello-world-6', + 'https://example.org/hello-world-7', + 'https://example.org/hello-world-8', + 'https://example.org/hello-world-9', + 'https://example.org/rich-dad-poor-dad', + 'https://example.org/rebecca-brown-he-came-to-set-the-captives-free', + 'https://example.org', + ], + ], +]; diff --git a/tests/Fixtures/inc/Engine/Optimization/Minify/CSS/Subscriber/process.php b/tests/Fixtures/inc/Engine/Optimization/Minify/CSS/Subscriber/process.php index 33752994ed..87f0c0f7fd 100644 --- a/tests/Fixtures/inc/Engine/Optimization/Minify/CSS/Subscriber/process.php +++ b/tests/Fixtures/inc/Engine/Optimization/Minify/CSS/Subscriber/process.php @@ -164,7 +164,7 @@ Sample Page - + diff --git a/tests/Fixtures/inc/Engine/Optimization/Minify/JS/Subscriber/process.php b/tests/Fixtures/inc/Engine/Optimization/Minify/JS/Subscriber/process.php index 33aec4d033..03c664b0e6 100644 --- a/tests/Fixtures/inc/Engine/Optimization/Minify/JS/Subscriber/process.php +++ b/tests/Fixtures/inc/Engine/Optimization/Minify/JS/Subscriber/process.php @@ -151,7 +151,7 @@ Sample Page - + @@ -228,7 +228,7 @@ Sample Page - + @@ -275,7 +275,7 @@ - + ', 'files' => [ @@ -319,7 +319,7 @@ - + ', 'files' => [ @@ -359,13 +359,13 @@ 'html' => ' Sample Page - + - + ', 'files' => [ @@ -406,14 +406,14 @@ 'html' => ' Sample Page - - + + - + ', 'files' => [ @@ -453,13 +453,13 @@ 'html' => ' Sample Page - + - + ', 'files' => [ @@ -500,14 +500,14 @@ 'html' => ' Sample Page - - + + - + ', 'files' => [ @@ -552,7 +552,7 @@ - + ', 'files' => [ @@ -598,7 +598,7 @@ - + ', 'files' => [ diff --git a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Settings/displaySuccessNotice.php b/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Settings/displaySuccessNotice.php deleted file mode 100644 index ee13c7a430..0000000000 --- a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Settings/displaySuccessNotice.php +++ /dev/null @@ -1,142 +0,0 @@ - 'wp-content/', - - 'test_data' => [ - 'shouldDoNothingWhenNotWPRSettingsPage' => [ - 'config' => [ - 'current_screen' => (object) [ - 'id' => 'dashboard', - ], - 'capability' => true, - 'boxes' => [], - 'remove_unused_css' => 1, - 'manual_preload' => 1, - 'transient' => false, - 'saas_transient' => false, - 'exists' => true, - ], - 'expected' => false, - ], - 'shouldDoNothingWhenNoCapability' => [ - 'config' => [ - 'current_screen' => (object) [ - 'id' => 'settings_page_wprocket', - ], - 'capability' => false, - 'boxes' => [], - 'remove_unused_css' => 1, - 'manual_preload' => 1, - 'transient' => false, - 'saas_transient' => false, - 'exists' => true, - ], - 'expected' => false, - ], - 'shouldDoNothingWhenRUCSSDisabled' => [ - 'config' => [ - 'current_screen' => (object) [ - 'id' => 'settings_page_wprocket', - ], - 'capability' => true, - 'boxes' => [], - 'remove_unused_css' => 0, - 'manual_preload' => 1, - 'transient' => false, - 'saas_transient' => false, - 'exists' => true, - ], - 'expected' => false, - ], - 'shouldDoNothingWhenNoticeDismissed' => [ - 'config' => [ - 'current_screen' => (object) [ - 'id' => 'settings_page_wprocket', - ], - 'capability' => true, - 'boxes' => [ - 'rucss_success_notice', - ], - 'remove_unused_css' => 1, - 'manual_preload' => 1, - 'transient' => false, - 'saas_transient' => false, - 'exists' => true, - ], - 'expected' => false, - ], - 'shouldHideNoticeWhenTransient' => [ - 'config' => [ - 'current_screen' => (object) [ - 'id' => 'settings_page_wprocket', - ], - 'capability' => true, - 'boxes' => [], - 'remove_unused_css' => 1, - 'manual_preload' => 0, - 'transient' => time(), - 'saas_transient' => false, - 'exists' => true, - ], - 'expected' => [ - 'message' => 'WP Rocket: The Used CSS of your homepage has been processed. WP Rocket will continue to generate Used CSS for up to 100 URLs per 60 second(s). We suggest enabling Preload for the fastest results.
To learn more about the process check our documentation.', - 'dismissible' => 'hidden', - 'id' => 'rocket-notice-rucss-success', - 'dismiss_button' => 'rucss_success_notice', - 'dismiss_button_class' => 'button-primary', - ], - ], - 'shouldShowNoticeWhenNoTransient' => [ - 'config' => [ - 'current_screen' => (object) [ - 'id' => 'settings_page_wprocket', - ], - 'capability' => true, - 'boxes' => [], - 'remove_unused_css' => 1, - 'manual_preload' => 0, - 'transient' => false, - 'saas_transient' => false, - 'exists' => true, - ], - 'expected' => [ - 'message' => 'WP Rocket: The Used CSS of your homepage has been processed. WP Rocket will continue to generate Used CSS for up to 100 URLs per 60 second(s). We suggest enabling Preload for the fastest results.
To learn more about the process check our documentation.', - 'dismissible' => '', - 'id' => 'rocket-notice-rucss-success', - 'dismiss_button' => 'rucss_success_notice', - 'dismiss_button_class' => 'button-primary', - ], - ], - 'shouldDoNothingWhenNoTable' => [ - 'config' => [ - 'current_screen' => (object) [ - 'id' => 'settings_page_wprocket', - ], - 'capability' => true, - 'boxes' => [], - 'remove_unused_css' => 1, - 'manual_preload' => 0, - 'transient' => false, - 'saas_transient' => false, - 'exists' => false, - ], - 'expected' => false, - ], - 'shouldDoNothingWhenSaasError' => [ - 'config' => [ - 'current_screen' => (object) [ - 'id' => 'settings_page_wprocket', - ], - 'capability' => true, - 'boxes' => [], - 'remove_unused_css' => 1, - 'manual_preload' => 0, - 'transient' => false, - 'saas_transient' => true, - 'exists' => false, - ], - 'expected' => false, - ], - ], -]; diff --git a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Subscriber/clearUsedcssResult.php b/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Subscriber/clearUsedcssResult.php deleted file mode 100644 index 0022535c72..0000000000 --- a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Subscriber/clearUsedcssResult.php +++ /dev/null @@ -1,56 +0,0 @@ - [ - - 'shouldBailoutWhenCurrentUsercant' => [ - 'input' => [ - 'cap' => false, - 'enabled' => false, - ], - 'expected' => [ - 'show_notice' => false, - 'notice_html' => '

Used CSS cache cleared!

', - ], - ], - - 'shouldBailoutWhenOptionDisabled' => [ - 'input' => [ - 'cap' => false, - 'enabled' => false, - ], - 'expected' => [ - 'show_notice' => false, - 'notice_html' => '

Used CSS cache cleared!

', - ], - ], - - 'shouldBailoutWhenEmptyTransient' => [ - 'input' => [ - 'cap' => true, - 'enabled' => true, - 'transient' => false, - ], - 'expected' => [ - 'show_notice' => false, - 'notice_html' => '

Used CSS cache cleared!

', - ], - ], - - 'shouldShowNotice' => [ - 'input' => [ - 'cap' => true, - 'enabled' => true, - 'transient' => [ - 'status' => 'success', - 'message' => 'Used CSS cache cleared!', 'rocket', - ], - ], - 'expected' => [ - 'show_notice' => true, - 'notice_html' => '

Used CSS cache cleared!

', - ], - ], - - ], -]; diff --git a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Subscriber/truncateUsedCSSHandler.php b/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Subscriber/truncateUsedCSSHandler.php deleted file mode 100644 index 0e4d7b27f4..0000000000 --- a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Subscriber/truncateUsedCSSHandler.php +++ /dev/null @@ -1,192 +0,0 @@ - 'http://example.org/home', - 'css' => 'h1{color:red;}', - 'retries' => 3, - 'is_mobile' => false, - ], - [ - 'url' => 'http://example.org/home', - 'css' => 'h1{color:red;}', - 'retries' => 3, - 'is_mobile' => true, - ], -]; - -$cache_files = [ - 'vfs://public/wp-content/cache/wp-rocket/example.org/index.html' => null, - 'vfs://public/wp-content/cache/wp-rocket/example.org/index.html_gzip' => null, - 'vfs://public/wp-content/cache/wp-rocket/example.org-wpmedia-594d03f6ae698691165999/index.html' => null, - 'vfs://public/wp-content/cache/wp-rocket/example.org-wpmedia-594d03f6ae698691165999/index.html_gzip' => null, - 'vfs://public/wp-content/cache/wp-rocket/example.org-Foo-594d03f6ae698691165999/index.html' => null, - 'vfs://public/wp-content/cache/wp-rocket/example.org-Foo-594d03f6ae698691165999/index.html_gzip' => null, -]; - -return [ - 'vfs_dir' => 'wp-content/', - - 'structure' => [ - 'wp-content' => [ - 'cache' => [ - 'wp-rocket' => [ - 'example.org' => [ - 'index.html' => '', - 'index.html_gzip' => '', - ], - 'example.org-wpmedia-594d03f6ae698691165999' => [ - 'index.html' => '', - 'index.html_gzip' => '', - ], - 'example.org-Foo-594d03f6ae698691165999' => [ - 'index.html' => '', - 'index.html_gzip' => '', - ], - ], - ], - ], - ], - 'test_data' => [ - - 'shouldNotTruncateUnusedCSSWithNotExistsNonce' => [ - 'input' => [ - 'remove_unused_css' => false, - 'nonce' => null, - 'db_items' => $items, - 'cache_files' => $cache_files, - 'home_url' => 'http://example.org', - 'home_request_configs' => [ - 'timeout' => 0.01, - 'blocking' => false, - 'user-agent' => 'WP Rocket/Homepage Preload', - 'sslverify' => false, - ] - ], - 'expected' => [ - 'truncated' => false, - 'reason' => 'nonce' - ], - ], - - 'shouldNotTruncateUnusedCSSWithInvalidNonce' => [ - 'input' => [ - 'remove_unused_css' => false, - 'nonce' => 'invalid', - 'db_items' => $items, - 'cache_files' => $cache_files, - 'home_url' => 'http://example.org', - 'home_request_configs' => [ - 'timeout' => 0.01, - 'blocking' => false, - 'user-agent' => 'WP Rocket/Homepage Preload', - 'sslverify' => false, - ] - ], - 'expected' => [ - 'truncated' => false, - 'reason' => 'nonce' - ], - ], - - 'shouldNotTruncateUnusedCSSWhenCurrentUserCant' => [ - 'input' => [ - 'remove_unused_css' => false, - 'nonce' => 'rocket_clear_usedcss', - 'cap' => false, - 'db_items' => $items, - 'cache_files' => $cache_files, - 'home_url' => 'http://example.org', - 'home_request_configs' => [ - 'timeout' => 0.01, - 'blocking' => false, - 'user-agent' => 'WP Rocket/Homepage Preload', - 'sslverify' => false, - ] - ], - 'expected' => [ - 'truncated' => false, - 'reason' => 'cap' - ], - ], - - 'shouldNotTruncateUnusedCSSWhenOptionDisabled' => [ - 'input' => [ - 'remove_unused_css' => false, - 'nonce' => 'rocket_clear_usedcss', - 'cap' => true, - 'option_enabled' => false, - 'db_items' => $items, - 'cache_files' => $cache_files, - 'home_url' => 'http://example.org', - 'home_request_configs' => [ - 'timeout' => 0.01, - 'blocking' => false, - 'user-agent' => 'WP Rocket/Homepage Preload', - 'sslverify' => false, - ] - ], - 'expected' => [ - 'truncated' => false, - 'reason' => 'option', - 'notice_details' => [ - 'status' => 'error', - 'message' => 'WP Rocket: Used CSS option is not enabled!', - ], - ], - ], - - 'shouldTruncateUnusedCSS' => [ - 'input' => [ - 'remove_unused_css' => false, - 'nonce' => 'rocket_clear_usedcss', - 'cap' => true, - 'option_enabled' => true, - 'db_items' => $items, - 'cache_files' => $cache_files, - 'not_completed_count' => 0, - 'home_url' => 'http://example.org', - 'home_request_configs' => [ - 'timeout' => 0.01, - 'blocking' => false, - 'user-agent' => 'WP Rocket/Homepage Preload', - 'sslverify' => false, - ] - ], - 'expected' => [ - 'truncated' => true, - 'notice_details' => [ - 'status' => 'success', - 'message' => 'WP Rocket: Used CSS cache cleared!', - ], - ], - ], - - 'shouldDeleteUnusedCSS' => [ - 'input' => [ - 'remove_unused_css' => false, - 'nonce' => 'rocket_clear_usedcss', - 'cap' => true, - 'option_enabled' => true, - 'db_items' => $items, - 'cache_files' => $cache_files, - 'not_completed_count' => 10, - 'home_url' => 'http://example.org', - 'home_request_configs' => [ - 'timeout' => 0.01, - 'blocking' => false, - 'user-agent' => 'WP Rocket/Homepage Preload', - 'sslverify' => false, - ] - ], - 'expected' => [ - 'truncated' => true, - 'notice_details' => [ - 'status' => 'success', - 'message' => 'WP Rocket: Used CSS cache cleared!', - ], - ], - ], - - ], -]; diff --git a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Subscriber/truncateUsedCss.php b/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Subscriber/truncateUsedCss.php index deb8c03d69..5a1576f3a6 100644 --- a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Subscriber/truncateUsedCss.php +++ b/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Subscriber/truncateUsedCss.php @@ -17,13 +17,6 @@ return [ - 'shouldNotTruncateUnusedCSSDueToMissingSettings' => [ - 'input' => [ - 'items' => $items, - 'remove_unused_css' => false, - 'home' => 'https://example.org', - ], - ], 'shouldTruncateUnusedCSS' => [ 'input' => [ 'remove_unused_css' => true, diff --git a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/checkJobStatus.php b/tests/Fixtures/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/checkJobStatus.php deleted file mode 100644 index 594c274060..0000000000 --- a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/checkJobStatus.php +++ /dev/null @@ -1,108 +0,0 @@ - [ - 'config' => [ - 'job_id' => 1, - 'row_details' => [ - 'job_id' => 1, - 'url' => 'http://example.com', - 'queue_name' => 1, - 'is_home' => 1, - 'is_mobile' => 0, - 'retries' => 0, - ], - 'job_details' => [ - 'code' => 200, - 'contents' => [ - 'shakedCSS' => '.test{color:red}.test_1{color:blue}.test_2{color:black}.test_3{color:red}.test_4{color:blue}.test_5{color:black}.test_6{color:black}.test_7{color:red}.test_8{color:blue}.test_9{color:black}', - 'shakedCSS_size' => '150' - ], - 'is_home' => 1, - ], - 'is_used_css_file_written' => 1 - ], - 'expected' => '', - - ], - 'expectStatusFaildMinCSS_Size' => [ - 'config' => [ - 'job_id' => 1, - 'row_details' => [ - 'job_id' => 1, - 'url' => 'http://example.com', - 'queue_name' => 1, - 'is_home' => 1, - 'is_mobile' => 0, - 'retries' => 0, - ], - 'job_details' => [ - 'code' => 200, - 'contents' => [ - 'shakedCSS' => '.test{color:red}', - 'shakedCSS_size' => '16' - ], - 'is_home' => 1, - ], - ], - 'expected' => '', - - ], - 'expectStatusFailedNoRetries' => [ - 'config' => [ - 'job_id' => 1, - 'row_details' => [ - 'job_id' => 1, - 'url' => 'http://example.com', - 'queue_name' => 1, - 'is_home' => 1, - 'is_mobile' => 0, - 'retries' => 4, - ], - 'job_details' => [ - 'code' => 500, - 'message' => 'ERROR' - ], - ], - 'expected' => '', - - ], - 'expectStatusFailedWithRetries' => [ - 'config' => [ - 'job_id' => 1, - 'row_details' => [ - 'job_id' => 1, - 'url' => 'http://example.com', - 'queue_name' => 1, - 'is_home' => 1, - 'is_mobile' => 0, - 'retries' => 2, - ], - 'job_details' => [ - 'code' => 500, - 'message' => 'ERROR' - ], - ], - 'expected' => '', - - ], - 'expectStatusTimeoutWithRetries' => [ - 'config' => [ - 'job_id' => 1, - 'row_details' => [ - 'job_id' => 1, - 'url' => 'http://example.com', - 'queue_name' => 1, - 'is_home' => 1, - 'is_mobile' => 0, - 'retries' => 1, - ], - 'job_details' => [ - 'code' => 408, - 'message' => 'timeout' - ], - ], - 'expected' => '', - - ], -]; diff --git a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/clearFailedUrls.php b/tests/Fixtures/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/clearFailedUrls.php deleted file mode 100644 index 25205468ea..0000000000 --- a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/clearFailedUrls.php +++ /dev/null @@ -1,104 +0,0 @@ - 200, - 'contents' => [ 'jobId' => '2' ] -]; -return [ - 'testShouldBailOutWithEmptyRows' => [ - 'config' => [ - 'rows' => [], - ], - 'expected' => [ - 'failed_urls' => [], - ], - ], - 'testShouldBailOutWithAlphabeticStringAsId' => [ - 'config' => [ - 'rows' => [ - (object) [ - 'id' => 'two', - 'url' => 'http://example.org/test-2', - 'is_mobile' => false, - ], - (object) [ - 'id' => 'three', - 'url' => 'http://example.org/test-3', - 'is_mobile' => false, - ], - (object) [ - 'id' => 'four', - 'url' => 'http://example.org/test-4', - 'is_mobile' => false, - ], - ], - 'is_int' => false, - ], - 'expected' => [ - 'failed_urls' => [ - 'http://example.org/test-2', - 'http://example.org/test-3', - 'http://example.org/test-4', - ], - ], - ], - 'testShouldClearFailedUrlsWithNumericStringAsId' => [ - 'config' => [ - 'rows' => [ - (object) [ - 'id' => '2', - 'url' => 'http://example.org/test-2', - 'is_mobile' => false, - ], - (object) [ - 'id' => '3', - 'url' => 'http://example.org/test-3', - 'is_mobile' => false, - ], - (object) [ - 'id' => '4', - 'url' => 'http://example.org/test-4', - 'is_mobile' => false, - ], - ], - 'is_int' => true, - 'add_to_queue_response' => $add_to_queue_response, - ], - 'expected' => [ - 'failed_urls' => [ - 'http://example.org/test-2', - 'http://example.org/test-3', - 'http://example.org/test-4', - ], - ], - ], - 'testShouldClearFailedUrlsWithIntegergAsId' => [ - 'config' => [ - 'rows' => [ - (object) [ - 'id' => 2, - 'url' => 'http://example.org/test-2', - 'is_mobile' => false, - ], - (object) [ - 'id' => 3, - 'url' => 'http://example.org/test-3', - 'is_mobile' => false, - ], - (object) [ - 'id' => 4, - 'url' => 'http://example.org/test-4', - 'is_mobile' => false, - ], - ], - 'is_int' => true, - 'add_to_queue_response' => $add_to_queue_response, - ], - 'expected' => [ - 'failed_urls' => [ - 'http://example.org/test-2', - 'http://example.org/test-3', - 'http://example.org/test-4', - ], - ], - ], -]; diff --git a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/processOnSubmitJobs.php b/tests/Fixtures/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/processOnSubmitJobs.php deleted file mode 100644 index 86d64d66b2..0000000000 --- a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/processOnSubmitJobs.php +++ /dev/null @@ -1,185 +0,0 @@ - [ - 'config' => [ - 'home_url' => 'http://example.org', - 'rucss_enabled' => false, - 'pending_count' => 100, - 'max_processing' => 300, - 'rows' => [ - (object) [ - 'id' => 1, - 'url' => 'http://example.org', - 'is_mobile' => false, - ], - (object) [ - 'id' => 2, - 'url' => 'http://example.org/2', - 'is_mobile' => false, - ] - ], - 'add_to_queue' => [ - [ - 'url' => 'http://example.org', - 'configs' => [ - 'treeshake' => 1, - 'rucss_safelist' => [], - 'skip_attr' => [], - 'is_mobile' => false, - 'is_home' => true, - ], - 'response' => [ - 'code' => 200, - 'message' => 'message', - 'contents' => [ - 'jobId' => 'jobId', - 'queueName' => 'queueName', - ] - ] - ], - [ - 'url' => 'http://example.org/2', - 'configs' => [ - 'treeshake' => 1, - 'rucss_safelist' => [], - 'skip_attr' => [], - 'is_mobile' => false, - 'is_home' => false, - ], - 'response' => [ - 'code' => 400, - 'message' => 'message', - ] - ] - ], - 'make_status_pending' => [ - [ - 'id' => 1, - 'jobId' => 'jobId', - 'queueName' => 'queueName', - 'mobile' => false, - ] - ] - ], - 'expected' => [ - 'pending_count' => 100, - 'max_processing' => 300 - ] - ], - 'shouldPassPending' => [ - 'config' => [ - 'home_url' => 'http://example.org', - 'rucss_enabled' => true, - 'pending_count' => 100, - 'max_processing' => 300, - 'rows' => [ - (object) [ - 'id' => 1, - 'url' => 'http://example.org', - 'is_mobile' => false, - ], - (object) [ - 'id' => 2, - 'url' => 'http://example.org/2', - 'is_mobile' => false, - ] - ], - 'add_to_queue' => [ - [ - 'url' => 'http://example.org', - 'configs' => [ - 'treeshake' => 1, - 'rucss_safelist' => [], - 'skip_attr' => [], - 'is_mobile' => false, - 'is_home' => true, - ], - 'response' => [ - 'code' => 200, - 'message' => 'message', - 'contents' => [ - 'jobId' => 'jobId', - 'queueName' => 'queueName', - ] - ] - ], - [ - 'url' => 'http://example.org/2', - 'configs' => [ - 'treeshake' => 1, - 'rucss_safelist' => [], - 'skip_attr' => [], - 'is_mobile' => false, - 'is_home' => false, - ], - 'response' => [ - 'code' => 400, - 'message' => 'message', - ] - ] - ], - 'make_status_pending' => [ - [ - 'id' => 1, - 'jobId' => 'jobId', - 'queueName' => 'queueName', - 'mobile' => false, - ] - ], - 'make_status_failed' => [] - ], - 'expected' => [ - 'pending_count' => 100, - 'max_processing' => 300 - ] - ], - 'shouldFailWhenNot200' => [ - 'config' => [ - 'home_url' => 'http://example.org', - 'rucss_enabled' => true, - 'pending_count' => 100, - 'max_processing' => 300, - 'rows' => [ - (object) [ - 'id' => 1, - 'url' => 'http://example.org', - 'is_mobile' => false, - ] - ], - 'add_to_queue' => [ - [ - 'url' => 'http://example.org', - 'configs' => [ - 'treeshake' => 1, - 'rucss_safelist' => [], - 'skip_attr' => [], - 'is_mobile' => false, - 'is_home' => true, - ], - 'response' => [ - 'code' => 401, - 'message' => 'message', - 'contents' => [ - 'jobId' => 'jobId', - 'queueName' => 'queueName', - ] - ] - ] - ], - 'make_status_pending' => [ - - ], - 'make_status_failed' => [ - [ - 'id' => 1, - 'code' => '', - 'message' => '', - ] - ] - ], - 'expected' => [ - 'pending_count' => 100, - 'max_processing' => 300 - ] - ], -]; diff --git a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/processPendingJobs.php b/tests/Fixtures/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/processPendingJobs.php deleted file mode 100644 index c23501b2ff..0000000000 --- a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/processPendingJobs.php +++ /dev/null @@ -1,43 +0,0 @@ - [ - 'config' => [ - 'enabled' => false, - 'rows_count' => 100, - ], - 'expected' => [ - 'rows_count' => 100, - 'in_progress' => null - ] - ], - 'noPendingShouldBailOut' => [ - 'configs' => [ - 'rows_count' => 100, - 'enabled' => true, - 'rows' => [ - ] - ], - 'expected' => [ - 'rows_count' => 100, - 'in_progress' => null, - 'next_retry_time' => '2023-11-22 02:00:00', - ] - ], - 'pendingShouldPassInProgress' => [ - 'configs' => [ - 'rows_count' => 100, - 'enabled' => true, - 'rows' => [ - (object) [ - 'id' => 10, - 'url' => 'http://example.org', - 'next_retry_time' => '2023-11-22 02:00:00', - ] - ] - ], - 'expected' => [ - 'rows_count' => 100, - 'in_progress' => 10, - ] - ] -]; diff --git a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/treeshake.php b/tests/Fixtures/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/treeshake.php index 2c97586d38..95f7bc4b93 100644 --- a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/treeshake.php +++ b/tests/Fixtures/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/treeshake.php @@ -28,7 +28,6 @@ 'safelist' => [], 'skipped_attr' => [], 'config' => [ - 'treeshake' => 1, 'rucss_safelist' => [], 'skip_attr' => [], 'is_mobile' => false, diff --git a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Frontend/Subscriber/treeshake.php b/tests/Fixtures/inc/Engine/Optimization/RUCSS/Frontend/Subscriber/treeshake.php index 1ac705e8d1..2c95dd9c36 100644 --- a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Frontend/Subscriber/treeshake.php +++ b/tests/Fixtures/inc/Engine/Optimization/RUCSS/Frontend/Subscriber/treeshake.php @@ -62,8 +62,6 @@ 'rows' => [ [ 'url' => 'http://example.org', - 'job_id' => '', - 'queue_name' => '', 'is_mobile' => false, 'status' => 'pending', 'retries' => 0, diff --git a/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php b/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php new file mode 100644 index 0000000000..ae980ac87e --- /dev/null +++ b/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php @@ -0,0 +1,50 @@ + [ + 'config' => [ + 'environment' => 'local', + 'is_admin' => false, + 'atf_context' => false, + 'remove_unused_css' => 0, + 'current_user_can' => true, + ], + 'expected' => null, + ], + 'testShouldReturnNullWhenNotAdmin' => [ + 'config' => [ + 'environment' => 'production', + 'is_admin' => false, + 'atf_context' => false, + 'remove_unused_css' => 0, + 'current_user_can' => true, + ], + 'expected' => null, + ], + 'testShouldAddItemWithDefaultTitle' => [ + 'config' => [ + 'environment' => 'production', + 'is_admin' => true, + 'atf_context' => true, + 'remove_unused_css' => 0, + 'current_user_can' => true, + ], + 'expected' => [ + 'id' => 'clean-saas', + 'title' => 'Clear Critical Images', + ], + ], + 'testShouldAddItemWithRUCSSTitle' => [ + 'config' => [ + 'environment' => 'production', + 'is_admin' => true, + 'atf_context' => true, + 'remove_unused_css' => 1, + 'current_user_can' => true, + ], + 'expected' => [ + 'id' => 'clean-saas', + 'title' => 'Clear Used CSS', + ], + ], +]; diff --git a/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php b/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php new file mode 100644 index 0000000000..985a06b1a3 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php @@ -0,0 +1,94 @@ + [ + 'config' => [ + 'environment' => 'local', + 'is_admin' => false, + 'post' => (object) [ + 'post_type' => 'post', + 'post_status' => 'publish', + ], + 'can_display_options' => true, + 'atf_context' => true, + 'rucss_context' => true, + ], + 'expected' => null, + ], + 'testShouldReturnNullWhenAdmin' => [ + 'config' => [ + 'environment' => 'production', + 'is_admin' => true, + 'post' => (object) [ + 'post_type' => 'post', + 'post_status' => 'publish', + ], + 'can_display_options' => true, + 'atf_context' => true, + 'rucss_context' => true, + ], + 'expected' => null, + ], + 'testShouldReturnNullWhenOptionsNotDisplayed' => [ + 'config' => [ + 'environment' => 'production', + 'is_admin' => false, + 'post' => (object) [ + 'post_type' => 'post', + 'post_status' => 'draft', + ], + 'can_display_options' => false, + 'atf_context' => true, + 'rucss_context' => true, + ], + 'expected' => null, + ], + 'testShouldReturnNullWhenNotAllowed' => [ + 'config' => [ + 'environment' => 'production', + 'is_admin' => false, + 'post' => (object) [ + 'post_type' => 'post', + 'post_status' => 'publish', + ], + 'can_display_options' => true, + 'atf_context' => false, + 'rucss_context' => false, + ], + 'expected' => null, + ], + 'testShouldAddItemWithDefaultTitle' => [ + 'config' => [ + 'environment' => 'production', + 'is_admin' => false, + 'post' => (object) [ + 'post_type' => 'post', + 'post_status' => 'publish', + ], + 'can_display_options' => true, + 'atf_context' => true, + 'rucss_context' => false, + ], + 'expected' => [ + 'id' => 'clear-saas-url', + 'title' => 'Clear Critical Images of this URL', + ], + ], + 'testShouldAddItemWithRUCSSTitle' => [ + 'config' => [ + 'environment' => 'production', + 'is_admin' => false, + 'post' => (object) [ + 'post_type' => 'post', + 'post_status' => 'publish', + ], + 'can_display_options' => true, + 'atf_context' => true, + 'rucss_context' => true, + ], + 'expected' => [ + 'id' => 'clear-saas-url', + 'title' => 'Clear Used CSS of this URL', + ], + ], +]; diff --git a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Settings/addLocalizeScriptData.php b/tests/Fixtures/inc/Engine/Saas/Admin/Notices/addLocalizeScriptData.php similarity index 90% rename from tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Settings/addLocalizeScriptData.php rename to tests/Fixtures/inc/Engine/Saas/Admin/Notices/addLocalizeScriptData.php index eea3cfb2d0..0bb7c54e71 100644 --- a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Settings/addLocalizeScriptData.php +++ b/tests/Fixtures/inc/Engine/Saas/Admin/Notices/addLocalizeScriptData.php @@ -4,6 +4,7 @@ 'shouldReturnSameWhenRUCSSDisabled' => [ 'config' => [ 'remove_unused_css' => 0, + 'atf' => false, 'transient' => false, 'data' => [], ], @@ -12,6 +13,7 @@ 'shouldReturnSameWhenNoTransient' => [ 'config' => [ 'remove_unused_css' => 1, + 'atf' => true, 'transient' => false, 'data' => [], ], @@ -20,6 +22,7 @@ 'shouldReturnUpdatedWhenTransient' => [ 'config' => [ 'remove_unused_css' => 1, + 'atf' => true, 'transient' => time(), 'data' => [], ], diff --git a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Settings/displayProcessingNotice.php b/tests/Fixtures/inc/Engine/Saas/Admin/Notices/displayProcessingNotice.php similarity index 80% rename from tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Settings/displayProcessingNotice.php rename to tests/Fixtures/inc/Engine/Saas/Admin/Notices/displayProcessingNotice.php index ca63e4b1e2..edfc1cebf5 100644 --- a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Settings/displayProcessingNotice.php +++ b/tests/Fixtures/inc/Engine/Saas/Admin/Notices/displayProcessingNotice.php @@ -12,7 +12,6 @@ 'capability' => true, 'remove_unused_css' => 1, 'transient' => false, - 'exists' => true, 'saas_transient' => false, ], 'expected' => false, @@ -25,7 +24,6 @@ 'capability' => false, 'remove_unused_css' => 1, 'transient' => false, - 'exists' => true, 'saas_transient' => false, ], 'expected' => false, @@ -38,7 +36,6 @@ 'capability' => true, 'remove_unused_css' => 0, 'transient' => false, - 'exists' => true, 'saas_transient' => false, ], 'expected' => false, @@ -51,7 +48,6 @@ 'capability' => true, 'remove_unused_css' => 1, 'transient' => time() - 60, - 'exists' => true, 'saas_transient' => false, ], 'expected' => false, @@ -64,7 +60,6 @@ 'capability' => true, 'remove_unused_css' => 1, 'transient' => false, - 'exists' => true, 'saas_transient' => false, ], 'expected' => false, @@ -77,24 +72,10 @@ 'capability' => true, 'remove_unused_css' => 1, 'transient' => time() + 3600, - 'exists' => true, 'saas_transient' => false, ], 'expected' => true, ], - 'shouldShowNoNoticeWhenNoTable' => [ - 'config' => [ - 'current_screen' => (object) [ - 'id' => 'settings_page_wprocket', - ], - 'capability' => true, - 'remove_unused_css' => 1, - 'transient' => time() + 3600, - 'exists' => false, - 'saas_transient' => false, - ], - 'expected' => false, - ], 'shouldShowNoNoticeWhenSaasError' => [ 'config' => [ 'current_screen' => (object) [ @@ -103,7 +84,6 @@ 'capability' => true, 'remove_unused_css' => 1, 'transient' => time() + 3600, - 'exists' => false, 'saas_transient' => true, ], 'expected' => false, diff --git a/tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Settings/displaySaasErrorNotice.php b/tests/Fixtures/inc/Engine/Saas/Admin/Notices/displaySaasErrorNotice.php similarity index 100% rename from tests/Fixtures/inc/Engine/Optimization/RUCSS/Admin/Settings/displaySaasErrorNotice.php rename to tests/Fixtures/inc/Engine/Saas/Admin/Notices/displaySaasErrorNotice.php diff --git a/tests/Fixtures/inc/Engine/Saas/Admin/Notices/displaySuccessNotice.php b/tests/Fixtures/inc/Engine/Saas/Admin/Notices/displaySuccessNotice.php new file mode 100644 index 0000000000..42c7ea9183 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Saas/Admin/Notices/displaySuccessNotice.php @@ -0,0 +1,47 @@ + 'wp-content/', + + 'test_data' => [ + 'shouldDoNothingWhenNotWPRSettingsPage' => [ + 'config' => [ + 'current_screen' => (object) [ + 'id' => 'dashboard', + ], + 'capability' => true, + 'boxes' => [], + 'manual_preload' => 1, + 'transient' => false, + 'saas_transient' => false, + ], + 'expected' => false, + ], + 'shouldDoNothingWhenNoCapability' => [ + 'config' => [ + 'current_screen' => (object) [ + 'id' => 'settings_page_wprocket', + ], + 'capability' => false, + 'boxes' => [], + 'manual_preload' => 1, + 'transient' => false, + 'saas_transient' => false, + ], + 'expected' => false, + ], + 'shouldDoNothingWhenSaasError' => [ + 'config' => [ + 'current_screen' => (object) [ + 'id' => 'settings_page_wprocket', + ], + 'capability' => true, + 'boxes' => [], + 'manual_preload' => 0, + 'transient' => false, + 'saas_transient' => true, + ], + 'expected' => false, + ], + ], +]; diff --git a/tests/Fixtures/inc/ThirdParty/Hostings/Kinsta/cleanKinstaCacheUrl.php b/tests/Fixtures/inc/ThirdParty/Hostings/Kinsta/cleanKinstaCacheUrl.php index f151011552..5b651cb79f 100644 --- a/tests/Fixtures/inc/ThirdParty/Hostings/Kinsta/cleanKinstaCacheUrl.php +++ b/tests/Fixtures/inc/ThirdParty/Hostings/Kinsta/cleanKinstaCacheUrl.php @@ -15,7 +15,7 @@ ], 'rocketRucssCompleteJobStatusSshouldCleanUrl' => [ 'config' => [ - 'hook' => 'rocket_rucss_complete_job_status', + 'hook' => 'rocket_saas_complete_job_status', 'url' => 'url', ], 'expected' => [ diff --git a/tests/Fixtures/inc/ThirdParty/Hostings/WPEngine/Int/addFootprint.php b/tests/Fixtures/inc/ThirdParty/Hostings/WPEngine/Int/addFootprint.php new file mode 100644 index 0000000000..4a22538be3 --- /dev/null +++ b/tests/Fixtures/inc/ThirdParty/Hostings/WPEngine/Int/addFootprint.php @@ -0,0 +1,27 @@ + [ + 'white_label_footprint' => false, + 'html' => 'Sample Page' . + '', + 'expected' => 'Sample Page' . + '' . + "\n" . '', + ], + 'testWPEngineAddFootprintWithWhitelabel' => [ + 'white_label_footprint' => true, + 'html' => 'Sample Page' . + '', + 'expected' => 'Sample Page' . + '' . + "\n" . '', + ], + 'testWPEngineAddFootprintNoHtmlShouldBailOut' => [ + 'white_label_footprint' => false, + 'html' => 'Sample Page' . + '', + 'expected' => 'Sample Page' . + '', + ], +]; diff --git a/tests/Fixtures/inc/ThirdParty/Themes/Divi/Integration/disableImageDimensionsHeightPercentage.php b/tests/Fixtures/inc/ThirdParty/Themes/Divi/Integration/disableImageDimensionsHeightPercentage.php new file mode 100644 index 0000000000..df47d5c52c --- /dev/null +++ b/tests/Fixtures/inc/ThirdParty/Themes/Divi/Integration/disableImageDimensionsHeightPercentage.php @@ -0,0 +1,101 @@ + + + + + + + + +ORIGINALHTML; + +$nonce = wp_create_nonce( 'rocket_lcp' ); + +$expected_html = << + + + + + + + +EXPECTEDHTML; + +return [ + 'vfs_dir' => '/', + 'structure' => [ + 'wp-content' => [ + 'uploads' => [ + 'logo.jpg' => file_get_contents( WP_ROCKET_TESTS_FIXTURES_DIR . "/inc/ThirdParty/Themes/Divi/logo.jpg" ), + 'my-picture.jpg' => file_get_contents( WP_ROCKET_TESTS_FIXTURES_DIR . "/inc/ThirdParty/Themes/Divi/my-picture.jpg" ), + ] + ] + ], + + 'test_data' => [ + + 'shouldFilterLogoWhenDivi' => [ + 'config' => [ + 'stylesheet' => 'divi', + 'theme-name' => 'Divi', + 'theme-template' => '', + 'is-child' => '', + 'images' => [ + '', + '', + ], + ], + 'expected' => [ + '', + ], + 'html' => [ + 'original' => $original_html, + 'expected' => $expected_html, + ] + ], + + 'shouldFilterLogoWhenDiviChild' => [ + 'config' => [ + 'stylesheet' => 'child-of-divi', + 'theme-name' => 'Divi Child', + 'theme-template' => 'divi', + 'is-child' => 'divi', + 'parent-name' => 'Divi', + 'images' => [ + '', + '', + ], + ], + 'expected' => [ + '', + ], + 'html' => [ + 'original' => $original_html, + 'expected' => $expected_html, + ] + ], + + 'shouldFilterOnCaseInsensitiveAttribute' => [ + 'config' => [ + 'stylesheet' => 'divi', + 'theme-name' => 'Divi', + 'theme-template' => '', + 'is-child' => '', + 'images' => [ + '', + '', + ], + ], + 'expected' => [ + '', + ], + 'html' => [ + 'original' => '', + 'expected' => '', + ], + ], + ], +]; diff --git a/tests/Fixtures/inc/common/rocketCleanCacheThemeUpdate.php b/tests/Fixtures/inc/common/rocketCleanCacheThemeUpdate.php index 92c98e6de8..5ab71db1eb 100644 --- a/tests/Fixtures/inc/common/rocketCleanCacheThemeUpdate.php +++ b/tests/Fixtures/inc/common/rocketCleanCacheThemeUpdate.php @@ -55,11 +55,7 @@ 'themes' => [ 'default' ], ], 'expected' => [ - 'cleaned' => [ - 'vfs://public/wp-content/cache/wp-rocket/example.org/' => null, - 'vfs://public/wp-content/cache/wp-rocket/example.org-wpmedia-123456/' => null, - 'vfs://public/wp-content/cache/wp-rocket/example.org-tester-987654/' => null, - ], + 'cleaned' => [], 'wp_get_theme' => true, ], ], diff --git a/tests/Integration/AjaxTestCase.php b/tests/Integration/AjaxTestCase.php index 393a7ac32f..0c85b42e99 100644 --- a/tests/Integration/AjaxTestCase.php +++ b/tests/Integration/AjaxTestCase.php @@ -75,7 +75,7 @@ public function set_up() { } public function tear_down() { - unset( $_POST['action'], $_POST['nonce'] ); + unset( $_POST ); $this->action = null; self::resetAdminCap(); diff --git a/tests/Integration/DBTrait.php b/tests/Integration/DBTrait.php index 646d7ebc4b..24ce1121f7 100644 --- a/tests/Integration/DBTrait.php +++ b/tests/Integration/DBTrait.php @@ -14,13 +14,13 @@ public static function addResource(array $resource) { $resource_query = $container->get( 'rucss_used_css_query' ); $job_id = $resource_query->create_new_job($resource['url'], $resource['job_id'], $resource['queue_name']); if(key_exists('status', $resource) && 'in-progress' === $resource['status']) { - $resource_query->make_status_inprogress($job_id); + $resource_query->make_status_inprogress($resource['url'], $resource['is_mobile']); } if(key_exists('status', $resource) && 'pending' === $resource['status']) { - $resource_query->make_status_pending($job_id); + $resource_query->make_status_pending($resource['url'], $job_id, $resource['queue_name'], $resource['is_mobile']); } if(key_exists('status', $resource) && 'completed' === $resource['status']) { - $resource_query->make_status_completed($job_id, $resource['hash']); + $resource_query->make_status_completed($resource['url'], $resource['is_mobile'], $resource['hash']); } return $job_id; } @@ -45,6 +45,11 @@ public static function addCache( array $resource ) { $cache_query = $container->get( 'preload_caches_query' ); return $cache_query->create_or_update( $resource ); } + public static function addLcp( array $resource ) { + $container = apply_filters( 'rocket_container', null ); + $lcp_query = $container->get( 'atf_query' ); + return $lcp_query->add_item( $resource ); + } public static function installFresh() { $container = apply_filters( 'rocket_container', null ); diff --git a/tests/Integration/inc/Engine/CDN/Subscriber/rewrite.php b/tests/Integration/inc/Engine/CDN/Subscriber/rewrite.php index 4aeaa633a5..053fe89328 100644 --- a/tests/Integration/inc/Engine/CDN/Subscriber/rewrite.php +++ b/tests/Integration/inc/Engine/CDN/Subscriber/rewrite.php @@ -4,15 +4,23 @@ /** * Test class covering \WP_Rocket\Engine\CDN\Subscriber::rewrite - * @uses \WP_Rocket\Engine\CDN\CDN::rewrite - * @group CDN - * @group rewrite + * + * @uses \WP_Rocket\Engine\CDN\CDN::rewrite + * @group CDN */ class Test_Rewrite extends TestCase { + public function set_up() { + parent::set_up(); + + $this->unregisterAllCallbacksExcept( 'rocket_buffer', 'rewrite', 20 ); + } + public function tear_down() { remove_filter( 'content_url', [ $this, 'setContentURL' ] ); remove_filter( 'includes_url', [ $this, 'setIncludesURL' ] ); + $this->restoreWpHook( 'rocket_buffer' ); + parent::tear_down(); } @@ -20,14 +28,14 @@ public function tear_down() { * @dataProvider providerTestData */ public function testShouldRewriteURL( $home_url, $original, $expected ) { - $this->cnames = [ + $this->cnames = [ 'cdn.example.org', ]; - $this->cdn_zone = [ - 'all' + $this->cdn_zone = [ + 'all', ]; - $this->home_url = $home_url; - $this->content_url = "{$home_url}/wp-content/"; + $this->home_url = $home_url; + $this->content_url = "{$home_url}/wp-content/"; $this->includes_url = "{$home_url}/wp-includes/"; add_filter( 'pre_get_rocket_option_cdn', [ $this, 'return_true' ] ); diff --git a/tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/addInterval.php b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/addInterval.php similarity index 50% rename from tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/addInterval.php rename to tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/addInterval.php index 7b3093e70c..b935b585df 100644 --- a/tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/addInterval.php +++ b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/addInterval.php @@ -1,15 +1,15 @@ interval ) { - add_filter( 'rocket_rucss_pending_jobs_cron_interval', [ $this, 'set_interval'] ); - add_filter( 'rocket_remove_rucss_failed_jobs_cron_interval', [ $this, 'set_interval'] ); + add_filter( 'rocket_saas_pending_jobs_cron_interval', [ $this, 'set_interval'] ); + add_filter( 'rocket_remove_saas_failed_jobs_cron_interval', [ $this, 'set_interval'] ); } $schedules = apply_filters( 'cron_schedules', [] ); if ( null === $expected ) { - $this->assertArrayNotHasKey( 'rocket_rucss_pending_jobs', $schedules ); - $this->assertArrayNotHasKey( 'rocket_remove_rucss_failed_jobs', $schedules ); - $this->assertArrayNotHasKey( 'rocket_rucss_on_submit_jobs', $schedules ); + $this->assertArrayNotHasKey( 'rocket_saas_pending_jobs', $schedules ); + $this->assertArrayNotHasKey( 'rocket_remove_saas_failed_jobs', $schedules ); + $this->assertArrayNotHasKey( 'rocket_saas_on_submit_jobs', $schedules ); } else { - $this->assertArrayHasKey( 'rocket_rucss_pending_jobs', $schedules ); - $this->assertArrayHasKey( 'rocket_remove_rucss_failed_jobs', $schedules ); - $this->assertArrayHasKey( 'rocket_rucss_on_submit_jobs', $schedules ); + $this->assertArrayHasKey( 'rocket_saas_pending_jobs', $schedules ); + $this->assertArrayHasKey( 'rocket_remove_saas_failed_jobs', $schedules ); + $this->assertArrayHasKey( 'rocket_saas_on_submit_jobs', $schedules ); $this->assertContains( $expected, $schedules diff --git a/tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/checkJobStatus.php b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/checkJobStatus.php similarity index 71% rename from tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/checkJobStatus.php rename to tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/checkJobStatus.php index ad4c8e1ad8..4d56ac8625 100644 --- a/tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/checkJobStatus.php +++ b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/checkJobStatus.php @@ -1,16 +1,18 @@ config = $config; $id = self::addResource($config['row']); - do_action('rocket_rucss_job_check_status', $id); + do_action('rocket_saas_job_check_status', $config['row']['url'], $config['row']['is_mobile'], $config['optimization_type']); foreach ($expected['rows'] as $row) { self::assertTrue(self::resourceFound($row)); @@ -75,5 +80,8 @@ public function rucss_hash() { return $this->config['hash']; } + public function set_rucss_option() { + return 1; + } } diff --git a/tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/cronCleanRows.php b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/cronCleanRows.php similarity index 75% rename from tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/cronCleanRows.php rename to tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/cronCleanRows.php index f7ac13e5a0..40ebde59a6 100644 --- a/tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/cronCleanRows.php +++ b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/cronCleanRows.php @@ -1,16 +1,16 @@ get( 'rucss_used_css_query' ); $current_date = current_time( 'mysql', true ); @@ -53,7 +56,7 @@ public function testShouldDoExpected( $input ) { $this->input = $input; - add_filter( 'rocket_rucss_delete_interval', [ $this, 'set_rucss_delay' ] ); + add_filter( 'rocket_saas_delete_interval', [ $this, 'set_rucss_delay' ] ); $this->set_permalink_structure( "/%postname%/" ); $count_remain_used_css = 0; @@ -68,7 +71,7 @@ public function testShouldDoExpected( $input ) { $result_used_css = $rucss_usedcss_query->query(); $this->assertCount( count( $input['used_css'] ), $result_used_css ); - do_action( 'rocket_rucss_clean_rows_time_event' ); + do_action( 'rocket_saas_clean_rows_time_event' ); $rucss_usedcss_query = $container->get( 'rucss_used_css_query' ); $resultUsedCssAfterClean = $rucss_usedcss_query->query(); @@ -84,4 +87,8 @@ public function testShouldDoExpected( $input ) { public function set_rucss_delay() { return $this->input['delay']; } + + public function set_rucss_option() { + return 1; + } } diff --git a/tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/cronRemoveFailedJobs.php b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/cronRemoveFailedJobs.php similarity index 76% rename from tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/cronRemoveFailedJobs.php rename to tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/cronRemoveFailedJobs.php index 99c90d1d96..36bb00a219 100644 --- a/tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/cronRemoveFailedJobs.php +++ b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/cronRemoveFailedJobs.php @@ -1,15 +1,15 @@ add_to_queue_response = $input['add_job_to_queue_response']; $container = apply_filters( 'rocket_container', null ); $rucss_usedcss_query = $container->get( 'rucss_used_css_query' ); @@ -49,7 +52,7 @@ public function testShouldDoExpected( $input, $expected ){ $result_used_css = $rucss_usedcss_query->query(); $this->assertCount( count( $input['used_css'] ), $result_used_css ); - do_action( 'rocket_remove_rucss_failed_jobs' ); + do_action( 'rocket_remove_saas_failed_jobs' ); $rucss_usedcss_query = $container->get( 'rucss_used_css_query' ); $resultUsedCssAfterClean = $rucss_usedcss_query->query( [ 'status' => 'to-submit' ] ); @@ -58,4 +61,8 @@ public function testShouldDoExpected( $input, $expected ){ public function edit_http_request($response, $args, $url) { return $this->add_to_queue_response; } + + public function set_rucss_option() { + return 1; + } } diff --git a/tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/processOnSubmitJobs.php b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/processOnSubmitJobs.php similarity index 76% rename from tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/processOnSubmitJobs.php rename to tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/processOnSubmitJobs.php index f7ce3131e7..51501880ab 100644 --- a/tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/processOnSubmitJobs.php +++ b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/processOnSubmitJobs.php @@ -1,13 +1,15 @@ setup_http(); } @@ -38,7 +40,7 @@ public function set_up() public function tear_down() { $this->tear_down_http(); - remove_filter('rocket_rucss_max_pending_jobs', [$this, 'max_rows']); + remove_filter('rocket_saas_max_pending_jobs', [$this, 'max_rows']); remove_filter('pre_get_rocket_option_remove_unused_css', [$this, 'rucss_enabled']); parent::tear_down(); } @@ -54,7 +56,7 @@ public function testShouldDoAsExpected( $config, $expected ) self::addResource($row); } - do_action('rocket_rucss_on_submit_jobs'); + do_action('rocket_saas_on_submit_jobs'); foreach ($expected['rows'] as $row) { $this->assertTrue(self::resourceFound($row), json_encode($row) . ' not found'); diff --git a/tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/scheduleCleanNotCommonlyUsedRows.php b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/scheduleCleanNotCommonlyUsedRows.php similarity index 61% rename from tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/scheduleCleanNotCommonlyUsedRows.php rename to tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/scheduleCleanNotCommonlyUsedRows.php index 5dbb9c7b49..96d0900f96 100644 --- a/tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/scheduleCleanNotCommonlyUsedRows.php +++ b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/scheduleCleanNotCommonlyUsedRows.php @@ -1,21 +1,21 @@ input['remove_unused_css'] ) { - $this->assertNotFalse( wp_next_scheduled( 'rocket_rucss_clean_rows_time_event' ) ); + $this->assertNotFalse( wp_next_scheduled( 'rocket_saas_clean_rows_time_event' ) ); } else { - $this->assertFalse( wp_next_scheduled( 'rocket_rucss_clean_rows_time_event' ) ); + $this->assertFalse( wp_next_scheduled( 'rocket_saas_clean_rows_time_event' ) ); } } diff --git a/tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/scheduleOnSubmitJobs.php b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/scheduleOnSubmitJobs.php similarity index 61% rename from tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/scheduleOnSubmitJobs.php rename to tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/scheduleOnSubmitJobs.php index 81003970d3..98a7c0b53c 100644 --- a/tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/scheduleOnSubmitJobs.php +++ b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/scheduleOnSubmitJobs.php @@ -1,11 +1,13 @@ config = $config; if ( $config['scheduled'] ) { - wp_schedule_event( time(), 'rocket_rucss_on_submit_jobs', 'rocket_rucss_on_submit_jobs' ); + wp_schedule_event( time(), 'rocket_saas_on_submit_jobs', 'rocket_saas_on_submit_jobs' ); } do_action('init'); if ( $expected ) { - $this->assertNotFalse( wp_next_scheduled( 'rocket_rucss_on_submit_jobs' ) ); + $this->assertNotFalse( wp_next_scheduled( 'rocket_saas_on_submit_jobs' ) ); } else { - $this->assertFalse( wp_next_scheduled( 'rocket_rucss_on_submit_jobs' ) ); + $this->assertFalse( wp_next_scheduled( 'rocket_saas_on_submit_jobs' ) ); } } diff --git a/tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/schedulePendingJobs.php b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/schedulePendingJobs.php similarity index 58% rename from tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/schedulePendingJobs.php rename to tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/schedulePendingJobs.php index 9d11adcd21..9699271d0f 100644 --- a/tests/Integration/inc/Engine/Optimization/RUCSS/Cron/Subscriber/schedulePendingJobs.php +++ b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/schedulePendingJobs.php @@ -1,14 +1,14 @@ assertNotFalse( wp_next_scheduled( 'rocket_rucss_pending_jobs' ) ); + $this->assertNotFalse( wp_next_scheduled( 'rocket_saas_pending_jobs' ) ); } else { - $this->assertFalse( wp_next_scheduled( 'rocket_rucss_pending_jobs' ) ); + $this->assertFalse( wp_next_scheduled( 'rocket_saas_pending_jobs' ) ); } } diff --git a/tests/Integration/inc/Engine/CriticalPath/RESTWPPost/generate.php b/tests/Integration/inc/Engine/CriticalPath/RESTWPPost/generate.php index 6604a5dc13..5bb33a4268 100644 --- a/tests/Integration/inc/Engine/CriticalPath/RESTWPPost/generate.php +++ b/tests/Integration/inc/Engine/CriticalPath/RESTWPPost/generate.php @@ -25,6 +25,14 @@ public static function tear_down_after_class() self::uninstallAll(); parent::tear_down_after_class(); } + /** + * Prepares the test environment before each test. + */ + public function set_up() { + $this->set_permalink_structure( "" ); + parent::set_up(); + } + protected $path_to_test_data = '/inc/Engine/CriticalPath/RESTWPPost/generate.php'; private static $post_id; diff --git a/tests/Integration/inc/Engine/Media/AboveTheFold/AJAX/Subscriber/addLcpData.php b/tests/Integration/inc/Engine/Media/AboveTheFold/AJAX/Subscriber/addLcpData.php new file mode 100644 index 0000000000..d6ffaec6ba --- /dev/null +++ b/tests/Integration/inc/Engine/Media/AboveTheFold/AJAX/Subscriber/addLcpData.php @@ -0,0 +1,66 @@ +action = 'rocket_lcp'; + + $this->clean_table(); + } + + /** + * $_POST is cleared in parent method + * + * @return void + */ + public function tear_down() { + remove_filter( 'rocket_above_the_fold_optimization', [ $this, 'set_allowed' ] ); + $this->clean_table(); + + parent::tear_down(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnExpected( $config, $expected ) { + $_POST['rocket_lcp_nonce'] = wp_create_nonce( 'rocket_lcp' ); + $_POST['action'] = 'rocket_lcp'; + $_POST['url'] = $config['url']; + $_POST['is_mobile'] = $config['is_mobile']; + $_POST['images'] = $config['images']; + + $this->allowed = $config['filter']; + + add_filter( 'rocket_above_the_fold_optimization', [ $this, 'set_allowed' ] ); + + $result = $this->callAjaxAction(); + + $this->assertSame( $expected['result'], $result->success ); + } + + public function set_allowed() { + return $this->allowed; + } + + private function clean_table() { + $container = apply_filters( 'rocket_container', null ); + $atf_table = $container->get( 'atf_table' ); + + $result = $atf_table->truncate(); + + $this->assertTrue( $result ); + } +} diff --git a/tests/Integration/inc/Engine/Media/AboveTheFold/AJAX/Subscriber/checkLcpData.php b/tests/Integration/inc/Engine/Media/AboveTheFold/AJAX/Subscriber/checkLcpData.php new file mode 100644 index 0000000000..c8ea52f363 --- /dev/null +++ b/tests/Integration/inc/Engine/Media/AboveTheFold/AJAX/Subscriber/checkLcpData.php @@ -0,0 +1,53 @@ +action = 'rocket_check_lcp'; + } + + /** + * $_POST is cleared in parent method + * + * @return void + */ + public function tear_down() { + remove_filter( 'rocket_above_the_fold_optimization', [ $this, 'set_allowed' ] ); + + parent::tear_down(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnExpected( $config, $expected ) { + $_POST = $config['post']; + + $this->allowed = $config['filter']; + + add_filter( 'rocket_above_the_fold_optimization', [ $this, 'set_allowed' ] ); + + if ( ! empty( $config['row'] ) ) { + self::addLcp( $config['row'] ); + } + + $result = $this->callAjaxAction(); + + $this->assertSame( $expected['result'], $result->success ); + } + public function set_allowed() { + return $this->allowed; + } +} diff --git a/tests/Integration/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtfAdmin.php b/tests/Integration/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtfAdmin.php new file mode 100644 index 0000000000..406dd11de6 --- /dev/null +++ b/tests/Integration/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtfAdmin.php @@ -0,0 +1,48 @@ +config = $config; + $container = apply_filters( 'rocket_container', null ); + $warm_up_controller = Mockery::mock( Controller::class ); + foreach ( $this->config['rows'] as $row ) { + self::addLcp( $row ); + } + Functions\expect( 'current_user_can' )->once()->with('rocket_manage_options')->andReturn($config['rocket_manage_options']); + do_action( 'rocket_saas_clean_all' ); + + $atf_query = $container->get( 'atf_query' ); + $result_atf_after_clean = $atf_query->query(); + + $this->assertCount( $expected, $result_atf_after_clean ); + if ( ! $expected ) { + $this->assertSame( 1, did_action( 'rocket_after_clear_atf' ) ); + } + + } +} diff --git a/tests/Integration/inc/Engine/Media/AboveTheFold/Cron/Subscriber/atfCleanup.php b/tests/Integration/inc/Engine/Media/AboveTheFold/Cron/Subscriber/atfCleanup.php new file mode 100644 index 0000000000..17a599fc46 --- /dev/null +++ b/tests/Integration/inc/Engine/Media/AboveTheFold/Cron/Subscriber/atfCleanup.php @@ -0,0 +1,83 @@ +config = $config; + $container = apply_filters( 'rocket_container', null ); + $current_date = current_time( 'mysql', true ); + $old_date = strtotime( $current_date . ' - 32 days' ); + + if ( ! empty( $config['rows'] ) ) { + foreach ( $config['rows'] as $row ) { + // If the value is 'current_date', replace it with the current date. + if ( 'current_date' === $row['last_accessed'] ) { + $row['last_accessed'] = $current_date; + } + + // If the value is 'old_date', replace it with the old date. + if ( 'old_date' === $row['last_accessed'] ) { + $row['last_accessed'] = $old_date; + } + + // Do the same for 'modified'. + if ( 'current_date' === $row['modified'] ) { + $row['modified'] = $current_date; + } + + if ( 'old_date' === $row['modified'] ) { + $row['modified'] = $old_date; + } + + self::addLcp( $row ); + } + } + + do_action( 'rocket_atf_cleanup' ); + + $atf_query = $container->get( 'atf_query' ); + $result_atf_after_clean = $atf_query->query(); + + $this->assertCount( $expected['numberRowStillInDb'], $result_atf_after_clean ); + } +} diff --git a/tests/Integration/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/lcp.php b/tests/Integration/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/lcp.php new file mode 100644 index 0000000000..4b7348a8da --- /dev/null +++ b/tests/Integration/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/lcp.php @@ -0,0 +1,58 @@ +unregisterAllCallbacksExcept( 'rocket_buffer', 'lcp', 17 ); + } + + public function tear_down() { + $this->restoreWpHook( 'rocket_buffer' ); + parent::tear_down(); + } + + /** + * @dataProvider providerTestData + */ + public function testShouldReturnAsExpected( $config, $expected ) { + $this->config = $config; + if ( ! empty( $config['row'] ) ) { + self::addLcp( $config['row'] ); + } + + Functions\when( 'wp_create_nonce' )->justReturn( '96ac96b69e' ); + + $this->assertSame( + $expected, + apply_filters( 'rocket_buffer', $config['html'] ) + ); + } +} diff --git a/tests/Integration/inc/Engine/Media/ImageDimensions/Subscriber/specifyImageDimensions.php b/tests/Integration/inc/Engine/Media/ImageDimensions/Subscriber/specifyImageDimensions.php index 12890c9397..1269bfbe06 100644 --- a/tests/Integration/inc/Engine/Media/ImageDimensions/Subscriber/specifyImageDimensions.php +++ b/tests/Integration/inc/Engine/Media/ImageDimensions/Subscriber/specifyImageDimensions.php @@ -14,6 +14,11 @@ class Test_SpecifyImageDimensions extends FilesystemTestCase { private $config_data = []; + public function set_up() { + parent::set_up(); + + $this->unregisterAllCallbacksExcept('rocket_buffer', 'specify_image_dimensions', 17); + } public function tear_down() { if ( isset( $this->config_data['image_dimensions'] ) ){ remove_filter( 'pre_get_rocket_option_image_dimensions', [$this, 'set_image_dimensions'] ); @@ -38,6 +43,8 @@ public function tear_down() { unset( $GLOBALS['wp'] ); + $this->restoreWpHook('rocket_buffer'); + parent::tear_down(); } diff --git a/tests/Integration/inc/Engine/Optimization/GoogleFonts/Combine/optimize.php b/tests/Integration/inc/Engine/Optimization/GoogleFonts/Combine/optimize.php index 38f59b8d4a..1a97e8b243 100644 --- a/tests/Integration/inc/Engine/Optimization/GoogleFonts/Combine/optimize.php +++ b/tests/Integration/inc/Engine/Optimization/GoogleFonts/Combine/optimize.php @@ -25,6 +25,7 @@ public function set_up() { 'embed', ], ]; + $this->unregisterAllCallbacksExcept('rocket_buffer', 'process', 1001 ); } public function tear_down() { @@ -32,7 +33,7 @@ public function tear_down() { remove_filter( 'rocket_combined_google_fonts_display', [ $this, 'set_display_value' ] ); unset( $this->filter_value ); - + $this->restoreWpHook('rocket_buffer'); parent::tear_down(); } diff --git a/tests/Integration/inc/Engine/Optimization/Minify/CSS/Subscriber/process.php b/tests/Integration/inc/Engine/Optimization/Minify/CSS/Subscriber/process.php index 0fea8ec354..7bb6b1c722 100644 --- a/tests/Integration/inc/Engine/Optimization/Minify/CSS/Subscriber/process.php +++ b/tests/Integration/inc/Engine/Optimization/Minify/CSS/Subscriber/process.php @@ -26,6 +26,8 @@ class Test_Process extends TestCase { public function set_up() { parent::set_up(); + $this->unregisterAllCallbacksExcept( 'rocket_buffer', 'process', 16 ); + add_filter( 'pre_get_rocket_option_minify_css', [ $this, 'return_true' ] ); add_filter( 'pre_get_rocket_option_minify_css_key', [ $this, 'return_key' ] ); } @@ -33,6 +35,8 @@ public function set_up() { public function tear_down() { parent::tear_down(); + $this->restoreWpHook( 'rocket_buffer' ); + remove_filter( 'pre_get_rocket_option_minify_css', [ $this, 'return_true' ] ); remove_filter( 'pre_get_rocket_option_minify_css_key', [ $this, 'return_key' ] ); diff --git a/tests/Integration/inc/Engine/Optimization/Minify/JS/Subscriber/process.php b/tests/Integration/inc/Engine/Optimization/Minify/JS/Subscriber/process.php index c183d02acc..1a261a9e92 100644 --- a/tests/Integration/inc/Engine/Optimization/Minify/JS/Subscriber/process.php +++ b/tests/Integration/inc/Engine/Optimization/Minify/JS/Subscriber/process.php @@ -24,9 +24,17 @@ class Test_Process extends TestCase { protected $path_to_test_data = '/inc/Engine/Optimization/Minify/JS/Subscriber/process.php'; + public function set_up() { + parent::set_up(); + + $this->unregisterAllCallbacksExcept( 'rocket_buffer', 'process', 22 ); + } + public function tear_down() { parent::tear_down(); + $this->restoreWpHook( 'rocket_buffer' ); + remove_filter( 'pre_get_rocket_option_minify_js', [ $this, 'return_true' ] ); remove_filter( 'pre_get_rocket_option_minify_js_key', [ $this, 'return_key' ] ); remove_filter( 'pre_get_rocket_option_defer_all_js', [ $this, 'return_defer_all_js' ] ); diff --git a/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Database/deleteOldUsedCss.php b/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Database/deleteOldUsedCss.php index 74312eef69..9b64530c19 100644 --- a/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Database/deleteOldUsedCss.php +++ b/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Database/deleteOldUsedCss.php @@ -65,7 +65,7 @@ public function testShouldTruncateTableWhenOptionIsEnabled(){ $this->assertTrue( $rucss_usedcss_table->exists() ); $this->assertCount( 2, $result ); - do_action( 'rocket_rucss_clean_rows_time_event' ); + do_action( 'rocket_saas_clean_rows_time_event' ); $rucss_usedcss_query = $container->get( 'rucss_used_css_query' ); $resultAfterTruncate = $rucss_usedcss_query->query(); diff --git a/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Subscriber/deleteTermUsedCss.php b/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Subscriber/deleteTermUsedCss.php index 9effdf1fa5..2748b1d34e 100644 --- a/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Subscriber/deleteTermUsedCss.php +++ b/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Subscriber/deleteTermUsedCss.php @@ -70,7 +70,7 @@ public function testShouldDoExpected( $config ) { $this->assertCount( 1, $result ); add_filter( 'pre_get_rocket_option_remove_unused_css', [ $this, 'set_rucss_option' ] ); - add_filter( 'rocket_rucss_deletion_enabled', [ $this, 'set_rucss_enabled' ] ); + add_filter( 'rocket_saas_deletion_enabled', [ $this, 'set_rucss_enabled' ] ); if ( $config['wp_error'] ) { do_action( 'edit_term', 0, 0, 'category' ); diff --git a/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Subscriber/displayNoTableNotice.php b/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Subscriber/displayNoTableNotice.php index 8aec492575..b135ee879d 100644 --- a/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Subscriber/displayNoTableNotice.php +++ b/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Subscriber/displayNoTableNotice.php @@ -52,6 +52,7 @@ public function testShouldDoAsExpected($config, $expected) { $filesystem_mock->shouldReceive('is_readable')->zeroOrMoreTimes()->andReturn(true); $filesystem_mock->shouldReceive('exists')->zeroOrMoreTimes()->andReturn(true); $filesystem_mock->shouldReceive('is_dir')->zeroOrMoreTimes()->andReturn(true); + $filesystem_mock->shouldReceive('mkdir')->zeroOrMoreTimes()->andReturn(true); $this->setCurrentUser('administrator'); set_current_screen( 'settings_page_wprocket' ); Functions\when('rocket_direct_filesystem')->justReturn($filesystem_mock); diff --git a/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Subscriber/displaySaasErrorNotice.php b/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Subscriber/displaySaasErrorNotice.php deleted file mode 100644 index e3aef4e239..0000000000 --- a/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Subscriber/displaySaasErrorNotice.php +++ /dev/null @@ -1,71 +0,0 @@ -setRoleCap( 'administrator', 'rocket_manage_options' ); - } - - public function tear_down() { - set_current_screen( 'front' ); - - $this->removeRoleCap( 'administrator', 'rocket_manage_options' ); - remove_filter('pre_get_rocket_option_remove_unused_css', [$this, 'remove_unused_css']); - delete_transient('wp_rocket_rucss_errors_count'); - parent::tear_down(); - } - - /** - * @dataProvider configTestData - */ - public function testShouldReturnAsExpected($config, $expected) { - $this->config = $config; - $filesystem_mock = Mockery::mock(WP_Filesystem_Direct::class); - $filesystem_mock->shouldReceive('is_writable')->zeroOrMoreTimes()->andReturn(true); - $filesystem_mock->shouldReceive('is_readable')->zeroOrMoreTimes()->andReturn(true); - $filesystem_mock->shouldReceive('exists')->zeroOrMoreTimes()->andReturn(true); - $filesystem_mock->shouldReceive('is_dir')->zeroOrMoreTimes()->andReturn(true); - Functions\when('rocket_direct_filesystem')->justReturn($filesystem_mock); - - $this->setCurrentUser('administrator'); - - if($config['transient_exists']) { - set_transient('wp_rocket_rucss_errors_count', true, MINUTE_IN_SECONDS); - } - set_current_screen( 'settings_page_wprocket' ); - - ob_start(); - do_action('admin_notices'); - $actual = ob_get_clean(); - if($expected['contains']) { - $this->assertStringContainsString( - $this->format_the_html( $expected['content'] ), - $this->format_the_html( $actual ) - ); - } else { - $this->assertStringNotContainsString( - $this->format_the_html( $expected['content'] ), - $this->format_the_html( $actual ) - ); - } - - } - - public function remove_unused_css() { - return $this->config['remove_unused_css']; - } -} diff --git a/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Subscriber/truncateUsedCSSHandler.php b/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Subscriber/truncateUsedCSSHandler.php deleted file mode 100644 index edf5336d14..0000000000 --- a/tests/Integration/inc/Engine/Optimization/RUCSS/Admin/Subscriber/truncateUsedCSSHandler.php +++ /dev/null @@ -1,116 +0,0 @@ -add_cap( 'rocket_remove_unused_css' ); - - self::$admin_user_id = static::factory()->user->create( [ 'role' => 'administrator' ] ); - self::$contributer_user_id = static::factory()->user->create( [ 'role' => 'contributor' ] ); - } - - public static function tear_down_after_class() { - parent::tear_down_after_class(); - - self::uninstallAll(); - } - - public function tear_down() : void { - parent::tear_down(); - - remove_filter( 'pre_get_rocket_option_remove_unused_css', [ $this, 'set_rucss_option' ] ); - unset( $_GET['_wpnonce'] ); - } - - /** - * @dataProvider providerTestData - */ - public function testShouldDoExpected( $input, $expected ) { - if ( isset( $input['nonce'] ) ) { - $_GET['_wpnonce'] = wp_create_nonce( $input['nonce'] ); - } - - if ( isset( $input['cap'] ) ) { - $user_id = $input['cap'] ? self::$admin_user_id : self::$contributer_user_id; - wp_set_current_user( $user_id ); - } - - if ( isset( $input['option_enabled'] ) ) { - $this->rucss_option = $input['option_enabled']; - add_filter( 'pre_get_rocket_option_remove_unused_css', [ $this, 'set_rucss_option' ] ); - } - - $container = apply_filters( 'rocket_container', null ); - $rucss_usedcss_query = $container->get( 'rucss_used_css_query' ); - - foreach ( $input['db_items'] as $item ) { - $rucss_usedcss_query->add_item( $item ); - } - $before_count = $rucss_usedcss_query->query( [ 'count' => true ] ); - - $this->assertEquals( count( $input['db_items'] ), $before_count ); - - foreach ( $input['cache_files'] as $file => $content ) { - $this->assertTrue( $this->filesystem->exists( $file ) ); - } - - $this->expectException( WPDieException::class ); - - do_action( 'admin_post_rocket_clear_usedcss' ); - - $rucss_usedcss_query = $container->get( 'rucss_used_css_query' ); - $after_count = $rucss_usedcss_query->query( [ 'count' => true ] ); - - if ( $expected['truncated'] ) { - $this->assertEquals( 0, $after_count ); - - // Test that cache Files are still available. - foreach ( $input['cache_files'] as $file => $content ) { - $this->assertFalse( $this->filesystem->exists( $file ) ); - } - }else{ - $this->assertEquals( count( $input['db_items'] ), $after_count ); - - // Test that cache Files are still available. - foreach ( $input['cache_files'] as $file => $content ) { - $this->assertTrue( $this->filesystem->exists( $file ) ); - } - } - - if ( ! empty( $expected['notice_details'] ) ) { - $transient = get_transient( 'rocket_clear_usedcss_response' ); - $this->assertSame( $expected['notice_details'], $transient ); - } - - } - - public function set_rucss_option() { - return $this->rucss_option; - } - -} diff --git a/tests/Integration/inc/Engine/Optimization/RUCSS/Frontend/Subscriber/onUpdate.php b/tests/Integration/inc/Engine/Optimization/RUCSS/Frontend/Subscriber/onUpdate.php index bcc9da60ff..ff96e6a114 100644 --- a/tests/Integration/inc/Engine/Optimization/RUCSS/Frontend/Subscriber/onUpdate.php +++ b/tests/Integration/inc/Engine/Optimization/RUCSS/Frontend/Subscriber/onUpdate.php @@ -6,6 +6,8 @@ /** * Test class covering \WP_Rocket\Engine\Optimization\RUCSS\Frontend\Subscriber::on_update + * + * @group RUCSS */ class Test_onUpdate extends TestCase { diff --git a/tests/Integration/inc/Engine/Optimization/RUCSS/Frontend/Subscriber/treeshake.php b/tests/Integration/inc/Engine/Optimization/RUCSS/Frontend/Subscriber/treeshake.php index 628bf6ed22..3336b21299 100644 --- a/tests/Integration/inc/Engine/Optimization/RUCSS/Frontend/Subscriber/treeshake.php +++ b/tests/Integration/inc/Engine/Optimization/RUCSS/Frontend/Subscriber/treeshake.php @@ -7,8 +7,9 @@ use WP_Rocket\Tests\Integration\TestCase; /** - * @group RUCSS * Test class covering \WP_Rocket\Engine\Optimization\RUCSS\Frontend\Subscriber::treeshake + * + * @group RUCSS */ class Test_treeshake extends FilesystemTestCase { @@ -34,6 +35,7 @@ public static function tear_down_after_class() public function set_up() { parent::set_up(); + $this->unregisterAllCallbacksExcept('rocket_buffer', 'treeshake', 1000 ); add_filter('pre_get_rocket_option_remove_unused_css', [$this, 'rucss']); add_filter('rocket_exclude_rucss_fonts_preload', [$this, 'exclude_fonts_preload']); add_filter('rocket_used_css_dir_level', [$this, 'used_css_dir_level']); @@ -45,6 +47,7 @@ public function tear_down() remove_filter('rocket_exclude_rucss_fonts_preload', [$this, 'exclude_fonts_preload']); remove_filter('rocket_used_css_dir_level', [$this, 'used_css_dir_level']); + $this->restoreWpHook('rocket_buffer'); parent::tear_down(); } diff --git a/tests/Integration/inc/Engine/Preload/Fonts/preloadFonts.php b/tests/Integration/inc/Engine/Preload/Fonts/preloadFonts.php index 7cd928e6be..750f174ddd 100644 --- a/tests/Integration/inc/Engine/Preload/Fonts/preloadFonts.php +++ b/tests/Integration/inc/Engine/Preload/Fonts/preloadFonts.php @@ -15,6 +15,11 @@ class Test_PreloadFonts extends TestCase { private $cdn; private $cnames; + public function set_up() { + parent::set_up(); + + $this->unregisterAllCallbacksExcept( 'rocket_buffer', 'preload_fonts', 20); + } public function tear_down() { remove_filter( 'pre_get_rocket_option_preload_fonts', [ $this, 'return_preload_fonts' ] ); remove_filter( 'pre_get_rocket_option_cdn', [ $this, 'return_cdn' ] ); @@ -23,7 +28,7 @@ public function tear_down() { remove_filter( 'rocket_disable_preload_fonts', [ $this, 'return_true' ] ); unset( $_GET['nowprocket'] ); - + $this->restoreWpHook('rocket_buffer'); parent::tear_down(); } diff --git a/tests/Integration/inc/Engine/WPRocketUninstall/uninstall.php b/tests/Integration/inc/Engine/WPRocketUninstall/uninstall.php index 59aa61c738..5478b890a2 100644 --- a/tests/Integration/inc/Engine/WPRocketUninstall/uninstall.php +++ b/tests/Integration/inc/Engine/WPRocketUninstall/uninstall.php @@ -119,8 +119,9 @@ public function testShouldDeleteAll() { $container = apply_filters( 'rocket_container', null ); $rucss_usedcss_table = $container->get( 'rucss_usedcss_table' ); $preload_table = $container->get( 'preload_caches_table' ); + $atf_table = $container->get( 'atf_table' ); - $uninstall = new WPRocketUninstall( $cache_path, $config_path, $rucss_usedcss_table, $preload_table ); + $uninstall = new WPRocketUninstall( $cache_path, $config_path, $rucss_usedcss_table, $preload_table, $atf_table ); $uninstall->uninstall(); diff --git a/tests/Integration/inc/ThirdParty/Hostings/WPEngine/addFootprint.php b/tests/Integration/inc/ThirdParty/Hostings/WPEngine/addFootprint.php index 45048ef734..a23ded55a2 100644 --- a/tests/Integration/inc/ThirdParty/Hostings/WPEngine/addFootprint.php +++ b/tests/Integration/inc/ThirdParty/Hostings/WPEngine/addFootprint.php @@ -12,6 +12,17 @@ * @group ThirdParty */ class Test_AddFootprint extends TestCase { + public function set_up() { + parent::set_up(); + + $this->unregisterAllCallbacksExcept( 'rocket_buffer', 'add_footprint', 50 ); + } + + public function tear_down() { + $this->restoreWpHook( 'rocket_buffer' ); + + parent::tear_down(); + } /** * @dataProvider providerTestData @@ -27,6 +38,6 @@ public function testShouldAddFootprint( $white_label_footprint, $html, $expected } public function providerTestData() { - return $this->getTestData( __DIR__, 'addFootprint' ); + return $this->getTestData( __DIR__ . '/Int', 'addFootprint' ); } } diff --git a/tests/Integration/inc/ThirdParty/Plugins/Ads/Adthrive/addDelayJsExclusion.php b/tests/Integration/inc/ThirdParty/Plugins/Ads/Adthrive/addDelayJsExclusion.php index fe0392cb3a..ae8c93a6f4 100644 --- a/tests/Integration/inc/ThirdParty/Plugins/Ads/Adthrive/addDelayJsExclusion.php +++ b/tests/Integration/inc/ThirdParty/Plugins/Ads/Adthrive/addDelayJsExclusion.php @@ -40,6 +40,7 @@ public function testShouldDoExpected( $settings, $expected ) { do_action( 'activate_adthrive-ads/adthrive-ads.php' ); $options = get_option( 'wp_rocket_settings' ); + unset($options['cache_reject_uri']); $this->assertSame( $options, diff --git a/tests/Integration/inc/ThirdParty/Plugins/I18n/TranslatePress/detectHomepage.php b/tests/Integration/inc/ThirdParty/Plugins/I18n/TranslatePress/detectHomepage.php index 884106993c..844361c85b 100644 --- a/tests/Integration/inc/ThirdParty/Plugins/I18n/TranslatePress/detectHomepage.php +++ b/tests/Integration/inc/ThirdParty/Plugins/I18n/TranslatePress/detectHomepage.php @@ -18,7 +18,7 @@ public function testShouldReturnAsExpected( $config, $expected ) { $this->assertSame( $expected, - apply_filters( 'rocket_rucss_is_home_url', $config['home_url'], $config['url'] ) + apply_filters( 'rocket_saas_is_home_url', $config['home_url'], $config['url'] ) ); } } diff --git a/tests/Integration/inc/ThirdParty/Themes/Divi/disableImageDimensionsHeightPercentage.php b/tests/Integration/inc/ThirdParty/Themes/Divi/disableImageDimensionsHeightPercentage.php index e7275c0648..bfc3d6252b 100644 --- a/tests/Integration/inc/ThirdParty/Themes/Divi/disableImageDimensionsHeightPercentage.php +++ b/tests/Integration/inc/ThirdParty/Themes/Divi/disableImageDimensionsHeightPercentage.php @@ -13,12 +13,12 @@ class Test_DisableImageDimensionsHeightPercentage extends WPThemeTestcase { use DBTrait; + protected $path_to_test_data = '/inc/ThirdParty/Themes/Divi/Integration/disableImageDimensionsHeightPercentage.php'; + private $container; private $event; private $subscriber; - protected $path_to_test_data = '/inc/ThirdParty/Themes/Divi/disableImageDimensionsHeightPercentage.php'; - public static function set_up_before_class() { parent::set_up_before_class(); self::installFresh(); @@ -36,12 +36,16 @@ public function set_up() { $this->container = apply_filters( 'rocket_container', '' ); $this->event = $this->container->get( 'event_manager' ); + $this->unregisterAllCallbacksExcept( 'rocket_buffer', 'specify_image_dimensions', 17 ); + add_filter( 'rocket_specify_image_dimensions', '__return_true' ); } public function tear_down() { $this->event->remove_subscriber( $this->subscriber ); + $this->restoreWpHook( 'rocket_buffer' ); + remove_filter( 'rocket_specify_image_dimensions', '__return_true' ); unset( $GLOBALS['wp'] ); diff --git a/tests/Unit/HasLoggerTrait.php b/tests/Unit/HasLoggerTrait.php index 0e62c5d3f4..3d11b3fb2c 100644 --- a/tests/Unit/HasLoggerTrait.php +++ b/tests/Unit/HasLoggerTrait.php @@ -25,6 +25,7 @@ public function set_logger(LoggerAwareInterface $aware) { $this->logger = Mockery::mock(Logger::class, [ 'notice' => [], 'debug' => [], + 'error' => [], ]); $aware->set_logger($this->logger); } diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Frontend/APIClient/addToQueue.php b/tests/Unit/inc/Engine/Common/JobManager/APIHandler/APIClient/addToQueue.php similarity index 86% rename from tests/Unit/inc/Engine/Optimization/RUCSS/Frontend/APIClient/addToQueue.php rename to tests/Unit/inc/Engine/Common/JobManager/APIHandler/APIClient/addToQueue.php index 003e4ffd06..0f88e0f50a 100644 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Frontend/APIClient/addToQueue.php +++ b/tests/Unit/inc/Engine/Common/JobManager/APIHandler/APIClient/addToQueue.php @@ -1,18 +1,20 @@ options = Mockery::mock(Options_Data::class); $this->client = new APIClient($this->options); + $this->set_logger($this->client); } /** diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Frontend/APIClient/getQueueJobStatus.php b/tests/Unit/inc/Engine/Common/JobManager/APIHandler/APIClient/getQueueJobStatus.php similarity index 88% rename from tests/Unit/inc/Engine/Optimization/RUCSS/Frontend/APIClient/getQueueJobStatus.php rename to tests/Unit/inc/Engine/Common/JobManager/APIHandler/APIClient/getQueueJobStatus.php index 165f2ced4c..951846a4ea 100644 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Frontend/APIClient/getQueueJobStatus.php +++ b/tests/Unit/inc/Engine/Common/JobManager/APIHandler/APIClient/getQueueJobStatus.php @@ -1,16 +1,16 @@ justReturn('current_date'); + } + + public function setUp() : void { + parent::setUp(); + + $this->factories = [ + Mockery::mock( RUCSSFactory::class ), + Mockery::mock( ATFFactory::class ), + ]; + + $this->subscriber = new Subscriber( Mockery::mock( JobProcessor::class ), $this->factories ); + } + + /** + * @dataProvider configTestData + */ + public function testShouldDoExpected( $config ) { + Functions\expect( 'apply_filters' ) + ->with( 'rocket_rucss_deletion_enabled', true ) + ->andReturn( $config['deletion_activated'] ); + + if ( $config['deletion_activated'] ) { + foreach ( $this->factories as $factory ) { + $manager = Mockery::mock( Manager::class ); + $manager->shouldReceive( 'is_allowed' )->once()->andReturn( $config['is_allowed'] ); + + $factory->expects() + ->manager() + ->andReturn( $manager ); + + if ( $config['is_allowed'] ) { + $table = $this->getMockBuilder( AbstractTable::class ) + ->disableOriginalConstructor() + ->getMock(); + + $factory->expects() + ->table() + ->andReturn( $table ); + + $table->expects( $this->once() ) + ->method( 'delete_old_rows' ); + } + } + } else { + foreach ( $this->factories as $factory ) { + $factory->expects()->manager()->never(); + $factory->expects()->table()->never(); + } + } + + $this->subscriber->cron_clean_rows(); + } +} diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Strategy/Context/RetryContext/setStrategy.php b/tests/Unit/inc/Engine/Common/JobManager/Strategy/Context/RetryContext/setStrategy.php similarity index 100% rename from tests/Unit/inc/Engine/Optimization/RUCSS/Strategy/Context/RetryContext/setStrategy.php rename to tests/Unit/inc/Engine/Common/JobManager/Strategy/Context/RetryContext/setStrategy.php diff --git a/tests/Unit/inc/Engine/Common/JobManager/Strategy/Strategies/DefaultProcess/execute.php b/tests/Unit/inc/Engine/Common/JobManager/Strategy/Strategies/DefaultProcess/execute.php new file mode 100644 index 0000000000..81ae9ac776 --- /dev/null +++ b/tests/Unit/inc/Engine/Common/JobManager/Strategy/Strategies/DefaultProcess/execute.php @@ -0,0 +1,61 @@ +wpr_clock = Mockery::mock(WPRClock::class); + $this->manager = Mockery::mock( Manager::class ); + + $this->strategy = new DefaultProcess($this->manager, $this->wpr_clock); + } + + public function tearDown(): void { + parent::tearDown(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldBehaveAsExpected( $config, $expected ) { + if ( $config['row_details']->retries >= count( $config['time_table'] ) ) { + Actions\expectDone( 'rocket_preload_unlock_url' )->with( $config['row_details']->url ); + + $this->manager->shouldReceive( 'make_status_failed' ) + ->withArgs([$config['row_details']->url, $config['row_details']->is_mobile, strval($config['job_details']['code']), $config['job_details']['message']]); + + $this->strategy->execute($config['row_details'], $config['job_details']); + return; + } + + $this->manager->shouldReceive( 'increment_retries' ) + ->withArgs([$config['row_details']->url, $config['row_details']->is_mobile, strval($config['job_details']['code']), $config['job_details']['message']]); + + Filters\expectApplied( 'rocket_rucss_retry_duration' )->andReturn( $config['duration_retry'] ); + + $this->wpr_clock->expects( 'current_time' )->with( 'timestamp', true )->andReturn( 0 ); + // update the `next_retry_time` column. + + $this->manager->shouldReceive( 'update_message' ) + ->withArgs([$config['row_details']->url, $config['row_details']->is_mobile, $config['job_details']['code'], $config['job_details']['message'], $config['row_details']->error_message]); + + $this->manager->shouldReceive( 'update_next_retry_time' ) + ->withArgs([$config['row_details']->url, $config['row_details']->is_mobile, $config['duration_retry']]); + + $this->strategy->execute( $config['row_details'], $config['job_details'] ); + } +} diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Strategy/Strategies/JobSetFail/execute.php b/tests/Unit/inc/Engine/Common/JobManager/Strategy/Strategies/JobSetFail/execute.php similarity index 54% rename from tests/Unit/inc/Engine/Optimization/RUCSS/Strategy/Strategies/JobSetFail/execute.php rename to tests/Unit/inc/Engine/Common/JobManager/Strategy/Strategies/JobSetFail/execute.php index 13e7e7ac79..6f4f6862c0 100644 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Strategy/Strategies/JobSetFail/execute.php +++ b/tests/Unit/inc/Engine/Common/JobManager/Strategy/Strategies/JobSetFail/execute.php @@ -2,27 +2,20 @@ use WP_Rocket\Tests\Unit\TestCase; use Brain\Monkey\Actions; -use WP_Rocket\Engine\Optimization\RUCSS\Database\Queries\UsedCSS as UsedCSS_Query; use WP_Rocket\Engine\Optimization\RUCSS\Database\Row\UsedCSS as UsedCSS_Row; -use WP_Rocket\Engine\Optimization\RUCSS\Strategy\Strategies\JobSetFail; +use WP_Rocket\Engine\Common\JobManager\Strategy\Strategies\JobSetFail; +use WP_Rocket\Tests\Fixtures\inc\Engine\Common\JobManager\Manager; /** - * Test class covering \WP_Rocket\Engine\Optimization\RUCSS\Strategy\Strategies\JobSetFail::execute - * - * @group RUCSS + * Test class covering \WP_Rocket\Engine\Common\JobManager\Strategy\Strategies\JobSetFail::execute */ class Test_JobSetFail_Execute extends TestCase { - /** - * UsedCSS_Query mock. - * - * @var UsedCSS_Query - */ - protected $usedCssQuery; + protected $manager; public function setUp():void { parent::setUp(); - $this->usedCssQuery = $this->createMock( UsedCSS_Query::class ); + $this->manager = Mockery::mock( Manager::class ); } @@ -37,6 +30,7 @@ public function testShouldBehaveAsExpected( $config, $expected ) { if ( $config['row_details'] ) { $row_details = new UsedCSS_Row( $config['row_details'] ); + } else { $row_details = null; } @@ -46,11 +40,10 @@ public function testShouldBehaveAsExpected( $config, $expected ) Actions\expectDone('rocket_preload_unlock_url')->once(); - $this->usedCssQuery->expects( self::once() ) - ->method( 'make_status_failed' ) - ->with( $config['job_id'], $job_details['code'], $job_details['message'] ); + $this->manager->shouldReceive( 'make_status_failed' ) + ->withArgs([$row_details->url, $row_details->is_mobile, $job_details['code'], $job_details['message']]); - $strategy = new JobSetFail($this->usedCssQuery); + $strategy = new JobSetFail($this->manager); $strategy->execute($row_details, $job_details); } } diff --git a/tests/Unit/inc/Engine/Common/JobManager/Strategy/Strategies/ResetRetryProcess/execute.php b/tests/Unit/inc/Engine/Common/JobManager/Strategy/Strategies/ResetRetryProcess/execute.php new file mode 100644 index 0000000000..24b1a36f7a --- /dev/null +++ b/tests/Unit/inc/Engine/Common/JobManager/Strategy/Strategies/ResetRetryProcess/execute.php @@ -0,0 +1,38 @@ +manager = Mockery::mock( Manager::class ); + $this->strategy = new ResetRetryProcess($this->manager); + } + + public function tearDown(): void { + parent::tearDown(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldBehaveAsExpected( $config, $expected ) + { + $this->manager->shouldReceive( 'add_url_to_the_queue' ) + ->once() + ->withArgs([$config['row_details']->url,$config['row_details']->is_mobile]); + + $this->strategy->execute($config['row_details'], $config['job_details']); + } +} diff --git a/tests/Unit/inc/Engine/License/API/User/IsLicenseExpiredGracePeriod.php b/tests/Unit/inc/Engine/License/API/User/IsLicenseExpiredGracePeriod.php new file mode 100644 index 0000000000..9c50db9c78 --- /dev/null +++ b/tests/Unit/inc/Engine/License/API/User/IsLicenseExpiredGracePeriod.php @@ -0,0 +1,25 @@ +assertSame( + $expected, + $user->is_license_expired_grace_period() + ); + } +} diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/AJAX/Controller/addLcpData.php b/tests/Unit/inc/Engine/Media/AboveTheFold/AJAX/Controller/addLcpData.php new file mode 100644 index 0000000000..ec38f33ab0 --- /dev/null +++ b/tests/Unit/inc/Engine/Media/AboveTheFold/AJAX/Controller/addLcpData.php @@ -0,0 +1,95 @@ +stubEscapeFunctions(); + + $this->query = $this->createPartialMock( AboveTheFold::class, [ 'add_item' ] ); + $this->context = Mockery::mock( Context::class ); + $this->controller = new Controller( $this->query, $this->context ); + $this->temp_post = $_POST; + } + + protected function tearDown(): void { + unset( $_POST ); + $_POST = $this->temp_post; + + parent::tearDown(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnExpected( $config, $expected ) { + $this->stubEscapeFunctions(); + + $_POST = [ + 'url' => addslashes( $config['url'] ), + 'is_mobile' => addslashes( $config['is_mobile'] ), + 'images' => addslashes( $config['images'] ), + ]; + + Functions\expect( 'check_ajax_referer' ) + ->once() + ->with( 'rocket_lcp', 'rocket_lcp_nonce' ) + ->andReturn( true ); + + $this->context->shouldReceive( 'is_allowed' ) + ->atMost() + ->once() + ->andReturn( $config['filter'] ); + + Functions\when( 'wp_unslash' )->alias( + function ( $value ) { + return is_string( $value ) ? stripslashes( $value ) : $value; + } + ); + + Functions\when( 'sanitize_text_field' )->alias( + function ( $value ) { + return is_string( $value ) ? strip_tags( $value ) : $value; + } + ); + + Functions\when( 'current_time' ) + ->justReturn( $expected['item']['last_accessed'] ); + + $this->query->method( 'add_item' ) + ->with( $expected['item'] ) + ->willReturn( $expected['result'] ); + + if ( ! $expected['result'] ) { + Functions\expect( 'wp_send_json_error' ) + ->once() + ->with( $expected['message'] ); + } elseif ( $expected['result'] ) { + Functions\expect( 'wp_send_json_success' ) + ->once() + ->with( $expected['message'] ); + } + + $this->controller->add_lcp_data(); + } +} diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/deletePostAtf.php b/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/deletePostAtf.php new file mode 100644 index 0000000000..b694e2da65 --- /dev/null +++ b/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/deletePostAtf.php @@ -0,0 +1,55 @@ +query = $this->createMock( ATFQuery::class ); + $this->table = $this->createMock( ATFTable::class ); + $this->context = Mockery::mock( Context::class ); + $this->controller = new Controller( $this->table, $this->query, $this->context ); + } + + /** + * @dataProvider configTestData + */ + public function testShouldDoExpected( $config, $expected ) { + $this->context->shouldReceive( 'is_allowed' ) + ->atMost() + ->once() + ->andReturn( $config['filter'] ); + + Functions\when( 'get_permalink' )->justReturn( $config['url'] ); + + if ( $expected ) { + $this->query->expects( $this->once() ) + ->method( 'delete_by_url' ) + ->with( $config['url'] ); + } else { + $this->query->expects( $this->never() ) + ->method( 'delete_by_url' ); + } + + $this->controller->delete_post_atf( $config['post_id'] ); + } +} diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/deleteTermAtf.php b/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/deleteTermAtf.php new file mode 100644 index 0000000000..981e6bc130 --- /dev/null +++ b/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/deleteTermAtf.php @@ -0,0 +1,56 @@ +query = $this->createMock( ATFQuery::class ); + $this->table = $this->createMock( ATFTable::class ); + $this->context = Mockery::mock( Context::class ); + $this->controller = new Controller( $this->table, $this->query, $this->context ); + } + + /** + * @dataProvider configTestData + */ + public function testShouldDoExpected( $config, $expected ) { + $this->context->shouldReceive( 'is_allowed' ) + ->atMost() + ->once() + ->andReturn( $config['filter'] ); + + Functions\when( 'get_term_link' )->justReturn( $config['url'] ); + Functions\when( 'is_wp_error' )->justReturn( ! $expected ); + + if ( $expected ) { + $this->query->expects( $this->once() ) + ->method( 'delete_by_url' ) + ->with( $config['url'] ); + } else { + $this->query->expects( $this->never() ) + ->method( 'delete_by_url' ); + } + + $this->controller->delete_term_atf( $config['term_id'] ); + } +} diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtf.php b/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtf.php new file mode 100644 index 0000000000..261b687299 --- /dev/null +++ b/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtf.php @@ -0,0 +1,60 @@ +query = $this->createMock( ATFQuery::class ); + $this->table = $this->createMock( ATFTable::class ); + $this->context = Mockery::mock( Context::class ); + $this->controller = new Controller( $this->table, $this->query, $this->context ); + } + + /** + * @dataProvider configTestData + */ + public function testShouldDoExpected( $config, $expected ) { + $this->context->shouldReceive( 'is_allowed' ) + ->atMost() + ->once() + ->andReturn( $config['filter'] ); + + if ( ! $expected ) { + $this->query->expects( $this->never() ) + ->method( 'get_not_completed_count' ); + } else { + $this->query->expects( $this->once() ) + ->method( 'get_not_completed_count' ) + ->willReturn( $config['not_completed'] ); + + if ( 'partial' === $expected ) { + $this->table->expects( $this->once() ) + ->method( 'remove_all_completed_rows' ); + } elseif ( 'truncate' === $expected ) { + $this->table->expects( $this->once() ) + ->method( 'truncate_atf_table' ); + } + } + + $this->controller->truncate_atf(); + } +} diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/Frontend/Controller/addExclusions.php b/tests/Unit/inc/Engine/Media/AboveTheFold/Frontend/Controller/addExclusions.php new file mode 100644 index 0000000000..fbb5f97b14 --- /dev/null +++ b/tests/Unit/inc/Engine/Media/AboveTheFold/Frontend/Controller/addExclusions.php @@ -0,0 +1,86 @@ +options = Mockery::mock( Options_Data::class ); + $this->query = $this->createPartialMock( AboveTheFold::class, [ 'get_row' ] ); + $this->context = Mockery::mock( Context::class ); + $this->filesystem = Mockery::mock( WP_Filesystem_Direct::class ); + + $this->controller = new Controller( $this->options, $this->query, $this->context, $this->filesystem ); + } + + protected function tearDown(): void { + unset( $GLOBALS['wp'] ); + + parent::tearDown(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnExpected( $config, $exclusions, $expected ) { + $this->stubEscapeFunctions(); + + $this->context->shouldReceive( 'is_allowed' ) + ->atMost() + ->once() + ->andReturn( $config['filter'] ); + + $GLOBALS['wp'] = $config['wp']; + + Functions\when( 'home_url' )->justReturn( 'http://example.org' ); + Functions\when( 'add_query_arg' )->returnArg( 2 ); + $this->stubWpParseUrl(); + + $this->query->method( 'get_row' ) + ->with( $config['url'], $config['is_mobile'] ) + ->willReturn( $config['row'] ); + + $this->options->shouldReceive( 'get' ) + ->with( 'cache_mobile', 0 ) + ->atMost() + ->once() + ->andReturn( $config['cache_mobile'] ); + + $this->options->shouldReceive( 'get' ) + ->with( 'do_caching_mobile_files', 0 ) + ->atMost() + ->once() + ->andReturn( $config['do_caching_mobile_files'] ); + + Functions\when( 'wp_is_mobile' ) + ->justReturn( $config['wp_is_mobile'] ); + + $this->assertSame( + $expected, + $this->controller->add_exclusions( $exclusions ) + ); + } +} diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/addWPRImageDimensionQueryArg.php b/tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/addWPRImageDimensionQueryArg.php new file mode 100644 index 0000000000..9887c7a29a --- /dev/null +++ b/tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/addWPRImageDimensionQueryArg.php @@ -0,0 +1,52 @@ +context = Mockery::mock( ContextInterface::class ); + $options = Mockery::mock( Options_Data::class ); + $api_client = Mockery::mock( APIClient::class ); + $this->user = Mockery::mock( User::class ); + $this->controller = new Controller( $this->context, $options, $api_client, $this->user ); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnExpected( $config, $expected ) { + $this->context->shouldReceive( 'is_allowed' ) + ->atMost() + ->once() + ->andReturn( $config['filter'] ); + + Functions\expect('add_query_arg')->with([ 'wpr_imagedimensions' => 1 ])->andReturn($expected); + + $this->assertSame( + $expected, + $this->controller->add_wpr_imagedimensions_query_arg( $config['url'] ) + ); + } + +} diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/fetchLinks.php b/tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/fetchLinks.php new file mode 100644 index 0000000000..ffa443d705 --- /dev/null +++ b/tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/fetchLinks.php @@ -0,0 +1,87 @@ +user = Mockery::mock( User::class ); + $this->controller = new Controller( $context, $options, $api_client, $this->user ); + } + + protected function tearDown(): void { + parent::tearDown(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnExpected( $config, $expected ) { + $this->user->shouldReceive( 'is_license_expired_grace_period' ) + ->once() + ->andReturn( $config['license_expired'] ); + + Functions\when( 'home_url' )->alias( function( $link = '' ) { + return '' === $link ? 'https://example.org' : 'https://example.org' . $link; + } ); + + Functions\expect( 'wp_remote_get' ) + ->atMost() + ->once() + ->with( 'https://example.org', $config['headers'] ) + ->andReturn( $config['response'] ); + + Functions\expect( 'wp_remote_retrieve_response_code' ) + ->atMost() + ->once() + ->with( $config['response'] ) + ->andReturn( $config['response']['response']['code'] ); + + if ( 200 === $config['response']['response']['code'] ) { + Functions\expect( 'wp_remote_retrieve_body' ) + ->once() + ->with( $config['response'] ) + ->andReturn( $config['response']['body'] ); + } + + if ( isset( $config['found_link'] ) && $config['found_link'] ) { + + $this->stubWpParseUrl(); + + Functions\when( 'wp_http_validate_url' )->alias( function( $link ) { + return false !== strpos( $link, 'https' ) ? $link : false; + } ); + + Filters\expectApplied( 'rocket_atf_warmup_links_number' ) + ->once() + ->with( 10 ); + } + + $this->assertSame( + $expected, + $this->controller->fetch_links() + ); + } +} diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Database/deleteOldUsedCss.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Database/deleteOldUsedCss.php index 800059fd44..aaf3d3794c 100644 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Database/deleteOldUsedCss.php +++ b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Database/deleteOldUsedCss.php @@ -44,7 +44,7 @@ public function testShouldDoExpected( $input ){ if ( true === $input['usedCSS']['exists'] ) { $this->usedCSS->expects( $this->once() ) - ->method('delete_old_used_css'); + ->method('delete_old_rows'); } $this->database->delete_old_used_css(); diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/cleanUsedCssAndCache.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/cleanUsedCssAndCache.php index 88223b1a46..1cdca4a4f9 100644 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/cleanUsedCssAndCache.php +++ b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/cleanUsedCssAndCache.php @@ -5,7 +5,7 @@ use Mockery; use Brain\Monkey\Functions; -use WP_Rocket\Engine\Optimization\RUCSS\Controller\Queue; +use WP_Rocket\Engine\Common\JobManager\Queue\Queue; use WP_Rocket\Tests\Unit\FilesystemTestCase; use WP_Rocket\Engine\Optimization\RUCSS\Admin\Database; use WP_Rocket\Engine\Optimization\RUCSS\Admin\Settings; @@ -58,14 +58,14 @@ public function testShouldDoExpected( $input ) { Functions\expect( 'set_transient' ) ->once() ->with( - 'rocket_rucss_processing', + 'rocket_saas_processing', Mockery::type( 'int' ), 90 ); Functions\expect( 'rocket_renew_box' ) ->once() - ->with( 'rucss_success_notice' ); + ->with( 'saas_success_notice' ); } else { $this->database ->shouldReceive( 'truncate_used_css_table' ) diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/clearUsedcssResult.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/clearUsedcssResult.php deleted file mode 100644 index 0080ec563e..0000000000 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/clearUsedcssResult.php +++ /dev/null @@ -1,72 +0,0 @@ -settings = Mockery::mock( Settings::class ); - $this->database = Mockery::mock( Database::class ); - $this->usedCSS = Mockery::mock( UsedCSS::class ); - $this->subscriber = new Subscriber( $this->settings, $this->database, $this->usedCSS, Mockery::mock( Queue::class ) ); - } - - /** - * @dataProvider configTestData - */ - public function testShouldDoExpected( $input, $expected ) { - if ( isset( $input['cap'] ) ) { - Functions\expect( 'current_user_can' ) - ->once() - ->with( 'rocket_remove_unused_css' ) - ->andReturn( $input['cap'] ); - } - - $this->settings->shouldReceive( 'is_enabled' ) - ->andReturn( $input['enabled'] ); - - if ( isset( $input['transient'] ) ) { - Functions\expect( 'get_transient' ) - ->once() - ->with( 'rocket_clear_usedcss_response' ) - ->andReturn( $input['transient'] ); - } - - if ( $expected['show_notice'] ) { - Functions\expect( 'delete_transient' ) - ->once() - ->with( 'rocket_clear_usedcss_response' ); - - Functions\expect( 'rocket_notice_html' ) - ->once() - ->with( $input['transient'] ); - } - - - $this->subscriber->clear_usedcss_result(); - } -} diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/deleteTermUsedCss.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/deleteTermUsedCss.php index 0e1926f0b8..1623618bdc 100644 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/deleteTermUsedCss.php +++ b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/deleteTermUsedCss.php @@ -5,7 +5,7 @@ use Mockery; use Brain\Monkey\Functions; -use WP_Rocket\Engine\Optimization\RUCSS\Controller\Queue; +use WP_Rocket\Engine\Common\JobManager\Queue\Queue; use WP_Rocket\Tests\Unit\TestCase; use WP_Rocket\Engine\Optimization\RUCSS\Admin\Database; use WP_Rocket\Engine\Optimization\RUCSS\Admin\Settings; diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/deleteUsedCssOnUpdateOrDelete.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/deleteUsedCssOnUpdateOrDelete.php index 50057729f3..35fb9e9727 100644 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/deleteUsedCssOnUpdateOrDelete.php +++ b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/deleteUsedCssOnUpdateOrDelete.php @@ -6,7 +6,7 @@ use WP_Rocket\Engine\Optimization\RUCSS\Admin\Database; use WP_Rocket\Engine\Optimization\RUCSS\Admin\Settings; use WP_Rocket\Engine\Optimization\RUCSS\Admin\Subscriber; -use WP_Rocket\Engine\Optimization\RUCSS\Controller\Queue; +use WP_Rocket\Engine\Common\JobManager\Queue\Queue; use WP_Rocket\Engine\Optimization\RUCSS\Controller\UsedCSS; use Brain\Monkey\Functions; diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/maybeDeleteTransient.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/maybeDeleteTransient.php index 31e6275a1f..813fd3977c 100644 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/maybeDeleteTransient.php +++ b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/maybeDeleteTransient.php @@ -7,7 +7,7 @@ use Mockery; use WP_Rocket\Engine\Optimization\RUCSS\Admin\Database; use WP_Rocket\Engine\Optimization\RUCSS\Controller\UsedCSS; -use WP_Rocket\Engine\Optimization\RUCSS\Controller\Queue; +use WP_Rocket\Engine\Common\JobManager\Queue\Queue; use WP_Rocket\Tests\Unit\TestCase; diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/maybeSetProcessingTransient.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/maybeSetProcessingTransient.php index 1ac15fe02f..a63966a33b 100644 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/maybeSetProcessingTransient.php +++ b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/maybeSetProcessingTransient.php @@ -5,7 +5,7 @@ use Mockery; use Brain\Monkey\Functions; -use WP_Rocket\Engine\Optimization\RUCSS\Controller\Queue; +use WP_Rocket\Engine\Common\JobManager\Queue\Queue; use WP_Rocket\Tests\Unit\TestCase; use WP_Rocket\Engine\Optimization\RUCSS\Admin\Database; use WP_Rocket\Engine\Optimization\RUCSS\Admin\Settings; @@ -35,14 +35,14 @@ public function testShouldDoExpected( $input, $expected ) { Functions\expect( 'set_transient' ) ->once() ->with( - 'rocket_rucss_processing', + 'rocket_saas_processing', Mockery::type( 'int' ), 90 ); Functions\expect( 'rocket_renew_box' ) ->once() - ->with( 'rucss_success_notice' ); + ->with( 'saas_success_notice' ); } else { Functions\expect( 'set_transient' )->never(); Functions\expect( 'rocket_renew_box' )->never(); diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/spawnCron.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/spawnCron.php index de4de5c9b4..3f99c359f9 100644 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/spawnCron.php +++ b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/spawnCron.php @@ -4,7 +4,8 @@ use Brain\Monkey\Functions; use Mockery; use WP_Rocket\Engine\Optimization\RUCSS\Admin\{Database,Settings,Subscriber}; -use WP_Rocket\Engine\Optimization\RUCSS\Controller\{Queue,UsedCSS}; +use WP_Rocket\Engine\Optimization\RUCSS\Controller\UsedCSS; +use WP_Rocket\Engine\Common\JobManager\Queue\Queue; use WP_Rocket\Tests\Unit\TestCase; /** diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/truncateUsedCSSHandler.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/truncateUsedCSSHandler.php deleted file mode 100644 index 985684cc7f..0000000000 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/truncateUsedCSSHandler.php +++ /dev/null @@ -1,140 +0,0 @@ -settings = Mockery::mock( Settings::class ); - $this->database = Mockery::mock( Database::class ); - $this->used_css = Mockery::mock( UsedCSS::class ); - $this->subscriber = new Subscriber( $this->settings, $this->database, $this->used_css, Mockery::mock( Queue::class ) ); - } - - protected function tearDown(): void { - parent::tearDown(); - - unset( $_GET['_wpnonce'] ); - } - - /** - * @dataProvider configTestData - */ - public function testShouldDoExpected( $input, $expected ) { - Functions\stubTranslationFunctions(); - - $_GET['_wpnonce'] = $input['nonce']; - - if ( ! isset( $input['nonce'] ) ) { - Functions\expect( 'wp_verify_nonce' )->never(); - Functions\expect( 'sanitize_key' )->never(); - } else { - Functions\expect( 'wp_verify_nonce' )->once()->with( $input['nonce'], 'rocket_clear_usedcss' )->andReturn( 'rocket_clear_usedcss' === $input['nonce'] ); - Functions\expect( 'sanitize_key' )->once()->andReturnFirstArg(); - } - - if ( 'rocket_clear_usedcss' === $input['nonce'] ) { - Functions\expect( 'wp_nonce_ays' )->never(); - } else { - Functions\expect( 'wp_nonce_ays' )->once()->andReturnUsing( function() { - throw new WPDieException; - } ); - } - - if ( ! isset( $input['cap'] ) ) { - Functions\expect( 'current_user_can' )->never(); - }else { - Functions\expect( 'current_user_can' ) - ->once() - ->with( 'rocket_remove_unused_css' ) - ->andReturn( $input['cap'] ); - - if ( ! $input['cap'] ) { - Functions\expect( 'wp_die' ) - ->once() - ->andReturnUsing( - function() { - throw new WPDieException; - } - ); - } - } - - if ( isset( $input['option_enabled'] ) ) { - $this->settings->shouldReceive( 'is_enabled' )->once()->andReturn( $input['option_enabled'] ); - - if ( ! $input['option_enabled'] || $expected['truncated'] ) { - Functions\expect( 'set_transient' ) - ->once() - ->with( - 'rocket_clear_usedcss_response', - $expected['notice_details'] - ); - - Functions\expect( 'wp_get_referer' )->once()->andReturn( 'http://example.org' ); - Functions\expect( 'esc_url_raw' )->once()->with( 'http://example.org' )->andReturnFirstArg(); - Functions\expect( 'wp_safe_redirect' )->once(); - Functions\expect( 'wp_die' ) - ->once() - ->andReturnUsing( - function() { - throw new WPDieException; - } - ); - } - - } - - if ( $expected['truncated'] ) { - $this->used_css->shouldReceive( 'delete_all_used_css' )->once(); - $this->used_css->shouldReceive( 'get_not_completed_count' )->once()->andReturn( $input['not_completed_count'] ); - - if ( $input['not_completed_count'] > 0 ) { - $this->database->shouldReceive( 'remove_all_completed_rows' )->once(); - } else { - $this->database->shouldReceive( 'truncate_used_css_table' )->once(); - } - - Functions\expect( 'set_transient' ) - ->once() - ->with( - 'rocket_rucss_processing', - Mockery::type( 'int' ), - 90 - ); - - Functions\when('home_url')->justReturn($input['home_url']); - Functions\expect( 'rocket_renew_box' ) - ->once() - ->with( 'rucss_success_notice' ); - Functions\expect( 'rocket_clean_domain' )->once(); - Functions\expect( 'rocket_dismiss_box' )->with('rocket_warning_plugin_modification')->once(); - } - - $this->expectException( WPDieException::class ); - - $this->subscriber->truncate_used_css_handler(); - } -} diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/truncateUsedCss.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/truncateUsedCss.php index 7940b23488..8435f55da2 100644 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/truncateUsedCss.php +++ b/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Subscriber/truncateUsedCss.php @@ -4,7 +4,8 @@ use Brain\Monkey\{Actions,Functions}; use Mockery; use WP_Rocket\Engine\Optimization\RUCSS\Admin\{Database,Settings,Subscriber}; -use WP_Rocket\Engine\Optimization\RUCSS\Controller\{Queue,UsedCSS}; +use WP_Rocket\Engine\Optimization\RUCSS\Controller\UsedCSS; +use WP_Rocket\Engine\Common\JobManager\Queue\Queue; use WP_Rocket\Tests\Unit\TestCase; /** @@ -63,8 +64,8 @@ protected function configureDeleteUsedCssRow($config) { } Actions\expectDone('rocket_after_clean_used_css'); - Functions\expect('set_transient')->with('rocket_rucss_processing', time() + 90, 1.5 * MINUTE_IN_SECONDS); + Functions\expect('set_transient')->with('rocket_saas_processing', time() + 90, 1.5 * MINUTE_IN_SECONDS); - Functions\expect('rocket_renew_box')->with('rucss_success_notice'); + Functions\expect('rocket_renew_box')->with('saas_success_notice'); } } diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/checkJobStatus.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/checkJobStatus.php deleted file mode 100644 index 33cf6be800..0000000000 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/checkJobStatus.php +++ /dev/null @@ -1,163 +0,0 @@ -options = Mockery::mock( Options_Data::class ); - $this->usedCssQuery = $this->createMock( UsedCSS_Query::class ); - $this->api = Mockery::mock( APIClient::class ); - $this->queue = Mockery::mock( QueueInterface::class ); - $this->data_manager = Mockery::mock( DataManager::class ); - $this->filesystem = Mockery::mock( Filesystem::class ); - $this->context = Mockery::mock(ContextInterface::class); - $this->optimisedContext = Mockery::mock(ContextInterface::class); - $this->wpr_clock = Mockery::mock(WPRClock::class); - $this->strategy_factory = Mockery::mock(StrategyFactory::class, [$this->usedCssQuery, $this->wpr_clock]); - - $this->usedCss = Mockery::mock( - UsedCSS::class . '[is_allowed,update_last_accessed,add_url_to_the_queue]', - [ - $this->options, - $this->usedCssQuery, - $this->api, - $this->queue, - $this->data_manager, - $this->filesystem, - $this->context, - $this->optimisedContext, - $this->strategy_factory, - $this->wpr_clock, - ] - ); - - - $this->set_logger($this->usedCss); - } - - protected function tearDown(): void { - parent::tearDown(); - } - - /** - * @dataProvider configTestData - */ - public function testShouldReturnAsExpected( $config, $expected ) { - $this->wpr_clock->shouldReceive('current_time')->with('mysql', true)->zeroOrMoreTimes()->andReturn('2024-01-26'); - - $this->logger->allows()->error(Mockery::any()); - if ( $config['row_details'] ) { - $row_details = new UsedCSS_Row( $config['row_details'] ); - } else { - $row_details = null; - } - if ( isset( $config['job_details'] ) ) { - $job_details = $config['job_details']; - } - if ( isset( $job_details['contents']['shakedCSS'] ) ) { - $css = $job_details['contents']['shakedCSS']; - $hash = md5( $css ); - } - if ( isset( $config['is_used_css_file_written'] ) ) { - $is_file_written = $config['is_used_css_file_written']; - } - $this->usedCssQuery->expects( self::once() ) - ->method( 'get_item' ) - ->with( $config['job_id'] ) - ->willReturn( $row_details ); - if ( ! $row_details ) { - return; - } - Functions\expect( 'home_url' ) - ->with() - ->zeroOrMoreTimes() - ->andReturn( $row_details->url ); - - $this->api->expects() - ->get_queue_job_status( $row_details->job_id, $row_details->queue_name, $row_details->is_home ) - ->andReturn( $job_details ); - $min_rucss_size = 150; - Filters\expectApplied( 'rocket_min_rucss_size' )->andReturn( $min_rucss_size ); - if( isset( $job_details['contents']['shakedCSS_size'] ) && intval( $job_details['contents']['shakedCSS_size'] ) < $min_rucss_size){ - $message = 'RUCSS: shakedCSS size is less than ' . $min_rucss_size; - $this->usedCssQuery->expects( self::once() ) - ->method( 'make_status_failed' ) - ->with( $config['job_id'], '500', $message ); - $this->usedCss->check_job_status( $config['job_id'] ); - return; - } - if ( - 200 !== $job_details['code'] - ) { - $this->strategy_factory->expects( 'manage' )->with( $row_details, $job_details ); - - $this->usedCss->check_job_status( $config['job_id'] ); - return; - } - - - $this->filesystem->shouldReceive( 'write_used_css' ) - ->atMost() - ->once() - ->with( $hash, $css ) - ->andReturn( $is_file_written ); - - if ( ! $is_file_written ) { - $message = 'RUCSS: Could not write used CSS to the filesystem: ' . $row_details->url; - $this->usedCssQuery->expects( self::once() ) - ->method( 'make_status_failed' ) - ->with( $config['job_id'], '', $message ); - - $this->usedCss->check_job_status( $config['job_id'] ); - - return; - } else { - $this->usedCssQuery->expects( self::once() ) - ->method( 'make_status_completed' ) - ->with( $config['job_id'], $hash ); - - Actions\expectDone('rocket_rucss_complete_job_status')->with( $row_details->url, $job_details ); - } - $this->usedCss->check_job_status( $config['job_id'] ); - } - -} diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/clearFailedUrls.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/clearFailedUrls.php deleted file mode 100644 index cff467976b..0000000000 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/clearFailedUrls.php +++ /dev/null @@ -1,106 +0,0 @@ -options = Mockery::mock( Options_Data::class ); - $this->usedCssQuery = $this->createMock( UsedCSS_Query::class ); - $this->api = Mockery::mock( APIClient::class ); - $this->queue = Mockery::mock( QueueInterface::class ); - $this->data_manager = Mockery::mock( DataManager::class ); - $this->filesystem = Mockery::mock( Filesystem::class ); - $this->context = Mockery::mock(ContextInterface::class); - $this->optimisedContext = Mockery::mock(ContextInterface::class); - $this->strategy_factory = Mockery::mock(StrategyFactory::class); - $this->wpr_clock = Mockery::mock(WPRClock::class); - $this->usedCss = Mockery::mock( - UsedCSS::class . '[is_allowed,update_last_accessed,add_url_to_the_queue]', - [ - $this->options, - $this->usedCssQuery, - $this->api, - $this->queue, - $this->data_manager, - $this->filesystem, - $this->context, - $this->optimisedContext, - $this->strategy_factory, - $this->wpr_clock, - ] - ); - } - - protected function tearDown(): void { - parent::tearDown(); - } - - /** - * @dataProvider configTestData - */ - public function testShouldReturnAsExpected( $config, $expected ) { - $this->usedCssQuery->expects( self::once() ) - ->method( 'get_failed_rows' ) - ->willReturn( $config['rows'] ); - - if ( isset( $config['is_int'] ) ) { - if ( ! $config['is_int'] ) { - $this->usedCssQuery->expects( self::never() ) - ->method( 'reset_job' ); - } - else { - foreach ( $config['rows'] as $row ) { - Functions\when( 'home_url' )->justReturn( 'http://example.org' ); - - $this->usedCss->expects()->add_url_to_the_queue($row->url, $row->is_mobile); - } - } - - Actions\expectDone( 'rocket_rucss_after_clearing_failed_url' )->with( $expected['failed_urls'] ); - } - else { - Actions\expectDone( 'rocket_rucss_after_clearing_failed_url' )->never(); - } - - $this->usedCss->clear_failed_urls(); - } -} diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/processOnSubmitJobs.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/processOnSubmitJobs.php deleted file mode 100644 index a29336017f..0000000000 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/processOnSubmitJobs.php +++ /dev/null @@ -1,139 +0,0 @@ -options = Mockery::mock(Options_Data::class); - $this->used_css_query = $this->createMock(UsedCSS_Query::class); - $this->api = Mockery::mock(APIClient::class); - $this->queue = Mockery::mock(QueueInterface::class); - $this->data_manager = Mockery::mock(DataManager::class); - $this->filesystem = Mockery::mock(Filesystem::class); - $this->context = Mockery::mock(ContextInterface::class); - $this->optimize_url_context = Mockery::mock(ContextInterface::class); - $this->strategy_factory = Mockery::mock(StrategyFactory::class); - $this->wpr_clock = Mockery::mock(WPRClock::class); - - $this->usedcss = new UsedCSS($this->options, $this->used_css_query, $this->api, $this->queue, $this->data_manager, $this->filesystem, $this->context, $this->optimize_url_context, $this->strategy_factory, $this->wpr_clock); - - $this->set_logger($this->usedcss); - } - - /** - * @dataProvider configTestData - */ - public function testShouldDoAsExpected( $config, $expected ) - { - $this->wpr_clock->shouldReceive('current_time')->with('mysql', true)->zeroOrMoreTimes()->andReturn('2024-01-26'); - - $this->options->expects()->get( 'remove_unused_css', 0 )->andReturn($config['rucss_enabled']); - - if($config['rucss_enabled']) { - $this->logger->expects()->error(Mockery::any(), Mockery::any()); - $this->options->allows()->get( 'remove_unused_css_safelist', [] )->andReturn([]); - - Functions\when('home_url')->justReturn($config['home_url']); - - Filters\expectApplied('rocket_rucss_pending_jobs_cron_rows_count')->with(100)->andReturn($config['pending_count']); - Filters\expectApplied('rocket_rucss_max_pending_jobs')->with(3 * $expected['pending_count'])->andReturn($config['max_processing']); - - $this->used_css_query->expects(self::once())->method('get_on_submit_jobs')->with($expected['max_processing'])->willReturn($config['rows']); - - foreach ($config['add_to_queue'] as $queue) { - $this->api->expects()->add_to_queue($queue['url'], $queue['configs'])->andReturn($queue['response']); - } - - foreach ($config['make_status_pending'] as $pending) { - $this->used_css_query->expects(self::once())->method('make_status_pending')->with($pending['id'], $pending['jobId'], $pending['queueName'], $pending['mobile']); - } - - foreach ($config['make_status_failed'] as $failed) { - $this->used_css_query->expects(self::once())->method('make_status_failed')->with($failed['id'], $failed['code'], $failed['message']); - } - } else { - $this->logger->expects()->debug(Mockery::any()); - } - - $this->usedcss->process_on_submit_jobs(); - } -} diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/processPendingJobs.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/processPendingJobs.php deleted file mode 100644 index c17591b396..0000000000 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/processPendingJobs.php +++ /dev/null @@ -1,139 +0,0 @@ -options = Mockery::mock(Options_Data::class); - $this->used_css_query = $this->createMock(UsedCSS_Query::class); - $this->api = Mockery::mock(APIClient::class); - $this->queue = Mockery::mock(QueueInterface::class); - $this->data_manager = Mockery::mock(DataManager::class); - $this->filesystem = Mockery::mock(Filesystem::class); - $this->database = Mockery::mock(Database::class); - $this->context = Mockery::mock(ContextInterface::class); - $this->optimisedContext = Mockery::mock(ContextInterface::class); - $this->strategy_factory = Mockery::mock(StrategyFactory::class); - $this->wpr_clock = Mockery::mock(WPRClock::class); - - $this->usedcss = new UsedCSS($this->options, $this->used_css_query, $this->api, $this->queue, $this->data_manager, $this->filesystem, $this->context, $this->optimisedContext, $this->strategy_factory, $this->wpr_clock); - $this->set_logger($this->usedcss); - } - - /** - * @dataProvider configTestData - */ - public function testShouldDoAsExpected( $config, $expected ) - { - $this->wpr_clock->shouldReceive('current_time')->with('mysql', true)->zeroOrMoreTimes()->andReturn('2024-01-26'); - $this->options->allows()->get('remove_unused_css', 0)->andReturn($config['enabled']); - - $this->configureDisabled($config, $expected); - $this->configureEnabled($config, $expected); - $this->wpr_clock->shouldReceive( 'current_time' ) - ->with( 'timestamp', true ) - ->atMost() - ->once() - ->andReturn( 1700999999 ); - - $this->usedcss->process_pending_jobs(); - } - - protected function configureDisabled($config, $expected) { - if( $config['enabled']) { - return; - } - $this->used_css_query->expects(self::never())->method('make_status_inprogress'); - } - - protected function configureEnabled($config, $expected) { - if(! $config['enabled']) { - return; - } - - Filters\expectApplied('rocket_rucss_pending_jobs_cron_rows_count')->with(100)->andReturn($config['rows_count']); - - $this->used_css_query->expects(self::once())->method('get_pending_jobs')->with($expected['rows_count'])->willReturn($config['rows']); - - if( ! $expected['in_progress'] ) { - return; - } - - $this->queue->expects()->add_job_status_check_async($expected['in_progress']); - $this->used_css_query->expects(self::atLeastOnce())->method('make_status_inprogress')->with($expected['in_progress']); - } -} diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/treeshake.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/treeshake.php index 7a31657a9d..7a9991b6c8 100644 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/treeshake.php +++ b/tests/Unit/inc/Engine/Optimization/RUCSS/Controller/UsedCSS/treeshake.php @@ -2,19 +2,14 @@ use WP_Rocket\Admin\Options_Data; use WP_Rocket\Engine\Common\Context\ContextInterface; -use WP_Rocket\Engine\Common\Queue\QueueInterface; use WP_Rocket\Engine\Optimization\RUCSS\Controller\Filesystem; use WP_Rocket\Engine\Optimization\RUCSS\Controller\UsedCSS; use WP_Rocket\Engine\Optimization\RUCSS\Database\Queries\UsedCSS as UsedCSS_Query; use WP_Rocket\Engine\Optimization\RUCSS\Database\Row\UsedCSS as UsedCSS_Row; -use WP_Rocket\Engine\Optimization\RUCSS\Frontend\APIClient; -use WP_Rocket\Engine\Optimization\RUCSS\Strategy\Factory\StrategyFactory; -use WP_Rocket\Engine\Common\Clock\WPRClock; -use WP_Rocket\Logger\Logger; -use WP_Rocket\Tests\Unit\HasLoggerTrait; use WP_Rocket\Tests\Unit\TestCase; use Brain\Monkey\Functions; use WP_Rocket\Engine\Optimization\DynamicLists\DefaultLists\DataManager; +use WP_Rocket\Tests\Fixtures\inc\Engine\Common\JobManager\Manager; /** * Test class covering \WP_Rocket\Engine\Optimization\RUCSS\Controller\UsedCSS::treeshake @@ -22,15 +17,13 @@ * @group RUCSS */ class Test_Treeshake extends TestCase { - use HasLoggerTrait; protected $options; protected $usedCssQuery; - protected $api; protected $queue; - protected $usedCss; protected $data_manager; protected $filesystem; protected $context; + protected $manager; /** * @var StrategyFactory @@ -42,37 +35,27 @@ class Test_Treeshake extends TestCase { */ protected $wpr_clock; - protected $optimisedContext; protected function setUp(): void { parent::setUp(); $this->options = Mockery::mock(Options_Data::class); $this->usedCssQuery = $this->createMock(UsedCSS_Query::class); - $this->api = Mockery::mock(APIClient::class); - $this->queue = Mockery::mock(QueueInterface::class); $this->data_manager = Mockery::mock( DataManager::class ); $this->filesystem = Mockery::mock( Filesystem::class ); $this->context = Mockery::mock(ContextInterface::class); - $this->optimisedContext = Mockery::mock(ContextInterface::class); - $this->strategy_factory = Mockery::mock(StrategyFactory::class); - $this->wpr_clock = Mockery::mock(WPRClock::class); + $this->manager = Mockery::mock(Manager::class); $this->usedCss = Mockery::mock( UsedCSS::class . '[is_allowed,update_last_accessed]', [ - $this->options, $this->usedCssQuery, - $this->api, - $this->queue, + $this->options, + $this->usedCssQuery, $this->data_manager, $this->filesystem, $this->context, - $this->optimisedContext, - $this->strategy_factory, - $this->wpr_clock, + $this->manager ] ); - - $this->set_logger($this->usedCss); } protected function tearDown(): void @@ -175,7 +158,8 @@ protected function configureCreateNewJob($config) { return; } - $this->usedCssQuery->expects(self::once())->method('create_new_job')->with($config['home_url'], $config['create_new_job']['response']['contents']['jobId'], $config['create_new_job']['response']['contents']['queueName'], $config['is_mobile']['is_mobile'] ); + $this->manager->shouldReceive( 'add_url_to_the_queue' ) + ->withArgs([$config['home_url'], $config['is_mobile']['is_mobile']]); } protected function configValidUsedCss($config) { diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Cron/Subscriber/cronCleanRows.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Cron/Subscriber/cronCleanRows.php deleted file mode 100644 index 2bc78b1bd7..0000000000 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Cron/Subscriber/cronCleanRows.php +++ /dev/null @@ -1,53 +0,0 @@ -justReturn('current_date'); - } - - public function setUp() : void { - parent::setUp(); - - $this->database = Mockery::mock( Database::class ); - $this->usedCSS = Mockery::mock( UsedCSS::class ); - $this->subscriber = new Subscriber( $this->usedCSS, $this->database ); - - - } - - /** - * @dataProvider configTestData - */ - public function testShouldDoExpected( $config ) { - Functions\expect('apply_filters') - ->with( 'rocket_rucss_deletion_enabled', true ) - ->andReturn( $config['deletion_activated'] ); - - if ( $config['deletion_activated'] ) { - $this->database->expects()->delete_old_used_css()->once(); - } else { - $this->database->expects()->delete_old_used_css()->never(); - } - - $this->subscriber->cron_clean_rows(); - } -} diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Strategy/Strategies/DefaultProcess/execute.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Strategy/Strategies/DefaultProcess/execute.php deleted file mode 100644 index b645e94a63..0000000000 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Strategy/Strategies/DefaultProcess/execute.php +++ /dev/null @@ -1,63 +0,0 @@ -used_css_query = $this->createMock( UsedCSS_Query::class ); - $this->wpr_clock = Mockery::mock( WPRClock::class ); - $this->strategy = new DefaultProcess( $this->used_css_query, $this->wpr_clock ); - } - - public function tearDown(): void { - parent::tearDown(); - } - - /** - * @dataProvider configTestData - */ - public function testShouldBehaveAsExpected( $config, $expected ) { - if ( $config['row_details']->retries >= count( $config['time_table'] ) ) { - Actions\expectDone( 'rocket_preload_unlock_url' )->with( $config['row_details']->url ); - - $this->used_css_query->expects( self::once() ) - ->method( 'make_status_failed' ) - ->with( $config['row_details']->id, strval( $config['job_details']['code'] ), $config['job_details']['message'] ); - $this->strategy->execute( $config['row_details'], $config['job_details'] ); - - return; - } - - $this->used_css_query->expects( self::once() ) - ->method( 'increment_retries' ) - ->with( $config['row_details']->id, (int) $config['job_details']['code'] ); - - Filters\expectApplied( 'rocket_rucss_retry_duration' )->andReturn( $config['duration_retry'] ); - - $this->wpr_clock->expects( 'current_time' )->with( 'timestamp', true )->andReturn( 0 ); - // update the `next_retry_time` column. - - $this->used_css_query->expects( self::once() ) - ->method( 'update_message' ) - ->with( $config['row_details']->id, $config['job_details']['code'], $config['job_details']['message'], $config['row_details']->error_message ); - $this->used_css_query->expects( self::once() ) - ->method( 'update_next_retry_time' ) - ->with( $config['job_id'], $config['duration_retry'] ); - - $this->strategy->execute( $config['row_details'], $config['job_details'] ); - } -} diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Strategy/Strategies/ResetRetryProcess/execute.php b/tests/Unit/inc/Engine/Optimization/RUCSS/Strategy/Strategies/ResetRetryProcess/execute.php deleted file mode 100644 index 1c2976afaf..0000000000 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Strategy/Strategies/ResetRetryProcess/execute.php +++ /dev/null @@ -1,52 +0,0 @@ -used_css_query = $this->createMock( UsedCSS_Query::class ); - $this->strategy = new ResetRetryProcess($this->used_css_query); - } - - public function tearDown(): void { - parent::tearDown(); - } - - /** - * @dataProvider configTestData - */ - public function testShouldBehaveAsExpected( $config, $expected ) - { - $this->used_css_query->expects(self::once()) - ->method('get_row') - ->with($config['row_details']->url, $config['row_details']->is_mobile) - ->willReturn($config['row_details']); - - - if ( empty( $config['row_details'] ) ) { - $this->used_css_query->expects(self::once()) - ->method('create_new_job') - ->with($config['row_details']->url, $config['row_details']->job_id, $config['row_details']->queue_name, $config['row_details']->is_mobile); - $this->strategy->execute($config['row_details'], $config['job_details']); - - return; - } - $this->used_css_query->expects(self::once())->method('reset_job')->with($config['row_details']->id); - - $this->strategy->execute($config['row_details'], $config['job_details']); - } -} diff --git a/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php b/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php new file mode 100644 index 0000000000..12012ccf19 --- /dev/null +++ b/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php @@ -0,0 +1,92 @@ +options = Mockery::mock( Options_Data::class ); + $this->atf_context = Mockery::mock( ContextInterface::class ); + $this->rucss_url_context = Mockery::mock( ContextInterface::class ); + $this->admin_bar = new AdminBar( $this->options, $this->atf_context, $this->rucss_url_context, '' ); + $this->wp_admin_bar = new WP_Admin_Bar(); + + $this->stubTranslationFunctions(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldDoExpected( $config, $expected ) { + Functions\when( 'wp_get_environment_type' ) + ->justReturn( $config['environment'] ); + Functions\when( 'is_admin' ) + ->justReturn( $config['is_admin'] ); + + $this->atf_context->shouldReceive( 'is_allowed' ) + ->andReturn( $config['atf_context'] ); + + $this->options->shouldReceive( 'get' ) + ->with( 'remove_unused_css', 0 ) + ->andReturn( $config['remove_unused_css'] ); + + Functions\when( 'current_user_can' ) + ->justReturn( $config['current_user_can'] ); + + Functions\when( 'wp_nonce_url' )->alias( + function ( $url ) { + return str_replace( '&', '&', "{$url}&_wpnonce=123456" ); + } + ); + + Functions\when( 'admin_url' )->alias( + function ( $path ) { + return "http://example.org/wp-admin/{$path}"; + } + ); + + $this->admin_bar->add_clean_saas_menu_item( $this->wp_admin_bar ); + + $node = $this->wp_admin_bar->get_node( 'clean-saas' ); + + if ( null === $expected ) { + $this->assertNull( $node ); + return; + } + + $this->assertSame( + $expected['id'], + $node->id + ); + + $this->assertSame( + $expected['title'], + $node->title + ); + } +} diff --git a/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php b/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php new file mode 100644 index 0000000000..557e1f39dc --- /dev/null +++ b/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php @@ -0,0 +1,99 @@ +options = Mockery::mock( Options_Data::class ); + $this->atf_context = Mockery::mock( ContextInterface::class ); + $this->rucss_url_context = Mockery::mock( ContextInterface::class ); + $this->admin_bar = new AdminBar( $this->options, $this->atf_context, $this->rucss_url_context, '' ); + $this->wp_admin_bar = new WP_Admin_Bar(); + + $this->stubTranslationFunctions(); + } + + protected function tearDown(): void { + unset( $GLOBALS['post'] ); + + parent::tearDown(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldDoExpected( $config, $expected ) { + Functions\when( 'wp_get_environment_type' ) + ->justReturn( $config['environment'] ); + Functions\when( 'is_admin' ) + ->justReturn( $config['is_admin'] ); + + $GLOBALS['post'] = $config['post']; + + Functions\when( 'rocket_can_display_options' ) + ->justReturn( $config['can_display_options'] ); + + $this->atf_context->shouldReceive( 'is_allowed' ) + ->andReturn( $config['atf_context'] ); + + $this->rucss_url_context->shouldReceive( 'is_allowed' ) + ->andReturn( $config['rucss_context'] ); + + Functions\when( 'wp_nonce_url' )->alias( + function ( $url ) { + return str_replace( '&', '&', "{$url}&_wpnonce=123456" ); + } + ); + + Functions\when( 'admin_url' )->alias( + function ( $path ) { + return "http://example.org/wp-admin/{$path}"; + } + ); + + $this->admin_bar->add_clean_url_menu_item( $this->wp_admin_bar ); + + $node = $this->wp_admin_bar->get_node( 'clear-saas-url' ); + + if ( null === $expected ) { + $this->assertNull( $node ); + return; + } + + $this->assertSame( + $expected['id'], + $node->id + ); + + $this->assertSame( + $expected['title'], + $node->title + ); + } +} diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Settings/addLocalizeScriptData.php b/tests/Unit/inc/Engine/Saas/Admin/Notices/addLocalizeScriptData.php similarity index 54% rename from tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Settings/addLocalizeScriptData.php rename to tests/Unit/inc/Engine/Saas/Admin/Notices/addLocalizeScriptData.php index b011fd65f5..a4fb8d4b8b 100644 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Settings/addLocalizeScriptData.php +++ b/tests/Unit/inc/Engine/Saas/Admin/Notices/addLocalizeScriptData.php @@ -1,31 +1,31 @@ options = Mockery::mock( Options_Data::class ); - $this->used_css = $this->createMock(UsedCSS::class); - $this->settings = new Settings( $this->options, Mockery::mock( Beacon::class ), $this->used_css ); + $this->atf_context = Mockery::mock( ContextInterface::class ); + $this->notices = new Notices( $this->options, Mockery::mock( Beacon::class ), $this->atf_context ); } /** @@ -37,11 +37,14 @@ public function testShouldReturnExpected( $config, $expected ) { ->with( 'remove_unused_css', 0 ) ->andReturn( $config['remove_unused_css'] ); + $this->atf_context->shouldReceive( 'is_allowed' ) + ->andReturn( $config['atf'] ); + Functions\when( 'get_transient' )->justReturn( $config['transient'] ); $this->assertSame( $expected, - $this->settings->add_localize_script_data( $config['data'] ) + $this->notices->add_localize_script_data( $config['data'] ) ); } } diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Settings/displayProcessingNotice.php b/tests/Unit/inc/Engine/Saas/Admin/Notices/displayProcessingNotice.php similarity index 63% rename from tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Settings/displayProcessingNotice.php rename to tests/Unit/inc/Engine/Saas/Admin/Notices/displayProcessingNotice.php index 9ecfb5967e..8fae182cbd 100644 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Settings/displayProcessingNotice.php +++ b/tests/Unit/inc/Engine/Saas/Admin/Notices/displayProcessingNotice.php @@ -1,34 +1,34 @@ options = Mockery::mock( Options_Data::class ); - $this->table = $this->createMock(UsedCSS::class); - $this->settings = new Settings( $this->options, Mockery::mock( Beacon::class ), $this->table ); + $this->atf_context = Mockery::mock( ContextInterface::class ); + $this->notices = new Notices( $this->options, Mockery::mock( Beacon::class ), $this->atf_context ); $this->stubTranslationFunctions(); } @@ -41,8 +41,6 @@ public function testShouldDoExpected( $config, $expected ) { Functions\when( 'get_current_screen' )->justReturn( $config['current_screen'] ); Functions\when( 'current_user_can' )->justReturn( $config['capability'] ); - $this->table->expects(self::atMost(1))->method('exists')->willReturn($config['exists']); - $this->options->shouldReceive( 'get' ) ->with( 'remove_unused_css', 0 ) ->andReturn( $config['remove_unused_css'] ); @@ -64,6 +62,6 @@ public function testShouldDoExpected( $config, $expected ) { $this->assertTrue( $this->filesystem->is_writable( rocket_get_constant( 'WP_ROCKET_USED_CSS_PATH' ) ) ); - $this->settings->display_processing_notice(); + $this->notices->display_processing_notice(); } } diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Settings/displaySaasErrorNotice.php b/tests/Unit/inc/Engine/Saas/Admin/Notices/displaySaasErrorNotice.php similarity index 66% rename from tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Settings/displaySaasErrorNotice.php rename to tests/Unit/inc/Engine/Saas/Admin/Notices/displaySaasErrorNotice.php index 691c51948a..8f6919f775 100644 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Settings/displaySaasErrorNotice.php +++ b/tests/Unit/inc/Engine/Saas/Admin/Notices/displaySaasErrorNotice.php @@ -1,32 +1,37 @@ options = Mockery::mock(Options_Data::class); $this->beacon = Mockery::mock(Beacon::class); - $this->used_css = $this->createMock(UsedCSS::class); - $this->settings = new Settings($this->options, $this->beacon, $this->used_css); + $this->atf_context = Mockery::mock( ContextInterface::class ); + $this->notices = new Notices($this->options, $this->beacon, $this->atf_context); $this->stubTranslationFunctions(); } @@ -39,14 +44,12 @@ public function testShouldReturnAsExpected($config, $expected) { Functions\when( 'get_current_user_id' )->justReturn( 1 ); Functions\when( 'get_user_meta' )->justReturn( $config['boxes'] ); Functions\expect('get_transient')->with('wp_rocket_rucss_errors_count' )->andReturn($config['saas_transient']); - $this->options->shouldReceive('get')->with('remove_unused_css', 0)->andReturn($config['has_rights']) - ->zeroOrMoreTimes(); Functions\when('rocket_notice_html')->justEcho(); Functions\stubEscapeFunctions(); $this->beacon->shouldReceive( 'get_suggest' )->with( 'rucss_firewall_ips' )->andReturn( $config['beacon']['en'] ); ob_start(); - $this->settings->display_saas_error_notice(); + $this->notices->display_saas_error_notice(); $result = ob_get_clean(); $this->assertSame($expected, $result); } diff --git a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Settings/displaySuccessNotice.php b/tests/Unit/inc/Engine/Saas/Admin/Notices/displaySuccessNotice.php similarity index 69% rename from tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Settings/displaySuccessNotice.php rename to tests/Unit/inc/Engine/Saas/Admin/Notices/displaySuccessNotice.php index b422ef9b68..07c5820f97 100644 --- a/tests/Unit/inc/Engine/Optimization/RUCSS/Admin/Settings/displaySuccessNotice.php +++ b/tests/Unit/inc/Engine/Saas/Admin/Notices/displaySuccessNotice.php @@ -6,29 +6,30 @@ use Mockery; use WP_Rocket\Admin\Options_Data; use WP_Rocket\Engine\Admin\Beacon\Beacon; -use WP_Rocket\Engine\Optimization\RUCSS\Admin\Settings; -use WP_Rocket\Engine\Optimization\RUCSS\Database\Tables\UsedCSS; +use WP_Rocket\Engine\Common\Context\ContextInterface; +use WP_Rocket\Engine\Saas\Admin\Notices; use WP_Rocket\Tests\Unit\FilesystemTestCase; /** - * Test class covering \WP_Rocket\Engine\Optimization\RUCSS\Admin\Settings::display_success_notice + * Test class covering \WP_Rocket\Engine\Saas\Admin\Notices::display_success_notice * * @group RUCSS */ class Test_DisplaySuccessNotice extends FilesystemTestCase { - protected $path_to_test_data = '/inc/Engine/Optimization/RUCSS/Admin/Settings/displaySuccessNotice.php'; + protected $path_to_test_data = '/inc/Engine/Saas/Admin/Notices/displaySuccessNotice.php'; private $options; private $beacon; - private $settings; - private $used_css; + private $notices; + protected $atf_context; + public function setUp(): void { parent::setUp(); $this->options = Mockery::mock( Options_Data::class ); $this->beacon = Mockery::mock( Beacon::class ); - $this->used_css = $this->createMock(UsedCSS::class); - $this->settings = new Settings( $this->options, $this->beacon, $this->used_css ); + $this->atf_context = Mockery::mock( ContextInterface::class ); + $this->notices = new Notices( $this->options, $this->beacon, $this->atf_context ); $this->stubTranslationFunctions(); $this->stubEscapeFunctions(); @@ -49,12 +50,6 @@ public function testShouldDoExpected( $config, $expected ) { return $config['transient']; }); - $this->used_css->expects(self::atMost(1))->method('exists')->willReturn($config['exists']); - - $this->options->shouldReceive( 'get' ) - ->with( 'remove_unused_css', 0 ) - ->andReturn( $config['remove_unused_css'] ); - $this->configureDisplayNotice($config); if ( $expected ) { @@ -68,12 +63,12 @@ public function testShouldDoExpected( $config, $expected ) { $this->assertTrue( $this->filesystem->is_writable( rocket_get_constant( 'WP_ROCKET_USED_CSS_PATH' ) ) ); - $this->settings->display_success_notice(); + $this->notices->display_success_notice(); } public function configureDisplayNotice($config) { - if( ! $config['exists'] || $config['saas_transient'] ) { + if( $config['saas_transient'] ) { return; } diff --git a/tests/Unit/inc/common/rocketCleanCacheThemeUpdate.php b/tests/Unit/inc/common/rocketCleanCacheThemeUpdate.php index cafb4dc718..39d0db5962 100644 --- a/tests/Unit/inc/common/rocketCleanCacheThemeUpdate.php +++ b/tests/Unit/inc/common/rocketCleanCacheThemeUpdate.php @@ -27,11 +27,10 @@ public static function setUpBeforeClass() : void { public function testShouldDoExpected( $hook_extra, $expected ) { if ( empty( $expected['cleaned'] ) ) { Functions\expect( 'rocket_clean_domain' )->never(); - } else { - Functions\expect( 'rocket_clean_domain' )->once()->andReturnNull(); } if ( $expected['wp_get_theme'] ) { + Functions\expect( 'rocket_clean_domain' )->once()->andReturnNull(); Functions\expect( 'wp_get_theme' )->once()->andReturnUsing( function () { return new WP_Theme( 'default', '/themes' ); diff --git a/uninstall.php b/uninstall.php index cfa6442f0a..83b9f06ffe 100755 --- a/uninstall.php +++ b/uninstall.php @@ -22,16 +22,21 @@ require_once __DIR__ . '/inc/Dependencies/Database/Queries/Meta.php'; require_once __DIR__ . '/inc/Dependencies/Database/Queries/Date.php'; require_once __DIR__ . '/inc/Dependencies/Database/Queries/Compare.php'; +require_once __DIR__ . '/inc/Engine/Common/Database/TableInterface.php'; +require_once __DIR__ . '/inc/Engine/Common/Database/Tables/AbstractTable.php'; require_once __DIR__ . '/inc/Engine/Optimization/RUCSS/Database/Tables/UsedCSS.php'; - require_once __DIR__ . '/inc/Engine/Preload/Database/Tables/Cache.php'; +require_once __DIR__ . '/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php'; + $rocket_rucss_usedcss_table = new WP_Rocket\Engine\Optimization\RUCSS\Database\Tables\UsedCSS(); -$rocket_cache_table = new \WP_Rocket\Engine\Preload\Database\Tables\Cache(); +$rocket_cache_table = new WP_Rocket\Engine\Preload\Database\Tables\Cache(); +$rocket_atf_table = new WP_Rocket\Engine\Media\AboveTheFold\Database\Tables\AboveTheFold(); $rocket_uninstall = new WPRocketUninstall( WP_ROCKET_CACHE_ROOT_PATH, WP_ROCKET_CONFIG_PATH, $rocket_rucss_usedcss_table, - $rocket_cache_table + $rocket_cache_table, + $rocket_atf_table ); $rocket_uninstall->uninstall(); diff --git a/views/settings/page-sections/dashboard.php b/views/settings/page-sections/dashboard.php index 2eab1c68f7..f1d42c1174 100644 --- a/views/settings/page-sections/dashboard.php +++ b/views/settings/page-sections/dashboard.php @@ -177,23 +177,14 @@ - -
-

- render_action_button( - 'link', - 'rocket_clear_usedcss', - [ - 'label' => __( 'Clear Used CSS', 'rocket' ), - 'attributes' => [ - 'class' => 'wpr-button wpr-button--icon wpr-button--small wpr-icon-trash', - ], - ] - ); - ?> -
- + diff --git a/views/settings/sections/clean-section.php b/views/settings/sections/clean-section.php new file mode 100644 index 0000000000..4912174f00 --- /dev/null +++ b/views/settings/sections/clean-section.php @@ -0,0 +1,30 @@ + +
+

+ render_action_button( + 'link', + $data['action'], + [ + 'label' => $data['label'], + 'attributes' => [ + 'class' => 'wpr-button wpr-button--icon wpr-button--small wpr-icon-trash', + ], + ] + ); + ?> +
diff --git a/wp-rocket.php b/wp-rocket.php index 36259028c3..bb605432ab 100755 --- a/wp-rocket.php +++ b/wp-rocket.php @@ -3,7 +3,7 @@ * Plugin Name: WP Rocket * Plugin URI: https://wp-rocket.me * Description: The best WordPress performance plugin. - * Version: 3.16 + * Version: 3.16-alpha1 * Requires at least: 5.8 * Requires PHP: 7.3 * Code Name: Iego @@ -20,7 +20,7 @@ defined( 'ABSPATH' ) || exit; // Rocket defines. -define( 'WP_ROCKET_VERSION', '3.16' ); +define( 'WP_ROCKET_VERSION', '3.16-alpha1' ); define( 'WP_ROCKET_WP_VERSION', '5.8' ); define( 'WP_ROCKET_WP_VERSION_TESTED', '6.3.1' ); define( 'WP_ROCKET_PHP_VERSION', '7.3' ); @@ -82,7 +82,7 @@ define( 'CHMOD_WP_ROCKET_CACHE_DIRS', 0755 ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals } if ( ! defined( 'WP_ROCKET_LASTVERSION' ) ) { - define( 'WP_ROCKET_LASTVERSION', '3.14.4.2' ); + define( 'WP_ROCKET_LASTVERSION', '3.15.10' ); } /**