@thg-agentic/hyper-personalisation-web 3.25.0 → 3.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -9
- package/dist/hp.min.js +3 -3
- package/dist/onsite-answers.min.js +1 -1
- package/dist/onsite-audiences.min.js +1 -0
- package/dist/onsite-render.min.js +1 -1
- package/dist/onsite-wheel.min.js +1 -1
- package/dist/onsite.min.js +1 -1
- package/package.json +4 -3
- package/src/bootstrap.js +55 -19
- package/src/index.js +74 -3
- package/src/onsite/api.js +22 -5
- package/src/onsite/audiences-loader.js +6 -0
- package/src/onsite/counters.js +2 -2
- package/src/onsite/index.js +52 -1
- package/src/onsite/rules.js +20 -5
- package/src/onsite/visit-audiences.js +94 -0
- package/src/shape.js +4 -0
- package/src/spec-version.js +1 -1
- package/src/storage-scope.js +6 -0
- package/src/version.js +1 -1
- package/src/visit-campaign.js +168 -0
- package/types/bootstrap.d.ts +7 -0
- package/types/events.d.ts +30 -2
- package/types/index.d.ts +6 -0
- package/types/onsite.d.ts +9 -0
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# @thg-agentic/hyper-personalisation-web
|
|
2
2
|
|
|
3
3
|
The browser SDK for THG Hyper-Personalisation, a customer data platform. It implements the event
|
|
4
|
-
specification (spec 1.
|
|
4
|
+
specification (spec 1.20, stamped on every event as `context.spec.version`) for any storefront: it
|
|
5
5
|
sends events in the Segment wire format, applies consent strictly whichever CMP the site uses, reads
|
|
6
6
|
the GA4 `dataLayer` the site already pushes to, and has no runtime dependencies.
|
|
7
7
|
|
|
@@ -63,7 +63,7 @@ collects, is a settings change and never a deploy:
|
|
|
63
63
|
| `consent` | **Required.** The page's CMP: `{ provider: 'didomi' \| 'onetrust' \| 'cookie' \| 'forwarded' \| 'static', ...adapterOptions }`, or a consent adapter of your own. A preset may supply defaults for a provider. |
|
|
64
64
|
| `identityCookies` | `{ anonymousId, sessionId }`: the names of your own first-party device and session cookies. `sessionId` is always read from here; without it the SDK keeps its own session (see [Session ids](#session-ids)). `anonymousId` is read only when the settings name no device cookie: see [Device ids](#device-ids). |
|
|
65
65
|
| `autocapture` | `false`, or per tracker `{ promotions, productLists, recommendations, exposures }`, each `false` or its options. All on by default: they report only what the page tags. |
|
|
66
|
-
| `identity` | The signed-in visitor, `{ userId, emailSha256 }`. `userId` goes on every event; the `identify` is sent once per session and user. |
|
|
66
|
+
| `identity` | The signed-in visitor, `{ userId, emailSha256, token }`. `userId` goes on every event; the `identify` is sent once per session and user, and again once a `token` arrives. `token` is the identity token your server signs for the user on this page view (3.26, see [Verified sign-ins](#verified-sign-ins)). |
|
|
67
67
|
| `getCurrency`, `getShipToCountry`, `getLocale` | Read per event; see below. |
|
|
68
68
|
| `preset` | A platform preset, passed in by the host. |
|
|
69
69
|
| `pageType` | `context.page.type` of this page's page view. |
|
|
@@ -220,6 +220,7 @@ Since 3.19 (spec 1.12), a search box's suggestions are their own event:
|
|
|
220
220
|
| `queryParamAllowlist` | none | Keep only these query params (plus campaign params) in `context.page`, and in a clicked link's `href`, which leaves another site's link as origin and path only (3.22.2). Patterns are anchored and case-insensitive. |
|
|
221
221
|
| `queryParamBlocklist` | `[]` | Strip these params. Ignored when an allowlist is given. |
|
|
222
222
|
| `sensitiveParamAllowlist` | `[]` | Whatever else is configured, a param is always dropped from every reported URL when its name contains `email`, `token`, `password`, `secret`, `auth`, `session`, `phone`, `address`, `card`, `customerid` and the like (see `SENSITIVE_PARAM_FRAGMENTS` in `src/context.js`), or when its value is an email address or a card-length number — campaign params and the referrer included. This exempts names from the first rule, for a false positive such as an `author` filter; nothing exempts a value. |
|
|
223
|
+
| `identityToken` | none | The identity token your server signed for the user `getUserId` names, read once: on each `identify` as `context.identity_token` and with each onsite decision, until `reset()`, a sign-out or another user's `identify` (3.26, see [Verified sign-ins](#verified-sign-ins)). |
|
|
223
224
|
| `getAnonymousId`, `getUserId`, `getSessionId` | none | Identity accessors. Without `getSessionId` the SDK keeps its own session (see [Session ids](#session-ids)); a missing or empty device id gives way to the SDK's own (see [Device ids](#device-ids)). |
|
|
224
225
|
| `getExperiments`, `getAudiences`, `getDecisions`, `getRecommendations`, `getExtensions` | none | Read per event into the matching `context` field. Without `getDecisions`, `context.decisions` is what `recordExposure` last recorded per slot. |
|
|
225
226
|
| `pageType` | `null` | `context.page.type` before the first `page()` call. |
|
|
@@ -508,8 +509,8 @@ separate chunk and starts it; otherwise it is never fetched. A page on `createAn
|
|
|
508
509
|
itself: `import { startOnsite } from '@thg-agentic/hyper-personalisation-web/onsite'` then
|
|
509
510
|
`startOnsite(client, options)`. On the CDN, `hp.min.js` loads `onsite.min.js` (and that loads
|
|
510
511
|
`onsite-render.min.js` once a trigger fires, `onsite-wheel.min.js` for a wheel,
|
|
511
|
-
`onsite-answers.min.js` for a date or number question
|
|
512
|
-
all
|
|
512
|
+
`onsite-answers.min.js` for a date or number question, `onsite-audiences.min.js` for a form limited
|
|
513
|
+
to audiences) from beside itself; a self-hosted copy keeps all five beside `hp.min.js`. The runtime watches triggers, caps and consent and asks for the
|
|
513
514
|
decision; the renderer and its stylesheet are fetched only when a trigger fires, alongside the
|
|
514
515
|
decision request, so a page whose forms never fire never downloads them. If the renderer cannot
|
|
515
516
|
load, the form is not shown (`hp.onsite.debug()` says `the renderer did not load`) and the page goes
|
|
@@ -558,20 +559,40 @@ on desktop arms after `delay_ms` (5 s) and once the pointer has been below the t
|
|
|
558
559
|
viewport, and fires when it leaves through the top edge, moving up. On mobile it is a fast upward
|
|
559
560
|
flick (120px at 0.5 px/ms) after 30% of the page, or a return to the tab after 10 s away. Pages
|
|
560
561
|
(include/exclude globs on the path, `*` matching anything, in any case), devices (`mobile` is a coarse pointer
|
|
561
|
-
or under 768px),
|
|
562
|
+
or under 768px), the campaign the visit arrived from (`arrived_from`), dates and caps are checked
|
|
563
|
+
first; then `POST /v1/decisions` is asked for that one
|
|
562
564
|
slot. A held-out visitor, or no decision, sees nothing. One overlay per page view: of the forms that
|
|
563
565
|
fire within 50 ms, the highest `priority`; once one has shown (or the visitor was held out of it),
|
|
564
566
|
closing it lets no other form in on that page view. A `manual` form, which the site opens on the
|
|
565
567
|
shopper's click (its own sign-up button), is the shopper asking: it opens whatever its caps, the gap
|
|
566
568
|
and the page view's allowance say, as Klaviyo's custom-triggered forms do, though never over a
|
|
567
|
-
modal on screen (a popup, or a teaser opened from its tab); its pages, devices, dates and
|
|
568
|
-
still hold. Asked for twice while it opens, it opens once. With the property's `overlay_gap_minutes`, no popup, sheet or full-screen form
|
|
569
|
+
modal on screen (a popup, or a teaser opened from its tab); its pages, devices, campaign, dates and
|
|
570
|
+
audiences still hold. Asked for twice while it opens, it opens once. With the property's `overlay_gap_minutes`, no popup, sheet or full-screen form
|
|
569
571
|
shows until that long after the last one this session (1440 is once per session); bars, teasers and
|
|
570
572
|
inline forms are never held back. A form with `audiences` needs personalisation consent.
|
|
571
573
|
|
|
574
|
+
**Arrived from.** A form with `arrived_from` shows only to a visit that landed from a matching
|
|
575
|
+
campaign: `[{ field, match, values }]`, `field` one of `source`, `medium`, `campaign`, `content`,
|
|
576
|
+
`term` (the link's `utm_*` tags), `match` `is` or `contains`, compared trimmed and in any case.
|
|
577
|
+
Every rule must hold; any of a rule's values meets it. The campaign is the landing page's, as GA4's
|
|
578
|
+
session source is: the client keeps the first page of the visit with `utm_*` tags in one store,
|
|
579
|
+
`thg_hp_visit_campaign:<property>` (localStorage, so every tab of the visit reads it; the tags,
|
|
580
|
+
when the visit was last active and its session id once kept on the device, never a device or
|
|
581
|
+
person id, the same strictly necessary basis as the onsite counters). Later pages without tags, or
|
|
582
|
+
with others, keep it until the visit ends as the SDK's session does: 30 minutes without a page or
|
|
583
|
+
an event, or a new session id. Each tag is read up to 100 characters. The tags are read when the
|
|
584
|
+
client is created, so a later `replaceState` cannot lose them. A sign-out or a withdrawn consent
|
|
585
|
+
forgets it; a first refusal does not, as the forms judge it without consent. The session id is
|
|
586
|
+
written only while analytics is granted, and without localStorage the campaign holds for the page. It needs no consent; a visit with no campaign meets no rule
|
|
587
|
+
(`not eligible: not from its campaign`), and an `arrived_from` this SDK cannot read never matches.
|
|
588
|
+
The decision request for such a form carries it as `visit_campaign` (never logged), and the public API answers no
|
|
589
|
+
form unless the rules hold, so an SDK older than 3.26 never shows one. A preview link reads its own
|
|
590
|
+
URL's tags: the console's Preview on site link adds them. Click ids
|
|
591
|
+
(`fbclid`, `gclid`) are not a campaign.
|
|
592
|
+
|
|
572
593
|
| Option | |
|
|
573
594
|
|---|---|
|
|
574
|
-
| `audiences()` | The visitor's session audiences, when the page evaluates them: a form targeting none of them is skipped. Without it
|
|
595
|
+
| `audiences()` | The visitor's session audiences, when the page evaluates them: a form targeting none of them is skipped. Without it HP's server decides, from the visitor's stored audiences and the in-visit audiences whose rules hold in this visit (the runtime evaluates them from `GET /v1/audiences/datafile` and sends them with the decision). |
|
|
575
596
|
| `subscribed()` | True for a visitor the page knows is subscribed, for forms with `exclude_subscribed`. |
|
|
576
597
|
| `servingHost`, `gatewayHost` | Where decisions and claims go (default: the host the SDK was pointed at) and capture goes (default: where events go). |
|
|
577
598
|
| `debug` | Log why each form did or did not show. Also on with `?hp_debug=onsite`. |
|
|
@@ -661,7 +682,7 @@ each form did or did not show, and a preview link (`?hp_preview=`) counts nothin
|
|
|
661
682
|
`onsite.min.js` under 5.875 KiB gzipped (about 5.6 KiB), `onsite-render.min.js` under 14 KiB (about
|
|
662
683
|
13.7 KiB), so a page that shows a form loads about 19 KiB of onsite code and one whose forms never
|
|
663
684
|
fire about 5.6 KiB; `onsite-wheel.min.js` under 8 KiB (about 1.3 KiB), `onsite-answers.min.js` under
|
|
664
|
-
2 KiB (about 1.5 KiB). The core carries only the loader.
|
|
685
|
+
2 KiB (about 1.5 KiB), `onsite-audiences.min.js` under 1.25 KiB (about 1.2 KiB). The core carries only the loader.
|
|
665
686
|
|
|
666
687
|
Try it locally: `node tools/local/serve.mjs`, then
|
|
667
688
|
`http://localhost:8099/onsite.html?hp_debug=onsite` (offline mocks by default, `?mode=live` for
|
|
@@ -904,6 +925,29 @@ base64). `bootstrap`'s `identity.emailSha256` and `identify`'s `email_sha256` (s
|
|
|
904
925
|
either, and `normaliseSha256(value)` converts either to the lowercase hex the spec wants. It re-encodes the same digest and never
|
|
905
926
|
re-hashes, so pass the hash, never the email.
|
|
906
927
|
|
|
928
|
+
## Verified sign-ins
|
|
929
|
+
|
|
930
|
+
A publishable key is public, so a `userId` the browser sends is only a claim: the identity graph
|
|
931
|
+
records it and never joins the device to that customer unless the integrator vouches for it (ADR
|
|
932
|
+
0067). Your server signs an identity token for each signed-in page view, a JWT `ES256` (header
|
|
933
|
+
`typ: "JWT"`) over `{ sub: <userId>, aud: "hyper-personalisation", exp }` (at most 24 hours) with a
|
|
934
|
+
P-256 key whose public half is registered on the source, and the page hands it over:
|
|
935
|
+
|
|
936
|
+
```js
|
|
937
|
+
bootstrap(writeKey, { consent, identity: { userId: customer.id, token } });
|
|
938
|
+
// or, calling identify yourself:
|
|
939
|
+
analytics.identify({ userId: customer.id }, { identity_token: token });
|
|
940
|
+
```
|
|
941
|
+
|
|
942
|
+
The token goes on the `identify` as `context.identity_token`, and with each onsite decision, where
|
|
943
|
+
it is what lets a promo reminder's code be shown. The SDK keeps one token, for the user it was
|
|
944
|
+
signed for: `reset()`, a `Signed Out` or another user's `identify` drops it, and the same user's
|
|
945
|
+
`identify` without one keeps it; a single-page app passes a fresh one on `identify` before the
|
|
946
|
+
last expires. A session identifies again once, when a token first appears for
|
|
947
|
+
the user, and never because a page (one served from a shared cache) has none. The ingest checks it,
|
|
948
|
+
stamps `context.identity_verified` and never stores it. Steps, key generation and rotation:
|
|
949
|
+
[Verify signed-in shoppers](../../apps/docs/src/content/docs/guides/verify-signed-in-shoppers.mdx).
|
|
950
|
+
|
|
907
951
|
## Handing off to server producers
|
|
908
952
|
|
|
909
953
|
Server-side producers (for example an order service using the Java SDK) read two first-party cookies:
|
|
@@ -1046,6 +1090,7 @@ SDK per page.
|
|
|
1046
1090
|
| `preview` | `thg_hp_preview` | session cookie | a trader's preview token from `?hp_preview=` (3.15, see [Preview](#preview)) |
|
|
1047
1091
|
| `debug` | `thg_hp_debug` | sessionStorage | a developer's debug token from `?hp_debug=` (3.18), checked against the settings on every page |
|
|
1048
1092
|
| `onsite` | `thg_hp_onsite:<property>` | localStorage, sessionStorage | onsite forms' opaque counters per slot and a subscribed flag; never contact data (see [Onsite forms](#onsite-forms)) |
|
|
1093
|
+
| `visitCampaign` | `thg_hp_visit_campaign:<property>` | localStorage | the campaign tags the visit landed with, when it was last active and its session id once kept; ended with the session (see [Onsite forms](#onsite-forms)) |
|
|
1049
1094
|
| — | `thg_hp_conformance_page_type` | sessionStorage | the previous page's type, only while the development-only conformance checker runs |
|
|
1050
1095
|
|
|
1051
1096
|
Keys are scoped by property because one origin can serve several tenants. The names the SDK used
|
package/dist/hp.min.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
(()=>{var sn=e=>{throw TypeError(e)};var zr=(e,t,n)=>t.has(e)||sn("Cannot "+n);var an=(e,t,n)=>t.has(e)?sn("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n);var O=(e,t,n)=>(zr(e,t,"access private method"),n);var Ae=[];for(let e=2;Ae.length<64;e++)Ae.every(t=>e%t!==0)&&Ae.push(e);var cn=e=>(e-Math.floor(e))*2**32>>>0,Gr=Ae.slice(0,8).map(e=>cn(Math.sqrt(e))),Wr=Ae.map(e=>cn(Math.cbrt(e))),Y=(e,t)=>e>>>t|e<<32-t;function un(e){let t=new TextEncoder().encode(String(e)),n=new Uint32Array((t.length+8>>6)*16+16);t.forEach((i,s)=>{n[s>>2]|=i<<24-s%4*8}),n[t.length>>2]|=128<<24-t.length%4*8,n[n.length-2]=Math.floor(t.length/2**29),n[n.length-1]=t.length*8;let r=Uint32Array.from(Gr),o=new Uint32Array(64);for(let i=0;i<n.length;i+=16){for(let y=0;y<64;y++){if(y<16){o[y]=n[i+y];continue}let b=o[y-15],v=o[y-2],A=Y(b,7)^Y(b,18)^b>>>3,m=Y(v,17)^Y(v,19)^v>>>10;o[y]=o[y-16]+A+o[y-7]+m}let[s,c,u,d,f,p,g,_]=r;for(let y=0;y<64;y++){let b=Y(f,6)^Y(f,11)^Y(f,25),v=_+b+(f&p^~f&g)+Wr[y]+o[y]|0,m=(Y(s,2)^Y(s,13)^Y(s,22))+(s&c^s&u^c&u)|0;[_,g,p,f,d,u,c,s]=[g,p,f,d+v|0,u,c,s,v+m|0]}[s,c,u,d,f,p,g,_].forEach((y,b)=>{r[b]+=y})}return Array.from(r,i=>i.toString(16).padStart(8,"0")).join("")}var lt=(e,t)=>e<<t|e>>>32-t;function ln(e){let t=new Uint32Array((e.length+8>>6)*16+16);e.forEach((i,s)=>{t[s>>2]|=i<<24-s%4*8}),t[e.length>>2]|=128<<24-e.length%4*8,t[t.length-2]=Math.floor(e.length/2**29),t[t.length-1]=e.length*8;let n=Uint32Array.of(1732584193,4023233417,2562383102,271733878,3285377520),r=new Uint32Array(80);for(let i=0;i<t.length;i+=16){for(let p=0;p<80;p++)r[p]=p<16?t[i+p]:lt(r[p-3]^r[p-8]^r[p-14]^r[p-16],1);let[s,c,u,d,f]=n;for(let p=0;p<80;p++){let g,_;p<20?(g=c&u|~c&d,_=1518500249):p<40?(g=c^u^d,_=1859775393):p<60?(g=c&u|c&d|u&d,_=2400959708):(g=c^u^d,_=3395469782);let y=lt(s,5)+g+f+_+r[p]|0;[f,d,u,c,s]=[d,u,lt(c,30),s,y]}[s,c,u,d,f].forEach((p,g)=>{n[g]+=p})}let o=new Uint8Array(20);return n.forEach((i,s)=>{o[s*4]=i>>>24,o[s*4+1]=i>>>16,o[s*4+2]=i>>>8,o[s*4+3]=i}),o}var Jr="e28e8ada-5b76-4209-bba9-79b823a0af75",Yr=e=>Array.from(e,t=>t.toString(16).padStart(2,"0")).join("");function dn(e,t){let n=Uint8Array.from(e.replace(/-/g,"").match(/../g),c=>Number.parseInt(c,16)),r=new TextEncoder().encode(t),o=new Uint8Array(16+r.length);o.set(n),o.set(r,16);let i=ln(o).slice(0,16);i[6]=i[6]&15|80,i[8]=i[8]&63|128;let s=Yr(i);return`${s.slice(0,8)}-${s.slice(8,12)}-${s.slice(12,16)}-${s.slice(16,20)}-${s.slice(20)}`}var se=(e,t)=>typeof e=="string"&&e!==""&&e.length<=t?e:null;function Ue(e,t){return se(e,64)??se(t,256)}function fn({sessionId:e,slot:t,arm:n}={}){let r=se(e,256);return!r||!se(t,256)||!se(n,256)?null:dn(Jr,`${r}:${t}:${n}`)}var Xr="4b1f2c7e-9a3d-4e58-b6c1-2d7f0a9e8c53";function pn({sessionId:e,surface:t}={}){let n=se(e,256);return!n||!se(t,64)?null:dn(Xr,`${n}:${t}`)}var Zr=Array.from({length:11},(e,t)=>t/10);function Qr(e,t){if(!e.isIntersecting)return!1;let{intersectionRect:n,boundingClientRect:r,rootBounds:o}=e;if(!n||!r)return!0;let i=n.width*n.height,s=r.width*r.height,c=o?Math.min(s,o.width*o.height):s;return c>0&&i/c>=t}function Q(e){let{selector:t,onViewable:n,visibleRatio:r=.5,dwellMs:o=1e3,root:i=document}=e,s=new Map,c=new WeakSet,u=new Set,d=m=>{s.has(m)||s.set(m,setTimeout(()=>{s.delete(m),n(m)&&(p?.unobserve(m),u.delete(m))},o))},f=m=>{clearTimeout(s.get(m)),s.delete(m)},p=typeof IntersectionObserver>"u"?null:new IntersectionObserver(m=>{for(let E of m){let w=E.target;if(!Qr(E,r)){u.delete(w),f(w);continue}u.add(w),g()&&d(w)}},{threshold:Zr}),g=()=>typeof document>"u"||document.visibilityState!=="hidden",_=()=>{if(g())for(let m of u)d(m);else for(let m of u)f(m)};document.addEventListener("visibilitychange",_);let y=()=>{for(let m of i.querySelectorAll(t))c.has(m)||(c.add(m),p?.observe(m))},b=typeof MutationObserver>"u"?null:new MutationObserver(()=>y()),v=()=>{y(),b?.observe(i===document?document.body:i,{childList:!0,subtree:!0})},A=i===document&&!document.body;return A?document.addEventListener("DOMContentLoaded",v,{once:!0}):v(),()=>{A&&document.removeEventListener("DOMContentLoaded",v),document.removeEventListener("visibilitychange",_),p?.disconnect(),b?.disconnect();for(let m of s.values())clearTimeout(m);s.clear(),u.clear()}}function dt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-exposure]",visibleRatio:r=.5,dwellMs:o=1e3,root:i=document}=t;return Q({selector:n,root:i,visibleRatio:r,dwellMs:o,onViewable(s){let c=s.dataset?.hpExposure?.trim();return c&&e.surfaceViewed({surface:c}),!0}})}var mn=e=>{try{return new URL(e,document.baseURI).toString()}catch{return e}};function ft(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-list]",tileSelector:r="[data-hp-product]",visibleRatio:o=.5,dwellMs:i=1e3,root:s=document}=t,c=new Set,u=y=>y.closest?.(n)??null,d=y=>{let b=y.dataset.hpList?.trim();return b?{list_id:b,category:y.dataset.hpListCategory?.trim()||null}:null},f=y=>Array.from(y.querySelectorAll(r)).filter(b=>u(b)===y),p=(y,b)=>{try{let v=JSON.parse(y.dataset.hpProduct??"");return!v||typeof v!="object"||!v.product_id?null:{...v,position:v.position??b+1,...v.url?{url:mn(v.url)}:{},...v.image_url?{image_url:mn(v.image_url)}:{}}}catch{return null}},g=Q({selector:`${n} ${r}`,root:s,visibleRatio:o,dwellMs:i,onViewable(y){let b=u(y);if(!b||b.dataset.hpListView==="manual")return!0;let v=d(b);if(!v||c.has(v.list_id))return!0;let A=new Set,m=f(b).map(p).filter(E=>!E||A.has(E.product_id)?!1:(A.add(E.product_id),!0));return m.length===0||(c.add(v.list_id),e.productListViewed({...v,products:m})),!0}}),_=y=>{let v=y.target?.closest?.("a[href]")?.closest(r);if(!v)return;let A=u(v),m=p(v,A?f(A).indexOf(v):0);m&&e.productClicked({list_id:A?d(A)?.list_id??null:null,products:[m]})};return document.addEventListener("click",_,!0),()=>{document.removeEventListener("click",_,!0),g()}}function R(e,...t){let n=e.dataset??{};for(let r of t){let o=n[r];if(typeof o=="string"&&o.trim()!=="")return o.trim()}return null}function $e(e,...t){let n=R(e,...t);if(n===null)return null;let r=Number(n);return Number.isFinite(r)?Math.trunc(r):null}function eo(e,t){let n=R(e,"hpPromotion");return n?{promotion_id:n,name:R(e,"hpPromotionName"),creative:R(e,"hpPromotionCreative"),position:R(e,"hpPromotionSlot")??String(t+1)}:null}function pt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-promotion]",resolve:r=eo,visibleRatio:o=.5,dwellMs:i=1e3,root:s=document}=t,c=new Set,u=p=>{let g=Array.from(s.querySelectorAll(n)),_=g.indexOf(p);try{return r(p,_<0?g.length:_)}catch{return null}},d=Q({selector:n,root:s,visibleRatio:o,dwellMs:i,onViewable(p){let g=u(p);return!g||c.has(g.promotion_id)?!1:(c.add(g.promotion_id),e.promotionViewed(g),!0)}}),f=p=>{let g=p.target;if(!g||typeof g.closest!="function")return;let _=g.closest(n),y=g.closest("a[href]");if(!_||!y||!_.contains(y)&&!y.contains(_))return;let b=u(_);b&&e.promotionClicked({...b,href:y.getAttribute("href")})};return document.addEventListener("click",f,!0),()=>{document.removeEventListener("click",f,!0),d()}}function to(e){let t=R(e,"hpRecoRequest"),n=R(e,"hpRecoPlacement"),r=R(e,"hpRecoStrategy");if(!t||!n||!r)return null;let o=R(e,"hpRecoHoldout");return{recommendation_request_id:t,placement:n,strategy:r,recipe:R(e,"hpRecoRecipe"),algorithm_version:R(e,"hpRecoAlgorithmVersion"),experiment:R(e,"hpRecoExperiment"),variant:R(e,"hpRecoVariant"),holdout:o===null?null:o==="true",assignment_bucket:$e(e,"hpRecoBucket"),assignment_unit_kind:R(e,"hpRecoUnitKind"),candidate_set_fingerprint:R(e,"hpRecoFingerprint"),candidate_set_size:$e(e,"hpRecoCandidates"),ranked_by:R(e,"hpRecoRankedBy"),served_at:R(e,"hpRecoServedAt")}}function no(e,t){let n=R(e,"hpRecoProduct");if(!n)return null;let r=R(e,"hpRecoPrice");return{product_id:n,sku:R(e,"hpRecoSku"),name:R(e,"hpRecoName"),brand:R(e,"hpRecoBrand"),price:r===null||Number.isNaN(Number(r))?null:Number(r),position:$e(e,"hpRecoPosition")??t+1}}function mt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-reco-request]",tileSelector:r="[data-hp-reco-product]",resolveRail:o=to,resolveTile:i=no,visibleRatio:s=.5,dwellMs:c=1e3,root:u=document}=t,d=new Set,f=new Map,p=new Map,g=(m,...E)=>{try{return m(...E)}catch{return null}},_=m=>typeof m.closest=="function"?m.closest(n):null,y=m=>Array.from(m.querySelectorAll(r)),b=(m,E)=>{if(p.delete(E.recommendation_request_id),d.has(E.recommendation_request_id))return;let w=y(m).map((S,T)=>g(i,S,T)).filter(S=>S?.product_id);if(w.length===0)return;d.add(E.recommendation_request_id);let h=[...f.get(E.recommendation_request_id)?.values()??[]].sort((S,T)=>S.position-T.position);e.recommendationsViewed({...E,products:w,viewable:h})},v=Q({selector:`${n} ${r}`,root:u,visibleRatio:s,dwellMs:c,onViewable(m){let E=_(m);if(!E)return!0;let w=g(o,E);if(!w)return!0;let h=w.recommendation_request_id,S=g(i,m,y(E).indexOf(m));if(S?.product_id){f.has(h)||f.set(h,new Map);let T=f.get(h);T.has(S.position)||T.set(S.position,{position:S.position,product_id:S.product_id,viewable_at:new Date().toISOString()})}return!d.has(h)&&!p.has(h)&&p.set(h,setTimeout(()=>b(E,w),0)),!0}}),A=m=>{let E=m.target;if(!E||typeof E.closest!="function")return;let w=E.closest(r);if(!w)return;let h=E.closest("[data-hp-reco-interaction]"),S=E.closest("a[href]"),T=S&&(w.contains(S)||S.contains(w));if(!(h&&w.contains(h))&&!T)return;let D=_(w);if(!D)return;let K=g(o,D);if(!K)return;let G=g(i,w,y(D).indexOf(w));if(!G?.product_id)return;let B=K.recommendation_request_id;d.has(B)||(clearTimeout(p.get(B)),b(D,K)),e.productClicked({recommendation_request_id:K.recommendation_request_id,interaction:R(h??w,"hpRecoInteraction")??"navigate",products:[G]})};return document.addEventListener("click",A,!0),()=>{document.removeEventListener("click",A,!0);for(let m of p.values())clearTimeout(m);p.clear(),v()}}var we=new Set(["home","list","product","search","basket","checkout","order_confirmation","login","register","account","info","blog","other"]),ro=new Set(["products"]),hn=e=>e==null;function ht(e,t=new WeakSet){if(e instanceof Date)return e.toJSON();if(e===null||typeof e!="object"||t.has(e))return e;t.add(e);let n=Array.isArray(e)?e.map(r=>ht(r,t)):Object.fromEntries(Object.entries(e).filter(([,r])=>!hn(r)).map(([r,o])=>[r,ht(o,t)]));return t.delete(e),n}function gt(e){if(!e)return e;let t=ht(e);for(let n of ro)n in e&&hn(e[n])&&(t[n]=e[n]);return t}function gn(){try{let e=performance.getEntriesByType("navigation")[0];return e?["navigate","reload","back_forward","prerender"].includes(e.type)?e.type:"navigate":null}catch{return null}}var oo=new Set(["","unknown","undefined","null","none","nil","nan","anonymous","guest","0","-1"]);function F(e){if(e==null)return null;let t=String(e).trim();return oo.has(t.toLowerCase())?null:t}function ee(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var yn="1.18";function $(e){if(typeof document>"u")return null;try{let t=document.cookie.split(";").map(n=>n.trim()).find(n=>n.startsWith(`${e}=`));return t&&decodeURIComponent(t.slice(e.length+1))||null}catch{return null}}var so={gclid:"gclid",fbclid:"fbclid",ttclid:"ttclid"},io=/[a-z0-9._%+-]+@[a-z0-9-]+(\.[a-z0-9-]+)*\.[a-z]{2,}/i,ao=/\d(?:[ -]?\d){12,}/,co=new Set(["gclid","fbclid","ttclid","msclkid"]);function Sn(e,t=""){if(typeof e!="string"||e==="")return!1;let n=[e];try{let o=decodeURIComponent(e.replace(/\+/g," "));o!==e&&n.push(o)}catch{}let r=!co.has(String(t).toLowerCase());return n.some(o=>io.test(o)||r&&ao.test(o))}function uo(e){if(!e)return null;let t=new URLSearchParams(e),n={},r={utm_source:"source",utm_medium:"medium",utm_campaign:"name",utm_term:"term",utm_content:"content"};for(let[o,i]of[...Object.entries(r),...Object.entries(so)]){let s=t.get(o);s&&!Sn(s,o)&&(n[i]=s)}return Object.keys(n).length?n:null}var lo=["email","e-mail","password","pass","pwd","token","auth","code","uid","customer_id","postcode","zip","phone","applyCode"],fo=["email","password","passwd","pwd","token","secret","auth","session","phone","postcode","zip","address","birth","card","cvv","iban","ssn","customerid","userid"],po=["tel","uid","dob"],mo=["utm_source","utm_medium","utm_campaign","utm_term","utm_content","gclid","fbclid","ttclid","msclkid"],ho=new Set(lo.map(e=>e.toLowerCase()));function go(e){let t=String(e).toLowerCase();if(ho.has(t))return!0;let n=t.replace(/[-_.]/g,"");return fo.some(o=>n.includes(o))?!0:String(e).replace(/([a-z0-9])([A-Z])/g,"$1 $2").toLowerCase().split(/[^a-z0-9]+/).some(o=>po.includes(o))}function yt(e){return(e??[]).map(t=>{try{return new RegExp(`^${t}$`,"i")}catch{return{test:n=>n.toLowerCase()===String(t).toLowerCase()}}})}function _n(e,t={}){if(!e)return null;try{let n=new URLSearchParams(e),r=t.queryParamAllowlist?yt([...t.queryParamAllowlist,...mo]):null,o=yt(t.queryParamBlocklist),i=yt(t.sensitiveParamAllowlist);for(let c of new Set(n.keys()))(go(c)&&!i.some(d=>d.test(c))||n.getAll(c).some(d=>Sn(d,c))||(r?!r.some(d=>d.test(c)):o.some(d=>d.test(c))))&&n.delete(c);let s=n.toString();return s?`?${s}`:""}catch{return""}}function bn(e,t,n={}){if(!e)return null;try{let r=new URL(e);return t&&r.origin===t?r.origin+r.pathname+(_n(r.search,n)??""):r.origin+r.pathname}catch{return null}}function wt(e,t={}){if(typeof e!="string"||typeof location>"u")return null;try{let n=new URL(e,location.href);return n.protocol!=="https:"&&n.protocol!=="http:"?null:bn(n.href,location.origin,t)}catch{return null}}function St(e){if(typeof e!="string")return null;let t=e.trim().toUpperCase();return/^[A-Z]{3}$/.test(t)?t:null}function wn(e){if(typeof e!="string")return null;let t=e.trim().toUpperCase();return/^[A-Z]{2}$/.test(t)?t:null}function _t(e){if(typeof e!="string")return null;let t=e.trim().replace(/_/g,"-");if(!/^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$/.test(t))return null;try{return Intl.getCanonicalLocales(t)[0]}catch{return null}}function M(e,t){if(typeof e=="function")try{let n=e();if(n!=null)return n}catch{}return t}function yo(e){return{...e.propertyId==null?{}:{property_id:String(e.propertyId)},channel:e.channel??null,market:e.market??null,environment:e.environment??null}}function wo(e){let t=typeof window<"u"?window.location:null,n=t?_n(t.search,e):null;return{url:t?t.origin+t.pathname+(n??""):e.pageUrl??null,path:t?t.pathname:e.pagePath??null,search:n??null,referrer:typeof document<"u"?bn(document.referrer,t?.origin,e):null,title:typeof document<"u"&&document.title||null,type:e.pageType??null}}var ve;function So(){if(ve!==void 0)return ve;try{ve=globalThis.Temporal?.Now?.timeZoneId?.()||Intl.DateTimeFormat().resolvedOptions().timeZone||null}catch{ve=null}return ve}function In(e,t={}){let n=typeof window<"u"?window.location:null,r={library:{name:e.libraryName,version:e.libraryVersion},spec:{version:yn},source:yo(e),session_id:M(e.getSessionId,null),identity_trust:F(M(e.getAnonymousId,null))?"device":"none",page:wo(e),campaign:n?uo(n.search):null,device:{user_agent:typeof navigator<"u"?navigator.userAgent:null,type:null,viewport_width:typeof window<"u"?window.innerWidth:null,viewport_height:typeof window<"u"?window.innerHeight:null},currency:St(M(e.getCurrency,e.currency)),locale:_t(M(e.getLocale,e.locale)),timezone:So(),country:wn(e.country),ship_to_country:wn(M(e.getShipToCountry,e.shipToCountry)),ip:null,bot:null,consent:e.getConsent?.()??null,experiments:M(e.getExperiments,null),audiences:M(e.getAudiences,null),decisions:M(e.getDecisions,null),recommendations:M(e.getRecommendations,null),extensions:M(e.getExtensions,null)};return xn(r,t)}function xn(e,t){if(!t)return e;let n={...e};for(let[r,o]of Object.entries(t))o&&typeof o=="object"&&!Array.isArray(o)&&e[r]&&typeof e[r]=="object"&&!Array.isArray(e[r])?n[r]=xn(e[r],o):o!==void 0&&(n[r]=o);return n}var ce=Object.freeze({consent:"thg_hp_consent",retry:"thg_hp_retry",sessionSignals:"thg_hp_session_signals",identified:"thg_hp_identified",previousPage:"thg_hp_prev_page",decisions:"thg_hp_decisions",settings:"thg_hp_settings",held:"thg_hp_held",carried:"thg_hp_carried",recommendationContext:"thg_hp_recommendation_context",anonymousId:"thg_hp_anonymous_id",session:"thg_hp_session",preview:"thg_hp_preview",debug:"thg_hp_debug",onsite:"thg_hp_onsite"}),_o={retry:"cdp.retry",sessionSignals:"cdp_session_signals",identified:"cdp_identified",previousPage:"cdp_prev_page_message_id"},bt={...ce},kn=!1;function Ve(e){let t={...ce};for(let[n,r]of Object.entries(e??{})){if(!(n in ce))throw new Error(`storageNames: unknown kind "${n}"`);if(typeof r!="string"||!/^[\w.-]+$/.test(r))throw new Error(`storageNames.${n} must be a non-empty cookie-safe name`);t[n]=r}bt=t}function L(e){return bt[e]}var bo="_",An=e=>e==null||e===""?bo:String(e);function j(e,t,n){let r=`${e}:${An(t)}`;return n==null||n===""?r:`${r}:${n}`}function vn(e,t){return`${e}:${An(t)}:`}function Be(){if(!kn){kn=!0;for(let e of[()=>localStorage,()=>sessionStorage]){let t;try{if(t=e(),!t)continue;for(let n of Object.keys(t))for(let[r,o]of Object.entries(_o)){if(n!==o&&!n.startsWith(`${o}:`))continue;let i=bt[r]+n.slice(o.length);t.getItem(i)===null&&t.setItem(i,t.getItem(n)),t.removeItem(n)}}catch{}}}}var xt=1800*1e3,je=()=>{try{return typeof sessionStorage>"u"?null:sessionStorage}catch{return null}},It=()=>{try{return typeof localStorage>"u"?null:localStorage}catch{return null}};function En(e,t=()=>Date.now()){return{read(){try{let n=je()?.getItem(e),r=n?JSON.parse(n):null;return!r||t()-r.savedAt>xt?(r&&je()?.removeItem(e),{items:[],anonymousId:null}):{items:Array.isArray(r.items)?r.items:[],anonymousId:typeof r.anonymousId=="string"?r.anonymousId:null}}catch{return{items:[],anonymousId:null}}},write(n,r=null){try{n.length===0?je()?.removeItem(e):je()?.setItem(e,JSON.stringify({savedAt:t(),items:n,anonymousId:r}))}catch{}}}}var Io=400*24*60*60;function te(e,t,n,r){if(typeof document>"u")return!1;try{let o=typeof location<"u"&&location.protocol==="https:"?"; Secure":"",i=r?`; Domain=${r}`:"",s=n===null?"":`; Max-Age=${n}`;return document.cookie=`${e}=${encodeURIComponent(t)}; Path=/${s}; SameSite=Lax`+i+o,!0}catch{return!1}}function xo({name:e,domain:t=null,legacyKey:n,read:r,mint:o,mayStore:i,carried:s=null}){let c=null;try{c=It()?.getItem(n)||null}catch{c=null}let u=r(e)??c??s,d=!1,f=()=>{if(!(d||u===null||!i())&&(d=te(e,u,Io,t),!(!d||c===null)))try{It()?.removeItem(n),c=null}catch{}};return{get(){return u??(u=o()),f(),u},peek:()=>u,persist:f,forget(){te(e,"",0,t),u=null,d=!1;try{It()?.removeItem(n)}catch{}c=null}}}function Cn(e,{carried:t=null,mayStore:n,orOwn:r=!1}){let o=e.anonymousIdSource,i=()=>xo({name:L("anonymousId"),domain:e.consentCookieDomain??null,legacyKey:j(L("anonymousId"),e.propertyId),read:$,mint:ee,mayStore:n,carried:t});if(o?.source==="hp_cookie"){let u=i();return e.getAnonymousId=()=>u.get(),u}if(o?.source==="site_cookie"&&o.cookie){let u=o.cookie;e.getAnonymousId=()=>$(u)}if(!r)return null;let s=e.getAnonymousId,c=i();return e.getAnonymousId=()=>F(M(s,null))??c.get(),c}var ko=200;function Pn(e,t,n=()=>Date.now()){let r=()=>j(L("carried"),e),o=!1;function i(){try{let s=JSON.parse(sessionStorage.getItem(r())??"null");return!s||!(n()-s.savedAt<=xt)?[]:Array.isArray(s.calls)?s.calls:[]}catch{return[]}}return{take(){let s=i();try{sessionStorage.removeItem(r())}catch{}return s},save(s){try{return o||!t()?!1:(sessionStorage.setItem(r(),JSON.stringify({savedAt:n(),calls:[...i(),...s].slice(-ko)})),!0)}catch{return!1}},close(){o=!0}}}var Gi=ce.consent,He=Object.freeze({visitor:"visitor",host:"host"}),On=()=>({basis:He.host}),Ao="hp-consent",ue=["analytics","marketing","personalisation","ad_user_data","ad_personalization"],Ln={analytics:"a",marketing:"m",personalisation:"p",ad_user_data:"aud",ad_personalization:"adp"},X=()=>typeof window<"u",Tn=()=>X()&&typeof window.cookieStore?.addEventListener=="function",vo=e=>e===!0?!0:e===!1?!1:null;function Se(e){if(!e||typeof e!="object")return null;let t={};for(let n of ue)t[n]=vo(e[n]);return t}function At(e,t){return!e||!t?e===t:ue.every(n=>e[n]===t[n])}function vt(e){if(!e)return"";let t=[];for(let n of ue){let r=e[n];(r===!0||r===!1)&&t.push(`${Ln[n]}=${r?1:0}`)}return t.join("&")}function Et(e){return{[Ao]:vt(Se(e))}}function Ee(e){let t=Se({});if(e==null)return t;let n=String(e).trim();if(n.length>=2&&n.startsWith('"')&&n.endsWith('"')&&(n=n.slice(1,-1)),n.includes("%"))try{n=decodeURIComponent(n.replace(/\+/g," "))}catch{return t}let r=Object.fromEntries(Object.entries(Ln).map(([i,s])=>[s,i])),o=new Set;for(let i of n.split("&")){let s=i.indexOf("=");if(s<=0)continue;let c=r[i.slice(0,s).trim()],u={1:!0,0:!1}[i.slice(s+1).trim()]??null;!c||u===null||o.has(c)||(t[c]===null?t[c]=u:t[c]!==u&&(t[c]=null,o.add(c)))}return t}function Ct(e,t){if(!t)return e;let n=r=>{if(!r)return r;let o={...r};for(let i of ue)i!=="analytics"&&t[i]!==!0&&(o[i]=null);return o};return{name:e.name,basis:e.basis,read:()=>n(e.read()),subscribe:r=>e.subscribe(o=>r(n(o))),get observesChanges(){return e.observesChanges}}}function Pt(e,t={}){return{...e,ad_user_data:t.ad_user_data??e.marketing,ad_personalization:t.ad_personalization??e.marketing}}function qe(e,t){let n=!0;return{notify:()=>{if(n)try{let o=e();o&&t(o)}catch{}},stop:()=>n=!1}}var Eo={analytics:["analytics","measure_content_performance","audience_measurement"],marketing:["marketing","targeting","advertising","select_personalized_ads","create_ads_profile"],personalisation:["personalisation","personalization","select_personalized_content","create_content_profile"]};function Co(e,t){if(!t?.length)return null;let n=!1;for(let[r,o]of Object.entries(e)){let i=String(o?.id??r).toLowerCase();if(t.some(c=>{let u=String(c).toLowerCase();return i===u||i.startsWith(`${u}-`)})&&(n=!0,o?.enabled===!0))return!0}return n?!1:null}function Nn(e={}){let t={...Eo,...e.purposes};function n(){let r=X()?window.Didomi:void 0;if(!r?.getCurrentUserStatus||r.shouldUserStatusBeCollected?.()!==!1||r.isUserStatusPartial?.()===!0)return null;let o=r.getCurrentUserStatus()?.purposes;if(!o||typeof o!="object")return null;let i=s=>Co(o,t[s]);return Pt({analytics:i("analytics"),marketing:i("marketing"),personalisation:i("personalisation")},{ad_user_data:i("ad_user_data"),ad_personalization:i("ad_personalization")})}return{name:"didomi",read:n,observesChanges:!0,subscribe(r){if(!X())return()=>{};let o=qe(n,r),i={event:"consent.changed",listener:o.notify};return window.didomiEventListeners=window.didomiEventListeners||[],window.didomiEventListeners.push(i),window.didomiOnReady=window.didomiOnReady||[],window.didomiOnReady.push(s=>{o.notify(),(s??window.Didomi)?.on?.("consent.changed",o.notify)}),window.Didomi?.on?.("consent.changed",o.notify),o.stop}}}function kt(e){let t={};if(!e)return t;for(let n of String(e).split("&")){let r=n.indexOf("=");if(r<=0)continue;let o=n.slice(r+1).replace(/\+/g," ");try{o=decodeURIComponent(o)}catch{}t[n.slice(0,r)]=o}return t}function Rn(e={}){let t={analytics:"C0002",personalisation:"C0003",marketing:"C0004",...e.groups},n=e.impliedConsent===!0;function r(){let s=kt($("OptanonConsent"));if(s.groups){let d={};for(let f of s.groups.split(",")){let[p,g]=f.split(":");p?.trim()&&(d[p.trim()]=g==="1"?!0:g==="0"?!1:null)}return f=>d[f]??!1}let c=X()?window.OnetrustActiveGroups:void 0;if(typeof c!="string"||!c.length)return null;let u=new Set(c.split(",").map(d=>d.trim()).filter(Boolean));return d=>u.has(d)}function o(){if($("OptanonAlertBoxClosed"))return!0;try{if(X()&&window.OneTrust?.IsAlertBoxClosed?.()===!0)return!0}catch{}return Number.parseInt(kt($("OptanonConsent")).interactionCount,10)>0?!0:n&&X()&&(!!window.OneTrust||typeof window.OnetrustActiveGroups=="string")}function i(){if(!o())return null;let s=r();if(!s)return null;let c=p=>t[p]?s(t[p]):null,u=Pt({analytics:c("analytics"),marketing:c("marketing"),personalisation:c("personalisation")},{ad_user_data:c("ad_user_data"),ad_personalization:c("ad_personalization")}),d=kt($("OptanonConsent"));return(typeof navigator<"u"&&navigator.globalPrivacyControl===!0||d.isGpcEnabled==="1")&&(u.marketing=!1,u.ad_user_data=!1,u.ad_personalization=!1),u}return{name:"onetrust",read:i,observesChanges:!0,subscribe(s){if(!X())return()=>{};let c=qe(i,s),u=!1,d=()=>{u||!window.OneTrust?.OnConsentChanged||(u=!0,window.OneTrust.OnConsentChanged(c.notify))};window.addEventListener("OneTrustGroupsUpdated",c.notify);let f=window.OptanonWrapper;return window.OptanonWrapper=function(...g){try{typeof f=="function"&&f.apply(this,g)}finally{d(),c.notify()}},d(),()=>{c.stop(),window.removeEventListener("OneTrustGroupsUpdated",c.notify)}}}}function Po(e){let t=String(e).split(",").map(n=>n.trim()).filter(Boolean);return t.length?new Set(t):null}function Mn(e){let{name:t,categories:n,parse:r=Po,refusedValue:o,source:i="native",changeEvent:s="thg_hp_consent_change"}=e??{};if(typeof t!="string"||t==="")throw new Error("cookieConsent: `name` (the cookie your banner writes) is required");if(!n||typeof n.analytics!="string")throw new Error("cookieConsent: `categories.analytics` (the category id that grants analytics) is required");function c(){let u=$(t);if(u==null)return null;let d;if(o!==void 0&&u===o)d=new Set;else try{d=r(u)}catch{d=null}if(!(d instanceof Set))return null;let f=p=>n[p]?d.has(n[p]):null;return Pt({analytics:f("analytics"),marketing:f("marketing"),personalisation:f("personalisation")},{ad_user_data:f("ad_user_data"),ad_personalization:f("ad_personalization")})}return{name:i,read:c,get observesChanges(){return Tn()},subscribe(u){if(!X())return()=>{};let d=qe(c,u),f=p=>{[...p.changed??[],...p.deleted??[]].some(_=>_?.name===t)&&d.notify()};return window.addEventListener(s,d.notify),window.cookieStore?.addEventListener?.("change",f),()=>{d.stop(),window.removeEventListener(s,d.notify),window.cookieStore?.removeEventListener?.("change",f)}}}}function Dn(e={}){let t=e.name??L("consent"),n=()=>{let r=$(t);if(r==null)return null;let o=Ee(r);return o.analytics==null?null:o};return{name:"forwarded",read:n,get observesChanges(){return Tn()},subscribe(r){if(!X())return()=>{};let o=qe(n,r),i=s=>{[...s.changed??[],...s.deleted??[]].some(u=>u?.name===t)&&o.notify()};return window.cookieStore?.addEventListener?.("change",i),()=>{o.stop(),window.cookieStore?.removeEventListener?.("change",i)}}}}function Un(e){let t=Se(e);return{name:"static",basis:He.host,read:()=>t?{...t}:null,observesChanges:!0,subscribe:()=>()=>{}}}function $n(e){if(e==null)return null;let t=String(e).split("/").map(n=>n.trim()).filter(Boolean).join("/");return t===""?null:t}function Oo(e){let t=e.item_category;if(t!=null&&String(t).includes("/"))return $n(t);let n=[t,e.item_category2,e.item_category3,e.item_category4,e.item_category5].map(r=>r==null?"":String(r).trim()).filter(Boolean);return $n(n.join("/"))}var Lo=e=>{if(e==null||typeof e=="object")return null;let t=String(e).trim();return t===""?null:t};function To(...e){for(let t of e){if(typeof t=="number"&&Number.isFinite(t))return String(t);if(typeof t=="string"&&t.trim()!=="")return t.trim()}return null}var Fe=e=>To(e.item_group_id,e.item_id);function No(e,t=Fe){if(!e)return null;let n=c=>c==null||c===""||Number.isNaN(Number(c))?null:Number(c),r=c=>{let u=n(c);return u==null?null:Math.round(u*1e6)/1e6},o=c=>{let u=r(c);return u!=null&&u>=0?u:null},i=c=>{let u=n(c);return Number.isInteger(u)&&u>=0?u:null},s=Lo;return{product_id:s(t(e)),sku:s(e.item_id),name:s(e.item_name),brand:s(e.item_brand),variant:s(e.item_variant)??s(e.variant),category:Oo(e),price:r(e.price),discount:o(e.discount),quantity:i(e.quantity),coupon:s(e.coupon),position:i(e.index)!=null?i(e.index)+1:null,url:s(e.url)??s(e.item_url)??null,image_url:s(e.image_url)??s(e.image_link)??null,displayed_sku:s(e.displayed_sku)??s(e.displayed_variant_sku)}}function Ot(e,t=Fe){return(e??[]).map(n=>No(n,t)).filter(n=>n?.product_id)}var Ro=1e3,Mo={shipping:2,payment:3},Do=new Set(["password","google","apple","facebook","magic_link","sso","passkey","other"]),V=e=>{if(e==null||typeof e=="object")return null;let t=String(e).trim();return t===""?null:t},Uo=e=>{if(e==null||e===""||typeof e=="object")return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null},Ke=e=>e!==null&&typeof e=="object";function $o(e){return Array.isArray(e.items)?e.items.filter(Ke):null}function Vn(e){let t=V(e)?.toLowerCase().replace(/[\s-]+/g,"_");return t?Do.has(t)?t:t==="email"||t==="email_password"?"password":"other":null}function Vo({ecommerce:e,items:t}){let n=i=>({promotion_id:V(i.promotion_id),name:V(i.promotion_name),creative:V(i.creative_name),position:V(i.creative_slot)}),r=new Set,o=[];for(let i of[n(e),...t.map(n)])!i.promotion_id||r.has(i.promotion_id)||(r.add(i.promotion_id),o.push(i));return o}var Bn=({ecommerce:e,items:t})=>V(e.item_list_id)??V(e.item_list_name)??V(t[0]?.item_list_id)??V(t[0]?.item_list_name),le=(e,t)=>t.products?.length?{event:e,properties:t}:null,Bo=new Set(["product","products","item","items"]);function jo({ecommerce:e}){let t=V(e.item_id),n=V(e.content_type)?.toLowerCase();return!t||n&&!Bo.has(n)?null:{event:"Product Shared",properties:{share_via:V(e.method),products:[{product_id:t}]}}}function Ho(e){let t=o=>le("Product List Viewed",{list_id:Bn(o),products:o.products}),n=o=>{let i=V(o.ecommerce.search_term);return i?{event:"Products Searched",properties:{query:i,...o.products.length?{products:o.products}:{}}}:null},r=o=>i=>i.promotions.map(s=>({event:o,properties:s}));return{view_item:o=>le("Product Viewed",{currency:o.currency,value:o.value,products:o.products.slice(0,1)}),view_item_list:t,view_search_results:o=>n(o)??t(o),search:n,select_item:o=>le("Product Clicked",{list_id:Bn(o),products:o.products.slice(0,1)}),add_to_cart:o=>le("Product Added",{cart_id:V(o.ecommerce.cart_id),products:o.products}),remove_from_cart:o=>le("Product Removed",{cart_id:V(o.ecommerce.cart_id),products:o.products}),view_cart:o=>({event:"Cart Viewed",properties:{cart_id:V(o.ecommerce.cart_id),value:o.value,currency:o.currency,coupon:V(o.ecommerce.coupon),...o.itemsListed?{products:o.products}:{}}}),begin_checkout:o=>le("Checkout Started",{value:o.value,currency:o.currency,coupon:V(o.ecommerce.coupon),products:o.products}),add_shipping_info:o=>({event:"Checkout Step Completed",properties:{step:e.shipping,step_name:"shipping",shipping_method:V(o.ecommerce.shipping_tier)}}),add_payment_info:o=>({event:"Payment Info Entered",properties:{step:e.payment,step_name:"payment",payment_method:V(o.ecommerce.payment_type)}}),view_promotion:r("Promotion Viewed"),select_promotion:r("Promotion Clicked"),add_to_wishlist:o=>le("Product Added to Wishlist",{products:o.products}),share:jo,login:o=>({event:"Signed In",properties:{method:Vn(o.ecommerce.method)}}),sign_up:o=>({event:"Signed Up",properties:{method:Vn(o.ecommerce.method)}})}}var qo=e=>e.event;function Fo(e,t){if(!Ke(e))return null;if(typeof e.length=="number"&&e[0]==="event"&&typeof e[1]=="string"){let r=Ke(e[2])?e[2]:{};return{name:e[1],entry:r,ecommerce:r}}let n=V(t(e));return n?{name:n,entry:e,ecommerce:Ke(e.ecommerce)?e.ecommerce:e}:null}function Lt(e){return Array.isArray(e)?`[${e.map(Lt).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Lt(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function jn(e,t={}){if(!e||typeof e.track!="function")throw new Error("connectDataLayer: analytics must have a track(event, properties, options) method");let n=t.dataLayer??(typeof window<"u"?window.dataLayer=window.dataLayer||[]:null);if(!Array.isArray(n))return()=>{};let r=Ho({...Mo,...t.steps}),o=t.map??{},i=t.eventName??qo,s=t.productId??Fe,c=new Set(["purchase","refund",...t.ignore??[]]),u=t.dedupeMs??Ro,d=new Map,f=!0;function p(w,h,S){if(u<=0)return!1;let T=`${w}|${S??""}|${Lt(h)}`,D=Date.now();for(let[K,G]of d)D-G>u&&d.delete(K);return d.has(T)?!0:(d.set(T,D),!1)}let g=null,_=new Set;function y(w,h){if(w!=="Product Viewed")return!1;let S=typeof location>"u"?"":location.pathname;S!==g&&(g=S,_.clear());let T=h.products?.[0]?.product_id;return T?_.has(T)?!0:(_.add(T),!1):!1}function b({event:w,properties:h={}},S){if(!w||p(w,h,S)||y(w,h))return;let T=S?{context:{currency:S}}:void 0;if(w==="Signed Out"&&typeof e.signedOut=="function"){e.signedOut(T);return}e.track(w,h,T)}function v(w){let h=t.transform?t.transform(w):w,S=Fo(h,i);if(!S||c.has(S.name))return;let T=Object.hasOwn(o,S.name),D=T?o[S.name]:r[S.name];if(typeof D!="function")return;let K=$o(S.ecommerce),G=K??[],B={...S,items:G,itemsListed:K!==null,products:Ot(G,s),currency:St(S.ecommerce.currency),value:Uo(S.ecommerce.value)};B.promotions=Vo(B);let xe=T?D(h,{...B,toProducts:W=>Ot(W,s)}):D(B);for(let W of[xe].flat())W&&b(W,B.currency)}function A(w){if(f)try{v(w)}catch(h){try{t.onError?.(h,w)}catch{}}}for(let w of n.slice())A(w);let m=n.push;function E(...w){let h=m.apply(this,w);for(let S of w)A(S);return h}return n.push=E,()=>{f=!1,n.push===E&&(n.push=m)}}var Ko="hp_debug",zo=256;function Go(){try{return new URLSearchParams(location.search).get(Ko)}catch{return null}}function Hn(e,t){if(typeof location>"u")return!1;try{let n=Go();if(n!==null){let o=n.trim();o===""||o.length>zo?sessionStorage.removeItem(t):sessionStorage.setItem(t,o)}let r=sessionStorage.getItem(t);return!!(e&&r&&un(r)===e)}catch{return!1}}var _e=class extends Error{},Wo={inHoldout:()=>!0,personalisationGroup:()=>"excluded",servingHeaders:()=>({}),recommendationContext:()=>({}),flush:()=>Promise.resolve(),reset:()=>{}};function Tt(e,t){let n=Wo[e]??(()=>null),r=o=>(console.warn(`[hp] ${String(e)} failed; nothing was sent`,o),n());return function(...i){try{let s=t.apply(this,i);return typeof s?.then=="function"?Promise.resolve(s).catch(r):s}catch(s){if(s instanceof _e)throw s;return r(s)}}}function qn(e){for(let t of Reflect.ownKeys(e)){let{value:n}=Object.getOwnPropertyDescriptor(e,t)??{};typeof n=="function"&&(e[t]=Tt(t,n))}return e}var Ce=Symbol("hp.identityOption");var Jo=4320*60*60,Yo=100,Xo=1e3,Zo=2e3,Fn=500,ze=e=>(e?.unref?.(),e);function Qo(e,t){if(t?.analytics===!0&&e.analytics===!1)return"withdrawn";let n=ue.map(r=>e[r]).filter(r=>r!==null);return n.length&&n.every(Boolean)?"accept_all":n.length&&n.every(r=>!r)?"reject_all":"custom"}function es(e,t,n=L("consent")){if(!(typeof document>"u"))try{let r=typeof location<"u"&&location.protocol==="https:"?"; Secure":"",o=t?`; Domain=${t}`:"";document.cookie=`${n}=${vt(e)}; Path=/; Max-Age=${Jo}; SameSite=Lax`+o+r}catch{}}function ts(e){let t=Ee($(e));return ue.some(n=>t[n]!==null)?t:null}function Kn(e){let{adapter:t,timeoutMs:n=5e3,cookieDomain:r=null,cookieName:o=L("consent"),release:i,announce:s}=e,c=e.discard??(()=>{}),u="pending",d=null,f=null,p=null,g=null,_=!1,y=null,b=[],v=N=>{u=N,e.onStatus?.(N)};function A(){try{return Se(t.read())}catch{return null}}function m(){f&&clearInterval(f),p&&clearTimeout(p),f=null,p=null}let E=()=>typeof window<"u"&&typeof document<"u",w=()=>{try{return typeof t.subscribe=="function"&&t.observesChanges===!0}catch{return!1}};function h(){g&&clearInterval(g),g=null}function S(){_||g||d===null||w()||E()&&document.visibilityState==="hidden"||(g=ze(setInterval(()=>B(A()),Zo)))}let T=()=>u==="pending"||u==="unknown",D=e.store??null,K=()=>{let N=b.splice(0);D?.write([]);for(let H of N)i(H)},G=()=>{let N=b.splice(0);D?.write([]);for(let H of N)c(H)};function B(N){let H=Se(N);if(!H||H.analytics===null)return;let ge=d===null,Z=ge?ts(o):d;if(!ge&&At(Z,H))return;m(),d=H,S(),es(H,r,o);let k=!At(Z,H);if(H.analytics){v("granted"),K(),k&&s({action:Qo(H,Z),state:H,previous:Z,withdrawal:!1});return}G(),Z?.analytics===!0&&s({action:"withdrawn",state:H,previous:Z,withdrawal:!0}),v("denied")}function xe(){p=null,u==="pending"&&(v("unknown"),f&&clearInterval(f),f=ze(setInterval(()=>B(A()),Xo)))}function W(N){if(T()){if(D){D.write(b);return}N?.type!=="visibilitychange"&&!N?.persisted&&G()}}let oe=N=>{document.visibilityState==="hidden"?(h(),W(N)):S()},ke=N=>{h(),W(N)},he=N=>{N?.persisted&&d!==null&&B(A()),S()};return{get status(){return u},get state(){return d?{...d}:null},stamp(){return d?{...d,source:t.name??null,basis:t.basis??He.visitor}:null},admits(){return u==="granted"},hold(N){return!T()||b.length>=Fn?(c(N),!1):(b.push(N),!0)},onHidden:W,start(){_=!1;try{y=t.subscribe?.(N=>B(N))??null}catch(N){e.debug&&console.warn("[hp] consent adapter subscribe failed",N)}E()&&(window.addEventListener("pagehide",ke),window.addEventListener("pageshow",he),document.addEventListener("visibilitychange",oe)),D&&b.length===0&&b.push(...D.read().slice(-Fn)),B(A()),!d&&(f=ze(setInterval(()=>B(A()),Yo)),p=ze(setTimeout(xe,n)))},stop(){_=!0,m(),h(),typeof y=="function"&&y(),E()&&(window.removeEventListener("pagehide",ke),window.removeEventListener("pageshow",he),document.removeEventListener("visibilitychange",oe))}}}var ns=["recommendation","search_rank","banner","offer","layout","copy","price","other"],Ge=e=>typeof e=="string"&&e!=="";function zn(e){return(Array.isArray(e?.decisions)?e.decisions:[]).filter(t=>Ge(t?.slot)&&Ge(t.decision_id)&&t.holdout!==!0).map(({decision_id:t,slot:n,arm:r,kind:o})=>({decision_id:t,slot:n,...Ge(r)&&{arm:r},...ns.includes(o)&&{kind:o}}))}function Gn({key:e,mayStore:t}){let n,r=()=>{if(n)return n;try{let i=JSON.parse(sessionStorage.getItem(e));n=Array.isArray(i)?i.filter(s=>Ge(s?.slot)):[]}catch{n=[]}return n},o=()=>{try{n?.length&&t()&&sessionStorage.setItem(e,JSON.stringify(n))}catch{}};return{persist:o,current:()=>r().length?n.map(i=>({...i})):null,remember(i){if(!i.length)return;let s=new Set(i.map(c=>c.slot));n=[...r().filter(c=>!s.has(c.slot)),...i],o()},forget(){n=[];try{sessionStorage.removeItem(e)}catch{}}}}function rs(e){let t=2166136261,n=String(e);for(let r=0;r<n.length;r+=1)t^=n.charCodeAt(r),t=t+((t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24))>>>0;return t^=t>>>16,t=Math.imul(t,2246822507)>>>0,t^=t>>>13,t=Math.imul(t,3266489909)>>>0,t^=t>>>16,t>>>0}function We(e,t,n=1e4){return rs(`${t}\0${e}`)%n}function Nt(e){let t=o=>Math.min(Math.max(Number(o)||0,0),1),n=t(e.share),r=1-n;return{holdout_share:n,personalised_share:e.ramp==null?r:Math.min(t(e.ramp),r)}}function Rt(e,t){if(!e||typeof e.salt!="string")return{holdout:!1,bucket:null,group:"personalised"};let n=e.ramp!=null;if(t==null||t==="")return{holdout:!1,bucket:null,group:n?"excluded":"personalised"};let{holdout_share:r,personalised_share:o}=Nt(e),i=We(t,e.salt),s=u=>Math.round(u*1e4),c=r>0&&i<s(r)?"holdout":!n||i<s(r+o)?"personalised":"excluded";return{holdout:c==="holdout",bucket:i,group:c}}function Wn(e,t){return typeof e!="string"||e===""||t==null||t===""?null:We(t,`bandit-vs-default:${e}`)<1e4/2?"default":"bandit"}var os="hp_preview",ss=256;function Jn(e,t=null){if(typeof location>"u")return $(e);let n=null;try{n=new URLSearchParams(location.search).get(os)}catch{n=null}if(n===null)return $(e);let r=n.trim();return r===""||r.length>ss?(te(e,"",0,t),null):(te(e,r,null,t),r)}var is=40,as=128,cs=5,us=60,Xn=e=>typeof e=="string"&&e!==""&&e.length<=as&&!e.includes(","),Yn=e=>Array.isArray(e)?e.filter(Xn).slice(0,is):[],ls=e=>Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.replaceAll(","," ").trim()).filter(t=>t!=="").slice(0,cs):[],ds=e=>Object.entries(e&&typeof e=="object"?e:{}).filter(([t,n])=>Xn(t)&&Number.isFinite(n)&&n>=1).sort(([,t],[,n])=>n-t).slice(0,us).map(([t,n])=>`${t}:${Math.floor(n)}`);function Mt(e){let t={},n={viewed:Yn(e?.recentProducts),basket:Yn(e?.basketProducts),q:ls(e?.recentSearches),impressed:ds(e?.impressions)};for(let[r,o]of Object.entries(n))o.length>0&&(t[r]=o.join(","));return t}var fs=1800*1e3;function Zn(e,t=Date.now()){try{localStorage.setItem(L("recommendationContext"),JSON.stringify({context:e,until:t+fs}))}catch{}}function Qn(){try{localStorage.removeItem(L("recommendationContext"))}catch{}}var ps="hp_sample",er=1e4;function tr(e,t){return!(typeof t=="number"&&t<1)||e==null||e===""?!0:We(e,ps,er)<Math.round(t*er)}function be(e){return e.trim().toLowerCase().replace(/\s*\/\s*/g,"/").replace(/^\/+|\/+$/g,"")}var ms=2,hs=12;function Pe(e,t=ms){return e.split("/").slice(0,t).join("/")}function Dt(e,t){if(typeof t!="string"||!t.trim())return null;let n=Pe(be(t));return n?(e.unshift(n),e.length=Math.min(e.length,hs),n):null}var de=()=>L("sessionSignals"),Ie=null,Ut=()=>Ie??de();function nr(){try{return Ie?localStorage:sessionStorage}catch{return}}function rr(e,t){let n=t==null?null:String(t),r=e?j(de(),n,e):null;if(r===Ie)return;let o=Ie===null?gs():null;if(Ie=r,!!Ie)try{let i=Ut(),s=vn(de(),n);for(let c of Object.keys(localStorage))c.startsWith(s)&&c!==i&&localStorage.removeItem(c);o&&!localStorage.getItem(i)&&(localStorage.setItem(i,JSON.stringify(o)),sessionStorage.removeItem(de()))}catch{}}function gs(){try{let e=sessionStorage.getItem(de());if(!e)return null;let t=JSON.parse(e);return t&&(t.productViews>0||t.listViews>0||t.basketValue!=null||t.recentProducts?.length||t.recentBrowse?.length)?t:null}catch{return null}}function Je(){return{productViews:0,listViews:0,cartAdds:0,searches:0,recentProducts:[],recentCategories:[],recentBrowse:[],basketProducts:[],basketValue:null,recentSearches:[],impressions:{},browsingCategory:null,recentBrowseCategories:[],browsingListing:null,listViewsByCategory:{},startedAt:0}}function $t(){let e=nr();if(!e)return Je();try{let t=e.getItem(Ut());return t?{...Je(),...JSON.parse(t)}:{...Je(),startedAt:Date.now()}}catch{return{...Je(),startedAt:Date.now()}}}function Vt(e){let t=nr();if(t)try{t.setItem(Ut(),JSON.stringify(e))}catch{}}function Bt(){return $t()}function or(){for(let e of[()=>sessionStorage,()=>localStorage])try{let t=e();t.removeItem(de());for(let n of Object.keys(t))n.startsWith(`${de()}:`)&&t.removeItem(n)}catch{}}var sr=20,ir=200,ys=new Set(["Product Viewed","Product Clicked","Product Added","Product Added to Wishlist"]),ws=new Set(["Product Viewed","Product Added"]),ar=50;function Ye(e,t){let n=Dt(e.recentBrowse,t);return n?(e.recentBrowseCategories=[e.browsingListing?.category??null,...e.recentBrowseCategories].slice(0,e.recentBrowse.length),n):null}function Ss(e,t){let n=e.listViewsByCategory;n[t]=(n[t]??0)+1;let r=Object.keys(n);if(r.length>ar){let o={};for(let i of r.sort((s,c)=>n[c]-n[s]).slice(0,ar))o[i]=n[i];e.listViewsByCategory=o}}function cr(e,t){let n=$t();n.startedAt||(n.startedAt=Date.now());let r=Array.isArray(t?.products)?t.products:[];switch(e){case"Product Viewed":n.productViews+=1,Ye(n,n.browsingCategory);break;case"Product List Viewed":{let s=t?.list_id,c=t?.category;if(!(typeof s=="string"&&s.includes("/")&&!s.startsWith("cdp-")))break;let d=typeof c=="string"&&Pe(be(c))||null,f=d?Pe(be(s)):"";if(!f){n.browsingCategory=null,n.browsingListing=null;break}n.browsingListing={key:f,category:d},Ye(n,f),n.browsingCategory=f,Ss(n,d),n.listViews+=1}break;case"Product List Filtered":{let s=t?.change,c=typeof t?.list_id=="string"?t.list_id:"",u=typeof s?.value=="string"?s.value:"",d=n.browsingListing;if(u&&s?.action!=="removed"&&d&&Pe(be(c))===d.key){let f=Ye(n,`${c}/${u}`);f&&(n.browsingCategory=f)}break}case"Product Added":{n.cartAdds+=1,Ye(n,n.browsingCategory);for(let s of r){let c=s.product_id;typeof c!="string"||!c||(n.basketProducts=[c,...n.basketProducts.filter(u=>u!==c)].slice(0,sr))}break}case"Product Removed":{for(let s of r){let c=s.product_id;typeof c=="string"&&c&&(n.basketProducts=n.basketProducts.filter(u=>u!==c))}break}case"Products Searched":{n.searches+=1;let s=t?.query;if(typeof s=="string"&&s.trim()){let c=s.trim().toLowerCase().slice(0,64);n.recentSearches=[c,...n.recentSearches.filter(u=>u!==c)].slice(0,5)}break}case"Product Clicked":case"Product Added to Wishlist":break;case"Cart Updated":{let s=t?.value;return n.basketValue=typeof s=="number"&&Number.isFinite(s)&&s>=0?s:null,Vt(n),n}default:return n}let o=ys.has(e);if(o)for(let s of r)typeof s.product_id=="string"&&s.product_id&&delete n.impressions[s.product_id];else{for(let c of r){let u=c.product_id;typeof u!="string"||!u||(n.impressions[u]=(n.impressions[u]??0)+1)}let s=Object.keys(n.impressions);if(s.length>ir){let c={};for(let u of s.sort((d,f)=>n.impressions[f]-n.impressions[d]).slice(0,ir))c[u]=n.impressions[u];n.impressions=c}}let i=new Set;for(let s of r){let c=s.product_id;if(o&&typeof c=="string"&&c&&(n.recentProducts=[c,...n.recentProducts.filter(u=>u!==c)].slice(0,sr)),ws.has(e)&&typeof s.category=="string"&&s.category){let u=be(s.category);u&&!i.has(u)&&(i.add(u),Dt(n.recentCategories,u))}}return Vt(n),n}var ur=1800*1e3;function lr({name:e,domain:t=null,mayStore:n,now:r=()=>Date.now(),mint:o=ee}){let i=null,s=0,c=()=>{i!==null&&n()&&te(e,i,ur/1e3,t)};return{get(){let u=r(),d=$(e);return d?i=d:(i===null||u-s>=ur)&&(i=o()),s=u,c(),i},persist:c,forget(){te(e,"",0,t),i=null}}}var z=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),dr=e=>Array.isArray(e)&&e.every(t=>typeof t=="string"),fr=Object.freeze({enabled:!1}),Ht=Object.freeze({enabled:!0,queryParamAllowlist:Object.freeze([])});function pr(e,t){let n=e?.track;return z(n)?(Object.hasOwn(n,t)?n[t]:n.__default)?.enabled!==!1:!0}function _s(e,t){return`${ne(e)}/v1/projects/${encodeURIComponent(t)}/settings`}var bs="https://hp.thgingenuity.com";function ne(e){return e==null||e===""?bs:hr(e)}function mr(e,t){return e!=null&&e!==""?ne(e):t?.startsWith("https://")?t:ne(void 0)}function hr(e){if(typeof e!="string")return null;let t=e.trim().replace(/\/+$/,"");return/^https?:\/\/[^/\s]+$/i.test(t)?t:/^[a-z0-9.-]+(:\d+)?$/i.test(t)?`https://${t}`:null}function Is(e){if(!z(e))return null;let t=Object.fromEntries(Object.entries(e).filter(([,n])=>typeof n=="boolean"));return Object.keys(t).length?t:null}var jt=e=>typeof e=="number"&&e>=0&&e<=1,xs=/^[0-9a-f]{64}$/;function ks(e){return z(e)?{enabled:e.enabled===!0,tokenSha256:typeof e.tokenSha256=="string"&&xs.test(e.tokenSha256)?e.tokenSha256:null}:{enabled:!1,tokenSha256:null}}function As(e){if(!z(e))return null;let t=Object.fromEntries(Object.entries(e).filter(([,n])=>z(n)&&jt(n.share)&&(n.ramp==null||jt(n.ramp))&&typeof n.salt=="string"&&n.salt!=="").map(([n,r])=>[n,{share:r.share,ramp:r.ramp??null,salt:r.salt,...dr(r.readoutSlots)&&r.readoutSlots.length>0&&{readoutSlots:r.readoutSlots}}]));return Object.keys(t).length?t:null}var vs=/^[A-Za-z0-9!#$%&'*+.^_`|~-]{1,128}$/;function Es(e){return z(e)?e.source==="hp_cookie"?{source:"hp_cookie"}:e.source!=="site_cookie"?null:e.cookie==null?{source:"site_cookie",cookie:null}:typeof e.cookie=="string"&&vs.test(e.cookie)?{source:"site_cookie",cookie:e.cookie}:null:null}function Cs(e){let t=Array.isArray(e?.forms)?e.forms.filter(z):[];return t.length===0?null:{forms:t,capture:z(e.capture)?e.capture:null,...Number.isInteger(e.overlay_gap_minutes)?{overlay_gap_minutes:e.overlay_gap_minutes}:{}}}function Ps(e){let t=z(e)?e.hp:null;return z(t)&&typeof t.enabled=="boolean"}function qt(e){let t=z(e)?e.hp:null;if(!z(t)||t.enabled!==!0)return fr;let n=Cs(t.onsite);return{enabled:!0,propertyId:typeof t.propertyId=="string"&&t.propertyId!==""?t.propertyId:null,environment:typeof t.environment=="string"?t.environment:null,consentPurposes:Is(t.consent?.purposes),queryParamAllowlist:dr(t.queryParamAllowlist)?t.queryParamAllowlist:null,anonymousId:Es(t.anonymousId),apiHost:hr(t.apiHost),holdouts:As(t.holdouts),sampleRate:jt(t.sampleRate)?t.sampleRate:1,debug:ks(t.debug),...n&&{onsite:n},plan:z(e.plan)&&z(e.plan.track)?{track:e.plan.track}:null}}var Os=3e3;async function gr(e,t,n=globalThis.fetch,r=Os){try{let o=await n(_s(e,t),{credentials:"omit",headers:{accept:"application/json"},signal:AbortSignal.timeout?.(r)});if(o.status>=400&&o.status<500&&o.status!==408&&o.status!==429)return fr;if(!o.ok)return null;let i=await o.json();return Ps(i)?qt(i):null}catch{return null}}var Xe=e=>j(L("settings"),e);function yr(e){try{let t=localStorage.getItem(Xe(e));if(!t)return null;let n=JSON.parse(t);return n?.enabled===!0?n:null}catch{return null}}function wr(e,t){try{t?.enabled===!0?localStorage.setItem(Xe(e),JSON.stringify(t)):localStorage.removeItem(Xe(e))}catch{}}function Ft(e){try{localStorage.removeItem(Xe(e))}catch{}}var Ls={flushAt:20,flushIntervalMs:1e4,maxQueue:500,maxRetryAgeMs:1440*60*1e3,maxRetries:5,maxPersistedBatches:20,maxPersistedBytes:1024*1024,storageKey:ce.retry,beaconSafeBytes:56*1024,maxBatchEvents:100,maxBatchBytes:500*1024},Ze=()=>Date.now(),Sr=3e4,Yt=55*1024;function Ts(e,t=Ze()){if(typeof e!="string")return 0;let n=e.trim();if(/^\d+$/.test(n))return Number(n)*1e3;if(n==="")return 0;let r=Date.parse(n);return Number.isNaN(r)?0:Math.max(0,r-t)}var re=e=>typeof TextEncoder<"u"?new TextEncoder().encode(e).length:Buffer.byteLength(e),Kt=()=>typeof window<"u"&&typeof document<"u";function Ns(){try{return!Kt()||!window.localStorage?null:(window.localStorage.getItem("thg_hp_probe"),window.localStorage)}catch{return null}}var I,zt,Gt,Qe,Wt,Jt,_r,Oe,Le,Te,br,et,Ir,tt,nt=class{constructor(t){an(this,I);this.o={...Ls,...t},this.queue=[],this.timer=null,this.storage=Ns(),this.inflight=null,this.sending=new Set,this.epoch=0,this.sinceRefusal=new Set,this.wakers=new Set,this.replayAllowed=!this.o.deferReplay,this.draining=null,this.failing=!1,this.answered=!1,Kt()&&(window.addEventListener("pagehide",()=>this.flush({beacon:!0})),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flush()}),O(this,I,tt).call(this))}markFailing(){this.answered||(this.failing=!0)}replayPersisted(){return this.replayAllowed=!0,O(this,I,tt).call(this)}clearPersisted(){if(this.replayAllowed=!1,!!this.storage)try{let t=O(this,I,Te).call(this).filter(n=>this.sinceRefusal.has(n?.id));t.length?this.storage.setItem(this.o.storageKey,JSON.stringify(t)):this.storage.removeItem(this.o.storageKey)}catch{}}discardQueued(){this.queue=[],this.epoch+=1,this.sinceRefusal.clear(),O(this,I,Gt).call(this);for(let t of this.wakers)t()}enqueue(t){let n;try{n=JSON.parse(JSON.stringify(t))}catch(r){this.o.onError?.(`event ${t?.messageId??""} cannot be serialised; dropped`,r);return}this.queue.push(n),this.queue.length>this.o.maxQueue&&this.queue.splice(0,this.queue.length-this.o.maxQueue),this.queue.length>=this.o.flushAt?this.flush():O(this,I,zt).call(this)}flush(t={}){if(O(this,I,Gt).call(this),this.queue.length===0)return Promise.resolve();if(t.beacon&&Kt()&&typeof navigator<"u"&&navigator.sendBeacon)return O(this,I,_r).call(this),Promise.resolve();if(this.inflight)return this.inflight;let n=O(this,I,Jt).call(this,this.queue,this.o.maxBatchEvents,this.o.maxBatchBytes).map(o=>{let i=O(this,I,et).call(this,o);return i&&(this.sending.add(i),this.sinceRefusal.add(i)),{batch:o,id:i}});this.queue=[];let r=this.epoch;return this.inflight=(async()=>{for(let{batch:o,id:i}of n){if(r!==this.epoch){O(this,I,Le).call(this,i);continue}await O(this,I,Oe).call(this,o,0,i,r)}})().finally(()=>{this.inflight=null,this.queue.length>=this.o.flushAt?this.flush():this.queue.length&&O(this,I,zt).call(this)}),this.inflight}};I=new WeakSet,zt=function(){this.timer||(this.timer=setTimeout(()=>this.flush(),this.o.flushIntervalMs),this.timer?.unref?.())},Gt=function(){this.timer&&(clearTimeout(this.timer),this.timer=null)},Qe=function(t){return JSON.stringify({batch:t,writeKey:this.o.writeKey,sentAt:new Date().toISOString()})},Wt=function(){return`${this.o.apiHost.replace(/\/$/,"")}/v1/batch`},Jt=function(t,n,r){let o=re(O(this,I,Qe).call(this,[])),i=[],s=[],c=o;for(let u of t){let d=re(JSON.stringify(u))+1;s.length&&(s.length>=n||c+d>r)&&(i.push(s),s=[],c=o),s.push(u),c+=d}return s.length&&i.push(s),i},_r=function(){let t=this.queue;this.queue=[];let n=O(this,I,Wt).call(this);for(let r of O(this,I,Jt).call(this,t,this.o.maxBatchEvents,this.o.beaconSafeBytes)){let o=O(this,I,Qe).call(this,r);if(re(o)<=this.o.beaconSafeBytes){let i=!1;try{i=navigator.sendBeacon(n,new Blob([o],{type:"text/plain"}))}catch{i=!1}if(i){let s=this.failing?O(this,I,et).call(this,r):null;s&&this.sending.add(s);continue}}O(this,I,Oe).call(this,r,0,O(this,I,et).call(this,r))}},Oe=async function(t,n,r=null,o=this.epoch){r&&this.sending.add(r);let i=O(this,I,Qe).call(this,t),s=0;try{let c=await fetch(O(this,I,Wt).call(this),{method:"POST",headers:{"Content-Type":"text/plain"},body:i,keepalive:re(i)<=this.o.beaconSafeBytes});if(c.ok)return this.failing=!1,this.answered=!0,O(this,I,Le).call(this,r),O(this,I,tt).call(this),!0;let u=c.status===408||c.status===429||c.status>=500;if(u&&(s=Ts(c.headers?.get?.("retry-after"))),!u)return O(this,I,Le).call(this,r),this.o.onError?.(`CDP ingest rejected batch (${c.status}); dropping ${t.length} events`),!0;throw new Error(`retryable ${c.status}`)}catch(c){if(this.failing=!0,n>=this.o.maxRetries){r&&this.sending.delete(r);let d=r?"kept for the next page":"dropped";return this.o.onError?.(`CDP ingest unreachable after ${n} attempts; ${d}: ${t.length} events`,c),!1}let u=Math.max(Math.min(1e3*2**n,Sr)*(.5+Math.random()),Math.min(s,Sr));return o===this.epoch&&await new Promise(d=>{let f=()=>{clearTimeout(p),this.wakers.delete(f),d()},p=setTimeout(f,u);this.wakers.add(f)}),o!==this.epoch?(O(this,I,Le).call(this,r),!1):O(this,I,Oe).call(this,t,n+1,r,o)}},Le=function(t){t&&(this.sending.delete(t),this.sinceRefusal.delete(t),O(this,I,Ir).call(this,t))},Te=function(){let t=JSON.parse(this.storage.getItem(this.o.storageKey)||"[]");return Array.isArray(t)?t:[]},br=function(t,n){let r=s=>re(JSON.stringify(s))+1,o=[...t,n].slice(-this.o.maxPersistedBatches),i=o.reduce((s,c)=>s+r(c),2);for(;o.length>1&&i>this.o.maxPersistedBytes;)i-=r(o[0]),o=o.slice(1);for(;o.length;)try{return this.storage.setItem(this.o.storageKey,JSON.stringify(o)),!0}catch{o=o.slice(1)}return!1},et=function(t){if(!this.storage||this.o.mayPersist&&!this.o.mayPersist())return null;try{let n={at:Ze(),id:`${Ze()}-${Math.random().toString(36).slice(2)}`,batch:t};return re(JSON.stringify(n))+3>this.o.maxPersistedBytes?null:O(this,I,br).call(this,O(this,I,Te).call(this),n)?n.id:null}catch{return null}},Ir=function(t){if(!(!t||!this.storage))try{let n=O(this,I,Te).call(this).filter(r=>r.id!==t);n.length?this.storage.setItem(this.o.storageKey,JSON.stringify(n)):this.storage.removeItem(this.o.storageKey)}catch{}},tt=function(){if(!this.storage||!this.replayAllowed)return this.draining??Promise.resolve();if(this.draining)return this.draining;let t;try{let r=O(this,I,Te).call(this);t=r.filter(o=>Array.isArray(o?.batch)&&Ze()-o.at<this.o.maxRetryAgeMs).map(o=>o.id?o:{...o,id:`${o.at}-${Math.random().toString(36).slice(2)}`}),(t.length!==r.length||t.some((o,i)=>o!==r[i]))&&(t.length?this.storage.setItem(this.o.storageKey,JSON.stringify(t)):this.storage.removeItem(this.o.storageKey))}catch{return Promise.resolve()}let n=t.filter(r=>!this.sending.has(r.id));return n.length?(this.draining=(async()=>{for(let r of n)if(!this.replayAllowed||!await O(this,I,Oe).call(this,r.batch,0,r.id))return})().finally(()=>{this.draining=null}),this.draining):Promise.resolve()};var xr="3.25.0",kr="@thg-agentic/hyper-personalisation-web";var Rs=new Set(["audiences","decisions","recommendations"]);var Ms=Symbol.for("@thg-agentic/hyper-personalisation-web.replay"),Ds=Symbol.for("@thg-agentic/hyper-personalisation-web.unreachable"),Us=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite-access");function $s(e){let t={...e??{}},n=Array.isArray(t.products)?t.products:null;if(t.item_count==null&&n){let r=n.map(o=>o?.quantity);r.every(Number.isInteger)&&(t.item_count=r.reduce((o,i)=>o+i,0))}return t}var Vs="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";function Bs(e){if(/^[0-9a-fA-F]{64}$/.test(e))return e.toLowerCase();if(!/^[A-Za-z0-9+/_-]{43}=?$/.test(e))return null;try{let t=atob(e.replace(/-/g,"+").replace(/_/g,"/").padEnd(44,"="));return t.length!==32?null:Array.from(t,n=>n.charCodeAt(0).toString(16).padStart(2,"0")).join("")}catch{return null}}function rt(e){if(typeof e!="string")return null;let t=Bs(e.trim());return t===Vs?null:t}var Ar=Object.freeze({email_sha256:"sha256",phone_sha256:"sha256",accepts_marketing:"boolean",gender:"string",created_at:"date-time"}),js=/^\d{4}-\d{2}-\d{2}T([01]\d|2[0-3]):[0-5]\d:[0-5]\d(\.\d+)?(Z|[+-]([01]\d|2[0-3]):[0-5]\d)$/i;function Hs(e){if(typeof e!="string"||!js.test(e))return!1;let[t,n,r]=e.slice(0,10).split("-").map(Number),o=new Date(Date.UTC(t,n-1,r));return o.getUTCMonth()===n-1&&o.getUTCDate()===r&&!Number.isNaN(Date.parse(e))}function qs(e,t){return t===null?null:e==="sha256"?rt(t)??void 0:e==="date-time"?t instanceof Date?Number.isNaN(t.getTime())?void 0:t.toISOString():Hs(t)?t:void 0:typeof t===e?t:void 0}function Fs(e,t){let n={},r=[];for(let[o,i]of Object.entries(e)){let s=Object.hasOwn(Ar,o)?Ar[o]:null,c=s?qs(s,i):void 0;c===void 0?r.push(o):n[o]=c}return t&&r.length&&console.warn(`[hp] identify: not sent, not spec traits: ${r.join(", ")}`),n}var vr=!1,Er=!1;function Ks(){Er||(Er=!0,console.warn("[hp] no consent adapter: events are sent under the host's lawful basis (basis 'host'). Pass `consent` to send only once the visitor allows analytics."))}function zs(e){!e||vr||(vr=!0,console.warn("[hp] mintAnonymousId is ignored since 3.6: where device ids come from is set per source in the console (the site\u2019s own cookie, or Hyper-Personalisation\u2019s)."))}function Gs(e){try{return re(JSON.stringify(e))}catch{return 0}}function Cr(e){return e&&typeof e.context=="object"&&e.context!==null?e.context:e}function Ws(e,t){if(e==null||String(e)===t)return;let n=[["localStorage","retry",(r,o)=>[...Array.isArray(r)?r:[],...Array.isArray(o)?o:[]]],["sessionStorage","held",(r,o)=>o?{...o,items:[...r.items??[],...o.items??[]]}:r]];for(let[r,o,i]of n)try{let s=globalThis[r],c=j(L(o),e),u=s?.getItem(c);if(!u)continue;let d=j(L(o),t),f=s.getItem(d);s.setItem(d,JSON.stringify(i(JSON.parse(u),f?JSON.parse(f):null))),s.removeItem(c)}catch{}}function Pr(e){let t=ne(e?.apiHost);if(!t)throw new Error("createAnalytics: apiHost, when given, must be a host or an http(s) origin");if(e?.propertyId!==null&&!e?.propertyId)throw new Error("createAnalytics: propertyId is required (null: the ingest stamps the key\u2019s)");let n={libraryName:kr,libraryVersion:xr,writeKey:"web",queryParamBlocklist:[],debug:!1,validate:null,consentTimeoutMs:5e3,...e,apiHost:t};Ve(n.storageNames),Be();let r=!!n.consent;r||Ks();let o=null;n.getConsent=()=>o?o.stamp():On();let i=()=>!r||o?.status==="granted";Ws(n.propertyId,n.writeKey);let s=r&&n.holdAcrossPages?En(j(L("held"),n.writeKey)):null,c=s?.read()??{items:[],anonymousId:null};n.mintAnonymousId!==void 0&&zs(n.debug);let u=Cn(n,{carried:c.anonymousId,mayStore:i,orOwn:!0}),d=lr({name:L("session"),domain:n.consentCookieDomain??null,mayStore:i}),f=n.getSessionId;n.getSessionId=()=>F(M(f,null))??d.get();let p=Jn(L("preview"),n.consentCookieDomain??null),g=(a,l)=>n.debug&&console.warn("[hp]",a,l??""),_=n.transport??new nt({apiHost:n.apiHost,writeKey:n.writeKey,storageKey:j(L("retry"),n.writeKey),mayPersist:r?()=>o?.status==="granted":void 0,deferReplay:r,onError:g}),y=j(L("previousPage"),n.propertyId),b=null,v=()=>{if(b)return b;try{return sessionStorage.getItem(y)||null}catch{return null}};typeof window<"u"&&window.addEventListener("pageshow",a=>{a.persisted&&(b=null)});let A=a=>{if(b=a||null,!(r&&o.status!=="granted"))try{sessionStorage.setItem(y,a)}catch{}},m=Gn({key:j(L("decisions"),n.propertyId),mayStore:i});n.getDecisions??(n.getDecisions=m.current);let E=F(M(n.getUserId,null)),w=null,h=null,S=null,T=null,D=new Set,K=new Set;function G(a){if(a.type!=="track"||a.event!=="Cart Updated")return;let l=a.properties?.value;T=typeof l=="number"&&Number.isFinite(l)&&l>=0?l:null;for(let x of D)try{x()}catch(P){console.warn("[hp] a basket listener failed",P)}}function B(a,l,x=!1){G(a);try{return xe(a,l,x)}catch(P){if(P instanceof _e)throw P;return console.warn("[hp] the event was not sent",P),null}}function xe(a,l,x){let P=S;S=null;let q=a.type==="track"?a.event:a.type;if(!x&&!pr(n.plan,q))return null;let C={messageId:P?.messageId??ee(),timestamp:P?.timestamp??new Date().toISOString(),anonymousId:F(M(n.getAnonymousId,null)),userId:E??null,...a,context:In(n,Cr(l))};if(C.properties&&(C.properties=gt(C.properties)),typeof C.properties?.href=="string"&&(C.properties.href=wt(C.properties.href,n)),!x&&!tr(C.anonymousId,n.sampleRate))return n.debug&&console.debug("[hp] not sent: outside the sample",C),null;if(n.beforeSend){let ye;try{ye=n.beforeSend(C)}catch(Kr){return console.warn("[hp] beforeSend failed; the event was not sent",Kr),null}if(!ye)return null;let{type:De,event:on,messageId:qr,timestamp:Fr}=C;C={...ye,type:De,messageId:qr,timestamp:Fr,...on?{event:on}:{}}}if(n.validate){let ye=n.validate(C,{producer:"web"});if(!ye.valid){let De=`[hp] invalid ${C.event??C.type}:
|
|
2
|
-
${
|
|
3
|
-
`)}`;if(n.throwOnInvalid)throw new _e(De);console.error(De)}}n.debug&&console.debug("[hp]",C.event??C.type,C);let rn=Gs(C);return rn>Yt?(g(`${C.event??C.type} not sent: ${rn} bytes, over the ${Yt}-byte limit for one event`),null):(Z(C,x),C)}function W(a){if(a.type==="track"&&N(a),n.onEvent)try{n.onEvent(a)}catch(l){console.warn("[hp] onEvent observer failed",l)}}let oe=()=>r&&o?.state?.personalisation===!0,ke=()=>rr(M(n.getSessionId,null),n.propertyId),he=!1;function N(a){try{oe()?(ke(),Zn(Mt(cr(a.event,a.properties))),he=!0):H()}catch(l){n.debug&&console.warn("[hp] the visit was not recorded",l)}}function H(a=!1){Qn(),(a||he)&&or(),he=!1}function ge(){d.forget(),m.forget(),ut.clear(),u?.forget(),H(!0)}function Z(a,l){!r||l||o.admits()?(W(a),_.enqueue(a)):o.hold(a)}let k=(a,l,x)=>B({type:"track",event:a,properties:l??{}},x),ut=new Set,jr=(a,l,x)=>a==="audiences"?{audiences:l?null:x.audiences??[]}:a==="decisions"?{decisions:(x.decisions??[]).map(P=>({slot:P.slot,decision_id:P.decision_id??null,arm:P.arm??null,...P.variant&&{variant:P.variant}}))}:{recommendation_request_id:x.recommendation_request_id??null};r&&(o=Kn({adapter:n.consent,timeoutMs:n.consentTimeoutMs,cookieDomain:n.consentCookieDomain,debug:n.debug,store:s&&{read:()=>c.items,write:a=>s.write(a,u?.peek()??null)},release(a){a.context&&(a.context.consent=o.stamp()),W(a),_.enqueue(a)},onStatus(a){if(a==="granted"&&(u?.persist(),d.persist(),b&&A(b),m.persist(),_.replayPersisted?.()),a==="denied"){_.clearPersisted?.(),u?.forget(),d.forget();try{sessionStorage.removeItem(y)}catch{}m.forget(),H(!0)}try{n.onConsentStatus?.(a)}catch(l){console.warn("[hp] onConsentStatus observer failed",l)}if(a==="granted"||a==="denied")for(let l of K)try{l()}catch(x){console.warn("[hp] a consent listener failed",x)}},announce({action:a,state:l,previous:x,withdrawal:P}){l?.personalisation!==!0&&H(x?.personalisation===!0),P&&_.discardQueued?.(),B({type:"track",event:"Consent Updated",properties:{action:a,state:l}},void 0,P),P&&_.flush()}}),o.start());let Qt=()=>n.holdout?Nt(n.holdout):null,en=()=>Rt(n.holdout,F(M(n.getAnonymousId,null))).group;function Hr(a,l){if(!Array.isArray(a?.decisions))return a;let x=n.holdout?.readoutSlots??[],P=F(M(n.getAnonymousId,null));return{...a,decisions:a.decisions.map(q=>{let C=q?.variant==="bandit"||q?.variant==="default"?q.variant:!l&&q?.holdout!==!0&&x.includes(q?.slot)?Wn(q.slot,P):null;return C?C==="default"?{...q,variant:C,decision_id:null}:{...q,variant:C}:q})}}function tn(a,l){if(p)return null;let x=a?.exposure,P=x?.holdout===!0,q=Hr(a,P);return m.remember(zn(q)),!x?.token||ut.has(x.token)?null:(ut.add(x.token),k("Personalisation Exposed",{exposure_token:x.token,surface:x.surface,holdout:P,holdout_share:x.holdout_share??Qt()?.holdout_share??null,personalised_share:x.personalised_share??Qt()?.personalised_share??null,...jr(x.surface,P,q)},l))}function nn(a){return E&&ge(),E=null,w=null,h=null,a}return qn({track:(a,l,x)=>a==="Signed Out"?nn(k(a,l,x)):k(a,l,x),page(a,l){a??(a={});let x=n.pageType??null;a.type&&(we.has(a.type)?(x=a.type,n.pageType=a.type):n.debug&&console.warn(`[hp] ignoring unknown page.type "${a.type}". Allowed: ${[...we].join(", ")}`));let P=B({type:"page",properties:{name:a.name??null,navigation_trigger:a.navigation_trigger??gn(),previous_message_id:v()}},{page:{type:x},...Cr(l)??{}});return P&&A(P.messageId),P},identify(a,l,x){let{userId:P,...q}=a&&typeof a=="object"?a:{};if(P!==void 0){let C=F(P);x===Ce?h=C:w&&C&&C!==w?ge():n.debug&&h&&C&&C!==h&&console.warn("[hp] identify names another userId than the identity option; using the new one"),E=C,C&&x!==Ce&&(w=C)}return B({type:"identify",traits:Fs(q,n.debug)},l)},reset(){E&&ge(),E=null,w=null,h=null,A("")},productViewed:(a,l)=>k("Product Viewed",a,l),productListViewed:(a,l)=>k("Product List Viewed",a,l),recommendationsViewed:(a,l)=>k("Recommendations Viewed",a,l),personalisationExposed:(a,l)=>k("Personalisation Exposed",a,l),recordExposure:tn,surfaceViewed({surface:a}={},l){if(!Rs.has(a)||!n.holdout||a!=="decisions"&&!oe())return null;let x=F(M(n.getAnonymousId,null)),P=Rt(n.holdout,x).group;if(P==="excluded")return null;let q=pn({sessionId:Ue(M(n.getSessionId,null),x),surface:a});return q?tn({exposure:{token:q,surface:a,holdout:P==="holdout"}},l):null},inHoldout:()=>en()!=="personalised",personalisationGroup:en,productClicked:(a,l)=>k("Product Clicked",a,l),productListFiltered:(a,l)=>k("Product List Filtered",a,l),productsSearched:(a,l)=>k("Products Searched",a,l),searchSuggestionsViewed:(a,l)=>k("Search Suggestions Viewed",a,l),productAdded:(a,l)=>k("Product Added",a,l),productRemoved:(a,l)=>k("Product Removed",a,l),cartUpdated:(a,l)=>k("Cart Updated",$s(a),l),identityLinked:(a,l)=>k("Identity Linked",a,l),slotEngaged:(a,l)=>p?null:k("Slot Engaged",a,l),productVariantSelected:(a,l)=>k("Product Variant Selected",a,l),cartViewed:(a,l)=>k("Cart Viewed",a,l),productAddedToWishlist:(a,l)=>k("Product Added to Wishlist",a,l),productRemovedFromWishlist:(a,l)=>k("Product Removed from Wishlist",a,l),wishlistProductAddedToCart:(a,l)=>k("Wishlist Product Added to Cart",a,l),productShared:(a,l)=>k("Product Shared",a,l),cartShared:(a,l)=>k("Cart Shared",a,l),couponEntered:(a,l)=>k("Coupon Entered",a,l),couponApplied:(a,l)=>k("Coupon Applied",a,l),couponDenied:(a,l)=>k("Coupon Denied",a,l),couponRemoved:(a,l)=>k("Coupon Removed",a,l),checkoutStarted:(a,l)=>k("Checkout Started",a,l),promotionViewed:(a,l)=>k("Promotion Viewed",a,l),promotionClicked:(a,l)=>k("Promotion Clicked",a,l),checkoutStepViewed:(a,l)=>k("Checkout Step Viewed",a,l),checkoutStepCompleted:(a,l)=>k("Checkout Step Completed",a,l),paymentInfoEntered:(a,l)=>k("Payment Info Entered",a,l),checkoutFailed:(a,l)=>k("Checkout Failed",a,l),signedIn:(a,l)=>k("Signed In",a,l),signedUp:(a,l)=>k("Signed Up",a,l),signedOut:a=>nn(k("Signed Out",{},a)),newsletterSubscribed:(a,l)=>k("Newsletter Subscribed",a,l),newsletterUnsubscribed:(a,l)=>k("Newsletter Unsubscribed",a,l),preferencesStated:(a,l)=>k("Preferences Stated",a,l),backInStockSubscribed:(a,l)=>k("Back In Stock Subscribed",a,l),productReviewed:(a,l)=>k("Product Reviewed",a,l),consentUpdated:(a,l)=>k("Consent Updated",a,l),flush:a=>_.flush(a),recommendationContext(){if(!oe())return{};try{return ke(),Mt(Bt())}catch{return{}}},get consent(){return o?o.state:null},servingHeaders:()=>Et(o?.state??null),get lastPageMessageId(){return v()},get anonymousId(){return F(M(n.getAnonymousId,null))},[Us](){return{writeKey:n.writeKey,storageKey:j(L("onsite"),n.propertyId),gatewayHost:n.apiHost,servingHost:n.servingHost??n.apiHost,settings:n.onsite??null,debug:n.debug===!0,preview:p,anonymousId:()=>F(M(n.getAnonymousId,null)),sessionId:()=>F(M(n.getSessionId,null)),analytics:i,personalisation:oe,consent:()=>n.getConsent(),headers:()=>Et(o?.state??null),pageUrl:()=>typeof location>"u"?null:wt(location.href,n),locale:()=>_t(M(n.getLocale,n.locale)),basketValue:()=>{let a=Bt().basketValue;return T??(Number.isFinite(a)?a:null)},onBasket:a=>(D.add(a),()=>D.delete(a)),consentAnswered:()=>!o||o.status==="granted"||o.status==="denied",onConsentAnswered:a=>(K.add(a),()=>K.delete(a))}},[Ds](){_.markFailing?.()},[Ms](a,l,x){if(typeof this[a]=="function"){S=typeof x?.messageId=="string"&&typeof x?.timestamp=="string"?{messageId:x.messageId,timestamp:x.timestamp}:null;try{this[a](...Array.isArray(l)?l:[])}finally{S=null}}}})}var Ne=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite"),J=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.pending"),Re=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.listeners"),ot=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.suppressed"),Js=["shown","submitted","apply","closed","held"],Or=10,fe=()=>typeof window>"u"?null:window;function Me(){try{for(let{resolve:e}of fe()?.[J]?.splice(0)??[])e(!1)}catch{}}var pe=Object.freeze({open(e){try{let t=fe();if(!t||typeof e!="string")return Promise.resolve(!1);if(t[Ne])return t[Ne].open(e);if(t[J]??(t[J]=[]),t[J].length<Or)return new Promise(n=>t[J].push({slot:e,resolve:n}))}catch{}return Promise.resolve(!1)},show(e){return pe.open(e)},on(e,t){var n;try{let r=fe();return!r||!Js.includes(e)||typeof t!="function"?()=>{}:(r[Re]??(r[Re]={}),((n=r[Re])[e]??(n[e]=new Set)).add(t),()=>r[Re][e].delete(t))}catch{return()=>{}}},suppress(e="page"){try{let t=fe();if(!t)return;(t[ot]??(t[ot]=new Set)).add(String(e)),t[Ne]?.suppress()}catch{}},unsuppress(e){try{let t=fe()?.[ot];e===void 0?t?.clear():t?.delete(String(e))}catch{}},ready(){try{let e=fe();if(!e)return Promise.resolve([]);if(e[Ne])return Promise.resolve(pe.debug());if(e[J]??(e[J]=[]),e[J].length<Or)return new Promise(t=>e[J].push({slot:null,resolve:()=>t(pe.debug())}))}catch{}return Promise.resolve([])},debug(){try{return fe()?.[Ne]?.debug()??[]}catch{return[]}}});function Lr(e){let t=typeof document>"u"?null:document.currentScript?.src;return t?new URL(e,t).href:null}var st=new Map;function Tr(e,t){return window[t]?Promise.resolve(window[t]):e?(st.has(t)||st.set(t,new Promise((n,r)=>{let o=document.createElement("script");o.src=e,o.async=!0,o.onload=()=>window[t]?n(window[t]):r(new Error(`${e} did not register`)),o.onerror=()=>r(new Error(`${e} did not load`)),document.head.append(o)}).finally(()=>st.delete(t))),st.get(t)):Promise.reject(new Error("the CDN script\u2019s own URL is unknown"))}var Ys=Lr("onsite.min.js"),Xt=()=>Tr(Ys,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.module"));var Zt=Symbol.for("@thg-agentic/hyper-personalisation-web.bootstrap"),Xs=Symbol.for("@thg-agentic/hyper-personalisation-web.drain"),Zs=Symbol.for("@thg-agentic/hyper-personalisation-web.carry"),Nr=Symbol.for("@thg-agentic/hyper-personalisation-web.replay"),Qs=Symbol.for("@thg-agentic/hyper-personalisation-web.unreachable"),ei=Symbol.for("@thg-agentic/hyper-personalisation-web.assignment"),ti=Symbol.for("@thg-agentic/hyper-personalisation-web.recommendation-context"),ct=e=>e?()=>$(e):()=>null,Dr={didomi:e=>Nn({purposes:e.purposes}),onetrust:e=>Rn({groups:e.groups,impliedConsent:e.impliedConsent}),cookie:e=>Mn({name:e.name,categories:e.categories,refusedValue:e.refusedValue,source:e.source,changeEvent:e.changeEvent}),forwarded:e=>Dn({name:e.name}),static:e=>{if(!e.state||typeof e.state!="object")throw new Error('consent.state is required for provider "static"');return Un(e.state)}},Rr=Object.keys(Dr),me=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),it=e=>typeof e=="string"&&e!=="",ni=e=>Array.isArray(e)&&e.every(t=>typeof t=="string"),Ur=e=>me(e)&&typeof e.read=="function";function ri(e,t={}){let n=[];if(!me(e))return["config must be { writeKey, apiHost? }"];it(e.writeKey)||n.push("writeKey is required"),ne(e.apiHost)||n.push("apiHost, when given, must be a host or an http(s) origin"),t.propertyId!==void 0&&!it(t.propertyId)&&n.push("propertyId must be a string");let{consent:r}=t;if(!Ur(r)&&!(me(r)&&Rr.includes(r.provider))&&n.push(`consent must be a consent adapter or { provider: ${Rr.join(" | ")} }`),t.autocapture!==void 0&&t.autocapture!==!1&&!me(t.autocapture)&&n.push("autocapture must be false or { promotions, productLists, recommendations }"),t.onsite!==void 0&&typeof t.onsite!="boolean"&&!me(t.onsite)&&n.push("onsite must be true, false or the onsite options"),t.beforeSend!==void 0&&typeof t.beforeSend!="function"&&n.push("beforeSend must be a function"),t.identityCookies!==void 0)if(!me(t.identityCookies))n.push("identityCookies must be an object");else for(let o of["anonymousId","sessionId"]){let i=t.identityCookies[o];i!==void 0&&!it(i)&&n.push(`identityCookies.${o} must be a cookie name`)}for(let o of["getCurrency","getShipToCountry","getLocale"])t[o]!==void 0&&typeof t[o]!="function"&&n.push(`${o} must be a function`);return t.dataLayer!==void 0&&(me(t.dataLayer)?(t.dataLayer.name!==void 0&&!it(t.dataLayer.name)&&n.push("dataLayer.name must be a string"),t.dataLayer.ignore!==void 0&&!ni(t.dataLayer.ignore)&&n.push("dataLayer.ignore must be an array of strings")):n.push("dataLayer must be an object")),n}function oi(e,t,n){if(Ur(e))return Ct(e,t.consentPurposes);let{provider:r,...o}=e,i=n?.consent?.[r]??Dr[r];return Ct(i(o),t.consentPurposes)}var $r=(e,t)=>`${e??""}|${t??""}`;function si(e,t){let n=F(t?.userId),r=rt(t?.emailSha256);if(!n&&!r)return null;try{let o=j(L("identified"),e);if(sessionStorage.getItem(o)===$r(n,r))return null}catch{}return{...n?{userId:n}:{},...r?{email_sha256:r}:{}}}async function ii({writeKey:e,apiHost:t},n){if(n.settings!==void 0)return{settings:qt(n.settings),revalidated:null};let r=gr(t,e),o=yr(e);if(o)return{settings:o,revalidated:r,fetched:r};let i=await r;return i?{settings:i,revalidated:r,fetched:r}:{settings:Ht,revalidated:null,fetched:r}}function Vr(e,t){let n=t??{},r=typeof window<"u"?window:null;if(r?.[Zt])return r[Zt];let o=Pn(e?.writeKey,()=>{let{analytics:s}=Ee($(L("consent")));return s===!0||s===null&&n.holdAcrossPages===!0}),i=li(e,n,o);if(r){let s=n.extend?.getSessionId??ct(n.identityCookies?.sessionId),c=ct(n.identityCookies?.anonymousId);r[ei]=({slot:u,arm:d}={})=>fn({sessionId:Ue(s(),c()),slot:u,arm:d}),r[Zt]=i,r[Zs]=o,r[Xs]?.(i)}return i}function ai(){let e=globalThis.performance?.now?.();return new Date(Date.now()-(Number.isFinite(e)?e:0)).toISOString()}function Mr(e,t){if(t===!1)return()=>{};let n={promotions:!0,productLists:!0,recommendations:!0,exposures:!0,...t},r=i=>i&&typeof i=="object"?i:{},o=[];try{n.promotions&&o.push(pt(e,r(n.promotions))),n.productLists&&o.push(ft(e,r(n.productLists))),n.recommendations&&o.push(mt(e,r(n.recommendations))),n.exposures&&o.push(dt(e,r(n.exposures)))}catch(i){console.warn("[hp] autocapture not started:",i?.message??i)}return()=>{for(let i of o)i()}}var ci=1e3;function ui(e,t,n,r){if(!t)return Me();let o=n.onsite?Xt():null;o?.catch(()=>{}),(r?Promise.race([r.then(s=>s??n),new Promise(s=>setTimeout(()=>s(n),ci))]):Promise.resolve(n)).then(s=>{let c=s.enabled?s.onsite:null;if(!c)return Me();let u=t===!0?{}:t;return(o??Xt()).then(d=>d.startOnsite(e,{...u,settings:u.settings??c}))}).catch(s=>{Me(),console.warn("[hp] onsite not started:",s?.message??s)})}function at(e){return e.close(),Me(),null}async function li(e,t,n){try{let r=ri(e,t);if(r.length)return console.warn(`[hp] not started, the configuration is invalid: ${r.join("; ")}`),at(n);Ve(t.storageNames),Be();let{writeKey:o}=e,[{settings:i,revalidated:s,fetched:c},u]=await Promise.all([ii(e,t),Promise.resolve(t.identity).catch(()=>null)]),d=s?i:null,f=!1,p=()=>f&&d&&wr(o,d);if(s?.then(h=>{h&&(d=h,h.enabled?p():Ft(o))}),!i.enabled)return t.debug&&console.info("[hp] off: the settings for this write key do not enable it"),at(n);let g=t.propertyId??i.propertyId??null;if(!g&&i!==Ht)return console.warn("[hp] not started: this write key covers several properties, so propertyId is required"),at(n);let{preset:_}=t,y=si(g,u),b=t.debug===!0||i.debug?.enabled===!0||Hn(i.debug?.tokenSha256??null,L("debug")),v=F(u?.userId),A=Pr({apiHost:mr(e.apiHost,i.apiHost),servingHost:ne(e.apiHost),onsite:i.onsite??null,writeKey:o,propertyId:g,pageType:we.has(t.pageType)?t.pageType:void 0,environment:i.environment,queryParamAllowlist:i.queryParamAllowlist??void 0,plan:i.plan,sampleRate:i.sampleRate??1,holdout:i.holdouts?.[g],getCurrency:t.getCurrency,getShipToCountry:t.getShipToCountry,getLocale:t.getLocale,consent:oi(t.consent,i,_),consentCookieDomain:t.consentCookieDomain,storageNames:t.storageNames,holdAcrossPages:t.holdAcrossPages===!0,mintAnonymousId:t.mintAnonymousId,debug:b,anonymousIdSource:i.anonymousId??void 0,getAnonymousId:ct(t.identityCookies?.anonymousId),getSessionId:t.identityCookies?.sessionId?ct(t.identityCookies.sessionId):void 0,getUserId:()=>v,beforeSend:t.beforeSend,...t.extend,onConsentStatus(h){if(h==="granted"&&(f=!0,p()),h==="denied"){Ft(o);try{sessionStorage.removeItem(j(L("identified"),g))}catch{}}t.extend?.onConsentStatus?.(h)},onEvent(h){if(h.type==="identify"){let S=$r(F(h.userId),rt(h.traits?.email_sha256));try{sessionStorage.setItem(j(L("identified"),g),S)}catch{}}t.extend?.onEvent?.(h)}});typeof window<"u"&&(window[ti]=()=>A.recommendationContext()),c?.then(h=>h===null&&A[Qs]());for(let[h,S,T]of n.take())try{A[Nr](h,S,T)}catch(D){console.warn(`[hp] carried ${h} failed`,D)}A[Nr]("page",[t.pageType?{type:t.pageType}:{}],{messageId:ee(),timestamp:ai()});let m=Mr(A,t.autocapture),E=A.page;A.page=Tt("page",(...h)=>{let S=E(...h);return m(),m=Mr(A,t.autocapture),S});let w=typeof window<"u"?window:null;if(w?.addEventListener?.("pageshow",h=>{h.persisted&&A.page({navigation_trigger:"back_forward"})}),t.dataLayer&&w){let h=t.dataLayer.name??"dataLayer";w[h]=w[h]||[],jn(A,{..._,dataLayer:w[h],ignore:[..._?.ignore??[],...t.dataLayer.ignore??[]],onError:S=>b&&console.warn("[hp] dataLayer mapping failed",S)})}return y&&A.identify(y,void 0,Ce),A.onsite=pe,ui(A,t.onsite,i,s),A}catch(r){return console.warn("[hp] not started:",r?.message??r),at(n)}}function Br(e){e.initialized=!0,Vr(e._config,e._options).then(t=>{let n=e.splice(0);if(!t){for(let r of e.methods??[])e[r]=()=>e;return}e.client=t;for(let[r,o]of Object.entries(t))typeof o=="function"&&(e[r]=o);for(let[r,...o]of n)try{t[r]?.(...o)}catch(i){console.warn(`[hp] queued ${r} failed`,i)}})}var U=window.hp=window.hp||[];U.servingHeaders??(U.servingHeaders=()=>({}));U.inHoldout??(U.inHoldout=()=>!0);U.personalisationGroup??(U.personalisationGroup=()=>"excluded");U.recommendationContext??(U.recommendationContext=()=>({}));U.onsite??(U.onsite=pe);U.initialized||(U._config?Br(U):U.load=(e,t)=>{U._config=e,U._options=t??{},Br(U)});})();
|
|
1
|
+
(()=>{var gn=e=>{throw TypeError(e)};var co=(e,t,n)=>t.has(e)||gn("Cannot "+n);var yn=(e,t,n)=>t.has(e)?gn("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n);var L=(e,t,n)=>(co(e,t,"access private method"),n);var Ae=[];for(let e=2;Ae.length<64;e++)Ae.every(t=>e%t!==0)&&Ae.push(e);var wn=e=>(e-Math.floor(e))*2**32>>>0,uo=Ae.slice(0,8).map(e=>wn(Math.sqrt(e))),lo=Ae.map(e=>wn(Math.cbrt(e))),Z=(e,t)=>e>>>t|e<<32-t;function Sn(e){let t=new TextEncoder().encode(String(e)),n=new Uint32Array((t.length+8>>6)*16+16);t.forEach((i,s)=>{n[s>>2]|=i<<24-s%4*8}),n[t.length>>2]|=128<<24-t.length%4*8,n[n.length-2]=Math.floor(t.length/2**29),n[n.length-1]=t.length*8;let r=Uint32Array.from(uo),o=new Uint32Array(64);for(let i=0;i<n.length;i+=16){for(let w=0;w<64;w++){if(w<16){o[w]=n[i+w];continue}let x=o[w-15],_=o[w-2],k=Z(x,7)^Z(x,18)^x>>>3,m=Z(_,17)^Z(_,19)^_>>>10;o[w]=o[w-16]+k+o[w-7]+m}let[s,c,u,d,f,p,g,A]=r;for(let w=0;w<64;w++){let x=Z(f,6)^Z(f,11)^Z(f,25),_=A+x+(f&p^~f&g)+lo[w]+o[w]|0,m=(Z(s,2)^Z(s,13)^Z(s,22))+(s&c^s&u^c&u)|0;[A,g,p,f,d,u,c,s]=[g,p,f,d+_|0,u,c,s,_+m|0]}[s,c,u,d,f,p,g,A].forEach((w,x)=>{r[x]+=w})}return Array.from(r,i=>i.toString(16).padStart(8,"0")).join("")}var _t=(e,t)=>e<<t|e>>>32-t;function _n(e){let t=new Uint32Array((e.length+8>>6)*16+16);e.forEach((i,s)=>{t[s>>2]|=i<<24-s%4*8}),t[e.length>>2]|=128<<24-e.length%4*8,t[t.length-2]=Math.floor(e.length/2**29),t[t.length-1]=e.length*8;let n=Uint32Array.of(1732584193,4023233417,2562383102,271733878,3285377520),r=new Uint32Array(80);for(let i=0;i<t.length;i+=16){for(let p=0;p<80;p++)r[p]=p<16?t[i+p]:_t(r[p-3]^r[p-8]^r[p-14]^r[p-16],1);let[s,c,u,d,f]=n;for(let p=0;p<80;p++){let g,A;p<20?(g=c&u|~c&d,A=1518500249):p<40?(g=c^u^d,A=1859775393):p<60?(g=c&u|c&d|u&d,A=2400959708):(g=c^u^d,A=3395469782);let w=_t(s,5)+g+f+A+r[p]|0;[f,d,u,c,s]=[d,u,_t(c,30),s,w]}[s,c,u,d,f].forEach((p,g)=>{n[g]+=p})}let o=new Uint8Array(20);return n.forEach((i,s)=>{o[s*4]=i>>>24,o[s*4+1]=i>>>16,o[s*4+2]=i>>>8,o[s*4+3]=i}),o}var fo="e28e8ada-5b76-4209-bba9-79b823a0af75",po=e=>Array.from(e,t=>t.toString(16).padStart(2,"0")).join("");function bn(e,t){let n=Uint8Array.from(e.replace(/-/g,"").match(/../g),c=>Number.parseInt(c,16)),r=new TextEncoder().encode(t),o=new Uint8Array(16+r.length);o.set(n),o.set(r,16);let i=_n(o).slice(0,16);i[6]=i[6]&15|80,i[8]=i[8]&63|128;let s=po(i);return`${s.slice(0,8)}-${s.slice(8,12)}-${s.slice(12,16)}-${s.slice(16,20)}-${s.slice(20)}`}var ce=(e,t)=>typeof e=="string"&&e!==""&&e.length<=t?e:null;function Be(e,t){return ce(e,64)??ce(t,256)}function In({sessionId:e,slot:t,arm:n}={}){let r=ce(e,256);return!r||!ce(t,256)||!ce(n,256)?null:bn(fo,`${r}:${t}:${n}`)}var mo="4b1f2c7e-9a3d-4e58-b6c1-2d7f0a9e8c53";function xn({sessionId:e,surface:t}={}){let n=ce(e,256);return!n||!ce(t,64)?null:bn(mo,`${n}:${t}`)}var ho=Array.from({length:11},(e,t)=>t/10);function go(e,t){if(!e.isIntersecting)return!1;let{intersectionRect:n,boundingClientRect:r,rootBounds:o}=e;if(!n||!r)return!0;let i=n.width*n.height,s=r.width*r.height,c=o?Math.min(s,o.width*o.height):s;return c>0&&i/c>=t}function te(e){let{selector:t,onViewable:n,visibleRatio:r=.5,dwellMs:o=1e3,root:i=document}=e,s=new Map,c=new WeakSet,u=new Set,d=m=>{s.has(m)||s.set(m,setTimeout(()=>{s.delete(m),n(m)&&(p?.unobserve(m),u.delete(m))},o))},f=m=>{clearTimeout(s.get(m)),s.delete(m)},p=typeof IntersectionObserver>"u"?null:new IntersectionObserver(m=>{for(let E of m){let S=E.target;if(!go(E,r)){u.delete(S),f(S);continue}u.add(S),g()&&d(S)}},{threshold:ho}),g=()=>typeof document>"u"||document.visibilityState!=="hidden",A=()=>{if(g())for(let m of u)d(m);else for(let m of u)f(m)};document.addEventListener("visibilitychange",A);let w=()=>{for(let m of i.querySelectorAll(t))c.has(m)||(c.add(m),p?.observe(m))},x=typeof MutationObserver>"u"?null:new MutationObserver(()=>w()),_=()=>{w(),x?.observe(i===document?document.body:i,{childList:!0,subtree:!0})},k=i===document&&!document.body;return k?document.addEventListener("DOMContentLoaded",_,{once:!0}):_(),()=>{k&&document.removeEventListener("DOMContentLoaded",_),document.removeEventListener("visibilitychange",A),p?.disconnect(),x?.disconnect();for(let m of s.values())clearTimeout(m);s.clear(),u.clear()}}function bt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-exposure]",visibleRatio:r=.5,dwellMs:o=1e3,root:i=document}=t;return te({selector:n,root:i,visibleRatio:r,dwellMs:o,onViewable(s){let c=s.dataset?.hpExposure?.trim();return c&&e.surfaceViewed({surface:c}),!0}})}var kn=e=>{try{return new URL(e,document.baseURI).toString()}catch{return e}};function It(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-list]",tileSelector:r="[data-hp-product]",visibleRatio:o=.5,dwellMs:i=1e3,root:s=document}=t,c=new Set,u=w=>w.closest?.(n)??null,d=w=>{let x=w.dataset.hpList?.trim();return x?{list_id:x,category:w.dataset.hpListCategory?.trim()||null}:null},f=w=>Array.from(w.querySelectorAll(r)).filter(x=>u(x)===w),p=(w,x)=>{try{let _=JSON.parse(w.dataset.hpProduct??"");return!_||typeof _!="object"||!_.product_id?null:{..._,position:_.position??x+1,..._.url?{url:kn(_.url)}:{},..._.image_url?{image_url:kn(_.image_url)}:{}}}catch{return null}},g=te({selector:`${n} ${r}`,root:s,visibleRatio:o,dwellMs:i,onViewable(w){let x=u(w);if(!x||x.dataset.hpListView==="manual")return!0;let _=d(x);if(!_||c.has(_.list_id))return!0;let k=new Set,m=f(x).map(p).filter(E=>!E||k.has(E.product_id)?!1:(k.add(E.product_id),!0));return m.length===0||(c.add(_.list_id),e.productListViewed({..._,products:m})),!0}}),A=w=>{let _=w.target?.closest?.("a[href]")?.closest(r);if(!_)return;let k=u(_),m=p(_,k?f(k).indexOf(_):0);m&&e.productClicked({list_id:k?d(k)?.list_id??null:null,products:[m]})};return document.addEventListener("click",A,!0),()=>{document.removeEventListener("click",A,!0),g()}}function D(e,...t){let n=e.dataset??{};for(let r of t){let o=n[r];if(typeof o=="string"&&o.trim()!=="")return o.trim()}return null}function je(e,...t){let n=D(e,...t);if(n===null)return null;let r=Number(n);return Number.isFinite(r)?Math.trunc(r):null}function yo(e,t){let n=D(e,"hpPromotion");return n?{promotion_id:n,name:D(e,"hpPromotionName"),creative:D(e,"hpPromotionCreative"),position:D(e,"hpPromotionSlot")??String(t+1)}:null}function xt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-promotion]",resolve:r=yo,visibleRatio:o=.5,dwellMs:i=1e3,root:s=document}=t,c=new Set,u=p=>{let g=Array.from(s.querySelectorAll(n)),A=g.indexOf(p);try{return r(p,A<0?g.length:A)}catch{return null}},d=te({selector:n,root:s,visibleRatio:o,dwellMs:i,onViewable(p){let g=u(p);return!g||c.has(g.promotion_id)?!1:(c.add(g.promotion_id),e.promotionViewed(g),!0)}}),f=p=>{let g=p.target;if(!g||typeof g.closest!="function")return;let A=g.closest(n),w=g.closest("a[href]");if(!A||!w||!A.contains(w)&&!w.contains(A))return;let x=u(A);x&&e.promotionClicked({...x,href:w.getAttribute("href")})};return document.addEventListener("click",f,!0),()=>{document.removeEventListener("click",f,!0),d()}}function wo(e){let t=D(e,"hpRecoRequest"),n=D(e,"hpRecoPlacement"),r=D(e,"hpRecoStrategy");if(!t||!n||!r)return null;let o=D(e,"hpRecoHoldout");return{recommendation_request_id:t,placement:n,strategy:r,recipe:D(e,"hpRecoRecipe"),algorithm_version:D(e,"hpRecoAlgorithmVersion"),experiment:D(e,"hpRecoExperiment"),variant:D(e,"hpRecoVariant"),holdout:o===null?null:o==="true",assignment_bucket:je(e,"hpRecoBucket"),assignment_unit_kind:D(e,"hpRecoUnitKind"),candidate_set_fingerprint:D(e,"hpRecoFingerprint"),candidate_set_size:je(e,"hpRecoCandidates"),ranked_by:D(e,"hpRecoRankedBy"),served_at:D(e,"hpRecoServedAt")}}function So(e,t){let n=D(e,"hpRecoProduct");if(!n)return null;let r=D(e,"hpRecoPrice");return{product_id:n,sku:D(e,"hpRecoSku"),name:D(e,"hpRecoName"),brand:D(e,"hpRecoBrand"),price:r===null||Number.isNaN(Number(r))?null:Number(r),position:je(e,"hpRecoPosition")??t+1}}function kt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-reco-request]",tileSelector:r="[data-hp-reco-product]",resolveRail:o=wo,resolveTile:i=So,visibleRatio:s=.5,dwellMs:c=1e3,root:u=document}=t,d=new Set,f=new Map,p=new Map,g=(m,...E)=>{try{return m(...E)}catch{return null}},A=m=>typeof m.closest=="function"?m.closest(n):null,w=m=>Array.from(m.querySelectorAll(r)),x=(m,E)=>{if(p.delete(E.recommendation_request_id),d.has(E.recommendation_request_id))return;let S=w(m).map((y,O)=>g(i,y,O)).filter(y=>y?.product_id);if(S.length===0)return;d.add(E.recommendation_request_id);let h=[...f.get(E.recommendation_request_id)?.values()??[]].sort((y,O)=>y.position-O.position);e.recommendationsViewed({...E,products:S,viewable:h})},_=te({selector:`${n} ${r}`,root:u,visibleRatio:s,dwellMs:c,onViewable(m){let E=A(m);if(!E)return!0;let S=g(o,E);if(!S)return!0;let h=S.recommendation_request_id,y=g(i,m,w(E).indexOf(m));if(y?.product_id){f.has(h)||f.set(h,new Map);let O=f.get(h);O.has(y.position)||O.set(y.position,{position:y.position,product_id:y.product_id,viewable_at:new Date().toISOString()})}return!d.has(h)&&!p.has(h)&&p.set(h,setTimeout(()=>x(E,S),0)),!0}}),k=m=>{let E=m.target;if(!E||typeof E.closest!="function")return;let S=E.closest(r);if(!S)return;let h=E.closest("[data-hp-reco-interaction]"),y=E.closest("a[href]"),O=y&&(S.contains(y)||y.contains(S));if(!(h&&S.contains(h))&&!O)return;let N=A(S);if(!N)return;let U=g(o,N);if(!U)return;let G=g(i,S,w(N).indexOf(S));if(!G?.product_id)return;let K=U.recommendation_request_id;d.has(K)||(clearTimeout(p.get(K)),x(N,U)),e.productClicked({recommendation_request_id:U.recommendation_request_id,interaction:D(h??S,"hpRecoInteraction")??"navigate",products:[G]})};return document.addEventListener("click",k,!0),()=>{document.removeEventListener("click",k,!0);for(let m of p.values())clearTimeout(m);p.clear(),_()}}var Se=new Set(["home","list","product","search","basket","checkout","order_confirmation","login","register","account","info","blog","other"]),_o=new Set(["products"]),An=e=>e==null;function At(e,t=new WeakSet){if(e instanceof Date)return e.toJSON();if(e===null||typeof e!="object"||t.has(e))return e;t.add(e);let n=Array.isArray(e)?e.map(r=>At(r,t)):Object.fromEntries(Object.entries(e).filter(([,r])=>!An(r)).map(([r,o])=>[r,At(o,t)]));return t.delete(e),n}function vt(e){if(!e)return e;let t=At(e);for(let n of _o)n in e&&An(e[n])&&(t[n]=e[n]);return t}function vn(){try{let e=performance.getEntriesByType("navigation")[0];return e?["navigate","reload","back_forward","prerender"].includes(e.type)?e.type:"navigate":null}catch{return null}}var bo=new Set(["","unknown","undefined","null","none","nil","nan","anonymous","guest","0","-1"]);function F(e){if(e==null)return null;let t=String(e).trim();return bo.has(t.toLowerCase())?null:t}var ve=e=>typeof e=="string"&&e!==""?e:null;function ne(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var En="1.20";function V(e){if(typeof document>"u")return null;try{let t=document.cookie.split(";").map(n=>n.trim()).find(n=>n.startsWith(`${e}=`));return t&&decodeURIComponent(t.slice(e.length+1))||null}catch{return null}}var Io={gclid:"gclid",fbclid:"fbclid",ttclid:"ttclid"},xo=/[a-z0-9._%+-]+@[a-z0-9-]+(\.[a-z0-9-]+)*\.[a-z]{2,}/i,ko=/\d(?:[ -]?\d){12,}/,Ao=new Set(["gclid","fbclid","ttclid","msclkid"]);function On(e,t=""){if(typeof e!="string"||e==="")return!1;let n=[e];try{let o=decodeURIComponent(e.replace(/\+/g," "));o!==e&&n.push(o)}catch{}let r=!Ao.has(String(t).toLowerCase());return n.some(o=>xo.test(o)||r&&ko.test(o))}function Ct(e){if(!e)return null;let t=new URLSearchParams(e),n={},r={utm_source:"source",utm_medium:"medium",utm_campaign:"name",utm_term:"term",utm_content:"content"};for(let[o,i]of[...Object.entries(r),...Object.entries(Io)]){let s=t.get(o);s&&!On(s,o)&&(n[i]=s)}return Object.keys(n).length?n:null}var vo=["email","e-mail","password","pass","pwd","token","auth","code","uid","customer_id","postcode","zip","phone","applyCode"],Eo=["email","password","passwd","pwd","token","secret","auth","session","phone","postcode","zip","address","birth","card","cvv","iban","ssn","customerid","userid"],Co=["tel","uid","dob"],Oo=["utm_source","utm_medium","utm_campaign","utm_term","utm_content","gclid","fbclid","ttclid","msclkid"],Po=new Set(vo.map(e=>e.toLowerCase()));function Lo(e){let t=String(e).toLowerCase();if(Po.has(t))return!0;let n=t.replace(/[-_.]/g,"");return Eo.some(o=>n.includes(o))?!0:String(e).replace(/([a-z0-9])([A-Z])/g,"$1 $2").toLowerCase().split(/[^a-z0-9]+/).some(o=>Co.includes(o))}function Et(e){return(e??[]).map(t=>{try{return new RegExp(`^${t}$`,"i")}catch{return{test:n=>n.toLowerCase()===String(t).toLowerCase()}}})}function Pn(e,t={}){if(!e)return null;try{let n=new URLSearchParams(e),r=t.queryParamAllowlist?Et([...t.queryParamAllowlist,...Oo]):null,o=Et(t.queryParamBlocklist),i=Et(t.sensitiveParamAllowlist);for(let c of new Set(n.keys()))(Lo(c)&&!i.some(d=>d.test(c))||n.getAll(c).some(d=>On(d,c))||(r?!r.some(d=>d.test(c)):o.some(d=>d.test(c))))&&n.delete(c);let s=n.toString();return s?`?${s}`:""}catch{return""}}function Ln(e,t,n={}){if(!e)return null;try{let r=new URL(e);return t&&r.origin===t?r.origin+r.pathname+(Pn(r.search,n)??""):r.origin+r.pathname}catch{return null}}function Ot(e,t={}){if(typeof e!="string"||typeof location>"u")return null;try{let n=new URL(e,location.href);return n.protocol!=="https:"&&n.protocol!=="http:"?null:Ln(n.href,location.origin,t)}catch{return null}}function Pt(e){if(typeof e!="string")return null;let t=e.trim().toUpperCase();return/^[A-Z]{3}$/.test(t)?t:null}function Cn(e){if(typeof e!="string")return null;let t=e.trim().toUpperCase();return/^[A-Z]{2}$/.test(t)?t:null}function Lt(e){if(typeof e!="string")return null;let t=e.trim().replace(/_/g,"-");if(!/^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$/.test(t))return null;try{return Intl.getCanonicalLocales(t)[0]}catch{return null}}function M(e,t){if(typeof e=="function")try{let n=e();if(n!=null)return n}catch{}return t}function To(e){return{...e.propertyId==null?{}:{property_id:String(e.propertyId)},channel:e.channel??null,market:e.market??null,environment:e.environment??null}}function No(e){let t=typeof window<"u"?window.location:null,n=t?Pn(t.search,e):null;return{url:t?t.origin+t.pathname+(n??""):e.pageUrl??null,path:t?t.pathname:e.pagePath??null,search:n??null,referrer:typeof document<"u"?Ln(document.referrer,t?.origin,e):null,title:typeof document<"u"&&document.title||null,type:e.pageType??null}}var Ee;function Ro(){if(Ee!==void 0)return Ee;try{Ee=globalThis.Temporal?.Now?.timeZoneId?.()||Intl.DateTimeFormat().resolvedOptions().timeZone||null}catch{Ee=null}return Ee}function Tn(e,t={}){let n=typeof window<"u"?window.location:null,r={library:{name:e.libraryName,version:e.libraryVersion},spec:{version:En},source:To(e),session_id:M(e.getSessionId,null),identity_trust:F(M(e.getAnonymousId,null))?"device":"none",page:No(e),campaign:n?Ct(n.search):null,device:{user_agent:typeof navigator<"u"?navigator.userAgent:null,type:null,viewport_width:typeof window<"u"?window.innerWidth:null,viewport_height:typeof window<"u"?window.innerHeight:null},currency:Pt(M(e.getCurrency,e.currency)),locale:Lt(M(e.getLocale,e.locale)),timezone:Ro(),country:Cn(e.country),ship_to_country:Cn(M(e.getShipToCountry,e.shipToCountry)),ip:null,bot:null,consent:e.getConsent?.()??null,experiments:M(e.getExperiments,null),audiences:M(e.getAudiences,null),decisions:M(e.getDecisions,null),recommendations:M(e.getRecommendations,null),extensions:M(e.getExtensions,null)};return Nn(r,t)}function Nn(e,t){if(!t)return e;let n={...e};for(let[r,o]of Object.entries(t))o&&typeof o=="object"&&!Array.isArray(o)&&e[r]&&typeof e[r]=="object"&&!Array.isArray(e[r])?n[r]=Nn(e[r],o):o!==void 0&&(n[r]=o);return n}var de=Object.freeze({consent:"thg_hp_consent",retry:"thg_hp_retry",sessionSignals:"thg_hp_session_signals",identified:"thg_hp_identified",previousPage:"thg_hp_prev_page",decisions:"thg_hp_decisions",settings:"thg_hp_settings",held:"thg_hp_held",carried:"thg_hp_carried",recommendationContext:"thg_hp_recommendation_context",anonymousId:"thg_hp_anonymous_id",session:"thg_hp_session",preview:"thg_hp_preview",debug:"thg_hp_debug",onsite:"thg_hp_onsite",visitCampaign:"thg_hp_visit_campaign"}),Mo={retry:"cdp.retry",sessionSignals:"cdp_session_signals",identified:"cdp_identified",previousPage:"cdp_prev_page_message_id"},Tt={...de},Rn=!1;function He(e){let t={...de};for(let[n,r]of Object.entries(e??{})){if(!(n in de))throw new Error(`storageNames: unknown kind "${n}"`);if(typeof r!="string"||!/^[\w.-]+$/.test(r))throw new Error(`storageNames.${n} must be a non-empty cookie-safe name`);t[n]=r}Tt=t}function C(e){return Tt[e]}var Do="_",Mn=e=>e==null||e===""?Do:String(e);function $(e,t,n){let r=`${e}:${Mn(t)}`;return n==null||n===""?r:`${r}:${n}`}function Dn(e,t){return`${e}:${Mn(t)}:`}function Fe(){if(!Rn){Rn=!0;for(let e of[()=>localStorage,()=>sessionStorage]){let t;try{if(t=e(),!t)continue;for(let n of Object.keys(t))for(let[r,o]of Object.entries(Mo)){if(n!==o&&!n.startsWith(`${o}:`))continue;let i=Tt[r]+n.slice(o.length);t.getItem(i)===null&&t.setItem(i,t.getItem(n)),t.removeItem(n)}}catch{}}}}var Rt=1800*1e3,qe=()=>{try{return typeof sessionStorage>"u"?null:sessionStorage}catch{return null}},Nt=()=>{try{return typeof localStorage>"u"?null:localStorage}catch{return null}};function Un(e,t=()=>Date.now()){return{read(){try{let n=qe()?.getItem(e),r=n?JSON.parse(n):null;return!r||t()-r.savedAt>Rt?(r&&qe()?.removeItem(e),{items:[],anonymousId:null}):{items:Array.isArray(r.items)?r.items:[],anonymousId:typeof r.anonymousId=="string"?r.anonymousId:null}}catch{return{items:[],anonymousId:null}}},write(n,r=null){try{n.length===0?qe()?.removeItem(e):qe()?.setItem(e,JSON.stringify({savedAt:t(),items:n,anonymousId:r}))}catch{}}}}var Uo=400*24*60*60;function re(e,t,n,r){if(typeof document>"u")return!1;try{let o=typeof location<"u"&&location.protocol==="https:"?"; Secure":"",i=r?`; Domain=${r}`:"",s=n===null?"":`; Max-Age=${n}`;return document.cookie=`${e}=${encodeURIComponent(t)}; Path=/${s}; SameSite=Lax`+i+o,!0}catch{return!1}}function Vo({name:e,domain:t=null,legacyKey:n,read:r,mint:o,mayStore:i,carried:s=null}){let c=null;try{c=Nt()?.getItem(n)||null}catch{c=null}let u=r(e)??c??s,d=!1,f=()=>{if(!(d||u===null||!i())&&(d=re(e,u,Uo,t),!(!d||c===null)))try{Nt()?.removeItem(n),c=null}catch{}};return{get(){return u??(u=o()),f(),u},peek:()=>u,persist:f,forget(){re(e,"",0,t),u=null,d=!1;try{Nt()?.removeItem(n)}catch{}c=null}}}function Vn(e,{carried:t=null,mayStore:n,orOwn:r=!1}){let o=e.anonymousIdSource,i=()=>Vo({name:C("anonymousId"),domain:e.consentCookieDomain??null,legacyKey:$(C("anonymousId"),e.propertyId),read:V,mint:ne,mayStore:n,carried:t});if(o?.source==="hp_cookie"){let u=i();return e.getAnonymousId=()=>u.get(),u}if(o?.source==="site_cookie"&&o.cookie){let u=o.cookie;e.getAnonymousId=()=>V(u)}if(!r)return null;let s=e.getAnonymousId,c=i();return e.getAnonymousId=()=>F(M(s,null))??c.get(),c}var $o=200;function $n(e,t,n=()=>Date.now()){let r=()=>$(C("carried"),e),o=!1;function i(){try{let s=JSON.parse(sessionStorage.getItem(r())??"null");return!s||!(n()-s.savedAt<=Rt)?[]:Array.isArray(s.calls)?s.calls:[]}catch{return[]}}return{take(){let s=i();try{sessionStorage.removeItem(r())}catch{}return s},save(s){try{return o||!t()?!1:(sessionStorage.setItem(r(),JSON.stringify({savedAt:n(),calls:[...i(),...s].slice(-$o)})),!0)}catch{return!1}},close(){o=!0}}}var fa=de.consent,Ke=Object.freeze({visitor:"visitor",host:"host"}),Bn=()=>({basis:Ke.host}),Bo="hp-consent",fe=["analytics","marketing","personalisation","ad_user_data","ad_personalization"],jn={analytics:"a",marketing:"m",personalisation:"p",ad_user_data:"aud",ad_personalization:"adp"},ee=()=>typeof window<"u",Hn=()=>ee()&&typeof window.cookieStore?.addEventListener=="function",jo=e=>e===!0?!0:e===!1?!1:null;function _e(e){if(!e||typeof e!="object")return null;let t={};for(let n of fe)t[n]=jo(e[n]);return t}function Dt(e,t){return!e||!t?e===t:fe.every(n=>e[n]===t[n])}function Ut(e){if(!e)return"";let t=[];for(let n of fe){let r=e[n];(r===!0||r===!1)&&t.push(`${jn[n]}=${r?1:0}`)}return t.join("&")}function Vt(e){return{[Bo]:Ut(_e(e))}}function Ce(e){let t=_e({});if(e==null)return t;let n=String(e).trim();if(n.length>=2&&n.startsWith('"')&&n.endsWith('"')&&(n=n.slice(1,-1)),n.includes("%"))try{n=decodeURIComponent(n.replace(/\+/g," "))}catch{return t}let r=Object.fromEntries(Object.entries(jn).map(([i,s])=>[s,i])),o=new Set;for(let i of n.split("&")){let s=i.indexOf("=");if(s<=0)continue;let c=r[i.slice(0,s).trim()],u={1:!0,0:!1}[i.slice(s+1).trim()]??null;!c||u===null||o.has(c)||(t[c]===null?t[c]=u:t[c]!==u&&(t[c]=null,o.add(c)))}return t}function $t(e,t){if(!t)return e;let n=r=>{if(!r)return r;let o={...r};for(let i of fe)i!=="analytics"&&t[i]!==!0&&(o[i]=null);return o};return{name:e.name,basis:e.basis,read:()=>n(e.read()),subscribe:r=>e.subscribe(o=>r(n(o))),get observesChanges(){return e.observesChanges}}}function Bt(e,t={}){return{...e,ad_user_data:t.ad_user_data??e.marketing,ad_personalization:t.ad_personalization??e.marketing}}function Ge(e,t){let n=!0;return{notify:()=>{if(n)try{let o=e();o&&t(o)}catch{}},stop:()=>n=!1}}var Ho={analytics:["analytics","measure_content_performance","audience_measurement"],marketing:["marketing","targeting","advertising","select_personalized_ads","create_ads_profile"],personalisation:["personalisation","personalization","select_personalized_content","create_content_profile"]};function Fo(e,t){if(!t?.length)return null;let n=!1;for(let[r,o]of Object.entries(e)){let i=String(o?.id??r).toLowerCase();if(t.some(c=>{let u=String(c).toLowerCase();return i===u||i.startsWith(`${u}-`)})&&(n=!0,o?.enabled===!0))return!0}return n?!1:null}function Fn(e={}){let t={...Ho,...e.purposes};function n(){let r=ee()?window.Didomi:void 0;if(!r?.getCurrentUserStatus||r.shouldUserStatusBeCollected?.()!==!1||r.isUserStatusPartial?.()===!0)return null;let o=r.getCurrentUserStatus()?.purposes;if(!o||typeof o!="object")return null;let i=s=>Fo(o,t[s]);return Bt({analytics:i("analytics"),marketing:i("marketing"),personalisation:i("personalisation")},{ad_user_data:i("ad_user_data"),ad_personalization:i("ad_personalization")})}return{name:"didomi",read:n,observesChanges:!0,subscribe(r){if(!ee())return()=>{};let o=Ge(n,r),i={event:"consent.changed",listener:o.notify};return window.didomiEventListeners=window.didomiEventListeners||[],window.didomiEventListeners.push(i),window.didomiOnReady=window.didomiOnReady||[],window.didomiOnReady.push(s=>{o.notify(),(s??window.Didomi)?.on?.("consent.changed",o.notify)}),window.Didomi?.on?.("consent.changed",o.notify),o.stop}}}function Mt(e){let t={};if(!e)return t;for(let n of String(e).split("&")){let r=n.indexOf("=");if(r<=0)continue;let o=n.slice(r+1).replace(/\+/g," ");try{o=decodeURIComponent(o)}catch{}t[n.slice(0,r)]=o}return t}function qn(e={}){let t={analytics:"C0002",personalisation:"C0003",marketing:"C0004",...e.groups},n=e.impliedConsent===!0;function r(){let s=Mt(V("OptanonConsent"));if(s.groups){let d={};for(let f of s.groups.split(",")){let[p,g]=f.split(":");p?.trim()&&(d[p.trim()]=g==="1"?!0:g==="0"?!1:null)}return f=>d[f]??!1}let c=ee()?window.OnetrustActiveGroups:void 0;if(typeof c!="string"||!c.length)return null;let u=new Set(c.split(",").map(d=>d.trim()).filter(Boolean));return d=>u.has(d)}function o(){if(V("OptanonAlertBoxClosed"))return!0;try{if(ee()&&window.OneTrust?.IsAlertBoxClosed?.()===!0)return!0}catch{}return Number.parseInt(Mt(V("OptanonConsent")).interactionCount,10)>0?!0:n&&ee()&&(!!window.OneTrust||typeof window.OnetrustActiveGroups=="string")}function i(){if(!o())return null;let s=r();if(!s)return null;let c=p=>t[p]?s(t[p]):null,u=Bt({analytics:c("analytics"),marketing:c("marketing"),personalisation:c("personalisation")},{ad_user_data:c("ad_user_data"),ad_personalization:c("ad_personalization")}),d=Mt(V("OptanonConsent"));return(typeof navigator<"u"&&navigator.globalPrivacyControl===!0||d.isGpcEnabled==="1")&&(u.marketing=!1,u.ad_user_data=!1,u.ad_personalization=!1),u}return{name:"onetrust",read:i,observesChanges:!0,subscribe(s){if(!ee())return()=>{};let c=Ge(i,s),u=!1,d=()=>{u||!window.OneTrust?.OnConsentChanged||(u=!0,window.OneTrust.OnConsentChanged(c.notify))};window.addEventListener("OneTrustGroupsUpdated",c.notify);let f=window.OptanonWrapper;return window.OptanonWrapper=function(...g){try{typeof f=="function"&&f.apply(this,g)}finally{d(),c.notify()}},d(),()=>{c.stop(),window.removeEventListener("OneTrustGroupsUpdated",c.notify)}}}}function qo(e){let t=String(e).split(",").map(n=>n.trim()).filter(Boolean);return t.length?new Set(t):null}function Kn(e){let{name:t,categories:n,parse:r=qo,refusedValue:o,source:i="native",changeEvent:s="thg_hp_consent_change"}=e??{};if(typeof t!="string"||t==="")throw new Error("cookieConsent: `name` (the cookie your banner writes) is required");if(!n||typeof n.analytics!="string")throw new Error("cookieConsent: `categories.analytics` (the category id that grants analytics) is required");function c(){let u=V(t);if(u==null)return null;let d;if(o!==void 0&&u===o)d=new Set;else try{d=r(u)}catch{d=null}if(!(d instanceof Set))return null;let f=p=>n[p]?d.has(n[p]):null;return Bt({analytics:f("analytics"),marketing:f("marketing"),personalisation:f("personalisation")},{ad_user_data:f("ad_user_data"),ad_personalization:f("ad_personalization")})}return{name:i,read:c,get observesChanges(){return Hn()},subscribe(u){if(!ee())return()=>{};let d=Ge(c,u),f=p=>{[...p.changed??[],...p.deleted??[]].some(A=>A?.name===t)&&d.notify()};return window.addEventListener(s,d.notify),window.cookieStore?.addEventListener?.("change",f),()=>{d.stop(),window.removeEventListener(s,d.notify),window.cookieStore?.removeEventListener?.("change",f)}}}}function Gn(e={}){let t=e.name??C("consent"),n=()=>{let r=V(t);if(r==null)return null;let o=Ce(r);return o.analytics==null?null:o};return{name:"forwarded",read:n,get observesChanges(){return Hn()},subscribe(r){if(!ee())return()=>{};let o=Ge(n,r),i=s=>{[...s.changed??[],...s.deleted??[]].some(u=>u?.name===t)&&o.notify()};return window.cookieStore?.addEventListener?.("change",i),()=>{o.stop(),window.cookieStore?.removeEventListener?.("change",i)}}}}function zn(e){let t=_e(e);return{name:"static",basis:Ke.host,read:()=>t?{...t}:null,observesChanges:!0,subscribe:()=>()=>{}}}function Wn(e){if(e==null)return null;let t=String(e).split("/").map(n=>n.trim()).filter(Boolean).join("/");return t===""?null:t}function Ko(e){let t=e.item_category;if(t!=null&&String(t).includes("/"))return Wn(t);let n=[t,e.item_category2,e.item_category3,e.item_category4,e.item_category5].map(r=>r==null?"":String(r).trim()).filter(Boolean);return Wn(n.join("/"))}var Go=e=>{if(e==null||typeof e=="object")return null;let t=String(e).trim();return t===""?null:t};function zo(...e){for(let t of e){if(typeof t=="number"&&Number.isFinite(t))return String(t);if(typeof t=="string"&&t.trim()!=="")return t.trim()}return null}var ze=e=>zo(e.item_group_id,e.item_id);function Wo(e,t=ze){if(!e)return null;let n=c=>c==null||c===""||Number.isNaN(Number(c))?null:Number(c),r=c=>{let u=n(c);return u==null?null:Math.round(u*1e6)/1e6},o=c=>{let u=r(c);return u!=null&&u>=0?u:null},i=c=>{let u=n(c);return Number.isInteger(u)&&u>=0?u:null},s=Go;return{product_id:s(t(e)),sku:s(e.item_id),name:s(e.item_name),brand:s(e.item_brand),variant:s(e.item_variant)??s(e.variant),category:Ko(e),price:r(e.price),discount:o(e.discount),quantity:i(e.quantity),coupon:s(e.coupon),position:i(e.index)!=null?i(e.index)+1:null,url:s(e.url)??s(e.item_url)??null,image_url:s(e.image_url)??s(e.image_link)??null,displayed_sku:s(e.displayed_sku)??s(e.displayed_variant_sku)}}function jt(e,t=ze){return(e??[]).map(n=>Wo(n,t)).filter(n=>n?.product_id)}var Jo=1e3,Yo={shipping:2,payment:3},Xo=new Set(["password","google","apple","facebook","magic_link","sso","passkey","other"]),H=e=>{if(e==null||typeof e=="object")return null;let t=String(e).trim();return t===""?null:t},Zo=e=>{if(e==null||e===""||typeof e=="object")return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null},We=e=>e!==null&&typeof e=="object";function Qo(e){return Array.isArray(e.items)?e.items.filter(We):null}function Jn(e){let t=H(e)?.toLowerCase().replace(/[\s-]+/g,"_");return t?Xo.has(t)?t:t==="email"||t==="email_password"?"password":"other":null}function es({ecommerce:e,items:t}){let n=i=>({promotion_id:H(i.promotion_id),name:H(i.promotion_name),creative:H(i.creative_name),position:H(i.creative_slot)}),r=new Set,o=[];for(let i of[n(e),...t.map(n)])!i.promotion_id||r.has(i.promotion_id)||(r.add(i.promotion_id),o.push(i));return o}var Yn=({ecommerce:e,items:t})=>H(e.item_list_id)??H(e.item_list_name)??H(t[0]?.item_list_id)??H(t[0]?.item_list_name),pe=(e,t)=>t.products?.length?{event:e,properties:t}:null,ts=new Set(["product","products","item","items"]);function ns({ecommerce:e}){let t=H(e.item_id),n=H(e.content_type)?.toLowerCase();return!t||n&&!ts.has(n)?null:{event:"Product Shared",properties:{share_via:H(e.method),products:[{product_id:t}]}}}function rs(e){let t=o=>pe("Product List Viewed",{list_id:Yn(o),products:o.products}),n=o=>{let i=H(o.ecommerce.search_term);return i?{event:"Products Searched",properties:{query:i,...o.products.length?{products:o.products}:{}}}:null},r=o=>i=>i.promotions.map(s=>({event:o,properties:s}));return{view_item:o=>pe("Product Viewed",{currency:o.currency,value:o.value,products:o.products.slice(0,1)}),view_item_list:t,view_search_results:o=>n(o)??t(o),search:n,select_item:o=>pe("Product Clicked",{list_id:Yn(o),products:o.products.slice(0,1)}),add_to_cart:o=>pe("Product Added",{cart_id:H(o.ecommerce.cart_id),products:o.products}),remove_from_cart:o=>pe("Product Removed",{cart_id:H(o.ecommerce.cart_id),products:o.products}),view_cart:o=>({event:"Cart Viewed",properties:{cart_id:H(o.ecommerce.cart_id),value:o.value,currency:o.currency,coupon:H(o.ecommerce.coupon),...o.itemsListed?{products:o.products}:{}}}),begin_checkout:o=>pe("Checkout Started",{value:o.value,currency:o.currency,coupon:H(o.ecommerce.coupon),products:o.products}),add_shipping_info:o=>({event:"Checkout Step Completed",properties:{step:e.shipping,step_name:"shipping",shipping_method:H(o.ecommerce.shipping_tier)}}),add_payment_info:o=>({event:"Payment Info Entered",properties:{step:e.payment,step_name:"payment",payment_method:H(o.ecommerce.payment_type)}}),view_promotion:r("Promotion Viewed"),select_promotion:r("Promotion Clicked"),add_to_wishlist:o=>pe("Product Added to Wishlist",{products:o.products}),share:ns,login:o=>({event:"Signed In",properties:{method:Jn(o.ecommerce.method)}}),sign_up:o=>({event:"Signed Up",properties:{method:Jn(o.ecommerce.method)}})}}var os=e=>e.event;function ss(e,t){if(!We(e))return null;if(typeof e.length=="number"&&e[0]==="event"&&typeof e[1]=="string"){let r=We(e[2])?e[2]:{};return{name:e[1],entry:r,ecommerce:r}}let n=H(t(e));return n?{name:n,entry:e,ecommerce:We(e.ecommerce)?e.ecommerce:e}:null}function Ht(e){return Array.isArray(e)?`[${e.map(Ht).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ht(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Xn(e,t={}){if(!e||typeof e.track!="function")throw new Error("connectDataLayer: analytics must have a track(event, properties, options) method");let n=t.dataLayer??(typeof window<"u"?window.dataLayer=window.dataLayer||[]:null);if(!Array.isArray(n))return()=>{};let r=rs({...Yo,...t.steps}),o=t.map??{},i=t.eventName??os,s=t.productId??ze,c=new Set(["purchase","refund",...t.ignore??[]]),u=t.dedupeMs??Jo,d=new Map,f=!0;function p(S,h,y){if(u<=0)return!1;let O=`${S}|${y??""}|${Ht(h)}`,N=Date.now();for(let[U,G]of d)N-G>u&&d.delete(U);return d.has(O)?!0:(d.set(O,N),!1)}let g=null,A=new Set;function w(S,h){if(S!=="Product Viewed")return!1;let y=typeof location>"u"?"":location.pathname;y!==g&&(g=y,A.clear());let O=h.products?.[0]?.product_id;return O?A.has(O)?!0:(A.add(O),!1):!1}function x({event:S,properties:h={}},y){if(!S||p(S,h,y)||w(S,h))return;let O=y?{context:{currency:y}}:void 0;if(S==="Signed Out"&&typeof e.signedOut=="function"){e.signedOut(O);return}e.track(S,h,O)}function _(S){let h=t.transform?t.transform(S):S,y=ss(h,i);if(!y||c.has(y.name))return;let O=Object.hasOwn(o,y.name),N=O?o[y.name]:r[y.name];if(typeof N!="function")return;let U=Qo(y.ecommerce),G=U??[],K={...y,items:G,itemsListed:U!==null,products:jt(G,s),currency:Pt(y.ecommerce.currency),value:Zo(y.ecommerce.value)};K.promotions=es(K);let ie=O?N(h,{...K,toProducts:J=>jt(J,s)}):N(K);for(let J of[ie].flat())J&&x(J,K.currency)}function k(S){if(f)try{_(S)}catch(h){try{t.onError?.(h,S)}catch{}}}for(let S of n.slice())k(S);let m=n.push;function E(...S){let h=m.apply(this,S);for(let y of S)k(y);return h}return n.push=E,()=>{f=!1,n.push===E&&(n.push=m)}}var is="hp_debug",as=256;function cs(){try{return new URLSearchParams(location.search).get(is)}catch{return null}}function Zn(e,t){if(typeof location>"u")return!1;try{let n=cs();if(n!==null){let o=n.trim();o===""||o.length>as?sessionStorage.removeItem(t):sessionStorage.setItem(t,o)}let r=sessionStorage.getItem(t);return!!(e&&r&&Sn(r)===e)}catch{return!1}}var be=class extends Error{},us={inHoldout:()=>!0,personalisationGroup:()=>"excluded",servingHeaders:()=>({}),recommendationContext:()=>({}),flush:()=>Promise.resolve(),reset:()=>{}};function Ft(e,t){let n=us[e]??(()=>null),r=o=>(console.warn(`[hp] ${String(e)} failed; nothing was sent`,o),n());return function(...i){try{let s=t.apply(this,i);return typeof s?.then=="function"?Promise.resolve(s).catch(r):s}catch(s){if(s instanceof be)throw s;return r(s)}}}function Qn(e){for(let t of Reflect.ownKeys(e)){let{value:n}=Object.getOwnPropertyDescriptor(e,t)??{};typeof n=="function"&&(e[t]=Ft(t,n))}return e}var Oe=Symbol("hp.identityOption");var ls=4320*60*60,ds=100,fs=1e3,ps=2e3,er=500,Je=e=>(e?.unref?.(),e);function ms(e,t){if(t?.analytics===!0&&e.analytics===!1)return"withdrawn";let n=fe.map(r=>e[r]).filter(r=>r!==null);return n.length&&n.every(Boolean)?"accept_all":n.length&&n.every(r=>!r)?"reject_all":"custom"}function hs(e,t,n=C("consent")){if(!(typeof document>"u"))try{let r=typeof location<"u"&&location.protocol==="https:"?"; Secure":"",o=t?`; Domain=${t}`:"";document.cookie=`${n}=${Ut(e)}; Path=/; Max-Age=${ls}; SameSite=Lax`+o+r}catch{}}function gs(e){let t=Ce(V(e));return fe.some(n=>t[n]!==null)?t:null}function tr(e){let{adapter:t,timeoutMs:n=5e3,cookieDomain:r=null,cookieName:o=C("consent"),release:i,announce:s}=e,c=e.discard??(()=>{}),u="pending",d=null,f=null,p=null,g=null,A=!1,w=null,x=[],_=R=>{u=R,e.onStatus?.(R)};function k(){try{return _e(t.read())}catch{return null}}function m(){f&&clearInterval(f),p&&clearTimeout(p),f=null,p=null}let E=()=>typeof window<"u"&&typeof document<"u",S=()=>{try{return typeof t.subscribe=="function"&&t.observesChanges===!0}catch{return!1}};function h(){g&&clearInterval(g),g=null}function y(){A||g||d===null||S()||E()&&document.visibilityState==="hidden"||(g=Je(setInterval(()=>K(k()),ps)))}let O=()=>u==="pending"||u==="unknown",N=e.store??null,U=()=>{let R=x.splice(0);N?.write([]);for(let j of R)i(j)},G=()=>{let R=x.splice(0);N?.write([]);for(let j of R)c(j)};function K(R){let j=_e(R);if(!j||j.analytics===null)return;let we=d===null,X=we?gs(o):d;if(!we&&Dt(X,j))return;m(),d=j,y(),hs(j,r,o);let gt=!Dt(X,j);if(j.analytics){_("granted"),U(),gt&&s({action:ms(j,X),state:j,previous:X,withdrawal:!1});return}G(),X?.analytics===!0&&s({action:"withdrawn",state:j,previous:X,withdrawal:!0}),_("denied")}function ie(){p=null,u==="pending"&&(_("unknown"),f&&clearInterval(f),f=Je(setInterval(()=>K(k()),fs)))}function J(R){if(O()){if(N){N.write(x);return}R?.type!=="visibilitychange"&&!R?.persisted&&G()}}let Ue=R=>{document.visibilityState==="hidden"?(h(),J(R)):y()},ae=R=>{h(),J(R)},Ve=R=>{R?.persisted&&d!==null&&K(k()),y()};return{get status(){return u},get state(){return d?{...d}:null},stamp(){return d?{...d,source:t.name??null,basis:t.basis??Ke.visitor}:null},admits(){return u==="granted"},hold(R){return!O()||x.length>=er?(c(R),!1):(x.push(R),!0)},onHidden:J,start(){A=!1;try{w=t.subscribe?.(R=>K(R))??null}catch(R){e.debug&&console.warn("[hp] consent adapter subscribe failed",R)}E()&&(window.addEventListener("pagehide",ae),window.addEventListener("pageshow",Ve),document.addEventListener("visibilitychange",Ue)),N&&x.length===0&&x.push(...N.read().slice(-er)),K(k()),!d&&(f=Je(setInterval(()=>K(k()),ds)),p=Je(setTimeout(ie,n)))},stop(){A=!0,m(),h(),typeof w=="function"&&w(),E()&&(window.removeEventListener("pagehide",ae),window.removeEventListener("pageshow",Ve),document.removeEventListener("visibilitychange",Ue))}}}var ys=["recommendation","search_rank","banner","offer","layout","copy","price","other"],Ye=e=>typeof e=="string"&&e!=="";function nr(e){return(Array.isArray(e?.decisions)?e.decisions:[]).filter(t=>Ye(t?.slot)&&Ye(t.decision_id)&&t.holdout!==!0).map(({decision_id:t,slot:n,arm:r,kind:o})=>({decision_id:t,slot:n,...Ye(r)&&{arm:r},...ys.includes(o)&&{kind:o}}))}function rr({key:e,mayStore:t}){let n,r=()=>{if(n)return n;try{let i=JSON.parse(sessionStorage.getItem(e));n=Array.isArray(i)?i.filter(s=>Ye(s?.slot)):[]}catch{n=[]}return n},o=()=>{try{n?.length&&t()&&sessionStorage.setItem(e,JSON.stringify(n))}catch{}};return{persist:o,current:()=>r().length?n.map(i=>({...i})):null,remember(i){if(!i.length)return;let s=new Set(i.map(c=>c.slot));n=[...r().filter(c=>!s.has(c.slot)),...i],o()},forget(){n=[];try{sessionStorage.removeItem(e)}catch{}}}}function ws(e){let t=2166136261,n=String(e);for(let r=0;r<n.length;r+=1)t^=n.charCodeAt(r),t=t+((t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24))>>>0;return t^=t>>>16,t=Math.imul(t,2246822507)>>>0,t^=t>>>13,t=Math.imul(t,3266489909)>>>0,t^=t>>>16,t>>>0}function Xe(e,t,n=1e4){return ws(`${t}\0${e}`)%n}function qt(e){let t=o=>Math.min(Math.max(Number(o)||0,0),1),n=t(e.share),r=1-n;return{holdout_share:n,personalised_share:e.ramp==null?r:Math.min(t(e.ramp),r)}}function Kt(e,t){if(!e||typeof e.salt!="string")return{holdout:!1,bucket:null,group:"personalised"};let n=e.ramp!=null;if(t==null||t==="")return{holdout:!1,bucket:null,group:n?"excluded":"personalised"};let{holdout_share:r,personalised_share:o}=qt(e),i=Xe(t,e.salt),s=u=>Math.round(u*1e4),c=r>0&&i<s(r)?"holdout":!n||i<s(r+o)?"personalised":"excluded";return{holdout:c==="holdout",bucket:i,group:c}}function or(e,t){return typeof e!="string"||e===""||t==null||t===""?null:Xe(t,`bandit-vs-default:${e}`)<1e4/2?"default":"bandit"}var Ss="hp_preview",_s=256;function sr(e,t=null){if(typeof location>"u")return V(e);let n=null;try{n=new URLSearchParams(location.search).get(Ss)}catch{n=null}if(n===null)return V(e);let r=n.trim();return r===""||r.length>_s?(re(e,"",0,t),null):(re(e,r,null,t),r)}var bs=40,Is=128,xs=5,ks=60,ar=e=>typeof e=="string"&&e!==""&&e.length<=Is&&!e.includes(","),ir=e=>Array.isArray(e)?e.filter(ar).slice(0,bs):[],As=e=>Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.replaceAll(","," ").trim()).filter(t=>t!=="").slice(0,xs):[],vs=e=>Object.entries(e&&typeof e=="object"?e:{}).filter(([t,n])=>ar(t)&&Number.isFinite(n)&&n>=1).sort(([,t],[,n])=>n-t).slice(0,ks).map(([t,n])=>`${t}:${Math.floor(n)}`);function Gt(e){let t={},n={viewed:ir(e?.recentProducts),basket:ir(e?.basketProducts),q:As(e?.recentSearches),impressed:vs(e?.impressions)};for(let[r,o]of Object.entries(n))o.length>0&&(t[r]=o.join(","));return t}var Es=1800*1e3;function cr(e,t=Date.now()){try{localStorage.setItem(C("recommendationContext"),JSON.stringify({context:e,until:t+Es}))}catch{}}function ur(){try{localStorage.removeItem(C("recommendationContext"))}catch{}}var Cs="hp_sample",lr=1e4;function dr(e,t){return!(typeof t=="number"&&t<1)||e==null||e===""?!0:Xe(e,Cs,lr)<Math.round(t*lr)}function Ie(e){return e.trim().toLowerCase().replace(/\s*\/\s*/g,"/").replace(/^\/+|\/+$/g,"")}var Os=2,Ps=12;function Pe(e,t=Os){return e.split("/").slice(0,t).join("/")}function zt(e,t){if(typeof t!="string"||!t.trim())return null;let n=Pe(Ie(t));return n?(e.unshift(n),e.length=Math.min(e.length,Ps),n):null}var me=()=>C("sessionSignals"),xe=null,Wt=()=>xe??me();function fr(){try{return xe?localStorage:sessionStorage}catch{return}}function pr(e,t){let n=t==null?null:String(t),r=e?$(me(),n,e):null;if(r===xe)return;let o=xe===null?Ls():null;if(xe=r,!!xe)try{let i=Wt(),s=Dn(me(),n);for(let c of Object.keys(localStorage))c.startsWith(s)&&c!==i&&localStorage.removeItem(c);o&&!localStorage.getItem(i)&&(localStorage.setItem(i,JSON.stringify(o)),sessionStorage.removeItem(me()))}catch{}}function Ls(){try{let e=sessionStorage.getItem(me());if(!e)return null;let t=JSON.parse(e);return t&&(t.productViews>0||t.listViews>0||t.basketValue!=null||t.recentProducts?.length||t.recentBrowse?.length)?t:null}catch{return null}}function Ze(){return{productViews:0,listViews:0,cartAdds:0,searches:0,recentProducts:[],recentCategories:[],recentBrowse:[],basketProducts:[],basketValue:null,recentSearches:[],impressions:{},browsingCategory:null,recentBrowseCategories:[],browsingListing:null,listViewsByCategory:{},startedAt:0}}function Jt(){let e=fr();if(!e)return Ze();try{let t=e.getItem(Wt());return t?{...Ze(),...JSON.parse(t)}:{...Ze(),startedAt:Date.now()}}catch{return{...Ze(),startedAt:Date.now()}}}function Yt(e){let t=fr();if(t)try{t.setItem(Wt(),JSON.stringify(e))}catch{}}function Qe(){return Jt()}function mr(){for(let e of[()=>sessionStorage,()=>localStorage])try{let t=e();t.removeItem(me());for(let n of Object.keys(t))n.startsWith(`${me()}:`)&&t.removeItem(n)}catch{}}var hr=20,gr=200,Ts=new Set(["Product Viewed","Product Clicked","Product Added","Product Added to Wishlist"]),Ns=new Set(["Product Viewed","Product Added"]),yr=50;function et(e,t){let n=zt(e.recentBrowse,t);return n?(e.recentBrowseCategories=[e.browsingListing?.category??null,...e.recentBrowseCategories].slice(0,e.recentBrowse.length),n):null}function Rs(e,t){let n=e.listViewsByCategory;n[t]=(n[t]??0)+1;let r=Object.keys(n);if(r.length>yr){let o={};for(let i of r.sort((s,c)=>n[c]-n[s]).slice(0,yr))o[i]=n[i];e.listViewsByCategory=o}}function wr(e,t){let n=Jt();n.startedAt||(n.startedAt=Date.now());let r=Array.isArray(t?.products)?t.products:[];switch(e){case"Product Viewed":n.productViews+=1,et(n,n.browsingCategory);break;case"Product List Viewed":{let s=t?.list_id,c=t?.category;if(!(typeof s=="string"&&s.includes("/")&&!s.startsWith("cdp-")))break;let d=typeof c=="string"&&Pe(Ie(c))||null,f=d?Pe(Ie(s)):"";if(!f){n.browsingCategory=null,n.browsingListing=null;break}n.browsingListing={key:f,category:d},et(n,f),n.browsingCategory=f,Rs(n,d),n.listViews+=1}break;case"Product List Filtered":{let s=t?.change,c=typeof t?.list_id=="string"?t.list_id:"",u=typeof s?.value=="string"?s.value:"",d=n.browsingListing;if(u&&s?.action!=="removed"&&d&&Pe(Ie(c))===d.key){let f=et(n,`${c}/${u}`);f&&(n.browsingCategory=f)}break}case"Product Added":{n.cartAdds+=1,et(n,n.browsingCategory);for(let s of r){let c=s.product_id;typeof c!="string"||!c||(n.basketProducts=[c,...n.basketProducts.filter(u=>u!==c)].slice(0,hr))}break}case"Product Removed":{for(let s of r){let c=s.product_id;typeof c=="string"&&c&&(n.basketProducts=n.basketProducts.filter(u=>u!==c))}break}case"Products Searched":{n.searches+=1;let s=t?.query;if(typeof s=="string"&&s.trim()){let c=s.trim().toLowerCase().slice(0,64);n.recentSearches=[c,...n.recentSearches.filter(u=>u!==c)].slice(0,5)}break}case"Product Clicked":case"Product Added to Wishlist":break;case"Cart Updated":{let s=t?.value;return n.basketValue=typeof s=="number"&&Number.isFinite(s)&&s>=0?s:null,Yt(n),n}default:return n}let o=Ts.has(e);if(o)for(let s of r)typeof s.product_id=="string"&&s.product_id&&delete n.impressions[s.product_id];else{for(let c of r){let u=c.product_id;typeof u!="string"||!u||(n.impressions[u]=(n.impressions[u]??0)+1)}let s=Object.keys(n.impressions);if(s.length>gr){let c={};for(let u of s.sort((d,f)=>n.impressions[f]-n.impressions[d]).slice(0,gr))c[u]=n.impressions[u];n.impressions=c}}let i=new Set;for(let s of r){let c=s.product_id;if(o&&typeof c=="string"&&c&&(n.recentProducts=[c,...n.recentProducts.filter(u=>u!==c)].slice(0,hr)),Ns.has(e)&&typeof s.category=="string"&&s.category){let u=Ie(s.category);u&&!i.has(u)&&(i.add(u),zt(n.recentCategories,u))}}return Yt(n),n}var tt=1800*1e3;function Sr({name:e,domain:t=null,mayStore:n,now:r=()=>Date.now(),mint:o=ne}){let i=null,s=0,c=()=>{i!==null&&n()&&re(e,i,tt/1e3,t)};return{get(){let u=r(),d=V(e);return d?i=d:(i===null||u-s>=tt)&&(i=o()),s=u,c(),i},persist:c,forget(){re(e,"",0,t),i=null}}}var W=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),_r=e=>Array.isArray(e)&&e.every(t=>typeof t=="string"),br=Object.freeze({enabled:!1}),Zt=Object.freeze({enabled:!0,queryParamAllowlist:Object.freeze([])});function Ir(e,t){let n=e?.track;return W(n)?(Object.hasOwn(n,t)?n[t]:n.__default)?.enabled!==!1:!0}function Ms(e,t){return`${oe(e)}/v1/projects/${encodeURIComponent(t)}/settings`}var Ds="https://hp.thgingenuity.com";function oe(e){return e==null||e===""?Ds:kr(e)}function xr(e,t){return e!=null&&e!==""?oe(e):t?.startsWith("https://")?t:oe(void 0)}function kr(e){if(typeof e!="string")return null;let t=e.trim().replace(/\/+$/,"");return/^https?:\/\/[^/\s]+$/i.test(t)?t:/^[a-z0-9.-]+(:\d+)?$/i.test(t)?`https://${t}`:null}function Us(e){if(!W(e))return null;let t=Object.fromEntries(Object.entries(e).filter(([,n])=>typeof n=="boolean"));return Object.keys(t).length?t:null}var Xt=e=>typeof e=="number"&&e>=0&&e<=1,Vs=/^[0-9a-f]{64}$/;function $s(e){return W(e)?{enabled:e.enabled===!0,tokenSha256:typeof e.tokenSha256=="string"&&Vs.test(e.tokenSha256)?e.tokenSha256:null}:{enabled:!1,tokenSha256:null}}function Bs(e){if(!W(e))return null;let t=Object.fromEntries(Object.entries(e).filter(([,n])=>W(n)&&Xt(n.share)&&(n.ramp==null||Xt(n.ramp))&&typeof n.salt=="string"&&n.salt!=="").map(([n,r])=>[n,{share:r.share,ramp:r.ramp??null,salt:r.salt,..._r(r.readoutSlots)&&r.readoutSlots.length>0&&{readoutSlots:r.readoutSlots}}]));return Object.keys(t).length?t:null}var js=/^[A-Za-z0-9!#$%&'*+.^_`|~-]{1,128}$/;function Hs(e){return W(e)?e.source==="hp_cookie"?{source:"hp_cookie"}:e.source!=="site_cookie"?null:e.cookie==null?{source:"site_cookie",cookie:null}:typeof e.cookie=="string"&&js.test(e.cookie)?{source:"site_cookie",cookie:e.cookie}:null:null}function Fs(e){let t=Array.isArray(e?.forms)?e.forms.filter(W):[];return t.length===0?null:{forms:t,capture:W(e.capture)?e.capture:null,...Number.isInteger(e.overlay_gap_minutes)?{overlay_gap_minutes:e.overlay_gap_minutes}:{}}}function qs(e){let t=W(e)?e.hp:null;return W(t)&&typeof t.enabled=="boolean"}function Qt(e){let t=W(e)?e.hp:null;if(!W(t)||t.enabled!==!0)return br;let n=Fs(t.onsite);return{enabled:!0,propertyId:typeof t.propertyId=="string"&&t.propertyId!==""?t.propertyId:null,environment:typeof t.environment=="string"?t.environment:null,consentPurposes:Us(t.consent?.purposes),queryParamAllowlist:_r(t.queryParamAllowlist)?t.queryParamAllowlist:null,anonymousId:Hs(t.anonymousId),apiHost:kr(t.apiHost),holdouts:Bs(t.holdouts),sampleRate:Xt(t.sampleRate)?t.sampleRate:1,debug:$s(t.debug),...n&&{onsite:n},plan:W(e.plan)&&W(e.plan.track)?{track:e.plan.track}:null}}var Ks=3e3;async function Ar(e,t,n=globalThis.fetch,r=Ks){try{let o=await n(Ms(e,t),{credentials:"omit",headers:{accept:"application/json"},signal:AbortSignal.timeout?.(r)});if(o.status>=400&&o.status<500&&o.status!==408&&o.status!==429)return br;if(!o.ok)return null;let i=await o.json();return qs(i)?Qt(i):null}catch{return null}}var nt=e=>$(C("settings"),e);function vr(e){try{let t=localStorage.getItem(nt(e));if(!t)return null;let n=JSON.parse(t);return n?.enabled===!0?n:null}catch{return null}}function Er(e,t){try{t?.enabled===!0?localStorage.setItem(nt(e),JSON.stringify(t)):localStorage.removeItem(nt(e))}catch{}}function en(e){try{localStorage.removeItem(nt(e))}catch{}}var Gs={flushAt:20,flushIntervalMs:1e4,maxQueue:500,maxRetryAgeMs:1440*60*1e3,maxRetries:5,maxPersistedBatches:20,maxPersistedBytes:1024*1024,storageKey:de.retry,beaconSafeBytes:56*1024,maxBatchEvents:100,maxBatchBytes:500*1024},rt=()=>Date.now(),Cr=3e4,an=55*1024;function zs(e,t=rt()){if(typeof e!="string")return 0;let n=e.trim();if(/^\d+$/.test(n))return Number(n)*1e3;if(n==="")return 0;let r=Date.parse(n);return Number.isNaN(r)?0:Math.max(0,r-t)}var se=e=>typeof TextEncoder<"u"?new TextEncoder().encode(e).length:Buffer.byteLength(e),tn=()=>typeof window<"u"&&typeof document<"u";function Ws(){try{return!tn()||!window.localStorage?null:(window.localStorage.getItem("thg_hp_probe"),window.localStorage)}catch{return null}}var b,nn,rn,ot,on,sn,Or,Le,Te,Ne,Pr,st,Lr,it,at=class{constructor(t){yn(this,b);this.o={...Gs,...t},this.queue=[],this.timer=null,this.storage=Ws(),this.inflight=null,this.sending=new Set,this.epoch=0,this.sinceRefusal=new Set,this.wakers=new Set,this.replayAllowed=!this.o.deferReplay,this.draining=null,this.failing=!1,this.answered=!1,tn()&&(window.addEventListener("pagehide",()=>this.flush({beacon:!0})),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flush()}),L(this,b,it).call(this))}markFailing(){this.answered||(this.failing=!0)}replayPersisted(){return this.replayAllowed=!0,L(this,b,it).call(this)}clearPersisted(){if(this.replayAllowed=!1,!!this.storage)try{let t=L(this,b,Ne).call(this).filter(n=>this.sinceRefusal.has(n?.id));t.length?this.storage.setItem(this.o.storageKey,JSON.stringify(t)):this.storage.removeItem(this.o.storageKey)}catch{}}discardQueued(){this.queue=[],this.epoch+=1,this.sinceRefusal.clear(),L(this,b,rn).call(this);for(let t of this.wakers)t()}enqueue(t){let n;try{n=JSON.parse(JSON.stringify(t))}catch(r){this.o.onError?.(`event ${t?.messageId??""} cannot be serialised; dropped`,r);return}this.queue.push(n),this.queue.length>this.o.maxQueue&&this.queue.splice(0,this.queue.length-this.o.maxQueue),this.queue.length>=this.o.flushAt?this.flush():L(this,b,nn).call(this)}flush(t={}){if(L(this,b,rn).call(this),this.queue.length===0)return Promise.resolve();if(t.beacon&&tn()&&typeof navigator<"u"&&navigator.sendBeacon)return L(this,b,Or).call(this),Promise.resolve();if(this.inflight)return this.inflight;let n=L(this,b,sn).call(this,this.queue,this.o.maxBatchEvents,this.o.maxBatchBytes).map(o=>{let i=L(this,b,st).call(this,o);return i&&(this.sending.add(i),this.sinceRefusal.add(i)),{batch:o,id:i}});this.queue=[];let r=this.epoch;return this.inflight=(async()=>{for(let{batch:o,id:i}of n){if(r!==this.epoch){L(this,b,Te).call(this,i);continue}await L(this,b,Le).call(this,o,0,i,r)}})().finally(()=>{this.inflight=null,this.queue.length>=this.o.flushAt?this.flush():this.queue.length&&L(this,b,nn).call(this)}),this.inflight}};b=new WeakSet,nn=function(){this.timer||(this.timer=setTimeout(()=>this.flush(),this.o.flushIntervalMs),this.timer?.unref?.())},rn=function(){this.timer&&(clearTimeout(this.timer),this.timer=null)},ot=function(t){return JSON.stringify({batch:t,writeKey:this.o.writeKey,sentAt:new Date().toISOString()})},on=function(){return`${this.o.apiHost.replace(/\/$/,"")}/v1/batch`},sn=function(t,n,r){let o=se(L(this,b,ot).call(this,[])),i=[],s=[],c=o;for(let u of t){let d=se(JSON.stringify(u))+1;s.length&&(s.length>=n||c+d>r)&&(i.push(s),s=[],c=o),s.push(u),c+=d}return s.length&&i.push(s),i},Or=function(){let t=this.queue;this.queue=[];let n=L(this,b,on).call(this);for(let r of L(this,b,sn).call(this,t,this.o.maxBatchEvents,this.o.beaconSafeBytes)){let o=L(this,b,ot).call(this,r);if(se(o)<=this.o.beaconSafeBytes){let i=!1;try{i=navigator.sendBeacon(n,new Blob([o],{type:"text/plain"}))}catch{i=!1}if(i){let s=this.failing?L(this,b,st).call(this,r):null;s&&this.sending.add(s);continue}}L(this,b,Le).call(this,r,0,L(this,b,st).call(this,r))}},Le=async function(t,n,r=null,o=this.epoch){r&&this.sending.add(r);let i=L(this,b,ot).call(this,t),s=0;try{let c=await fetch(L(this,b,on).call(this),{method:"POST",headers:{"Content-Type":"text/plain"},body:i,keepalive:se(i)<=this.o.beaconSafeBytes});if(c.ok)return this.failing=!1,this.answered=!0,L(this,b,Te).call(this,r),L(this,b,it).call(this),!0;let u=c.status===408||c.status===429||c.status>=500;if(u&&(s=zs(c.headers?.get?.("retry-after"))),!u)return L(this,b,Te).call(this,r),this.o.onError?.(`CDP ingest rejected batch (${c.status}); dropping ${t.length} events`),!0;throw new Error(`retryable ${c.status}`)}catch(c){if(this.failing=!0,n>=this.o.maxRetries){r&&this.sending.delete(r);let d=r?"kept for the next page":"dropped";return this.o.onError?.(`CDP ingest unreachable after ${n} attempts; ${d}: ${t.length} events`,c),!1}let u=Math.max(Math.min(1e3*2**n,Cr)*(.5+Math.random()),Math.min(s,Cr));return o===this.epoch&&await new Promise(d=>{let f=()=>{clearTimeout(p),this.wakers.delete(f),d()},p=setTimeout(f,u);this.wakers.add(f)}),o!==this.epoch?(L(this,b,Te).call(this,r),!1):L(this,b,Le).call(this,t,n+1,r,o)}},Te=function(t){t&&(this.sending.delete(t),this.sinceRefusal.delete(t),L(this,b,Lr).call(this,t))},Ne=function(){let t=JSON.parse(this.storage.getItem(this.o.storageKey)||"[]");return Array.isArray(t)?t:[]},Pr=function(t,n){let r=s=>se(JSON.stringify(s))+1,o=[...t,n].slice(-this.o.maxPersistedBatches),i=o.reduce((s,c)=>s+r(c),2);for(;o.length>1&&i>this.o.maxPersistedBytes;)i-=r(o[0]),o=o.slice(1);for(;o.length;)try{return this.storage.setItem(this.o.storageKey,JSON.stringify(o)),!0}catch{o=o.slice(1)}return!1},st=function(t){if(!this.storage||this.o.mayPersist&&!this.o.mayPersist())return null;try{let n={at:rt(),id:`${rt()}-${Math.random().toString(36).slice(2)}`,batch:t};return se(JSON.stringify(n))+3>this.o.maxPersistedBytes?null:L(this,b,Pr).call(this,L(this,b,Ne).call(this),n)?n.id:null}catch{return null}},Lr=function(t){if(!(!t||!this.storage))try{let n=L(this,b,Ne).call(this).filter(r=>r.id!==t);n.length?this.storage.setItem(this.o.storageKey,JSON.stringify(n)):this.storage.removeItem(this.o.storageKey)}catch{}},it=function(){if(!this.storage||!this.replayAllowed)return this.draining??Promise.resolve();if(this.draining)return this.draining;let t;try{let r=L(this,b,Ne).call(this);t=r.filter(o=>Array.isArray(o?.batch)&&rt()-o.at<this.o.maxRetryAgeMs).map(o=>o.id?o:{...o,id:`${o.at}-${Math.random().toString(36).slice(2)}`}),(t.length!==r.length||t.some((o,i)=>o!==r[i]))&&(t.length?this.storage.setItem(this.o.storageKey,JSON.stringify(t)):this.storage.removeItem(this.o.storageKey))}catch{return Promise.resolve()}let n=t.filter(r=>!this.sending.has(r.id));return n.length?(this.draining=(async()=>{for(let r of n)if(!this.replayAllowed||!await L(this,b,Le).call(this,r.batch,0,r.id))return})().finally(()=>{this.draining=null}),this.draining):Promise.resolve()};var Tr="3.26.0",Nr="@thg-agentic/hyper-personalisation-web";var Js=100,Ys=["source","medium","campaign","content","term"];function Mr(e){if(!e||typeof e!="object")return null;let t={};for(let n of Ys){let r=e[n==="campaign"?"name":n];typeof r=="string"&&r&&(t[n]=r.slice(0,Js))}return Object.keys(t).length?t:null}var Dr=e=>$(C("visitCampaign"),e==null?null:String(e)),ke=new Map;function Ur(e){if(ke.has(e))return ke.get(e);try{let t=JSON.parse(localStorage.getItem(e));return t&&typeof t=="object"?t:null}catch{return null}}function Rr(e,t){try{t?localStorage.setItem(e,JSON.stringify(t)):localStorage.removeItem(e),ke.delete(e)}catch{t?ke.set(e,t):ke.delete(e)}}function Vr(e,t,n){return typeof e?.tags=="object"&&e.tags!==null&&Number.isFinite(e.at)&&n-e.at<tt&&!(t&&e.sid&&e.sid!==t)?e:null}function $r(e,{sessionId:t=null,now:n=Date.now()}={}){return Vr(Ur(Dr(e)),t,n)?.tags??null}function Br(e,t,{sessionId:n=null,keepSession:r=!1,now:o=Date.now()}={}){let i=Dr(e),s=Ur(i),c=Vr(s,n,o),u=c?.tags??t??null;return u?Rr(i,{tags:u,at:o,sid:(r?n:null)??c?.sid??null}):s&&Rr(i,null),u}function cn(){ke.clear();try{let e=`${C("visitCampaign")}:`;for(let t of Object.keys(localStorage))t.startsWith(e)&&localStorage.removeItem(t)}catch{}}var Xs=new Set(["audiences","decisions","recommendations"]);var Zs=Symbol.for("@thg-agentic/hyper-personalisation-web.replay"),Qs=Symbol.for("@thg-agentic/hyper-personalisation-web.unreachable"),ei=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite-access");function ti(e){let t={...e??{}},n=Array.isArray(t.products)?t.products:null;if(t.item_count==null&&n){let r=n.map(o=>o?.quantity);r.every(Number.isInteger)&&(t.item_count=r.reduce((o,i)=>o+i,0))}return t}var ni="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";function ri(e){if(/^[0-9a-fA-F]{64}$/.test(e))return e.toLowerCase();if(!/^[A-Za-z0-9+/_-]{43}=?$/.test(e))return null;try{let t=atob(e.replace(/-/g,"+").replace(/_/g,"/").padEnd(44,"="));return t.length!==32?null:Array.from(t,n=>n.charCodeAt(0).toString(16).padStart(2,"0")).join("")}catch{return null}}function ut(e){if(typeof e!="string")return null;let t=ri(e.trim());return t===ni?null:t}var jr=Object.freeze({email_sha256:"sha256",phone_sha256:"sha256",accepts_marketing:"boolean",gender:"string",created_at:"date-time"}),oi=/^\d{4}-\d{2}-\d{2}T([01]\d|2[0-3]):[0-5]\d:[0-5]\d(\.\d+)?(Z|[+-]([01]\d|2[0-3]):[0-5]\d)$/i;function si(e){if(typeof e!="string"||!oi.test(e))return!1;let[t,n,r]=e.slice(0,10).split("-").map(Number),o=new Date(Date.UTC(t,n-1,r));return o.getUTCMonth()===n-1&&o.getUTCDate()===r&&!Number.isNaN(Date.parse(e))}function ii(e,t){return t===null?null:e==="sha256"?ut(t)??void 0:e==="date-time"?t instanceof Date?Number.isNaN(t.getTime())?void 0:t.toISOString():si(t)?t:void 0:typeof t===e?t:void 0}function ai(e,t){let n={},r=[];for(let[o,i]of Object.entries(e)){let s=Object.hasOwn(jr,o)?jr[o]:null,c=s?ii(s,i):void 0;c===void 0?r.push(o):n[o]=c}return t&&r.length&&console.warn(`[hp] identify: not sent, not spec traits: ${r.join(", ")}`),n}var Hr=!1,Fr=!1;function ci(){Fr||(Fr=!0,console.warn("[hp] no consent adapter: events are sent under the host's lawful basis (basis 'host'). Pass `consent` to send only once the visitor allows analytics."))}function ui(e){!e||Hr||(Hr=!0,console.warn("[hp] mintAnonymousId is ignored since 3.6: where device ids come from is set per source in the console (the site\u2019s own cookie, or Hyper-Personalisation\u2019s)."))}function li(e){try{return se(JSON.stringify(e))}catch{return 0}}function ct(e){return e&&typeof e.context=="object"&&e.context!==null?e.context:e}function di(e,t){if(e==null||String(e)===t)return;let n=[["localStorage","retry",(r,o)=>[...Array.isArray(r)?r:[],...Array.isArray(o)?o:[]]],["sessionStorage","held",(r,o)=>o?{...o,items:[...r.items??[],...o.items??[]]}:r]];for(let[r,o,i]of n)try{let s=globalThis[r],c=$(C(o),e),u=s?.getItem(c);if(!u)continue;let d=$(C(o),t),f=s.getItem(d);s.setItem(d,JSON.stringify(i(JSON.parse(u),f?JSON.parse(f):null))),s.removeItem(c)}catch{}}function qr(e){let t=oe(e?.apiHost);if(!t)throw new Error("createAnalytics: apiHost, when given, must be a host or an http(s) origin");if(e?.propertyId!==null&&!e?.propertyId)throw new Error("createAnalytics: propertyId is required (null: the ingest stamps the key\u2019s)");let n={libraryName:Nr,libraryVersion:Tr,writeKey:"web",queryParamBlocklist:[],debug:!1,validate:null,consentTimeoutMs:5e3,...e,apiHost:t};He(n.storageNames),Fe();let r=!!n.consent;r||ci();let o=null;n.getConsent=()=>o?o.stamp():Bn();let i=()=>!r||o?.status==="granted";di(n.propertyId,n.writeKey);let s=r&&n.holdAcrossPages?Un($(C("held"),n.writeKey)):null,c=s?.read()??{items:[],anonymousId:null};n.mintAnonymousId!==void 0&&ui(n.debug);let u=Vn(n,{carried:c.anonymousId,mayStore:i,orOwn:!0}),d=Sr({name:C("session"),domain:n.consentCookieDomain??null,mayStore:i}),f=n.getSessionId;n.getSessionId=()=>F(M(f,null))??d.get();let p=sr(C("preview"),n.consentCookieDomain??null),g=()=>F(M(f,null))??V(C("session")),A=Mr(typeof location>"u"?null:Ct(location.search)),w=(a=null)=>{p||Br(n.propertyId,a,{sessionId:g(),keepSession:i()})},x=(a,l)=>n.debug&&console.warn("[hp]",a,l??""),_=n.transport??new at({apiHost:n.apiHost,writeKey:n.writeKey,storageKey:$(C("retry"),n.writeKey),mayPersist:r?()=>o?.status==="granted":void 0,deferReplay:r,onError:x}),k=$(C("previousPage"),n.propertyId),m=null,E=()=>{if(m)return m;try{return sessionStorage.getItem(k)||null}catch{return null}};typeof window<"u"&&window.addEventListener("pageshow",a=>{a.persisted&&(m=null)});let S=a=>{if(m=a||null,!(r&&o.status!=="granted"))try{sessionStorage.setItem(k,a)}catch{}},h=rr({key:$(C("decisions"),n.propertyId),mayStore:i});n.getDecisions??(n.getDecisions=h.current);let y=F(M(n.getUserId,null)),O=null,N=null,U=y?ve(n.identityToken):null,G=null,K=null,ie=new Set,J=new Set;function Ue(a){if(a.type!=="track"||a.event!=="Cart Updated")return;let l=a.properties?.value;K=typeof l=="number"&&Number.isFinite(l)&&l>=0?l:null;for(let I of ie)try{I()}catch(P){console.warn("[hp] a basket listener failed",P)}}function ae(a,l,I=!1){Ue(a),w();try{return Ve(a,l,I)}catch(P){if(P instanceof be)throw P;return console.warn("[hp] the event was not sent",P),null}}function Ve(a,l,I){let P=G;G=null;let q=a.type==="track"?a.event:a.type;if(!I&&!Ir(n.plan,q))return null;let T={messageId:P?.messageId??ne(),timestamp:P?.timestamp??new Date().toISOString(),anonymousId:F(M(n.getAnonymousId,null)),userId:y??null,...a,context:Tn(n,ct(l))};if(T.properties&&(T.properties=vt(T.properties)),typeof T.properties?.href=="string"&&(T.properties.href=Ot(T.properties.href,n)),!I&&!dr(T.anonymousId,n.sampleRate))return n.debug&&console.debug("[hp] not sent: outside the sample",T),null;if(n.beforeSend){let Q;try{Q=n.beforeSend(T)}catch(ao){return console.warn("[hp] beforeSend failed; the event was not sent",ao),null}if(!Q)return null;let{type:z,event:hn,messageId:so,timestamp:io}=T;T={...Q,type:z,messageId:so,timestamp:io,...hn?{event:hn}:{}}}if(n.validate){let Q=n.validate(T,{producer:"web"});if(!Q.valid){let z=`[hp] invalid ${T.event??T.type}:
|
|
2
|
+
${Q.errors.join(`
|
|
3
|
+
`)}`;if(n.throwOnInvalid)throw new be(z);console.error(z)}}n.debug&&console.debug("[hp]",T.event??T.type,T);let St=li(T);return St>an?(x(`${T.event??T.type} not sent: ${St} bytes, over the ${an}-byte limit for one event`),null):(no(T,I),T)}function R(a){if(a.type==="track"&>(a),n.onEvent)try{n.onEvent(a)}catch(l){console.warn("[hp] onEvent observer failed",l)}}let j=()=>r&&o?.state?.personalisation===!0,we=()=>pr(M(n.getSessionId,null),n.propertyId),X=!1;function gt(a){try{j()?(we(),cr(Gt(wr(a.event,a.properties))),X=!0):$e()}catch(l){n.debug&&console.warn("[hp] the visit was not recorded",l)}}function $e(a=!1){ur(),(a||X)&&mr(),X=!1}function yt(){d.forget(),h.forget(),wt.clear(),u?.forget(),$e(!0),cn()}function no(a,l){!r||l||o.admits()?(R(a),_.enqueue(a)):o.hold(a)}let v=(a,l,I)=>ae({type:"track",event:a,properties:l??{}},I),wt=new Set,ro=(a,l,I)=>a==="audiences"?{audiences:l?null:I.audiences??[]}:a==="decisions"?{decisions:(I.decisions??[]).map(P=>({slot:P.slot,decision_id:P.decision_id??null,arm:P.arm??null,...P.variant&&{variant:P.variant}}))}:{recommendation_request_id:I.recommendation_request_id??null};w(A),r&&(o=tr({adapter:n.consent,timeoutMs:n.consentTimeoutMs,cookieDomain:n.consentCookieDomain,debug:n.debug,store:s&&{read:()=>c.items,write:a=>s.write(a,u?.peek()??null)},release(a){a.context&&(a.context.consent=o.stamp()),R(a),_.enqueue(a)},onStatus(a){if(a==="granted"&&(u?.persist(),d.persist(),m&&S(m),h.persist(),_.replayPersisted?.()),a==="denied"){_.clearPersisted?.(),u?.forget(),d.forget();try{sessionStorage.removeItem(k)}catch{}h.forget(),$e(!0)}try{n.onConsentStatus?.(a)}catch(l){console.warn("[hp] onConsentStatus observer failed",l)}if(a==="granted"||a==="denied")for(let l of J)try{l()}catch(I){console.warn("[hp] a consent listener failed",I)}},announce({action:a,state:l,previous:I,withdrawal:P}){l?.personalisation!==!0&&$e(I?.personalisation===!0),P&&(_.discardQueued?.(),cn()),ae({type:"track",event:"Consent Updated",properties:{action:a,state:l}},void 0,P),P&&_.flush()}}),o.start(),w());let dn=()=>n.holdout?qt(n.holdout):null,fn=()=>Kt(n.holdout,F(M(n.getAnonymousId,null))).group;function oo(a,l){if(!Array.isArray(a?.decisions))return a;let I=n.holdout?.readoutSlots??[],P=F(M(n.getAnonymousId,null));return{...a,decisions:a.decisions.map(q=>{let T=q?.variant==="bandit"||q?.variant==="default"?q.variant:!l&&q?.holdout!==!0&&I.includes(q?.slot)?or(q.slot,P):null;return T?T==="default"?{...q,variant:T,decision_id:null}:{...q,variant:T}:q})}}function pn(a,l){if(p)return null;let I=a?.exposure,P=I?.holdout===!0,q=oo(a,P);return h.remember(nr(q)),!I?.token||wt.has(I.token)?null:(wt.add(I.token),v("Personalisation Exposed",{exposure_token:I.token,surface:I.surface,holdout:P,holdout_share:I.holdout_share??dn()?.holdout_share??null,personalised_share:I.personalised_share??dn()?.personalised_share??null,...ro(I.surface,P,q)},l))}function mn(a){return y&&yt(),y=null,O=null,N=null,U=null,a}return Qn({track:(a,l,I)=>a==="Signed Out"?mn(v(a,l,I)):v(a,l,I),page(a,l){a??(a={});let I=n.pageType??null;a.type&&(Se.has(a.type)?(I=a.type,n.pageType=a.type):n.debug&&console.warn(`[hp] ignoring unknown page.type "${a.type}". Allowed: ${[...Se].join(", ")}`));let P=ae({type:"page",properties:{name:a.name??null,navigation_trigger:a.navigation_trigger??vn(),previous_message_id:E()}},{page:{type:I},...ct(l)??{}});return P&&S(P.messageId),P},identify(a,l,I){let{userId:P,...q}=a&&typeof a=="object"?a:{},T=ve(ct(l)?.identity_token);if(P!==void 0){let z=F(P);U=z?z===y?T??U:T:null,I===Oe?N=z:O&&z&&z!==O?yt():n.debug&&N&&z&&z!==N&&console.warn("[hp] identify names another userId than the identity option; using the new one"),y=z,z&&I!==Oe&&(O=z)}else T&&y&&(U=T);let{identity_token:St,...Q}=ct(l)??{};return ae({type:"identify",traits:ai(q,n.debug)},U?{...Q,identity_token:U}:Q)},reset(){y&&yt(),y=null,O=null,N=null,U=null,S("")},productViewed:(a,l)=>v("Product Viewed",a,l),productListViewed:(a,l)=>v("Product List Viewed",a,l),recommendationsViewed:(a,l)=>v("Recommendations Viewed",a,l),personalisationExposed:(a,l)=>v("Personalisation Exposed",a,l),recordExposure:pn,surfaceViewed({surface:a}={},l){if(!Xs.has(a)||!n.holdout||a!=="decisions"&&!j())return null;let I=F(M(n.getAnonymousId,null)),P=Kt(n.holdout,I).group;if(P==="excluded")return null;let q=xn({sessionId:Be(M(n.getSessionId,null),I),surface:a});return q?pn({exposure:{token:q,surface:a,holdout:P==="holdout"}},l):null},inHoldout:()=>fn()!=="personalised",personalisationGroup:fn,productClicked:(a,l)=>v("Product Clicked",a,l),productListFiltered:(a,l)=>v("Product List Filtered",a,l),productsSearched:(a,l)=>v("Products Searched",a,l),searchSuggestionsViewed:(a,l)=>v("Search Suggestions Viewed",a,l),productAdded:(a,l)=>v("Product Added",a,l),productRemoved:(a,l)=>v("Product Removed",a,l),cartUpdated:(a,l)=>v("Cart Updated",ti(a),l),identityLinked:(a,l)=>v("Identity Linked",a,l),slotEngaged:(a,l)=>p?null:v("Slot Engaged",a,l),productVariantSelected:(a,l)=>v("Product Variant Selected",a,l),cartViewed:(a,l)=>v("Cart Viewed",a,l),productAddedToWishlist:(a,l)=>v("Product Added to Wishlist",a,l),productRemovedFromWishlist:(a,l)=>v("Product Removed from Wishlist",a,l),wishlistProductAddedToCart:(a,l)=>v("Wishlist Product Added to Cart",a,l),productShared:(a,l)=>v("Product Shared",a,l),cartShared:(a,l)=>v("Cart Shared",a,l),couponEntered:(a,l)=>v("Coupon Entered",a,l),couponApplied:(a,l)=>v("Coupon Applied",a,l),couponDenied:(a,l)=>v("Coupon Denied",a,l),couponRemoved:(a,l)=>v("Coupon Removed",a,l),checkoutStarted:(a,l)=>v("Checkout Started",a,l),promotionViewed:(a,l)=>v("Promotion Viewed",a,l),promotionClicked:(a,l)=>v("Promotion Clicked",a,l),checkoutStepViewed:(a,l)=>v("Checkout Step Viewed",a,l),checkoutStepCompleted:(a,l)=>v("Checkout Step Completed",a,l),paymentInfoEntered:(a,l)=>v("Payment Info Entered",a,l),checkoutFailed:(a,l)=>v("Checkout Failed",a,l),signedIn:(a,l)=>v("Signed In",a,l),signedUp:(a,l)=>v("Signed Up",a,l),signedOut:a=>mn(v("Signed Out",{},a)),newsletterSubscribed:(a,l)=>v("Newsletter Subscribed",a,l),newsletterUnsubscribed:(a,l)=>v("Newsletter Unsubscribed",a,l),preferencesStated:(a,l)=>v("Preferences Stated",a,l),backInStockSubscribed:(a,l)=>v("Back In Stock Subscribed",a,l),productReviewed:(a,l)=>v("Product Reviewed",a,l),consentUpdated:(a,l)=>v("Consent Updated",a,l),flush:a=>_.flush(a),recommendationContext(){if(!j())return{};try{return we(),Gt(Qe())}catch{return{}}},get consent(){return o?o.state:null},servingHeaders:()=>Vt(o?.state??null),get lastPageMessageId(){return E()},get anonymousId(){return F(M(n.getAnonymousId,null))},[ei](){return{writeKey:n.writeKey,storageKey:$(C("onsite"),n.propertyId),gatewayHost:n.apiHost,servingHost:n.servingHost??n.apiHost,settings:n.onsite??null,debug:n.debug===!0,preview:p,anonymousId:()=>F(M(n.getAnonymousId,null)),sessionId:()=>F(M(n.getSessionId,null)),identityToken:()=>j()?U:null,analytics:i,personalisation:j,consent:()=>n.getConsent(),headers:()=>Vt(o?.state??null),pageUrl:()=>typeof location>"u"?null:Ot(location.href,n),locale:()=>Lt(M(n.getLocale,n.locale)),campaign:()=>p?A:$r(n.propertyId,{sessionId:g()}),basketValue:()=>{let a=Qe().basketValue;return K??(Number.isFinite(a)?a:null)},sessionSignals:()=>j()?(we(),Qe()):null,onBasket:a=>(ie.add(a),()=>ie.delete(a)),consentAnswered:()=>!o||o.status==="granted"||o.status==="denied",onConsentAnswered:a=>(J.add(a),()=>J.delete(a))}},[Qs](){_.markFailing?.()},[Zs](a,l,I){if(typeof this[a]=="function"){G=typeof I?.messageId=="string"&&typeof I?.timestamp=="string"?{messageId:I.messageId,timestamp:I.timestamp}:null;try{this[a](...Array.isArray(l)?l:[])}finally{G=null}}}})}var Re=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite"),Y=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.pending"),Me=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.listeners"),lt=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.suppressed"),fi=["shown","submitted","apply","closed","held"],Kr=10,he=()=>typeof window>"u"?null:window;function De(){try{for(let{resolve:e}of he()?.[Y]?.splice(0)??[])e(!1)}catch{}}var ge=Object.freeze({open(e){try{let t=he();if(!t||typeof e!="string")return Promise.resolve(!1);if(t[Re])return t[Re].open(e);if(t[Y]??(t[Y]=[]),t[Y].length<Kr)return new Promise(n=>t[Y].push({slot:e,resolve:n}))}catch{}return Promise.resolve(!1)},show(e){return ge.open(e)},on(e,t){var n;try{let r=he();return!r||!fi.includes(e)||typeof t!="function"?()=>{}:(r[Me]??(r[Me]={}),((n=r[Me])[e]??(n[e]=new Set)).add(t),()=>r[Me][e].delete(t))}catch{return()=>{}}},suppress(e="page"){try{let t=he();if(!t)return;(t[lt]??(t[lt]=new Set)).add(String(e)),t[Re]?.suppress()}catch{}},unsuppress(e){try{let t=he()?.[lt];e===void 0?t?.clear():t?.delete(String(e))}catch{}},ready(){try{let e=he();if(!e)return Promise.resolve([]);if(e[Re])return Promise.resolve(ge.debug());if(e[Y]??(e[Y]=[]),e[Y].length<Kr)return new Promise(t=>e[Y].push({slot:null,resolve:()=>t(ge.debug())}))}catch{}return Promise.resolve([])},debug(){try{return he()?.[Re]?.debug()??[]}catch{return[]}}});function Gr(e){let t=typeof document>"u"?null:document.currentScript?.src;return t?new URL(e,t).href:null}var dt=new Map;function zr(e,t){return window[t]?Promise.resolve(window[t]):e?(dt.has(t)||dt.set(t,new Promise((n,r)=>{let o=document.createElement("script");o.src=e,o.async=!0,o.onload=()=>window[t]?n(window[t]):r(new Error(`${e} did not register`)),o.onerror=()=>r(new Error(`${e} did not load`)),document.head.append(o)}).finally(()=>dt.delete(t))),dt.get(t)):Promise.reject(new Error("the CDN script\u2019s own URL is unknown"))}var pi=Gr("onsite.min.js"),un=()=>zr(pi,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.module"));var ln=Symbol.for("@thg-agentic/hyper-personalisation-web.bootstrap"),mi=Symbol.for("@thg-agentic/hyper-personalisation-web.drain"),hi=Symbol.for("@thg-agentic/hyper-personalisation-web.carry"),Wr=Symbol.for("@thg-agentic/hyper-personalisation-web.replay"),gi=Symbol.for("@thg-agentic/hyper-personalisation-web.unreachable"),yi=Symbol.for("@thg-agentic/hyper-personalisation-web.assignment"),wi=Symbol.for("@thg-agentic/hyper-personalisation-web.recommendation-context"),mt=e=>e?()=>V(e):()=>null,Xr={didomi:e=>Fn({purposes:e.purposes}),onetrust:e=>qn({groups:e.groups,impliedConsent:e.impliedConsent}),cookie:e=>Kn({name:e.name,categories:e.categories,refusedValue:e.refusedValue,source:e.source,changeEvent:e.changeEvent}),forwarded:e=>Gn({name:e.name}),static:e=>{if(!e.state||typeof e.state!="object")throw new Error('consent.state is required for provider "static"');return zn(e.state)}},Jr=Object.keys(Xr),ye=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),ft=e=>typeof e=="string"&&e!=="",Si=e=>Array.isArray(e)&&e.every(t=>typeof t=="string"),Zr=e=>ye(e)&&typeof e.read=="function";function _i(e,t={}){let n=[];if(!ye(e))return["config must be { writeKey, apiHost? }"];ft(e.writeKey)||n.push("writeKey is required"),oe(e.apiHost)||n.push("apiHost, when given, must be a host or an http(s) origin"),t.propertyId!==void 0&&!ft(t.propertyId)&&n.push("propertyId must be a string");let{consent:r}=t;if(!Zr(r)&&!(ye(r)&&Jr.includes(r.provider))&&n.push(`consent must be a consent adapter or { provider: ${Jr.join(" | ")} }`),t.autocapture!==void 0&&t.autocapture!==!1&&!ye(t.autocapture)&&n.push("autocapture must be false or { promotions, productLists, recommendations }"),t.onsite!==void 0&&typeof t.onsite!="boolean"&&!ye(t.onsite)&&n.push("onsite must be true, false or the onsite options"),t.beforeSend!==void 0&&typeof t.beforeSend!="function"&&n.push("beforeSend must be a function"),t.identityCookies!==void 0)if(!ye(t.identityCookies))n.push("identityCookies must be an object");else for(let o of["anonymousId","sessionId"]){let i=t.identityCookies[o];i!==void 0&&!ft(i)&&n.push(`identityCookies.${o} must be a cookie name`)}for(let o of["getCurrency","getShipToCountry","getLocale"])t[o]!==void 0&&typeof t[o]!="function"&&n.push(`${o} must be a function`);return t.dataLayer!==void 0&&(ye(t.dataLayer)?(t.dataLayer.name!==void 0&&!ft(t.dataLayer.name)&&n.push("dataLayer.name must be a string"),t.dataLayer.ignore!==void 0&&!Si(t.dataLayer.ignore)&&n.push("dataLayer.ignore must be an array of strings")):n.push("dataLayer must be an object")),n}function bi(e,t,n){if(Zr(e))return $t(e,t.consentPurposes);let{provider:r,...o}=e,i=n?.consent?.[r]??Xr[r];return $t(i(o),t.consentPurposes)}var ht=(e,t,n)=>`${e??""}|${t??""}${n?"|v":""}`,Ii=(e,t,n,r)=>e===ht(t,n,!0)||!r&&e===ht(t,n,!1),xi=e=>{if(e.context?.identity_token===void 0)return e;let{identity_token:t,...n}=e.context;return{...e,context:n}},Qr=e=>{try{return sessionStorage.getItem(e)}catch{return null}};function ki(e,t){let n=F(t?.userId),r=ut(t?.emailSha256);if(!n&&!r)return null;let o=Qr($(C("identified"),e));return Ii(o,n,r,n!==null&&ve(t?.token)!==null)?null:{...n?{userId:n}:{},...r?{email_sha256:r}:{}}}async function Ai({writeKey:e,apiHost:t},n){if(n.settings!==void 0)return{settings:Qt(n.settings),revalidated:null};let r=Ar(t,e),o=vr(e);if(o)return{settings:o,revalidated:r,fetched:r};let i=await r;return i?{settings:i,revalidated:r,fetched:r}:{settings:Zt,revalidated:null,fetched:r}}function eo(e,t){let n=t??{},r=typeof window<"u"?window:null;if(r?.[ln])return r[ln];let o=$n(e?.writeKey,()=>{let{analytics:s}=Ce(V(C("consent")));return s===!0||s===null&&n.holdAcrossPages===!0}),i=Oi(e,n,o);if(r){let s=n.extend?.getSessionId??mt(n.identityCookies?.sessionId),c=mt(n.identityCookies?.anonymousId);r[yi]=({slot:u,arm:d}={})=>In({sessionId:Be(s(),c()),slot:u,arm:d}),r[ln]=i,r[hi]=o,r[mi]?.(i)}return i}function vi(){let e=globalThis.performance?.now?.();return new Date(Date.now()-(Number.isFinite(e)?e:0)).toISOString()}function Yr(e,t){if(t===!1)return()=>{};let n={promotions:!0,productLists:!0,recommendations:!0,exposures:!0,...t},r=i=>i&&typeof i=="object"?i:{},o=[];try{n.promotions&&o.push(xt(e,r(n.promotions))),n.productLists&&o.push(It(e,r(n.productLists))),n.recommendations&&o.push(kt(e,r(n.recommendations))),n.exposures&&o.push(bt(e,r(n.exposures)))}catch(i){console.warn("[hp] autocapture not started:",i?.message??i)}return()=>{for(let i of o)i()}}var Ei=1e3;function Ci(e,t,n,r){if(!t)return De();let o=n.onsite?un():null;o?.catch(()=>{}),(r?Promise.race([r.then(s=>s??n),new Promise(s=>setTimeout(()=>s(n),Ei))]):Promise.resolve(n)).then(s=>{let c=s.enabled?s.onsite:null;if(!c)return De();let u=t===!0?{}:t;return(o??un()).then(d=>d.startOnsite(e,{...u,settings:u.settings??c}))}).catch(s=>{De(),console.warn("[hp] onsite not started:",s?.message??s)})}function pt(e){return e.close(),De(),null}async function Oi(e,t,n){try{let r=_i(e,t);if(r.length)return console.warn(`[hp] not started, the configuration is invalid: ${r.join("; ")}`),pt(n);He(t.storageNames),Fe();let{writeKey:o}=e,[{settings:i,revalidated:s,fetched:c},u]=await Promise.all([Ai(e,t),Promise.resolve(t.identity).catch(()=>null)]),d=s?i:null,f=!1,p=()=>f&&d&&Er(o,d);if(s?.then(h=>{h&&(d=h,h.enabled?p():en(o))}),!i.enabled)return t.debug&&console.info("[hp] off: the settings for this write key do not enable it"),pt(n);let g=t.propertyId??i.propertyId??null;if(!g&&i!==Zt)return console.warn("[hp] not started: this write key covers several properties, so propertyId is required"),pt(n);let{preset:A}=t,w=ki(g,u),x=t.debug===!0||i.debug?.enabled===!0||Zn(i.debug?.tokenSha256??null,C("debug")),_=F(u?.userId),k=qr({apiHost:xr(e.apiHost,i.apiHost),servingHost:oe(e.apiHost),onsite:i.onsite??null,writeKey:o,propertyId:g,pageType:Se.has(t.pageType)?t.pageType:void 0,environment:i.environment,queryParamAllowlist:i.queryParamAllowlist??void 0,plan:i.plan,sampleRate:i.sampleRate??1,holdout:i.holdouts?.[g],getCurrency:t.getCurrency,getShipToCountry:t.getShipToCountry,getLocale:t.getLocale,consent:bi(t.consent,i,A),consentCookieDomain:t.consentCookieDomain,storageNames:t.storageNames,holdAcrossPages:t.holdAcrossPages===!0,mintAnonymousId:t.mintAnonymousId,debug:x,anonymousIdSource:i.anonymousId??void 0,getAnonymousId:mt(t.identityCookies?.anonymousId),getSessionId:t.identityCookies?.sessionId?mt(t.identityCookies.sessionId):void 0,getUserId:()=>_,identityToken:u?.token,beforeSend:t.beforeSend,...t.extend,onConsentStatus(h){if(h==="granted"&&(f=!0,p()),h==="denied"){en(o);try{sessionStorage.removeItem($(C("identified"),g))}catch{}}t.extend?.onConsentStatus?.(h)},onEvent(h){if(h.type==="identify"){let y=$(C("identified"),g),O=F(h.userId),N=ut(h.traits?.email_sha256),U=!!h.context?.identity_token||Qr(y)===ht(O,N,!0);try{sessionStorage.setItem(y,ht(O,N,U))}catch{}}t.extend?.onEvent?.(xi(h))}});typeof window<"u"&&(window[wi]=()=>k.recommendationContext()),c?.then(h=>h===null&&k[gi]());for(let[h,y,O]of n.take())try{k[Wr](h,y,O)}catch(N){console.warn(`[hp] carried ${h} failed`,N)}k[Wr]("page",[t.pageType?{type:t.pageType}:{}],{messageId:ne(),timestamp:vi()});let m=Yr(k,t.autocapture),E=k.page;k.page=Ft("page",(...h)=>{let y=E(...h);return m(),m=Yr(k,t.autocapture),y});let S=typeof window<"u"?window:null;if(S?.addEventListener?.("pageshow",h=>{h.persisted&&k.page({navigation_trigger:"back_forward"})}),t.dataLayer&&S){let h=t.dataLayer.name??"dataLayer";S[h]=S[h]||[],Xn(k,{...A,dataLayer:S[h],ignore:[...A?.ignore??[],...t.dataLayer.ignore??[]],onError:y=>x&&console.warn("[hp] dataLayer mapping failed",y)})}return w&&k.identify(w,void 0,Oe),k.onsite=ge,Ci(k,t.onsite,i,s),k}catch(r){return console.warn("[hp] not started:",r?.message??r),pt(n)}}function to(e){e.initialized=!0,eo(e._config,e._options).then(t=>{let n=e.splice(0);if(!t){for(let r of e.methods??[])e[r]=()=>e;return}e.client=t;for(let[r,o]of Object.entries(t))typeof o=="function"&&(e[r]=o);for(let[r,...o]of n)try{t[r]?.(...o)}catch(i){console.warn(`[hp] queued ${r} failed`,i)}})}var B=window.hp=window.hp||[];B.servingHeaders??(B.servingHeaders=()=>({}));B.inHoldout??(B.inHoldout=()=>!0);B.personalisationGroup??(B.personalisationGroup=()=>"excluded");B.recommendationContext??(B.recommendationContext=()=>({}));B.onsite??(B.onsite=ge);B.initialized||(B._config?to(B):B.load=(e,t)=>{B._config=e,B._options=t??{},to(B)});})();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{function b(
|
|
1
|
+
(()=>{function b(r,e,t,i,o){let n=r("select","i");n.setAttribute("aria-label",e);for(let[a,s]of[["",t],...i]){let l=r("option","",s);l.value=a,l.selected=a===o,n.append(l)}return n}var D=r=>String(r).padStart(2,"0"),T=120,I=/^-?\d{1,10}(?:\.(\d{1,10}))?$/,N=1e9;function O(r){try{let e=new Intl.DateTimeFormat(r,{month:"long",timeZone:"UTC"});return{name:t=>e.format(Date.UTC(2016,t-1,1)),monthFirst:new Intl.DateTimeFormat(r,{month:"numeric",day:"numeric"}).formatToParts(0).find(t=>t.type!=="literal")?.type==="month"}}catch{return{name:String,monthFirst:!1}}}var _=(r,e,t,i,o,n)=>{let a=b(r,t,t,Array.from({length:i},(s,l)=>[D(l+1),o(l+1)]),n);return a.name=e,a};function g(r,e,t,i,o){let n=r("input","i");return n.name=e,n.inputMode=i,n.setAttribute("aria-label",t),n.value=o??"",n}function $(r,e,t,i,o){let n=e.format??{},a=t("div",n.kind==="birthday"?"ph bd":"ph");if(e.type==="number")a.append(g(t,"hp_v",e.label,n.decimals?"decimal":"numeric",i)),n.unit&&a.append(t("span","u",n.unit));else if(n.kind==="birthday"){let[,s,l,f]=/^(\d{4}|-)-(\d\d)-(\d\d)$/.exec(i??"")??[],u=O(o||void 0),p=_(t,"hp_d","Day",31,String,f),m=_(t,"hp_m","Month",12,u.name,l);if(a.append(...u.monthFirst?[m,p]:[p,m]),n.year!=="none"){let d=g(t,"hp_y","Year","numeric",s==="-"?"":s);d.placeholder=n.year==="required"?"Year":"Year (optional)",d.autocomplete="bday-year",d.maxLength=4,a.append(d)}}else{let s=g(t,"hp_v",e.label,"none",i);s.type="date",s.min="1900-01-01",s.max="2100-12-31",a.append(s)}r.append(a)}function v(r,e){try{return new Intl.NumberFormat(e||void 0).format(r)}catch{return String(r)}}var A=(r,e,t)=>{let i=new Date(Date.UTC(r,e-1,t));return i.getUTCMonth()===e-1&&i.getUTCDate()===t};function F(r){let e=r.replace(/\s/g,""),t=e.lastIndexOf(","),i=e.lastIndexOf(".");return t>=0&&i>=0?t>i?e.replace(/\./g,"").replace(",","."):e.replace(/,/g,""):/^-?\d{1,3}(?:,\d{3})+$/.test(e)?e.replace(/,/g,""):e.replace(",",".")}function S(r,e,t=Date.now(),i=void 0){let o=e.format??{},n=c=>r.querySelector(`[name=${c}]`);if(e.type==="number"){let c=n("hp_v"),y=F(c.value);if(!y)return{value:null};let h=Number(y),x=I.exec(y);return x&&(x[1]?.replace(/0+$/,"").length??0)<=(o.decimals?2:0)&&Math.abs(h)<=N&&!(h<o.min||h>o.max)?{value:String(h===0?0:h)}:{error:`Enter a ${o.decimals?"":"whole "}number${o.min!=null&&o.max!=null?` from ${v(o.min,i)} to ${v(o.max,i)}`:""}.`,input:c}}let a=c=>({error:"Enter a real date.",input:c});if(o.kind!=="birthday"){let c=n("hp_v");return c.value?c.value>=c.min&&c.value<=c.max?{value:c.value}:a(c):{value:null}}let[s,l,f]=["hp_d","hp_m","hp_y"].map(n),u=f?.value.trim()??"";if(!s.value&&!l.value&&!u)return{value:null};if(!s.value||!l.value)return a(s.value?l:s);if(!u)return o.year==="required"||!A(2016,+l.value,+s.value)?a(f??s):{value:`--${l.value}-${s.value}`};let p=`${u}-${l.value}-${s.value}`,m=new Date(t).toISOString().slice(0,10),d=new Date(t+864e5).toISOString().slice(0,10),E=`${+m.slice(0,4)-T}${m.slice(4)}`;return/^\d{4}$/.test(u)&&A(+u,+l.value,+s.value)&&p<=d&&p>=E?{value:p}:a(f)}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.answers")]={answerFields:$,answerOf:S};})();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(()=>{function p(e){return e.trim().toLowerCase().replace(/\s*\/\s*/g,"/").replace(/^\/+|\/+$/g,"")}var w={gte:(e,t)=>e>=t,greater_than_or_equal:(e,t)=>e>=t,">=":(e,t)=>e>=t,lte:(e,t)=>e<=t,less_than_or_equal:(e,t)=>e<=t,"<=":(e,t)=>e<=t,eq:(e,t)=>e===t,equals:(e,t)=>e===t,"=":(e,t)=>e===t},B=new Set([...Object.keys(w),"between"]);function l(e,t){let r=p(t);return r?e.filter(s=>s===r||s.startsWith(`${r}/`)).length:0}function g(e,t){return e.length===0?0:l(e,t)/e.length}var b={categoryViews:(e,t)=>l(e.recentCategories,t),categoryShare:(e,t)=>g(e.recentCategories,t),browseViews:(e,t)=>l(e.recentBrowse,t),browseShare:(e,t)=>g(e.recentBrowse,t)};function x(e,t){let r=e.indexOf(".");if(r>0){let o=b[e.slice(0,r)],i=e.slice(r+1);return o&&i?o(t,i):null}let s=t[e];return typeof s=="number"?s:null}function h(e,t){let r=x(e.field,t);if(r===null)return!1;if(e.operator==="between")return typeof e.value=="number"&&typeof e.value2=="number"&&r>=e.value&&r<=e.value2;let s=w[e.operator];return!s||typeof e.value!="number"?!1:s(r,e.value)}function d(e,t){let r=e.rules??[];if(r.length===0)return!1;let s=new Map;for(let u of r){let n=u.group??0,c=s.get(n);c?c.push(u):s.set(n,[u])}let o=e.groupOperators??[],i=[];for(let[u,n]of s)i.push(o[u]==="OR"?n.some(c=>h(c,t)):n.every(c=>h(c,t)));return e.groupJoin==="OR"?i.some(Boolean):i.every(Boolean)}function m(e,t){if(!Array.isArray(t))return e;let r=new Set(t),s=e.recentBrowseCategories??[],o=(e.recentBrowse??[]).filter((u,n)=>r.has(s[n])),i=Object.entries(e.listViewsByCategory??{}).reduce((u,[n,c])=>r.has(n)?u+c:u,0);return{...e,recentBrowse:o,listViews:i}}var v=100,A=128,y=e=>typeof e=="string"&&e!==""&&e.length<=A,a=new WeakMap;function f(e){if(!a.has(e)){let t=e.datafile().then(r=>r.status===200?r.body:null).catch(()=>null);a.set(e,t),t.then(r=>{!r&&a.get(e)===t&&a.delete(e)})}return a.get(e)}async function S(e,t,r=[],s=[]){let o=await f(e),i=t?.(),u=Array.isArray(o?.session_audiences)?o.session_audiences:[],n=o&&i?O(o,i):[];return _([...n,...s],r,u)}function _(e,t,r){let s=new Map(r.map(n=>[n?.slug,Array.isArray(n?.requires)?n.requires:[]])),o=new Set,i=n=>{if(!o.has(n)){o.add(n);for(let c of s.get(n)??[])i(c)}};for(let n of t)i(n);let u=[...new Set(e.filter(y))];return[...u.filter(n=>o.has(n)),...u.filter(n=>!o.has(n))].slice(0,v)}function O(e,t){let r=Array.isArray(e?.session_audiences)?e.session_audiences:[],s=m(t,e.browse_categories??null);return r.filter(o=>y(o?.slug)&&d(o,s)).map(o=>o.slug)}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.audiences")]={prefetch:f,visitAudiences:S};})();
|