1<!doctype html> 2<html lang="en"> 3<head > 4 <meta charset="utf-8"/>
4<script type="text/javascript">(window.NREUM||(NREUM={})).init={ajax:{deny_list:["bam.nr-data.net"]}};(window.NREUM||(NREUM={})).loader_config={licenseKey:"fcf28e5364",applicationID:"95730697",browserID:"95730795"};;/*! For license information please see nr-loader-rum-1.322.0.min.js.LICENSE.txt */ 5(()=>{var e={8122(e,t,r){"use strict";r.d(t,{a:()=>i});var n=r(944);function i(e,t){try{if(!e||"object"!=typeof e)return(0,n.R)(3);if(!t||"object"!=typeof t)return(0,n.R)(4);const r=Object.create(Object.getPrototypeOf(t),Object.getOwnPropertyDescriptors(t)),a=0===Object.keys(r).length?e:r;for(let s in a)if(void 0!==e[s])try{if(null===e[s]){r[s]=null;continue}Array.isArray(e[s])&&Array.isArray(t[s])?r[s]=Array.from(new Set([...e[s],...t[s]])):e[s]instanceof Map||e[s]instanceof Set||e[s]instanceof Date||e[s]instanceof RegExp?r[s]=e[s]:"object"==typeof e[s]&&null!==t[s]&&"object"==typeof t[s]?r[s]=i(e[s],t[s]):r[s]=e[s]}catch(e){r[s]||(0,n.R)(1,e)}return r}catch(e){(0,n.R)(2,e)}}},2555(e,t,r){"use strict";r.d(t,{f:()=>s});var n=r(384),i=r(8122);const a={beacon:n.NT.beacon,errorBeacon:n.NT.errorBeacon,licenseKey:void 0,applicationID:void 0,sa:void 0,queueTime:void 0,applicationTime:void 0,ttGuid:void 0,user:void 0,account:void 0,product:void 0,extra:void 0,jsAttributes:{},userAttributes:void 0,atts:void 0,transactionName:void 0,tNamePlain:void 0};function s(e){try{return!!e.licenseKey&&!!e.errorBeacon&&!!e.applicationID}catch(e){return!1}}r.d(t,["D",0,e=>(0,i.a)(e,a)])},7699(e,t,r){"use strict";var n=r(860);const i={[n.K7.logging]:!0,[n.K7.genericEvents]:!0,[n.K7.jserrors]:!0,[n.K7.ajax]:!0};r.d(t,["It",0,1e6,"KC",0,i,"qh",0,"SESSION_ERROR"])},9324(e,t,r){"use strict";r.d(t,["xv",0,"1.322.0"])},981(e,t,r){"use strict";r.d(t,["R",0,{AJAX:"AjaxRequest",PA:"PageAction",UA:"UserAction",BP:"BrowserPerformance",WS:"WebSocket",SPV:"SecurityPolicyViolation",JSE:"JavaScriptError",LOG:"Log",PVE:"PageView",PVT:"PageViewTiming",SR:"SessionReplay",ST:"SessionTrace",BI:"BrowserInteraction"}])},6154(e,t,r){"use strict";var n=r(1863);const i="undefined"!=typeof window&&!!window.document,a="undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self.navigator instanceof WorkerNavigator||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis.navigator instanceof WorkerNavigator),s=i?window:"undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis),o=Boolean("hidden"===s?.document?.visibilityState),c=""+s?.location,u=/iPad|iPhone|iPod/.test(s.navigator?.userAgent),d=u&&"undefined"==typeof SharedWorker,l=((()=>{const e=s.navigator?.userAgent?.match(/Firefox[/\s](\d+\.\d+)/);Array.isArray(e)&&e.length>=2&&e[1]})(),Date.now()-(0,n.t)());r.d(t,["OF",0,u,"RI",0,i,"WN",0,l,"bv",0,a,"gm",0,s,"m",0,c,"mw",0,o,"sb",0,d,"zk",0,()=>{const e=s?.performance?.getEntriesByType?.("navigation")?.[0];if(e&&e.responseStart>0&&e.responseStart<s.performance.now())return e}])},3241(e,t,r){"use strict";r.d(t,{W:()=>i});var n=r(6154);function i(e={}){try{n.gm.dispatchEvent(new CustomEvent("newrelic",{detail:e}))}catch(e){}}},1687(e,t,r){"use strict";r.d(t,{Ak:()=>o,Ze:()=>u,x3:()=>c});var n=r(3241),i=r(3606),a=r(860),s=r(2646);function o(e,t){if(!e)return;const r={staged:!1,priority:a.P3[t]||0};e.runtime.drainRegistry.get(t)||e.runtime.drainRegistry.set(t,r)}function c(e,t){if(!e)return;const r=e.runtime.drainRegistry;r&&(r.get(t)&&r.delete(t),l(e,t,!1),r.size&&d(e))}function u(e,t="feature",r=!1){if(e){if(!e.runtime.drainRegistry.get(t)||r)return l(e,t);e.runtime.drainRegistry.get(t).staged=!0,d(e)}}function d(e){if(!e)return;const t=Array.from(e.runtime.drainRegistry);t.every(([e,t])=>t.staged)&&(t.sort((e,t)=>e[1].priority-t[1].priority),t.forEach(([t])=>{e.runtime.drainRegistry.delete(t),l(e,t)}))}function l(e,t,r=!0){if(!e)return;const a=e.ee,o=i.i.handlers;if(a&&!a.aborted&&a.backlog&&o){if((0,n.W)({type:"lifecycle",name:"drain",feature:t}),r){const e=a.backlog[t],r=o[t];if(r){for(let t=0;e&&t<e.length;++t)f(e[t],r);Object.entries(r).forEach(([e,t])=>{Object.values(t||{}
5).forEach(t=>{t[0]?.on&&t[0].context()instanceof s.y&&!t[0].listeners(e).includes(t[1])&&t[0].on(e,t[1])})})}}a.isolatedBacklog||delete o[t],a.backlog[t]=null,a.emit("drain-"+t,[])}}function f(e,t){var r=e[1];Object.values(t[r]||{}).forEach(t=>{var r=e[0];if(t[0]===r){var n=t[1],i=e[3],a=e[2];n.apply(i,a)}})}},7836(e,t,r){"use strict";var n=r(384),i=r(8990),a=r(2646),s=r(5607);const o="nr@context:".concat(s.W),c=function e(t,r){var n={},s={},d={},l=!1;try{l=16===r.length&&u.initializedAgents?.[r]?.runtime.isolatedBacklog}catch(e){}var f={on:p,addEventListener:p,removeEventListener:function(e,t){var r=n[e];if(!r)return;for(var i=0;i<r.length;i++)r[i]===t&&r.splice(i,1)},emit:function(e,r,n,i,a){!1!==a&&(a=!0);if(c.aborted&&!i)return;t&&a&&t.emit(e,r,n);var o=g(n);m(e).forEach(e=>{e.apply(o,r)});var u=v()[s[e]];u&&u.push([f,e,r,o]);return o},get:h,listeners:m,context:g,buffer:function(e,t){const r=v();if(t=t||"feature",f.aborted)return;Object.entries(e||{}).forEach(([e,n])=>{s[n]=t,t in r||(r[t]=[])})},abort:function(){f._aborted=!0,Object.keys(f.backlog).forEach(e=>{delete f.backlog[e]})},isBuffering:function(e){return!!v()[s[e]]},debugId:r,backlog:l?{}:t&&"object"==typeof t.backlog?t.backlog:{},isolatedBacklog:l};return Object.defineProperty(f,"aborted",{get:()=>{let e=f._aborted||!1;return e||(t&&(e=t.aborted),e)}}),f;function g(e){return e&&e instanceof a.y?e:e?(0,i.I)(e,o,()=>new a.y(o)):new a.y(o)}function p(e,t){n[e]=m(e).concat(t)}function m(e){return n[e]||[]}function h(t){return d[t]=d[t]||e(f,t)}function v(){return f.backlog}}(void 0,"globalEE"),u=(0,n.Zm)();u.ee||(u.ee=c),r.d(t,["P",0,o,"ee",0,c])},2646(e,t,r){"use strict";r.d(t,{y:()=>n});class n{constructor(e){this.contextId=e}}},9908(e,t,r){"use strict";r.d(t,{d:()=>n,p:()=>i});var n=r(7836).ee.get("handle");function i(e,t,r,i,a){a?(a.buffer([e],i),a.emit(e,t,r)):(n.buffer([e],i),n.emit(e,t,r))}},3606(e,t,r){"use strict";r.d(t,{i:()=>a});var n=r(9908);a.on=s;var i=a.handlers={};function a(e,t,r,a){s(a||n.d,i,e,t,r)}function s(e,t,r,i,a){a||(a="feature"),e||(e=n.d);var s=t[a]=t[a]||{};(s[r]=s[r]||[]).push([e,i])}},3878(e,t,r){"use strict";function n(e,t){return{capture:e,passive:!1,signal:t}}function i(e,t,r=!1,i){window.addEventListener(e,t,n(r,i))}function a(e,t,r=!1,i){document.addEventListener(e,t,n(r,i))}r.d(t,{DD:()=>a,jT:()=>n,sp:()=>i})},5607(e,t,r){"use strict";const n=(0,r(9566).bz)();r.d(t,["W",0,n])},9566(e,t,r){"use strict";r.d(t,{LA:()=>s,bz:()=>a});var n=r(6154);function i(e,t){return e?15&e[t]:16*Math.random()|0}function a(){const e=n.gm?.crypto||n.gm?.msCrypto;let t,r=0;return e&&e.getRandomValues&&(t=e.getRandomValues(new Uint8Array(30))),"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".split("").map(e=>"x"===e?i(t,r++).toString(16):"y"===e?(3&i()|8).toString(16):e).join("")}function s(e){const t=n.gm?.crypto||n.gm?.msCrypto;let r,a=0;t&&t.getRandomValues&&(r=t.getRandomValues(new Uint8Array(e)));const s=[];for(var o=0;o<e;o++)s.push(i(r,a++).toString(16));return s.join("")}},2614(e,t,r){"use strict";r.d(t,["BB",0,18e5,"Wt",0,"NRBA_SESSION::","iL",0,{SAME_TAB:"same-tab",CROSS_TAB:"cross-tab"},"tS",0,{STARTED:"session-started",PAUSE:"session-pause",RESET:"session-reset",RESUME:"session-resume",UPDATE:"session-update"},"wk",0,144e5])},1863(e,t,r){"use strict";function n(){return Math.floor(performance.now())}r.d(t,{t:()=>n})},944(e,t,r){"use strict";r.d(t,{R:()=>i});var n=r(3241);function i(e,t){"function"==typeof console.debug&&(console.debug("New Relic Warning: https://github.com/newrelic/newrelic-browser-agent/blob/main/docs/warning-codes.md#".concat(e),t),(0,n.W)({drained:null,type:"data",name:"warn",feature:"warn",data:{code:e,secondary:t}}))}},8990(e,t,r){"use strict";r.d(t,{I:()=>i});var n=Object.prototype.hasOwnProperty;function i(e,t,r){if(n.call(e,t))return e[t];var i=r();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,t,{value:i,writable:!0,enumerable:!1}),i}catch(e){}return e[t]=i,i}},6389(e,t,r){"use strict";function n(e,t=500,r={}){const n=r?.leading||!1;let i;return(...r)=>{n&&void 0===i&&(e.apply(this,r),i=setTimeout(()=>{i=clearTimeout(i)},t)),n||(clearTimeout(i),i=setTimeout(()=>{e.apply(this,r)},t))}}function i(e){let t=!1;return(...r)=>{t||(t=!0,e.apply(this,r))}}r.d(t,{J:()=>i,s:()=>n})},1910(e,t,r){"use strict";r.d(t,{i:()=>a});var n=r(944);const i=new Map;function a(...e){return e.every(e=>{if(i.has(e))return i.get(e);const t="function"==typeof e?e.toString():"",r=t.includes("[native code]"),a=t.includes("nrWrapper");return r||a||(0,n.R)(64,e?.name||t),i.set(e,r),r})}},5289(e,t,r){"use strict";r.d(t,{GG:()=>s,Qr:()=>c,sB:()=>o});var n=r(3878),i=r(6389);function a(){return"undefined"==typeof document||"complete"===document.readyState}function s(e,t){if(a())return e();const r=(0,i.J)(e),s=setInterval(()=>
5{a()&&(clearInterval(s),r())},500);(0,n.sp)("load",r,t)}function o(e){if(a())return e();(0,n.DD)("DOMContentLoaded",e)}function c(e){if(a())return e();(0,n.sp)("popstate",e)}},384(e,t,r){"use strict";r.d(t,{Zm:()=>c,bQ:()=>d,dV:()=>u,pV:()=>l});var n=r(6154),i=r(1863),a=r(944),s=r(1910);const o={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net"};function c(){return n.gm.NREUM||(n.gm.NREUM={}),void 0===n.gm.newrelic&&(n.gm.newrelic=n.gm.NREUM),n.gm.NREUM}function u(){let e=c();return e.o||(e.o={ST:n.gm.setTimeout,SI:n.gm.setImmediate||n.gm.setInterval,CT:n.gm.clearTimeout,XHR:n.gm.XMLHttpRequest,REQ:n.gm.Request,EV:n.gm.Event,PR:n.gm.Promise,MO:n.gm.MutationObserver,FETCH:n.gm.fetch,WS:n.gm.WebSocket},(0,s.i)(...Object.values(e.o))),e}function d(e,t){let r=c();r.initializedAgents??={},t.initializedAt={ms:(0,i.t)(),date:new Date},r.initializedAgents[e]=t,2===Object.keys(r.initializedAgents).length&&(0,a.R)(69)}function l(){return function(){let e=c();const t=e.info||{};e.info={beacon:o.beacon,errorBeacon:o.errorBeacon,...t}}(),function(){let e=c();const t=e.init||{};e.init={...t}}(),u(),function(){let e=c();const t=e.loader_config||{};e.loader_config={...t}}(),c()}r.d(t,["NT",0,o])},2843(e,t,r){"use strict";r.d(t,{G:()=>a,u:()=>i});var n=r(3878);function i(e,t=!1,r,i){(0,n.DD)("visibilitychange",function(){if(t)return void("hidden"===document.visibilityState&&e());e(document.visibilityState)},r,i)}function a(e,t,r){(0,n.sp)("pagehide",e,t,r)}},9300(e,t,r){"use strict";r(860).K7.ajax;r.d(t,["mo",0,{NONE:"none",FAILURES:"failures",ALL:"all"}])},3969(e,t,r){"use strict";const n=r(860).K7.metrics;r.d(t,["TZ",0,n,"XG",0,"storeEventMetrics","xV",0,"storeSupportabilityMetrics"])},6630(e,t,r){"use strict";const n=r(860).K7.pageViewEvent;r.d(t,["T",0,n])},782(e,t,r){"use strict";const n=r(860).K7.pageViewTiming;r.d(t,["T",0,n])},4234(e,t,r){"use strict";r.d(t,{W:()=>i});var n=r(1687);class i{constructor(e,t){this.agentRef=e,this.ee=e?.ee,this.featureName=t,this.blocked=!1}deregisterDrain(){(0,n.x3)(this.agentRef,this.featureName)}}},7767(e,t,r){"use strict";var n=r(6154);r.d(t,["V",0,e=>n.RI&&!0===e?.privacy.cookies_enabled])},8362(e,t,r){"use strict";r.d(t,{d:()=>a});var n=r(9566),i=r(1741);class a extends i.W{agentIdentifier=(0,n.LA)(16)}},1741(e,t,r){"use strict";r.d(t,{W:()=>a});var n=r(944),i=r(4261);class a{#e(e,...t){if(this[e]!==a.prototype[e])return this[e](...t);(0,n.R)(35,e)}addPageAction(e,t){return this.#e(i.hG,e,t)}register(e){return this.#e(i.eY,e)}recordCustomEvent(e,t){return this.#e(i.fF,e,t)}setPageViewName(e,t){return this.#e(i.Fw,e,t)}setCustomAttribute(e,t,r){return this.#e(i.cD,e,t,r)}noticeError(e,t){return this.#e(i.o5,e,t)}setUserId(e,t=!1){return this.#e(i.Dl,e,t)}setApplicationVersion(e){return this.#e(i.nb,e)}setErrorHandler(e){return this.#e(i.bt,e)}addRelease(e,t){return this.#e(i.k6,e,t)}log(e,t){return this.#e("log",e,t)}start(){return this.#e("start")}finished(e){return this.#e(i.BL,e)}recordReplay(){return this.#e(i.CH)}pauseReplay(){return this.#e(i.Tb)}addToTrace(e){return this.#e(i.U2,e)}setCurrentRouteName(e){return this.#e(i.PA,e)}interaction(e){return this.#e(i.dT,e)}wrapLogger(e,t,r){return this.#e(i.Wb,e,t,r)}measure(e,t){return this.#e(i.V1,e,t)}consent(e){return this.#e(i.Pv,e)}}},4261(e,t,r){"use strict";r.d(t,["BL",0,"finished","CH",0,"recordReplay","Dl",0,"setUserId","Fw",0,"setPageViewName","PA",0,"setCurrentRouteName","Pv",0,"consent","Tb",0,"pauseReplay","U2",0,"addToTrace","V1",0,"measure","Wb",0,"wrapLogger","bt",0,"setErrorHandler","cD",0,"setCustomAttribute","dT",0,"interaction","eY",0,"register","fF",0,"recordCustomEvent","hG",0,"addPageAction","k6",0,"addRelease","nb",0,"setApplicationVersion","o5",0,"noticeError"])},1738(e,t,r){"use strict";r.d(t,{U:()=>l,Y:()=>d});var n=r(3241),i=r(9908),a=r(1863),s=r(944),o=r(3969),c=r(8362),u=r(860);function d(e,t,r,a){const d=a||r;!d||d[e]&&d[e]!==c.d.prototype[e]||(d[e]=function(){(0,i.p)(o.xV,["API/"+e+"/called"],void 0,u.K7.metrics,r.ee),(0,n.W)({drained:!!r.runtime?.activatedFeatures,type:"data",name:"api",feature:"api-"+e,data:{}});try{return t.apply(this,arguments)}catch(e){(0,s.R)(23,e)}})}function l(e,t,r,n,s){const o=e.info;null===r?delete o.jsAttributes[t]:o.jsAttributes[t]=r,(s||null===r)&&(0,i.p)("api-"+n,[(0,a.t)(),t,r],void 0,"session",e.ee)}},8374(e,t,r){r.nc=(()=>{try{return document?.currentScript?.nonce}catch(e){}return""})()},860(e,t,r){"use strict";const n="events",i="jserrors",a="browser/blobs",s="browser/logs",o={ajax:"ajax",genericEvents:"generic_events",jserrors:i,logging:"logging",metrics:"metrics",pageAction:"page_action",pageViewEvent:"page_view_event",pageViewTiming:"page_view_timing",sessionReplay:"session_replay",sessionTrace:"session_trace",softNav:"soft_navigations"},c={[o.pageViewEvent]:1,[o.pageViewTiming]:2,[o.metrics]:3,[o.jserrors]:4,[o.softNav]:5,[o.ajax]:6,[o.sessionTrace]:7,[o.sessionReplay]:8,[o.logging]:9,[o.genericEvents]:10},u={[o.pageViewEvent]:"rum",[o.pageViewTiming]:n,[o.ajax]:n,[o.softNav]:n,[o.metrics]:i,[o.jserrors]:i,[o.sessionTrace]:a,[o.sessionReplay]:a,[o.logging]:s,[o.genericEvents]:"ins"};r.d(t,["$J",0,u,"K7",0,o,"P3",0,c,"XX",0,i,"Yy",0,s,"df",0,a,"hg",0,"connect"])}};const t={};function r(n){const i=t[n];if(void 0!==i)return i.exports;const a=t[n]={exports:{}};return e[n](a,a.exports,r),a.exports}r.m=e,r.d=(e,t)=>{if(Array.isArray(t))for(var n=0;n<t.length;){var i=t[n++],a=t[n++];r.o(e,i)?0===a&&n++:0===a?Object.defineProperty(e,i,{enumerable:!0,value:t[n++]}):Object.defineProperty(e,i,{enumerable:!0,get:a})}else for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((t,n)=>(r.f[n](e,t),t),[])),r.u=e=>"nr-rum-1.322.0.min.js",r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{const e={},t="NRBA-1.322.0.PROD:";r.l=(n,i,a,s)=>{if(e[n])return void e[n].push(i);let o,c;if(void 0!==a){const e=document.getElementsByTagName("script");for(var u=0;u<e.length;u++){const r=e[u];if(r.getAttribute("src")==n||r.getAttribute("data-webpack")==t+a){o=r;break}}}if(!o){c=!0;var d={296:"sha512-/59P7qAoMYQDJAZerTRPChdYcdrlcoEAw2TwA1wz6Y0/XLmt3sblL
5I5JCXAuxG0YxsW7iqJzgrcO7NJWO58EfQ=="};o=document.createElement("script"),o.charset="utf-8",r.nc&&o.setAttribute("nonce",r.nc),o.setAttribute("data-webpack",t+a),o.src=n,0!==o.src.indexOf(window.location.origin+"/")&&(o.crossOrigin="anonymous"),d[s]&&(o.integrity=d[s])}e[n]=[i];const l=(t,r)=>{o.onerror=o.onload=null,clearTimeout(f);const i=e[n];if(delete e[n],o.parentNode?.removeChild(o),i?.forEach(e=>e(r)),t)return t(r)},f=setTimeout(l.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=l.bind(null,o.onerror),o.onload=l.bind(null,o.onload),c&&document.head.appendChild(o)}})(),r.r=e=>{Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="https://js-agent.newrelic.com/",(()=>{const e={374:0,840:0};r.f.j=(t,n)=>{let i=r.o(e,t)?e[t]:void 0;if(0!==i)if(i)n.push(i[2]);else{const a=new Promise((r,n)=>i=e[t]=[r,n]);n.push(i[2]=a);const s=r.p+r.u(t),o=new Error,c=n=>{if(r.o(e,t)&&(i=e[t],0!==i&&(e[t]=void 0),i)){const e=n&&("load"===n.type?"missing":n.type),r=n&&n.target&&n.target.src;o.message="Loading chunk "+t+" failed: ("+e+": "+r+")",o.name="ChunkLoadError",o.type=e,o.request=r,i[1](o)}};r.l(s,c,"chunk-"+t,t)}};const t=(t,n)=>{let[i,a,s]=n;var o,c,u=0;if(i.some(t=>0!==e[t])){for(o in a)r.o(a,o)&&(r.m[o]=a[o]);if(s)s(r)}for(t&&t(n);u<i.length;u++)c=i[u],r.o(e,c)&&e[c]&&e[c][0](),e[c]=0},n=self["webpackChunk:NRBA-1.322.0.PROD"]=self["webpackChunk:NRBA-1.322.0.PROD"]||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})(),(()=>{"use strict";r(8374);var e=r(8362),t=r(860);const n=Object.values(t.K7);var i=r(384),a=r(1741);var s=r(2555),o=r(981);t.K7.genericEvents,o.R.PA,o.R.UA,o.R.BP;const c={RESOURCES:"experimental.resources",REGISTER:"register"};var u=r(9300);const d=e=>{if(!e||"string"!=typeof e)return!1;try{document.createDocumentFragment().querySelector(e)}catch{return!1}return!0};var l=r(2614),f=r(944),g=r(8122);const p="[data-nr-mask]",m=e=>(0,g.a)(e,(()=>{const e={feature_flags:[],experimental:{register:!1,resources:!1,iframe_bridge:!1,iframe_domains:[]},mask_selector:"*",block_selector:"[data-nr-block]",mask_input_options:{color:!1,date:!1,"datetime-local":!1,email:!1,month:!1,number:!1,range:!1,search:!1,tel:!1,text:!1,time:!1,url:!1,week:!1,textarea:!1,select:!1,password:!0}};return{ajax:{deny_list:void 0,block_internal:!0,enabled:!0,autoStart:!0,capture_payloads:u.mo.NONE},api:{register:{get enabled(){return e.feature_flags.includes(c.REGISTER)||e.experimental.register},set enabled(t){e.experimental.register=t},duplicate_data_to_container:!1,get allow_iframe_bridge(){return e.feature_flags.includes(c.IFRAME_BRIDGE)||e.experimental.iframe_bridge},set allow_iframe_bridge(t){e.experimental.iframe_bridge=t},get iframe_domains(){return e.experimental.iframe_domains},set iframe_domains(t){Array.isArray(t)?e.experimental.iframe_domains=t:(0,f.R)(1,t)}}},browser_consent_mode:{enabled:!1},distributed_tracing:{enabled:void 0,exclude_newrelic_header:void 0,cors_use_newrelic_header:void 0,cors_use_tracecontext_headers:void 0,allowed_origins:void 0},get feature_flags(){return e.feature_flags},set feature_flags(t){e.feature_flags=t},generic_events:{enabled:!0,autoStart:!0},harvest:{interval:30},jserrors:{enabled:!0,autoStart:!0},logging:{enabled:!0,autoStart:!0},metrics:{enabled:!0,autoStart:!0},obfuscate:void 0,page_action:{enabled:!0},page_view_event:{enabled:!0,autoStart:!0},page_view_timing:{enabled:!0,autoStart:!0},performance:{capture_marks:!1,capture_measures:!1,capture_detail:!0,resources:{get enabled(){return e.feature_flags.includes(c.RESOURCES)||e.experimental.resources},set enabled(t){e.experimental.resources=t},asset_types:[],first_party_domains:[],ignore_newrelic:!0}},privacy:{cookies_enabled:!0},proxy:{assets:void 0,beacon:void 0},session:{expiresMs:l.wk,inactiveMs:l.BB},session_replay:{autoStart:!0,enabled:!1,preload:!1,sampling_rate:10,error_sampling_rate:100,collect_fonts:!1,inline_images:!1,fix_stylesheets:!0,mask_all_inputs:!0,get mask_text_selector(){return e.mask_selector},set mask_text_selector(t){d(t)?e.mask_selector="".concat(t,",").concat(p):""===t||null===t?e.mask_selector=p:(0,f.R)(5,t)},get block_class(){return"nr-block"},get ignore_class(){return"nr-ignore"},get mask_text_class(){return"nr-mask"},get block_selector(){return e.block_selector},set block_selector(t){d(t)?e.block_selector+=",".concat(t):""!==t&&(0,f.R)(6,t)},get mask_input_options(){return e.mask_input_options},set mask_input_options(t){t&&"object"==typeof t?e.mask_input_options={...t,password:!0}:(0,f.R)(7,t)}},session_trace:{enabled:!0,autoStart:!0},soft_navigations:{enabled:!0,autoStart:!0},ssl:void 0,user_actions:{enabled:!0,elementAttributes:["id","className","tagName","type"]},web_sockets:{enabled:!1}}})());var h=r(6154),v=r(9324);let b=0;const y={buildEnv:"PROD",distMethod:"CDN",version:v.xv,originTime:h.WN},_={consented:!1},w={activatedFeatures:void 0,appMetadata:{},configured:!1,get consented(){return this.session?.state?.consent||_.consented},set consented(e){_.consented=e}
5,customTransaction:void 0,denyList:[],disabled:!1,drainRegistry:new Map,connector:void 0,harvester:void 0,v2Target:void 0,isolatedBacklog:!1,isRecording:!1,loaderType:void 0,maxBytes:3e4,obfuscator:void 0,onerror:void 0,ptid:void 0,releaseIds:{},session:void 0,timeKeeper:void 0,registeredEntities:[],jsAttributesMetadata:{bytes:0},get harvestCount(){return++b},listeningForIframeMessages:!1},R="BA";var A=r(7836),x=r(3241);const E={accountID:void 0,trustKey:void 0,agentID:void 0,licenseKey:void 0,applicationID:void 0,xpid:void 0};var S=r(9908);const k="newrelic-iframe-";function T(e,t={},n,o){let{init:c,info:u,loader_config:d,runtime:l={},exposed:f=!0}=t;if(!u){const e=(0,i.pV)();c=e.init,u=e.info,d=e.loader_config}var p;e.init=m(c||{}),e.loader_config=(p=d||{},(0,g.a)(p,E)),u.jsAttributes??={},h.bv&&(u.jsAttributes.isWorker=!0),e.info=(0,s.D)(u);const v=e.init;e.runtime??=(e=>{const t=(0,g.a)(e,w),r=Object.keys(y).reduce((e,t)=>(e[t]={value:y[t],writable:!1,configurable:!0,enumerable:!0},e),{});return Object.defineProperties(t,r)})(l),e.runtime.v2Target??={type:R,instance:e.agentIdentifier,get id(){return e.runtime.appMetadata?.agents?.[0]?.entityGuid},get attributes(){return{"entity.guid":this.id,appId:e.info.applicationID}}},v.proxy.assets&&(e=>{const t=e.startsWith("http");e+="/",r.p=t?e:"https://"+e})(v.proxy.assets),e.runtime.configured||(Object.defineProperty(e,"beacons",{get:()=>[e.info.beacon,e.info.errorBeacon,e.init.proxy.assets,e.init.proxy.beacon].filter(Boolean)}),Object.defineProperty(e.runtime,"denyList",{get:()=>[...e.init.ajax.deny_list||[],...e.init.ajax.block_internal?e.beacons:[]]}),e.runtime.ptid=e.agentIdentifier,function(e){const t=(0,i.pV)();Object.getOwnPropertyNames(a.W.prototype).forEach(r=>{const n=a.W.prototype[r];if("function"!=typeof n||"constructor"===n)return;let i=t[r];e[r]&&!1!==e.exposed&&"micro-agent"!==e.runtime?.loaderType&&(t[r]=(...t)=>{const n=e[r](...t);return i?i(...t):n})})}(e),e.runtime.loaderType=n,e.ee=A.ee.get(e.agentIdentifier),e.exposed=f,(0,x.W)({drained:!!e.runtime.activatedFeatures,type:"lifecycle",name:"initialize",feature:void 0,data:e.config}),e.init.api.register.allow_iframe_bridge&&h.gm.addEventListener("message",t=>{"string"==typeof t.data?.type&&t.data.type.startsWith(k)&&(0,S.p)("iframe-message",[t],void 0,"IFRAME",e.ee)}),e.runtime.configured=!0)}var j=r(1863),P=r(4261),N=r(1738);
5var O=r(1687),M=r(4234),I=r(5289),D=r(7767);function V(e){return!!(0,i.dV)().o.MO&&(0,D.V)(e)&&!0===e?.session_trace.enabled}var W=r(6389),B=r(7699);const C=new WeakSet,K=new WeakMap;class U extends M.W{constructor(e,t){super(e,t),this.abortHandler=void 0,this.featAggregate=void 0,this.loadedSuccessfully=void 0,this.onAggregateImported=new Promise(e=>{this.loadedSuccessfully=e}),this.deferred=Promise.resolve(),!1===e.init[this.featureName].autoStart?this.deferred=new Promise((t,r)=>{this.ee.on("manual-start-all",(0,W.J)(()=>{(0,O.Ak)(e,this.featureName),t()}))}):(0,O.Ak)(e,t)}importAggregator(e,t,n={}){if(this.featAggregate)return;const i=async()=>{if(await this.deferred,this.#t(e),!(0,s.f)(e.info))return(0,f.R)(43),e.ee.abort(),void this.loadedSuccessfully(!1);try{await async function(e,t,n){if(K.has(e))return K.get(e);const i=(async()=>{if((0,D.V)(e.init))try{const{setupAgentSession:t}=await r.e(296).then(r.bind(r,1768));t(e)}catch(e){(0,f.R)(20,e),t.emit("internal-error",[e]),(0,S.p)(B.qh,[e],void 0,n,t)}if(e.init.api.register.allow_iframe_bridge)try{const{setupIframeMFEMessageListener:t}=await Promise.resolve().then(function(){const e=new Error("Cannot find module '../../loaders/configure/iframe-message-handler'");throw e.code="MODULE_NOT_FOUND",e});t(e)}catch(e){(0,f.R)(23,e)}const[{Connector:i},{Harvester:a}]=await Promise.all([r.e(296).then(r.bind(r,6589)),r.e(296).then(r.bind(r,5237))]);e.runtime.connector=new i(e),e.runtime.harvester=new a(e);const s=Object.values(e.features).filter(t=>e.runtime.drainRegistry.has(t.featureName));Promise.all(s.map(e=>e.onAggregateImported)).then(()=>e.runtime.harvester.startTimer())})();K.set(e,i),await i}(e,this.ee,this.featureName)}catch(e){return(0,f.R)(79,e),this.ee.abort(),void this.loadedSuccessfully(!1)}try{if(!this.#r(this.featureName,e.runtime.session,e.init))return this.abortHandler?.(),(0,O.Ze)(this.agentRef,this.featureName),void this.loadedSuccessfully(!1);const{Aggregate:r}=await t();this.featAggregate=new r(e,n),e.runtime.harvester.initializedAggregates.push(this.featAggregate),this.loadedSuccessfully(!0)}catch(e){(0,f.R)(34,e),this.abortHandler?.(),(0,O.Ze)(this.agentRef,this.featureName,!0),this.loadedSuccessfully(!1)}};h.RI?(0,I.GG)(()=>i(),!0):i()}#r(e,r,n){if(this.blocked)return!1;switch(e){case t.K7.sessionReplay:return V(n)&&!!r;case t.K7.sessionTrace:return!!r;default:return!0}}#t(e){if(!C.has(e)&&(C.add(e),!(0,s.f)(e.info))){const t=(0,i.pV)();let r={...t.info?.jsAttributes};try{r={...r,...e.info?.jsAttributes}}catch(e){}T(e,{...t,info:{...t.info,jsAttributes:r},runtime:e.runtime},e.runtime.loaderType)}}}var L=r(6630);class F extends U{static featureName=L.T;constructor(e){var t;super(e,L.T),this.setupInspectionEvents(),t=e,(0,N.Y)(P.Fw,function(e,r){"string"==typeof e&&("/"!==e.charAt(0)&&(e="/"+e),t.runtime.customTransaction=(r||"http://custom.transaction")+e,(0,S.p)("api-"+P.Fw,[(0,j.t)()],void 0,void 0,t.ee))},t),this.importAggregator(e,()=>e.init.feature_flags.includes("rum_v2")?r.e(296).then(r.bind(r,908)):r.e(296).then(r.bind(r,7927)))}setupInspectionEvents(){const e=(e,t)=>{e&&(0,x.W)({timeStamp:e.timeStamp,loaded:"complete"===e.target.readyState,type:"window",name:t,data:e.target.location+""})};(0,I.sB)(t=>{e(t,"DOMContentLoaded")}),(0,I.GG)(t=>{e(t,"load")}),(0,I.Qr)(t=>{e(t,"navigate")}),this.ee.on(l.tS.UPDATE,(e,t)=>{(0,x.W)({type:"lifecycle",name:"session",data:t})})}}class G extends e.d{constructor(e){var t;(super(),h.gm)?(this.features={},(0,i.bQ)(this.agentIdentifier,this),this.desiredFeatures=new Set(e.features||[]),this.desiredFeatures.add(F),T(this,e,e.loaderType||"agent"),t=this,(0,N.Y)(P.cD,function(e,r,n=!1){if("string"==typeof e){if(["string","number","boolean"].includes(typeof r)||null===r)return(0,N.U)(t,e,r,P.cD,n);(0,f.R)(40,typeof r)}else(0,f.R)(39,typeof e)},t),function(e){(0,N.Y)(P.Dl,function(t,r=!1){if("string"!=typeof t&&null!==t)return void(0,f.R)(41,typeof t);const n=e.info.jsAttributes["enduser.id"];r&&null!=n&&n!==t?(0,S.p)("api-setUserIdAndResetSession",[t],void 0,"session",e.ee):(0,N.U)(e,"enduser.id",t,P.Dl,!0)},e)}(this),function(e){(0,N.Y)(P.nb,function(t){if("string"==typeof t||null===t)return(0,N.U)(e,"application.version",t,P.nb,!1);(0,f.R)(42,typeof t)},e)}(this),function(e){(0,N.Y)("start",function(){e.ee.emit("manual-start-all")},e)}(this),function(e){(0,N.Y)(P.Pv,function(t=!0){if("boolean"==typeof t){if((0,S.p)("api-"+P.Pv,[t],void 0,"session",e.ee),e.runtime.consented=t,t){const t=e.features.page_view_event;t.onAggregateImported.then(e=>{const r=t.featAggregate;e&&!r.sentRum&&r.sendRum?.()})}}else(0,f.R)(65,typeof t)},e)}(this),this.run()):(0,f.R)(21)}get config(){return{info:this.info,init:this.init,loader_config:this.loader_config,runtime:this.runtime}}get api(){return this}run(){try{const e=function(e){const t={};
5return n.forEach(r=>{t[r]=!!e[r]?.enabled}),t}(this.init),r=[...this.desiredFeatures],i=this.init.feature_flags.includes("rum_v2");r.sort((e,r)=>t.P3[e.featureName]-t.P3[r.featureName]),r.forEach(r=>{if(!e[r.featureName]&&(i||r.featureName!==t.K7.pageViewEvent))return;const n=function(e){switch(e){case t.K7.ajax:return[t.K7.jserrors];case t.K7.sessionTrace:return[t.K7.ajax,t.K7.pageViewEvent];case t.K7.sessionReplay:return[t.K7.sessionTrace];case t.K7.pageViewTiming:return[t.K7.pageViewEvent];default:return[]}}(r.featureName).filter(e=>!(e in this.features));n.length>0&&(0,f.R)(36,{targetFeature:r.featureName,missingDependencies:n}),this.features[r.featureName]=new r(this)})}catch(e){(0,f.R)(22,e);for(const e in this.features)this.features[e].abortHandler?.();const t=(0,i.Zm)();delete t.initializedAgents[this.agentIdentifier]?.features,delete this.sharedAggregator;return t.ee.get(this.agentIdentifier).abort(),!1}}}var H=r(2843),z=r(782);class Y extends U{static featureName=z.T;constructor(e){super(e,z.T),h.RI&&((0,H.u)(()=>(0,S.p)("docHidden",[(0,j.t)()],void 0,z.T,this.ee),!0),(0,H.G)(()=>(0,S.p)("winPagehide",[(0,j.t)()],void 0,z.T,this.ee)),this.importAggregator(e,()=>r.e(296).then(r.bind(r,9981))))}}var Z=r(3969);class q extends U{static featureName=Z.TZ;constructor(e){super(e,Z.TZ),this.importAggregator(e,()=>r.e(296).then(r.bind(r,9623)))}}new G({features:[F,Y,q],loaderType:"lite"})})()})();</script>
5 6<meta name="title" content="About Us"/> 7<meta name="robots" content="INDEX,FOLLOW"/> 8<meta name="viewport" content="width=device-width, initial-scale=1"/> 9<title>About Us</title> 10<link rel="stylesheet" type="text/css" media="all" href="https://www.outdoornativitysets.com/static/version1789694905/frontend/Kadro/outdoor_nativity_sets_hyva/en_US/css/styles.css" /> 11<link rel="stylesheet" type="text/css" defer="defer" href="https://www.outdoornativitysets.com/static/version1789694905/frontend/Kadro/outdoor_nativity_sets_hyva/en_US/Hyva_PayPalBraintree/css/apple-pay-and-google-pay.min.css" /> 12<!--[if IE 11]>
13<script type="text/javascript" src="https://www.outdoornativitysets.com/static/version1789694905/frontend/Kadro/outdoor_nativity_sets_hyva/en_US/Klevu_Search/js/klevu/ieUrlPolyfill.js"></script>
13 14<![endif]--> 15<link rel="canonical" href="https://www.outdoornativitysets.com/about-us" /> 16<link rel="icon" type="image/x-icon" href="https://www.outdoornativitysets.com/media/favicon/stores/7/favicon.ico" /> 17<link rel="shortcut icon" type="image/x-icon" href="https://www.outdoornativitysets.com/media/favicon/stores/7/favicon.ico" /> 18<!-- Theme Scope: Store View --> 19 20<meta name="google-site-verification" content="vOwkjKpVFyjunryPd9BEx-gKNdTYiHNioB3dgP_dxSA" /> 21 22<meta name="google-site-verification" content="9NXTtV4JwQL9qo00pyt29yiR95F8CKdYxC5OIpSUnuM" /> 23 24<!-- Osano -->
25<script src="https://cmp.osano.com/8ejcWpwXQJ/ba349da9-d966-4213-b936-8868b41d98eb/osano.js"></script>
25 26 27<!-- ContactForm -->
28<script type='text/javascript'> 29 document.addEventListener('DOMContentLoaded', function (event) { 30 31 var openBtn = document.querySelector('.openZendeskHelpButton'); 32 var block = document.querySelector('#mobile-contact-block'); 33 if(!openBtn) { 34 return; 35 } 36 openBtn.addEventListener("click", function(){ 37 if(typeof block !== 'undefined' && block) { 38 block.style.display = "block"; 39 } 40 }); 41 42 var closeBtn = document.querySelector('#contact-popup-close'); 43 if(!closeBtn) { 44 return; 45 } 46 closeBtn.addEventListener("click", function(){ 47 if(typeof block !== 'undefined' && block) { 48 block.style.display = "none"; 49 } 50 }); 51 52 var openLink = document.querySelector('#openZendeskHelpLink'); 53 if(!openLink) { 54 return; 55 } 56 openLink.addEventListener("click", function() { 57 openBtn.click(); 58 }); 59 }); 60</script>
60 61 62<!-- Misc -->
63<script type="text/javascript"> 64 // Init toggle function 65 if (typeof window.toggleIdVis == 'undefined' 66 || window.toggleIdVis == null 67 || typeof window.toggleIdVis !== 'function' 68 ) { 69 window.toggleIdVis = function(id) { 70 let elem = document.getElementById(id); 71 if(!elem) { 72 return; 73 } 74 if ( elem.style.display == '' || elem.style.display == 'block' ) { 75 elem.style.display = 'none'; 76 } else { 77 elem.style.display = 'block'; 78 } 79 } 80 } 81</script>
81 82 83<!-- UserWay -->
84<script defer src="https://cdn.userway.org/widget.js" data-account="4DTlzP3DEx"></script>
vendor: 2 bytes, line 84
84
85<script type="text/javascript"> 86document.addEventListener("DOMContentLoaded", function(event) { 87 // Prevent Userway from interfering with focus on search input on mobile when suggestions are loaded as the user types 88 const observer = new MutationObserver((mutationList) => { 89 for (const mutation of mutationList) { 90 if (mutation.type === 'childList' && mutation.addedNodes.length > 0) { 91 var klevuContainers = [].slice.call(mutation.addedNodes).filter(function(e) { 92 return e.tagName === 'DIV' && e.classList.contains('klevuWrap') 93 }); 94 for (const container of klevuContainers) { 95 for (const klevuLink of Array.from(container.querySelectorAll('a'))) { 96 klevuLink.dataset.uwRmIgnore = ""; 97 } 98 } 99 } 100 } 101 }); 102 observer.observe(document.querySelector('body'), { subtree: true, childList: true }); 103}); 104</script>
104 105 106 <link rel="preconnect" href="https://statsjs.klevu.com" crossorigin="anonymous"/> <link rel="preconnect" href="https://js.klevu.com" crossorigin="anonymous"/>
107<script nonce="dTVodmpqN2U3dDY0YjBzMGUzN2pjOHcwcnlqdDdmN3o="> 108 window.YIREO_GOOGLETAGMANAGER2_ENABLED = true; 109 (function (events) { 110 const initYireoGoogleTagManager2 = function () { 111 events.forEach(function (eventType) { 112 window.removeEventListener(eventType, initYireoGoogleTagManager2); 113 }); 114 115 (function (w, d, s, l, i) { 116 w[l] = w[l] || []; 117 w[l].push({'gtm.start': new Date().getTime(), event: 'gtm.js'}); 118 var f = d.getElementsByTagName(s)[0], 119 j = d.createElement(s), 120 dl = l != 'dataLayer' ? '&l=' + l : ''; 121 j.async = true; 122 j.src = 'https://www.googletagmanager.com' + '/gtm.js?id=' + i + dl; 123 f.parentNode.insertBefore(j, f); 124 })(window, document, 'script', 'dataLayer', 'GTM-NS6TFXL'); 125 }; 126 127 events.forEach(function (eventType) { 128 window.addEventListener(eventType, initYireoGoogleTagManager2, {once: true, passive: true}) 129 }); 130 })(['load', 'keydown', 'mouseover', 'scroll', 'touchstart', 'wheel']); 131 132 </script>
vendor: 1 bytes, line 132
132
133<script> 134 var BASE_URL = 'https://www.outdoornativitysets.com/'; 135 var THEME_PATH = 'https://www.outdoornativitysets.com/static/version1789694905/frontend/Kadro/outdoor_nativity_sets_hyva/en_US'; 136 var COOKIE_CONFIG = { 137 "expires": null, 138 "path": "\u002F", 139 "domain": ".www.outdoornativitysets.com", 140 "secure": true, 141 "lifetime": "7884000", 142 "cookie_restriction_enabled": false }; 143 var CURRENT_STORE_CODE = 'ons_site_eng'; 144 var CURRENT_WEBSITE_ID = '7'; 145 146 window.hyva = window.hyva || {} 147 148 window.cookie_consent_groups = window.cookie_consent_groups || {} 149 window.cookie_consent_groups['necessary'] = true; 150 151 window.cookie_consent_config = window.cookie_consent_config || {}; 152 window.cookie_consent_config['necessary'] = [].concat( 153 window.cookie_consent_config['necessary'] || [], 154 [ 155 'user_allowed_save_cookie', 156 'form_key', 157 'mage-messages', 158 'private_content_version', 159 'mage-cache-sessid', 160 'last_visited_store', 161 'section_data_ids' 162 ] 163 ); 164</script>
vendor: 1 bytes, line 164
164
165<script> 166 'use strict'; 167 (function( hyva, undefined ) { 168 169 function lifetimeToExpires(options, defaults) { 170 171 const lifetime = options.lifetime || defaults.lifetime; 172 173 if (lifetime) { 174 const date = new Date; 175 date.setTime(date.getTime() + lifetime * 1000); 176 return date; 177 } 178 179 return null; 180 } 181 182 function generateRandomString() { 183 184 const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 185 length = 16; 186 187 let formKey = '', 188 charactersLength = allowedCharacters.length; 189 190 for (let i = 0; i < length; i++) { 191 formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))] 192 } 193 194 return formKey; 195 } 196 197 const sessionCookieMarker = {noLifetime: true} 198 199 const cookieTempStorage = {}; 200 201 const internalCookie = { 202 get(name) { 203 const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); 204 return v ? v[2] : null; 205 }, 206 set(name, value, days, skipSetDomain) { 207 let expires, 208 path, 209 domain, 210 secure, 211 samesite; 212 213 const defaultCookieConfig = { 214 expires: null, 215 path: '/', 216 domain: null, 217 secure: false, 218 lifetime: null, 219 samesite: 'lax' 220 }; 221 222 const cookieConfig = window.COOKIE_CONFIG || {}; 223 224 expires = days && days !== sessionCookieMarker 225 ? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig) 226 : lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires; 227 228 path = cookieConfig.path || defaultCookieConfig.path; 229 domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain); 230 secure = cookieConfig.secure || defaultCookieConfig.secure; 231 samesite = cookieConfig.samesite || defaultCookieConfig.samesite; 232 233 document.cookie = name + "=" + encodeURIComponent(value) + 234 (expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') + 235 (path ? '; path=' + path : '') + 236 (domain ? '; domain=' + domain : '') + 237 (secure ? '; secure' : '') + 238 (samesite ? '; samesite=' + samesite : 'lax'); 239 }, 240 isWebsiteAllowedToSaveCookie() { 241 const allowedCookies = this.get('user_allowed_save_cookie'); 242 if (allowedCookies) { 243 const allowedWebsites = JSON.parse(unescape(allowedCookies)); 244 245 return allowedWebsites[CURRENT_WEBSITE_ID] === 1; 246 } 247 return false; 248 }, 249 getGroupByCookieName(name) { 250 const cookieConsentConfig = window.cookie_consent_config || {}; 251 let group = null; 252 for (let prop in cookieConsentConfig) { 253 if (!cookieConsentConfig.hasOwnProperty(prop)) continue; 254 if (cookieConsentConfig[prop].includes(name)) { 255 group = prop; 256 break; 257 } 258 } 259 return group; 260 }, 261 isCookieAllowed(name) { 262 const cookieGroup = this.getGroupByCookieName(name); 263 return cookieGroup 264 ? window.cookie_consent_groups[cookieGroup] 265 : this.isWebsiteAllowedToSaveCookie(); 266 }, 267 saveTempStorageCookies() { 268 for (const [name, data] of Object.entries(cookieTempStorage)) { 269 if (this.isCookieAllowed(name)) { 270 this.set(name, data['value'], data['days'], data['skipSetDomain']); 271 delete cookieTempStorage[name]; 272 } 273 } 274 } 275 }; 276 277 hyva.getCookie = (name) => { 278 const cookieConfig = window.COOKIE_CONFIG || {}; 279 280 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 281 return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null; 282 } 283 284 return internalCookie.get(name); 285 } 286 287 hyva.setCookie = (name, value, days, skipSetDomain) => { 288 const cookieConfig = window.COOKIE_CONFIG || {}; 289 290 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 291 cookieTempStorage[name] = {value, days, skipSetDomain}; 292 return; 293 } 294 return internalCookie.set(name, value, days, skipSetDomain); 295 } 296 297 298 hyva.setSessionCookie = (name, value, skipSetDomain) => { 299 return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain) 300 } 301 302 hyva.getBrowserStorage = () => { 303 const browserStorage = window.localStorage || window.sessionStorage; 304 if (!browserStorage) { 305 console.warn('Browser Storage is unavailable'); 306 return false;
307 } 308 try { 309 browserStorage.setItem('storage_test', '1'); 310 browserStorage.removeItem('storage_test'); 311 } catch (error) { 312 console.warn('Browser Storage is not accessible', error); 313 return false; 314 } 315 return browserStorage; 316 } 317 318 hyva.postForm = (postParams) => { 319 const form = document.createElement("form"); 320 321 let data = postParams.data; 322 323 if (! postParams.skipUenc && ! data.uenc) { 324 data.uenc = btoa(window.location.href); 325 } 326 form.method = "POST"; 327 form.action = postParams.action; 328 329 Object.keys(postParams.data).map(key => { 330 const field = document.createElement("input"); 331 field.type = 'hidden' 332 field.value = postParams.data[key]; 333 field.name = key; 334 form.appendChild(field); 335 }); 336 337 const form_key = document.createElement("input"); 338 form_key.type = 'hidden'; 339 form_key.value = hyva.getFormKey(); 340 form_key.name="form_key"; 341 form.appendChild(form_key); 342 343 document.body.appendChild(form); 344 345 form.submit(); 346 } 347 348 hyva.getFormKey = function () { 349 let formKey = hyva.getCookie('form_key'); 350 351 if (!formKey) { 352 formKey = generateRandomString(); 353 hyva.setCookie('form_key', formKey); 354 } 355 356 return formKey; 357 } 358 359 hyva.formatPrice = (value, showSign, options = {}) => { 360 const groupSeparator = options.groupSeparator; 361 const decimalSeparator = options.decimalSeparator 362 delete options.groupSeparator; 363 delete options.decimalSeparator; 364 const formatter = new Intl.NumberFormat( 365 'en\u002DUS', 366 Object.assign({ 367 style: 'currency', 368 currency: 'USD', 369 signDisplay: showSign ? 'always' : 'auto' 370 }, options) 371 ); 372 return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ? 373 formatter.formatToParts(value).map(({type, value}) => { 374 switch (type) { 375 case 'currency': 376 return '\u0024' || value; 377 case 'minusSign': 378 return '- '; 379 case 'plusSign': 380 return '+ '; 381 case 'group': 382 return groupSeparator !== undefined ? groupSeparator : value; 383 case 'decimal': 384 return decimalSeparator !== undefined ? decimalSeparator : value; 385 default : 386 return value; 387 } 388 }).reduce((string, part) => string + part) : 389 formatter.format(value); 390 } 391 392 const formatStr = function (str, nStart) { 393 const args = Array.from(arguments).slice(2); 394 395 return str.replace(/(%+)([0-9]+)/g, (m, p, n) => { 396 const idx = parseInt(n) - nStart; 397 398 if (args[idx] === null || args[idx] === void 0) { 399 return m; 400 } 401 return p.length % 2 402 ? p.slice(0, -1).replace('%%', '%') + args[idx] 403 : p.replace('%%', '%') + n; 404 }) 405 } 406 407 hyva.str = function (string) { 408 const args = Array.from(arguments); 409 args.splice(1, 0, 1); 410 411 return formatStr.apply(undefined, args); 412 } 413 414 hyva.strf = function () { 415 const args = Array.from(arguments); 416 args.splice(1, 0, 0); 417 418 return formatStr.apply(undefined, args); 419 } 420 421 /** 422 * Take a html string as `content` parameter and 423 * extract an element from the DOM to replace in 424 * the current page under the same selector, 425 * defined by `targetSelector` 426 */ 427 hyva.replaceDomElement = (targetSelector, content) => { 428 // Parse the content and extract the DOM node using the `targetSelector` 429 const parser = new DOMParser(); 430 const doc = parser.parseFromString(content, 'text/html');
431 const contentNode = doc.querySelector(targetSelector); 432 433 // Bail if content or target can't be found 434 if (!contentNode || !document.querySelector(targetSelector)) { 435 return; 436 } 437 438 hyva.activateScripts(contentNode); 439 440 // Replace the old DOM node with the new content 441 document.querySelector(targetSelector).replaceWith(contentNode); 442 443 // Reload customerSectionData and display cookie-messages if present 444 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 445 hyva.initMessages(); 446 } 447 448 hyva.removeScripts = (contentNode) => { 449 const scripts = contentNode.getElementsByTagName('script'); 450 for (let i = 0; i < scripts.length; i++) { 451 scripts[i].parentNode.removeChild(scripts[i]); 452 } 453 const templates = contentNode.getElementsByTagName('template'); 454 for (let i = 0; i < templates.length; i++) { 455 const container = document.createElement('div'); 456 container.innerHTML = templates[i].innerHTML; 457 hyva.removeScripts(container); 458 templates[i].innerHTML = container.innerHTML; 459 } 460 } 461 462 hyva.activateScripts = (contentNode) => { 463 // Create new array from HTMLCollection to avoid mutation of collection while manipulating the DOM. 464 const scripts = Array.from(contentNode.getElementsByTagName('script')); 465 466 // Iterate over all script tags to duplicate+inject each into the head 467 for (const original of scripts) { 468 const script = document.createElement('script'); 469 original.type && (script.type = original.type); 470 script.innerHTML = original.innerHTML; 471 472 // Remove the original (non-executing) script from the contentNode 473 original.parentNode.removeChild(original) 474 475 // Add script to head 476 document.head.appendChild(script); 477 } 478 479 return contentNode; 480 } 481 482 const replace = {['+']: '-', ['/']: '_', ['=']: ','}; 483 hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]); 484 485 let currentTrap; 486 487 const focusableElements = (rootElement) => { 488 const selector = 'button, [href], input, select, textarea, details, [tabindex]:not([tabindex="-1"]'; 489 return Array.from(rootElement.querySelectorAll(selector)) 490 .filter(el => { 491 return el.style.display !== 'none' 492 && !el.disabled 493 && el.tabIndex !== -1 494 && (el.offsetWidth || el.offsetHeight || el.getClientRects().length) 495 }) 496 } 497 498 const focusTrap = (e) => { 499 const isTabPressed = e.key === 'Tab' || e.keyCode === 9; 500 if (!isTabPressed) return; 501 502 const focusable = focusableElements(currentTrap) 503 const firstFocusableElement = focusable[0] 504 const lastFocusableElement = focusable[focusable.length - 1] 505 506 e.shiftKey 507 ? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault()) 508 : document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault()) 509 }; 510 511 hyva.releaseFocus = (rootElement) => { 512 if (currentTrap && (!rootElement || rootElement === currentTrap)) { 513 currentTrap.removeEventListener('keydown', focusTrap) 514 currentTrap = null 515 } 516 } 517 hyva.trapFocus = (rootElement) => { 518 if (!rootElement) return; 519 hyva.releaseFocus() 520 currentTrap = rootElement 521 rootElement.addEventListener('keydown', focusTrap) 522 const firstElement = focusableElements(rootElement)[0] 523 firstElement && firstElement.focus() 524 } 525 526 hyva.safeParseNumber = (rawValue) => { 527 const number = rawValue ? parseFloat(rawValue) : null; 528 529 return Array.isArray(number) || isNaN(number) ? rawValue : number; 530 } 531 532 const toCamelCase = s => s.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(''); 533 hyva.createBooleanObject = (name, value = false, additionalMethods = {}) => { 534 535 const camelCase = toCamelCase(name);
536 const key = '__hyva_bool_' + name 537 538 return new Proxy(Object.assign( 539 additionalMethods, 540 { 541 [key]: !!value, 542 [name]() {return !!this[key]}, 543 ['!' + name]() {return !this[key]}, // @deprecated This does not work with non-CSP Alpine 544 ['not' + camelCase]() {return !this[key]}, 545 ['toggle' + camelCase]() {this[key] = !this[key]}, 546 [`set${camelCase}True`]() {this[key] = true}, 547 [`set${camelCase}False`]() {this[key] = false}, 548 } 549 ), { 550 set(target, prop, value) { 551 return prop === name 552 ? (target[key] = !!value) 553 : Reflect.set(...arguments); 554 } 555 }) 556 } 557 558 hyva.alpineInitialized = (fn) => window.addEventListener('alpine:initialized', fn, {once: true}) 559 window.addEventListener('alpine:init', () => Alpine.data('{}', () => ({})), {once: true}); 560 window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies()) 561 562 }( window.hyva = window.hyva || {} )); 563</script>
vendor: 1 bytes, line 563
563
564<script> 565 if (!window.IntersectionObserver) { 566 window.IntersectionObserver = function (callback) { 567 this.observe = el => el && callback(this.takeRecords()); 568 this.takeRecords = () => [{isIntersecting: true, intersectionRatio: 1}]; 569 this.disconnect = () => {}; 570 this.unobserve = () => {}; 571 } 572 } 573</script>
573 574
575<script type="text/javascript"> 576window.addEventListener('klevu_script_loaded', function() { 577 578 var nowUnixtime = parseInt(Date.now() / 1000); 579 580 function klevufejs_getCookie(name) { 581 if (typeof (name) === "undefined") { 582 name = "klv_mage"; 583 } 584 var c = "", 585 ca = document.cookie.split(';'); 586 587 for (var i = 0; i < ca.length; i++) { 588 c = ca[i]; 589 if (typeof c !== "string") { 590 continue; 591 } 592 var cookiePair = c.split("="); 593 594 if (name === cookiePair[0].trim()) { 595 try { 596 return JSON.parse(decodeURIComponent(cookiePair[1])); 597 } catch (err) { 598 // this is fine, data will be regenerated 599 } 600 } 601 } 602 return { 603 expire_sections: {} 604 }; 605 } 606 607 document.addEventListener('klevu.customerData.loaded', function (e) { 608 var klevufejs_cookie = klevufejs_getCookie(); 609 klevufejs_cookie.expire_sections.customerData = nowUnixtime + 600; 610 611 document.cookie = "klv_mage=" + JSON.stringify(klevufejs_cookie) 612 + "; expires=" + new Date((nowUnixtime + 7884000) * 1000).toUTCString() 613 + "; path=/" 614 + "; samesite=strict"; 615 }); 616 617 var klevufejs_cookie = klevufejs_getCookie(); 618 var klevuData = { 619 ...{ 620 customerData: { 621 revalidate_after: -1 622 } 623 }, 624 ...JSON.parse(window.localStorage.getItem('klv_mage') || '{}') 625 }; 626 627 const klevuCustomerDataLoadedEvent = document.createEvent('CustomEvent'); 628 klevuCustomerDataLoadedEvent.initEvent('klevu.customerData.loaded', false, true); 629 const klevuCustomerDataLoadErrorEvent = document.createEvent('CustomEvent'); 630 klevuCustomerDataLoadErrorEvent.initEvent('klevu.customerData.loadError', false, true); 631 632 if (typeof klevufejs_cookie.expire_sections !== "object" 633 || (klevufejs_cookie.expire_sections.customerData || -1) < nowUnixtime 634 || klevuData.customerData.revalidate_after < nowUnixtime 635 ) { 636 var xhttp = new XMLHttpRequest(); 637 xhttp.onerror = function (request) { 638 document.dispatchEvent(klevuCustomerDataLoadErrorEvent); 639 }; 640 xhttp.ontimeout = function (request) { 641 this.onerror(request); 642 }; 643 xhttp.onload = function (request) { 644 if (this.status >= 400 || this.timeout) { 645 this.onerror(request); 646 return; 647 } 648 var klevuData = JSON.parse(window.localStorage.getItem('klv_mage') || '{}'); 649 klevuData.customerData = JSON.parse(this.response); 650 window.localStorage.setItem('klv_mage', JSON.stringify(klevuData)); 651 document.dispatchEvent(klevuCustomerDataLoadedEvent); 652 }; 653 // TI-956 - Patch to use async request instead of synchronous 654 xhttp.open('GET', 'https://www.outdoornativitysets.com/rest/V1/klevu/customerData', true); 655 xhttp.send(); 656 } else { 657 document.dispatchEvent(klevuCustomerDataLoadedEvent); 658 } 659});</script>
659</head> 660<body id="html-body" class="cms-about-us cms-page-view page-layout-1column">
vendor: 68 bytes, lines 660-661
660 661<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
661GTM-NS6TFXL
vendor: 88 bytes, lines 661-663
661" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 662 663
663<noscript> 664 <section class="message global noscript border-b-2 border-blue-500 bg-blue-50 shadow-none m-0 px-0 rounded-none font-normal"> 665 <div class="container text-center"> 666 <p> 667 <strong>JavaScript seems to be disabled in your browser.</strong> 668 <span> 669 For the best experience on our site, be sure to turn on Javascript in your browser. </span> 670 </p> 671 </div> 672 </section> 673 </noscript> 674 675
676<script> 677 document.body.addEventListener('touchstart', () => {}, {passive: true}) 678</script>
vendor: 1 bytes, line 678
678
679<script nonce="dTVodmpqN2U3dDY0YjBzMGUzN2pjOHcwcnlqdDdmN3o="> 680 function yireoGoogleTagManager2Pusher(eventData, message, callback) { 681 window.YIREO_GOOGLETAGMANAGER2_PAST_EVENTS = window.YIREO_GOOGLETAGMANAGER2_PAST_EVENTS || []; 682 683 function doCallback(cb) { 684 if (undefined === cb) { 685 return; 686 } 687 688 cb(); 689 } 690 691 692 const copyEventData = Object.assign({}, eventData); 693 let metaData = {}; 694 if (copyEventData.meta) { 695 metaData = copyEventData.meta; 696 delete copyEventData.meta; 697 } 698 699 const eventHash = btoa(encodeURIComponent(JSON.stringify(copyEventData))); 700 if (window.YIREO_GOOGLETAGMANAGER2_PAST_EVENTS.includes(eventHash)) { 701 yireoGoogleTagManager2Logger('Warning: Event already triggered', eventData); 702 doCallback(callback); 703 return; 704 } 705 706 if (metaData && metaData.allowed_pages && metaData.allowed_pages.length > 0 707 && false === metaData.allowed_pages.some(page => window.location.pathname.includes(page))) { 708 yireoGoogleTagManager2Logger('Warning: Skipping event, not in allowed pages', window.location.pathname, eventData); 709 doCallback(callback); 710 return; 711 } 712 713 if (!message) { 714 message = 'push (unknown) [unknown]'; 715 } 716 717 yireoGoogleTagManager2Logger(message, eventData); 718 window.dataLayer = window.dataLayer || []; 719 720 if (eventData.ecommerce) { 721 window.dataLayer.push({ecommerce: null}); 722 } 723 724 try { 725 window.dataLayer.push(eventData); 726 window.YIREO_GOOGLETAGMANAGER2_PAST_EVENTS.push(eventHash); 727 } catch(error) { 728 doCallback(callback); 729 } 730 731 doCallback(callback); 732 } 733</script>
vendor: 1 bytes, line 733
733
734<script nonce="dTVodmpqN2U3dDY0YjBzMGUzN2pjOHcwcnlqdDdmN3o="> 735 function yireoGoogleTagManager2Logger(...args) { 736 const debug = window.YIREO_GOOGLETAGMANAGER2_DEBUG || false; 737 if (false === debug) { 738 return; 739 } 740 741 var color = 'gray'; 742 if (args[0].toLowerCase().startsWith('push')) { 743 color = 'green'; 744 } 745 746 if (args[0].toLowerCase().startsWith('warning')) { 747 color = 'orange'; 748 } 749 750 var css = 'color:white; background-color:' + color + '; padding:1px;' 751 console.log('%cYireo_GoogleTagManager2', css, ...args); 752 } 753</script>
753 754<div class="page-wrapper"><header class="page-header z-10"><div class="mobile-contact-message"><style> 755@media only screen and (max-width: 768px) { 756 .ppage-header .logo img { height: 45px !important; width: 100% !important; } 757 .page-layout-checkout .logo img { height: 45px !important; width: 100% !important; } 758} 759</style></div><a class="action skip sr-only focus:not-sr-only focus:absolute focus:z-40 focus:bg-white 760 contentarea" 761 href="#contentarea"> 762 <span> 763 Skip to Content </span> 764</a> 765<div class="klevu-overlay" style="display: none;"> 766 <!-- intentionally empty --> 767</div> 768<div id="utility-navigation" class="navigation"><div class="utility-navigation-wrapper"><!-- Block: utility_nav --> 769 770<style> 771.bg-header { background-color: #ffffff; } 772#search-content { display: none !important; } 773#header .text-white { color: #111; } 774 775.product-info-main .mfg_link { display: none; } 776.product-info .slider-item-info .btn { margin: 0 auto; } 777 778@media only screen and (min-width: 767px) { 779 .kadro-navigation { display: none !important; } 780} 781@media only screen and (max-width: 767px) { 782 .search-wrapper { display: none !important; } 783} 784</style> 785 786<!-- CMS Content Page --> 787<style> 788.cms-page-view .column.main .scalemedia { 789 position: relative; 790 height: 0; 791 overflow: hidden; 792 padding-bottom: 56.25%; 793} 794.cms-page-view .column.main .scalemedia iframe { 795 position: absolute; 796 left: 0; 797 top: 0; 798 height: 100%; 799 width: 100%; 800</style> 801 802<!-- PDP Bundles --> 803<style> 804@media (min-width: 768px) { 805 .page-product-bundle .product-options-bottom .card { margin: 30px 0 30px 0; padding: 0 30px 0 30px; } 806} 807.page-product-bundle .product-options-bottom .card { margin: 20px 0 20px 0; padding: 0; } 808.page-product-bundle .product-options-bottom .fieldset-bundle-options>div:first-of-type { border-top-width: 1px; } 809fieldset.fieldset-bundle-options { margin-off: 30px 30px 20px 30px; } 810fieldset.fieldset-bundle-options .border-container.swatch { border: 0; } 811fieldset.fieldset-bundle-options > div:not(.swatch) { border: 1px solid rgb(209, 213, 219); padding: 0; box-shadow: 0 2px 4px #efefef; } 812fieldset.fieldset-bundle-options > div:not(.swatch) > div { padding-left: 20px; padding-right: 20px; } 813.catalog-product-view .fieldset .field { padding-left: 0 !important; } 814fieldset.fieldset-bundle-options .border-container { margin-bottom: 2rem; } 815fieldset.fieldset-bundle-options > div:not(.swatch) > label { background-color: #f7f7f7; padding: 8px; text-transform: uppercase; font-weight: normal; border-color: rgb(209, 213, 219); border-width: 0 0 1px 0; } 816.catalog-product-view fieldset .field.choice .form-checkbox { height: 1.5rem; width: 1.5rem; } 817.catalog-product-view fieldset .field.choice .radio { height: 1.5rem; width: 1.5rem; } 818 819.page-product-bundle .product-options-bottom .fieldset-bundle-options .retail-price-container { font-size: 1.3rem; } 820.page-product-bundle .product-options-bottom .fieldset-bundle-options .retail-price-container .price-wrapper { font-size: 1.3rem; } 821 822#bundleSummary .title { display: none; } 823#bundleSummary .price-box { display: none; } 824 825 826</style> 827 828<!-- Mini Cart Customizations --> 829<style> 830span[x-html="item.product_sku"] { 831   display: none; 832} 833 834div[x-data="{ currentQty: item.qty, isPromoProduct: item.promo_product }"] { 835   display: none; 836} 837</style> 838 839<!-- Turno CSS Customizations --> 840<style> 841 .tt-c-product-about { display: none !important; } 842 #tt-teaser .TTteaser__rating span { font-size: 16px; } 843</style> 844 845 846<!-- Klevu Search CSS --> 847<style> 848.search-index-index .page-title { display: none; } 849</style> 850 851<!-- Klevu Filter CSS --> 852<style> 853.mfg_link { font-size: 17px; color: #454749; text-transform: uppercase; font-weight: bold; } 854.product-info-main .page-title-container { margin-top: .5rem; } 855 856@media screen and (max-width: 800px) { 857 858.product.attribute.sku { 859 display: none; 860} 861 862.product-info-main #gallery { 863 padding-top: 0 !important; 864} 865.product-info-main #gallery { 866 padding-top: 0 !important; 867 width: 90%; 868 margin: 0 auto; 869} 870.js_thumbs_slide { 871 width: 58px; 872} 873#thumbs { 874 min-height: 78px !important; 875 margin-bottom: 10px; 876} 877.product-info-main .price-info-container { 878 margin-bottom: 1rem; 879 --tw-border-opacity: 1;
880 border-bottom: 0; 881 border-style: solid; 882} 883.product-info-main .price-info-container > .stock { 884 float: none; 885 margin-bottom: 1rem; 886 display: block; 887 text-align: left; 888 margin-top: 10px; 889} 890.catalog-product-view .price-info-container > .stock { 891 width: 100%; 892} 893.lead-time { 894 border: 1px solid #ccc; 895 border-radius: 3px; 896 padding: 10px 15px; 897} 898.lead-time div { 899 display: inline-block; 900} 901.product-info-main .price-info-container > .stock a { 902 display: block; 903} 904#tt-teaser span { 905 display: none; 906} 907.TTteaser__read-comments, .TTteaser__read-reviews, .TTteaser__write-review { 908 font-size: 1.3rem; 909} 910#review-tab-label, 911#qa-tab-label { 912 text-transform: uppercase; 913 font-weight: 300; 914} 915#qa-review div.product.data.items { 916 margin: 0 0px 20px; 917} 918#product-accordion .accordion-section-header svg { 919 float: right; 920 display: inline-block; 921 position: absolute; 922 right: 12px; 923 width: 20px; 924 height: 20px; 925} 926#qa-review .product.data.items>.data.item.title>.switch>svg { 927 right: 12px; 928 width: 20px; 929 height: 20px; 930} 931#qa-review .product.data.items>.data.item.title { 932 background: #f7f7f7; 933} 934 935} 936 937 938 939 940.product-info-main .border-solid.border-b.border-b-gray-300 { 941 border: 0; 942} 943#review-tab-label, #qa-tab-label { 944 text-transform: uppercase; 945 font-weight: 300; 946 color: rgb(75 85 99 / var(--tw-text-opacity)); 947 } 948.product.attribute.sku { 949 margin-top: 5px; 950} 951.product-info-main .price-info-container>.stock, 952.TTteaser__read-comments, .TTteaser__read-reviews, .TTteaser__write-review, 953.product.attribute.sku, 954.product.attribute.product-teaser p, 955#product-accordion .accordion-section-content ul:not(.list)>li, 956span.tt-c-answer__best-answer-text, 957.boatout_free_ship, 958.product-attr-show-block-attention { 959 font-size: 16px; 960} 961.tt-c-question__title { 962 font-size: 18px; 963} 964#product-accordion .accordion-section-header.active, 965#product-accordion .accordion-section-header:hover, 966#product-accordion .accordion-section-header { 967 background-color: #f7f7f7; 968 border-radius: 0; 969 border-left: 0; 970 border-right: 0; 971} 972#product-accordion .accordion-section-header svg { 973 float: right; 974 display: inline-block; 975 position: absolute; 976 right: 12px; 977 width: 20px; 978 height: 20px; 979} 980#product-accordion .accordion-section-header h2 { 981 text-transform: uppercase; 982 font-weight: 300; 983} 984#product-accordion { 985 margin-bottom: 0 !important; 986 position: relative; 987} 988#product-accordion .accordion-section-header svg { 989 float: right; 990} 991.tt-c-review__heading-text { 992 font-size: 1.4rem !important; 993 line-height: 1.1; 994 font-weight: 600 !important; 995} 996.tt-c-reviews-toolbar .tt-o-button { 997 display: none; 998} 999.product.attribute.product-teaser p { 1000 line-height: 25px; 1001} 1002#product-accordion .accordion-section-content .importantNote { 1003 padding: 10px 20px; 1004 margin-top: 20px; 1005 font-size: 16px; 1006} 1007.tt-o-icon--star--full { 1008 fill: #f8b900!important; 1009} 1010.tt-c-callout-comment__text::after { 1011 bottom: -1.8rem; 1012} 1013.tt-c-callout-comment__text { 1014 border-radius: 5px; 1015} 1016.tt-l-grid__header.tt-c-reviews-summary__grid-header { 1017 display: none; 1018} 1019.tt-c-reviews-summary__rating-number { 1020 font-size: 4.4rem; 1021} 1022.tt-o-icon--xl { 1023 width: 2.5rem; 1024 height: 2.5rem; 1025} 1026.tt-o-icon--lg { 1027 width: 1.5rem; 1028 height: 1.5rem; 1029} 1030.tt-o-badge { 1031 display: inline-flex; 1032 align-items: center; 1033 padding: .3rem .8rem; 1034 background-color: #eee; 1035 border-radius: 2rem; 1036 font-size: .9rem; 1037 font-weight: 400; 1038 text-transform: uppercase; 1039 letter-spacing: .08rem; 1040 line-height: normal; 1041 color: #111; 1042 vertical-align: middle; 1043 border: 1px solid #ccc; 1044} 1045.tt-c-review-toolbar.tt-u-mb--xs { 1046 display: none; 1047} 1048.tt-c-question__title { 1049 font-size: 1.5rem; 1050 line-height: 1.3; 1051} 1052.tt-c-answer--best .tt-c-answer__text { 1053 font-size: 1.3rem; 1054 line-height: 1.4; 1055} 1056.price-info-container { 1057 margin-top: 1rem; 1058 } 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072.actions-toolbar .towishlist { display: none; } 1073 1074 1075.slick-prev, .slick-next { z-index: 100 !important; } 1076.kuContainer .kuResults ul .klevuProduct .kuProdWrap footer .kuProdSwatchSlider { margin-top: 0 !important; } 1077.kuContainer .kuResults ul .klevuProduct .kuProdWrap footer .kuProdSwatchSlider .plp-swatch-slider-container .plp-color-option-swatch > * { border: 1px solid #999; } 1078.kuProdAdditionalData .action.tocart.primary { font-size: 1.2rem; } 1079 1080.kuFilterBox .kuFilterNames ul li a { font-size: 15px; line-height: 120%; } 1081.kuFilterBox { margin-bottom: 20px; } 1082.kuLandingResultsViewSwitchContainer { display: none; } 1083.kuSearchResultsPageContainer .kuPagination a { font-size: 17px; } 1084.noUi-horizontal .noUi-handle-upper .noUi-tooltip { bottom: -40px; } 1085.noUi-horizontal .noUi-handle-lower .noUi-tooltip { bottom: -40px; } 1086#kuFilterOpener { padding: 10px 15px; } 1087body .page-wrapper .klevuLanding.kuSearchResultsPageContainer [data-container-id=ku_landing_main_container] .kuContainer .kuResults ul .klevuProduct .kuProdWrap .kuProdTop .klevuImgWrap img { margin: 1rem .75rem; } 1088body .page-wrapper .klevuLanding.kuSearchResultsPageContainer [data-container-id=ku_landing_main_container] .kuContainer .kuResults ul .klevuProduct .kuProdWrap .kuProdTop .klevuImgWrap { padding-bottom: 100%; } 1089 1090#product-accordion { margin-bottom: 0 !important; } 1091#product-accordion .accordion-section-content ul:not(.list) { line-height: 20px; margin-bottom: 12px; padding-inline-start: 20px; } 1092#product-accordion .accordion-section-content ul:not(.list)>li { line-height: 20px; margin-bottom: 12px; padding-inline-start: 0; } 1093#product-accordion .accordion-section-content { padding: 0 !important; } 1094 1095@media (min-width: 1000px) { 1096 .catalog-category-view #maincontent > .category-cms div[data-content-type="row"] > div { margin: 0 auto; max-width: 1000px; background-color: #efefef; padding: 0 100px; } 1097 } 1098 1099.catalog-product-view-expert-advice .article-body div[data-content-type="row"]:nth-child(2) { line-height: 0; } 1100.catalog-product-view-expert-advice .article-body div[data-content-type="row"]:nth-child(n+3) > div { margin: 0 auto; max-width: 1000px; background-color: #efefef; padding: 0 100px; } 1101.catalog-product-view-expert-advice .article-body div[data-content-type="row"]:last-child > div { max-width: 1280px;
1101 padding: 0 30px !important; background-color: inherit !important; } 1102 1103.catalog-product-view-expert-advice .article-body a { color: #0057bf; } 1104.catalog-product-view-expert-advice .article-body a:hover { text-decoration: underline; color: #111; } 1105.catalog-product-view-expert-advice h1 { font-size: 48px !important; } 1106.catalog-product-view-expert-advice .article-body h2 { font-size: 32px; } 1107.catalog-product-view-expert-advice .article-body h3 { font-size: 24px; } 1108.catalog-product-view-expert-advice .article-body h4 { font-size: 1.4rem; font-weight: bold; } 1109 1110.catalog-product-view-expert-advice .article-quote { line-height: 1.3; font-size: 24px; border-left: 3px solid #00263d; padding-left: 13px; margin: 15px 0 24px 50px; } 1111 1112.catalog-product-view-expert-advice .article-toc, .catalog-category-view .article-toc { border: 1px solid #111; background-color: #fff; padding: 15px !important; margin: 15px 0; } 1113.catalog-product-view-expert-advice .article-toc li, .catalog-category-view .article-toc li { list-style: none; } 1114.catalog-product-view-expert-advice .article-toc li a:hover, .catalog-category-view .article-toc li a:hover { text-decoration: underline; } 1115.catalog-product-view-expert-advice .article-toc h2, .catalog-category-view .article-toc h2 { margin-top: 0; } 1116 1117.catalog-product-view-expert-advice .article-toc .level1 { font-weight: bold; } 1118.catalog-product-view-expert-advice .article-toc .level2, .catalog-category-view .article-toc .level2 { padding-left: 2rem; } 1119.catalog-product-view-expert-advice .article-toc .level3, .catalog-category-view .article-toc .level3 { padding-left: 4rem; } 1120 1121.learn-slider:before { content: ''; display: none; } 1122 1123@media (max-width: 1000px) { 1124 .catalog-product-view-expert-advice h1 { font-size: 30px !important; } 1125 .catalog-product-view-expert-advice .article-body div[data-content-type="row"]:nth-child(n+3) > div { max-width: none; background-color: #efefef; padding: 0 15px !important; } 1126 .catalog-product-view-expert-advice .article-info { font-size: 13px; } 1127} 1128 1129@media only screen and (max-width: 767px) { 1130 .catalog-product-view .column.main>div:not(.custom-html-full-container) { padding: 0; } 1131 .page-header .nav-toggle { top: -5px; } 1132 .logo-container img { height: 45px !important; width: 100% !important; } 1133} 1134 1135@media (min-width: 768px) { 1136 .kadro-navigation { 1137 margin-left: 0; 1138 max-width: 765px; 1139 } 1140 .logo-container img { margin-right: 4rem; } 1141} 1142 1143@media (max-width: 769px) { 1144 .page-layout-1column.page-with-filter .column.main { padding-top: 0; } 1145 .kuMobileDeviceEnabled .kuContainer { padding-left: 0; padding-right: 0; } 1146 .kuSearchResultsPageContainer .kuFilters { padding-left: 0; padding-right: 0; } 1147 1148 .kuContainer { padding-left: 0; } 1149 .catalog-category-view.page-layout-site-width-grid-no-left-col .column.main { padding: 0 !important; } 1150 .catalog-product-view-expert-advice .page-main { padding: 0 !important; } 1151} 1152</style> 1153 1154<!-- CSS Modifiers --> 1155<style> 1156/*html { font-size: 75.5%; }*/ 1157 1158.mfp-title { color: #111; font-size: 1.1rem; } 1159.mfp-bottom-bar { left: auto; margin-top: -65px; } 1160img.mfp-img { padding: 25px 0 60px; } 1161 1162.braintree-paypal-logo.oneclick-container { display: none; } 1163 1164.category-view .slick-slider .slick-slide .product-item-details .product-item-actions { display: none; } 1165.slick-slider .product-item-info { padding-left: 10px; padding-right: 10px; } 1166.slick-slider .product-item-info .product-item-name { height: 3.4rem; overflow: hidden; } 1167.slick-dots li button { background-color: #ccc; } 1168 1169.catalog-product-view #maincontent .product-info-main .product-add-form .box-tocart .fieldset .actions { width: 70%; margin-left: 10px; } 1170 1171@media only screen and (max-width: 900px) { 1172 .kuProdBottom .kuPrice { font-size: inherit; } 1173} 1174@media (max-width: 768px) { 1175 .klevuAutoSuggestionsWrap.klevuAutosuggestions li { border: 1px solid #ddd; margin: 5px; text-align: center; } 1176} 1177 1178.kuSearchPersonalizationsContainer [ku-container] a, [ku-container] p, [ku-container] div, [ku-container] ul li { font-size: 1.4rem; } 1179.kuSearchPersonalizationsContainer .klevuAutoSuggestionsWrap, .kuPopularSearchesBlock { margin-bottom: 2rem !important; } 1180.kuSearchPersonalizationsContainer .klevuSuggestionHeading { padding: 0; } 1181.kuSearchPersonalizationsContainer .klevuHeadingText { margin-bottom: .5rem; } 1182.kuSearchResultsPageContainer .kuResults ul li .kuName { font-size:12px; } 1183.kuSearchResultsPageContainer .kuResults ul li .kuName a { font-size: 12px !important; } 1184body .klevuLanding .kuName .width-height, body .klevuLanding .kuName .width-height { font-size: 12px; } 1185.klevuNoResultsRecs-itemPrice .kuSalePrice, .productQuick-Price .kuSalePrice, .kuPrice .kuSalePrice { font-size: 14px; } 1186.klevuAutoSuggestionsWrap ul li a { line-height: inherit; } 1187 1188body .kuQuickResultsListContainer .klevuProduct .klevuQuickProductName { font-size: 1.4rem !important; } 1189.klevuResultsBlock .klevuQuickSearchResults ul li a.klevuQuickProductInnerBlock { padding: 0; } 1190 1191.klevuProduct.kuQSMenuItem.kuSlide:hover { background-color: #f5f5f5; } 1192.kuQuickResultsListContainer .klevuProduct .klevuQuickProductName { font-size: 1.4rem !important; } 1193 1194.klevuQuickProductDescBlock { height: 45px; overflow: hidden; } 1195 1196#klevuCategoryArea ul > li:nth-child(3) ~ li, .klevuAutoSuggestionsWrap ul > li:nth-child(3) ~ li { display: none; } 1197 1198.kuSearchResultsPageContainer .kuResults ul li .kuName a { font-size: 1.4rem; } 1199 1200.subcats { width: 140px; height: 150px; } 1201.subcats span { font-size: inherit; display: block; } 1202 1203.catalog-product-view #maincontent .product-info-main .page-title { font-size: 2rem; } 1204 1205@media (min-width: 767px) { 1206 .subcats { width: 140px; height: 150px; } 1207 .product-item .product-reviews-summary .reviews-actions { font-size: 1.2rem; } 1208 h1 { 2.8rem; } 1209 .catalog-product-view .column.main>div:not(.custom-html-full-container) { padding-left: 0; padding-right: 0; } 1210} 1211 1212.catalog-product-view .column.main .custom-html-full-container { margin-left: 0; margin-right: 0 } 1213
1214.cart-summary #block-shipping { display: none; } 1215 1216.catalog-product-view .orig-price-box .price-label { display: inline; font-weight: normal; color: #b54626 !important; font-size: 1.5rem; } 1217.catalog-product-view .orig-price-box .price-label:before { font-size: 1.7rem; content: '\f218 '; font-family: 'FontAwesome'; } 1218.catalog-product-view .orig-price-box .price-value { display: inline; font-weight: 700; color: rgba(8,108,162,.7) !important; font-size: 1.7rem !important; text-decoration: line-through; } 1219 1220.catalog-product-view .item.product.product-item { margin-left: 0 !important; } 1221.catalog-product-view .fieldset .field { padding-left: 1rem; } 1222.catalog-product-view .product.pricing { display: none; } 1223 1224.catalog-category-view.page-layout-site-width-grid .columns { padding-left: 0; padding-right: 0; } 1225 1226.product-add-form .fieldset>.field>.label { font-weight: 700; } 1227 1228#product-config-calculator-container+.product-options-wrapper .field .label { min-width: 9.5em; } 1229 1230@media (max-width: 767px) { 1231 .catalog-category-view.page-layout-site-width-grid .column { padding-left: 0; padding-right: 0; } 1232 #product-config-calculator-container+.product-options-wrapper .field { display: inline-block; margin: 0 0 1.5rem !important; } 1233 #product-config-calculator-container+.product-options-wrapper .field .control { display: inline-block; max-width: 160px; } 1234 .sidebar.sidebar-main { position: static !important; } 1235 1236 1237} 1238@media (min-width: 767px) { 1239 #product-config-calculator-container+.product-options-wrapper .field { width: 49% !important; display: inline-block; margin: 0 0 1.5rem !important; } 1240 #product-config-calculator-container+.product-options-wrapper .field .control { display: block; width: 80%; } 1241} 1242 1243.tt-o-pagination__next .tt-o-icon, .tt-o-pagination__back .tt-o-icon { height: 2rem !important; width: 2rem !important; } 1244.TTteaser__icon--empty { stroke: #ffcd3a; } 1245 1246.columns .column.main { padding-bottom: 10px !important; } 1247.page-header .block-search .control { background-color: #00263d; } 1248.catalog-product-view-expert-advice .tt-c-ask__label-text { display: none; } 1249.catalog-category-view.page-layout-category-learn.page-products .column.main { padding: 0 20px; } 1250 1251.cart.table-wrapper .actions-toolbar { padding-bottom: 25px; } 1252 1253.product-social-links { display: none; } 1254 1255.mageplaza-fbt-content ol, .mageplaza-fbt-content ul { padding-left: 0; } 1256.mageplaza-fbt-checkbox-label strong { display: none; } 1257.mageplaza-frequently-bought-together-block hr { display: none; } 1258#block-mageplaza-fbt-heading { font-weight: 600; } 1259 1260.tt-c-gallery__heading { font-weight: 600; text-align: left; } 1261#tt-chatter-heading { font-weight: 600; text-align: left; } 1262#qa-review .title { font-weight: 600; text-align: left; } 1263.catalog-product-view.catalog-product-view-expert-advice #tt-instant-answers-widget { margin-bottom: 2rem; } 1264 1265@media (max-width: 768px) { 1266 .tt-c-reviews-summary__expander, .tt-c-reviews-list-utilities, .tt-c-ratings-breakdown { display: none; } 1267 .tt-c-reviews-summary__write-review.tt-u-mb--xl { margin-bottom: 0; } 1268} 1269 1270.pagebuilder-column .widget-product-grid .product-item .product-item-actions .actions-secondary { display: none !important; } 1271.product-item-details .product-item-actions .actions-secondary { display: none !important; } 1272.product.actions.product-item-actions { text-align: center; } 1273 1274.block.crosssell .product-item .price-final_price { text-align: center; } 1275.block.crosssell .tocart { padding: 8px 6px; } 1276.block.crosssell .products-grid .product-item, .block.crosssell .products-crosssell.products-grid .product-item { width: 24%; padding-left: 10px; } 1277.block.crosssell .product-reviews-summary { display: none; } 1278.products-crosssell .product-item-name { height: 4.3rem !important; overflow-y: hidden; } 1279 1280@media (max-width: 768px) { 1281 .block.crosssell { display: none; } 1282} 1283 1284.block.block-banners { margin-bottom: 0 !important; } 1285 1286.swatch-option-tooltip { 1287 max-width: 0px !important; 1288 max-height: 0px !important; 1289 overflow:hidden; 1290 min-height: 0px !important; 1291 min-width: 0px !important; border:none !important; 1292 background:transparent !important; 1293} 1294 1295.swatch-option.text { font-weight: 400; font-size: 17px; padding: 12px 20px; margin-right: 10px; margin-top: 4px; } 1296.swatch-option.disabled:after { background: linear-gradient(to left top,rgba(255,255,255,0) 0%,rgba(255,255,255,0) 42%,#fff 43%,#fff 46%,#999 47%,#999 53%,#fff 54%,#fff 57%,rgba(255,255,255,0) 58%,rgba(255,255,255,0) 100%); } 1297 1298.swatch-attribute-selected-option { font-size: 17px; } 1299.swatch-attribute-label { font-weight: 700; font-size: 17px; } 1300 1301@media (min-width: 769px) { 1302 .page-layout-1column.page-with-filter .column.main { padding-top: 0; } 1303} 1304</style> 1305 1306<div class="navbar-container"> 1307<ul class="nav navbar-nav"><li class="dropdown"><a href="/about-us" target="" data-toggle="">ABOUT US</a><ul class="dropdown-menu"><li><a href="/about-us" target="">Our Story</a></li><li><a href="/testimonials" target="">
1307Customer Testimonials</a></li></ul></li><li class="no-dropdown"><a href="/photo-gallery" target="" data-toggle="">PHOTO GALLERY</a></li><li class="dropdown"><a href="/contact-us" data-toggle="">QUESTIONS</a><ul class="dropdown-menu"><li><a href="/assembly-videos" target="">Videos</a></li><li><a href="/instructions" target="">Instructions</a></li></ul></li></ul> 1308</div><div class="social-nav"><style> 1309#utility-navigation .social-links { display: none; } 1310.footer.content .free-shipping-nav { display: none; } 1311.page-footer .social-links { text-align: center; } 1312.page-footer .social-links .top-social { display: inline-block; margin: 0 10px; } 1313</style> 1314<div class="free-shipping-nav"> 1315 <div class="hidden-sm" style="font-weight: normal; padding: 0px 15px 0px 5px; line-height: 42px;"><I class="fa fa-truck" style="color:#333;"></I> <a href="/shipping-policy">Free Shipping</a> on orders over $150!</div> 1316 <div class="visible-sm" style="font-weight: normal; padding: 0px 5px 0px 2px; font-size: 10px; line-height: 42px;"><I class="fa fa-truck" style="color:#333;"></I> <a href="/shipping-policy">Free Shipping</a> on orders over $150!</div> 1317</div> 1318 1319<div class="social-links"> 1320<div class="social-nav"> 1321 1322 1323 <div class="f-right top-social"><a href="https://www.facebook.com/OutdoorNativitySets" target="_blank"><span class="fa fa-facebook"> </span></a></div> 1324 1325 <div class="f-right top-social"><a href="https://www.pinterest.com/OutdoorNativity" target="_blank"><span class="fa fa-pinterest"> </span></a></div> 1326 1327 1328</div> 1329</div></div><div class="utility-buttons">
1330<script> 1331 function initHeader () { 1332 return { 1333 searchOpen: false, 1334 cart: {}, 1335 isCartOpen: false, 1336 getData(data) { 1337 if (data.cart) { this.cart = data.cart } 1338 }, 1339 isCartEmpty() { 1340 return !this.cart.summary_count 1341 }, 1342 toggleCart(event) { 1343 if (event.detail && event.detail.isOpen !== undefined) { 1344 this.isCartOpen = event.detail.isOpen 1345 if (!this.isCartOpen && this.$refs && this.$refs.cartButton) { 1346 this.$refs.cartButton.focus() 1347 } 1348 } else { 1349 this.isCartOpen = true 1350 } 1351 } 1352 } 1353 } 1354</script>
1354 1355<!--Cart Icon--> 1356<div class="minicart-wrapper" x-data="initHeader()" 1357 @private-content-loaded.window="getData(event.detail.data)"> 1358 <button 1359 id="menu-cart-icon" 1360 class="relative inline-block outline-offset-2" 1361 x-ref="cartButton" 1362 :aria-disabled="isCartEmpty()" 1363 :aria-label="` 1364 Toggle minicart, 1365 ${isCartEmpty() 1366 ? 'Cart is empty' 1367 : cart.summary_count > 1 1368 ? hyva.str('%1 items', cart.summary_count) 1369 : hyva.str('%1 item', cart.summary_count) 1370 }`" 1371 @click.prevent.stop="() => { 1372 $dispatch('toggle-cart', { isOpen: true }) 1373 }" 1374 @toggle-cart.window="toggleCart($event)" 1375 :aria-expanded="isCartOpen" 1376 aria-haspopup="dialog" 1377 > 1378 1379 <span class="text-lightgray">MY CART</span> 1380 <span 1381 class="text-lightgray" 1382 x-text="'(' + cart.summary_count +')'" 1383 x-show="!isCartEmpty()" 1384 aria-hidden="true" 1385 ></span> 1386 </button> 1387 </div> 1388<div class="my-account-link"><a href="https://www.outdoornativitysets.com/customer/account/" > <span class="fa fa-user "></span><span class="my-account-link-text">Account</span></a></div></div></div></div> 1389 1390
1390<script type="application/javascript" async 1391 src="https://static.klaviyo.com/onsite/js/Tz4weC/klaviyo.js"></script>
1391 1392 1393 <div x-data="initKlaviyoCustomerTracking()" 1394 @private-content-loaded.window="sendCustomerDataToKlaviyo(event.detail.data)"></div> 1395
1395<script> 1396 !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)}}}}(); 1397 1398 function initKlaviyoCustomerTracking() { 1399 return { 1400 sendCustomerDataToKlaviyo(data) { 1401 window.klaviyo = window.klaviyo || []; 1402 const customer = data.customer; 1403 1404 window.klaviyo.isIdentified().then((identified)=> { 1405 if(customer && customer.email && !identified) { 1406 window.klaviyo.identify({ 1407 '$email': customer.email, 1408 '$first_name': customer.firstname ? customer.firstname : '', 1409 '$last_name': customer.lastname ? customer.lastname : '' 1410 }); 1411 } 1412 }); 1413 } 1414 } 1415 } 1416 </script>
vendor: 1 bytes, line 1416
1416
1417<script> 1418 function initHeader () { 1419 return { 1420 searchOpen: false, 1421 isMobile: false, 1422 cart: {}, 1423 isCartOpen: false, 1424 lastY: window.scrollY, 1425 checkMobile() { 1426 this.isMobile = window.innerWidth < 768 1427 }, 1428 getData(data) { 1429 if (data.cart) { this.cart = data.cart } 1430 }, 1431 isCartEmpty() { 1432 return !this.cart.summary_count 1433 }, 1434 toggleCart(event) { 1435 if (event.detail && event.detail.isOpen !== undefined) { 1436 this.isCartOpen = event.detail.isOpen 1437 if (!this.isCartOpen && this.$refs && this.$refs.cartButton) { 1438 this.$refs.cartButton.focus() 1439 } 1440 } else { 1441 this.isCartOpen = true 1442 } 1443 }, 1444 setStickyHeader() { 1445 const header = event.currentTarget.document.querySelector('.page-header'); 1446 if(header) { 1447 (window.scrollY <= this.lastY) ? header.classList.add('sticky-header') : header.classList.remove('sticky-header'); 1448 this.lastY = window.scrollY; 1449 } 1450 } 1451 } 1452 } 1453 1454 function initCompareHeader() { 1455 return { 1456 compareProducts: null, 1457 itemCount: 0, 1458 receiveCompareData(data) { 1459 if (data['compare-products']) { 1460 this.compareProducts = data['compare-products']; 1461 this.itemCount = this.compareProducts.count; 1462 } 1463 } 1464 } 1465 } 1466 1467</script>
1467 1468<div id="header" 1469 class="z-30 w-full border-b shadow bg-header border-container-lighter max-md:pb-5" 1470 x-data="initHeader()" 1471 @private-content-loaded.window="getData(event.detail.data)" 1472 @scroll.window="setStickyHeader()" 1473> 1474 <div class="max-w-content flex flex-wrap lg:flex-nowrap items-center justify-between w-full px-6 py-0 mx-auto mt-0 pt-4"> 1475 1476 <div class="md:hidden hidden-lg hidden-md nav-toggle"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="text-white" width="32" height="32" role="img"> 1477 <path stroke-linecap="round" stroke-linejoin="round" d="M4 6h16M4 12h16M4 18h16"/> 1478<title>menu</title></svg> 1479</div> 1480 <!--Logo--> 1481 <div class="logo-container order-1 md:mr-6 md:mb-4 max-md:max-w-180 min-w-180"> 1482 <div class="order-1 sm:order-2 lg:order-1 w-full pb-2 sm:w-auto sm:pb-0"> 1483 <a 1484 class="flex items-center justify-center text-xl font-medium tracking-wide text-gray-800 1485 no-underline hover:no-underline font-title" 1486 href="https://www.outdoornativitysets.com/" 1487 aria-label="Go to Home page" 1488 > 1489 <img 1490 src="https://www.outdoornativitysets.com/media/logo/stores/7/outdoor-nativity-sets-logo.png" 1491 alt="OutdoorNativitySets" 1492 width="203" height="60" loading="eager" 1493 /> 1494 </a> 1495</div> 1496 </div> 1497 1498 <div class="site-nav flex md:flex-1 flex-col order-2 md:w-2/3"> 1499 <!--Main Navigation--> 1500
1501<script> 1502 function initMenuSections() { 1503 return { 1504 openedIndex: 'menu', 1505 isLoggedIn: false, 1506 setIsLoggedIn: function(data) { 1507 this.isLoggedIn = typeof data.customer.fullname !== 'undefined'; 1508 } 1509 } 1510 } 1511 1512 function initKadroMegaMenu() { 1513 return { 1514 toggle:".nav-toggle", 1515 mediaBreakpoint: "768px", 1516 expandBehavior: false, 1517 showImagesMobile: false, 1518 showCmsBlockMobile: false, 1519 mediaQuery: window.matchMedia(`(max-width: 767px)`) , 1520 mobileNav: document.querySelector("div.sections.nav-sections"), 1521 nav: document.querySelector(".kadro-navigation"), 1522 checkElemType(elem, type) { 1523 const nodeName = elem.nodeName.toLowerCase(); 1524 return nodeName === type; 1525 }, 1526 childArrayOfType(elem, type) { 1527 var self = this; 1528 return Array.from(elem.children).filter(function (child) { 1529 return self.checkElemType(child, type); 1530 }); 1531 }, 1532 childArrayOfClass(elem, className) { 1533 return Array.from(elem.children).filter(function (child) { 1534 return child.classList.contains(className); 1535 }); 1536 }, 1537 emptyElement(elem) { 1538 while (elem.lastChild) { 1539 elem.removeChild(elem.lastChild); 1540 } 1541 }, 1542 getAllParents(elem, selector) { 1543 let current = elem, 1544 list = []; 1545 while(current.parentElement != null ) 1546 { 1547 if(current.parentElement.matches(selector)) list.push(current.parentElement); 1548 current = current.parentElement; 1549 } 1550 return list; 1551 }, 1552 mediaCheck(mQ) { 1553 if(mQ.matches) { 1554 this.mobileMenu(); 1555 } else { 1556 this.desktopMenu(); 1557 } 1558 }, 1559 setMediaQuery() { 1560 var self = this; 1561 self.boundToggle = this.toggleAction.bind(this); 1562 self.mediaCheck(this.mediaQuery); 1563 this.mediaQuery.addEventListener( 'change', self.mediaCheck.bind(self), self.mediaQuery); 1564 }, 1565 toggleAction(event) { 1566 event.preventDefault(); 1567 this.expandBehavior ? this.mobileNav.classList.add('slide') : ''; 1568 this.mobileNav.classList.toggle("mobile"); 1569 1570 this.mobileNav.style.maxHeight = window.innerHeight + 'px'; 1571 1572 document.querySelector('html').classList.toggle("nav-open"); 1573 1574 // removes images from mobile menu 1575 if(!this.showImagesMobile) { 1576 document.querySelectorAll(".image").forEach(function (elem) { 1577 elem.classList.toggle('menu-hidden'); 1578 }); 1579 } 1580 1581 // removes cms blocks from mobile menu 1582 if(!this.showCmsBlockMobile) { 1583 document.querySelectorAll(".cmsBlock").forEach(function (elem) { 1584 elem.classList.add('menu-hidden'); 1585 }); 1586 } 1587 1588 }, 1589 mobileMenu() { 1590 1591 //search close button hidden on BO 1592 // const pageWrapper = document.querySelector('.page-wrapper'); 1593 // const searchCloseBtn = document.querySelector('.search-close-button'); 1594 // searchCloseBtn.parentElement.removeChild(searchCloseBtn); 1595 // pageWrapper.prepend(searchCloseBtn); 1596 1597 this.mobileNav.parentElement.style.maxHeight = window.innerHeight + 'px'; 1598 const self = this; 1599 1600 // opens & closes mobile menu when hamburger is clicked 1601 document.querySelector(this.toggle).addEventListener('click', self.boundToggle); 1602 1603 // expands submenus when parent item is clicked 1604 document.querySelectorAll(".parent").forEach(function (elem) { 1605 const childUl = self.childArrayOfType(elem, 'ul'); 1606 if (childUl.length > 0) { 1607 const anchorChildren = self.childArrayOfType(elem, 'a');
1608 anchorChildren.forEach(function(elem) { 1609 elem.classList.add('arrow'); 1610 elem.addEventListener('click', function(event) { 1611 event.stopPropagation(); 1612 if (event.target.tagName.toLowerCase() == "span" 1613 && this.href != window.location.href 1614 && this.href != "") { 1615 window.location.href = this.href; 1616 } else { 1617 event.preventDefault(); 1618 var $submenu = elem; 1619 if($submenu.closest("li").classList.contains("parent")) { 1620 if ($submenu.closest("li").classList.contains("expanded")) { 1621 if (self.expandBehavior) { 1622 const subMenuChildren = self.childArrayOfClass($submenu.parentElement, 'submenu'); 1623 subMenuChildren.forEach(function(elem){ 1624 elem.animate( 1625 { 1626 left: 100 + '%' 1627 }, 1628 { 1629 duration: 300 1630 } 1631 ); 1632 var $selectedItem = $submenu.parent.closest("li"); 1633 var selectedItemLevel = $selectedItem.dataset.level; 1634 $selectedItem.closest('.expanded.slide').classList.remove('child-expand'); 1635 $selectedItem.closest('ul').querySelectorAll('li.' + selectedItemLevel).forEach( 1636 function (elem) 1637 { 1638 elem.classList.remove('hide'); 1639 } 1640 ) 1641 $selectedItem.classList.toggle("expanded"); 1642 $selectedItem.classList.toggle("slide"); 1643 }); 1644 } else { 1645 $submenu.closest("li").classList.toggle("expanded"); 1646 $submenu.parentElement.querySelectorAll('.submenu').forEach(function(elem) { 1647 elem.classList.toggle("dropdown"); 1648 }); 1649 1650 //Closes children that have been opened 1651 const siblings = self.childArrayOfClass($submenu.parentElement, 'submenu'); 1652 siblings.forEach(function(sibling) { 1653 sibling.querySelectorAll('.expanded').forEach(function(elem){ 1654 elem.classList.remove('expanded'); 1655 self.childArrayOfClass('submenu').forEach(function(childElem){ 1656 childElem.classList.remove('dropdown'); 1657 }); 1658 }); 1659 }); 1660 //translated from this jquery $submenu.siblings('.submenu').find('.expanded').removeClass('expanded').children('.submenu').classList.remove('dropdown'); 1661 } 1662 } else { 1663 if (self.expandBehavior) { 1664 var $selectedItem = $submenu.closest("li"); 1665 var selectedItemLevel = $selectedItem.dataset.level; 1666 self.getAllParents($selectedItem, 'ul').forEach( 1667 function(parentElem) { 1668 parentElem.querySelectorAll('li.' + selectedItemLevel).forEach( 1669 function(selectedItem) { 1670 selectedItem.classList.toggle('hide'); 1671 }); 1672 } 1673 ); 1674 $selectedItem.classList.toggle("hide"); 1675 $selectedItem.classList.toggle("slide"); 1676 $selectedItem.classList.toggle("expanded "); 1677 1678 self.getAllParents($selectedItem,'.expanded.slide').classList.add('child-expand'); 1679 self.childArrayOfClass($submenu.parentElement,'submenu').forEach(function(sub) 1680 { 1681 sub.animate({ 1682 left: 0 1683 }, {duration: 300}); 1684 }); 1685 } else { 1686 $submenu.parentElement.classList.toggle("expanded"); 1687 self.childArrayOfClass($submenu.parentElement,'submenu').forEach(function(sub){ sub.classList.toggle("dropdown"); }); 1688 } 1689 } 1690 } else { 1691 $submenu.parentElement.classList.toggle("expanded"); 1692 } 1693 } 1694 }) 1695 }); 1696 } 1697 }); 1698 1699 document.querySelectorAll('.slide-title').forEach(function(elem) { 1700 elem.addEventListener('click', function(e) { 1701 self.childArrayOfType(this.closest('.submenu').closest('li'),'a').forEach(function(anchor) { 1702 anchor.click(); 1703 }); 1704 }); 1705 }); 1706 }, 1707 desktopMenu() { 1708 1709 //completely hidden on BO 1710 // const navSections = document.querySelector('.sections.nav-sections'); 1711 // const searchCloseBtn = document.querySelector('.search-close-button'); 1712 // searchCloseBtn.parentElement.removeChild(searchCloseBtn); 1713 // navSections.parentElement.insertBefore(searchCloseBtn, navSections); 1714 var self = this; 1715 1716 document.querySelector(this.toggle).removeEventListener('click', self.boundToggle ); 1717 1718 this.mobileNav.classList.remove("mobile"); 1719 document.querySelector('html').classList.remove("nav-open"); 1720 1721 // $('.arrow').unbind(); // Removes click event to prevent event from being fired multiple times when window is resized repeatedly //TODO figure out how to refactor in pure js 1722 // document.querySelector(this.toggle).removeEventListener('click', this.toggleAction); //todo fix for mobile 1723 1724 // un-removes images for desktop 1725 document.querySelectorAll(".image").forEach(function (elem) { 1726 elem.classList.remove('menu-hidden'); 1727 }); 1728 1729 // un-removes ms blocks for desktop 1730 document.querySelectorAll(".cmsBlock").forEach(function (elem) { 1731 elem.classList.remove('menu-hidden'); 1732 }); 1733 1734 //Special on hover delay openning of submenus 1735 var $topmenu = document.querySelector('.kadro-navigation .shop-dropdown'); 1736 var $submenu = document.querySelectorAll('.shop-dropdown > ul > li '); 1737 var topMenuOpenClass = 'shop-dropdown-open'; 1738 var subMenuOpenClass = 'submenu-open'; 1739 const submenuContainer = document.querySelector('.submenu-container'); 1740 1741
1742 var delay = 300; 1743 var timerTop; 1744 var timerSub; 1745 var activeSub = false; 1746 1747 $topmenu.addEventListener( 'mouseover', function() { 1748 clearTimeout(timerTop); 1749 document.querySelector(".page-header").classList.add('fixed-header-on-hover') 1750 $topmenu.classList.add(topMenuOpenClass); 1751 1752 //Set max height for menu to not exceed height of viewport 1753 const totalMaxHeight = (window.innerHeight - document.querySelector(".page-header").clientHeight) * 0.9; 1754 const dropdownUl = document.querySelector('.shop-dropdown > ul'); 1755 dropdownUl.style.maxHeight = totalMaxHeight + 'px'; 1756 1757 //Set submenu height to match 1758 document.querySelector('.submenu-container').style.height = dropdownUl.clientHeight + 'px'; 1759 1760 //Show first menu open 1761 if(!activeSub) { 1762 const firstChildSubmenu = dropdownUl.querySelector('li:first-child').querySelector('.submenu').cloneNode(true); 1763 document.querySelector('.submenu-container').append(firstChildSubmenu); 1764 } 1765 }); 1766 $topmenu.addEventListener( 'mouseout', function() { 1767 clearTimeout(timerTop); 1768 timerTop = setTimeout(function() { 1769 $topmenu.classList.remove(topMenuOpenClass); 1770 document.querySelector(".page-header").classList.remove('fixed-header-on-hover'); 1771 const open = document.querySelector('.' + subMenuOpenClass); 1772 if(open) open.classList.remove(subMenuOpenClass); 1773 //reset menu 1774 const submenuContainer = document.querySelector('.submenu-container'); 1775 self.emptyElement(submenuContainer); 1776 activeSub = false; 1777 }, delay); 1778 }); 1779 1780 $submenu.forEach(function (sub) 1781 { sub.addEventListener( 'mouseover', function(e) { 1782 var $thisSubmenu = this; 1783 if (!activeSub) { //no menus open 1784 //reset menu 1785 self.emptyElement(submenuContainer); 1786 const $subMenuClone = $thisSubmenu.querySelector('.submenu').cloneNode(true); 1787 document.querySelector('.submenu-container').append($subMenuClone); 1788 activeSub = true; 1789 } else { //at least one menu open 1790 clearTimeout(timerSub); 1791 timerSub = setTimeout(function() { //hold for time 1792 self.emptyElement(submenuContainer); 1793 const $subMenuClone = $thisSubmenu.querySelector('.submenu').cloneNode(true); 1794 document.querySelector('.submenu-container').append($subMenuClone); 1795 activeSub = true; 1796 }, delay); 1797 } 1798 }); 1799 }); 1800 1801 $submenu.forEach(function (sub) 1802 { sub.addEventListener( 'mouseout', function(e) { 1803 var $thisSubmenu = this; 1804 clearTimeout(timerSub); 1805 timerSub = setTimeout(function() { //hold for time 1806 if (e.relatedTarget && !e.relatedTarget.closest('.submenu-container')) { 1807 self.emptyElement(submenuContainer); 1808 $thisSubmenu.classList.toggle(subMenuOpenClass); 1809 activeSub = false; 1810 } 1811 }, delay); 1812 }); 1813 }); 1814 1815 } 1816 } 1817 } 1818 1819</script>
1819 1820 1821 1822 <div class="sections nav-sections order-3 h-full" x-data="initMenuSections()" @private-content-loaded.window="setIsLoggedIn($event.detail.data)"> 1823 <div class="clearfix"> 1824 <div class="section-item-title nav-sections-item-title md:hidden" :class="{ 'active': openedIndex === 'menu' }" @click="openedIndex = 'menu'"> 1825 <a class="nav-sections-item-switch" href="#store.menu">Menu</a> 1826 </div> 1827 1828 <div class="section-item-title nav-sections-item-title md:hidden" :class="{ 'active': openedIndex === 'account' }" @click="openedIndex = 'account'"> 1829 <a class="nav-sections-item-switch" href="#store.links">Account</a> 1830 </div> 1831 </div> 1832 1833 <div class="section-item-content nav-sections-item-content" x-show="openedIndex === 'menu'"> 1834 <nav class="kadro-navigation" role="navigation" > 1835 <ul x-data="initKadroMegaMenu()"> 1836 <li @private-content-loaded.window="setMediaQuery()" data-level="level0" class="nav-item level0 level-top shop-dropdown"> 1837 <a class="level-top hover:decoration-white hover:underline hover:decoration-solid" tabindex="-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="inline text-white" width="20" height="20" role="img"> 1838 <path stroke-linecap="round" stroke-linejoin="round" d="M4 6h16M4 12h16M4 18h16"/> 1839<title>menu</title></svg> 1840<span>Shop</span></a> 1841 <ul><li data-level="level0"class="nav-item level0 level-top "><a href="/nativity-sets" class="level-top" tabindex="-1"><span>Nativity Sets</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="chevron" width="20" height="20" role="img"> 1842 <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"/> 1843<title>chevron-down</title></svg> 1844</a></li></ul> 1845 <div class="submenu-container"></div> 1846 </li> 1847 </ul> 1848 </nav> 1849 </div> 1850 1851 <div class="section-item-content nav-sections-item-content md:hidden" x-show="openedIndex === 'account'"> 1852 <ul class="header links"> 1853 <li class="link wishlist" x-show="isLoggedIn"> 1854 <a href="https://www.outdoornativitysets.com/wishlist/">Wishlist</a> 1855 </li> 1856 <li class="link authorization-link" x-show="isLoggedIn"> 1857 <a href="https://www.outdoornativitysets.com/customer/account/logout/">Sign Out</a> 1858 </li> 1859 <li class="link authorization-link" x-show="!isLoggedIn"> 1860 <a href="https://www.outdoornativitysets.com/customer/account/login/">Sign In</a> 1861 </li> 1862 <li class="link create-account" x-show="!isLoggedIn"> 1863 <a href="https://www.outdoornativitysets.com/customer/account/create/">Create an Account</a> 1864 </li> 1865 </ul> 1866 </div> 1867 </div> 1868 1869 1870 1871 <div class="flex items-center justify-between max-md:justify-end gap-2 md:gap-1 order-2 md:-mr-1"> 1872 1873 <!--Search--> 1874 <div class="search-wrapper md:relative md:w-3/4"> 1875 <div class="z-10 rounded-lg shadow-sm bg-container-lighter border-container-lighter" 1876 id="search-content" 1877 x-cloak 1878 @resize.debounce.100.window="checkMobile()" 1879 x-init="checkMobile()" 1880 x-show="searchOpen || !isMobile" 1881 @keydown.escape=" 1882 $refs.searchButton.focus(); 1883 " 1884 > 1885
1885<script> 1886 'use strict'; 1887 1888 function initMiniSearch() { 1889 return { 1890 minSearchLength: 1, 1891 suggestions: [], 1892 suggest() { 1893 const search = this.$refs.searchInput; 1894 if (search.value.length >= this.minSearchLength) { 1895 search.setCustomValidity(''); 1896 search.reportValidity(); 1897 this.fetchSuggestions(search.value); 1898 } else { 1899 this.suggestions = []; 1900 } 1901 }, 1902 fetchSuggestions(term) { 1903 fetch( 1904 window.BASE_URL + 'search/ajax/suggest?' + new URLSearchParams({q: term}), 1905 { 1906 headers: { 1907 'X-Requested-With': 'XMLHttpRequest' 1908 } 1909 } 1910 ) 1911 .then(response => response.json()) 1912 .then(result => this.suggestions = result); 1913 }, 1914 search(term) { 1915 const search = this.$refs.searchInput; 1916 term = term || search.value; 1917 if (term.length < this.minSearchLength) { 1918 search.setCustomValidity('Minimum\u0020Search\u0020query\u0020length\u0020is\u00201'); 1919 search.reportValidity(); 1920 } else { 1921 search.setCustomValidity(''); 1922 search.value = term; 1923 this.$refs.form.submit(); 1924 } 1925 }, 1926 focusElement(element) { 1927 if (element && element.nodeName === "DIV") { 1928 element.focus(); 1929 return true; 1930 } else { 1931 return false; 1932 } 1933 } 1934 } 1935 } 1936</script>
1936 1937<div class="container py-2 mx-auto text-black" x-data="initMiniSearch()"> 1938 <search title="Store" role="search"> 1939 <form 1940 id="search_mini_form" 1941 class="form minisearch flex" 1942 action="https://www.outdoornativitysets.com/catalogsearch/result/" 1943 method="get" 1944 @submit.prevent="search()" 1945 x-ref="form" 1946 > 1947 <label class="sr-only" for="search"> 1948 Search </label> 1949 <input 1950 id="search" 1951 x-ref="searchInput" 1952 type="search" 1953 autocomplete="off" 1954 name="q" 1955 value="" 1956 placeholder="Search entire store here..." 1957 maxlength="128" 1958 class="w-full text-lg lg:text-xl text-grey-800 focus:border-transparent focus:outline-none rounded-l" 1959 @search-open.window.debounce.10="$el.focus(); $el.select()" 1960 @focus.once="suggest" 1961 @input.debounce.300="suggest" 1962 @keydown.arrow-down.prevent="focusElement($root.querySelector('[tabindex]'))" 1963 > 1964 <button 1965 type="submit" 1966 class="action search btn btn-primary rounded-l-none rounded-r shrink-0 p-3 shadow-none" 1967 title="Search" 1968 aria-label="Search" 1969 > 1970 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="20" height="20" aria-hidden="true"> 1971 <path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/> 1972</svg> 1973 </button> 1974 </form> 1975 </search> 1976 <template x-if="suggestions.length > 0"> 1977 <nav 1978 aria-label="Search Suggestions" 1979 class="flex flex-col mt-1 text-grey-800 gap-1" 1980 > 1981 <template x-for="suggestion in suggestions"> 1982 <button 1983 type="button" 1984 class="flex justify-between p-2 bg-container-lighter even:bg-container border border-container hover:bg-container-darker" 1985 @click="search(suggestion.title)" 1986 @keydown.enter="search(suggestion.title)" 1987 @keydown.arrow-up.prevent="focusElement($event.target.previousElementSibling) || $refs.searchInput.focus()" 1988 @keydown.arrow-down.prevent="focusElement($event.target.nextElementSibling)" 1989 > 1990 <span x-text="suggestion.title"></span> 1991 <span x-text="suggestion.num_results"></span> 1992 </button> 1993 </template> 1994 </nav> 1995 </template> 1996 </div> 1997 1998 </div> 1999 <button 2000 id="menu-search-icon" 2001 class="rounded p-1 outline-offset-2 md:right-1.5 max-md:left-[-2.5rem] max-md:top-1 md:absolute md:bottom-1/4 relative" 2002 aria-label="Toggle search form" 2003 aria-haspopup="true" 2004 @click.prevent=" 2005 searchOpen = !searchOpen; 2006 $dispatch('search-open'); 2007 " 2008 :aria-expanded="searchOpen" 2009 x-ref="searchButton" 2010 > 2011 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="search-toggle-icon text-white max-md:stroke-3" width="24" height="24" aria-hidden="true"> 2012 <path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/> 2013</svg> 2014 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="search-close-icon text-primary max-md:stroke-3" width="24" height="24" aria-hidden="true"> 2015 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 2016</svg> 2017 </button> 2018 </div> 2019 2020 2021 2022 <style> 2023input[type=text], input[type=password], input[type=url], input[type=tel], input[type=search], input[type=number], input[type=datetime], input[type=email], select { font-size: 16px; } 2024 2025.page-header .contact-message { margin: 0; } 2026 2027@media only screen and (max-width: 767px) { 2028 .page-header .contact-message div { text-align: center !important; margin: 1rem 0 !important; } 2029 .page-header .header.content .contact-message { margin: 0 !important; } 2030} 2031</style> 2032<div class="hidden-xs contact-message row"> 2033<div class="col-sm-2 hidden-xs" style="padding: 0; width: auto;"><i class="fa fa-mobile fa-lg" style="color: #a32c28; font-size: 55px;"></i></div> 2034<div class="col-sm-10 col-xs-6"><span style="font-weight: bold;" class="hidden-xs">NEED HELP?</span> <a style="color: #005581; text-decoration: none;" href="tel:+1855553-4946">(855)-553-4946</a></div> 2035<div class="col-sm-10 col-xs-6"><a href="https://www.outdoornativitysets.com/contact-us"><u>See our holiday hours</u></div> 2036</div> 2037 <!-- Additional Header Elements --> 2038 2039 2040 </div> 2041 </div> 2042 2043 </div> 2044 2045 <div x-show="searchOpen && isMobile" class="invisible md:hidden py-5 text-lg" style="display:none;">search</div> 2046
2047 <!--Cart Drawer--> 2048
2048<script> 2049 function initCartDrawer() { 2050 return { 2051 open: false, 2052 isLoading: false, 2053 canCheckout: false, 2054 cart: {}, 2055 maxItemsToDisplay: 10, 2056 itemsCount: 0, 2057 qtyCount: 0, 2058 getData(data) { 2059 if (data.cart) { 2060 this.cart = data.cart; 2061 this.itemsCount = data.cart.items && data.cart.items.length || 0; 2062 this.qtyCount = data.cart.summary_count || 0; 2063 this.setCartItems(); 2064 this.canCheckout = data.cart.possible_onepage_checkout; 2065 } 2066 this.isLoading = false; 2067 }, 2068 cartItems: [], 2069 getItemCountTitle() { 2070 return hyva.strf('\u00250\u0020of\u0020\u00251\u0020products\u0020in\u0020cart\u0020displayed', this.maxItemsToDisplay, this.itemsCount) 2071 }, 2072 setCartItems() { 2073 this.cartItems = this.cart.items && this.cart.items.sort((a, b) => b.item_id - a.item_id) || []; 2074 2075 if (this.maxItemsToDisplay > 0) { 2076 this.cartItems = this.cartItems.slice(0, parseInt(this.maxItemsToDisplay, 10)); 2077 } 2078 }, 2079 buildExtraParamStr(params) { 2080 let i, extraParamStr = '', keys = Object.keys(params); 2081 for(i = 0; i < keys.length; i++) { 2082 extraParamStr += `&${keys[i]}=${params[keys[i]]}`; 2083 } 2084 return extraParamStr; 2085 }, 2086 updateCart(url, params){ 2087 this.isLoading = true; 2088 2089 const formKey = hyva.getFormKey(); 2090 2091 const paramStr = this.buildExtraParamStr(params); 2092 2093 return fetch(url, { 2094 "headers": { 2095 "content-type": "application/x-www-form-urlencoded; charset=UTF-8", 2096 }, 2097 "body": "form_key=" + formKey + paramStr, 2098 "method": "POST", 2099 "mode": "cors", 2100 "credentials": "include" 2101 }); 2102 }, 2103 updateQtyOnItemInCart(itemId, qty) { 2104 this.updateCart( 2105 BASE_URL + 'checkout/sidebar/updateItemQty/', 2106 {'item_id': itemId, 'item_qty': qty } 2107 ).then(response => { 2108 if (response.redirected) { 2109 window.location.href = response.url; 2110 } else if (response.ok) { 2111 return response.json(); 2112 } else { 2113 window.dispatchMessages && window.dispatchMessages([{ 2114 type: 'warning', 2115 text: 'Could\u0020not\u0020update\u0020item\u0020qty.' 2116 }]); 2117 this.isLoading = false; 2118 } 2119 }).then(result => { 2120 window.dispatchMessages && window.dispatchMessages([{ 2121 type: result.success ? 'success' : 'error', 2122 text: result.success 2123 ? 'You\u0020updated\u0020the\u0020Qty\u0020of\u0020this\u0020item.' 2124 : result.error_message 2125 }], result.success ? 5000 : 0) 2126 window.dispatchEvent(new CustomEvent('reload-customer-section-data')); 2127 }); 2128 }, 2129 deleteItemFromCart(itemId) { 2130 this.updateCart( 2131 BASE_URL + 'checkout/sidebar/removeItem/', 2132 {'item_id': itemId } 2133 ).then(response => { 2134 if (response.redirected) { 2135 window.location.href = response.url; 2136 } else if (response.ok) { 2137 return response.json(); 2138 } else { 2139 window.dispatchMessages && window.dispatchMessages([{ 2140 type: 'warning',
2141 text: 'Could\u0020not\u0020remove\u0020item\u0020from\u0020quote.' 2142 }]); 2143 this.isLoading = false; 2144 } 2145 }).then(result => { 2146 window.dispatchMessages && window.dispatchMessages([{ 2147 type: result.success ? 'success' : 'error', 2148 text: result.success 2149 ? 'You\u0020removed\u0020the\u0020item.' 2150 : result.error_message 2151 }], result.success ? 5000 : 0) 2152 window.dispatchEvent(new CustomEvent('reload-customer-section-data')); 2153 }); 2154 }, 2155 scrollLock(use = true) { 2156 document.body.style.overflow = use ? "hidden" : ""; 2157 }, 2158 toggleCartDrawer(event) { 2159 if (event.detail && event.detail.isOpen !== undefined) { 2160 if (event.detail.isOpen) { 2161 this.openCartDrawer(); 2162 } else { 2163 this.open = false; 2164 this.scrollLock(false); 2165 this.$refs && this.$refs.cartDialogContent && hyva.releaseFocus(this.$refs.cartDialogContent); 2166 } 2167 } else { 2168 this.openCartDrawer() 2169 } 2170 }, 2171 openCartDrawer() { 2172 this.open = true; 2173 this.scrollLock(true); 2174 this.$nextTick(() => { 2175 this.$refs && this.$refs.cartDialogContent && hyva.trapFocus(this.$refs.cartDialogContent) 2176 }) 2177 }, 2178 closeCartDrawer() { 2179 this.$dispatch('toggle-cart', { isOpen: false }) 2180 }, 2181 getSectionDataExtraActions() { 2182 if (!this.cart.extra_actions) { 2183 return ''; 2184 } 2185 2186 const contentNode = document.createElement('div'); 2187 contentNode.innerHTML = this.cart.extra_actions; 2188 2189 hyva.activateScripts(contentNode); 2190 2191 return contentNode.innerHTML; 2192 } 2193 } 2194 } 2195</script>
2195 2196<section x-cloak 2197 x-show="cart" 2198 id="cart-drawer" 2199 x-data="initCartDrawer()" 2200 @private-content-loaded.window="getData($event.detail.data)" 2201 @toggle-cart.window="toggleCartDrawer($event)" 2202 @keydown.escape="closeCartDrawer" 2203> 2204 <div role="dialog" 2205 aria-labelledby="cart-drawer-title" 2206 aria-modal="true" 2207 :aria-hidden="!open" 2208 class="fixed inset-y-0 right-0 z-30 flex max-w-full"> 2209 <div class="backdrop" 2210 x-show="open" 2211 x-transition:enter="ease-in-out duration-500" 2212 x-transition:enter-start="opacity-0" 2213 x-transition:enter-end="opacity-100" 2214 x-transition:leave="ease-in-out duration-500" 2215 x-transition:leave-start="opacity-100" 2216 x-transition:leave-end="opacity-0" 2217 role="button" 2218 @click="closeCartDrawer" 2219 aria-label="Close minicart"></div> 2220 <div class="relative w-screen max-w-lg shadow-2xl" 2221 x-show="open" 2222 x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" 2223 x-transition:enter-start="translate-x-full" 2224 x-transition:enter-end="translate-x-0" 2225 x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" 2226 x-transition:leave-start="translate-x-0" 2227 x-transition:leave-end="translate-x-full" 2228 x-ref="cartDialogContent" 2229 role="region" 2230 :tabindex="open ? 0 : -1" 2231 aria-label="My Cart" 2232 2233 > 2234 <div class="flex flex-col h-full max-h-screen bg-white shadow-xl"> 2235
2235<script> 2236 function initializeOpenCartEvent(event) { 2237 let oldCart = event.detail.data.oldCart; 2238 let newCart = event.detail.data.privateData.cart; 2239 2240 if( 2241 (!oldCart && newCart) || 2242 (newCart && (oldCart.summary_count < newCart.summary_count)) 2243 ) { 2244 window.dispatchEvent(new CustomEvent('toggle-cart', {detail: {isOpen: true}})); 2245 } 2246 } 2247 2248 window.addEventListener('cart-change', initializeOpenCartEvent) 2249 2250</script>
2250 2251 2252 <header class="relative px-4 py-6 sm:px-6"> 2253 <p id="cart-drawer-title" class="text-lg font-medium leading-7 text-gray-900"> 2254 <span class="items-total text-xs" 2255 x-show="maxItemsToDisplay && maxItemsToDisplay < itemsCount" 2256 x-text="getItemCountTitle()"> 2257 </span> 2258 </p> 2259 </header> 2260 2261 <template x-if="itemsCount"> 2262 <div> 2263 2264 <div class="minicart-summary relative grid gap-6 sm:gap-8 py-3 px-9 bg-white"> 2265 <div class="minicart-details flex"> 2266 <div class="items-total p-3 w-1/2"> 2267 <span class="count font-bold" x-text="qtyCount"></span> 2268 <template x-if="itemsCount > 1"> 2269 <span>Items in Cart</span> 2270 </template> 2271 <template x-if="itemsCount == 1"> 2272 <span>Item in Cart</span> 2273 </template> 2274 </div> 2275 <div class="minicart-subtotal text-right w-1/2 p-3 space-x-4 transition duration-150 ease-in-out rounded-lg hover:bg-gray-100"> 2276 <p>Cart Subtotal: <span x-html="cart.subtotal" class="font-bold"></span></p> 2277 </div> 2278 </div> 2279 2280 <template x-if="canCheckout"> 2281 <div class="minicart-actions w-full space-x-4 transition duration-150 ease-in-out font-semibold text-xl hover:bg-gray-100"> 2282 <a @click.prevent.stop="closeCartDrawer; $dispatch('toggle-authentication', 2283 {url: 'https://www.outdoornativitysets.com/checkout/'});" 2284 href="https://www.outdoornativitysets.com/checkout/" 2285 class="inline-flex p-6 rounded-md w-full leading-8 justify-center btn-primary" 2286 > 2287 Go to Checkout </a> 2288 </div> 2289 </template> 2290 <div class="minicart-actions" x-html="getSectionDataExtraActions()"></div> 2291 </div> 2292 </div> 2293 </template> 2294 2295 <!-- custom kadro block --> 2296 <div id="minicart-promo-block"> 2297 </div> 2298 2299 2300 <template x-if="!itemsCount"> 2301 <div class="relative px-4 py-6 bg-white border-bs sm:px-6 border-container font-bold"> 2302 You have no items in your shopping cart. </div> 2303 </template> 2304 2305 <template x-if="itemsCount"> 2306 <div class="relative gap-6 sm:gap-8 px-1 py-3 sm:px-3 bg-white border-b border-container overflow-y-auto overscroll-y-contain"> 2307 <template x-for="item in cartItems"> 2308 <div class="flex items-start p-3 space-x-4 transition border-t duration-150 ease-in-out rounded-lg hover:bg-gray-100" 2309 x-data = "{ currentQty: item.qty }"> 2310 <a :href="item.product_url" 2311 class="w-1/4" 2312 :aria-label="hyva.strf('Product\u0020\u0022\u00250\u0022', item.product_name)" 2313 > 2314 <img 2315 :src="item.product_image.src" 2316 :width="item.product_image.width" 2317 :height="item.product_image.height" 2318 loading="lazy" 2319 alt="" 2320 /> 2321 </a> 2322 <div class="w-3/4 space-y-2"> 2323 <div> 2324 <template x-if="item.promo_product || item.promo_product_free_product"> 2325 <div>
2326 <span class="leading-none text-lg"> 2327 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="inline" width="18" height="18" role="img"> 2328 <path fill-rule="evenodd" d="M5 5a3 3 0 015-2.236A3 3 0 0114.83 6H16a2 2 0 110 4h-5V9a1 1 0 10-2 0v1H4a2 2 0 110-4h1.17C5.06 5.687 5 5.35 5 5zm4 1V5a1 1 0 10-1 1h1zm3 0a1 1 0 10-1-1v1h1z" clip-rule="evenodd"/> 2329 <path d="M9 11H3v5a2 2 0 002 2h4v-7zM11 18h4a2 2 0 002-2v-5h-6v7z"/> 2330<title>gift</title></svg> 2331 </span> 2332 <span> 2333 FREE GIFT </span> 2334 </div> 2335 </template> 2336 <a :href="item.product_url" class="text-xl"> 2337 <span x-html="item.product_name"></span> 2338 </a> 2339 <template x-if="!(item.promo_product || item.promo_product_free_product)"> 2340 <p 2341 class="text-sm" 2342 :class="{'hidden': item.product_type === 'bundle'}" 2343 > 2344 <span x-html="item.product_sku"></span> 2345 </p> 2346 </template> 2347 </div> 2348 <template x-if="item.options.length > 0"> 2349 <div class="item-options-container" x-data="{ opened: false }"> 2350 <span class="toggle cursor-pointer" @click="opened = !opened"> 2351 See Details <template x-if="opened"> 2352 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-6 h-6 inline text-[#8f8f8f]" width="32" height="32" role="img"> 2353 <path stroke-linecap="round" stroke-linejoin="round" d="M5 15l7-7 7 7"/> 2354<title>chevron-up</title></svg> 2355 </template> 2356 <template x-if="!opened"> 2357 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-6 h-6 inline text-[#8f8f8f]" width="32" height="32" role="img"> 2358 <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"/> 2359<title>chevron-down</title></svg> 2360 </template> 2361 </span> 2362 <template x-if="opened"> 2363 <div class="item-options-wrapper mb-[20px]"> 2364 <template x-for="option in item.options"> 2365 <div class="pt-2"> 2366 <p class="font-semibold inline mr-[10px]" x-text="option.label + ':'"></p> 2367 <p class="text-secondary inline" x-html="option.value"></p> 2368 </div> 2369 </template> 2370 </div> 2371 </template> 2372 </div> 2373 </template> 2374 <p> 2375 <span x-html="item.product_price"></span> 2376 <template x-if="item.promo_product || item.promo_product_free_product">
2377 <span class="line-through pl-4 inline-block" x-html="item.promo_original_price"></span> 2378 </template> 2379 <template x-if="item.upsell_original_price > item.product_price_value"> 2380 <span class="line-through pl-4 inline-block" x-html="hyva.formatPrice(item.upsell_original_price)"></span> 2381 </template> 2382 </p> 2383 <div itemclass="pt-4" class="flex flex-wrap justify-between"> 2384 <template x-if="!(item.promo_product || item.promo_product_free_product)"> 2385 <div class="w-3/4 flex gap-4 justify-right items-center"> 2386 <label class="w-1/6 inline-flex" for="'qty-input-' + item.product_sku"> 2387 <span>Qty:</span> 2388 </label> 2389 2390 <input class="inline-flex w-2/6 leading-normal" type="text" :name="'qty-input-' + item.product_sku" id="'qty-input-' + item.product_sku" x-model="currentQty" :value="item.qty"/> 2391 <button class="py-1 inline-flex w-3/6 justify-center rounded-md bg-new-blue text-white font-semibold" :class="currentQty != item.qty ? '' : 'invisible'" @click="updateQtyOnItemInCart(item.item_id, currentQty)">Update</button> 2392 2393 </div> 2394 </template> 2395 <template x-if="!(item.promo_product || item.promo_product_free_product)"> 2396 <div class="w-1/4 flex justify-right items-center"> 2397 <button type="button" 2398 class="inline-flex p-1 w-1/2" 2399 @click="deleteItemFromCart(item.item_id)" 2400 :aria-label="hyva.strf('Remove\u0020product\u0020\u0022\u00250\u0022\u0020from\u0020cart', item.product_name)" 2401 > 2402 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="20" height="20" aria-hidden="true"> 2403 <path stroke-linecap="round" stroke-linejoin="round" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"/> 2404</svg> 2405 </button> 2406 </div> 2407 </template> 2408 </div> 2409 2410 </div> 2411 </div> 2412 </template> 2413 </div> 2414 </template> 2415 2416 <template x-if="itemsCount"> 2417 <div class="p-4 text-center"> 2418 <a href="https://www.outdoornativitysets.com/checkout/cart/" 2419 > 2420 View and Edit Cart </a> 2421 </div> 2422 </template> 2423 2424
2424<script> 2425 function prepareMollieApplePayMinicart() { 2426 const objectToFormData = (object, prefix = null, formDataObject = null) => { 2427 const formData = formDataObject || new FormData(); 2428 Object.keys(object).forEach(key => { 2429 const value = object[key]; 2430 const name = prefix ? `${prefix}[${key}]` : key; 2431 if (value instanceof Object) { 2432 objectToFormData(value, name, formData); 2433 } else { 2434 formData.append(name, value); 2435 } 2436 }); 2437 2438 return new URLSearchParams(formData).toString(); 2439 }; 2440 2441 return { 2442 totalAmount: 0, 2443 2444 init: () => { 2445 // Normally we would use private-content-loaded to get this information, but this component is 2446 // rendered after this event has been dispatched. So get the information from the browser storage. 2447 const browserStorage = hyva.getBrowserStorage(); 2448 if (browserStorage) { 2449 const cacheStorage = browserStorage.getItem('mage-cache-storage'); 2450 const cart = JSON.parse(cacheStorage).cart; 2451 2452 this.totalAmount = cart.subtotalAmount; 2453 } 2454 2455 window.addEventListener('private-content-loaded', event => { 2456 this.totalAmount = event.detail.data.cart.subtotalAmount 2457 }) 2458 }, 2459 2460 pay: () => { 2461 // The $block total is more reliable as it holds shipping costs and discounts, but due to some setups 2462 // it is sometimes empty. In that case, use the totalAmount from the browser storage. 2463 // The correct total amount is retrieved and set during the shipping step. 2464 const amount = "" || this.totalAmount; 2465 let countryCode, postalCode, shippingMethods, selectedShippingMethod, quoteTotals; 2466 2467 const request = { 2468 countryCode: "US", 2469 currencyCode: "USD", 2470 supportedNetworks: ["amex","masterCard","visa","maestro","vPay"], 2471 merchantCapabilities: ['supports3DS'], 2472 total: { 2473 label: "English\u0020\u0028ONS\u0029", 2474 amount: amount 2475 }, 2476 shippingType: 'shipping', 2477 requiredBillingContactFields: [ 2478 'postalAddress', 2479 'name', 2480 'email', 2481 'phone' 2482 ], 2483 requiredShippingContactFields: [ 2484 'postalAddress', 2485 'name', 2486 'email', 2487 'phone' 2488 ] 2489 } 2490 2491 let session = new ApplePaySession(3, request); 2492 2493 const getTotal = () => { 2494 let totals = [...quoteTotals]; 2495 let total = totals.pop(); 2496 2497 total.label = "English\u0020\u0028ONS\u0029"; 2498 2499 return total; 2500 }; 2501 2502 const getLineItems = () => { 2503 let totals = [...quoteTotals]; 2504 totals.pop(); 2505 2506 return totals; 2507 }; 2508 2509 const handleAjaxError = (message) => { 2510 session.abort(); 2511 2512 dispatchMessages([ 2513 { 2514 text: message, 2515 type: 'error' 2516 } 2517 ]); 2518 }; 2519 2520 session.onpaymentmethodselected = () => { 2521 session.completePaymentMethodSelection(getTotal(), []); 2522 }; 2523 2524 session.onshippingcontactselected = (event) => { 2525 countryCode = event.shippingContact.countryCode; 2526 postalCode = event.shippingContact.postalCode; 2527 2528 fetch(`${BASE_URL}mollie/applePay/shippingMethods?form_key=${hyva.getFormKey()}`, { 2529 method: 'POST', 2530 headers: { 2531 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', 2532 }, 2533 body: 'countryCode=' + event.shippingContact.countryCode + 2534 '&postalCode=' + event.shippingContact.postalCode 2535 }) 2536 .then(response => { 2537 if (!response.ok) { 2538 throw new Error('Network response was not ok'); 2539 } 2540 return response.json(); 2541 }) 2542 .then(result => { 2543 shippingMethods = result.shipping_methods; 2544 selectedShippingMethod = result.shipping_methods[0]; 2545 quoteTotals = result.totals; 2546 2547 session.completeShippingContactSelection( 2548 ApplePaySession.STATUS_SUCCESS, 2549 result.shipping_methods, 2550 getTotal(), 2551 getLineItems() 2552 ); 2553 }) 2554 .catch(error => handleAjaxError(error)); 2555 }; 2556 2557 session.onshippingmethodselected = (event) => { 2558 selectedShippingMethod = event.shippingMethod; 2559 2560 fetch(`${BASE_URL}mollie/applePay/shippingMethods?form_key=${hyva.getFormKey()}`, { 2561 method: 'POST', 2562 headers: { 2563 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', 2564 }, 2565 body: objectToFormData({ 2566 shippingMethod: selectedShippingMethod, 2567 countryCode: countryCode, 2568 postalCode: postalCode 2569 }) 2570 }) 2571 .then(response => { 2572 if (!response.ok) { 2573 throw new Error('Network response was not ok'); 2574 } 2575 return response.json(); 2576 }) 2577 .then(result => { 2578 quoteTotals = result.totals; 2579 2580 session.completeShippingMethodSelection( 2581 ApplePaySession.STATUS_SUCCESS, 2582 getTotal(), 2583 getLineItems() 2584 ); 2585 }) 2586 .catch(error => handleAjaxError(error)); 2587 }; 2588 2589 session.onpaymentauthorized = (event) => { 2590 fetch(`${BASE_URL}mollie/applePay/placeOrder?form_key=${hyva.getFormKey()}`, { 2591 method: 'POST', 2592 headers: { 2593 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', 2594 }, 2595 body: objectToFormData({ 2596 shippingMethod: selectedShippingMethod, 2597 billingAddress: event.payment.billingContact, 2598 shippingAddress: event.payment.shippingContact, 2599 applePayPaymentToken: JSON.stringify(event.payment.token) 2600 }) 2601 }) 2602 .then(response => { 2603 if (!response.ok) { 2604 throw new Error('Network response was not ok'); 2605 } 2606 return response.json(); 2607 }) 2608 .then(result => { 2609 if (!session) { 2610 console.warn('Payment canceled'); 2611 return; 2612 } 2613 2614 if (result.error) { 2615 handleAjaxError(result.error_message); 2616 return; 2617 } 2618 2619 if (!result.url) { 2620 handleAjaxError('Something went wrong, please try again later.'); 2621 return; 2622 } 2623 2624 session.completePayment(ApplePaySession.STATUS_SUCCESS); 2625 2626 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 2627 2628 setTimeout(() => { 2629 location.href = result.url; 2630 }, 1000); 2631 }) 2632 .catch(error => handleAjaxError(error)); 2633 }; 2634 2635 session.onvalidatemerchant = (event) => { 2636 fetch( 2637 `${BASE_URL}mollie/checkout/applePayValidation?form_key=${hyva.getFormKey()}`, 2638 { 2639 method: 'POST', 2640 headers: { 2641 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', 2642 }, 2643 body: objectToFormData({validationURL: event.validationURL}), 2644 } 2645 ) 2646 .then((response) => { 2647 if (!response.ok) { 2648 throw new Error('Merchant validation failed'); 2649 } 2650 2651 return response.json() 2652 }) 2653 .then((result) => session.completeMerchantValidation(result)) 2654 .catch(error => handleAjaxError(error)); 2655 }; 2656 2657 session.oncancel = () => { 2658 session = null; 2659 } 2660 2661 session.begin(); 2662 } 2663 } 2664 } 2665 2666 window.addEventListener( 2667 'alpine:init', 2668 () => Alpine.data('prepareMollieApplePayMinicart', prepareMollieApplePayMinicart), 2669 {once: true} 2670 ) 2671</script>
2671 2672 </div> 2673 2674 <button 2675 type="button" 2676 @click="closeCartDrawer" 2677 aria-label="Close minicart" 2678 class="absolute top-0 right-2 p-4 mt-2 text-gray-300 transition-colors hover:text-black" 2679 > 2680 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 2681 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 2682</svg> 2683 </button> 2684 </div> 2685 <div 2686 class="z-50 fixed inset-0 grid place-items-center bg-white/70 text-primary" 2687 x-cloak 2688 x-show="isLoading" 2689 x-transition.opacity.duration.200ms 2690> 2691 <div class="flex gap-10 items-center p-4"> 2692 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 57 57" width="57" height="57" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"> 2693 <style> 2694 @keyframes spinner-ball-triangle1 { 2695 0% { transform: translate(0%, 0%); } 2696 33% { transform: translate(38%, -79%); } 2697 66% { transform: translate(77%, 0%); } 2698 100% { transform: translate(0%, 0%); } 2699 } 2700 2701 @keyframes spinner-ball-triangle2 { 2702 0% { transform: translate(0%, 0%); } 2703 33% { transform: translate(38%, 79%); } 2704 66% { transform: translate(-38%, 79%); } 2705 100% { transform: translate(0%, 0%); } 2706 } 2707 2708 @keyframes spinner-ball-triangle3 { 2709 0% { transform: translate(0%, 0%); } 2710 33% { transform: translate(-77%, 0%); } 2711 66% { transform: translate(-38%, -79%); } 2712 100% { transform: translate(0%, 0%); } 2713 } 2714 </style> 2715 <circle cx="5" cy="50" r="5" style="animation: spinner-ball-triangle1 2.2s linear infinite"/> 2716 <circle cx="27" cy="5" r="5" style="animation: spinner-ball-triangle2 2.2s linear infinite"/> 2717 <circle cx="49" cy="50" r="5" style="animation: spinner-ball-triangle3 2.2s linear infinite"/> 2718</svg> 2719 <span class="text-xl select-none"> 2720 Loading... </span> 2721 </div> 2722</div> 2723 </div> 2724 2725</section> 2726 2727 <!--Authentication Pop-Up--> 2728
2728<script> 2729 function initAuthentication() { 2730 return { 2731 open: false, 2732 close() { 2733 this.open = false; 2734 }, 2735 forceAuthentication: false, 2736 checkoutUrl: 'https://www.outdoornativitysets.com/checkout/index/', 2737 errors: 0, 2738 hasCaptchaToken: 0, 2739 displayErrorMessage: false, 2740 errorMessages: [], 2741 setErrorMessages(message) { 2742 this.errorMessages = [message]; 2743 this.displayErrorMessage = true; 2744 }, 2745 submitForm() { 2746 // Do not rename $form, the variable is expected to be declared in the recaptcha output 2747 const $form = document.querySelector('#login-form'); 2748 if (!this.hasCaptchaToken) { 2749 this.errors = 1; 2750 2751 2752 const executeGreCaptcha = () => { 2753 grecaptcha.ready(() => { 2754 grecaptcha.execute( 2755 '6Lf7qRkjAAAAAP0lyuri41_9EGRTkVEkzoJvVxbE', 2756 {action: 'submit'} 2757 ).then((token) => { 2758 const tokenElement = $form['g\u002Drecaptcha\u002Dresponse']; 2759 2760 if (tokenElement && token && token.length > 0) { 2761 $form['g\u002Drecaptcha\u002Dresponse'].value = token; 2762 this.errors = 0; 2763 this.hasCaptchaToken = 1; 2764 (this.submitForm || $form.submit).call(this); 2765 } else { 2766 this.errors = 1; 2767 const error = tokenElement 2768 ? 'ReCaptcha\u0020validation\u0020failed,\u0020please\u0020try\u0020again' 2769 : 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020trying\u0020again.'; 2770 if (this.setErrorMessages) { 2771 this.setErrorMessages([error]) 2772 this.displayErrorMessage = true; 2773 } else { 2774 window.dispatchMessages && window.dispatchMessages([{type: "error", text: error}], 5000); 2775 } 2776 } 2777 }).catch(exception => { 2778 console.error(exception || `An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?`) 2779 }); 2780 }) 2781 } 2782 2783 if (window.grecaptcha) { 2784 executeGreCaptcha(); 2785 } else { 2786 const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6Lf7qRkjAAAAAP0lyuri41_9EGRTkVEkzoJvVxbE"; 2787 const script = document.createElement('script'); 2788 script.setAttribute('type', 'text/javascript'); 2789 script.setAttribute('src', recaptchaUrl); 2790 document.head.appendChild(script); 2791 2792 script.addEventListener("load", executeGreCaptcha, false); 2793 } 2794 } 2795 2796 if (this.errors === 0) { 2797 this.dispatchLoginRequest($form); 2798 } 2799 }, 2800 onPrivateContentLoaded() { 2801 const data = this.$event.detail.data; 2802 const isLoggedIn = data.customer && data.customer.firstname; 2803 if (data.cart && !isLoggedIn) { 2804 this.forceAuthentication = !data.cart.isGuestCheckoutAllowed; 2805 } 2806 }, 2807 redirectIfAuthenticated() { 2808 const event = this.$event; 2809 this.open = this.forceAuthentication; 2810 2811 if (event.detail && event.detail.url) { 2812 this.checkoutUrl = event.detail.url; 2813 } 2814 if (!this.forceAuthentication) { 2815 window.location.href = this.checkoutUrl; 2816 } 2817 }, 2818 resetErrors() { 2819 this.errors = 0; 2820 }, 2821 dispatchLoginRequest(form) { 2822 this.isLoading = true; 2823 const username = this.$refs['customer-email'].value; 2824 const password = this.$refs['customer-password'].value; 2825 const formKey = hyva.getFormKey(); 2826 const bodyFields = { 2827 'username': username, 2828 'password': password, 2829 'formKey': formKey 2830 }; 2831 const fieldName = 'g\u002Drecaptcha\u002Dresponse'; 2832 const recaptchaField = fieldName && form[fieldName]; 2833 if (recaptchaField) { 2834 bodyFields[fieldName] = recaptchaField.value; 2835 } 2836 fetch('https://www.outdoornativitysets.com/customer/ajax/login/', { 2837 method: 'POST', 2838 headers: { 2839 'Content-Type': 'application/json', 2840 'X-Requested-With': 'XMLHttpRequest' 2841 }, 2842 body: JSON.stringify(bodyFields) 2843 } 2844 ).then(response => { 2845 return response.json() 2846 } 2847 ).then(data => { 2848 this.isLoading = false;
2849 if (data.errors) { 2850 this.setErrorMessages(data.message); 2851 this.errors = 1; 2852 this.hasCaptchaToken = 0; 2853 } else { 2854 window.location.href = this.checkoutUrl; 2855 } 2856 }); 2857 } 2858 } 2859 } 2860 2861 window.addEventListener('alpine:init', () => Alpine.data('initAuthentication', initAuthentication), {once: true}) 2862</script>
2862 2863<section id="authentication-popup" 2864 x-data="initAuthentication" 2865 @private-content-loaded.window="onPrivateContentLoaded" 2866 @toggle-authentication.window="redirectIfAuthenticated" 2867 @keydown.window.escape="close" 2868> 2869 <div 2870 class="backdrop" 2871 aria-hidden="true" 2872 x-cloak 2873 x-show="open" 2874 x-transition:enter="ease-in-out duration-500" 2875 x-transition:enter-start="opacity-0" 2876 x-transition:enter-end="opacity-100" 2877 x-transition:leave="ease-in-out duration-500" 2878 x-transition:leave-start="opacity-100" 2879 x-transition:leave-end="opacity-0" 2880 @click="close" 2881 ></div> 2882 <div role="dialog" 2883 aria-modal="true" 2884 @click.outside="close" 2885 class="inset-y-0 right-0 z-30 flex max-w-full fixed" 2886 x-cloak 2887 x-show="open" 2888 > 2889 <div class="relative w-screen max-w-md pt-16 bg-container-lighter" 2890 x-show="open" 2891 x-cloak 2892 x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" 2893 x-transition:enter-start="translate-x-full" 2894 x-transition:enter-end="translate-x-0" 2895 x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" 2896 x-transition:leave-start="translate-x-0" 2897 x-transition:leave-end="translate-x-full" 2898 > 2899 <div 2900 x-show="open" 2901 x-cloak 2902 x-transition:enter="ease-in-out duration-500" 2903 x-transition:enter-start="opacity-0" 2904 x-transition:enter-end="opacity-100" 2905 x-transition:leave="ease-in-out duration-500" 2906 x-transition:leave-start="opacity-100" 2907 x-transition:leave-end="opacity-0" class="absolute top-0 right-2 flex p-2 mt-2"> 2908 <button 2909 type="button" 2910 @click="close" 2911 aria-label="Close panel" 2912 class="p-2 text-gray-300 transition duration-150 ease-in-out hover:text-black" 2913 > 2914 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 2915 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 2916</svg> 2917 </button> 2918 </div> 2919 <template x-if="open"> 2920 <div class="flex flex-col h-full py-6 space-y-6 bg-white shadow-xl overflow-y-auto"> 2921 <div class="mx-4"> 2922 <div class="message error mb-0" x-show="errors" x-cloak> 2923 <template x-for="(message, index) in errorMessages" :key="index"> 2924 <div> 2925 <template x-if="message"> 2926 <span x-html="message"></span> 2927 </template> 2928 </div> 2929 </template> 2930 </div> 2931 </div> 2932 <div class="block-customer-login bg-container border border-container mx-4 p-4 shadow-sm"> 2933 <p id="authenticate-customer-login" class="text-lg leading-7 text-gray-900"> 2934 <strong class="font-medium">Checkout using your account</strong> 2935 </p> 2936 2937 <form class="form form-login" 2938 method="post" 2939 @submit.prevent="submitForm" 2940 id="login-form" 2941 > 2942 <div class="control"> 2943 <input type="hidden" 2944 value="" 2945 name="g-recaptcha-response" 2946 /> 2947</div> 2948 <div class="fieldset login"> 2949 <div class="field email required"> 2950 <label class="label" for="form-login-username" form="login-form" >
2951 <span>Email Address</span> 2952 </label> 2953 <div class="control"> 2954 <input name="username" 2955 id="form-login-username" 2956 x-ref="customer-email" 2957 @change="resetErrors" 2958 type="email" 2959 required 2960 autocomplete="off" 2961 class="form-input" 2962 > 2963 </div> 2964 </div> 2965 <div class="field password required"> 2966 <label for="form-login-password" class="label" form="login-form"> 2967 <span>Password</span> 2968 </label> 2969 <div class="control"> 2970 <input name="password" 2971 id="form-login-password" 2972 type="password" 2973 class="form-input" 2974 required 2975 x-ref="customer-password" 2976 autocomplete="off" 2977 @change="resetErrors" 2978 > 2979 </div> 2980 </div> 2981 2982 <input name="context" type="hidden" value="checkout" /> 2983 <div class="actions-toolbar pt-6 pb-2"> 2984 <button type="submit" class="inline-flex btn btn-primary disabled:opacity-75" 2985 > 2986 Sign In </button> 2987 <a href="https://www.outdoornativitysets.com/customer/account/forgotpassword/" 2988 > 2989 Forgot Your Password? </a> 2990 </div> 2991 2992 </div> 2993 </form> 2994 </div> 2995 <div class="mx-4"> 2996 <p class="my-4 text-sm text-gray-900"> 2997 This form is protected by reCAPTCHA.</p> 2998 </div> 2999 <div class="block-new-customer bg-container border border-container mx-4 p-4 shadow-sm"> 3000 <p id="authenticate-new-customer" class="text-lg mb-2 leading-7 text-gray-900"> 3001 <strong class="font-medium">Checkout as a new customer</strong> 3002 </p> 3003 3004 <div class="block-content"> 3005 <p class="mb-1"> 3006 Creating an account has many benefits: </p> 3007 <ul class="list-disc pl-5"> 3008 <li> See order and shipping status</li> 3009 <li> Track order history</li> 3010 <li> Check out faster</li> 3011 </ul> 3012 <div class="actions-toolbar mt-6 mb-2"> 3013 <a href="https://www.outdoornativitysets.com/customer/account/create/" 3014 class="inline-flex btn btn-primary"> 3015 Create an Account </a> 3016 </div> 3017 </div> 3018 </div> 3019 </div> 3020 </template> 3021 </div> 3022 </div> 3023</section> 3024</div> 3025 3026
3027<script> 3028 function initProPage() { 3029 return { 3030 visible: false, 3031 initHtml: function(data, elem) { 3032 if(data.company 3033 && data.company.has_customer_company 3034 && data.company.pro_page_link 3035 ) { 3036 const link = elem.querySelector('a'); 3037 if(link) { 3038 link.setAttribute('href', this.prepareLink(data.company.pro_page_link)); 3039 this.visible = true; 3040 } else { 3041 console.debug('company block missing anchor tag') 3042 } 3043 3044 } 3045 }, 3046 prepareLink: function(link) { 3047 return link.charAt(0) !== '/' ? ('/' + link) : link; 3048 } 3049 } 3050 } 3051</script>
3051 3052 3053 3054</header><main id="maincontent" class="page-main"> <nav class="breadcrumbs bg-container-lighter md:block hidden" aria-label="Breadcrumb"> 3055 <div class="container"> 3056 <ol class="items list-reset py-4 rounded flex flex-wrap text-grey text-md"> 3057 <li class="item flex home"> 3058 <a href="https://www.outdoornativitysets.com/" 3059 class="" 3060 title="Go to Home Page" 3061 >Home</a> 3062 </li> 3063 <li class="item flex cms_page"> 3064 <span aria-hidden="true" class="separator text-primary-lighter px-2">/</span> 3065 <span 3066 class="text-primary font-bold" 3067 aria-current="page" 3068 >About Us</span> 3069 </li> 3070 </ol> 3071 </div> 3072 </nav> 3073<div id="contentarea" tabindex="-1"></div> 3074<div class="page messages">
3074<script> 3075 function initMessages() { 3076 "use strict"; 3077 return { 3078 messages: window.mageMessages || [], 3079 isEmpty() { 3080 return this.messages.reduce( 3081 function (isEmpty, message) { 3082 return isEmpty && message === undefined 3083 }, true 3084 ) 3085 }, 3086 hasMessages() { 3087 return !this.isEmpty(); 3088 }, 3089 hasMessage() { 3090 return !!this.message; 3091 }, 3092 removeMessage() { 3093 this.messages[this.index] = undefined; 3094 }, 3095 addMessages(messages, hideAfter) { 3096 messages.map((message) => { 3097 this.messages = this.messages.concat(message); 3098 if (hideAfter === undefined && message.type === 'success' && window.defaultSuccessMessageTimeout) { 3099 hideAfter = window.defaultSuccessMessageTimeout; 3100 } 3101 if (hideAfter) { 3102 this.setHideTimeOut(this.messages.length -1, hideAfter); 3103 } 3104 }); 3105 }, 3106 setHideTimeOut(messageIndex, hideAfter) { 3107 setTimeout((messageIndex) => { 3108 this.messages[messageIndex] = undefined; 3109 }, hideAfter, messageIndex); 3110 }, 3111 eventListeners: { 3112 ['@messages-loaded.window'](event) { 3113 this.addMessages(event.detail.messages, event.detail.hideAfter) 3114 }, 3115 ['@private-content-loaded.window'](event) { 3116 const data = event.detail.data; 3117 if ( 3118 data.messages && 3119 data.messages.messages && 3120 data.messages.messages.length 3121 ) { 3122 this.addMessages(data.messages.messages); 3123 } 3124 }, 3125 ['@clear-messages.window']() { 3126 this.messages = []; 3127 } 3128 }, 3129 getMessageUiId() { 3130 return 'message-' + this.message.type; 3131 } 3132 } 3133 } 3134 3135 window.addEventListener('alpine:init', () => Alpine.data('initMessages', initMessages), {once: true}) 3136</script>
3136 3137<section id="messages" 3138 x-data="initMessages" 3139 x-bind="eventListeners" 3140 aria-live="assertive" 3141 role="alert" 3142> 3143 <template x-if="hasMessages"> 3144 <div class="w-full"> 3145 <div class="messages container mx-auto py-3"> 3146 <template x-for="(message, index) in messages" :key="index"> 3147 <div> 3148 <template x-if="hasMessage"> 3149 <div class="message" 3150 :class="message.type" 3151 :ui-id="getMessageUiId" 3152 > 3153 <span x-html="message.text"></span> 3154 <button 3155 type="button" 3156 class="text-gray-600 hover:text-black" 3157 aria-label="Close message" 3158 @click.prevent="removeMessage" 3159 > 3160 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-current" width="18" height="18" aria-hidden="true"> 3161 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 3162</svg> 3163 </button> 3164 </div> 3165 </template> 3166 </div> 3167 </template> 3168 </div> 3169 </div> 3170 </template> 3171</section> 3172</div><div class="container flex flex-col md:flex-row flex-wrap my-6 font-bold lg:mt-8 text-3xl"> 3173 <h1 class="text-gray-900 page-title title-font" 3174 > 3175 <span class="base" data-ui-id="page-title-wrapper" >About Us</span> </h1> 3176 </div> 3177<div class="columns"><div class="column main">
3177<script> 3178 window.boldFlowConfig = { 3179 shopId: "3e913d263509257ceef6952f2d5307bf", 3180 apiUrl: "https://api.boldcommerce.com/", 3181 meta: { 3182 isEnabled: "1" 3183 }, 3184 continueUrl: "https://www.outdoornativitysets.com/", 3185 checkoutUrl: "https://www.outdoornativitysets.com/checkout/", 3186 contactUsUrl: "https://www.outdoornativitysets.com/contact/", 3187 headerColor: "#FFFFFF", 3188 logoData: {"src":"https:\/\/www.outdoornativitysets.com\/media\/logo\/stores\/7\/outdoor-nativity-sets-logo.png","alt":"OutdoorNativitySets","width":203,"height":60}, 3189 loaderIcon: "https://www.outdoornativitysets.com/static/version1789694905/frontend/Kadro/outdoor_nativity_sets_hyva/en_US/images/loader-2.gif", 3190 }; 3191</script>
3191 3192
3193<script type="text/x-magento-init"> 3194 { 3195 "[href='https://www.outdoornativitysets.com/checkout']": { 3196 "proceedToMetaCheckout":{"checkoutUrl":"https://www.outdoornativitysets.com/checkout/"} 3197 }, "[href='https://www.outdoornativitysets.com/checkout/']": { 3198 "proceedToMetaCheckout":{"checkoutUrl":"https://www.outdoornativitysets.com/checkout/"} 3199 } } 3200</script>
3200 3201<style>#html-body [data-pb-style=M2N2QAE],#html-body [data-pb-style=XA16V03]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=M2N2QAE]{border-style:none;border-width:1px;border-radius:0;margin:0;padding:0}#html-body [data-pb-style=XA16V03]{width:66.6667%;align-self:stretch}#html-body [data-pb-style=KU0OX50],#html-body [data-pb-style=PU3IRHX],#html-body [data-pb-style=XA16V03]{border-style:none;border-width:1px;border-radius:0;margin:0;padding:0}#html-body [data-pb-style=KU0OX50]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:33.3333%;padding:10px;align-self:stretch}#html-body [data-pb-style=P66GQBB],#html-body [data-pb-style=Y2D62RW]{border-style:none;border-width:1px;border-radius:0;margin:0;padding:0}#html-body [data-pb-style=P66GQBB]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;margin:0 0 10px;padding:10px}</style><div data-content-type="row" data-appearance="full-width" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-video-fallback-src="" data-element="main" data-pb-style="M2N2QAE"><div class="row-full-width-inner" data-element="inner"><div class="pagebuilder-column-group" style="display: flex;" data-content-type="column-group" data-grid-size="12" data-element="main"><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="XA16V03"><div data-content-type="text" data-appearance="default" data-element="main" data-pb-style="PU3IRHX"><p>OutdoorNativitySets.com was launched in late 2010. With the challenges of the economy, our parent company Teak Isle Manufacturing, a 30 year supplier to the marine industry, was faced with cutting its workforce during the holidays. The hard fact was that fewer people were buying boats and the holiday months were going to be extremely slow. Toward the end of last year we were brainstorming of ways to increase our business. As we were talking, one of our employees reminded us that we had built some nativity sets in the past and maybe we could do this again during the holiday season.</p> 3202<p>Years ago one of the owners of Teak Isle saw a silhouette nativity set at a Christmas tree stand that was made of plywood and painted white. He was taken by the simplicity of the part and loved the message that it conveyed. He bought the set and proudly displayed it in his yard. Later that year, he decided to work with his designers to build a set that was similar to the one he had purchased, but designed and cut from marine grade plastic to withstand the weather conditions for years to come. Teak Isle built some of these nativities for friends and family members and eventually supplied some to local Christmas tree stands. At the time, this was done more for the satisfaction of seeing the nativities around the neighborhood and the joy of being able to offer such a meaningful keepsake.</p> 3203<p>In October 2010, the decision was made to redesign our nativity sets so that they could be shipped UPS and broken down for easy storage for the rest of the year. We stayed true to the simple, white and non-commercial style and continued to make them from marine grade plastic. Our feeling was that if we offered a high quality AMERICAN MADE product at an affordable price that people would be happy to support us. We were excited by the fact that we were able to keep all of our employees working through the holidays and found peace in the thought of our nativities sitting in neighborhoods all around the country reminding people of the true reason for the season.</p> 3204<p>This year we are excited to introduce a new line of nativity figures to add to your set including angels, wise men, shepherds and a variety of animals. You can purchase a new figure each year or buy a whole set to complete your nativity scene. Also new this year is a larger, six foot tall version of the nativity for churches or homes with larger yards.</p> 3205<p>We are proud to report that, in this struggling economy, we were able to hire additional people to work on our nativities this year. Thank y
3205ou for your business and we wish you all of the peace and joy that comes with the Christmas season.</p> 3206<p> </p> 3207<p>God Bless,</p> 3208<p><strong>OutdoorNativitySets.com</strong> <em>(formerly holynightnativitysets.com)</em></p> 3209<p>450 Maguire Road<br>Ocoee FL 34761<br>855-553-4946</p></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="KU0OX50"><div data-content-type="html" data-appearance="default" data-element="main" data-pb-style="Y2D62RW" data-decoded="true"><div style="width: 100%;"><div class="scalemedia"><iframe src="https://www.youtube.com/embed/L3Hm2FDPs5g?showinfo=0&autoplay=1&mute=1" frameborder="0" allowfullscreen="" style="border: 5px solid #000;"></iframe></div></div></div></div></div></div></div><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-video-fallback-src="" data-element="inner" data-pb-style="P66GQBB"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style> 3210/* Kill the header search bar */ 3211.block-search, 3212#search_mini_form { 3213 display: none !important; 3214} 3215</style> 3216</div></div></div></div></div>
3216<script> 3217 function initFooter () { 3218 return { 3219 cart: {}, 3220 isCartOpen: false, 3221 getData(data) { 3222 if (data.cart) { this.cart = data.cart } 3223 }, 3224 isCartEmpty() { 3225 return !this.cart.summary_count 3226 }, 3227 toggleCart(event) { 3228 if (event.detail && event.detail.isOpen !== undefined) { 3229 this.isCartOpen = event.detail.isOpen 3230 if (!this.isCartOpen && this.$refs && this.$refs.cartButton) { 3231 this.$refs.cartButton.focus() 3232 } 3233 } else { 3234 this.isCartOpen = true 3235 } 3236 } 3237 } 3238 } 3239</script>
3239 3240<div class="sticky-footer fixed bottom-0 left-0 right-0 bg-new-blue md:hidden z-9 flex items-center" 3241 x-data="initFooter()" 3242 @private-content-loaded.window="getData(event.detail.data)" 3243> 3244 <a class="telephone block w-1/3 p-4 float-left text-left pl-8" href="tel://8666337961"> 3245 <span class="text-[0] block">Call</span> 3246 <div class="phone-inner text-white"> 3247 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" width="30" height="30" aria-hidden="true"> 3248 <path d="M2 3a1 1 0 011-1h2.153a1 1 0 01.986.836l.74 4.435a1 1 0 01-.54 1.06l-1.548.773a11.037 11.037 0 006.105 6.105l.774-1.548a1 1 0 011.059-.54l4.435.74a1 1 0 01.836.986V17a1 1 0 01-1 1h-2C7.82 18 2 12.18 2 5V3z"/> 3249</svg> 3250 </div> 3251 </a> 3252 <a class="minicart action showcart block float-left w-1/3 p-4 text-center" 3253 href="https://www.outdoornativitysets.com/checkout/cart/" 3254 x-ref="cartButton" 3255 @click.prevent.stop="() => { 3256 $dispatch('toggle-cart', { isOpen: !isCartOpen }) 3257 }" 3258 @toggle-cart.window="toggleCart($event)" 3259 :aria-expanded="isCartOpen" 3260 aria-haspopup="dialog" 3261 > 3262 <div class="minicart-inner text-white flex justify-center items-center text-2.5xl"> 3263 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" width="32" height="32" aria-hidden="true"> 3264 <path d="M3 1a1 1 0 000 2h1.22l.305 1.222a.997.997 0 00.01.042l1.358 5.43-.893.892C3.74 11.846 4.632 14 6.414 14H15a1 1 0 000-2H6.414l1-1H14a1 1 0 00.894-.553l3-6A1 1 0 0017 3H6.28l-.31-1.243A1 1 0 005 1H3zM16 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM6.5 18a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"/> 3265</svg> 3266 <span class="text hidden">My Cart</span> 3267 <span class="counter qty"> 3268 <span>(</span> 3269 <span class="counter-number" 3270 x-text="isCartEmpty() ? 0 : cart.summary_count" 3271 ></span> 3272 <span>)</span> 3273 </span> 3274 </div> 3275 </a> 3276 <a href="#" class="openZendeskHelpButton help block float-left w-1/3 p-4 text-right pr-8"> 3277 <span class="text-[0] block">Help</span> 3278 <div class="help-inner text-white float-right"> 3279 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" width="36" height="36" aria-hidden="true"> 3280 <path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-3a1 1 0 00-.867.5 1 1 0 11-1.731-1A3 3 0 0113 8a3.001 3.001 0 01-2 2.83V11a1 1 0 11-2 0v-1a1 1 0 011-1 1 1 0 100-2zm0 8a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"/> 3281</svg> 3282 </div> 3283 </a> 3284 3285 3286
3286<script type="text/javascript"> 3287 document.addEventListener('DOMContentLoaded', function() { 3288 // lifts up the regular page footer the height of the sticky footer so all footer content is visible. 3289 var stickyFooterHeight = document.querySelector('.sticky-footer').clientHeight ; 3290 3291 document.querySelector('.page-wrapper').style['margin-bottom'] = stickyFooterHeight + 'px'; 3292 }); 3293 </script>
3293 3294</div> 3295</main><footer class="page-footer"><div class="footer content"> <!-- Block: footer_content --> 3296<style> 3297.page-footer { 3298 padding-bottom: 0 !important; 3299 background: #111; 3300} 3301.page-footer .copyright { background-color: #111; } 3302.page-footer .footer-row a { 3303 color: #fff; 3304} 3305.page-layout-checkout .footer-lite { display: none; } 3306 3307.contactfooter_row { 3308 display: flex; 3309 padding-top: 30px; 3310} 3311.contactfooter_column { 3312 flex: 50%; 3313 padding: 3%; 3314 border-radius: 8px; 3315 min-height: 300px; 3316 margin: 3% 1.5%; 3317} 3318.contactfooter_column h2 { 3319 margin-top: 0; 3320 font-size: 23px; 3321 margin-bottom: 6px !important; 3322} 3323.contactfooter_column p span { 3324 font-size: 13px; 3325} 3326.page-footer .block.newsletter .content p { 3327 color: white; 3328} 3329#Footer_email_signup button#btnsubmit { 3330 background-color: white; 3331 color: #a32c28; 3332 height: 32px; 3333} 3334.page-footer .block.newsletter input[type="email"] { 3335 border: 1px solid #fff; 3336 color: #a32c28; 3337 border-radius: 4px; 3338 background: white; 3339} 3340.page-footer .fa-pinterest, 3341.page-footer .fa-facebook { 3342 color: #fff; 3343} 3344.page-footer { padding-bottom: 0 !important; } 3345.page-footer .footer-links>div { width: 33%; } 3346.footer.content { border-top: 0; padding-top: 0; } 3347.footer.content .h3 { color: #fff; border-bottom: 1px solid #fff; padding-bottom: .5rem; font-weight: 600; line-height: 1.1; font-size: 1.8rem; margin-bottom: 1rem; display: block; } 3348.page-footer .footer.content .social-links { clear: both; } 3349 3350@media (max-width: 768px), print { 3351 .footer.content .h3 { margin-top: 2rem; } 3352 .page-footer .footer-links>div { padding: 0; } 3353} 3354</style> 3355 3356<div class="footer-lite hidden-xs"> 3357<div class="contactfooter_row"> 3358 <div class="contactfooter_column" style="background-color:#fff;"> 3359 <h2>Send us a Message</h2> 3360 <p>After hours or prefer to schedule a call? No problem. 3361Send us a message and we’ll jump right on it.</p> 3362<iframe class="contactForm" src="" data-srcuri="https://contact.outdoornativitysets.com/?FormKey=ons&type=zdonly" title="OutdoorNativitySets Contact Form" width="100%" height="420px" frameborder="0"></iframe> 3363 </div> 3364 <div class="contactfooter_column" style="background-color: #999; background-image: url('https://www.outdoornativitysets.com/media//wysiwyg/outdoor-nativity-sets/page-content/contact/footer_contact_bg_ons.jpg'); background-position: center center;background-size: cover;background-blend-mode: multiply;"> 3365 <h2 style="color: white;">How can we help?</h2> 3366 <p style="color: white;line-height: 24px;">Let us help bring your family the peace and joy that comes with the Christmas season.<br> 3367<a style="font-size: 17px;color: white;margin-top: 15px;font-weight: bold;display: block;" href="tel:+1-855-553-4946">(855)-553-4946</a> 3368<span><a href="https://www.outdoornativitysets.com/contact-us" target="_blank" rel="noopener"> 3369 <u>See our holiday hours</u> 3370</a> 3371</span></p> 3372 </div> 3373</div> 3374</div> 3375 3376<div class="footer-lite"> 3377 3378</div> 3379<div class="footer-links footer-lite"> 3380 <div id="footer-row-1" class="footer-row"> 3381<div class="h3">Account</div> 3382<div class="col-sm-12 col-xs-6 no-pad"><a href="/customer/account/create">REGISTER</a></div> 3383<div class="col-sm-12 col-xs-6 no-pad"><a href="/customer/account/login">LOGIN</a></div> 3384<div class="col-sm-12 col-xs-6 no-pad"><a href="/sales/order/history">ORDER HISTORY</a></div> 3385</div><div id="footer-row-2" class="footer-row"> 3386<div class="h3">Company</div> 3387<div class="col-sm-12 col-xs-6 no-pad"><a href="/about-us">ABOUT US</a></div> 3388<div class="col-sm-12 col-xs-6 no-pad"><a href="/testimonials">TESTIMONIALS</a></div> 3389<div class="col-sm-12 col-xs-6 no-pad"><a href="/contact-us">CONTACT US</a></div> 3390<div class="col-sm-12 col-xs-6 no-pad"><a id="accessibilityWidget" tabindex="0" onclick="javascript:void(0);" style="cursor:pointer;">ACCESSIBILITY MENU</a></div> 3391<div class="col-sm-12 col-xs-6 no-pad"><a href="#" onclick="Osano.cm.showDrawer('osano-cm-dom-info-dialog-open')">COOKIE PREFERENCES</a></div> 3392</div><div id="footer-row-3" class="footer-row"> 3393<div class="h3">Services</div> 3394<div class="col-sm-12 col-xs-6 no-pad"><a href="/shipping-policy">SHIPPING POLICY</a></div> 3395<div class="col-sm-12 col-xs-6 no-pad"><a href="/return-policy">RETURN POLICY</a></div> 3396<div class="col-sm-12 col-xs-6 no-pad"><a href="/privacy-policy">PRIVACY POLICY</a></div> 3397<div class="col-sm-12 col-xs-6 no-pad"><a href="/terms-of-use">TERMS OF USE</a></div> 3398</div> 3399</div> 3400<style> 3401#utility-navigation .social-links { display: none; } 3402.footer.content .free-shipping-nav { display: none; } 3403.page-footer .social-links { text-align: center; } 3404.page-footer .social-links .top-social { display: inline-block; margin: 0 10px; } 3405</style> 3406<div class="free-shipping-nav"> 3407 <div class="hidden-sm" style="font-weight: normal; padding: 0px 15px 0px 5px; line-height: 42px;"><I class="fa fa-truck" style="color:#333;"></I> <a href="/shipping-policy">Free Shipping</a> on orders over $150!</div> 3408 <div class="visible-sm" style="font-weight: normal; padding: 0px 5px 0px 2px; font-size: 10px; line-height: 42px;"><I class="fa fa-truck" style="color:#333;"></I> <a href="/shipping-policy">Free Shipping</a> on orders over $150!</div> 3409</div> 3410 3411<div class="social-links"> 3412<div class="social-nav"> 3413 3414 3415 <div class="f-right top-social"><a href="https://www.facebook.com/OutdoorNativitySets" target="_blank"><span class="fa fa-facebook"> </span></a></div> 3416 3417 <div class="f-right top-social"><a href="https://www.pinterest.com/OutdoorNativity" target="_blank"><span class="fa fa-pinterest"> </span></a></div> 3418 3419 3420</div> 3421</div> 3422 3423<div style="display: block; clear: both; padding-top: 2rem;"> 3424<div style="text-align: center; color:white;">Display the <i>True Meaning of Christmas</i></div> 3425<div style="text-align: center;"><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/icons/made-in-the-usa-icon-white.png" alt="Made in the USA" style="max-width: 220px; margin-bottom: 25px; display:inline-block;" loading="lazy"/></div> 3426</div> <small class="copyright text-sm text-gray-800 sm:ml-6 sm:mt-0 mt-4"> 3427 <span>Copyright © 2026 OutdoorNativitySets. All rights reserved.</span> 3428</small> 3429</div></footer> 3430
3430<script async type="text/javascript" src="https://dguqe.outdoornativitysets.com/load"></script>
3430 3431
3431<script> 3432 /** 3433 * ********** 3434 * ********** 3435 * Always duplicate edits made in app/code/Kadro/BlotoutEdgetag/view/frontend/web/js/ 3436 * with the applicable files in app/design/frontend/Kadro/boat_outfitters_hyva/Kadro_BlotoutEdgetag/templates 3437 * (The Boat Outfitters Hyva theme files are there) 3438 * ********** 3439 * ********** 3440 */ 3441 3442 const edgeUrl = "https://dguqe.outdoornativitysets.com"; 3443 const checkoutUrl = "https://www.outdoornativitysets.com/checkout"; 3444 const truIdCookieUrl = "https://www.outdoornativitysets.com/blotoutedgetag/index/cookie"; 3445 const footerEmailButton = document.querySelector('form#Footer_email_signup button#btnsubmit'); 3446 let cart = null; 3447 3448 /** 3449 * sends a POST request to the server, which sets the tru id cookie 3450 */ 3451 function requestTruIdCookie() { 3452 fetch( 3453 truIdCookieUrl, 3454 { 3455 method: 'POST', 3456 headers: { 3457 'X-Requested-With': 'XMLHttpRequest', 3458 } 3459 } 3460 ).then(response => { 3461 if (!response.ok) { 3462 console.error("[Blotout] An error occurred when setting truid cookie."); 3463 } 3464 }).catch(err => console.error('[Blotout] TruID cookie request failed:', err)); 3465 } 3466 3467 /** 3468 * set up a handler on click of the footer newsletter email form 3469 */ 3470 function initFooterEmail() { 3471 if (!footerEmailButton) { 3472 return; 3473 } 3474 3475 footerEmailButton.addEventListener('click', function() { 3476 const userEmailInput = document.querySelector('form#Footer_email_signup input#Footer_id_email'); 3477 const userEmail = userEmailInput ? userEmailInput.value : ''; 3478 if (userEmail !== '') { 3479 edgetag('user', 'email', userEmail); 3480 } 3481 }); 3482 } 3483 3484 /** 3485 * set up a handler to listen for when the Klaviyo HTTP request is made 3486 */ 3487 function initKlaviyoEmail() { 3488 const originalOpen = XMLHttpRequest.prototype.open; 3489 const originalSend = XMLHttpRequest.prototype.send; 3490 3491 XMLHttpRequest.prototype.open = function(method, url, async, user, password) { 3492 this._method = method; 3493 this._url = url; 3494 return originalOpen.call(this, method, url, async, user, password); 3495 }; 3496 3497 XMLHttpRequest.prototype.send = function(body) { 3498 const url = this._url || ''; 3499 console.log(`[Blotout] [KlaviyoHook] XMLHttpRequest sent to URL: ${url}`); 3500 // Only continue if this is a Klaviyo Subscriptions request 3501 if (this._method === 'POST' && url.includes('klaviyo.com/client/subscriptions/')) { 3502 console.log(`[Blotout] [KlaviyoHook] This is a Klaviyo request`); 3503 if (typeof body === 'string') { 3504 console.log(`[Blotout] [KlaviyoHook] Format is approved`); 3505 try { 3506 const json = JSON.parse(body); 3507 const email = json?.data?.attributes?.profile?.data?.attributes?.email; 3508 console.log(`[Blotout] [KlaviyoHook] email: ${email}`); 3509 if (email && !klaviyoEdgetagEmailSent) { 3510 edgetag('user', 'email', email); 3511 edgetag('tag', 'Lead'); 3512 klaviyoEdgetagEmailSent = true; 3513 console.log(`[Blotout] [KlaviyoHook] tagged email: ${email}`); 3514 } 3515 } catch (err) { 3516 console.warn('[Blotout] [KlaviyoHook] couldn\'t parse body, skipping tag', err); 3517 } 3518 } 3519 } 3520 3521 try { 3522 return originalSend.call(this, body); 3523 } catch (err) { 3524 console.error('[Blotout] [KlaviyoHook] Error sending data to blotout:', err); 3525 } 3526 }; 3527 } 3528 3529 let klaviyoEdgetagEmailSent = false;
3530 3531 function escapeCategoryString(category) { 3532 return category.trim().replace(/[^a-zA-Z0-9 ]/g, ''); 3533 } 3534 3535 function buildProductCategoryData() { 3536 // Fire ViewContent tag to send product info to Edgetag 3537 const productCategoryArray = document.querySelectorAll('nav.breadcrumbs ol.items li'); 3538 let transformedProductCategoryArray = []; 3539 for (let i = 1; i < productCategoryArray.length; i++) { 3540 transformedProductCategoryArray.push(escapeCategoryString(productCategoryArray[i].innerText)); 3541 } 3542 return transformedProductCategoryArray.join(', '); 3543 } 3544 3545 /** 3546 * fires edge tag containing product data 3547 * @param oldCart 3548 * @param newCart 3549 */ 3550 function addToCartEdgeTag(newCart, oldCart) { 3551 // find the item that changed or appeared 3552 const newItem = newCart.items.filter(item => !oldCart.items.includes(item))[0]; 3553 if (!newItem) return; 3554 3555 // locate that item in the old cart 3556 let oldItem = oldCart.items.find(item => item.item_id === newItem.item_id); 3557 // subtract the qtys, should they exist, to get the qty added 3558 let qtyAdded = newItem.qty - (oldItem?.qty || 0); 3559 3560 if (qtyAdded > 0) { 3561 // no other way to grab category info, so getting from breadcrumbs 3562 const product_category = buildProductCategoryData(); 3563 3564 // trigger edgetag using item data 3565 edgetag('tag', 'AddToCart', { 3566 currency: 'USD', 3567 value: newItem.product_price_value * qtyAdded, 3568 contents: [{ 3569 id: newItem.parent_product_sku, 3570 variantId: newItem.product_type === 'configurable' ? newItem.product_sku : '', 3571 quantity: qtyAdded, 3572 item_price: newItem.product_price_value, 3573 title: newItem.product_name.replace(/"/g, '"'), 3574 category: product_category, 3575 url: newItem.product_url, 3576 image: newItem.product_image.src 3577 }], 3578 checkoutUrl: checkoutUrl 3579 }); 3580 } 3581 } 3582 3583 /** 3584 * sets up a handler for on click of add to cart. Compares cart state before and after and fires based on the diff 3585 */ 3586 function cartChangeCheck(event) { 3587 const oldCart = event.detail.data.oldCart; 3588 const newCart = event.detail.data.privateData.cart; 3589 3590 if (newCart && (!oldCart.items || oldCart.summary_count !== newCart.summary_count)) { 3591 addToCartEdgeTag(newCart, oldCart); 3592 } 3593 } 3594 3595 /** 3596 * prepares a listener for the Attentive marketing popup, and captures info from it 3597 */ 3598 function initAttentivePopup() { 3599 window.addEventListener('message', event => { 3600 if (event.origin !== 'https://creatives.attn.tv' || !event.data?.__attentive) return; 3601 try { 3602 const data = event.data.__attentive; 3603 if (!data.action?.includes('LEAD')) return; 3604 3605 const user = {}; 3606 if (data.email) user.email = data.email; 3607 3608 let user_telephone = data.phone || ''; 3609 // Properly format the number (if it's not already): 3610 // -- proper E.164 format (e.g. 7045551212), plus a prepended "+1" (assumes US telephone numbers) -- 3611 if (!/^\+1\d{10}$/.test(user_telephone)) { 3612 user_telephone = '+1' + user_telephone.replace(/[^0-9]/g, ''); 3613 } 3614 if (user_telephone) user.phone = user_telephone; 3615 3616 if (user.email || user.phone) { 3617 edgetag('data', user); 3618 edgetag('tag', 'Lead'); 3619 } 3620 } catch (e) { 3621 console.error('[Edgetag]', e); 3622 } 3623 }, { once: true }); 3624 } 3625 3626 function initializeBlotout() { 3627 edgetag('tag', 'PageView'); 3628 initFooterEmail(); 3629 initAttentivePopup();
3630 // Do not initiate Klaviyo in checkout, but DO allow it in the cart 3631 if (!window.location.pathname.includes('/checkout/') || window.location.pathname.includes('/checkout/cart')) { 3632 initKlaviyoEmail(); 3633 } 3634 window.dispatchEvent(new CustomEvent('blotout-initialized')); 3635 } 3636 3637 // initialize before document ready 3638 window.edgetag = window.edgetag || function() {(edgetag.stubs = edgetag.stubs || []).push(arguments)}; 3639 edgetag('init', { 3640 edgeURL: edgeUrl, 3641 disableConsentCheck: true 3642 }); 3643 3644 // POST to magento to set up cookie 3645 requestTruIdCookie(); 3646 3647 window.addEventListener('cart-change', cartChangeCheck); 3648 hyva.alpineInitialized(initializeBlotout); 3649 </script>
3649 3650<span style="display:none;"> 3651 <span id="klevu_sessionId"></span> 3652 <span id="klevu_loginCustomerGroup"></span> 3653 <span id="klevu_loginCustomerEmail"></span> 3654 <span id="klevu_shopperIP"></span> 3655</span> 3656
3657<script type="text/javascript"> 3658 3659 var updateKlevuSessionDataElementsFromLocalStorage = function() { 3660 var klevuLocalStorage = JSON.parse(window.localStorage.getItem( 3661 'klv_mage' 3662 ) || '{}'); 3663 var klevuMagentoCustomerDataKey = 'customerData'; 3664 var klevuLocalStorageCustomerData = klevuLocalStorage.hasOwnProperty(klevuMagentoCustomerDataKey) 3665 ? klevuLocalStorage[klevuMagentoCustomerDataKey] 3666 : {}; 3667 document.getElementById('klevu_sessionId').innerText = klevuLocalStorageCustomerData.hasOwnProperty('session_id') 3668 ? klevuLocalStorageCustomerData.session_id 3669 : ''; 3670 document.getElementById('klevu_loginCustomerGroup').innerText = klevuLocalStorageCustomerData.hasOwnProperty('customer_group_id') 3671 ? klevuLocalStorageCustomerData.customer_group_id 3672 : ''; 3673 document.getElementById('klevu_loginCustomerEmail').innerText = klevuLocalStorageCustomerData.hasOwnProperty('id_code') 3674 ? klevuLocalStorageCustomerData.id_code 3675 : ''; 3676 document.getElementById('klevu_shopperIP').innerText = klevuLocalStorageCustomerData.hasOwnProperty('shopper_ip') 3677 ? klevuLocalStorageCustomerData.shopper_ip 3678 : ''; 3679 }; 3680 updateKlevuSessionDataElementsFromLocalStorage(); 3681 3682 document.addEventListener( 3683 'klevu.customerData.loaded', 3684 updateKlevuSessionDataElementsFromLocalStorage 3685 ); 3686 </script>
3686<div style="display: none;" id="attentiveMagentoPage"></div>
3687<script type="text/javascript"> 3688 document.addEventListener("DOMContentLoaded", function () { 3689 'use strict'; 3690 3691 let categoryHoverImageUrl = "https://www.outdoornativitysets.com/categoryhoverimage/image/image/"; 3692 3693 const klevuQuickSearchBlockSelector = '#maincontent .klevuQuickSearchingArea .klevuProduct:not([hover-events-added])'; 3694 const magentoProductBlockSelector = '#maincontent .product-items .product-item:not([hover-events-added])'; 3695 const klevuProductBlockSelector = '#maincontent .kuResultsListing .klevuProduct .klevuImgWrap:not([hover-events-added])'; 3696 3697 async function createHoverImage(productId, originalImage) { 3698 const response = await fetch(categoryHoverImageUrl + '?' + new URLSearchParams({ 3699 product_id: productId 3700 })); 3701 3702 if (response.ok) { 3703 const responseData = await response.json(); 3704 if (responseData.success) { 3705 const hoverImage = document.createElement('img'); 3706 hoverImage.classList.add('hover-image'); 3707 hoverImage.style.opacity = 0; 3708 hoverImage.style.transition = 'opacity 0.5s'; 3709 hoverImage.src = responseData.image_src; 3710 3711 originalImage.insertAdjacentElement('afterend', hoverImage); 3712 3713 showHoverImage(hoverImage); 3714 return; 3715 } 3716 } 3717 3718 originalImage.setAttribute("no-category-hover", true); 3719 } 3720 3721 function showHoverImage(hoverImage) { 3722 if (hoverImage) { 3723 hoverImage.style.opacity = 1; 3724 } 3725 } 3726 function hideHoverImage(hoverImage) { 3727 if (hoverImage) { 3728 hoverImage.style.opacity = 0; 3729 } 3730 } 3731 3732 function initMouseEvents() { 3733 // handlers for quicksearch area 3734 document.querySelectorAll(klevuQuickSearchBlockSelector).forEach(item => { 3735 item.setAttribute('hover-events-added', true); 3736 3737 item.addEventListener('mouseenter', function (e) { 3738 const originalImage = e.target.querySelector('.klevuQuickImgWrap img'); 3739 const hoverImage = e.target.querySelector('img.hover-image'); 3740 if (!originalImage.getAttribute('no-category-hover')) { 3741 if (!hoverImage) { 3742 const productIds = e.target.querySelector('a').getAttribute("data-id").split("-"); 3743 createHoverImage(productIds[0], originalImage); 3744 } else { 3745 showHoverImage(hoverImage); 3746 } 3747 } 3748 }); 3749 3750 item.addEventListener('mouseleave', function (e) { 3751 let hoverImage = e.target.querySelector('img.hover-image'); 3752 const that = this; 3753 if (!hoverImage) { 3754 setTimeout(function () { 3755 hoverImage = that.querySelector('img.hover-image'); 3756 hideHoverImage(hoverImage); 3757 }, 1000); 3758 } else { 3759 hideHoverImage(hoverImage); 3760 } 3761 }); 3762 }); 3763 3764 3765 // handlers for product sliders area 3766 document.querySelectorAll(magentoProductBlockSelector).forEach(item => { 3767 item.setAttribute('hover-events-added', true); 3768 3769 item.addEventListener('mouseenter', function (e) { 3770 const originalImage = e.target.querySelector('img.product-image-photo'); 3771 const hoverImage = e.target.querySelector('img.hover-image'); 3772 if (!originalImage.getAttribute('no-category-hover')) { 3773 if (!hoverImage && !originalImage.getAttribute('no-category-hover')) { 3774 const productIdInput = e.target.querySelector('input[name="product"]'); 3775 if (productIdInput && productIdInput.value) { 3776 createHoverImage(productIdInput.value, originalImage); 3777 } else { 3778 originalImage.setAttribute("no-category-hover", true); 3779 } 3780 } else { 3781 showHoverImage(hoverImage); 3782 } 3783 } 3784 }); 3785 3786 item.addEventListener('mouseleave', function (e) { 3787 let hoverImage = e.target.querySelector('img.hover-image'); 3788 const that = this 3789 if (!hoverImage) { 3790 setTimeout(function () { 3791 hoverImage = that.querySelector('img.hover-image'); 3792 hideHoverImage(hoverImage); 3793 }, 1000); 3794 } else { 3795 hideHoverImage(hoverImage); 3796 } 3797 }); 3798 }); 3799 3800 3801 // handler for klevu products grid area 3802 document.querySelectorAll(klevuProductBlockSelector).forEach(item => { 3803 item.setAttribute('hover-events-added', true); 3804 3805 item.addEventListener('mouseenter', function (e) { 3806 const originalImage = e.target.querySelector('img.kuProdImg'); 3807 const hoverImage = e.target.querySelector('img.hover-image'); 3808 if (!originalImage.getAttribute('no-category-hover')) { 3809 if (!hoverImage && !originalImage.getAttribute('no-category-hover')) { 3810 const productIds = e.target.querySelector('.klevuProductClick').getAttribute("data-id").split("-"); 3811 createHoverImage(productIds[0], originalImage); 3812 } else { 3813 showHoverImage(hoverImage); 3814 } 3815 } 3816 }); 3817 3818 item.addEventListener('mouseleave', function (e) { 3819 let hoverImage = e.target.querySelector('img.hover-image'); 3820 const that = this; 3821 if (!hoverImage) { 3822 setTimeout(function () { 3823 hoverImage = that.querySelector('img.hover-image'); 3824 hideHoverImage(hoverImage); 3825 }, 1000); 3826 } else { 3827 hideHoverImage(hoverImage); 3828 } 3829 }); 3830 }); 3831 } 3832 3833 document.addEventListener("klevuLoaded", function () { 3834 initMouseEvents(); 3835 }); 3836 }); 3837</script>
3837 3838 3839
3840<script type="text/javascript"> 3841 var klevu_cmsSearchEnabled = false; 3842</script>
3842 3843 3844
3845<script> 3846 (() => { 3847 function src_default(Alpine) { 3848 Alpine.directive("intersect", Alpine.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { 3849 let evaluate = evaluateLater(expression); 3850 let options = { 3851 rootMargin: getRootMargin(modifiers), 3852 threshold: getThreshold(modifiers) 3853 }; 3854 let observer = new IntersectionObserver((entries) => { 3855 entries.forEach((entry) => { 3856 if (entry.isIntersecting === (value === "leave")) 3857 return; 3858 evaluate(); 3859 modifiers.includes("once") && observer.disconnect(); 3860 }); 3861 }, options); 3862 observer.observe(el); 3863 cleanup(() => { 3864 observer.disconnect(); 3865 }); 3866 })); 3867 } 3868 function getThreshold(modifiers) { 3869 if (modifiers.includes("full")) 3870 return 0.99; 3871 if (modifiers.includes("half")) 3872 return 0.5; 3873 if (!modifiers.includes("threshold")) 3874 return 0; 3875 let threshold = modifiers[modifiers.indexOf("threshold") + 1]; 3876 if (threshold === "100") 3877 return 1; 3878 if (threshold === "0") 3879 return 0; 3880 return Number(`.${threshold}`); 3881 } 3882 function getLengthValue(rawValue) { 3883 let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/); 3884 return match ? match[1] + (match[2] || "px") : void 0; 3885 } 3886 function getRootMargin(modifiers) { 3887 const key = "margin"; 3888 const fallback = "0px 0px 0px 0px"; 3889 const index = modifiers.indexOf(key); 3890 if (index === -1) 3891 return fallback; 3892 let values = []; 3893 for (let i = 1; i < 5; i++) { 3894 values.push(getLengthValue(modifiers[index + i] || "")); 3895 } 3896 values = values.filter((v) => v !== void 0); 3897 return values.length ? values.join(" ").trim() : fallback; 3898 } 3899 3900 document.addEventListener("alpine:init", () => { 3901 window.Alpine.plugin(src_default); 3902 }); 3903 })(); 3904</script>
vendor: 1 bytes, line 3904
3904
3905<script> 3906 for (const [selector, deferUntil] of Object.entries({".product-slider section[x-data]":"intersect",".product-info [x-data]":"intersect","#filters-content [x-data]":"intersect","#review_form":"intersect","section[x-data^=initRecentlyViewedProductsComponent]":"intersect","div[x-data^=initBundleOptions]":"intersect","#product_addtocart_form [x-data]":"intersect","#notice-cookie-block":"idle"})) { 3907 document.querySelectorAll(selector).forEach(el => el.setAttribute('x-defer', `${deferUntil}`)); 3908 } 3909</script>
vendor: 1 bytes, line 3909
3909
3910<script> 3911 (function () { 3912 "use strict"; 3913 3914 const hasAlpine = new Promise(resolve => { 3915 window.addEventListener('alpine:initialized', resolve, {once: true, passive: true}); 3916 }); 3917 3918 const hasInteract = new Promise(resolve => { 3919 (events => { 3920 const onInteract = () => { 3921 resolve(); 3922 events.forEach(type => window.removeEventListener(type, onInteract)); 3923 } 3924 events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true})) 3925 })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) 3926 }); 3927 3928 const onIntersect = (el) => { 3929 return new Promise(resolve => { 3930 const observer = new IntersectionObserver(entries => { 3931 for (const entry of entries) { 3932 if (entry.isIntersecting) { 3933 observer.disconnect() 3934 resolve(); 3935 } 3936 } 3937 }, {}); 3938 observer.observe(el); 3939 }); 3940 } 3941 3942 function runComponent(el) { 3943 hasAlpine.then(() => { 3944 el.removeAttribute('x-ignore'); 3945 queueMicrotask(() => Alpine.initTree(el)); 3946 }); 3947 } 3948 3949 function initDeferredComponents() { 3950 document.querySelectorAll('[x-data][x-defer]').forEach(el => { 3951 el.setAttribute('x-ignore', ''); 3952 const deferUntil = (el.getAttribute('x-defer') || '').trim(); 3953 switch (deferUntil) { 3954 case 'interact': 3955 hasInteract.then(() => runComponent(el)); 3956 break; 3957 case 'intersect': 3958 onIntersect(el).then(() => runComponent(el)) 3959 break; 3960 case 'idle': 3961 window.requestIdleCallback 3962 ? window.requestIdleCallback(() => runComponent(el), {timeout: 4000}) 3963 : setTimeout(() => runComponent(el), 4000); 3964 break; 3965 case 'eager': 3966 runComponent(el); 3967 break; 3968 default: 3969 if (deferUntil.startsWith('event:') && deferUntil.length > 6) { 3970 window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true}); 3971 } 3972 } 3973 }); 3974 } 3975 3976 window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true}); 3977 })() 3978</script>
3978 3979
3980<script type="module" 3981 src="https://www.outdoornativitysets.com/static/version1789694905/frontend/Kadro/outdoor_nativity_sets_hyva/en_US/Hyva_Theme/js/alpine3.min.js" 3982 defer 3983 crossorigin 3984></script>
vendor: 1 bytes, line 3984
3984
3985<script> 3986 'use strict'; 3987 function dispatchMessages(messages, hideAfter) { 3988 const messagesEvent = new CustomEvent("messages-loaded", { 3989 detail: { 3990 messages: messages, 3991 hideAfter: hideAfter 3992 } 3993 }); 3994 window.dispatchEvent(messagesEvent); 3995 } 3996 3997 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 3998 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 3999 } 4000 4001 (function( hyva, undefined ) { 4002 4003 hyva.initFormKey = () => { 4004 const inputSelector = 'input[name="form_key"]', 4005 formKey = hyva.getFormKey(); 4006 4007 Array.from(document.querySelectorAll(inputSelector)).map(function (input) { 4008 input.value = formKey 4009 }); 4010 } 4011 4012 hyva.initMessages = () => { 4013 try { 4014 const messages = hyva.getCookie('mage-messages'); 4015 window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; 4016 4017 dispatchMessages(window.mageMessages); 4018 4019 // empty `mage-messages` cookie 4020 const skipSetDomain = true; 4021 hyva.setCookie('mage-messages','', -1, skipSetDomain); 4022 4023 } catch (error) { 4024 console.warn('Error parsing Cookie Messages:', error); 4025 } 4026 } 4027 4028 window.addEventListener('DOMContentLoaded', hyva.initFormKey); 4029 hyva.alpineInitialized(hyva.initMessages) 4030 4031 }( window.hyva = window.hyva || {} )); 4032</script>
vendor: 1 bytes, line 4032
4032
4033<script> 4034 'use strict'; 4035 { 4036 const private_content_key = 'mage-cache-storage'; 4037 const private_content_expire_key = 'mage-cache-timeout'; 4038 const private_content_version_key = 'private_content_version'; 4039 const section_data_ids_key = 'section_data_ids'; 4040 const mage_cache_session_id_key = 'mage-cache-sessid'; 4041 const last_visited_store_key = 'last_visited_store'; 4042 4043 const ttl = 3600; 4044 4045 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 4046 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 4047 } 4048 4049 function loadSectionData () { 4050 const browserStorage = hyva.getBrowserStorage(); 4051 if (!browserStorage) { 4052 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 4053 [{ 4054 type: "warning", 4055 text: "Please enable LocalStorage in your browser." 4056 }] 4057 ); 4058 return; 4059 } 4060 try { 4061 let isInvalid = false; 4062 4063 if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) { 4064 isInvalid = true; 4065 } 4066 hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false); 4067 4068 if (!hyva.getCookie(mage_cache_session_id_key)) { 4069 isInvalid = true; 4070 browserStorage.removeItem(private_content_key); 4071 const skipSetDomain = true; 4072 const days = false; 4073 hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain) 4074 } 4075 4076 const cookieVersion = hyva.getCookie(private_content_version_key); 4077 const storageVersion = browserStorage.getItem(private_content_version_key); 4078 4079 if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) { 4080 isInvalid = true; 4081 } 4082 4083 const privateContentExpires = browserStorage.getItem(private_content_expire_key); 4084 if (privateContentExpires && new Date(privateContentExpires) < new Date()) { 4085 browserStorage.removeItem(private_content_key); 4086 } 4087 4088 if (isInvalid && cookieVersion) { 4089 fetchPrivateContent([]); 4090 } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) { 4091 const privateContent = JSON.parse(browserStorage.getItem(private_content_key)); 4092 if ( 4093 privateContent && 4094 privateContentExpires && 4095 privateContent.cart && 4096 privateContent.customer 4097 ) { 4098 dispatchPrivateContent(privateContent); 4099 } else { 4100 fetchPrivateContent([]); 4101 } 4102 } else { 4103 if (document.getElementById('default-section-data')) { 4104 const privateContent = JSON.parse(document.getElementById('default-section-data').innerText.trim()); 4105 dispatchPrivateContent(privateContent); 4106 } else { 4107 dispatchPrivateContent({}); 4108 } 4109 } 4110 4111 } catch (error) { 4112 console.warn('Error retrieving Private Content:', error); 4113 } 4114 } 4115 4116 hyva.alpineInitialized(loadSectionData) 4117 window.addEventListener('reload-customer-section-data', loadSectionData); 4118 4119 window.processSectionDataBeforeDispatch = window.processSectionDataBeforeDispatch || (data => data); 4120 4121 function dispatchPrivateContent(data) { 4122 4123 const privateContentEvent = new CustomEvent("private-content-loaded", { 4124 detail: { 4125 data: window.processSectionDataBeforeDispatch(data) 4126 } 4127 }); 4128 window.dispatchEvent(privateContentEvent); 4129 } 4130 4131 function fetchPrivateContent(sections) { 4132 fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, { 4133 method: 'GET', 4134 headers: { 4135 'Content-Type': 'application/json', 4136 'X-Requested-With': 'XMLHttpRequest' 4137 } 4138 }) 4139 .then(response => response.ok && response.json()) 4140 .then( 4141 data => { 4142 if (data) { 4143 try { 4144 const browserStorage = hyva.getBrowserStorage(); 4145 4146 // merge new data preserving non-invalidated sections 4147 const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {}; 4148 4149 if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) { 4150 delete oldSectionData['checkout-data']; 4151 } 4152 const newSectionData = Object.assign(oldSectionData, data); 4153 4154 dispatchPrivateContent(newSectionData); 4155 4156 // don't persist messages, they've been dispatched already 4157 if (newSectionData.messages && newSectionData.messages.messages ) { 4158 newSectionData.messages.messages = []; 4159 } 4160 4161 browserStorage.setItem(private_content_key, JSON.stringify(newSectionData)); 4162 4163 const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString(); 4164 browserStorage.setItem(private_content_expire_key, expiresAt); 4165 4166 const newCookieVersion = hyva.getCookie(private_content_version_key); 4167 browserStorage.setItem(private_content_version_key, newCookieVersion); 4168 4169 // We don't need the section_data_ids in Hyvä, but we store them for compatibility 4170 // with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout 4171 hyva.setCookie( 4172 section_data_ids_key, 4173 JSON.stringify( 4174 Object.keys(data).reduce((sectionDataIds, sectionKey) => { 4175 sectionDataIds[sectionKey] = data[sectionKey]['data_id']; 4176 return sectionDataIds; 4177 }, {}) 4178 ), 4179 false, 4180 true 4181 ); 4182 } catch (error) { 4183 console.warn("Couldn't store privateContent", error); 4184 } 4185 } 4186 } 4187 ); 4188 } 4189 } 4190</script>
vendor: 1 bytes, line 4190
4190
4191<script> 4192 (() => { 4193 document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc())); 4194 })() 4195</script>
vendor: 1 bytes, line 4195
4195
4196<script> 4197 (events => { 4198 const dispatchUserInteractionEvent = () => { 4199 events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent)) 4200 window.dispatchEvent(new Event('init-external-scripts')) 4201 }; 4202 events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true})) 4203 })(['touchstart', 'mousemove', 'wheel', 'scroll', 'keydown']) 4204</script>
4204 4205<!-- Account type: 'Google Tag Manager' is not supported -->
4206<script> 4207 function initConfigurableOptions(productId, optionConfig, cascadingOptions = false) { 4208 4209 function findPathParam(key) { 4210 const baseUrl = (BASE_URL.substring(0, 2) === '//' ? 'http:' : '') + BASE_URL; 4211 const baseUrlParts = (new URL(baseUrl)).pathname.replace(/\/$/, '').split('/'); 4212 const pathParts = window.location.pathname.split('/').slice(baseUrlParts.length + 3); 4213 for (let i = 0; i < pathParts.length; i += 2) { 4214 if (pathParts[i] === key && pathParts.length > i) { 4215 return pathParts[i + 1]; 4216 } 4217 } 4218 } 4219 4220 return { 4221 optionConfig, 4222 productId, 4223 cascadingOptions, 4224 itemId: (new URLSearchParams(window.location.search)).get('id') || findPathParam('id'), 4225 allowedAttributeOptions: [], 4226 selectedValues: [], 4227 init() { 4228 this.findAllowedAttributeOptions(); 4229 this.$nextTick(() => { 4230 if (typeof this.optionConfig.defaultValues === 'object') { 4231 for (const [attributeId, value] of Object.entries(this.optionConfig.defaultValues)) { 4232 this.changeOption(attributeId, value + ''); 4233 } 4234 } 4235 }); 4236 4237 // Set up child settings if cascading options 4238 if (this.cascadingOptions) { 4239 this.setChildSettings(); 4240 } 4241 4242 // When pivot options are updated, trigger event to be listened to 4243 this.$watch('allowedAttributeOptions', value => this.optionsUpdated()); 4244 }, 4245 optionsUpdated() { 4246 window.dispatchEvent( 4247 new CustomEvent( 4248 'configurableUpdated', 4249 { 4250 detail: '' 4251 } 4252 ) 4253 ); 4254 }, 4255 /** 4256 * Set each option's child settings, and next/prev option setting. Fill (initialize) 4257 * an option's list of selections as needed or disable an option's setting. 4258 * @private 4259 */ 4260 setChildSettings: function () { 4261 const allAttributes = this.optionConfig.attributes; 4262 const allAttributesSorted = Object.values(allAttributes).sort((a,b)=>{ 4263 return a.position - b.position 4264 } 4265 ); 4266 4267 let childSettings = [], 4268 settings = allAttributesSorted, 4269 index = settings.length, 4270 option; 4271 4272 while (index--) { 4273 option = settings[index]; 4274 4275 if (index) { 4276 option.disabled = true; 4277 } else { 4278 option.disabled = false; 4279 } 4280 4281 option.childSettings = childSettings.slice(); 4282 option.prevSetting = settings[index - 1]; 4283 option.nextSetting = settings[index + 1]; 4284 4285 childSettings.push(option); 4286 } 4287 }, 4288 /** 4289 * For a given option element, reset all of its selectable options. Clear any selected 4290 * index, disable the option choice, and reset the option's state if necessary. 4291 * @private 4292 * @param {*} element - The element associated with a configurable option. 4293 */ 4294 resetChildren: function (element) { 4295 if (element.childSettings) { 4296 let self = this; 4297 4298 element.childSettings.forEach(function (set) { 4299 set.disabled = true; 4300 4301 if (typeof self.selectedValues[set.id] !== 'undefined') { 4302 self.changeOption(set.id, ''); 4303 } 4304 }); 4305 } 4306 }, 4307 /** 4308 * Based on current allowed attributes, remove any currently selected attributes that are considered invali
4308d 4309 * @param selectedValues 4310 */ 4311 unsetInvalidOptions: function(selectedValues) { 4312 let allowedAttributeOptions = this.calculateAllowedAttributeOptions(selectedValues); 4313 let allAttributes = Object.values(this.optionConfig.attributes); 4314 4315 allAttributes.forEach(attribute => { 4316 if (typeof selectedValues[attribute.id] !== 'undefined' && 4317 typeof allowedAttributeOptions[attribute.id] !== 'undefined') { 4318 let selectedOptionId = selectedValues[attribute.id]; 4319 let selectedOption = allowedAttributeOptions[attribute.id].find(function(option) { 4320 return option.id === selectedOptionId; 4321 }); 4322 4323 if (typeof selectedOption === 'undefined') { 4324 this.changeOption(attribute.id, ''); 4325 } 4326 } 4327 }); 4328 }, 4329 getAttributeDisabled: function(attributeId) { 4330 let attribute = this.optionConfig.attributes[attributeId]; 4331 if (typeof attribute !== 'undefined' && typeof attribute.disabled !== 'undefined') { 4332 return attribute.disabled; 4333 } else { 4334 return false; 4335 } 4336 }, 4337 findSimpleIndex() { 4338 this.productIndex = this.calculateSimpleIndexForPartialSelection(this.selectedValues); 4339 }, 4340 calculateSimpleIndexForPartialSelection(selectedValues) { 4341 if (selectedValues.length === 0) return 0; 4342 let productIndexIds = Object.keys(this.optionConfig.index); 4343 Object.keys(this.optionConfig.attributes).forEach((attribute) => { 4344 const productsWithAttributeMatch = selectedValues[attribute] 4345 ? productIndexIds.filter((productIndex) => { 4346 return this.optionConfig.index[productIndex][attribute] === this.selectedValues[attribute] 4347 }) 4348 : []; 4349 4350 productIndexIds = productsWithAttributeMatch.length ? productsWithAttributeMatch : productIndexIds 4351 }) 4352 4353 return productIndexIds[0]; 4354 }, 4355 calculateSimpleIndexForFullSelection(selectedValues) { 4356 const productIndexes = this.optionConfig.index; 4357 return Object.keys(productIndexes).find(productIndex => { 4358 const productCandidateOptions = productIndexes[productIndex]; 4359 4360 for (const productOption in productCandidateOptions) { 4361 if ( 4362 ! selectedValues[productOption] || 4363 selectedValues[productOption] !== productCandidateOptions[productOption] 4364 ) { 4365 return false; 4366 } 4367 } 4368 return productIndex; 4369 }); 4370 }, 4371 productIndex: 0, 4372 findAllowedAttributeOptions() { 4373 this.allowedAttributeOptions = this.calculateAllowedAttributeOptions(this.selectedValues); 4374 }, 4375 calculateAllowedAttributeOptions(selectedValues) { 4376 const allAttributes = this.optionConfig.attributes; 4377 const allAttributesSorted = Object.values(allAttributes).sort((a,b) => { 4378 return a.position - b.position 4379 }); 4380 4381 const newAllowedAttributeOptions = []; 4382 4383 allAttributesSorted.forEach(attribute => { 4384 let selectionWithoutAttr = selectedValues; 4385 4386 // If using cascading options, limit available options in cascading order 4387 if (this.cascadingOptions) { 4388 let curAttribute = attribute; 4389 4390 // Remove current attribute and each of its children from selection, such that only the parent options are factored
4390into available product options 4391 while (typeof curAttribute !== 'undefined') { 4392 selectionWithoutAttr = this.removeAttrFromSelection(selectionWithoutAttr, curAttribute.id); 4393 curAttribute = curAttribute.nextSetting; 4394 } 4395 } else { 4396 selectionWithoutAttr = this.removeAttrFromSelection(selectedValues, attribute.id); 4397 } 4398 4399 selectionWithoutAttr = Object.assign({}, selectionWithoutAttr); 4400 const availableIndexes = this.calculateAvailableProductIndexes(selectionWithoutAttr); 4401 newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options.filter(option => { 4402 return !!option.products.find(product => { 4403 return availableIndexes.includes(product); 4404 }) 4405 }); 4406 }); 4407 return newAllowedAttributeOptions; 4408 }, 4409 calculateAvailableProductIndexes(selectedOptions) { 4410 if (Object.keys(selectedOptions).length === 0) { 4411 if (Object.values(this.optionConfig.salable || {}).length) { 4412 return [].concat.apply([], [].concat.apply([], Object.values(this.optionConfig.salable).map(Object.values))).filter((x, i, a) => a.indexOf(x) === i) 4413 } 4414 return Object.keys(this.optionConfig.index); 4415 } 4416 4417 const selectedIds = Object.keys(selectedOptions); 4418 if (Object.values(this.optionConfig.salable || {}).length) { 4419 const selectedOptionIndexes = selectedIds.map(attrId => { 4420 const optionValue = selectedOptions[attrId]; 4421 return this.optionConfig.salable[attrId] && this.optionConfig.salable[attrId][optionValue] || [] 4422 }) 4423 return selectedOptionIndexes.reduce((acc, optionIndexes) => { 4424 return acc.filter(index => optionIndexes.includes(index)); 4425 }); 4426 } else { 4427 const productIndexes = this.optionConfig.index; 4428 return Object.keys(productIndexes).filter(index => { 4429 for (const attrId of selectedIds) { 4430 if (productIndexes[index][attrId] !== `${selectedOptions[attrId]}`) return false 4431 } 4432 return true 4433 }); 4434 } 4435 }, 4436 findAttributeByOptionId(optionId) { 4437 for (const attributeId in this.optionConfig.attributes) { 4438 const attributeOptions = this.optionConfig.attributes[attributeId].options || []; 4439 if (attributeOptions.find(option => option.id === optionId)) { 4440 return attributeId; 4441 } 4442 } 4443 }, 4444 getAllowedAttributeOptions(attributeId) { 4445 return this.allowedAttributeOptions[attributeId] || [] 4446 }, 4447 getProductIdsForOption(option) { 4448 const attributeId = this.findAttributeByOptionId(option.id); 4449 const allOptions = this.optionConfig.attributes[attributeId]; 4450 const opt = (allOptions && allOptions.options || []).find(o => o.id === option.id); 4451 return opt && opt.products 4452 ? opt.products 4453 : []; 4454 }, 4455 findProductIdsForPartialSelection(optionSelection) { 4456 const candidateProducts = Object.values(optionSelection).reduce((candidates, optionId) => { 4457 const newCandidates = this.getProductIdsForOption({id: optionId}); 4458 return candidates === null 4459 ? newCandidates 4460 : candidates.filter(productId => newCandidates.includes(productId)); 4461 }, null); 4462 return candidateProducts || []; 4463 },
4464 findCheapestProductForPartialSelection(optionSelection) { 4465 const candidateProducts = this.findProductIdsForPartialSelection(optionSelection); 4466 return candidateProducts.reduce((cheapest, simpleIdx) => { 4467 // in the first iteration we start with simpleIdx as the currently cheapest product 4468 if (! this.optionConfig.optionPrices[cheapest]) return simpleIdx; 4469 const knownCheapestPrice = this.optionConfig.optionPrices[cheapest].finalPrice.amount; 4470 return knownCheapestPrice > this.optionConfig.optionPrices[simpleIdx].finalPrice.amount 4471 ? simpleIdx 4472 : cheapest; 4473 }, 0) 4474 }, 4475 findProductIdToUseForOptionPrice(option) { 4476 // try to find a product for a complete selection 4477 const attributeId = this.findAttributeByOptionId(option.id); 4478 const optionSelection = Object.assign({}, this.selectedValues, {[attributeId]: option.id}); 4479 const matchingSimpleIndex = this.calculateSimpleIndexForFullSelection(optionSelection); 4480 // if there is no complete selection, use the cheapest product for the option 4481 return matchingSimpleIndex || this.findCheapestProductForPartialSelection(optionSelection); 4482 }, 4483 getAttributeOptionLabel(option) { 4484 // Overrides original to exclude the price change from the option labels 4485 return option.label; 4486 }, 4487 getOptionPriceAdjustmentBasePrice() { 4488 if (this.optionConfig.optionPrices[this.productIndex]) { 4489 return this.optionConfig.optionPrices[this.productIndex].finalPrice.amount 4490 } 4491 const cheapestForSelection = this.findCheapestProductForPartialSelection(this.selectedValues); 4492 return this.optionConfig.optionPrices[cheapestForSelection] 4493 ? this.optionConfig.optionPrices[cheapestForSelection].finalPrice.amount 4494 : this.optionConfig.prices.finalPrice.amount; // default price if no option selection 4495 }, 4496 clearOptionIfActive(optionId, value) { 4497 if (this.selectedValues[optionId] === value) { 4498 this.blurLabel() 4499 this.changeOption(optionId, '') 4500 } 4501 }, 4502 removeAttrFromSelection(selectedValues, attributeId) { 4503 attributeId = parseInt(attributeId); 4504 return selectedValues.reduce((newSelection, val, attr) => { 4505 if (attr !== attributeId) { 4506 newSelection[attr] = val; 4507 } 4508 return newSelection; 4509 }, []); 4510 }, 4511 changeOption(attributeId, value) { 4512 if (value === '') { 4513 this.selectedValues = this.removeAttrFromSelection(this.selectedValues, attributeId) 4514 } else if (value && this.getAllowedAttributeOptions(attributeId).find(option => option.id === value)) { 4515 this.selectedValues[attributeId] = value; 4516 } 4517 this.findSimpleIndex(); 4518 this.findAllowedAttributeOptions(); 4519 this.updatePrices(); 4520 this.updateGallery(); 4521 4522 // If using cascading options, reset options or enable options depending on what is selected 4523 if (this.cascadingOptions) { 4524 let element = this.optionConfig.attributes[attributeId]; 4525 if (value && element.nextSetting) { 4526 element.nextSetting.disabled = false; 4527 } else if (!value) { 4528 this.resetChildren(element); 4529 } 4530 4531 // Remove any invalid options depending on what was selected 4532 this.unsetInvalidOptions(this.selectedValues); 4533 } 4534 4535 window.dispatchEvent( 4536 new CustomEvent( 4537 'configurable-selection-changed', 4538 { 4539 detail: { 4540 productId: this.productId, 4541 optionId: attributeId, 4542 value: value, 4543 productIndex: this.productIndex, 4544 selectedValues: this.selectedValues, 4545 candidates: this.findProductIdsForPartialSelection(this.selectedValues), 4546 } 4547 } 4548 ) 4549 ); 4550 4551 // Add new custom events when option selected is changed 4552 let productSelected = typeof this.calculateSimpleIndexF
4552orFullSelection(this.selectedValues) !== 'undefined'; 4553 let sku = productSelected ? this.optionConfig.skus[this.productIndex] : this.optionConfig.parentSku; 4554 window.dispatchEvent( 4555 new CustomEvent( 4556 "update-sku-" + this.productId, 4557 { 4558 detail: sku 4559 } 4560 ) 4561 ); 4562 4563 if (productSelected) { 4564 window.dispatchEvent( 4565 new CustomEvent( 4566 "update-attention-" + this.productId, 4567 { 4568 detail: this.optionConfig.attention[this.productIndex] 4569 } 4570 ) 4571 ); 4572 } 4573 4574 let stock = productSelected ? this.optionConfig.stock[this.productIndex] : this.optionConfig.stock['cp-avail']; 4575 window.dispatchEvent( 4576 new CustomEvent( 4577 "update-stock-" + this.productId, 4578 { 4579 detail: stock 4580 } 4581 ) 4582 ); 4583 }, 4584 calculateIsMinimalPrice() { 4585 return ( 4586 this.selectedValues.filter(value => !!value).length < 4587 Object.keys(this.optionConfig.attributes).length 4588 ); 4589 }, 4590 updatePrices() { 4591 const value = this.productIndex ? 4592 this.optionConfig.optionPrices[this.productIndex] : 4593 this.optionConfig.prices; 4594 window.dispatchEvent( 4595 new CustomEvent( 4596 "update-prices-" + this.productId, 4597 { 4598 detail: Object.assign( 4599 value, 4600 { isMinimalPrice: this.calculateIsMinimalPrice() } 4601 ) 4602 } 4603 ) 4604 ); 4605 }, 4606 updateGallery () { 4607 if (this.productIndex) { 4608 const images = this.optionConfig.images[this.productIndex]; 4609 images && window.dispatchEvent(new CustomEvent( 4610 "update-gallery", 4611 { detail: { 4612 "images": this.sortImagesByPosition(images), 4613 "productId": this.productId 4614 } 4615 } 4616 )); 4617 } else { 4618 window.dispatchEvent(new CustomEvent("reset-gallery", { 4619 detail: { "productId": this.productId } 4620 })); 4621 } 4622 }, 4623 sortImagesByPosition(images) { 4624 return images.sort((x, y) => { 4625 return x.position === y.position ? 0 : (parseInt(x.position) > parseInt(y.position) ? 1 : -1) 4626 }); 4627 }, 4628 onGetCartData(data) { 4629 }, 4630 preselectCartItems(data) { 4631 // pre-select options based on cart data for current (quote) itemId 4632 const cart = data && data.cart; 4633 if (cart && cart.items) { 4634 const cartItem = cart.items.find((item) => { 4635 return ( 4636 item.item_id === this.itemId 4637 && item.product_id === this.productId 4638 ) 4639 }); 4640 if (cartItem && cartItem.options && cartItem.options.length) { 4641 cartItem.options.map(option => { 4642 this.changeOption(option.option_id, option.option_value); 4643 }) 4644 } 4645 } 4646 }, 4647 preselectQuerystringItems() { 4648 // pre-select option like ?size=167 4649 const urlQueryParams = new URLSearchParams(window.location.search.replace('?','')); 4650 this.preselectItemsBasedOnLocation(attribute => urlQueryParams.get(attribute.code)); 4651 }, 4652 preselectLocationHashItems() { 4653 // pre-select option like #144=167 4654 const urlHashParams = new URLSearchParams(window.location.hash.replace('#','')); 4655 this.preselectItemsBasedOnLocation(attribute => urlHashParams.get(attribute.id)); 4656 }, 4657 preselectItemsBasedOnLocation(getLocationValue) { 4658 Object.values(this.optionConfig.attributes).map(attribute => { 4659 this.changeOption(attribute.id, getLocationValue(attribute)) 4660 }); 4661 } 4662 } 4663 } 4664 4665</script>
vendor: 1 bytes, line 4665
4665
4666<script> 4667 function initSwatchOptions(swatchConfig) { 4668 return { 4669 swatchConfig, 4670 getAttributeSwatchData(attributeId) { 4671 const swatchConfig = Object.assign({}, this.swatchConfig[attributeId]); 4672 swatchConfig['details'] = JSON.parse(swatchConfig['additional_data']); 4673 4674 return swatchConfig; 4675 }, 4676 getAllAttributeOptions(attributeId) { 4677 return ( 4678 this.optionConfig.attributes[attributeId] && 4679 this.optionConfig.attributes[attributeId].options 4680 ) || [] 4681 }, 4682 optionIsActive(attributeId, optionId) { 4683 // return true if a product with this option is in stock 4684 return !!this.getAllowedAttributeOptions(attributeId).find( 4685 option => option.id === optionId 4686 ) 4687 }, 4688 optionIsEnabled(attributeId, optionId) { 4689 // return true if a product with this option is enabled 4690 for (const productId in this.optionConfig.index) { 4691 if (this.optionConfig.index[productId][attributeId] === optionId) { 4692 return true; 4693 } 4694 } 4695 return false; 4696 }, 4697 mapSwatchTypeNumberToTypeCode(typeNumber) { 4698 switch ("" + typeNumber) { 4699 case "1": 4700 return "color" 4701 case "2": 4702 return "image" 4703 case "3": 4704 return "empty" 4705 case "0": 4706 default: 4707 return "text" 4708 } 4709 }, 4710 getTypeOfFirstOption(attributeId) { 4711 for (const optionId in this.swatchConfig[attributeId]) { 4712 const option = this.swatchConfig[attributeId][optionId]; 4713 if (typeof option.type !== 'undefined') { 4714 return this.mapSwatchTypeNumberToTypeCode(option.type); 4715 } 4716 } 4717 }, 4718 getVisualSwatchType(attributeId, targetOptionId) { 4719 // If a type configuration is present for the given option id, use it 4720 const config = this.swatchConfig[attributeId]; 4721 if (config[targetOptionId] && typeof config[targetOptionId].type !== 'undefined') { 4722 return this.mapSwatchTypeNumberToTypeCode(config[targetOptionId].type); 4723 } 4724 4725 // Otherwise - if no config is present for the target option - use the type of the first option 4726 // with a type property from the attribute, thus assuming its the same type as the target option. 4727 // (This edge case condition can occur on single swatch products if some options are not salable) 4728 return this.getTypeOfFirstOption(attributeId); 4729 }, 4730 getSwatchType(attributeId, optionId) { 4731 // Deserialize the attribute details the first time they are used 4732 if (this.swatchConfig[attributeId] && ! this.swatchConfig[attributeId].details) { 4733 this.swatchConfig[attributeId] = this.getAttributeSwatchData(attributeId); 4734 } 4735 const type = this.swatchConfig[attributeId] && 4736 this.swatchConfig[attributeId].details && 4737 this.swatchConfig[attributeId].details.swatch_input_type || 4738 "empty"; 4739 return type === 'visual' ? this.getVisualSwatchType(attributeId, optionId) : type; 4740 }, 4741 isTextSwatch(attributeId, optionId) { 4742 return this.getSwatchType(attributeId, optionId) === 'text'; 4743 }, 4744 isVisualSwatch(attributeId, optionId) { 4745 const type = this.getSwatchType(attributeId, optionId); 4746 4747 return ['image', 'color'].includes(type); 4748 }, 4749 getSwatchBackgroundStyle(attributeId, optionId) {
4750 const config = this.getSwatchConfig(attributeId, optionId); 4751 const type = this.getSwatchType(attributeId, optionId); 4752 4753 if (type === "color") { 4754 return 'background-color:' + config.value; 4755 } else if (type === "image") { 4756 return "background: #ffffff url('" + config.value + "') no-repeat center"; 4757 } else { 4758 return ''; 4759 } 4760 }, 4761 getSwatchText(attributeId, optionId) { 4762 const config = this.getSwatchConfig(attributeId, optionId); 4763 return config.label || config.value || this.getOptionLabelFromOptionConfig(attributeId, optionId); 4764 }, 4765 getSelectedSwatchText(attributeId, optionId) { 4766 let tooltipText = this.isTooltipVisible() && this.activeTooltipItem.attribute == attributeId ? this.getTooltipLabel() : ''; 4767 return tooltipText || this.getSwatchText(attributeId, optionId); 4768 }, 4769 getOptionLabelFromOptionConfig(attributeId, optionId) { 4770 // Fallback if no value is present in swatchConfig data 4771 // Reference issue https://gitlab.hyva.io/hyva-themes/magento2-default-theme/-/issues/190 4772 const option = this.getAllAttributeOptions(attributeId).filter(option => option.id === optionId); 4773 return option && option[0] && option[0].label ||''; 4774 }, 4775 getSwatchConfig(attributeId, optionId) { 4776 return this.swatchConfig[attributeId] && this.swatchConfig[attributeId][optionId] 4777 ? this.swatchConfig[attributeId][optionId] 4778 : false; 4779 }, 4780 activeTooltipItem: false, 4781 tooltipPositionElement: false, 4782 isTooltipVisible() { 4783 return this.activeTooltipItem &&
4784 this.getSwatchConfig( 4785 this.activeTooltipItem.attribute, 4786 this.activeTooltipItem.item 4787 ); 4788 }, 4789 isFirstItemCol() { 4790 return this.activeTooltipItem.index === 0; 4791 }, 4792 getTooltipImageStyle(attributeId, optionId) { 4793 const config = this.getSwatchConfig(attributeId, optionId); 4794 const type = this.getSwatchType(attributeId, optionId); 4795 4796 if (type === "color") { 4797 return 'background-color:' + config.value + '; width: 110px; height: 90px;'; 4798 } else if (type === "image") { 4799 return "background: #ffffff url('" + config.thumb + 4800 "') center center no-repeat; width: 110px; height: 90px;"; 4801 } else { 4802 return 'display:none'; 4803 } 4804 }, 4805 getTooltipPosition() { 4806 return this.tooltipPositionElement ? 4807 `top: ${this.tooltipPositionElement.offsetTop}px;` + 4808 `left: ${ 4809 this.tooltipPositionElement.offsetLeft - ( 4810 this.tooltipPositionElement.closest('.snap') && 4811 this.tooltipPositionElement.closest('.snap').scrollLeft || 4812 0 4813 ) 4814 }px;` : '' 4815 }, 4816 getTooltipLabel() { 4817 return this.getSwatchConfig(this.activeTooltipItem.attribute, this.activeTooltipItem.item).label 4818 }, 4819 focusedLabel: false, 4820 focusLabel(optionId) { 4821 this.focusedLabel = optionId; 4822 }, 4823 blurLabel() { 4824 this.focusedLabel = false; 4825 }, 4826 showSwatches: false, 4827 initShowSwatchesIntersect() { 4828 if ('IntersectionObserver' in window && !window.scrollY) { 4829 let io = new IntersectionObserver( 4830 entries => { 4831 entries.map(entry => { 4832 if (entry.isIntersecting) { 4833 this.showSwatches = true; 4834 io.unobserve(this.$root); 4835 } 4836 }) 4837 } 4838 ); 4839 io.observe(this.$root); 4840 } else { 4841 this.showSwatches = true 4842 } 4843 } 4844 } 4845 } 4846</script>
vendor: 1 bytes, line 4846
4846
4847<script> 4848 'use strict'; 4849 4850 const grecaptchaV2LoadCallbacks = []; 4851 4852 function executeRecaptchaLoadCallbacks () { 4853 while (window.grecaptcha && grecaptchaV2LoadCallbacks.length > 0) { 4854 const callback = grecaptchaV2LoadCallbacks.pop(); 4855 typeof callback === 'string' ? window[callback]() : callback(); 4856 } 4857 } 4858 4859 (function() { 4860 const loadRecaptchaScript = (event) => { 4861 4862 if (window.grecaptcha || !event.target.form) { 4863 return; 4864 } 4865 4866 const url = 'https://www.google.com/recaptcha/api.js?onload=executeRecaptchaLoadCallbacks'; 4867 const siteKey = '6Lf7qRkjAAAAAP0lyuri41_9EGRTkVEkzoJvVxbE'; 4868 const script = document.createElement('script'); 4869 script.type = 'text/javascript'; 4870 script.src = siteKey ? `${url}&render=${siteKey}` : `${url}&render=explicit`; 4871 script.async = true; 4872 document.head.appendChild(script); 4873 4874 script.addEventListener('load', () => { 4875 Array.from(document.querySelectorAll('button[data-recaptcha-btn]:disabled')).forEach(btn => btn.removeAttribute('disabled')); 4876 }); 4877 } 4878 4879 window.forceLoadRecaptchaScript = (form) => { 4880 loadRecaptchaScript({target: {form: form || 'dummy'}}); 4881 executeRecaptchaLoadCallbacks(); 4882 }; 4883 4884 document.body.addEventListener('input', loadRecaptchaScript, { once: true }); 4885 document.body.addEventListener('focus', loadRecaptchaScript, { once: true }); 4886 4887 }()); 4888 4889</script>
vendor: 1 bytes, line 4889
4889
4890<script> 4891 'use strict'; 4892 4893 (function () { 4894 const modals = []; 4895 const excludedFromFocusTrapping = new Set(); 4896 4897 function trapFocusInNextModalWithOverlay() { 4898 for (let idx = modals.length -1; idx >= 0; idx--) { 4899 const nextOnStack = modals[idx]; 4900 const nextDialogElement = nextOnStack.instance.$refs[nextOnStack.name]; 4901 if (! isOverlayDisabled(nextDialogElement)) { 4902 hyva.trapFocus(nextDialogElement); 4903 break; 4904 } 4905 } 4906 } 4907 4908 function focusables(dialogElement) { 4909 const selector = 'button, [href], input, textarea, select, details, [tabindex]:not([tabindex="-1"])'; 4910 return Array.from(dialogElement.querySelectorAll(selector)) 4911 .filter(el => !el.hasAttribute('disabled')); 4912 } 4913 4914 function firstVisible(elements) { 4915 const a = Array.from(elements); 4916 for (let i = 0; i < a.length; i++) { 4917 if (a[i].offsetWidth || a[i].offsetHeight || a[i].getClientRects().length) return a[i]; 4918 } 4919 return null; 4920 } 4921 4922 function isInViewport(element) { 4923 const rect = element && element.getBoundingClientRect(); 4924 return rect && 4925 rect.top >= 0 && 4926 rect.left >= 0 && 4927 rect.right <= window.innerWidth && 4928 rect.bottom <= window.innerHeight; 4929 } 4930 4931 function setFocusAfterTransition(dialogElement, duration) { 4932 const nested = Array.from(dialogElement.querySelectorAll('[role="dialog"]')); 4933 const candidates = Array.from(dialogElement.querySelectorAll('[x-focus-first]')); 4934 next: for (let candidate of candidates) { 4935 for (let child of nested) { 4936 if (child.contains(candidate)) continue next; 4937 } 4938 setTimeout(() => candidate.focus(), 50); 4939 break; 4940 } 4941 window.setTimeout(() => { 4942 const focusElement = firstVisible(dialogElement.querySelectorAll('[x-focus-first]')) || 4943 focusables(dialogElement)[0] || 4944 null; 4945 focusElement && isInViewport(focusElement) && focusElement.focus(); 4946 }, Math.max(1, duration)); 4947 } 4948 4949 function determineTrigger($refs, dialog, trigger) { 4950 if (typeof trigger === 'undefined' && typeof dialog === 'object' && dialog.target instanceof HTMLElement) { 4951 return dialog.target; 4952 } 4953 if (typeof dialog === 'string' && typeof trigger === 'object' && trigger.target instanceof HTMLElement) { 4954 return trigger.target; 4955 } 4956 if (typeof trigger === 'string') { 4957 try { 4958 return $refs[trigger] || document.querySelector(trigger) 4959 } catch (e) {} 4960 } 4961 if (trigger instanceof Element) { 4962 return trigger; 4963 } 4964 4965 return null; 4966 } 4967 4968 function isOverlayDisabled(dialog) { 4969 return dialog && dialog.hasAttribute('x-no-overlay') 4970 } 4971 4972 function areRemainingModalsWithoutOverlay(modals) 4973 { 4974 const overflowDisabled = modals.map(modal => modal.instance.$refs[modal.name]).filter(isOverlayDisabled); 4975 4976 return overflowDisabled.length === modals.length; 4977 } 4978 4979 window.hyva.modal = function(options = {}) { 4980 if (this.$el && this.$el.dataset && this.$el.dataset.options) { 4981 try { 4982 options = Object.assign(options, JSON.parse(this.$el.dataset.options || '{}')); 4983 } catch (e) { 4984 throw new Error('Cannot read the dialog options from the data-options attribute: not valid JSON'); 4985 } 4986 } 4987 4988 const config = Object.assign({ 4989 dialog: 'dialog', duration: 300, transitionEnter: 'transition ease-out duration-300', 4990 transitionEnterStart: 'opacity-0', 4991 transitionEnterEnd: 'opacity-100', 4992 transitionLeave: 'transition ease-in duration-300', 4993 transitionLeaveStart: 'opacity-100', 4994 transitionLeaveEnd: 'opacity-0', 4995 }, options); 4996 let lastHide = 0; 4997 4998 return { 4999 opened: {}, 5000 show(dialog, trigger) { 5001 const focusTargetAfterHide = determineTrigger(this.$refs, dialog, trigger); 5002 const name = typeof dialog === 'string' ? dialog : config.dialog; 5003 const dialogElement = this.$refs[name]; 5004 if (! dialogElement) { 5005 return; 5006 } 5007 const useOverlay = ! dialogElement.hasAttribute('x-no-overlay'); 5008 5009 dialogElement.scrollTop = 0; 5010 5011 if (this.opened[name]) { 5012 return; 5013 } 5014 5015 if (focusTargetAfterHide) { 5016 focusTargetAfterHide.setAttribute('aria-expanded', 'true'); 5017 } 5018 5019 this.opened[name] = true; 5020 useOverlay && this.$nextTick(() => hyva.trapFocus(dialogElement)); 5021 setFocusAfterTransition(dialogElement, config.duration); 5022 5023 const frame = {name, instance: this, focusTarget: focu
5023sTargetAfterHide, time: Date.now()}; 5024 5025 modals.push(frame); 5026 if (useOverlay) { 5027 document.body.classList.add('overflow-hidden'); 5028 } 5029 return new Promise(resolve => frame.resolve = resolve); 5030 }, 5031 cancel() { 5032 this.hide(false); 5033 }, 5034 ok() { 5035 this.hide(true); 5036 }, 5037 hide(value) { 5038 if (Date.now() - lastHide < config.duration) { 5039 return; 5040 } 5041 lastHide = Date.now(); 5042 5043 const modal = modals.pop() || {}; 5044 if (! modal.instance) { 5045 return; 5046 } 5047 5048 const name = modal.name; 5049 this.opened[name] = false; 5050 hyva.releaseFocus(modal.instance.$refs[modal.name]) 5051 trapFocusInNextModalWithOverlay(); 5052 5053 const nextFocusAfterHide = modal.focusTarget; 5054 nextFocusAfterHide && setTimeout(() => { 5055 nextFocusAfterHide.setAttribute('aria-expanded', 'false'); 5056 nextFocusAfterHide.focus() 5057 }, config.duration); 5058 5059 if (modals.length === 0 || areRemainingModalsWithoutOverlay(modals)) { 5060 document.body.classList.remove('overflow-hidden'); 5061 } 5062 5063 modal.resolve(value); 5064 }, 5065 overlay(dialog) { 5066 dialog = this.$el.dataset.dialogRefName || dialog; 5067 const name = typeof dialog === 'string' ? dialog : config.dialog; 5068 return { 5069 ['x-show']() { 5070 return this.opened[name] 5071 }, 5072 ['x-transition:enter']: config.transitionEnter, 5073 ['x-transition:enter-start']: config.transitionEnterStart, 5074 ['x-transition:enter-end']: config.transitionEnterEnd, 5075 ['x-transition:leave']: config.transitionLeave, 5076 ['x-transition:leave-start']: config.transitionLeaveStart, 5077 ['x-transition:leave-end']: config.transitionLeaveEnd, 5078 ['@hyva-modal-show.window'](event) { 5079 event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide) 5080 } 5081 }; 5082 }, 5083 showDialogOnInit() { 5084 const parent = this.$el.closest('[data-dialog-ref-name]'); 5085 if (parent && parent.dataset.dialogRefName) { 5086 this.$dispatch('hyva-modal-show', {dialog: parent.dataset.dialogRefName}) 5087 } 5088 } 5089 }; 5090 } 5091 5092 window.hyva.modal.peek = () => modals.length > 0 && modals[modals.length -1] 5093 5094 window.hyva.modal.pop = function () { 5095 if (modals.length > 0) { 5096 const modal = modals[modals.length -1]; 5097 modal.instance.hide(); 5098 } 5099 } 5100 5101 window.hyva.modal.excludeSelectorsFromFocusTrap = function (selectors) { 5102 typeof selectors === 'string' || selectors instanceof String 5103 ? excludedFromFocusTrapping.add(selectors) 5104 : selectors.map(selector => excludedFromFocusTrapping.add(selector)); 5105 } 5106 5107 window.hyva.modal.eventListeners = { 5108 keydown: event => { 5109 if (event.key === 'Escape') { 5110 window.hyva.modal.pop(); 5111 } 5112 }, 5113 click: event => { 5114 if (modals.length > 0) { 5115 const modal = modals[modals.length -1]; 5116 const dialog = modal.instance.$refs[modal.name]; 5117 if (modal.time + 50 < Date.now() && // if last click processing is more than 50ms ago 5118 ! isOverlayDisabled(dialog) && // if dialog has overlay 5119 ! dialog.contains(event.target)) { // if click is outside of dialog 5120 modal.instance.hide(); 5121 } 5122 } 5123 } 5124 }; 5125 5126 document.addEventListener('keydown', window.hyva.modal.eventListeners.keydown); 5127 5128 document.addEventListener('click', window.hyva.modal.eventListeners.click); 5129 })(); 5130 window.addEventListener('alpine:init', () => { 5131 Alpine.data('hyvaModal', window.hyva.modal); 5132 }, {once: true}); 5133</script>
5133 5134<div id="mobile-contact-block"><div class="contact-popup"> 5135 <div class="contact-toolbar"> 5136 <button id="contact-popup-close"> 5137 </button> 5138 <span>Contact Us</span> 5139 </div> 5140 <iframe id="MobileContactPopup" src="" data-srcuri="https://contact.outdoornativitysets.com/?FormKey=ons&type=zdonly" title="OutdoorNativitySets Contact Form" width="100%" height="400px" frameborder="1"></iframe> 5141</div> 5142 5143<style> 5144 #mobile-contact-block { 5145 position: fixed; 5146 top: 30px !important; 5147 bottom: 30px !important; 5148 right: 30px !important; 5149 bottom: 30px !important; 5150 background-color: white; 5151 z-index: 999999; 5152 margin: 16px; 5153 border-radius: 10px; 5154 transition: all linear .3s; 5155 } 5156 5157 .contact-popup { 5158 border-radius: 10px; 5159 box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 6px 0px; 5160 } 5161 5162 .contact-toolbar { 5163 border-radius: 10px 10px 0 0; 5164 background-color: #a32c28; 5165 width: 100%; 5166 display: flex; 5167 justify-content: center; 5168 padding: .75rem 0; 5169 position: relative; 5170 } 5171 5172 .contact-toolbar span { 5173 color: white; 5174 font-weight: 700; 5175 } 5176 5177 #contact-popup-close { 5178 border-bottom: 0px solid white; 5179 min-width: 10px; 5180 min-height: 10px; 5181 position: absolute; 5182 right: 0; 5183 top: 0; 5184 border-radius: 0; 5185 padding: 0; 5186 height: 50%; 5187 margin-top: 2px; 5188 margin-right: 3rem; 5189 } 5190 #contact-popup-close::before { content: 'X'; color: #fff; } 5191 5192 #contact-popup-close:hover { 5193 background: #a32c28 !important; 5194 } 5195 5196 #launcher, 5197 #webWidget { 5198 display: none; 5199 } 5200 5201 @media (max-width: 768px) { 5202 5203 #mobile-contact-block { 5204 top: 0; 5205 left: 0; 5206 margin: 0; 5207 border-radius: 0; 5208 } 5209 5210 .contact-toolbar { 5211 border-radius: 0 0 0 0; 5212 padding: 1.5rem 0; 5213 } 5214 } 5215 5216</style></div>
5216<script> 5217 // Functionality directly ported from original uiComponent, with minor modifications to work with Alpine 5218 function initBraintreePayPalExpress(clientToken, currency) 5219 { 5220 return { 5221 clientToken: clientToken, 5222 currency: currency, 5223 cart: null, 5224 customer: null, 5225 isGuestCheckoutAllowed: null, 5226 init() 5227 { 5228 // don't do anything 5229 }, 5230 custom_init() 5231 { 5232 5233 // called by nextTick 5234 this.loadScript('https://js.braintreegateway.com/web/3.88.1/js/client.min.js', function() { 5235 this.setupButton(this.$root); 5236 }.bind(this)); 5237 }, 5238 receiveCustomerData(event) 5239 { 5240 if(event.detail && event.detail.data){ 5241 this.cart = event.detail.data.cart; 5242 if(this.cart){ 5243 this.isGuestCheckoutAllowed = this.cart.isGuestCheckoutAllowed; 5244 } 5245 this.customer = event.detail.data.customer; 5246 } 5247 }, 5248 loadScript(url, callback) 5249 { 5250 const script = document.createElement('script'); 5251 script.type = 'text/javascript'; 5252 script.src = url; 5253 script.addEventListener('load', callback); 5254 document.head.appendChild(script); 5255 }, 5256 buildForm(actionUrl, fields) 5257 { 5258 const form = document.createElement('form'); 5259 form.action = actionUrl; 5260 form.method = 'POST'; 5261 form.hidden = true; 5262 form.enctype = 'application/x-www-form-urlencoded'; 5263 5264 Object.entries(fields).forEach(field => { 5265 const [key, value] = field; 5266 let fieldElement; 5267 5268 fieldElement = document.createElement('input'); 5269 fieldElement.type = 'hidden'; 5270 fieldElement.name = key; 5271 fieldElement.value = value; 5272 form.appendChild(fieldElement); 5273 }); 5274 5275 document.body.appendChild(form); 5276 form.submit(); 5277 }, 5278 payPalButton(element, paypalCheckoutInstance) 5279 { 5280 let self = this, 5281 style = { 5282 color: element.dataset.color, 5283 shape: element.dataset.shape, 5284 size: element.dataset.size, 5285 }; 5286 5287 if (element.dataset.fundingicons) { 5288 style.fundingicons = element.dataset.fundingicons; 5289 } 5290 5291 // Render 5292 let paypalActions; 5293 let button = paypal.Buttons({ 5294 fundingSource: element.dataset.funding, 5295 style: style, 5296 5297 createOrder: function () 5298 { 5299 return paypalCheckoutInstance.createPayment({ 5300 amount: element.dataset.amount, 5301 locale: element.dataset.locale, 5302 currency: element.dataset.currency, 5303 flow: 'checkout', 5304 enableShippingAddress: true, 5305 displayName: element.dataset.displayname, 5306 }); 5307 }, 5308 5309 validate: function(actions) 5310 { 5311 if (!self.customer.firstname && !self.isGuestCheckoutAllowed) { 5312 actions.disable(); 5313 } 5314 5315 paypalActions = actions; 5316 }, 5317 5318 onCancel: function (data) 5319 { 5320 console.warn('paypalCheckout\u0020has\u0020been\u0020cancelled', data); 5321 }, 5322 5323 onError: function (err) 5324 { 5325 console.error('paypalCheckout\u0020button\u0020render\u0020error', err); 5326 }, 5327 5328 onClick: function(data) 5329 { 5330 if (!self.customer.firstname && !self.isGuestCheckoutAllowed) { 5331 alert('To\u0020check\u0020out,\u0020please\u0020sign\u0020in\u0020with\u0020your\u0020email\u0020address.'); 5332 } 5333 }, 5334 5335 onApprove: function (data1) 5336 { 5337 return paypalCheckoutInstance.tokenizePayment(data1, function(err, payload) { 5338 // Map the shipping address correctly 5339 var address = payload.details.shippingAddress, 5340 recipientFirstName, 5341 recipientLastName; 5342 5343 if (typeof address.recipientName !== 'undefined') { 5344 var recipientName = address.recipientName.split(" "); 5345 5346 recipientFirstName = recipientName[0].replace(/'/g, "'"); 5347 recipientLastName = recipientName[1].replace(/'/g, "'"); 5348 } else { 5349 recipientFirstName = payload.details.firstName.replace(/'/g, "'"); 5350 recipientLastName = payload.details.lastName.replace(/'/g, "'"); 5351 } 5352 5353 payload.details.shippingAddress = { 5354 streetAddress: typeof address.line2 !== 'undefined' 5355 ? address.line1.replace(/'/g, ''') + ' ' + address.line2.replace(/'/g, ''') 5356 : address.line1.replace(/'/g, '''), 5357 locality: address.city.replace(/'/g, '''), 5358 postalCode: address.postalCode, 5359 countryCodeAlpha2: address.countryCode, 5360 email: payload.details.email.replace(/'/g, '''), 5361 recipientFirstName: recipientFirstName, 5362 recipientLastName: recipientLastName, 5363 telephone: typeof payload.details.phone !== 'undefined' 5364 ? payload.details.phone 5365 : '', 5366 region: typeof address.state !== 'undefined' 5367 ? address.state.replace(/'/g, ''') 5368 : '', 5369 }; 5370 5371 if(element.dataset.location === 'productpage') { 5372 var form = document.getElementById('product_addtocart_form'); 5373 5374 if (!form.checkValidity()) { 5375 return false;
5376 } 5377 5378 payload.additionalData = form.serialize(); 5379 } 5380 5381 var actionSuccess = element.dataset.actionsuccess; 5382 5383 self.buildForm( 5384 actionSuccess, 5385 { 5386 result: JSON.stringify(payload), 5387 form_key: hyva.getFormKey(), 5388 } 5389 ); 5390 }); 5391 } 5392 }); 5393 5394 if (!button.isEligible()) { 5395 element.parentNode.remove(); 5396 5397 return; 5398 } 5399 5400 // Clear element content prior to render to prevent duplicated buttons 5401 element.innerHTML = ''; 5402 button.render(element); 5403 }, 5404 renderpayPalMessages() 5405 { 5406 document.querySelectorAll('.action-braintree-paypal-message').forEach((container) => { 5407 paypal.Messages({ 5408 amount: container.dataset['pp-amount'], 5409 pageType: container.dataset['pp-type'], 5410 style: { 5411 layout: 'text', 5412 }, 5413 }).render('#' + container.id); 5414 }) 5415 }, 5416 loadBraintreeSDK(token, currency, button) 5417 { 5418 let self = this; 5419 5420 if(!self.customer) { 5421 const browserStorage = hyva.getBrowserStorage(); 5422 self.customer = {}; self.customer.firstname = browserStorage.getItem('paypal-customer-name'); 5423 self.isGuestCheckoutAllowed = browserStorage.getItem('paypal-guest-allowed'); 5424 } 5425 5426 braintree.client.create({ 5427 authorization: token 5428 }, (clientErr, clientInstance) => { 5429 if (clientErr) { 5430 return console.error('paypalCheckout\u0020error', clientErr); 5431 } 5432 5433 self.loadScript('https://js.braintreegateway.com/web/3.88.1/js/data-collector.min.js', () => { 5434 braintree.dataCollector.create({ 5435 client: clientInstance, 5436 paypal: true 5437 }, (err, dataCollectorinstance) => { 5438 if (err) { 5439 return console.error(err); 5440 } 5441 }); 5442 }); 5443 5444 self.loadScript('https://js.braintreegateway.com/web/3.88.1/js/paypal-checkout.min.js', () => { 5445 braintree.paypalCheckout.create({ 5446 client: clientInstance 5447 }, (err, paypalCheckoutInstance) => { 5448 if (typeof paypal !== 'undefined' ) { 5449 self.payPalButton(button, paypalCheckoutInstance); 5450 self.renderpayPalMessages(); 5451 } else { 5452 paypalCheckoutInstance.loadPayPalSDK({ 5453 components: 'buttons,messages,funding-eligibility', 5454 currency: currency, 5455 }, () => { 5456 self.payPalButton(button, paypalCheckoutInstance); 5457 self.renderpayPalMessages(); 5458 }); 5459 } 5460 }); 5461 }); 5462 }); 5463 }, 5464 setupButton(button) 5465 { 5466 this.loadBraintreeSDK(this.clientToken, this.currency, button); 5467 }, 5468 } 5469 } 5470</script>
5470 5471
5472<script> 5473 function receiveCustomerSpecificPaypalData(event) { 5474 let browserStorage = hyva.getBrowserStorage(); 5475 if(event.detail && event.detail.data){ 5476 if(event.detail.data.cart){ 5477 browserStorage.setItem('paypal-guest-allowed', event.detail.data.cart.isGuestCheckoutAllowed); 5478 } 5479 if(event.detail.data.customer) { 5480 browserStorage.setItem('paypal-customer-name', event.detail.data.customer.firstname); 5481 } 5482 } 5483 } 5484 5485 window.addEventListener('private-content-loaded', receiveCustomerSpecificPaypalData); 5486 5487</script>
vendor: 1 bytes, line 5487
5487
5488<script type="text/json" id="default-section-data"> 5489 {"messages":[],"customer":[],"compare-products":[],"last-ordered-items":[],"requisition":[],"cart":[],"directory-data":{"AD":{"name":"Andorra"},"AE":{"name":"United Arab Emirates"},"AF":{"name":"Afghanistan"},"AG":{"name":"Antigua & Barbuda"},"AI":{"name":"Anguilla"},"AL":{"name":"Albania","regions":{"715":{"code":"AL-01","name":"Berat"},"718":{"code":"AL-09","name":"Dib\u00ebr"},"721":{"code":"AL-02","name":"Durr\u00ebs"},"724":{"code":"AL-03","name":"Elbasan"},"727":{"code":"AL-04","name":"Fier"},"730":{"code":"AL-05","name":"Gjirokast\u00ebr"},"733":{"code":"AL-06","name":"Kor\u00e7\u00eb"},"736":{"code":"AL-07","name":"Kuk\u00ebs"},"739":{"code":"AL-08","name":"Lezh\u00eb"},"742":{"code":"AL-10","name":"Shkod\u00ebr"},"745":{"code":"AL-11","name":"Tiran\u00eb"},"748":{"code":"AL-12","name":"Vlor\u00eb"}}},"AM":{"name":"Armenia"},"AO":{"name":"Angola"},"AQ":{"name":"Antarctica"},"AR":{"name":"Argentina","regions":{"754":{"code":"AR-B","name":"Buenos Aires"},"757":{"code":"AR-K","name":"Catamarca"},"760":{"code":"AR-H","name":"Chaco"},"763":{"code":"AR-U","name":"Chubut"},"751":{"code":"AR-C","name":"Ciudad Aut\u00f3noma de Buenos Aires"},"766":{"code":"AR-X","name":"C\u00f3rdoba"},"769":{"code":"AR-W","name":"Corrientes"},"772":{"code":"AR-E","name":"Entre R\u00edos"},"775":{"code":"AR-P","name":"Formosa"},"778":{"code":"AR-Y","name":"Jujuy"},"781":{"code":"AR-L","name":"La Pampa"},"784":{"code":"AR-F","name":"La Rioja"},"787":{"code":"AR-M","name":"Mendoza"},"790":{"code":"AR-N","name":"Misiones"},"793":{"code":"AR-Q","name":"Neuqu\u00e9n"},"796":{"code":"AR-R","name":"R\u00edo Negro"},"799":{"code":"AR-A","name":"Salta"},"802":{"code":"AR-J","name":"San Juan"},"805":{"code":"AR-D","name":"San Luis"},"808":{"code":"AR-Z","name":"Santa Cruz"},"811":{"code":"AR-S","name":"Santa Fe"},"814":{"code":"AR-G","name":"Santiago del Estero"},"817":{"code":"AR-V","name":"Tierra del Fuego"},"820":{"code":"AR-T","name":"Tucum\u00e1n"}}},"AS":{"name":"American Samoa"},"AT":{"name":"Austria","regions":{"102":{"code":"BL","name":"Burgenland"},"99":{"code":"KN","name":"K\u00e4rnten"},"96":{"code":"NO","name":"Nieder\u00f6sterreich"},"97":{"code":"OO","name":"Ober\u00f6sterreich"},"98":{"code":"SB","name":"Salzburg"},"100":{"code":"ST","name":"Steiermark"},"101":{"code":"TI","name":"Tirol"},"103":{"code":"VB","name":"Vorarlberg"},"95":{"code":"WI","name":"Wien"}}},"AU":{"name":"Australia","regions":{"692":{"code":"ACT","name":"Australian Capital Territory"},"695":{"code":"NSW","name":"New South Wales"},"713":{"code":"NT","name":"Northern Territory"},"701":{"code":"QLD","name":"Queensland"},"704":{"code":"SA","name":"South Australia"},"707":{"code":"TAS","name":"Tasmania"},"698":{"code":"VIC","name":"Victoria"},"710":{"code":"WA","name":"Western Australia"}}},"AW":{"name":"Aruba"},"AX":{"name":"\u00c5land Islands"},"AZ":{"name":"Azerbaijan"},"BA":{"name":"Bosnia & Herzegovina"},"BB":{"name":"Barbados"},"BD":{"name":"Bangladesh"},"BE":{"name":"Belgium","regions":{"844":{"code":"VAN","name":"Antwerpen"},"847":{"code":"WBR","name":"Brabant wallon"},"850":{"code":"BRU","name":"Brussels-Capital Region"},"853":{"code":"WHT","name":"Hainaut"},"859":{"code":"WLG","name":"Li\u00e8ge"},"856":{"code":"VLI","name":"Limburg"},"862":{"code":"WLX","name":"Luxembourg"},"865":{"code":"WNA","name":"Namur"},"868":{"code":"VOV","name":"Oost-Vlaanderen"},"871":{"code":"VBR","name":"Vlaams-Brabant"},"874":{"code":"VWV","name":"West-Vlaanderen"}}},"BF":{"name":"Burkina Faso"},"BG":{"name":"Bulgaria","regions":{"904":{"code":"BG-01","name":"Blagoevgrad"},"907":{"code":"BG-02","name":"Burgas"},"925":{"code":"BG-08","name":"Dobrich"},"922":{"code":"BG-07","name":"Gabrovo"},"979":{"code":"BG-26","name":"Haskovo"},"928":{"code":"BG-09","name":"Kardzhali"},"931":{"code":"BG-10","name":"Kyustendil"},"934":{"code":"BG-11","name":"Lovech"},"937":{"code":"BG-12","name":"Montana"},"940":{"code":"BG-13","name":"Pazardzhik"},"943":{"code":"BG-14","name":"Pernik"},"946":{"code":"BG-15","name":"Pleven"},"949":{"code":"BG-16","name":"Plovdiv"},"952":{"code":"BG-17","name":"Razgrad"},"955":{"code":"BG-18","name":"Ruse"},"982":{"code":"BG-27","name":"Shumen"},"958":{"code":"BG-19","name":"Silistra"},"961":{"code":"BG-20","name":"Sliven"},"964":{"code":"BG-21","name":"Smolyan"},"967":{"code":"BG-22","name":"Sofia City"},"970":{"code":"BG-23","name":"Sofia Province"},"973":{"code":"BG-24","name":"Stara Zagora"},"976":{"code":"BG-25","name":"Targovishte"},"910":{"code":"BG-03","name":"Varna"},"913":{"code":"BG-04","name":"Veliko Tarnovo"},"916":{"code":"BG-05","name":"Vidin"},"919":{"code":"BG-06","name":"Vratsa"},"985":{"code":"BG-28","name":"Yambol"}}},"BH":{"name":"Bahrain"},"BI":{"name":"Burundi"},"BJ":{"name":"Benin"},"BL":{"name":"St. Barth\u00e9lemy"},"BM":{"name":"Bermuda"},"BN":{"name":"Brunei"}
5489,"BO":{"name":"Bolivia","regions":{"880":{"code":"BO-H","name":"Chuquisaca"},"877":{"code":"BO-C","name":"Cochabamba"},"883":{"code":"BO-B","name":"El Beni"},"886":{"code":"BO-L","name":"La Paz"},"889":{"code":"BO-O","name":"Oruro"},"892":{"code":"BO-N","name":"Pando"},"895":{"code":"BO-P","name":"Potos\u00ed"},"898":{"code":"BO-S","name":"Santa Cruz"},"901":{"code":"BO-T","name":"Tarija"}}},"BR":{"name":"Brazil","regions":{"485":{"code":"AC","name":"Acre"},"486":{"code":"AL","name":"Alagoas"},"487":{"code":"AP","name":"Amap\u00e1"},"488":{"code":"AM","name":"Amazonas"},"489":{"code":"BA","name":"Bahia"},"490":{"code":"CE","name":"Cear\u00e1"},"511":{"code":"DF","name":"Distrito Federal"},"491":{"code":"ES","name":"Esp\u00edrito Santo"},"492":{"code":"GO","name":"Goi\u00e1s"},"493":{"code":"MA","name":"Maranh\u00e3o"},"494":{"code":"MT","name":"Mato Grosso"},"495":{"code":"MS","name":"Mato Grosso do Sul"},"496":{"code":"MG","name":"Minas Gerais"},"497":{"code":"PA","name":"Par\u00e1"},"498":{"code":"PB","name":"Para\u00edba"},"499":{"code":"PR","name":"Paran\u00e1"},"500":{"code":"PE","name":"Pernambuco"},"501":{"code":"PI","name":"Piau\u00ed"},"502":{"code":"RJ","name":"Rio de Janeiro"},"503":{"code":"RN","name":"Rio Grande do Norte"},"504":{"code":"RS","name":"Rio Grande do Sul"},"505":{"code":"RO","name":"Rond\u00f4nia"},"506":{"code":"RR","name":"Roraima"},"507":{"code":"SC","name":"Santa Catarina"},"508":{"code":"SP","name":"S\u00e3o Paulo"},"509":{"code":"SE","name":"Sergipe"},"510":{"code":"TO","name":"Tocantins"}}},"BS":{"name":"Bahamas"},"BT":{"name":"Bhutan"},"BV":{"name":"Bouvet Island"},"BW":{"name":"Botswana"},"BY":{"name":"Belarus","regions":{"823":{"code":"BY-BR","name":"Bresckaja voblas\u0107"},"826":{"code":"BY-HO","name":"Homie\u013askaja voblas\u0107"},"829":{"code":"BY-HM","name":"Horad Minsk"},"832":{"code":"BY-HR","name":"Hrodzienskaja voblas\u0107"},"835":{"code":"BY-MA","name":"Mahilio\u016dskaja voblas\u0107"},"838":{"code":"BY-MI","name":"Minskaja voblas\u0107"},"841":{"code":"BY-VI","name":"Viciebskaja voblas\u0107"}}},"BZ":{"name":"Belize"},"CA":{"name":"Canada","regions":{"66":{"code":"AB","name":"Alberta"},"67":{"code":"BC","name":"British Columbia"},"68":{"code":"MB","name":"Manitoba"},"70":{"code":"NB","name":"New Brunswick"},"69":{"code":"NL","name":"Newfoundland and Labrador"},"72":{"code":"NT","name":"Northwest Territories"},"71":{"code":"NS","name":"Nova Scotia"},"73":{"code":"NU","name":"Nunavut"},"74":{"code":"ON","name":"Ontario"},"75":{"code":"PE","name":"Prince Edward Island"},"76":{"code":"QC","name":"Quebec"},"77":{"code":"SK","name":"Saskatchewan"},"78":{"code":"YT","name":"Yukon Territory"}}},"CC":{"name":"Cocos (Keeling) Islands"},"CD":{"name":"Congo - Kinshasa"},"CF":{"name":"Central African Republic"},"CG":{"name":"Congo - Brazzaville"},"CH":{"name":"Switzerland","regions":{"104":{"code":"AG","name":"Aargau"},"106":{"code":"AR","name":"Appenzell Ausserrhoden"},"105":{"code":"AI","name":"Appenzell Innerrhoden"},"108":{"code":"BL","name":"Basel-Landschaft"},"109":{"code":"BS","name":"Basel-Stadt"},"107":{"code":"BE","name":"Bern"},"110":{"code":"FR","name":"Friburg"},"111":{"code":"GE","name":"Geneva"},"112":{"code":"GL","name":"Glarus"},"113":{"code":"GR","name":"Graub\u00fcnden"},"114":{"code":"JU","name":"Jura"},"115":{"code":"LU","name":"Lucerne"},"116":{"code":"NE","name":"Neuch\u00e2tel"},"117":{"code":"NW","name":"Nidwalden"},"118":{"code":"OW","name":"Obwalden"},"120":{"code":"SH","name":"Schaffhausen"},"122":{"code":"SZ","name":"Schwyz"},"121":{"code":"SO","name":"Solothurn"},"119":{"code":"SG","name":"St. Gallen"},"123":{"code":"TG","name":"Thurgau"},"124":{"code":"TI","name":"Ticino"},"125":{"code":"UR","name":"Uri"},"126":{"code":"VD","name":"Vaud"},"127":{"code":"VS","name":"Wallis"},"128":{"code":"ZG","name":"Zug"},"129":{"code":"ZH","name":"Z\u00fcrich"}}},"CI":{"name":"C\u00f4te d\u2019Ivoire"},"CK":{"name":"Cook Islands"},"CL":{"name":"Chile","regions":{"988":{"code":"CL-AI","name":"Ais\u00e9n del General Carlos Iba\u00f1ez del Campo"},"991":{"code":"CL-AN","name":"Antofagasta"},"994":{"code":"CL-AP","name":"Arica y Parinacota"},"1000":{"code":"CL-AT","name":"Atacama"},"1003":{"code":"CL-BI","name":"Biob\u00edo"},"1006":{"code":"CL-CO","name":"Coquimbo"},"997":{"code":"CL-AR","name":"La Araucan\u00eda"},"1009":{"code":"CL-LI","name":"Libertador General Bernardo O'Higgins"}
5489,"1012":{"code":"CL-LL","name":"Los Lagos"},"1015":{"code":"CL-LR","name":"Los R\u00edos"},"1018":{"code":"CL-MA","name":"Magallanes"},"1021":{"code":"CL-ML","name":"Maule"},"1024":{"code":"CL-NB","name":"\u00d1uble"},"1027":{"code":"CL-RM","name":"Regi\u00f3n Metropolitana de Santiago"},"1030":{"code":"CL-TA","name":"Tarapac\u00e1"},"1033":{"code":"CL-VS","name":"Valpara\u00edso"}}},"CM":{"name":"Cameroon"},"CN":{"name":"China","regions":{"1036":{"code":"CN-AH","name":"Anhui Sheng"},"1039":{"code":"CN-BJ","name":"Beijing Shi"},"1042":{"code":"CN-CQ","name":"Chongqing Shi"},"1045":{"code":"CN-FJ","name":"Fujian Sheng"},"1048":{"code":"CN-GS","name":"Gansu Sheng"},"1051":{"code":"CN-GD","name":"Guangdong Sheng"},"1054":{"code":"CN-GX","name":"Guangxi Zhuangzu Zizhiqu"},"1057":{"code":"CN-GZ","name":"Guizhou Sheng"},"1060":{"code":"CN-HI","name":"Hainan Sheng"},"1063":{"code":"CN-HE","name":"Hebei Sheng"},"1066":{"code":"CN-HL","name":"Heilongjiang Sheng"},"1069":{"code":"CN-HA","name":"Henan Sheng"},"1072":{"code":"CN-HK","name":"Hong Kong SAR"},"1075":{"code":"CN-HB","name":"Hubei Sheng"},"1078":{"code":"CN-HN","name":"Hunan Sheng"},"1081":{"code":"CN-JS","name":"Jiangsu Sheng"},"1084":{"code":"CN-JX","name":"Jiangxi Sheng"},"1087":{"code":"CN-JL","name":"Jilin Sheng"},"1090":{"code":"CN-LN","name":"Liaoning Sheng"},"1093":{"code":"CN-MO","name":"Macao SAR"},"1096":{"code":"CN-NM","name":"Nei Mongol Zizhiqu"},"1099":{"code":"CN-NX","name":"Ningxia Huizi Zizhiqu"},"1102":{"code":"CN-QH","name":"Qinghai Sheng"},"1105":{"code":"CN-SN","name":"Shaanxi Sheng"},"1108":{"code":"CN-SD","name":"Shandong Sheng"},"1111":{"code":"CN-SH","name":"Shanghai Shi"},"1114":{"code":"CN-SX","name":"Shanxi Sheng"},"1117":{"code":"CN-SC","name":"Sichuan Sheng"},"1120":{"code":"CN-TW","name":"Taiwan Sheng"},"1123":{"code":"CN-TJ","name":"Tianjin Shi"},"1126":{"code":"CN-XJ","name":"Xinjiang Uygur Zizhiqu"},"1129":{"code":"CN-XZ","name":"Xizang Zizhiqu"},"1132":{"code":"CN-YN","name":"Yunnan Sheng"},"1135":{"code":"CN-ZJ","name":"Zhejiang Sheng"}}},"CO":{"name":"Colombia","regions":{"1138":{"code":"CO-AMA","name":"Amazonas"},"1141":{"code":"CO-ANT","name":"Antioquia"},"1144":{"code":"CO-ARA","name":"Arauca"},"1147":{"code":"CO-ATL","name":"Atl\u00e1ntico"},"1150":{"code":"CO-BOL","name":"Bol\u00edvar"},"1153":{"code":"CO-BOY","name":"Boyac\u00e1"},"1156":{"code":"CO-CAL","name":"Caldas"},"1159":{"code":"CO-CAQ","name":"Caquet\u00e1"},"1162":{"code":"CO-CAS","name":"Casanare"},"1165":{"code":"CO-CAU","name":"Cauca"},"1168":{"code":"CO-CES","name":"Cesar"},"1171":{"code":"CO-CHO","name":"Choc\u00f3"},"1174":{"code":"CO-COR","name":"C\u00f3rdoba"},"1177":{"code":"CO-CUN","name":"Cundinamarca"},"1180":{"code":"CO-GUA","name":"Guain\u00eda"},"1183":{"code":"CO-GUV","name":"Guaviare"},"1186":{"code":"CO-HUL","name":"Huila"},"1189":{"code":"CO-LAG","name":"La Guajira"},"1192":{"code":"CO-MAG","name":"Magdalena"},"1195":{"code":"CO-MET","name":"Meta"},"1198":{"code":"CO-NAR","name":"Nari\u00f1o"},"1201":{"code":"CO-NSA","name":"Norte de Santander"},"1204":{"code":"CO-PUT","name":"Putumayo"},"1207":{"code":"CO-QUI","name":"Quind\u00edo"},"1210":{"code":"CO-RIS","name":"Risaralda"},"1213":{"code":"CO-SAP","name":"San Andr\u00e9s y Providencia"},"1216":{"code":"CO-SAN","name":"Santander"},"1219":{"code":"CO-SUC","name":"Sucre"},"1222":{"code":"CO-TOL","name":"Tolima"},"1225":{"code":"CO-VAC","name":"Valle del Cauca"},"1228":{"code":"CO-VAU","name":"Vaup\u00e9s"},"1231":{"code":"CO-VID","name":"Vichada"}}},"CR":{"name":"Costa Rica"},"CU":{"name":"Cuba"},"CV":{"name":"Cape Verde"},"CX":{"name":"Christmas Island"},"CY":{"name":"Cyprus"},"CZ":{"name":"Czechia"},"DE":{"name":"Germany","regions":{"80":{"code":"BAW","name":"Baden-W\u00fcrttemberg"},"81":{"code":"BAY","name":"Bayern"},"82":{"code":"BER","name":"Berlin"},"83":{"code":"BRG","name":"Brandenburg"},"84":{"code":"BRE","name":"Bremen"},"85":{"code":"HAM","name":"Hamburg"},"86":{"code":"HES","name":"Hessen"},"87":{"code":"MEC","name":"Mecklenburg-Vorpommern"},"79":{"code":"NDS","name":"Niedersachsen"},"88":{"code":"NRW","name":"Nordrhein-Westfalen"},"89":{"code":"RHE","name":"Rheinland-Pfalz"},"90":{"code":"SAR","name":"Saarland"},"91":{"code":"SAS","name":"Sachsen"},"92":{"code":"SAC","name":"Sachsen-Anhalt"},"93":{"code":"SCN","name":"Schleswig-Holstein"},"94":{"code":"THE","name":"Th\u00fcringen"}}},"DJ":{"name":"Djibouti"},"DK":{"name":"Denmark","regions":{"1234":{"code":"DK-84","name":"Hovedstaden"},"1237":{"code":"DK-82","name":"Midtjylland"},"1240":{"code":"DK-81","name":"Nordjylland"},"1243":{"code":"DK-85","name":"Sj\u00e6lland"},"1246":{"code":"DK-83","name":"Syddanmark"}}},"DM":{"name":"Dominica"}
5489,"DO":{"name":"Dominican Republic"},"DZ":{"name":"Algeria"},"EC":{"name":"Ecuador","regions":{"1249":{"code":"EC-A","name":"Azuay"},"1252":{"code":"EC-B","name":"Bol\u00edvar"},"1255":{"code":"EC-F","name":"Ca\u00f1ar"},"1258":{"code":"EC-C","name":"Carchi"},"1261":{"code":"EC-H","name":"Chimborazo"},"1264":{"code":"EC-X","name":"Cotopaxi"},"1267":{"code":"EC-O","name":"El Oro"},"1270":{"code":"EC-E","name":"Esmeraldas"},"1273":{"code":"EC-W","name":"Gal\u00e1pagos"},"1276":{"code":"EC-G","name":"Guayas"},"1279":{"code":"EC-I","name":"Imbabura"},"1282":{"code":"EC-L","name":"Loja"},"1285":{"code":"EC-R","name":"Los R\u00edos"},"1288":{"code":"EC-M","name":"Manab\u00ed"},"1291":{"code":"EC-S","name":"Morona Santiago"},"1294":{"code":"EC-N","name":"Napo"},"1297":{"code":"EC-D","name":"Orellana"},"1300":{"code":"EC-Y","name":"Pastaza"},"1303":{"code":"EC-P","name":"Pichincha"},"1306":{"code":"EC-SE","name":"Santa Elena"},"1309":{"code":"EC-SD","name":"Santo Domingo de los Ts\u00e1chilas"},"1312":{"code":"EC-U","name":"Sucumb\u00edos"},"1315":{"code":"EC-T","name":"Tungurahua"},"1318":{"code":"EC-Z","name":"Zamora Chinchipe"}}},"EE":{"name":"Estonia","regions":{"340":{"code":"EE-37","name":"Harjumaa"},"341":{"code":"EE-39","name":"Hiiumaa"},"342":{"code":"EE-44","name":"Ida-Virumaa"},"344":{"code":"EE-51","name":"J\u00e4rvamaa"},"343":{"code":"EE-49","name":"J\u00f5gevamaa"},"346":{"code":"EE-59","name":"L\u00e4\u00e4ne-Virumaa"},"345":{"code":"EE-57","name":"L\u00e4\u00e4nemaa"},"348":{"code":"EE-67","name":"P\u00e4rnumaa"},"347":{"code":"EE-65","name":"P\u00f5lvamaa"},"349":{"code":"EE-70","name":"Raplamaa"},"350":{"code":"EE-74","name":"Saaremaa"},"351":{"code":"EE-78","name":"Tartumaa"},"352":{"code":"EE-82","name":"Valgamaa"},"353":{"code":"EE-84","name":"Viljandimaa"},"354":{"code":"EE-86","name":"V\u00f5rumaa"}}},"EG":{"name":"Egypt"},"EH":{"name":"Western Sahara"},"ER":{"name":"Eritrea"},"ES":{"name":"Spain","regions":{"130":{"code":"A Coru\u0441a","name":"A Coru\u00f1a"},"131":{"code":"Alava","name":"Alava"},"132":{"code":"Albacete","name":"Albacete"},"133":{"code":"Alicante","name":"Alicante"},"134":{"code":"Almeria","name":"Almeria"},"135":{"code":"Asturias","name":"Asturias"},"136":{"code":"Avila","name":"Avila"},"137":{"code":"Badajoz","name":"Badajoz"},"138":{"code":"Baleares","name":"Baleares"},"139":{"code":"Barcelona","name":"Barcelona"},"140":{"code":"Burgos","name":"Burgos"},"141":{"code":"Caceres","name":"Caceres"},"142":{"code":"Cadiz","name":"Cadiz"},"143":{"code":"Cantabria","name":"Cantabria"},"144":{"code":"Castellon","name":"Castellon"},"145":{"code":"Ceuta","name":"Ceuta"},"146":{"code":"Ciudad Real","name":"Ciudad Real"},"147":{"code":"Cordoba","name":"Cordoba"},"148":{"code":"Cuenca","name":"Cuenca"},"149":{"code":"Girona","name":"Girona"},"150":{"code":"Granada","name":"Granada"},"151":{"code":"Guadalajara","name":"Guadalajara"},"152":{"code":"Guipuzcoa","name":"Guipuzcoa"},"153":{"code":"Huelva","name":"Huelva"},"154":{"code":"Huesca","name":"Huesca"},"155":{"code":"Jaen","name":"Jaen"},"156":{"code":"La Rioja","name":"La Rioja"},"157":{"code":"Las Palmas","name":"Las Palmas"},"158":{"code":"Leon","name":"Leon"},"159":{"code":"Lleida","name":"Lleida"},"160":{"code":"Lugo","name":"Lugo"},"161":{"code":"Madrid","name":"Madrid"},"162":{"code":"Malaga","name":"Malaga"},"163":{"code":"Melilla","name":"Melilla"},"164":{"code":"Murcia","name":"Murcia"},"165":{"code":"Navarra","name":"Navarra"},"166":{"code":"Ourense","name":"Ourense"},"167":{"code":"Palencia","name":"Palencia"},"168":{"code":"Pontevedra","name":"Pontevedra"},"169":{"code":"Salamanca","name":"Salamanca"},"170":{"code":"Santa Cruz de Tenerife","name":"Santa Cruz de Tenerife"},"171":{"code":"Segovia","name":"Segovia"},"172":{"code":"Sevilla","name":"Sevilla"},"173":{"code":"Soria","name":"Soria"},"174":{"code":"Tarragona","name":"Tarragona"},"175":{"code":"Teruel","name":"Teruel"},"176":{"code":"Toledo","name":"Toledo"},"177":{"code":"Valencia","name":"Valencia"},"178":{"code":"Valladolid","name":"Valladolid"},"179":{"code":"Vizcaya","name":"Vizcaya"},"180":{"code":"Zamora","name":"Zamora"},"181":{"code":"Zaragoza","name":"Zaragoza"}}},"ET":{"name":"Ethiopia"},"FI":{"name":"Finland","regions":{"339":{"code":"Ahvenanmaa","name":"Ahvenanmaa"},"333":{"code":"Etel\u00e4-Karjala","name":"Etel\u00e4-Karjala"},"326":{"code":"Etel\u00e4-Pohjanmaa","name":"Etel\u00e4-Pohjanmaa"},"325":{"code":"Etel\u00e4-Savo","name":"Etel\u00e4-Savo"},"337":{"code":"It\u00e4-Uusimaa","name":"It\u00e4-Uusimaa"},"322":{"code":"Kainuu","name":"Kainuu"},"335":{"code":"Kanta-H\u00e4me","name":"Kanta-H\u00e4me"},"330":{"code":"Keski-Pohjanmaa","name":"Keski-Pohjanmaa"},"331":{"code":"Keski-Suomi","name":"Keski-Suomi"},"338":{"code":"Kymenlaakso","name":"Kymenlaakso"},"320":{"code":"Lappi","name":"Lappi"},"334":{"code":"P\u00e4ij\u00e4t-H\u00e4me","name":"P\u00e4ij\u00e4t-H\u00e4me"},"328":{"code":"Pirkanmaa","name":"Pirkanmaa"},"327":{"code":"Pohjanmaa","name":"Pohjanmaa"},"323":{"code":"Pohjois-Karjala","name":"Pohjois-Karjala"},"321":{"code":"Pohjois-Pohjanmaa","name":"Pohjois-Pohjanmaa"},"324":{"code":"Pohjois-Savo","name":"Pohjois-Savo"},"329":{"code":"Satakunta","name":"Satakunta"},"336":{"code":"Uusimaa","name":"Uusimaa"},"332":{"code":"Varsinais-Suomi","name":"Varsinais-Suomi"}}},"FJ":{"name":"Fiji"},"FK":{"name":"Falkland Islands"},"FM":{"name":"Micronesia"},"FO":{"name":"Faroe Islands"},"FR":{"name":"France","regions":{"182":{"code":"1","name":"Ain"},"183":{"code":"2","name":"Aisne"},"184":{"code":"3","name":"Allier"}
5489,"185":{"code":"4","name":"Alpes-de-Haute-Provence"},"187":{"code":"6","name":"Alpes-Maritimes"},"188":{"code":"7","name":"Ard\u00e8che"},"189":{"code":"8","name":"Ardennes"},"190":{"code":"9","name":"Ari\u00e8ge"},"191":{"code":"10","name":"Aube"},"192":{"code":"11","name":"Aude"},"193":{"code":"12","name":"Aveyron"},"249":{"code":"67","name":"Bas-Rhin"},"194":{"code":"13","name":"Bouches-du-Rh\u00f4ne"},"195":{"code":"14","name":"Calvados"},"196":{"code":"15","name":"Cantal"},"197":{"code":"16","name":"Charente"},"198":{"code":"17","name":"Charente-Maritime"},"199":{"code":"18","name":"Cher"},"200":{"code":"19","name":"Corr\u00e8ze"},"201":{"code":"2A","name":"Corse-du-Sud"},"203":{"code":"21","name":"C\u00f4te-d'Or"},"204":{"code":"22","name":"C\u00f4tes-d'Armor"},"205":{"code":"23","name":"Creuse"},"261":{"code":"79","name":"Deux-S\u00e8vres"},"206":{"code":"24","name":"Dordogne"},"207":{"code":"25","name":"Doubs"},"208":{"code":"26","name":"Dr\u00f4me"},"273":{"code":"91","name":"Essonne"},"209":{"code":"27","name":"Eure"},"210":{"code":"28","name":"Eure-et-Loir"},"211":{"code":"29","name":"Finist\u00e8re"},"212":{"code":"30","name":"Gard"},"214":{"code":"32","name":"Gers"},"215":{"code":"33","name":"Gironde"},"250":{"code":"68","name":"Haut-Rhin"},"202":{"code":"2B","name":"Haute-Corse"},"213":{"code":"31","name":"Haute-Garonne"},"225":{"code":"43","name":"Haute-Loire"},"234":{"code":"52","name":"Haute-Marne"},"252":{"code":"70","name":"Haute-Sa\u00f4ne"},"256":{"code":"74","name":"Haute-Savoie"},"269":{"code":"87","name":"Haute-Vienne"},"186":{"code":"5","name":"Hautes-Alpes"},"247":{"code":"65","name":"Hautes-Pyr\u00e9n\u00e9es"},"274":{"code":"92","name":"Hauts-de-Seine"},"216":{"code":"34","name":"H\u00e9rault"},"217":{"code":"35","name":"Ille-et-Vilaine"},"218":{"code":"36","name":"Indre"},"219":{"code":"37","name":"Indre-et-Loire"},"220":{"code":"38","name":"Is\u00e8re"},"221":{"code":"39","name":"Jura"},"222":{"code":"40","name":"Landes"},"223":{"code":"41","name":"Loir-et-Cher"},"224":{"code":"42","name":"Loire"},"226":{"code":"44","name":"Loire-Atlantique"},"227":{"code":"45","name":"Loiret"},"228":{"code":"46","name":"Lot"},"229":{"code":"47","name":"Lot-et-Garonne"},"230":{"code":"48","name":"Loz\u00e8re"},"231":{"code":"49","name":"Maine-et-Loire"},"232":{"code":"50","name":"Manche"},"233":{"code":"51","name":"Marne"},"235":{"code":"53","name":"Mayenne"},"236":{"code":"54","name":"Meurthe-et-Moselle"},"237":{"code":"55","name":"Meuse"},"238":{"code":"56","name":"Morbihan"},"239":{"code":"57","name":"Moselle"},"240":{"code":"58","name":"Ni\u00e8vre"},"241":{"code":"59","name":"Nord"},"242":{"code":"60","name":"Oise"},"243":{"code":"61","name":"Orne"},"257":{"code":"75","name":"Paris"},"244":{"code":"62","name":"Pas-de-Calais"},"245":{"code":"63","name":"Puy-de-D\u00f4me"},"246":{"code":"64","name":"Pyr\u00e9n\u00e9es-Atlantiques"},"248":{"code":"66","name":"Pyr\u00e9n\u00e9es-Orientales"},"251":{"code":"69","name":"Rh\u00f4ne"},"253":{"code":"71","name":"Sa\u00f4ne-et-Loire"},"254":{"code":"72","name":"Sarthe"},"255":{"code":"73","name":"Savoie"},"259":{"code":"77","name":"Seine-et-Marne"},"258":{"code":"76","name":"Seine-Maritime"},"275":{"code":"93","name":"Seine-Saint-Denis"},"262":{"code":"80","name":"Somme"},"263":{"code":"81","name":"Tarn"},"264":{"code":"82","name":"Tarn-et-Garonne"},"272":{"code":"90","name":"Territoire-de-Belfort"},"277":{"code":"95","name":"Val-d'Oise"},"276":{"code":"94","name":"Val-de-Marne"},"265":{"code":"83","name":"Var"},"266":{"code":"84","name":"Vaucluse"},"267":{"code":"85","name":"Vend\u00e9e"},"268":{"code":"86","name":"Vienne"},"270":{"code":"88","name":"Vosges"},"271":{"code":"89","name":"Yonne"},"260":{"code":"78","name":"Yvelines"}}},"GA":{"name":"Gabon"},"GB":{"name":"United Kingdom"},"GD":{"name":"Grenada"},"GE":{"name":"Georgia"},"GF":{"name":"French Guiana"},"GG":{"name":"Guernsey"},"GH":{"name":"Ghana"},"GI":{"name":"Gibraltar"},"GL":{"name":"Greenland"},"GM":{"name":"Gambia"},"GN":{"name":"Guinea"},"GP":{"name":"Guadeloupe"},"GQ":{"name":"Equatorial Guinea"},"GR":{"name":"Greece","regions":{"1360":{"code":"GR-69","name":"\u00c1gion \u00d3ros"},"1321":{"code":"GR-A","name":"Anatolik\u00ed Makedon\u00eda kai Thr\u00e1ki"},"1324":{"code":"GR-I","name":"Attik\u00ed"},"1327":{"code":"GR-G","name":"Dytik\u00ed Ell\u00e1da"},"1330":{"code":"GR-C","name":"Dytik\u00ed Makedon\u00eda"},"1333":{"code":"GR-F","name":"Ion\u00eda N\u00edsia"},"1336":{"code":"GR-D","name":"\u00cdpeiros"},"1339":{"code":"GR-B","name":"Kentrik\u00ed Makedon\u00eda"},"1342":{"code":"GR-M","name":"Kr\u00edti"},"1345":{"code":"GR-L","name":"N\u00f3tio Aiga\u00edo"},"1348":{"code":"GR-J","name":"Pelop\u00f3nnisos"},"1351":{"code":"GR-H","name":"Stere\u00e1 Ell\u00e1da"}
5489,"1354":{"code":"GR-E","name":"Thessal\u00eda"},"1357":{"code":"GR-K","name":"V\u00f3reio Aiga\u00edo"}}},"GS":{"name":"South Georgia & South Sandwich Islands"},"GT":{"name":"Guatemala"},"GU":{"name":"Guam"},"GW":{"name":"Guinea-Bissau"},"GY":{"name":"Guyana","regions":{"1363":{"code":"GY-BA","name":"Barima-Waini"},"1366":{"code":"GY-CU","name":"Cuyuni-Mazaruni"},"1369":{"code":"GY-DE","name":"Demerara-Mahaica"},"1372":{"code":"GY-EB","name":"East Berbice-Corentyne"},"1375":{"code":"GY-ES","name":"Essequibo Islands-West Demerara"},"1378":{"code":"GY-MA","name":"Mahaica-Berbice"},"1381":{"code":"GY-PM","name":"Pomeroon-Supenaam"},"1384":{"code":"GY-PT","name":"Potaro-Siparuni"},"1387":{"code":"GY-UD","name":"Upper Demerara-Berbice"},"1390":{"code":"GY-UT","name":"Upper Takutu-Upper Essequibo"}}},"HK":{"name":"Hong Kong SAR China"},"HM":{"name":"Heard & McDonald Islands"},"HN":{"name":"Honduras"},"HR":{"name":"Croatia","regions":{"535":{"code":"HR-07","name":"Bjelovarsko-bilogorska \u017eupanija"},"550":{"code":"HR-12","name":"Brodsko-posavska \u017eupanija"},"571":{"code":"HR-19","name":"Dubrova\u010dko-neretvanska \u017eupanija"},"577":{"code":"HR-21","name":"Grad Zagreb"},"568":{"code":"HR-18","name":"Istarska \u017eupanija"},"526":{"code":"HR-04","name":"Karlova\u010dka \u017eupanija"},"532":{"code":"HR-06","name":"Koprivni\u010dko-kri\u017eeva\u010dka \u017eupanija"},"520":{"code":"HR-02","name":"Krapinsko-zagorska \u017eupanija"},"541":{"code":"HR-09","name":"Li\u010dko-senjska \u017eupanija"},"574":{"code":"HR-20","name":"Me\u0111imurska \u017eupanija"},"556":{"code":"HR-14","name":"Osje\u010dko-baranjska \u017eupanija"},"547":{"code":"HR-11","name":"Po\u017ee\u0161ko-slavonska \u017eupanija"},"538":{"code":"HR-08","name":"Primorsko-goranska \u017eupanija"},"559":{"code":"HR-15","name":"\u0160ibensko-kninska \u017eupanija"},"523":{"code":"HR-03","name":"Sisa\u010dko-moslava\u010dka \u017eupanija"},"565":{"code":"HR-17","name":"Splitsko-dalmatinska \u017eupanija"},"529":{"code":"HR-05","name":"Vara\u017edinska \u017eupanija"},"544":{"code":"HR-10","name":"Viroviti\u010dko-podravska \u017eupanija"},"562":{"code":"HR-16","name":"Vukovarsko-srijemska \u017eupanija"},"553":{"code":"HR-13","name":"Zadarska \u017eupanija"},"517":{"code":"HR-01","name":"Zagreba\u010dka \u017eupanija"}}},"HT":{"name":"Haiti"},"HU":{"name":"Hungary"},"ID":{"name":"Indonesia"},"IE":{"name":"Ireland"},"IL":{"name":"Israel"},"IM":{"name":"Isle of Man"},"IN":{"name":"India","regions":{"582":{"code":"AN","name":"Andaman and Nicobar Islands"},"585":{"code":"AP","name":"Andhra Pradesh"},"588":{"code":"AR","name":"Arunachal Pradesh"},"591":{"code":"AS","name":"Assam"},"594":{"code":"BR","name":"Bihar"},"597":{"code":"CH","name":"Chandigarh"},"600":{"code":"CT","name":"Chhattisgarh"},"603":{"code":"DN","name":"Dadra and Nagar Haveli"},"606":{"code":"DD","name":"Daman and Diu"},"609":{"code":"DL","name":"Delhi"},"612":{"code":"GA","name":"Goa"},"615":{"code":"GJ","name":"Gujarat"},"618":{"code":"HR","name":"Haryana"},"621":{"code":"HP","name":"Himachal Pradesh"},"624":{"code":"JK","name":"Jammu and Kashmir"},"627":{"code":"JH","name":"Jharkhand"},"630":{"code":"KA","name":"Karnataka"},"633":{"code":"KL","name":"Kerala"},"636":{"code":"LD","name":"Lakshadweep"},"639":{"code":"MP","name":"Madhya Pradesh"},"642":{"code":"MH","name":"Maharashtra"},"645":{"code":"MN","name":"Manipur"},"648":{"code":"ML","name":"Meghalaya"},"651":{"code":"MZ","name":"Mizoram"},"654":{"code":"NL","name":"Nagaland"},"657":{"code":"OR","name":"Odisha"},"660":{"code":"PY","name":"Puducherry"},"663":{"code":"PB","name":"Punjab"},"666":{"code":"RJ","name":"Rajasthan"},"669":{"code":"SK","name":"Sikkim"},"672":{"code":"TN","name":"Tamil Nadu"},"675":{"code":"TG","name":"Telangana"},"678":{"code":"TR","name":"Tripura"},"681":{"code":"UP","name":"Uttar Pradesh"},"684":{"code":"UT","name":"Uttarakhand"},"687":{"code":"WB","name":"West Bengal"}}},"IO":{"name":"British Indian Ocean Territory"},"IQ":{"name":"Iraq"},"IR":{"name":"Iran"},"IS":{"name":"Iceland","regions":{"1411":{"code":"IS-07","name":"Austurland"},"1393":{"code":"IS-01","name":"H\u00f6fu\u00f0borgarsv\u00e6\u00f0i"},"1408":{"code":"IS-06","name":"Nor\u00f0urland eystra"},"1405":{"code":"IS-05","name":"Nor\u00f0urland vestra"},"1414":{"code":"IS-08","name":"Su\u00f0urland"},"1396":{"code":"IS-02","name":"Su\u00f0urnes"},"1402":{"code":"IS-04","name":"Vestfir\u00f0ir"},"1399":{"code":"IS-03","name":"Vesturland"}}},"IT":{"name":"Italy","regions":{"1417":{"code":"AG","name":"Agrigento"},"1420":{"code":"AL","name":"Alessandria"},"1423":{"code":"AN","name":"Ancona"},"1426":{"code":"AO","name":"Aosta"},"1432":{"code":"AR","name":"Arezzo"},"1435":{"code":"AP","name":"Ascoli-Piceno"},"1438":{"code":"AT","name":"Asti"},"1441":{"code":"AV","name":"Avellino"},"1444":{"code":"BA","name":"Bari"},"1447":{"code":"BT","name":"Barletta-Andria-Trani"},"1450":{"code":"BL","name":"Belluno"},"1453":{"code":"BN","name":"Benevento"},"1456":{"code":"BG","name":"Bergamo"},"1459":{"code":"BI","name":"Biella"},"1462":{"code":"BO","name":"Bologna"},"1465":{"code":"BZ","name":"Bolzano"},"1468":{"code":"BS","name":"Brescia"},"1471":{"code":"BR","name":"Brindisi"},"1474":{"code":"CA","name":"Cagliari"},"1477":{"code":"CL","name":"Caltanissetta"},"1480":{"code":"CB","name":"Campobasso"},"1483":{"code":"CI","name":"Carbonia Iglesias"},"1486":{"code":"CE","name":"Caserta"},"1489":{"code":"CT","name":"Catania"},"1492":{"code":"CZ","name":"Catanzaro"},"1495":{"code":"CH","name":"Chieti"},"1498":{"code":"CO","name":"Como"},"1501":{"code":"CS","name":"Cosenza"},"1504":{"code":"CR","name":"Cremona"},"1507":{"code":"KR","name":"Crotone"},"1510":{"code":"CN","name":"Cuneo"},"1513":{"code":"EN","name":"Enna"},"1516":{"code":"FM","name":"Fermo"},"1519":{"code":"FE","name":"Ferrara"},"1522":{"code":"FI","name":"Firenze"},"1525":{"code":"FG","name":"Foggia"},"1528":{"code":"FC","name":"Forli-Cesena"},"1531":{"code":"FR","name":"Frosinone"},"1534":{"code":"GE","name":"Genova"},"1537":{"code":"GO","name":"Gorizia"},"1540":{"code":"GR","name":"Grosseto"},"1543":{"code":"IM","name":"Imperia"},"1546":{"code":"IS","name":"Isernia"},"1429":{"code":"AQ","name":"L'Aquila"},"1549":{"code":"SP","name":"La-Spezia"},"1552":{"code":"LT","name":"Latina"},"1555":{"code":"LE","name":"Lecce"},"1558":{"code":"LC","name":"Lecco"},"1561":{"code":"LI","name":"Livorno"},"1564":{"code":"LO","name":"Lodi"},"1567":{"code":"LU","name":"Lucca"},"1570":{"code":"MC","name":"Macerata"},"1573":{"code":"MN","name":"Mantova"},"1576":{"code":"MS","name":"Massa-Carrara"}
5489,"1579":{"code":"MT","name":"Matera"},"1582":{"code":"VS","name":"Medio Campidano"},"1585":{"code":"ME","name":"Messina"},"1588":{"code":"MI","name":"Milano"},"1591":{"code":"MO","name":"Modena"},"1594":{"code":"MB","name":"Monza-Brianza"},"1597":{"code":"NA","name":"Napoli"},"1600":{"code":"NO","name":"Novara"},"1603":{"code":"NU","name":"Nuoro"},"1606":{"code":"OG","name":"Ogliastra"},"1609":{"code":"OT","name":"Olbia Tempio"},"1612":{"code":"OR","name":"Oristano"},"1615":{"code":"PD","name":"Padova"},"1618":{"code":"PA","name":"Palermo"},"1621":{"code":"PR","name":"Parma"},"1624":{"code":"PV","name":"Pavia"},"1627":{"code":"PG","name":"Perugia"},"1630":{"code":"PU","name":"Pesaro-Urbino"},"1633":{"code":"PE","name":"Pescara"},"1636":{"code":"PC","name":"Piacenza"},"1639":{"code":"PI","name":"Pisa"},"1642":{"code":"PT","name":"Pistoia"},"1645":{"code":"PN","name":"Pordenone"},"1648":{"code":"PZ","name":"Potenza"},"1651":{"code":"PO","name":"Prato"},"1654":{"code":"RG","name":"Ragusa"},"1657":{"code":"RA","name":"Ravenna"},"1660":{"code":"RC","name":"Reggio-Calabria"},"1663":{"code":"RE","name":"Reggio-Emilia"},"1666":{"code":"RI","name":"Rieti"},"1669":{"code":"RN","name":"Rimini"},"1672":{"code":"RM","name":"Roma"},"1675":{"code":"RO","name":"Rovigo"},"1678":{"code":"SA","name":"Salerno"},"1681":{"code":"SS","name":"Sassari"},"1684":{"code":"SV","name":"Savona"},"1687":{"code":"SI","name":"Siena"},"1690":{"code":"SR","name":"Siracusa"},"1693":{"code":"SO","name":"Sondrio"},"1696":{"code":"TA","name":"Taranto"},"1699":{"code":"TE","name":"Teramo"},"1702":{"code":"TR","name":"Terni"},"1705":{"code":"TO","name":"Torino"},"1708":{"code":"TP","name":"Trapani"},"1711":{"code":"TN","name":"Trento"},"1714":{"code":"TV","name":"Treviso"},"1717":{"code":"TS","name":"Trieste"},"1720":{"code":"UD","name":"Udine"},"1723":{"code":"VA","name":"Varese"},"1726":{"code":"VE","name":"Venezia"},"1729":{"code":"VB","name":"Verbania"},"1732":{"code":"VC","name":"Vercelli"},"1735":{"code":"VR","name":"Verona"},"1738":{"code":"VV","name":"Vibo-Valentia"},"1741":{"code":"VI","name":"Vicenza"},"1744":{"code":"VT","name":"Viterbo"}}},"JE":{"name":"Jersey"},"JM":{"name":"Jamaica"},"JO":{"name":"Jordan"},"JP":{"name":"Japan"},"KE":{"name":"Kenya"},"KG":{"name":"Kyrgyzstan"},"KH":{"name":"Cambodia"},"KI":{"name":"Kiribati"},"KM":{"name":"Comoros"},"KN":{"name":"St. Kitts & Nevis"},"KP":{"name":"North Korea"},"KR":{"name":"South Korea"},"KW":{"name":"Kuwait"},"KY":{"name":"Cayman Islands"},"KZ":{"name":"Kazakhstan"},"LA":{"name":"Laos"},"LB":{"name":"Lebanon"},"LC":{"name":"St. Lucia"},"LI":{"name":"Liechtenstein"},"LK":{"name":"Sri Lanka"},"LR":{"name":"Liberia"},"LS":{"name":"Lesotho"},"LT":{"name":"Lithuania","regions":{"475":{"code":"LT-AL","name":"Alytaus Apskritis"},"476":{"code":"LT-KU","name":"Kauno Apskritis"},"477":{"code":"LT-KL","name":"Klaip\u0117dos Apskritis"},"478":{"code":"LT-MR","name":"Marijampol\u0117s Apskritis"},"479":{"code":"LT-PN","name":"Panev\u0117\u017eio Apskritis"},"480":{"code":"LT-SA","name":"\u0160iauli\u0173 Apskritis"},"481":{"code":"LT-TA","name":"Taurag\u0117s Apskritis"},"482":{"code":"LT-TE","name":"Tel\u0161i\u0173 Apskritis"},"483":{"code":"LT-UT","name":"Utenos Apskritis"},"484":{"code":"LT-VL","name":"Vilniaus Apskritis"}}},"LU":{"name":"Luxembourg"},"LV":{"name":"Latvia","regions":{"471":{"code":"\u0100da\u017eu novads","name":"\u0100da\u017eu novads"},"366":{"code":"Aglonas novads","name":"Aglonas novads"},"367":{"code":"LV-AI","name":"Aizkraukles novads"},"368":{"code":"Aizputes novads","name":"Aizputes novads"},"369":{"code":"Akn\u012bstes novads","name":"Akn\u012bstes novads"},"370":{"code":"Alojas novads","name":"Alojas novads"},"371":{"code":"Alsungas novads","name":"Alsungas novads"},"372":{"code":"LV-AL","name":"Al\u016bksnes novads"},"373":{"code":"Amatas novads","name":"Amatas novads"},"374":{"code":"Apes novads","name":"Apes novads"},"375":{"code":"Auces novads","name":"Auces novads"},"376":{"code":"Bab\u012btes novads","name":"Bab\u012btes novads"},"377":{"code":"Baldones novads","name":"Baldones novads"},"378":{"code":"Baltinavas novads","name":"Baltinavas novads"},"379":{"code":"LV-BL","name":"Balvu novads"},"380":{"code":"LV-BU","name":"Bauskas novads"},"381":{"code":"Bever\u012bnas novads","name":"Bever\u012bnas novads"},"382":{"code":"Broc\u0113nu novads","name":"Broc\u0113nu novads"},"383":{"code":"Burtnieku novads","name":"Burtnieku novads"},"384":{"code":"Carnikavas novads","name":"Carnikavas novads"},"387":{"code":"LV-CE","name":"C\u0113su novads"},"385":{"code":"Cesvaines novads","name":"Cesvaines novads"},"386":{"code":"Ciblas novads","name":"Ciblas novads"},"388":{"code":"Dagdas novads","name":"Dagdas novads"},"355":{"code":"LV-DGV","name":"Daugavpils"},"389":{"code":"LV-DA","name":"Daugavpils novads"},"390":{"code":"LV-DO","name":"Dobeles novads"},"391":{"code":"Dundagas novads","name":"Dundagas novads"},"392":{"code":"Durbes novads","name":"Durbes novads"},"393":{"code":"Engures novads","name":"Engures novads"},"472":{"code":"\u0112rg\u013cu novads","name":"\u0112rg\u013cu novads"},"394":{"code":"Garkalnes novads","name":"Garkalnes novads"},"395":{"code":"Grobi\u0146as novads","name":"Grobi\u0146as novads"},"396":{"code":"LV-GU","name":"Gulbenes novads"},"397":{"code":"Iecavas novads","name":"Iecavas novads"},"398":{"code":"Ik\u0161\u0137iles novads","name":"Ik\u0161\u0137iles novads"},"399":{"code":"Il\u016bkstes novads","name":"Il\u016bkstes novads"},"400":{"code":"In\u010dukalna novads","name":"In\u010dukalna novads"},"401":{"code":"Jaunjelgavas novads","name":"Jaunjelgavas novads"},"402":{"code":"Jaunpiebalgas novads","name":"Jaunpiebalgas novads"},"403":{"code":"Jaunpils novads","name":"Jaunpils novads"},"357":{"code":"J\u0113kabpils","name":"J\u0113kabpils"},"405":{"code":"LV-JK","name":"J\u0113kabpils novads"},"356":{"code":"LV-JEL","name":"Jelgava"}
5489,"404":{"code":"LV-JL","name":"Jelgavas novads"},"358":{"code":"LV-JUR","name":"J\u016brmala"},"406":{"code":"Kandavas novads","name":"Kandavas novads"},"412":{"code":"K\u0101rsavas novads","name":"K\u0101rsavas novads"},"473":{"code":"\u0136eguma novads","name":"\u0136eguma novads"},"474":{"code":"\u0136ekavas novads","name":"\u0136ekavas novads"},"407":{"code":"Kokneses novads","name":"Kokneses novads"},"410":{"code":"LV-KR","name":"Kr\u0101slavas novads"},"408":{"code":"Krimuldas novads","name":"Krimuldas novads"},"409":{"code":"Krustpils novads","name":"Krustpils novads"},"411":{"code":"LV-KU","name":"Kuld\u012bgas novads"},"413":{"code":"Lielv\u0101rdes novads","name":"Lielv\u0101rdes novads"},"359":{"code":"LV-LPX","name":"Liep\u0101ja"},"360":{"code":"LV-LE","name":"Liep\u0101jas novads"},"417":{"code":"L\u012bgatnes novads","name":"L\u012bgatnes novads"},"414":{"code":"LV-LM","name":"Limba\u017eu novads"},"418":{"code":"L\u012bv\u0101nu novads","name":"L\u012bv\u0101nu novads"},"415":{"code":"Lub\u0101nas novads","name":"Lub\u0101nas novads"},"416":{"code":"LV-LU","name":"Ludzas novads"},"419":{"code":"LV-MA","name":"Madonas novads"},"421":{"code":"M\u0101lpils novads","name":"M\u0101lpils novads"},"422":{"code":"M\u0101rupes novads","name":"M\u0101rupes novads"},"420":{"code":"Mazsalacas novads","name":"Mazsalacas novads"},"423":{"code":"Nauk\u0161\u0113nu novads","name":"Nauk\u0161\u0113nu novads"},"424":{"code":"Neretas novads","name":"Neretas novads"},"425":{"code":"N\u012bcas novads","name":"N\u012bcas novads"},"426":{"code":"LV-OG","name":"Ogres novads"},"427":{"code":"Olaines novads","name":"Olaines novads"},"428":{"code":"Ozolnieku novads","name":"Ozolnieku novads"},"432":{"code":"P\u0101rgaujas novads","name":"P\u0101rgaujas novads"},"433":{"code":"P\u0101vilostas novads","name":"P\u0101vilostas novads"},"434":{"code":"P\u013cavi\u0146u novads","name":"P\u013cavi\u0146u novads"},"429":{"code":"LV-PR","name":"Prei\u013cu novads"},"430":{"code":"Priekules novads","name":"Priekules novads"},"431":{"code":"Prieku\u013cu novads","name":"Prieku\u013cu novads"},"435":{"code":"Raunas novads","name":"Raunas novads"},"361":{"code":"LV-REZ","name":"R\u0113zekne"},"442":{"code":"LV-RE","name":"R\u0113zeknes novads"},"436":{"code":"Riebi\u0146u novads","name":"Riebi\u0146u novads"},"362":{"code":"LV-RIX","name":"R\u012bga"},"363":{"code":"LV-RI","name":"R\u012bgas novads"},"437":{"code":"Rojas novads","name":"Rojas novads"},"438":{"code":"Ropa\u017eu novads","name":"Ropa\u017eu novads"},"439":{"code":"Rucavas novads","name":"Rucavas novads"},"440":{"code":"Rug\u0101ju novads","name":"Rug\u0101ju novads"},"443":{"code":"R\u016bjienas novads","name":"R\u016bjienas novads"},"441":{"code":"Rund\u0101les novads","name":"Rund\u0101les novads"},"444":{"code":"Salacgr\u012bvas novads","name":"Salacgr\u012bvas novads"},"445":{"code":"Salas novads","name":"Salas novads"},"446":{"code":"Salaspils novads","name":"Salaspils novads"},"447":{"code":"LV-SA","name":"Saldus novads"},"448":{"code":"Saulkrastu novads","name":"Saulkrastu novads"},"455":{"code":"S\u0113jas novads","name":"S\u0113jas novads"},"449":{"code":"Siguldas novads","name":"Siguldas novads"},"451":{"code":"Skr\u012bveru novads","name":"Skr\u012bveru novads"},"450":{"code":"Skrundas novads","name":"Skrundas novads"},"452":{"code":"Smiltenes novads","name":"Smiltenes novads"},"453":{"code":"Stopi\u0146u novads","name":"Stopi\u0146u novads"},"454":{"code":"Stren\u010du novads","name":"Stren\u010du novads"},"456":{"code":"LV-TA","name":"Talsu novads"},"458":{"code":"T\u0113rvetes novads","name":"T\u0113rvetes novads"},"457":{"code":"LV-TU","name":"Tukuma novads"},"459":{"code":"Vai\u0146odes novads","name":"Vai\u0146odes novads"},"460":{"code":"LV-VK","name":"Valkas novads"},"364":{"code":"Valmiera","name":"Valmiera"},"461":{"code":"LV-VM","name":"Valmieras novads"},"462":{"code":"Varak\u013c\u0101nu novads","name":"Varak\u013c\u0101nu novads"},"469":{"code":"V\u0101rkavas novads","name":"V\u0101rkavas novads"},"463":{"code":"Vecpiebalgas novads","name":"Vecpiebalgas novads"},"464":{"code":"Vecumnieku novads","name":"Vecumnieku novads"},"365":{"code":"LV-VEN","name":"Ventspils"},"465":{"code":"LV-VE","name":"Ventspils novads"},"466":{"code":"Vies\u012btes novads","name":"Vies\u012btes novads"},"467":{"code":"Vi\u013cakas novads","name":"Vi\u013cakas novads"},"468":{"code":"Vi\u013c\u0101nu novads","name":"Vi\u013c\u0101nu novads"},"470":{"code":"Zilupes novads","name":"Zilupes novads"}}},"LY":{"name":"Libya"},"MA":{"name":"Morocco"},"MC":{"name":"Monaco"},"MD":{"name":"Moldova"},"ME":{"name":"Montenegro"},"MF":{"name":"St. Martin"},"MG":{"name":"Madagascar"},"MH":{"name":"Marshall Islands"},"MK":{"name":"North Macedonia"},"ML":{"name":"Mali"},"MM":{"name":"Myanmar (Burma)"},"MN":{"name":"Mongolia"}
5489,"MO":{"name":"Macao SAR China"},"MP":{"name":"Northern Mariana Islands"},"MQ":{"name":"Martinique"},"MR":{"name":"Mauritania"},"MS":{"name":"Montserrat"},"MT":{"name":"Malta"},"MU":{"name":"Mauritius"},"MV":{"name":"Maldives"},"MW":{"name":"Malawi"},"MX":{"name":"Mexico","regions":{"1747":{"code":"AGU","name":"Aguascalientes"},"1750":{"code":"BCN","name":"Baja California"},"1753":{"code":"BCS","name":"Baja California Sur"},"1756":{"code":"CAM","name":"Campeche"},"1759":{"code":"CHP","name":"Chiapas"},"1762":{"code":"CHH","name":"Chihuahua"},"1765":{"code":"CMX","name":"Ciudad de M\u00e9xico"},"1768":{"code":"COA","name":"Coahuila"},"1771":{"code":"COL","name":"Colima"},"1774":{"code":"DUR","name":"Durango"},"1777":{"code":"MEX","name":"Estado de M\u00e9xico"},"1780":{"code":"GUA","name":"Guanajuato"},"1783":{"code":"GRO","name":"Guerrero"},"1786":{"code":"HID","name":"Hidalgo"},"1789":{"code":"JAL","name":"Jalisco"},"1792":{"code":"MIC","name":"Michoac\u00e1n"},"1795":{"code":"MOR","name":"Morelos"},"1798":{"code":"NAY","name":"Nayarit"},"1801":{"code":"NLE","name":"Nuevo Le\u00f3n"},"1804":{"code":"OAX","name":"Oaxaca"},"1807":{"code":"PUE","name":"Puebla"},"1810":{"code":"QUE","name":"Quer\u00e9taro"},"1813":{"code":"ROO","name":"Quintana Roo"},"1816":{"code":"SLP","name":"San Luis Potos\u00ed"},"1819":{"code":"SIN","name":"Sinaloa"},"1822":{"code":"SON","name":"Sonora"},"1825":{"code":"TAB","name":"Tabasco"},"1828":{"code":"TAM","name":"Tamaulipas"},"1831":{"code":"TLA","name":"Tlaxcala"},"1834":{"code":"VER","name":"Veracruz"},"1837":{"code":"YUC","name":"Yucat\u00e1n"},"1840":{"code":"ZAC","name":"Zacatecas"}}},"MY":{"name":"Malaysia"},"MZ":{"name":"Mozambique"},"NA":{"name":"Namibia"},"NC":{"name":"New Caledonia"},"NE":{"name":"Niger"},"NF":{"name":"Norfolk Island"},"NG":{"name":"Nigeria"},"NI":{"name":"Nicaragua"},"NL":{"name":"Netherlands"},"NO":{"name":"Norway"},"NP":{"name":"Nepal"},"NR":{"name":"Nauru"},"NU":{"name":"Niue"},"NZ":{"name":"New Zealand"},"OM":{"name":"Oman"},"PA":{"name":"Panama"},"PE":{"name":"Peru","regions":{"1900":{"code":"PE-AMA","name":"Amazonas"},"1903":{"code":"PE-ANC","name":"Ancash"},"1906":{"code":"PE-APU","name":"Apur\u00edmac"},"1909":{"code":"PE-ARE","name":"Arequipa"},"1912":{"code":"PE-AYA","name":"Ayacucho"},"1915":{"code":"PE-CAJ","name":"Cajamarca"},"1918":{"code":"PE-CUS","name":"Cusco"},"1921":{"code":"PE-CAL","name":"El Callao"},"1924":{"code":"PE-HUV","name":"Huancavelica"},"1927":{"code":"PE-HUC","name":"Hu\u00e1nuco"},"1930":{"code":"PE-ICA","name":"Ica"},"1933":{"code":"PE-JUN","name":"Jun\u00edn"},"1936":{"code":"PE-LAL","name":"La Libertad"},"1939":{"code":"PE-LAM","name":"Lambayeque"},"1942":{"code":"PE-LIM","name":"Lima"},"1945":{"code":"PE-LOR","name":"Loreto"},"1948":{"code":"PE-MDD","name":"Madre de Dios"},"1951":{"code":"PE-MOQ","name":"Moquegua"},"1897":{"code":"PE-LMA","name":"Municipalidad Metropolitana de Lima"},"1954":{"code":"PE-PAS","name":"Pasco"}
5489,"1957":{"code":"PE-PIU","name":"Piura"},"1960":{"code":"PE-PUN","name":"Puno"},"1963":{"code":"PE-SAM","name":"San Mart\u00edn"},"1966":{"code":"PE-TAC","name":"Tacna"},"1969":{"code":"PE-TUM","name":"Tumbes"},"1972":{"code":"PE-UCA","name":"Ucayali"}}},"PF":{"name":"French Polynesia"},"PG":{"name":"Papua New Guinea"},"PH":{"name":"Philippines"},"PK":{"name":"Pakistan"},"PL":{"name":"Poland","regions":{"1975":{"code":"PL-02","name":"dolno\u015bl\u0105skie"},"1978":{"code":"PL-04","name":"kujawsko-pomorskie"},"1981":{"code":"PL-06","name":"lubelskie"},"1984":{"code":"PL-08","name":"lubuskie"},"1993":{"code":"PL-14","name":"mazowieckie"},"1990":{"code":"PL-12","name":"ma\u0142opolskie"},"1996":{"code":"PL-16","name":"opolskie"},"1999":{"code":"PL-18","name":"podkarpackie"},"2002":{"code":"PL-20","name":"podlaskie"},"2005":{"code":"PL-22","name":"pomorskie"},"2008":{"code":"PL-24","name":"\u015bl\u0105skie"},"2011":{"code":"PL-26","name":"\u015bwi\u0119tokrzyskie"},"2014":{"code":"PL-28","name":"warmi\u0144sko-mazurskie"},"2017":{"code":"PL-30","name":"wielkopolskie"},"2020":{"code":"PL-32","name":"zachodniopomorskie"},"1987":{"code":"PL-10","name":"\u0142\u00f3dzkie"}}},"PM":{"name":"St. Pierre & Miquelon"},"PN":{"name":"Pitcairn Islands"},"PS":{"name":"Palestinian Territories"},"PT":{"name":"Portugal","regions":{"2023":{"code":"PT-01","name":"Aveiro"},"2026":{"code":"PT-02","name":"Beja"},"2029":{"code":"PT-03","name":"Braga"},"2032":{"code":"PT-04","name":"Bragan\u00e7a"},"2035":{"code":"PT-05","name":"Castelo Branco"},"2038":{"code":"PT-06","name":"Coimbra"},"2041":{"code":"PT-07","name":"\u00c9vora"},"2044":{"code":"PT-08","name":"Faro"},"2047":{"code":"PT-09","name":"Guarda"},"2050":{"code":"PT-10","name":"Leiria"},"2053":{"code":"PT-11","name":"Lisboa"},"2056":{"code":"PT-12","name":"Portalegre"},"2059":{"code":"PT-13","name":"Porto"},"2080":{"code":"PT-30","name":"Regi\u00e3o Aut\u00f3noma da Madeira"},"2077":{"code":"PT-20","name":"Regi\u00e3o Aut\u00f3noma dos A\u00e7ores"},"2062":{"code":"PT-14","name":"Santar\u00e9m"},"2065":{"code":"PT-15","name":"Set\u00fabal"},"2068":{"code":"PT-16","name":"Viana do Castelo"},"2071":{"code":"PT-17","name":"Vila Real"},"2074":{"code":"PT-18","name":"Viseu"}}},"PW":{"name":"Palau"},"PY":{"name":"Paraguay","regions":{"1846":{"code":"PY-16","name":"Alto Paraguay"},"1849":{"code":"PY-10","name":"Alto Paran\u00e1"},"1852":{"code":"PY-13","name":"Amambay"},"1843":{"code":"PY-ASU","name":"Asunci\u00f3n"},"1855":{"code":"PY-19","name":"Boquer\u00f3n"},"1858":{"code":"PY-5","name":"Caaguaz\u00fa"},"1861":{"code":"PY-6","name":"Caazap\u00e1"},"1864":{"code":"PY-14","name":"Canindey\u00fa"},"1867":{"code":"PY-11","name":"Central"},"1870":{"code":"PY-1","name":"Concepci\u00f3n"},"1873":{"code":"PY-3","name":"Cordillera"},"1876":{"code":"PY-4","name":"Guair\u00e1"},"1879":{"code":"PY-7","name":"Itap\u00faa"},"1882":{"code":"PY-8","name":"Misiones"},"1885":{"code":"PY-12","name":"\u00d1eembuc\u00fa"},"1888":{"code":"PY-9","name":"Paraguar\u00ed"},"1891":{"code":"PY-15","name":"Presidente Hayes"},"1894":{"code":"PY-2","name":"San Pedro"}}},"QA":{"name":"Qatar"},"RE":{"name":"R\u00e9union"},"RO":{"name":"Romania","regions":{"278":{"code":"AB","name":"Alba"},"279":{"code":"AR","name":"Arad"},"280":{"code":"AG","name":"Arge\u015f"},"281":{"code":"BC","name":"Bac\u0103u"},"282":{"code":"BH","name":"Bihor"},"283":{"code":"BN","name":"Bistri\u0163a-N\u0103s\u0103ud"},"284":{"code":"BT","name":"Boto\u015fani"},"286":{"code":"BR","name":"Br\u0103ila"},"285":{"code":"BV","name":"Bra\u015fov"},"287":{"code":"B","name":"Bucure\u015fti"},"288":{"code":"BZ","name":"Buz\u0103u"},"290":{"code":"CL","name":"C\u0103l\u0103ra\u015fi"},"289":{"code":"CS","name":"Cara\u015f-Severin"},"291":{"code":"CJ","name":"Cluj"},"292":{"code":"CT","name":"Constan\u0163a"},"293":{"code":"CV","name":"Covasna"},"294":{"code":"DB","name":"D\u00e2mbovi\u0163a"},"295":{"code":"DJ","name":"Dolj"},"296":{"code":"GL","name":"Gala\u0163i"},"297":{"code":"GR","name":"Giurgiu"},"298":{"code":"GJ","name":"Gorj"},"299":{"code":"HR","name":"Harghita"},"300":{"code":"HD","name":"Hunedoara"},"301":{"code":"IL","name":"Ialomi\u0163a"},"302":{"code":"IS","name":"Ia\u015fi"},"303":{"code":"IF","name":"Ilfov"},"304":{"code":"MM","name":"Maramure\u015f"},"305":{"code":"MH","name":"Mehedin\u0163i"},"306":{"code":"MS","name":"Mure\u015f"},"307":{"code":"NT","name":"Neam\u0163"},"308":{"code":"OT","name":"Olt"},"309":{"code":"PH","name":"Prahova"},"311":{"code":"SJ","name":"S\u0103laj"},"310":{"code":"SM","name":"Satu-Mare"},"312":{"code":"SB","name":"Sibiu"},"313":{"code":"SV","name":"Suceava"},"314":{"code":"TR","name":"Teleorman"},"315":{"code":"TM","name":"Timi\u015f"},"316":{"code":"TL","name":"Tulcea"},"318":{"code":"VL","name":"V\u00e2lcea"},"317":{"code":"VS","name":"Vaslui"},"319":{"code":"VN","name":"Vrancea"}}},"RS":{"name":"Serbia"},"RU":{"name":"Russia"},"RW":{"name":"Rwanda"},"SA":{"name":"Saudi Arabia"},"SB":{"name":"Solomon Islands"},"SC":{"name":"Seychelles"},"SD":{"name":"Sudan"},"SE":{"name":"Sweden","regions":{"2113":{"code":"SE-K","name":"Blekinge l\u00e4n"}
5489,"2116":{"code":"SE-W","name":"Dalarnas l\u00e4n"},"2122":{"code":"SE-X","name":"G\u00e4vleborgs l\u00e4n"},"2119":{"code":"SE-I","name":"Gotlands l\u00e4n"},"2125":{"code":"SE-N","name":"Hallands l\u00e4n"},"2128":{"code":"SE-Z","name":"J\u00e4mtlands l\u00e4n"},"2131":{"code":"SE-F","name":"J\u00f6nk\u00f6pings l\u00e4n"},"2134":{"code":"SE-H","name":"Kalmar l\u00e4n"},"2137":{"code":"SE-G","name":"Kronobergs l\u00e4n"},"2140":{"code":"SE-BD","name":"Norrbottens l\u00e4n"},"2170":{"code":"SE-T","name":"\u00d6rebro l\u00e4n"},"2173":{"code":"SE-E","name":"\u00d6sterg\u00f6tlands l\u00e4n"},"2143":{"code":"SE-M","name":"Sk\u00e5ne l\u00e4n"},"2149":{"code":"SE-D","name":"S\u00f6dermanlands l\u00e4n"},"2146":{"code":"SE-AB","name":"Stockholms l\u00e4n"},"2152":{"code":"SE-C","name":"Uppsala l\u00e4n"},"2155":{"code":"SE-S","name":"V\u00e4rmlands l\u00e4n"},"2158":{"code":"SE-AC","name":"V\u00e4sterbottens l\u00e4n"},"2161":{"code":"SE-Y","name":"V\u00e4sternorrlands l\u00e4n"},"2164":{"code":"SE-U","name":"V\u00e4stmanlands l\u00e4n"},"2167":{"code":"SE-O","name":"V\u00e4stra G\u00f6talands l\u00e4n"}}},"SG":{"name":"Singapore"},"SH":{"name":"St. Helena"},"SI":{"name":"Slovenia"},"SJ":{"name":"Svalbard & Jan Mayen"},"SK":{"name":"Slovakia"},"SL":{"name":"Sierra Leone"},"SM":{"name":"San Marino"},"SN":{"name":"Senegal"},"SO":{"name":"Somalia"},"SR":{"name":"Suriname","regions":{"2083":{"code":"SR-BR","name":"Brokopondo"},"2086":{"code":"SR-CM","name":"Commewijne"},"2089":{"code":"SR-CR","name":"Coronie"},"2092":{"code":"SR-MA","name":"Marowijne"},"2095":{"code":"SR-NI","name":"Nickerie"},"2098":{"code":"SR-PR","name":"Para"},"2101":{"code":"SR-PM","name":"Paramaribo"},"2104":{"code":"SR-SA","name":"Saramacca"},"2107":{"code":"SR-SI","name":"Sipaliwini"},"2110":{"code":"SR-WA","name":"Wanica"}}},"ST":{"name":"S\u00e3o Tom\u00e9 & Pr\u00edncipe"},"SV":{"name":"El Salvador"},"SY":{"name":"Syria"},"SZ":{"name":"Eswatini"},"TC":{"name":"Turks & Caicos Islands"},"TD":{"name":"Chad"},"TF":{"name":"French Southern Territories"},"TG":{"name":"Togo"},"TH":{"name":"Thailand"},"TJ":{"name":"Tajikistan"},"TK":{"name":"Tokelau"},"TL":{"name":"Timor-Leste"},"TM":{"name":"Turkmenistan"},"TN":{"name":"Tunisia"},"TO":{"name":"Tonga"},"TR":{"name":"Turkey"},"TT":{"name":"Trinidad & Tobago"},"TV":{"name":"Tuvalu"},"TW":{"name":"Taiwan, Province of China"},"TZ":{"name":"Tanzania"},"UA":{"name":"Ukraine"},"UG":{"name":"Uganda"},"UM":{"name":"U.S. Outlying Islands"},"US":{"name":"United States","regions":{"1":{"code":"AL","name":"Alabama"},"2":{"code":"AK","name":"Alaska"},"3":{"code":"AS","name":"American Samoa"},"4":{"code":"AZ","name":"Arizona"},"5":{"code":"AR","name":"Arkansas"},"6":{"code":"AE","name":"Armed Forces Africa"},"7":{"code":"AA","name":"Armed Forces Americas"},"8":{"code":"AE","name":"Armed Forces Canada"},"9":{"code":"AE","name":"Armed Forces Europe"},"10":{"code":"AE","name":"Armed Forces Middle East"},"11":{"code":"AP","name":"Armed Forces Pacific"},"12":{"code":"CA","name":"California"},"13":{"code":"CO","name":"Colorado"},"14":{"code":"CT","name":"Connecticut"},"15":{"code":"DE","name":"Delaware"},"16":{"code":"DC","name":"District of Columbia"},"17":{"code":"FM","name":"Federated States Of Micronesia"},"18":{"code":"FL","name":"Florida"},"19":{"code":"GA","name":"Georgia"},"20":{"code":"GU","name":"Guam"},"21":{"code":"HI","name":"Hawaii"},"22":{"code":"ID","name":"Idaho"},"23":{"code":"IL","name":"Illinois"},"24":{"code":"IN","name":"Indiana"},"25":{"code":"IA","name":"Iowa"},"26":{"code":"KS","name":"Kansas"},"27":{"code":"KY","name":"Kentucky"},"28":{"code":"LA","name":"Louisiana"},"29":{"code":"ME","name":"Maine"},"30":{"code":"MH","name":"Marshall Islands"},"31":{"code":"MD","name":"Maryland"},"32":{"code":"MA","name":"Massachusetts"},"33":{"code":"MI","name":"Michigan"},"34":{"code":"MN","name":"Minnesota"},"35":{"code":"MS","name":"Mississippi"},"36":{"code":"MO","name":"Missouri"},"37":{"code":"MT","name":"Montana"},"38":{"code":"NE","name":"Nebraska"},"39":{"code":"NV","name":"Nevada"},"40":{"code":"NH","name":"New Hampshire"},"41":{"code":"NJ","name":"New Jersey"},"42":{"code":"NM","name":"New Mexico"},"43":{"code":"NY","name":"New York"},"44":{"code":"NC","name":"North Carolina"},"45":{"code":"ND","name":"North Dakota"},"46":{"code":"MP","name":"Northern Mariana Islands"},"47":{"code":"OH","name":"Ohio"},"48":{"code":"OK","name":"Oklahoma"},"49":{"code":"OR","name":"Oregon"},"50":{"code":"PW","name":"Palau"},"51":{"code":"PA","name":"Pennsylvania"},"52":{"code":"PR","name":"Puerto Rico"},"53":{"code":"RI","name":"Rhode Island"},"54":{"code":"SC","name":"South Carolina"},"55":{"code":"SD","name":"South Dakota"},"56":{"code":"TN","name":"Tennessee"},"57":{"code":"TX","name":"Texas"}
5489,"58":{"code":"UT","name":"Utah"},"59":{"code":"VT","name":"Vermont"},"60":{"code":"VI","name":"Virgin Islands"},"61":{"code":"VA","name":"Virginia"},"62":{"code":"WA","name":"Washington"},"63":{"code":"WV","name":"West Virginia"},"64":{"code":"WI","name":"Wisconsin"},"65":{"code":"WY","name":"Wyoming"}}},"UY":{"name":"Uruguay","regions":{"2176":{"code":"UY-AR","name":"Artigas"},"2179":{"code":"UY-CA","name":"Canelones"},"2182":{"code":"UY-CL","name":"Cerro Largo"},"2185":{"code":"UY-CO","name":"Colonia"},"2188":{"code":"UY-DU","name":"Durazno"},"2191":{"code":"UY-FS","name":"Flores"},"2194":{"code":"UY-FD","name":"Florida"},"2197":{"code":"UY-LA","name":"Lavalleja"},"2200":{"code":"UY-MA","name":"Maldonado"},"2203":{"code":"UY-MO","name":"Montevideo"},"2206":{"code":"UY-PA","name":"Paysandu"},"2209":{"code":"UY-RN","name":"R\u00edo Negro"},"2212":{"code":"UY-RV","name":"Rivera"},"2215":{"code":"UY-RO","name":"Rocha"},"2218":{"code":"UY-SA","name":"Salto"},"2221":{"code":"UY-SJ","name":"San Jos\u00e9"},"2224":{"code":"UY-SO","name":"Soriano"},"2227":{"code":"UY-TA","name":"Tacuaremb\u00f3"},"2230":{"code":"UY-TT","name":"Treinta y Tres"}}},"UZ":{"name":"Uzbekistan"},"VA":{"name":"Vatican City"},"VC":{"name":"St. Vincent & Grenadines"},"VE":{"name":"Venezuela","regions":{"2239":{"code":"VE-Z","name":"Amazonas"},"2242":{"code":"VE-B","name":"Anzo\u00e1tegui"},"2245":{"code":"VE-C","name":"Apure"},"2248":{"code":"VE-D","name":"Aragua"},"2251":{"code":"VE-E","name":"Barinas"},"2254":{"code":"VE-F","name":"Bol\u00edvar"},"2257":{"code":"VE-G","name":"Carabobo"},"2260":{"code":"VE-H","name":"Cojedes"},"2263":{"code":"VE-Y","name":"Delta Amacuro"},"2233":{"code":"VE-W","name":"Dependencias Federales"},"2236":{"code":"VE-A","name":"Distrito Capital"},"2266":{"code":"VE-I","name":"Falc\u00f3n"},"2269":{"code":"VE-J","name":"Gu\u00e1rico"},"2272":{"code":"VE-K","name":"Lara"},"2275":{"code":"VE-L","name":"M\u00e9rida"},"2278":{"code":"VE-M","name":"Miranda"},"2281":{"code":"VE-N","name":"Monagas"},"2284":{"code":"VE-O","name":"Nueva Esparta"},"2287":{"code":"VE-P","name":"Portuguesa"},"2290":{"code":"VE-R","name":"Sucre"},"2293":{"code":"VE-S","name":"T\u00e1chira"},"2296":{"code":"VE-T","name":"Trujillo"},"2299":{"code":"VE-X","name":"Vargas"},"2302":{"code":"VE-U","name":"Yaracuy"},"2305":{"code":"VE-V","name":"Zulia"}}},"VG":{"name":"British Virgin Islands"},"VI":{"name":"U.S. Virgin Islands"},"VN":{"name":"Vietnam"},"VU":{"name":"Vanuatu"},"WF":{"name":"Wallis & Futuna"},"WS":{"name":"Samoa"},"YE":{"name":"Yemen"},"YT":{"name":"Mayotte"},"ZA":{"name":"South Africa"},"ZM":{"name":"Zambia"},"ZW":{"name":"Zimbabwe"},"data_id":1790358342},"captcha":[],"wishlist":{"items":[]},"company":[],"company_authorization":[],"purchase_order":[],"negotiable_quote":[],"loggedAsCustomer":[],"multiplewishlist":[],"persistent":[],"review":[],"apptrian_facebook_pixel_matching_section":[],"side-by-side":[],"bold_checkout_meta":[],"hyva_checkout":[],"gtm-checkout":[],"recently_viewed_product":[],"recently_compared_product":[],"product_data_storage":[],"paypal-billing-agreement":[]}</script>
vendor: 1 bytes, line 5489
5489
5490<script> 5491 function initContentPopup() { 5492 return { 5493 init(parentIdentifier = '') { 5494 // If parent identifier is sent in, only look for children with class "contentPopupHandler" to initialize 5495 let contentPopupTriggers = parentIdentifier ? document.querySelectorAll(parentIdentifier + ' .contentPopupHandler') : document.getElementsByClassName('contentPopupHandler'); 5496 5497 // Handle image popups as well 5498 let imagePopupTriggers = parentIdentifier ? document.querySelectorAll(parentIdentifier + ' .imagePopupHandler') : document.getElementsByClassName('imagePopupHandler'); 5499 contentPopupTriggers = Array.from(contentPopupTriggers).concat(Array.from(imagePopupTriggers)); 5500 5501 Array.from(contentPopupTriggers).forEach((element) => { 5502 let popupClickHandler = function(event) { 5503 event.preventDefault(); 5504 event.stopPropagation(); 5505 5506 // Find corresponding element with same ID but "Content" appended to use for modal content 5507 let id = element.id; 5508 let popupContent = document.getElementById(id + 'Content'); 5509 5510 // For image popups use child HTML as content, since this will be the img tag 5511 if (element.classList.contains('imagePopupHandler')) { 5512 popupContent = element.cloneNode(true); 5513 let imgLink = popupContent.href; 5514 let imgElement = popupContent.querySelector('img'); 5515 5516 // if image doesnt exist yet, clear out content and create image 5517 if(!imgElement) { 5518 popupContent.innerHTML = ''; 5519 imgElement = document.createElement('img'); 5520 popupContent.appendChild(imgElement); 5521 } 5522 // Set src of child img tag to be href of target tag if present, as this will be the full size image to show in the popup 5523 if (imgLink) { 5524 imgElement.src = imgLink; 5525 imgElement.style.maxHeight = '800px'; 5526 } 5527 } 5528 5529 if (popupContent) { 5530 document.getElementById('contentPopupModal').innerHTML = popupContent.innerHTML; 5531 5532 // Not able to directly trigger modal show from here, so trigger click on hidden button to open the modal 5533 document.getElementById('contentPopupTrigger').dispatchEvent(new Event('click')); 5534 } 5535 }; 5536 5537 if(!element.getAttribute('initialized')) { 5538 element.addEventListener('click', popupClickHandler); 5539 element.setAttribute('initialized', 'true'); 5540 } 5541 5542 }); 5543 } 5544 } 5545 } 5546</script>
5546 5547<div x-data="Object.assign({}, hyva.modal(), initContentPopup())" 5548 x-init="init()" 5549> 5550 <button @click="show('dialog', this.$event || $event)" type="button" id="contentPopupTrigger" class="btn mt-40 hidden" aria-haspopup="dialog"> 5551 Show </button> 5552 <div x-cloak data-dialog-ref-name="dialog" 5553 x-bind="overlay" 5554 class="fixed inset-0 bg-black bg-opacity-50 z-50"> 5555 <div class="fixed flex justify-center items-center text-left z-40 inset-0"> 5556 <div x-ref="dialog" role="dialog" aria-modal="true" 5557 aria-labelledby="content-popup-modal-label" 5558 class="inline-block bg-white shadow-xl rounded-lg p-10 max-h-screen overflow-auto overscroll-y-contain"> 5559 <label id="content-popup-modal-label" class="text-[0]"><?= $escaper->escapeHtml(__("Modal content")) ?></label><div id="contentPopupModal"></div> </div> 5560 </div> 5561 </div> 5562</div>
5563<script type="text/javascript"> 5564 document.addEventListener('DOMContentLoaded', function() { 5565 let aosNodes = document.querySelectorAll("[data-aos]"); 5566 let aosList = []; 5567 5568 aosNodes.forEach(function(aosNode) { 5569 let aosEntry = {}; 5570 aosNode.classList.add("aos-init"); 5571 5572 aosEntry.node = aosNode; 5573 aosEntry.position = getPosition(aosNode); 5574 aosList.push(aosEntry); 5575 }); 5576 5577 window.addEventListener("resize", function() { 5578 // Recalculate positions on resize 5579 aosList.forEach(function(aosEntry) { 5580 aosEntry.position = getPosition(aosEntry.node); 5581 }); 5582 }); 5583 5584 window.addEventListener("scroll", function() { 5585 animateScroll(aosList); 5586 }); 5587 5588 function animateScroll(elements) { 5589 let pageYOffset = window.pageYOffset; 5590 let innerHeight = window.innerHeight; 5591 5592 elements.forEach(function(element) { 5593 let totalHeight = pageYOffset + innerHeight; 5594 totalHeight > element.position ? element.node.classList.add("aos-animate") : element.node.classList.remove("aos-animate"); 5595 }); 5596 } 5597 5598 function getPosition(element) { 5599 let innerHeight = window.innerHeight; 5600 let anchorPlacement = element.getAttribute("data-aos-anchor-placement"); 5601 let top = getTop(element); 5602 5603 switch (anchorPlacement) { 5604 case "top-bottom": 5605 break; 5606 case "center-bottom": 5607 top += element.offsetHeight / 2; 5608 break; 5609 case "bottom-bottom": 5610 top += element.offsetHeight; 5611 break; 5612 case "top-center": 5613 top += innerHeight / 2; 5614 break; 5615 case "bottom-center": 5616 top += innerHeight / 2 + element.offsetHeight; 5617 break; 5618 case "center-center": 5619 top += innerHeight / 2 + element.offsetHeight / 2; 5620 break; 5621 case "top-top": 5622 top += innerHeight; 5623 break; 5624 case "bottom-top": 5625 top += element.offsetHeight + innerHeight; 5626 break; 5627 case "center-top": 5628 top += element.offsetHeight / 2 + innerHeight 5629 } 5630 5631 return top; 5632 } 5633 5634 function getTop(element) { 5635 let top = 0 5636 5637 while (element && !isNaN(element.offsetLeft) && !isNaN(element.offsetTop)) { 5638 top += element.offsetTop - ("BODY" != element.tagName ? element.scrollTop : 0); 5639 element = element.offsetParent; 5640 } 5641 5642 return top; 5643 } 5644 }); 5645</script>
vendor: 1 bytes, line 5645
5645
5646<script> 5647 5648 function dispatchOldCart(event) { 5649 let storage = hyva.getBrowserStorage(); 5650 let oldCart = storage.getItem('old-cart') 5651 ? JSON.parse(storage.getItem('old-cart')) 5652 : {items: []}; 5653 let newCart = event.detail.data.cart ?? {}; 5654 window.dispatchEvent(new CustomEvent('cart-change', { 5655 detail: 5656 { 5657 data: { 5658 oldCart: oldCart, 5659 privateData: event.detail.data 5660 } 5661 } 5662 }) 5663 ); 5664 storage.setItem('old-cart', JSON.stringify(newCart)); 5665 } 5666 5667 window.addEventListener('private-content-loaded', dispatchOldCart) 5668</script>
5668 5669</div><div id="show-result" data-bind="scope:'showResult'" style="display: none;"> 5670 <!-- ko template: getTemplate() --><!-- /ko --> 5671
5671<script type="text/x-magento-init"> 5672 { 5673 "#show-result": { 5674 "Magento_Ui/js/core/app": { 5675 "components": { 5676 "showResult": { 5677 "component": "Bold_CheckoutMeta/js/model/order-result" 5678 } 5679 } 5680 } 5681 } 5682 } 5683 </script>
5683 5684</div>
5685<script nonce="dTVodmpqN2U3dDY0YjBzMGUzN2pjOHcwcnlqdDdmN3o="> 5686 5687 yireoGoogleTagManager2Pusher({"version":"3.10.0","page_type":"cms\/page\/view","page_path":"https:\/\/www.outdoornativitysets.com\/about-us","page_title":"About Us","virtual_page":"\/about-us","breadcrumb":[],"user":{"has_transacted":false}}, 'push (initial page) [data-layer.phtml]'); 5688 </script>
vendor: 1 bytes, line 5688
5688
5689<script nonce="dTVodmpqN2U3dDY0YjBzMGUzN2pjOHcwcnlqdDdmN3o="> 5690 function yireoGoogleTagManager2FindParentElementWithName(element, parentTagName) { 5691 if (!element.parentElement) { 5692 return null; 5693 } 5694 5695 if (element.parentElement.tagName.toLowerCase() === parentTagName) { 5696 return element.parentElement; 5697 } 5698 5699 return yireoGoogleTagManager2FindParentElementWithName(element.parentElement, parentTagName); 5700 } 5701 5702 const products = document.querySelectorAll('.products a.product'); 5703 if (products && products.length > 0) { 5704 products.forEach(function(product) { 5705 product.addEventListener('click', function(event, s) { 5706 let parentElement = yireoGoogleTagManager2FindParentElementWithName(event.target, 'form'); 5707 const inputElement = parentElement.querySelector('input[name="product"]'); 5708 const productId = inputElement.value; 5709 const productData = window['YIREO_GOOGLETAGMANAGER2_PRODUCT_DATA_ID_' + productId] || {}; 5710 productData.item_id = productId; 5711 5712 const eventData = { 5713 'event': 'select_item', 5714 'ecommerce': { 5715 'items': [productData] 5716 } 5717 } 5718 5719 yireoGoogleTagManager2Pusher(eventData, 'push (page event "select_item") [script-product-clicks.phtml]'); 5720 5721 if (window['YIREO_GOOGLETAGMANAGER2_DEBUG_CLICKS'] && confirm("Press to continue with redirect") === false) { 5722 event.preventDefault(); 5723 } 5724 }); 5725 }) 5726 } 5727</script>
vendor: 1 bytes, line 5727
5727
5728<script nonce="dTVodmpqN2U3dDY0YjBzMGUzN2pjOHcwcnlqdDdmN3o="> 5729 window.addEventListener('private-content-loaded', function(event) { 5730 window.dataLayer = window.dataLayer || []; 5731 5732 var isEmpty = function (variable) { 5733 if (typeof variable === 'undefined') { 5734 return true; 5735 } 5736 5737 if (Array.isArray(variable) && variable.length === 0) { 5738 return true; 5739 } 5740 5741 return typeof variable === 'object' && Object.keys(variable).length === 0; 5742 } 5743 5744 var getSectionNames = function () { 5745 return ['cart', 'customer']; 5746 } 5747 5748 getSectionNames().forEach(function (sectionName) { 5749 if (!event.detail.data[sectionName].gtm) { 5750 return; 5751 } 5752 5753 const attributes = event.detail.data[sectionName].gtm; 5754 if (!Object.keys(attributes).length > 0) { 5755 return; 5756 } 5757 5758 yireoGoogleTagManager2Pusher(attributes, 'push (attributes) [script-additions.phtml]'); 5759 }); 5760 5761 let attributes = {}; 5762 getSectionNames().forEach(function (sectionName) { 5763 if (!event.detail.data[sectionName].gtm_events) { 5764 return; 5765 } 5766 5767 const gtmEvents = event.detail.data[sectionName].gtm_events; 5768 for (const [eventId, eventData] of Object.entries(gtmEvents)) { 5769 yireoGoogleTagManager2Logger('found event in section "' + sectionName + '"', eventData); 5770 5771 const metaData = eventData.meta; 5772 yireoGoogleTagManager2Pusher(eventData, 'push (customerData "' + sectionName + '" event "' + eventId + '")'); 5773 5774 if (!metaData || metaData.cacheable !== true) { 5775 yireoGoogleTagManager2Logger('removing event "' + eventId + '" from section "' + sectionName + '"') 5776 5777 let mageCacheStorage = event.detail.data; 5778 5779 if (mageCacheStorage !== null 5780 && typeof mageCacheStorage[sectionName] !== 'undefined' 5781 && typeof mageCacheStorage[sectionName].gtm_events !== 'undefined' 5782 && eventId in mageCacheStorage[sectionName].gtm_events) { 5783 delete mageCacheStorage[sectionName].gtm_events[eventId]; 5784 } 5785 5786 window.localStorage.setItem('mage-cache-storage', JSON.stringify(mageCacheStorage)); 5787 } 5788 } 5789 }); 5790 5791 if (false === isEmpty(attributes)) { 5792 yireoGoogleTagManager2Pusher(attributes, 'dataLayer (initial js) [script-additions.phtml]'); 5793 } 5794 }); 5795</script>
vendor: 1 bytes, line 5795
5795
5796<script type="text/javascript">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","licenseKey":"fcf28e5364","applicationID":"95730697","transactionName":"YFEAYkBRWEdZUkFaDVkbI1VGWVlaF1JYQE1HVQVTHUZfUU8=","queueTime":0,"applicationTime":396,"atts":"TBYDFAhLS0k=","errorBeacon":"bam.nr-data.net","agent":""}</script>
5796</body> 5797</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.