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="Outdoor Nativity Sets | American Made, Outdoor Nativity Displays"/> 7<meta name="description" content="American Made Outdoor Nativity Sets. Made from marine grade plastic to last for years. Get your Christmas Nativity Set for the holidays."/> 8<meta name="robots" content="INDEX,FOLLOW"/> 9<meta name="viewport" content="width=device-width, initial-scale=1"/> 10<title>Outdoor Nativity Sets | American Made, Outdoor Nativity Displays</title> 11<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" /> 12<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" /> 13<!--[if IE 11]>
14<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>
14 15<![endif]--> 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="OGtld3o0NWc5cnNreXdxc2dxbzd1N3R0ZnVkbmxzeno="> 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-home cms-index-index 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="OGtld3o0NWc5cnNreXdxc2dxbzd1N3R0ZnVkbmxzeno="> 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="OGtld3o0NWc5cnNreXdxc2dxbzd1N3R0ZnVkbmxzeno="> 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"><div id="contentarea" tabindex="-1"></div> 3055<div class="page messages">
3055<script> 3056 function initMessages() { 3057 "use strict"; 3058 return { 3059 messages: window.mageMessages || [], 3060 isEmpty() { 3061 return this.messages.reduce( 3062 function (isEmpty, message) { 3063 return isEmpty && message === undefined 3064 }, true 3065 ) 3066 }, 3067 hasMessages() { 3068 return !this.isEmpty(); 3069 }, 3070 hasMessage() { 3071 return !!this.message; 3072 }, 3073 removeMessage() { 3074 this.messages[this.index] = undefined; 3075 }, 3076 addMessages(messages, hideAfter) { 3077 messages.map((message) => { 3078 this.messages = this.messages.concat(message); 3079 if (hideAfter === undefined && message.type === 'success' && window.defaultSuccessMessageTimeout) { 3080 hideAfter = window.defaultSuccessMessageTimeout; 3081 } 3082 if (hideAfter) { 3083 this.setHideTimeOut(this.messages.length -1, hideAfter); 3084 } 3085 }); 3086 }, 3087 setHideTimeOut(messageIndex, hideAfter) { 3088 setTimeout((messageIndex) => { 3089 this.messages[messageIndex] = undefined; 3090 }, hideAfter, messageIndex); 3091 }, 3092 eventListeners: { 3093 ['@messages-loaded.window'](event) { 3094 this.addMessages(event.detail.messages, event.detail.hideAfter) 3095 }, 3096 ['@private-content-loaded.window'](event) { 3097 const data = event.detail.data; 3098 if ( 3099 data.messages && 3100 data.messages.messages && 3101 data.messages.messages.length 3102 ) { 3103 this.addMessages(data.messages.messages); 3104 } 3105 }, 3106 ['@clear-messages.window']() { 3107 this.messages = []; 3108 } 3109 }, 3110 getMessageUiId() { 3111 return 'message-' + this.message.type; 3112 } 3113 } 3114 } 3115 3116 window.addEventListener('alpine:init', () => Alpine.data('initMessages', initMessages), {once: true}) 3117</script>
3117 3118<section id="messages" 3119 x-data="initMessages" 3120 x-bind="eventListeners" 3121 aria-live="assertive" 3122 role="alert" 3123> 3124 <template x-if="hasMessages"> 3125 <div class="w-full"> 3126 <div class="messages container mx-auto py-3"> 3127 <template x-for="(message, index) in messages" :key="index"> 3128 <div> 3129 <template x-if="hasMessage"> 3130 <div class="message" 3131 :class="message.type" 3132 :ui-id="getMessageUiId" 3133 > 3134 <span x-html="message.text"></span> 3135 <button 3136 type="button" 3137 class="text-gray-600 hover:text-black" 3138 aria-label="Close message" 3139 @click.prevent="removeMessage" 3140 > 3141 <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"> 3142 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 3143</svg> 3144 </button> 3145 </div> 3146 </template> 3147 </div> 3148 </template> 3149 </div> 3150 </div> 3151 </template> 3152</section> 3153</div><div class="columns"><div class="column main">
3153<script> 3154 window.boldFlowConfig = { 3155 shopId: "3e913d263509257ceef6952f2d5307bf", 3156 apiUrl: "https://api.boldcommerce.com/", 3157 meta: { 3158 isEnabled: "1" 3159 }, 3160 continueUrl: "https://www.outdoornativitysets.com/", 3161 checkoutUrl: "https://www.outdoornativitysets.com/checkout/", 3162 contactUsUrl: "https://www.outdoornativitysets.com/contact/", 3163 headerColor: "#FFFFFF", 3164 logoData: {"src":"https:\/\/www.outdoornativitysets.com\/media\/logo\/stores\/7\/outdoor-nativity-sets-logo.png","alt":"OutdoorNativitySets","width":203,"height":60}, 3165 loaderIcon: "https://www.outdoornativitysets.com/static/version1789694905/frontend/Kadro/outdoor_nativity_sets_hyva/en_US/images/loader-2.gif", 3166 }; 3167</script>
3167 3168
3169<script type="text/x-magento-init"> 3170 { 3171 "[href='https://www.outdoornativitysets.com/checkout']": { 3172 "proceedToMetaCheckout":{"checkoutUrl":"https://www.outdoornativitysets.com/checkout/"} 3173 }, "[href='https://www.outdoornativitysets.com/checkout/']": { 3174 "proceedToMetaCheckout":{"checkoutUrl":"https://www.outdoornativitysets.com/checkout/"} 3175 } } 3176</script>
3176 3177<style>#html-body [data-pb-style=U2FQ6LH]{display:none}#html-body [data-pb-style=ANKFK3V],#html-body [data-pb-style=Y73XUE0]{display:flex;flex-direction:column;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=Y73XUE0]{justify-content:center;background-position:center top;background-size:contain;text-align:center}#html-body [data-pb-style=ANKFK3V]{justify-content:flex-start;background-position:left top;background-size:cover;border-style:none;border-width:1px;border-radius:0;margin:0;padding:5px 15px 0}#html-body [data-pb-style=Y9GW7C5]{text-align:center;display:none}#html-body [data-pb-style=S4JQ1VY]{display:none}#html-body [data-pb-style=FA81E79]{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=CSA0QJ4]{width:100%;border-width:1px;border-color:#cecece;display:inline-block}#html-body [data-pb-style=Y53BV2S]{display:none}#html-body [data-pb-style=N5ENCQ6]{width:100%;border-width:1px;border-color:#cecece;display:inline-block}#html-body [data-pb-style=E9BPNCV]{display:none}</style><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><!-- Page Specific Styles--> 3178<style> 3179.breadcrumbs { display: none; } 3180/* ⦠all your existing CSS ⦠*/ 3181 3182.tin_pinboard { 3183 padding-bottom: 30px; 3184 off-border-top: 1px solid #ddd; 3185 margin: 0 auto; 3186 max-width: 1200px; 3187} 3188 3189/* Kill the header search bar on this page */ 3190.block-search, 3191#search_mini_form { 3192 display: none !important; 3193} 3194</style> 3195</div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><!-- Container Top --> 3196<div id="home"> 3197 <div class="container-fluid home-container"> 3198 3199 3200</div><div data-content-type="html" data-appearance="default" data-element="main" data-pb-style="U2FQ6LH" data-decoded="true"><!-- Hero --> 3201<div id="home-hero"> 3202 <div class="visible-xs" style="line-height: 0;"><a href="/nativity-sets"><img class="full-hero-disable" src="https://outdoornativitysets.s3.amazonaws.com/images/home-hero-mobile-22.jpg" alt=""></a></div> 3203 <div class="hidden-xs"><a href="/nativity-sets"><img class="full-hero-disable" src="https://outdoornativitysets.s3.amazonaws.com/images/home-hero-desktop-22.jpg" alt=""></a></div> 3204</div> 3205 3206</div><div data-content-type="row" data-appearance="full-bleed" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images='{\"desktop_image\":\"https://www.outdoornativitysets.com/media/wysiwyg/Outdoor_Nativity_Hero_-_Desktop_1.jpg\",\"mobile_image\":\"https://www.outdoornativitysets.com/media/wysiwyg/Outdoor_Nativity_Hero_-_Mobile_1.jpg\"}' data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="false" data-element="main" data-pb-style="Y73XUE0" class="background-image-6ab6e354b9458"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><!-- American-Made Hero (mobile perfect, desktop pushed far left) --> 3207<style> 3208 #holiday-hero{ 3209 background-color:#730402; 3210 background-image:url("https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/hero-american-made-mobile.jpg.jpg"); 3211 background-size:cover; 3212 background-position:center bottom; 3213 background-repeat:no-repeat; 3214 color:#fff; 3215 } 3216 3217 /* Mobile-first */ 3218 #holiday-hero .hero-inner{ 3219 max-width:1280px; 3220 margin:0 auto; 3221 min-height:560px; 3222 padding:56px 18px 28px; 3223 display:flex; align-items:flex-start; justify-content:flex-start; 3224 } 3225 #holiday-hero .copy{ width:100%; max-width:360px; margin:0 auto; text-align:center; } 3226 3227 .headline{ font-family:'Montserrat',sans-serif; font-weight:800; font-size:25px; line-height:1.2; margin:0 0 10px; } 3228 .subhead{ font-family:'Montserrat',sans-serif; font-size:20px; line-height:1.5; margin:0 0 12px; } 3229 .desktop-only{ display:none; } 3230 3231 .cta{ 3232 display:inline-block; margin-top:14px; padding:12px 22px; 3233 background:#f0cf58; color:#1b1b1b; font-weight:800; text-decoration:none; 3234 border-radius:0; box-shadow:none; 3235 } 3236 3237 /* ===== Desktop ===== */ 3238 @media (min-width:992px){ 3239 #holiday-hero{ 3240 background-image:url("https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/hero-american-made-desktop.jpg.jpg"); 3241 background-position:center center; 3242 } 3243 3244 /* make the inner wrapper full-bleed and push content far left with viewport padding */ 3245 #holiday-hero .hero-inner{ 3246 max-width:none !important; /* stop centering constraint */ 3247 margin:0 !important; 3248 min-height:640px; 3249 padding-left:clamp(64px, 12vw, 220px) !important; /* << move into left negative space */ 3250 padding-right:40px !important; 3251 padding-top:120px; padding-bottom:96px; 3252 align-items:flex-start; justify-content:flex-start; 3253 text-align:left; 3254 } 3255 3256 #holiday-hero .copy{ 3257 max-width:560px; width:560px; 3258 margin:0 !important; /* kill any residual margins */ 3259 text-align:left !important; 3260 } 3261 3262 .headline{ font-size:30px; line-height:1.15; margin-bottom:10px; } 3263 .subhead{ font-size:20px; } 3264 .desktop-only{ display:block; } 3265 } 3266</style> 3267 3268<section id="holiday-hero" class="row print-visible"> 3269 <div class="hero-inner"> 3270 <div class="copy"> 3271 <h1 class="headline">American-Made<br>Nativity Sets</h1> 3272 <p class="subhead"> 3273 Celebrating the birth of <strong>Jesus Christ</strong> with quality craftsmanship, 3274 proudly <strong>built in Florida</strong>. 3275 </p> 3276 <!-- Desktop only --> 3277 <p class="subhead desktop-only">Trusted by families who believe in faith, tradition, and American values.</p> 3278 <a class="cta" href="https://www.outdoornativitysets.com/nativity-sets">Shop Now</a> 3279 </div> 3280 </div> 3281</section> 3282</div></div><div data-content-type="row" data-appearance="full-width" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="main" data-pb-style="ANKFK3V"><div class="row-full-width-inner" data-element="inner"><div data-content-type="products" data-appearance="grid" data-element="main" data-pb-style="Y9GW7C5"> <div class="block widget block-products-list grid"> 3283 <div class="block-content"> 3284 <div class="mx-auto grid gap-4 sm:grid-cols-2 lg:grid-cols-4"> 3285 3286<form method="post" action="https://www.outdoornativitysets.com/checkout/cart/add/uenc/%25uenc%25/product/29661/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full "> 3287 <input name="form_key" type="hidden" value="tDBO7PyoUTlaVbs9"> <input type="hidden" name="product" value="29661"> 3288 <input type="hidden" name="product_sku" value="202632-30001-BP"> 3289 3290 3291 <a href="https://www.outdoornativitysets.com/holy-night-outdoor-nativity-set" title="Holy Night Outdoor Nativity Set" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1"> 3292 <img class="hover:shadow-sm object-contain product-image-photo" x-data="" @update-gallery-29661.window="$root.src = $event.detail" src="https://www.outdoornativitysets.com/media/catalog/product/2/0/202632-30001_1.jpg?quality=80&bg-color=255,255,255&fit=bounds&height=240&width=240&canvas=240:240" loading="lazy" width="240" height="240" alt="Holy Night Outdoor Nativity Set" title="Holy Night Outdoor Nativity Set"> 3293 </a> 3294 <div class="product-info flex flex-col grow"> 3295 <div class="mt-2 mb-1 items-center h-14 overflow-hidden justify-center text-primary font-normal text-base text-left leading-tight"> 3296 <a class="product-item-link" href="https://www.outdoornativitysets.com/holy-night-outdoor-nativity-set" :id="`slide-desc-29661-${$id('slider-id')}`"> 3297 Holy Night Outdoor Nativity Set </a> 3298 </div> 3299 3300 <div class="py-1 "> 3301 <div class="product-reviews-summary short flex">
3302 <span class="tt-review-avg">4.9</span> 3303 <div x-data="initRating296616ab689c664efe()" x-defer="intersect" @keyup.enter="scrollToRatings()" @click="scrollToRatings()" class="rating-summary flex items-center" :class="{'cursor-pointer' : reviewsSection}" :tabindex="reviewsSection ? '0' : '-1'" :aria-label="reviewsSection 3304 ? 'Holy\u0020Night\u0020Outdoor\u0020Nativity\u0020Set\u0020rating.\u00205\u0020out\u0020of\u00205\u0020stars.\u0020Click\u0020to\u0020go\u0020to\u0020reviews.' 3305 : 'Holy\u0020Night\u0020Outdoor\u0020Nativity\u0020Set\u0020rating.\u00205\u0020out\u0020of\u00205\u0020stars' 3306 " :role="reviewsSection ? 'button' : 'img'"> 3307 <svg class="TTteaser__icon--full w-6 h-6" role="presentation" viewbox="-2 0 28 24"> 3308 <path d="M12 18.66l-7.44 4.35 1.98-8.16L0 9.36l8.62-.7L12 .99l3.38 7.67 8.62.7-6.54 5.49 1.98 8.16L12 18.66z" xmlns="http://www.w3.org/2000/svg"></path> 3309 </svg> 3310 <svg class="TTteaser__icon--full w-6 h-6" role="presentation" viewbox="-2 0 28 24"> 3311 <path d="M12 18.66l-7.44 4.35 1.98-8.16L0 9.36l8.62-.7L12 .99l3.38 7.67 8.62.7-6.54 5.49 1.98 8.16L12 18.66z" xmlns="http://www.w3.org/2000/svg"></path> 3312 </svg> 3313 <svg class="TTteaser__icon--full w-6 h-6" role="presentation" viewbox="-2 0 28 24"> 3314 <path d="M12 18.66l-7.44 4.35 1.98-8.16L0 9.36l8.62-.7L12 .99l3.38 7.67 8.62.7-6.54 5.49 1.98 8.16L12 18.66z" xmlns="http://www.w3.org/2000/svg"></path> 3315 </svg> 3316 <svg class="TTteaser__icon--full w-6 h-6" role="presentation" viewbox="-2 0 28 24"> 3317 <path d="M12 18.66l-7.44 4.35 1.98-8.16L0 9.36l8.62-.7L12 .99l3.38 7.67 8.62.7-6.54 5.49 1.98 8.16L12 18.66z" xmlns="http://www.w3.org/2000/svg"></path> 3318 </svg> 3319 <svg class="TTteaser__icon--full w-6 h-6" role="presentation" viewbox="-2 0 28 24"> 3320 <path d="M12 18.66l-7.44 4.35 1.98-8.16L0 9.36l8.62-.7L12 .99l3.38 7.67 8.62.7-6.54 5.49 1.98 8.16L12 18.66z" xmlns="http://www.w3.org/2000/svg"></path> 3321 </svg> 3322 3323 </div> 3324 3325 <a class="action view text-sm" href="https://www.outdoornativitysets.com/holy-night-outdoor-nativity-set#reviews">(564) 3326 </a> 3327 </div> 3328 3329
3329<script> 3330 'use strict'; 3331 3332 function initRating296616ab689c664efe() { 3333 return { 3334 reviewsSection: document.getElementById('customer-review-list') 3335 || document.getElementById('customer-reviews') 3336 || document.getElementById('review-form'), 3337 scrollToRatings() { 3338 let scrollTimeout = null 3339 3340 if (!this.reviewsSection) { 3341 return 3342 } 3343 3344 addEventListener('scroll', () => { 3345 clearTimeout(scrollTimeout); 3346 3347 scrollTimeout = setTimeout(() => { 3348 if (this.reviewsSection) { 3349 this.reviewsSection.focus() 3350 } 3351 }, 50); 3352 }, { once: true }); 3353 3354 this.reviewsSection.scrollIntoView({behavior: 'smooth'}) 3355 } 3356 } 3357 } 3358 </script>
3358 3359 </div> 3360 3361 3362 3363 <span class="sr-only"> 3364 The price depends on the options chosen on the product page </span> 3365 3366 <div class="pt-1 text-gray-900" x-data="initPriceBox()" x-defer="intersect" @update-prices-29661.window="updatePrice($event.detail);"> 3367 <div class="price-box price-final_price" data-role="priceBox" data-product-id="29661" data-price-box="product-id-29661" x-data="initPrice29661()" x-bind="eventListeners"> <p class="bundle-price" x-show="calculatedFinalPriceWithCustomOptions > 0"> 3368 3369 3370 <span class="price-container price-final_price tax weee"> 3371 <span id="bundle-price-29661" data-price-amount="199.99" data-price-type="" class="price-wrapper "> 3372 <span class="price">$199.99</span> </span> 3373 </span> 3374 3375 </p> 3376 <p class="regular-price" x-show="calculatedFinalRegularPriceWithCustomOptions > calculatedFinalPriceWithCustomOptions"> 3377 3378 3379 <span class="price-container price-final_price tax weee"> 3380 <span id="regular-price-29661" data-price-amount="199.99" data-price-type="" class="price-wrapper "> 3381 <span class="price">$199.99</span> </span> 3382 </span> 3383 3384 </p> 3385
3386<script> 3387 const bundlePrice = document.getElementById('bundle-price-29661'); 3388 if(bundlePrice) { 3389 bundlePrice.setAttribute('x-html', 'hyva.formatPrice(parseFloat(calculatedFinalPriceWithCustomOptions))'); 3390 } 3391 const regularPrice = document.getElementById('regular-price-29661'); 3392 if(regularPrice) { 3393 regularPrice.setAttribute('x-html', 'hyva.formatPrice(parseFloat(calculatedFinalRegularPriceWithCustomOptions))'); 3394 } 3395 const bundleItemRegularPrices = JSON.parse('{"15130":"199.990000","15217":"99.990000","15337":"99.000000"}'); 3396</script>
3396 3397</div> </div> 3398 3399 <div class="slider-item-info mt-auto pt-3 flex flex-wrap items-center gap-y-4 gap-x-2 3400 "> 3401 <a href="https://www.outdoornativitysets.com/holy-night-outdoor-nativity-set" class="w-auto btn btn-primary justify-center text-sm mr-auto" title="Configure %1 on the product page" aria-label="Configure Holy Night Outdoor Nativity Set on the product page"> 3402 <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"> 3403 <path stroke-linecap="round" stroke-linejoin="round" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"></path> 3404</svg> 3405 <span class="ml-2 inline md:ml-0 md:hidden lg:ml-2 lg:inline"> 3406 Configure </span> 3407 </a> 3408 3409 </div> 3410 3411 </div> 3412 </form> 3413 3414<form method="post" action="https://www.outdoornativitysets.com/checkout/cart/add/uenc/%25uenc%25/product/29658/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full "> 3415 <input name="form_key" type="hidden" value="tDBO7PyoUTlaVbs9"> <input type="hidden" name="product" value="29658"> 3416 <input type="hidden" name="product_sku" value="202632-30050-BP"> 3417 3418 3419 <a href="https://www.outdoornativitysets.com/holy-family-outdoor-nativity-set" title="Holy Family Outdoor Nativity Set" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1"> 3420 <img class="hover:shadow-sm object-contain product-image-photo" x-data="" @update-gallery-29658.window="$root.src = $event.detail" src="https://www.outdoornativitysets.com/media/catalog/product/2/0/202632-30050_zm_1.jpg?quality=80&bg-color=255,255,255&fit=bounds&height=240&width=240&canvas=240:240" loading="lazy" width="240" height="240" alt="Holy Family Outdoor Nativity Set" title="Holy Family Outdoor Nativity Set"> 3421 </a> 3422 <div class="product-info flex flex-col grow"> 3423 <div class="mt-2 mb-1 items-center h-14 overflow-hidden justify-center text-primary font-normal text-base text-left leading-tight"> 3424 <a class="product-item-link" href="https://www.outdoornativitysets.com/holy-family-outdoor-nativity-set" :id="`slide-desc-29658-${$id('slider-id')}`"> 3425 Holy Family Outdoor Nativity Set </a> 3426 </div> 3427 3428 <div class="py-1 "> 3429 <div class="product-reviews-summary short flex"> 3430 <span class="tt-review-avg">4.8</span> 3431 <div x-data="initRating296586ab689c6705cb()" x-defer="intersect" @keyup.enter="scrollToRatings()" @click="scrollToRatings()" class="rating-summary flex items-center" :class="{'cursor-pointer' : reviewsSection}" :tabindex="reviewsSection ? '0' : '-1'" :aria-label="reviewsSection 3432 ? 'Holy\u0020Family\u0020Outdoor\u0020Nativity\u0020Set\u0020rating.\u00205\u0020out\u0020of\u00205\u0020stars.\u0020Click\u0020to\u0020go\u0020to\u0020reviews.' 3433 : 'Holy\u0020Family\u0020Outdoor\u0020Nativity\u0020Set\u0020rating.\u00205\u0020out\u0020of\u00205\u0020stars' 3434 " :role="reviewsSection ? 'button' : 'img'"> 3435 <svg class="TTteaser__icon--full w-6 h-6" role="presentation" viewbox="-2 0 28 24"> 3436 <path d="M12 18.66l-7.44 4.35 1.98-8.16L0 9.36l8.62-.7L12 .99l3.38 7.67 8.62.7-6.54 5.49 1.98 8.16L12 18.66z" xmlns="http://www.w3.org/2000/svg"></path> 3437 </svg> 3438 <svg class="TTteaser__icon--full w-6 h-6" role="presentation" viewbox="-2 0 28 24"> 3439 <path d="M12 18.66l-7.44 4.35 1.98-8.16L0 9.36l8.62-.7L12 .99l3.38 7.67 8.62.7-6.54 5.49 1.98 8.16L12 18.66z" xmlns="http://www.w3.org/2000/svg"></path> 3440 </svg> 3441 <svg class="TTteaser__icon--full w-6 h-6" role="presentation" viewbox="-2 0 28 24"> 3442 <path d="M12 18.66l-7.44 4.35 1.98-8.16L0 9.36l8.62-.7L12 .99l3.38 7.67 8.62.7-6.54 5.49 1.98 8.16L12 18.66z" xmlns="http://www.w3.org/2000/svg"></path> 3443 </svg> 3444 <svg class="TTteaser__icon--full w-6 h-6" role="presentation" viewbox="-2 0 28 24"> 3445 <path d="M12 18.66l-7.44 4.35 1.98-8.16L0 9.36l8.62-.7L12 .99l3.38 7.67 8.62.7-6.54 5.49 1.98 8.16L12 18.66z" xmlns="http://www.w3.org/2000/svg"></path> 3446 </svg> 3447 <svg class="TTteaser__icon--full w-6 h-6" role="presentation" viewbox="-2 0 28 24"> 3448 <path d="M12 18.66l-7.44 4.35 1.98-8.16L0 9.36l8.62-.7L12 .99l3.38 7.67 8.62.7-6.54 5.49 1.98 8.16L12 18.66z" xmlns="http://www.w3.org/2000/svg"></path> 3449 </svg> 3450 3451 </div> 3452 3453 <a class="action view text-sm" href="https://www.outdoornativitysets.com/holy-family-outdoor-nativity-set#reviews">(462) 3454 </a> 3455 </div> 3456 3457
3457<script> 3458 'use strict'; 3459 3460 function initRating296586ab689c6705cb() { 3461 return { 3462 reviewsSection: document.getElementById('customer-review-list') 3463 || document.getElementById('customer-reviews') 3464 || document.getElementById('review-form'), 3465 scrollToRatings() { 3466 let scrollTimeout = null 3467 3468 if (!this.reviewsSection) { 3469 return 3470 } 3471 3472 addEventListener('scroll', () => { 3473 clearTimeout(scrollTimeout); 3474 3475 scrollTimeout = setTimeout(() => { 3476 if (this.reviewsSection) { 3477 this.reviewsSection.focus() 3478 } 3479 }, 50); 3480 }, { once: true }); 3481 3482 this.reviewsSection.scrollIntoView({behavior: 'smooth'}) 3483 } 3484 } 3485 } 3486 </script>
3486 3487 </div> 3488 3489 3490 3491 <span class="sr-only"> 3492 The price depends on the options chosen on the product page </span> 3493 3494 <div class="pt-1 text-gray-900" x-data="initPriceBox()" x-defer="intersect" @update-prices-29658.window="updatePrice($event.detail);"> 3495 <div class="price-box price-final_price" data-role="priceBox" data-product-id="29658" data-price-box="product-id-29658" x-data="initPrice29658()" x-bind="eventListeners"> <p class="bundle-price" x-show="calculatedFinalPriceWithCustomOptions > 0"> 3496 3497 3498 <span class="price-container price-final_price tax weee"> 3499 <span id="bundle-price-29658" data-price-amount="134.99" data-price-type="" class="price-wrapper "> 3500 <span class="price">$134.99</span> </span> 3501 </span> 3502 3503 </p> 3504 <p class="regular-price" x-show="calculatedFinalRegularPriceWithCustomOptions > calculatedFinalPriceWithCustomOptions"> 3505 3506 3507 <span class="price-container price-final_price tax weee"> 3508 <span id="regular-price-29658" data-price-amount="134.99" data-price-type="" class="price-wrapper "> 3509 <span class="price">$134.99</span> </span> 3510 </span> 3511 3512 </p> 3513
3514<script> 3515 const bundlePrice = document.getElementById('bundle-price-29658'); 3516 if(bundlePrice) { 3517 bundlePrice.setAttribute('x-html', 'hyva.formatPrice(parseFloat(calculatedFinalPriceWithCustomOptions))'); 3518 } 3519 const regularPrice = document.getElementById('regular-price-29658'); 3520 if(regularPrice) { 3521 regularPrice.setAttribute('x-html', 'hyva.formatPrice(parseFloat(calculatedFinalRegularPriceWithCustomOptions))'); 3522 } 3523 const bundleItemRegularPrices = JSON.parse('{"15133":"134.990000","15217":"99.990000"}'); 3524</script>
3524 3525</div> </div> 3526 3527 <div class="slider-item-info mt-auto pt-3 flex flex-wrap items-center gap-y-4 gap-x-2 3528 "> 3529 <a href="https://www.outdoornativitysets.com/holy-family-outdoor-nativity-set" class="w-auto btn btn-primary justify-center text-sm mr-auto" title="Configure %1 on the product page" aria-label="Configure Holy Family Outdoor Nativity Set on the product page"> 3530 <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"> 3531 <path stroke-linecap="round" stroke-linejoin="round" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"></path> 3532</svg> 3533 <span class="ml-2 inline md:ml-0 md:hidden lg:ml-2 lg:inline"> 3534 Configure </span> 3535 </a> 3536 3537 </div> 3538 3539 </div> 3540 </form> 3541 3542<form method="post" action="https://www.outdoornativitysets.com/checkout/cart/add/uenc/%25uenc%25/product/15217/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full "> 3543 <input name="form_key" type="hidden" value="tDBO7PyoUTlaVbs9"> <input type="hidden" name="product" value="15217"> 3544 <input type="hidden" name="product_sku" value="202632-30005"> 3545 3546 3547 <a href="https://www.outdoornativitysets.com/two-piece-nativity-angel-figures" title="Nativity Angel 2 Piece Set" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1"> 3548 <img class="hover:shadow-sm object-contain product-image-photo" x-data="" @update-gallery-15217.window="$root.src = $event.detail" src="https://www.outdoornativitysets.com/media/catalog/product/2/0/202632-30005_main.jpg?quality=80&bg-color=255,255,255&fit=bounds&height=240&width=240&canvas=240:240" loading="lazy" width="240" height="240" alt="Nativity Angel 2 Piece Set" title="Nativity Angel 2 Piece Set"> 3549 </a> 3550 <div class="product-info flex flex-col grow"> 3551 <div class="mt-2 mb-1 items-center h-14 overflow-hidden justify-center text-primary font-normal text-base text-left leading-tight"> 3552 <a class="product-item-link" href="https://www.outdoornativitysets.com/two-piece-nativity-angel-figures" :id="`slide-desc-15217-${$id('slider-id')}`"> 3553 Nativity Angel 2 Piece Set </a> 3554 </div> 3555 3556 <div class="py-1 "> 3557 <div class="product-reviews-summary short flex"> 3558 <span class="tt-review-avg">4.9</span> 3559 <div x-data="initRating152176ab689c67546b()" x-defer="intersect" @keyup.enter="scrollToRatings()" @click="scrollToRatings()" class="rating-summary flex items-center" :class="{'cursor-pointer' : reviewsSection}" :tabindex="reviewsSection ? '0' : '-1'" :aria-label="reviewsSection 3560 ? 'Nativity\u0020Angel\u00202\u0020Piece\u0020Set\u0020rating.\u00205\u0020out\u0020of\u00205\u0020stars.\u0020Click\u0020to\u0020go\u0020to\u0020reviews.' 3561 : 'Nativity\u0020Angel\u00202\u0020Piece\u0020Set\u0020rating.\u00205\u0020out\u0020of\u00205\u0020stars' 3562 " :role="reviewsSection ? 'button' : 'img'"> 3563 <svg class="TTteaser__icon--full w-6 h-6" role="presentation" viewbox="-2 0 28 24"> 3564 <path d="M12 18.66l-7.44 4.35 1.98-8.16L0 9.36l8.62-.7L12 .99l3.38 7.67 8.62.7-6.54 5.49 1.98 8.16L12 18.66z" xmlns="http://www.w3.org/2000/svg"></path> 3565 </svg> 3566 <svg class="TTteaser__icon--full w-6 h-6" role="presentation" viewbox="-2 0 28 24"> 3567 <path d="M12 18.66l-7.44 4.35 1.98-8.16L0 9.36l8.62-.7L12 .99l3.38 7.67 8.62.7-6.54 5.49 1.98 8.16L12 18.66z" xmlns="http://www.w3.org/2000/svg"></path> 3568 </svg> 3569 <svg class="TTteaser__icon--full w-6 h-6" role="presentation" viewbox="-2 0 28 24"> 3570 <path d="M12 18.66l-7.44 4.35 1.98-8.16L0 9.36l8.62-.7L12 .99l3.38 7.67 8.62.7-6.54 5.49 1.98 8.16L12 18.66z" xmlns="http://www.w3.org/2000/svg"></path> 3571 </svg> 3572 <svg class="TTteaser__icon--full w-6 h-6" role="presentation" viewbox="-2 0 28 24"> 3573 <path d="M12 18.66l-7.44 4.35 1.98-8.16L0 9.36l8.62-.7L12 .99l3.38 7.67 8.62.7-6.54 5.49 1.98 8.16L12 18.66z" xmlns="http://www.w3.org/2000/svg"></path> 3574 </svg> 3575 <svg class="TTteaser__icon--full w-6 h-6" role="presentation" viewbox="-2 0 28 24"> 3576 <path d="M12 18.66l-7.44 4.35 1.98-8.16L0 9.36l8.62-.7L12 .99l3.38 7.67 8.62.7-6.54 5.49 1.98 8.16L12 18.66z" xmlns="http://www.w3.org/2000/svg"></path> 3577 </svg> 3578 3579 </div> 3580 3581 <a class="action view text-sm" href="https://www.outdoornativitysets.com/two-piece-nativity-angel-figures#reviews">(220) 3582 </a> 3583 </div> 3584 3585
3585<script> 3586 'use strict'; 3587 3588 function initRating152176ab689c67546b() { 3589 return { 3590 reviewsSection: document.getElementById('customer-review-list') 3591 || document.getElementById('customer-reviews') 3592 || document.getElementById('review-form'), 3593 scrollToRatings() { 3594 let scrollTimeout = null 3595 3596 if (!this.reviewsSection) { 3597 return 3598 } 3599 3600 addEventListener('scroll', () => { 3601 clearTimeout(scrollTimeout); 3602 3603 scrollTimeout = setTimeout(() => { 3604 if (this.reviewsSection) { 3605 this.reviewsSection.focus() 3606 } 3607 }, 50); 3608 }, { once: true }); 3609 3610 this.reviewsSection.scrollIntoView({behavior: 'smooth'}) 3611 } 3612 } 3613 } 3614 </script>
3614 3615 </div> 3616 3617 3618 3619 3620 <div class="pt-1 text-gray-900" x-data="initPriceBox()" x-defer="intersect" @update-prices-15217.window="updatePrice($event.detail);"> 3621 <div class="price-box price-final_price" data-role="priceBox" data-product-id="15217" data-price-box="product-id-15217"> 3622 3623 3624 <span class="price-container price-final_price tax weee"> 3625 <span id="product-price-15217" data-price-amount="99.99" data-price-type="finalPrice" class="price-wrapper "> 3626 <span class="price">$99.99</span> </span> 3627 </span> 3628 3629 3630</div> </div> 3631 3632 <div class="slider-item-info mt-auto pt-3 flex flex-wrap items-center gap-y-4 gap-x-2 3633 "> 3634 <button class="w-auto btn btn-primary justify-center text-sm mr-auto" title="Add to Cart Nativity Angel 2 Piece Set" aria-label="Add to Cart Nativity Angel 2 Piece Set" data-addto="cart"> 3635 <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"> 3636 <path stroke-linecap="round" stroke-linejoin="round" d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z"></path> 3637</svg> 3638 <span class="ml-2 inline md:ml-0 md:hidden lg:ml-2 lg:inline"> 3639 Add to Cart </span> 3640 </button> 3641 3642 </div> 3643 3644 </div> 3645 </form> 3646 </div> 3647 </div> 3648 </div> 3649</div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><!-- Best Sellers Header --> 3650<style> 3651 .block-products-list .product-info .py-1 { margin: 0 auto; } 3652 3653 #best-sellers-header { 3654 background-color: #ffffff; /* white background */ 3655 text-align: center; 3656 padding-top: 50px; /* vertical spacing */ 3657 } 3658 3659 #best-sellers-header h2 { 3660 font-family: 'Montserrat', sans-serif; 3661 font-size: 2.8rem; /* large headline */ 3662 font-weight: 800; 3663 color: #730402; /* maroon text */ 3664 margin: 0; 3665 letter-spacing: 1px; 3666 } 3667 3668 @media (max-width: 767px) { 3669 #best-sellers-header { 3670 padding: 35px 15px; 3671 } 3672 #best-sellers-header h2 { 3673 font-size: 2rem; 3674 } 3675 } 3676</style> 3677 3678<section id="best-sellers-header" class="row print-visible"> 3679 <h2>Best Sellers</h2> 3680</section> 3681 3682</div><div data-content-type="html" data-appearance="default" data-element="main" data-pb-style="S4JQ1VY" data-decoded="true"><!-- ONS Best Sellers (HTML-only, Mobile 2x2, Ratings before stars) --> 3683<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;600;800&display=swap" rel="stylesheet"> 3684 3685<style> 3686 :root{ 3687 --ons-red:#8B2C23; 3688 --ons-ink:#2B2B2B; 3689 --ons-muted:#EDEDED; 3690 --ons-star:#F4B400; 3691 --radius:12px; 3692 } 3693 .ons-best{font-family:Montserrat,system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:var(--ons-ink);margin:40px 0} 3694 .ons-best h2{color:var(--ons-red);font-weight:800;text-align:center;margin:0 0 20px;font-size:34px;letter-spacing:.5px} 3695 3696 .ons-grid{display:grid;gap:20px;grid-template-columns:repeat(4,minmax(0,1fr))} 3697 .ons-card{background:#fff;border:1px solid var(--ons-muted);border-radius:var(--radius);overflow:hidden;display:flex;flex-direction:column} 3698 .ons-imgwrap{background:#fafafa} 3699 .ons-imgwrap img{display:block;width:100%;height:auto} 3700 3701 .ons-body{padding:14px 16px;display:flex;flex-direction:column;gap:8px;flex:1} 3702 .ons-title{font-weight:600;font-size:16px;line-height:1.3;margin:0} 3703 .ons-title a{color:var(--ons-ink);text-decoration:none} 3704
3705 .ons-reviews{display:flex;align-items:center;gap:8px;font-size:14px} 3706 .ons-rating{font-weight:700} 3707 .ons-stars{color:var(--ons-star);letter-spacing:1px} 3708 .ons-count a{color:#0A66C2;text-decoration:none} 3709 3710 .ons-price{font-weight:800;font-size:18px} 3711 .ons-btn{margin-top:auto;display:inline-flex;justify-content:center;align-items:center;padding:10px 14px;border-radius:10px;background:var(--ons-red);color:#fff;text-decoration:none;font-weight:700} 3712 3713 @media (max-width:767px){ .ons-grid{grid-template-columns:repeat(2,minmax(0,1fr))} .ons-best h2{font-size:28px} } 3714 @media (min-width:768px) and (max-width:1024px){ .ons-grid{grid-template-columns:repeat(3,minmax(0,1fr))} } 3715</style> 3716 3717<section class="ons-best" aria-labelledby="ons-best-sellers"> 3718 3719 <div class="ons-grid"> 3720 3721 <!-- 1) Holy Night Outdoor Nativity Set --> 3722 <article class="ons-card"> 3723 <a class="ons-imgwrap" href="https://www.outdoornativitysets.com/holy-night-outdoor-nativity-set"> 3724 <img alt="Holy Night Outdoor Nativity Set" 3725 src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/holy-family-outdoor-nativity.jpg"> 3726 </a> 3727 <div class="ons-body"> 3728 <h3 class="ons-title"> 3729 <a href="https://www.outdoornativitysets.com/holy-night-outdoor-nativity-set">Holy Night Outdoor Nativity Set</a> 3730 </h3> 3731 3732 <div class="ons-reviews" aria-label="Rating 4.9 out of 5 from 541 reviews"> 3733 <span class="ons-rating">4.9</span> 3734 <span class="ons-stars" aria-hidden="true">â â â â â </span> 3735 <span class="ons-count"><a href="https://www.outdoornativitysets.com/holy-night-outdoor-nativity-set#reviews">(541)</a></span> 3736 </div> 3737 3738 <div class="ons-price">$199.99</div> 3739 <a class="ons-btn" href="https://www.outdoornativitysets.com/holy-night-outdoor-nativity-set">Shop Now</a> 3740 </div> 3741 </article> 3742 3743 <!-- 2) Holy Family Outdoor Nativity Set --> 3744 <article class="ons-card"> 3745 <a class="ons-imgwrap" href="https://www.outdoornativitysets.com/holy-family-outdoor-nativity-set"> 3746 <img alt="Holy Family Outdoor Nativity Set" 3747 src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/holy-night-outdoor-nativity.jpg"> 3748 </a> 3749 <div class="ons-body"> 3750 <h3 class="ons-title"> 3751 <a href="https://www.outdoornativitysets.com/holy-family-outdoor-nativity-set">Holy Family Outdoor Nativity Set</a> 3752 </h3> 3753 3754 <div class="ons-reviews" aria-label="Rating 4.8 out of 5 from 441 reviews"> 3755 <span class="ons-rating">4.8</span> 3756 <span class="ons-stars" aria-hidden="true">â â â â â </span> 3757 <span class="ons-count"><a href="https://www.outdoornativitysets.com/holy-family-outdoor-nativity-set#reviews">(441)</a></span> 3758 </div> 3759 3760 <div class="ons-price">$134.99</div> 3761 <a class="ons-btn" href="https://www.outdoornativitysets.com/holy-family-outdoor-nativity-set">Shop Now</a> 3762 </div> 3763 </article> 3764 3765 <!-- 3) Two-Piece Nativity Angel Figures --> 3766 <article class="ons-card"> 3767 <a class="ons-imgwrap" href="https://www.outdoornativitysets.com/two-piece-nativity-angel-figures"> 3768 <img alt="Two-Piece Nativity Angel Figures" 3769 src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/nativity-angel-2pc.jpg"> 3770 </a> 3771 <div class="ons-body"> 3772 <h3 class="ons-title"> 3773 <a href="https://www.outdoornativitysets.com/two-piece-nativity-angel-figures">Nativity Angel 2 Piece Set</a> 3774 </h3> 3775 3776 <div class="ons-reviews" aria-label="Rating 4.9 out of 5 from 195 reviews"> 3777 <span class="ons-rating">4.9</span> 3778 <span class="ons-stars" aria-hidden="true">â â â â â </span> 3779 <span class="ons-count"><a href="https://www.outdoornativitysets.com/two-piece-nativity-angel-figures#reviews">(195)</a></span> 3780 </div> 3781 3782 <div class="ons-price">$99.99</div> 3783 <a class="ons-btn" href="https://www.outdoornativitysets.com/two-piece-nativity-angel-figures">Shop Now</a> 3784 </div> 3785 </article> 3786 3787 </div> 3788</section> 3789</div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><!-- ONS Best Sellers (HTML-only, Mobile 2x2, Ratings before stars) --> 3790<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;600;800&display=swap" rel="stylesheet"> 3791 3792<style> 3793 :root{ 3794 --ons-red:#8B2C23; 3795 --ons-ink:#2B2B2B; 3796 --ons-muted:#EDEDED; 3797 --ons-star:#F4B400; 3798 --radius:12px; 3799 } 3800 .ons-best{font-family:Montserrat,system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:var(--ons-ink);margin:40px 0} 3801 .ons-best h2{color:var(--ons-red);font-weight:800;text-align:center;margin:0 0 20px;font-size:34px;letter-spacing:.5px} 3802 3803 /* UPDATED FOR 3 ITEMS ON DESKTOP */ 3804 .ons-grid{ 3805 display:grid; 3806 gap:20px; 3807 grid-template-columns:repeat(3,minmax(0,1fr)); 3808 justify-content:center; 3809 } 3810 3811 .ons-card{background:#fff;border:1px solid var(--ons-muted);border-radius:var(--radius);overflow:hidden;display:flex;flex-direction:column} 3812 .ons-imgwrap{background:#fafafa} 3813 .ons-imgwrap img{display:block;width:100%;height:auto} 3814 3815 .ons-body{padding:14px 16px;display:flex;flex-direction:column;gap:8px;flex:1} 3816 .ons-title{font-weight:600;font-size:16px;line-height:1.3;margin:0} 3817 .ons-title a{color:var(--ons-ink);text-decoration:none} 3818
3819 .ons-reviews{display:flex;align-items:center;gap:8px;font-size:14px} 3820 .ons-rating{font-weight:700} 3821 .ons-stars{color:var(--ons-star);letter-spacing:1px} 3822 .ons-count a{color:#0A66C2;text-decoration:none} 3823 3824 .ons-price{font-weight:800;font-size:18px} 3825 .ons-btn{margin-top:auto;display:inline-flex;justify-content:center;align-items:center;padding:10px 14px;border-radius:10px;background:var(--ons-red);color:#fff;text-decoration:none;font-weight:700} 3826 3827 @media (max-width:767px){ 3828 .ons-grid{grid-template-columns:repeat(2,minmax(0,1fr))} 3829 .ons-best h2{font-size:28px} 3830 } 3831 3832 @media (min-width:768px) and (max-width:1024px){ 3833 .ons-grid{grid-template-columns:repeat(3,minmax(0,1fr))} 3834 } 3835</style> 3836 3837<section class="ons-best" aria-labelledby="ons-best-sellers"> 3838 3839 <div class="ons-grid"> 3840 3841 <!-- 1) Holy Night Outdoor Nativity Set --> 3842 <article class="ons-card"> 3843 <a class="ons-imgwrap" href="https://www.outdoornativitysets.com/holy-night-outdoor-nativity-set"> 3844 <img alt="Holy Night Outdoor Nativity Set" 3845 src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/holy-family-outdoor-nativity.jpg"> 3846 </a> 3847 <div class="ons-body"> 3848 <h3 class="ons-title"> 3849 <a href="https://www.outdoornativitysets.com/holy-night-outdoor-nativity-set">Holy Night Outdoor Nativity Set</a> 3850 </h3> 3851 3852 <div class="ons-reviews" aria-label="Rating 4.9 out of 5 from 541 reviews"> 3853 <span class="ons-rating">4.9</span> 3854 <span class="ons-stars" aria-hidden="true">â â â â â </span> 3855 <span class="ons-count"><a href="https://www.outdoornativitysets.com/holy-night-outdoor-nativity-set#reviews">(541)</a></span> 3856 </div> 3857 3858 <div class="ons-price">$199.99</div> 3859 <a class="ons-btn" href="https://www.outdoornativitysets.com/holy-night-outdoor-nativity-set">Shop Now</a> 3860 </div> 3861 </article> 3862 3863 <!-- 2) Holy Family Outdoor Nativity Set --> 3864 <article class="ons-card"> 3865 <a class="ons-imgwrap" href="https://www.outdoornativitysets.com/holy-family-outdoor-nativity-set"> 3866 <img alt="Holy Family Outdoor Nativity Set" 3867 src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/holy-night-outdoor-nativity.jpg"> 3868 </a> 3869 <div class="ons-body"> 3870 <h3 class="ons-title"> 3871 <a href="https://www.outdoornativitysets.com/holy-family-outdoor-nativity-set">Holy Family Outdoor Nativity Set</a> 3872 </h3> 3873 3874 <div class="ons-reviews" aria-label="Rating 4.8 out of 5 from 441 reviews"> 3875 <span class="ons-rating">4.8</span> 3876 <span class="ons-stars" aria-hidden="true">â â â â â </span> 3877 <span class="ons-count"><a href="https://www.outdoornativitysets.com/holy-family-outdoor-nativity-set#reviews">(441)</a></span> 3878 </div> 3879 3880 <div class="ons-price">$134.99</div> 3881 <a class="ons-btn" href="https://www.outdoornativitysets.com/holy-family-outdoor-nativity-set">Shop Now</a> 3882 </div> 3883 </article> 3884 3885 <!-- 3) Two-Piece Nativity Angel Figures --> 3886 <article class="ons-card"> 3887 <a class="ons-imgwrap" href="https://www.outdoornativitysets.com/two-piece-nativity-angel-figures"> 3888 <img alt="Two-Piece Nativity Angel Figures" 3889 src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/nativity-angel-2pc.jpg"> 3890 </a> 3891 <div class="ons-body"> 3892 <h3 class="ons-title"> 3893 <a href="https://www.outdoornativitysets.com/two-piece-nativity-angel-figures">Nativity Angel 2 Piece Set</a> 3894 </h3> 3895 3896 <div class="ons-reviews" aria-label="Rating 4.9 out of 5 from 195 reviews"> 3897 <span class="ons-rating">4.9</span> 3898 <span class="ons-stars" aria-hidden="true">â â â â â </span> 3899 <span class="ons-count"><a href="https://www.outdoornativitysets.com/two-piece-nativity-angel-figures#reviews">(195)</a></span> 3900 </div> 3901 3902 <div class="ons-price">$99.99</div> 3903 <a class="ons-btn" href="https://www.outdoornativitysets.com/two-piece-nativity-angel-figures">Shop Now</a> 3904 </div> 3905 </article> 3906 3907 </div> 3908</section> 3909</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-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="" data-element="inner" data-pb-style="FA81E79"><div data-content-type="divider" data-appearance="default" data-element="main"><hr data-element="line" data-pb-style="CSA0QJ4"></div><div data-content-type="html" data-appearance="default" data-element="main" data-pb-style="Y53BV2S" data-decoded="true"><div class="col-sm-12 text-center"> 3910 <div style="display: flex; justify-content: center; flex-wrap: wrap; gap: 40px;"> 3911 3912 <div style="text-align: center;"> 3913 <img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/shipping_icon.png" alt="Free, Fast Shipping"> 3914 <div class="h4">Free & Fast<br>Shipping</div> 3915 </div> 3916 3917 <div style="text-align: center;"> 3918 <img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/america_icon.png" alt="Made In America"> 3919 <div class="h4">Proudly made<br>in the USA</div> 3920 </div> 3921 3922 <div style="text-align: center;"> 3923 <img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/weatherproof_icon.png" alt="Proven, Durable Material"> 3924 <div class="h4">Strong, Proven<br>Material</div> 3925 </div> 3926 3927 <div style="text-align: center;"> 3928 <img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/product-content/satisfaction-icon.png" alt="Satisfaction Guarantee"> 3929 <div class="h4">100% Satisfaction<br>Guarantee</div> 3930 </div> 3931 3932 </div> 3933</div> 3934</div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><!-- Desktop Visible Icon Area --> 3935 3936<div class="hidden-xs" style="display: flex; padding-bottom: 2rem; padding-top: 1rem; text-align: center; max-width:1200px;"> 3937 3938 3939 <div class="contentPopupHandler" id="popupShipping" style="width:25%;"> 3940 <div> 3941 <div><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/product-content/shipping_icon.png" alt="Free Shipping" style="max-height:60px; margin: 0 auto;" â/></div> 3942 <div style="line-height: 20px; padding-top: 5px;">Free & Fast Shipping <sup><i class="fa fa-plus-square-o"></i></sup></div> 3943 </div> 3944 </div> 3945 3946 3947 <div class="contentPopupHandler" id="popupAboutUs" style="width:25%;"> 3948 <div> 3949 <div><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/product-content/america_icon.png" alt="Made in the USA" style="max-height:60px; margin: 0 auto;" /></div> 3950 <div style="line-height: 20px; padding-left: 10px; padding-top: 5px;">Proudly made <br/> in the USA <sup><i class="fa fa-plus-square-o"></i></sup></div> 3951 </div> 3952 </div> 3953 3954 3955 <div class="contentPopupHandler" id="popupStrongMaterial" style="width:25%;"> 3956 <div> 3957 <div><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/product-content/durable_water_icon.png" alt="Strong Material" style="max-height:60px; margin: 0 auto;" â/></div> 3958 <div style="line-height: 20px; padding-left: 10px; padding-top: 5px;">Strong, Proven Material <sup><i class="fa fa-plus-square-o"></i></sup></div> 3959 </div> 3960 </div> 3961 3962 3963 <div class="contentPopupHandler" id="popupSatisfactionGuarantee" style="width:25%;"> 3964 <div> 3965 <div><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/product-content/satisfaction-icon.png" alt="Satisfaction Guarantee" style="max-height:60px; margin: 0 auto;" /></div> 3966 <div style="line-height: 20px; padding-left: 10px; padding-top: 5px;">100% Satisfaction Guarantee <sup><i class="fa fa-plus-square-o"></i></sup></div> 3967 </div> 3968 </div> 3969 3970 3971</div> 3972 3973 3974 3975<!-- Desktop Popup Content --> 3976 3977 3978 <div id="popupShippingContent" title="Free Shipping" style="display:none;"> 3979 <p><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/misc/ship-pop-up-2021.jpg" alt="Free Shipping" /></p> 3980 </div> 3981 3982 <div id="popupAboutUsContent" title="Made in the USA" style="display:none;"> 3983 <div class="youtube-video-place embed-responsive" data-yt-url="https://www.youtube.com/embed/L3Hm2FDPs5g?showinfo=0&rel=0&autoplay=1&mute=0"><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/product-content/aboutus-video-placeholder1.jpg" alt="" style="cursor: pointer;" async class="play-youtube-video"/></div> 3984 </div> 3985 3986 <div id="popupStrongMaterialContent" title="Strong Material" style="display:none;"> 3987 <p><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/product-content/Durable-Material.jpg" alt="Durable Material" /></p> 3988 </div> 3989 3990 <div id="popupSatisfactionGuaranteeContent" title="Satisfaction Guarantee" style="display:none;"> 3991 <p><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/product-content/Hapiness-Guarantee.jpg" alt="Happiness Guarantee" /></p> 3992 </div> 3993 3994 3995<!-- Mobile Visible Icon Area --> 3996 3997 3998 3999<div class="visible-xs" style="display: flex; padding-bottom: 2rem; padding-top: 1rem;"> 4000 <div style="display: inline-block; width:49%;" class="showDiv" show="popupShippingInline"> 4001 <div style="display:flex;"> 4002 <div style="display: inline-block;"><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/product-content/shipping_icon.png" alt="Free Shipping" style="float: left; max-height:60px;" â/></div> 4003 <div style="display: inline-block; line-height: 20px; padding-left: 10px; padding-top: 10px;">Free Fast Shipping <sup><i class="fa fa-plus-square-o"></i></sup></div> 4004 </div> 4005 </div> 4006 4007 4008 4009 <div style="display: inline-block; width:49%;" class="showDiv" show="popupAboutUsInline"> 4010 <div style="display:flex;"> 4011 <div style="display: inline-block;"><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/product-content/america_icon.png" alt="Made in the USA" style="float: left; max-height:60px;" /></div> 4012 <div style="display: inline-block; line-height: 20px; padding-left: 10px; ">Proudly made in the USA <sup><i class="fa fa-plus-square-o"></i></sup></div> 4013 </div> 4014 </div> 4015</div> 4016 4017 4018 4019<div class="visible-xs" style="display: flex; padding-bottom: 2rem;"> 4020 <div style="display: inline-block; width:49%;" class="showDiv" show="popupStrongMaterialInline"> 4021 <div style="display:flex;"> 4022 <div style="display: inline-block;"><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/product-content/durable_water_icon.png" alt="Strong Proven Material" style="float: left; max-height:60px;" â/></div> 4023 <div style="display: inline-block; line-height: 20px; padding-left: 10px; ">Strong, Proven Material <sup><i class="fa fa-plus-square-o"></i></sup></div> 4024 </div> 4025 </div> 4026 4027 4028 4029 <div style="display: inline-block; width:49%;" class="showDiv" show="popupSatisfactionGuaranteeInline"> 4030 <div style="display:flex;"> 4031 <div style="display: inline-block;"><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/product-content/satisfaction-icon.png" alt="Satisfaction Guarantee" style="float: left; max-height:60px;" /></div> 4032 <div style="display: inline-block; line-height: 20px; padding-left: 10px;">Satisfaction Guarantee <sup><i class="fa fa-plus-square-o"></i></sup></div> 4033 </div> 4034 </div> 4035</div> 4036 4037 4038 4039 <!-- Mobile Popup Content --> 4040 4041 4042 <div id="popupShippingInline" title="Free Shipping" style="display:none;"> 4043 <div><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/misc/ship-pop-up-2021.jpg" alt="Free Shipping" /></div> 4044 </div> 4045 4046 4047 <div id="popupAboutUsInline" title="Made in the USA" style="display:none;"> 4048 <div class="scalemedia"><div class="youtube-video-place embed-responsive" data-yt-url="https://www.youtube.com/embed/L3Hm2FDPs5g?showinfo=0&rel=0&autoplay=1&mute=0"><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/product-content/aboutus-video-placeholder.jpg" alt="" style="cursor: pointer;" async class="play-youtube-video"/></div></div> 4049 </div> 4050 4051 <div id="popupStrongMaterialInline" title="Strong Material" style="display:none;"> 4052 <div><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/product-content/Durable-Material-Mobile.jpg" alt="Strong Material" /></div> 4053 </div> 4054 4055 <div id="popupSatisfactionGuaranteeInline" title="Satisfaction Guarantee" style="display:none;"> 4056 <div><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/product-content/Hapiness-Guarantee-Mobile.jpg" alt="Hapiness Guarantee" /></div> 4057 </div> 4058</div><div data-content-type="divider" data-appearance="default" data-element="main"><hr data-element="line" data-pb-style="N5ENCQ6"></div></div></div><div data-content-type="html" data-appearance="default" data-element="main" data-pb-style="E9BPNCV" data-decoded="true"><style> 4059.breadcrumbs { display: none; } 4060.full-hero { margin-left: -50vw; margin-right: -50vw; left: 50%; max-width: 100vw; position: relative; right: 50%; width: 100%; } 4061 4062@media only screen and (max-width: 767px) {
4063 #cta .intro span { display: none; } 4064 #about-us p span { display: none; } 4065 #testimonial p { font-size: 1.4rem; } 4066 #video-hero { display: none; } 4067} 4068 4069#maincontent { padding: 0 !important; max-width: none !important; } 4070 4071.nav-sections { margin-bottom: 0 !important; } 4072 4073#home .h2 { font-weight: 600; line-height: 1.3; font-size: 2.0rem; margin-top: 2rem; margin-bottom: 1rem; } 4074#home .h3 { font-weight: 600; line-height: 1.1; font-size: 1.8rem; margin-top: 2rem; margin-bottom: 1rem; } 4075#home .h4 { line-height: 1.1; font-size: 1.4rem; font-weight: bold; } 4076#home .buttonlink a { padding: 12px 24px; background-color: #a32c28; color: #ffffff; font-size: 1.8rem; } 4077 4078#cta { margin-bottom: 2rem; } 4079#cta .intro { font-size: 2rem; } 4080#cta .h2 { margin-top: .5rem; margin-bottom: .5rem; color: #343434; font-weight: 500; font-size: 2.3rem; } 4081#cta .h4 { font-weight: normal; font-size: 1.6rem; } 4082#cta p { line-height: normal; } 4083#cta a { color: #a32c28; } 4084#cta.row img { width: 80px; } 4085#cta .buttonlink { padding: 12px 24px; background-color: #a32c28; color: #ffffff; font-size: 2.2rem; } 4086#cta .buttonlink a { color: #fff; background-color: transparent; padding: 0; } 4087 4088#best-sellers { margin-bottom: 2rem; padding-bottom: 2rem; } 4089#best-sellers .title { color: #a32c28; text-align: center; margin: 2rem 0; } 4090#best-sellers span { color: #a32c28; } 4091#best-sellers a { } 4092#best-sellers img { border: solid #ddd 1px; } 4093 4094#figures { padding-bottom: 2rem; } 4095#figures span { color: #a32c28; } 4096#figures a { } 4097#figures img { border: solid #ddd 1px; } 4098 4099#video-hero { display: none; visibility: hidden; font-size: 0; line-height: 0; margin-0; } 4100 4101#customer-gallery { margin-bottom: 2rem; padding-bottom: 2rem; } 4102#customer-gallery .title { text-align: center; margin: 2rem 0; } 4103#customer-gallery .subtitle { text-align: center; color: #a32c28; margin-top: -2rem; margin-bottom: 1rem; } 4104#customer-gallery .text-center div { margin-bottom: 15px; } 4105</style> 4106<div> 4107<div> 4108<div class="container-fluid home-container"> 4109<div id="home-hero"> 4110<div class="visible-xs" style="line-height: 0;"><a href="/nativity-sets"><img class="full-hero-disable" src="https://outdoornativitysets.s3.amazonaws.com/images/home-hero-mobile-22.jpg" alt=""></a></div> 4111<div class="hidden-xs"><a href="/nativity-sets"><img class="full-hero-disable" src="https://outdoornativitysets.s3.amazonaws.com/images/home-hero-desktop-22.jpg" alt=""></a></div> 4112</div> 4113<div id="cta" class="row print-visible"> 4114<div class="page-main" style="margin-top: 0; padding-top: 0 !important;"> 4115<div class="col-xs-12 text-center visible-xs" style="background-color: #f3f3f3; padding: 1rem 0;"> 4116<div class="h2">DISPLAY THE TRUE<br>MEANING OF CHRISTMAS</div> 4117<div style="display: inline-block;"> 4118<div class="buttonlink" style="margin: 1rem 0;"><a href="/nativity-sets/">Find Your Nativity Set</a></div> 4119</div> 4120</div> 4121<div class="col-sm-2 col-xs-6 text-center"> 4122<div style="padding: 20px 0 20px 20px;"><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/shipping_icon.png" alt="Free, Fast Shipping"> 4123<div class="h4">Free & Fast<br>Shipping</div> 4124</div> 4125</div> 4126<div class="col-sm-2 col-xs-6 text-center"> 4127<div style="padding: 20px 20px 20px 0;"><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/america_icon.png" alt="Made In America"> 4128<div class="h4">Proudly made<br>in the USA</div> 4129</div> 4130</div> 4131<div class="col-sm-4 text-center hidden-xs"> 4132<div style="margin-top: 3rem;"> 4133<div class="buttonlink"><a href="/nativity-sets/">Find Your Nativity Set</a></div> 4134</div> 4135</div> 4136<div class="col-sm-2 col-xs-6 text-center"> 4137<div style="padding: 20px 0 20px 20px;"><img src="https://outdoornativitysets.s3.amazonaws.com/images/durable_water_icon.png" alt="Proven, Durable Material"> 4138<div class="h4">Strong, Proven<br>Material</div> 4139</div> 4140</div> 4141<div class="col-sm-2 col-xs-6 text-center"> 4142<div style="padding: 20px 20px 20px 0;"><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/product-content/satisfaction-icon.png" alt="Satisfaction Guarantee"> 4143<div class="h4">100% Satisfaction<br>Guarantee</div> 4144</div> 4145</div> 4146</div> 4147</div> 4148<div id="best-sellers" class="row print-visible" style="background-color: #f3f3f3;"> 4149<div class="page-main"> 4150<div class="h2 title"><strong>Best Selling</strong> Nativity Sets</div> 4151<div class="col-sm-4 col-xs-12 text-center" style="margin-bottom: 2rem;"> 4152<div><a href="/holy-night-outdoor-nativity-set"><img src="https://outdoornativitysets.s3.amazonaws.com/images/30001-HP.jpg" alt="Holy Night Nativity Set"></a></div> 4153<div class="h4"><a href="/holy-night-outdoor-nativity-set">Holy Night Nativity Set</a></div> 4154$199.99</div> 4155<div class="col-sm-4 col-xs-12 text-center" style="margin-bottom: 2rem;"> 4156<div><a href="/joy-nativity-yard-sign"><img src="https://outdoornativitysets.s3.amazonaws.com/images/30040-HP.jpg" alt="Holy Family Nativity Set"></a></div> 4157<div class="h4"><a href="/joy-nativity-yard-sign">Joy Nativity Set</a></div> 4158$189.99</div> 4159<div class="col-sm-4 col-xs-12 text-center" style="margin-bottom: 2rem;"> 4160<div><a href="/holy-family-outdoor-nativity-set"><img src="https://outdoornativitysets.s3.amazonaws.com/images/30050-HP.jpg" alt="Joy Nativity Set"></a></div> 4161<div class="h4"><a href="/holy-family-outdoor-nativity-set">Holy Family Set</a></div> 4162$149.99</div> 4163<div class="col-xs-12 buttonlink" style="text-align: right; padding-top: 1rem;"><a href="/nativity-sets/">Shop All ></a></div> 4164</div> 4165</div> 4166</div> 4167</div> 4168</div> 4169<style> 4170 .tt-c-comments-pin .tt-c-comments-pin__cta { display: none; } 4171 .tt-w-comments-pinboard-teaser__promo-cta { color: #fff !important; } 4172 .tt-w-comments-pinboard-teaser__promo-credit { display: none; } 4173 4174#tt-comments-pinboard-teaser-widget {
4175 padding: 0 30px; 4176 width: 100%; 4177 display: flex; 4178} 4179 4180.tin_pinboard { 4181 padding-bottom: 30px; 4182 off-border-top: 1px solid #ddd; 4183 margin: 0 auto; 4184 max-width: 1200px; 4185} 4186</style> 4187<div id="home"> 4188<div class="container-fluid home-container"> 4189<div class="tin_pinboard"> 4190<div class="col-xs-12"> 4191<div class="h2 title" style="text-align: center; margin: 2rem 0;"><strong>Trending</strong> Products</div> 4192</div> 4193<div id="tt-comments-pinboard-teaser-widget"></div> 4194</div> 4195<div id="testimonial" class="row hidden-xs"> 4196<div class="col-sm-6 col-xs-12"><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/testimonial.jpg" alt="Customer Scene" loading="lazy"></div> 4197<div class="col-sm-6 col-xs-12"> 4198<div style="max-width: 600px; color: #a32c28; font-size: 125%;"> 4199<p>It has been 8 years now, and they still look as good as when I got them. I look forward to putting this in the front yard every year. And when Iâm done, I just stand back and take it all in, and it gives me such a sense of peace. And a reminder of what Christmas is all about." â <em style="color: #111;">LZ Dottie</em></p> 4200</div> 4201</div> 4202</div> 4203<div id="about-us" class="row hidden-xs" style="margin-bottom: 2rem;"> 4204<div class="page-main"> 4205<div class="col-sm-6 col-xs-12"> 4206<div class="h2"><strong>About</strong> Us</div> 4207<p style="color: #a32c28;"><strong><em>Born during the recession, our Nativity Sets helped save jobs during a challenging economic time and continue to be a tremendous blessing by offsetting the seasonality of our primary business of marine manufacturing.</em></strong></p> 4208<p>Our parent company Teak Isle Mfg, a 35 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. While brainstorming ways to keep our employees working, we remembered years back cutting Nativity Sets for a local Christmas tree farm. We decided to revisit the design to make it extra-durable and easily disassemble for compact storage and shipping. We not only saved jobs that year, but also created jobs moving forward thanks to our loyal customers!</p> 4209<div class="buttonlink" style="text-align: right;"><a href="/about-us">Read More ></a></div> 4210</div> 4211<div class="col-sm-6 hidden-xs"><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/about-us.jpg" alt="Packing Nativities" loading="lazy"></div> 4212</div> 4213</div> 4214<div id="fullsets" class="row" style="background-color: #f3f3f3;"> 4215<div class="hidden-xs"><img class="full-hero" src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/figures-hero.jpg" alt="" loading="lazy"></div> 4216<div class="hidden-sm hidden-md hidden-lg"><img class="full-hero" src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/figures-hero-mobile.jpg" alt="" loading="lazy"></div> 4217</div> 4218<div id="figures" class="row print-visible" style="background-color: #f3f3f3; text-align: center;"> 4219<div class="page-main"> 4220<div class="col-sm-4 col-xs-12" style="margin-bottom: 2rem;"> 4221<div><a href="/two-piece-nativity-angel-figures"><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/ons-angels.jpg" alt="Angels"></a></div> 4222<div class="h4"><a href="/two-piece-nativity-angel-figures">Angels</a></div> 4223$93.99</div> 4224<div class="col-sm-4 col-xs-12" style="margin-bottom: 2rem;"> 4225<div><a href="/three-wise-men-nativity-figures"><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/ons-wise-men.jpg" alt="Wise Men"></a></div> 4226<div class="h4"><a href="/three-wise-men-nativity-figures">Wise Men</a></div> 4227$119.99</div> 4228<div class="col-sm-4 col-xs-12" style="margin-bottom: 2rem;"> 4229<div><a href="/nativity-shepherd-with-sheep"><img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/ons-shepherd.jpg" alt="Shepherd"></a></div> 4230<div class="h4"><a href="/nativity-shepherd-with-sheep">Shepherd</a></div> 4231$114.99</div> 4232<div class="col-xs-12 buttonlink" style="text-align: right; padding-top: 1rem;"><a href="/nativity-figures">Shop All ></a></div> 4233</div> 4234</div> 4235<div id="customer-gallery" class="row print-visible" style="background-color: #f3f3f3;"> 4236<div class="page-main-off"> 4237<div class="h2 title"><strong>Customer</strong> Photos</div> 4238<div class="col-sm-4 col-xs-6 text-center"> 4239<div><a class="imagePopupHandler" href="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-1_zm.jpg"><img class="imagebox" src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-1_th.jpg" alt="Holy Family OutdoorNativitySet" loading="lazy"></a></div> 4240</div> 4241<div class="col-sm-4 col-xs-6 text-center"> 4242<div><a class="imagePopupHandler" href="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-2_zm.jpg"><img class="imagebox" src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-2_th.jpg" alt="Holy Night OutdoorNativitySet" loading="lazy"></a></div> 4243</div> 4244<div class="col-sm-4 col-xs-6 text-center"> 4245<div><a class="imagePopupHandler" href="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-3_zm.
4245jpg"><img class="imagebox" src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-3_th.jpg" alt="Holy Family OutdoorNativitySet in snow" loading="lazy"></a></div> 4246</div> 4247<div class="col-sm-4 col-xs-6 text-center"> 4248<div><a class="imagePopupHandler" href="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-4_zm.jpg"><img class="imagebox" src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-4_th.jpg" alt="Complete Holy Family OutdoorNativitySet" loading="lazy"></a></div> 4249</div> 4250<div class="col-sm-4 col-xs-6 text-center"> 4251<div><a class="imagePopupHandler" href="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-5_zm.jpg"><img class="imagebox" src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-5_th.jpg" alt="Holy Family OutdoorNativitySet with Angels" loading="lazy"></a></div> 4252</div> 4253<div class="col-sm-4 col-xs-6 text-center"> 4254<div><a class="imagePopupHandler" href="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-6_zm.jpg"><img class="imagebox" src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-6_th.jpg" alt="Joy OutdoorNativitySet" loading="lazy"></a></div> 4255</div> 4256</div> 4257</div> 4258</div> 4259</div></div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><!-- ======================= --> 4260<!-- Testimonial (polished) --> 4261<!-- ======================= --> 4262<style> 4263 /* Shared utilities for these sections */ 4264 .ons-section-spacing { margin: 60px 0; } 4265 .ons-img { width:100%; height:auto; display:block; border-radius:4px; } 4266 .imagebox { margin: 0 auto; } 4267 4268 /* Testimonial */ 4269 #testimonial.ons-row { 4270 display:flex; align-items:center; flex-wrap:wrap; 4271 } 4272 #testimonial .quote-wrap{ 4273 max-width:560px; padding:24px; color:#7a1f1b; line-height:1.7; 4274 } 4275 #testimonial .quote{ 4276 font-size:1.45rem; margin:0; 4277 } 4278 #testimonial .signature{ 4279 margin-top:.6rem; color:#111; font-style:italic; text-align:right; 4280 } 4281 4282 /* About Us */ 4283 #about-us.ons-row { 4284 display:flex; align-items:center; flex-wrap:wrap; 4285 } 4286 #about-us .about-copy{ 4287 max-width:640px; margin:0 auto; /* centers copy block against image */ 4288 } 4289 #about-us .about-intro{ 4290 color:#a32c28; font-weight:700; font-style:italic; 4291 } 4292 #about-us .about-btn{ text-align:right; } 4293 4294 /* Responsive tweaks */ 4295 @media (max-width: 991px){ 4296 #testimonial .quote{ font-size:1.25rem; } 4297 #testimonial .quote-wrap{ padding:16px; text-align:center; } 4298 #testimonial .signature{ text-align:center; } 4299 4300 #about-us .about-copy{ max-width:720px; text-align:center; } 4301 #about-us .about-btn{ text-align:center; } 4302 } 4303 @media (max-width: 575px){ 4304 #testimonial .quote{ font-size:1.15rem; } 4305 } 4306</style> 4307 4308<!-- Testimonial --> 4309<div id="testimonial" class="row hidden-xs ons-row ons-section-spacing"> 4310 <!-- Left: Image --> 4311 <div class="col-sm-6 col-xs-12"> 4312 <img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/testimonial.jpg" 4313 alt="Customer Scene" loading="lazy" class="ons-img"> 4314 </div> 4315 4316 <!-- Right: Quote (centered vs image) --> 4317 <div class="col-sm-6 col-xs-12" style="display:flex; align-items:center; justify-content:center;"> 4318 <div class="quote-wrap"> 4319 <p class="quote"> 4320 âIt has been 8 years now, and they still look as good as when I got them. I look forward to 4321 putting this in the front yard every year. And when Iâm done, I just stand back and take it all in, 4322 and it gives me such a sense of peace. And a reminder of what Christmas is all about.â 4323 </p> 4324 <p class="signature">â LZ Dottie</p> 4325 </div> 4326 </div> 4327</div> 4328 4329<!-- About Us --> 4330<div id="about-us" class="row hidden-xs ons-row" style="margin-bottom: 2rem;"> 4331 <div class="page-main" style="width:100%;"> 4332 <div id="about-us" class="ons-row"> 4333 <!-- Left: Copy (centered against image) --> 4334 <div class="col-sm-6 col-xs-12" style="display:flex; align-items:center;"> 4335 <div class="about-copy"> 4336 <div class="h2" style="margin-bottom:.5rem;"><strong>About</strong> Us</div> 4337 <p class="about-intro"> 4338 Born during the recession, our Nativity Sets helped save jobs during a challenging 4339 economic time and continue to be a tremendous blessing by offsetting the 4340 seasonality of our primary business of marine manufacturing. 4341 </p> 4342 <p> 4343 Our parent company Teak Isle Mfg, a 35 year supplier to the marine industry, was faced 4344 with cutting its workforce during the holidays. The hard fact was that fewer people were 4345 buying boats and the holiday months were going to be extremely slow. While brainstorming 4346 ways to keep our employees working, we remembered years back cutting Nativity Sets for a 4347 local Christmas tree farm. We decided to revisit the design to make it extra-durable and 4348 easily disassemble for compact storage and shipping. We not only saved jobs that year, 4349 but also created jobs moving forward thanks to our loyal customers! 4350 </p> 4351 <div class="about-btn"><a href="/about-us">Read More ></a></div> 4352 </div> 4353 </div> 4354 4355 <!-- Right: Image --> 4356 <div class="col-sm-6 hidden-xs"> 4357 <img src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/page-content/home/about-us.jpg" 4358 alt="Packing Nativities" loading="lazy" class="ons-img"> 4359 </div> 4360 </div> 4361 </div> 4362</div> 4363 4364<!-- Customer Photos (unchanged) --> 4365<div id="customer-gallery" class="row print-visible" style="background-color: #f3f3f3;"> 4366 <div class="h2 title" style="font-size: 2.8rem; font-weight: 800;color: #730402; margin: 0; letter-spacing: 1px;"><strong>Customer</strong> Photos</div> 4367 <div class="col-sm-4 col-xs-6 text-center"> 4368 <div><a class="imagePopupHandler" href="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-1_zm.jpg"><img class="imagebox" src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-1_th.jpg" alt="Holy Family OutdoorNativitySet" loading="lazy"></a></div> 4369 </div> 4370 <div class="col-sm-4 col-xs-6 text-center"> 4371 <div><a class="imagePopupHandler" href="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-2_zm.jpg"><img class="imagebox" src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-2_th.jpg" alt="Holy Night OutdoorNativitySet" loading="lazy"></a></div> 4372 </div> 4373 <div class="col-sm-4 col-xs-6 text-center"> 4374 <div><a class="imagePopupHandler" href="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-3_zm.
4374jpg"><img class="imagebox" src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-3_th.jpg" alt="Holy Family OutdoorNativitySet in snow" loading="lazy"></a></div> 4375 </div> 4376 <div class="col-sm-4 col-xs-6 text-center"> 4377 <div><a class="imagePopupHandler" href="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/Holy_Family_with_Angels1.jpg"><img class="imagebox" src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/Holy_Family_with_Angels_mb.jpg" alt="Complete Holy Family OutdoorNativitySet" loading="lazy"></a></div> 4378 </div> 4379 <div class="col-sm-4 col-xs-6 text-center"> 4380 <div><a class="imagePopupHandler" href="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-5_zm.jpg"><img class="imagebox" src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/nativity-gallery-5_th.jpg" alt="Holy Family OutdoorNativitySet with Angels" loading="lazy"></a></div> 4381 </div> 4382 <div class="col-sm-4 col-xs-6 text-center"> 4383 <div><a class="imagePopupHandler" href="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/Brenda_Peeler.jpg"><img class="imagebox" src="https://www.outdoornativitysets.com/media/wysiwyg/outdoor-nativity-sets/customer-gallery/Brenda_Peeler_mb.jpg" alt="Joy OutdoorNativitySet" loading="lazy"></a></div> 4384 </div> 4385</div> 4386</div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><!-- Container Bottom --> 4387 </div> 4388</div> 4389</div><style type="text/css">.background-image-6ab6e354b9458 {background-image: url(https://www.outdoornativitysets.com/media/wysiwyg/Outdoor_Nativity_Hero_-_Desktop_1.jpg);}@media only screen and (max-width: 768px) and (min-width: 640px) {.background-image-6ab6e354b9458 {background-image: url(https://www.outdoornativitysets.com/media/wysiwyg/Outdoor_Nativity_Hero_-_Mobile_1.jpg);}}@media only screen and (max-width: 640px) {.background-image-6ab6e354b9458 {background-image: url(https://www.outdoornativitysets.com/media/wysiwyg/Outdoor_Nativity_Hero_-_Mobile_1.jpg);}}</style></div></div>
4389<script> 4390 function initFooter () { 4391 return { 4392 cart: {}, 4393 isCartOpen: false, 4394 getData(data) { 4395 if (data.cart) { this.cart = data.cart } 4396 }, 4397 isCartEmpty() { 4398 return !this.cart.summary_count 4399 }, 4400 toggleCart(event) { 4401 if (event.detail && event.detail.isOpen !== undefined) { 4402 this.isCartOpen = event.detail.isOpen 4403 if (!this.isCartOpen && this.$refs && this.$refs.cartButton) { 4404 this.$refs.cartButton.focus() 4405 } 4406 } else { 4407 this.isCartOpen = true 4408 } 4409 } 4410 } 4411 } 4412</script>
4412 4413<div class="sticky-footer fixed bottom-0 left-0 right-0 bg-new-blue md:hidden z-9 flex items-center" 4414 x-data="initFooter()" 4415 @private-content-loaded.window="getData(event.detail.data)" 4416> 4417 <a class="telephone block w-1/3 p-4 float-left text-left pl-8" href="tel://8666337961"> 4418 <span class="text-[0] block">Call</span> 4419 <div class="phone-inner text-white"> 4420 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" width="30" height="30" aria-hidden="true"> 4421 <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"/> 4422</svg> 4423 </div> 4424 </a> 4425 <a class="minicart action showcart block float-left w-1/3 p-4 text-center" 4426 href="https://www.outdoornativitysets.com/checkout/cart/" 4427 x-ref="cartButton" 4428 @click.prevent.stop="() => { 4429 $dispatch('toggle-cart', { isOpen: !isCartOpen }) 4430 }" 4431 @toggle-cart.window="toggleCart($event)" 4432 :aria-expanded="isCartOpen" 4433 aria-haspopup="dialog" 4434 > 4435 <div class="minicart-inner text-white flex justify-center items-center text-2.5xl"> 4436 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" width="32" height="32" aria-hidden="true"> 4437 <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"/> 4438</svg> 4439 <span class="text hidden">My Cart</span> 4440 <span class="counter qty"> 4441 <span>(</span> 4442 <span class="counter-number" 4443 x-text="isCartEmpty() ? 0 : cart.summary_count" 4444 ></span> 4445 <span>)</span> 4446 </span> 4447 </div> 4448 </a> 4449 <a href="#" class="openZendeskHelpButton help block float-left w-1/3 p-4 text-right pr-8"> 4450 <span class="text-[0] block">Help</span> 4451 <div class="help-inner text-white float-right"> 4452 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" width="36" height="36" aria-hidden="true"> 4453 <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"/> 4454</svg> 4455 </div> 4456 </a> 4457 4458 4459
4459<script type="text/javascript"> 4460 document.addEventListener('DOMContentLoaded', function() { 4461 // lifts up the regular page footer the height of the sticky footer so all footer content is visible. 4462 var stickyFooterHeight = document.querySelector('.sticky-footer').clientHeight ; 4463 4464 document.querySelector('.page-wrapper').style['margin-bottom'] = stickyFooterHeight + 'px'; 4465 }); 4466 </script>
4466 4467</div> 4468</main><footer class="page-footer"><div class="footer content"> <!-- Block: footer_content --> 4469<style> 4470.page-footer { 4471 padding-bottom: 0 !important; 4472 background: #111; 4473} 4474.page-footer .copyright { background-color: #111; } 4475.page-footer .footer-row a { 4476 color: #fff; 4477} 4478.page-layout-checkout .footer-lite { display: none; } 4479 4480.contactfooter_row { 4481 display: flex; 4482 padding-top: 30px; 4483} 4484.contactfooter_column { 4485 flex: 50%; 4486 padding: 3%; 4487 border-radius: 8px; 4488 min-height: 300px; 4489 margin: 3% 1.5%; 4490} 4491.contactfooter_column h2 { 4492 margin-top: 0; 4493 font-size: 23px; 4494 margin-bottom: 6px !important; 4495} 4496.contactfooter_column p span { 4497 font-size: 13px; 4498} 4499.page-footer .block.newsletter .content p { 4500 color: white; 4501} 4502#Footer_email_signup button#btnsubmit { 4503 background-color: white; 4504 color: #a32c28; 4505 height: 32px; 4506} 4507.page-footer .block.newsletter input[type="email"] { 4508 border: 1px solid #fff; 4509 color: #a32c28; 4510 border-radius: 4px; 4511 background: white; 4512} 4513.page-footer .fa-pinterest, 4514.page-footer .fa-facebook { 4515 color: #fff; 4516} 4517.page-footer { padding-bottom: 0 !important; } 4518.page-footer .footer-links>div { width: 33%; } 4519.footer.content { border-top: 0; padding-top: 0; } 4520.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; } 4521.page-footer .footer.content .social-links { clear: both; } 4522 4523@media (max-width: 768px), print { 4524 .footer.content .h3 { margin-top: 2rem; } 4525 .page-footer .footer-links>div { padding: 0; } 4526} 4527</style> 4528 4529<div class="footer-lite hidden-xs"> 4530<div class="contactfooter_row"> 4531 <div class="contactfooter_column" style="background-color:#fff;"> 4532 <h2>Send us a Message</h2> 4533 <p>After hours or prefer to schedule a call? No problem. 4534Send us a message and weâll jump right on it.</p> 4535<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> 4536 </div> 4537 <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;"> 4538 <h2 style="color: white;">How can we help?</h2> 4539 <p style="color: white;line-height: 24px;">Let us help bring your family the peace and joy that comes with the Christmas season.<br> 4540<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> 4541<span><a href="https://www.outdoornativitysets.com/contact-us" target="_blank" rel="noopener"> 4542 <u>See our holiday hours</u> 4543</a> 4544</span></p> 4545 </div> 4546</div> 4547</div> 4548 4549<div class="footer-lite"> 4550 4551</div> 4552<div class="footer-links footer-lite"> 4553 <div id="footer-row-1" class="footer-row"> 4554<div class="h3">Account</div> 4555<div class="col-sm-12 col-xs-6 no-pad"><a href="/customer/account/create">REGISTER</a></div> 4556<div class="col-sm-12 col-xs-6 no-pad"><a href="/customer/account/login">LOGIN</a></div> 4557<div class="col-sm-12 col-xs-6 no-pad"><a href="/sales/order/history">ORDER HISTORY</a></div> 4558</div><div id="footer-row-2" class="footer-row"> 4559<div class="h3">Company</div> 4560<div class="col-sm-12 col-xs-6 no-pad"><a href="/about-us">ABOUT US</a></div> 4561<div class="col-sm-12 col-xs-6 no-pad"><a href="/testimonials">TESTIMONIALS</a></div> 4562<div class="col-sm-12 col-xs-6 no-pad"><a href="/contact-us">CONTACT US</a></div> 4563<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> 4564<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> 4565</div><div id="footer-row-3" class="footer-row"> 4566<div class="h3">Services</div> 4567<div class="col-sm-12 col-xs-6 no-pad"><a href="/shipping-policy">SHIPPING POLICY</a></div> 4568<div class="col-sm-12 col-xs-6 no-pad"><a href="/return-policy">RETURN POLICY</a></div> 4569<div class="col-sm-12 col-xs-6 no-pad"><a href="/privacy-policy">PRIVACY POLICY</a></div> 4570<div class="col-sm-12 col-xs-6 no-pad"><a href="/terms-of-use">TERMS OF USE</a></div> 4571</div> 4572</div> 4573<style> 4574#utility-navigation .social-links { display: none; } 4575.footer.content .free-shipping-nav { display: none; } 4576.page-footer .social-links { text-align: center; } 4577.page-footer .social-links .top-social { display: inline-block; margin: 0 10px; } 4578</style> 4579<div class="free-shipping-nav"> 4580 <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> 4581 <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> 4582</div> 4583 4584<div class="social-links"> 4585<div class="social-nav"> 4586 4587 4588 <div class="f-right top-social"><a href="https://www.facebook.com/OutdoorNativitySets" target="_blank"><span class="fa fa-facebook"> </span></a></div> 4589 4590 <div class="f-right top-social"><a href="https://www.pinterest.com/OutdoorNativity" target="_blank"><span class="fa fa-pinterest"> </span></a></div> 4591 4592 4593</div> 4594</div> 4595 4596<div style="display: block; clear: both; padding-top: 2rem;"> 4597<div style="text-align: center; color:white;">Display the <i>True Meaning of Christmas</i></div> 4598<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> 4599</div> <small class="copyright text-sm text-gray-800 sm:ml-6 sm:mt-0 mt-4"> 4600 <span>Copyright © 2026 OutdoorNativitySets. All rights reserved.</span> 4601</small> 4602</div></footer> 4603
4603<script async type="text/javascript" src="https://dguqe.outdoornativitysets.com/load"></script>
4603 4604
4604<script> 4605 /** 4606 * ********** 4607 * ********** 4608 * Always duplicate edits made in app/code/Kadro/BlotoutEdgetag/view/frontend/web/js/ 4609 * with the applicable files in app/design/frontend/Kadro/boat_outfitters_hyva/Kadro_BlotoutEdgetag/templates 4610 * (The Boat Outfitters Hyva theme files are there) 4611 * ********** 4612 * ********** 4613 */ 4614 4615 const edgeUrl = "https://dguqe.outdoornativitysets.com"; 4616 const checkoutUrl = "https://www.outdoornativitysets.com/checkout"; 4617 const truIdCookieUrl = "https://www.outdoornativitysets.com/blotoutedgetag/index/cookie"; 4618 const footerEmailButton = document.querySelector('form#Footer_email_signup button#btnsubmit'); 4619 let cart = null; 4620 4621 /** 4622 * sends a POST request to the server, which sets the tru id cookie 4623 */ 4624 function requestTruIdCookie() { 4625 fetch( 4626 truIdCookieUrl, 4627 { 4628 method: 'POST', 4629 headers: { 4630 'X-Requested-With': 'XMLHttpRequest', 4631 } 4632 } 4633 ).then(response => { 4634 if (!response.ok) { 4635 console.error("[Blotout] An error occurred when setting truid cookie."); 4636 } 4637 }).catch(err => console.error('[Blotout] TruID cookie request failed:', err)); 4638 } 4639 4640 /** 4641 * set up a handler on click of the footer newsletter email form 4642 */ 4643 function initFooterEmail() { 4644 if (!footerEmailButton) { 4645 return; 4646 } 4647 4648 footerEmailButton.addEventListener('click', function() { 4649 const userEmailInput = document.querySelector('form#Footer_email_signup input#Footer_id_email'); 4650 const userEmail = userEmailInput ? userEmailInput.value : ''; 4651 if (userEmail !== '') { 4652 edgetag('user', 'email', userEmail); 4653 } 4654 }); 4655 } 4656 4657 /** 4658 * set up a handler to listen for when the Klaviyo HTTP request is made 4659 */ 4660 function initKlaviyoEmail() { 4661 const originalOpen = XMLHttpRequest.prototype.open; 4662 const originalSend = XMLHttpRequest.prototype.send; 4663 4664 XMLHttpRequest.prototype.open = function(method, url, async, user, password) { 4665 this._method = method; 4666 this._url = url; 4667 return originalOpen.call(this, method, url, async, user, password); 4668 }; 4669 4670 XMLHttpRequest.prototype.send = function(body) { 4671 const url = this._url || ''; 4672 console.log(`[Blotout] [KlaviyoHook] XMLHttpRequest sent to URL: ${url}`); 4673 // Only continue if this is a Klaviyo Subscriptions request 4674 if (this._method === 'POST' && url.includes('klaviyo.com/client/subscriptions/')) { 4675 console.log(`[Blotout] [KlaviyoHook] This is a Klaviyo request`); 4676 if (typeof body === 'string') { 4677 console.log(`[Blotout] [KlaviyoHook] Format is approved`); 4678 try { 4679 const json = JSON.parse(body); 4680 const email = json?.data?.attributes?.profile?.data?.attributes?.email; 4681 console.log(`[Blotout] [KlaviyoHook] email: ${email}`); 4682 if (email && !klaviyoEdgetagEmailSent) { 4683 edgetag('user', 'email', email); 4684 edgetag('tag', 'Lead'); 4685 klaviyoEdgetagEmailSent = true; 4686 console.log(`[Blotout] [KlaviyoHook] tagged email: ${email}`); 4687 } 4688 } catch (err) { 4689 console.warn('[Blotout] [KlaviyoHook] couldn\'t parse body, skipping tag', err); 4690 } 4691 } 4692 } 4693 4694 try { 4695 return originalSend.call(this, body); 4696 } catch (err) { 4697 console.error('[Blotout] [KlaviyoHook] Error sending data to blotout:', err); 4698 } 4699 }; 4700 } 4701 4702 let klaviyoEdgetagEmailSent = false;
4703 4704 function escapeCategoryString(category) { 4705 return category.trim().replace(/[^a-zA-Z0-9 ]/g, ''); 4706 } 4707 4708 function buildProductCategoryData() { 4709 // Fire ViewContent tag to send product info to Edgetag 4710 const productCategoryArray = document.querySelectorAll('nav.breadcrumbs ol.items li'); 4711 let transformedProductCategoryArray = []; 4712 for (let i = 1; i < productCategoryArray.length; i++) { 4713 transformedProductCategoryArray.push(escapeCategoryString(productCategoryArray[i].innerText)); 4714 } 4715 return transformedProductCategoryArray.join(', '); 4716 } 4717 4718 /** 4719 * fires edge tag containing product data 4720 * @param oldCart 4721 * @param newCart 4722 */ 4723 function addToCartEdgeTag(newCart, oldCart) { 4724 // find the item that changed or appeared 4725 const newItem = newCart.items.filter(item => !oldCart.items.includes(item))[0]; 4726 if (!newItem) return; 4727 4728 // locate that item in the old cart 4729 let oldItem = oldCart.items.find(item => item.item_id === newItem.item_id); 4730 // subtract the qtys, should they exist, to get the qty added 4731 let qtyAdded = newItem.qty - (oldItem?.qty || 0); 4732 4733 if (qtyAdded > 0) { 4734 // no other way to grab category info, so getting from breadcrumbs 4735 const product_category = buildProductCategoryData(); 4736 4737 // trigger edgetag using item data 4738 edgetag('tag', 'AddToCart', { 4739 currency: 'USD', 4740 value: newItem.product_price_value * qtyAdded, 4741 contents: [{ 4742 id: newItem.parent_product_sku, 4743 variantId: newItem.product_type === 'configurable' ? newItem.product_sku : '', 4744 quantity: qtyAdded, 4745 item_price: newItem.product_price_value, 4746 title: newItem.product_name.replace(/"/g, '"'), 4747 category: product_category, 4748 url: newItem.product_url, 4749 image: newItem.product_image.src 4750 }], 4751 checkoutUrl: checkoutUrl 4752 }); 4753 } 4754 } 4755 4756 /** 4757 * sets up a handler for on click of add to cart. Compares cart state before and after and fires based on the diff 4758 */ 4759 function cartChangeCheck(event) { 4760 const oldCart = event.detail.data.oldCart; 4761 const newCart = event.detail.data.privateData.cart; 4762 4763 if (newCart && (!oldCart.items || oldCart.summary_count !== newCart.summary_count)) { 4764 addToCartEdgeTag(newCart, oldCart); 4765 } 4766 } 4767 4768 /** 4769 * prepares a listener for the Attentive marketing popup, and captures info from it 4770 */ 4771 function initAttentivePopup() { 4772 window.addEventListener('message', event => { 4773 if (event.origin !== 'https://creatives.attn.tv' || !event.data?.__attentive) return; 4774 try { 4775 const data = event.data.__attentive; 4776 if (!data.action?.includes('LEAD')) return; 4777 4778 const user = {}; 4779 if (data.email) user.email = data.email; 4780 4781 let user_telephone = data.phone || ''; 4782 // Properly format the number (if it's not already): 4783 // -- proper E.164 format (e.g. 7045551212), plus a prepended "+1" (assumes US telephone numbers) -- 4784 if (!/^\+1\d{10}$/.test(user_telephone)) { 4785 user_telephone = '+1' + user_telephone.replace(/[^0-9]/g, ''); 4786 } 4787 if (user_telephone) user.phone = user_telephone; 4788 4789 if (user.email || user.phone) { 4790 edgetag('data', user); 4791 edgetag('tag', 'Lead'); 4792 } 4793 } catch (e) { 4794 console.error('[Edgetag]', e); 4795 } 4796 }, { once: true }); 4797 } 4798 4799 function initializeBlotout() { 4800 edgetag('tag', 'PageView'); 4801 initFooterEmail(); 4802 initAttentivePopup();
4803 // Do not initiate Klaviyo in checkout, but DO allow it in the cart 4804 if (!window.location.pathname.includes('/checkout/') || window.location.pathname.includes('/checkout/cart')) { 4805 initKlaviyoEmail(); 4806 } 4807 window.dispatchEvent(new CustomEvent('blotout-initialized')); 4808 } 4809 4810 // initialize before document ready 4811 window.edgetag = window.edgetag || function() {(edgetag.stubs = edgetag.stubs || []).push(arguments)}; 4812 edgetag('init', { 4813 edgeURL: edgeUrl, 4814 disableConsentCheck: true 4815 }); 4816 4817 // POST to magento to set up cookie 4818 requestTruIdCookie(); 4819 4820 window.addEventListener('cart-change', cartChangeCheck); 4821 hyva.alpineInitialized(initializeBlotout); 4822 </script>
4822 4823<span style="display:none;"> 4824 <span id="klevu_sessionId"></span> 4825 <span id="klevu_loginCustomerGroup"></span> 4826 <span id="klevu_loginCustomerEmail"></span> 4827 <span id="klevu_shopperIP"></span> 4828</span> 4829
4830<script type="text/javascript"> 4831 4832 var updateKlevuSessionDataElementsFromLocalStorage = function() { 4833 var klevuLocalStorage = JSON.parse(window.localStorage.getItem( 4834 'klv_mage' 4835 ) || '{}'); 4836 var klevuMagentoCustomerDataKey = 'customerData'; 4837 var klevuLocalStorageCustomerData = klevuLocalStorage.hasOwnProperty(klevuMagentoCustomerDataKey) 4838 ? klevuLocalStorage[klevuMagentoCustomerDataKey] 4839 : {}; 4840 document.getElementById('klevu_sessionId').innerText = klevuLocalStorageCustomerData.hasOwnProperty('session_id') 4841 ? klevuLocalStorageCustomerData.session_id 4842 : ''; 4843 document.getElementById('klevu_loginCustomerGroup').innerText = klevuLocalStorageCustomerData.hasOwnProperty('customer_group_id') 4844 ? klevuLocalStorageCustomerData.customer_group_id 4845 : ''; 4846 document.getElementById('klevu_loginCustomerEmail').innerText = klevuLocalStorageCustomerData.hasOwnProperty('id_code') 4847 ? klevuLocalStorageCustomerData.id_code 4848 : ''; 4849 document.getElementById('klevu_shopperIP').innerText = klevuLocalStorageCustomerData.hasOwnProperty('shopper_ip') 4850 ? klevuLocalStorageCustomerData.shopper_ip 4851 : ''; 4852 }; 4853 updateKlevuSessionDataElementsFromLocalStorage(); 4854 4855 document.addEventListener( 4856 'klevu.customerData.loaded', 4857 updateKlevuSessionDataElementsFromLocalStorage 4858 ); 4859 </script>
4859<div style="display: none;" id="attentiveMagentoPage"></div>
4860<script type="text/javascript"> 4861 document.addEventListener("DOMContentLoaded", function () { 4862 'use strict'; 4863 4864 let categoryHoverImageUrl = "https://www.outdoornativitysets.com/categoryhoverimage/image/image/"; 4865 4866 const klevuQuickSearchBlockSelector = '#maincontent .klevuQuickSearchingArea .klevuProduct:not([hover-events-added])'; 4867 const magentoProductBlockSelector = '#maincontent .product-items .product-item:not([hover-events-added])'; 4868 const klevuProductBlockSelector = '#maincontent .kuResultsListing .klevuProduct .klevuImgWrap:not([hover-events-added])'; 4869 4870 async function createHoverImage(productId, originalImage) { 4871 const response = await fetch(categoryHoverImageUrl + '?' + new URLSearchParams({ 4872 product_id: productId 4873 })); 4874 4875 if (response.ok) { 4876 const responseData = await response.json(); 4877 if (responseData.success) { 4878 const hoverImage = document.createElement('img'); 4879 hoverImage.classList.add('hover-image'); 4880 hoverImage.style.opacity = 0; 4881 hoverImage.style.transition = 'opacity 0.5s'; 4882 hoverImage.src = responseData.image_src; 4883 4884 originalImage.insertAdjacentElement('afterend', hoverImage); 4885 4886 showHoverImage(hoverImage); 4887 return; 4888 } 4889 } 4890 4891 originalImage.setAttribute("no-category-hover", true); 4892 } 4893 4894 function showHoverImage(hoverImage) { 4895 if (hoverImage) { 4896 hoverImage.style.opacity = 1; 4897 } 4898 } 4899 function hideHoverImage(hoverImage) { 4900 if (hoverImage) { 4901 hoverImage.style.opacity = 0; 4902 } 4903 } 4904 4905 function initMouseEvents() { 4906 // handlers for quicksearch area 4907 document.querySelectorAll(klevuQuickSearchBlockSelector).forEach(item => { 4908 item.setAttribute('hover-events-added', true); 4909 4910 item.addEventListener('mouseenter', function (e) { 4911 const originalImage = e.target.querySelector('.klevuQuickImgWrap img'); 4912 const hoverImage = e.target.querySelector('img.hover-image'); 4913 if (!originalImage.getAttribute('no-category-hover')) { 4914 if (!hoverImage) { 4915 const productIds = e.target.querySelector('a').getAttribute("data-id").split("-"); 4916 createHoverImage(productIds[0], originalImage); 4917 } else { 4918 showHoverImage(hoverImage); 4919 } 4920 } 4921 }); 4922 4923 item.addEventListener('mouseleave', function (e) { 4924 let hoverImage = e.target.querySelector('img.hover-image'); 4925 const that = this; 4926 if (!hoverImage) { 4927 setTimeout(function () { 4928 hoverImage = that.querySelector('img.hover-image'); 4929 hideHoverImage(hoverImage); 4930 }, 1000); 4931 } else { 4932 hideHoverImage(hoverImage); 4933 } 4934 }); 4935 }); 4936 4937 4938 // handlers for product sliders area 4939 document.querySelectorAll(magentoProductBlockSelector).forEach(item => { 4940 item.setAttribute('hover-events-added', true); 4941 4942 item.addEventListener('mouseenter', function (e) { 4943 const originalImage = e.target.querySelector('img.product-image-photo'); 4944 const hoverImage = e.target.querySelector('img.hover-image'); 4945 if (!originalImage.getAttribute('no-category-hover')) { 4946 if (!hoverImage && !originalImage.getAttribute('no-category-hover')) { 4947 const productIdInput = e.target.querySelector('input[name="product"]'); 4948 if (productIdInput && productIdInput.value) { 4949 createHoverImage(productIdInput.value, originalImage); 4950 } else { 4951 originalImage.setAttribute("no-category-hover", true); 4952 } 4953 } else { 4954 showHoverImage(hoverImage); 4955 } 4956 } 4957 }); 4958 4959 item.addEventListener('mouseleave', function (e) { 4960 let hoverImage = e.target.querySelector('img.hover-image'); 4961 const that = this 4962 if (!hoverImage) { 4963 setTimeout(function () { 4964 hoverImage = that.querySelector('img.hover-image'); 4965 hideHoverImage(hoverImage); 4966 }, 1000); 4967 } else { 4968 hideHoverImage(hoverImage); 4969 } 4970 }); 4971 }); 4972 4973 4974 // handler for klevu products grid area 4975 document.querySelectorAll(klevuProductBlockSelector).forEach(item => { 4976 item.setAttribute('hover-events-added', true); 4977 4978 item.addEventListener('mouseenter', function (e) { 4979 const originalImage = e.target.querySelector('img.kuProdImg'); 4980 const hoverImage = e.target.querySelector('img.hover-image'); 4981 if (!originalImage.getAttribute('no-category-hover')) { 4982 if (!hoverImage && !originalImage.getAttribute('no-category-hover')) { 4983 const productIds = e.target.querySelector('.klevuProductClick').getAttribute("data-id").split("-"); 4984 createHoverImage(productIds[0], originalImage); 4985 } else { 4986 showHoverImage(hoverImage); 4987 } 4988 } 4989 }); 4990 4991 item.addEventListener('mouseleave', function (e) { 4992 let hoverImage = e.target.querySelector('img.hover-image'); 4993 const that = this; 4994 if (!hoverImage) { 4995 setTimeout(function () { 4996 hoverImage = that.querySelector('img.hover-image'); 4997 hideHoverImage(hoverImage); 4998 }, 1000); 4999 } else { 5000 hideHoverImage(hoverImage); 5001 } 5002 }); 5003 }); 5004 } 5005 5006 document.addEventListener("klevuLoaded", function () { 5007 initMouseEvents(); 5008 }); 5009 }); 5010</script>
5010 5011 5012
5013<script type="text/javascript"> 5014 var klevu_cmsSearchEnabled = false; 5015</script>
5015 5016 5017
5018<script> 5019 (() => { 5020 function src_default(Alpine) { 5021 Alpine.directive("intersect", Alpine.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { 5022 let evaluate = evaluateLater(expression); 5023 let options = { 5024 rootMargin: getRootMargin(modifiers), 5025 threshold: getThreshold(modifiers) 5026 }; 5027 let observer = new IntersectionObserver((entries) => { 5028 entries.forEach((entry) => { 5029 if (entry.isIntersecting === (value === "leave")) 5030 return; 5031 evaluate(); 5032 modifiers.includes("once") && observer.disconnect(); 5033 }); 5034 }, options); 5035 observer.observe(el); 5036 cleanup(() => { 5037 observer.disconnect(); 5038 }); 5039 })); 5040 } 5041 function getThreshold(modifiers) { 5042 if (modifiers.includes("full")) 5043 return 0.99; 5044 if (modifiers.includes("half")) 5045 return 0.5; 5046 if (!modifiers.includes("threshold")) 5047 return 0; 5048 let threshold = modifiers[modifiers.indexOf("threshold") + 1]; 5049 if (threshold === "100") 5050 return 1; 5051 if (threshold === "0") 5052 return 0; 5053 return Number(`.${threshold}`); 5054 } 5055 function getLengthValue(rawValue) { 5056 let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/); 5057 return match ? match[1] + (match[2] || "px") : void 0; 5058 } 5059 function getRootMargin(modifiers) { 5060 const key = "margin"; 5061 const fallback = "0px 0px 0px 0px"; 5062 const index = modifiers.indexOf(key); 5063 if (index === -1) 5064 return fallback; 5065 let values = []; 5066 for (let i = 1; i < 5; i++) { 5067 values.push(getLengthValue(modifiers[index + i] || "")); 5068 } 5069 values = values.filter((v) => v !== void 0); 5070 return values.length ? values.join(" ").trim() : fallback; 5071 } 5072 5073 document.addEventListener("alpine:init", () => { 5074 window.Alpine.plugin(src_default); 5075 }); 5076 })(); 5077</script>
vendor: 1 bytes, line 5077
5077
5078<script> 5079 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"})) { 5080 document.querySelectorAll(selector).forEach(el => el.setAttribute('x-defer', `${deferUntil}`)); 5081 } 5082</script>
vendor: 1 bytes, line 5082
5082
5083<script> 5084 (function () { 5085 "use strict"; 5086 5087 const hasAlpine = new Promise(resolve => { 5088 window.addEventListener('alpine:initialized', resolve, {once: true, passive: true}); 5089 }); 5090 5091 const hasInteract = new Promise(resolve => { 5092 (events => { 5093 const onInteract = () => { 5094 resolve(); 5095 events.forEach(type => window.removeEventListener(type, onInteract)); 5096 } 5097 events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true})) 5098 })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) 5099 }); 5100 5101 const onIntersect = (el) => { 5102 return new Promise(resolve => { 5103 const observer = new IntersectionObserver(entries => { 5104 for (const entry of entries) { 5105 if (entry.isIntersecting) { 5106 observer.disconnect() 5107 resolve(); 5108 } 5109 } 5110 }, {}); 5111 observer.observe(el); 5112 }); 5113 } 5114 5115 function runComponent(el) { 5116 hasAlpine.then(() => { 5117 el.removeAttribute('x-ignore'); 5118 queueMicrotask(() => Alpine.initTree(el)); 5119 }); 5120 } 5121 5122 function initDeferredComponents() { 5123 document.querySelectorAll('[x-data][x-defer]').forEach(el => { 5124 el.setAttribute('x-ignore', ''); 5125 const deferUntil = (el.getAttribute('x-defer') || '').trim(); 5126 switch (deferUntil) { 5127 case 'interact': 5128 hasInteract.then(() => runComponent(el)); 5129 break; 5130 case 'intersect': 5131 onIntersect(el).then(() => runComponent(el)) 5132 break; 5133 case 'idle': 5134 window.requestIdleCallback 5135 ? window.requestIdleCallback(() => runComponent(el), {timeout: 4000}) 5136 : setTimeout(() => runComponent(el), 4000); 5137 break; 5138 case 'eager': 5139 runComponent(el); 5140 break; 5141 default: 5142 if (deferUntil.startsWith('event:') && deferUntil.length > 6) { 5143 window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true}); 5144 } 5145 } 5146 }); 5147 } 5148 5149 window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true}); 5150 })() 5151</script>
5151 5152
5153<script type="module" 5154 src="https://www.outdoornativitysets.com/static/version1789694905/frontend/Kadro/outdoor_nativity_sets_hyva/en_US/Hyva_Theme/js/alpine3.min.js" 5155 defer 5156 crossorigin 5157></script>
vendor: 1 bytes, line 5157
5157
5158<script> 5159 'use strict'; 5160 function dispatchMessages(messages, hideAfter) { 5161 const messagesEvent = new CustomEvent("messages-loaded", { 5162 detail: { 5163 messages: messages, 5164 hideAfter: hideAfter 5165 } 5166 }); 5167 window.dispatchEvent(messagesEvent); 5168 } 5169 5170 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 5171 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 5172 } 5173 5174 (function( hyva, undefined ) { 5175 5176 hyva.initFormKey = () => { 5177 const inputSelector = 'input[name="form_key"]', 5178 formKey = hyva.getFormKey(); 5179 5180 Array.from(document.querySelectorAll(inputSelector)).map(function (input) { 5181 input.value = formKey 5182 }); 5183 } 5184 5185 hyva.initMessages = () => { 5186 try { 5187 const messages = hyva.getCookie('mage-messages'); 5188 window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; 5189 5190 dispatchMessages(window.mageMessages); 5191 5192 // empty `mage-messages` cookie 5193 const skipSetDomain = true; 5194 hyva.setCookie('mage-messages','', -1, skipSetDomain); 5195 5196 } catch (error) { 5197 console.warn('Error parsing Cookie Messages:', error); 5198 } 5199 } 5200 5201 window.addEventListener('DOMContentLoaded', hyva.initFormKey); 5202 hyva.alpineInitialized(hyva.initMessages) 5203 5204 }( window.hyva = window.hyva || {} )); 5205</script>
vendor: 1 bytes, line 5205
5205
5206<script> 5207 'use strict'; 5208 { 5209 const private_content_key = 'mage-cache-storage'; 5210 const private_content_expire_key = 'mage-cache-timeout'; 5211 const private_content_version_key = 'private_content_version'; 5212 const section_data_ids_key = 'section_data_ids'; 5213 const mage_cache_session_id_key = 'mage-cache-sessid'; 5214 const last_visited_store_key = 'last_visited_store'; 5215 5216 const ttl = 3600; 5217 5218 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 5219 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 5220 } 5221 5222 function loadSectionData () { 5223 const browserStorage = hyva.getBrowserStorage(); 5224 if (!browserStorage) { 5225 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 5226 [{ 5227 type: "warning", 5228 text: "Please enable LocalStorage in your browser." 5229 }] 5230 ); 5231 return; 5232 } 5233 try { 5234 let isInvalid = false; 5235 5236 if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) { 5237 isInvalid = true; 5238 } 5239 hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false); 5240 5241 if (!hyva.getCookie(mage_cache_session_id_key)) { 5242 isInvalid = true; 5243 browserStorage.removeItem(private_content_key); 5244 const skipSetDomain = true; 5245 const days = false; 5246 hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain) 5247 } 5248 5249 const cookieVersion = hyva.getCookie(private_content_version_key); 5250 const storageVersion = browserStorage.getItem(private_content_version_key); 5251 5252 if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) { 5253 isInvalid = true; 5254 } 5255 5256 const privateContentExpires = browserStorage.getItem(private_content_expire_key); 5257 if (privateContentExpires && new Date(privateContentExpires) < new Date()) { 5258 browserStorage.removeItem(private_content_key); 5259 } 5260 5261 if (isInvalid && cookieVersion) { 5262 fetchPrivateContent([]); 5263 } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) { 5264 const privateContent = JSON.parse(browserStorage.getItem(private_content_key)); 5265 if ( 5266 privateContent && 5267 privateContentExpires && 5268 privateContent.cart && 5269 privateContent.customer 5270 ) { 5271 dispatchPrivateContent(privateContent); 5272 } else { 5273 fetchPrivateContent([]); 5274 } 5275 } else { 5276 if (document.getElementById('default-section-data')) { 5277 const privateContent = JSON.parse(document.getElementById('default-section-data').innerText.trim()); 5278 dispatchPrivateContent(privateContent); 5279 } else { 5280 dispatchPrivateContent({}); 5281 } 5282 } 5283 5284 } catch (error) { 5285 console.warn('Error retrieving Private Content:', error); 5286 } 5287 } 5288 5289 hyva.alpineInitialized(loadSectionData) 5290 window.addEventListener('reload-customer-section-data', loadSectionData); 5291 5292 window.processSectionDataBeforeDispatch = window.processSectionDataBeforeDispatch || (data => data); 5293 5294 function dispatchPrivateContent(data) { 5295 5296 const privateContentEvent = new CustomEvent("private-content-loaded", { 5297 detail: { 5298 data: window.processSectionDataBeforeDispatch(data) 5299 } 5300 }); 5301 window.dispatchEvent(privateContentEvent); 5302 } 5303 5304 function fetchPrivateContent(sections) { 5305 fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, { 5306 method: 'GET', 5307 headers: { 5308 'Content-Type': 'application/json', 5309 'X-Requested-With': 'XMLHttpRequest' 5310 } 5311 }) 5312 .then(response => response.ok && response.json()) 5313 .then( 5314 data => { 5315 if (data) { 5316 try { 5317 const browserStorage = hyva.getBrowserStorage(); 5318 5319 // merge new data preserving non-invalidated sections 5320 const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {}; 5321 5322 if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) { 5323 delete oldSectionData['checkout-data']; 5324 } 5325 const newSectionData = Object.assign(oldSectionData, data); 5326 5327 dispatchPrivateContent(newSectionData); 5328 5329 // don't persist messages, they've been dispatched already 5330 if (newSectionData.messages && newSectionData.messages.messages ) { 5331 newSectionData.messages.messages = []; 5332 } 5333 5334 browserStorage.setItem(private_content_key, JSON.stringify(newSectionData)); 5335 5336 const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString(); 5337 browserStorage.setItem(private_content_expire_key, expiresAt); 5338 5339 const newCookieVersion = hyva.getCookie(private_content_version_key); 5340 browserStorage.setItem(private_content_version_key, newCookieVersion); 5341 5342 // We don't need the section_data_ids in Hyvä, but we store them for compatibility 5343 // with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout 5344 hyva.setCookie( 5345 section_data_ids_key, 5346 JSON.stringify( 5347 Object.keys(data).reduce((sectionDataIds, sectionKey) => { 5348 sectionDataIds[sectionKey] = data[sectionKey]['data_id']; 5349 return sectionDataIds; 5350 }, {}) 5351 ), 5352 false, 5353 true 5354 ); 5355 } catch (error) { 5356 console.warn("Couldn't store privateContent", error); 5357 } 5358 } 5359 } 5360 ); 5361 } 5362 } 5363</script>
vendor: 1 bytes, line 5363
5363
5364<script> 5365 (() => { 5366 document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc())); 5367 })() 5368</script>
vendor: 1 bytes, line 5368
5368
5369<script> 5370 (events => { 5371 const dispatchUserInteractionEvent = () => { 5372 events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent)) 5373 window.dispatchEvent(new Event('init-external-scripts')) 5374 }; 5375 events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true})) 5376 })(['touchstart', 'mousemove', 'wheel', 'scroll', 'keydown']) 5377</script>
vendor: 1 bytes, line 5377
5377
5378<script> 5379 function initWishlist() { 5380 return { 5381 addToWishlist(productId) { 5382 const formKey = hyva.getFormKey(); 5383 const postUrl = BASE_URL + 'wishlist/index/add/'; 5384 5385 fetch(postUrl, { 5386 "headers": { 5387 "content-type": "application/x-www-form-urlencoded; charset=UTF-8", 5388 }, 5389 "body": "form_key=" + formKey + "&product=" + productId + "&uenc=" + hyva.getUenc(), 5390 "method": "POST", 5391 "mode": "cors", 5392 "credentials": "include" 5393 }).then(function (response) { 5394 if (response.redirected) { 5395 window.location.href = response.url; 5396 } else if (response.ok) { 5397 return response.json(); 5398 } else { 5399 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 5400 [{ 5401 type: "warning", 5402 text: "Could\u0020not\u0020add\u0020item\u0020to\u0020wishlist." 5403 }], 5000 5404 ); 5405 } 5406 }).then(function (response) { 5407 if (!response) { return } 5408 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 5409 [{ 5410 type: (response.success) ? "success" : "error", 5411 text: (response.success) 5412 ? "Product\u0020has\u0020been\u0020added\u0020to\u0020your\u0020Wish\u0020List." 5413 : response.error_message 5414 }], 5000 5415 ); 5416 const reloadCustomerDataEvent = new CustomEvent("reload-customer-section-data"); 5417 window.dispatchEvent(reloadCustomerDataEvent); 5418 }).catch(function (error) { 5419 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 5420 [{ 5421 type: "error", 5422 text: error 5423 }], 5000 5424 ); 5425 }); 5426 } 5427 } 5428 } 5429</script>
vendor: 1 bytes, line 5429
5429
5430<script> 5431 function initCompareOnProductList() { 5432 return { 5433 addToCompare(productId) { 5434 const formKey = hyva.getFormKey(); 5435 const postUrl = BASE_URL + 'catalog/product_compare/add/'; 5436 5437 fetch(postUrl, { 5438 "headers": { 5439 "content-type": "application/x-www-form-urlencoded; charset=UTF-8", 5440 }, 5441 "body": "form_key=" + formKey + "&product=" + productId + "&uenc=" + hyva.getUenc(), 5442 "method": "POST", 5443 "mode": "cors", 5444 "credentials": "include" 5445 }).then(function (response) { 5446 if (response.redirected) { 5447 window.location.href = response.url; 5448 } 5449 }).catch(function (error) { 5450 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 5451 [{ 5452 type: "error", 5453 text: error 5454 }], 5000 5455 ); 5456 }); 5457 } 5458 }; 5459 } 5460</script>
5460 5461<!-- Account type: 'Google Tag Manager' is not supported -->
5462<script> 5463 function initConfigurableOptions(productId, optionConfig, cascadingOptions = false) { 5464 5465 function findPathParam(key) { 5466 const baseUrl = (BASE_URL.substring(0, 2) === '//' ? 'http:' : '') + BASE_URL; 5467 const baseUrlParts = (new URL(baseUrl)).pathname.replace(/\/$/, '').split('/'); 5468 const pathParts = window.location.pathname.split('/').slice(baseUrlParts.length + 3); 5469 for (let i = 0; i < pathParts.length; i += 2) { 5470 if (pathParts[i] === key && pathParts.length > i) { 5471 return pathParts[i + 1]; 5472 } 5473 } 5474 } 5475 5476 return { 5477 optionConfig, 5478 productId, 5479 cascadingOptions, 5480 itemId: (new URLSearchParams(window.location.search)).get('id') || findPathParam('id'), 5481 allowedAttributeOptions: [], 5482 selectedValues: [], 5483 init() { 5484 this.findAllowedAttributeOptions(); 5485 this.$nextTick(() => { 5486 if (typeof this.optionConfig.defaultValues === 'object') { 5487 for (const [attributeId, value] of Object.entries(this.optionConfig.defaultValues)) { 5488 this.changeOption(attributeId, value + ''); 5489 } 5490 } 5491 }); 5492 5493 // Set up child settings if cascading options 5494 if (this.cascadingOptions) { 5495 this.setChildSettings(); 5496 } 5497 5498 // When pivot options are updated, trigger event to be listened to 5499 this.$watch('allowedAttributeOptions', value => this.optionsUpdated()); 5500 }, 5501 optionsUpdated() { 5502 window.dispatchEvent( 5503 new CustomEvent( 5504 'configurableUpdated', 5505 { 5506 detail: '' 5507 } 5508 ) 5509 ); 5510 }, 5511 /** 5512 * Set each option's child settings, and next/prev option setting. Fill (initialize) 5513 * an option's list of selections as needed or disable an option's setting. 5514 * @private 5515 */ 5516 setChildSettings: function () { 5517 const allAttributes = this.optionConfig.attributes; 5518 const allAttributesSorted = Object.values(allAttributes).sort((a,b)=>{ 5519 return a.position - b.position 5520 } 5521 ); 5522 5523 let childSettings = [], 5524 settings = allAttributesSorted, 5525 index = settings.length, 5526 option; 5527 5528 while (index--) { 5529 option = settings[index]; 5530 5531 if (index) { 5532 option.disabled = true; 5533 } else { 5534 option.disabled = false; 5535 } 5536 5537 option.childSettings = childSettings.slice(); 5538 option.prevSetting = settings[index - 1]; 5539 option.nextSetting = settings[index + 1]; 5540 5541 childSettings.push(option); 5542 } 5543 }, 5544 /** 5545 * For a given option element, reset all of its selectable options. Clear any selected 5546 * index, disable the option choice, and reset the option's state if necessary. 5547 * @private 5548 * @param {*} element - The element associated with a configurable option. 5549 */ 5550 resetChildren: function (element) { 5551 if (element.childSettings) { 5552 let self = this; 5553 5554 element.childSettings.forEach(function (set) { 5555 set.disabled = true; 5556 5557 if (typeof self.selectedValues[set.id] !== 'undefined') { 5558 self.changeOption(set.id, ''); 5559 } 5560 }); 5561 } 5562 }, 5563 /** 5564 * Based on current allowed attributes, remove any currently selected attributes that are considered invali
5564d 5565 * @param selectedValues 5566 */ 5567 unsetInvalidOptions: function(selectedValues) { 5568 let allowedAttributeOptions = this.calculateAllowedAttributeOptions(selectedValues); 5569 let allAttributes = Object.values(this.optionConfig.attributes); 5570 5571 allAttributes.forEach(attribute => { 5572 if (typeof selectedValues[attribute.id] !== 'undefined' && 5573 typeof allowedAttributeOptions[attribute.id] !== 'undefined') { 5574 let selectedOptionId = selectedValues[attribute.id]; 5575 let selectedOption = allowedAttributeOptions[attribute.id].find(function(option) { 5576 return option.id === selectedOptionId; 5577 }); 5578 5579 if (typeof selectedOption === 'undefined') { 5580 this.changeOption(attribute.id, ''); 5581 } 5582 } 5583 }); 5584 }, 5585 getAttributeDisabled: function(attributeId) { 5586 let attribute = this.optionConfig.attributes[attributeId]; 5587 if (typeof attribute !== 'undefined' && typeof attribute.disabled !== 'undefined') { 5588 return attribute.disabled; 5589 } else { 5590 return false; 5591 } 5592 }, 5593 findSimpleIndex() { 5594 this.productIndex = this.calculateSimpleIndexForPartialSelection(this.selectedValues); 5595 }, 5596 calculateSimpleIndexForPartialSelection(selectedValues) { 5597 if (selectedValues.length === 0) return 0; 5598 let productIndexIds = Object.keys(this.optionConfig.index); 5599 Object.keys(this.optionConfig.attributes).forEach((attribute) => { 5600 const productsWithAttributeMatch = selectedValues[attribute] 5601 ? productIndexIds.filter((productIndex) => { 5602 return this.optionConfig.index[productIndex][attribute] === this.selectedValues[attribute] 5603 }) 5604 : []; 5605 5606 productIndexIds = productsWithAttributeMatch.length ? productsWithAttributeMatch : productIndexIds 5607 }) 5608 5609 return productIndexIds[0]; 5610 }, 5611 calculateSimpleIndexForFullSelection(selectedValues) { 5612 const productIndexes = this.optionConfig.index; 5613 return Object.keys(productIndexes).find(productIndex => { 5614 const productCandidateOptions = productIndexes[productIndex]; 5615 5616 for (const productOption in productCandidateOptions) { 5617 if ( 5618 ! selectedValues[productOption] || 5619 selectedValues[productOption] !== productCandidateOptions[productOption] 5620 ) { 5621 return false; 5622 } 5623 } 5624 return productIndex; 5625 }); 5626 }, 5627 productIndex: 0, 5628 findAllowedAttributeOptions() { 5629 this.allowedAttributeOptions = this.calculateAllowedAttributeOptions(this.selectedValues); 5630 }, 5631 calculateAllowedAttributeOptions(selectedValues) { 5632 const allAttributes = this.optionConfig.attributes; 5633 const allAttributesSorted = Object.values(allAttributes).sort((a,b) => { 5634 return a.position - b.position 5635 }); 5636 5637 const newAllowedAttributeOptions = []; 5638 5639 allAttributesSorted.forEach(attribute => { 5640 let selectionWithoutAttr = selectedValues; 5641 5642 // If using cascading options, limit available options in cascading order 5643 if (this.cascadingOptions) { 5644 let curAttribute = attribute; 5645 5646 // Remove current attribute and each of its children from selection, such that only the parent options are factored
5646into available product options 5647 while (typeof curAttribute !== 'undefined') { 5648 selectionWithoutAttr = this.removeAttrFromSelection(selectionWithoutAttr, curAttribute.id); 5649 curAttribute = curAttribute.nextSetting; 5650 } 5651 } else { 5652 selectionWithoutAttr = this.removeAttrFromSelection(selectedValues, attribute.id); 5653 } 5654 5655 selectionWithoutAttr = Object.assign({}, selectionWithoutAttr); 5656 const availableIndexes = this.calculateAvailableProductIndexes(selectionWithoutAttr); 5657 newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options.filter(option => { 5658 return !!option.products.find(product => { 5659 return availableIndexes.includes(product); 5660 }) 5661 }); 5662 }); 5663 return newAllowedAttributeOptions; 5664 }, 5665 calculateAvailableProductIndexes(selectedOptions) { 5666 if (Object.keys(selectedOptions).length === 0) { 5667 if (Object.values(this.optionConfig.salable || {}).length) { 5668 return [].concat.apply([], [].concat.apply([], Object.values(this.optionConfig.salable).map(Object.values))).filter((x, i, a) => a.indexOf(x) === i) 5669 } 5670 return Object.keys(this.optionConfig.index); 5671 } 5672 5673 const selectedIds = Object.keys(selectedOptions); 5674 if (Object.values(this.optionConfig.salable || {}).length) { 5675 const selectedOptionIndexes = selectedIds.map(attrId => { 5676 const optionValue = selectedOptions[attrId]; 5677 return this.optionConfig.salable[attrId] && this.optionConfig.salable[attrId][optionValue] || [] 5678 }) 5679 return selectedOptionIndexes.reduce((acc, optionIndexes) => { 5680 return acc.filter(index => optionIndexes.includes(index)); 5681 }); 5682 } else { 5683 const productIndexes = this.optionConfig.index; 5684 return Object.keys(productIndexes).filter(index => { 5685 for (const attrId of selectedIds) { 5686 if (productIndexes[index][attrId] !== `${selectedOptions[attrId]}`) return false 5687 } 5688 return true 5689 }); 5690 } 5691 }, 5692 findAttributeByOptionId(optionId) { 5693 for (const attributeId in this.optionConfig.attributes) { 5694 const attributeOptions = this.optionConfig.attributes[attributeId].options || []; 5695 if (attributeOptions.find(option => option.id === optionId)) { 5696 return attributeId; 5697 } 5698 } 5699 }, 5700 getAllowedAttributeOptions(attributeId) { 5701 return this.allowedAttributeOptions[attributeId] || [] 5702 }, 5703 getProductIdsForOption(option) { 5704 const attributeId = this.findAttributeByOptionId(option.id); 5705 const allOptions = this.optionConfig.attributes[attributeId]; 5706 const opt = (allOptions && allOptions.options || []).find(o => o.id === option.id); 5707 return opt && opt.products 5708 ? opt.products 5709 : []; 5710 }, 5711 findProductIdsForPartialSelection(optionSelection) { 5712 const candidateProducts = Object.values(optionSelection).reduce((candidates, optionId) => { 5713 const newCandidates = this.getProductIdsForOption({id: optionId}); 5714 return candidates === null 5715 ? newCandidates 5716 : candidates.filter(productId => newCandidates.includes(productId)); 5717 }, null); 5718 return candidateProducts || []; 5719 },
5720 findCheapestProductForPartialSelection(optionSelection) { 5721 const candidateProducts = this.findProductIdsForPartialSelection(optionSelection); 5722 return candidateProducts.reduce((cheapest, simpleIdx) => { 5723 // in the first iteration we start with simpleIdx as the currently cheapest product 5724 if (! this.optionConfig.optionPrices[cheapest]) return simpleIdx; 5725 const knownCheapestPrice = this.optionConfig.optionPrices[cheapest].finalPrice.amount; 5726 return knownCheapestPrice > this.optionConfig.optionPrices[simpleIdx].finalPrice.amount 5727 ? simpleIdx 5728 : cheapest; 5729 }, 0) 5730 }, 5731 findProductIdToUseForOptionPrice(option) { 5732 // try to find a product for a complete selection 5733 const attributeId = this.findAttributeByOptionId(option.id); 5734 const optionSelection = Object.assign({}, this.selectedValues, {[attributeId]: option.id}); 5735 const matchingSimpleIndex = this.calculateSimpleIndexForFullSelection(optionSelection); 5736 // if there is no complete selection, use the cheapest product for the option 5737 return matchingSimpleIndex || this.findCheapestProductForPartialSelection(optionSelection); 5738 }, 5739 getAttributeOptionLabel(option) { 5740 // Overrides original to exclude the price change from the option labels 5741 return option.label; 5742 }, 5743 getOptionPriceAdjustmentBasePrice() { 5744 if (this.optionConfig.optionPrices[this.productIndex]) { 5745 return this.optionConfig.optionPrices[this.productIndex].finalPrice.amount 5746 } 5747 const cheapestForSelection = this.findCheapestProductForPartialSelection(this.selectedValues); 5748 return this.optionConfig.optionPrices[cheapestForSelection] 5749 ? this.optionConfig.optionPrices[cheapestForSelection].finalPrice.amount 5750 : this.optionConfig.prices.finalPrice.amount; // default price if no option selection 5751 }, 5752 clearOptionIfActive(optionId, value) { 5753 if (this.selectedValues[optionId] === value) { 5754 this.blurLabel() 5755 this.changeOption(optionId, '') 5756 } 5757 }, 5758 removeAttrFromSelection(selectedValues, attributeId) { 5759 attributeId = parseInt(attributeId); 5760 return selectedValues.reduce((newSelection, val, attr) => { 5761 if (attr !== attributeId) { 5762 newSelection[attr] = val; 5763 } 5764 return newSelection; 5765 }, []); 5766 }, 5767 changeOption(attributeId, value) { 5768 if (value === '') { 5769 this.selectedValues = this.removeAttrFromSelection(this.selectedValues, attributeId) 5770 } else if (value && this.getAllowedAttributeOptions(attributeId).find(option => option.id === value)) { 5771 this.selectedValues[attributeId] = value; 5772 } 5773 this.findSimpleIndex(); 5774 this.findAllowedAttributeOptions(); 5775 this.updatePrices(); 5776 this.updateGallery(); 5777 5778 // If using cascading options, reset options or enable options depending on what is selected 5779 if (this.cascadingOptions) { 5780 let element = this.optionConfig.attributes[attributeId]; 5781 if (value && element.nextSetting) { 5782 element.nextSetting.disabled = false; 5783 } else if (!value) { 5784 this.resetChildren(element); 5785 } 5786 5787 // Remove any invalid options depending on what was selected 5788 this.unsetInvalidOptions(this.selectedValues); 5789 } 5790 5791 window.dispatchEvent( 5792 new CustomEvent( 5793 'configurable-selection-changed', 5794 { 5795 detail: { 5796 productId: this.productId, 5797 optionId: attributeId, 5798 value: value, 5799 productIndex: this.productIndex, 5800 selectedValues: this.selectedValues, 5801 candidates: this.findProductIdsForPartialSelection(this.selectedValues), 5802 } 5803 } 5804 ) 5805 ); 5806 5807 // Add new custom events when option selected is changed 5808 let productSelected = typeof this.calculateSimpleIndexF
5808orFullSelection(this.selectedValues) !== 'undefined'; 5809 let sku = productSelected ? this.optionConfig.skus[this.productIndex] : this.optionConfig.parentSku; 5810 window.dispatchEvent( 5811 new CustomEvent( 5812 "update-sku-" + this.productId, 5813 { 5814 detail: sku 5815 } 5816 ) 5817 ); 5818 5819 if (productSelected) { 5820 window.dispatchEvent( 5821 new CustomEvent( 5822 "update-attention-" + this.productId, 5823 { 5824 detail: this.optionConfig.attention[this.productIndex] 5825 } 5826 ) 5827 ); 5828 } 5829 5830 let stock = productSelected ? this.optionConfig.stock[this.productIndex] : this.optionConfig.stock['cp-avail']; 5831 window.dispatchEvent( 5832 new CustomEvent( 5833 "update-stock-" + this.productId, 5834 { 5835 detail: stock 5836 } 5837 ) 5838 ); 5839 }, 5840 calculateIsMinimalPrice() { 5841 return ( 5842 this.selectedValues.filter(value => !!value).length < 5843 Object.keys(this.optionConfig.attributes).length 5844 ); 5845 }, 5846 updatePrices() { 5847 const value = this.productIndex ? 5848 this.optionConfig.optionPrices[this.productIndex] : 5849 this.optionConfig.prices; 5850 window.dispatchEvent( 5851 new CustomEvent( 5852 "update-prices-" + this.productId, 5853 { 5854 detail: Object.assign( 5855 value, 5856 { isMinimalPrice: this.calculateIsMinimalPrice() } 5857 ) 5858 } 5859 ) 5860 ); 5861 }, 5862 updateGallery () { 5863 if (this.productIndex) { 5864 const images = this.optionConfig.images[this.productIndex]; 5865 images && window.dispatchEvent(new CustomEvent( 5866 "update-gallery", 5867 { detail: { 5868 "images": this.sortImagesByPosition(images), 5869 "productId": this.productId 5870 } 5871 } 5872 )); 5873 } else { 5874 window.dispatchEvent(new CustomEvent("reset-gallery", { 5875 detail: { "productId": this.productId } 5876 })); 5877 } 5878 }, 5879 sortImagesByPosition(images) { 5880 return images.sort((x, y) => { 5881 return x.position === y.position ? 0 : (parseInt(x.position) > parseInt(y.position) ? 1 : -1) 5882 }); 5883 }, 5884 onGetCartData(data) { 5885 }, 5886 preselectCartItems(data) { 5887 // pre-select options based on cart data for current (quote) itemId 5888 const cart = data && data.cart; 5889 if (cart && cart.items) { 5890 const cartItem = cart.items.find((item) => { 5891 return ( 5892 item.item_id === this.itemId 5893 && item.product_id === this.productId 5894 ) 5895 }); 5896 if (cartItem && cartItem.options && cartItem.options.length) { 5897 cartItem.options.map(option => { 5898 this.changeOption(option.option_id, option.option_value); 5899 }) 5900 } 5901 } 5902 }, 5903 preselectQuerystringItems() { 5904 // pre-select option like ?size=167 5905 const urlQueryParams = new URLSearchParams(window.location.search.replace('?','')); 5906 this.preselectItemsBasedOnLocation(attribute => urlQueryParams.get(attribute.code)); 5907 }, 5908 preselectLocationHashItems() { 5909 // pre-select option like #144=167 5910 const urlHashParams = new URLSearchParams(window.location.hash.replace('#','')); 5911 this.preselectItemsBasedOnLocation(attribute => urlHashParams.get(attribute.id)); 5912 }, 5913 preselectItemsBasedOnLocation(getLocationValue) { 5914 Object.values(this.optionConfig.attributes).map(attribute => { 5915 this.changeOption(attribute.id, getLocationValue(attribute)) 5916 }); 5917 } 5918 } 5919 } 5920 5921</script>
vendor: 1 bytes, line 5921
5921
5922<script> 5923 function initSwatchOptions(swatchConfig) { 5924 return { 5925 swatchConfig, 5926 getAttributeSwatchData(attributeId) { 5927 const swatchConfig = Object.assign({}, this.swatchConfig[attributeId]); 5928 swatchConfig['details'] = JSON.parse(swatchConfig['additional_data']); 5929 5930 return swatchConfig; 5931 }, 5932 getAllAttributeOptions(attributeId) { 5933 return ( 5934 this.optionConfig.attributes[attributeId] && 5935 this.optionConfig.attributes[attributeId].options 5936 ) || [] 5937 }, 5938 optionIsActive(attributeId, optionId) { 5939 // return true if a product with this option is in stock 5940 return !!this.getAllowedAttributeOptions(attributeId).find( 5941 option => option.id === optionId 5942 ) 5943 }, 5944 optionIsEnabled(attributeId, optionId) { 5945 // return true if a product with this option is enabled 5946 for (const productId in this.optionConfig.index) { 5947 if (this.optionConfig.index[productId][attributeId] === optionId) { 5948 return true; 5949 } 5950 } 5951 return false; 5952 }, 5953 mapSwatchTypeNumberToTypeCode(typeNumber) { 5954 switch ("" + typeNumber) { 5955 case "1": 5956 return "color" 5957 case "2": 5958 return "image" 5959 case "3": 5960 return "empty" 5961 case "0": 5962 default: 5963 return "text" 5964 } 5965 }, 5966 getTypeOfFirstOption(attributeId) { 5967 for (const optionId in this.swatchConfig[attributeId]) { 5968 const option = this.swatchConfig[attributeId][optionId]; 5969 if (typeof option.type !== 'undefined') { 5970 return this.mapSwatchTypeNumberToTypeCode(option.type); 5971 } 5972 } 5973 }, 5974 getVisualSwatchType(attributeId, targetOptionId) { 5975 // If a type configuration is present for the given option id, use it 5976 const config = this.swatchConfig[attributeId]; 5977 if (config[targetOptionId] && typeof config[targetOptionId].type !== 'undefined') { 5978 return this.mapSwatchTypeNumberToTypeCode(config[targetOptionId].type); 5979 } 5980 5981 // Otherwise - if no config is present for the target option - use the type of the first option 5982 // with a type property from the attribute, thus assuming its the same type as the target option. 5983 // (This edge case condition can occur on single swatch products if some options are not salable) 5984 return this.getTypeOfFirstOption(attributeId); 5985 }, 5986 getSwatchType(attributeId, optionId) { 5987 // Deserialize the attribute details the first time they are used 5988 if (this.swatchConfig[attributeId] && ! this.swatchConfig[attributeId].details) { 5989 this.swatchConfig[attributeId] = this.getAttributeSwatchData(attributeId); 5990 } 5991 const type = this.swatchConfig[attributeId] && 5992 this.swatchConfig[attributeId].details && 5993 this.swatchConfig[attributeId].details.swatch_input_type || 5994 "empty"; 5995 return type === 'visual' ? this.getVisualSwatchType(attributeId, optionId) : type; 5996 }, 5997 isTextSwatch(attributeId, optionId) { 5998 return this.getSwatchType(attributeId, optionId) === 'text'; 5999 }, 6000 isVisualSwatch(attributeId, optionId) { 6001 const type = this.getSwatchType(attributeId, optionId); 6002 6003 return ['image', 'color'].includes(type); 6004 }, 6005 getSwatchBackgroundStyle(attributeId, optionId) {
6006 const config = this.getSwatchConfig(attributeId, optionId); 6007 const type = this.getSwatchType(attributeId, optionId); 6008 6009 if (type === "color") { 6010 return 'background-color:' + config.value; 6011 } else if (type === "image") { 6012 return "background: #ffffff url('" + config.value + "') no-repeat center"; 6013 } else { 6014 return ''; 6015 } 6016 }, 6017 getSwatchText(attributeId, optionId) { 6018 const config = this.getSwatchConfig(attributeId, optionId); 6019 return config.label || config.value || this.getOptionLabelFromOptionConfig(attributeId, optionId); 6020 }, 6021 getSelectedSwatchText(attributeId, optionId) { 6022 let tooltipText = this.isTooltipVisible() && this.activeTooltipItem.attribute == attributeId ? this.getTooltipLabel() : ''; 6023 return tooltipText || this.getSwatchText(attributeId, optionId); 6024 }, 6025 getOptionLabelFromOptionConfig(attributeId, optionId) { 6026 // Fallback if no value is present in swatchConfig data 6027 // Reference issue https://gitlab.hyva.io/hyva-themes/magento2-default-theme/-/issues/190 6028 const option = this.getAllAttributeOptions(attributeId).filter(option => option.id === optionId); 6029 return option && option[0] && option[0].label ||''; 6030 }, 6031 getSwatchConfig(attributeId, optionId) { 6032 return this.swatchConfig[attributeId] && this.swatchConfig[attributeId][optionId] 6033 ? this.swatchConfig[attributeId][optionId] 6034 : false; 6035 }, 6036 activeTooltipItem: false, 6037 tooltipPositionElement: false, 6038 isTooltipVisible() { 6039 return this.activeTooltipItem &&
6040 this.getSwatchConfig( 6041 this.activeTooltipItem.attribute, 6042 this.activeTooltipItem.item 6043 ); 6044 }, 6045 isFirstItemCol() { 6046 return this.activeTooltipItem.index === 0; 6047 }, 6048 getTooltipImageStyle(attributeId, optionId) { 6049 const config = this.getSwatchConfig(attributeId, optionId); 6050 const type = this.getSwatchType(attributeId, optionId); 6051 6052 if (type === "color") { 6053 return 'background-color:' + config.value + '; width: 110px; height: 90px;'; 6054 } else if (type === "image") { 6055 return "background: #ffffff url('" + config.thumb + 6056 "') center center no-repeat; width: 110px; height: 90px;"; 6057 } else { 6058 return 'display:none'; 6059 } 6060 }, 6061 getTooltipPosition() { 6062 return this.tooltipPositionElement ? 6063 `top: ${this.tooltipPositionElement.offsetTop}px;` + 6064 `left: ${ 6065 this.tooltipPositionElement.offsetLeft - ( 6066 this.tooltipPositionElement.closest('.snap') && 6067 this.tooltipPositionElement.closest('.snap').scrollLeft || 6068 0 6069 ) 6070 }px;` : '' 6071 }, 6072 getTooltipLabel() { 6073 return this.getSwatchConfig(this.activeTooltipItem.attribute, this.activeTooltipItem.item).label 6074 }, 6075 focusedLabel: false, 6076 focusLabel(optionId) { 6077 this.focusedLabel = optionId; 6078 }, 6079 blurLabel() { 6080 this.focusedLabel = false; 6081 }, 6082 showSwatches: false, 6083 initShowSwatchesIntersect() { 6084 if ('IntersectionObserver' in window && !window.scrollY) { 6085 let io = new IntersectionObserver( 6086 entries => { 6087 entries.map(entry => { 6088 if (entry.isIntersecting) { 6089 this.showSwatches = true; 6090 io.unobserve(this.$root); 6091 } 6092 }) 6093 } 6094 ); 6095 io.observe(this.$root); 6096 } else { 6097 this.showSwatches = true 6098 } 6099 } 6100 } 6101 } 6102</script>
vendor: 1 bytes, line 6102
6102
6103<script> 6104 'use strict'; 6105 6106 const grecaptchaV2LoadCallbacks = []; 6107 6108 function executeRecaptchaLoadCallbacks () { 6109 while (window.grecaptcha && grecaptchaV2LoadCallbacks.length > 0) { 6110 const callback = grecaptchaV2LoadCallbacks.pop(); 6111 typeof callback === 'string' ? window[callback]() : callback(); 6112 } 6113 } 6114 6115 (function() { 6116 const loadRecaptchaScript = (event) => { 6117 6118 if (window.grecaptcha || !event.target.form) { 6119 return; 6120 } 6121 6122 const url = 'https://www.google.com/recaptcha/api.js?onload=executeRecaptchaLoadCallbacks'; 6123 const siteKey = '6Lf7qRkjAAAAAP0lyuri41_9EGRTkVEkzoJvVxbE'; 6124 const script = document.createElement('script'); 6125 script.type = 'text/javascript'; 6126 script.src = siteKey ? `${url}&render=${siteKey}` : `${url}&render=explicit`; 6127 script.async = true; 6128 document.head.appendChild(script); 6129 6130 script.addEventListener('load', () => { 6131 Array.from(document.querySelectorAll('button[data-recaptcha-btn]:disabled')).forEach(btn => btn.removeAttribute('disabled')); 6132 }); 6133 } 6134 6135 window.forceLoadRecaptchaScript = (form) => { 6136 loadRecaptchaScript({target: {form: form || 'dummy'}}); 6137 executeRecaptchaLoadCallbacks(); 6138 }; 6139 6140 document.body.addEventListener('input', loadRecaptchaScript, { once: true }); 6141 document.body.addEventListener('focus', loadRecaptchaScript, { once: true }); 6142 6143 }()); 6144 6145</script>
vendor: 1 bytes, line 6145
6145
6146<script> 6147 'use strict'; 6148 6149 (function () { 6150 const modals = []; 6151 const excludedFromFocusTrapping = new Set(); 6152 6153 function trapFocusInNextModalWithOverlay() { 6154 for (let idx = modals.length -1; idx >= 0; idx--) { 6155 const nextOnStack = modals[idx]; 6156 const nextDialogElement = nextOnStack.instance.$refs[nextOnStack.name]; 6157 if (! isOverlayDisabled(nextDialogElement)) { 6158 hyva.trapFocus(nextDialogElement); 6159 break; 6160 } 6161 } 6162 } 6163 6164 function focusables(dialogElement) { 6165 const selector = 'button, [href], input, textarea, select, details, [tabindex]:not([tabindex="-1"])'; 6166 return Array.from(dialogElement.querySelectorAll(selector)) 6167 .filter(el => !el.hasAttribute('disabled')); 6168 } 6169 6170 function firstVisible(elements) { 6171 const a = Array.from(elements); 6172 for (let i = 0; i < a.length; i++) { 6173 if (a[i].offsetWidth || a[i].offsetHeight || a[i].getClientRects().length) return a[i]; 6174 } 6175 return null; 6176 } 6177 6178 function isInViewport(element) { 6179 const rect = element && element.getBoundingClientRect(); 6180 return rect && 6181 rect.top >= 0 && 6182 rect.left >= 0 && 6183 rect.right <= window.innerWidth && 6184 rect.bottom <= window.innerHeight; 6185 } 6186 6187 function setFocusAfterTransition(dialogElement, duration) { 6188 const nested = Array.from(dialogElement.querySelectorAll('[role="dialog"]')); 6189 const candidates = Array.from(dialogElement.querySelectorAll('[x-focus-first]')); 6190 next: for (let candidate of candidates) { 6191 for (let child of nested) { 6192 if (child.contains(candidate)) continue next; 6193 } 6194 setTimeout(() => candidate.focus(), 50); 6195 break; 6196 } 6197 window.setTimeout(() => { 6198 const focusElement = firstVisible(dialogElement.querySelectorAll('[x-focus-first]')) || 6199 focusables(dialogElement)[0] || 6200 null; 6201 focusElement && isInViewport(focusElement) && focusElement.focus(); 6202 }, Math.max(1, duration)); 6203 } 6204 6205 function determineTrigger($refs, dialog, trigger) { 6206 if (typeof trigger === 'undefined' && typeof dialog === 'object' && dialog.target instanceof HTMLElement) { 6207 return dialog.target; 6208 } 6209 if (typeof dialog === 'string' && typeof trigger === 'object' && trigger.target instanceof HTMLElement) { 6210 return trigger.target; 6211 } 6212 if (typeof trigger === 'string') { 6213 try { 6214 return $refs[trigger] || document.querySelector(trigger) 6215 } catch (e) {} 6216 } 6217 if (trigger instanceof Element) { 6218 return trigger; 6219 } 6220 6221 return null; 6222 } 6223 6224 function isOverlayDisabled(dialog) { 6225 return dialog && dialog.hasAttribute('x-no-overlay') 6226 } 6227 6228 function areRemainingModalsWithoutOverlay(modals) 6229 { 6230 const overflowDisabled = modals.map(modal => modal.instance.$refs[modal.name]).filter(isOverlayDisabled); 6231 6232 return overflowDisabled.length === modals.length; 6233 } 6234 6235 window.hyva.modal = function(options = {}) { 6236 if (this.$el && this.$el.dataset && this.$el.dataset.options) { 6237 try { 6238 options = Object.assign(options, JSON.parse(this.$el.dataset.options || '{}')); 6239 } catch (e) { 6240 throw new Error('Cannot read the dialog options from the data-options attribute: not valid JSON'); 6241 } 6242 } 6243 6244 const config = Object.assign({ 6245 dialog: 'dialog', duration: 300, transitionEnter: 'transition ease-out duration-300', 6246 transitionEnterStart: 'opacity-0', 6247 transitionEnterEnd: 'opacity-100', 6248 transitionLeave: 'transition ease-in duration-300', 6249 transitionLeaveStart: 'opacity-100', 6250 transitionLeaveEnd: 'opacity-0', 6251 }, options); 6252 let lastHide = 0; 6253 6254 return { 6255 opened: {}, 6256 show(dialog, trigger) { 6257 const focusTargetAfterHide = determineTrigger(this.$refs, dialog, trigger); 6258 const name = typeof dialog === 'string' ? dialog : config.dialog; 6259 const dialogElement = this.$refs[name]; 6260 if (! dialogElement) { 6261 return; 6262 } 6263 const useOverlay = ! dialogElement.hasAttribute('x-no-overlay'); 6264 6265 dialogElement.scrollTop = 0; 6266 6267 if (this.opened[name]) { 6268 return; 6269 } 6270 6271 if (focusTargetAfterHide) { 6272 focusTargetAfterHide.setAttribute('aria-expanded', 'true'); 6273 } 6274 6275 this.opened[name] = true; 6276 useOverlay && this.$nextTick(() => hyva.trapFocus(dialogElement)); 6277 setFocusAfterTransition(dialogElement, config.duration); 6278 6279 const frame = {name, instance: this, focusTarget: focu
6279sTargetAfterHide, time: Date.now()}; 6280 6281 modals.push(frame); 6282 if (useOverlay) { 6283 document.body.classList.add('overflow-hidden'); 6284 } 6285 return new Promise(resolve => frame.resolve = resolve); 6286 }, 6287 cancel() { 6288 this.hide(false); 6289 }, 6290 ok() { 6291 this.hide(true); 6292 }, 6293 hide(value) { 6294 if (Date.now() - lastHide < config.duration) { 6295 return; 6296 } 6297 lastHide = Date.now(); 6298 6299 const modal = modals.pop() || {}; 6300 if (! modal.instance) { 6301 return; 6302 } 6303 6304 const name = modal.name; 6305 this.opened[name] = false; 6306 hyva.releaseFocus(modal.instance.$refs[modal.name]) 6307 trapFocusInNextModalWithOverlay(); 6308 6309 const nextFocusAfterHide = modal.focusTarget; 6310 nextFocusAfterHide && setTimeout(() => { 6311 nextFocusAfterHide.setAttribute('aria-expanded', 'false'); 6312 nextFocusAfterHide.focus() 6313 }, config.duration); 6314 6315 if (modals.length === 0 || areRemainingModalsWithoutOverlay(modals)) { 6316 document.body.classList.remove('overflow-hidden'); 6317 } 6318 6319 modal.resolve(value); 6320 }, 6321 overlay(dialog) { 6322 dialog = this.$el.dataset.dialogRefName || dialog; 6323 const name = typeof dialog === 'string' ? dialog : config.dialog; 6324 return { 6325 ['x-show']() { 6326 return this.opened[name] 6327 }, 6328 ['x-transition:enter']: config.transitionEnter, 6329 ['x-transition:enter-start']: config.transitionEnterStart, 6330 ['x-transition:enter-end']: config.transitionEnterEnd, 6331 ['x-transition:leave']: config.transitionLeave, 6332 ['x-transition:leave-start']: config.transitionLeaveStart, 6333 ['x-transition:leave-end']: config.transitionLeaveEnd, 6334 ['@hyva-modal-show.window'](event) { 6335 event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide) 6336 } 6337 }; 6338 }, 6339 showDialogOnInit() { 6340 const parent = this.$el.closest('[data-dialog-ref-name]'); 6341 if (parent && parent.dataset.dialogRefName) { 6342 this.$dispatch('hyva-modal-show', {dialog: parent.dataset.dialogRefName}) 6343 } 6344 } 6345 }; 6346 } 6347 6348 window.hyva.modal.peek = () => modals.length > 0 && modals[modals.length -1] 6349 6350 window.hyva.modal.pop = function () { 6351 if (modals.length > 0) { 6352 const modal = modals[modals.length -1]; 6353 modal.instance.hide(); 6354 } 6355 } 6356 6357 window.hyva.modal.excludeSelectorsFromFocusTrap = function (selectors) { 6358 typeof selectors === 'string' || selectors instanceof String 6359 ? excludedFromFocusTrapping.add(selectors) 6360 : selectors.map(selector => excludedFromFocusTrapping.add(selector)); 6361 } 6362 6363 window.hyva.modal.eventListeners = { 6364 keydown: event => { 6365 if (event.key === 'Escape') { 6366 window.hyva.modal.pop(); 6367 } 6368 }, 6369 click: event => { 6370 if (modals.length > 0) { 6371 const modal = modals[modals.length -1]; 6372 const dialog = modal.instance.$refs[modal.name]; 6373 if (modal.time + 50 < Date.now() && // if last click processing is more than 50ms ago 6374 ! isOverlayDisabled(dialog) && // if dialog has overlay 6375 ! dialog.contains(event.target)) { // if click is outside of dialog 6376 modal.instance.hide(); 6377 } 6378 } 6379 } 6380 }; 6381 6382 document.addEventListener('keydown', window.hyva.modal.eventListeners.keydown); 6383 6384 document.addEventListener('click', window.hyva.modal.eventListeners.click); 6385 })(); 6386 window.addEventListener('alpine:init', () => { 6387 Alpine.data('hyvaModal', window.hyva.modal); 6388 }, {once: true}); 6389</script>
6389 6390<div id="mobile-contact-block"><div class="contact-popup"> 6391 <div class="contact-toolbar"> 6392 <button id="contact-popup-close"> 6393 </button> 6394 <span>Contact Us</span> 6395 </div> 6396 <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> 6397</div> 6398 6399<style> 6400 #mobile-contact-block { 6401 position: fixed; 6402 top: 30px !important; 6403 bottom: 30px !important; 6404 right: 30px !important; 6405 bottom: 30px !important; 6406 background-color: white; 6407 z-index: 999999; 6408 margin: 16px; 6409 border-radius: 10px; 6410 transition: all linear .3s; 6411 } 6412 6413 .contact-popup { 6414 border-radius: 10px; 6415 box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 6px 0px; 6416 } 6417 6418 .contact-toolbar { 6419 border-radius: 10px 10px 0 0; 6420 background-color: #a32c28; 6421 width: 100%; 6422 display: flex; 6423 justify-content: center; 6424 padding: .75rem 0; 6425 position: relative; 6426 } 6427 6428 .contact-toolbar span { 6429 color: white; 6430 font-weight: 700; 6431 } 6432 6433 #contact-popup-close { 6434 border-bottom: 0px solid white; 6435 min-width: 10px; 6436 min-height: 10px; 6437 position: absolute; 6438 right: 0; 6439 top: 0; 6440 border-radius: 0; 6441 padding: 0; 6442 height: 50%; 6443 margin-top: 2px; 6444 margin-right: 3rem; 6445 } 6446 #contact-popup-close::before { content: 'X'; color: #fff; } 6447 6448 #contact-popup-close:hover { 6449 background: #a32c28 !important; 6450 } 6451 6452 #launcher, 6453 #webWidget { 6454 display: none; 6455 } 6456 6457 @media (max-width: 768px) { 6458 6459 #mobile-contact-block { 6460 top: 0; 6461 left: 0; 6462 margin: 0; 6463 border-radius: 0; 6464 } 6465 6466 .contact-toolbar { 6467 border-radius: 0 0 0 0; 6468 padding: 1.5rem 0; 6469 } 6470 } 6471 6472</style></div>
6473<script> 6474 // Functionality directly ported from original uiComponent, with minor modifications to work with Alpine 6475 function initBraintreePayPalExpress(clientToken, currency) 6476 { 6477 return { 6478 clientToken: clientToken, 6479 currency: currency, 6480 cart: null, 6481 customer: null, 6482 isGuestCheckoutAllowed: null, 6483 init() 6484 { 6485 // don't do anything 6486 }, 6487 custom_init() 6488 { 6489 6490 // called by nextTick 6491 this.loadScript('https://js.braintreegateway.com/web/3.88.1/js/client.min.js', function() { 6492 this.setupButton(this.$root); 6493 }.bind(this)); 6494 }, 6495 receiveCustomerData(event) 6496 { 6497 if(event.detail && event.detail.data){ 6498 this.cart = event.detail.data.cart; 6499 if(this.cart){ 6500 this.isGuestCheckoutAllowed = this.cart.isGuestCheckoutAllowed; 6501 } 6502 this.customer = event.detail.data.customer; 6503 } 6504 }, 6505 loadScript(url, callback) 6506 { 6507 const script = document.createElement('script'); 6508 script.type = 'text/javascript'; 6509 script.src = url; 6510 script.addEventListener('load', callback); 6511 document.head.appendChild(script); 6512 }, 6513 buildForm(actionUrl, fields) 6514 { 6515 const form = document.createElement('form'); 6516 form.action = actionUrl; 6517 form.method = 'POST'; 6518 form.hidden = true; 6519 form.enctype = 'application/x-www-form-urlencoded'; 6520 6521 Object.entries(fields).forEach(field => { 6522 const [key, value] = field; 6523 let fieldElement; 6524 6525 fieldElement = document.createElement('input'); 6526 fieldElement.type = 'hidden'; 6527 fieldElement.name = key; 6528 fieldElement.value = value; 6529 form.appendChild(fieldElement); 6530 }); 6531 6532 document.body.appendChild(form); 6533 form.submit(); 6534 }, 6535 payPalButton(element, paypalCheckoutInstance) 6536 { 6537 let self = this, 6538 style = { 6539 color: element.dataset.color, 6540 shape: element.dataset.shape, 6541 size: element.dataset.size, 6542 }; 6543 6544 if (element.dataset.fundingicons) { 6545 style.fundingicons = element.dataset.fundingicons; 6546 } 6547 6548 // Render 6549 let paypalActions; 6550 let button = paypal.Buttons({ 6551 fundingSource: element.dataset.funding, 6552 style: style, 6553 6554 createOrder: function () 6555 { 6556 return paypalCheckoutInstance.createPayment({ 6557 amount: element.dataset.amount, 6558 locale: element.dataset.locale, 6559 currency: element.dataset.currency, 6560 flow: 'checkout', 6561 enableShippingAddress: true, 6562 displayName: element.dataset.displayname, 6563 }); 6564 }, 6565 6566 validate: function(actions) 6567 { 6568 if (!self.customer.firstname && !self.isGuestCheckoutAllowed) { 6569 actions.disable(); 6570 } 6571 6572 paypalActions = actions; 6573 }, 6574 6575 onCancel: function (data) 6576 { 6577 console.warn('paypalCheckout\u0020has\u0020been\u0020cancelled', data); 6578 }, 6579 6580 onError: function (err) 6581 { 6582 console.error('paypalCheckout\u0020button\u0020render\u0020error', err); 6583 }, 6584 6585 onClick: function(data) 6586 { 6587 if (!self.customer.firstname && !self.isGuestCheckoutAllowed) { 6588 alert('To\u0020check\u0020out,\u0020please\u0020sign\u0020in\u0020with\u0020your\u0020email\u0020address.'); 6589 } 6590 }, 6591 6592 onApprove: function (data1) 6593 { 6594 return paypalCheckoutInstance.tokenizePayment(data1, function(err, payload) { 6595 // Map the shipping address correctly 6596 var address = payload.details.shippingAddress, 6597 recipientFirstName, 6598 recipientLastName; 6599 6600 if (typeof address.recipientName !== 'undefined') { 6601 var recipientName = address.recipientName.split(" "); 6602 6603 recipientFirstName = recipientName[0].replace(/'/g, "'"); 6604 recipientLastName = recipientName[1].replace(/'/g, "'"); 6605 } else { 6606 recipientFirstName = payload.details.firstName.replace(/'/g, "'"); 6607 recipientLastName = payload.details.lastName.replace(/'/g, "'"); 6608 } 6609 6610 payload.details.shippingAddress = { 6611 streetAddress: typeof address.line2 !== 'undefined' 6612 ? address.line1.replace(/'/g, ''') + ' ' + address.line2.replace(/'/g, ''') 6613 : address.line1.replace(/'/g, '''), 6614 locality: address.city.replace(/'/g, '''), 6615 postalCode: address.postalCode, 6616 countryCodeAlpha2: address.countryCode, 6617 email: payload.details.email.replace(/'/g, '''), 6618 recipientFirstName: recipientFirstName, 6619 recipientLastName: recipientLastName, 6620 telephone: typeof payload.details.phone !== 'undefined' 6621 ? payload.details.phone 6622 : '', 6623 region: typeof address.state !== 'undefined' 6624 ? address.state.replace(/'/g, ''') 6625 : '', 6626 }; 6627 6628 if(element.dataset.location === 'productpage') { 6629 var form = document.getElementById('product_addtocart_form'); 6630 6631 if (!form.checkValidity()) { 6632 return false;
6633 } 6634 6635 payload.additionalData = form.serialize(); 6636 } 6637 6638 var actionSuccess = element.dataset.actionsuccess; 6639 6640 self.buildForm( 6641 actionSuccess, 6642 { 6643 result: JSON.stringify(payload), 6644 form_key: hyva.getFormKey(), 6645 } 6646 ); 6647 }); 6648 } 6649 }); 6650 6651 if (!button.isEligible()) { 6652 element.parentNode.remove(); 6653 6654 return; 6655 } 6656 6657 // Clear element content prior to render to prevent duplicated buttons 6658 element.innerHTML = ''; 6659 button.render(element); 6660 }, 6661 renderpayPalMessages() 6662 { 6663 document.querySelectorAll('.action-braintree-paypal-message').forEach((container) => { 6664 paypal.Messages({ 6665 amount: container.dataset['pp-amount'], 6666 pageType: container.dataset['pp-type'], 6667 style: { 6668 layout: 'text', 6669 }, 6670 }).render('#' + container.id); 6671 }) 6672 }, 6673 loadBraintreeSDK(token, currency, button) 6674 { 6675 let self = this; 6676 6677 if(!self.customer) { 6678 const browserStorage = hyva.getBrowserStorage(); 6679 self.customer = {}; self.customer.firstname = browserStorage.getItem('paypal-customer-name'); 6680 self.isGuestCheckoutAllowed = browserStorage.getItem('paypal-guest-allowed'); 6681 } 6682 6683 braintree.client.create({ 6684 authorization: token 6685 }, (clientErr, clientInstance) => { 6686 if (clientErr) { 6687 return console.error('paypalCheckout\u0020error', clientErr); 6688 } 6689 6690 self.loadScript('https://js.braintreegateway.com/web/3.88.1/js/data-collector.min.js', () => { 6691 braintree.dataCollector.create({ 6692 client: clientInstance, 6693 paypal: true 6694 }, (err, dataCollectorinstance) => { 6695 if (err) { 6696 return console.error(err); 6697 } 6698 }); 6699 }); 6700 6701 self.loadScript('https://js.braintreegateway.com/web/3.88.1/js/paypal-checkout.min.js', () => { 6702 braintree.paypalCheckout.create({ 6703 client: clientInstance 6704 }, (err, paypalCheckoutInstance) => { 6705 if (typeof paypal !== 'undefined' ) { 6706 self.payPalButton(button, paypalCheckoutInstance); 6707 self.renderpayPalMessages(); 6708 } else { 6709 paypalCheckoutInstance.loadPayPalSDK({ 6710 components: 'buttons,messages,funding-eligibility', 6711 currency: currency, 6712 }, () => { 6713 self.payPalButton(button, paypalCheckoutInstance); 6714 self.renderpayPalMessages(); 6715 }); 6716 } 6717 }); 6718 }); 6719 }); 6720 }, 6721 setupButton(button) 6722 { 6723 this.loadBraintreeSDK(this.clientToken, this.currency, button); 6724 }, 6725 } 6726 } 6727</script>
6727 6728
6729<script> 6730 function receiveCustomerSpecificPaypalData(event) { 6731 let browserStorage = hyva.getBrowserStorage(); 6732 if(event.detail && event.detail.data){ 6733 if(event.detail.data.cart){ 6734 browserStorage.setItem('paypal-guest-allowed', event.detail.data.cart.isGuestCheckoutAllowed); 6735 } 6736 if(event.detail.data.customer) { 6737 browserStorage.setItem('paypal-customer-name', event.detail.data.customer.firstname); 6738 } 6739 } 6740 } 6741 6742 window.addEventListener('private-content-loaded', receiveCustomerSpecificPaypalData); 6743 6744</script>
vendor: 1 bytes, line 6744
6744
6745<script type="text/json" id="default-section-data"> 6746 {"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"}
6746,"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"}
6746,"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"}
6746,"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"}
6746,"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"}
6746,"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"}
6746,"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"}
6746,"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"}
6746,"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"}
6746,"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"}
6746,"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"}
6746,"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":1790370644},"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 6746
6746
6747<script> 6748 function initContentPopup() { 6749 return { 6750 init(parentIdentifier = '') { 6751 // If parent identifier is sent in, only look for children with class "contentPopupHandler" to initialize 6752 let contentPopupTriggers = parentIdentifier ? document.querySelectorAll(parentIdentifier + ' .contentPopupHandler') : document.getElementsByClassName('contentPopupHandler'); 6753 6754 // Handle image popups as well 6755 let imagePopupTriggers = parentIdentifier ? document.querySelectorAll(parentIdentifier + ' .imagePopupHandler') : document.getElementsByClassName('imagePopupHandler'); 6756 contentPopupTriggers = Array.from(contentPopupTriggers).concat(Array.from(imagePopupTriggers)); 6757 6758 Array.from(contentPopupTriggers).forEach((element) => { 6759 let popupClickHandler = function(event) { 6760 event.preventDefault(); 6761 event.stopPropagation(); 6762 6763 // Find corresponding element with same ID but "Content" appended to use for modal content 6764 let id = element.id; 6765 let popupContent = document.getElementById(id + 'Content'); 6766 6767 // For image popups use child HTML as content, since this will be the img tag 6768 if (element.classList.contains('imagePopupHandler')) { 6769 popupContent = element.cloneNode(true); 6770 let imgLink = popupContent.href; 6771 let imgElement = popupContent.querySelector('img'); 6772 6773 // if image doesnt exist yet, clear out content and create image 6774 if(!imgElement) { 6775 popupContent.innerHTML = ''; 6776 imgElement = document.createElement('img'); 6777 popupContent.appendChild(imgElement); 6778 } 6779 // 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 6780 if (imgLink) { 6781 imgElement.src = imgLink; 6782 imgElement.style.maxHeight = '800px'; 6783 } 6784 } 6785 6786 if (popupContent) { 6787 document.getElementById('contentPopupModal').innerHTML = popupContent.innerHTML; 6788 6789 // Not able to directly trigger modal show from here, so trigger click on hidden button to open the modal 6790 document.getElementById('contentPopupTrigger').dispatchEvent(new Event('click')); 6791 } 6792 }; 6793 6794 if(!element.getAttribute('initialized')) { 6795 element.addEventListener('click', popupClickHandler); 6796 element.setAttribute('initialized', 'true'); 6797 } 6798 6799 }); 6800 } 6801 } 6802 } 6803</script>
6803 6804<div x-data="Object.assign({}, hyva.modal(), initContentPopup())" 6805 x-init="init()" 6806> 6807 <button @click="show('dialog', this.$event || $event)" type="button" id="contentPopupTrigger" class="btn mt-40 hidden" aria-haspopup="dialog"> 6808 Show </button> 6809 <div x-cloak data-dialog-ref-name="dialog" 6810 x-bind="overlay" 6811 class="fixed inset-0 bg-black bg-opacity-50 z-50"> 6812 <div class="fixed flex justify-center items-center text-left z-40 inset-0"> 6813 <div x-ref="dialog" role="dialog" aria-modal="true" 6814 aria-labelledby="content-popup-modal-label" 6815 class="inline-block bg-white shadow-xl rounded-lg p-10 max-h-screen overflow-auto overscroll-y-contain"> 6816 <label id="content-popup-modal-label" class="text-[0]"><?= $escaper->escapeHtml(__("Modal content")) ?></label><div id="contentPopupModal"></div> </div> 6817 </div> 6818 </div> 6819</div>
6820<script type="text/javascript"> 6821 document.addEventListener('DOMContentLoaded', function() { 6822 let aosNodes = document.querySelectorAll("[data-aos]"); 6823 let aosList = []; 6824 6825 aosNodes.forEach(function(aosNode) { 6826 let aosEntry = {}; 6827 aosNode.classList.add("aos-init"); 6828 6829 aosEntry.node = aosNode; 6830 aosEntry.position = getPosition(aosNode); 6831 aosList.push(aosEntry); 6832 }); 6833 6834 window.addEventListener("resize", function() { 6835 // Recalculate positions on resize 6836 aosList.forEach(function(aosEntry) { 6837 aosEntry.position = getPosition(aosEntry.node); 6838 }); 6839 }); 6840 6841 window.addEventListener("scroll", function() { 6842 animateScroll(aosList); 6843 }); 6844 6845 function animateScroll(elements) { 6846 let pageYOffset = window.pageYOffset; 6847 let innerHeight = window.innerHeight; 6848 6849 elements.forEach(function(element) { 6850 let totalHeight = pageYOffset + innerHeight; 6851 totalHeight > element.position ? element.node.classList.add("aos-animate") : element.node.classList.remove("aos-animate"); 6852 }); 6853 } 6854 6855 function getPosition(element) { 6856 let innerHeight = window.innerHeight; 6857 let anchorPlacement = element.getAttribute("data-aos-anchor-placement"); 6858 let top = getTop(element); 6859 6860 switch (anchorPlacement) { 6861 case "top-bottom": 6862 break; 6863 case "center-bottom": 6864 top += element.offsetHeight / 2; 6865 break; 6866 case "bottom-bottom": 6867 top += element.offsetHeight; 6868 break; 6869 case "top-center": 6870 top += innerHeight / 2; 6871 break; 6872 case "bottom-center": 6873 top += innerHeight / 2 + element.offsetHeight; 6874 break; 6875 case "center-center": 6876 top += innerHeight / 2 + element.offsetHeight / 2; 6877 break; 6878 case "top-top": 6879 top += innerHeight; 6880 break; 6881 case "bottom-top": 6882 top += element.offsetHeight + innerHeight; 6883 break; 6884 case "center-top": 6885 top += element.offsetHeight / 2 + innerHeight 6886 } 6887 6888 return top; 6889 } 6890 6891 function getTop(element) { 6892 let top = 0 6893 6894 while (element && !isNaN(element.offsetLeft) && !isNaN(element.offsetTop)) { 6895 top += element.offsetTop - ("BODY" != element.tagName ? element.scrollTop : 0); 6896 element = element.offsetParent; 6897 } 6898 6899 return top; 6900 } 6901 }); 6902</script>
vendor: 1 bytes, line 6902
6902
6903<script> 6904 6905 function dispatchOldCart(event) { 6906 let storage = hyva.getBrowserStorage(); 6907 let oldCart = storage.getItem('old-cart') 6908 ? JSON.parse(storage.getItem('old-cart')) 6909 : {items: []}; 6910 let newCart = event.detail.data.cart ?? {}; 6911 window.dispatchEvent(new CustomEvent('cart-change', { 6912 detail: 6913 { 6914 data: { 6915 oldCart: oldCart, 6916 privateData: event.detail.data 6917 } 6918 } 6919 }) 6920 ); 6921 storage.setItem('old-cart', JSON.stringify(newCart)); 6922 } 6923 6924 window.addEventListener('private-content-loaded', dispatchOldCart) 6925</script>
6925 6926</div><div id="show-result" data-bind="scope:'showResult'" style="display: none;"> 6927 <!-- ko template: getTemplate() --><!-- /ko --> 6928
6928<script type="text/x-magento-init"> 6929 { 6930 "#show-result": { 6931 "Magento_Ui/js/core/app": { 6932 "components": { 6933 "showResult": { 6934 "component": "Bold_CheckoutMeta/js/model/order-result" 6935 } 6936 } 6937 } 6938 } 6939 } 6940 </script>
6940 6941</div>
6942<script nonce="OGtld3o0NWc5cnNreXdxc2dxbzd1N3R0ZnVkbmxzeno="> 6943 6944 yireoGoogleTagManager2Pusher({"version":"3.10.0","page_type":"cms\/index\/index","page_path":"https:\/\/www.outdoornativitysets.com\/","page_title":"Outdoor Nativity Sets | American Made, Outdoor Nativity Displays","virtual_page":"","breadcrumb":[],"user":{"has_transacted":false}}, 'push (initial page) [data-layer.phtml]'); 6945 </script>
vendor: 1 bytes, line 6945
6945
6946<script nonce="OGtld3o0NWc5cnNreXdxc2dxbzd1N3R0ZnVkbmxzeno="> 6947 function yireoGoogleTagManager2FindParentElementWithName(element, parentTagName) { 6948 if (!element.parentElement) { 6949 return null; 6950 } 6951 6952 if (element.parentElement.tagName.toLowerCase() === parentTagName) { 6953 return element.parentElement; 6954 } 6955 6956 return yireoGoogleTagManager2FindParentElementWithName(element.parentElement, parentTagName); 6957 } 6958 6959 const products = document.querySelectorAll('.products a.product'); 6960 if (products && products.length > 0) { 6961 products.forEach(function(product) { 6962 product.addEventListener('click', function(event, s) { 6963 let parentElement = yireoGoogleTagManager2FindParentElementWithName(event.target, 'form'); 6964 const inputElement = parentElement.querySelector('input[name="product"]'); 6965 const productId = inputElement.value; 6966 const productData = window['YIREO_GOOGLETAGMANAGER2_PRODUCT_DATA_ID_' + productId] || {}; 6967 productData.item_id = productId; 6968 6969 const eventData = { 6970 'event': 'select_item', 6971 'ecommerce': { 6972 'items': [productData] 6973 } 6974 } 6975 6976 yireoGoogleTagManager2Pusher(eventData, 'push (page event "select_item") [script-product-clicks.phtml]'); 6977 6978 if (window['YIREO_GOOGLETAGMANAGER2_DEBUG_CLICKS'] && confirm("Press to continue with redirect") === false) { 6979 event.preventDefault(); 6980 } 6981 }); 6982 }) 6983 } 6984</script>
vendor: 1 bytes, line 6984
6984
6985<script nonce="OGtld3o0NWc5cnNreXdxc2dxbzd1N3R0ZnVkbmxzeno="> 6986 window.addEventListener('private-content-loaded', function(event) { 6987 window.dataLayer = window.dataLayer || []; 6988 6989 var isEmpty = function (variable) { 6990 if (typeof variable === 'undefined') { 6991 return true; 6992 } 6993 6994 if (Array.isArray(variable) && variable.length === 0) { 6995 return true; 6996 } 6997 6998 return typeof variable === 'object' && Object.keys(variable).length === 0; 6999 } 7000 7001 var getSectionNames = function () { 7002 return ['cart', 'customer']; 7003 } 7004 7005 getSectionNames().forEach(function (sectionName) { 7006 if (!event.detail.data[sectionName].gtm) { 7007 return; 7008 } 7009 7010 const attributes = event.detail.data[sectionName].gtm; 7011 if (!Object.keys(attributes).length > 0) { 7012 return; 7013 } 7014 7015 yireoGoogleTagManager2Pusher(attributes, 'push (attributes) [script-additions.phtml]'); 7016 }); 7017 7018 let attributes = {}; 7019 getSectionNames().forEach(function (sectionName) { 7020 if (!event.detail.data[sectionName].gtm_events) { 7021 return; 7022 } 7023 7024 const gtmEvents = event.detail.data[sectionName].gtm_events; 7025 for (const [eventId, eventData] of Object.entries(gtmEvents)) { 7026 yireoGoogleTagManager2Logger('found event in section "' + sectionName + '"', eventData); 7027 7028 const metaData = eventData.meta; 7029 yireoGoogleTagManager2Pusher(eventData, 'push (customerData "' + sectionName + '" event "' + eventId + '")'); 7030 7031 if (!metaData || metaData.cacheable !== true) { 7032 yireoGoogleTagManager2Logger('removing event "' + eventId + '" from section "' + sectionName + '"') 7033 7034 let mageCacheStorage = event.detail.data; 7035 7036 if (mageCacheStorage !== null 7037 && typeof mageCacheStorage[sectionName] !== 'undefined' 7038 && typeof mageCacheStorage[sectionName].gtm_events !== 'undefined' 7039 && eventId in mageCacheStorage[sectionName].gtm_events) { 7040 delete mageCacheStorage[sectionName].gtm_events[eventId]; 7041 } 7042 7043 window.localStorage.setItem('mage-cache-storage', JSON.stringify(mageCacheStorage)); 7044 } 7045 } 7046 }); 7047 7048 if (false === isEmpty(attributes)) { 7049 yireoGoogleTagManager2Pusher(attributes, 'dataLayer (initial js) [script-additions.phtml]'); 7050 } 7051 }); 7052</script>
vendor: 1 bytes, line 7052
7052
7053<script type="text/javascript">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","licenseKey":"fcf28e5364","applicationID":"95730697","transactionName":"YFEAYkBRWEdZUkFaDVkbI1VGWVlaF1JYQE1eWgZTSh9fWlxUTQ==","queueTime":0,"applicationTime":395,"atts":"TBYDFAhLS0k=","errorBeacon":"bam.nr-data.net","agent":""}</script>
7053</body> 7054</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.