1<!doctype html> 2<html class="no-js" lang="en" dir="ltr"> 3<head> 4<!-- Start of Shoplift scripts --> 5<!-- 2026-05-07T22:32:16.2176336Z --> 6<style>.shoplift-hide { opacity: 0 !important; }</style> 7<style id="sl-preview-bar-hide">#preview-bar-iframe, #PBarNextFrameWrapper { display: none !important; }</style>
8<script type="text/javascript">(function(rootPath, template, themeRole, themeId, isThemePreview){ /* Generated on 2026-09-24T23:30:01.3235126Z */(function(){"use strict";var te=document.createElement("style");te.textContent=`#shoplift-preview-control{position:fixed;max-width:332px;height:56px;background-color:#141414;z-index:9999;bottom:20px;display:flex;border-radius:8px;box-shadow:13px 22px 7px #0000,9px 14px 7px #00000003,5px 8px 6px #0000000d,2px 4px 4px #00000017,1px 1px 2px #0000001a,0 0 #0000001a;align-items:center;margin:0 auto;left:16px;right:16px;opacity:0;transform:translateY(20px);visibility:hidden;transition:opacity .4s ease-in-out,transform .4s ease-in-out,visibility 0s .4s}#shoplift-preview-control.visible{opacity:1;transform:translateY(0);visibility:visible;transition:opacity .4s ease-in-out,transform .4s ease-in-out,visibility 0s 0s}#shoplift-preview-control *{font-family:Inter,sans-serif;color:#fff;box-sizing:border-box;font-size:16px}#shoplift-preview-variant-title{font-weight:400;line-height:140%;font-size:16px;text-align:start;letter-spacing:-.16px;flex-grow:1;text-wrap:nowrap;overflow:hidden;text-overflow:ellipsis}#shoplift-preview-variant-selector{position:relative;display:block;padding:6px 0;height:100%;min-width:0;flex:1 1 auto}#shoplift-preview-variant-menu-trigger{border:none;cursor:pointer;width:100%;background-color:transparent;padding:0 16px;border-left:1px solid #333;border-right:1px solid #333;height:100%;display:flex;align-items:center;justify-content:start;gap:8px}#shoplift-preview-variant-selector .menu-variant-label{width:24px;height:24px;border-radius:50%;padding:6px;display:flex;justify-content:center;align-items:center;font-size:12px;font-style:normal;font-weight:600;line-height:100%;letter-spacing:-.12px;flex-shrink:0}#shoplift-preview-variant-selector .preview-variant-menu{position:absolute;bottom:110%;transform:translate3d(0,20px,0);visibility:hidden;pointer-events:none;opacity:0;cursor:pointer;background-color:#141414;border:1px solid #141414;border-radius:6px;width:100%;max-height:156px;overflow-y:auto;box-shadow:0 8px 16px #0003;z-index:1;transition:opacity .3s ease-in-out,transform .3s ease-in-out,visibility 0s .3s}#shoplift-preview-variant-selector .preview-variant-menu.preview-variant-menu__visible{visibility:visible;pointer-events:auto;opacity:100;transform:translateZ(0);transition:opacity .3s ease-in-out,transform .3s ease-in-out,visibility 0s 0s}@media screen and (max-width:400px){#shoplift-preview-variant-selector .preview-variant-menu{position:fixed;left:0;right:0;width:auto;bottom:110%}}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item{padding:12px 16px;display:flex;overflow:hidden}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item .menu-variant-label{margin-right:6px}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item span{overflow:hidden;text-overflow:ellipsis;text-wrap:nowrap;white-space:nowrap;color:#f6f6f6;font-size:14px;font-style:normal;font-weight:500}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:hover{background-color:#545454}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:last-of-type{border-bottom-left-radius:6px;border-bottom-right-radius:6px}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:first-of-type{border-top-left-radius:6px;border-top-right-radius:6px}#shoplift-preview-control div:has(#shoplift-exit-preview-button){padding:0 16px}#shoplift-exit-preview-button{padding:6px 8px;font-weight:500;line-height:75%;border-radius:4px;background-color:transparent;border:none;text-decoration:none}#shoplift-exit-preview-button:hover{cursor:pointer;background-color:#333}#shoplift-preview-subscription-warning{position:relative;display:flex;align-items:center;gap:6px;padding:6px 10px;margin:0 4px;border-left:1px solid #333;cursor:help;outline:none}#shoplift-preview-subscription-warning__icon{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background-color:#f59e0b;color:#141414!important;font-weight:700;font-size:12px!important;line-height:1;flex-shrink:0}#shoplift-preview-subscription-warning__label{font-size:13px!important;font-weight:500;color:#fbbf24!important;text-wrap:nowrap;white-space:nowrap}#shoplift-preview-subscription-warning__tooltip{position:absolute;bottom:calc(100% + 8px);right:0;max-width:320px;width:max-content;padding:10px 12px;border-radius:6px;background-color:#1f1f1f;color:#fff!important;font-size:12px!important;line-height:1.4!important;box-shadow:0 8px 16px #0000004d;z-index:10000;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .2s ease-in-out,transform .2s ease-in-out,visibility 0s .2s;pointer-events:none}#shoplift-preview-subscription-warning__tooltip.shoplift-preview-subscription-warning__tooltip--visible{opacity:1;visibility:visible;transform:translateY(0);transition:opacity .2s ease-in-out,transform .2s ease-in-out,visibility 0s 0s}#shoplift-preview-subscription-warning:focus-visible{box-shadow:inset 0 0 0 2px #f59e0b;border-radius:4px}#shoplift-preview-control:has(#shoplift-preview-subscription-warning){max-width:480px}/*$vite$:1*/`,document.head.appendChild(te);var fe=" daum[ /]| deusu/|(?:^|[^g])news(?!sapphire)|(?<! channel/|google/)google(?!(?:wv|app|/google| pixel))|(?<! cu)bots?(?:\\b|_)|(?<!cam)scan|(?<!lib)http|24x
87|;\\s\\w+;$|@[a-z][\\w-]+\\.|\\(\\)|\\.com\\b|\\b\\w+/1\\.0;|\\bbw/|\\bdlc\\b|\\bort/|\\bperl\\b|\\btime/|\\||^[<\\(;]|^[\\w \\.\\-\\(?:\\):%]+(?:/v?\\d+(?:\\.\\d+)?(?:\\.\\d{1,10})*?)?(?:,|$)|^[\\w\\-]+/[\\w]+$|^[^ ]{50,}$|^\\d+\\b|^\\w*search\\b|^\\w+/[\\w\\(\\)]*$|^\\w+/\\d\\.\\d\\s\\([\\w@]+\\)$|^active|^ad muncher|^amaya|^apache/|^avsdevicesdk/|^azure|^biglotron|^blackbox exporter|^bot|^clamav[ /]|^claude-code/|^client/|^cobweb/|^custom|^ddg[_-]android|^discourse|^dispatch/\\d|^downcast/|^duckduckgo|^email|^exodusmovement|^facebook|^getright/|^gozilla/|^hobbit|^hotzonu|^hwcdn/|^igetter/|^jeode/|^jetty/|^jigsaw|^microsoft bits|^movabletype|^mozilla/\\d\\.\\d\\s[\\w\\.-]+$|^mozilla/\\d\\.\\d\\s\\((?:compatible;)?(?:\\s?[\\w\\d-.]+\\/\\d+\\.\\d+)?\\)$|^navermailapp|^netsurf|^offline|^openai/|^owler|^php|^postman|^ps_daily/|^python|^rank|^read|^reed|^remove\\.bg/|^rest|^rss|^snapchat|^sora |^space bison|^stape/|^svn|^swcd |^taringa|^thumbor/|^track|^w3c|^webbandit/|^webcopier|^wget|^whatsapp|^wordpress|^xenu link sleuth|^yahoo|^yandex|^zdm/\\d|^zoom marketplace/|abuse|advisor|agent\\b|analyzer|archive|ask jeeves/teoma|attracta|audit|bluecoat drtr|browsex|burpcollaborator|capture|catch|check\\b|checker|chrome-lighthouse|chromeframe|classifier|cloudflare|collapsify\\b|convertify|cookiehubverify/|crawl|cursor/|cypress/|dareboost|datanyze|dejaclick|detect|discovery|dmbrowser|download|exaleadcloudview|feed|firephp|foregenix|functionize|grab|hardenize\\b|headless|hotjar|httrack|hubspot marketing grader|ibisbrowser|infrawatch|insight|inspect|iplabel|java(?!;)|library|linkcheck|linktiger|mail\\.ru/|manager|manus-user/|marketgoo/|measure|monitor\\b|neustar wpm|node\\b|nutch|offbyone|openvas|optimize|pageburst|pagespeed|parser|phantomjs|pingdom|playwright|powermarks|preview|productfinder|prospectingstudio|proxy|ptst[ /]\\d|radar|readable/|retriever|rexx;|rigor|rss\\b|scrape|securityheaders|selenium|server|silktide|sindup/|sogou|sparkler/|speedcurve|spider|splash|statuscake|supercleaner|synapse|synthetic|testlocally|tools|torrent|transcoder|url|validator|virtuoso|wappalyzer|watchtowr|webglance|webkit2png|whatcms/|xtate/",ge=/bot|crawl|http|lighthouse|scan|search|spider/i,z;function me(){if(z instanceof RegExp)return z;try{z=new RegExp(fe,"i")}catch{z=ge}return z}var ye=a=>typeof a=="string"&&a!=="";function ve(a){return ye(a)&&me().test(a)}var we=ve;class X{timestamp;constructor(){this.timestamp=new Date}}class be extends X{type;testId;hypothesisId;constructor(e,t,i){super(),this.type=3,this.testId=e,this.hypothesisId=t,this.timestamp=i}}class Se extends X{type;path;constructor(e){super(),this.type=4,this.path=e}}class Ce extends X{type;cart;constructor(e){super(),this.type=5,this.cart=e}}class ie extends Error{isBot;constructor(){super(),this.isBot=!0}}function Te(a,e,t){for(const i of e.selectors){const s=a.querySelectorAll(i.cssSelector);for(let r=0;r<s.length;r++)t(e.testId,e.hypothesisId)}re(a,e,(i,s,r,o,n)=>n(s,r),t)}function U(a,e,t){for(const i of e.selectors)ne(a,e.testId,e.hypothesisId,i,t??(()=>{}));re(a,e,ne,t??(()=>{}))}function se(a){return a.urlPatterns.reduce((e,t)=>{switch(t.operator){case"contains":return e+`.*${t}.*`;case"endsWith":return e+`.*${t}`;case"startsWith":return e+`${t}.*`}},"")}function re(a,e,t,i){new MutationObserver(()=>{for(const r of e.selectors)t(a,e.testId,e.hypothesisId,r,i)}).observe(a.documentElement,{childList:!0,subtree:!0})}function ne(a,e,t,i,s){const r=a.querySelectorAll(i.cssSelector);for(let o=0;o<r.length;o++){let n=r.item(o);if(n instanceof HTMLElement&&n.dataset.shoplift!==""){n.dataset.shoplift="";for(const l of i.actions.sort(Re))n=Ie(a,i.cssSelector,n,l)}}return r.length>0&&s?(s(e,t),!0):!1}function Ie(a,e,t,i){switch(i.type){case"innerHtml":t.innerHTML=i.value;break;case"attribute":Pe(t,i.scope,i.value);break;case"css":Ae(a,e,i.value);break;case"js":ke(a,t,i);break;case"copy":return Ee(t);case"remove":xe(t);break;case"move":_e(t,parseInt(i.value));break}return t}function Pe(a,e,t){a.setAttribute(e,t)}function Ae(a,e,t){const i=a.createElement("style");i.innerHTML=`${e} { ${t} }`,a.getElementsByTagName("head")[0]?.appendChild(i)}function ke(a,e,t){Function("document","element",`"use strict"; ${t.value}`)(a,e)}function Ee(a){const e=a.cloneNode(!0);if(!a.parentNode)throw"Can't copy node outside of DOM";return a.parentNode.insertBefore(e,a.nextSibling),e}function xe(a){a.remove()}function _e(a,e){if(e===0)return;const t=Array.prototype.slice.call(a.parentElement.children).indexOf(a),i=Math.min(Math.max(t+e,0),a.parentElement.children.length-1);a.parentElement.children.item(i).insertAdjacentElement(e>0?"afterend":"beforebegin",a)}function Re(a,e){return oe(a)-oe(e)}function oe(a){return a.type==="copy"||a.type==="remove"?0:1}
8const M={Template:0,UrlRedirect:2,Script:3,Price:5},De="data:image/svg+xml,%3csvg%20width='12'%20height='12'%20viewBox='0%200%2012%2012'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M9.96001%207.90004C9.86501%207.90004%209.77001%207.86504%209.69501%207.79004L6.43501%204.53004C6.19501%204.29004%205.80501%204.29004%205.56501%204.53004L2.30501%207.79004C2.16001%207.93504%201.92001%207.93504%201.77501%207.79004C1.63001%207.64504%201.63001%207.40504%201.77501%207.26004L5.03501%204.00004C5.56501%203.47004%206.43001%203.47004%206.96501%204.00004L10.225%207.26004C10.37%207.40504%2010.37%207.64504%2010.225%207.79004C10.15%207.86004%2010.055%207.90004%209.96001%207.90004Z'%20fill='white'/%3e%3c/svg%3e",Ve="data:image/svg+xml,%3csvg%20width='14'%20height='24'%20viewBox='0%200%2014%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M12.3976%2014.5255C12.2833%2013.8788%2012.0498%2013.3024%2011.6952%2012.7961C11.3416%2012.2898%2010.9209%2011.8353%2010.4353%2011.4317C9.94868%2011.0291%209.43546%2010.6488%208.89565%2010.292C8.48487%2010.049%208.09577%209.78565%207.72637%209.50402C7.35697%209.2224%207.08016%208.89503%206.89694%208.51987C6.71273%208.14471%206.67826%207.69533%206.79055%207.1697C6.86345%206.83216%206.97476%206.54647%207.12351%206.31162C7.27324%206.07778%207.47124%205.89986%207.7175%205.77684C7.96377%205.65483%208.21989%205.59383%208.48389%205.59383C8.88087%205.59383%209.17639%205.7016%209.3734%205.91714C9.56943%206.13268%209.68271%206.42345%209.71424%206.78946C9.74576%207.15547%209.72015%207.55401%209.63839%207.98509C9.55663%208.41617%209.43645%208.84724%209.27687%209.27934L13.5127%208.80149C13.9638%207.52656%2014.1017%206.42447%2013.9264%205.49725C13.751%204.56901%2013.2664%203.85122%2012.4724%203.34491C12.239%203.19648%2011.9779%203.07041%2011.6893%202.96569L12.0026%201.50979L9.86397%200L7.3875%201.50979L7.11169%202.78878C6.65166%202.8874%206.21724%203.01957%205.8114%203.19038C4.85292%203.594%204.06684%204.15115%203.45117%204.86385C2.83452%205.57655%202.42571%206.40108%202.22378%207.33847C2.06616%208.06947%202.04942%208.70796%202.17551%209.25087C2.30061%209.7948%202.52028%2010.2828%202.8355%2010.7139C3.14974%2011.145%203.51816%2011.5344%203.93977%2011.881C4.36039%2012.2288%204.782%2012.5521%205.20164%2012.851C5.68334%2013.1702%206.13844%2013.5169%206.56497%2013.8921C6.99052%2014.2672%207.31954%2014.7125%207.55004%2015.228C7.78055%2015.7445%207.81502%2016.3769%207.65347%2017.1262C7.56482%2017.5389%207.43676%2017.8765%207.27028%2018.1388C7.10381%2018.4011%206.89596%2018.5983%206.64772%2018.7295C6.3985%2018.8606%206.12071%2018.9267%205.8114%2018.9267C5.21641%2018.9267%204.79776%2018.6034%204.62833%2018.1632C4.4589%2017.7229%204.47367%2017.2583%204.60075%2016.5639C4.72782%2015.8705%205.05092%2015.1395%205.37107%2014.3699H1.17665C1.17665%2014.3699%200.207341%2016.1115%200.0310135%2017.6762C-0.0655232%2018.5302%200.0635208%2019.2653%200.41519%2019.8844C0.76686%2020.5036%201.33032%2020.9814%202.10655%2021.319C2.39222%2021.443%202.7104%2021.5447%203.05813%2021.623L2.54589%2024H7.17473L7.7047%2021.5386C8.08493%2021.442%208.43857%2021.3231%208.76562%2021.1787C9.73985%2020.7476%2010.52%2020.1427%2011.1071%2019.3649C11.6932%2018.5871%2012.0873%2017.7291%2012.2892%2016.7917C12.4744%2015.9295%2012.5099%2015.1741%2012.3966%2014.5275L12.3976%2014.5255Z'%20fill='white'/%3e%3c/svg%3e";async function Oe(a){let e=a.replace(/-/g,"+").replace(/_/g,"/");for(;e.length%4;)e+="=";const t=atob(e),i=Uint8Array.from(t,o=>
8o.charCodeAt(0)),s=new Blob([i]).stream().pipeThrough(new DecompressionStream("gzip")),r=await new Response(s).text();return JSON.parse(r)}function F(a,e){return typeof e=="string"&&/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+(?:Z|[+-]\d+)/.test(e)?new Date(e):e}function ee(a,e){return e}function q(a,e=!1,t=!1,i=","){const s=a/100;if(t){const o=Math.round(s).toLocaleString("en-US");return i!==","?o.replace(/,/g,i):o}else{const r=e?",":".",o=s.toFixed(2).split("."),n=parseInt(o[0],10),l=o[1]??"00",c=n.toLocaleString("en-US");return i!==","?`${c.replace(/,/g,i)}${r}${l}`:e?`${c.replace(/,/g,".")}${r}${l}`:`${c}${r}${l}`}}function H(a,e,t,i){const s=e.replace("{{amount}}",q(a,!1,!1)).replace("{{amount_no_decimals}}",q(a,!1,!0)).replace("{{amount_with_comma_separator}}",q(a,!0,!1)).replace("{{amount_no_decimals_with_comma_separator}}",q(a,!0,!0)).replace("{{amount_with_space_separator}}",q(a,!1,!1," ")).replace("{{amount_no_decimals_with_space_separator}}",q(a,!1,!0," ")).replace("{{amount_with_apostrophe_separator}}",q(a,!1,!1,"'")).replace("{{amount_no_decimals_with_apostrophe_separator}}",q(a,!1,!0,"'")).replace("{{amount_with_period_and_space_separator}}",q(a,!1,!1,". ")).replace("{{amount_no_decimals_with_period_and_space_separator}}",q(a,!1,!0,". "));return i?`${s} ${t}`:s}function ae(a){return a.replace(/[^\d.,\s-]/g,"").trim()}function j(a){const e=new Map;for(const[t,i,s]of a.variants)e.set(t,{priceInCents:i,compareAtPriceInCents:s});return e}function Le(a,e,t,i){const{priceInCents:s,compareAtPriceInCents:r}=t,{moneyFormat:o,currency:n,currencyCodeEnabled:l}=i;if(a.getAttribute("data-sl-attribute-p")===e)a.innerHTML=H(s,o,n,l);else if(a.getAttribute("data-sl-attribute-cap")===e)r<=0||r<=s?a.remove():a.innerHTML=H(r,o,n,l);else if(a.getAttribute("data-sl-attribute-discount")===e&&!(r<=0||r<=s)){const d=Math.round((r-s)/r*100),u=ae(H(r-s,o,n,!1)),h=a.getAttribute("data-sl-format")||"percent";h==="percent"?a.textContent=`-${d}%`:h==="amount"?a.textContent=`-${u}`:h==="both"&&(a.textContent=`-${d}% (-${u})`)}}function $e(a){const e=[],t={id:"url-pattern",operator:"contains",value:"/"};for(const[i,s,r]of a.variants){e.push({id:`p-${i}`,cssSelector:`[data-sl-attribute-p="${i}"]`,urlPatterns:[t],actions:[{id:`p-action-${i}`,type:"innerHtml",scope:"price",value:H(s,a.moneyFormat,a.currency,a.currencyCodeEnabled)}]});const o=r<=0||r<=s;if(e.push({id:`cap-${i}`,cssSelector:`[data-sl-attribute-cap="${i}"]`,urlPatterns:[t],actions:[{id:`cap-action-${i}`,type:o?"remove":"innerHtml",scope:"compare-at-price",value:o?"":H(r,a.moneyFormat,a.currency,a.currencyCodeEnabled)}]}),!o&&r>s){const n=Math.round((r-s)/r*100),l=ae(H(r-s,a.moneyFormat,a.currency,!1));e.push({id:`d-${i}`,cssSelector:`[data-sl-attribute-discount="${i}"]`,urlPatterns:[t],actions:[{id:`d-action-${i}`,type:"js",scope:null,value:`var format = element.getAttribute('data-sl-format') || 'percent'; if (format === 'percent') { element.textContent = '-${n}%'; } else if (format === 'amount') { element.textContent = '-${l}'; } else if (format === 'both') { element.textContent = '-${n}% (-${l})'; }`}]})}}return e}const Me=a=>{let e=5381;for(let t=0;t<a.length;t++)e=(e*33^a.charCodeAt(t))>>>0;return e.toString(36)},qe=()=>Math.random().toString(36).slice(2,10)+Date.now().toString(36).slice(-4),He=a=>btoa(JSON.stringify(a)).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,""),K=a=>a.replace(/#slr-[a-z0-9]+$/,""),tt="modulepreload",it=function(a){return"/"+a},st={},Ne=function(e,t,i){let s=Promise.resolve();function r(o){const n=new Event("vite:preloadError",{cancelable:!0});if(n.payload=o,window.dispatchEvent(n),!n.defaultPrevented)throw o}return s.then(o=>{for(const n of o||[])n.status==="rejected"&&r(n.reason);return e().catch(r)})};function le(a,e,t){const i=t?a.plans.filter(c=>!c.variantId||c.variantId===t):a.plans,s=[],r=[];for(const c of i)c.direction==="decrease"?(s.push(c.existingShopifyPlanId),r.push(c.createdShopifyPlanId)):(s.push(c.createdShopifyPlanId),r.push(c.existingShopifyPlanId));const o=e?s:r,n=e?r:s;if(t)for(const c of a.plans)for(const d of[c.existingShopifyPlanId,c.createdShopifyPlanId])d&&!o.includes(d)&&!n.includes(d)&&n.push(d);const l={};for(let c=0;c<n.length;c++){const d=n[c],u=o[c];d&&u&&(l[d]=u)}return{showPlanIds:o,hidePlanIds:n,swapMap:l}}function ce(a,e,t){const i=e?a.plans.find(r=>r.variantId===e):void 0;if(i)return i.direction;if(t){const r=a.plans.find(o=>o.productId===t);if(r)return r.direction}return a.plans.find(r=>!r.variantId)?.direction??null}function J(a,e){const t=e?a.plans.filter(r=>!r.productId||r.productId===e):a.plans,i={};for(const r of t)i[r.existingShopifyPlanId]=r.existingDiscountAmount,i[r.createdShopifyPlanId]=r.existingDiscountAmount;
8const s=Math.max(...Object.values(i),0);return{discountMap:i,maxDiscount:s}}function W(a){const e=document.querySelector('form[action*="/cart/add"] input[name="product-id"]')?.value;if(e)return e;if(a){for(const r of Array.from(document.querySelectorAll("[data-sl-attribute-p]"))){const o=r.getAttribute("data-sl-attribute-p");if(!o)continue;const n=a.variants.find(l=>l[0]===o);if(n?.[3])return n[3]}const s=document.querySelector('form[action*="/cart/add"] input[name="id"]')?.value;if(s){const r=a.variants.find(o=>o[0]===s);if(r?.[3])return r[3]}}const t=window,i=t.ShopifyAnalytics?.meta?.product?.id??t.meta?.product?.id;return i!=null?String(i):null}function D(a,e){return a.widget.selectors[e]??[]}function N(a,e){return a.replace(/[\d.]+%/,`${e}%`)}function $(a,e){const t=document.createTreeWalker(a,NodeFilter.SHOW_TEXT);let i=t.nextNode();for(;i;){if(i.nodeValue!==null){const s=e(i.nodeValue);if(s!==i.nodeValue){i.nodeValue=s;return}}i=t.nextNode()}}function de(a,e){return a===null?!1:a==="decrease"?!e:e}async function Ue(a){if(a.subscriptionSwapDone)return;const e=a.getActiveAssignment();if(!e)return;const t=a.getHypothesis(e.hypothesisId);if(!t?.subscriptionData)return;a.subscriptionSwapDone=!0;const i=t.subscriptionData,s=t.isControl,r=[...new Set(i.plans.map(d=>d.direction))].join(",");a.log(`[SUB-SWAP] ${s?"A":"B"} side, directions=${r}`);const o=i.plans.some(d=>d.variantId);let n=!1,l=!1;function c(){if(!l){l=!0;try{const d=o?document.querySelector("select[name='id'], input[name='id']")?.value:void 0,{showPlanIds:u,hidePlanIds:h,swapMap:p}=le(i,s,d);a.swapMap=p;const b=D(i,"widgetParent"),E=D(i,"subscriptionPlans"),S=D(i,"subscriptionInput");if(!b.length||!E.length||!S.length)return;const C=document.querySelector(b[0].selector);if(!C?.shadowRoot)return;const _=C.shadowRoot.querySelector(E[0].selector);if(!_?.shadowRoot)return;const T=S[0].selector;let m=null;if(i.widget.widgetType==="buttons"||i.widget.widgetType==="radio"){const y=Array.from(_.shadowRoot.querySelectorAll(T));if(!y.length)return;for(const v of y){const g=v.closest("label");g&&(u.includes(v.value)?g.style.display="":h.includes(v.value)&&(g.style.display="none"))}const w=y.some(v=>u.includes(v.value)&&v.checked),I=y.some(v=>h.includes(v.value)&&v.checked);if((w||I)&&(n=!1),!w&&!n){n=!0;for(const v of y)if(u.includes(v.value)){v.closest("label")?.click(),v.dispatchEvent(new Event("change",{bubbles:!0}));break}}const f=y.find(v=>v.checked);m=f&&u.includes(f.value)?f.value:u[0]??null}else if(i.widget.widgetType==="dropdown"){const y=_.shadowRoot.querySelector("select");if(!y)return;for(const w of Array.from(y.options))h.includes(w.value)&&(w.style.display="none",w.disabled=!0);if(h.includes(y.value)){const w=Array.from(y.options).find(I=>u.includes(I.value));w&&(y.value=w.value,y.dispatchEvent(new Event("change",{bubbles:!0})))}m=u.includes(y.value)?y.value:u[0]??null}if(m){const y=Array.from(document.querySelectorAll('input[name="selling_plan"]'));for(const w of y)w.value!==m&&(w.value=m)}}finally{l=!1}}}if(a.subscriptionHideWrongPlans=c,a.swapMap=le(i,s).swapMap,c(),o){const d=document.querySelector("select[name='id'], input[name='id']");d&&d.addEventListener("change",c)}}function B(a){const e=D(a,"widgetParent");return e.length?document.querySelector(e[0].selector)?.shadowRoot??null:null}function Y(a,e){const t=D(a,"subscriptionPlans");return t.length?e.querySelector(t[0].selector)?.shadowRoot??null:null}function Z(a,e){const t=new URLSearchParams(window.location.search).get("variant");if(t)return t;{const i=document.querySelector('form[action*="/cart/add"] input[name="id"]')?.value;if(i)return i}return a.size>0?[...a.keys()][0]:void 0}function G(a,e){return H(a,e.moneyFormat,e.currency,e.currencyCodeEnabled)}function Fe({originalFetch:a,swapMap:e,slptValue:t,getSelectedPlanId:i,log:s}){if(window.fetch.__shoplift_intercepted)return s("[SUB-INTERCEPT] already installed â skipping"),()=>{};function r(n){if(i){const l=i();if(l)return e[l]??l}return e[n]??n}const o=function(n,l){if((typeof n=="string"?n:n instanceof URL?n.href:n.url).includes("/cart/add")&&l?.body)try{if(l.body instanceof FormData){const d=l.body.get("selling_plan");d?l.body.set("selling_plan",r(String(d))):(!d||d==="")&&t&&l.body.set("properties[_slpt]",t)}
8else if(typeof l.body=="string"){const d=JSON.parse(l.body);if(d.items)for(const u of d.items){const h=String(u.selling_plan??"");h?u.selling_plan=r(h):!u.selling_plan&&t&&(u.properties||(u.properties={}),u.properties._slpt=t)}else if(d.id){const u=String(d.selling_plan??"");u?d.selling_plan=r(u):!d.selling_plan&&t&&(d.properties||(d.properties={}),d.properties._slpt=t)}l.body=JSON.stringify(d)}}catch(d){s("[SUB-INTERCEPT] body parse failed; cart-add proceeds with un-swapped plan",d)}return a.call(window,n,l)};return o.__shoplift_intercepted=!0,window.fetch=o,function(){window.fetch===o&&(window.fetch=a)}}function Be({log:a}){if(window.fetch.__shoplift_intercepted)return a("[SUB-PREVIEW-BLOCK] already installed â skipping"),()=>{};const e=window.fetch,t=function(i,s){const r=typeof i=="string"?i:i instanceof URL?i.href:i.url;return r.includes("/cart/add")?(a("[SUB-PREVIEW-BLOCK] cart-add blocked in preview mode",{url:r}),Promise.resolve(new Response(JSON.stringify({id:0,properties:{},quantity:0,variant_id:0,key:"preview",title:"Preview â cart-add blocked",price:0,original_price:0,line_price:0,original_line_price:0,total_discount:0,discounts:[],preview:!0}),{status:200,headers:{"Content-Type":"application/json"}}))):e.call(window,i,s)};return t.__shoplift_intercepted=!0,window.fetch=t,function(){window.fetch===t&&(window.fetch=e)}}function pe({data:a,runUpdates:e,debounceMs:t=150}){let i=null;function s(){i&&clearTimeout(i),e(),i=setTimeout(e,t)}let r=null;const o=[],n={childList:!0,subtree:!0,characterData:!0,attributes:!0};function l(h){for(const p of o)p.disconnect();o.length=0;for(const p of Array.from(h.querySelectorAll("*")))if(p.shadowRoot){const b=new MutationObserver(s);b.observe(p.shadowRoot,n),o.push(b)}}function c(){const h=B(a);return h?(r&&r.disconnect(),l(h),r=new MutationObserver(p=>{p.some(b=>b.type==="childList"&&b.addedNodes.length>0)&&l(h),s()}),r.observe(h,n),!0):!1}const d=document.body||document.documentElement,u=new MutationObserver(()=>{c()&&s()});return u.observe(d,{childList:!0,subtree:!0}),c()&&s(),e(),function(){i&&(clearTimeout(i),i=null),u.disconnect(),r&&(r.disconnect(),r=null);for(const p of o)p.disconnect();o.length=0}}async function ze(a){if(a.subscriptionPriceDone)return;const e=a.getActiveAssignment(),t=e?a.getHypothesis(e.hypothesisId):void 0,i=t?.subscriptionData?null:a.findActiveSubscriptionTestControl(),s=t?.subscriptionData?t:i?.hypothesis;if(!s?.subscriptionData)return;const r=t?.subscriptionData?e.testId:i.testId;a.subscriptionPriceDone=!0;const o=s.subscriptionData,n=s.isControl,l=s.priceData,c=o.widget.widgetType;let d=W(l),u=J(o,d),h=u.discountMap,p=u.maxDiscount;function b(){const g=W(l);g!==d&&(d=g,u=J(o,d),h=u.discountMap,p=u.maxDiscount,a.log(`[SUB-PRICE] scope refreshed side=${n?"A":"B"}, currentProductId=${d??"n/a"}, maxDiscount=${p}`))}a.log(`[SUB-PRICE] side=${n?"A":"B"}, currentProductId=${d??"n/a"}, maxDiscount=${p}`),a.updatePriceTestHiddenInputs(r,n?"control":"variant",!1);function E(){if(!l)return null;const g=j(l),P=Z(g),A=ce(o,P,d);if(!de(A,n))return null;const k=P?g.get(P):void 0;return k?{formattedVariantPrice:G(k.priceInCents,l),formattedDiscounted:G(k.priceInCents*(1-p/100),l)}:null}Fe({originalFetch:a.fetch,swapMap:a.swapMap??{},slptValue:a.slptValue??void 0,log:a.log,getSelectedPlanId:()=>{const g=B(o);if(!g)return null;const P=Y(o,g);if(!P)return null;const A=D(o,"subscriptionInput"),k=A.length?A[0].selector:'input[name="rc_plan"]';return P.querySelector(`${k}:checked`)?.value??null}});function S(g){const P=D(o,"subscriptionDiscount");for(const A of P)if(A.selector.includes("badge")||A.selector.includes("__badge")){const k=g.querySelector(A.selector);k?.textContent&&!k.textContent.includes(`${p}%`)&&$(k,x=>N(x,p))}}function C(g){const P=E();if(!P)return;const A=D(o,"subscriptionCompareAt");for(const k of A){const x=g.querySelector(k.selector)||g.querySelector(`[part~="${k.selector}"]`);x?.textContent&&!x.textContent.includes(P.formattedVariantPrice)&&$(x,R=>/\d/.test(R)?P.formattedVariantPrice:R)}}function _(g,P){const A=D(o,"subscriptionCompareAt"),k=P===0?"none":"";for(const x of A){const R=g.querySelector(x.selector)||g.querySelector(`[part~="${x.selector}"]`);R&&(k==="none"?R.style.display!=="none"&&(R.style.display="none"):R.style.display==="none"&&(R.style.display=""))}}function T(g){const P=D(o,"subscriptionInput"),A=P.length?P[0].selector:'input[name="rc_plan"]',k=D(o,"subscriptionPlanDiscount"),x=k.length?k[0].selector:".rc-plans-button__discount";for(const R of Array.from(g.querySelectorAll("label"))){const O=R.querySelector(A),V=R.querySelector(x);
8if(O&&V){const L=h[O.value];if(L!==void 0){if(L===0)V.style.display!=="none"&&(V.style.display="none");else if(V.style.display==="none"&&(V.style.display=""),V.textContent){const Q=V.textContent.match(/[\d.]+%/)?.[0];Q&&Q!==`${L}%`&&$(V,et=>N(et,L))}}}}}function m(g){const P=g.querySelector("select");if(P)for(const A of Array.from(P.options)){const k=h[A.value];if(k!==void 0&&A.textContent){const x=A.textContent.match(/[\d.]+%/)?.[0];x&&x!==`${k}%`&&(A.textContent=N(A.textContent,k))}}}function y(g,P){const k=D(o,"subscriptionDiscount").filter(x=>x.selector.includes("benefit")||x.selector==="rc-benefits");for(const x of k){const R=g.querySelector(x.selector);if(R?.shadowRoot){for(const O of Array.from(R.shadowRoot.querySelectorAll("li")))if(O.textContent?.includes("Save")){const V=O;if(P===0)V.style.display!=="none"&&(V.style.display="none");else{V.style.display==="none"&&(V.style.display="");const L=O.textContent.match(/[\d.]+%/)?.[0];L&&L!==`${P}%`&&$(O,Q=>N(Q,P))}}}}}let w=!1;function I(){if(!w){w=!0;try{if(b(),d!==null&&Object.keys(h).length===0)return;const g=B(o);if(!g)return;S(g),l&&C(g);const P=Y(o,g);let A=p;if(P){const k=D(o,"subscriptionInput"),x=k.length?k[0].selector:'input[name="rc_plan"]',R=P.querySelector(`${x}:checked`);if(R){const O=h[R.value];O!==void 0&&(A=O)}c==="buttons"||c==="radio"?T(P):m(P)}_(g,A),y(g,A)}finally{w=!1}}}function f(){const g=E();if(!g)return;const P=B(o);if(!P)return;const A=D(o,"onetimeToggle"),k=A.length?A[0].selector:'input[value="onetime"]';if(!P.querySelector(k)?.checked)return;const R=D(o,"subscriptionPrice");for(const O of R){const V=P.querySelector(O.selector)||P.querySelector(`[part~="${O.selector}"]`);V?.textContent&&!V.textContent.includes(g.formattedDiscounted)&&$(V,L=>/\d/.test(L)?g.formattedDiscounted:L)}}function v(){a.subscriptionHideWrongPlans&&a.subscriptionHideWrongPlans(),I(),a.subscriptionUpdateOneTime&&a.subscriptionUpdateOneTime(),f()}pe({data:o,runUpdates:v})}async function We(a){if(a.subscriptionOneTimeDone)return;const e=a.getActiveAssignment(),t=e?a.getHypothesis(e.hypothesisId):void 0,i=!!(t?.subscriptionData&&t.priceData),s=i?null:a.findActiveSubscriptionTestControl(),r=i?t:s?.hypothesis;if(!r?.subscriptionData||!r.priceData)return;const o=i?e.testId:s.testId;a.subscriptionOneTimeDone=!0;const n=r.subscriptionData,l=r.priceData,c=j(l),d=r.isControl,u=d?"control":"variant";a.slptValue=`${o}:${u}:f`,a.updatePriceTestHiddenInputs(o,u,!1);function h(){const p=B(n);if(!p)return;const b=Z(c);if(!b)return;const E=W(l),S=ce(n,b,E);if(!de(S,d))return;const C=c.get(b);if(!C)return;const _=H(C.priceInCents,l.moneyFormat,l.currency,l.currencyCodeEnabled),T=D(n,"onetimePrice");if(!T.length)return;const m=D(n,"onetimeContainer"),y=m.length?m[0].selector:'[part~="rc-purchase-option__onetime"]',I=p.querySelector(y)??p;for(const f of T){let v=null;try{v=I.querySelector(f.selector)}catch{v=null}v??=I.querySelector(`[part~="${f.selector}"]`),v&&v.textContent&&!v.textContent.includes(_)&&$(v,g=>/\d/.test(g)?_:g)}}a.subscriptionUpdateOneTime=h,h()}async function Ge(a,e){const{subscriptionPreviewRender:t}=await Ne(async()=>{const{subscriptionPreviewRender:i}=await Promise.resolve().then(()=>Xe);return{subscriptionPreviewRender:i}},void 0);return t(a.subscriptionData,a.priceData,a.isControl,e)}function je(a,e){const t=a.widget.selectors.widgetParent??[],i=a.widget.selectors.subscriptionPlans??[],s=a.widget.selectors.subscriptionInput??[];if(!t.length||!i.length||!s.length){e("[SUB-GLOBAL-HIDE] Missing required selectors â skipping");return}const r=t[0].selector,o=i[0].selector,n=s[0].selector;let l=!1,c=null,d=!1;function u(){if(!d){d=!0;try{h()}finally{d=!1}}}function h(){const C=document.querySelector(r);if(!C?.shadowRoot)return;const _=C.shadowRoot.querySelector(o);if(!_?.shadowRoot)return;_.shadowRoot!==c&&(c=_.shadowRoot,l=!1);let T=0;if(a.widget.widgetType==="buttons"||a.widget.widgetType==="radio"){const m=Array.from(_.shadowRoot.querySelectorAll(n));for(const f of m)if(a.planIds.includes(f.value)){f.disabled||(f.disabled=!0);const v=f.closest("label");v&&v.style.display!=="none"&&(v.style.display="none",T++)}const y=m.filter(f=>!a.planIds.includes(f.value));if(!y.some(f=>f.checked)&&!l&&y.length>0){l=!0;const f=y[0];f.closest("label")?.click(),f.dispatchEvent(new Event("change",{bubbles:!0})),e(`[SUB-GLOBAL-HIDE] Preselected first visible plan input=${f.value}`)}const I=y.find(f=>f.checked)??y[0];
8if(I){const f=Array.from(document.querySelectorAll('input[name="selling_plan"]'));for(const v of f)v.value!==I.value&&(v.value=I.value,e(`[SUB-GLOBAL-HIDE] Mirrored plan id ${I.value} to form selling_plan input`))}}else if(a.widget.widgetType==="dropdown"){const m=_.shadowRoot.querySelector("select");if(!m)return;for(const I of Array.from(m.options))a.planIds.includes(I.value)&&(I.style.display!=="none"&&(I.style.display="none"),I.disabled||(I.disabled=!0),T++);const y=Array.from(m.options).filter(I=>!a.planIds.includes(I.value)),w=y.some(I=>I.value===m.value);y.length>0&&!w&&!l&&(l=!0,m.value=y[0].value,m.dispatchEvent(new Event("change",{bubbles:!0})),e(`[SUB-GLOBAL-HIDE] Preselected first visible option=${y[0].value}`))}T>0&&e(`[SUB-GLOBAL-HIDE] Hidden ${T} B-side plan buttons`)}const p={childList:!0,subtree:!0,characterData:!0};let b=null;function E(C){b?.disconnect(),b=new MutationObserver(()=>u()),b.observe(C,p)}function S(){const C=document.querySelector(r);if(!C?.shadowRoot)return!1;u(),new MutationObserver(()=>{u();const m=C.shadowRoot.querySelector(o);m?.shadowRoot&&E(m.shadowRoot)}).observe(C.shadowRoot,p);const T=C.shadowRoot.querySelector(o);return T?.shadowRoot&&E(T.shadowRoot),!0}if(!S()){e("[SUB-GLOBAL-HIDE] Widget not in DOM yet â waiting via MutationObserver");const C=new MutationObserver(()=>{S()&&C.disconnect()});C.observe(document.body??document.documentElement,{childList:!0,subtree:!0})}}const ue="Limited preview",Ke="Add-to-cart and checkout prices won't reflect this test until it launches â test selling plans are not created in your subscription app until after a test is launched.",Je=5e3;function Ye(){const a=document.createElement("div");a.id="shoplift-preview-subscription-warning";const e=document.createElement("span");e.id="shoplift-preview-subscription-warning__icon",e.setAttribute("aria-hidden","true"),e.textContent="!";const t=document.createElement("span");t.id="shoplift-preview-subscription-warning__label",t.textContent=ue;const i=document.createElement("div");i.id="shoplift-preview-subscription-warning__tooltip",i.setAttribute("role","tooltip"),i.textContent=Ke,a.appendChild(e),a.appendChild(t),a.appendChild(i),a.setAttribute("tabindex","0"),a.setAttribute("aria-describedby",i.id),a.setAttribute("aria-label",ue);let s=null;function r(){s!==null&&(clearTimeout(s),s=null)}function o(){i.classList.add("shoplift-preview-subscription-warning__tooltip--visible")}function n(){i.classList.remove("shoplift-preview-subscription-warning__tooltip--visible")}function l(){o(),r(),s=setTimeout(()=>{n(),s=null},Je)}function c(){r(),o()}function d(){s===null&&n()}a.addEventListener("mouseenter",c),a.addEventListener("mouseleave",d),a.addEventListener("focus",c),a.addEventListener("blur",d);function u(p){try{const b=p.target;if(!(b instanceof Element))return;(b.closest('form[action*="/cart/add"] button[type="submit"], form[action*="/cart/add"] input[type="submit"]')!==null||b.closest('[name="add"], button[name="add"], [data-add-to-cart], button[data-add-to-cart]')!==null)&&l()}catch{}}document.addEventListener("click",u,!0);function h(){r(),document.removeEventListener("click",u,!0),a.removeEventListener("mouseenter",c),a.removeEventListener("mouseleave",d),a.removeEventListener("focus",c),a.removeEventListener("blur",d),a.remove()}return{root:a,tooltip:i,cleanup:h}}let he=!1;class Ze{DATA_SL_ATTRIBUTE_P="data-sl-attribute-p";DATA_SL_TEST_ID="data-sl-test-id";VIEWPORT_TRACK_THRESHOLD=.5;temporarySessionKey="Shoplift_Session";essentialSessionKey="Shoplift_Essential";analyticsSessionKey="Shoplift_Analytics";priceSelectorsSessionKey="Shoplift_PriceSelectors_v2";shop;host;eventHost;disableReferrerOverride;legacySessionKey;cssHideClass;testConfigs;inactiveTestConfigs;hiddenSubscriptionPlans;testsFilteredByAudience;sendPageView;shopliftDebug;gaConfig;telemetryEnabled;getCountryTimeout;geoViaShopify;resolvedRegion=null;state;subscriptionPreviewWarningCleanup=null;shopifyAnalyticsId;cookie=document.cookie;isSyncing=!1;isSyncingGA=!1;fetch;localStorageSet;localStorageGet;sessionStorageSet=window.sessionStorage.setItem.bind(window.sessionStorage);sessionStorageGet=window.sessionStorage.getItem.bind(window.sessionStorage);
8urlParams=new URLSearchParams(window.location.search);device;logHistory;activeViewportObservers=new Map;clientIdRetryCount=0;constructor(e,t,i,s,r,o,n,l,c,d,u,h,p,b=!1){this.shop=e,this.host=t,this.eventHost=i,this.disableReferrerOverride=l,this.logHistory=[],this.legacySessionKey=`SHOPLIFT_SESSION_${this.shop}`,this.cssHideClass=s?"shoplift-hide":"",this.testConfigs=u.map(S=>({...S,startAt:new Date(S.startAt),statusHistory:S.statusHistory.map(C=>({...C,createdAt:new Date(C.createdAt)}))})),this.inactiveTestConfigs=h,this.hiddenSubscriptionPlans=p,this.sendPageView=!!r,this.shopliftDebug=o===!0,this.telemetryEnabled=c===!0,this.geoViaShopify=b===!0,this.gaConfig=n!=={"sendEvents":false,"mode":"gtag"}?n:{sendEvents:!1},this.fetch=window.fetch.bind(window),this.localStorageSet=window.localStorage.setItem.bind(window.localStorage),this.localStorageGet=window.localStorage.getItem.bind(window.localStorage);const E=this.getDeviceType();this.device=E!=="tablet"?E:"mobile",this.state=this.loadState(),this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.testsFilteredByAudience=u.filter(S=>
8S.status=="active"),this.getCountryTimeout=d===1000?1e3:d,window.__slReadCookie=S=>{const C=this.getCookie(S);if(C===null)return null;try{return decodeURIComponent(C)}catch{return C}},this.log("State Loaded",JSON.stringify(this.state))}deriveCategoryFromExistingTests(){if(!this.state.temporary.testCategory&&this.state.essential.visitorTests.length>0){const e=this.state.essential.visitorTests.some(t=>{if(!t.hypothesisId)return!1;const i=this.getHypothesis(t.hypothesisId);return i&&["theme","basicScript","price"].includes(i.type)});this.state.temporary.testCategory=e?"global":"conditional",this.persistTemporaryState(),this.log("Derived test category from existing visitorTests: %s",this.state.temporary.testCategory)}}async init(){try{if(this.log("Shoplift script initializing"),window.Shopify&&window.Shopify.designMode){this.log("Skipping script for design mode");return}if(window.location.href.includes("slScreenshot=true")){this.log("Skipping script for screenshot");return}if(window.location.hostname.endsWith(".edgemesh.com")){this.log("Skipping script for preview");return}if(window.location.href.includes("isShopliftMerchant")){const o=this.urlParams.get("isShopliftMerchant")==="true";this.log("Setting merchant session to %s",o),this.state.temporary.isMerchant=o,this.persistTemporaryState()}if(this.state.temporary.isMerchant){this.log("Setting up preview for merchant"),typeof window.shoplift!="object"&&this.setShopliftStub(),this.state.temporary.previewConfig||this.hidePage(),await this.initPreview(),document.querySelector("#sl-preview-bar-hide")?.remove();return}if(this.state.temporary.previewConfig=void 0,we(navigator.userAgent))return;const e=Date.now(),t=!this.state.temporary.lastSeen||e-this.state.temporary.lastSeen>1800*1e3;(!this.state.temporary.entryPage||t)&&(this.state.temporary.entryPage=K(window.location.href)),this.state.temporary.lastSeen=e,this.persistTemporaryState(),window.__slEntryPage=this.state.temporary.entryPage??"";const i=this.state.essential.visitorTests.filter(o=>o.hypothesisId&&+o.createdAt>Date.now()-6e4);if(i.length===0)this.sendDiagnosticTelemetry("page-landed",null);else for(const o of i)this.sendDiagnosticTelemetry("page-landed",o.testId,{hypothesisId:o.hypothesisId,isControl:o.assignedTo==="control",testType:o.testType??"unknown"});if(navigator.userAgent.includes("Chrome/118")){this.log("Random: %o",[Math.random(),Math.random(),Math.random()]);const o=await this.makeRequest({url:`${this.eventHost}/api/v0/events/ip`,method:"get"}).then(n=>n?.json());this.log(`IP: ${o}`),this.makeRequest({url:`${this.eventHost}/api/v0/logs`,method:"post",data:JSON.stringify(this.debugState(),ee)}).catch()}if(this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.monitorConsentChange(),this.checkForThemePreview())return;if(!this.disableReferrerOverride&&this.state.temporary.originalReferrer!=null){this.log(`Overriding referrer from '${document.referrer}' to '${this.state.temporary.originalReferrer}'`);const o=this.state.temporary.originalReferrer;delete this.state.temporary.originalReferrer,this.persistTemporaryState(),Object.defineProperty(document,"referrer",{get:()=>o,enumerable:!0,configurable:!0})}if(await this.refreshVisitor(this.shopifyAnalyticsId),await this.handleVisitorTest()){this.log("Redirecting for visitor test");return}this.setShoplift(),this.showPage(),this.ensureCartAttributesForExistingPriceTests(!1);const r=this.state.essential.visitorTests.some(o=>(o.hypothesisId?this.getHypothesis(o.hypothesisId):void 0)?.subscriptionData!=null)||Object.values(this.state.temporary.testReservations??{}).some(o=>this.getHypothesis(o.hypothesisId)?.subscriptionData!=null);this.hiddenSubscriptionPlans&&!r&&(this.log(`[SUB-GLOBAL] Visitor not in subscription test â hiding ${this.hiddenSubscriptionPlans.planIds.length} B-side plans`),je(this.hiddenSubscriptionPlans,o=>this.log(o))),await this.subscriptionSwap(),await this.subscriptionOneTimePrice(),await this.subscriptionPriceChange(),await this.finalize(),console.log("SHOPLIFT SCRIPT INITIALIZED!")}catch(e){if(e instanceof ie)return;throw e}finally{typeof window.shoplift!="object"&&this.setShopliftStub()}}getVariantColor(e){switch(e){case"a":return{text:"#141414",bg:"#E2E2E2"};case"b":return{text:"rgba(255, 255, 255, 1)",bg:"rgba(37, 99, 235, 1)"}}}getDefaultVariantTitle(e){return e.title?e.title:e.type==="price"?e.isControl?"Original prices":"Variant prices":e.isControl?"Original":"Untitled variant "+e.label.toUpperCase()}
8async initPreview(){const e=this.urlParams.get("previewConfig");if(e){this.state.temporary.previewConfig=void 0,this.log("Setting up the preview"),this.log("Found preview config, writing to temporary state");const t=await Oe(e);if(this.state.temporary.previewConfig=t,this.state.temporary.previewConfig.testTypeCategory===M.Price){this.hidePage(!0);const s=this.state.temporary.previewConfig;let r=`${this.host}/api/dom-selectors/${s.storeId}/${s.testId}/${s.isDraft||!1}`;s.shopifyProductId&&(r+=`?productId=${s.shopifyProductId}`);const o=await this.makeJsonRequest({method:"get",url:r}).catch(n=>(this.log("Error getting domSelectors",n),null));if(s.variants.forEach(n=>n.domSelectors=o[n.id]?.domSelectors),s.isDraft){const n=`${this.host}/api/dom-selectors/${s.storeId}/${s.testId}/subscription-preview`,l=await this.makeJsonRequest({method:"get",url:n}).catch(c=>(this.log("No subscription preview data for draft (test may not have a subscription widget)",c),null));l?.subscriptionData&&s.variants.forEach(c=>{c.subscriptionData=l.subscriptionData,c.priceData=l.priceData})}}this.persistTemporaryState();const i=new URL(window.location.toString());i.searchParams.delete("previewConfig"),this.queueRedirect(i)}else if(this.state.temporary.previewConfig){this.showPage();const t=this.state.temporary.previewConfig;if(t.testTypeCategory===M.Template&&this.handleTemplatePreview(t)&&this.initPreviewControls(t),t.testTypeCategory===M.UrlRedirect&&this.handleUrlPreview(t)&&this.initPreviewControls(t),t.testTypeCategory===M.Script&&this.handleScriptPreview(t)&&this.initPreviewControls(t),t.testTypeCategory===M.Price){const i=await this.handlePricePreview(t);t.isDraft?await this.handleSubscriptionPricePreview(t):await this.handleSubscriptionLivePreview(t),i&&this.initPreviewControls(t)}}}initPreviewControls(e){document.addEventListener("DOMContentLoaded",()=>{const t=e.variants.find(b=>b.id===e.currentVariant),i=t?.label||"a",s=e.variants,r=document.createElement("div");r.id="shoplift-preview-control";const o=document.createElement("div"),n=document.createElement("img");n.src=Ve,n.height=24,n.width=14,o.style.padding="0 16px",o.style.lineHeight="100%",o.appendChild(n),r.appendChild(o);const l=document.createElement("div");l.id="shoplift-preview-variant-selector";const c=document.createElement("button");c.id="shoplift-preview-variant-menu-trigger";const d=document.createElement("div");d.className="menu-variant-label",d.style.backgroundColor=this.getVariantColor(i).bg,d.style.color=this.getVariantColor(i).text,d.innerText=i.toUpperCase(),c.appendChild(d);const u=document.createElement("span");if(u.id="shoplift-preview-variant-title",u.innerText=t?this.getDefaultVariantTitle(t):"Untitled variant "+i.toUpperCase(),c.appendChild(u),s.length>1){const b=document.createElement("img");b.src=De,b.width=12,b.height=12,b.style.height="12px",b.style.width="12px",c.appendChild(b);const E=document.createElement("div");E.className="preview-variant-menu";for(const S of e.variants.filter(C=>C.id!==e.currentVariant)){const C=document.createElement("div");C.className="preview-variant-menu--item";const _=document.createElement("div");_.className="menu-variant-label",_.style.backgroundColor=this.getVariantColor(S.label).bg,_.style.color=this.getVariantColor(S.label).text,_.style.flexShrink="0",_.innerText=S.label.toUpperCase(),C.appendChild(_);const T=document.createElement("span");T.innerText=this.getDefaultVariantTitle(S),C.appendChild(T),C.addEventListener("click",()=>{this.pickVariant(S.id)}),E.appendChild(C)}l.appendChild(E),c.addEventListener("click",()=>{E.className!=="preview-variant-menu preview-variant-menu__visible"?E.classList.add("preview-variant-menu__visible"):E.classList.remove("preview-variant-menu__visible")}),document.addEventListener("click",S=>{S.target instanceof Element&&!c.contains(S.target)&&E.className==="preview-variant-menu preview-variant-menu__visible"&&E.classList.remove("preview-variant-menu__visible")})}else c.style.pointerEvents="none",d.style.margin="0";if(l.appendChild(c),r.appendChild(l),e.hasSubscription){this.subscriptionPreviewWarningCleanup?.();const b=Ye();r.appendChild(b.root),this.subscriptionPreviewWarningCleanup=b.cleanup}const h=document.createElement("div"),p=document.createElement("button");p.id="shoplift-exit-preview-button",p.innerText="Exit",h.appendChild(p),p.addEventListener("click",()=>{this.exitPreview()}),r.appendChild(h),document.body.appendChild(r),requestAnimationFrame(()=>{r.classList.add("visible")})}),this.ensureCartAttributesForExistingPriceTests(!0)}pickVariant(e){if(this.state.temporary.previewConfig){const t=this.state.temporary.previewConfig,i=new URL(window.location.toString());if(t.testTypeCategory===M.UrlRedirect){const s=t.variants.find(r=>r.id===t.currentVariant)?.redirectUrl;if(i.pathname===s){const r=t.variants.find(o=>o.id===e)?.redirectUrl;r&&(i.pathname=r)}}if(t.testTypeCategory===M.Template){const s=t.variants.find(r=>r.id===t.currentVariant)?.pathName;if(s&&i.pathname===s){const r=t.variants.find(o=>o.id===e)?.pathName;r&&r!==s&&(i.pathname=r)}}t.currentVariant=e,this.persistTemporaryState(),this.queueRedirect(i)}}exitPreview(){const e=new URL(window.location.toString());if(this.state.temporary.previewConfig?.testTypeCategory===M.Template&&e.searchParams.delete("view"),this.state.temporary.previewConfig?.testTypeCategory===M.Script&&e.searchParams.delete("slVariant"),this.state.temporary.previewConfig?.testTypeCategory===M.UrlRedirect){const i=this.state.temporary.previewConfig.variants.filter(r=>!r.isControl&&r.redirectUrl!==null).map(r=>r.redirectUrl),s=this.state.temporary.previewConfig.variants.find(r=>r.label==="a")?.redirectUrl;i.includes(e.pathname)&&s&&(e.pathname=s)}this.state.temporary.isMerchant=!1,e.searchParams.delete("isShopliftMerchant"),this.state.temporary.previewConfig=void 0,this.persistTemporaryState(),this.subscriptionPreviewWarningCleanup?.(),this.subscriptionPreviewWarningCleanup=null,this.hidePage(),this.queueRedirect(e)}handleTemplatePreview(e){const t=e.currentVariant,i=e.variants.find(l=>l.id===t);if(!i)return!1;const s=e.variants.find(l=>l.isControl);if(!s)return!1;this.log("Setting up template preview for type",s.type);
8const r=new URL(window.location.toString()),o=r.searchParams.get("view"),n=i.type===s.type;return!n&&!i.isControl&&template.suffix===s.affix&&this.typeFromTemplate()===s.type&&i.pathName!==null?(this.log("Hit control template type, redirecting to the variant url"),this.hidePage(),r.pathname=i.pathName,this.queueRedirect(r),!0):(!i.isControl&&this.typeFromTemplate()==i.type&&template.suffix===s.affix&&n&&o!==(i.affix||"__DEFAULT__")&&(this.log("Template type and affix match control, updating the view param"),r.searchParams.delete("view"),this.log("Setting the new viewParam to",i.affix||"__DEFAULT__"),this.hidePage(),r.searchParams.set("view",i.affix||"__DEFAULT__"),this.queueRedirect(r)),o!==null&&o!==(i.affix||"__DEFAULT__")&&(r.searchParams.delete("view"),this.hidePage(),this.queueRedirect(r)),!0)}handleUrlPreview(e){const t=e.currentVariant,i=e.variants.find(o=>o.id===t),s=e.variants.find(o=>o.isControl)?.redirectUrl;if(!i)return!1;this.log("Setting up URL redirect preview");const r=new URL(window.location.toString());return r.pathname===s&&!i.isControl&&i.redirectUrl!==null&&(this.log("Url matches control, redirecting"),this.hidePage(),r.pathname=i.redirectUrl,this.queueRedirect(r)),!0}handleScriptPreview(e){const t=e.currentVariant,i=e.variants.find(o=>o.id===t);if(!i)return!1;this.log("Setting up script preview");const s=new URL(window.location.toString());return s.searchParams.get("slVariant")!==i.id&&(this.log("current id doesn't match the variant, redirecting"),s.searchParams.delete("slVariant"),this.log("Setting the new slVariantParam"),this.hidePage(),s.searchParams.set("slVariant",i.id),this.queueRedirect(s)),!0}async handlePricePreview(e){const t=e.currentVariant,i=e.variants.find(s=>s.id===t);return i?(this.log("Setting up price preview"),i.domSelectors&&i.domSelectors.length>0&&(U(document,{testId:e.testId,hypothesisId:i.id,selectors:i.domSelectors}),this.ensureCartAttributesForExistingPriceTests(!0)),!0):!1}async handleSubscriptionPricePreview(e){const t=e.variants.find(i=>i.id===e.currentVariant);t?.subscriptionData&&(this.log("Setting up subscription price preview"),await Ge({id:t.id,isControl:t.isControl,subscriptionData:t.subscriptionData,priceData:t.priceData},(i,...s)=>this.log(i,...s)))}async handleSubscriptionLivePreview(e){this.testConfigs.find(s=>s.id===e.testId)?.hypotheses.find(s=>s.id===e.currentVariant)?.subscriptionData&&(this.log("Setting up subscription live preview"),this.subscriptionSwapDone=!1,this.subscriptionOneTimeDone=!1,this.subscriptionPriceDone=!1,await this.subscriptionSwap(),await this.subscriptionOneTimePrice(),await this.subscriptionPriceChange())}async finalize(){const e=await this.getCartState();e!==null&&this.queueCartUpdate(e),this.pruneStateAndSave(),await this.syncAllEvents()}setShoplift(){this.log("Setting up public API");const t=this.urlParams.get("slVariant")==="true",i=t?null:this.urlParams.get("slVariant");window.shoplift={isHypothesisActive:async s=>{if(this.log("Script checking variant for hypothesis '%s'",s),t)return this.log("Forcing variant for hypothesis '%s'",s),!0;if(i!==null)return this.log("Forcing hypothesis '%s'",i),s===i;const r=this.testConfigs.find(n=>n.hypotheses.some(l=>l.id===s));if(!r)return this.log("No test found for hypothesis '%s'",s),!1;const o=this.state.essential.visitorTests.find(n=>n.testId===r.id);return o?(this.log("Active visitor test found",s),o.hypothesisId===s):(await this.manuallySplitVisitor(r),this.testConfigs.some(n=>n.hypotheses.some(l=>l.id===s&&this.state.essential.visitorTests.some(c=>c.hypothesisId===l.id))))},setAnalyticsConsent:async s=>{await this.onConsentChange(s,!0)},getVisitorData:()=>({visitor:this.state.analytics.visitor,visitorTests:this.state.essential.visitorTests.filter(s=>!s.isInvalid).map(s=>{const{shouldSendToGa:r,savedAt:o,...n}=s;return n})})}}setShopliftStub(){this.log("Setting up stubbed public API");const t=this.urlParams.get("slVariant")==="true",i=t?null:this.urlParams.get("slVariant");window.shoplift={isHypothesisActive:s=>Promise.resolve(t||s===i),setAnalyticsConsent:()=>Promise.resolve(),getVisitorData:()=>({visitor:null,visitorTests:[]})}}async manuallySplitVisitor(e){this.log("Starting manual split for test '%s'",e.id),await this.handleVisitorTest([e]);const t=this.getReservationForTest(e.id);t&&!t.isRealized&&t.entryCriteriaKey&&(this.log("Realizing manual API reservation for test '%s'",e.id),this.realizeReservationForCriteria(t.entryCriteriaKey)),this.saveState(),this.syncAllEvents()}async handleVisitorTest(e){await this.filterTestsByAudience(this.testConfigs,this.state.analytics.visitor??this.buildBaseVisitor(),this.state.essential.visitorTests),this.pruneStaleVisitorTests(),this.deriveC
8ategoryFromExistingTests(),this.clearStaleReservations();let t=e?e.filter(i=>this.testsFilteredByAudience.some(s=>s.id===i.id)):[...this.testsForUrl(this.testsFilteredByAudience),...this.domTestsForUrl(this.testsFilteredByAudience)];try{if(t.length===0)return this.log("No tests found"),!1;this.log("Checking for existing visitor test on page");const i=this.getCurrentVisitorHypothesis(t);if(i){this.log("Found current visitor test");const l=this.considerRedirect(i);return l&&(this.log("Redirecting for current visitor test"),this.redirect(i)),l}const s=this.getReservationForCurrentPage();if(s){this.log("Found matching reservation for current page: %s",s.testId);const l=this.getHypothesis(s.hypothesisId);if(l){l.type!=="price"&&this.realizeReservationForCriteria(s.entryCriteriaKey);const c=this.considerRedirect(l);return c&&this.redirect(l),c}}this.log("No active test relation for test page");const r=this.testsForUrl(this.inactiveTestConfigs.filter(l=>this.testIsPaused(l)&&l.hypotheses.some(c=>this.state.essential.visitorTests.some(d=>d.hypothesisId===c.id)))).map(l=>l.id);if(r.length>0)return this.log("Visitor has paused tests for test page, skipping test assignment: %o",r),!1;if(!this.state.temporary.testCategory){const l=this.testsFilteredByAudience.filter(d=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(d))),c=this.testsFilteredByAudience.filter(d=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(d)));if(this.log("Category dice roll - global tests: %o, conditional tests: %o",l.map(d=>({id:d.id,title:d.title,criteria:this.getEntryCriteriaKey(d)})),c.map(d=>({id:d.id,title:d.title,criteria:this.getEntryCriteriaKey(d)}))),l.length>0&&c.length>0){const d=l.length,u=c.length,h=d+u,p=Math.random()*h;this.state.temporary.testCategory=p<d?"global":"conditional",this.log("Category dice roll: rolled %.2f of %d (global weight: %d, conditional weight: %d), selected '%s'",p,h,d,u,this.state.temporary.testCategory)}else l.length>0?(this.state.temporary.testCategory="global",this.log("Only global tests available, setting category to global")):(this.state.temporary.testCategory="conditional",this.log("Only conditional tests available, setting category to conditional"));this.persistTemporaryState()}const o=this.state.temporary.testCategory;if(this.log("Visitor test category: %s",o),o==="global"){const l=this.testsFilteredByAudience.filter(c=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)));for(const c of l)this.markTestAsBlocked(c,"category:global");t=t.filter(c=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)))}else{const l=this.testsFilteredByAudience.filter(c=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)));for(const c of l)this.markTestAsBlocked(c,"category:conditional");t=t.filter(c=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)))}if(t.length===0)return this.log("No tests remaining after category filter"),!1;this.createReservations(t);const n=this.getReservationForCurrentPage();if(n&&!n.isRealized){const l=this.getHypothesis(n.hypothesisId);if(l){l.type!=="price"&&this.realizeReservationForCriteria(n.entryCriteriaKey);const c=this.considerRedirect(l);return c&&(this.log("Redirecting for new test"),this.redirect(l)),c}}return!1}finally{this.includeInDomTests(),this.saveState()}}includeInDomTests(){this.applyControlForAudienceFilteredPriceTests();const e=this.getDomTestsForCurrentUrl(),t=this.getVisitorDomHypothesis(e);for(const i of e){this.log("Evaluating dom test '%s'",i.id);const s=i.hypotheses.some(p=>p.type==="price");if(this.state.essential.visitorTests.find(p=>p.testId===i.id&&p.isInvalid&&!p.hypothesisId)){if(this.log("Visitor is blocked from test '%s', applying control prices if price test",i.id),s){const p=i.hypotheses.find(b=>b.isControl);p?.priceData&&(this.applyPriceTestWithMapLookup(i.id,p,[p],()=>{this.log("Control prices applied for blocked visitor, no metrics tracked")}),this.updatePriceTestHiddenInputs(i.id,"control",!1))}continue}const o=this.getReservationForTest(i.id);let n=null,l=!1;const c=t.find(p=>i.hypotheses.some(b=>p.id===b.id));if(o)n=this.getHypothesis(o.hypothesisId)??null,this.log("Using reserved hypothesis '%s' for test '%s'",o.hypothesisId,i.id);else if(c)n=c,this.log("Using existing hypothesis assignment for test '%s'",i.id);else if(s){const p=this.visitorActiveTestTypeWithReservations();p?(l=!0,this.log("Visitor already in test type '%s', treating as non-test for price test '%s'",p,i.id)):n=this.pickHypothesis(i)}else n=this.pickHypothesis(i);if(l&&s){const p=i.hypotheses.find(b=>b.isControl);p?.priceData&&(this.log("Applying control prices for non-test visitor on price test '%s' (Map-based)",i.id),this.applyPriceTestWithMapLookup(i.id,p,[p],()=>{this.log("Control prices applied for non-test visitor, no metrics tracked")}
8),this.updatePriceTestHiddenInputs(i.id,"control",!1));continue}if(!n){this.log("Failed to pick hypothesis for test");continue}this.sendDiagnosticTelemetry("assignment",i.id,{hypothesisId:n.id,isControl:n.isControl,testType:n.type});const d=i.bayesianRevision??4,u=n.type==="price",h=d>=5;if(u&&h){if(this.log(`Price test with Map-based lookup (v${d}): ${i.id}`),!n.priceData){this.log("No price data for hypothesis '%s', skipping",n.id);continue}const p=n.isControl?"control":"variant";this.log(`Setting up Map-based price test for ${p} (test: ${i.id})`),this.applyPriceTestWithMapLookup(i.id,n,i.hypotheses,b=>{const E=this.getReservationForTest(b);E&&!E.isRealized&&E.entryCriteriaKey?this.realizeReservationForCriteria(E.entryCriteriaKey):this.queueAddVisitorToTest(b,n),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()});continue}if(u&&!h){this.log(`Price test without viewport tracking (v${d}): ${i.id}`);const p=this.getDomSelectorsForHypothesis(n);if(p.length===0)continue;U(document,{testId:i.id,hypothesisId:n.id,selectors:p},b=>{this.queueAddVisitorToTest(b,n),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()});continue}if(!n.domSelectors||n.domSelectors.length===0){this.log("No selectors found, skipping hypothesis");continue}U(document,{testId:i.id,hypothesisId:n.id,selectors:n.domSelectors},p=>{this.queueAddVisitorToTest(p,n),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()})}}considerRedirect(e){if(this.log("Considering redirect for hypothesis '%s'",e.id),e.isControl)return this.log("Skipping redirect for control"),!1;if(e.type==="basicScript"||e.type==="manualScript")return this.log("Skipping redirect for script test"),!1;const t=this.state.essential.visitorTests.find(o=>o.hypothesisId===e.id),i=new URL(window.location.toString()),r=new URLSearchParams(window.location.search).get("view");if(e.type==="theme"){if(!(e.themeId===themeId)){if(this.log("Theme id '%s' is not hypothesis theme ID '%s'",e.themeId,themeId),this.isAppProxyPath())return this.log("On App Proxy path, skipping theme redirect to avoid infinite loop"),!1;if(t&&t.themeId!==e.themeId&&(t.themeId===themeId||!this.isThemePreview()))this.log("On old theme, redirecting and updating local visitor"),t.themeId=e.themeId;else if(this.isThemePreview())return this.log("On non-test theme, skipping redirect"),!1;return this.log("Hiding page to redirect for theme test"),this.hidePage(),!0}return!1}else if(e.type!=="dom"&&e.type!=="price"&&e.affix!==template.suffix&&e.affix!==r||e.redirectPath&&!i.pathname.endsWith(e.redirectPath))return this.log("Hiding page to redirect for template test"),this.hidePage(),!0;return this.log("Not redirecting"),!1}redirect(e){if(this.log("Redirecting to hypothesis '%s'",e.id),e.isControl)return;const t=new URL(window.location.toString());if(t.searchParams.delete("view"),e.redirectPath){const n=RegExp("^(/w{2}-w{2})/").exec(t.pathname);if(n&&n.length>1){const l=n[1];t.pathname=`${l}${e.redirectPath}`}else t.pathname=e.redirectPath}else e.type==="theme"?(t.searchParams.set("_ab","0"),t.searchParams.set("_fd","0"),t.searchParams.set("_sc","1"),t.searchParams.set("preview_theme_id",e.themeId.toString())):e.type!=="urlRedirect"&&t.searchParams.set("view",e.affix);const i=this.state.essential.visitorTests.find(n=>n.hypothesisId===e.id)?.testId,s=t.pathname+t.search,r=window.location.pathname+window.location.search,o=K(t.hash);if(i&&s!==r&&!o){const n=qe(),l=He({v:2,t:i,n,fh:Me(window.location.pathname+window.location.search)});t.hash=`slr-${n}`;const c=new Date(Date.now()+3e4).toUTCString();document.cookie=`shoplift_redirect=${l};domain=.${window.location.hostname};path=/;SameSite=Strict;expires=${c}`}s===r&&this.showPage(),this.queueRedirect(t)}async refreshVisitor(e){if(e===null||!this.state.essential.isFirstLoad||!this.testConfigs.some(i=>i.visitorOption!=="all"))return;this.log("Refreshing visitor"),this.hidePage();const t=await this.getVisitor(e);t&&t.id&&this.updateLocalVisitor(t)}buildBaseVisitor(){return{shopifyAnalyticsId:this.shopifyAnalyticsId,device:this.device,country:null,...this.state.essential.initialState}}getInitialState(){const e=this.getUTMValue("utm_source")??"",t=this.getUTMValue("utm_medium")??"",i=this.getUTMValue("utm_campaign")??"",s=this.getUTMValue("utm_content")??"",r=window.document.referrer,o=this.device;return{createdAt:new Date,utmSource:e,utmMedium:t,utmCampaign:i,utmContent:s,referrer:r,device:o}}checkForThemePreview(){return this.log("Checking for theme preview"),window.location.hostname.endsWith(".shopifypreview.com")?(this.log("on shopify preview domain"),this.clearThemeBar(!0,!1,this.state),document.querySelector("#sl-preview-bar-hide")?.remove(),!1):this.isThemePreview()?this.state.essential.visitorTests.some(e=>e.isThemeTest&&e.hypothesisId!=null&&this.getHypothesis(e.hypothesisId)&&e.themeId===themeId)?(this.log("On active theme test, remov
8ing theme bar"),this.clearThemeBar(!1,!0,this.state),!1):this.state.essential.visitorTests.some(e=>e.isThemeTest&&e.hypothesisId!=null&&!this.getHypothesis(e.hypothesisId)&&e.themeId===themeId)?(this.log("Visitor is on an inactive theme test, redirecting to main theme"),this.redirectToMainTheme(),!0):this.state.essential.isFirstLoad?(this.log("No visitor found on theme preview, redirecting to main theme"),this.redirectToMainTheme(),!0):this.inactiveTestConfigs.some(e=>e.hypotheses.some(t=>t.themeId===themeId))?(this.log("Current theme is an inactive theme test, redirecting to main theme"),this.redirectToMainTheme(),!0):this.testConfigs.some(e=>e.hypotheses.some(t=>t.themeId===themeId))?(this.log("Falling back to clearing theme bar"),this.clearThemeBar(!1,!0,this.state),!1):(this.log("No tests on current theme, skipping script"),this.clearThemeBar(!0,!1,this.state),document.querySelector("#sl-preview-bar-hide")?.remove(),!0):(this.log("Not on theme preview"),this.clearThemeBar(!0,!1,this.state),!1)}redirectToMainTheme(){this.hidePage();const e=new URL(window.location.toString());e.searchParams.set("preview_theme_id",""),this.queueRedirect(e)}testsForUrl(e){const t=new URL(window.location.href),i=this.typeFromTemplate();return e.filter(s=>s.hypotheses.some(r=>r.type!=="dom"&&r.type!=="price"&&(r.isControl&&r.type===i&&r.affix===template.suffix||r.type==="theme"||r.isControl&&r.type==="urlRedirect"&&r.redirectPath&&t.pathname.endsWith(r.redirectPath)||r.type==="basicScript"))&&(s.ignoreTestViewParameterEnforcement||!t.searchParams.has("view")||s.hypotheses.map(r=>r.affix).includes(t.searchParams.get("view")??"")))}domTestsForUrl(e){const t=new URL(window.location.href);return e.filter(i=>i.hypotheses.some(s=>s.type!=="dom"&&s.type!=="price"?!1:s.type==="price"&&s.priceData&&s.priceData.variants.length>0?!0:s.domSelectors&&s.domSelectors.some(r=>new RegExp(se(r)).test(K(t.toString())))))}async filterTestsByAudience(e,t,i){const s=[],r=e.some(n=>(n.requiresRegion||this.geoViaShopify&&n.requiresCountry)&&!i.some(l=>l.testId===n.id));this.resolvedRegion===null&&r&&(this.log("Hiding page to wait for Shopify region resolution"),this.hidePage(),await this.waitForResolvedRegion()),window.__slRegion=this.resolvedRegion??"";let o=t.country;this.geoViaShopify?o=this.resolvedRegion?this.resolvedRegion.slice(0,2):o:!o&&e.some(n=>n.requiresCountry&&!i.some(l=>l.testId===n.id))&&(this.log("Hiding page to check geoip"),this.hidePage(),o=await this.makeJsonRequest({method:"get",url:`${this.eventHost}/api/v0/visitors/get-country`,signal:AbortSignal.timeout(this.getCountryTimeout)}).catch(n=>(this.log("Error getting country",n),null)));for(const n of e){if(this.log("Checking audience for test '%s'",n.id),this.state.essential.visitorTests.some(d=>d.testId===n.id&&d.hypothesisId==null)){console.log(`Skipping blocked test '${n.id}'`);continue}const l=this.visitorCreatedDuringTestActive(n.statusHistory);(i.some(d=>d.testId===n.id&&(n.device==="all"||n.device===t.device&&n.device===this.device))||this.isTargetAudience(n,t,l,o))&&(this.log("Visitor is in audience for test '%s'",n.id),s.push(n))}this.testsFilteredByAudience=s}async waitForResolvedRegion(e=1500,t=50){const i=Date.now();for(;this.resolvedRegion===null&&Date.now()-i<e;)await new Promise(s=>window.setTimeout(s,t))}isTargetAudience(e,t,i,s){const r=this.getChannel(t);return(e.device==="all"||e.device===t.device&&e.device===this.device)&&(e.visitorOption==="all"||e.visitorOption==="new"&&i||e.visitorOption==="returning"&&!i)&&(e.targetAudiences.length===0||e.targetAudiences.reduce((o,n)=>o||n.reduce((l,c)=>l&&c(t,i,r,s),!0),!1))}visitorCreatedDuringTestActive(e){let t="";for(const i of e){if(this.state.analytics.visitor!==null&&this.state.analytics.visitor.createdAt<i.createdAt||this.state.essential.initialState.createdAt<i.createdAt)break;t=i.status}return t==="active"}getDomTestsForCurrentUrl(){return this.domTestsForUrl(this.testsFilteredByAudience)}getCurrentVisitorHypothesis(e){return e.flatMap(t=>t.hypotheses).find(t=>t.type!=="dom"&&t.type!=="price"&&this.state.essential.visitorTests.some(i=>i.hypothesisId===t.id))}getVisitorDomHypothesis(e){return e.flatMap(t=>t.hypotheses).filter(t=>(t.type==="dom"||t.type==="price")&&this.state.essential.visitorTests.some(i=>i.hypothesisId===t.id))}getHypothesis(e){return this.testConfigs.filter(t=>t.hypotheses.some(i=>i.id===e)).map(t=>t.hypotheses.find(i=>i.id===e))[0]}getActiveAssignment(){if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const t=this.state.temporary.previewConfig;return t.currentVariant&&t.testId?{testId:t.testId,hypothesisId:t.currentVariant}:null}const e=this.state.essential.visitorTests.find(t=>t.hypothesisId);return e?.hypothesisId?{testId:e.testId,hypothesisId:e.hypothesisId}:null}findActiveSubscriptionTestControl(){for(const e of this.testConfigs){const t=e.hypotheses.find(i=>i.isControl);if(t?.subscriptionData)return{testId:e.id,hypothesis:t}}return null}getDomSelectorsForHypothesis(e){if(!e)return[];if(e.domSelectors&&e.domSelectors.length>0)return e.domSelectors;if(e.priceData){const t=`${this.priceSelectorsSessionKey}_${e.id}`;try{const s=sessionStorage.getItem(t);if(s){const r=JSON.parse(s);return e.domSelectors=r,this.log("Loaded %d price selectors from cache for hypothesis '%s'",r.length,e.id),r}}catch{}const i=$e(e.priceData);e.domSelectors=i;try{sessionStorage.setItem(t,JSON.stringify(i)),this.log("Generated and cached %d price selectors for hypothesis '%s'",i.length,e.id)}catch{this.log("Generated %d price selectors for hypothesis '%s' (cache unavailable)",i.length,e.id)}return i}return[]}hasThemeTest(e){return e.some(t=>t.hypotheses.some(i=>i.type==="theme"))}hasTestThatIsNotThemeTest(e){return e.some(t=>t.hypotheses.some(i=>i.type!=="theme"&&i.type!=="dom"&&i.type!=="price"))}hasThemeAndOtherTestTypes(e){return this.hasThemeTest(e)&&this.hasTestThatIsNotThemeTest(e)}testIsPaused(e){return e.status==="paused"||e.status==="incompatible"||e.status==="suspended"}visitorActiveTestType(){const e=this.state.essential.visitorTests.filter(t=>this.testConfigs.some(i=>i.hypotheses.some(s=>s.id==t.hypothesisId)));return e.length===0?null:e.some(t=>t.isThemeTest)?"theme":"templateOrUrlRedirect"}getReservationType(e){return e==="price"||this.isTemplateTestType(e)?"deferred":"immediate"}isTemplateTestType(e){return["product","collection","landing","index","cart","search","blog","article","collectionList"].includes(e)}getEntryCriteriaKey(e){const t=e.hypotheses.find(i=>i.isControl);if(!t)return`unknown:${e.id}`;switch(t.type){case"theme":return"global:theme";case"basicScript":return"global:autoApi";case"price":return"global:price";case"manualScript":return`conditional:manualApi:${e.id}`;case"urlRedirect":return`conditional:url:${t.redirectPath||"unknown"}`;default:return`conditional:template:${t.type}`}}isGlobalEntryCriteria(e){return e.startsWith("global:")}groupTestsByEntryCriteria(e){const t=new Map;for(const i of e){const s=this.getEntryCriteriaKey(i),r=t.get(s)||[];r.push(i),t.set(s,r)}return t}doesCurrentPageMatchEntryCriteria(e){if(this.isGlobalEntryCriteria(e))return!0;
8if(e==="conditional:manualApi")return!1;if(e.startsWith("conditional:url:")){const t=e.replace("conditional:url:","");return window.location.pathname.endsWith(t)}if(e.startsWith("conditional:template:")){const t=e.replace("conditional:template:","");return this.typeFromTemplate()===t}return!1}hasActiveReservation(){const e=this.getActiveReservations();return Object.values(e).some(t=>!t.isRealized)}getActiveReservation(){const e=this.getActiveReservations();return Object.values(e).find(t=>!t.isRealized)??null}clearStaleReservations(){const e=this.state.temporary.testReservations;if(!e)return;let t=!1;for(const[i,s]of Object.entries(e)){const r=this.testConfigs.find(n=>n.id===s.testId);if(!r){this.log("Test '%s' no longer in config, clearing reservation for criteria '%s'",s.testId,i),delete e[i],t=!0;continue}if(r.status!=="active"){this.log("Test '%s' status is '%s', clearing reservation for criteria '%s'",s.testId,r.status,i),delete e[i],t=!0;continue}this.testsFilteredByAudience.some(n=>n.id===s.testId)||(this.log("Visitor no longer passes audience for test '%s', clearing reservation for criteria '%s'",s.testId,i),delete e[i],t=!0)}t&&this.persistTemporaryState()}createReservations(e){if(this.state.temporary.testReservations||(this.state.temporary.testReservations={}),this.state.temporary.rolledEntryCriteria||(this.state.temporary.rolledEntryCriteria=[]),this.state.temporary.testCategory==="global"){this.createSingleReservation(e,"global");return}const i=e.filter(n=>this.doesCurrentPageMatchEntryCriteria(this.getEntryCriteriaKey(n))),s=e.filter(n=>!this.doesCurrentPageMatchEntryCriteria(this.getEntryCriteriaKey(n)));this.log("Conditional tests split - matching current page: %d, not matching: %d",i.length,s.length),i.length>0&&this.log("Tests matching current page (same pool): %o",i.map(n=>({id:n.id,title:n.title,criteria:this.getEntryCriteriaKey(n)})));const r=`conditional:current-page:${this.typeFromTemplate()}`;if(i.length>0&&!this.state.temporary.rolledEntryCriteria.includes(r)){this.createSingleReservation(i,r);for(const n of i){const l=this.getEntryCriteriaKey(n);this.state.temporary.rolledEntryCriteria.includes(l)||this.state.temporary.rolledEntryCriteria.push(l)}}const o=this.groupTestsByEntryCriteria(s);for(const[n,l]of o){if(this.state.temporary.rolledEntryCriteria.includes(n)){this.log("Already rolled for criteria '%s', skipping",n);continue}if(l.some(S=>this.state.essential.visitorTests.some(C=>C.testId===S.id))){this.log("Visitor already has VT for criteria '%s', skipping",n),this.state.temporary.rolledEntryCriteria.push(n);continue}const d=[...l].sort((S,C)=>S.id.localeCompare(C.id));this.log("Test dice roll for criteria '%s' - available tests: %o",n,d.map(S=>({id:S.id,title:S.title})));const u=Math.floor(Math.random()*d.length),h=d[u];this.log("Test dice roll: picked index %d of %d, selected test '%s' (%s)",u+1,l.length,h.id,h.title);const p=this.pickHypothesis(h);if(!p){this.log("No hypothesis picked for test '%s'",h.id);continue}this.sendDiagnosticTelemetry("assignment",h.id,{hypothesisId:p.id,isControl:p.isControl,testType:p.type});const b=this.getReservationType(p.type),E={testId:h.id,hypothesisId:p.id,testType:p.type,reservationType:b,isThemeTest:p.type==="theme",themeId:p.themeId,createdAt:new Date,isRealized:!1,entryCriteriaKey:n};this.state.temporary.testReservations[n]=E,this.state.temporary.rolledEntryCriteria.push(n),this.log("Created %s reservation for test '%s' (criteria: %s)",b,h.id,n);for(const S of l)S.id!==h.id&&this.markTestAsBlocked(S,n)}this.persistTemporaryState()}createSingleReservation(e,t){if(this.state.temporary.rolledEntryCriteria.includes(t)){this.log("Already rolled for pool '%s', skipping",t);return}if(e.some(u=>this.state.essential.visitorTests.some(h=>h.testId===u.id&&!h.isInvalid))){this.log("Visitor already has VT for pool '%s', skipping",t),this.state.temporary.rolledEntryCriteria.push(t);return}if(e.length===0){this.log("No tests in pool '%s'",t);return}const s=[...e].sort((u,h)=>u.id.localeCompare(h.id));this.log("Test dice roll for pool '%s' - available tests: %o",t,s.map(u=>({id:u.id,title:u.title,criteria:this.getEntryCriteriaKey(u)})));const r=Math.floor(Math.random()*s.length),o=s[r];this.log("Test dice roll: picked index %d of %d, selected test '%s' (%s)",r,e.length,o.id,o.title);const n=this.pickHypothesis(o);if(!n){this.log("No hypothesis picked for test '%s'",o.id);return}this.sendDiagnosticTelemetry("assignment",o.id,{hypothesisId:n.id,isControl:n.isControl,testType:n.type});const l=this.getReservationType(n.type),c=this.getEntryCriteriaKey(o),d={testId:o.id,hypothesisId:n.id,testType:n.type,reservationType:l,isThemeTest:n.type==="theme",themeId:n.themeId,createdAt:new Date,isRealized:!1,entryCriteriaKey:c};this.state.temporary.testReservations[c]=d,this.state.temporary.rolledEntryCriteria.push(t),this.log("Created %s reservation for test '%s' from pool '%s' (criteria: %s)",l,o.id,t,c);for(const u of e)u.id!==o.id&&this.markTestAsBlocked(u,`pool:${t}`);this.persistTemporaryState()}markTestAsBlocked(e,t){this.state.essential.visitorTests.some(i=>i.testId===e.id)||(this.log("Blocking visitor from test '%s' (reason: %s)",e.id,t),this.state.essential.visitorTests.push({createdAt:new Date,testId:e.id,hypothesisId:null,isThemeTest:e.hypotheses.some(i=>
8i.type==="theme"),shouldSendToGa:!1,isSaved:!0,isInvalid:!0,themeId:void 0}))}realizeReservationForCriteria(e){const t=this.state.temporary.testReservations?.[e];if(!t)return this.log("No reservation found for criteria '%s'",e),!1;if(t.isRealized)return this.log("Reservation already realized for criteria '%s'",e),!1;if(this.state.essential.visitorTests.some(s=>s.testId===t.testId&&!s.isInvalid))return this.log("Visitor already assigned to test '%s'",t.testId),!1;const i=this.getHypothesis(t.hypothesisId);return i?(t.isRealized=!0,this.persistTemporaryState(),this.queueAddVisitorToTest(t.testId,i),this.saveState(),this.log("Realized reservation for test '%s' (criteria: %s)",t.testId,e),!0):(this.log("Hypothesis '%s' not found",t.hypothesisId),!1)}getActiveReservations(){return this.state.temporary.testReservations??{}}getReservationForCurrentPage(){const e=this.getActiveReservations();for(const[t,i]of Object.entries(e)){if(i.isRealized)continue;const s=this.testConfigs.find(r=>r.id===i.testId);if(!(!s||s.status!=="active")&&this.doesCurrentPageMatchEntryCriteria(t))return i}return null}getReservationForTest(e){const t=this.getActiveReservations();return Object.values(t).find(i=>i.testId===e)??null}getReservationTestType(){const e=this.getActiveReservations(),t=Object.values(e);if(t.length===0)return null;for(const i of t)if(i.isThemeTest)return"theme";for(const i of t)if(i.testType==="price")return"price";return t.some(i=>!i.isRealized)?"templateOrUrlRedirect":null}hasPriceTests(e){return e.some(t=>t.hypotheses.some(i=>i.type==="price"))}_priceTestProductIds=null;getPriceTestProductIds(){if(this._priceTestProductIds)return this._priceTestProductIds;const e=new Set;for(const t of this.testConfigs)for(const i of t.hypotheses)if(i.type==="price"){for(const s of i.domSelectors||[]){const r=s.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);r?.[1]&&e.add(r[1])}if(i.priceData?.variants)for(const[s]of i.priceData.variants)e.add(s)}return this._priceTestProductIds=e,this.log("Built price test product ID cache with %d products",e.size),e}isProductInAnyPriceTest(e){return this.getPriceTestProductIds().has(e)}visitorActiveTestTypeWithReservations(){const e=this.getActiveReservations();for(const r of Object.values(e)){if(r.isThemeTest)return"theme";if(r.testType==="price")return"price"}if(Object.values(e).some(r=>!r.isRealized)){if(this.state.temporary.testCategory==="global")for(const o of Object.values(e)){if(o.testType==="theme")return"theme";if(o.testType==="price")return"price";if(o.testType==="basicScript")return"theme"}return"templateOrUrlRedirect"}const i=this.state.essential.visitorTests.filter(r=>!r.isInvalid&&this.testConfigs.some(o=>o.hypotheses.some(n=>n.id===r.hypothesisId)));return i.length===0?null:i.some(r=>this.getHypothesis(r.hypothesisId)?.type==="price")?"price":i.some(r=>r.isThemeTest)?"theme":"templateOrUrlRedirect"}applyControlForAudienceFilteredPriceTests(){const e=this.testConfigs.filter(s=>s.status==="active"&&s.hypotheses.some(r=>r.type==="price"));if(e.length===0)return;const t=this.testsFilteredByAudience.filter(s=>s.hypotheses.some(r=>r.type==="price")),i=e.filter(s=>!t.some(r=>r.id===s.id));if(i.length!==0){this.log("Found %d price tests filtered by audience, applying control selectors",i.length);for(const s of i){const r=s.hypotheses.find(c=>c.isControl),o=this.getDomSelectorsForHypothesis(r);if(o.length===0){this.log("No control selectors for audience-filtered price test '%s'",s.id);continue}const n=new URL(window.location.href);o.some(c=>{try{return new RegExp(se(c)).test(K(n.toString()))}catch{return!1}})&&(this.log("Applying control selectors for audience-filtered price test '%s'",s.id),U(document,{testId:s.id,hypothesisId:r.id,selectors:o},()=>{}),this.updatePriceTestHiddenInputs(s.id,"control",!1))}}}pickHypothesis(e){let t=Math.random();const i=e.hypotheses.reduce((r,o)=>r+o.visitorCount,0);return e.hypotheses.sort((r,o)=>r.isControl?o.isControl?0:-1:o.isControl?1:0).reduce((r,o)=>{if(r!==null)return r;const l=e.hypotheses.reduce((c,d)=>c&&d.visitorCount>20,!0)?o.visitorCount/i-o.trafficPercentage:0;return t<=o.trafficPercentage-l?o:(t-=o.trafficPercentage-l,null)},null)}typeFromTemplate(){switch(template.type){case"list-collections":return"collectionList";case"page":return"landing";case"article":case"blog":case"cart":case"collection":case"index":case"product":case"search":return template.type;default:return null}}queueRedirect(e){this.saveState(),this.disableReferrerOverride||(this.log(`Saving temporary referrer override '${document.referrer}'`),this.state.temporary.originalReferrer=document.referrer,this.persistTemporaryState()),window.setTimeout(()=>window.location.assign(e),0),window.setTimeout(()=>{this.syncAllEvents()},2e3)}scheduleRetrySync(){this.clientIdRetryCount>=5||(this.clientIdRetryCount++,window.setTimeout(()=>{this.syncAllEvents()},500))}async syncAllEvents(){const e=async()=>
8{if(this.isSyncing){window.setTimeout(()=>{(async()=>await e())()},500);return}try{if(this.isSyncing=!0,this.syncGAEvents(),this.shopifyAnalyticsId||(this.shopifyAnalyticsId=this.getShopifyAnalyticsId()),!this.shopifyAnalyticsId){this.scheduleRetrySync();return}await this.syncEvents()}finally{this.isSyncing=!1}};await e()}async syncEvents(){if(!this.state.essential.consentApproved||!this.shopifyAnalyticsId||this.state.analytics.queue.length===0)return;const e=this.state.analytics.queue.length,t=this.state.analytics.queue.splice(0,e);this.log("Syncing %s events",e);try{const i={shop:this.shop,visitorDetails:{shopifyAnalyticsId:this.shopifyAnalyticsId,device:this.state.analytics.visitor?.device??this.device,country:this.state.analytics.visitor?.country??null,...this.state.essential.initialState},events:this.state.essential.visitorTests.filter(r=>!r.isInvalid&&!r.isSaved&&r.hypothesisId!=null).map(r=>new be(r.testId,r.hypothesisId,r.createdAt)).concat(t)};await this.sendEvents(i);for(const r of this.state.essential.visitorTests.filter(o=>!o.isInvalid&&!o.isSaved&&o.hypothesisId!=null))this.sendDiagnosticTelemetry("event-delivered",r.testId,{hypothesisId:r.hypothesisId,isControl:r.assignedTo==="control",testType:r.testType??"unknown"});const s=await this.getVisitor(this.shopifyAnalyticsId);s!==null&&this.updateLocalVisitor(s);for(const r of this.state.essential.visitorTests.filter(o=>!o.isInvalid&&!o.isSaved))r.isSaved=!0,r.savedAt=Date.now()}catch{this.state.analytics.queue.splice(0,0,...t)}finally{this.saveState()}}syncGAEvents(){if(!this.gaConfig.sendEvents){if(he)return;he=!0,this.log("UseGtag is false â skipping GA Events");return}if(this.isSyncingGA){this.log("Already syncing GA - skipping GA events");return}const e=this.state.essential.visitorTests.filter(t=>t.shouldSendToGa);e.length!==0&&(this.isSyncingGA=!0,this.log("Syncing %s GA Events",e.length),Promise.allSettled(e.map(t=>this.sendGAEvent(t))).then(()=>this.log("All gtag events sent")).finally(()=>this.isSyncingGA=!1))}sendGAEvent(e){return new Promise(t=>{this.log("Sending GA Event for test %s, hypothesis %s",e.testId,e.hypothesisId);const i=()=>{this.log("GA acknowledged event for hypothesis %s",e.hypothesisId),e.shouldSendToGa=!1,this.persistEssentialState(),t()},s={exp_variant_string:`SL-${e.testId}-${e.hypothesisId}`};
8this.shopliftDebug&&Object.assign(s,{debug_mode:!0});function r(o,n,l){window.dataLayer=window.dataLayer||[],window.dataLayer.push(arguments)}this.gaConfig.mode==="gtag"?r("event","experience_impression",{...s,event_callback:i}):(window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:"experience_impression",...s,eventCallback:i}))})}updateLocalVisitor(e){let t;({visitorTests:t,...this.state.analytics.visitor}=e),this.log("updateLocalVisitor - server returned %d tests: %o",t.length,t.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isInvalid:s.isInvalid}))),this.log("updateLocalVisitor - local has %d tests: %o",this.state.essential.visitorTests.length,this.state.essential.visitorTests.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isSaved:s.isSaved,isInvalid:s.isInvalid})));const i=300*1e3;for(const s of this.state.essential.visitorTests.filter(r=>r.isSaved&&(!r.savedAt||Date.now()-r.savedAt>i)&&!t.some(o=>o.testId===r.testId)))this.log("updateLocalVisitor - marking LOCAL test as INVALID (isSaved && not in server): testId=%s, hypothesisId=%s",s.testId,s.hypothesisId),s.isInvalid=!0;for(const s of t){const r=this.state.essential.visitorTests.findIndex(n=>n.testId===s.testId);if(!(r!==-1))this.log("updateLocalVisitor - ADDING server test (not found locally): testId=%s, hypothesisId=%s",s.testId,s.hypothesisId),this.state.essential.visitorTests.push(s);else{const n=this.state.essential.visitorTests.at(r);this.log("updateLocalVisitor - REPLACING local test with server test: testId=%s, local hypothesisId=%s -> server hypothesisId=%s, local isInvalid=%s -> false",s.testId,n?.hypothesisId,s.hypothesisId,n?.isInvalid),s.isInvalid=!1,s.shouldSendToGa=n?.shouldSe
8ndToGa??!1,s.testType=n?.testType,s.assignedTo=n?.assignedTo,s.testTitle=n?.testTitle,this.state.essential.visitorTests.splice(r,1,s)}}this.log("updateLocalVisitor - FINAL local tests: %o",this.state.essential.visitorTests.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isSaved:s.isSaved,isInvalid:s.isInvalid}))),this.state.analytics.visitor.storedAt=new Date}async getVisitor(e){try{return await this.makeJsonRequest({method:"get",url:`${this.eventHost}/api/v0/visitors/by-key/${this.shop}/${e}`})}catch{return null}}async sendEvents(e){await this.makeRequest({method:"post",url:`${this.eventHost}/api/v0/events`,data:JSON.stringify(e)})}sendDiagnosticTelemetry(e,t,i){if(!this.telemetryEnabled||!navigator.sendBeacon)return;const s=this.state.essential.consentApproved,r=JSON.stringify({shop:this.shop,testId:t,checkpoint:e,device:this.device,...s?{visitorId:this.shopifyAnalyticsId??"unknown"}:{},clientTimestamp:Date.now(),consentApproved:s,hasConsentInteraction:this.state.essential.hasConsentInteraction,...i});navigator.sendBeacon(`${this.eventHost}/api/v0/telemetry`,new Blob([r],{type:"text/plain"}))}getUTMValue(e){const i=decodeURIComponent(window.location.search.substring(1)).split("&");for(let s=0;s<i.length;s++){const r=i[s].split("=");if(r[0]===e)return r[1]||null}return null}hidePage(e){this.log("Hiding page"),this.cssHideClass&&!window.document.documentElement.classList.contains(this.cssHideClass)&&(window.document.documentElement.classList.add(this.cssHideClass),e||setTimeout(this.removeAsyncHide(this.cssHideClass),2e3))}showPage(){this.cssHideClass&&this.removeAsyncHide(this.cssHideClass)()}getDeviceType(){function e(){let i=!1;return(function(s){(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(s)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(s.substr(0,4)))&&(i=!0)})(navigator.userAgent||navigator.vendor),i}function t(){let i=!1;return(function(s){(/android|ipad|playbook|silk/i.test(s)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|
8sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(s.substr(0,4)))&&(i=!0)})(navigator.userAgent||navigator.vendor),i}return e()?"mobile":t()?"tablet":"desktop"}removeAsyncHide(e){return()=>{e&&window.document.documentElement.classList.remove(e)}}async getCartState(){try{let e=await this.makeJsonRequest({method:"get",url:`${window.location.origin}/cart.js`});return e===null||(e.note===null&&(e=await this.makeJsonRequest({method:"post",url:`${window.location.origin}/cart/update.js`,data:JSON.stringify({note:""})})),e==null)?null:{token:e.token,total_price:e.total_price,total_discount:e.total_discount,currency:e.currency,items_subtotal_price:e.items_subtotal_price,items:e.items.map(t=>({quantity:t.quantity,variant_id:t.variant_id,key:t.key,price:t.price,final_line_price:t.final_line_price,sku:t.sku,product_id:t.product_id}))}}catch(e){return this.log("Error sending cart info",e),null}}ensureCartAttributesForExistingPriceTests(e){try{if(this.log("Checking visitor assignments for active price tests"),e&&this.state.temporary.previewConfig){const t=this.state.temporary.previewConfig;this.log("Using preview config for merchant:",t.testId);let i="variant";if(t.variants&&t.variants.length>0){const s=t.variants.find(r=>r.id===t.currentVariant);s&&s.isControl&&(i="control")}this.log("Merchant preview - updating hidden inputs:",t.testId,i),this.updatePriceTestHiddenInputs(t.testId,i,!0);return}for(const t of this.state.essential.visitorTests){const i=this.testConfigs.find(o=>o.id===t.testId);if(!i){this.log("Test config not found:",t.testId);continue}const s=i.hypotheses.find(o=>o.id===t.hypothesisId);if(!s||s.type!=="price")continue;const r=s.isControl?"control":"variant";this.log("Updating hidden inputs for price test:",t.testId,r),this.updatePriceTestHiddenInputs(t.testId,r,e)}}catch(t){this.log("Error ensuring cart attributes for existing price tests:",t)}}subscriptionSwapDone=!1;subscriptionHideWrongPlans=null;subscriptionPriceDone=!1;subscriptionUpdateOneTime=null;subscriptionOneTimeDone=!1;swapMap=null;slptValue=null;async subscriptionSwap(){await Ue(this)}async subscriptionPriceChange(){await ze(this)}async subscriptionOneTimePrice(){await We(this)}updatePriceTestHiddenInputs(e,t,i){try{this.cleanupPriceTestObservers();const s=`${e}:${t}:${i?"t":"f"}`,r=T=>{const m=T.getAttribute("data-sl-pid");if(!m)return!0;if(i&&this.state.temporary.previewConfig){const w=this.state.temporary.previewConfig,I=t==="control"?"a":"b",f=w.variants.find(v=>v.label===I);if(!f)return!1;for(const v of f.domSelectors||[]){const g=v.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);if(g){const P=g[1];if(this.log(`Extracted ID from selector: ${P}, comparing to: ${m}`),P===m)return this.log("Product ID match found in preview config:",m,"variant:",f.label),!0}else this.log(`Could not extract ID from selector: ${v.cssSelector}`)}return this.log("No product ID match in preview config for:",m,"variant:",I),!1}const y=this.testConfigs.find(w=>w.id===e);if(!y)return this.log("Test config not found for testId:",e),!1;for(const w of y.hypotheses||[]){for(const I of w.domSelectors||[]){const f=I.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);if(f&&f[1]===m)return this.log("Product ID match found in domSelectors:",m,"for test:",e),!0}if(w.priceData?.variants){for(const I of w.priceData.variants)if(I[0]===m)return this.log("Product ID match found in priceData:",m,"for test:",e),!0}}return this.log("No product ID match for:",m,"in test:",e),!1},o=new Set;let n=!1,l=null;const c=(T,m)=>{if(document.querySelectorAll("[data-sl-attribute-p]").forEach(w=>{if(w instanceof Element&&w.nodeType===Node.ELEMENT_NODE&&w.isConnected&&document.contains(w))try{T.observe(w,{childList:!0,subtree:!0,characterData:!0,characterDataOldValue:!0,attributes:!1})}catch(I){this.log(`Failed to observe element (${m}):`,I)}}),document.body&&document.body.isConnected)try{T.observe(document.body,{childList:!0,subtree:!0,characterData:!0,characterDataOldValue:!0,attributes:!1})}catch(w){this.log(`Failed to observe document.body (${m}):`,w)}},d=(T,m,y,w)=>{const I=T.filter(f=>{const v=f.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);return v&&v[1]===w});this.log(`Applying ${y} DOM selectors, total: ${T.length}, filtered: ${I.length}`),I.length>0&&U(document,{testId:e,hypothesisId:m,selectors:I})},u=(T,m)=>{this.log(`Applying DOM selector changes for product ID: ${T}`),m.disconnect(),n=!0;try{if(i&&this.state.temporary.previewConfig){const y=t==="control"?"a":"b",w=this.state.temporary.previewConfig.variants.find(I=>I.label===y);if(!w?.domSelectors){this.log(`No DOM selectors found for preview variant: ${y}`);return}d(w.domSelectors,w.id,"preview config",T)}else{const y=this.testConfigs.find(I=>I.id===e);if(!y){this.log(`No test config found for testId: ${e}`);return}const w=y.hypotheses.find(I=>t==="control"?I.isControl:!I.isControl);if(!w?.domSelectors){this.log(`No DOM selectors found for assignment: ${t}`);return}d(w.domSelectors,w.id,"live config",T)}}finally{l!==null&&clearTimeout(l),l=window.setTimeout(()=>{n=!1,l=null,c(m,"reconnection"),this.log("Re-established innerHTML observer after DOM changes")}
8,50)}},h=new MutationObserver(T=>{if(!n)for(const m of T){if(m.type!=="childList"&&m.type!=="characterData")continue;let y=m.target;m.type==="characterData"&&(y=m.target.parentElement||m.target.parentNode);let w=y,I=w.getAttribute("data-sl-attribute-p");for(;!I&&w.parentElement;)w=w.parentElement,I=w.getAttribute("data-sl-attribute-p");if(!I)continue;const f=w.innerHTML||w.textContent||"";let v="";m.type==="characterData"&&m.oldValue!==null&&(v=m.oldValue),this.log(`innerHTML changed on element with data-sl-attribute-p="${I}"`),v&&this.log(`Previous content: "${v}"`),this.log(`Current content: "${f}"`),u(I,h)}});c(h,"initial setup"),o.add(h);const p=new MutationObserver(T=>{T.forEach(m=>{m.addedNodes.forEach(y=>{if(y.nodeType===Node.ELEMENT_NODE){const w=y;E(w);const I=w.matches('input[name="properties[_slpt]"]')?[w]:w.querySelectorAll('input[name="properties[_slpt]"]');I.length>0&&this.log(`MutationObserver found ${I.length} new hidden input(s)`),I.forEach(f=>{const v=f.getAttribute("data-sl-pid");if(this.log(`MutationObserver checking new input with data-sl-pid="${v}"`),r(f))f.value!==s&&(f.value=s,this.log("Updated newly added hidden input:",s)),S(f);else{const g=f.getAttribute("data-sl-pid");g&&this.isProductInAnyPriceTest(g)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",g):(f.remove(),this.log("Removed newly added non-matching hidden input for product ID:",g))}})}})})});o.add(p);const b=new MutationObserver(T=>{T.forEach(m=>{if(m.type==="attributes"&&m.attributeName==="data-sl-pid"){const y=m.target;if(this.log("AttributeObserver detected data-sl-pid attribute change on:",y.tagName),y.matches('input[name="properties[_slpt]"]')){const w=y,I=m.oldValue,f=w.getAttribute("data-sl-pid");this.log(`data-sl-pid changed from "${I}" to "${f}" - triggering payment placement updates`),r(w)?(w.value!==s&&(w.value=s,this.log("Updated hidden input after data-sl-pid change:",s)),f&&u(f,h),this.log("Re-running payment placement updates after variant change"),E(document.body)):f&&this.isProductInAnyPriceTest(f)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",f):(w.remove(),this.log("Removed non-matching hidden input after data-sl-pid change:",f))}}})});o.add(b);const E=T=>{T.tagName==="SHOPIFY-PAYMENT-TERMS"&&(this.log("MutationObserver found new shopify-payment-terms element"),this.updateShopifyPaymentTerms(e,t));const m=T.querySelectorAll("shopify-payment-terms");m.length>0&&(this.log(`MutationObserver found ${m.length} shopify-payment-terms in added node`),this.updateShopifyPaymentTerms(e,t)),T.tagName==="AFTERPAY-PLACEMENT"&&(this.log("MutationObserver found new afterpay-placement element"),this.updateAfterpayPlacements(e,t,"afterpay"));const y=T.querySelectorAll("afterpay-placement");y.length>0&&(this.log(`MutationObserver found ${y.length} afterpay-placement in added node`),this.updateAfterpayPlacements(e,t,"afterpay")),T.tagName==="SQUARE-PLACEMENT"&&(this.log("MutationObserver found new square-placement element"),this.updateAfterpayPlacements(e,t,"square"));const w=T.querySelectorAll("square-placement");w.length>0&&(this.log(`MutationObserver found ${w.length} square-placement in added node`),this.updateAfterpayPlacements(e,t,"square")),T.tagName==="KLARNA-PLACEMENT"&&(this.log("MutationObserver found new klarna-placement element"),this.updateKlarnaPlacements(e,t));const I=T.querySelectorAll("klarna-placement");I.length>0&&(this.log(`MutationObserver found ${I.length} klarna-placement in added node`),this.updateKlarnaPlacements(e,t))},S=T=>{b.observe(T,{attributes:!0,attributeFilter:["data-sl-pid"],attributeOldValue:!0,subtree:!1});const m=T.getAttribute("data-sl-pid");this.log(`Started AttributeObserver on specific input with data-sl-pid="${m}"`)},C=()=>{const T=document.querySelectorAll('input[name="properties[_slpt]"]');this.log(`Found ${T.length} existing hidden inputs to check`),T.forEach(m=>{const y=m.getAttribute("data-sl-pid");this.log(`Checking existing input with data-sl-pid="${y}"`),r(m)?(m.value=s,this.log("Updated existing hidden input:",s),y&&(this.log("Applying initial DOM selector changes for existing product"),u(y,h)),S(m)):y&&this.isProductInAnyPriceTest(y)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",
8y):(m.remove(),this.log("Removed non-matching hidden input for product ID:",y))})},_=()=>{document.body?(p.observe(document.body,{childList:!0,subtree:!0}),this.log("Started MutationObserver on document.body"),C(),E(document.body)):document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{document.body&&(p.observe(document.body,{childList:!0,subtree:!0}),this.log("Started MutationObserver after DOMContentLoaded"),C(),E(document.body))}):(this.log("Set timeout on observer"),setTimeout(_,10))};_(),window.__shopliftPriceTestObservers=o,window.__shopliftPriceTestValue=s,this.log("Set up DOM observer for price test hidden inputs")}catch(s){this.log("Error updating price test hidden inputs:",s)}}updateKlarnaPlacements(e,t){this.updatePlacementElements(e,t,"klarna-placement",(i,s)=>{i.setAttribute("data-purchase-amount",s.toString())})}cleanupPriceTestObservers(){const e=window.__shopliftPriceTestObservers;e&&(e.forEach(t=>{t.disconnect()}),e.clear(),this.log("Cleaned up existing price test observers")),delete window.__shopliftPriceTestObservers,delete window.__shopliftPriceTestValue}updateAfterpayPlacements(e,t,i="afterpay"){const s=i==="square"?"square-placement":"afterpay-placement";if(document.querySelectorAll(s).length===0){this.log(`No ${s} elements found on page - early return`);return}this.updatePlacementElements(e,t,s,(o,n)=>{if(i==="afterpay"){const l=(n/100).toFixed(2);o.setAttribute("data-amount",l)}else o.setAttribute("data-amount",n.toString())}),this.log("updateAfterpayPlacements completed")}updatePlacementElements(e,t,i,s){const r=document.querySelectorAll(i);if(r.length===0){this.log(`No ${i} elements found - early return`);return}let o;if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const l=t==="control"?"a":"b",c=this.state.temporary.previewConfig.variants.find(d=>d.label===l);if(!c?.domSelectors){this.log(`No variant found for label ${l} in preview config for ${i}`);return}o=c.domSelectors,this.log(`Using preview config for ${i} in merchant mode, variant: ${l}`)}else{const l=this.testConfigs.find(d=>d.id===e);if(!l){this.log(`No testConfig found for id: ${e} - early return`);return}
8const c=l.hypotheses.find(d=>t==="control"?d.isControl:!d.isControl);if(!c?.domSelectors){this.log(`No hypothesis or domSelectors found for assignment: ${t} - early return`);return}o=c.domSelectors}const n=new RegExp(`${this.DATA_SL_ATTRIBUTE_P}=["'](\\d+)["']`);r.forEach(l=>{let c=null;const d=l.parentElement;if(d&&(c=d.querySelector('input[name="properties[_slpt]"]')),c||(c=l.querySelector('input[name="properties[_slpt]"]')),!c){this.log(`No hidden input found for ${i} element`);return}const u=c.getAttribute("data-sl-pid");if(!u){this.log("Hidden input has no data-sl-pid attribute - skipping");return}const h=o.find(S=>{const C=S.cssSelector.match(n);return C&&C[1]===u});if(!h){this.log(`No matching selector found for productId: ${u} - skipping element`);return}const p=h.actions.find(S=>S.scope==="price");if(!p?.value){this.log("No price action or value found - skipping element");return}const b=parseFloat(p.value.replace(/[^0-9.]/g,""));if(Number.isNaN(b)){this.log(`Invalid price "${p.value}" for product ${u} - skipping`);return}const E=Math.round(b*100);s(l,E)}),this.log(`updatePlacementElements completed for ${i}`)}updateShopifyPaymentTerms(e,t){const i=document.querySelectorAll("shopify-payment-terms");if(i.length===0)return;this.log("Store using shopify payments");let s;if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const o=t==="control"?"a":"b",n=this.state.temporary.previewConfig.variants.find(l=>l.label===o);if(!n||!n.domSelectors){this.log(`No variant found for label ${o} in preview config`);return}s=n.domSelectors,this.log(`Using preview config for shopify-payment-terms in merchant mode, variant: ${o}`)}else{const o=this.testConfigs.find(l=>l.id===e);if(!o)return;const n=o.hypotheses.find(l=>t==="control"?l.isControl===!0:l.isControl===!1);if(!n||!n.domSelectors)return;s=n.domSelectors}const r=new RegExp(`${this.DATA_SL_ATTRIBUTE_P}=["'](\\d+)["']`);i.forEach(o=>{const n=o.getAttribute("variant-id");if(!n)return;const l=s.find(c=>{const d=c.cssSelector.match(r);return d&&d[1]===n});if(l){const c=l.actions.find(d=>d.scope==="price");if(c&&c.value){const d=o.getAttribute("shopify-meta");if(d)try{const u=JSON.parse(d);if(u.variants&&Array.isArray(u.variants)){const h=u.variants.find(p=>p.id?.toString()===n);if(h){h.full_price=c.value;const p=parseFloat(c.value.replace(/[^0-9.]/g,""));if(h.number_of_payment_terms&&h.number_of_payment_terms>1){const b=p/h.number_of_payment_terms;h.price_per_term=`$${b.toFixed(2)}`}o.setAttribute("shopify-meta",JSON.stringify(u))}}}catch(u){this.log("Error parsing/updating shoplift-meta:",u)}}}})}async makeJsonRequest(e){const t=await this.makeRequest(e);return t===null?null:JSON.parse(await t.text(),F)}async makeRequest(e){const{url:t,method:i,headers:s,data:r,signal:o}=e,n=new Headers;if(s)for(const c in s)n.append(c,s[c]);(!s||!s.Accept)&&n.append("Accept","application/json"),(!s||!s["Content-Type"])&&n.append("Content-Type","application/json"),(this.eventHost.includes("ngrok.io")||this.eventHost.includes("ngrok-free.app"))&&n.append("ngrok-skip-browser-warning","1234");const l=await this.fetch(t,{method:i,headers:n,body:r,signal:o});if(!l.ok){if(l.status===204)return null;if(l.status===422){const c=await l.json();if(typeof c<"u"&&c.isBot)throw new ie}throw new Error(`Error sending shoplift request ${l.status}`)}return l}queueAddVisitorToTest(e,t){if(this.state.essential.visitorTests.some(s=>s.testId===e))return;const i=this.testConfigs.find(s=>s.id===e);if(this.state.essential.visitorTests.push({createdAt:new Date,testId:e,hypothesisId:t.id,isThemeTest:t.type==="theme",themeId:t.themeId,isSaved:!1,isInvalid:!1,shouldSendToGa:!0,testType:t.type,assignedTo:t.isControl?"control":"variant",testTitle:i?.title}),t.type==="price"){const s=t.isControl?"control":"variant";this.log("Price test assignment detected, updating cart attributes:",e,s),this.updatePriceTestHiddenInputs(e,s,!1)}}queueCartUpdate(e){this.queueEvent(new Ce(e))}queuePageView(e){this.queueEvent(new Se(e))}queueEvent(e){!this.state.essential.consentApproved&&this.state.essential.hasConsentInteraction||this.state.analytics.queue.length>10||this.state.analytics.queue.push(e)}legacyGetLocalStorageVisitor(){const e=this.localStorageGet(this.legacySessionKey);if(e)try{return JSON.parse(e,F)}catch{}return null}pruneStaleVisitorTests(){this.state.essential.visitorTests=this.state.essential.visitorTests.filter(e=>this.testConfigs.some(t=>t.id==e.testId)||this.inactiveTestConfigs.filter(t=>this.testIsPaused(t)).some(t=>t.id===e.testId))}pruneStateAndSave(){this.pruneStaleVisitorTests(),this.saveState()}saveState(){this.persistEssentialState(),this.persistAnalyticsState()}loadState(){const e=this.loadAnalyticsState(),t={analytics:e,essential:this.loadEssentialState(e),temporary:this.loadTemporaryState()},i=this.legacyGetLocalStorageVisitor(),s=this.legacyGetCookieVisitor(),r=[i,s].filter(o=>o!==null).sort((o,n)=>+n.storedAt-+o.storedAt)[0];return t.analytics.visitor===null&&r&&({visitorTests:t.essential.visitorTests,...t.analytics.visitor}=r,t.essential.isFirstLoad=!1,t.essential.initialState={createdAt:r.createdAt,referrer:r.referrer,utmCampaign:r.utmCampaign,utmContent:r.utmContent,utmMedium:r.utmMedium,utmSource:r.utmSource,device:r.device},this.deleteCookie("SHOPLIFT"),this.deleteLocalStorage(this.legacySessionKey)),!t.essential.consentApproved&&t.essential.hasConsentInteraction&&this.deleteLocalStorage(this.analyticsSessionKey),t}loadEssentialState(e){const t=this.loadLocalStorage(this.essentialSessionKey),i=this.loadCookie(this.essentialSessionKey),s=this.getInitialState();e.visitor?.device&&(s.device=e.visitor.device);const r={timestamp:new Date,consentApproved:!1,hasConsentInteraction:!1,debugMode:!1,initialState:s,visitorTests:[],isFirstLoad:!0},o=[t,i].filter(n=>n!==null).sort((n,l)=>+l.timestamp-+n.timestamp)[0]??r;return o.initialState||(e.visitor!==null?o.initialState=e.visitor:(o.initialState=s,o.initialState.createdAt=o.timestamp)),o}loadAnalyticsState(){const e=this.loadLocalStorage(this.analyticsSessionKey),t=this.loadCookie(this.analyticsSessionKey),i={timestamp:new Date,visitor:null,queue:[]},s=[e,t].filter(r=>r!==null).sort((r,o)=>+o.timestamp-+r.timestamp)[0]??i;return s.queue.length===0&&e&&e.queue.length>1&&(s.queue=e.queue),s}loadTemporaryState(){const e=this.sessionStorageGet(this.temporarySessionKey),t=e?JSON.parse(e,F):null,i=this.loadCookie(this.temporarySessionKey);return t??i??{isMerchant:!1,timestamp:new Date}}persistEssentialState(){this.log("Persisting essential state"),this.state.essential.isFirstLoad=!1,this.state.essential.timestamp=new Date,this.persistLocalStorageState(this.essentialSessionKey,this.state.essential),this.persist
8CookieState(this.essentialSessionKey,this.state.essential)}persistAnalyticsState(){this.log("Persisting analytics state"),this.state.essential.consentApproved&&(this.state.analytics.timestamp=new Date,this.persistLocalStorageState(this.analyticsSessionKey,this.state.analytics),this.persistCookieState(this.analyticsSessionKey,{...this.state.analytics,queue:[]}))}persistTemporaryState(){this.log("Setting temporary session state"),this.state.temporary.timestamp=new Date,this.sessionStorageSet(this.temporarySessionKey,JSON.stringify(this.state.temporary)),this.persistCookieState(this.temporarySessionKey,this.state.temporary,!0)}loadLocalStorage(e){const t=this.localStorageGet(e);if(t===null)return null;try{return JSON.parse(t,F)}catch{return null}}loadCookie(e){const t=this.getCookie(e);if(t===null)return null;try{return JSON.parse(t,F)}catch{return null}}persistLocalStorageState(e,t){this.localStorageSet(e,JSON.stringify(t))}persistCookieState(e,t,i=!1){const s=JSON.stringify(t),r=i?"":`expires=${new Date(new Date().getTime()+864e5*365).toUTCString()};`;document.cookie=`${e}=${s};domain=.${window.location.hostname};path=/;SameSite=Strict;${r}`}deleteCookie(e){const t=new Date(0).toUTCString();document.cookie=`${e}=;domain=.${window.location.hostname};path=/;expires=${t};`}deleteLocalStorage(e){window.localStorage.removeItem(e)}getChannel(e){return[{"name":"cross-network","test":(v) => new RegExp(".*cross-network.*", "i").test(v.utmCampaign)},{"name":"direct","test":(v) => v.utmSource === "" && v.utmMedium === ""},{"name":"paid-shopping","test":(v) => (new RegExp("^(?:Google|IGShopping|aax-us-east\.amazon-adsystem\.com|aax\.amazon-adsystem\.com|alibaba|alibaba\.com|amazon|amazon\.co\.uk|amazon\.com|apps\.shopify\.com|checkout\.shopify\.com|checkout\.stripe\.com|cr\.shopping\.naver\.com|cr2\.shopping\.naver\.com|ebay|ebay\.co\.uk|ebay\.com|ebay\.com\.au|ebay\.de|etsy|etsy\.com|m\.alibaba\.com|m\.shopping\.naver\.com|mercadolibre|mercadolibre\.com|mercadolibre\.com\.ar|mercadolibre\.com\.mx|message\.alibaba\.com|msearch\.shopping\.naver\.com|nl\.shopping\.net|no\.shopping\.net|offer\.alibaba\.com|one\.walmart\.com|order\.shopping\.yahoo\.co\.jp|partners\.shopify\.com|s3\.amazonaws\.com|se\.shopping\.net|shop\.app|shopify|shopify\.com|shopping\.naver\.com|shopping\.yahoo\.co\.jp|shopping\.yahoo\.com|shopzilla|shopzilla\.com|simplycodes\.com|store\.shopping\.yahoo\.co\.jp|stripe|stripe\.com|uk\.shopping\.net|walmart|walmart\.com)$", "i").test(v.utmSource) || new RegExp("^(.*(([^a-df-z]|^)shop|shopping).*)$", "i").test(v.utmCampaign)) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-search","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|y
8andex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-social","test":(v) => new RegExp("^(?:43things|43things\.com|51\.com|5ch\.net|Hatena|ImageShack|academia\.edu|activerain|activerain\.com|activeworlds|activeworlds\.com|addthis|addthis\.com|airg\.ca|allnurses\.com|allrecipes\.com|alumniclass|alumniclass\.com|ameba\.jp|ameblo\.jp|americantowns|americantowns\.com|amp\.reddit\.com|ancestry\.com|anobii|anobii\.com|answerbag|answerbag\.com|answers\.yahoo\.com|aolanswers|aolanswers\.com|apps\.facebook\.com|ar\.pinterest\.com|artstation\.com|askubuntu|askubuntu\.com|asmallworld\.com|athlinks|athlinks\.com|away\.vk\.com|awe\.sm|b\.hatena\.ne\.jp|baby-gaga|baby-gaga\.com|babyblog\.ru|badoo|badoo\.com|bebo|bebo\.com|beforeitsnews|beforeitsnews\.com|bharatstudent|bharatstudent\.com|biip\.no|biswap\.org|bit\.ly|blackcareernetwork\.com|blackplanet|blackplanet\.com|blip\.fm|blog\.com|blog\.feedspot\.com|blog\.goo\.ne\.jp|blog\.naver\.com|blog\.yahoo\.co\.jp|blogg\.no|bloggang\.com|blogger|blogger\.com|blogher|blogher\.com|bloglines|bloglines\.com|blogs\.com|blogsome|blogsome\.com|blogspot|blogspot\.com|blogster|blogster\.com|blurtit|blurtit\.com|bookmarks\.yahoo\.co\.jp|bookmarks\.yahoo\.com|br\.pinterest\.com|brightkite|brightkite\.com|brizzly|brizzly\.com|business\.facebook\.com|buzzfeed|buzzfeed\.com|buzznet|buzznet\.com|cafe\.naver\.com|cafemom|cafemom\.com|camospace|camospace\.com|canalblog\.com|care\.com|care2|care2\.com|caringbridge\.org|catster|catster\.com|cbnt\.io|cellufun|cellufun\.com|centerblog\.net|chat\.zalo\.me|chegg\.com|chicagonow|chicagonow\.com|chiebukuro\.yahoo\.co\.jp|classmates|classmates\.com|classquest|classquest\.com|co\.pinterest\.com|cocolog-nifty|cocolog-nifty\.com|copainsdavant\.linternaute\.com|couchsurfing\.org|cozycot|cozycot\.com|cross\.tv|crunchyroll|crunchyroll\.com|cyworld|cyworld\.com|cz\.pinterest\.com|d\.hatena\.ne\.jp|dailystrength\.org|deluxe\.com|deviantart|deviantart\.com|dianping|dianping\.com|digg|digg\.com|diigo|diigo\.com|discover\.hubpages\.com|disqus|disqus\.com|dogster|dogster\.com|dol2day|dol2day\.com|doostang|doostang\.com|dopplr|dopplr\.com|douban|douban\.com|draft\.blogger\.com|draugiem\.lv|drugs-forum|drugs-forum\.com|dzone|dzone\.com|edublogs\.org|elftown|elftown\.com|epicurious\.com|everforo\.com|exblog\.jp|extole|extole\.com|facebook|facebook\.com|faceparty|faceparty\.com|fandom\.com|fanpop|fanpop\.com|fark|fark\.com|fb|fb\.me|fc2|fc2\.com|feedspot|feministing|feministing\.com|filmaffinity|filmaffinity\.com|flickr|flickr\.com|flipboard|flipboard\.com|folkdirect|folkdirect\.com|foodservice|foodservice\.com|forums\.androidcentral\.com|forums\.crackberry\.com|forums\.imore\.com|forums\.nexopia\.com|forums\.webosnation\.com|forums\.wpcentral\.com|fotki|fotki\.com|fotolog|fotolog\.com|foursquare|foursquare\.com|free\.facebook\.com|friendfeed|friendfeed\.com|fruehstueckstreff\.org|fubar|fubar\.com|gaiaonline|gaiaonline\.com|gamerdna|gamerdna\.com|gather\.com|geni\.com|getpocket\.com|glassboard|glassboard\.com|glassdoor|glassdoor\.com|godtube|godtube\.com|goldenline\.pl|goldstar|goldstar\.com|goo\.gl|gooblog|goodreads|goodreads\.com|google\+|googlegroups\.com|googleplus|govloop|govloop\.com|gowalla|gowalla\.com|gree\.jp|groups\.google\.com|gulli\.com|gutefrage\.net|habbo|habbo\.com|hi5|hi5\.com|hootsuite|hootsuite\.com|houzz|houzz\.com|hoverspot|hoverspot\.com|hr\.com|hu\.pinterest\.com|hubculture|hubculture\.com|hubpages\.com|hyves\.net|hyves\.nl|ibibo|ibibo\.com|id\.pinterest\.com|identi\.ca|ig|imageshack\.com|imageshack\.us|imvu|imvu\.com|in\.pinterest\.com|insanejournal|insanejournal\.com|instagram|instagram\.com|instapaper|instapaper\.com|internations\.org|interpals\.net|intherooms|intherooms\.com|irc-galleria\.net|is\.gd|italki|italki\.com|jammerdirect|jammerdirect\.com|jappy\.com|jappy\.de|kaboodle\.com|kakao|kakao\.com|kakaocorp\.com|kaneva|kaneva\.com|kin\.naver\.com|l\.facebook\.com|l\.instagram\.com|l\.messenger\.com|last\.fm|librarything|librarything\.com|lifestream\.aol\.com|line|line\.me|linkedin|linkedin\.com|listal|listal\.com|listography|listography\.com|livedoor\.com|livedoorblog|livejournal|livejournal\.com|lm\.facebook\.com|lnkd\.in|m\.blog\.naver\.com|m\.cafe\.naver\.com|m\.facebook\.com|m\.kin\.naver\.com|m\.vk\.com|m\.yelp\.com|mbga\.jp|medium\.com|meetin\.org|meetup|meetup\.com|meinvz\.net|meneame\.net|menuism\.com|messages\.google\.com|messages\.yahoo\.co\.jp|messenger|messenger\.com|mix\.com|mixi\.jp|mobile\.facebook\.com|mocospace|mocospace\.com|mouthshut|mouthshut\.com|movabletype|movabletype\.com|mubi|mubi\.com|my\.o
8pera\.com|myanimelist\.net|myheritage|myheritage\.com|mylife|mylife\.com|mymodernmet|mymodernmet\.com|myspace|myspace\.com|netvibes|netvibes\.com|news\.ycombinator\.com|newsshowcase|nexopia|ngopost\.org|niconico|nicovideo\.jp|nightlifelink|nightlifelink\.com|ning|ning\.com|nl\.pinterest\.com|odnoklassniki\.ru|odnoklassniki\.ua|okwave\.jp|old\.reddit\.com|oneworldgroup\.org|onstartups|onstartups\.com|opendiary|opendiary\.com|oshiete\.goo\.ne\.jp|out\.reddit\.com|over-blog\.com|overblog\.com|paper\.li|partyflock\.nl|photobucket|photobucket\.com|pinboard|pinboard\.in|pingsta|pingsta\.com|pinterest|pinterest\.at|pinterest\.ca|pinterest\.ch|pinterest\.cl|pinterest\.co\.kr|pinterest\.co\.uk|pinterest\.com|pinterest\.com\.au|pinterest\.com\.mx|pinterest\.de|pinterest\.es|pinterest\.fr|pinterest\.it|pinterest\.jp|pinterest\.nz|pinterest\.ph|pinterest\.pt|pinterest\.ru|pinterest\.se|pixiv\.net|pl\.pinterest\.com|playahead\.se|plurk|plurk\.com|plus\.google\.com|plus\.url\.google\.com|pocket\.co|posterous|posterous\.com|pro\.homeadvisor\.com|pulse\.yahoo\.com|qapacity|qapacity\.com|quechup|quechup\.com|quora|quora\.com|qzone\.qq\.com|ravelry|ravelry\.com|reddit|reddit\.com|redux|redux\.com|renren|renren\.com|researchgate\.net|reunion|reunion\.com|reverbnation|reverbnation\.com|rtl\.de|ryze|ryze\.com|salespider|salespider\.com|scoop\.it|screenrant|screenrant\.com|scribd|scribd\.com|scvngr|scvngr\.com|secondlife|secondlife\.com|serverfault|serverfault\.com|shareit|sharethis|sharethis\.com|shvoong\.com|sites\.google\.com|skype|skyrock|skyrock\.com|slashdot\.org|slideshare\.net|smartnews\.com|snapchat|snapchat\.com|social|sociallife\.com\.br|socialvibe|socialvibe\.com|spaces\.live\.com|spoke|spoke\.com|spruz|spruz\.com|ssense\.com|stackapps|stackapps\.com|stackexchange|stackexchange\.com|stackoverflow|stackoverflow\.com|stardoll\.com|stickam|stickam\.com|studivz\.net|suomi24\.fi|superuser|superuser\.com|sweeva|sweeva\.com|t\.co|t\.me|tagged|tagged\.com|taggedmail|taggedmail\.com|talkbiznow|talkbiznow\.com|taringa\.net|techmeme|techmeme\.com|tencent|tencent\.com|tiktok|tiktok\.com|tinyurl|tinyurl\.com|toolbox|toolbox\.com|touch\.facebook\.com|tr\.pinterest\.com|travellerspoint|travellerspoint\.com|tripadvisor|tripadvisor\.com|trombi|trombi\.com|trustpilot|tudou|tudou\.com|tuenti|tuenti\.com|tumblr|tumblr\.com|tweetdeck|tweetdeck\.com|twitter|twitter\.com|twoo\.com|typepad|typepad\.com|unblog\.fr|urbanspoon\.com|ushareit\.com|ushi\.cn|vampirefreaks|vampirefreaks\.com|vampirerave|vampirerave\.com|vg\.no|video\.ibm\.com|vk\.com|vkontakte\.ru|wakoopa|wakoopa\.com|wattpad|wattpad\.com|web\.facebook\.com|web\.skype\.com|webshots|webshots\.com|wechat|wechat\.com|weebly|weebly\.com|weibo|weibo\.com|wer-weiss-was\.de|weread|weread\.com|whatsapp|whatsapp\.com|wiki\.answers\.com|wikihow\.com|wikitravel\.org|woot\.com|wordpress|wordpress\.com|wordpress\.org|xanga|xanga\.com|xing|xing\.com|yahoo-mbga\.jp|yammer|yammer\.com|yelp|yelp\.co\.uk|yelp\.com|youroom\.in|za\.pinterest\.com|zalo|zoo\.gr|zooppa|zooppa\.com)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-video","test":(v) => new RegExp("^(?:blog\.twitch\.tv|crackle|crackle\.com|curiositystream|curiositystream\.com|d\.tube|dailymotion|dailymotion\.com|dashboard\.twitch\.tv|disneyplus|disneyplus\.com|fast\.wistia\.net|help\.hulu\.com|help\.netflix\.com|hulu|hulu\.com|id\.twitch\.tv|iq\.com|iqiyi|iqiyi\.com|jobs\.netflix\.com|justin\.tv|m\.twitch\.tv|m\.youtube\.com|music\.youtube\.com|netflix|netflix\.com|player\.twitch\.tv|player\.vimeo\.com|ted|ted\.com|twitch|twitch\.tv|utreon|utreon\.com|veoh|veoh\.com|viadeo\.journaldunet\.com|vimeo|vimeo\.com|wistia|wistia\.com|youku|youku\.com|youtube|youtube\.com)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"display","test":(v) => new RegExp("^(?:display|banner|expandable|interstitial|cpm)$", "i").test(v.utmMedium)},{"name":"paid-other","test":(v) => new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)}
8,{"name":"organic-shopping","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) || new RegExp("^(.*(([^a-df-z]|^)shop|shopping).*)$", "i").test(v.utmCampaign)},{"name":"organic-social","test":(v) => new RegExp("^(?:43things|43things\.com|51\.com|5ch\.net|Hatena|ImageShack|academia\.edu|activerain|activerain\.com|activeworlds|activeworlds\.com|addthis|addthis\.com|airg\.ca|allnurses\.com|allrecipes\.com|alumniclass|alumniclass\.com|ameba\.jp|ameblo\.jp|americantowns|americantowns\.com|amp\.reddit\.com|ancestry\.com|anobii|anobii\.com|answerbag|answerbag\.com|answers\.yahoo\.com|aolanswers|aolanswers\.com|apps\.facebook\.com|ar\.pinterest\.com|artstation\.com|askubuntu|askubuntu\.com|asmallworld\.com|athlinks|athlinks\.com|away\.vk\.com|awe\.sm|b\.hatena\.ne\.jp|baby-gaga|baby-gaga\.com|babyblog\.ru|badoo|badoo\.com|bebo|bebo\.com|beforeitsnews|beforeitsnews\.com|bharatstudent|bharatstudent\.com|biip\.no|biswap\.org|bit\.ly|blackcareernetwork\.com|blackplanet|blackplanet\.com|blip\.fm|blog\.com|blog\.feedspot\.com|blog\.goo\.ne\.jp|blog\.naver\.com|blog\.yahoo\.co\.jp|blogg\.no|bloggang\.com|blogger|blogger\.com|blogher|blogher\.com|bloglines|bloglines\.com|blogs\.com|blogsome|blogsome\.com|blogspot|blogspot\.com|blogster|blogster\.com|blurtit|blurtit\.com|bookmarks\.yahoo\.co\.jp|bookmarks\.yahoo\.com|br\.pinterest\.com|brightkite|brightkite\.com|brizzly|brizzly\.com|business\.facebook\.com|buzzfeed|buzzfeed\.com|buzznet|buzznet\.com|cafe\.naver\.com|cafemom|cafemom\.com|camospace|camospace\.com|canalblog\.com|care\.com|care2|care2\.com|caringbridge\.org|catster|catster\.com|cbnt\.io|cellufun|cellufun\.com|centerblog\.net|chat\.zalo\.me|chegg\.com|chicagonow|chicagonow\.com|chiebukuro\.yahoo\.co\.jp|classmates|classmates\.com|classquest|classquest\.com|co\.pinterest\.com|cocolog-nifty|cocolog-nifty\.com|copainsdavant\.linternaute\.com|couchsurfing\.org|cozycot|cozycot\.com|cross\.tv|crunchyroll|crunchyroll\.com|cyworld|cyworld\.com|cz\.pinterest\.com|d\.hatena\.ne\.jp|dailystrength\.org|deluxe\.com|deviantart|deviantart\.com|dianping|dianping\.com|digg|digg\.com|diigo|diigo\.com|discover\.hubpages\.com|disqus|disqus\.com|dogster|dogster\.com|dol2day|dol2day\.com|doostang|doostang\.com|dopplr|dopplr\.com|douban|douban\.com|draft\.blogger\.com|draugiem\.lv|drugs-forum|drugs-forum\.com|dzone|dzone\.com|edublogs\.org|elftown|elftown\.com|epicurious\.com|everforo\.com|exblog\.jp|extole|extole\.com|facebook|facebook\.com|faceparty|faceparty\.com|fandom\.com|fanpop|fanpop\.com|fark|fark\.com|fb|fb\.me|fc2|fc2\.com|feedspot|feministing|feministing\.com|filmaffinity|filmaffinity\.com|flickr|flickr\.com|flipboard|flipboard\.com|folkdirect|folkdirect\.com|foodservice|foodservice\.com|forums\.androidcentral\.com|forums\.crackberry\.com|forums\.imore\.com|forums\.nexopia\.com|forums\.webosnation\.com|forums\.wpcentral\.com|fotki|fotki\.com|fotolog|fotolog\.com|foursquare|foursquare\.com|free\.facebook\.com|friendfeed|friendfeed\.com|fruehstueckstreff\.org|fubar|fubar\.com|gaiaonline|gaiaonline\.com|gamerdna|gamerdna\.com|gather\.com|geni\.com|getpocket\.com|glassboard|glassboard\.com|glassdoor|glassdoor\.com|godtube|godtube\.com|goldenline\.pl|goldstar|goldstar\.com|goo\.gl|gooblog|goodreads|goodreads\.com|google\+|googlegroups\.com|googleplus|govloop|govloop\.com|gowalla|gowalla\.com|gree\.jp|groups\.google\.com|gulli\.com|gutefrage\.net|habbo|habbo\.com|hi5|hi5\.com|hootsuite|hootsuite\.com|houzz|houzz\.com|hoverspot|hoverspot\.com|hr\.com|hu\.pinterest\.com|hubculture|hubculture\.com|hubpages\.com|hyves\.net|hyves\.nl|ibibo|ibibo\.com|id\.pinterest\.com|identi\.ca|ig|imageshack\.com|imageshack\.us|imvu|imvu\.com|in\.pinterest\.com|insanejournal|insanejournal\.com|instagram|instagram\.com|instapaper|instapaper\.com|internations\.org|interpals\.net|intherooms|intherooms\.com|irc-galleria\.net|is\.gd|italki|italki\.com|jammerdirect|jammerdirect\.com|jappy\.com|jappy\.de|kaboodle\.com|k
8akao|kakao\.com|kakaocorp\.com|kaneva|kaneva\.com|kin\.naver\.com|l\.facebook\.com|l\.instagram\.com|l\.messenger\.com|last\.fm|librarything|librarything\.com|lifestream\.aol\.com|line|line\.me|linkedin|linkedin\.com|listal|listal\.com|listography|listography\.com|livedoor\.com|livedoorblog|livejournal|livejournal\.com|lm\.facebook\.com|lnkd\.in|m\.blog\.naver\.com|m\.cafe\.naver\.com|m\.facebook\.com|m\.kin\.naver\.com|m\.vk\.com|m\.yelp\.com|mbga\.jp|medium\.com|meetin\.org|meetup|meetup\.com|meinvz\.net|meneame\.net|menuism\.com|messages\.google\.com|messages\.yahoo\.co\.jp|messenger|messenger\.com|mix\.com|mixi\.jp|mobile\.facebook\.com|mocospace|mocospace\.com|mouthshut|mouthshut\.com|movabletype|movabletype\.com|mubi|mubi\.com|my\.opera\.com|myanimelist\.net|myheritage|myheritage\.com|mylife|mylife\.com|mymodernmet|mymodernmet\.com|myspace|myspace\.com|netvibes|netvibes\.com|news\.ycombinator\.com|newsshowcase|nexopia|ngopost\.org|niconico|nicovideo\.jp|nightlifelink|nightlifelink\.com|ning|ning\.com|nl\.pinterest\.com|odnoklassniki\.ru|odnoklassniki\.ua|okwave\.jp|old\.reddit\.com|oneworldgroup\.org|onstartups|onstartups\.com|opendiary|opendiary\.com|oshiete\.goo\.ne\.jp|out\.reddit\.com|over-blog\.com|overblog\.com|paper\.li|partyflock\.nl|photobucket|photobucket\.com|pinboard|pinboard\.in|pingsta|pingsta\.com|pinterest|pinterest\.at|pinterest\.ca|pinterest\.ch|pinterest\.cl|pinterest\.co\.kr|pinterest\.co\.uk|pinterest\.com|pinterest\.com\.au|pinterest\.com\.mx|pinterest\.de|pinterest\.es|pinterest\.fr|pinterest\.it|pinterest\.jp|pinterest\.nz|pinterest\.ph|pinterest\.pt|pinterest\.ru|pinterest\.se|pixiv\.net|pl\.pinterest\.com|playahead\.se|plurk|plurk\.com|plus\.google\.com|plus\.url\.google\.com|pocket\.co|posterous|posterous\.com|pro\.homeadvisor\.com|pulse\.yahoo\.com|qapacity|qapacity\.com|quechup|quechup\.com|quora|quora\.com|qzone\.qq\.com|ravelry|ravelry\.com|reddit|reddit\.com|redux|redux\.com|renren|renren\.com|researchgate\.net|reunion|reunion\.com|reverbnation|reverbnation\.com|rtl\.de|ryze|ryze\.com|salespider|salespider\.com|scoop\.it|screenrant|screenrant\.com|scribd|scribd\.com|scvngr|scvngr\.com|secondlife|secondlife\.com|serverfault|serverfault\.com|shareit|sharethis|sharethis\.com|shvoong\.com|sites\.google\.com|skype|skyrock|skyrock\.com|slashdot\.org|slideshare\.net|smartnews\.com|snapchat|snapchat\.com|social|sociallife\.com\.br|socialvibe|socialvibe\.com|spaces\.live\.com|spoke|spoke\.com|spruz|spruz\.com|ssense\.com|stackapps|stackapps\.com|stackexchange|stackexchange\.com|stackoverflow|stackoverflow\.com|stardoll\.com|stickam|stickam\.com|studivz\.net|suomi24\.fi|superuser|superuser\.com|sweeva|sweeva\.com|t\.co|t\.me|tagged|tagged\.com|taggedmail|taggedmail\.com|talkbiznow|talkbiznow\.com|taringa\.net|techmeme|techmeme\.com|tencent|tencent\.com|tiktok|tiktok\.com|tinyurl|tinyurl\.com|toolbox|toolbox\.com|touch\.facebook\.com|tr\.pinterest\.com|travellerspoint|travellerspoint\.com|tripadvisor|tripadvisor\.com|trombi|trombi\.com|trustpilot|tudou|tudou\.com|tuenti|tuenti\.com|tumblr|tumblr\.com|tweetdeck|tweetdeck\.com|twitter|twitter\.com|twoo\.com|typepad|typepad\.com|unblog\.fr|urbanspoon\.com|ushareit\.com|ushi\.cn|vampirefreaks|vampirefreaks\.com|vampirerave|vampirerave\.com|vg\.no|video\.ibm\.com|vk\.com|vkontakte\.ru|wakoopa|wakoopa\.com|wattpad|wattpad\.com|web\.facebook\.com|web\.skype\.com|webshots|webshots\.com|wechat|wechat\.com|weebly|weebly\.com|weibo|weibo\.com|wer-weiss-was\.de|weread|weread\.com|whatsapp|whatsapp\.com|wiki\.answers\.com|wikihow\.com|wikitravel\.org|woot\.com|wordpress|wordpress\.com|wordpress\.org|xanga|xanga\.com|xing|xing\.com|yahoo-mbga\.jp|yammer|yammer\.com|yelp|yelp\.co\.uk|yelp\.com|youroom\.in|za\.pinterest\.com|zalo|zoo\.gr|zooppa|zooppa\.com)$", "i").test(v.utmSource) || new RegExp("^(?:social|social-network|social-media|sm|social network|social media)$", "i").test(v.utmMedium)},{"name":"organic-video","test":(v) => new RegExp("^(?:blog\.twitch\.tv|crackle|crackle\.com|curiositystream|curiositystream\.com|d\.tube|dailymotion|dailymotion\.com|dashboard\.twitch\.tv|disneyplus|disneyplus\.com|fast\.wistia\.net|help\.hulu\.com|help\.netflix\.com|hulu|hulu\.com|id\.twitch\.tv|iq\.com|iqiyi|iqiyi\.com|jobs\.netflix\.com|justin\.tv|m\.twitch\.tv|m\.youtube\.com|music\.youtube\.com|netflix|netflix\.com|player\.twitch\.tv|player\.vimeo\.com|ted|ted\.com|twitch|twitch\.tv|utreon|utreon\.com|veoh|veoh\.com|viadeo\.journaldunet\.com|vimeo|vimeo\.com|wistia|wistia\.com|youku|youku\.com|youtube|youtube\.com)$", "i").test(v.utmSource) || new RegExp("^(.*video.*)$", "i").test(v.utmMedium)},{"name":"organic-search","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|y
8andex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) || v.utmMedium.toLowerCase() === "organic"},{"name":"referral","test":(v) => new RegExp("^(?:referral|app|link)$", "i").test(v.utmMedium)},{"name":"email","test":(v) => new RegExp("^(?:email|e-mail|e_mail|e mail)$", "i").test(v.utmMedium) || new RegExp("^(?:email|e-mail|e_mail|e mail)$", "i").test(v.utmSource)},{"name":"affiliate","test":(v) => v.utmMedium.toLowerCase() === "affiliate"},{"name":"audio","test":(v) => v.utmMedium.toLowerCase() === "audio"},{"name":"sms","test":(v) => v.utmSource.toLowerCase() === "sms" || v.utmMedium.toLowerCase() === "sms"},{"name":"mobile-push-notification","test":(v) => v.utmSource.toLowerCase() === "firebase" || new RegExp("(?:.*mobile.*|.*notification.*|push$)", "i").test(v.utmMedium)}].find(i=>i.test(e))?.name??"other"}getShopifyAnalyticsId(){const e=this.getCookie("_shopify_y");if(e)return e;try{const t=this.localStorageGet("Shoplift_ClientId");if(t)return t}catch{}return null}legacyGetCookieVisitor(){const e=this.getCookie("SHOPLIFT");return e===null?null:JSON.parse(e,F)}getCookie(e){const t=this.cookie.split("; ").filter(i=>i.split("=").at(0)===e).at(0);return t===void 0?null:t.split("=").slice(1).join("=")}monitorConsentChange(){document.addEventListener("visitorConsentCollected",e=>{(async()=>await this.onConsentChange(e.detail.analyticsAllowed,!0))()}),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>this.loadShopifyConsentApiWithRetry()):this.loadShopifyConsentApiWithRetry()}loadShopifyConsentApiWithRetry(){let e=0;const t=()=>{this.loadShopifyConsentApi()||e++<10&&window.setTimeout(t,100)};t()}loadShopifyConsentApi(){if(window.Shopify){this.log("Loading Shopify features");const e=async()=>{if(!window.Shopify){this.log("Shopify object missing... suddenly?");return}if(window.Shopify.customerPrivacy===void 0){this.log("Shopify CustomerPrivacy api still missing, trying again in 1000ms"),t=window.setTimeout(()=>{(async()=>await e())()},1e3);return}if(this.geoViaShopify){const s=window.Shopify.customerPrivacy.getRegion?.();this.resolvedRegion=typeof s=="string"?s.replace(/-/g,""):""}const i=window.Shopify.customerPrivacy.getTrackingConsent();await this.onConsentChange(window.Shopify.customerPrivacy.analyticsProcessingAllowed(),i==="yes")};let t=window.setTimeout(()=>{(async()=>await e())()},5e3);return window.Shopify.loadFeatures([{name:"consent-tracking-api",version:"0.1"}],i=>{(async()=>{if(window.clearTimeout(t),i){this.log("Error loading consent tracking",i);return}await e()})()}),!0}return!1}async onConsentChange(e,t){try{if(this.log("Consent change detected",e,t),this.state.essential.consentApproved=e,this.state.essential.hasConsentInteraction=t,!this.state.essential.consentApproved){this.state.essential.hasConsentInteraction&&(this.state.analytics.queue.length=0),this.saveState();return}this.cookie=document.cookie,this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.saveState(),await this.syncAllEvents()}catch(i){this.log("Error syncing on consent change",i)}}isThemePreview(){return isThemePreview||themeRole!=="main"}isAppProxyPath(){const e=["/apps/","/tools/","/a/"],t=window.location.pathname;return e.some(i=>t.startsWith(i))}clearThemeBar(e,t,i){const s=structuredClone(i);this.log("Looking for theme bar"),this.waitForElement(null,"body").then(r=>this.waitForElement(r,"#preview-bar-iframe, #PBarNextFrameWrapper").then(o=>(this.log("Found theme bar"),t&&(this.log("Removing theme bar"),o.remove()),e?this.makeRequest({url:`${this.eventHost}/api/v0/logs`,method:"post",data:JSON.stringify({...this.debugState(),stateAtEvaluation:s},ee)}):Promise.resolve(null)))).catch(r=>console.error(r))}waitForElement(e,t){return new Promise(i=>{const s=document.querySelector(t);if(s){i(s);return}const r=new MutationObserver(o=>{const n=document.querySelector(t);if(n){r.disconnect(),i(n);return}});r.observe(e??document.documentElement,{childList:!0})})}setDebug(e){this.state.essential.debugMode=e,this.saveState()}log(e,...t){let i=0;const s=e.replace(/%[sdoOfF]/g,r=>{if(i>=t.length)return r;const o=t[i++];return r==="%o"||r==="%O"?JSON.stringify(o):String(o)});this.logHistory.push(`[${new Date().toISOString()}][SL] ${s}`),!(!this.state.essential.debugMode&&!this.shopliftDebug)&&console.debug(`[SL] ${e}`,...t)}debugState(){return{state:this.state,storage:{essential:this.loadLocalStorage(this.essentialSessionKey),analytics:this.loadLocalStorage(this.analyticsSessionKey)},params:{shop:this.shop,host:this.host,eventHost:this.eventHost,cssHideClass:this.cssHideClass,testConfigs:this.testConfigs,inactiveTestConfigs:this.inactiveTestConfigs,sendPageView:this.sendPageView,isShopifyMerchantCookie
8:this.getCookie("is_shopify_merchant"),themeId,url:window.location.href,isThemePreview,themeRole,gaConfig:this.gaConfig},logHistory:this.logHistory}}createViewportObserver(e,t={}){const{threshold:i=this.VIEWPORT_TRACK_THRESHOLD,triggerOnce:s=!0}=t,r=new Set;return new IntersectionObserver(o=>{o.forEach(n=>{if(n.isIntersecting&&!r.has(n.target)){const l=n.target,c=l.getAttribute(this.DATA_SL_TEST_ID);c&&(e(c,l),s&&r.add(l))}})},{threshold:i})}applyChangesWithViewport(e,t,i,s){const r=t.selectorsForViewportTracking??t.selectors,o=n=>{if(this.state.essential.visitorTests.some(h=>h.testId===n)||this.activeViewportObservers.has(n))return;const l=[];if(r.forEach(h=>{e.querySelectorAll(h.cssSelector).forEach(b=>l.push(b))}),l.length===0)return;let c=!1;const d=()=>{c||(c=!0,i(n),u.disconnect(),this.activeViewportObservers.delete(n))},u=this.createViewportObserver(()=>{d()},{triggerOnce:!0,...s});this.activeViewportObservers.set(n,u),this.log(`Created viewport observer for test ${n}, observing ${l.length} elements`),l.forEach(h=>{h.setAttribute(this.DATA_SL_TEST_ID,String(n)),u.observe(h)}),setTimeout(()=>{c||l.forEach(h=>{const p=h.getBoundingClientRect(),b=s?.threshold??this.VIEWPORT_TRACK_THRESHOLD,E=Math.min(p.bottom,window.innerHeight)-Math.max(p.top,0),S=Math.min(p.right,window.innerWidth)-Math.max(p.left,0);p.top<window.innerHeight&&p.bottom>0&&p.left<window.innerWidth&&p.right>0&&E>0&&S>0&&E>=p.height*b&&(this.log(`Price element already visible in viewport for test ${n}:`,h),d())})},100)};t.selectors.length>0&&U(e,t,()=>{}),Te(e,{testId:t.testId,hypothesisId:t.hypothesisId,selectors:r},n=>{o(n)})}applyPriceTestWithMapLookup(e,t,i,s){if(!t.priceData){this.log("No price data for hypothesis '%s'",t.id);return}this.log("Hypothesis '%s' isControl=%s, priceData has %d variants",t.id,t.isControl,t.priceData.variants.length);const r=t.priceData.variants.slice(0,3);for(const[S,C,_]of r)this.log(" Sample priceData: variant=%s, price=%d, compareAt=%d",S,C,_);const o=j(t.priceData),n=new Set;for(const S of i)if(S.priceData)for(const[C]of S.priceData.variants)n.add(C);this.log("Price test Map lookup: %d products in hypothesis, %d total products to track",o.size,n.size);const l=t.priceData,c=new WeakSet;let d=!1;const u="[data-sl-attribute-p], [data-sl-attribute-cap], [data-sl-attribute-discount]",h=S=>{if(c.has(S))return;const C=S.getAttribute("data-sl-attribute-p"),_=S.getAttribute("data-sl-attribute-cap"),T=S.getAttribute("data-sl-attribute-discount"),m=C||_||T;if(!m||!n.has(m))return;c.add(S);const y=o.get(m);y&&(this.log("Applying price for product %s: %d cents (compare at: %d cents)",m,y.priceInCents,y.compareAtPriceInCents),Le(S,m,y,l),this.log("Applied price to element for product %s",m)),!d&&!this.state.essential.visitorTests.some(w=>w.testId===e)&&(S.setAttribute(this.DATA_SL_TEST_ID,String(e)),this.setupElementViewportTracking(S,e,()=>{d||(d=!0,s(e))}))},p=()=>{const S=document.querySelectorAll(u);this.log("Scanning for price elements, found: %d",S.length),S.forEach(h)},b=new MutationObserver(S=>{for(const C of S)C.type==="childList"&&C.addedNodes.forEach(_=>{if(_.nodeType===Node.ELEMENT_NODE){const T=_;(T.hasAttribute("data-sl-attribute-p")||T.hasAttribute("data-sl-attribute-cap")||T.hasAttribute("data-sl-attribute-discount"))&&h(T),T.querySelectorAll(u).forEach(h)}}),C.type==="attributes"&&C.target instanceof Element&&h(C.target)}),E=document.body||document.documentElement;b.observe(E,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-sl-attribute-p","data-sl-attribute-cap","data-sl-attribute-discount"]}),this.log("MutationObserver started for price elements"),p(),document.readyState==="loading"&&document.addEventListener("DOMContentLoaded",()=>{this.log("DOMContentLoaded - rescanning for price elements"),p()}),setTimeout(()=>{this.log("Delayed rescan for price elements"),p()},100),setTimeout(()=>{this.log("Final rescan for price elements"),p()},500)}setupElementViewportTracking(e,t,i){const s=this.VIEWPORT_TRACK_THRESHOLD,r=e.getBoundingClientRect(),o=Math.min(r.bottom,window.innerHeight)-Math.max(r.top,0),n=Math.min(r.right,window.innerWidth)-Math.max(r.left,0);if(r.top<window.innerHeight&&r.bottom>0&&r.left<window.innerWidth&&r.right>0&&o>0&&n>0&&o>=r.height*s){this.log("Price element already visible for test %s",t),i();return}const c=new IntersectionObserver(d=>{for(const u of d)if(u.isIntersecting&&u.intersectionRatio>=s){this.log("Price element entered viewport for test %s",t),c.disconnect(),i();break}},{threshold:s});c.observe(e)}debug(){const e=this.debugState();console.log(JSON.stringify(e,ee,2))}}(async function(){window.shopliftInstance||(window.shopliftInstance=new Ze("sm-dream.myshopify.com","https://app.shoplift.ai","https://events.shoplift.ai",false,false,false,{"sendEvents":false,"mode":"gtag"},false,false,1000,[],[{"id":"019ce92a-3699-71a5-9b4d-700fefb24674","bayesianRevision":5,"status":"paused","hypotheses":[{"id":"019ce929-eb35-7287-bd37-09aee8198957","type":"urlRedirect","themeId":157360161014,"affix":"","isControl":true,"redirectPath":"/pages/4-in-1-certification"},{"id":"019ce92a-117f-7c67-8b3e-277b3da3f99b","type":"urlRedirect","themeId":157360161014,"affix":"","isControl":false,"redirectPath":"/pages/dreamlights-4-in-1-bundle-save"}],"ignoreTestViewParameterEnforcement":false},{"id":"019d2027-4981-7f98-af4f-33321978574f","bayesianRevision":5,"status":"paused","hypotheses":[{"id":"019d2026-7b29-76f3-83fa-57730ea671bd","type":"urlRedirect","themeId":157360161014,"affix":"","isControl":true,"redirectPath":"/pages/4-in-1-certification"},{"id":"019d2026-a93e-7b30-8d44-121c72abdffe","type":"urlRedirect","themeId":157360161014,"affix":"","isControl":false,"redirectPath":"/pages/4-in-1-certification-program-2026"}],"ignoreTestViewParameterEnforcement":false}
8],null,false),await window.shopliftInstance.init())})();async function Qe(a,e,t,i){const s=Be({log:i});if(t)return i("[SUB-PREVIEW] A side â no overlay applied; widget renders naturally"),s;const r=a.widget.widgetType,o=e?j(e):null;let n=W(e),l=J(a,n),c=l.discountMap,d=l.maxDiscount;function u(){const f=W(e);f!==n&&(n=f,l=J(a,n),c=l.discountMap,d=l.maxDiscount,i(`[SUB-PREVIEW] scope refreshed currentProductId=${n??"n/a"}, maxDiscount=${d}`))}i(`[SUB-PREVIEW] side=B, currentProductId=${n??"n/a"}, maxDiscount=${d}`);function h(f){if(!e||!o)return null;const v=Z(o),g=v?o.get(v):void 0;return g?{formattedVariantPrice:G(g.priceInCents,e),formattedDiscounted:G(g.priceInCents*(1-f/100),e)}:null}function p(f){const v=Y(a,f);if(!v)return d;const g=D(a,"subscriptionInput"),P=g.length?g[0].selector:'input[name="rc_plan"]',A=v.querySelector(`${P}:checked`);if(A){const k=c[A.value];if(k!==void 0)return k}return d}function b(f){const v=D(a,"subscriptionDiscount");for(const g of v)if(g.selector.includes("badge")||g.selector.includes("__badge")){const P=f.querySelector(g.selector);P?.textContent&&!P.textContent.includes(`${d}%`)&&$(P,A=>N(A,d))}}function E(f,v){const g=h(v);if(!g)return;const P=D(a,"subscriptionCompareAt");for(const A of P){const k=f.querySelector(A.selector)||f.querySelector(`[part~="${A.selector}"]`);k?.textContent&&!k.textContent.includes(g.formattedVariantPrice)&&$(k,x=>/\d/.test(x)?g.formattedVariantPrice:x)}}function S(f,v){const g=h(v);if(!g)return;const P=D(a,"subscriptionPrice");for(const A of P){const k=f.querySelector(A.selector)||f.querySelector(`[part~="${A.selector}"]`);k?.textContent&&!k.textContent.includes(g.formattedDiscounted)&&$(k,x=>/\d/.test(x)?g.formattedDiscounted:x)}}function C(f){const v=D(a,"subscriptionInput"),g=v.length?v[0].selector:'input[name="rc_plan"]',P=D(a,"subscriptionPlanDiscount"),A=P.length?P[0].selector:".rc-plans-button__discount";for(const k of Array.from(f.querySelectorAll("label"))){const x=k.querySelector(g),R=k.querySelector(A);if(x&&R?.textContent){const O=c[x.value];if(O!==void 0){const V=R.textContent.match(/[\d.]+%/)?.[0];V&&V!==`${O}%`&&$(R,L=>N(L,O))}}}}function _(f){const v=f.querySelector("select");if(v)for(const g of Array.from(v.options)){const P=c[g.value];if(P!==void 0&&g.textContent){const A=g.textContent.match(/[\d.]+%/)?.[0];A&&A!==`${P}%`&&(g.textContent=N(g.textContent,P))}}}function T(f){const v=D(a,"onetimePrice");if(!v.length||!e||!o)return;const g=Z(o),P=g?o.get(g):void 0;if(!P)return;const A=G(P.priceInCents,e),k=D(a,"onetimeContainer"),x=k.length?k[0].selector:'[part~="rc-purchase-option__onetime"]',R=f.querySelector(x);if(R)for(const O of v){const V=R.querySelector(`[part~="${O.selector}"]`);V?.textContent&&!V.textContent.includes(A)&&$(V,L=>/\d/.test(L)?A:L)}}function m(f,v){const P=D(a,"subscriptionDiscount").filter(A=>A.selector.includes("benefit")||A.selector==="rc-benefits");for(const A of P){const k=f.querySelector(A.selector);if(k?.shadowRoot){for(const x of Array.from(k.shadowRoot.querySelectorAll("li")))if(x.textContent?.includes("Save")){const R=x.textContent.match(/[\d.]+%/)?.[0];R&&R!==`${v}%`&&$(x,O=>N(O,v))}}}}let y=!1;function w(){if(!y){y=!0;try{u();const f=B(a);if(!f)return;const v=p(f);b(f),E(f,v),S(f,v),T(f);const g=Y(a,f);g&&(r==="buttons"||r==="radio"?C(g):_(g)),m(f,v)}finally{y=!1}}}const I=pe({data:a,runUpdates:w});return function(){I(),s()}}const Xe=Object.freeze(Object.defineProperty({__proto__:null,subscriptionPreviewRender:Qe},Symbol.toStringTag,{value:"Module"}))})(); })("/", { suffix: "", type: "cart" }, "main", 157360161014, false)</script>
8 9<!-- End of Shoplift scripts --> 10 11 <meta charset="utf-8"> 12 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 13 <meta name="viewport" content="width=device-width,initial-scale=1"> 14 <meta name="theme-color" content="#201f23"> 15 <link rel="canonical" href="https://dreamcatchers.com/cart"> 16 <link rel="preconnect" href="https://cdn.shopify.com" crossorigin> 17 <link rel="preconnect" href="https://fonts.shopifycdn.com" crossorigin> 18 <link rel="dns-prefetch" href="https://productreviews.shopifycdn.com"> 19 <link rel="dns-prefetch" href="https://ajax.googleapis.com"> 20 <link rel="dns-prefetch" href="https://maps.googleapis.com"> 21 <link rel="dns-prefetch" href="https://maps.gstatic.com"> 22 23
23<script async="async" src="https://240.1.2.3/js/mm_242bbe2e-e0ba-4cc8-ab9a-967b65cfdfa9-98079944.js"></script>
23 24 25 <!-- IDKF data layer --> 26
26<script> 27 window.dataLayer = window.dataLayer || []; 28 29 30 31 32 33 34 35 36 37 38 39 40 dataLayer.push({ 41 "event": "idkf_cart", 42 "idkf_ecommerce": { 43 "contentCategory": "cart", 44 "contentId": "", 45 "contentName": "", 46 "searchString": "", 47 "numItems": "0", 48 "value": "0.00", 49 "currency": "USD" 50 } 51 }); 52 </script>
52<link rel="shortcut icon" href="//dreamcatchers.com/cdn/shop/files/fav-icon-dreamcatchers4_32x32.png?v=1613183303" type="image/png" /><title>Your Shopping Cart 53– DreamCatchers Hair Extensions 54</title> 55<meta property="og:site_name" content="DreamCatchers Hair Extensions"> 56 <meta property="og:url" content="https://dreamcatchers.com/cart"> 57 <meta property="og:title" content="Your Shopping Cart"> 58 <meta property="og:type" content="website"> 59 <meta property="og:description" content="Full Cuticle Remy Hair Extensions that last for over 1 year. I-Tip, Tape, K-tip & Weft Professional Hair Extensions. Get Certified now ONLY FOR $499!"><meta name="twitter:site" content="@"> 60 <meta name="twitter:card" content="summary_large_image"> 61 <meta name="twitter:title" content="Your Shopping Cart"> 62 <meta name="twitter:description" content="Full Cuticle Remy Hair Extensions that last for over 1 year. I-Tip, Tape, K-tip & Weft Professional Hair Extensions. Get Certified now ONLY FOR $499!">
63<script async crossorigin fetchpriority="high" src="/cdn/shopifycloud/importmap-polyfill/es-modules-shim.2.4.0.js"></script>
vendor: 1 bytes, line 63
63
64<script type="importmap"> 65{ 66 "imports": { 67 "element.base-media": "//dreamcatchers.com/cdn/shop/t/373/assets/element.base-media.js?v=61305152781971747521773243247", 68 "element.image.parallax": "//dreamcatchers.com/cdn/shop/t/373/assets/element.image.parallax.js?v=59188309605188605141773243247", 69 "element.model": "//dreamcatchers.com/cdn/shop/t/373/assets/element.model.js?v=104979259955732717291773243248", 70 "element.quantity-selector": "//dreamcatchers.com/cdn/shop/t/373/assets/element.quantity-selector.js?v=68208048201360514121773243244", 71 "element.text.rte": "//dreamcatchers.com/cdn/shop/t/373/assets/element.text.rte.js?v=28194737298593644281773243245", 72 "element.video": "//dreamcatchers.com/cdn/shop/t/373/assets/element.video.js?v=110560105447302630031773243245", 73 "is-land": "//dreamcatchers.com/cdn/shop/t/373/assets/is-land.min.js?v=92343381495565747271773243245", 74 "util.misc": "//dreamcatchers.com/cdn/shop/t/373/assets/util.misc.js?v=117964846174238173191773243247", 75 "util.product-loader": "//dreamcatchers.com/cdn/shop/t/373/assets/util.product-loader.js?v=71947287259713254281773243248", 76 "util.resource-loader": "//dreamcatchers.com/cdn/shop/t/373/assets/util.resource-loader.js?v=81301169148003274841773243239", 77 "vendor.in-view": "//dreamcatchers.com/cdn/shop/t/373/assets/vendor.in-view.js?v=126891093837844970591773243240" 78 } 79} 80</script>
80<script type="module" src="//dreamcatchers.com/cdn/shop/t/373/assets/is-land.min.js?v=92343381495565747271773243245"></script>
80 81<style data-shopify>@font-face { 82 font-family: Baskervville; 83 font-weight: 700; 84 font-style: normal; 85 font-display: swap; 86 src: url("//dreamcatchers.com/cdn/fonts/baskervville/baskervville_n7.88f1ff04750507625f4dc43c30db1758681daca7.woff2") format("woff2"), 87 url("//dreamcatchers.com/cdn/fonts/baskervville/baskervville_n7.88ae461fce98fbd95493e26387a50fa6c2225da6.woff") format("woff"); 88} 89 90 @font-face { 91 font-family: Lato; 92 font-weight: 500; 93 font-style: normal; 94 font-display: swap; 95 src: url("//dreamcatchers.com/cdn/fonts/lato/lato_n5.b2fec044fbe05725e71d90882e5f3b21dae2efbd.woff2") format("woff2"), 96 url("//dreamcatchers.com/cdn/fonts/lato/lato_n5.f25a9a5c73ff9372e69074488f99e8ac702b5447.woff") format("woff"); 97} 98 99 100 @font-face { 101 font-family: Lato; 102 font-weight: 600; 103 font-style: normal; 104 font-display: swap; 105 src: url("//dreamcatchers.com/cdn/fonts/lato/lato_n6.38d0e3b23b74a60f769c51d1df73fac96c580d59.woff2") format("woff2"), 106 url("//dreamcatchers.com/cdn/fonts/lato/lato_n6.3365366161bdcc36a3f97cfbb23954d8c4bf4079.woff") format("woff"); 107} 108 109 @font-face { 110 font-family: Lato; 111 font-weight: 500; 112 font-style: italic; 113 font-display: swap; 114 src: url("//dreamcatchers.com/cdn/fonts/lato/lato_i5.9501f9e8a9e09e142687495e156dec167f6a3ea3.woff2") format("woff2"), 115 url("//dreamcatchers.com/cdn/fonts/lato/lato_i5.eca6cbf1aa9c70cc6dbfed0353a2f57e5065c864.woff") format("woff"); 116} 117 118 @font-face { 119 font-family: Lato; 120 font-weight: 600; 121 font-style: italic; 122 font-display: swap; 123 src: url("//dreamcatchers.com/cdn/fonts/lato/lato_i6.ab357ee5069e0603c2899b31e2b8ae84c4a42a48.woff2") format("woff2"), 124 url("//dreamcatchers.com/cdn/fonts/lato/lato_i6.3164fed79d7d987c1390528781c7c2f59ac7a746.woff") format("woff"); 125} 126 127</style><link href="//dreamcatchers.com/cdn/shop/t/373/assets/theme.css?v=37696360019941915281778874607" rel="stylesheet" type="text/css" media="all" /> 128 <link href="//dreamcatchers.com/cdn/shop/t/373/assets/custom.css?v=22735155668512623811787942998" rel="stylesheet" type="text/css" media="all" /> 129 130 <!-- Global site tag (gtag.js) - Google Ads: 858231023 -->
vendor: 66 bytes, lines 130-131
130 131 <script async src="https://www.googletagmanager.com/gtag/js?id=
131AW-858231023
vendor: 14 bytes, lines 131-132
131"></script> 132
132<script> 133
vendor: 140 bytes, lines 133-137
133window.dataLayer = window.dataLayer || []; 134 function gtag(){dataLayer.push(arguments);} 135 gtag('js', new Date()); 136 137 gtag('config', '
137AW-858231023
vendor: 6 bytes, lines 137-138
137'); 138
138</script>
138 139 140 <!-- Hotjar Tracking Code for https://new.dreamcatchers.com --> 141
141<script>
vendor: 131 bytes, lines 141-144
141 142 (function(h,o,t,j,a,r){ 143 h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)}; 144 h._hjSettings={hjid:
1441431299
vendor: 270 bytes, lines 144-150
144,hjsv:6}; 145 a=o.getElementsByTagName('head')[0]; 146 r=o.createElement('script');r.async=1; 147 r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv; 148 a.appendChild(r); 149 })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv='); 150
150</script>
150 151 152 153 <!-- Microsoft Clarity Tracking Code --> 154
154<script type="text/javascript"> 155 (function(c,l,a,r,i,t,y){ 156 c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; 157 t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i; 158 y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y); 159 })(window, document, "clarity", "script", "utbu58j1ae"); 160 </script>
160 161 162 <!-- Anti-flickering script --> 163
163<script> 164 var timeout = 3000; // Timeout value to remove the flicker (in milliseconds) 165 !function(h,i,d,e){var t,n=h.createElement("style");n.id=e,n.innerHTML="body{opacity:0}",h.head.appendChild(n),t=d,i.rmfk=function(){var t=h.getElementById(e);t&&t.parentNode.removeChild(t)},setTimeout(i.rmfk,t)}(document,window,timeout,"abhide"); 166 </script>
166 167 168 <!-- Mida A/B Testing Script --> 169
169<script type="text/javascript" async src="https://cdn.mida.so/js/optimize.js?key=qEMjJ14gRlzJ7d36Lwx5Pn"></script>
169 170 171
171<script> 172 (function(w,d,t,r,u) 173 { 174 var f,n,i; 175 w[u]=w[u]||[],f=function() 176 { 177 var o={ti:"137031807", tm:"shpfy_ui"}; 178 o.q=w[u],w[u]=new UET(o),w[u].push("pageLoad") 179 }, 180 n=d.createElement(t),n.src=r,n.async=1,n.onload=n.onreadystatechange=function() 181 { 182 var s=this.readyState; 183 s&&s!=="loaded"&&s!=="complete"||(f(),n.onload=n.onreadystatechange=null) 184 }, 185 i=d.getElementsByTagName(t)[0],i.parentNode.insertBefore(n,i) 186 }) 187 (window,document,"script","//bat.bing.com/bat.js","uetq"); 188 </script>
188 189 190 191 <style> 192 .home-text-columns-bg:after { 193 background: url(//dreamcatchers.com/cdn/shop/files/product-font-bg.png?v=3939887857610253762) no-repeat center center; 194 } 195 .site-footer .grid > div:last-of-type:after { 196 background: url(//dreamcatchers.com/cdn/shop/files/product-font-bg.png?v=3939887857610253762) no-repeat center top; 197 } 198 .template-product .page-content--product .page-width { 199 background: url(//dreamcatchers.com/cdn/shop/files/product-font-bg.png?v=3939887857610253762) no-repeat center 0; 200 overflow-x: clip; 201 padding-top: 10px; 202 } 203 204 .article-page-wrapper:before, 205 .article-page-wrapper:after { 206 background: url(//dreamcatchers.com/cdn/shop/files/dc-logo-bg_1.svg?v=4639564146134599212) no-repeat center center; 207 } 208 209 .page-sign-up .contact-wrapper { 210 background: url(//dreamcatchers.com/cdn/shop/files/contacts-bg_ae37ad8c-eef0-446d-bdde-647155c20c8d.png?v=61769120282912641) no-repeat center 220px; 211 overflow-x: hidden; 212 } 213 214 .page-warranty-returns-exchanges main, .page-shipping-delivery main, .page-privacy-policy main { 215 background-image: linear-gradient(to top, rgb(249, 243, 246), #fff); 216 } 217 .page-warranty-returns-exchanges .page-content, .page-shipping-delivery .page-content, .page-privacy-policy .page-content { 218 background: url(//dreamcatchers.com/cdn/shop/files/product-font-bg.png?v=3939887857610253762) no-repeat center 50px; 219 padding-top: 90px; 220 overflow-x: hidden; 221 } 222 223 .certification-column-lists ul li:before { 224 background: #ff84b0 url(//dreamcatchers.com/cdn/shop/files/clp-chek-icon-white.png?v=4983170332385884852) center center / 11px auto no-repeat; 225 } 226 .testimonials__info:before { 227 background: #ff84b0 url(//dreamcatchers.com/cdn/shop/files/clp-chek-icon-white.png?v=4983170332385884852) 49% center / 9px auto no-repeat; 228 } 229 230 .sm--product-certification .sm--product-certification-wrapper:before { 231 background: url(//dreamcatchers.com/cdn/shop/files/DC-logo-pink.png?v=2548795024169153878) no-repeat center center; 232 } 233 234 .template-customers-login main .page-content { 235 background: url(//dreamcatchers.com/cdn/shop/files/login-bg_89ed7b0f-acf7-4f41-b0f3-d8e2907fc63c.png?v=10800524747913366757) no-repeat center 280px; 236 } 237 .template-customers-register main .page-content { 238 background: url(//dreamcatchers.com/cdn/shop/files/register-bg.png?v=9691449102054024494) center center no-repeat; 239 } 240 .account-video-text ul li:before { 241 background: #ff84b0 url(//dreamcatchers.com/cdn/shop/files/clp-chek-icon-white.png?v=4983170332385884852) center center / 11px auto no-repeat; 242 } 243 </style><style data-shopify>:root { 244 --typeHeaderPrimary: Baskervville; 245 --typeHeaderFallback: serif; 246 --typeHeaderSize: 60px; 247 --typeHeaderWeight: 700; 248 --typeHeaderLineHeight: 1.1; 249 --typeHeaderSpacing: 0.0em; 250 251 --typeBasePrimary:Lato; 252 --typeBaseFallback:sans-serif; 253 --typeBaseSize: 14px; 254 --typeBaseWeight: 500; 255 --typeBaseSpacing: 0.025em; 256 --typeBaseLineHeight: 1.6; 257 --typeBaselineHeightMinus01: 1.5; 258 259 --typeCollectionTitle: 20px; 260 261 --iconWeight: 4px; 262 --iconLinecaps: miter; 263 264 265 --buttonRadius: 0; 266 267 268 --colorGridOverlayOpacity: 0.12; 269 --colorAnnouncement: #1e1e1e; 270 --colorAnnouncementText: #ffffff; 271 272 --colorBody: #ffffff; 273 --colorBodyAlpha05: rgba(255, 255, 255, 0.05); 274 --colorBodyDim: #f2f2f2; 275 --colorBodyLightDim: #fafafa; 276 --colorBodyMediumDim: #f5f5f5; 277 278 279 --colorBorder: #f0f0f0; 280 281 --colorBtnPrimary: #201f23; 282 --colorBtnPrimaryLight: #39373e; 283 --colorBtnPrimaryDim: #141315; 284 --colorBtnPrimaryText: #ffffff; 285 286 --colorCartDot: #ff79b3; 287 288 --colorDrawers: #ffffff; 289 --colorDrawersDim: #f2f2f2; 290 --colorDrawerBorder: #e8e8e1; 291 --colorDrawerText: #2d2d2d; 292 --colorDrawerTextDark: #070707; 293 --colorDrawerButton: #201f23; 294 --colorDrawerButtonText: #ffffff; 295 296 --colorFooter: #ffffff; 297 --colorFooterText: #2d2d2d; 298 --colorFooterTextAlpha01: #2d2d2d; 299 300 --colorGridOverlay: #000000; 301 --colorGridOverlayOpacity: 0.1; 302 303 --colorHeaderTextAlpha01: rgba(68, 68, 68, 0.1); 304 305 --colorHeroText: #ffffff; 306 307 --colorSmallImageBg: #ffffff; 308 --colorLargeImageBg: #ffffff; 309 310 --colorImageOverlay: #15071a; 311 --colorImageOverlayOpacity: 0.0; 312 --colorImageOverlayTextShadow: 0.0; 313 314 --colorLink: #2d2d2d; 315 316 --colorModalBg: rgba(52, 45, 58, 0.6); 317 318 --colorNav: #ffffff; 319 --colorNavText: #444444; 320 321 --colorPrice: #1e1e1e; 322 323 --colorSaleTag: #ff79b3; 324 --colorSaleTagText: #ffffff; 325 326 --colorTextBody: #2d2d2d; 327 --colorTextBodyAlpha015: rgba(45, 45, 45, 0.15); 328 --colorTextBodyAlpha005: rgba(45, 45, 45, 0.05); 329 --colorTextBodyAlpha008: rgba(45, 45, 45, 0.08); 330 --colorTextSavings: #ff79b3; 331 332 --urlIcoSelect: url(//dreamcatchers.com/cdn/shop/t/373/assets/ico-select.svg);
333 --urlIcoSelectFooter: url(//dreamcatchers.com/cdn/shop/t/373/assets/ico-select-footer.svg); 334 --urlIcoSelectWhite: url(//dreamcatchers.com/cdn/shop/t/373/assets/ico-select-white.svg); 335 336 --grid-gutter: 17px; 337 --drawer-gutter: 20px; 338 339 --sizeChartMargin: 25px 0; 340 --sizeChartIconMargin: 5px; 341 342 --newsletterReminderPadding: 40px; 343 344 /*Shop Pay Installments*/ 345 --color-body-text: #2d2d2d; 346 --color-body: #ffffff; 347 --color-bg: #ffffff; 348 } 349 350 .placeholder-content { 351 background-image: linear-gradient(100deg, #ffffff 40%, #f7f7f7 63%, #ffffff 79%); 352 }</style>
352<script src="//code.jquery.com/jquery-3.1.0.min.js" type="text/javascript"></script>
352 353 354
354<script src="//dreamcatchers.com/cdn/shop/t/373/assets/custom.js?v=175531458647149482531784841737" type="text/javascript"></script>
354 355 356
356<script> 357 document.documentElement.className = document.documentElement.className.replace('no-js', 'js'); 358 359 window.theme = window.theme || {}; 360 theme.routes = { 361 home: "/", 362 cart: "/cart.js", 363 cartPage: "/cart", 364 cartAdd: "/cart/add.js", 365 cartChange: "/cart/change.js", 366 search: "/search", 367 predictiveSearch: "/search/suggest" 368 }; 369 theme.strings = { 370 soldOut: "Temporarily out of stock", 371 unavailable: "Unavailable", 372 inStockLabel: "In stock, ready to ship", 373 oneStockLabel: "Low stock - [count] item left", 374 otherStockLabel: "Low stock - [count] items left", 375 willNotShipUntil: "Ready to ship [date]", 376 willBeInStockAfter: "Back in stock [date]", 377 waitingForStock: "Backordered, shipping soon", 378 savePrice: "Save [saved_amount]", 379 cartEmpty: "Your cart is currently empty.", 380 cartTermsConfirmation: "You must agree with the terms and conditions of sales to check out", 381 searchCollections: "Collections", 382 searchPages: "Pages", 383 searchArticles: "Articles", 384 productFrom: "from ", 385 maxQuantity: "You can only have [quantity] of [title] in your cart." 386 }; 387 theme.settings = { 388 cartType: "drawer", 389 isCustomerTemplate: false, 390 moneyFormat: "${{amount}}", 391 saveType: "dollar", 392 productImageSize: "natural", 393 productImageCover: true, 394 predictiveSearch: true, 395 predictiveSearchType: null, 396 predictiveSearchVendor: false, 397 predictiveSearchPrice: false, 398 quickView: false, 399 themeName: 'Impulse', 400 themeVersion: "8.1.0" 401 }; 402 </script>
402 403 404
404<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script>
404<meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/13094256699/digital_wallets/dialog"> 405<meta id="in-context-paypal-metadata" data-shop-id="13094256699" data-venmo-supported="false" data-environment="production" data-locale="en_US" data-paypal-v4="true" data-currency="USD"> 406<link rel="ucp" href="/.well-known/ucp" version="2026-08-25">
406<script async="async" src="/checkouts/internal/preloads.js?locale=en-US&default_configuration_id=2215117046"></script>
406 407<link rel="preconnect" href="https://shop.app" crossorigin="anonymous">
408<script async="async" src="https://shop.app/checkouts/internal/preloads.js?locale=en-US&default_configuration_id=2215117046&shop_id=13094256699" crossorigin="anonymous"></script>
vendor: 1 bytes, line 408
408
409<script id="apple-pay-shop-capabilities" type="application/json">{"shopId":13094256699,"countryCode":"US","currencyCode":"USD","merchantCapabilities":["supports3DS"],"merchantId":"gid:\/\/shopify\/Shop\/13094256699","merchantName":"DreamCatchers Hair Extensions","requiredBillingContactFields":["postalAddress","email","phone"],"requiredShippingContactFields":["postalAddress","email","phone"],"shippingType":"shipping","supportedNetworks":["visa","masterCard","amex","discover","elo","jcb"],"total":{"type":"pending","label":"DreamCatchers Hair Extensions","amount":"1.00"},"shopifyPaymentsEnabled":true,"supportsSubscriptions":true}</script>
vendor: 1 bytes, line 409
409
410<script id="shopify-features" type="application/json">{"accessToken":"ca77d7b057cd7b0e7738faa8247d61fd","betas":["rich-media-storefront-analytics"],"domain":"dreamcatchers.com","predictiveSearch":true,"shopId":13094256699,"locale":"en"}</script>
vendor: 1 bytes, line 410
410
411<script>var Shopify = Shopify || {}; 412Shopify.shop = "sm-dream.myshopify.com"; 413Shopify.locale = "en"; 414Shopify.currency = {"active":"USD","rate":"1.0"}; 415Shopify.country = "US"; 416Shopify.theme = {"name":"dreamcatchers-main-theme\/main","id":157360161014,"schema_name":"Impulse","schema_version":"8.1.0","theme_store_id":null,"role":"main"}; 417Shopify.theme.handle = "null"; 418Shopify.theme.style = {"id":null,"handle":null}; 419Shopify.cdnHost = "dreamcatchers.com/cdn"; 420Shopify.routes = Shopify.routes || {}; 421Shopify.routes.root = "/"; 422Shopify.shopJsCdnBaseUrl = "https://cdn.shopify.com/shopifycloud/shop-js"; 423Shopify.SignInWithShop = Shopify.SignInWithShop || {}; 424Shopify.SignInWithShop.User = Shopify.SignInWithShop.User || {}; 425Shopify.SignInWithShop.User.recognized = false;</script>
vendor: 1 bytes, line 425
425
426<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
vendor: 1 bytes, line 426
426
427<script>!function(o){function n(){var o=[];function n(){o.push(Array.prototype.slice.apply(arguments))}return n.q=o,n}var t=o.Shopify=o.Shopify||{};t.loadFeatures=n(),t.autoloadFeatures=n()}(window);</script>
vendor: 1 bytes, line 427
427
428<script> 429 window.ShopifyPay = window.ShopifyPay || {}; 430 window.ShopifyPay.apiHost = "shop.app\/pay"; 431 window.ShopifyPay.redirectState = null; 432</script>
vendor: 1 bytes, line 432
432
433<script> 434 window.Shopify = window.Shopify || {}; 435 window.Shopify.SignInWithShop = window.Shopify.SignInWithShop || {}; 436 window.Shopify.SignInWithShop.assetMetrics = { sampleRate: 0.25 }; 437 window.Shopify.SignInWithShop.eligible = true; 438</script>
vendor: 1 bytes, line 438
438
439<script id="shop-js-analytics" type="application/json">{"pageType":"cart"}</script>
vendor: 1 bytes, line 439
439
440<script defer="defer" async type="module" src="https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"></script>
vendor: 1 bytes, line 440
440
441<script type="module"> 442 await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"); 443 444 window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true}); 445 446</script>
vendor: 1 bytes, line 446
446
447<script> 448 window.Shopify = window.Shopify || {}; 449 if (!window.Shopify.featureAssets) window.Shopify.featureAssets = {}; 450 window.Shopify.featureAssets['shop-js'] = {"avatar":["modules/v2/loader.avatar.en.esm.js"],"checkout-modal":["modules/v2/loader.checkout-modal.en.esm.js"],"init-customer-accounts-sign-up":["modules/v2/loader.init-customer-accounts-sign-up.en.esm.js"],"init-customer-accounts":["modules/v2/loader.init-customer-accounts.en.esm.js"],"init-fed-cm":["modules/v2/loader.init-fed-cm.en.esm.js"],"init-shop-cart-sync":["modules/v2/loader.init-shop-cart-sync.en.esm.js"],"init-shop-email-lookup-coordinator":["modules/v2/loader.init-shop-email-lookup-coordinator.en.esm.js"],"init-shop-for-new-customer-accounts":["modules/v2/loader.init-shop-for-new-customer-accounts.en.esm.js"],"init-shop-user-recognition":["modules/v2/loader.init-shop-user-recognition.en.esm.js"],"init-windoid":["modules/v2/loader.init-windoid.en.esm.js"],"lead-capture":["modules/v2/loader.lead-capture.en.esm.js"],"listener":["modules/v2/loader.listener.en.esm.js"],"pay-button":["modules/v2/loader.pay-button.en.esm.js"],"payment-terms":["modules/v2/loader.payment-terms.en.esm.js"],"shop-button":["modules/v2/loader.shop-button.en.esm.js"],"shop-cart-sync":["modules/v2/loader.shop-cart-sync.en.esm.js"],"shop-cash-offers":["modules/v2/loader.shop-cash-offers.en.esm.js"],"shop-follow-button":["modules/v2/loader.shop-follow-button.en.esm.js"],"shop-login-button":["modules/v2/loader.shop-login-button.en.esm.js"],"shop-login":["modules/v2/loader.shop-login.en.esm.js"],"shop-toast-manager":["modules/v2/loader.shop-toast-manager.en.esm.js"],"shop-user-recognition":["modules/v2/loader.shop-user-recognition.en.esm.js"]}; 451</script>
vendor: 1 bytes, line 451
451
452<script>(function() { 453 var isLoaded = false; 454 function asyncLoad() { 455 if (isLoaded) return; 456 isLoaded = true; 457 var urls = ["\/\/www.powr.io\/powr.js?powr-token=sm-dream.myshopify.com\u0026external-type=shopify\u0026shop=sm-dream.myshopify.com","https:\/\/cdn.shopify.com\/s\/files\/1\/0130\/9425\/6699\/t\/253\/assets\/affirmShopify.js?v=1733343539\u0026shop=sm-dream.myshopify.com"]; 458 for (var i = 0; i < urls.length; i++) { 459 var s = document.createElement('script'); 460 s.type = 'text/javascript'; 461 s.async = true; 462 s.src = urls[i]; 463 var x = document.getElementsByTagName('script')[0]; 464 x.parentNode.insertBefore(s, x); 465 } 466 }; 467 if(window.attachEvent) { 468 window.attachEvent('onload', asyncLoad); 469 } else { 470 window.addEventListener('load', asyncLoad, false); 471 } 472})();</script>
vendor: 1 bytes, line 472
472
473<script id="__st">var __st={"a":13094256699,"offset":-18000,"reqid":"89fe3673-d7e6-4088-91b5-64cbdcef44a2-1790294590","pageurl":"dreamcatchers.com\/cart","u":"314c3d3249c4","p":"cart"};</script>
vendor: 1 bytes, line 473
473
474<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
vendor: 1 bytes, line 474
474
475<script id="captcha-bootstrap">!function(){'use strict';const t='contact',e='account',n='new_comment',o=[[t,t],['blogs',n],['comments',n],[t,'customer']],c=[[e,'customer_login'],[e,'guest_login'],[e,'recover_customer_password'],[e,'create_customer']],r=t=>t.map((([t,e])=>`form[action*='/${t}']:not([data-nocaptcha='true']) input[name='form_type'][value='${e}']`)).join(','),a=t=>()=>t?[...document.querySelectorAll(t)].map((t=>t.form)):[];function s(){const t=[...o],e=r(t);return a(e)}const i='password',u='form_key',d=['recaptcha-v3-token','g-recaptcha-response','h-captcha-response',i],f=()=>{try{return window.sessionStorage}catch{return}},m='__shopify_v',_=t=>t.elements[u];function p(t,e,n=!1){try{const o=window.sessionStorage,c=JSON.parse(o.getItem(e)),{data:r}=function(t){const{data:e,action:n}=t;return t[m]||n?{data:e,action:n}:{data:t,action:n}}(c);for(const[e,n]of Object.entries(r))t.elements[e]&&(t.elements[e].value=n);n&&o.removeItem(e)}catch(o){console.error('form repopulation failed',{error:o})}}const l='form_type',E='cptcha';function T(t){t.dataset[E]=!0}const w=window,h=w.document,L='Shopify',v='ce_forms',y='captcha';let A=!1;((t,e)=>{const n=(g='f06e6c50-85a8-45c8-87d0-21a2b65856fe',I='https://cdn.shopify.com/shopifycloud/storefront-forms-hcaptcha/ce_storefront_forms_captcha_hcaptcha.v1.5.3.iife.js',D={infoText:'Protected by hCaptcha',privacyText:'Privacy',termsText:'Terms'},(t,e,n)=>{const o=w[L][v],c=o.bindForm;if(c)return c(t,g,e,D).then(n);var r;o.q.push([[t,g,e,D],n]),r=I,A||(h.body.append(Object.assign(h.createElement('script'),{id:'captcha-provider',async:!0,src:r})),A=!0)});var g,I,D;w[L]=w[L]||{},w[L][v]=w[L][v]||{},w[L][v].q=[],w[L][y]=w[L][y]||{},w[L][y].protect=function(t,e){n(t,void 0,e),T(t)},Object.freeze(w[L][y]),function(t,e,n,w,h,L){const[v,y,A,g]=function(t,e,n){const i=e?o:[],u=t?c:[],d=[...i,...u],f=r(d),m=r(i),_=r(d.filter((([t,e])=>n.includes(e))));return[a(f),a(m),a(_),s()]}(w,h,L),I=t=>{const e=t.target;return e instanceof HTMLFormElement?e:e&&e.form},D=t=>v().includes(t);t.addEventListener('submit',(t=>{const e=I(t);if(!e)return;const n=D(e)&&!e.dataset.hcaptchaBound&&!e.dataset.recaptchaBound,o=_(e),c=g().includes(e)&&(!o||!o.value);(n||c)&&t.preventDefault(),c&&!n&&(function(t){try{if(!f())return;!function(t){const e=f();if(!e)return;const n=_(t);if(!n)return;const o=n.value;o&&e.removeItem(o)}(t);const e=Array.from(Array(32),(()=>Math.random().toString(36)[2])).join('');!function(t,e){_(t)||t.append(Object.assign(document.createElement('input'),{type:'hidden',name:u})),t.elements[u].value=e}(t,e),function(t,e){const n=f();if(!n)return;const o=[...t.querySelectorAll(`input[type='${i}']`)].map((({name:t})=>t)),c=[...d,...o],r={};for(const[a,s]of new FormData(t).entries())c.includes(a)||(r[a]=s);n.setItem(e,JSON.stringify({[m]:1,action:t.action,data:r}))}(t,e)}catch(e){console.error('failed to persist form',e)}}(e),e.submit())}));const S=(t,e)=>{t&&!t.dataset[E]&&(n(t,e.some((e=>e===t))),T(t))};for(const o of['focusin','change'])t.addEventListener(o,(t=>{const e=I(t);D(e)&&S(e,y())}));const B=e.get('form_key'),M=e.get(l),P=B&&M;t.addEventListener('DOMContentLoaded',(()=>{const t=y();if(P)for(const e of t)e.elements[l].value===M&&p(e,B);[...new Set([...A(),...v().filter((t=>'true'===t.dataset.shopifyCaptcha))])].forEach((e=>S(e,t)))}))}(h,new URLSearchParams(w.location.search),n,t,e,['guest_login'])})(!0,!0)}();</script>
vendor: 1 bytes, line 475
475
476<script integrity="sha256-JjoPp5ZfB1sSAs5SQaol1x1GgvveM+BgmRzyDexInEQ=" data-source-attribution="shopify.loadfeatures" defer="defer" src="//dreamcatchers.com/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js" crossorigin="anonymous"></script>
vendor: 1 bytes, line 476
476
477<script>(function () {var userAgent = navigator.userAgent;var platform = navigator.platform;var maxTouchPoints = navigator.maxTouchPoints || 0;var isIOS = /iPad|iPhone|iPod/.test(platform) || (platform === 'MacIntel' && maxTouchPoints > 1);var isMacSafari = platform.indexOf('Mac') === 0 && /Safari/.test(userAgent) && !/Chrome|Chromium|CriOS|FxiOS|Edg|OPR|Android/.test(userAgent);var isAppleSafari = isIOS || isMacSafari;if (isAppleSafari) {fetch('/sf_private_access_tokens' + location.search).catch(function () {});}function browserMajorVersion(pattern) {var match = userAgent.match(pattern);return match ? parseInt(match[1], 10) : null;}function shouldLoadAutosizesPolyfill() {if (!window.PerformanceObserver?.supportedEntryTypes?.includes('paint')) {return false;}var chromeVersion = browserMajorVersion(/Chrome\/(\d+)/);if (chromeVersion !== null) {return chromeVersion < 126;}var firefoxVersion = browserMajorVersion(/Firefox\/(\d+)/);if (firefoxVersion !== null) {return firefoxVersion < 150;}var safariVersion = isAppleSafari ? browserMajorVersion(/Version\/(\d+).*Safari\//) : null;if (safariVersion !== null) {return safariVersion < 27;}return true;}if (shouldLoadAutosizesPolyfill()) {var autosizesScript = document.createElement('script');autosizesScript.async = true;autosizesScript.crossOrigin = 'anonymous';autosizesScript.src = "//dreamcatchers.com/cdn/shopifycloud/storefront/assets/storefront/autosizes-84416378.js";(document.head || document.documentElement).appendChild(autosizesScript);}window.ShopifyAnalytics = window.ShopifyAnalytics || {};window.ShopifyAnalytics.performance = window.ShopifyAnalytics.performance || {};(function () {var LONG_FRAME_THRESHOLD = 50;var longAnimationFrames = [];var activeRafId = null;function collectLongFrames() {var previousTime = null;function rafMonitor(now) {if (activeRafId === null) {return;}var delta = now - previousTime;if (delta > LONG_FRAME_THRESHOLD) {longAnimationFrames.push({startTime: previousTime,endTime: now,});}previousTime = now;activeRafId = requestAnimationFrame(rafMonitor);}previousTime = performance.now();activeRafId = requestAnimationFrame(rafMonitor);}if (!window.PerformanceObserver?.supportedEntryTypes?.includes('long-animation-frame')) {collectLongFrames();var timeoutId = setTimeout(function () {cancelAnimationFrame(activeRafId);}, 10000);window.ShopifyAnalytics.performance.getLongAnimationFrames = function (stopCollection) {if (stopCollection === undefined) {stopCollection = false;}if (stopCollection) {clearTimeout(timeoutId);cancelAnimationFrame(activeRafId);}return longAnimationFrames;};}})();})();</script>
477<script crossorigin="anonymous" defer="defer" src="//dreamcatchers.com/cdn/shopifycloud/storefront/assets/shopify_pay/storefront-616277c7.js?v=20250812"></script>
vendor: 1 bytes, line 477
477
478<script id="shopify-origin-trials" async="async" integrity="sha256-qJbe/jEZBHtr5W/BlA2cKAz3vkXu6vJQyLjgvgCC86g=" src="//cdn.shopify.com/shopifycloud/storefront/assets/storefront/origin_trials-318ab40a.js" crossorigin="anonymous" onload="window.__shopifyOriginTrialsDone = true" onerror="window.__shopifyOriginTrialsDone = true"></script>
vendor: 1 bytes, line 478
478
479<script> 480 window.Shopify = window.Shopify || {}; 481 window.Shopify.MCP = window.Shopify.MCP || {}; 482 window.Shopify.MCP.enabled = true; 483 window.Shopify.MCP.shop = "sm-dream.myshopify.com"; 484 window.Shopify.MCP.mcpEndpoint = "https:\/\/dreamcatchers.com\/api\/mcp"; 485 window.Shopify.MCP.tools = [{"name":"search_shop_policies_and_faqs","description":"Used to get facts about the stores policies, products, or services.\nSome examples of questions you can ask are:\n - What is your return policy?\n - What is your shipping policy?\n - What is your phone number?\n - What are your hours of operation?\"\n","inputSchema":{"$schema":"https:\/\/json-schema.org\/draft\/2020-12\/schema","type":"object","properties":{"query":{"type":"string","description":"A natural language query."},"context":{"type":"string","description":"Additional information about the request such as user demographics, mood, location, or other relevant details that could help in tailoring the response appropriately."}},"required":["query"]}}]; 486</script>
vendor: 1 bytes, line 486
486
487<script>(()=>{var d="shopify:webmcp_adapter_loaded",n=Symbol.for("shopify.webmcp_adapter_loading");function s(c,a,{win:r=window,doc:o=document}={}){function p(){try{return r.localStorage.getItem(d)==="true"}catch{return!1}}function l(){try{r.localStorage.setItem(d,"true")}catch{}}function u(){return typeof(o.modelContext||r.navigator?.modelContext)?.registerTool=="function"}function f(){if(r[n]||!u())return;let t=o.head||o.getElementsByTagName("head")[0];if(!t)return;let e=o.createElement("script");e.type="module",e.crossOrigin="anonymous",a&&(e.integrity=a),e.src=c,e.addEventListener("load",l,{once:!0}),e.addEventListener("error",()=>{r[n]=!1},{once:!0}),t.appendChild(e),r[n]=!0}function _(t){let e=o.getElementById("shopify-origin-trials");if(!e||r.__shopifyOriginTrialsDone){t();return}e.addEventListener("load",t,{once:!0}),e.addEventListener("error",t,{once:!0})}function i(){_(()=>r.setTimeout(f,0))}function m(){o.addEventListener("DOMContentLoaded",i,{once:!0})}p()?i():m()}s("\/\/dreamcatchers.com\/cdn\/shopifycloud\/storefront\/assets\/storefront\/webmcp-c6b62ece.js","sha256-ke4DDuBjdvea3vxLWxHc9E9nq8zihuG4IfYEGbb77ys=");})(); 488</script>
vendor: 1 bytes, line 488
488
489<script data-source-attribution="shopify.dynamic_checkout.dynamic.init">var Shopify=Shopify||{};Shopify.PaymentButton=Shopify.PaymentButton||{isStorefrontPortableWallets:!0,init:function(){window.Shopify.PaymentButton.init=function(){};var t=document.createElement("script");t.src="https://dreamcatchers.com/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js",t.type="module",document.head.appendChild(t)}}; 490</script>
vendor: 1 bytes, line 490
490
491<script data-source-attribution="shopify.dynamic_checkout.buyer_consent"> 492 function portableWalletsHideBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.add("hidden"),t.setAttribute("aria-hidden","true"),n.removeEventListener("click",e))}function portableWalletsShowBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.remove("hidden"),t.removeAttribute("aria-hidden"),n.addEventListener("click",e))}window.Shopify?.PaymentButton&&(window.Shopify.PaymentButton.hideBuyerConsent=portableWalletsHideBuyerConsent,window.Shopify.PaymentButton.showBuyerConsent=portableWalletsShowBuyerConsent); 493</script>
vendor: 1 bytes, line 493
493
494<script data-source-attribution="shopify.dynamic_checkout.cart.bootstrap">document.addEventListener("DOMContentLoaded",(function(){function t(){return document.querySelector("shopify-accelerated-checkout-cart, shopify-accelerated-checkout")}if(t())Shopify.PaymentButton.init();else{new MutationObserver((function(e,n){t()&&(Shopify.PaymentButton.init(),n.disconnect())})).observe(document.body,{childList:!0,subtree:!0})}})); 495</script>
495 496<link id="shopify-accelerated-checkout-styles" rel="stylesheet" media="screen" href="https://dreamcatchers.com/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css" crossorigin="anonymous"> 497<style id="shopify-accelerated-checkout-cart"> 498 #shopify-buyer-consent { 499 margin-top: 1em; 500 display: inline-block; 501 width: 100%; 502} 503 504#shopify-buyer-consent.hidden { 505 display: none; 506} 507 508#shopify-subscription-policy-button { 509 background: none; 510 border: none; 511 padding: 0; 512 text-decoration: underline; 513 font-size: inherit; 514 cursor: pointer; 515} 516 517#shopify-subscription-policy-button::before { 518 box-shadow: none; 519} 520 521 </style> 522
523<script id="shopify-cfh-end">window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>
523 524 525 <style data-shopify> 526 :root { 527 /* Root Variables */ 528 /* ========================= */ 529 --root-color-primary: #2d2d2d; 530 --color-primary: #2d2d2d; 531 --root-color-secondary: #ffffff; 532 --color-secondary: #ffffff; 533 --color-sale-tag: #ff79b3; 534 --color-sale-tag-text: #ffffff; 535 --layout-section-padding-block: 3rem; 536 --layout-section-padding-inline--md: 40px; 537 --layout-section-max-inline-size: 1420px; 538 539 540 /* Text */ 541 /* ========================= */ 542 543 /* Body Font Styles */ 544 --element-text-font-family--body: Lato; 545 --element-text-font-family-fallback--body: sans-serif; 546 --element-text-font-weight--body: 500; 547 --element-text-letter-spacing--body: 0.025em; 548 --element-text-text-transform--body: none; 549 550 /* Body Font Sizes */ 551 --element-text-font-size--body: initial; 552 --element-text-font-size--body-xs: 10px; 553 --element-text-font-size--body-sm: 12px; 554 --element-text-font-size--body-md: 14px; 555 --element-text-font-size--body-lg: 16px; 556 557 /* Body Line Heights */ 558 --element-text-line-height--body: 1.6; 559 560 /* Heading Font Styles */ 561 --element-text-font-family--heading: Baskervville; 562 --element-text-font-family-fallback--heading: serif; 563 --element-text-font-weight--heading: 700; 564 --element-text-letter-spacing--heading: 0.0em; 565 566 567 568 569 /* Heading Font Sizes */ 570 --element-text-font-size--heading-2xl: 76px; 571 --element-text-font-size--heading-xl: 60px; 572 --element-text-font-size--heading-lg: 54px; 573 --element-text-font-size--heading-md: 52px; 574 --element-text-font-size--heading-sm: 46px; 575 --element-text-font-size--heading-xs: 44px; 576 577 /* Heading Line Heights */ 578 --element-text-line-height--heading: 1.1; 579 580 /* Buttons */ 581 /* ========================= */ 582 583 --element-button-radius: 0; 584 585 586 --element-button-padding-block: 12px; 587 --element-button-text-transform: uppercase; 588 --element-button-font-weight: 800; 589 --element-button-font-size: max(calc(var(--typeBaseSize) - 4px), 13px); 590 --element-button-letter-spacing: .3em; 591 592 /* Base Color Variables */ 593 --element-button-color-primary: #201f23; 594 --element-button-color-secondary: #ffffff; 595 --element-button-shade-border: 100%; 596 597 /* Hover State Variables */ 598 --element-button-shade-background--hover: 0%; 599 --element-button-shade-border--hover: 100%; 600 601 /* Focus State Variables */ 602 --element-button-color-focus: var(--color-focus); 603 604 /* Inputs */ 605 /* ========================= */ 606 607 --element-icon-radius: 0; 608 609 610 --element-input-font-size: var(--element-text-font-size--body-sm); 611 --element-input-box-shadow-shade: 100%; 612 613 /* Hover State Variables */ 614 --element-input-background-shade--hover: 0%; 615 --element-input-box-shadow-spread-radius--hover: 1px; 616 } 617 618 @media only screen and (max-width: 768px) { 619 :root { 620 --element-button-font-size: max(calc(var(--typeBaseSize) - 5px), 11px); 621 } 622 } 623 624 .element-radio { 625 &:has(input[type='radio']:checked) { 626 --element-button-color: var(--element-button-color-secondary); 627 } 628 } 629 630 /* ATC Button Overrides */ 631 /* ========================= */ 632 633 .element-button[type="submit"], 634 .element-button[type="submit"] .element-text, 635 .element-button--shopify-payment-wrapper button { 636 --element-button-padding-block: 13px; 637 --element-button-padding-inline: 20px; 638 --element-button-line-height: 1.42; 639 --_font-size--body-md: var(--element-button-font-size); 640 641 line-height: 1.42 !important; 642 } 643 644 /* When dynamic checkout is enabled */ 645 product-form:has(.element-button--shopify-payment-wrapper) { 646 --element-button-color: #2d2d2d; 647 648 .element-button[type="submit"], 649 .element-button--shopify-payment-wrapper button { 650 min-height: 50px !important; 651 } 652 653 .shopify-payment-button { 654 margin: 0; 655 } 656 } 657 658 /* Hover animation for non-angled buttons */ 659 body:not([data-button_style='angled']) .element-button[type="submit"] { 660 position: relative; 661 overflow: hidden; 662 663 &:after { 664 content: ''; 665 position: absolute; 666 top: 0; 667 left: 150%; 668 width: 200%; 669 height: 100%; 670 transform: skewX(-20deg); 671 background-image: linear-gradient(to right,transparent, rgba(255,255,255,.25),transparent); 672 } 673 674 &:hover:after { 675 animation: shine 0.75s cubic-bezier(0.01, 0.56, 1, 1); 676 } 677 } 678 679 /* ANGLED STYLE - ATC Button Overrides */ 680 /* ========================= */ 681 682 [data-button_style='angled'] { 683 --element-button-shade-background--active: var(--element-button-shade-background); 684 --element-button-shade-border--active: var(--element-button-shade-border); 685 686 .element-button[type="submit"] { 687 --_box-shadow: none; 688 689 position: relative; 690 max-width: 94%; 691 border-top: 1px solid #201f23; 692 border-bottom: 1px solid #201f23; 693 694 &:before, 695 &:after { 696 content: ''; 697 position: absolute; 698 display: block; 699 top: -1px; 700 bottom: -1px;
701 width: 20px; 702 transform: skewX(-12deg); 703 background-color: #201f23; 704 } 705 706 &:before { 707 left: -6px; 708 } 709 710 &:after { 711 right: -6px; 712 } 713 } 714 715 /* When dynamic checkout is enabled */ 716 product-form:has(.element-button--shopify-payment-wrapper) { 717 .element-button[type="submit"]:before, 718 .element-button[type="submit"]:after { 719 background-color: color-mix(in srgb,var(--_color-text) var(--_shade-background),var(--_color-background)); 720 border-top: 1px solid #201f23; 721 border-bottom: 1px solid #201f23; 722 } 723 724 .element-button[type="submit"]:before { 725 border-left: 1px solid #201f23; 726 } 727 728 .element-button[type="submit"]:after { 729 border-right: 1px solid #201f23; 730 } 731 } 732 733 .element-button--shopify-payment-wrapper { 734 --_color-background: #201f23; 735 736 button:hover, 737 button:before, 738 button:after { 739 background-color: color-mix(in srgb,var(--_color-text) var(--_shade-background),var(--_color-background)) !important; 740 } 741 742 button:not(button:focus-visible) { 743 box-shadow: none !important; 744 } 745 } 746 } 747 </style> 748 749
749<script src="//dreamcatchers.com/cdn/shop/t/373/assets/vendor-scripts-v11.js" defer="defer"></script>
749<link rel="stylesheet" href="//dreamcatchers.com/cdn/shop/t/373/assets/country-flags.css">
749<script src="//dreamcatchers.com/cdn/shop/t/373/assets/theme.js?v=112788892713901450091787942998" defer="defer"></script>
749 750 751 <!-- YotPo --> 752
752<script type="text/javascript">(function e(){var e=document.createElement("script");e.type="text/javascript",e.async=true,e.src="//staticw2.yotpo.com/t0tIiMhnh7iDygQ7Fbur1JxFPMMlKHXAakbOzh1U/widget.js";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})();</script>
752 753 754
754<script type="text/javascript"> 755 (function(c,l,a,r,i,t,y){ 756 c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; 757 t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i; 758 y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y); 759 })(window, document, "clarity", "script", "lwk281zko2"); 760 </script>
760 761 762 763 764<!-- BEGIN app block: shopify://apps/eg-auto-add-to-cart/blocks/app-embed/0f7d4f74-1e89-4820-aec4-6564d7e535d2 --> 765 766 767 768 769 770 771 772 773 774 775 776 777
777<script 778 async 779 type="text/javascript" 780 src="https://cdn.506.io/eg/script.js?shop=sm-dream.myshopify.com&v=12" 781 ></script>
781 782 783 784 785 786 <meta id="easygift-shop" itemid="c2hvcF8kXzE3OTAyOTQ1OTA=" content="{"isInstalled":true,"installedOn":"2025-11-24T22:53:46.379Z","appVersion":"3.0","subscriptionName":"Unlimited","cartAnalytics":true,"freeTrialEndsOn":null,"settings":{"reminderBannerStyle":{"position":{"horizontal":"right","vertical":"bottom"},"backgroundColor":"#FFFFFF","borderRadius":null,"padding":null,"headerFontSize":null,"subHeaderFontSize":null,"fontFamily":null,"closingMode":"doNotAutoClose","cssStyles":"","displayAfter":5,"headerText":"","imageUrl":null,"primaryColor":"#000000","reshowBannerAfter":"everyNewSession","selfcloseAfter":5,"showImage":false,"subHeaderText":""},"addedItemIdentifier":"_Gifted","ignoreOtherAppLineItems":null,"customVariantsInfoLifetimeMins":1440,"redirectPath":null,"ignoreNonStandardCartRequests":false,"bannerStyle":{"position":{"horizontal":"right","vertical":"bottom"},"backgroundColor":"#FFFFFF","borderRadius":null,"padding":null,"headerFontSize":null,"subHeaderFontSize":null,"fontFamily":null,"cssStyles":null,"primaryColor":"#000000"},"themePresetId":null,"notificationStyle":{"position":{"horizontal":null,"vertical":null},"backgroundColor":"#FFFFFF","borderRadius":null,"headerFontSize":null,"subHeaderFontSize":null,"padding":null,"fontFamily":null,"cssStyles":null,"duration":null,"hasCustomizations":false,"primaryColor":null},"fetchCartData":true,"useLocalStorage":{"enabled":false,"expiryMinutes":null},"popupStyle":{"buttonTextColor":null,"backgroundColor":"#FFFFFF","borderRadius":null,"padding":null,"headerFontSize":null,"subHeaderFontSize":null,"bodyColor":null,"bodyFontSize":null,"headerFontFamily":null,"bodyFontFamily":null,"closeModalOutsideClick":true,"priceShowZeroDecimals":true,"addButtonText":null,"cssStyles":null,"dismissButtonText":null,"hasCustomizations":false,"imageUrl":null,"outOfStockButtonText":null,"primaryColor":null,"secondaryColor":null,"showProductLink":false,"subscriptionLabel":null},"refreshAfterBannerClick":false,"disableReapplyRules":false,"disableReloadOnFailedAddition":true,"autoReloadCartPage":false,"ajaxRedirectPath":null,"allowSimultaneousRequests":false,"applyRulesOnCheckout":false,"enableCartCtrlOverrides":true,"customRedirectFromCart":null,"scriptSettings":{"branding":{"removalRequestSent":null,"show":false},"productPageRedirection":{"enabled":false,"products":[],"redirectionURL":"\/"},"debugging":{"enabled":true,"enabledOn":"2025-12-22T06:52:35.783Z","stringifyObj":true},"reApplyValueBasedRulesInCart":false,"disableRedirectAfterFormSubmit":false,"useFinalPriceGetEntireCart":true,"customCSS":null,"decodePayload":false,"delayUpdates":2000,"enableBuyNowInterceptions":false,"fetchCartDataBeforeRequest":true,"fetchProductInfoFromSavedDomain":false,"hideAlertsOnFrontend":false,"hideGiftedPropertyText":false,"removeEGPropertyFromSplitActionLineItems":false,"removeProductsAddedFromExpiredRules":true,"useFinalPrice":true},"promoCodeMessageStyle":{"message":"Free gift added!"},"egDiscount":{"cartValueStopCollectionCheck":false},"accessToEnterprise":true},"translations":null,"defaultLocale":"en","shopDomain":"dreamcatchers.com"}"> 787 788
789<script defer> 790 (async function() { 791 try { 792 793 const blockVersion = "v3" 794 if (blockVersion != "v3") { 795 return 796 } 797 798 let metaErrorFlag = false; 799 if (metaErrorFlag) { 800 return 801 } 802 803 // Parse metafields as JSON 804 const metafields = {"easygift-rule-692d7c50093eaff63625053b":{"schedule":{"enabled":false,"starts":null,"ends":null},"trigger":{"productTags":{"targets":[],"sellingPlan":null},"hybrid":null,"promoCode":null,"promoCodeDiscount":null,"type":"collection","minCartValue":null,"upperCartValue":null,"products":[],"collections":[{"gid":"gid:\/\/shopify\/Collection\/171760025659"}],"condition":null,"conditionMin":null,"conditionMax":null,"collectionSellingPlanType":null,"cartValueExcludedVariants":[]},"action":{"notification":{"enabled":false,"headerText":null,"subHeaderText":null,"showImage":false,"imageUrl":""},"discount":{"easygiftAppDiscount":false,"type":null,"id":null,"title":null,"createdByEasyGift":false,"code":null,"issue":null,"discountType":null,"value":null},"popupOptions":{"headline":null,"subHeadline":null,"showItemsPrice":false,"showVariantsSeparately":false,"popupDismissable":false,"imageUrl":null,"persistPopup":false,"rewardQuantity":1,"showDiscountedPrice":false,"hideOOSItems":false},"banner":{"enabled":false,"headerText":null,"subHeaderText":null,"showImage":false,"imageUrl":null,"displayAfter":"5","closingMode":"doNotAutoClose","selfcloseAfter":"5","reshowBannerAfter":"everyNewSession","redirectLink":null},"showPromoCodeMessage":false,"type":"addAutomatically","products":[{"variantId":"40314164871318","quantity":1}],"limit":1,"preventProductRemoval":true,"addAvailableProducts":false},"targeting":{"link":{"destination":null,"data":null,"cookieLifetime":14},"additionalCriteria":{"geo":{"include":[],"exclude":[]},"type":null,"customerTags":[],"customerTagsExcluded":[],"customerId":[],"orderCount":null,"hasOrderCountMax":false,"orderCountMax":null,"totalSpent":null,"hasTotalSpentMax":false,"totalSpentMax":null},"type":"all"},"settings":{"worksInReverse":true,"runsOncePerSession":false,"preventAddedItemPurchase":false,"showReminderBanner":false},"testMode":false,"_id":"692d7c50093eaff63625053b","name":"FREE Online Certification Training","active":true,"translations":null},"easygift-rule-699c89d6830f9a5b529b0d93":{"schedule":{"enabled":false,"starts":null,"ends":null},"trigger":{"productTags":{"targets":[],"sellingPlan":null},"hybrid":null,"type":"collection","promoCode":null,"promoCodeDiscount":null,"minCartValue":null,"upperCartValue":null,"products":[],"collections":[{"gid":"gid:\/\/shopify\/Collection\/481245004022"},{"gid":"gid:\/\/shopify\/Collection\/482717303030"}],"condition":null,"conditionMin":null,"conditionMax":null,"collectionSellingPlanType":null,"cartValueExcludedVariants":[]},"action":{"notification":{"enabled":false,"headerText":null,"subHeaderText":null,"showImage":false,"imageUrl":""},"discount":{"easygiftAppDiscount":false,"type":null,"id":null,"title":null,"createdByEasyGift":false,"code":null,"issue":null,"discountType":null,"value":null},"popupOptions":{"headline":null,"subHeadline":null,"showItemsPrice":false,"showVariantsSeparately":false,"popupDismissable":false,"imageUrl":null,"persistPopup":false,"rewardQuantity":1,"showDiscountedPrice":false,"hideOOSItems":false},"banner":{"enabled":false,"headerText":null,"subHeaderText":null,"showImage":false,"imageUrl":null,"displayAfter":"5","closingMode":"doNotAutoClose","selfcloseAfter":"5","reshowBannerAfter":"everyNewSession","redirectLink":null},"showPromoCodeMessage":false,"type":"addAutomatically","products":[{"variantId":"50024410120438","quantity":1,"alerts":[]}],"limit":1,"preventProductRemoval":false,"addAvailableProducts":false},"targeting":{"link":{"destination":null,"data":null,"cookieLifetime":14},"additionalCriteria":{"geo":{"include":[],"exclude":[]},"type":null,"customerTags":[],"customerTagsExcluded":[],"customerId":[],"orderCount":null,"hasOrderCountMax":false,"orderCountMax":null,"totalSpent":null,"hasTotalSpentMax":false,"totalSpentMax":null},"type":"all"},"settings":{"worksInReverse":true,"runsOncePerSession":false,"preventAddedItemPurchase":false,"showReminderBanner":false},"testMode":false,"_id":"699c89d6830f9a5b529b0d93","name":"FREE DreamLights Online Certification Training","active":true,"translations":null},"easygift-rule-6a47f93e1a0b0e5f8fc58841":{"schedule":{"enabled":false,"starts":null,"ends":null},"trigger":{"productTags":{"targets":[],"sellingPlan":null},"hybrid":null,"type":"productsInclude","promoCode":null,"promoCodeDiscount":null,"minCartValue":null,"upperCartValue":null,"products":[{"variantId":48666901381366,"sellingPlans":[]},{"variantId":48666901414134,"sellingPlans":[]},{"variantId":48666901446902,"sellingPlans":[]},{"variantId":48666901479670,"sellingPlans":[]},{"variantId":48666901512438,"sellingPlans":[]},{"variantId":48666905510134,"sellingPlans":[]},{"variantId":48666901545206,"sellingPlans":[]},{"variantId":48666901577974,"sellingPlans":[]},{"variantId":48666901610742,"sellingPlans":[]},{"variantId":48666901676278,"sellingPlans":[]},{"variantId":48666901709046,"sellingPlans":[]},{"variantId":51128595513590,"sellingPlans":[]}],"cartValueExcludedVariants":[],"collections":[],"condition":"quantity","conditionMin":1,"conditionMax":null,"collectionSellingPlanType":null},"action":{"notification":{"enabled":false,"headerText":null,"subHeaderText":null,"showImage":false,"imageUrl":""},"discount":{"type":null,"title":null,"code":null,"id":null,"createdByEasyGift":false,"issue":null,"value":null,"discountType":null,"easygiftAppDiscount":false},"popupOptions":{"headline":null,"subHeadline":null,"showItemsPrice":false,"popupDismissable":false,"imageUrl":null,"persistPopup":false,"rewardQuantity":1,"showDiscountedPrice"
804:false,"hideOOSItems":false,"showVariantsSeparately":false},"banner":{"enabled":false,"headerText":null,"imageUrl":null,"subHeaderText":null,"showImage":false,"displayAfter":"5","closingMode":"doNotAutoClose","selfcloseAfter":"5","reshowBannerAfter":"everyNewSession","redirectLink":null},"type":"addAutomatically","products":[{"variantId":"51162114883830","quantity":1,"alerts":[{"type":"outOfStock","triggered":false}]}],"limit":1,"preventProductRemoval":false,"addAvailableProducts":false,"showPromoCodeMessage":false},"targeting":{"link":{"destination":null,"data":null,"cookieLifetime":14},"additionalCriteria":{"geo":{"include":[],"exclude":[]},"type":null,"customerTags":[],"customerTagsExcluded":[],"customerId":[],"orderCount":null,"hasOrderCountMax":false,"orderCountMax":null,"totalSpent":null,"hasTotalSpentMax":false,"totalSpentMax":null},"type":"all"},"settings":{"worksInReverse":true,"runsOncePerSession":false,"preventAddedItemPurchase":true,"showReminderBanner":false},"_id":"6a47f93e1a0b0e5f8fc58841","name":"Free DreamCatchers Snaggle Twist Brush","active":true,"translations":null,"testMode":false}}; 805 806 // Process metafields in JavaScript 807 let savedRulesArray = []; 808 for (const [key, value] of Object.entries(metafields)) { 809 if (value) { 810 for (const prop in value) { 811 // avoiding Object.Keys for performance gain -- no need to make an array of keys. 812 savedRulesArray.push(value); 813 break; 814 } 815 } 816 } 817 818 const metaTag = document.createElement('meta'); 819 metaTag.id = 'easygift-rules'; 820 metaTag.content = JSON.stringify(savedRulesArray); 821 metaTag.setAttribute('itemid', 'cnVsZXNfJF8xNzkwMjk0NTkw'); 822 823 document.head.appendChild(metaTag); 824 } catch (err) { 825 826 } 827 })(); 828</script>
828 829 830 831
831<script 832 type="text/javascript" 833 defer 834 > 835 836 (function () { 837 try { 838 window.EG_INFO = window.EG_INFO || {}; 839 var shopInfo = {"isInstalled":true,"installedOn":"2025-11-24T22:53:46.379Z","appVersion":"3.0","subscriptionName":"Unlimited","cartAnalytics":true,"freeTrialEndsOn":null,"settings":{"reminderBannerStyle":{"position":{"horizontal":"right","vertical":"bottom"},"backgroundColor":"#FFFFFF","borderRadius":null,"padding":null,"headerFontSize":null,"subHeaderFontSize":null,"fontFamily":null,"closingMode":"doNotAutoClose","cssStyles":"","displayAfter":5,"headerText":"","imageUrl":null,"primaryColor":"#000000","reshowBannerAfter":"everyNewSession","selfcloseAfter":5,"showImage":false,"subHeaderText":""},"addedItemIdentifier":"_Gifted","ignoreOtherAppLineItems":null,"customVariantsInfoLifetimeMins":1440,"redirectPath":null,"ignoreNonStandardCartRequests":false,"bannerStyle":{"position":{"horizontal":"right","vertical":"bottom"},"backgroundColor":"#FFFFFF","borderRadius":null,"padding":null,"headerFontSize":null,"subHeaderFontSize":null,"fontFamily":null,"cssStyles":null,"primaryColor":"#000000"},"themePresetId":null,"notificationStyle":{"position":{"horizontal":null,"vertical":null},"backgroundColor":"#FFFFFF","borderRadius":null,"headerFontSize":null,"subHeaderFontSize":null,"padding":null,"fontFamily":null,"cssStyles":null,"duration":null,"hasCustomizations":false,"primaryColor":null},"fetchCartData":true,"useLocalStorage":{"enabled":false,"expiryMinutes":null},"popupStyle":{"buttonTextColor":null,"backgroundColor":"#FFFFFF","borderRadius":null,"padding":null,"headerFontSize":null,"subHeaderFontSize":null,"bodyColor":null,"bodyFontSize":null,"headerFontFamily":null,"bodyFontFamily":null,"closeModalOutsideClick":true,"priceShowZeroDecimals":true,"addButtonText":null,"cssStyles":null,"dismissButtonText":null,"hasCustomizations":false,"imageUrl":null,"outOfStockButtonText":null,"primaryColor":null,"secondaryColor":null,"showProductLink":false,"subscriptionLabel":null},"refreshAfterBannerClick":false,"disableReapplyRules":false,"disableReloadOnFailedAddition":true,"autoReloadCartPage":false,"ajaxRedirectPath":null,"allowSimultaneousRequests":false,"applyRulesOnCheckout":false,"enableCartCtrlOverrides":true,"customRedirectFromCart":null,"scriptSettings":{"branding":{"removalRequestSent":null,"show":false},"productPageRedirection":{"enabled":false,"products":[],"redirectionURL":"\/"},"debugging":{"enabled":true,"enabledOn":"2025-12-22T06:52:35.783Z","stringifyObj":true},"reApplyValueBasedRulesInCart":false,"disableRedirectAfterFormSubmit":false,"useFinalPriceGetEntireCart":true,"customCSS":null,"decodePayload":false,"delayUpdates":2000,"enableBuyNowInterceptions":false,"fetchCartDataBeforeRequest":true,"fetchProductInfoFromSavedDomain":false,"hideAlertsOnFrontend":false,"hideGiftedPropertyText":false,"removeEGPropertyFromSplitActionLineItems":false,"removeProductsAddedFromExpiredRules":true,"useFinalPrice":true},"promoCodeMessageStyle":{"message":"Free gift added!"},"egDiscount":{"cartValueStopCollectionCheck":false},"accessToEnterprise":true},"translations":null,"defaultLocale":"en","shopDomain":"dreamcatchers.com"}; 840 var productRedirectionEnabled = shopInfo.settings.scriptSettings.productPageRedirection.enabled; 841 if (["Unlimited", "Enterprise"].includes(shopInfo.subscriptionName) && productRedirectionEnabled) { 842 var products = shopInfo.settings.scriptSettings.productPageRedirection.products; 843 if (products.length > 0) { 844 var productIds = products.map(function(prod) { 845 var productGid = prod.id; 846 var productIdNumber = parseInt(productGid.split('/').pop()); 847 return productIdNumber; 848 }); 849 var productInfo = null; 850 var isProductInList = productIds.includes(productInfo.id); 851 if (isProductInList) { 852 var redirectionURL = shopInfo.settings.scriptSettings.productPageRedirection.redirectionURL; 853 if (redirectionURL) { 854 window.location = redirectionURL; 855 } 856 } 857 } 858 } 859 860 861 } catch(err) { 862 return 863 }}
863)() 864 </script>
864 865 866 867 868<!-- END app block --><!-- BEGIN app block: shopify://apps/microsoft-clarity/blocks/clarity_js/31c3d126-8116-4b4a-8ba1-baeda7c4aeea -->
869<script type="text/javascript"> 870 (function (c, l, a, r, i, t, y) { 871 c[a] = c[a] || function () { (c[a].q = c[a].q || []).push(arguments); }; 872 t = l.createElement(r); t.async = 1; t.src = "https://www.clarity.ms/tag/" + i + "?ref=shopify"; 873 y = l.getElementsByTagName(r)[0]; y.parentNode.insertBefore(t, y); 874 875 c.Shopify.loadFeatures([{ name: "consent-tracking-api", version: "0.1" }], error => { 876 if (error) { 877 console.error("Error loading Shopify features:", error); 878 return; 879 } 880 881 c[a]('consentv2', { 882 ad_Storage: c.Shopify.customerPrivacy.marketingAllowed() ? "granted" : "denied", 883 analytics_Storage: c.Shopify.customerPrivacy.analyticsProcessingAllowed() ? "granted" : "denied", 884 source: 101, 885 }); 886 }); 887 888 l.addEventListener("visitorConsentCollected", function (e) { 889 c[a]('consentv2', { 890 ad_Storage: e.detail.marketingAllowed ? "granted" : "denied", 891 analytics_Storage: e.detail.analyticsAllowed ? "granted" : "denied", 892 source: 101, 893 }); 894 }); 895 })(window, document, "clarity", "script", "utbu58j1ae"); 896</script>
896 897 898 899 900<!-- END app block --><!-- BEGIN app block: shopify://apps/thoughtmetric/blocks/tm/5a9f9e10-3a9f-41b1-8250-d2eab3bd19a4 -->
900<script> 901 !function(t,e,i){if(!t.thoughtmetric){t.thoughtmetricQueue=t.thoughtmetricQueue||[],t.thoughtmetric=t.thoughtmetric||function(){t.thoughtmetricQueue.push(arguments)};var u=e.createElement("script");u.async=!0,u.src="/apps/data/init.js";var h=e.getElementsByTagName("script")[0];h.parentNode.insertBefore(u,h)}}(window,document); 902 thoughtmetric("init","ID-fc32e7caa6cdd3ef"); thoughtmetric("pageview"); 903</script>
903 904 905 906 907<!-- END app block --><!-- BEGIN app block: shopify://apps/candy-rack/blocks/head/cb9c657f-334f-4905-80c2-f69cca01460c -->
907<script src="https://cdn.shopify.com/extensions/01a0d31b-101d-739a-9ef9-4af26e65e564/candyrack-633/assets/main.js?shop=sm-dream.myshopify.com" async></script>
907 908 909 910 911 912<!-- END app block --><!-- BEGIN app block: shopify://apps/klaviyo-email-marketing-sms/blocks/klaviyo-onsite-embed/2632fe16-c075-4321-a88b-50b567f42507 --> 913 914 915 916 917 918 919 920 921 922 923 924 925
925<script async src="https://static.klaviyo.com/onsite/js/M9YDBm/klaviyo.js?company_id=M9YDBm"></script>
925 926
926<script>!function(){if(!window.klaviyo){window._klOnsite=window._klOnsite||[];try{window.klaviyo=new Proxy({},{get:function(n,i){return"push"===i?function(){var n;(n=window._klOnsite).push.apply(n,arguments)}:function(){for(var n=arguments.length,o=new Array(n),w=0;w<n;w++)o[w]=arguments[w];var t="function"==typeof o[o.length-1]?o.pop():void 0,e=new Promise((function(n){window._klOnsite.push([i].concat(o,[function(i){t&&t(i),n(i)}]))}));return e}}})}catch(n){window.klaviyo=window.klaviyo||[],window.klaviyo.push=function(){var n;(n=window._klOnsite).push.apply(n,arguments)}}}}();</script>
926 927 928 929 930 931 932 933
933<script> 934 window.klaviyoReviewsProductDesignMode = false 935 </script>
935 936 937 938 939 940 941 942 943 944 945<!-- END app block --><!-- BEGIN app block: shopify://apps/microsoft-clarity/blocks/brandAgents_js/31c3d126-8116-4b4a-8ba1-baeda7c4aeea --> 946 947 948
949<script type="text/javascript"> 950 (function(d){ 951 var s = d.createElement('script'); 952 s.async = true; 953 s.src = "https://adsagentclientafd-b7hqhjdrf3fpeqh2.b01.azurefd.net/frontendInjection.js"; 954 var firstScript = d.getElementsByTagName('script')[0]; 955 firstScript.parentNode.insertBefore(s, firstScript); 956 })(document); 957</script>
957 958 959 960 961<!-- END app block --><!-- BEGIN app block: shopify://apps/yotpo-product-reviews/blocks/settings/eb7dfd7d-db44-4334-bc49-c893b51b36cf --> 962 963 964
964<script type="text/javascript" src="https://cdn-widgetsrepository.yotpo.com/v1/loader/t0tIiMhnh7iDygQ7Fbur1JxFPMMlKHXAakbOzh1U?languageCode=en" async></script>
964 965 966 967 968 969<!-- END app block --><!-- BEGIN app block: shopify://apps/triplewhale/blocks/triple_pixel_snippet/483d496b-3f1a-4609-aea7-8eee3b6b7a2a --><link rel='preconnect dns-prefetch' href='https://api.config-security.com/' crossorigin /> 970<link rel='preconnect dns-prefetch' href='https://conf.config-security.com/' crossorigin />
971<script> 972/* >> TriplePixel :: start*/ 973window.TriplePixelData={TripleName:"sm-dream.myshopify.com",ver:"2.16",plat:"SHOPIFY",isHeadless:false,src:'SHOPIFY_EXT',product:{id:"",name:``,price:"",variant:"",av:{ }},search:"",collection:"",cart:"drawer",template:"cart",curr:"USD" || "USD", market:"85754102"},function(W,H,A,L,E,_,B,N){function O(U,T,P,H,R){void 0===R&&(R=!1),H=new XMLHttpRequest,P?(H.open("POST",U,!0),H.setRequestHeader("Content-Type","text/plain")):H.open("GET",U,!0),H.send(JSON.stringify(P||{})),H.onreadystatechange=function(){4===H.readyState&&200===H.status?(R=H.responseText,U.includes("/first")?eval(R):P||(N[B]=R)):(299<H.status||H.status<200)&&T&&!R&&(R=!0,O(U,T-1,P))}}if(N=window,!N[H+"sn"]){N[H+"sn"]=1,L=function(){return Date.now().toString(36)+"_"+Math.random().toString(36)};try{A.setItem(H,1+(0|A.getItem(H)||0)),(E=JSON.parse(A.getItem(H+"U")||"[]")).push({u:location.href,r:document.referrer,t:Date.now(),id:L()}),A.setItem(H+"U",JSON.stringify(E))}catch(e){}var i,m,p;A.getItem('"!nC`')||(_=A,A=N,A[H]||(E=A[H]=function(t,e,i){return void 0===i&&(i=[]),"State"==t?E.s:(W=L(),(E._q=E._q||[]).push([W,t,e].concat(i)),W)},E.s="Installed",E._q=[],E.ch=W,B="configSecurityConfModel",N[B]=1,O("https://conf.config-security.com/model",5),i=L(),m=A[atob("c2NyZWVu")],_.setItem("di_pmt_wt",i),p={id:i,action:"profile",avatar:_.getItem("auth-security_rand_salt_"),time:m[atob("d2lkdGg=")]+":"+m[atob("aGVpZ2h0")],host:A.TriplePixelData.TripleName,plat:A.TriplePixelData.plat,url:window.location.href.slice(0,500),ref:document.referrer,ver:A.TriplePixelData.ver},O("https://api.config-security.com/event",5,p),O("https://api.config-security.com/first?host=".concat(p.host,"&plat=").concat(p.plat),5)))}}("","TriplePixel",localStorage); 974/* << TriplePixel :: end*/ 975</script>
975 976 977 978 979<!-- END app block --><!-- BEGIN app block: shopify://apps/pagefly-ai-page-builder/blocks/app-embed/83e179f7-59a0-4589-8c66-c0dddf959200 --> 980 981<!-- BEGIN app snippet: pagefly-cro-ab-testing-main --> 982 983 984 985 986 987 988
989<script> 990 ;(function () { 991 const url = new URL(window.location) 992 const viewParam = url.searchParams.get('view') 993 if (viewParam && viewParam.includes('variant-pf-')) { 994 url.searchParams.set('pf_v', viewParam) 995 url.searchParams.delete('view') 996 window.history.replaceState({}, '', url) 997 } 998 })() 999</script>
999 1000 1001 1002
1003<script type='module'> 1004 1005 window.PAGEFLY_CRO = window.PAGEFLY_CRO || {} 1006 1007 window.PAGEFLY_CRO['data_debug'] = { 1008 original_template_suffix: "", 1009 allow_ab_test: false, 1010 ab_test_start_time: 0, 1011 ab_test_end_time: 0, 1012 today_date_time: 1790294590000, 1013 } 1014 window.PAGEFLY_CRO['GA4'] = { enabled: false} 1015</script>
1015 1016 1017<!-- END app snippet --> 1018 1019 1020 1021 1022 1023 1024 1025 1026
1026<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-helper.js' defer='defer'></script>
1026 1027 1028
1028<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-general-helper.js' defer='defer'></script>
1028 1029 1030
1030<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-snap-slider.js' defer='defer'></script>
1030 1031 1032
1032<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-slideshow-v3.js' defer='defer'></script>
1032 1033 1034
1034<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-slideshow-v4.js' defer='defer'></script>
1034 1035 1036
1036<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-glider.js' defer='defer'></script>
1036 1037 1038
1038<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-slideshow-v1-v2.js' defer='defer'></script>
1038 1039 1040
1040<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-product-media.js' defer='defer'></script>
1040 1041 1042
1042<script src='https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-product.js' defer='defer'></script>
1042 1043 1044
1045<script id='pagefly-helper-data' type='application/json'> 1046 { 1047 "page_optimization": { 1048 "assets_prefetching": false 1049 }, 1050 "elements_asset_mapper": { 1051 "Accordion": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-accordion.js", 1052 "Accordion3": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-accordion3.js", 1053 "CountDown": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-countdown.js", 1054 "GMap1": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-gmap.js", 1055 "GMap2": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-gmap.js", 1056 "GMapBasicV2": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-gmap.js", 1057 "GMapAdvancedV2": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-gmap.js", 1058 "HTML.Video": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-htmlvideo.js", 1059 "HTML.Video2": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-htmlvideo2.js", 1060 "HTML.Video3": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-htmlvideo2.js", 1061 "BackgroundVideo": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-htmlvideo2.js", 1062 "Instagram": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-instagram.js", 1063 "Instagram2": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-instagram.js", 1064 "Insta3": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-instagram3.js", 1065 "Tabs": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-tab.js", 1066 "Tabs3": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-tab3.js", 1067 "ProductBox": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-cart.js", 1068 "FBPageBox2": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-facebook.js", 1069 "FBLikeButton2": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-facebook.js", 1070 "TwitterFeed2": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-twitter.js", 1071 "Paragraph4": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-paragraph4.js", 1072 1073 "AliReviews": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js", 1074 "BackInStock": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js", 1075 "GloboBackInStock": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js", 1076 "GrowaveWishlist": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js", 1077 "InfiniteOptionsShopPad": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js", 1078 "InkybayProductPersonalizer": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder
1078-358/assets/pagefly-3rd-elements.js", 1079 "LimeSpot": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js", 1080 "Loox": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js", 1081 "Opinew": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js", 1082 "Powr": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js", 1083 "ProductReviews": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js", 1084 "PushOwl": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js", 1085 "ReCharge": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js", 1086 "Rivyo": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js", 1087 "TrackingMore": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js", 1088 "Vitals": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js", 1089 "Wiser": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-3rd-elements.js" 1090 }, 1091 "custom_elements_mapper": { 1092 "pf-click-action-element": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-click-action-element.js", 1093 "pf-dialog-element": "https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-dialog-element.js" 1094 } 1095 } 1096</script>
1096 1097
1098<script id='pagefly-heatmap-config' type='application/json'> 1099 {} 1100</script>
vendor: 1 bytes, line 1100
1100
1101<script> 1102 (function () { 1103 var el = document.getElementById('pagefly-heatmap-config') 1104 if (!el) { window.__pagefly_heatmap_config__ = {}; return } 1105 try { 1106 window.__pagefly_heatmap_config__ = JSON.parse(el.textContent || '{}') || {} 1107 } catch (e) { 1108 window.__pagefly_heatmap_config__ = {} 1109 } 1110 })() 1111</script>
vendor: 1 bytes, line 1111
1111
1112<script> 1113 // Heatmap overlay loader. Three gates, all of them cheap, none of them trusting the URL: 1114 // the visitor must have arrived on a pf_heatmap link, the SERVER must have published an 1115 // overlay path in the metafield, and this page must already be one the merchant enabled 1116 // tracking for. The last gate is what stops a crafted link pulling the asset onto an 1117 // arbitrary storefront page. Everything else is decided inside the asset, and by the server. 1118 (function () { 1119 var cfg = window.__pagefly_heatmap_config__ || {} 1120 var id = (window.__pagefly_page_setting__ || {}).pageId 1121 if (!/[#&]pf_heatmap=/.test(window.location.hash || '')) return 1122 if (!cfg.overlay_data_path || !Array.isArray(cfg.enabled_page_ids)) return 1123 if (!id || cfg.enabled_page_ids.indexOf(id) === -1) return 1124 var s = document.createElement('script') 1125 s.src = 'https://cdn.shopify.com/extensions/01a0cd11-9bda-742e-87f0-b3e83c926dd7/pagefly-ai-page-builder-358/assets/pagefly-heatmap-overlay.js' 1126 s.defer = true 1127 document.head.appendChild(s) 1128 })() 1129</script>
1129 1130 1131<!-- BEGIN app snippet: pf-ai-schema --> 1132<!-- END app snippet --> 1133 1134 1135<!-- END app block --><!-- BEGIN app block: shopify://apps/crisp-live-chat-chatbot/blocks/app-embed/5c3cfd5f-01d4-496a-891b-f98ecf27ff08 -->
1135<script> 1136 if ("7e1928bf-65c7-4e39-b25d-5b53b428d2b3") { 1137 let _locale = ""; 1138 1139 window.CRISP_READY_TRIGGER = function () { 1140 window.CRISP_SESSION_ID = $crisp.get("session:identifier"); 1141 postCart(); 1142 postCustomerID(); 1143 1144 // Set session segment (only after first message is sent) 1145 $crisp.push(["on", "message:sent", () => { 1146 $crisp.push(["set", "session:segments", [["shopify"]]]); 1147 $crisp.push(["off", "message:sent"]); 1148 }]) 1149 }; 1150 1151 if (window?.Weglot?.getCurrentLang && typeof(typeof(Weglot?.getCurrentLang) === "function")) { 1152 _locale = Weglot?.getCurrentLang(); 1153 } else if (Shopify?.locale) { 1154 _locale = Shopify.locale; 1155 } 1156 1157 if (_locale) { 1158 CRISP_RUNTIME_CONFIG = { 1159 locale : _locale 1160 }; 1161 } 1162 1163 window.$crisp=[]; 1164 window.CRISP_WEBSITE_ID="7e1928bf-65c7-4e39-b25d-5b53b428d2b3"; 1165 (function(){d=document;s=d.createElement("script"); 1166 s.src="https://client.crisp.chat/l.js"; 1167 s.async=1; 1168 d.getElementsByTagName("head")[0].appendChild(s); 1169 })(); 1170 } 1171</script>
1171 1172 1173<!-- END app block --><!-- BEGIN app block: shopify://apps/elevar-conversion-tracking/blocks/dataLayerEmbed/bc30ab68-b15c-4311-811f-8ef485877ad6 --> 1174 1175 1176
1177<script type="module" dynamic> 1178 const configUrl = "/a/elevar/static/configs/2b6de5be4eac7c6181eceea5742003305d682126/config.js"; 1179 const config = (await import(configUrl)).default; 1180 const scriptUrl = config.script_src_app_theme_embed; 1181 1182 if (scriptUrl) { 1183 const { handler } = await import(scriptUrl); 1184 1185 await handler( 1186 config, 1187 { 1188 cartData: { 1189 marketId: "85754102", 1190 localeCountryCode:"US", 1191 attributes:{}, 1192 cartTotal: "0.0", 1193 currencyCode:"USD", 1194 items: [] 1195} 1196, 1197 user: { 1198 cartTotal: "0.0", 1199 currencyCode:"USD", 1200 customer: {}, 1201} 1202, 1203 isOnCartPage:true, 1204 collectionView:null, 1205 searchResultsView:null, 1206 productView:null, 1207 } 1208 ); 1209 } 1210</script>
1210 1211 1212 1213<!-- END app block -->
1213<script src="https://cdn.shopify.com/extensions/019b03f2-1cc6-73dd-a349-2821a944dacf/crisp-chatbox-14/assets/crisp.js" type="text/javascript" defer="defer"></script>
1213 1214<link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
1215<script>(function(){if ("sendBeacon" in navigator && "performance" in window) {try {var session_token_from_headers = performance.getEntriesByType('navigation')[0].serverTiming.find(x => x.name == '_s').description;} catch {var session_token_from_headers = undefined;}var session_cookie_matches = document.cookie.match(/_shopify_s=([^;]*)/);var session_token_from_cookie = session_cookie_matches && session_cookie_matches.length === 2 ? session_cookie_matches[1] : "";var session_token = session_token_from_headers || session_token_from_cookie || "";function handle_abandonment_event(e) {var entries = performance.getEntries().filter(function(entry) {return /monorail-edge.shopifysvc.com/.test(entry.name);});if (!window.abandonment_tracked && entries.length === 0) {window.abandonment_tracked = true;var currentMs = Date.now();var navigation_start = performance.timing.navigationStart;var payload = {shop_id: 13094256699,url: window.location.href,navigation_start,duration: currentMs - navigation_start,session_token,page_type: "cart"};window.navigator.sendBeacon("https://monorail-edge.shopifysvc.com/v1/produce", JSON.stringify({schema_id: "online_store_buyer_site_abandonment/1.1",payload: payload,metadata: {event_created_at_ms: currentMs,event_sent_at_ms: currentMs}}));}}window.addEventListener('pagehide', handle_abandonment_event);}}());</script>
vendor: 1 bytes, line 1215
1215
1216<script> 1217 window.__TREKKIE_SHIM_QUEUE = window.__TREKKIE_SHIM_QUEUE || []; 1218</script>
vendor: 1 bytes, line 1218
1218
1219<script>(function(){var wpmLoader=function(){"use strict";var e=/Googlebot|Storebot-Google|bingbot|Baiduspider|YandexBot|DuckDuckBot|Slurp|facebookexternalhit|Twitterbot|LinkedInBot|Applebot|AdsBot-Google|Mediapartners-Google|APIs-Google|PetalBot|SemrushBot|AhrefsBot|MJ12bot|DotBot|Acunetix|PerplexityBot|Perplexity-User/i,t=/bytedance/i;function i(){try{var e=document.cookie;if(!e||"string"!=typeof e)return;for(var t=0,i=e.split(";");t<i.length;t++){var n=i[t],r=n.indexOf("=");if(-1!==r){var o=n.slice(0,r).trim();if(o){var a=void 0;try{a=decodeURIComponent(o)}catch(e){a=o}if("_shopify_s"===a){var d=n.slice(r+1).trim();try{return decodeURIComponent(d)}catch(e){return d}}}}}return}catch(e){return}}function n(e){try{"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn(e)}catch(e){}}function r(e,t){return"string"==typeof e&&e.length>0&&e.length<=t?e:void 0}function o(e){var t;switch(null==(t=null==e?void 0:e.navigation)?void 0:t.type){case 0:return"navigate";case 1:return"reload";case 2:return"back_forward";default:return}}function a(){var e,t,i;try{var n=null==(i=null==(t=null==(e=self.ShopifyAnalytics)?void 0:e.lib)?void 0:t.trekkie)?void 0:i.state;return"awaiting-consent"===n||"initialized"===n?n:void 0}catch(e){return}}return function(d,s,u,l){var c=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};try{var p=c.trekkieShim;!0!==p&&"true"!==p||null!=window.__TREKKIE_SHIM_QUEUE||(window.__TREKKIE_SHIM_QUEUE=[])}catch(e){}var f,v,h,y,g=(v=(f={modern:/Edge?\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Firefox\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Chrom(ium|e)\/(9{2}|\d{3,})\.\d+(\.\d+|)|(Maci|X1{2}).+ Version\/(15\.\d+|(1[6-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(9{2}|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(15[._]\d+|(1[6-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|SamsungBrowser\/([2-9]\d|\d{3,})\.\d+/,legacy:/Edge?\/(1[6-9]|[2-9]\d|\d{3,})\.\d+(\.\d+|)|Firefox\/(5[4-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)|Chrom(ium|e)\/(5[1-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)([\d.]+$|.*Safari\/(?![\d.]+ Edge\/[\d.]+$))|(Maci|X1{2}).+ Version\/(10\.\d+|(1[1-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(3[89]|[4-9]\d|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(10[._]\d+|(1[1-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Mobile Safari.+OPR\/([89]\d|\d{3,})\.\d+\.\d+|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+(UC? ?Browser|UCWEB|U3)[ /]?(15\.([5-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})\.\d+)\.\d+|SamsungBrowser\/(5\.\d+|([6-9]|\d{2,})\.\d+)|Android.+MQ{2}Browser\/(14(\.(9|\d{2,})|)|(1[5-9]|[2-9]\d|\d{3,})(\.\d+|))(\.\d+|)|K[Aa][Ii]OS\/(3\.\d+|([4-9]|\d{2,})\.\d+)(\.\d+|)/}).modern,h=f.legacy,(y=navigator.userAgent).match(e)?"bot":y.match(v)?"modern":y.match(h)?"legacy":y.match(t)?"bot":"unknown"),m=function(e){var t,i,n=r(e,128);try{var a=window.performance,d=null==(t=null==a?void 0:a.getEntriesByType)?void 0:t.call(a,"navigation")[0];if(!d)return{requestId:n,navigationType:o(a)};var s="type"in d?r(d.type,64):void 0,u="serverTiming"in d&&Array.isArray(d.serverTiming)?d.serverTiming:[];return{requestId:null!=n?n:r(null==(i=u.find(function(e){return"requestID"===e.name}))?void 0:i.description,128),navigationType:s}}catch(e){return{requestId:n}}}(c.requestId),w=function(e){var t=e.version,r=e.browserTarget,o=e.surface,a=e.shopId,d=e.monorailEndpoint,s=window.location.href;return{emit:function(e){var u=e.status,l=e.errorMsg,c=e.failureReason,p=e.useKeepaliveFallback,f=void 0!==p&&p,v=e.navigationType,h=e.pagehidePersisted,y=e.requestId,g=e.trekkieState;if(d){var m,w;try{var b=(new Date).getTime();m=JSON.stringify({metadata:{event_sent_at_ms:b},events:[{schema_id:"web_pixels_manager_load/3.3",payload:{version:t,bundle_target:r,page_url:s,status:u,surface:o,error_msg:l,failure_reason:c,navigation_type:v,pagehide_persisted:h,request_id:y,trekkie_state:g,shop_id:a,visit_token:i()},metadata:{event_created_at_ms:b}}]})}catch(e){return}try{if("function"==typeof window.navigator.sendBeacon&&-1===(w=window.navigator.userAgent).indexOf("iPhone; CPU iPhone OS 12_")&&-1===w.indexOf("iPad; CPU OS 12_")&&-1===w.indexOf("iPod touch; CPU iPhone OS 12_")&&window.navigator.sendBeacon.bind(window.navigator)(d,m))return}catch(e){}if(f)try{"function"==typeof window.fetch&&window.fetch(d,{method:"POST",headers:{"Content-Type":"text/plain"},body:m,keepalive:!0}
1219).catch(function(){})}catch(e){}else try{var _=new XMLHttpRequest;_.open("POST",d,!0),_.setRequestHeader("Content-Type","text/plain"),_.send(m)}catch(e){n("[Web Pixels Manager] Got an unhandled error while logging to Monorail.")}}else n("[Web Pixels Manager] No Monorail endpoint provided, skipping logging.")}}}({version:u,browserTarget:g,surface:d.surface,shopId:d.shopId,monorailEndpoint:d.monorailEndpoint});if(Boolean(null==(_=null==(b=window.Shopify)?void 0:b.analytics)?void 0:_.replayQueue))w.emit({status:"setup-skipped",errorMsg:"replay queue already initialized."});else{var b,_;w.emit({status:"setup-started"}),window.Shopify=window.Shopify||{};var S=window.Shopify;S.analytics=S.analytics||{};var P=S.analytics;P.replayQueue=[],P.publish=function(e,t,i){return P.replayQueue.push([e,t,i]),!0};try{self.performance.mark("wpm:start")}catch(e){}var k,C="modern"===g?"modern":"legacy",E=(null!=l?l:{modern:"",legacy:""})[C],I=[(k={baseUrl:s,hashVersion:u,buildTarget:C}).baseUrl,"/wpm","/b",k.hashVersion,"modern"===k.buildTarget?"m":"l",".js"].join(""),O=!1,T=!1;try{c.browserTarget=g,function(){O=!0;try{window.addEventListener("pagehide",M)}catch(e){O=!1}}(),R(function(){try{R(x)}catch(e){D(e)}}),w.emit({status:"loading",requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()})}catch(e){D(e)}}function U(){var e;if(q(),!function(){var e,t;return Boolean(null==(t=null==(e=window.Shopify)?void 0:e.analytics)?void 0:t.initialized)}()){var t,i,n;try{if("function"!=typeof(null==(e=window.webPixelsManager)?void 0:e.init))return void A();if(!(null!==(n=i=t=window.webPixelsManager.init(d))&&"function"!=typeof n&&Object(n)===n&&"publish"in i&&"function"==typeof i.publish&&"publishCustomEvent"in i&&"function"==typeof i.publishCustomEvent&&"visitor"in i&&"function"==typeof i.visitor))return void A()}catch(e){return void A(e)}var r=window.Shopify.analytics;r.replayQueue.forEach(function(e){var i=e[0],n=e[1],r=e[2];t.publishCustomEvent(i,n,r)}),r.replayQueue=[],r.publish=t.publishCustomEvent,r.visitor=t.visitor,r.initialized=!0}}function A(e){B("manager_api_unavailable",void 0===e?void 0:Q(e))}function x(){B("script_load_failed","".concat(I," has failed to load"))}function B(e,t){T||(T=!0,q(),w.emit({status:"failed",errorMsg:t,failureReason:e,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function M(e){O&&(q(),w.emit({status:"pagehide-while-loading",useKeepaliveFallback:!0,pagehidePersisted:e.persisted,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function q(){O=!1;try{window.removeEventListener("pagehide",M)}catch(e){}}function R(e){var t;!function(e){var t=e.src,i=e.async,n=void 0===i||i,r=e.onload,o=e.onerror,a=e.sri,d=e.scriptDataAttributes,s=void 0===d?{}:d,u=document.createElement("script"),l=document.querySelector("head"),c=document.querySelector("body");if(u.async=n,u.src=t,a&&(u.integrity=a,u.crossOrigin="anonymous"),s)for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))try{u.dataset[p]=String(s[p])}catch(e){}if(r&&u.addEventListener("load",r),o&&u.addEventListener("error",o),l)l.appendChild(u);else{if(!c)throw new Error("Did not find a head or body element to append the script");c.appendChild(u)}}({src:I,async:!0,onload:U,onerror:e,sri:(t=E,"string"==typeof t&&/^sha384-[A-Za-z0-9+/=]+$/.test(t)?E:""),scriptDataAttributes:c})}function D(e){B("script_append_failed",Q(e))}function Q(e){return e instanceof Error?e.message:"Unknown error"}}}();wpmLoader({shopId: 13094256699,storefrontBaseUrl: "https://dreamcatchers.com",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://dreamcatchers.com/.well-known/shopify/monorail/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["16072cab","8450a54b"],webPixelsConfigList: [{"id":"1959624950","configuration":"{\"projectId\":\"utbu58j1ae\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"d8a2bb2ccbb513dc8e8b6937f4b8033e","type":"APP","apiClientId":240074326017,"privacyPurposes":[],"capabilities":["advanced_dom_events"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_personal_data"],"dataSharingControls":["share_all_events"]}
1219,"dataSharingState":"unrestricted"},{"id":"1945305334","configuration":"{\"shop\":\"sm-dream.myshopify.com\", \"shopliftUrl\":\"https:\/\/events.shoplift.ai\/api\/events\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"dabcda9558be25394b12ce3ce899568b","type":"APP","apiClientId":7521861633,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"1780678902","configuration":"{\"shopId\":\"sm-dream.myshopify.com\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"7093dff47f098f6de2afb75b62011ebe","type":"APP","apiClientId":2753413,"privacyPurposes":["ANALYTICS","MARKETING"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"1680244982","configuration":"{\"appProxyPath\":\"\/apps\/pagefly\",\"analyticsEndpoint\":\"undefined\/analytics-v2\/events\",\"focusDuration\":\"3\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"cc510d1a3167776ef03f2a6c403db7ae","type":"APP","apiClientId":1743893,"privacyPurposes":["ANALYTICS","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_personal_data"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"1629192438","configuration":"{\"pixelCode\":\"D4P0QGRC77U162S62MI0\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"22e92c2ad45662f435e4801458fb78cc","type":"APP","apiClientId":4383523,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"1575911670","configuration":"{\"accountID\":\"M9YDBm\",\"webPixelConfig\":\"eyJlbmFibGVBZGRlZFRvQ2FydEV2ZW50cyI6IHRydWV9\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"c63c5b72c8d77be5f2d27d14c081da38","type":"APP","apiClientId":123074,"privacyPurposes":["ANALYTICS","MARKETING"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"833487094","configuration":"{\"config_url\": \"https:\/\/shopify-gtm-suite.getelevar.com\/configs\/2b6de5be4eac7c6181eceea5742003305d682126\/config.js\"}","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"7ae63d00911d5ee26809bf1e3232d852","type":"APP","apiClientId":2509311,"privacyPurposes":[],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"96338166","eventPayloadVersion":"1","runtimeContext":"LAX","scriptVersion":"1","type":"CUSTOM","privacyPurposes":[],"name":"Elevar - Checkout Tracking"},{"id":"124485878","eventPayloadVersion":"1","runtimeContext":"LAX","scriptVersion":"2","type":"CUSTOM","privacyPurposes":[],"name":"ThoughtMetric"},{"id":"shopify-app-pixel","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"APP","privacyPurposes":["ANALYTICS","MARKETING"]},{"id":"shopify-custom-pixel","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING"]}],isMerchantRequest: false,initData: {"shop":{"name":"DreamCatchers Hair Extensions","paymentSettings":{"currencyCode":"USD"},"myshopifyDomain":"sm-dream.myshopify.com","countryCode":"US","storefrontUrl":"https:\/\/dreamcatchers.com"},"customer":null,"cart":null,"checkout":null,"productVariants":[],"products":[{"id":"6775689052310","handle":"k-tip-20-straight","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39869155049622","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6775739121814","handle":"k-tip-20-wavy","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39869308633238","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6690747842710","handle":"drawing-board","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42042681786614","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7444269662454","handle":"heat-shield-protectors","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42043016380662","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8460776767734","handle":"k-tip-heat-tool","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"46270905450742","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8983408247030","handle":"dc-crown-n-glory","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"47852587581686","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6775789093014","handle":"weft-20-straight","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39869475979414","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6775816650902","handle":"weft-20-wavy","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39869542891670","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6775828086934","handle":"weft-24-straight","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39869579460758","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6775843881110","handle":"weft-24-wavy","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39869615472790","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6944976928918","handle":"pop-release-tool","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42042678509814","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6893267681430","handle":"weft-cylinders","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"40183881367702","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7952901013750","handle":"weft-cylinder-tower","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"44835285827830","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6893106331798","handle":"dreamcatchers-nylon-thread","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"40183558144150","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8891442954486","handle":"i-tip-20-inch-straight-100-full-cut
1219icle-hair-extensions-full-point","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"47434805018870","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8891462222070","handle":"i-tip-20-inch-wavy-100-full-cuticle-hair-extensions-full-point","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"47434842308854","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8891438924022","handle":"i-tip-20-inch-straight-100-full-cuticle-hair-extensions-half-point","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"47434786341110","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8891472937206","handle":"i-tip-20-inch-wavy-100-full-cuticle-hair-extensions-half-point","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"47434861150454","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6772712964246","handle":"i-tip-24-straight","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39861460893846","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6772719583382","handle":"i-tip-24-wavy","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39861475803286","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2296384618555","handle":"i-tip-hair-cylinders","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230419836987","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2296386945083","handle":"i-tip-cylinder-tower","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230426226747","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6772894761110","handle":"tape-20-straight","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39861717565590","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6772900626582","handle":"tape-20-wavy","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39861734375574","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2296388911163","handle":"dreamcatchers-tape-release","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230432124987","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2001849811003","handle":"dreamcatchers-tape-cleanser","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"19754124640315","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2296387567675","handle":"double-sided-tape-tabs","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230427340859","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"4339725205563","handle":"single-sided-tape-tabs","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"31120587620411","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8049201414390","handle":"l-shaped-press-tool","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"45222401704182","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2001891295291","handle":"dc-color-swatch","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230435631163","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2296391041083","handle":"i-tip-cylinder-threader","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230441300027","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2296391335995","handle":"dreamcatchers-toolkit","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230441627707","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2296391827515","handle":"dreamcatchers-comb","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230442872891","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"2296392220731","handle":"clip-catchers","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"21230443659323","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7944981774582","handle":"dc-blending-razor-comb","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"44780823150838","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"4313316589627","handle":"dreamcatchers-snaggle-twist","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"51162265846006","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"4604821831739","handle":"velcro-separators","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"32488255848507","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"4604823601211","handle":"dreamcatchers-selfie-stick","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"32488274034747","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9461058535670","handle":"ring-light-pop-socket","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"51264360841462","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8033966031094","handle":"dreamcatchers-insulated-water-bottle","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"45176963105014","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6711331684502","handle":"dreamcatchers-apron","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39724363055254","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"6711335977110","handle":"dreamcatchers-cape","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"39724376883350","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8842119807222","handle":"free-marketing-flyers","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"47233519288566","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8870325977334","handle":"free-marketing-poster","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"47342137901302","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8911784607990","handle":"flyers-refill","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"47520248234230","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8460777554166","handle":"crimping-tool-1","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"46270910267638","
1219image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"8460780044534","handle":"c-needle","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"46270928879862","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9400136466678","handle":"3-pack-wand-brush-1","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"50723966812406","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9400138137846","handle":"removal-solution-1","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"50723973595382","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9400138924278","handle":"blue-light-heat-shields-1","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"50723976184054","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9400136827126","handle":"uv-glue-clear-20g","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"50723967795446","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9400136794358","handle":"uv-glue-black-20g","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"50723967762678","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597127926006","handle":"5x11-pop-up-star-struck-silver500ct","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735447048438","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597130973430","handle":"dreamweaver-comb-set-pastel","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735496528118","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597140377846","handle":"pink-paws-nitrile-gloves-medium-100pc","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735724757238","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597126713590","handle":"color-killer-wipes","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735399502070","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597119701238","handle":"5x11-pop-up-party-animal-500-sheets","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735357919478","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597120061686","handle":"backward-bibs","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735360311542","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597117833462","handle":"embossed-roll-medium-star-stuck-silver-330-ft","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735345139958","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597119373558","handle":"5x11-pop-up-etheral-500ct","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735356281078","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]}
1219,{"id":"7597129990390","handle":"big-daddy-brush-set","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735487877366","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597117276406","handle":"big-poppa-pop-ups-star-struck-silver-250-sheets","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735314305270","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597137625334","handle":"classic-color-brush","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735629664502","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597127303414","handle":"myst-assist-pink","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735419916534","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597118849270","handle":"5x11-pop-up-rose-all-day500ct","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735353495798","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597134086390","handle":"pink-paws-nitrile-gloves-small-100pc","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735552561398","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597129597174","handle":"family-pack-brush-set","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735484371190","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597130252534","handle":"power-painter-brush-set","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735489057014","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597121994998","handle":"dye-defender-100ml","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735372402934","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597137887478","handle":"midnight-mitts-nitrile-gloves-medium-100pc","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735637823734","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597122814198","handle":"2-pack-coloring-color-bowls-black-clear","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735379710198","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597130449142","handle":"gator-grips-pink4pc","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735493513462","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597137527030","handle":"pink-paws-nitrile-gloves-large-100pc","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735627075830","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597130711286","handle":"gator-grips-black4pc","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735495643382","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597131137270","handle":"midnight-mitts-nitrile-gloves-small-100pc","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735497183478","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"7597133398262","handle":"midnight-mitts-nitrile-gloves-large-100pc","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"42735526543606","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9109438202102","handle":"dreamluxe-toppers","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"48666901381366","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]}],"purchasingCompany":null},},"https://dreamcatchers.com/cdn","c8540278we853e1abpb62b2c4amde256306",{"modern":"","legacy":""},{"trekkieShim":true,"agentContext":true,"apiClientId":"580111","facebookCapiEnabled":"false","themeId":"157360161014","themePublished":"true","eventMetadataId":"076793f2-1666-4f98-b8fe-b87ad4e41e14","pageType":"cart","shopId":"13094256699","storefrontBaseUrl":"https:\/\/dreamcatchers.com","extensionBaseUrl":"https:\/\/extensions.shopifycdn.com\/cdn\/shopifycloud\/web-pixels-manager","surface":"storefront-renderer","enabledBetaFlags":"[\"16072cab\", \"8450a54b\"]","isMerchantRequest":"false","hashVersion":"c8540278we853e1abpb62b2c4amde256306","publish":"custom","events":"[[\"page_viewed\",{}]]"});})();</script>
1219<script> 1220 window.ShopifyAnalytics = window.ShopifyAnalytics || {}; 1221 window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {}; 1222 window.ShopifyAnalytics.meta.currency = 'USD'; 1223 var meta = {"page":{"pageType":"cart","requestId":"89fe3673-d7e6-4088-91b5-64cbdcef44a2-1790294590"}}; 1224 for (var attr in meta) { 1225 window.ShopifyAnalytics.meta[attr] = meta[attr]; 1226 } 1227</script>
vendor: 1 bytes, line 1227
1227
1228<script class="analytics"> 1229 (function () { 1230 var customDocumentWrite = function(content) { 1231 var jquery = null; 1232 1233 if (window.jQuery) { 1234 jquery = window.jQuery; 1235 } else if (window.Checkout && window.Checkout.$) { 1236 jquery = window.Checkout.$; 1237 } 1238 1239 if (jquery) { 1240 jquery('body').append(content); 1241 } 1242 }; 1243 1244 var hasLoggedConversion = function(token) { 1245 if (token) { 1246 return document.cookie.indexOf('loggedConversion=' + token) !== -1; 1247 } 1248 return false; 1249 } 1250 1251 var setCookieIfConversion = function(token) { 1252 if (token) { 1253 var twoMonthsFromNow = new Date(Date.now()); 1254 twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2); 1255 1256 document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow; 1257 } 1258 } 1259 1260 var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || []; 1261 window.ShopifyAnalytics.lib.trekkie = window.trekkie; 1262 if (trekkie.integrations) { 1263 return; 1264 } 1265 trekkie.methods = [ 1266 'identify', 1267 'page', 1268 'ready', 1269 'track', 1270 'trackForm', 1271 'trackLink' 1272 ]; 1273 trekkie.factory = function(method) { 1274 return function() { 1275 var args = Array.prototype.slice.call(arguments); 1276 args.unshift(method); 1277 trekkie.push(args); 1278 if (method == 'track' || method == 'page') { 1279 var pageUrl; 1280 try { 1281 pageUrl = window.location.href; 1282 } catch (e) {} 1283 var pageReferrer; 1284 try { 1285 pageReferrer = document.referrer; 1286 } catch (e) {} 1287 try { 1288 if (window.__TREKKIE_SHIM_QUEUE == null) { 1289 window.__TREKKIE_SHIM_QUEUE = []; 1290 } 1291 window.__TREKKIE_SHIM_QUEUE.push({ 1292 from: 'trekkie-stub', 1293 method: method, 1294 args: args.slice(1), 1295 pageContext: { 1296 url: pageUrl, 1297 referrer: pageReferrer 1298 } 1299 }); 1300 } catch (e) { 1301 // no-op 1302 } 1303 } 1304 return trekkie; 1305 }; 1306 }; 1307 for (var i = 0; i < trekkie.methods.length; i++) { 1308 var key = trekkie.methods[i]; 1309 trekkie[key] = trekkie.factory(key); 1310 } 1311 trekkie.load = function(config) { 1312 trekkie.config = config || {}; 1313 trekkie.config.initialDocumentCookie = document.cookie; 1314 var first = document.getElementsByTagName('script')[0]; 1315var script = document.createElement('script'); 1316script.type = 'text/javascript'; 1317script.onerror = function(e) { 1318 var scriptFallback = document.createElement('script'); 1319 scriptFallback.type = 'text/javascript'; 1320 scriptFallback.onerror = function(error) { 1321 var Monorail = { 1322 produce: function produce(monorailDomain, schemaId, payload) { 1323 var currentMs = new Date().getTime(); 1324 var event = { 1325 schema_id: schemaId, 1326 payload: payload, 1327 metadata: { 1328 event_created_at_ms: currentMs, 1329 event_sent_at_ms: currentMs 1330 } 1331 }; 1332 return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event)); 1333 }, 1334 sendRequest: function sendRequest(endpointUrl, payload) { 1335 // Try the sendBeacon API 1336 if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) { 1337 var blobData = new window.Blob([payload], { 1338 type: 'text/plain' 1339 }); 1340 1341 if (window.navigator.sendBeacon(endpointUrl, blobData)) { 1342 return true; 1343 } // sendBeacon was not successful 1344 1345 } // XHR beacon 1346 1347 var xhr = new XMLHttpRequest(); 1348 1349 try { 1350 xhr.open('POST', endpointUrl); 1351 xhr.setRequestHeader('Content-Type', 'text/plain'); 1352 xhr.send(payload); 1353 } catch (e) { 1354 console.log(e); 1355 } 1356 1357 return false; 1358 }, 1359 isIos12: function isIos12() { 1360 return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1; 1361 } 1362 }; 1363 Monorail.produce('monorail-edge.shopifysvc.com', 1364 'trekkie_storefront_load_errors/1.1', 1365 {shop_id: 13094256699, 1366 theme_id: 157360161014, 1367 app_name: "storefront", 1368 context_url: window.location.href, 1369 source_url: "//dreamcatchers.com/cdn/s/trekkie.storefront.f1ba865b3fecd812ad617f74ac079261075e9edb.min.js"}); 1370 1371 }; 1372 scriptFallback.async = true; 1373 scriptFallback.src = '//dreamcatchers.com/cdn/s/trekkie.storefront.f1ba865b3fecd812ad617f74ac079261075e9edb.min.js'; 1374 first.parentNode.insertBefore(scriptFallback, first); 1375}; 1376script.async = true; 1377script.src = '//dreamcatchers.com/cdn/s/trekkie.storefront.f1ba865b3fecd812ad617f74ac079261075e9edb.min.js'; 1378first.parentNode.insertBefore(script, first); 1379 1380 }; 1381 trekkie.load( 1382 {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":13094256699,"isMerchantRequest":null,"themeId":157360161014,"themeCityHash":"5636356023363602709","contentLanguage":"en","currency":"USD","eventMetadataId":"076793f2-1666-4f98-b8fe-b87ad4e41e14"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["764d78cb","8450a54b"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":false,"source":"trekkie-storefront-renderer","apiClientId":580111}} 1383 ); 1384 1385 var loaded = false;
1386 trekkie.ready(function() { 1387 if (loaded) return; 1388 loaded = true; 1389 1390 window.ShopifyAnalytics.lib = window.trekkie; 1391 1392 var originalDocumentWrite = document.write; 1393 document.write = customDocumentWrite; 1394 try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {}; 1395 document.write = originalDocumentWrite; 1396 1397 var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/) 1398 var token = match? match[1]: undefined; 1399 if (!hasLoggedConversion(token)) { 1400 setCookieIfConversion(token); 1401 1402 } 1403 }); 1404 1405 window.ShopifyAnalytics.lib.page(null,{"pageType":"cart","requestId":"89fe3673-d7e6-4088-91b5-64cbdcef44a2-1790294590","shopifyEmitted":true}); 1406 1407 var eventsListenerScript = document.createElement('script'); 1408 eventsListenerScript.async = true; 1409 eventsListenerScript.src = "//dreamcatchers.com/cdn/shopifycloud/storefront/assets/shop_events_listener-4e26a9ce.js"; 1410 document.getElementsByTagName('head')[0].appendChild(eventsListenerScript); 1411})();</script>
1411 1412
1412<script> 1413 if (!window.ga || (window.ga && typeof window.ga !== 'function')) { 1414 window.ga = function ga() { 1415 (window.ga.q = window.ga.q || []).push(arguments); 1416 if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') { 1417 window.Shopify.analytics.publish("ga_stub_called", {}, {sendTo: "google_osp_migration"}); 1418 } 1419 console.error("Shopify's Google Analytics stub called with:", Array.from(arguments), "\nSee https://help.shopify.com/manual/promoting-marketing/pixels/pixel-migration#google for more information."); 1420 }; 1421 if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') { 1422 window.Shopify.analytics.publish("ga_stub_initialized", {}, {sendTo: "google_osp_migration"}); 1423 } 1424 } 1425</script>
vendor: 1 bytes, line 1425
1425
1426<script 1427 defer 1428 src="https://dreamcatchers.com/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.9.4.min.js" 1429 data-application="storefront-renderer" 1430 data-shop-id="13094256699" 1431 data-render-region="gcp-us-central1" 1432 data-page-type="cart" 1433 data-theme-instance-id="157360161014" 1434 data-theme-name="Impulse" 1435 data-theme-version="8.1.0" 1436 data-monorail-region="shop_domain" 1437 data-resource-timing-sampling-rate="10" 1438 data-shs="true" 1439 data-shs-beacon="true" 1440 data-shs-export-with-fetch="true" 1441 data-shs-logs-sample-rate="1" 1442 data-shs-beacon-endpoint="https://dreamcatchers.com/api/collect" 1443></script>
1443 1444<meta name="shopify-y" content="71f8bc77-d83b-458b-be40-c872dc6fbe7b" data-expiration="1821852190000"><meta name="shopify-s" content="3bf95f92-776f-4cf2-a250-a464613a0917" data-expiration="1790296390000"><meta name="new-cookie-storage-activated" content="t"> 1445</head> 1446 1447<body class="template-cart" data-center-text="true" data-button_style="square" data-type_header_capitalize="false" data-type_headers_align_text="true" data-type_product_capitalize="false" data-swatch_style="square" > 1448 1449 <a class="in-page-link visually-hidden skip-link" href="#MainContent">Skip to content</a> 1450 1451 1452 1453 <div id="PageContainer" class="page-container page-"> 1454 <div class="transition-body"><!-- BEGIN sections: header-group --> 1455<div id="shopify-section-sections--21273656393974__cart-drawer" class="shopify-section shopify-section-group-header-group"><div id="CartDrawer" class="drawer drawer--right"> 1456 <form id="CartDrawerForm" action="/cart" method="post" novalidate class="drawer__contents" data-location="cart-drawer"> 1457 <div class="drawer__fixed-header"> 1458 <div class="drawer__header appear-animation appear-delay-1"> 1459 <div class="h2 drawer__title"> 1460 <span class="drawer__title-inner"> 1461 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-bag" viewBox="0 0 64 64"><g fill="none" stroke="#000" stroke-width="2"><path d="M25 26c0-15.79 3.57-20 8-20s8 4.21 8 20"></path><path d="M14.74 18h36.51l3.59 36.73h-43.7z"></path></g></svg> 1462 <span class="drawer__title-text">Your Cart</span> 1463 <span class="drawer__cart-count" data-cart-drawer-count aria-label="Cart">0</span> 1464 </span> 1465 </div> 1466 <div class="drawer__close"> 1467 <button type="button" class="drawer__close-button js-drawer-close"> 1468 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><title>icon-X</title><path d="m19 17.61 27.12 27.13m0-27.12L19 44.74"/></svg> 1469 <span class="icon__fallback-text">Close cart</span> 1470 </button> 1471 </div> 1472 </div> 1473 </div> 1474 1475 <div class="drawer__inner"> 1476 <div class="drawer__scrollable"> 1477 <div class="sm--wave-signature appear-animation appear-delay-2"> 1478 <input type="checkbox" name="wave_signature" id="WaveSignature" > 1479 <label for="WaveSignature" class="sm--wave-disclaimer"> 1480 <span class="sm--wave-disclaimer__title">Yes, I want to wave my delivery signature.</span> 1481 <span class="sm--wave-disclaimer__note">(Waving the signature releases us from liability of the package)</span> 1482 </label> 1483 </div> 1484 1485 <div data-products class="appear-animation appear-delay-2"></div> 1486 1487 1488 <div class="appear-animation appear-delay-3"> 1489 <label for="CartNoteDrawer">Order note</label> 1490 <textarea name="note" class="input-full cart-notes" id="CartNoteDrawer"></textarea> 1491 </div> 1492 1493 </div> 1494 1495 <div class="drawer__footer appear-animation appear-delay-4"> 1496 <div data-discounts> 1497 1498 </div> 1499 1500 <div class="cart__item-sub cart__item-row cart__item--subtotal"> 1501 <div class="ajaxcart__subtotal">Subtotal</div> 1502 <div data-subtotal>$0.00</div> 1503 </div> 1504 1505 <div class="cart__item-row cart__drawer-note"> 1506 <small> 1507 Shipping, taxes, and discount codes calculated at checkout.<br /> 1508 </small> 1509 </div> 1510 1511 1512 1513 1514 1515 <div class="cart__checkout-wrapper"> 1516 <button type="submit" name="checkout" data-terms-required="false" class="btn cart__checkout"> 1517 Check out 1518 </button> 1519 1520 1521 </div> 1522 </div> 1523 </div> 1524 1525 <div class="drawer__cart-empty appear-animation appear-delay-2"> 1526 <div class="drawer__scrollable"> 1527 Your cart is currently empty. 1528 </div> 1529 </div> 1530 </form> 1531 </div></div><div id="shopify-section-sections--21273656393974__header" class="shopify-section shopify-section-group-header-group"> 1532 1533<div id="NavDrawer" class="drawer drawer--left"> 1534 <div class="drawer__contents"> 1535 <div class="drawer__fixed-header"> 1536 <div class="drawer__header appear-animation appear-delay-1"> 1537 <div class="h2 drawer__title"><a 1538 href="/" 1539 class="drawer__logo-link" 1540 style="width: 80px;"> 1541 1542 1543 1544<image-element data-aos="image-fade-in" data-aos-offset="150"> 1545 1546 1547 1548<img src="//dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&width=160" alt="" srcset="//dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&width=80 80w, //dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&width=160 160w" width="80" height="33.56643356643357" loading="eager" class=" image-element" sizes="80px"> 1549 1550 1551 1552</image-element> 1553</a></div> 1554 <div class="drawer__close"> 1555 <button type="button" class="drawer__close-button js-drawer-close"> 1556 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><title>icon-X</title><path d="m19 17.61 27.12 27.13m0-27.12L19 44.74"/></svg>
1557 <span class="icon__fallback-text">Close menu</span> 1558 </button> 1559 </div> 1560 </div> 1561 </div> 1562 <div class="drawer__scrollable"> 1563 <ul class="mobile-nav" role="navigation" aria-label="Primary"><li class="mobile-nav__item appear-animation appear-delay-2"><div class="mobile-nav__has-sublist"><a href="/pages/4-in-1-certification" 1564 class="mobile-nav__link mobile-nav__link--top-level" 1565 id="Label-pages-4-in-1-certification1" 1566 > 1567 Get Certified 1568 </a> 1569 <div class="mobile-nav__toggle"> 1570 <button type="button" 1571 aria-controls="Linklist-pages-4-in-1-certification1" 1572 aria-labelledby="Label-pages-4-in-1-certification1" 1573 class="collapsible-trigger collapsible--auto-height"><span class="collapsible-trigger__icon collapsible-trigger__icon--open" role="presentation"> 1574 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg> 1575</span> 1576</button> 1577 </div></div><div id="Linklist-pages-4-in-1-certification1" 1578 class="mobile-nav__sublist collapsible-content collapsible-content--all" 1579 > 1580 <div class="collapsible-content__inner"> 1581 <ul class="mobile-nav__sublist"><li class="mobile-nav__item"> 1582 <div class="mobile-nav__child-item"><a href="/collections/hands-on-trainings" 1583 class="mobile-nav__link" 1584 id="Sublabel-collections-hands-on-trainings1" 1585 > 1586 4-in-1 Hands-on Trainings 1587 </a><button type="button" 1588 aria-controls="Sublinklist-pages-4-in-1-certification1-collections-hands-on-trainings1" 1589 aria-labelledby="Sublabel-collections-hands-on-trainings1" 1590 class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation"> 1591 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg> 1592</span> 1593</button></div><div 1594 id="Sublinklist-pages-4-in-1-certification1-collections-hands-on-trainings1" 1595 aria-labelledby="Sublabel-collections-hands-on-trainings1" 1596 class="mobile-nav__sublist collapsible-content collapsible-content--all" 1597 > 1598 <div class="collapsible-content__inner"> 1599 <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item"> 1600 <a href="/collections/hands-on-trainings" class="mobile-nav__link"> 1601 View 1602 </a> 1603 </li></ul> 1604 </div> 1605 </div></li><li class="mobile-nav__item"> 1606 <div class="mobile-nav__child-item"><a href="/pages/4-in-1-certification" 1607 class="mobile-nav__link" 1608 id="Sublabel-pages-4-in-1-certification2" 1609 > 1610 4-in-1 Online Certification 1611 </a><button type="button" 1612 aria-controls="Sublinklist-pages-4-in-1-certification1-pages-4-in-1-certification2" 1613 aria-labelledby="Sublabel-pages-4-in-1-certification2" 1614 class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation"> 1615 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewB
1615ox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg> 1616</span> 1617</button></div><div 1618 id="Sublinklist-pages-4-in-1-certification1-pages-4-in-1-certification2" 1619 aria-labelledby="Sublabel-pages-4-in-1-certification2" 1620 class="mobile-nav__sublist collapsible-content collapsible-content--all" 1621 > 1622 <div class="collapsible-content__inner"> 1623 <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item"> 1624 <a href="/pages/4-in-1-certification" class="mobile-nav__link"> 1625 View 1626 </a> 1627 </li></ul> 1628 </div> 1629 </div></li><li class="mobile-nav__item"> 1630 <div class="mobile-nav__child-item"><a href="/pages/dreamlights" 1631 class="mobile-nav__link" 1632 id="Sublabel-pages-dreamlights3" 1633 > 1634 DreamLights 1635 </a><button type="button" 1636 aria-controls="Sublinklist-pages-4-in-1-certification1-pages-dreamlights3" 1637 aria-labelledby="Sublabel-pages-dreamlights3" 1638 class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation"> 1639 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg> 1640</span> 1641</button></div><div 1642 id="Sublinklist-pages-4-in-1-certification1-pages-dreamlights3" 1643 aria-labelledby="Sublabel-pages-dreamlights3" 1644 class="mobile-nav__sublist collapsible-content collapsible-content--all" 1645 > 1646 <div class="collapsible-content__inner"> 1647 <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item"> 1648 <a href="/pages/dreamlights" class="mobile-nav__link"> 1649 View 1650 </a> 1651 </li></ul> 1652 </div> 1653 </div></li></ul> 1654 </div> 1655 </div></li><li class="mobile-nav__item appear-animation appear-delay-3"><div class="mobile-nav__has-sublist"><a href="/collections/all-products" 1656 class="mobile-nav__link mobile-nav__link--top-level" 1657 id="Label-collections-all-products2" 1658 > 1659 Shop 1660 </a> 1661 <div class="mobile-nav__toggle"> 1662 <button type="button" 1663 aria-controls="Linklist-collections-all-products2" 1664 aria-labelledby="Label-collections-all-products2" 1665 class="collapsible-trigger collapsible--auto-height"><span class="collapsible-trigger__icon collapsible-trigger__icon--open" role="presentation"> 1666 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg> 1667</span> 1668</button> 1669 </div></div><div id="Linklist-collections-all-products2" 1670 class="mobile-nav__sublist collapsible-content collapsible-content--all" 1671 > 1672 <div class="collapsible-content__inner"> 1673 <ul class="mobile-nav__sublist"><li class="mobile-nav__item"> 1674 <div class="mobile-nav__child-item"><a href="/collections/i-tip" 1675 class="mobile-nav__link" 1676 id="Sublabel-collections-i-tip1" 1677 > 1678 I-Tip 1679 </a><button type="button" 1680 aria-controls="Sublinklist-collections-all-products2-collections-i-tip1" 1681 aria-labelledby="Sublabel-collections-i-tip1" 1682 class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation"> 1683 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewB
1683ox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg> 1684</span> 1685</button></div><div 1686 id="Sublinklist-collections-all-products2-collections-i-tip1" 1687 aria-labelledby="Sublabel-collections-i-tip1" 1688 class="mobile-nav__sublist collapsible-content collapsible-content--all" 1689 > 1690 <div class="collapsible-content__inner"> 1691 <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item"> 1692 <a href="/collections/i-tip" class="mobile-nav__link"> 1693 View 1694 </a> 1695 </li></ul> 1696 </div> 1697 </div></li><li class="mobile-nav__item"> 1698 <div class="mobile-nav__child-item"><a href="/collections/weft" 1699 class="mobile-nav__link" 1700 id="Sublabel-collections-weft2" 1701 > 1702 Weft 1703 </a><button type="button" 1704 aria-controls="Sublinklist-collections-all-products2-collections-weft2" 1705 aria-labelledby="Sublabel-collections-weft2" 1706 class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation"> 1707 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg> 1708</span> 1709</button></div><div 1710 id="Sublinklist-collections-all-products2-collections-weft2" 1711 aria-labelledby="Sublabel-collections-weft2" 1712 class="mobile-nav__sublist collapsible-content collapsible-content--all" 1713 > 1714 <div class="collapsible-content__inner"> 1715 <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item"> 1716 <a href="/collections/weft" class="mobile-nav__link"> 1717 View 1718 </a> 1719 </li></ul> 1720 </div> 1721 </div></li><li class="mobile-nav__item"> 1722 <div class="mobile-nav__child-item"><a href="/collections/k-tip" 1723 class="mobile-nav__link" 1724 id="Sublabel-collections-k-tip3" 1725 > 1726 K-Tip 1727 </a><button type="button" 1728 aria-controls="Sublinklist-collections-all-products2-collections-k-tip3" 1729 aria-labelledby="Sublabel-collections-k-tip3" 1730 class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation"> 1731 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg> 1732</span> 1733</button></div><div 1734 id="Sublinklist-collections-all-products2-collections-k-tip3" 1735 aria-labelledby="Sublabel-collections-k-tip3" 1736 class="mobile-nav__sublist collapsible-content collapsible-content--all" 1737 > 1738 <div class="collapsible-content__inner"> 1739 <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item"> 1740 <a href="/collections/k-tip" class="mobile-nav__link"> 1741 View 1742 </a> 1743 </li></ul> 1744 </div> 1745 </div></li><li class="mobile-nav__item"> 1746 <div class="mobile-nav__child-item"><a href="/collections/tape-in" 1747 class="mobile-nav__link" 1748 id="Sublabel-collections-tape-in4" 1749 > 1750 Tape In 1751 </a><button type="button" 1752 aria-controls="Sublinklist-collections-all-products2-collections-tape-in4" 1753 aria-labelledby="Sublabel-collections-tape-in4" 1754 class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation"> 1755 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewB
1755ox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg> 1756</span> 1757</button></div><div 1758 id="Sublinklist-collections-all-products2-collections-tape-in4" 1759 aria-labelledby="Sublabel-collections-tape-in4" 1760 class="mobile-nav__sublist collapsible-content collapsible-content--all" 1761 > 1762 <div class="collapsible-content__inner"> 1763 <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item"> 1764 <a href="/collections/tape-in" class="mobile-nav__link"> 1765 View 1766 </a> 1767 </li></ul> 1768 </div> 1769 </div></li><li class="mobile-nav__item"> 1770 <div class="mobile-nav__child-item"><a href="/pages/toppers-landing-page" 1771 class="mobile-nav__link" 1772 id="Sublabel-collections-dreamluxe-toppers5" 1773 > 1774 Toppers 1775 </a><button type="button" 1776 aria-controls="Sublinklist-collections-all-products2-collections-dreamluxe-toppers5" 1777 aria-labelledby="Sublabel-collections-dreamluxe-toppers5" 1778 class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation"> 1779 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg> 1780</span> 1781</button></div><div 1782 id="Sublinklist-collections-all-products2-collections-dreamluxe-toppers5" 1783 aria-labelledby="Sublabel-collections-dreamluxe-toppers5" 1784 class="mobile-nav__sublist collapsible-content collapsible-content--all" 1785 > 1786 <div class="collapsible-content__inner"> 1787 <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item"> 1788 <a href="/pages/toppers-landing-page" class="mobile-nav__link"> 1789 View 1790 </a> 1791 </li></ul> 1792 </div> 1793 </div></li><li class="mobile-nav__item"> 1794 <div class="mobile-nav__child-item"><a href="/collections/accessories" 1795 class="mobile-nav__link" 1796 id="Sublabel-collections-accessories6" 1797 > 1798 Accessories 1799 </a><button type="button" 1800 aria-controls="Sublinklist-collections-all-products2-collections-accessories6" 1801 aria-labelledby="Sublabel-collections-accessories6" 1802 class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation"> 1803 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg> 1804</span> 1805</button></div><div 1806 id="Sublinklist-collections-all-products2-collections-accessories6" 1807 aria-labelledby="Sublabel-collections-accessories6" 1808 class="mobile-nav__sublist collapsible-content collapsible-content--all" 1809 > 1810 <div class="collapsible-content__inner"> 1811 <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item"> 1812 <a href="/collections/accessories" class="mobile-nav__link"> 1813 View 1814 </a> 1815 </li></ul> 1816 </div> 1817 </div></li><li class="mobile-nav__item"> 1818 <div class="mobile-nav__child-item"><a href="/collections/framar" 1819 class="mobile-nav__link" 1820 id="Sublabel-collections-framar7" 1821 > 1822 Framar 1823 </a><button type="button" 1824 aria-controls="Sublinklist-collections-all-products2-collections-framar7" 1825 aria-labelledby="Sublabel-collections-framar7" 1826 class="collapsible-trigger"><span class="collapsible-trigger__icon collapsible-trigger__icon--circle collapsible-trigger__icon--open" role="presentation"> 1827 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewB
1827ox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg> 1828</span> 1829</button></div><div 1830 id="Sublinklist-collections-all-products2-collections-framar7" 1831 aria-labelledby="Sublabel-collections-framar7" 1832 class="mobile-nav__sublist collapsible-content collapsible-content--all" 1833 > 1834 <div class="collapsible-content__inner"> 1835 <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item"> 1836 <a href="/collections/framar" class="mobile-nav__link"> 1837 View 1838 </a> 1839 </li></ul> 1840 </div> 1841 </div></li></ul> 1842 </div> 1843 </div></li><li class="mobile-nav__item appear-animation appear-delay-4"><div class="mobile-nav__has-sublist"><button type="button" 1844 aria-controls="Linklist-3" 1845 class="mobile-nav__link--button mobile-nav__link--top-level collapsible-trigger collapsible--auto-height"> 1846 <span class="mobile-nav__faux-link"> 1847 About The Hair 1848 </span> 1849 <div class="mobile-nav__toggle"> 1850 <span class="faux-button"><span class="collapsible-trigger__icon collapsible-trigger__icon--open" role="presentation"> 1851 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg> 1852</span> 1853</span> 1854 </div> 1855 </button></div><div id="Linklist-3" 1856 class="mobile-nav__sublist collapsible-content collapsible-content--all" 1857 > 1858 <div class="collapsible-content__inner"> 1859 <ul class="mobile-nav__sublist"><li class="mobile-nav__item"> 1860 <div class="mobile-nav__child-item"><a href="/pages/dreamcatchers" 1861 class="mobile-nav__link" 1862 id="Sublabel-pages-dreamcatchers1" 1863 > 1864 About DreamCatchers 1865 </a></div></li><li class="mobile-nav__item"> 1866 <div class="mobile-nav__child-item"><a href="/pages/production-process" 1867 class="mobile-nav__link" 1868 id="Sublabel-pages-production-process2" 1869 > 1870 Production Process 1871 </a></div></li><li class="mobile-nav__item"> 1872 <div class="mobile-nav__child-item"><a href="/pages/color-styles" 1873 class="mobile-nav__link" 1874 id="Sublabel-pages-color-styles3" 1875 > 1876 Colors & Styles 1877 </a></div></li><li class="mobile-nav__item"> 1878 <div class="mobile-nav__child-item"><a href="/apps/help-center" 1879 class="mobile-nav__link" 1880 id="Sublabel-apps-help-center4" 1881 > 1882 FAQâs 1883 </a></div></li></ul> 1884 </div> 1885 </div></li><li class="mobile-nav__item appear-animation appear-delay-5"><a href="https://portal.dreamcatchers.com/" class="mobile-nav__link mobile-nav__link--top-level">Education Hub</a></li><li class="mobile-nav__item appear-animation appear-delay-6"><a href="/pages/yotpo-reviews" class="mobile-nav__link mobile-nav__link--top-level">Reviews</a></li><li class="mobile-nav__item appear-animation appear-delay-7"><a href="/blogs/dreamcatchers-hair-blog" class="mobile-nav__link mobile-nav__link--top-level">Blog</a></li><li class="mobile-nav__item appear-animation appear-delay-8"><a href="https://dreamcatchers.com/pages/dc-media-library" class="mobile-nav__link mobile-nav__link--top-level">DC Media Library</a></li><li class="mobile-nav__item mobile-nav__item--secondary"> 1886 <div class="grid"><div class="grid__item one-half appear-animation appear-delay-9"> 1887 <a href="/account" class="mobile-nav__link">Log in 1888</a> 1889 </div></div> 1890 </li></ul><div class="mobile-nav__phone appear-animation appear-delay-10"> 1891 <a href="tel:1-855-373-2683">1-855-373-2683</a> 1892 </div><ul class="mobile-nav__social appear-animation appear-delay-11">
1892<li class="mobile-nav__social-item"> 1893 <a target="_blank" rel="noopener" href="https://www.instagram.com/dreamcatchershair/" title="DreamCatchers Hair Extensions on Instagram"> 1894 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-instagram" viewBox="0 0 32 32"><title>instagram</title><path fill="#444" d="M16 3.094c4.206 0 4.7.019 6.363.094 1.538.069 2.369.325 2.925.544.738.287 1.262.625 1.813 1.175s.894 1.075 1.175 1.813c.212.556.475 1.387.544 2.925.075 1.662.094 2.156.094 6.363s-.019 4.7-.094 6.363c-.069 1.538-.325 2.369-.544 2.925-.288.738-.625 1.262-1.175 1.813s-1.075.894-1.813 1.175c-.556.212-1.387.475-2.925.544-1.663.075-2.156.094-6.363.094s-4.7-.019-6.363-.094c-1.537-.069-2.369-.325-2.925-.544-.737-.288-1.263-.625-1.813-1.175s-.894-1.075-1.175-1.813c-.212-.556-.475-1.387-.544-2.925-.075-1.663-.094-2.156-.094-6.363s.019-4.7.094-6.363c.069-1.537.325-2.369.544-2.925.287-.737.625-1.263 1.175-1.813s1.075-.894 1.813-1.175c.556-.212 1.388-.475 2.925-.544 1.662-.081 2.156-.094 6.363-.094zm0-2.838c-4.275 0-4.813.019-6.494.094-1.675.075-2.819.344-3.819.731-1.037.4-1.913.944-2.788 1.819S1.486 4.656 1.08 5.688c-.387 1-.656 2.144-.731 3.825-.075 1.675-.094 2.213-.094 6.488s.019 4.813.094 6.494c.075 1.675.344 2.819.731 3.825.4 1.038.944 1.913 1.819 2.788s1.756 1.413 2.788 1.819c1 .387 2.144.656 3.825.731s2.213.094 6.494.094 4.813-.019 6.494-.094c1.675-.075 2.819-.344 3.825-.731 1.038-.4 1.913-.944 2.788-1.819s1.413-1.756 1.819-2.788c.387-1 .656-2.144.731-3.825s.094-2.212.094-6.494-.019-4.813-.094-6.494c-.075-1.675-.344-2.819-.731-3.825-.4-1.038-.944-1.913-1.819-2.788s-1.756-1.413-2.788-1.819c-1-.387-2.144-.656-3.825-.731C20.812.275 20.275.256 16 .256z"/><path fill="#444" d="M16 7.912a8.088 8.088 0 0 0 0 16.175c4.463 0 8.087-3.625 8.087-8.088s-3.625-8.088-8.088-8.088zm0 13.338a5.25 5.25 0 1 1 0-10.5 5.25 5.25 0 1 1 0 10.5zM26.294 7.594a1.887 1.887 0 1 1-3.774.002 1.887 1.887 0 0 1 3.774-.003z"/></svg> 1895 <span class="icon__fallback-text">Instagram</span> 1896 </a> 1897 </li><li class="mobile-nav__social-item"> 1898 <a target="_blank" rel="noopener" href="https://www.facebook.com/dreamcatchersHair" title="DreamCatchers Hair Extensions on Facebook"> 1899 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-facebook" viewBox="0 0 14222 14222"><path d="M14222 7112c0 3549.352-2600.418 6491.344-6000 7024.72V9168h1657l315-2056H8222V5778c0-562 275-1111 1159-1111h897V2917s-814-139-1592-139c-1624 0-2686 984-2686 2767v1567H4194v2056h1806v4968.72C2600.418 13603.344 0 10661.352 0 7112 0 3184.703 3183.703 1 7111 1s7111 3183.703 7111 7111Zm-8222 7025c362 57 733 86 1111 86-377.945 0-749.003-29.485-1111-86.28Zm2222 0v-.28a7107.458 7107.458 0 0 1-167.717 24.267A7407.158 7407.158 0 0 0 8222 14137Zm-167.717 23.987C7745.664 14201.89 7430.797 14223 7111 14223c319.843 0 634.675-21.479 943.283-62.013Z"/></svg> 1900 <span class="icon__fallback-text">Facebook</span> 1901 </a> 1902 </li><li class="mobile-nav__social-item"> 1903 <a target="_blank" rel="noopener" href="https://www.youtube.com/channel/UC9x1egq6PNyY2wI1lvkqkvA" title="DreamCatchers Hair Extensions on YouTube"> 1904 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-youtube" viewBox="0 0 21 20"><path fill="#444" d="M-.196 15.803q0 1.23.812 2.092t1.977.861h14.946q1.165 0 1.977-.861t.812-2.092V3.909q0-1.23-.82-2.116T17.539.907H2.593q-1.148 0-1.969.886t-.82 2.116v11.894zm7.465-2.149V6.058q0-.115.066-.18.049-.016.082-.016l.082.016 7.153 3.806q.066.066.066.164 0 .066-.066.131l-7.153 3.806q-.033.033-.066.033-.066 0-.098-.033-.066-.066-.066-.131z"/></svg> 1905 <span class="icon__fallback-text">YouTube</span> 1906 </a> 1907 </li><li class="mobile-nav__social-item"> 1908 <a target="_blank" rel="noopener" href="https://www.tiktok.com/@dreamcatchershair" title="DreamCatchers Hair Extensions on TickTok"> 1909 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-tiktok" viewB
1909ox="0 0 2859 3333"><path d="M2081 0c55 473 319 755 778 785v532c-266 26-499-61-770-225v995c0 1264-1378 1659-1932 753-356-583-138-1606 1004-1647v561c-87 14-180 36-265 65-254 86-398 247-358 531 77 544 1075 705 992-358V1h551z"/></svg> 1910 <span class="icon__fallback-text">TikTok</span> 1911 </a> 1912 </li></ul> 1913 </div> 1914 </div> 1915</div> 1916 1917 1918<style> 1919 .site-nav__link, 1920 .site-nav__dropdown-link:not(.site-nav__dropdown-link--top-level) { 1921 font-size: 13px; 1922 } 1923 1924 .site-nav__link, .mobile-nav__link--top-level { 1925 text-transform: uppercase; 1926 letter-spacing: 0.2em; 1927 } 1928 .mobile-nav__link--top-level { 1929 font-size: 1.1em; 1930 } 1931 1932 1933 1934 1935 1936.site-header { 1937 box-shadow: 0 0 1px rgba(0,0,0,0.2); 1938 } 1939 1940 .toolbar + .header-sticky-wrapper .site-header { 1941 border-top: 0; 1942 }/* Promo Banner Styles */ 1943 .promo-banner-wrapper { 1944 display: block; 1945 width: 100%; 1946 } 1947 1948 .promo-banner { 1949 width: 100%; 1950 height: 52px; 1951 display: flex; 1952 align-items: center; 1953 justify-content: center; 1954 background-size: 100% 100%; 1955 background-position: center; 1956 background-repeat: no-repeat; 1957 transition: all 0.3s ease; 1958 } 1959 1960 @media (max-width: 767px) { 1961 .promo-banner { 1962 height: 30px; 1963 } 1964 } 1965 1966 /* Clickable state indicator */ 1967 .promo-banner--clickable { 1968 cursor: pointer; 1969 } 1970 1971 .promo-banner__text { 1972 color: #fff; 1973 font-size: 14px; 1974 font-weight: 400; 1975 text-align: center; 1976 padding: 0 20px; 1977 line-height: 1.4; 1978 transition: transform 0.2s ease; 1979 } 1980 1981 .promo-banner-link { 1982 display: block; 1983 text-decoration: none; 1984 transition: opacity 0.3s ease, transform 0.2s ease; 1985 width: 100%; 1986 } 1987 1988 .promo-banner-link:hover { 1989 opacity: 0.95; 1990 } 1991 1992 .promo-banner-link:hover .promo-banner { 1993 transform: scale(1.002); 1994 } 1995 1996 .promo-banner-link:hover .promo-banner__text { 1997 transform: scale(1.02); 1998 } 1999 2000 .promo-banner-link:focus { 2001 outline: 3px solid rgba(239, 131, 173, 0.6); 2002 outline-offset: 2px; 2003 } 2004 2005 .promo-banner-link:active { 2006 transform: scale(0.998); 2007 } 2008 2009 /* Responsive image display */ 2010 .promo-banner--desktop { 2011 display: flex; 2012 } 2013 2014 .promo-banner--mobile { 2015 display: none; 2016 } 2017 2018 @media (max-width: 767px) { 2019 .promo-banner--desktop { 2020 display: none; 2021 } 2022 2023 .promo-banner--mobile { 2024 display: flex; 2025 } 2026 } 2027 2028 /* Accessibility: Reduce motion for users who prefer it */ 2029 @media (prefers-reduced-motion: reduce) { 2030 .promo-banner, 2031 .promo-banner__text, 2032 .promo-banner-link { 2033 transition: none; 2034 transform: none !important; 2035 } 2036 }</style> 2037 2038<div data-section-id="sections--21273656393974__header" data-section-type="header"><div class="header-sticky-wrapper"> 2039 <div id="HeaderWrapper" class="header-wrapper"><header 2040 id="SiteHeader" 2041 class="site-header" 2042 data-sticky="true" 2043 data-overlay="false"> 2044 <div class="page-width"> 2045 <div 2046 class="header-layout header-layout--center-split" 2047 data-logo-align="center"><div class="header-item header-item--left header-item--navigation"><div class="site-nav small--hide"> 2048 <a href="/search" class="site-nav__link site-nav__link--icon js-search-header"> 2049 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-search" viewBox="0 0 64 64"><title>icon-search</title><path d="M47.16 28.58A18.58 18.58 0 1 1 28.58 10a18.58 18.58 0 0 1 18.58 18.58ZM54 54 41.94 42"/></svg> 2050 <span class="icon__fallback-text">Search</span> 2051 </a> 2052 </div><span class="sm-nav__phone" style=""> 2053 <img src="//dreamcatchers.com/cdn/shop/files/headphones.png?v=9928122979393222900" alt="Call icon"> 2054 1-855-373-2683 2055 </span><div class="site-nav medium-up--hide"> 2056 <button 2057 type="button" 2058 class="site-nav__link site-nav__link--icon js-drawer-open-nav" 2059 aria-controls="NavDrawer"> 2060 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-hamburger" viewBox="0 0 64 64"><title>icon-hamburger</title><path d="M7 15h51M7 32h43M7 49h51"/></svg>
2061 <span class="icon__fallback-text">Site navigation</span> 2062 </button> 2063 </div> 2064 </div><div class="header-item header-item--logo-split" role="navigation" aria-label="Primary"> 2065 <div class="header-item header-item--split-left"><ul 2066 class="site-nav site-navigation small--hide" 2067><li class="site-nav__item site-nav__expanded-item site-nav--has-dropdown site-nav--is-megamenu"> 2068 2069 <details 2070 data-hover="true" 2071 id="site-nav-item--1" 2072 class="site-nav__details" 2073 > 2074 <summary 2075 data-link="/pages/4-in-1-certification" 2076 aria-expanded="false" 2077 aria-controls="site-nav-item--1" 2078 class="site-nav__link site-nav__link--underline site-nav__link--has-dropdown" 2079 > 2080 Get Certified <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg> 2081 </summary> 2082 2083 2084<div class="site-nav__dropdown megamenu text-left"> 2085 <div class="page-width"> 2086 <div class="grid grid--center certified-menu-grid"> 2087 <div class="grid__item medium-up--one-fifth appear-animation appear-delay-1 certified-menu-grid-class"><!-- Added by SM --> 2088 <!-- Change the education portal link to the course page if not purchased --> 2089 2090 2091 2092 2093 2094 <a 2095 href="/collections/hands-on-trainings" 2096 class="megamenu__colection-image tester" 2097 style="background-image: url(//dreamcatchers.com/cdn/shop/collections/hands-on-trainings_400x.png?v=1583230711)"></a> 2098 2099 2100 2101 2102 <div class="h5"> 2103 2104 <a href="/collections/hands-on-trainings" class="site-nav__dropdown-link">4-in-1 Hands-on Trainings</a> 2105 2106 </div> 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 <div> 2118 2119 <p><span>Visit one of our awesome Hands-On Trainings and learn from our certified professional educators</span></p> 2120 2121 </div> 2122 <div class="view-more"> 2123 2124 <a href="/collections/hands-on-trainings" class="site-nav__dropdown-link"> 2125 View 2126 </a> 2127 2128 </div> 2129 2130<!-- Added by SM --> 2131 <!-- Change the education portal link to the course page if not purchased --> 2132 2133 2134</div><div class="grid__item medium-up--one-fifth appear-animation appear-delay-2 certified-menu-grid-class"> 2135<a 2136 href="/pages/4-in-1-certification" 2137 class="megamenu__colection-image" 2138 style="background-image: url('https://cdn.shopify.com/s/files/1/0130/9425/6699/files/all-4-systems.png?v=1679906930')"></a> 2139 2140 2141 <div class="h5"> 2142 2143 <a href="/pages/4-in-1-certification" class="site-nav__dropdown-link">4-in-1 Online Certification</a> 2144 2145 </div> 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 <div> 2157 2158 <p><span>Online certification for I-Tip, Tape, K-Tip & Weft systems. Learn everything from installation to maintenance & removal. Accessible 24/7 at your own pace</span></p> 2159 2160 </div> 2161 <div class="view-more"> 2162 2163 <a href="/pages/4-in-1-certification" class="site-nav__dropdown-link"> 2164 View 2165 </a> 2166 2167 </div> 2168 2169<!-- Added by SM --> 2170 <!-- Change the education portal link to the course page if not purchased --> 2171 2172 2173</div><div class="grid__item medium-up--one-fifth appear-animation appear-delay-3 certified-menu-grid-class"> 2174 2175 2176 <a 2177 href="https://dreamcatchers.com/pages/dreamlights" 2178 class="megamenu__colection-image megamenu__colection-image--new-label" 2179 style="background-image: url('https://cdn.shopify.com/s/files/1/0130/9425/6699/files/ElevenLabs_image_nano-banana-pro_remove_the_b..._2026-04-20T21_33_05.png?v=1776721373')">
2180 <span class="megamenu__image-label">New</span> 2181 </a> 2182 2183 2184 <div class="h5"> 2185 2186 <a href="https://dreamcatchers.com/pages/dreamlights" class="site-nav__dropdown-link">DreamLights </a> 2187 2188 </div> 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 <div> 2200 2201 <p><span>Get certified in DreamLights, the latest UV technology in hair extensions, with hands-on training or online certification.</span></p> 2202 2203 </div> 2204 <div class="view-more"> 2205 2206 <a href="https://dreamcatchers.com/pages/dreamlights" class="site-nav__dropdown-link"> 2207 View 2208 </a> 2209 2210 </div> 2211 2212</div> 2213 </div> 2214 </div> 2215 </div> 2216 </details> 2217 2218 </li><li class="site-nav__item site-nav__expanded-item site-nav--has-dropdown site-nav--is-megamenu"> 2219 2220 <details 2221 data-hover="true" 2222 id="site-nav-item--2" 2223 class="site-nav__details" 2224 > 2225 <summary 2226 data-link="/collections/all-products" 2227 aria-expanded="false" 2228 aria-controls="site-nav-item--2" 2229 class="site-nav__link site-nav__link--underline site-nav__link--has-dropdown" 2230 > 2231 Shop <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg> 2232 </summary> 2233 2234 2235<div class="site-nav__dropdown megamenu text-left"> 2236 <div class="page-width"> 2237 <div class="grid grid--center"> 2238 <div class="grid__item medium-up--one-fifth appear-animation appear-delay-1 "><!-- Added by SM --> 2239 <!-- Change the education portal link to the course page if not purchased --> 2240 2241 2242 2243 2244 2245 <a 2246 href="/collections/i-tip" 2247 class="megamenu__colection-image tester" 2248 style="background-image: url(//dreamcatchers.com/cdn/shop/collections/Untitled-67ee_540x_43a39d89-4f73-459f-a066-72d18f2c6ee4_400x.png?v=1781558628)"></a> 2249 2250 2251 2252 2253 <div class="h5"> 2254 2255 <a href="/collections/i-tip" class="site-nav__dropdown-link">I-Tip</a> 2256 2257 </div> 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 <div> 2269 2270 <span>Our I-Tip system uses a patented rubberized tip that allows the hair to lay flat against your head.</span> 2271 2272 </div> 2273 <div class="view-more"> 2274 2275 <a href="/collections/i-tip" class="site-nav__dropdown-link"> 2276 View 2277 </a> 2278 2279 </div> 2280 2281<!-- Added by SM --> 2282 <!-- Change the education portal link to the course page if not purchased --> 2283 2284 2285</div><div class="grid__item medium-up--one-fifth appear-animation appear-delay-2 "> 2286 2287 2288 <a 2289 href="/collections/weft" 2290 class="megamenu__colection-image tester" 2291 style="background-image: url(//dreamcatchers.com/cdn/shop/collections/weft-menu_400x.png?v=1781558725)"></a> 2292 2293 2294 2295 2296 <div class="h5"> 2297 2298 <a href="/collections/weft" class="site-nav__dropdown-link">Weft</a> 2299 2300 </div> 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 <div> 2312
2313 <span>Our wefting system is a single weft of hair that is sewn in through a beaded foundation.</span> 2314 2315 </div> 2316 <div class="view-more"> 2317 2318 <a href="/collections/weft" class="site-nav__dropdown-link"> 2319 View 2320 </a> 2321 2322 </div> 2323 2324<!-- Added by SM --> 2325 <!-- Change the education portal link to the course page if not purchased --> 2326 2327 2328</div><div class="grid__item medium-up--one-fifth appear-animation appear-delay-3 "> 2329 2330 2331 <a 2332 href="/collections/k-tip" 2333 class="megamenu__colection-image tester" 2334 style="background-image: url(//dreamcatchers.com/cdn/shop/collections/k-tip-menu_400x.png?v=1781559286)"></a> 2335 2336 2337 2338 2339 <div class="h5"> 2340 2341 <a href="/collections/k-tip" class="site-nav__dropdown-link">K-Tip</a> 2342 2343 </div> 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 <div> 2355 2356 <span data-mce-fragment="1">Keratin Tip Extensions, also known as K-tip, is an individual extension that is applied using a heating tool.</span> 2357 2358 </div> 2359 <div class="view-more"> 2360 2361 <a href="/collections/k-tip" class="site-nav__dropdown-link"> 2362 View 2363 </a> 2364 2365 </div> 2366 2367<!-- Added by SM --> 2368 <!-- Change the education portal link to the course page if not purchased --> 2369 2370 2371</div><div class="grid__item medium-up--one-fifth appear-animation appear-delay-4 "> 2372 2373 2374 <a 2375 href="/collections/tape-in" 2376 class="megamenu__colection-image tester" 2377 style="background-image: url(//dreamcatchers.com/cdn/shop/collections/Untitled-5ee_540x_d55ccc16-a25e-4dc9-88d7-0318446a0459_400x.png?v=1781559319)"></a> 2378 2379 2380 2381 2382 <div class="h5"> 2383 2384 <a href="/collections/tape-in" class="site-nav__dropdown-link">Tape In</a> 2385 2386 </div> 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 <div> 2398 2399 <span>Our Tape In system quickly allows you to add more volume in areas you need it the most.</span> 2400 2401 </div> 2402 <div class="view-more"> 2403 2404 <a href="/collections/tape-in" class="site-nav__dropdown-link"> 2405 View 2406 </a> 2407 2408 </div> 2409 2410<!-- Added by SM --> 2411 <!-- Change the education portal link to the course page if not purchased --> 2412 2413 2414</div><div class="grid__item medium-up--one-fifth appear-animation appear-delay-5 "> 2415 2416 2417 <a 2418 href="/pages/toppers-landing-page" 2419 class="megamenu__colection-image megamenu__colection-image--new-label" 2420 style="background-image: url(//dreamcatchers.com/cdn/shop/collections/i-tip_9c55480b-5ae0-41fe-85a7-6c9b879eea04_400x.png?v=1781635850)"> 2421 <span class="megamenu__image-label">New</span> 2422 </a> 2423 2424 2425 2426 2427 <div class="h5"> 2428 2429 <a href="/pages/toppers-landing-page" class="site-nav__dropdown-link">Toppers</a> 2430 2431 </div> 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 <div> 2443 2444 <p>DreamLuxe toppers give instant volume and coverage with a lightweight, hand-crafter design that looks and feels natural.</p> 2445 2446 </div> 2447 <div class="view-more"> 2448 2449 <a href="/pages/toppers-landing-page" class="site-nav__dropdown-link"> 2450 View 2451 </a> 2452 2453 </div> 2454 2455<!-- Added by SM --> 2456 <!-- Change the education portal link to the course page if not purchased --> 2457 2458 2459</div><div class="grid__item medium-up--one-fifth appear-animation appear-delay-6 "> 2460 2461 2462 <a 2463 href="/collections/accessories" 2464 class="megamenu__colection-image tester" 2465 style="background-image: url(//dreamcatchers.com/cdn/shop/collections/Untitled-58ee_540x_474c4005-70fc-4cea-9aab-85d5c728a56c_400x.png?v=1781638789)"></a> 2466 2467 2468 2469 2470 <div class="h5"> 2471 2472 <a href="/collections/accessories" class="site-nav__dropdown-link">Accessories</a> 2473 2474 </div> 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 <div> 2486
2487 <span>Practically everything you need is in your stylist kit you get as a gift from us! Check out here for other supplements to restock.</span> 2488 2489 </div> 2490 <div class="view-more"> 2491 2492 <a href="/collections/accessories" class="site-nav__dropdown-link"> 2493 View 2494 </a> 2495 2496 </div> 2497 2498<!-- Added by SM --> 2499 <!-- Change the education portal link to the course page if not purchased --> 2500 2501 2502</div><div class="grid__item medium-up--one-fifth appear-animation appear-delay-7 "> 2503 2504 2505 <a 2506 href="/collections/framar" 2507 class="megamenu__colection-image tester" 2508 style="background-image: url(//dreamcatchers.com/cdn/shop/collections/framar-products_400x.png?v=1648801092)"></a> 2509 2510 2511 2512 2513 <div class="h5"> 2514 2515 <a href="/collections/framar" class="site-nav__dropdown-link">Framar</a> 2516 2517 </div> 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 <div> 2529 2530 <span data-mce-fragment="1">We are excited to be offering this exclusive deal to all our amazing stylists.</span> 2531 2532 </div> 2533 <div class="view-more"> 2534 2535 <a href="/collections/framar" class="site-nav__dropdown-link"> 2536 View 2537 </a> 2538 2539 </div> 2540 2541</div> 2542 </div> 2543 </div> 2544 </div> 2545 </details> 2546 2547 </li><li class="site-nav__item site-nav__expanded-item site-nav--has-dropdown"> 2548 2549 <details 2550 data-hover="true" 2551 id="site-nav-item--3" 2552 class="site-nav__details" 2553 > 2554 <summary 2555 data-link="#" 2556 aria-expanded="false" 2557 aria-controls="site-nav-item--3" 2558 class="site-nav__link site-nav__link--underline site-nav__link--has-dropdown" 2559 > 2560 About The Hair <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg> 2561 </summary> 2562 2563<ul class="site-nav__dropdown text-left"><li class=""> 2564 <a href="/pages/dreamcatchers" class="site-nav__dropdown-link site-nav__dropdown-link--second-level"> 2565 About DreamCatchers 2566</a></li><li class=""> 2567 <a href="/pages/production-process" class="site-nav__dropdown-link site-nav__dropdown-link--second-level"> 2568 Production Process 2569</a></li><li class=""> 2570 <a href="/pages/color-styles" class="site-nav__dropdown-link site-nav__dropdown-link--second-level"> 2571 Colors & Styles 2572</a></li><li class=""> 2573 <a href="/apps/help-center" class="site-nav__dropdown-link site-nav__dropdown-link--second-level"> 2574 FAQâs 2575</a></li></ul> 2576 </details> 2577 2578 </li></ul> 2579</div> 2580 <div class="header-item header-item--logo"><style data-shopify>.header-item--logo, 2581 .header-layout--left-center .header-item--logo, 2582 .header-layout--left-center .header-item--icons { 2583 -webkit-box-flex: 0 1 80px; 2584 -ms-flex: 0 1 80px; 2585 flex: 0 1 80px; 2586 } 2587 2588 @media only screen and (min-width: 769px) { 2589 .header-item--logo, 2590 .header-layout--left-center .header-item--logo, 2591 .header-layout--left-center .header-item--icons { 2592 -webkit-box-flex: 0 0 80px; 2593 -ms-flex: 0 0 80px; 2594 flex: 0 0 80px; 2595 } 2596 } 2597 2598 .site-header__logo a { 2599 width: 80px; 2600 } 2601 .is-light .site-header__logo .logo--inverted { 2602 width: 80px; 2603 } 2604 @media only screen and (min-width: 769px) { 2605 .site-header__logo a { 2606 width: 80px; 2607 } 2608 2609 .is-light .site-header__logo .logo--inverted { 2610 width: 80px; 2611 } 2612 }</style><div class="h1 site-header__logo" itemscope itemtype="http://schema.org/Organization" > 2613 <a 2614 href="/" 2615 itemprop="url" 2616 class="site-header__logo-link logo--has-inverted" 2617 style="padding-top: 41.95804195804196%"> 2618 2619 2620 2621 2622 2623 2624 2625<image-element data-aos="image-fade-in" data-aos-offset="150"> 2626 2627 2628 2629<img src="//dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&width=160" alt="" srcset="//dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&width=80 80w, //dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&width=160 160w" width="80" height="33.56643356643357" loading="eager" class="small--hide image-element" sizes="80px" itemprop="logo"> 2630 2631 2632 2633</image-element> 2634 2635 2636 2637 2638<image-element data-aos="image-fade-in" data-aos-offset="150"> 2639 2640 2641 2642<img src="//dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&width=160" alt="" srcset="//dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&width=80 80w, //dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&width=160 160w" width="80" height="33.56643356643357" loading="eager" class="medium-up--hide image-element" sizes="80px"> 2643 2644 2645 2646</image-element> 2647</a><a 2648 href="/" 2649 itemprop="url" 2650 class="site-header__logo-link logo--inverted" 2651 style="padding-top: 39.40677966101695%"> 2652 2653 2654 2655 2656 2657 2658 2659<image-element data-aos="image-fade-in" data-aos-offset="150"> 2660 2661 2662 2663<img src="//dreamcatchers.com/cdn/shop/files/logo-black-small2-white.png?v=1613182700&width=160" alt="" srcset="//dreamcatchers.com/cdn/shop/files/logo-black-small2-white.png?v=1613182700&width=80 80w, //dreamcatchers.com/cdn/shop/files/logo-black-small2-white.png?v=1613182700&width=160 160w" width="80" height="31.52542372881356" loading="eager" class="small--hide image-element" sizes="80px" itemprop="logo"> 2664 2665 2666 2667</image-element> 2668 2669 2670 2671 2672<image-element data-aos="image-fade-in" data-aos-offset="150"> 2673 2674 2675 2676<img src="//dreamcatchers.com/cdn/shop/files/logo-black-small2-white.png?v=1613182700&width=160" alt="" srcset="//dreamcatchers.com/cdn/shop/files/logo-black-small2-white.png?v=1613182700&width=80 80w, //dreamcatchers.com/cdn/shop/files/logo-black-small2-white.png?v=1613182700&width=160 160w" width="80" height="31.52542372881356" loading="eager" class="medium-up--hide image-element" sizes="80px"> 2677 2678 2679 2680</image-element> 2681</a></div></div> 2682 <div class="header-item header-item--split-right"><ul
2683 class="site-nav site-navigation small--hide" 2684><li class="site-nav__item site-nav__expanded-item"> 2685 2686 <a 2687 href="https://portal.dreamcatchers.com/" 2688 class="site-nav__link site-nav__link--underline" 2689 > 2690 Education Hub 2691 </a> 2692 2693 2694 </li><li class="site-nav__item site-nav__expanded-item"> 2695 2696 <a 2697 href="/pages/yotpo-reviews" 2698 class="site-nav__link site-nav__link--underline" 2699 > 2700 Reviews 2701 </a> 2702 2703 2704 </li><li class="site-nav__item site-nav__expanded-item"> 2705 2706 <a 2707 href="/blogs/dreamcatchers-hair-blog" 2708 class="site-nav__link site-nav__link--underline" 2709 > 2710 Blog 2711 </a> 2712 2713 2714 </li><li class="site-nav__item site-nav__expanded-item"> 2715 2716 <a 2717 href="https://dreamcatchers.com/pages/dc-media-library" 2718 class="site-nav__link site-nav__link--underline" 2719 > 2720 DC Media Library 2721 </a> 2722 2723 2724 </li></ul> 2725</div> 2726</div> 2727<div class="header-item header-item--icons"><div class="site-nav"> 2728 <div class="site-nav__icons"><a class="site-nav__link site-nav__link--icon small--hide" href="/account"> 2729 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-user" viewBox="0 0 64 64"><title>account</title><path d="M35 39.84v-2.53c3.3-1.91 6-6.66 6-11.41 0-7.63 0-13.82-9-13.82s-9 6.19-9 13.82c0 4.75 2.7 9.51 6 11.41v2.53c-10.18.85-18 6-18 12.16h42c0-6.19-7.82-11.31-18-12.16Z"/></svg> 2730 <span class="icon__fallback-text">Log in 2731</span> 2732 </a><a href="/search" class="site-nav__link site-nav__link--icon js-search-header medium-up--hide"> 2733 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-search" viewBox="0 0 64 64"><title>icon-search</title><path d="M47.16 28.58A18.58 18.58 0 1 1 28.58 10a18.58 18.58 0 0 1 18.58 18.58ZM54 54 41.94 42"/></svg> 2734 <span class="icon__fallback-text">Search</span> 2735 </a><a href="/cart" class="site-nav__link site-nav__link--icon js-drawer-open-cart" aria-controls="CartDrawer" data-icon="bag"> 2736 <span class="cart-link"><svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-bag" viewBox="0 0 64 64"><g fill="none" stroke="#000" stroke-width="2"><path d="M25 26c0-15.79 3.57-20 8-20s8 4.21 8 20"/><path d="M14.74 18h36.51l3.59 36.73h-43.7z"/></g></svg><span class="icon__fallback-text">Cart</span> 2737 <span class="cart-link__bubble"></span> 2738 </span> 2739 </a> 2740 </div> 2741</div> 2742</div> 2743 </div></div> 2744 <div class="site-header__search-container"> 2745 <div class="site-header__search"> 2746 <div class="page-width"> 2747 <predictive-search data-context="header" data-enabled="true" data-dark="false"> 2748 <div class="predictive__screen" data-screen></div> 2749 <form action="/search" method="get" role="search"> 2750 <label for="Search" class="hidden-label">Search</label> 2751 <div class="search__input-wrap"> 2752 <input 2753 class="search__input" 2754 id="Search" 2755 type="search" 2756 name="q" 2757 value="" 2758 role="combobox" 2759 aria-expanded="false" 2760 aria-owns="predictive-search-results" 2761 aria-controls="predictive-search-results" 2762 aria-haspopup="listbox" 2763 aria-autocomplete="list" 2764 autocorrect="off" 2765 autocomplete="off" 2766 autocapitalize="off" 2767 spellcheck="false" 2768 placeholder="Search" 2769 tabindex="0" 2770 > 2771 <input name="options[prefix]" type="hidden" value="last"> 2772 <button class="btn--search" type="submit"> 2773 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-search" viewBox="0 0 64 64"><defs><style>.cls-1{fill:none;stroke:#000;stroke-miterlimit:10;stroke-width:2px}</style></defs><path class="cls-1" d="M47.16 28.58A18.58 18.58 0 1 1 28.58 10a18.58 18.58 0 0 1 18.58 18.58zM54 54L41.94 42"/></svg> 2774 <span class="icon__fallback-text">Search</span> 2775 </button> 2776 </div> 2777 2778 <button class="btn--close-search"> 2779 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><defs><style>.cls-1{fill:none;stroke:#000;stroke-miterlimit:10;stroke-width:2px}</style></defs><path class="cls-1" d="M19 17.61l27.12 27.13m0-27.13L19 44.74"/></svg> 2780 </button> 2781 <div id="predictive-search" class="search__results" tabindex="-1"></div> 2782 </form> 2783</predictive-search> 2784 2785 </div> 2786 </div> 2787 </div> 2788 </header></div> 2789 </div> 2790</div> 2791 2792</div> 2793<!-- END sections: header-group --><!-- BEGIN sections: popup-group --> 2794 2795<!-- END sections: popup-group --> 2796 2797 2798 2799 <main class="main-content " id="MainContent"> 2800 2801 <div id="shopify-section-template--21273657442550__main" class="shopify-section"><div class="page-width page-content"> 2802<header class="section-header text-center section-header--404"> 2803 <h1 class="section-header__title">Cart</h1> 2804 <div class="rte text-spacing"><p>Your cart is currently empty.</p><p><a href='/collections/all'>Continue shopping</a></p> 2805 </div> 2806 </header></div> 2807 2808 2809</div><div id="shopify-section-template--21273657442550__recently-viewed" class="shopify-section"><div 2810 data-subsection 2811 data-section-id="template--21273657442550__recently-viewed" 2812 data-section-type="recently-viewed" 2813 data-product-handle="" 2814 data-recent-count="5" 2815 data-grid-item-class="small--one-half medium-up--one-fifth" 2816 data-row-of="5" 2817 data-image-sizes="(min-width: 769px) 20vw, 39vw" 2818> 2819 <hr class="hr--large"> 2820 <div class="index-section index-section--small"> 2821 <div class="page-width"> 2822 <header class="section-header"> 2823 <h3 class="section-header__title">Recently viewed</h3> 2824 </header> 2825 </div> 2826 2827 <div class="page-width page-width--flush-small"> 2828 <div class="grid-overflow-wrapper"> 2829 <div id="RecentlyViewed-template--21273657442550__recently-viewed" class="grid grid--uniform" data-aos="overflow__animation"></div> 2830 </div> 2831 </div> 2832 </div> 2833</div> 2834 2835 2836</div> 2837 2838 </main><!-- BEGIN sections: footer-group --> 2839<div id="shopify-section-sections--21273656361206__footer" class="shopify-section shopify-section-group-footer-group"><style data-shopify>.site-footer {
2840 border-top: 1px solid #f0f0f0; 2841 }</style><footer class="site-footer" data-section-id="sections--21273656361206__footer" data-section-type="footer-section"> 2842 <div class="page-width"> 2843 2844 <div class="grid"><div class="grid__item footer__item--logo_social_CUTq6Y" data-type="logo_social"><style data-shopify>@media only screen and (min-width: 769px) and (max-width: 959px) { 2845 .footer__item--logo_social_CUTq6Y { 2846 width: 50%; 2847 padding-top: 40px; 2848 } 2849 .footer__item--logo_social_CUTq6Y:nth-child(2n + 1) { 2850 clear: left; 2851 } 2852 } 2853 @media only screen and (min-width: 960px) { 2854 .footer__item--logo_social_CUTq6Y { 2855 width: 95%; 2856 } 2857 2858 }</style><style data-shopify>.footer__logo a { 2859 height: 60px; 2860 }</style><div class="footer__logo"> 2861 <a href="/"> 2862 2863 2864 2865<image-element data-aos="image-fade-in" data-aos-offset="150"> 2866 2867 2868 2869<img src="//dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&width=286" alt="" srcset="//dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&width=143 143w, //dreamcatchers.com/cdn/shop/files/logo-nav-blak-pink.png?v=1613183050&width=286 286w" width="286.0" height="120.0" loading="lazy" class=" image-element" sizes="143.0px" style="max-width: 143.0px;max-height: 60px;"> 2870 2871 2872 2873</image-element> 2874</a> 2875 </div></div><div class="footer__clear small--hide"></div><div class="grid__item footer__item--menu-2" data-type="menu"><style data-shopify>@media only screen and (min-width: 769px) and (max-width: 959px) { 2876 .footer__item--menu-2 { 2877 width: 50%; 2878 padding-top: 40px; 2879 } 2880 .footer__item--menu-2:nth-child(2n + 1) { 2881 clear: left; 2882 } 2883 } 2884 @media only screen and (min-width: 960px) { 2885 .footer__item--menu-2 { 2886 width: 95%; 2887 } 2888 2889 }</style><div 2890 > 2891 <div class="collapsible-content__inner"> 2892 <div class="footer__collapsible footer_collapsible--disabled"> 2893 <ul class="no-bullets site-footer__linklist footer-menu-custom"><li> 2894 <a href="/collections/all-products">SHOP</a> 2895 2896 <ul class="child"> 2897 2898 <li><a href= "/pages/4-in-1-certification">Online Certification</a> 2899 2900 </li> 2901 2902 <li><a href= "/collections/i-tip">I-Tip Hair Extensions</a> 2903 2904 </li> 2905 2906 <li><a href= "/collections/tape-in">Tape In Hair Extensions</a> 2907 2908 </li> 2909 2910 <li><a href= "/collections/weft">Weft Hair Extensions</a> 2911 2912 </li> 2913 2914 <li><a href= "/collections/k-tip">K-Tip Hair Extensions</a> 2915 2916 </li> 2917 2918 <li><a href= "/pages/toppers-landing-page">Toppers </a> 2919 2920 </li> 2921 2922 <li><a href= "https://dreamcatchers.com/collections/all-products/products/dc-crown-n-glory?">Crown-N-Glory Hair Extensions</a> 2923 2924 </li> 2925 2926 <li><a href= "/collections/accessories">Accessories</a> 2927 2928 </li> 2929 2930 </ul> 2931 2932 </li><li> 2933 <a href="/pages/dreamcatchers">THE HAIR</a> 2934 2935 <ul class="child"> 2936 2937 <li><a href= "/pages/color-styles">Colors & Styles</a> 2938 2939 </li> 2940 2941 <li><a href= "/pages/dreamcatchers">About DreamCatchers</a> 2942 2943 </li> 2944 2945 <li><a href= "/pages/production-process">Production Process</a> 2946 2947 </li> 2948 2949 <li><a href= "/pages/dc-media-library">Media Library</a> 2950 2951 </li> 2952 2953 <li><a href= "/pages/yotpo-reviews">Reviews</a> 2954 2955 </li> 2956 2957 <li><a href= "https://dreamcatchers.com/blogs/dreamcatchers-hair-blog/">Blog</a> 2958 2959 </li> 2960 2961 </ul> 2962 2963 </li><li> 2964 <a href="/collections/hands-on-trainings">GET CERTIFIED</a> 2965 2966 <ul class="child"> 2967 2968 <li><a href= "/pages/sign-up">Become Certified</a> 2969 2970 </li> 2971 2972 <li><a href= "/collections/hands-on-trainings">Hands-On Trainings</a> 2973 2974 </li> 2975 2976 <li><a href= "/apps/help-center">FAQ's</a> 2977 2978 </li> 2979 2980 <li><a href= "/pages/sign-up">Contact Us</a> 2981 2982 </li> 2983 2984 </ul> 2985 2986 </li><li> 2987 <a href="https://dreamcatchers.com/pages/refund-return-policy">Terms of Service</a> 2988 2989 <ul class="child"> 2990 2991 <li><a href= "/policies/terms-of-service">Terms of Service</a> 2992 2993 </li> 2994 2995 <li><a href= "/pages/warranty-returns-exchanges">Warranty & Returns</a> 2996 2997 <ul class="grandchild"> 2998 2999 <li><a href= "http://returns.dreamcatchers.com/return">Start a Return or Exchange (855-373-2683)</a></li> 3000 3001 </ul> 3002 3003 </li> 3004 3005 <li><a href= "/pages/shipping-delivery">Shipping & Delivery</a> 3006 3007 </li> 3008 3009 <li><a href= "/policies/refund-policy">Refund & Return policy</a> 3010 3011 </li> 3012 3013 <li><a href= "/pages/privacy-policy">Privacy Policy</a> 3014 3015 </li> 3016 3017 </ul> 3018 3019 </li></ul> 3020 </div> 3021 </div> 3022 </div></div></div> 3023 3024 <div class="footer--social"> 3025 <ul class="no-bullets social-icons footer__social"><li> 3026 <a target="_blank" rel="noopener" href="https://www.instagram.com/dreamcatchershair/" title="DreamCatchers Hair Extensions on Instagram"> 3027 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-instagram" viewBox="0 0 32 32"><title>instagram</title><path fill="#444" d="M16 3.094c4.206 0 4.7.019 6.363.094 1.538.069 2.369.325 2.925.544.738.287 1.262.625 1.813 1.175s.894 1.075 1.175 1.813c.212.556.475 1.387.544 2.925.075 1.662.094 2.156.094 6.363s-.019 4.7-.094 6.363c-.069 1.538-.325 2.369-.544 2.925-.288.738-.625 1.262-1.175 1.813s-1.075.894-1.813 1.175c-.556.212-1.387.475-2.925.544-1.663.075-2.156.094-6.363.094s-4.7-.019-6.363-.094c-1.537-.069-2.369-.325-2.925-.544-.737-.288-1.263-.625-1.813-1.175s-.894-1.075-1.175-1.813c-.212-.556-.475-1.387-.544-2.925-.075-1.663-.094-2.156-.094-6.363s.019-4.7.094-6.363c.069-1.537.325-2.369.544-2.925.287-.737.625-1.263 1.175-1.813s1.075-.894 1.813-1.175c.556-.212 1.388-.475 2.925-.544 1.662-.081 2.156-.094 6.363-.094zm0-2.838c-4.275 0-4.813.019-6.494.094-1.675.075-2.819.344-3.819.731-1.037.4-1.913.944-2.788 1.819S1.486 4.656 1.08 5.688c-.387 1-.656 2.144-.731 3.825-.
3027075 1.675-.094 2.213-.094 6.488s.019 4.813.094 6.494c.075 1.675.344 2.819.731 3.825.4 1.038.944 1.913 1.819 2.788s1.756 1.413 2.788 1.819c1 .387 2.144.656 3.825.731s2.213.094 6.494.094 4.813-.019 6.494-.094c1.675-.075 2.819-.344 3.825-.731 1.038-.4 1.913-.944 2.788-1.819s1.413-1.756 1.819-2.788c.387-1 .656-2.144.731-3.825s.094-2.212.094-6.494-.019-4.813-.094-6.494c-.075-1.675-.344-2.819-.731-3.825-.4-1.038-.944-1.913-1.819-2.788s-1.756-1.413-2.788-1.819c-1-.387-2.144-.656-3.825-.731C20.812.275 20.275.256 16 .256z"/><path fill="#444" d="M16 7.912a8.088 8.088 0 0 0 0 16.175c4.463 0 8.087-3.625 8.087-8.088s-3.625-8.088-8.088-8.088zm0 13.338a5.25 5.25 0 1 1 0-10.5 5.25 5.25 0 1 1 0 10.5zM26.294 7.594a1.887 1.887 0 1 1-3.774.002 1.887 1.887 0 0 1 3.774-.003z"/></svg> 3028 <span class="icon__fallback-text">Instagram</span> 3029 </a> 3030 </li><li> 3031 <a target="_blank" rel="noopener" href="https://www.facebook.com/dreamcatchersHair" title="DreamCatchers Hair Extensions on Facebook"> 3032 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-facebook" viewBox="0 0 14222 14222"><path d="M14222 7112c0 3549.352-2600.418 6491.344-6000 7024.72V9168h1657l315-2056H8222V5778c0-562 275-1111 1159-1111h897V2917s-814-139-1592-139c-1624 0-2686 984-2686 2767v1567H4194v2056h1806v4968.72C2600.418 13603.344 0 10661.352 0 7112 0 3184.703 3183.703 1 7111 1s7111 3183.703 7111 7111Zm-8222 7025c362 57 733 86 1111 86-377.945 0-749.003-29.485-1111-86.28Zm2222 0v-.28a7107.458 7107.458 0 0 1-167.717 24.267A7407.158 7407.158 0 0 0 8222 14137Zm-167.717 23.987C7745.664 14201.89 7430.797 14223 7111 14223c319.843 0 634.675-21.479 943.283-62.013Z"/></svg> 3033 <span class="icon__fallback-text">Facebook</span> 3034 </a> 3035 </li><li> 3036 <a target="_blank" rel="noopener" href="https://www.youtube.com/channel/UC9x1egq6PNyY2wI1lvkqkvA" title="DreamCatchers Hair Extensions on YouTube"> 3037 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-youtube" viewBox="0 0 21 20"><path fill="#444" d="M-.196 15.803q0 1.23.812 2.092t1.977.861h14.946q1.165 0 1.977-.861t.812-2.092V3.909q0-1.23-.82-2.116T17.539.907H2.593q-1.148 0-1.969.886t-.82 2.116v11.894zm7.465-2.149V6.058q0-.115.066-.18.049-.016.082-.016l.082.016 7.153 3.806q.066.066.066.164 0 .066-.066.131l-7.153 3.806q-.033.033-.066.033-.066 0-.098-.033-.066-.066-.066-.131z"/></svg> 3038 <span class="icon__fallback-text">YouTube</span> 3039 </a> 3040 </li><li> 3041 <a target="_blank" rel="noopener" href="https://www.tiktok.com/@dreamcatchershair" title="DreamCatchers Hair Extensions on TikTok"> 3042 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-tiktok" viewBox="0 0 2859 3333"><path d="M2081 0c55 473 319 755 778 785v532c-266 26-499-61-770-225v995c0 1264-1378 1659-1932 753-356-583-138-1606 1004-1647v561c-87 14-180 36-265 65-254 86-398 247-358 531 77 544 1075 705 992-358V1h551z"/></svg> 3043 <span class="icon__fallback-text">TikTok</span> 3044 </a> 3045 </li></ul> 3046 3047 <p class="footer__small-text phone-footer">Call us <strong>1-855-DREAM-TEAM</strong></p> 3048 </div></div><p class="footer__small-text footer__copyright"> 3049 © 2026 DreamCatchers Hair Extensions 3050 3051 All Rights Reserved 3052 3053 </p></footer> 3054 3055 3056</div> 3057<!-- END sections: footer-group --></div> 3058 </div><div id="VideoModal" class="modal modal--solid"> 3059 <div class="modal__inner"> 3060 <div class="modal__centered page-width text-center"> 3061 <div class="modal__centered-content"> 3062 <div class="video-wrapper video-wrapper--modal"> 3063 <div id="VideoHolder"></div> 3064 </div> 3065 </div> 3066 </div> 3067 </div> 3068 3069 <button type="button" class="modal__close js-modal-close text-link"> 3070 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><title>icon-X</title><path d="m19 17.61 27.12 27.13m0-27.12L19 44.74"/></svg> 3071 <span class="icon__fallback-text">"Close (esc)"</span> 3072 </button> 3073</div> 3074<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true"> 3075 <div class="pswp__bg"></div> 3076 <div class="pswp__scroll-wrap"> 3077 <div class="pswp__container"> 3078 <div class="pswp__item"></div> 3079 <div class="pswp__item"></div> 3080 <div class="pswp__item"></div> 3081 </div> 3082 3083 <div class="pswp__ui pswp__ui--hidden"> 3084 <button class="btn btn--body btn--circle pswp__button pswp__button--arrow--left" title="Previous"> 3085 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-chevron-left" viewBox="0 0 284.49 498.98"><path d="M249.49 0a35 35 0 0 1 24.75 59.75L84.49 249.49l189.75 189.74a35.002 35.002 0 1 1-49.5 49.5L10.25 274.24a35 35 0 0 1 0-49.5L224.74 10.25A34.89 34.89 0 0 1 249.49 0Z"/></svg> 3086 </button> 3087 3088 <button class="btn btn--body btn--circle btn--large pswp__button pswp__button--close" title="Close (esc)"> 3089 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><title>icon-X</title><path d="m19 17.61 27.12 27.13m0-27.12L19 44.74"/></svg> 3090 </button> 3091 3092 <button class="btn btn--body btn--circle pswp__button pswp__button--arrow--right" title="Next"> 3093 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-chevron-right" viewBox="0 0 284.49 498.98"><title>icon-chevron</title><path d="M35 498.98a35 35 0 0 1-24.75-59.75l189.74-189.74L10.25 59.75a35.002 35.002 0 0 1 49.5-49.5l214.49 214.49a35 35 0 0 1 0 49.5L59.75 488.73A34.89 34.89 0 0 1 35 498.98Z"/></svg> 3094 </button> 3095 </div> 3096 </div> 3097</div> 3098<tool-tip data-tool-tip=""> 3099 <div class="tool-tip__inner" data-tool-tip-inner> 3100 <button class="tool-tip__close" data-tool-tip-close=""><svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><title>icon-X</title><path d="m19 17.61 27.12 27.13m0-27.12L19 44.74"/></svg></button> 3101 <div data-tool-tip-title>Your Shopping Cart</div> 3102 <div class="tool-tip__content" data-tool-tip-content> 3103 </div> 3104 </div> 3105</tool-tip> 3106 3107 <template id="naturalImageMarkup"> 3108 <div class="image-wrap" style="height: 0;"> 3109 <image-element data-aos="image-fade-in" data-aos-offset="150"> 3110 <img class="grid-product__image image-element" width height src srcset loading="lazy" alt> 3111 </image-element> 3112 </div> 3113 </template> 3114 <template id="fixedRatioImageMarkup"> 3115 <div class="grid__image-ratio"> 3116 <image-element data-aos="image-fade-in" data-aos-offset="150"> 3117 <img class="image-element" width height src srcset loading="lazy" alt> 3118 </image-element> 3119 </div> 3120 </template>
3120<script> 3121(function() { 3122 'use strict'; 3123 3124 var AUTO_ADD_VARIANT = 48539324743926; 3125 var QUALIFYING = new Set([6775689052310,6775739121814,6690747842710,7444269662454,8460776767734,8983408247030,6775789093014,6775816650902,6775828086934,6775843881110,6944976928918,6893267681430,7952901013750,6893106331798,6690747842710,8983408247030,8891442954486,8891462222070,8891438924022,8891472937206,6772712964246,6772719583382,6944976928918,2296384618555,2296386945083,6690747842710,8983408247030,6772894761110,6772900626582,2296388911163,2001849811003,2296387567675,4339725205563,6690747842710,8049201414390,8983408247030,8983408247030,6944976928918,2001891295291,2296384618555,6893267681430,2296386945083,2296391041083,2296391335995,2296391827515,2296392220731,7944981774582,4313316589627,4604821831739,4604823601211,6690747842710,9461058535670,8033966031094,6711331684502,6711335977110,6893106331798,7444269662454,2001849811003,2296388911163,4339725205563,2296387567675,7952901013750,8049201414390,8842119807222,8870325977334,8460776767734,8911784607990,8460777554166,8460780044534,9400136466678,9400138137846,9400138924278,9400136827126,9400136794358,7597127926006,7597130973430,7597140377846,7597126713590,7597119701238,7597120061686,7597117833462,7597119373558,7597129990390,7597117276406,7597137625334,7597127303414,7597118849270,7597134086390,7597129597174,7597130252534,7597121994998,7597137887478,7597122814198,7597130449142,7597137527030,7597130711286,7597131137270,7597133398262,9109438202102,0]); 3126 QUALIFYING.delete(0); 3127 3128 if (!QUALIFYING.size) return; 3129 3130 var _native = window.fetch; 3131 var _busy = false; 3132 3133 window.fetch = function(resource, init) { 3134 var url = typeof resource === 'string' 3135 ? resource 3136 : (resource instanceof Request ? resource.url : ''); 3137 3138 if (url.indexOf('cart/add') !== -1) { 3139 return _native.apply(this, arguments).then(function(response) { 3140 if (response.ok && !_busy) { 3141 response.clone().json().then(function(data) { 3142 var ids = Array.isArray(data.items) 3143 ? data.items.map(function(i) { return i.product_id; }) 3144 : data.product_id ? [data.product_id] : []; 3145 3146 if (ids.some(function(id) { return QUALIFYING.has(id); })) { 3147 addReturnProduct(); 3148 } 3149 }).catch(function() {}); 3150 } 3151 return response; 3152 }); 3153 } 3154 3155 return _native.apply(this, arguments); 3156 }; 3157 3158 function addReturnProduct() { 3159 _busy = true; 3160 3161 _native('/cart.js', { credentials: 'same-origin' }) 3162 .then(function(r) { return r.json(); }) 3163 .then(function(cart) { 3164 var alreadyInCart = cart.items.some(function(item) { 3165 return item.variant_id === AUTO_ADD_VARIANT; 3166 }); 3167 if (alreadyInCart) return null; 3168 3169 return _native('/cart/add.js', { 3170 method: 'POST', 3171 headers: { 'Content-Type': 'application/json' }, 3172 body: JSON.stringify({ id: AUTO_ADD_VARIANT, quantity: 1 }) 3173 }); 3174 }) 3175 .then(function(response) { 3176 _busy = false; 3177 if (response && response.ok) { 3178 document.dispatchEvent(new CustomEvent('cart:build')); 3179 } 3180 }) 3181 .catch(function() { 3182 _busy = false; 3183 }); 3184 } 3185})(); 3186</script>
3186 3187<div id="shopify-block-AVEtGd2tPMlM0RmlGM__14017166734719355524" class="shopify-block shopify-app-block"><div id="hc-widget" style="display: block"></div> 3188
3189<script> 3190 window.HCAppData = {extShopId: 13094256699} 3191</script>
3191 3192
3193<script type="text/javascript" async="" src="https://s3.helpcenterapp.com/cdn/widget/mount-widget.js"></script>
3193 3194 3195</div><div id="shopify-block-ANURKWnVhaGhFZlo5N__14054365922915784782" class="shopify-block shopify-app-block">
3195<script type="text/javascript" async="" src="https://helpcenter.eoscity.com/app-extension/13094256699/tabs.js"></script>
3195 3196</div>
3196<script src="https://cdn.shopify.com/storefront/standard-actions.js" type="module" data-source-attribution="shopify.standard_actions"></script>
3196 3197</body> 3198</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.