{
  "version": 3,
  "sources": ["/cdn/shop/t/24/assets/wmn-engagement.js?wmn=20261026home1"],
  "sourcesContent": ["/**\n * WMN engagement memory - persists across sessions (localStorage + cookie).\n * Records product views; full search ranks by most recent term-matching view.\n * Genre strong-bump floor 50 for cuba/token-prefix (v2026-08-04b).\n * Explore soft-feeds recordSearch even with field nodes (typed multi-signal).\n * KIND_WEIGHT.search = 1.2 (below search_click).\n */\n(function (window, document) {\n  'use strict';\n\n  var BASE_KEY = 'wmn_engagement_v1';\n  var COOKIE_NAME = 'wmn_eng';\n  var COOKIE_DAYS = 365;\n  /** Theme Recently viewed cookie \u2014 must match assets/app.js recentlyViewed. */\n  var RV_COOKIE_NAME = 'recentlyViewed';\n  var RV_COOKIE_DAYS = 30;\n  var RV_MAX_HANDLES = 12;\n  var MAX_EVENTS = 80;\n  var MAX_AGE_MS = 1000 * 60 * 60 * 24 * 365;\n  var VIEW_WEIGHT = 12;\n  var HANDLE_BONUS = 800;\n  var HALF_LIFE_MS = 1000 * 60 * 60 * 24 * 180;\n  var MAX_SEARCH_INJECT = 5;\n  var KIND_WEIGHT = {\n    view: 1,\n    atc: 3,\n    listen: 2,\n    chip: 1.5,\n    // Intentional rail/discover hover \u2014 stronger than passive view\n    hover: 1.85,\n    // Passive impression \u2014 must not drown intentional geo interest\n    visible: 0.22,\n    // Typed search: below search_click (2.0), above old 0.6 \u2014 plan \u22481.2\n    search: 1.2,\n    search_click: 2.0\n  };\n  var MAX_ENTITIES = 60;\n  var FOCUS_KEY = 'wmn_focus_v1';\n  var FOCUS_TTL_MS = 1000 * 60 * 60 * 4;\n  /** Temu-style search ghost: max chars; default header placeholder. */\n  var SEARCH_GHOST_MAX = 40;\n  var DEFAULT_SEARCH_PLACEHOLDER = 'Search for artists & releases\u2026';\n  var SEARCH_INPUT_SEL =\n    '.wmn-header__search input[name=\"q\"], .header_search_form input[name=\"q\"], [data-dropdown=\"search\"] input[name=\"q\"]';\n  /** Durable interest profile (localStorage) \u2014 survives reload / new sessions. */\n  var INTEREST_KEY = 'wmn_interest_profile_v1';\n  var INTEREST_TTL_MS = 1000 * 60 * 60 * 24 * 90;\n  var FOCUS_ARTIST_BONUS = 220;\n  var FOCUS_GENRE_BONUS = 180;\n  /** Session focus owns For You ranking \u2014 must beat stale prefs mass. */\n  var FOCUS_SESSION_MATCH_BONUS = 600;\n  var FOCUS_SESSION_NONMATCH_PENALTY = 400;\n  /** @deprecated aliases kept for older smokes / comments */\n  var FOCUS_GENRE_DOMINANT_BONUS = FOCUS_SESSION_MATCH_BONUS;\n  var FOCUS_GENRE_NONMATCH_PENALTY = FOCUS_SESSION_NONMATCH_PENALTY;\n  var FOCUS_HANDLE_BONUS = 300;\n  var ARTIST_MMR_PENALTY = 380;\n  /** Soft country diversity on top of artist MMR (~0.15\u00D7 artist). */\n  var COUNTRY_MMR_PENALTY = ARTIST_MMR_PENALTY * 0.15;\n  /** Catalog emb term \u2014 tie-break under focusDominant; fuller when no session focus. */\n  var LAMBDA_EMB = 0.25;\n  var EMB_SCORE_SCALE = 200;\n  /** Phase 5 propensity \u2014 softmax over eligible scores; IPS clip M. */\n  /**\n   * Focus purity (on top of FOCUS_SESSION_MATCH_BONUS).\n   * Explicit geo/title beats sole bridge genre; multi-genre comps stay out of prefer.\n   */\n  var FOCUS_PURITY_COUNTRY_TAG = 280;\n  var FOCUS_PURITY_REGION_TAG = 280;\n  var FOCUS_PURITY_TITLE = 220;\n  var FOCUS_PURITY_FRAC_SCALE = 260;\n  var FOCUS_PURITY_SOLE_EXTRA = 80;\n  /** Weak bridge-only comps (multi-genre): soft-fill rank, not prefer front. */\n  var FOCUS_WEAK_BRIDGE_BONUS = 150;\n  /** Bump when focus-hard / match rules change so For You feed remounts locked cards. */\n  var FY_POLICY_ID = 'fy-focus-purity-v2';\n  /**\n   * Country slug \u2192 adjective/alias tokens for genre slug/name matching.\n   * Sparse country:* product tags (e.g. India has 3) must still prefer\n   * indian-classical-raga / bollywood-filmi etc.\n   */\n  var COUNTRY_ADJ_TOKENS = {\n    india: ['indian'],\n    brazil: ['brazilian', 'brasil'],\n    cuba: ['cuban', 'afro-cuban'],\n    jamaica: ['jamaican'],\n    mali: ['malian'],\n    senegal: ['senegalese'],\n    ghana: ['ghanaian'],\n    nigeria: ['nigerian'],\n    ethiopia: ['ethiopian', 'ethio'],\n    morocco: ['moroccan'],\n    egypt: ['egyptian'],\n    japan: ['japanese'],\n    china: ['chinese'],\n    france: ['french'],\n    spain: ['spanish'],\n    portugal: ['portuguese'],\n    greece: ['greek'],\n    turkey: ['turkish'],\n    ireland: ['irish'],\n    scotland: ['scottish'],\n    wales: ['welsh'],\n    england: ['english'],\n    argentina: ['argentinian', 'argentine'],\n    peru: ['peruvian'],\n    afghanistan: ['afghan'],\n    cambodia: ['cambodian'],\n    madagascar: ['malagasy'],\n    palestine: ['palestinian'],\n    usa: ['american']\n  };\n  /** Extra genre seeds when country tags are sparse / adjective match misses. */\n  var COUNTRY_GENRE_BRIDGES = {\n    india: ['indian-classical-raga', 'bollywood-filmi'],\n    cuba: ['afro-cuban-son', 'salsa'],\n    brazil: ['brazilian'],\n    jamaica: ['reggae-dancehall-ragga'],\n    mali: ['desert-blues-sahara', 'tuareg'],\n    argentina: ['tango'],\n    morocco: ['gnawa']\n  };\n  /** Region \u2192 genre seeds (same role as COUNTRY_GENRE_BRIDGES). */\n  var REGION_GENRE_BRIDGES = {\n    'latin-america': ['salsa', 'cumbia', 'brazilian', 'afro-cuban-son', 'tango'],\n    caribbean: ['reggae-dancehall-ragga', 'salsa', 'calypso', 'mento'],\n    'west-africa': ['highlife', 'afrobeat', 'afrobeats', 'mbalax'],\n    'sahara-sahel': ['desert-blues-sahara', 'tuareg', 'gnawa'],\n    maghreb: ['gnawa', 'arabic-middle-eastern'],\n    'middle-east': ['arabic-middle-eastern'],\n    balkans: ['balkan', 'klezmer-jewish'],\n    'south-asia': ['indian-classical-raga', 'bollywood-filmi'],\n    mediterranean: ['flamenco', 'fado', 'rebetika']\n  };\n  /**\n   * Broad style tags that must NOT enter country prefer keys via majority\n   * frequency. Mali products often carry `folk`; admitting it floods the\n   * prefer pool with Johnny Cash / roots bestsellers and soft-fills away\n   * from West Africa. Explicit COUNTRY_GENRE_BRIDGES still win.\n   */\n  var GENERIC_COUNTRY_FOCUS_GENRES = {\n    folk: true,\n    jazz: true,\n    blues: true,\n    country: true,\n    gospel: true,\n    gospel_spiritual: true,\n    'gospel-spiritual': true,\n    roots: true,\n    acoustic: true,\n    world: true,\n    'world-music': true,\n    'world-compilation': true,\n    instrumental: true,\n    vocals: true,\n    pop: true,\n    rock: true,\n    classical: true,\n    soundtrack: true,\n    spoken: true,\n    other: true,\n    'other-non-music': true\n  };\n  var FY_SOFTMAX_TEMP = 80;\n  var FY_IPS_CLIP = 10;\n  var EMB_FOCUS_TIE_SCALE = 48;\n  var U_EMB_KEY = 'wmn_u_emb_v1';\n  var U_EMB_ALPHA = 0.35;\n  /** Expected-utility multipliers for entity kinds (catalog For you scorer). */\n  var ENTITY_SCORE_WEIGHT = {\n    country: 1.4,\n    region: 1.4,\n    genre: 1.0,\n    artist: 1.0,\n    imprint: 0.5,\n    product: 0.6\n  };\n  var EXPLORE_KAPPA0 = 18;\n  var EXPLORE_TAU = 80;\n  var NEG_GAMMA = 42;\n  var NEG_ARTIST_SOFT = 0.15;\n  var MAX_NEGATIVES = 80;\n  /** Pull interest matches onto collection For you when Shopify page 1 omits them. */\n  var COLLECTION_INTEREST_INJECT = 6;\n  var DISCOVER_LIMIT = 32;\n  var SLOT_CONTINUE = 2;\n  var SLOT_RELATED = 8;\n  var SLOT_GENRE = 8;\n  var SLOT_EXPLOIT = 6;\n  var SLOT_EXPLORE = 8;\n  var GRID_SELECTORS = [\n    '.featured-collection .product-list',\n    '.product-list.collection-matrix',\n    '.collection-matrix.product-list',\n    '.collection-template-section .product-list',\n    '.collection-template .product-list',\n    '.cart_content .product-list',\n    '.cart-section .product-list',\n    '.wmn-shopify-recs .product-list',\n    '#wmn-for-you-grid'\n  ];\n\n  // Shopify sorts that should keep server order (no client algorithm reorder).\n  var EXPLICIT_SHOPIFY_SORTS = {\n    'title-ascending': true,\n    'title-descending': true,\n    'price-ascending': true,\n    'price-descending': true,\n    'created-ascending': true,\n    'created-descending': true,\n    'best-selling': true,\n    manual: true\n  };\n\n  function now() {\n    return Date.now();\n  }\n\n  function readUEmb() {\n    try {\n      var raw = window.sessionStorage.getItem(U_EMB_KEY);\n      if (!raw) return null;\n      var parsed = JSON.parse(raw);\n      if (parsed && Array.isArray(parsed.v) && parsed.v.length) return parsed;\n    } catch (e) {\n      /* ignore */\n    }\n    return null;\n  }\n\n  function writeUEmb(vec) {\n    if (!vec || !vec.length) return;\n    var payload = { t: now(), v: vec };\n    try {\n      window.sessionStorage.setItem(U_EMB_KEY, JSON.stringify(payload));\n    } catch (e) {\n      /* ignore */\n    }\n    writeInterestProfile({ uEmb: payload });\n  }\n\n  function interestProfileKey() {\n    var meta = document.querySelector('meta[name=\"wmn-customer-id\"]');\n    var cid = meta && meta.getAttribute('content');\n    if (cid && /^\\d+$/.test(cid)) {\n      return INTEREST_KEY + '_c' + cid;\n    }\n    return INTEREST_KEY;\n  }\n\n  function emptyInterestProfile() {\n    return { v: 1, t: 0, focus: null, uEmb: null };\n  }\n\n  function readInterestProfile() {\n    try {\n      var raw = window.localStorage.getItem(interestProfileKey());\n      if (!raw) return null;\n      var p = JSON.parse(raw);\n      if (!p || p.v !== 1) return null;\n      if (!p.t || now() - p.t > INTEREST_TTL_MS) return null;\n      return p;\n    } catch (e) {\n      return null;\n    }\n  }\n\n  /**\n   * Merge patch into durable interest profile. Refreshes profile.t.\n   * @param {{ focus?: object|null, uEmb?: object|null }} patch\n   */\n  function writeInterestProfile(patch) {\n    patch = patch || {};\n    var prev = null;\n    try {\n      var raw = window.localStorage.getItem(interestProfileKey());\n      if (raw) prev = JSON.parse(raw);\n    } catch (e) {\n      prev = null;\n    }\n    if (!prev || typeof prev !== 'object') prev = emptyInterestProfile();\n    var next = {\n      v: 1,\n      t: now(),\n      focus: patch.focus !== undefined ? patch.focus : prev.focus || null,\n      uEmb: patch.uEmb !== undefined ? patch.uEmb : prev.uEmb || null\n    };\n    try {\n      window.localStorage.setItem(interestProfileKey(), JSON.stringify(next));\n    } catch (e2) {\n      /* ignore */\n    }\n    scheduleCloudWriteback();\n  }\n\n  function l2Normalize(vec) {\n    if (!vec || !vec.length) return vec;\n    var n2 = 0;\n    var i;\n    for (i = 0; i < vec.length; i++) n2 += vec[i] * vec[i];\n    n2 = Math.sqrt(n2) || 1;\n    for (i = 0; i < vec.length; i++) vec[i] /= n2;\n    return vec;\n  }\n\n  /**\n   * Blend product embedding into session u_emb (intentional hover/click only).\n   */\n  function updateUEmbFromHandle(handle) {\n    if (!handle || !graphReady()) return;\n    try {\n      if (\n        !window.wmnCatalogGraph ||\n        typeof window.wmnCatalogGraph.getProductEmbedding !== 'function'\n      ) {\n        return;\n      }\n      var pe = window.wmnCatalogGraph.getProductEmbedding(handle);\n      if (!pe || !pe.length) return;\n      var prev = readUEmb();\n      var next;\n      var i;\n      if (!prev || !prev.v || prev.v.length !== pe.length) {\n        next = pe.slice();\n      } else {\n        next = new Array(pe.length);\n        for (i = 0; i < pe.length; i++) {\n          next[i] =\n            (1 - U_EMB_ALPHA) * prev.v[i] + U_EMB_ALPHA * pe[i];\n        }\n        l2Normalize(next);\n      }\n      writeUEmb(next);\n    } catch (e) {\n      /* ignore */\n    }\n  }\n\n  function embDotForHandle(handle, uEmb) {\n    if (!handle || !uEmb || !uEmb.length) return 0;\n    try {\n      if (\n        !window.wmnCatalogGraph ||\n        typeof window.wmnCatalogGraph.getProductEmbedding !== 'function' ||\n        typeof window.wmnCatalogGraph.dotEmbedding !== 'function'\n      ) {\n        return 0;\n      }\n      var pe = window.wmnCatalogGraph.getProductEmbedding(handle);\n      if (!pe) return 0;\n      return window.wmnCatalogGraph.dotEmbedding(uEmb, pe);\n    } catch (e) {\n      return 0;\n    }\n  }\n\n  function storageKey() {\n    var meta = document.querySelector('meta[name=\"wmn-customer-id\"]');\n    var cid = meta && meta.getAttribute('content');\n    if (cid && /^\\d+$/.test(cid)) {\n      return BASE_KEY + '_c' + cid;\n    }\n    return BASE_KEY;\n  }\n\n  function emptyStore() {\n    return { v: 1, events: [], entities: {}, negatives: {} };\n  }\n\n  function parseStore(raw) {\n    if (!raw) return emptyStore();\n    try {\n      var data = JSON.parse(raw);\n      if (!data || !Array.isArray(data.events)) return emptyStore();\n      if (!data.entities || typeof data.entities !== 'object') data.entities = {};\n      if (!data.negatives || typeof data.negatives !== 'object') data.negatives = {};\n      return data;\n    } catch (e) {\n      return emptyStore();\n    }\n  }\n\n  function capNegatives(negatives) {\n    var keys = Object.keys(negatives || {});\n    if (keys.length <= MAX_NEGATIVES) return negatives || {};\n    keys.sort(function (a, b) {\n      return (negatives[b] || 0) - (negatives[a] || 0);\n    });\n    var out = {};\n    for (var i = 0; i < MAX_NEGATIVES; i++) {\n      out[keys[i]] = negatives[keys[i]];\n    }\n    return out;\n  }\n\n  function mergeNegativeMaps(a, b) {\n    var out = {};\n    function take(src) {\n      if (!src) return;\n      for (var k in src) {\n        if (!Object.prototype.hasOwnProperty.call(src, k)) continue;\n        out[k] = Math.max(out[k] || 0, src[k] || 0);\n      }\n    }\n    take(a);\n    take(b);\n    return capNegatives(out);\n  }\n\n  function handleize(str) {\n    return String(str || '')\n      .toLowerCase()\n      .replace(/[\\/\\(\\)'''']/g, ' ')\n      .replace(/&/g, ' and ')\n      .replace(/[^a-z0-9]+/g, '-')\n      .replace(/^-+|-+$/g, '')\n      .slice(0, 100);\n  }\n\n  function ensureGraphWarm() {\n    if (window.wmnCatalogGraph && typeof window.wmnCatalogGraph.ensureLoaded === 'function') {\n      window.wmnCatalogGraph.ensureLoaded().catch(function () {});\n    }\n  }\n\n  function graphReady() {\n    return !!(\n      window.wmnCatalogGraph &&\n      typeof window.wmnCatalogGraph.getData === 'function' &&\n      window.wmnCatalogGraph.getData()\n    );\n  }\n\n  /** Resolve payload \u2192 entity ids (graph when ready, else PDP/artist/imprint/genres). */\n  function resolveEntities(payload) {\n    var ids = [];\n    var seen = {};\n    function add(id) {\n      if (!id || seen[id]) return;\n      seen[id] = true;\n      ids.push(id);\n    }\n    if (!payload) return ids;\n    var handle = payload.handle || '';\n    if (handle && graphReady()) {\n      var resolved = window.wmnCatalogGraph.resolveProduct(handle);\n      add('product:' + handle);\n      (resolved.artists || []).forEach(function (a) {\n        add('artist:' + a);\n      });\n      (resolved.genres || []).forEach(function (g) {\n        add('genre:' + g);\n      });\n      (resolved.countries || []).forEach(function (c) {\n        if (c && c !== 'celtic') add('country:' + c);\n      });\n      (resolved.regions || []).forEach(function (r) {\n        if (r) add('region:' + r);\n      });\n      (resolved.imprints || []).forEach(function (i) {\n        add('imprint:' + i);\n      });\n      // Merge caller genres (e.g. title-token / country aliases from rails)\n      var extraG = payload.genres || [];\n      for (var eg = 0; eg < extraG.length; eg++) {\n        var egSlug = handleize(extraG[eg]);\n        if (egSlug) add('genre:' + egSlug);\n      }\n      var extraC = payload.countries || [];\n      for (var ec = 0; ec < extraC.length; ec++) {\n        var ecSlug = handleize(extraC[ec]);\n        if (ecSlug && ecSlug !== 'celtic') add('country:' + ecSlug);\n      }\n      var extraR = payload.regions || [];\n      for (var er = 0; er < extraR.length; er++) {\n        var erSlug = handleize(extraR[er]);\n        if (erSlug) add('region:' + erSlug);\n      }\n      // Title/handle geo aliases when graph country tags are sparse\n      inferGeoFromText(payload.title || handle, add);\n      return ids;\n    }\n    if (handle) add('product:' + handle);\n    if (payload.artist) {\n      var aSlug = handleize(payload.artist);\n      if (aSlug && aSlug !== 'various' && aSlug !== 'various-artists') {\n        add('artist:' + aSlug);\n      }\n    }\n    if (payload.imprint) {\n      var iSlug = handleize(payload.imprint);\n      if (iSlug) add('imprint:' + iSlug);\n    }\n    var gs = payload.genres || [];\n    for (var i = 0; i < gs.length; i++) {\n      var gSlug = handleize(gs[i]);\n      if (gSlug) add('genre:' + gSlug);\n    }\n    var extraC2 = payload.countries || [];\n    for (var ec2 = 0; ec2 < extraC2.length; ec2++) {\n      var ecSlug2 = handleize(extraC2[ec2]);\n      if (ecSlug2 && ecSlug2 !== 'celtic') add('country:' + ecSlug2);\n    }\n    var extraR2 = payload.regions || [];\n    for (var er2 = 0; er2 < extraR2.length; er2++) {\n      var erSlug2 = handleize(extraR2[er2]);\n      if (erSlug2) add('region:' + erSlug2);\n    }\n    inferGeoFromText(payload.title || handle, add);\n    return ids;\n  }\n\n  /**\n   * Sparse country tags: infer country/region from title/handle text.\n   * Celtic never becomes a country. Mississippi \u2192 USA.\n   */\n  function inferGeoFromText(text, add) {\n    if (!add || !text) return;\n    var s = String(text || '')\n      .toLowerCase()\n      .replace(/['']/g, '');\n    if (!s) return;\n\n    function country(slug) {\n      if (slug && slug !== 'celtic') add('country:' + slug);\n    }\n    function region(slug) {\n      if (slug) add('region:' + slug);\n    }\n\n    // Regions / pan-geo phrases first\n    if (/\\bwest\\s*africa\\b|\\bwestafrica\\b/.test(s)) {\n      region('west-africa');\n      region('africa');\n    } else if (/\\beast\\s*africa\\b/.test(s)) {\n      region('east-africa');\n      region('africa');\n    } else if (/\\bnorth\\s*africa\\b|\\bmaghreb\\b/.test(s)) {\n      region('north-africa');\n      region('maghreb');\n      region('africa');\n    } else if (/\\bsouth(ern)?\\s*africa\\b/.test(s)) {\n      region('southern-africa');\n      region('africa');\n    } else if (/\\bafrica\\b|\\bafrican\\b/.test(s)) {\n      region('africa');\n    }\n    if (/\\bsahara\\b|\\bsahel\\b/.test(s)) {\n      region('sahara-sahel');\n      region('africa');\n    }\n    if (/\\bceltic\\b/.test(s)) region('celtic');\n    if (/\\bmississippi\\b/.test(s)) {\n      country('usa');\n      region('north-america');\n    }\n\n    // Common country title tokens (Rough Guides / Think Global)\n    var countries = [\n      ['mali', 'mali'],\n      ['senegal', 'senegal'],\n      ['guinea', 'guinea'],\n      ['ghana', 'ghana'],\n      ['nigeria', 'nigeria'],\n      ['ethiopia', 'ethiopia'],\n      ['sudan', 'sudan'],\n      ['morocco', 'morocco'],\n      ['algeria', 'algeria'],\n      ['tunisia', 'tunisia'],\n      ['egypt', 'egypt'],\n      ['kenya', 'kenya'],\n      ['tanzania', 'tanzania'],\n      ['cameroon', 'cameroon'],\n      ['madagascar', 'madagascar'],\n      ['congo', 'congo'],\n      ['cuba', 'cuba'],\n      ['brazil', 'brazil'],\n      ['jamaica', 'jamaica'],\n      ['india', 'india'],\n      ['pakistan', 'pakistan'],\n      ['afghanistan', 'afghanistan'],\n      ['cambodia', 'cambodia'],\n      ['china', 'china'],\n      ['japan', 'japan'],\n      ['korea', 'korea'],\n      ['ireland', 'ireland'],\n      ['scotland', 'scotland'],\n      ['wales', 'wales'],\n      ['england', 'england'],\n      ['portugal', 'portugal'],\n      ['spain', 'spain'],\n      ['france', 'france'],\n      ['italy', 'italy'],\n      ['greece', 'greece'],\n      ['turkey', 'turkey'],\n      ['hungary', 'hungary'],\n      ['romania', 'romania'],\n      ['bulgaria', 'bulgaria'],\n      ['poland', 'poland'],\n      ['russia', 'russia'],\n      ['ukraine', 'ukraine'],\n      ['argentina', 'argentina'],\n      ['peru', 'peru'],\n      ['colombia', 'colombia'],\n      ['mexico', 'mexico'],\n      ['haiti', 'haiti'],\n      ['trinidad', 'trinidad'],\n      ['new orleans', 'usa'],\n      ['americana', 'usa'],\n      ['delta blues', 'usa']\n    ];\n    var i;\n    for (i = 0; i < countries.length; i++) {\n      var needle = countries[i][0];\n      var slug = countries[i][1];\n      if (s.indexOf(needle) !== -1) country(slug);\n    }\n  }\n\n  /**\n   * When a signal carries geo, amplify country/region and damp noisy genres\n   * (graph genre mistakes like brazilian-on-Mali must not drown Africa).\n   */\n  function entityBumpScaleMap(entityIds, kind) {\n    var hasGeo = false;\n    var i;\n    for (i = 0; i < (entityIds || []).length; i++) {\n      var p0 = String(entityIds[i]).split(':')[0];\n      if (p0 === 'country' || p0 === 'region') {\n        hasGeo = true;\n        break;\n      }\n    }\n    var map = {};\n    var hoverish = kind === 'hover' || kind === 'search_click' || kind === 'atc';\n    for (i = 0; i < (entityIds || []).length; i++) {\n      var id = entityIds[i];\n      if (!id) continue;\n      var kindPart = id.split(':')[0];\n      var scale = 1;\n      if (kindPart === 'country' || kindPart === 'region') {\n        scale = hoverish ? 2.2 : kind === 'visible' ? 0.6 : 1.6;\n      } else if (kindPart === 'genre' && hasGeo) {\n        scale = 0.05;\n      } else if (kindPart === 'product' && hoverish) {\n        scale = 1.15;\n      }\n      map[id] = scale;\n    }\n    return map;\n  }\n\n  function capEntities(entities) {\n    var keys = Object.keys(entities || {});\n    if (keys.length <= MAX_ENTITIES) return entities || {};\n    keys.sort(function (a, b) {\n      return (entities[b] || 0) - (entities[a] || 0);\n    });\n    var out = {};\n    for (var i = 0; i < MAX_ENTITIES; i++) {\n      out[keys[i]] = entities[keys[i]];\n    }\n    return out;\n  }\n\n  /** Decay map since last entity touch, then add bumps.\n   *  scaleOrMap: number (all ids) or { id: scale } map.\n   */\n  function bumpEntities(store, entityIds, kind, scaleOrMap) {\n    if (!store) return;\n    store.entities = store.entities || {};\n    var kindMult = KIND_WEIGHT[kind || 'view'] || 1;\n    var isMap = scaleOrMap && typeof scaleOrMap === 'object';\n    var factor = 1;\n    if (store.et) {\n      factor = Math.pow(0.5, Math.max(0, now() - store.et) / HALF_LIFE_MS);\n    }\n    var ents = store.entities;\n    var k;\n    for (k in ents) {\n      if (Object.prototype.hasOwnProperty.call(ents, k)) {\n        ents[k] = ents[k] * factor;\n        if (ents[k] < 0.05) delete ents[k];\n      }\n    }\n    var list = entityIds || [];\n    for (var i = 0; i < list.length; i++) {\n      var id = list[i];\n      if (!id) continue;\n      var scale = 1;\n      if (isMap) {\n        scale = scaleOrMap[id] != null ? scaleOrMap[id] : 1;\n      } else if (scaleOrMap != null) {\n        scale = scaleOrMap;\n      }\n      ents[id] = (ents[id] || 0) + VIEW_WEIGHT * kindMult * scale;\n    }\n    store.et = now();\n    store.entities = capEntities(ents);\n  }\n\n  function mergeEntityMaps(a, b) {\n    var out = {};\n    function take(src) {\n      if (!src) return;\n      for (var k in src) {\n        if (!Object.prototype.hasOwnProperty.call(src, k)) continue;\n        out[k] = Math.max(out[k] || 0, src[k] || 0);\n      }\n    }\n    take(a);\n    take(b);\n    return capEntities(out);\n  }\n\n  function getEntityPrefs() {\n    var store = readStore();\n    return store.entities || {};\n  }\n\n  function readFocus() {\n    try {\n      var raw = window.sessionStorage.getItem(FOCUS_KEY);\n      if (!raw) return null;\n      var f = JSON.parse(raw);\n      if (!f || !f.t || now() - f.t > FOCUS_TTL_MS) return null;\n      return f;\n    } catch (e) {\n      return null;\n    }\n  }\n\n  /** Session focus, or durable focus when session expired (for update merge). */\n  function readFocusOrDurable() {\n    var s = readFocus();\n    if (s) return s;\n    var prof = readInterestProfile();\n    if (prof && prof.focus && prof.focus.t) return prof.focus;\n    return null;\n  }\n\n  function writeFocus(focus) {\n    try {\n      window.sessionStorage.setItem(FOCUS_KEY, JSON.stringify(focus));\n    } catch (e) {\n      /* ignore */\n    }\n    writeInterestProfile({ focus: focus });\n    dispatchFocusChanged(focus);\n  }\n\n  function dispatchFocusChanged(focus) {\n    try {\n      document.dispatchEvent(\n        new CustomEvent('wmn:focus-changed', { detail: focus || null })\n      );\n    } catch (errFocus) {\n      /* ignore */\n    }\n  }\n\n  /** Slug / handle \u2192 short human phrase (spaces, no full album titles). */\n  function humanizeSlug(slug) {\n    return String(slug || '')\n      .replace(/[-_]+/g, ' ')\n      .replace(/\\s+/g, ' ')\n      .trim();\n  }\n\n  /**\n   * Prefer 2\u20134 words, capped at SEARCH_GHOST_MAX chars.\n   * @param {string} phrase\n   * @returns {string}\n   */\n  function shortenGhostPhrase(phrase) {\n    var s = String(phrase || '')\n      .replace(/\\s+/g, ' ')\n      .trim();\n    if (!s) return '';\n    var words = s.split(' ');\n    var out = [];\n    var i;\n    for (i = 0; i < words.length && out.length < 4; i++) {\n      if (!words[i]) continue;\n      var next = out.length ? out.join(' ') + ' ' + words[i] : words[i];\n      if (next.length > SEARCH_GHOST_MAX) break;\n      out.push(words[i]);\n    }\n    if (!out.length) {\n      return s.slice(0, SEARCH_GHOST_MAX).replace(/\\s+\\S*$/, '').trim();\n    }\n    return out.join(' ');\n  }\n\n  /**\n   * Temu-style ghost suggestion from session focus.\n   * Priority: short q \u2192 genre \u2192 artist \u2192 country/region. Never album title.\n   * @param {object} [focus]\n   * @returns {string}\n   */\n  function getSearchSuggestion(focus) {\n    focus = focus || readFocus();\n    if (!focus) return '';\n    var q = String(focus.q || '')\n      .replace(/\\s+/g, ' ')\n      .trim();\n    if (q && q.length <= SEARCH_GHOST_MAX) {\n      return shortenGhostPhrase(q) || q;\n    }\n    var genre =\n      focus.primaryGenre || (focus.genres && focus.genres[0]) || '';\n    if (genre) {\n      var g = shortenGhostPhrase(humanizeSlug(genre));\n      if (g) return g;\n    }\n    var artist =\n      focus.primaryArtist || (focus.artists && focus.artists[0]) || '';\n    if (artist) {\n      var a = shortenGhostPhrase(humanizeSlug(artist));\n      if (a) return a;\n    }\n    var geo = focus.primaryCountry || focus.primaryRegion || '';\n    if (geo) {\n      var c = shortenGhostPhrase(humanizeSlug(geo));\n      if (c) return c;\n    }\n    return '';\n  }\n\n  function isHeaderSearchInputEl(input) {\n    return !!(\n      input &&\n      input.name === 'q' &&\n      input.closest &&\n      input.closest(\n        '.wmn-header__search, .header_search_form, [data-dropdown=\"search\"]'\n      )\n    );\n  }\n\n  function allHeaderSearchInputs() {\n    return document.querySelectorAll(SEARCH_INPUT_SEL);\n  }\n\n  function refreshSearchPlaceholder(input) {\n    if (!input) return;\n    var form = input.closest && input.closest('form');\n    var ghost =\n      (form && form.getAttribute('data-wmn-search-ghost')) ||\n      input.getAttribute('data-wmn-search-ghost') ||\n      '';\n    var hasValue = !!(\n      input.value && String(input.value).replace(/^\\s+|\\s+$/g, '')\n    );\n    var focused = document.activeElement === input;\n    if (ghost && !hasValue && !focused) {\n      input.placeholder = ghost;\n    } else {\n      input.placeholder = DEFAULT_SEARCH_PLACEHOLDER;\n    }\n  }\n\n  function applySearchGhost(suggestion) {\n    suggestion = suggestion || '';\n    var inputs = allHeaderSearchInputs();\n    var i;\n    for (i = 0; i < inputs.length; i++) {\n      var input = inputs[i];\n      var form = input.closest && input.closest('form');\n      var host = form || input;\n      if (suggestion) {\n        host.setAttribute('data-wmn-search-ghost', suggestion);\n      } else {\n        host.removeAttribute('data-wmn-search-ghost');\n      }\n      refreshSearchPlaceholder(input);\n    }\n  }\n\n  /** Header search ghost placeholders from session focus (sitewide). */\n  function bindSearchGhost() {\n    if (!window.__wmnSearchGhostBound) {\n      window.__wmnSearchGhostBound = true;\n\n      document.addEventListener('wmn:focus-changed', function (e) {\n        var focus = e && e.detail;\n        applySearchGhost(getSearchSuggestion(focus));\n      });\n\n      document.addEventListener(\n        'focusin',\n        function (e) {\n          if (isHeaderSearchInputEl(e.target)) {\n            refreshSearchPlaceholder(e.target);\n          }\n        },\n        true\n      );\n\n      document.addEventListener(\n        'focusout',\n        function (e) {\n          if (!isHeaderSearchInputEl(e.target)) return;\n          var input = e.target;\n          setTimeout(function () {\n            refreshSearchPlaceholder(input);\n          }, 0);\n        },\n        true\n      );\n\n      document.addEventListener(\n        'input',\n        function (e) {\n          if (isHeaderSearchInputEl(e.target)) {\n            refreshSearchPlaceholder(e.target);\n          }\n        },\n        true\n      );\n\n      document.addEventListener(\n        'submit',\n        function (e) {\n          var form = e.target;\n          if (!form || !form.querySelector) return;\n          var input = form.querySelector('input[name=\"q\"]');\n          if (!isHeaderSearchInputEl(input)) return;\n          var q = String(input.value || '').replace(/^\\s+|\\s+$/g, '');\n          var ghost =\n            form.getAttribute('data-wmn-search-ghost') ||\n            input.getAttribute('data-wmn-search-ghost') ||\n            '';\n          if (!q && ghost) {\n            input.value = ghost;\n          }\n        },\n        true\n      );\n\n      document.addEventListener(\n        'click',\n        function (e) {\n          var t = e.target;\n          if (!t || !t.closest) return;\n          var btn = t.closest('[data-wmn-search-clear]');\n          if (!btn) return;\n          var form = btn.closest('form');\n          var input = form && form.querySelector('input[name=\"q\"]');\n          if (!input) return;\n          setTimeout(function () {\n            input.placeholder = DEFAULT_SEARCH_PLACEHOLDER;\n            refreshSearchPlaceholder(input);\n          }, 0);\n        },\n        true\n      );\n    }\n    applySearchGhost(getSearchSuggestion());\n  }\n\n  /**\n   * Copy durable interest \u2192 session when session focus is empty/expired.\n   * Does not bump durable t (reload must not look like a new intentional write).\n   */\n  function hydrateInterestFromDurable() {\n    if (readFocus()) return;\n    var prof = readInterestProfile();\n    if (!prof || !prof.focus || !prof.focus.t) return;\n    try {\n      window.sessionStorage.setItem(FOCUS_KEY, JSON.stringify(prof.focus));\n    } catch (e) {\n      /* ignore */\n    }\n    if (prof.uEmb && prof.uEmb.v && prof.uEmb.v.length) {\n      try {\n        window.sessionStorage.setItem(U_EMB_KEY, JSON.stringify(prof.uEmb));\n      } catch (e2) {\n        /* ignore */\n      }\n    }\n  }\n\n  /**\n   * Apply cloud intent.focus / uEmb when newer than local durable (or local missing).\n   */\n  function applyCloudInterest(cloud) {\n    if (!cloud || !cloud.intent) return;\n    var cloudFocus = cloud.intent.focus || null;\n    var cloudUEmb =\n      cloud.intent.uEmb && cloud.intent.uEmb.v ? cloud.intent.uEmb : null;\n    if (!cloudFocus && !cloudUEmb) return;\n    var cloudT =\n      (cloudFocus && cloudFocus.t) ||\n      (cloudUEmb && cloudUEmb.t) ||\n      cloud.intent.updatedAt ||\n      0;\n    var local = null;\n    try {\n      var raw = window.localStorage.getItem(interestProfileKey());\n      if (raw) local = JSON.parse(raw);\n    } catch (e) {\n      local = null;\n    }\n    var localT = (local && local.t) || 0;\n    if (localT && cloudT && localT >= cloudT) {\n      // Local newer \u2014 queue writeback so metafield catches up.\n      scheduleCloudWriteback();\n      return;\n    }\n    var next = {\n      v: 1,\n      t: cloudT || now(),\n      focus: cloudFocus || (local && local.focus) || null,\n      uEmb: cloudUEmb || (local && local.uEmb) || null\n    };\n    try {\n      window.localStorage.setItem(interestProfileKey(), JSON.stringify(next));\n    } catch (e2) {\n      /* ignore */\n    }\n    // Hydrate session from applied cloud (session-only writes).\n    if (next.focus) {\n      try {\n        window.sessionStorage.setItem(FOCUS_KEY, JSON.stringify(next.focus));\n      } catch (e3) {\n        /* ignore */\n      }\n    }\n    if (next.uEmb) {\n      try {\n        window.sessionStorage.setItem(U_EMB_KEY, JSON.stringify(next.uEmb));\n      } catch (e4) {\n        /* ignore */\n      }\n    }\n  }\n\n  /** Push val to front; if already present, re-promote (splice + unshift). */\n  function uniqPush(arr, val, max) {\n    if (!val) return;\n    var ix = arr.indexOf(val);\n    if (ix !== -1) arr.splice(ix, 1);\n    arr.unshift(val);\n    if (arr.length > (max || 8)) arr.length = max || 8;\n  }\n\n  /** Session focus vector \u2014 last search / view lane (decays over FOCUS_TTL_MS). */\n  function updateFocus(opts) {\n    opts = opts || {};\n    try {\n      if (\n        opts.q &&\n        window.wmnQueryGuard &&\n        typeof window.wmnQueryGuard.isBlocked === 'function' &&\n        window.wmnQueryGuard.isBlocked(opts.q)\n      ) {\n        // Keep other focus fields; never persist a dirty stem as focus.q.\n        var scrubbed = {};\n        var ok;\n        for (ok in opts) {\n          if (Object.prototype.hasOwnProperty.call(opts, ok) && ok !== 'q') {\n            scrubbed[ok] = opts[ok];\n          }\n        }\n        opts = scrubbed;\n      }\n    } catch (eGuard) {\n      /* ignore */\n    }\n    var prev = readFocusOrDurable() || {\n      t: 0,\n      artists: [],\n      genres: [],\n      handles: [],\n      primaryGenre: '',\n      primaryArtist: '',\n      primaryCountry: '',\n      primaryRegion: '',\n      primaryKind: '',\n      q: ''\n    };\n    var artists = (prev.artists || []).slice();\n    var genres = (prev.genres || []).slice();\n    var handles = (prev.handles || []).slice();\n    var i;\n    if (opts.artists) {\n      for (i = opts.artists.length - 1; i >= 0; i--) {\n        uniqPush(artists, opts.artists[i], 6);\n      }\n    }\n    if (opts.genres) {\n      for (i = opts.genres.length - 1; i >= 0; i--) {\n        uniqPush(genres, opts.genres[i], 6);\n      }\n    }\n    if (opts.handles) {\n      for (i = opts.handles.length - 1; i >= 0; i--) {\n        uniqPush(handles, opts.handles[i], 6);\n      }\n    }\n    // Primary = most recent intentional genre/artist (front after uniqPush).\n    var primaryGenre = genres[0] || prev.primaryGenre || '';\n    var primaryArtist = artists[0] || prev.primaryArtist || '';\n    // primaryKind / geo primaries come from THIS intentional payload when set.\n    var primaryKind =\n      opts.primaryKind != null && opts.primaryKind !== ''\n        ? opts.primaryKind\n        : prev.primaryKind || '';\n    var primaryCountry =\n      opts.primaryCountry != null\n        ? opts.primaryCountry\n        : prev.primaryCountry || '';\n    var primaryRegion =\n      opts.primaryRegion != null\n        ? opts.primaryRegion\n        : prev.primaryRegion || '';\n    if (opts.primaryKind === 'genre' || opts.primaryKind === 'artist') {\n      primaryCountry = '';\n      primaryRegion = '';\n    }\n    if (opts.primaryKind === 'country') {\n      primaryRegion = '';\n    }\n    if (opts.primaryKind === 'region') {\n      primaryCountry = '';\n    }\n    if (!primaryKind) {\n      if (primaryCountry) primaryKind = 'country';\n      else if (primaryRegion) primaryKind = 'region';\n      else if (primaryGenre) primaryKind = 'genre';\n      else if (primaryArtist) primaryKind = 'artist';\n    }\n    writeFocus({\n      t: now(),\n      artists: artists,\n      genres: genres,\n      handles: handles,\n      primaryGenre: primaryGenre,\n      primaryArtist: primaryArtist,\n      primaryCountry: primaryCountry,\n      primaryRegion: primaryRegion,\n      primaryKind: primaryKind,\n      q: opts.q != null ? String(opts.q) : prev.q || ''\n    });\n  }\n\n  /**\n   * Re-promote session focus without entity bumps (re-hover after once-gate).\n   * Dispatches prefs so For you subtitle / tail can refresh.\n   */\n  function promoteFocus(payload, query) {\n    if (!payload && !query) return;\n    updateFocusFromPayload(payload || {}, query);\n    dispatchPrefsUpdated(readStore());\n  }\n\n  function updateFocusFromPayload(payload, query) {\n    if (!payload && !query) return;\n    payload = payload || {};\n    var artists = [];\n    var genres = [];\n    var handles = [];\n    var countries = [];\n    var regions = [];\n    var ids = resolveEntities(payload);\n    var i;\n    for (i = 0; i < ids.length; i++) {\n      var parts = String(ids[i]).split(':');\n      if (parts[0] === 'artist' && parts[1]) artists.push(parts[1]);\n      if (parts[0] === 'genre' && parts[1]) genres.push(parts[1]);\n      if (parts[0] === 'product' && parts[1]) handles.push(parts[1]);\n      if (parts[0] === 'country' && parts[1]) countries.push(parts[1]);\n      if (parts[0] === 'region' && parts[1]) regions.push(parts[1]);\n    }\n    if (payload.handle) handles.push(payload.handle);\n    if (payload.artist) {\n      var as = handleize(payload.artist);\n      if (as && as !== 'various') artists.push(as);\n    }\n    // Prefer title-token genre when title clearly names a tagged genre\n    // (Jazz Legends with blues+jazz tags \u2192 jazz primary for labels).\n    var titleMatchedGenre = '';\n    if (genres.length && payload.title) {\n      var titleLow = String(payload.title).toLowerCase();\n      for (i = 0; i < genres.length; i++) {\n        var gSlug = genres[i];\n        var gWords = String(gSlug || '').replace(/-/g, ' ');\n        if (\n          gSlug &&\n          (titleLow.indexOf(gWords) !== -1 ||\n            titleLow.indexOf(gSlug) !== -1)\n        ) {\n          genres = genres.slice();\n          genres.splice(i, 1);\n          genres.unshift(gSlug);\n          titleMatchedGenre = gSlug;\n          break;\n        }\n      }\n    }\n    // Title-tail intent: \"\u2026 Ethiopian Jazz\" / \"\u2026 World Jazz\" \u2192 genre,\n    // \"\u2026 Music of Mali\" / \"\u2026 Spiritual India\" \u2192 country.\n    // Ending genre word beats country tags so Jazz isn't crushed by ethiopia/brazil.\n    var titleTailGenre = '';\n    if (genres.length && payload.title) {\n      var titleNorm = String(payload.title)\n        .toLowerCase()\n        .replace(/[^a-z0-9\\s-]/g, ' ')\n        .replace(/\\s+/g, ' ')\n        .trim();\n      for (i = 0; i < genres.length; i++) {\n        var tg = genres[i];\n        if (!tg) continue;\n        var tgWords = String(tg).replace(/-/g, ' ');\n        var tgLast = tgWords.split(' ').pop();\n        if (\n          titleNorm === tgWords ||\n          titleNorm.slice(-(tgWords.length + 1)) === ' ' + tgWords ||\n          titleNorm.slice(-(tgLast.length + 1)) === ' ' + tgLast\n        ) {\n          titleTailGenre = tg;\n          break;\n        }\n      }\n    }\n    // Title ending in a genre word (\"\u2026 Ethiopian Jazz\", \"\u2026 World Jazz\")\n    // owns session intent over country tags. Otherwise country-in-graph wins\n    // (\"\u2026 Music of Mali\", \"\u2026 Urban Mali\").\n    var primaryKind = '';\n    var primaryCountry = '';\n    var primaryRegion = '';\n    if (titleTailGenre) {\n      primaryKind = 'genre';\n      genres = genres.slice();\n      var tix = genres.indexOf(titleTailGenre);\n      if (tix > 0) {\n        genres.splice(tix, 1);\n        genres.unshift(titleTailGenre);\n      } else if (tix === -1) {\n        genres.unshift(titleTailGenre);\n      }\n    } else if (countries.length) {\n      primaryKind = 'country';\n      primaryCountry = countries[0];\n    } else if (regions.length) {\n      primaryKind = 'region';\n      primaryRegion = regions[0];\n    } else if (genres.length) {\n      primaryKind = 'genre';\n    } else if (artists.length) {\n      primaryKind = 'artist';\n    }\n    updateFocus({\n      artists: artists,\n      genres: genres,\n      handles: handles,\n      primaryKind: primaryKind,\n      primaryCountry: primaryCountry,\n      primaryRegion: primaryRegion,\n      q: query || ''\n    });\n    if (payload.handle) updateUEmbFromHandle(payload.handle);\n  }\n\n  function topEntityIds(prefs, limit, kinds) {\n    var pairs = [];\n    var allow = kinds || null;\n    Object.keys(prefs || {}).forEach(function (id) {\n      if (allow) {\n        var kind = id.split(':')[0];\n        if (allow.indexOf(kind) === -1) return;\n      }\n      pairs.push({ id: id, w: prefs[id] || 0 });\n    });\n    pairs.sort(function (a, b) {\n      return b.w - a.w;\n    });\n    return pairs.slice(0, limit || 8).map(function (p) {\n      return p.id;\n    });\n  }\n\n  /** True when lean/committed \u2014 field is the sole ranking brain (no entity/focus mix). */\n  function fieldOwnsRanking() {\n    try {\n      if (!window.wmnIntentField) return false;\n      if (typeof window.wmnIntentField.ownsRanking === 'function') {\n        return !!window.wmnIntentField.ownsRanking();\n      }\n      if (typeof window.wmnIntentField.getMode !== 'function') return false;\n      var m = window.wmnIntentField.getMode();\n      return m === 'lean' || m === 'committed';\n    } catch (e) {\n      return false;\n    }\n  }\n\n  /**\n   * Discover For-you should use the intent field whenever it has energy nodes,\n   * not only lean/committed. A single pasted \"cuba\" settle stays explore but\n   * still injects genre/product nodes \u2014 ignoring them freezes seed order.\n   */\n  function fieldHasRankableEnergy() {\n    if (fieldOwnsRanking()) return true;\n    try {\n      if (\n        !window.wmnIntentField ||\n        typeof window.wmnIntentField.getField !== 'function'\n      ) {\n        return false;\n      }\n      var f = window.wmnIntentField.getField();\n      return !!(f && f.nodes && Object.keys(f.nodes).length > 0);\n    } catch (e) {\n      return false;\n    }\n  }\n\n  function scoreHandle(handle) {\n    if (!handle) return 0;\n    // One brain: when field owns lean/committed, don't also apply entity+focus.\n    if (\n      fieldOwnsRanking() &&\n      window.wmnIntentField &&\n      typeof window.wmnIntentField.scoreHandle === 'function'\n    ) {\n      try {\n        return window.wmnIntentField.scoreHandle(handle);\n      } catch (eField) {\n        /* fall through */\n      }\n    }\n    return scoreHandleEntities(handle, null);\n  }\n\n  /**\n   * Session focus primary for collection algorithm \u2014 mirrors scoreCatalogForYou\n   * so leftover Mali/imprint mass cannot drown a typed genre interest.\n   * Falls back to intent-field primary when focus has no lane yet.\n   */\n  function collectionFocusPrimary() {\n    var focus = readFocus();\n    var genre =\n      (focus &&\n        (focus.primaryGenre || (focus.genres && focus.genres[0]))) ||\n      '';\n    var country = (focus && focus.primaryCountry) || '';\n    var region = (focus && focus.primaryRegion) || '';\n    var kind = (focus && focus.primaryKind) || '';\n    if (!kind) {\n      if (country) kind = 'country';\n      else if (region) kind = 'region';\n      else if (genre) kind = 'genre';\n      else if (\n        focus &&\n        (focus.primaryArtist || (focus.artists && focus.artists[0]))\n      ) {\n        kind = 'artist';\n      }\n    }\n    if (\n      genre &&\n      kind !== 'country' &&\n      kind !== 'region' &&\n      kind !== 'genre'\n    ) {\n      kind = 'genre';\n    }\n    var dominant =\n      (kind === 'genre' && !!genre) ||\n      (kind === 'country' && !!country) ||\n      (kind === 'region' && !!region);\n\n    // Ghost shows focus.q (\"indian classical raga\") even when primaryGenre was\n    // never set \u2014 resolve the query so Store For you matches the placeholder.\n    if (\n      !dominant &&\n      focus &&\n      focus.q &&\n      graphReady() &&\n      typeof window.wmnCatalogGraph.linkQuery === 'function'\n    ) {\n      try {\n        var linked = window.wmnCatalogGraph.linkQuery(String(focus.q)) || [];\n        var li;\n        for (li = 0; li < linked.length; li++) {\n          var row = linked[li];\n          if (!row || !row.id) continue;\n          if ((row.score || 0) < 50) continue;\n          var qp = String(row.id).split(':');\n          if (qp[0] === 'genre' && qp[1]) {\n            return {\n              focus: focus,\n              kind: 'genre',\n              genre: qp[1],\n              country: '',\n              region: '',\n              dominant: true\n            };\n          }\n          if (qp[0] === 'country' && qp[1]) {\n            return {\n              focus: focus,\n              kind: 'country',\n              genre: '',\n              country: qp[1],\n              region: '',\n              dominant: true\n            };\n          }\n          if (qp[0] === 'region' && qp[1]) {\n            return {\n              focus: focus,\n              kind: 'region',\n              genre: '',\n              country: '',\n              region: qp[1],\n              dominant: true\n            };\n          }\n        }\n      } catch (eQ) {\n        /* ignore */\n      }\n    }\n\n    // Ghost / focus.q can say \"indian classical raga\" while lean field still\n    // ranks Jazz \u2014 prefer an explicit focus genre. If focus is empty, adopt\n    // the field primary so typed settles still drive Store For you.\n    if (!dominant && fieldHasRankableEnergy()) {\n      try {\n        var pi =\n          window.wmnIntentField &&\n          typeof window.wmnIntentField.primaryIntent === 'function'\n            ? window.wmnIntentField.primaryIntent()\n            : null;\n        if (pi && pi.id) {\n          var parts = String(pi.id).split(':');\n          if (parts[0] === 'genre' && parts[1]) {\n            return {\n              focus: focus,\n              kind: 'genre',\n              genre: parts[1],\n              country: '',\n              region: '',\n              dominant: true\n            };\n          }\n          if (parts[0] === 'country' && parts[1]) {\n            return {\n              focus: focus,\n              kind: 'country',\n              genre: '',\n              country: parts[1],\n              region: '',\n              dominant: true\n            };\n          }\n          if (parts[0] === 'region' && parts[1]) {\n            return {\n              focus: focus,\n              kind: 'region',\n              genre: '',\n              country: '',\n              region: parts[1],\n              dominant: true\n            };\n          }\n        }\n      } catch (ePi) {\n        /* ignore */\n      }\n    }\n\n    return {\n      focus: focus,\n      kind: kind,\n      genre: genre,\n      country: country,\n      region: region,\n      dominant: dominant\n    };\n  }\n\n  function collectionScoreCtx() {\n    var prim = collectionFocusPrimary();\n    var store = readStore();\n    return {\n      prefs: getEntityPrefs(),\n      focus: prim.focus,\n      negatives: store.negatives || {},\n      dampGeoPrefs: prim.dominant\n    };\n  }\n\n  /**\n   * Country/region interest also matches bridge genres (homepage\n   * COUNTRY_GENRE_BRIDGES / REGION_GENRE_BRIDGES) so India focus finds\n   * indian-classical-raga / bollywood albums that lack c:india.\n   * @returns {'tag'|'bridge'|''}\n   */\n  function collectionFocusMatchKind(handle, prim) {\n    if (!handle || !prim || !prim.dominant || !graphReady()) return '';\n    var resolved = window.wmnCatalogGraph.resolveProduct(handle) || {};\n    var genres = resolved.genres || [];\n    var i;\n    if (prim.kind === 'genre' && prim.genre) {\n      if (genres.indexOf(prim.genre) !== -1) return 'tag';\n      var focusGenres = (prim.focus && prim.focus.genres) || [];\n      for (i = 0; i < focusGenres.length; i++) {\n        if (focusGenres[i] && genres.indexOf(focusGenres[i]) !== -1) {\n          return 'bridge';\n        }\n      }\n      return '';\n    }\n    if (prim.kind === 'country' && prim.country) {\n      if ((resolved.countries || []).indexOf(prim.country) !== -1) {\n        return 'tag';\n      }\n      var cBridges = COUNTRY_GENRE_BRIDGES[prim.country] || [];\n      for (i = 0; i < cBridges.length; i++) {\n        if (cBridges[i] && genres.indexOf(cBridges[i]) !== -1) return 'bridge';\n      }\n      return '';\n    }\n    if (prim.kind === 'region' && prim.region) {\n      if ((resolved.regions || []).indexOf(prim.region) !== -1) return 'tag';\n      var rBridges = REGION_GENRE_BRIDGES[prim.region] || [];\n      for (i = 0; i < rBridges.length; i++) {\n        if (rBridges[i] && genres.indexOf(rBridges[i]) !== -1) return 'bridge';\n      }\n      return '';\n    }\n    return '';\n  }\n\n  function productMatchesCollectionFocus(handle, prim) {\n    return !!collectionFocusMatchKind(handle, prim);\n  }\n\n  /**\n   * Hard latch so the current focus lane outranks residual imprint/entity mass\n   * on collection pages (FOCUS_GENRE_BONUS alone loses to country:mali \u00D7 1.4).\n   * Tag/country match = +480; bridge-only / secondary genre = +300.\n   */\n  function collectionFocusLatch(handle, prim) {\n    if (!handle || !prim || !prim.dominant || !graphReady()) return 0;\n    var kind = collectionFocusMatchKind(handle, prim);\n    if (kind === 'tag') return 480;\n    if (kind === 'bridge') return 300;\n    return -60;\n  }\n\n  function collectionInterestWarm() {\n    var prim = collectionFocusPrimary();\n    if (prim && prim.dominant) return true;\n    return fieldHasRankableEnergy();\n  }\n\n  /**\n   * Build a focus object scoreCatalogForYou understands from Store primary\n   * (includes ghost/linkQuery + intent-field fallbacks).\n   */\n  function focusFromCollectionPrimary(prim) {\n    if (!prim || !prim.dominant) return null;\n    var base = prim.focus ? Object.assign({}, prim.focus) : Object.assign({}, readFocus() || {});\n    base.primaryKind = prim.kind;\n    if (prim.kind === 'genre' && prim.genre) {\n      base.primaryGenre = prim.genre;\n      var gList = [prim.genre];\n      var prev = base.genres || [];\n      var gi;\n      for (gi = 0; gi < prev.length; gi++) {\n        if (prev[gi] && prev[gi] !== prim.genre) gList.push(prev[gi]);\n      }\n      base.genres = gList;\n    } else if (prim.kind === 'country' && prim.country) {\n      base.primaryCountry = prim.country;\n    } else if (prim.kind === 'region' && prim.region) {\n      base.primaryRegion = prim.region;\n    }\n    return base;\n  }\n\n  /** Detached SSR thumbnails so For you can paint/restore the matrix. */\n  var collectionSsrStash =\n    typeof WeakMap !== 'undefined' ? new WeakMap() : null;\n\n  function ensureCollectionSsrStash(container) {\n    if (!container || !collectionSsrStash) return null;\n    var existing = collectionSsrStash.get(container);\n    if (existing) return existing;\n    var nodes = Array.prototype.slice.call(\n      container.querySelectorAll('.thumbnail[data-wmn-handle]')\n    );\n    var loadMore = container.querySelector('.js-load-more, .load-more');\n    var stash = {\n      nodes: nodes,\n      pageSize: nodes.length > 0 ? nodes.length : 24,\n      loadMore: loadMore || null\n    };\n    collectionSsrStash.set(container, stash);\n    container.setAttribute('data-wmn-fy-page-size', String(stash.pageSize));\n    return stash;\n  }\n\n  function clearCollectionForYouPaint(container) {\n    if (!container) return;\n    var painted = container.querySelectorAll(\n      '.thumbnail[data-wmn-fy-paint=\"1\"]'\n    );\n    var i;\n    for (i = 0; i < painted.length; i++) {\n      if (painted[i].parentNode) painted[i].parentNode.removeChild(painted[i]);\n    }\n    container.removeAttribute('data-wmn-fy-painted');\n    clearCollectionInterestInjects(container);\n  }\n\n  function restoreCollectionSsr(container) {\n    if (!container || !collectionSsrStash) return false;\n    var stash = collectionSsrStash.get(container);\n    if (!stash || !stash.nodes || !stash.nodes.length) return false;\n    clearCollectionForYouPaint(container);\n    var current = container.querySelectorAll('.thumbnail[data-wmn-handle]');\n    for (var i = 0; i < current.length; i++) {\n      if (current[i].parentNode) current[i].parentNode.removeChild(current[i]);\n    }\n    var frag = document.createDocumentFragment();\n    for (i = 0; i < stash.nodes.length; i++) {\n      frag.appendChild(stash.nodes[i]);\n    }\n    if (stash.loadMore) frag.appendChild(stash.loadMore);\n    container.appendChild(frag);\n    container.removeAttribute('data-wmn-aff-sorted');\n    return true;\n  }\n\n  /**\n   * Paint Store collection matrix from shared scoreCatalogForYou ranking.\n   * ?page=N slices the ranked pool (page size = SSR page size).\n   * Prefer-lane matches lead; remainder is score-ordered fill so Shopify's\n   * multi-page pagination never paints a blank grid.\n   */\n  function paintCollectionForYouMatrix(container) {\n    if (!container || !wantsAlgorithmCollectionSort()) return false;\n    // A chip already narrowed this page. Rank those albums; don't swap in the whole catalog.\n    if (collectionTagFilterActive()) return false;\n    if (!graphReady() || !collectionInterestWarm()) return false;\n\n    var prim = collectionFocusPrimary();\n    var focusOverride = focusFromCollectionPrimary(prim);\n    var stash = ensureCollectionSsrStash(container);\n    var pageSize =\n      (stash && stash.pageSize) ||\n      parseInt(container.getAttribute('data-wmn-fy-page-size') || '24', 10) ||\n      24;\n    var page = collectionPageNumber();\n    var data =\n      window.wmnCatalogGraph.getData && window.wmnCatalogGraph.getData();\n    var products = (data && data.products) || {};\n    var catalogN = Object.keys(products).length || 0;\n    // Need enough ranked handles for this page (and a buffer). Prefer the\n    // whole catalog so every Shopify page index has a slice.\n    var need = page * pageSize;\n    var lim = Math.max(need, pageSize * 2, catalogN || 48);\n    if (lim > 600) lim = 600;\n\n    var fy = scoreCatalogForYou({\n      limit: lim,\n      explore: false,\n      pinRecent: false,\n      fillToLimit: true,\n      focus: focusOverride || undefined\n    });\n    if (!fy || !fy.picks || !fy.picks.length) return false;\n\n    var slice = sliceRankedForPage(fy.picks, page, pageSize);\n    // Past end of ranked pool: restore SSR rather than wiping the grid blank.\n    if (!slice.length) {\n      try {\n        restoreCollectionSsr(container);\n      } catch (eRestEmpty) {\n        /* ignore */\n      }\n      return false;\n    }\n\n    var key =\n      'paint::' +\n      collectionInterestKey(prim) +\n      '::p' +\n      page +\n      '::' +\n      slice\n        .map(function (p) {\n          return p.handle;\n        })\n        .join('|');\n    if (container.getAttribute('data-wmn-fy-painted') === key) {\n      return true;\n    }\n\n    var sample =\n      (stash && stash.nodes && stash.nodes[0]) ||\n      container.querySelector('.thumbnail[data-wmn-handle]');\n    var className = 'thumbnail';\n    if (sample && sample.className) {\n      className = String(sample.className || '')\n        .replace(/\\bwmn-memory-search-card\\b/g, '')\n        .replace(/\\bwmn-interest-card\\b/g, '')\n        .replace(/\\beven\\b/g, '')\n        .replace(/\\bodd\\b/g, '')\n        .replace(/\\s+/g, ' ')\n        .trim();\n    }\n\n    // Detach SSR once, then replace contents with ranked slice.\n    if (stash && stash.nodes) {\n      for (var di = 0; di < stash.nodes.length; di++) {\n        if (stash.nodes[di].parentNode) {\n          stash.nodes[di].parentNode.removeChild(stash.nodes[di]);\n        }\n      }\n    }\n    clearCollectionForYouPaint(container);\n    var leftover = container.querySelectorAll('.thumbnail[data-wmn-handle]');\n    for (var li = 0; li < leftover.length; li++) {\n      if (leftover[li].parentNode) {\n        leftover[li].parentNode.removeChild(leftover[li]);\n      }\n    }\n\n    var frag = document.createDocumentFragment();\n    var si;\n    for (si = 0; si < slice.length; si++) {\n      var pick = slice[si];\n      if (!pick || !pick.handle) continue;\n      var p = products[pick.handle] || {};\n      var genreLabels = [];\n      var gs = pick.genres || p.g || [];\n      var gi;\n      for (gi = 0; gi < gs.length && genreLabels.length < 2; gi++) {\n        genreLabels.push(humanizeSlug(gs[gi]));\n      }\n      var priceText = '';\n      if (stash && stash.nodes) {\n        var spi;\n        for (spi = 0; spi < stash.nodes.length; spi++) {\n          if (stash.nodes[spi].getAttribute('data-wmn-handle') !== pick.handle) continue;\n          var priceEl = stash.nodes[spi].querySelector('.price');\n          if (priceEl) {\n            var priceClone = priceEl.cloneNode(true);\n            var wasPrice = priceClone.querySelector('.was_price');\n            if (wasPrice && wasPrice.parentNode) wasPrice.parentNode.removeChild(wasPrice);\n            priceText = (priceClone.textContent || '').replace(/\\s+/g, ' ').trim();\n          }\n          break;\n        }\n      }\n      var ev = {\n        h: pick.handle,\n        title: pick.title || p.t || pick.handle,\n        img: pick.image || p.img || '',\n        price: priceText,\n        tags: []\n      };\n      var card = buildSearchMemoryCard(ev, className, {\n        eager: true,\n        collection: true,\n        genres: genreLabels\n      });\n      if (!card) continue;\n      card.className = className + ' wmn-memory-search-card';\n      card.setAttribute('data-wmn-fy-paint', '1');\n      card.setAttribute('data-wmn-genres', genreLabels.join('|'));\n      frag.appendChild(card);\n    }\n    var loadMore =\n      (stash && stash.loadMore) ||\n      container.querySelector('.js-load-more, .load-more');\n    container.appendChild(frag);\n    if (loadMore && loadMore.parentNode !== container) {\n      container.appendChild(loadMore);\n    } else if (loadMore) {\n      container.appendChild(loadMore);\n    }\n    container.setAttribute('data-wmn-fy-painted', key);\n    container.setAttribute('data-wmn-aff-sorted', 'algo::' + key);\n    nudgeStuckLazyImages(container);\n    hydrateCollectionPrices(container);\n    syncCollectionSortSelect(true);\n    rememberFyPage(\n      page,\n      slice.map(function (p) {\n        return p.handle;\n      })\n    );\n    return true;\n  }\n\n  var collectionPriceCache = {};\n\n  function centsFromJsPrice(raw) {\n    if (typeof raw !== 'number' || !isFinite(raw) || raw <= 0) return null;\n    if (raw !== Math.floor(raw)) return Math.round(raw * 100);\n    return Math.round(raw);\n  }\n\n  function moneyFromCents(cents) {\n    if (!(cents > 0)) return '';\n    try {\n      if (window.wmnMoney && typeof window.wmnMoney.formatCents === 'function') {\n        return window.wmnMoney.formatCents(cents);\n      }\n    } catch (e) {\n      /* fall through */\n    }\n    try {\n      if (window.Shopify && typeof window.Shopify.formatMoney === 'function') {\n        var fmt =\n          (document.body && document.body.getAttribute('data-money-format')) ||\n          '\u00A3{{amount}}';\n        return window.Shopify.formatMoney(cents, fmt);\n      }\n    } catch (e2) {\n      /* fall through */\n    }\n    return '\u00A3' + (cents / 100).toFixed(2);\n  }\n\n  function writeCardPrice(card, label) {\n    if (!card || !label) return;\n    var caption = card.querySelector('.product-info__caption');\n    if (!caption || caption.querySelector('.price')) return;\n    var span = document.createElement('span');\n    span.className = 'price';\n    span.textContent = label;\n    caption.appendChild(span);\n  }\n\n  function hydrateCollectionPrices(root) {\n    if (!root || typeof fetch !== 'function') return;\n    var cards = root.querySelectorAll('.thumbnail[data-wmn-handle]');\n    var i;\n    for (i = 0; i < cards.length; i++) {\n      (function (card) {\n        if (card.querySelector('.price')) return;\n        var handle = card.getAttribute('data-wmn-handle');\n        if (!handle) return;\n        if (collectionPriceCache[handle]) {\n          writeCardPrice(card, collectionPriceCache[handle]);\n          return;\n        }\n        var rootPath =\n          window.Shopify && window.Shopify.routes && window.Shopify.routes.root\n            ? window.Shopify.routes.root\n            : '/';\n        fetch(rootPath + 'products/' + encodeURIComponent(handle) + '.js', {\n          credentials: 'same-origin'\n        })\n          .then(function (res) {\n            return res && res.ok ? res.json() : null;\n          })\n          .then(function (product) {\n            if (!product) return;\n            var min = centsFromJsPrice(\n              product.price_min != null ? product.price_min : product.price\n            );\n            var max = centsFromJsPrice(\n              product.price_max != null ? product.price_max : product.price\n            );\n            if (!min) return;\n            var label = moneyFromCents(min);\n            if (!label) return;\n            if (product.price_varies || (max && max > min)) label = 'from ' + label;\n            collectionPriceCache[handle] = label;\n            var live = root.querySelector(\n              '.thumbnail[data-wmn-handle=\"' + handle.replace(/\"/g, '') + '\"]'\n            );\n            writeCardPrice(live || card, label);\n          })\n          .catch(function () {\n            /* price stays off the card */\n          });\n      })(cards[i]);\n    }\n  }\n\n  function collectionInterestKey(prim) {\n    if (!prim || !prim.dominant) return '';\n    return (\n      prim.kind +\n      ':' +\n      (prim.genre || prim.country || prim.region || '')\n    );\n  }\n\n  function collectionInterestHandles(prim, limit) {\n    if (!prim || !prim.dominant || !graphReady() || !(limit > 0)) return [];\n    var data =\n      window.wmnCatalogGraph.getData && window.wmnCatalogGraph.getData();\n    if (!data || !data.products) return [];\n    var pool = [];\n    var handles = Object.keys(data.products);\n    var i;\n    for (i = 0; i < handles.length; i++) {\n      if (productMatchesCollectionFocus(handles[i], prim)) {\n        pool.push(handles[i]);\n      }\n    }\n    pool.sort(function (a, b) {\n      var sa = collectionFocusLatch(a, prim);\n      var sb = collectionFocusLatch(b, prim);\n      try {\n        if (\n          window.wmnIntentField &&\n          typeof window.wmnIntentField.scoreHandle === 'function'\n        ) {\n          sa += window.wmnIntentField.scoreHandle(a) || 0;\n          sb += window.wmnIntentField.scoreHandle(b) || 0;\n        }\n      } catch (eSc) {\n        /* ignore */\n      }\n      if (sb !== sa) return sb - sa;\n      return a < b ? -1 : a > b ? 1 : 0;\n    });\n    return pool.slice(0, limit);\n  }\n\n  function clearCollectionInterestInjects(container) {\n    if (!container) return;\n    var nodes = container.querySelectorAll(\n      '.thumbnail[data-wmn-interest-card=\"1\"]'\n    );\n    var i;\n    for (i = 0; i < nodes.length; i++) {\n      if (nodes[i].parentNode) nodes[i].parentNode.removeChild(nodes[i]);\n    }\n    container.removeAttribute('data-wmn-interest-injected');\n  }\n\n  /**\n   * Shopify collection pages only ship ~24 cards. If interest is Indian\n   * Classical but page 1 is A\u2013Z Jazz/Blues, reorder alone cannot help \u2014\n   * inject graph matches so For you can actually show the interest.\n   * Page 2+ must stay native pagination \u2014 never re-pin the same injects.\n   */\n  function collectionPageNumber() {\n    try {\n      var params = new URLSearchParams(window.location.search || '');\n      var p = parseInt(params.get('page') || '1', 10);\n      if (!isFinite(p) || p < 1) return 1;\n      return p;\n    } catch (ePage) {\n      return 1;\n    }\n  }\n\n  var FY_SHOWN_KEY = 'wmn_fy_shown_v1';\n\n  function readFyShown() {\n    if (window.__wmnFyShown && typeof window.__wmnFyShown === 'object') {\n      return window.__wmnFyShown;\n    }\n    var data = {};\n    try {\n      data = JSON.parse(sessionStorage.getItem(FY_SHOWN_KEY) || '{}') || {};\n    } catch (eShown) {\n      data = {};\n    }\n    if (!data || typeof data !== 'object') data = {};\n    window.__wmnFyShown = data;\n    return data;\n  }\n\n  function rememberFyPage(page, handles) {\n    var all = readFyShown();\n    var list = [];\n    var seen = {};\n    var i;\n    for (i = 0; i < (handles || []).length; i++) {\n      var h = handles[i];\n      if (!h || seen[h]) continue;\n      seen[h] = true;\n      list.push(h);\n    }\n    all[String(page)] = list;\n    var key;\n    for (key in all) {\n      if (!Object.prototype.hasOwnProperty.call(all, key)) continue;\n      if (parseInt(key, 10) > page) delete all[key];\n    }\n    window.__wmnFyShown = all;\n    try {\n      sessionStorage.setItem(FY_SHOWN_KEY, JSON.stringify(all));\n    } catch (eWrite) {\n      /* ignore */\n    }\n  }\n\n  function fyHandlesBeforePage(page) {\n    var all = readFyShown();\n    var set = {};\n    var p;\n    for (p = 1; p < page; p++) {\n      var list = all[String(p)] || [];\n      var i;\n      for (i = 0; i < list.length; i++) {\n        if (list[i]) set[list[i]] = true;\n      }\n    }\n    return set;\n  }\n\n  /**\n   * Page 1 is the top of the ranking. Later pages skip albums already shown\n   * on earlier pages (including ones the live reorder swapped in). A direct\n   * visit to page 2 with no memory still uses the numeric offset.\n   */\n  function sliceRankedForPage(picks, page, pageSize) {\n    var prior = fyHandlesBeforePage(page);\n    var priorN = 0;\n    var k;\n    for (k in prior) {\n      if (Object.prototype.hasOwnProperty.call(prior, k)) priorN++;\n    }\n    var out = [];\n    var i;\n    if (priorN) {\n      for (i = 0; i < picks.length && out.length < pageSize; i++) {\n        var pick = picks[i];\n        if (!pick || !pick.handle || prior[pick.handle]) continue;\n        out.push(pick);\n      }\n      return out;\n    }\n    var start = (page - 1) * pageSize;\n    return picks.slice(start, start + pageSize);\n  }\n\n  function injectCollectionInterestMatches(container) {\n    if (!container || !wantsAlgorithmCollectionSort()) return 0;\n    if (collectionTagFilterActive()) return 0;\n    if (!graphReady()) return 0;\n    // Only seed the first collection page. Re-injecting on ?page=2+ made the\n    // same interest albums lead every page.\n    if (collectionPageNumber() > 1) {\n      clearCollectionInterestInjects(container);\n      return 0;\n    }\n    var prim = collectionFocusPrimary();\n    if (!prim.dominant) {\n      clearCollectionInterestInjects(container);\n      return 0;\n    }\n    var key = collectionInterestKey(prim);\n    if (!key) return 0;\n\n    var existing = {};\n    var onPageMatches = 0;\n    var nodes = container.querySelectorAll('.thumbnail[data-wmn-handle]');\n    var i;\n    for (i = 0; i < nodes.length; i++) {\n      var h = nodes[i].getAttribute('data-wmn-handle');\n      if (!h) continue;\n      existing[h] = true;\n      if (\n        !nodes[i].getAttribute('data-wmn-interest-card') &&\n        productMatchesCollectionFocus(h, prim)\n      ) {\n        onPageMatches += 1;\n      }\n    }\n\n    if (container.getAttribute('data-wmn-interest-injected') !== key) {\n      clearCollectionInterestInjects(container);\n    } else if (onPageMatches >= COLLECTION_INTEREST_INJECT) {\n      return 0;\n    } else if (container.querySelector('.thumbnail[data-wmn-interest-card=\"1\"]')) {\n      // Already injected for this interest; keep cards, just re-rank later.\n      return 0;\n    }\n\n    var need = Math.max(0, COLLECTION_INTEREST_INJECT - onPageMatches);\n    if (need <= 0) {\n      container.setAttribute('data-wmn-interest-injected', key);\n      return 0;\n    }\n\n    var sample = container.querySelector(\n      '.thumbnail[data-wmn-handle]:not([data-wmn-injected])'\n    );\n    if (!sample) {\n      sample = container.querySelector('.thumbnail[data-wmn-handle]');\n    }\n    if (!sample) return 0;\n    var className = String(sample.className || '')\n      .replace(/\\bwmn-memory-search-card\\b/g, '')\n      .replace(/\\bwmn-interest-card\\b/g, '')\n      .replace(/\\beven\\b/g, '')\n      .replace(/\\bodd\\b/g, '')\n      .replace(/\\s+/g, ' ')\n      .trim();\n\n    var data = window.wmnCatalogGraph.getData();\n    var candidates = collectionInterestHandles(prim, need + 6);\n    var inserted = 0;\n    var first = container.querySelector('.thumbnail[data-wmn-handle]');\n    for (i = 0; i < candidates.length && inserted < need; i++) {\n      var handle = candidates[i];\n      if (existing[handle]) continue;\n      var p = data.products[handle];\n      if (!p) continue;\n      var genreLabels = [];\n      var gs = p.g || [];\n      var gi;\n      for (gi = 0; gi < gs.length && genreLabels.length < 2; gi++) {\n        genreLabels.push(humanizeSlug(gs[gi]));\n      }\n      var ev = {\n        h: handle,\n        title: p.t || handle,\n        img: p.img || '',\n        price: '',\n        tags: []\n      };\n      var card = buildSearchMemoryCard(ev, className, {\n        eager: true,\n        collection: true,\n        genres: genreLabels\n      });\n      if (!card) continue;\n      card.className = className + ' wmn-memory-search-card';\n      card.setAttribute('data-wmn-interest-card', '1');\n      card.setAttribute('data-wmn-genres', genreLabels.join('|'));\n      if (first && first.parentNode === container) {\n        container.insertBefore(card, first);\n      } else {\n        container.appendChild(card);\n      }\n      existing[handle] = true;\n      inserted += 1;\n    }\n    container.setAttribute('data-wmn-interest-injected', key);\n    if (inserted) {\n      nudgeStuckLazyImages(container);\n      hydrateCollectionPrices(container);\n    }\n    return inserted;\n  }\n\n  /**\n   * Entity + focus expected utility for a handle (no intent-field takeover).\n   * Used by scoreCatalogForYou \u2014 country/region at ENTITY_SCORE_WEIGHT.\n   * @param {string} handle\n   * @param {{prefs?: object, focus?: object|null, negatives?: object}|null} ctx\n   */\n  function scoreHandleEntities(handle, ctx) {\n    if (!handle) return 0;\n    var prefs = (ctx && ctx.prefs) || getEntityPrefs();\n    var negatives = (ctx && ctx.negatives) || (readStore().negatives || {});\n    var score = 0;\n    var productKey = 'product:' + handle;\n    var pw = prefs[productKey];\n    if (pw) {\n      score += HANDLE_BONUS + pw * 2 * (ENTITY_SCORE_WEIGHT.product || 0.6);\n    }\n    var resolved = {\n      artists: [],\n      genres: [],\n      countries: [],\n      regions: [],\n      imprints: []\n    };\n    if (graphReady()) {\n      resolved = window.wmnCatalogGraph.resolveProduct(handle) || resolved;\n      var ai;\n      for (ai = 0; ai < (resolved.artists || []).length; ai++) {\n        var aw = prefs['artist:' + resolved.artists[ai]];\n        if (aw) score += aw * (ENTITY_SCORE_WEIGHT.artist || 1);\n      }\n      for (ai = 0; ai < (resolved.genres || []).length; ai++) {\n        var gw = prefs['genre:' + resolved.genres[ai]];\n        if (gw) score += gw * (ENTITY_SCORE_WEIGHT.genre || 1);\n      }\n      // When session is genre-dominant, ignore cold country/region mass so\n      // leftover Mali/India prefs cannot outrank Jazz/Blues matches.\n      var dampGeo = !!(ctx && ctx.dampGeoPrefs);\n      for (ai = 0; ai < (resolved.countries || []).length; ai++) {\n        var cslug = resolved.countries[ai];\n        if (!cslug || cslug === 'celtic') continue;\n        var cw = prefs['country:' + cslug];\n        if (cw && !dampGeo) score += cw * (ENTITY_SCORE_WEIGHT.country || 1.4);\n      }\n      for (ai = 0; ai < (resolved.regions || []).length; ai++) {\n        var rslug = resolved.regions[ai];\n        if (!rslug) continue;\n        var rw = prefs['region:' + rslug];\n        if (rw && !dampGeo) score += rw * (ENTITY_SCORE_WEIGHT.region || 1.4);\n      }\n      for (ai = 0; ai < (resolved.imprints || []).length; ai++) {\n        var iw = prefs['imprint:' + resolved.imprints[ai]];\n        if (iw) score += iw * (ENTITY_SCORE_WEIGHT.imprint || 0.5);\n      }\n    }\n\n    var focus = ctx && Object.prototype.hasOwnProperty.call(ctx, 'focus')\n      ? ctx.focus\n      : readFocus();\n    if (focus) {\n      var age = now() - (focus.t || 0);\n      var decayF = Math.max(0.35, 1 - age / FOCUS_TTL_MS);\n      var fi;\n      if (focus.handles && focus.handles.indexOf(handle) !== -1) {\n        score += FOCUS_HANDLE_BONUS * decayF;\n      }\n      for (fi = 0; fi < (resolved.artists || []).length; fi++) {\n        if (focus.artists && focus.artists.indexOf(resolved.artists[fi]) !== -1) {\n          score += FOCUS_ARTIST_BONUS * decayF;\n        }\n      }\n      for (fi = 0; fi < (resolved.genres || []).length; fi++) {\n        if (focus.genres && focus.genres.indexOf(resolved.genres[fi]) !== -1) {\n          score += FOCUS_GENRE_BONUS * decayF;\n        }\n      }\n    }\n\n    var neg = negatives[handle] || 0;\n    if (neg > 0) score -= NEG_GAMMA * neg;\n    // Soft artist demotion from skips (does not erase country mass).\n    if (resolved.artists && resolved.artists.length) {\n      var soft =\n        negatives['artist-soft:' + resolved.artists[0]] || 0;\n      if (soft > 0) score -= NEG_GAMMA * soft;\n    }\n    return score;\n  }\n\n  /** Softmax-style L1 mass of entity posteriors (for explore anneal). */\n  function prefsL1(prefs) {\n    var s = 0;\n    var k;\n    for (k in prefs || {}) {\n      if (Object.prototype.hasOwnProperty.call(prefs, k)) {\n        s += Math.max(0, prefs[k] || 0);\n      }\n    }\n    return s;\n  }\n\n  /** Mulberry32 \u2014 deterministic explore when opts.seed is set. */\n  function makeRng(seed) {\n    var t = (seed >>> 0) || 1;\n    return function () {\n      t += 0x6d2b79f5;\n      var r = Math.imul(t ^ (t >>> 15), 1 | t);\n      r ^= r + Math.imul(r ^ (r >>> 7), 61 | r);\n      return ((r ^ (r >>> 14)) >>> 0) / 4294967296;\n    };\n  }\n\n  /**\n   * Annealed Thompson-ish explore noise. Shrinks as ||\u03B1||\u2081 grows.\n   */\n  function exploreNoise(prefsNorm, rng) {\n    var kappa = EXPLORE_KAPPA0 / (1 + prefsNorm / EXPLORE_TAU);\n    // Centered Beta(2,2)-ish via two uniforms (mild, not chaotic).\n    var u = rng();\n    var v = rng();\n    var betaish = (u + v) / 2;\n    return kappa * (2 * betaish - 1);\n  }\n\n  /**\n   * Record a skip / soft-negative on a product handle (Phase 1 store).\n   * Soft-demotes primary artist slightly so one skip does not erase a country.\n   */\n  function recordSkipNegative(handle, amount) {\n    if (!handle) return;\n    var store = readStore();\n    store.negatives = store.negatives || {};\n    var add = amount == null ? 0.5 : amount;\n    store.negatives[handle] = (store.negatives[handle] || 0) + add;\n    if (graphReady() && add > 0) {\n      var resolved = window.wmnCatalogGraph.resolveProduct(handle);\n      var artist = resolved && resolved.artists && resolved.artists[0];\n      if (artist && artist !== 'various' && artist !== 'various-artists') {\n        var softKey = 'artist-soft:' + artist;\n        store.negatives[softKey] =\n          (store.negatives[softKey] || 0) + add * NEG_ARTIST_SOFT;\n      }\n    }\n    store.negatives = capNegatives(store.negatives);\n    writeStore(store);\n  }\n\n  /** Session dedupe for feed UX \u2192 prefs mapping (Phase 3). */\n  var feedSignalOnce = { hover: {}, visible: {}, skip: {} };\n\n  /**\n   * Thin feed UX \u2192 existing preference paths (NOT a second model).\n   * click \u2192 search_click (~+2.0); hover\u2265500 \u2192 hover; visible \u2192 log only;\n   * skip \u2192 recordSkipNegative + prefs dispatch.\n   */\n  function mergeMeta(base, extra) {\n    var out = {};\n    var k;\n    if (base && typeof base === 'object') {\n      for (k in base) {\n        if (Object.prototype.hasOwnProperty.call(base, k)) out[k] = base[k];\n      }\n    }\n    if (extra && typeof extra === 'object') {\n      for (k in extra) {\n        if (Object.prototype.hasOwnProperty.call(extra, k)) out[k] = extra[k];\n      }\n    }\n    return out;\n  }\n\n  function recordFeedSignal(opts) {\n    if (!opts || !opts.handle) return;\n    var kind = opts.kind || '';\n    var handle = opts.handle;\n    var dwellMs = opts.dwellMs || 0;\n    var source = opts.source || '';\n    var policyMeta =\n      opts.meta && typeof opts.meta === 'object' ? opts.meta : null;\n    var payload = {\n      handle: handle,\n      title: opts.title || '',\n      artist: opts.artist || '',\n      genres: opts.genres || [],\n      countries: opts.countries || undefined,\n      regions: opts.regions || undefined,\n      meta: policyMeta\n    };\n\n    if (kind === 'visible') {\n      if (feedSignalOnce.visible[handle]) return;\n      feedSignalOnce.visible[handle] = true;\n      // Analytics only \u2014 recordView('visible') early-returns before prefs write\n      payload.kind = 'visible';\n      recordView(payload);\n      return;\n    }\n\n    if (kind === 'hover') {\n      if (dwellMs < 500) return;\n      if (feedSignalOnce.hover[handle]) return;\n      feedSignalOnce.hover[handle] = true;\n      // For You rail hovers are analytics-only \u2014 must NOT steal session focus\n      // from Rough Guides (inspecting a stale India card was flipping subtitle).\n      if (source === 'for-you-feed') {\n        logIntentEvent({\n          type: 'hover',\n          handle: handle,\n          artist: opts.artist || null,\n          dwellMs: dwellMs,\n          meta: mergeMeta({ source: source, soft: true }, policyMeta)\n        });\n        return;\n      }\n      payload.kind = 'hover';\n      recordView(payload);\n      return;\n    }\n\n    if (kind === 'click') {\n      // Strong path \u2014 search_click KIND_WEIGHT 2.0 + geo amplify\n      payload.kind = 'search_click';\n      recordView(payload);\n      return;\n    }\n\n    if (kind === 'skip') {\n      if (feedSignalOnce.skip[handle]) return;\n      feedSignalOnce.skip[handle] = true;\n      var amt = opts.amount == null ? 0.75 : opts.amount;\n      recordSkipNegative(handle, amt);\n      // Skip does not erase country mass; still notify live feed tail rebuild\n      dispatchPrefsUpdated(readStore());\n      logIntentEvent({\n        type: 'skip',\n        handle: handle,\n        artist: opts.artist || null,\n        meta: mergeMeta({ source: source, amount: amt }, policyMeta)\n      });\n    }\n  }\n\n  function itemArtistKey(item) {\n    if (!item) return '';\n    if (item.artist) {\n      var a = handleize(item.artist);\n      if (a && a !== 'various' && a !== 'various-artists') return a;\n    }\n    if (item.handle && graphReady()) {\n      var r = window.wmnCatalogGraph.resolveProduct(item.handle);\n      if (r && r.artists && r.artists[0]) return r.artists[0];\n    }\n    return '';\n  }\n\n  /** Primary country slug for soft MMR (never celtic-as-country). */\n  function itemCountryKey(item) {\n    if (!item || !item.handle || !graphReady()) return '';\n    var r = window.wmnCatalogGraph.resolveProduct(item.handle);\n    var list = (r && r.countries) || [];\n    for (var i = 0; i < list.length; i++) {\n      if (list[i] && list[i] !== 'celtic') return list[i];\n    }\n    return '';\n  }\n\n  function itemGenreKeys(item) {\n    var out = [];\n    if (!item) return out;\n    if (item.handle && graphReady()) {\n      var r = window.wmnCatalogGraph.resolveProduct(item.handle);\n      return (r && r.genres) || [];\n    }\n    return out;\n  }\n\n  /**\n   * Maximal Marginal Relevance\u2013style pick: high score, penalize repeated artists\n   * and (softly) repeated countries (~0.15\u00D7 artist penalty).\n   * opts.skipCountryDiversity \u2014 under country/region session focus, concentrate\n   * on that geo instead of spreading the rail away from it.\n   */\n  function mmrSelect(candidates, n, already, scoreFn, minScore, opts) {\n    var out = [];\n    var used = {};\n    var artistCount = {};\n    var countryCount = {};\n    var floor = minScore == null ? 0.5 : minScore;\n    var skipCountryDiv = !!(opts && opts.skipCountryDiversity);\n    var i;\n    for (i = 0; i < (already || []).length; i++) {\n      if (!already[i] || !already[i].handle) continue;\n      used[already[i].handle] = true;\n      var ak0 = itemArtistKey(already[i]);\n      if (ak0) artistCount[ak0] = (artistCount[ak0] || 0) + 1;\n      var ck0 = itemCountryKey(already[i]);\n      if (ck0) countryCount[ck0] = (countryCount[ck0] || 0) + 1;\n    }\n    var pool = [];\n    for (i = 0; i < (candidates || []).length; i++) {\n      if (candidates[i] && candidates[i].handle && !used[candidates[i].handle]) {\n        pool.push(candidates[i]);\n      }\n    }\n    while (out.length < n && pool.length) {\n      var best = null;\n      var bestIdx = -1;\n      var bestAdj = -Infinity;\n      for (i = 0; i < pool.length; i++) {\n        var c = pool[i];\n        var base = scoreFn(c);\n        if (base < floor) continue;\n        var ak = itemArtistKey(c);\n        var pen = ak ? (artistCount[ak] || 0) * ARTIST_MMR_PENALTY : 0;\n        var ck = itemCountryKey(c);\n        var cpen =\n          !skipCountryDiv && ck\n            ? (countryCount[ck] || 0) * COUNTRY_MMR_PENALTY\n            : 0;\n        var adj = base - pen - cpen;\n        if (adj > bestAdj) {\n          bestAdj = adj;\n          best = c;\n          bestIdx = i;\n        }\n      }\n      if (!best || bestIdx < 0) break;\n      out.push(best);\n      used[best.handle] = true;\n      pool.splice(bestIdx, 1);\n      var akk = itemArtistKey(best);\n      if (akk) artistCount[akk] = (artistCount[akk] || 0) + 1;\n      var ckk = itemCountryKey(best);\n      if (ckk) countryCount[ckk] = (countryCount[ckk] || 0) + 1;\n    }\n    return out;\n  }\n\n  function graphItemFromHandle(handle) {\n    if (!handle || !graphReady()) return null;\n    var data = window.wmnCatalogGraph.getData();\n    var p = data.products[handle];\n    if (!p) return null;\n    var title = p.t || handle;\n    var titleL = String(title).toLowerCase();\n    if (titleL.indexOf('gift voucher') !== -1 || titleL.indexOf('gift card') !== -1) {\n      return null;\n    }\n    var root =\n      window.Shopify && window.Shopify.routes && window.Shopify.routes.root\n        ? window.Shopify.routes.root\n        : '/';\n    var artistName = '';\n    if (p.a && data.artists[p.a]) artistName = data.artists[p.a].n || p.a;\n    var genreLabels = [];\n    if (p.g) {\n      for (var i = 0; i < p.g.length; i++) {\n        var gnode = data.genres[p.g[i]];\n        genreLabels.push(gnode && gnode.n ? gnode.n : p.g[i].replace(/-/g, ' '));\n      }\n    }\n    var img = null;\n    if (typeof window.wmnCatalogGraph.getProductImage === 'function') {\n      img = window.wmnCatalogGraph.getProductImage(handle) || null;\n      if (img === '') img = null;\n    }\n    return {\n      handle: handle,\n      title: title,\n      artist: artistName,\n      url: root + 'products/' + handle,\n      image: img,\n      genres: genreLabels,\n      fromGraph: true\n    };\n  }\n\n  function dispatchPrefsUpdated(store) {\n    try {\n      document.dispatchEvent(\n        new CustomEvent('wmn:preferences-updated', { detail: { store: store } })\n      );\n    } catch (errEvt) {\n      /* ignore */\n    }\n  }\n\n  function getCookieRaw() {\n    try {\n      return String(document['cookie'] || '');\n    } catch (e) {\n      return '';\n    }\n  }\n\n  function readCookie(name) {\n    var parts = getCookieRaw().split(';');\n    var prefix = name + '=';\n    for (var i = 0; i < parts.length; i++) {\n      var p = parts[i].replace(/^\\s+/, '');\n      if (p.indexOf(prefix) === 0) {\n        return decodeURIComponent(p.substring(prefix.length));\n      }\n    }\n    return '';\n  }\n\n  function writeCookie(name, value, days) {\n    try {\n      var maxAge = Math.floor(days * 24 * 60 * 60);\n      var secure = window.location.protocol === 'https:' ? '; Secure' : '';\n      document['cookie'] =\n        name +\n        '=' +\n        encodeURIComponent(value) +\n        '; Max-Age=' +\n        maxAge +\n        '; Path=/; SameSite=Lax' +\n        secure;\n    } catch (e) {\n      /* ignore */\n    }\n  }\n\n  /**\n   * Reject CDN image basenames mistaken for product handles.\n   * Shopify files live under \u2026/products/RGNET1316_800x.jpg \u2014 scraping\n   * /products/ from img src used to poison recentlyViewed with that filename.\n   */\n  function isLikelyProductHandle(handle) {\n    var h = String(handle || '').replace(/^\\s+|\\s+$/g, '');\n    if (!h) return false;\n    if (h.indexOf('/') !== -1 || h.indexOf(',') !== -1 || h.indexOf('.') !== -1) {\n      return false;\n    }\n    if (/\\.(?:jpe?g|png|webp|gif|svg|mp3|mp4)(?:$|[?#])/i.test(h)) return false;\n    if (/_\\d+x\\d*(?:$|[.?#])/i.test(h)) return false;\n    return true;\n  }\n\n  /**\n   * Normalize a product handle for the theme recentlyViewed cookie.\n   * Matches app.js: trim, strip query/hash; handles are already Shopify-slugged.\n   */\n  function normalizeRecentlyViewedHandle(handle) {\n    if (handle == null) return '';\n    var h = String(handle).replace(/^\\s+|\\s+$/g, '');\n    if (!h) return '';\n    h = h.split('?')[0].split('#')[0];\n    var m = h.match(/\\/products\\/([^\\/]+)/);\n    if (m) {\n      try {\n        h = decodeURIComponent(m[1]);\n      } catch (eDec) {\n        h = m[1];\n      }\n    }\n    h = h.replace(/^\\s+|\\s+$/g, '');\n    if (!isLikelyProductHandle(h)) return '';\n    return h;\n  }\n\n  /**\n   * Pure prepend/dedupe/cap \u2014 newest first, unique, max RV_MAX_HANDLES.\n   * @param {string[]} list\n   * @param {string} handle\n   * @param {number} [max]\n   * @returns {string[]}\n   */\n  function prependRecentlyViewedHandles(list, handle, max) {\n    var h = normalizeRecentlyViewedHandle(handle);\n    if (!h) return (list || []).slice();\n    var cap = max == null ? RV_MAX_HANDLES : max;\n    var out = [h];\n    var prev = list || [];\n    for (var i = 0; i < prev.length; i++) {\n      var cur = normalizeRecentlyViewedHandle(prev[i]);\n      if (cur && cur !== h) out.push(cur);\n    }\n    if (out.length > cap) out.length = cap;\n    return out;\n  }\n\n  /**\n   * Read recentlyViewed cookie as handle list.\n   * app.js: Cookies.get \u2192 unescape \u2192 split(',')\n   * (js-cookie decodeURIComponent; we mirror via readCookie then unescape)\n   */\n  function readRecentlyViewedCookie() {\n    var raw = readCookie(RV_COOKIE_NAME);\n    if (!raw) return [];\n    var decoded = raw;\n    try {\n      decoded = unescape(raw);\n    } catch (eUn) {\n      /* keep raw */\n    }\n    var parts = String(decoded).split(',');\n    var out = [];\n    var scrubbed = false;\n    for (var i = 0; i < parts.length; i++) {\n      var rawPart = String(parts[i] || '').replace(/^\\s+|\\s+$/g, '');\n      var h = normalizeRecentlyViewedHandle(parts[i]);\n      if (h) out.push(h);\n      else if (rawPart) scrubbed = true;\n    }\n    // Drop poisoned CDN filenames (rgnet1316_800x.jpg) from the cookie once.\n    if (scrubbed) {\n      try {\n        writeRecentlyViewedCookie(out);\n      } catch (eScrub) {\n        /* ignore */\n      }\n    }\n    return out;\n  }\n\n  /**\n   * Write recentlyViewed cookie.\n   * app.js setCookieProducts: Cookies.set(escape(join(',')), { expires: 30, path: '/' })\n   * js-cookie then encodeURIComponent \u2014 writeCookie does the same.\n   */\n  function writeRecentlyViewedCookie(handles) {\n    var list = [];\n    var src = handles || [];\n    for (var i = 0; i < src.length; i++) {\n      var h = normalizeRecentlyViewedHandle(src[i]);\n      if (h) list.push(h);\n    }\n    if (list.length > RV_MAX_HANDLES) list.length = RV_MAX_HANDLES;\n    writeCookie(RV_COOKIE_NAME, escape(list.join(',')), RV_COOKIE_DAYS);\n  }\n\n  /** Prepend handle to theme recentlyViewed cookie (newest first, dedupe, max 12). */\n  function pushRecentlyViewedHandle(handle) {\n    var h = normalizeRecentlyViewedHandle(handle);\n    if (!h) return;\n    writeRecentlyViewedCookie(\n      prependRecentlyViewedHandles(readRecentlyViewedCookie(), h, RV_MAX_HANDLES)\n    );\n  }\n\n  function pruneEvents(events) {\n    var cutoff = now() - MAX_AGE_MS;\n    var out = [];\n    for (var i = 0; i < events.length; i++) {\n      var ev = events[i];\n      if (!ev || !ev.h || !ev.t || ev.t < cutoff) continue;\n      out.push(ev);\n    }\n    if (out.length > MAX_EVENTS) out = out.slice(-MAX_EVENTS);\n\n    var deduped = [];\n    for (var j = 0; j < out.length; j++) {\n      var cur = out[j];\n      var prev = deduped[deduped.length - 1];\n      if (prev && prev.h === cur.h && Math.abs((cur.t || 0) - (prev.t || 0)) < 120000) {\n        deduped[deduped.length - 1] = cur;\n      } else {\n        deduped.push(cur);\n      }\n    }\n    return deduped;\n  }\n\n  function richerEvent(a, b) {\n    if (!a) return b;\n    if (!b) return a;\n    return {\n      t: Math.max(a.t || 0, b.t || 0),\n      k: b.k || a.k || 'view',\n      h: a.h || b.h,\n      id: a.id || b.id || '',\n      g: (a.g && a.g.length ? a.g : b.g) || [],\n      title: a.title || b.title || '',\n      img: a.img || b.img || '',\n      price: a.price || b.price || ''\n    };\n  }\n\n  function mergeStores(a, b) {\n    var map = {};\n    var all = (a.events || []).concat(b.events || []);\n    for (var i = 0; i < all.length; i++) {\n      var ev = all[i];\n      if (!ev || !ev.h || !ev.t) continue;\n      var key = ev.h + ':' + ev.t;\n      map[key] = richerEvent(map[key], ev);\n    }\n    var merged = [];\n    for (var k in map) {\n      if (Object.prototype.hasOwnProperty.call(map, k)) merged.push(map[k]);\n    }\n    merged.sort(function (x, y) {\n      return (x.t || 0) - (y.t || 0);\n    });\n    var entities = mergeEntityMaps(a && a.entities, b && b.entities);\n    var negatives = mergeNegativeMaps(a && a.negatives, b && b.negatives);\n    var et = Math.max((a && a.et) || 0, (b && b.et) || 0) || undefined;\n    var out = {\n      v: 1,\n      events: pruneEvents(merged),\n      entities: entities,\n      negatives: negatives\n    };\n    if (et) out.et = et;\n    return out;\n  }\n\n  function readLocal() {\n    try {\n      return parseStore(window.localStorage.getItem(storageKey()));\n    } catch (e) {\n      return emptyStore();\n    }\n  }\n\n  function readCookieStore() {\n    var raw = readCookie(COOKIE_NAME);\n    if (!raw) return emptyStore();\n    try {\n      var wrapped = JSON.parse(raw);\n      if (wrapped && wrapped.sk && wrapped.sk !== storageKey()) return emptyStore();\n      if (wrapped && wrapped.data) return parseStore(JSON.stringify(wrapped.data));\n      return parseStore(raw);\n    } catch (e) {\n      return emptyStore();\n    }\n  }\n\n  function readStore() {\n    return mergeStores(readLocal(), readCookieStore());\n  }\n\n  function compactForCookie(store) {\n    var events = (store.events || []).slice(-25).map(function (ev) {\n      return { t: ev.t, h: ev.h, g: (ev.g || []).slice(0, 4) };\n    });\n    return { sk: storageKey(), data: { v: 1, events: events } };\n  }\n\n  function writeStore(data) {\n    data.events = pruneEvents(data.events || []);\n    data.entities = capEntities(data.entities || {});\n    data.negatives = capNegatives(data.negatives || {});\n    try {\n      window.localStorage.setItem(storageKey(), JSON.stringify(data));\n    } catch (e) {\n      /* ignore */\n    }\n    try {\n      writeCookie(COOKIE_NAME, JSON.stringify(compactForCookie(data)), COOKIE_DAYS);\n    } catch (e2) {\n      /* ignore */\n    }\n  }\n\n  function normalizeGenre(g) {\n    return String(g || '')\n      .trim()\n      .toLowerCase()\n      .replace(/\\s+/g, ' ');\n  }\n\n  function decay(ts) {\n    var age = Math.max(0, now() - (ts || 0));\n    return Math.pow(0.5, age / HALF_LIFE_MS);\n  }\n\n  function affinityMap(events) {\n    var genres = {};\n    var handles = {};\n    for (var i = 0; i < events.length; i++) {\n      var ev = events[i];\n      var kindMult = KIND_WEIGHT[ev.k || 'view'] || 1;\n      var w = decay(ev.t) * VIEW_WEIGHT * kindMult;\n      if (ev.h) handles[ev.h] = (handles[ev.h] || 0) + w * 2;\n      var gs = ev.g || [];\n      for (var j = 0; j < gs.length; j++) {\n        var key = normalizeGenre(gs[j]);\n        if (key) genres[key] = (genres[key] || 0) + w;\n      }\n    }\n    return { genres: genres, handles: handles };\n  }\n\n  /** Compat affinity: event map + entity-derived genres/handles. */\n  function getAffinityCompat() {\n    var store = readStore();\n    var base = affinityMap(store.events || []);\n    var prefs = store.entities || {};\n    for (var id in prefs) {\n      if (!Object.prototype.hasOwnProperty.call(prefs, id)) continue;\n      var w = prefs[id] || 0;\n      if (w <= 0) continue;\n      if (id.indexOf('product:') === 0) {\n        var h = id.slice(8);\n        base.handles[h] = (base.handles[h] || 0) + w * 2;\n      } else if (id.indexOf('genre:') === 0) {\n        var slug = id.slice(6);\n        var label = slug.replace(/-/g, ' ');\n        base.genres[label] = (base.genres[label] || 0) + w;\n        base.genres[slug] = (base.genres[slug] || 0) + w;\n      } else if (id.indexOf('country:') === 0) {\n        var cslug = id.slice(8);\n        if (cslug && cslug !== 'celtic') {\n          base.handles['__country:' + cslug] = (base.handles['__country:' + cslug] || 0) + w;\n          // Soft title match aid\n          base.genres[cslug] = (base.genres[cslug] || 0) + w * 0.5;\n          base.genres[cslug.replace(/-/g, ' ')] =\n            (base.genres[cslug.replace(/-/g, ' ')] || 0) + w * 0.5;\n        }\n      }\n    }\n    return base;\n  }\n\n  function topGenres(affinity, limit) {\n    var pairs = [];\n    Object.keys(affinity.genres || {}).forEach(function (g) {\n      pairs.push({ g: g, w: affinity.genres[g] });\n    });\n    pairs.sort(function (a, b) {\n      return b.w - a.w;\n    });\n    return pairs.slice(0, limit || 3);\n  }\n\n  function parseListAttr(el, name) {\n    var raw = el.getAttribute(name) || '';\n    if (!raw) return [];\n    return raw.split('|').map(function (s) { return s.trim(); }).filter(Boolean);\n  }\n\n  function scoreByHandleTitleGenres(handle, title, genres, affinity) {\n    var score = 0;\n    title = (title || '').toLowerCase();\n\n    if (handle && affinity.handles[handle]) {\n      score += HANDLE_BONUS + affinity.handles[handle];\n    }\n\n    for (var i = 0; i < (genres || []).length; i++) {\n      var g = normalizeGenre(genres[i]);\n      if (affinity.genres[g]) score += affinity.genres[g];\n    }\n\n    Object.keys(affinity.genres).forEach(function (g) {\n      if (g.length >= 4 && title.indexOf(g) !== -1) {\n        score += affinity.genres[g] * 0.35;\n      }\n    });\n\n    if (title.indexOf('gift voucher') !== -1 || title.indexOf('gift card') !== -1) {\n      score -= 500;\n    }\n\n    return score;\n  }\n\n  function scoreElement(el, affinity) {\n    return scoreByHandleTitleGenres(\n      el.getAttribute('data-wmn-handle') || '',\n      el.getAttribute('data-wmn-title') || '',\n      parseListAttr(el, 'data-wmn-genres'),\n      affinity\n    );\n  }\n\n  function productHandleFromHref(href) {\n    if (!href) return '';\n    // Never treat Shopify CDN file URLs as product links\n    // (\u2026/files/\u2026/products/RGNET1316_800x.jpg).\n    var s = String(href);\n    if (/\\/cdn\\/shop\\/|cdn\\.shopify\\.com|\\/files\\/\\d+\\//i.test(s)) return '';\n    var m = s.match(/\\/products\\/([^\\/?#]+)/);\n    if (!m) return '';\n    var h = '';\n    try {\n      h = decodeURIComponent(m[1]);\n    } catch (eDec) {\n      h = m[1];\n    }\n    return isLikelyProductHandle(h) ? h : '';\n  }\n\n  function normalizeImageUrl(url) {\n    if (!url) return '';\n    url = String(url);\n    if (url.indexOf('//') === 0) return 'https:' + url;\n    return url;\n  }\n\n  // Prefer largest available Shopify CDN size for a given <img>.\n  function bestImgUrlFromElement(imgEl) {\n    if (!imgEl) return '';\n    var raw =\n      imgEl.getAttribute('data-src') ||\n      imgEl.currentSrc ||\n      imgEl.getAttribute('src') ||\n      '';\n    var srcset = imgEl.getAttribute('data-srcset') || imgEl.getAttribute('srcset') || '';\n    if (srcset) {\n      var best = '';\n      var bestW = 0;\n      srcset.split(',').forEach(function (part) {\n        var bits = part.trim().split(/\\s+/);\n        if (!bits[0]) return;\n        var wMatch = (bits[1] || '').match(/^(\\d+)w$/);\n        var w = wMatch ? parseInt(wMatch[1], 10) : 0;\n        if (w >= bestW) {\n          bestW = w;\n          best = bits[0];\n        }\n      });\n      if (best) raw = best;\n    }\n    return normalizeImageUrl(raw);\n  }\n\n  // Rewrite Shopify CDN size suffix (_200x \u2192 _1200x). Named sizes (_compact) \u2192 numeric.\n  function withShopifyImageWidth(url, width) {\n    url = normalizeImageUrl(url);\n    if (!url || !width) return url;\n    var w = String(width).replace(/x$/i, '');\n    if (/_\\d+x\\d*/.test(url)) {\n      return url.replace(/_\\d+x\\d*/, '_' + w + 'x');\n    }\n    if (/_(pico|icon|thumb|small|compact|medium|large|grande|original|master)(?=\\.)/i.test(url)) {\n      return url.replace(\n        /_(pico|icon|thumb|small|compact|medium|large|grande|original|master)(?=\\.)/i,\n        '_' + w + 'x'\n      );\n    }\n    return url.replace(/(\\.(?:jpe?g|png|webp|gif))(\\?|$)/i, '_' + w + 'x$1$2');\n  }\n\n  function escapeHtml(str) {\n    return String(str || '')\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;');\n  }\n\n  function recordView(payload) {\n    if (!payload) return;\n    var kind = payload.kind || 'view';\n    var genres = (payload.genres || []).filter(Boolean);\n    ensureGraphWarm();\n\n    // Genre-chip signal without a product handle\n    if (!payload.handle && genres.length) {\n      var storeChip = readStore();\n      storeChip.events.push({ t: now(), k: 'chip', g: genres });\n      bumpEntities(storeChip, resolveEntities({ genres: genres }), 'chip');\n      writeStore(storeChip);\n      scheduleCloudWriteback();\n      dispatchPrefsUpdated(storeChip);\n      logIntentEvent({\n        type: 'chip',\n        meta: { genres: genres.slice(0, 6) }\n      });\n      return;\n    }\n    if (!payload.handle) return;\n\n    var store = readStore();\n    var next = {\n      t: now(),\n      k: kind,\n      h: payload.handle,\n      id: payload.id || '',\n      g: genres,\n      title: payload.title || '',\n      img: normalizeImageUrl(payload.image || payload.img || ''),\n      price: payload.price || ''\n    };\n    var entityIds = resolveEntities(payload);\n    var bumpScale = entityBumpScaleMap(entityIds, kind);\n    // Passive impressions must not write prefs or pins \u2014 rail scroll was\n    // drowning intentional African / geo hovers with Cuba/Brazil/Celtic mass.\n    if (kind === 'visible') {\n      logIntentEvent({\n        type: 'impression',\n        handle: payload.handle,\n        artist: payload.artist || null,\n        meta: mergeMeta(\n          { kind: 'visible', source: payload.source || null },\n          payload.meta\n        )\n      });\n      return;\n    }\n    // Dual-write theme Recently viewed cookie whenever this path updates focus.\n    // (visible/chip early-returns above skip focus \u2014 do not dual-write there.)\n    pushRecentlyViewedHandle(payload.handle);\n    var pinEvent = true;\n    for (var i = store.events.length - 1; i >= 0; i--) {\n      if (store.events[i] && store.events[i].h === next.h) {\n        if (pinEvent) {\n          store.events[i] = richerEvent(store.events[i], next);\n          store.events[i].t = next.t;\n          store.events[i].k = kind;\n        }\n        bumpEntities(store, entityIds, kind, bumpScale);\n        writeStore(store);\n        scheduleCloudWriteback();\n        // Focus BEFORE prefs dispatch so For You remount sees the new intent.\n        if (pinEvent) updateFocusFromPayload(payload);\n        dispatchPrefsUpdated(store);\n        logIntentEvent({\n          type: kind === 'search_click' ? 'click' : kind,\n          handle: payload.handle,\n          artist: payload.artist || null,\n          meta: payload.meta || null\n        });\n        try {\n          if (window.wmnIntentField) {\n            if (kind === 'listen' && window.wmnIntentField.onListen) {\n              window.wmnIntentField.onListen(payload.handle);\n            } else if (kind === 'atc' && window.wmnIntentField.injectFromProduct) {\n              window.wmnIntentField.injectFromProduct(payload.handle, 2.0, 'atc');\n            } else if (\n              kind !== 'visible' &&\n              window.wmnIntentField.injectFromProduct\n            ) {\n              window.wmnIntentField.injectFromProduct(\n                payload.handle,\n                kind === 'hover' ? 1.25 : 0.9,\n                kind === 'hover' ? 'hover' : 'view'\n              );\n            }\n            if (\n              kind !== 'visible' &&\n              window.wmnIntentField.learnFromSignal\n            ) {\n              window.wmnIntentField.learnFromSignal(\n                kind === 'listen' || kind === 'atc'\n                  ? 'listen'\n                  : kind === 'hover'\n                    ? 'hover'\n                    : 'click',\n                true,\n                { handle: payload.handle }\n              );\n            }\n          }\n        } catch (fe) {\n          /* ignore */\n        }\n        return;\n      }\n    }\n    if (pinEvent) store.events.push(next);\n    bumpEntities(store, entityIds, kind, bumpScale);\n    writeStore(store);\n    scheduleCloudWriteback();\n    // Focus BEFORE prefs dispatch so For You remount sees the new intent.\n    updateFocusFromPayload(payload);\n    dispatchPrefsUpdated(store);\n    logIntentEvent({\n      type: kind === 'search_click' ? 'click' : kind,\n      handle: payload.handle,\n      artist: payload.artist || null,\n      meta: payload.meta || null\n    });\n    try {\n      if (window.wmnIntentField) {\n        if (kind === 'listen' && window.wmnIntentField.onListen) {\n          window.wmnIntentField.onListen(payload.handle);\n        } else if (kind === 'atc' && window.wmnIntentField.injectFromProduct) {\n          window.wmnIntentField.injectFromProduct(payload.handle, 2.0, 'atc');\n        } else if (\n          kind !== 'visible' &&\n          window.wmnIntentField.injectFromProduct\n        ) {\n          window.wmnIntentField.injectFromProduct(\n            payload.handle,\n            kind === 'hover' ? 1.25 : 0.9,\n            kind === 'hover' ? 'hover' : 'view'\n          );\n        }\n        if (kind !== 'visible' && window.wmnIntentField.learnFromSignal) {\n          window.wmnIntentField.learnFromSignal(\n            kind === 'listen' || kind === 'atc'\n              ? 'listen'\n              : kind === 'hover'\n                ? 'hover'\n                : 'click',\n            true,\n            { handle: payload.handle }\n          );\n        }\n      }\n    } catch (fe2) {\n      /* ignore */\n    }\n  }\n\n  /** Soft entity bumps from a typed search query (graph + visible results). */\n  function recordSearch(query, opts) {\n    opts = opts || {};\n    var q = String(query || '').replace(/^\\s+|\\s+$/g, '');\n    if (q.length < 2) return false;\n    try {\n      if (\n        window.wmnQueryGuard &&\n        typeof window.wmnQueryGuard.isBlocked === 'function' &&\n        window.wmnQueryGuard.isBlocked(q)\n      ) {\n        return false;\n      }\n    } catch (eGuard) {\n      /* ignore */\n    }\n\n    // One brain: lean/committed settles are field-owned \u2014 never bump entities/focus from typing.\n    if (fieldOwnsRanking()) {\n      try {\n        window.__wmnTypedPrefsDirty = true;\n      } catch (eOwn) {\n        /* ignore */\n      }\n      return false;\n    }\n\n    var results = Array.isArray(opts.results) ? opts.results : [];\n    var prevFocus = readFocus();\n    var prevQ = prevFocus && prevFocus.q ? String(prevFocus.q) : '';\n    var refineBoost = 1;\n    if (prevQ) {\n      var prevN = prevQ.toLowerCase();\n      var nextN = q.toLowerCase();\n      if (nextN.indexOf(prevN) === 0 || prevN.indexOf(nextN) === 0) {\n        // Same stem refined (blu \u2192 blues): strengthen\n        refineBoost = 1.35;\n      }\n    }\n\n    // Always persist query focus immediately so intent never evaporates.\n    updateFocus({ q: q });\n\n    function mergeIdScale(ids, scales, id, scale) {\n      if (!id) return;\n      if (ids.indexOf(id) === -1) ids.push(id);\n      var next = Math.min(1.25, Math.max(0.12, scale || 0.35));\n      scales[id] = Math.max(scales[id] || 0, next);\n    }\n\n    function collectFromResults(ids, scales, artists, genres, handles) {\n      var top = results.slice(0, 8);\n      for (var i = 0; i < top.length; i++) {\n        var item = top[i];\n        if (!item) continue;\n        var falloff = 1 - i * 0.08;\n        var entityIds = resolveEntities(item);\n        for (var e = 0; e < entityIds.length; e++) {\n          var eid = entityIds[e];\n          mergeIdScale(ids, scales, eid, 0.55 * falloff * refineBoost);\n          // Focus vectors must follow graph-resolved genres even when search\n          // JSON omits genre fields (slim search.json has none).\n          var ep = String(eid).split(':');\n          if (ep[0] === 'artist' && ep[1]) artists.push(ep[1]);\n          if (ep[0] === 'genre' && ep[1]) genres.push(ep[1]);\n        }\n        if (item.handle) {\n          handles.push(item.handle);\n          mergeIdScale(ids, scales, 'product:' + item.handle, 0.4 * falloff * refineBoost);\n        }\n        if (item.artist) {\n          var aSlug = handleize(item.artist);\n          if (aSlug && aSlug !== 'various' && aSlug !== 'various-artists') {\n            artists.push(aSlug);\n          }\n        }\n        var gs = item.genres || [];\n        for (var g = 0; g < gs.length; g++) {\n          var gSlug = handleize(gs[g]);\n          if (gSlug) genres.push(gSlug);\n        }\n      }\n    }\n\n    function collectFromLinkQuery(ids, scales, artists, genres) {\n      if (!graphReady() || typeof window.wmnCatalogGraph.linkQuery !== 'function') {\n        return;\n      }\n      var linked = window.wmnCatalogGraph.linkQuery(q) || [];\n      var top = linked.slice(0, 8);\n      for (var i = 0; i < top.length; i++) {\n        var row = top[i];\n        if (!row || !row.id) continue;\n        var rawScore = row.score || 0;\n        var scale = Math.min(1, Math.max(0.15, rawScore / 100)) * refineBoost;\n        var p = String(row.id).split(':');\n        // Clear genre queries (e.g. \"blues\", \"samba\", \"cuba\"\u2192alias 100) need a\n        // strong enough bump to move For you past bestsellers \u2014 still below\n        // search_click. Floor 50 covers token-prefix genre hits (~50\u201357).\n        if (p[0] === 'genre' && rawScore >= 50) {\n          scale = Math.min(1.25, Math.max(scale, 1.1 * refineBoost));\n        }\n        mergeIdScale(ids, scales, row.id, scale);\n        if (p[0] === 'artist' && p[1]) artists.push(p[1]);\n        if (p[0] === 'genre' && p[1]) genres.push(p[1]);\n      }\n    }\n\n    function applyAll(includeLinkQuery, includeResults) {\n      var ids = [];\n      var scales = {};\n      var artists = [];\n      var genres = [];\n      var handles = [];\n      if (includeLinkQuery) collectFromLinkQuery(ids, scales, artists, genres);\n      if (includeResults) collectFromResults(ids, scales, artists, genres, handles);\n      if (!ids.length && !artists.length && !genres.length) {\n        try {\n          window.__wmnTypedPrefsDirty = true;\n        } catch (e0) {}\n        return true;\n      }\n      var store = readStore();\n      if (ids.length) bumpEntities(store, ids, 'search', scales);\n      writeStore(store);\n      scheduleCloudWriteback();\n      // Typed search owns primaryKind from top linkQuery hit so a prior\n      // Spiritual India country focus does not keep hard-filtering while the\n      // query clearly names Indian Classical/Raga (or Blues, Jazz, \u2026).\n      var focusOpts = {\n        artists: artists,\n        genres: genres,\n        handles: handles.slice(0, 6),\n        q: q\n      };\n      if (\n        includeLinkQuery &&\n        graphReady() &&\n        typeof window.wmnCatalogGraph.linkQuery === 'function'\n      ) {\n        var topLinked = (window.wmnCatalogGraph.linkQuery(q) || [])[0];\n        if (topLinked && topLinked.id && (topLinked.score || 0) >= 50) {\n          var topParts = String(topLinked.id).split(':');\n          if (topParts[0] === 'genre' && topParts[1]) {\n            focusOpts.primaryKind = 'genre';\n            focusOpts.primaryCountry = '';\n            focusOpts.primaryRegion = '';\n            if (genres.indexOf(topParts[1]) === -1) genres.unshift(topParts[1]);\n          } else if (topParts[0] === 'country' && topParts[1]) {\n            focusOpts.primaryKind = 'country';\n            focusOpts.primaryCountry = topParts[1];\n            focusOpts.primaryRegion = '';\n          } else if (topParts[0] === 'region' && topParts[1]) {\n            focusOpts.primaryKind = 'region';\n            focusOpts.primaryRegion = topParts[1];\n            focusOpts.primaryCountry = '';\n          }\n        }\n      }\n      updateFocus(focusOpts);\n      try {\n        window.__wmnTypedPrefsDirty = true;\n      } catch (e1) {}\n      dispatchPrefsUpdated(store);\n      return true;\n    }\n\n    ensureGraphWarm();\n    if (!graphReady() && window.wmnCatalogGraph && window.wmnCatalogGraph.ensureLoaded) {\n      // Visible-result bumps apply immediately; graph linkQuery follows once.\n      applyAll(false, true);\n      window.wmnCatalogGraph\n        .ensureLoaded()\n        .then(function () {\n          applyAll(true, false);\n        })\n        .catch(function () {});\n      return true;\n    }\n    return applyAll(true, true);\n  }\n\n  /**\n   * Query \u2192 handle click learning (no graph rebuild).\n   * Local store strengthens this shopper immediately; anonymous POST to\n   * prefs-proxy /query-click strengthens collective warm-instance boosts.\n   */\n  var QUERY_CLICK_KEY = 'wmn_query_click_v1';\n  var QUERY_CLICK_HALF_LIFE_MS = 1000 * 60 * 60 * 24 * 45;\n  var QUERY_CLICK_BUMP = 1;\n  var QUERY_CLICK_MAX_W = 25;\n  var QUERY_CLICK_MAX_HANDLES = 12;\n  /**\n   * Score delta per click-weight unit. Must beat fuzzy position prior\n   * ((n-index)*10 \u2248 up to 300\u2013400) or clicks never surface mid-pack titles\n   * like Timchar among equal desert-blues scores.\n   */\n  var QUERY_CLICK_SCORE_SCALE = 140;\n  var QUERY_CLICK_COLLECTIVE_SCALE = 0.85;\n  var queryClickCollectiveCache = Object.create(null);\n  var queryClickCollectiveInflight = Object.create(null);\n\n  function prefsProxyBaseEngagement() {\n    try {\n      var meta = document.querySelector('meta[name=\"wmn-prefs-sync-proxy\"]');\n      var v = meta && meta.getAttribute('content');\n      if (v) return String(v).replace(/\\/$/, '');\n    } catch (eMeta) {\n      /* ignore */\n    }\n    return 'https://wmn-prefs-sync.vercel.app';\n  }\n\n  function normalizeQueryClickKey(q) {\n    if (\n      window.wmnSearchFuzzy &&\n      typeof window.wmnSearchFuzzy.normalize === 'function'\n    ) {\n      return window.wmnSearchFuzzy.normalize(q) || '';\n    }\n    return String(q || '')\n      .toLowerCase()\n      .replace(/[^\\w\\s\\-']/g, ' ')\n      .replace(/\\s+/g, ' ')\n      .replace(/^\\s+|\\s+$/g, '')\n      .slice(0, 80);\n  }\n\n  function queryClickAllowed(q) {\n    var nq = normalizeQueryClickKey(q);\n    if (!nq || nq.length < 2) return false;\n    try {\n      if (\n        window.wmnQueryGuard &&\n        typeof window.wmnQueryGuard.isBlocked === 'function' &&\n        window.wmnQueryGuard.isBlocked(nq)\n      ) {\n        return false;\n      }\n    } catch (eGuard) {\n      /* ignore */\n    }\n    return true;\n  }\n\n  function decayQueryClickWeight(w, t, ts) {\n    w = Number(w) || 0;\n    t = Number(t) || 0;\n    if (!w) return 0;\n    if (!t || !ts || ts <= t) return w;\n    return w * Math.pow(0.5, (ts - t) / QUERY_CLICK_HALF_LIFE_MS);\n  }\n\n  function readQueryClickStore() {\n    try {\n      var raw = window.localStorage.getItem(QUERY_CLICK_KEY);\n      if (!raw) return { v: 1, q: {} };\n      var parsed = JSON.parse(raw);\n      if (!parsed || typeof parsed !== 'object') return { v: 1, q: {} };\n      if (!parsed.q || typeof parsed.q !== 'object') parsed.q = {};\n      return parsed;\n    } catch (e) {\n      return { v: 1, q: {} };\n    }\n  }\n\n  function writeQueryClickStore(store) {\n    try {\n      window.localStorage.setItem(QUERY_CLICK_KEY, JSON.stringify(store));\n    } catch (e) {\n      /* ignore quota */\n    }\n  }\n\n  function pruneQueryClickRow(row, ts) {\n    var entries = [];\n    var h;\n    for (h in row) {\n      if (!Object.prototype.hasOwnProperty.call(row, h)) continue;\n      if (!isLikelyProductHandle(h)) continue;\n      var cur = row[h];\n      if (!cur) continue;\n      var w = decayQueryClickWeight(cur.w, cur.t, ts);\n      if (w < 0.12) continue;\n      entries.push({ h: h, w: w, t: cur.t || ts });\n    }\n    entries.sort(function (a, b) {\n      return b.w - a.w || (a.h < b.h ? -1 : 1);\n    });\n    if (entries.length > QUERY_CLICK_MAX_HANDLES) {\n      entries = entries.slice(0, QUERY_CLICK_MAX_HANDLES);\n    }\n    var out = {};\n    var i;\n    for (i = 0; i < entries.length; i++) {\n      out[entries[i].h] = { w: entries[i].w, t: entries[i].t };\n    }\n    return out;\n  }\n\n  function postQueryClickCollective(nq, handle) {\n    if (!nq || !handle || typeof fetch !== 'function') return;\n    var base = prefsProxyBaseEngagement();\n    if (!base) return;\n    try {\n      fetch(base + '/query-click', {\n        method: 'POST',\n        credentials: 'omit',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ q: nq, handle: handle })\n      })\n        .then(function (res) {\n          return res && res.ok ? res.json() : null;\n        })\n        .then(function (json) {\n          if (json && json.boosts && typeof json.boosts === 'object') {\n            queryClickCollectiveCache[nq] = {\n              t: now(),\n              boosts: json.boosts\n            };\n          }\n        })\n        .catch(function () {});\n    } catch (ePost) {\n      /* ignore */\n    }\n  }\n\n  /**\n   * Prefetch collective boosts for a typed query (settle / rank path).\n   * @returns {Promise<Object.<string,number>>}\n   */\n  function ensureQueryClickCollective(q) {\n    var nq = normalizeQueryClickKey(q);\n    if (!queryClickAllowed(nq)) return Promise.resolve({});\n    var cached = queryClickCollectiveCache[nq];\n    if (cached && cached.boosts && now() - (cached.t || 0) < 1000 * 60 * 10) {\n      return Promise.resolve(cached.boosts);\n    }\n    if (queryClickCollectiveInflight[nq]) {\n      return queryClickCollectiveInflight[nq];\n    }\n    var base = prefsProxyBaseEngagement();\n    if (!base || typeof fetch !== 'function') {\n      return Promise.resolve({});\n    }\n    queryClickCollectiveInflight[nq] = fetch(\n      base + '/query-click?q=' + encodeURIComponent(nq),\n      { credentials: 'omit' }\n    )\n      .then(function (res) {\n        if (!res || !res.ok) return {};\n        return res.json();\n      })\n      .then(function (json) {\n        var boosts =\n          json && json.boosts && typeof json.boosts === 'object'\n            ? json.boosts\n            : {};\n        queryClickCollectiveCache[nq] = { t: now(), boosts: boosts };\n        return boosts;\n      })\n      .catch(function () {\n        return {};\n      })\n      .then(function (boosts) {\n        delete queryClickCollectiveInflight[nq];\n        return boosts;\n      });\n    return queryClickCollectiveInflight[nq];\n  }\n\n  /** Record that query `q` led to a click on `handle`. */\n  function recordQueryClick(q, handle) {\n    var nq = normalizeQueryClickKey(q);\n    var h = normalizeRecentlyViewedHandle(handle) || String(handle || '').toLowerCase();\n    if (!queryClickAllowed(nq)) return;\n    if (!isLikelyProductHandle(h)) return;\n    var ts = now();\n    var store = readQueryClickStore();\n    var row = pruneQueryClickRow(store.q[nq] || {}, ts);\n    var cur = row[h] || { w: 0, t: ts };\n    row[h] = {\n      w: Math.min(\n        QUERY_CLICK_MAX_W,\n        decayQueryClickWeight(cur.w, cur.t, ts) + QUERY_CLICK_BUMP\n      ),\n      t: ts\n    };\n    store.q[nq] = pruneQueryClickRow(row, ts);\n    writeQueryClickStore(store);\n    postQueryClickCollective(nq, h);\n  }\n\n  /**\n   * Raw merged weight (local + collective) for query/handle \u2014 before score scale.\n   */\n  function queryClickWeight(q, handle) {\n    var nq = normalizeQueryClickKey(q);\n    var h = String(handle || '').toLowerCase();\n    if (!nq || !h) return 0;\n    var ts = now();\n    var local = 0;\n    try {\n      var store = readQueryClickStore();\n      var row = store.q && store.q[nq];\n      if (row && row[h]) {\n        local = decayQueryClickWeight(row[h].w, row[h].t, ts);\n      }\n    } catch (eLocal) {\n      local = 0;\n    }\n    var collective = 0;\n    var cached = queryClickCollectiveCache[nq];\n    if (cached && cached.boosts && cached.boosts[h] != null) {\n      collective = Number(cached.boosts[h]) || 0;\n    }\n    return local + collective * QUERY_CLICK_COLLECTIVE_SCALE;\n  }\n\n  /** Score delta for fuzzyRank decoration. */\n  function queryClickBoost(q, handle) {\n    var w = queryClickWeight(q, handle);\n    if (w <= 0) return 0;\n    return w * QUERY_CLICK_SCORE_SCALE;\n  }\n\n  /**\n   * Handles previously clicked for this query, strongest first.\n   * Used to pin Timchar to the front after \"Desert\" \u2192 Timchar clicks.\n   */\n  function queryClickTopHandles(q, limit) {\n    limit = limit != null ? limit : 6;\n    var nq = normalizeQueryClickKey(q);\n    if (!nq) return [];\n    var ts = now();\n    var weights = {};\n    try {\n      var store = readQueryClickStore();\n      var row = store.q && store.q[nq];\n      var h;\n      if (row) {\n        for (h in row) {\n          if (!Object.prototype.hasOwnProperty.call(row, h)) continue;\n          var w = decayQueryClickWeight(row[h].w, row[h].t, ts);\n          if (w > 0) weights[h] = (weights[h] || 0) + w;\n        }\n      }\n    } catch (eLocal) {\n      /* ignore */\n    }\n    var cached = queryClickCollectiveCache[nq];\n    if (cached && cached.boosts) {\n      var ch;\n      for (ch in cached.boosts) {\n        if (!Object.prototype.hasOwnProperty.call(cached.boosts, ch)) continue;\n        weights[ch] =\n          (weights[ch] || 0) +\n          (Number(cached.boosts[ch]) || 0) * QUERY_CLICK_COLLECTIVE_SCALE;\n      }\n    }\n    var entries = [];\n    var k;\n    for (k in weights) {\n      if (!Object.prototype.hasOwnProperty.call(weights, k)) continue;\n      if (weights[k] < 0.2) continue;\n      if (!isLikelyProductHandle(k)) continue;\n      entries.push({ h: k, w: weights[k] });\n    }\n    entries.sort(function (a, b) {\n      return b.w - a.w || (a.h < b.h ? -1 : 1);\n    });\n    var out = [];\n    var i;\n    for (i = 0; i < entries.length && out.length < limit; i++) {\n      out.push(entries[i].h);\n    }\n    return out;\n  }\n\n  /** Stronger bump when user clicks a discover / search result card. */\n  function recordSearchClick(payload) {\n    if (!payload || !payload.handle) return;\n    ensureGraphWarm();\n    if (payload.q) {\n      try {\n        recordQueryClick(payload.q, payload.handle);\n      } catch (eQc) {\n        /* ignore */\n      }\n    }\n    var owns = fieldOwnsRanking();\n    if (\n      window.wmnIntentField &&\n      typeof window.wmnIntentField.onClick === 'function'\n    ) {\n      try {\n        window.wmnIntentField.onClick(payload.handle);\n        if (typeof window.wmnIntentField.learnFromSignal === 'function') {\n          window.wmnIntentField.learnFromSignal('click', true, {\n            handle: payload.handle\n          });\n        }\n      } catch (fieldClickErr) {\n        /* ignore */\n      }\n    }\n    var store = readStore();\n    // One brain: field owns lean/committed \u2014 skip entity/focus double-count.\n    if (!owns) {\n      var entityIds = resolveEntities(payload);\n      bumpEntities(store, entityIds, 'search_click');\n    }\n    // Still record the click event for continue-lane pins / memory.\n    var next = {\n      t: now(),\n      k: 'search_click',\n      h: payload.handle,\n      id: payload.id || '',\n      g: payload.genres || [],\n      title: payload.title || '',\n      img: normalizeImageUrl(payload.image || payload.img || ''),\n      price: payload.price || '',\n      q: payload.q ? normalizeQueryClickKey(payload.q) : ''\n    };\n    var updated = false;\n    for (var i = store.events.length - 1; i >= 0; i--) {\n      if (store.events[i] && store.events[i].h === next.h) {\n        store.events[i] = richerEvent(store.events[i], next);\n        store.events[i].t = next.t;\n        store.events[i].k = 'search_click';\n        if (next.q) store.events[i].q = next.q;\n        updated = true;\n        break;\n      }\n    }\n    if (!updated) store.events.push(next);\n    writeStore(store);\n    scheduleCloudWriteback();\n    if (!owns) {\n      updateFocusFromPayload(payload);\n    }\n    dispatchPrefsUpdated(store);\n    // Analytics click lives here so discover does not double-log.\n    logIntentEvent({\n      type: 'click',\n      handle: payload.handle,\n      artist: payload.artist || null,\n      meta: {\n        source: 'search_click',\n        q: next.q || null\n      }\n    });\n  }\n\n  function recordFromPage() {\n    var node = document.getElementById('wmn-engagement-product');\n    if (!node) return;\n    try {\n      var payload = JSON.parse(node.textContent || '{}');\n      recordView(payload);\n    } catch (e) {\n      /* ignore */\n    }\n  }\n\n  function ensureBanner(container) {\n    if (!container || container.querySelector('.wmn-engagement-banner')) return;\n    var tag = container.tagName === 'UL' || container.tagName === 'OL' ? 'li' : 'p';\n    var el = document.createElement(tag);\n    el.className = 'wmn-engagement-banner';\n    el.setAttribute('role', 'status');\n    el.textContent = 'Sorted for you based on albums you viewed';\n    container.insertBefore(el, container.firstChild);\n  }\n\n  function activeSearchTerm() {\n    var inputs = document.querySelectorAll('input[name=\"q\"]');\n    var best = '';\n    for (var i = 0; i < inputs.length; i++) {\n      var v = String(inputs[i].value || '')\n        .toLowerCase()\n        .replace(/\\*/g, '')\n        .trim();\n      if (v.length > best.length) best = v;\n    }\n    return best;\n  }\n\n  function eventTitleHandleMatch(ev, term) {\n    if (!term || !ev) return false;\n    var title = String(ev.title || '').toLowerCase();\n    var handle = String(ev.h || '').toLowerCase().replace(/-/g, ' ');\n    return title.indexOf(term) !== -1 || handle.indexOf(term) !== -1;\n  }\n\n  function pickMemoryHit(store, term, existing) {\n    var best = null;\n    for (var j = store.events.length - 1; j >= 0; j--) {\n      var ev = store.events[j];\n      if (!ev || !ev.h || existing[ev.h] || !catalogOffers(ev.h)) continue;\n      if (!eventTitleHandleMatch(ev, term)) continue;\n      best = ev;\n      break;\n    }\n    return best;\n  }\n\n  function catalogOffers(handle) {\n    var g = window.wmnCatalogGraph;\n    if (!g || typeof g.getData !== 'function') return true;\n    var data = g.getData();\n    if (!data || !data.products) return true;\n    return !!data.products[handle];\n  }\n\n  function buildMemoryResultItem(ev) {\n    if (!ev || !ev.h || !catalogOffers(ev.h)) return null;\n    var li = document.createElement('li');\n    li.className = 'item-result result--product wmn-memory-result';\n    li.setAttribute('data-wmn-injected', '1');\n\n    var a = document.createElement('a');\n    a.href = '/products/' + encodeURIComponent(ev.h);\n    a.setAttribute('data-no-instant', 'true');\n\n    var title = escapeHtml(ev.title || ev.h.replace(/-/g, ' '));\n    var price = escapeHtml(ev.price || 'Recently viewed');\n    var img = withShopifyImageWidth(normalizeImageUrl(ev.img), 200);\n    var html = '';\n    if (img) {\n      html +=\n        '<div class=\"thumbnail\"><img src=\"' +\n        escapeHtml(img) +\n        '\" alt=\"\" width=\"70\" height=\"70\" loading=\"lazy\" /></div>';\n    }\n    html +=\n      '<div class=\"title\">' +\n      title +\n      '<br><span class=\"item-pricing\">' +\n      price +\n      '</span></div>';\n    a.innerHTML = html;\n\n    // Bypass InstantClick / churn: navigate on explicit activation.\n    a.addEventListener('click', function (e) {\n      e.preventDefault();\n      e.stopPropagation();\n      window.location.href = a.href;\n    });\n\n    li.appendChild(a);\n    return li;\n  }\n\n  function injectMemoryIntoAutocomplete(list, term, store) {\n    if (!list || !term || !store.events.length) return 0;\n    if (list.querySelector('[data-wmn-injected=\"1\"]')) {\n      list.setAttribute('data-wmn-injected-term', term);\n      return 0;\n    }\n    if (list.getAttribute('data-wmn-injected-term') === term) {\n      list.removeAttribute('data-wmn-injected-term');\n    }\n\n    var existing = {};\n    var links = list.querySelectorAll('a[href*=\"/products/\"]');\n    for (var i = 0; i < links.length; i++) {\n      var h = productHandleFromHref(links[i].getAttribute('href'));\n      if (h) existing[h] = true;\n    }\n\n    var ev = pickMemoryHit(store, term, existing);\n    if (!ev) {\n      list.setAttribute('data-wmn-injected-term', term);\n      return 0;\n    }\n\n    var li = buildMemoryResultItem(ev);\n    if (!li) {\n      list.setAttribute('data-wmn-injected-term', term);\n      return 0;\n    }\n    var firstProduct = list.querySelector('li.item-result');\n    if (firstProduct) list.insertBefore(li, firstProduct);\n    else {\n      var seeAll = list.querySelector('li.all-results');\n      if (seeAll) list.insertBefore(li, seeAll);\n      else list.appendChild(li);\n    }\n    list.setAttribute('data-wmn-injected-term', term);\n    return 1;\n  }\n\n  function listSignature(items) {\n    return items\n      .map(function (el) {\n        var a = el.querySelector('a[href*=\"/products/\"]');\n        return productHandleFromHref(a && a.getAttribute('href'));\n      })\n      .join('|');\n  }\n\n  function reorderAutocompleteLists() {\n    var store = readStore();\n    if (!store.events.length && !Object.keys(store.entities || {}).length) return false;\n    var affinity = getAffinityCompat();\n    var term = activeSearchTerm();\n    var lists = document.querySelectorAll('.search__results');\n    var any = false;\n\n    for (var i = 0; i < lists.length; i++) {\n      var list = lists[i];\n      if (!list.querySelector('li.item-result, li.all-results')) continue;\n\n      injectMemoryIntoAutocomplete(list, term, store);\n\n      var items = Array.prototype.slice.call(\n        list.querySelectorAll('li.item-result.result--product, li.item-result')\n      ).filter(function (li) {\n        return !!li.querySelector('a[href*=\"/products/\"]');\n      });\n      if (items.length < 1) continue;\n\n      var scored = items.map(function (el, index) {\n        var a = el.querySelector('a[href*=\"/products/\"]');\n        var handle = productHandleFromHref(a && a.getAttribute('href'));\n        var title = a ? a.textContent || '' : '';\n        var entityScore = scoreHandle(handle);\n        return {\n          el: el,\n          index: index,\n          score: scoreByHandleTitleGenres(handle, title, [], affinity) + entityScore,\n          handle: handle\n        };\n      });\n\n      if (!scored.some(function (row) { return row.score > 0; })) continue;\n\n      scored.sort(function (a, b) {\n        if (b.score !== a.score) return b.score - a.score;\n        return a.index - b.index;\n      });\n\n      var before = listSignature(items);\n      var after = scored\n        .map(function (row) { return row.handle; })\n        .join('|');\n      var sig = term + '::' + after;\n\n      if (list.getAttribute('data-wmn-sorted') === sig && before === after) {\n        ensureBanner(list);\n        any = true;\n        continue;\n      }\n\n      if (before !== after) {\n        var seeAll = list.querySelector('li.all-results');\n        var banner = list.querySelector('.wmn-engagement-banner');\n        scored.forEach(function (row) {\n          list.appendChild(row.el);\n        });\n        if (seeAll) list.appendChild(seeAll);\n        if (banner) list.insertBefore(banner, list.firstChild);\n      }\n\n      list.setAttribute('data-wmn-sorted', sig);\n      ensureBanner(list);\n      any = true;\n    }\n    return any;\n  }\n\n  function bindEngagementObservers() {\n    if (window.__wmnEngObs) return;\n    window.__wmnEngObs = true;\n\n    document.addEventListener(\n      'click',\n      function (e) {\n        var chipA =\n          e.target && e.target.closest ? e.target.closest('a.wmn-genres__chip') : null;\n        if (chipA) window.__wmnProductNavUntil = Date.now() + 1600;\n        var a = e.target && e.target.closest ? e.target.closest('a[href*=\"/products/\"]') : null;\n        if (!a) return;\n        if (a.closest && a.closest('.search__results')) return;\n        var handle = productHandleFromHref(a.getAttribute('href'));\n        if (!handle) return;\n        // Repainting the collection grid in this click removes the link\n        // before the browser follows it, so the page reshuffles and stays put.\n        window.__wmnProductNavUntil = Date.now() + 1600;\n        var imgEl = a.querySelector('img');\n        recordView({\n          handle: handle,\n          title: (a.textContent || '').trim(),\n          image: withShopifyImageWidth(bestImgUrlFromElement(imgEl), 1200),\n          genres: []\n        });\n        if (\n          e.button === 0 &&\n          !e.metaKey &&\n          !e.ctrlKey &&\n          !e.shiftKey &&\n          !e.altKey &&\n          (!a.target || a.target === '_self')\n        ) {\n          var href = a.href;\n          var before = location.href;\n          setTimeout(function () {\n            if (!href || location.href !== before) return;\n            location.assign(href);\n          }, 400);\n        }\n      },\n      true\n    );\n\n    if (window.MutationObserver) {\n      var scheduled = null;\n      var obs = new MutationObserver(function (mutations) {\n        if (window.__wmnEngMutating) return;\n        var relevant = false;\n        for (var m = 0; m < mutations.length; m++) {\n          var t = mutations[m].target;\n          if (\n            t &&\n            t.closest &&\n            t.closest('.search__results, .search__results-wrapper')\n          ) {\n            relevant = true;\n            break;\n          }\n          var nodes = mutations[m].addedNodes;\n          for (var n = 0; n < nodes.length; n++) {\n            var node = nodes[n];\n            if (\n              node.nodeType === 1 &&\n              (node.classList.contains('search__results') ||\n                node.querySelector &&\n                  node.querySelector('.search__results'))\n            ) {\n              relevant = true;\n              break;\n            }\n          }\n          if (relevant) break;\n        }\n        if (!relevant) return;\n        if (scheduled) return;\n        scheduled = window.requestAnimationFrame(function () {\n          scheduled = null;\n          window.__wmnEngMutating = true;\n          try {\n            reorderAutocompleteLists();\n          } finally {\n            window.__wmnEngMutating = false;\n          }\n        });\n      });\n      obs.observe(document.documentElement, { childList: true, subtree: true });\n    }\n  }\n\n  function searchTermFromPage() {\n    try {\n      var params = new URLSearchParams(window.location.search || '');\n      return String(params.get('q') || '')\n        .toLowerCase()\n        .replace(/\\*/g, '')\n        .trim();\n    } catch (e) {\n      return '';\n    }\n  }\n\n  function lastViewedByHandle(events) {\n    var map = {};\n    for (var i = 0; i < (events || []).length; i++) {\n      var ev = events[i];\n      if (!ev || !ev.h || !ev.t) continue;\n      var prev = map[ev.h];\n      if (!prev || (ev.t || 0) >= (prev.t || 0)) {\n        map[ev.h] = richerEvent(prev, ev);\n        map[ev.h].t = Math.max(prev ? prev.t || 0 : 0, ev.t || 0);\n      }\n    }\n    return map;\n  }\n\n  function termMatchingViews(store, term) {\n    if (!term || !store || !store.events.length) return [];\n    var viewed = lastViewedByHandle(store.events);\n    var list = [];\n    for (var h in viewed) {\n      if (!Object.prototype.hasOwnProperty.call(viewed, h)) continue;\n      var ev = viewed[h];\n      if (eventTitleHandleMatch(ev, term)) list.push(ev);\n    }\n    list.sort(function (a, b) {\n      return (b.t || 0) - (a.t || 0);\n    });\n    return list;\n  }\n\n  function recencyScoreForElement(el, term, viewedMap) {\n    var handle = el.getAttribute('data-wmn-handle') || '';\n    if (!handle || !viewedMap[handle]) return 0;\n    var viewed = viewedMap[handle];\n    if (eventTitleHandleMatch(viewed, term)) return viewed.t || 0;\n    var title = String(el.getAttribute('data-wmn-title') || '').toLowerCase();\n    var handleWords = handle.toLowerCase().replace(/-/g, ' ');\n    if (\n      term &&\n      (title.indexOf(term) !== -1 || handleWords.indexOf(term) !== -1)\n    ) {\n      return viewed.t || 0;\n    }\n    return 0;\n  }\n\n  function bindMemoryNav(root) {\n    var links = root.querySelectorAll('a[href*=\"/products/\"]');\n    for (var i = 0; i < links.length; i++) {\n      (function (a) {\n        a.setAttribute('data-no-instant', 'true');\n        a.addEventListener('click', function (e) {\n          e.preventDefault();\n          e.stopPropagation();\n          window.location.href = a.href;\n        });\n      })(links[i]);\n    }\n  }\n\n  function formatChipsHtml(tags, title) {\n    var hasCd = false;\n    var hasDigital = false;\n    var hasVinyl = false;\n    var list = tags || [];\n    for (var i = 0; i < list.length; i++) {\n      var t = String(list[i] || '').toLowerCase().trim();\n      if (t === 'cd' || t === '2xcd' || t === '2 x cd' || t === 'cds' || t.indexOf('x cd') !== -1 || t.indexOf('xcd') !== -1) {\n        hasCd = true;\n      } else if (t === 'digital' || t === 'download' || t === 'mp3' || t === 'flac') {\n        hasDigital = true;\n      } else if (t === 'vinyl' || t === 'vinyl lp' || t === 'lp' || t.indexOf('vinyl') !== -1) {\n        hasVinyl = true;\n      }\n    }\n    if (!hasCd && !hasDigital && !hasVinyl) {\n      var titleL = String(title || '').toLowerCase();\n      if (titleL.indexOf('vinyl') !== -1) hasVinyl = true;\n      if (titleL.indexOf('digital') !== -1 || titleL.indexOf('download') !== -1 || titleL.indexOf('mp3') !== -1) {\n        hasDigital = true;\n      }\n      if (\n        titleL.indexOf(' cd') !== -1 ||\n        titleL.indexOf('(cd)') !== -1 ||\n        titleL.indexOf('x cd') !== -1 ||\n        titleL.indexOf('cd bundle') !== -1 ||\n        titleL.indexOf('cds') !== -1\n      ) {\n        hasCd = true;\n      }\n    }\n    if (!hasCd && !hasDigital && !hasVinyl) return '';\n    var html = '<span class=\"wmn-format\" aria-label=\"Format\">';\n    if (hasCd) html += '<span class=\"wmn-format__chip\">CD</span>';\n    if (hasDigital) html += '<span class=\"wmn-format__chip\">Digital</span>';\n    if (hasVinyl) html += '<span class=\"wmn-format__chip\">Vinyl</span>';\n    html += '</span>';\n    return html;\n  }\n\n  function collectionCardExtras(handle, genres) {\n    var sp = '';\n    try {\n      if (\n        window.wmnCatalogGraph &&\n        typeof window.wmnCatalogGraph.getSpotifyPath === 'function'\n      ) {\n        sp = window.wmnCatalogGraph.getSpotifyPath(handle) || '';\n      }\n    } catch (eSp) {\n      sp = '';\n    }\n    var play = '';\n    if (sp) {\n      play =\n        '<button type=\"button\" class=\"wmn-card-cover__play\" data-wmn-play data-wmn-listen data-wmn-handle=\"' +\n        escapeHtml(handle) +\n        '\" data-wmn-spotify=\"' +\n        escapeHtml(sp) +\n        '\" data-wmn-play-source=\"collection-grid\" aria-label=\"Play preview\" aria-pressed=\"false\">' +\n        '<svg class=\"wmn-card-cover__play-icon wmn-card-cover__play-icon--play\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M8 5v14l11-7z\"/></svg>' +\n        '<svg class=\"wmn-card-cover__play-icon wmn-card-cover__play-icon--pause\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M6 5h4v14H6zm8 0h4v14h-4z\"/></svg>' +\n        '</button>';\n    }\n    var genreHtml = '';\n    var list = genres || [];\n    if (list.length) {\n      genreHtml = '<div class=\"wmn-genres wmn-genres--compact\" data-wmn-genres><ul class=\"wmn-genres__list\" role=\"list\">';\n      var gi;\n      for (gi = 0; gi < list.length && gi < 3; gi++) {\n        var label = list[gi];\n        if (!label) continue;\n        genreHtml +=\n          '<li><a class=\"wmn-genres__chip\" href=\"/collections/all/' +\n          escapeHtml(handleize(label)) +\n          '\">' +\n          escapeHtml(label) +\n          '</a></li>';\n      }\n      genreHtml += '</ul></div>';\n    }\n    return { play: play, genres: genreHtml, sp: sp };\n  }\n\n  function buildSearchMemoryCard(ev, className, opts) {\n    if (!ev || !ev.h || !catalogOffers(ev.h)) return null;\n    var div = document.createElement('div');\n    div.className = (className || 'thumbnail') + ' wmn-memory-search-card';\n    div.setAttribute('data-wmn-handle', ev.h);\n    div.setAttribute('data-wmn-title', ev.title || '');\n    div.setAttribute('data-wmn-injected', '1');\n\n    var href = '/products/' + encodeURIComponent(ev.h);\n    var title = escapeHtml(ev.title || ev.h.replace(/-/g, ' '));\n    var price = escapeHtml(ev.price || '');\n    var kicker = '';\n    if (window.wmnCardKicker) {\n      kicker = window.wmnCardKicker({\n        handle: ev.h,\n        title: ev.title || '',\n        artist: ev.artist || '',\n        tags: ev.tags || []\n      });\n    }\n    kicker = kicker ? '<span class=\"artist\">' + escapeHtml(kicker) + '</span>' : '';\n    var img = withShopifyImageWidth(normalizeImageUrl(ev.img), 1200);\n    // Dig deeper paints into a [hidden] section first \u2014 Safari skips lazy loads there.\n    var loadingAttr = opts && opts.eager ? 'eager' : 'lazy';\n    var imgHtml = img\n      ? '<img src=\"' +\n        escapeHtml(img) +\n        '\" alt=\"' +\n        title +\n        '\" loading=\"' +\n        loadingAttr +\n        '\" decoding=\"async\" width=\"800\" height=\"800\" />'\n      : '';\n    var formatHtml = formatChipsHtml(ev.tags, ev.title || '');\n    var playHtml = '';\n    var genreHtml = '';\n    if (opts && opts.collection) {\n      var extras = collectionCardExtras(ev.h, (opts && opts.genres) || []);\n      playHtml = extras.play;\n      genreHtml = extras.genres;\n      if (extras.sp) div.setAttribute('data-wmn-spotify', extras.sp);\n      if (opts.genres && opts.genres.length) {\n        div.setAttribute('data-wmn-genres', opts.genres.join('|'));\n      }\n    }\n\n    div.innerHTML =\n      '<div class=\"product-wrap\">' +\n      '<div class=\"relative product_image\">' +\n      '<a href=\"' +\n      href +\n      '\">' +\n      '<div class=\"image__container\">' +\n      imgHtml +\n      '</div></a>' +\n      playHtml +\n      '</div>' +\n      '<a class=\"product-info__caption\" href=\"' +\n      href +\n      '\">' +\n      kicker +\n      '<span class=\"title\">' +\n      title +\n      '</span>' +\n      formatHtml +\n      (price ? '<span class=\"price\">' + price + '</span>' : '') +\n      '</a>' +\n      genreHtml +\n      '</div>';\n\n    bindMemoryNav(div);\n    return div;\n  }\n\n  function injectViewedIntoSearchGrid(grid, term, store) {\n    if (!grid || !term || !store.events.length) return 0;\n    if (\n      grid.getAttribute('data-wmn-search-injected') === term &&\n      grid.querySelector('[data-wmn-injected=\"1\"]')\n    ) {\n      return 0;\n    }\n\n    var existing = {};\n    var nodes = grid.querySelectorAll('[data-wmn-handle]');\n    for (var i = 0; i < nodes.length; i++) {\n      var h = nodes[i].getAttribute('data-wmn-handle');\n      if (h) existing[h] = true;\n    }\n\n    var sample = grid.querySelector('[data-wmn-handle]:not([data-wmn-injected])');\n    if (!sample) sample = grid.querySelector('[data-wmn-handle]');\n    if (!sample) return 0;\n\n    var className = sample.className\n      .replace(/\\bwmn-memory-search-card\\b/g, '')\n      .replace(/\\beven\\b/g, '')\n      .replace(/\\bodd\\b/g, '')\n      .replace(/\\s+/g, ' ')\n      .trim();\n\n    var matches = termMatchingViews(store, term);\n    var toInsert = [];\n    for (var j = 0; j < matches.length && toInsert.length < MAX_SEARCH_INJECT; j++) {\n      if (existing[matches[j].h]) continue;\n      toInsert.push(matches[j]);\n    }\n    if (!toInsert.length) {\n      grid.setAttribute('data-wmn-search-injected', term);\n      return 0;\n    }\n\n    var first = grid.querySelector('[data-wmn-handle]');\n    for (var k = toInsert.length - 1; k >= 0; k--) {\n      if (!catalogOffers(toInsert[k].h)) continue;\n      var memoryCard = buildSearchMemoryCard(toInsert[k], className);\n      if (memoryCard) grid.insertBefore(memoryCard, first);\n    }\n    grid.setAttribute('data-wmn-search-injected', term);\n    nudgeStuckLazyImages(grid);\n    return toInsert.length;\n  }\n\n  /**\n   * After DOM reorder/inject, lazySizes often leaves blur-up LQIP (100x) stuck:\n   * class stays \"lazyload\", filter:blur(5px), naturalWidth\u2248100. Scroll may not\n   * re-fire, so viewport cards never unveil. Force-promote visible (and near)\n   * product-grid covers, then ask lazySizes to rescan.\n   */\n  function nudgeStuckLazyImages(root) {\n    var scope = root || document;\n    function unveilImg(img) {\n      if (!img) return false;\n      var pending =\n        img.getAttribute('data-src') ||\n        img.getAttribute('data-srcset') ||\n        '';\n      var stuckLqip =\n        img.classList.contains('lazyload') &&\n        pending &&\n        (!img.naturalWidth || img.naturalWidth <= 120);\n      var missingSrc = !img.getAttribute('src') && !!pending;\n      if (!stuckLqip && !missingSrc) return false;\n      var full = img.getAttribute('data-src');\n      var fullSet = img.getAttribute('data-srcset');\n      if (fullSet) {\n        img.setAttribute('srcset', fullSet);\n        img.removeAttribute('data-srcset');\n      }\n      if (full) {\n        img.setAttribute('src', full);\n        img.removeAttribute('data-src');\n      }\n      img.classList.remove('lazyload', 'lazyloading');\n      img.classList.add('lazyloaded');\n      return true;\n    }\n\n    function run() {\n      try {\n        if (window.lazySizes && window.lazySizes.loader) {\n          window.lazySizes.loader.checkElems();\n        }\n        if (window.lazySizes && window.lazySizes.autoSizer) {\n          window.lazySizes.autoSizer.checkElems();\n        }\n      } catch (eLs) {\n        /* ignore */\n      }\n\n      var vh = window.innerHeight || 800;\n      var imgs = scope.querySelectorAll\n        ? scope.querySelectorAll(\n            '.product-list img.lazyload, .thumbnail img.lazyload, .search-matrix img.lazyload'\n          )\n        : [];\n      var i;\n      for (i = 0; i < imgs.length; i++) {\n        var img = imgs[i];\n        var rect = img.getBoundingClientRect();\n        // Near viewport \u2014 reorder can move LQIP cards on-screen without scroll.\n        if (rect.bottom < -240 || rect.top > vh + 900) continue;\n        unveilImg(img);\n      }\n\n      // Always clear stuck covers on the first screen of product grids\n      // (reorder can leave LQIP in row 1\u20132 with stale rects for a frame).\n      var grids = scope.querySelectorAll\n        ? scope.querySelectorAll('.product-list, .search-matrix')\n        : [];\n      for (i = 0; i < grids.length; i++) {\n        var cards = grids[i].querySelectorAll('[data-wmn-handle]');\n        var ci;\n        for (ci = 0; ci < cards.length && ci < 12; ci++) {\n          var cardImgs = cards[ci].querySelectorAll('img.lazyload');\n          var ji;\n          for (ji = 0; ji < cardImgs.length; ji++) unveilImg(cardImgs[ji]);\n        }\n      }\n\n      // Injected memory cards with empty cover \u2014 fill from catalog graph.\n      var memCards = scope.querySelectorAll\n        ? scope.querySelectorAll('.wmn-memory-search-card[data-wmn-handle]')\n        : [];\n      for (i = 0; i < memCards.length; i++) {\n        var card = memCards[i];\n        if (card.querySelector('img')) continue;\n        var handle = card.getAttribute('data-wmn-handle');\n        if (!handle || !window.wmnCatalogGraph) continue;\n        var gImg =\n          typeof window.wmnCatalogGraph.getProductImage === 'function'\n            ? window.wmnCatalogGraph.getProductImage(handle)\n            : '';\n        if (!gImg) continue;\n        var box = card.querySelector('.image__container');\n        if (!box) continue;\n        var title = card.getAttribute('data-wmn-title') || '';\n        box.innerHTML =\n          '<img src=\"' +\n          escapeHtml(withShopifyImageWidth(normalizeImageUrl(gImg), 800)) +\n          '\" alt=\"' +\n          escapeHtml(title) +\n          '\" loading=\"eager\" decoding=\"async\" width=\"800\" height=\"800\" />';\n      }\n    }\n\n    run();\n    if (typeof requestAnimationFrame === 'function') {\n      requestAnimationFrame(function () {\n        requestAnimationFrame(run);\n      });\n    }\n    setTimeout(run, 120);\n    setTimeout(run, 500);\n  }\n\n  function armStuckLazyImageObserver() {\n    if (window.__wmnStuckLazyObs || typeof IntersectionObserver !== 'function') {\n      return;\n    }\n    window.__wmnStuckLazyObs = true;\n    var obs = new IntersectionObserver(\n      function (entries) {\n        var ei;\n        for (ei = 0; ei < entries.length; ei++) {\n          if (!entries[ei].isIntersecting) continue;\n          var img = entries[ei].target;\n          if (!img || !img.classList || !img.classList.contains('lazyload')) {\n            continue;\n          }\n          var full = img.getAttribute('data-src');\n          var fullSet = img.getAttribute('data-srcset');\n          if (!full && !fullSet) continue;\n          if (fullSet) {\n            img.setAttribute('srcset', fullSet);\n            img.removeAttribute('data-srcset');\n          }\n          if (full) {\n            img.setAttribute('src', full);\n            img.removeAttribute('data-src');\n          }\n          img.classList.remove('lazyload', 'lazyloading');\n          img.classList.add('lazyloaded');\n          obs.unobserve(img);\n        }\n      },\n      { root: null, rootMargin: '200px 0px', threshold: 0.01 }\n    );\n    function scan() {\n      var imgs = document.querySelectorAll(\n        '.product-list img.lazyload[data-src], .thumbnail img.lazyload[data-src], .search-matrix img.lazyload[data-src]'\n      );\n      var i;\n      for (i = 0; i < imgs.length; i++) obs.observe(imgs[i]);\n    }\n    scan();\n    setTimeout(scan, 400);\n    setTimeout(scan, 1200);\n    document.addEventListener(\n      'scroll',\n      function () {\n        if (window.__wmnStuckLazyScroll) return;\n        window.__wmnStuckLazyScroll = true;\n        requestAnimationFrame(function () {\n          window.__wmnStuckLazyScroll = false;\n          nudgeStuckLazyImages(document);\n        });\n      },\n      { passive: true, capture: true }\n    );\n  }\n\n  function reorderListByRecency(container, itemSelector, term, store) {\n    var items = Array.prototype.slice.call(\n      container.querySelectorAll(itemSelector)\n    );\n    if (items.length < 1) return false;\n    if (!store.events.length || !term) return false;\n\n    var viewedMap = lastViewedByHandle(store.events);\n    var scored = items.map(function (el, index) {\n      return {\n        el: el,\n        index: index,\n        score: recencyScoreForElement(el, term, viewedMap),\n        handle: el.getAttribute('data-wmn-handle') || ''\n      };\n    });\n\n    if (!scored.some(function (row) { return row.score > 0; })) return false;\n\n    scored.sort(function (a, b) {\n      if (b.score !== a.score) return b.score - a.score;\n      return a.index - b.index;\n    });\n\n    if (!scored.some(function (row, i) { return row.index !== i; })) {\n      ensureBanner(container);\n      return true;\n    }\n\n    var loadMore = container.querySelector('.js-load-more, .load-more');\n    var banner = container.querySelector('.wmn-engagement-banner');\n    var frag = document.createDocumentFragment();\n    scored.forEach(function (row) {\n      frag.appendChild(row.el);\n    });\n    container.appendChild(frag);\n    if (loadMore) container.appendChild(loadMore);\n    if (banner) container.insertBefore(banner, container.firstChild);\n    ensureBanner(container);\n    nudgeStuckLazyImages(container);\n    return true;\n  }\n\n  /**\n   * When /search?q= matches an exact catalog genre, hide Shopify body/semantic\n   * false hits (Gnawa / Rare Groove ranking for \"Jazz\") and prefer the tag\n   * collection URL for a clean result set.\n   */\n  function filterExactGenreSearchResults(term) {\n    if (!term) return false;\n    if (\n      !window.wmnCatalogGraph ||\n      typeof window.wmnCatalogGraph.exactGenreFromQuery !== 'function'\n    ) {\n      return false;\n    }\n    if (!graphReady()) {\n      ensureGraphWarm();\n      if (window.wmnCatalogGraph.ensureLoaded) {\n        window.wmnCatalogGraph.ensureLoaded().then(function () {\n          filterExactGenreSearchResults(term);\n        }).catch(function () {});\n      }\n      return false;\n    }\n    var slug = window.wmnCatalogGraph.exactGenreFromQuery(term);\n    if (!slug) return false;\n\n    // Full search page \u2192 curated tag collection (same chips as PDP genre pills).\n    try {\n      var path = (window.location.pathname || '').toLowerCase();\n      if (path.indexOf('/search') !== -1) {\n        var dest = '/collections/all/' + encodeURIComponent(slug);\n        window.location.replace(dest);\n        return true;\n      }\n    } catch (eRedir) {\n      /* continue with in-page filter */\n    }\n\n    var roots = document.querySelectorAll(\n      '.product-list.search-matrix, .search-matrix'\n    );\n    var hidden = 0;\n    var ri;\n    for (ri = 0; ri < roots.length; ri++) {\n      var root = roots[ri];\n      var cards = root.querySelectorAll('[data-wmn-handle]');\n      var ci;\n      for (ci = 0; ci < cards.length; ci++) {\n        var el = cards[ci];\n        var handle = el.getAttribute('data-wmn-handle') || '';\n        if (!handle) continue;\n        if (becauseProductMatchesGenre(handle, slug)) continue;\n        el.style.display = 'none';\n        el.setAttribute('data-wmn-genre-filtered', slug);\n        hidden++;\n      }\n    }\n    return hidden > 0;\n  }\n\n  function reorderSearch() {\n    var term = searchTermFromPage() || activeSearchTerm();\n    if (term && filterExactGenreSearchResults(term)) {\n      // Redirected to genre collection.\n      return true;\n    }\n\n    var store = readStore();\n    if (!store.events.length) return false;\n    if (!term) return false;\n\n    // Product-grid search (settings.search_option = products)\n    var grid = document.querySelector('.product-list.search-matrix');\n    if (grid && grid.querySelector('[data-wmn-handle]')) {\n      injectViewedIntoSearchGrid(grid, term, store);\n      return reorderListByRecency(grid, '[data-wmn-handle]', term, store);\n    }\n    // List-style search fallback (reorder only)\n    var list = document.querySelector('.search-matrix');\n    if (list && list.querySelector('.product_row[data-wmn-handle]')) {\n      return reorderListByRecency(\n        list,\n        '.product_row[data-wmn-handle]',\n        term,\n        store\n      );\n    }\n    return false;\n  }\n\n  function stripAffinityBanner(container) {\n    // Affinity grids used to inject \"Personalized for you\" \u2014 redundant under\n    // Shopify \"You may also like\" and other product-list section headings.\n    if (!container) return;\n    var banner = container.querySelector('.wmn-engagement-banner');\n    if (banner && banner.parentNode) banner.parentNode.removeChild(banner);\n  }\n\n  /** A genre or region chip puts a tag on the collection URL. */\n  function collectionTagFilterActive() {\n    try {\n      var parts = String(location.pathname || '')\n        .split('/')\n        .filter(Boolean);\n      return parts[0] === 'collections' && parts.length >= 3 && !!parts[2];\n    } catch (eTag) {\n      return false;\n    }\n  }\n\n  /** Current collection sort from URL (empty \u21D2 algorithm default). */\n  function collectionSortFromUrl() {\n    try {\n      var params = new URLSearchParams(window.location.search || '');\n      return String(params.get('sort_by') || '').trim();\n    } catch (e) {\n      return '';\n    }\n  }\n\n  /**\n   * Store/collection pages default to algorithm (\"for-you\") unless the shopper\n   * picked an explicit Shopify sort (A\u2013Z, price, date, best-selling, featured).\n   */\n  function wantsAlgorithmCollectionSort() {\n    var sort = collectionSortFromUrl();\n    if (!sort || sort === 'for-you') return true;\n    return !EXPLICIT_SHOPIFY_SORTS[sort];\n  }\n\n  function isHomepagePersonalRail(node) {\n    if (!node || !node.closest) return false;\n    return !!node.closest(\n      '#wmn-because-you-looked, #wmn-because-grid, #wmn-for-you, #wmn-for-you-grid, [data-wmn-rg-rail], [data-wmn-for-you], [data-wmn-because]'\n    );\n  }\n\n  function isCollectionProductGrid(container) {\n    if (!container || !container.classList) return false;\n    if (isHomepagePersonalRail(container)) return false;\n    if (container.classList.contains('search-matrix')) return false;\n    if (container.closest && container.closest('.search-matrix')) return false;\n    // Homepage rails reuse collection-matrix. Only the collection template\n    // should be repainted, or the homepage jumps while you scroll.\n    if (!container.closest) return false;\n    return !!container.closest('.collection-template-section, .collection-template');\n  }\n\n  /**\n   * Algorithm score for a collection card: intent-field whenever it has energy\n   * (typed search settle, not only lean/committed), else entity prefs with\n   * geo damp + focus latch. Stable index keeps Shopify order as tiebreaker.\n   */\n  function scoreCollectionCard(el, affinity) {\n    var handle = el.getAttribute('data-wmn-handle') || '';\n    if (!handle) return 0;\n    var prim = collectionFocusPrimary();\n    var score = 0;\n    try {\n      if (\n        fieldHasRankableEnergy() &&\n        window.wmnIntentField &&\n        typeof window.wmnIntentField.scoreHandle === 'function'\n      ) {\n        score += window.wmnIntentField.scoreHandle(handle) || 0;\n      } else {\n        score += scoreHandleEntities(handle, collectionScoreCtx()) || 0;\n      }\n      // Focus lane always wins on Store For you \u2014 even when lean field still\n      // has Jazz energy while the ghost says \"indian classical raga\".\n      if (prim.dominant) {\n        score += collectionFocusLatch(handle, prim);\n        if (!productMatchesCollectionFocus(handle, prim)) {\n          score -= 5000;\n        }\n      }\n    } catch (eScore) {\n      /* ignore */\n    }\n    if (affinity) {\n      score += scoreElement(el, affinity) * 0.25;\n    }\n    return score;\n  }\n\n  /** Clear prior collection sort signatures so prefs/focus can re-rank. */\n  function invalidateCollectionAlgorithmSort() {\n    var grids = document.querySelectorAll(\n      '.product-list.collection-matrix, .collection-template-section .product-list'\n    );\n    var i;\n    for (i = 0; i < grids.length; i++) {\n      grids[i].removeAttribute('data-wmn-aff-sorted');\n      // Allow interest inject / paint to re-run when focus/field changes.\n      grids[i].removeAttribute('data-wmn-interest-injected');\n      grids[i].removeAttribute('data-wmn-fy-painted');\n    }\n  }\n\n  function reorderAffinityGrid(container, opts) {\n    if (!container) return false;\n    opts = opts || {};\n    stripAffinityBanner(container);\n    var isCollection = isCollectionProductGrid(container);\n    // Collection cards are .thumbnail[data-wmn-handle]. Play buttons and other\n    // nested controls also carry data-wmn-handle \u2014 never move those or cards\n    // get torn apart and zero-score orphans float into the ranking.\n    var itemSelector = isCollection\n      ? '.thumbnail[data-wmn-handle]'\n      : '[data-wmn-handle]';\n    var items = Array.prototype.slice.call(\n      container.querySelectorAll(itemSelector)\n    );\n    if (!isCollection) {\n      items = items.filter(function (el) {\n        var parent = el.parentElement;\n        while (parent && parent !== container) {\n          if (parent.getAttribute && parent.getAttribute('data-wmn-handle')) {\n            return false;\n          }\n          parent = parent.parentElement;\n        }\n        return true;\n      });\n      if (items.length < 2) return false;\n    }\n\n    if (isCollection && !wantsAlgorithmCollectionSort() && !opts.forceAlgorithm) {\n      clearCollectionInterestInjects(container);\n      clearCollectionForYouPaint(container);\n      restoreCollectionSsr(container);\n      return false;\n    }\n\n    ensureGraphWarm();\n    if (isCollection) {\n      // Warm interest: paint full ranked pool slice (shared homepage scorer).\n      // Cold: keep native Shopify order (+ light reorder / inject fallback).\n      if (collectionInterestWarm() && graphReady()) {\n        try {\n          if (paintCollectionForYouMatrix(container)) {\n            syncCollectionSortSelect(true);\n            return true;\n          }\n        } catch (ePaint) {\n          /* fall through to inject/reorder */\n        }\n      } else {\n        try {\n          restoreCollectionSsr(container);\n        } catch (eRest) {\n          /* ignore */\n        }\n      }\n      try {\n        injectCollectionInterestMatches(container);\n      } catch (eInj) {\n        /* ignore */\n      }\n      items = Array.prototype.slice.call(\n        container.querySelectorAll(itemSelector)\n      );\n      if (items.length < 2) return false;\n    }\n\n    var store = readStore();\n    var affinity = getAffinityCompat();\n    var hasSignal =\n      (store.events && store.events.length) ||\n      Object.keys(store.entities || {}).length ||\n      Object.keys(affinity.genres || {}).length ||\n      Object.keys(affinity.handles || {}).length ||\n      fieldOwnsRanking() ||\n      graphReady();\n\n    // Collection pages: still reorder when graph is ready (cold = stable\n    // Shopify order via index tiebreak). Other grids need affinity signal.\n    if (!isCollection && !hasSignal) return false;\n    if (\n      !isCollection &&\n      !Object.keys(affinity.genres).length &&\n      !Object.keys(affinity.handles).length &&\n      !Object.keys(store.entities || {}).length &&\n      !(store.events && store.events.length)\n    ) {\n      return false;\n    }\n\n    var scored = items.map(function (el, index) {\n      var handle = el.getAttribute('data-wmn-handle') || '';\n      var score = isCollection\n        ? scoreCollectionCard(el, affinity)\n        : scoreElement(el, affinity) + scoreHandle(handle);\n      return {\n        el: el,\n        index: index,\n        score: score,\n        handle: handle\n      };\n    });\n\n    if (!isCollection && !scored.some(function (row) { return row.score > 0; })) {\n      return false;\n    }\n\n    scored.sort(function (a, b) {\n      if (b.score !== a.score) return b.score - a.score;\n      return a.index - b.index;\n    });\n\n    var before = scored\n      .slice()\n      .sort(function (a, b) { return a.index - b.index; })\n      .map(function (r) { return r.handle; })\n      .join('|');\n    var after = scored.map(function (r) { return r.handle; }).join('|');\n    var sig = (isCollection ? 'algo::' : 'aff::') + after;\n    if (container.getAttribute('data-wmn-aff-sorted') === sig && before === after) {\n      return false;\n    }\n\n    if (before === after) {\n      container.setAttribute('data-wmn-aff-sorted', sig);\n      syncCollectionSortSelect(isCollection);\n      return false;\n    }\n\n    var loadMore = container.querySelector('.js-load-more, .load-more');\n    var frag = document.createDocumentFragment();\n    scored.forEach(function (row) {\n      frag.appendChild(row.el);\n    });\n    container.appendChild(frag);\n    if (loadMore) container.appendChild(loadMore);\n    container.setAttribute('data-wmn-aff-sorted', sig);\n    nudgeStuckLazyImages(container);\n    syncCollectionSortSelect(isCollection);\n    return true;\n  }\n\n  function syncCollectionSortSelect(isCollection) {\n    if (isCollection === false) return;\n    var sel = document.getElementById('sort-by');\n    if (!sel) return;\n    if (!wantsAlgorithmCollectionSort()) return;\n    var opt = sel.querySelector('option[value=\"for-you\"]');\n    if (!opt) return;\n    if (sel.value !== 'for-you') sel.value = 'for-you';\n  }\n\n  function reorderProductGrids() {\n    // Skip full search matrix (handled by reorderSearch recency)\n    var any = false;\n    var seen = [];\n    function consider(grid) {\n      if (!grid || seen.indexOf(grid) !== -1) return;\n      seen.push(grid);\n      if (isHomepagePersonalRail(grid)) return;\n      if (grid.classList.contains('search-matrix')) return;\n      if (grid.closest && grid.closest('.search-matrix')) return;\n      if (reorderAffinityGrid(grid)) any = true;\n    }\n    var i;\n    for (i = 0; i < GRID_SELECTORS.length; i++) {\n      var nodes = document.querySelectorAll(GRID_SELECTORS[i]);\n      var j;\n      for (j = 0; j < nodes.length; j++) consider(nodes[j]);\n    }\n    // Fallback: any collection matrix on the page\n    var matrices = document.querySelectorAll('.product-list.collection-matrix');\n    for (i = 0; i < matrices.length; i++) consider(matrices[i]);\n    return any;\n  }\n\n  /**\n   * After catalog graph loads, re-run collection algorithm sort (scores need\n   * resolveProduct). Safe to call repeatedly.\n   */\n  function scheduleCollectionAlgorithmSort() {\n    function run() {\n      if (window.__wmnProductNavUntil && Date.now() < window.__wmnProductNavUntil) return;\n      reorderProductGrids();\n    }\n    run();\n    ensureGraphWarm();\n    if (\n      window.wmnCatalogGraph &&\n      typeof window.wmnCatalogGraph.ensureLoaded === 'function'\n    ) {\n      window.wmnCatalogGraph.ensureLoaded().then(run).catch(function () {});\n    }\n    setTimeout(run, 400);\n    setTimeout(run, 1200);\n  }\n\n  function bindCollectionSortSelect() {\n    if (window.__wmnCollectionSortBound) return;\n    window.__wmnCollectionSortBound = true;\n    document.addEventListener(\n      'change',\n      function (ev) {\n        var sel = ev.target;\n        if (!sel || sel.id !== 'sort-by') return;\n        var val = sel.value;\n        if (val === 'for-you') {\n          ev.stopImmediatePropagation();\n          ev.preventDefault();\n          // Drop sort_by so Shopify keeps default page payload; we reorder client-side.\n          try {\n            var url = new URL(window.location.href);\n            url.searchParams.delete('sort_by');\n            window.history.replaceState('', '', url.pathname + url.search + url.hash);\n          } catch (eUrl) {\n            /* ignore */\n          }\n          var grids = document.querySelectorAll(\n            '.collection-template-section .product-list.collection-matrix, .collection-template .product-list.collection-matrix, .collection-template-section .product-list'\n          );\n          var gi;\n          for (gi = 0; gi < grids.length; gi++) {\n            if (isHomepagePersonalRail(grids[gi])) continue;\n            grids[gi].removeAttribute('data-wmn-aff-sorted');\n            reorderAffinityGrid(grids[gi], { forceAlgorithm: true });\n          }\n          nudgeStuckLazyImages(document);\n          return;\n        }\n        // Explicit Shopify sorts: navigate via existing quickFilter (bubbles).\n      },\n      true\n    );\n\n    // Re-apply after AJAX collection filter replaces .collection-matrix.\n    if (typeof MutationObserver === 'function') {\n      var timer = 0;\n      var obs = new MutationObserver(function (mutations) {\n        if (timer) clearTimeout(timer);\n        timer = setTimeout(function () {\n          timer = 0;\n          if (!wantsAlgorithmCollectionSort()) return;\n          var grid = document.querySelector(\n            '.collection-template-section .product-list.collection-matrix, .collection-template .product-list.collection-matrix'\n          );\n          if (!grid || isHomepagePersonalRail(grid)) return;\n          // Only skip when the matrix itself was not replaced (same sorted grid).\n          var replaced = false;\n          var mi;\n          for (mi = 0; mi < (mutations || []).length; mi++) {\n            var m = mutations[mi];\n            if (!m || !m.addedNodes) continue;\n            var ni;\n            for (ni = 0; ni < m.addedNodes.length; ni++) {\n              var node = m.addedNodes[ni];\n              if (!node || node.nodeType !== 1) continue;\n              if (\n                (node.classList &&\n                  node.classList.contains('collection-matrix')) ||\n                (node.querySelector &&\n                  node.querySelector('.product-list.collection-matrix'))\n              ) {\n                replaced = true;\n                break;\n              }\n            }\n            if (replaced) break;\n          }\n          if (!replaced && grid.getAttribute('data-wmn-aff-sorted')) return;\n          if (replaced) invalidateCollectionAlgorithmSort();\n          scheduleCollectionAlgorithmSort();\n        }, 80);\n      });\n      var root =\n        document.querySelector('.collection-template-section') ||\n        document.querySelector('.collection-template');\n      if (root) {\n        obs.observe(root, { childList: true, subtree: true });\n      }\n    }\n  }\n\n  /** PDP seed handle for Shopify rec gating (engagement JSON \u2192 URL). */\n  function pdpSeedHandleFromPage() {\n    var node = document.getElementById('wmn-engagement-product');\n    if (node) {\n      try {\n        var payload = JSON.parse(node.textContent || '{}');\n        if (payload && payload.handle) return String(payload.handle);\n      } catch (eSeed) {\n        /* ignore */\n      }\n    }\n    return productHandleFromHref(window.location.pathname) || '';\n  }\n\n  /**\n   * Shopify \"You may also like\" allow-list: keep cards that share the seed's\n   * country, region, or genre (graph gates). Stops India/Africa filling a\n   * France+Jazz PDP when Shopify's related API ignores geo tags.\n   */\n  function shopifyRecMatchesSeed(handle, seedResolved) {\n    if (!handle || !seedResolved || !graphReady()) return false;\n    var countries = seedResolved.countries || [];\n    var regions = seedResolved.regions || [];\n    var genres = seedResolved.genres || [];\n    var i;\n    for (i = 0; i < countries.length; i++) {\n      if (becauseProductMatchesCountry(handle, countries[i])) return true;\n    }\n    for (i = 0; i < regions.length; i++) {\n      if (becauseProductMatchesRegion(handle, regions[i])) return true;\n    }\n    for (i = 0; i < genres.length; i++) {\n      if (becauseProductMatchesGenre(handle, genres[i])) return true;\n    }\n    return false;\n  }\n\n  function shopifyRecsColumnClass(list, index) {\n    var sample = list && list.querySelector('[data-wmn-handle]');\n    if (sample && sample.className) {\n      var base = String(sample.className)\n        .replace(/\\bwmn-memory-search-card\\b/g, '')\n        .replace(/\\bwmn-shopify-recs-topup\\b/g, '')\n        .replace(/\\beven\\b/g, '')\n        .replace(/\\bodd\\b/g, '')\n        .replace(/\\s+/g, ' ')\n        .trim();\n      if (base) {\n        return base + (index % 2 === 0 ? ' even' : ' odd');\n      }\n    }\n    var cycle = index % 4;\n    var pos = cycle === 0 ? 'alpha' : cycle === 3 ? 'omega' : '';\n    return (\n      'thumbnail four columns' +\n      (pos ? ' ' + pos : '') +\n      (index % 2 === 0 ? ' even' : ' odd')\n    );\n  }\n\n  function shopifyRecsTopUpCandidates(seedHandle, seedResolved, existing, need) {\n    var out = [];\n    if (!need || need <= 0 || !graphReady() || !seedResolved) return out;\n    var expandIds = [];\n    var seenId = {};\n    function pushId(id) {\n      if (!id || seenId[id]) return;\n      seenId[id] = true;\n      expandIds.push(id);\n    }\n    var i;\n    var countries = seedResolved.countries || [];\n    var regions = seedResolved.regions || [];\n    var genres = seedResolved.genres || [];\n    for (i = 0; i < countries.length; i++) {\n      if (countries[i]) pushId('country:' + countries[i]);\n    }\n    for (i = 0; i < regions.length; i++) {\n      if (regions[i]) pushId('region:' + regions[i]);\n    }\n    for (i = 0; i < genres.length; i++) {\n      if (genres[i]) pushId('genre:' + genres[i]);\n    }\n    if (!expandIds.length) return out;\n\n    var exclude = pdpExcludeSet(seedHandle);\n    var candidates = window.wmnCatalogGraph.expand(expandIds, 2) || [];\n    var ranked = [];\n    for (i = 0; i < candidates.length; i++) {\n      var h = candidates[i];\n      if (!h || existing[h]) continue;\n      if (!shopifyRecMatchesSeed(h, seedResolved)) continue;\n      var item = graphItemFromHandle(h);\n      if (!item) continue;\n      if (pdpIsExcluded(h, item, exclude)) continue;\n      ranked.push({\n        handle: h,\n        item: item,\n        score: becauseRankScore(h, seedResolved)\n      });\n    }\n    ranked.sort(function (a, b) {\n      if (b.score !== a.score) return b.score - a.score;\n      return String(a.handle).localeCompare(String(b.handle));\n    });\n    for (i = 0; i < ranked.length && out.length < need; i++) {\n      out.push(ranked[i]);\n    }\n    return out;\n  }\n\n  /**\n   * Filter Shopify rec grids to seed geo/genre; top up from catalog graph.\n   * No-op when not on a PDP or seed has no country/region/genre in graph.\n   */\n  function gateShopifyRecsList(list) {\n    if (!list || !graphReady()) return false;\n    var seedHandle = pdpSeedHandleFromPage();\n    if (!seedHandle) return false;\n    var seedResolved = window.wmnCatalogGraph.resolveProduct(seedHandle) || {};\n    var hasLane =\n      (seedResolved.countries && seedResolved.countries.length) ||\n      (seedResolved.regions && seedResolved.regions.length) ||\n      (seedResolved.genres && seedResolved.genres.length);\n    if (!hasLane) return false;\n\n    var cards = Array.prototype.slice.call(\n      list.querySelectorAll('[data-wmn-handle]')\n    );\n    if (!cards.length) return false;\n\n    var targetCount = cards.length;\n    var existing = {};\n    var kept = [];\n    var i;\n    for (i = 0; i < cards.length; i++) {\n      var el = cards[i];\n      var h = el.getAttribute('data-wmn-handle') || '';\n      if (!h) {\n        if (el.parentNode) el.parentNode.removeChild(el);\n        continue;\n      }\n      if (shopifyRecMatchesSeed(h, seedResolved)) {\n        kept.push(el);\n        existing[h] = true;\n      } else if (el.parentNode) {\n        el.parentNode.removeChild(el);\n      }\n    }\n\n    var need = targetCount - kept.length;\n    var topped = false;\n    if (need > 0) {\n      var picks = shopifyRecsTopUpCandidates(\n        seedHandle,\n        seedResolved,\n        existing,\n        need\n      );\n      for (i = 0; i < picks.length; i++) {\n        var pick = picks[i];\n        if (existing[pick.handle]) continue;\n        existing[pick.handle] = true;\n        var ev = {\n          h: pick.handle,\n          title: pick.item.title || pick.handle,\n          img: pick.item.image || '',\n          price: '',\n          tags: []\n        };\n        var card = buildSearchMemoryCard(\n          ev,\n          shopifyRecsColumnClass(list, kept.length)\n        );\n        if (!card) continue;\n        card.classList.add('wmn-shopify-recs-topup');\n        card.removeAttribute('data-wmn-injected');\n        list.appendChild(card);\n        kept.push(card);\n        topped = true;\n      }\n    }\n\n    var root =\n      list.closest && list.closest('.wmn-shopify-recs')\n        ? list.closest('.wmn-shopify-recs')\n        : null;\n    if (!kept.length) {\n      if (root) {\n        root.setAttribute('hidden', 'hidden');\n        root.classList.add('hidden');\n      }\n      list.setAttribute('data-wmn-recs-gated', 'empty');\n      return true;\n    }\n    if (root) {\n      root.removeAttribute('hidden');\n      root.classList.remove('hidden');\n    }\n    var fp = kept\n      .map(function (row) {\n        return row.getAttribute('data-wmn-handle') || '';\n      })\n      .join('|');\n    list.setAttribute('data-wmn-recs-gated', fp);\n    return kept.length < cards.length || topped;\n  }\n\n  function gateShopifyRecs(root) {\n    var scope = root || document;\n    var lists = scope.querySelectorAll\n      ? scope.querySelectorAll('.wmn-shopify-recs .product-list')\n      : [];\n    if (root && root.classList && root.classList.contains('wmn-shopify-recs')) {\n      var pl = root.querySelector('.product-list');\n      lists = pl ? [pl] : [];\n    }\n    var any = false;\n    var i;\n    for (i = 0; i < lists.length; i++) {\n      if (gateShopifyRecsList(lists[i])) any = true;\n    }\n    return any;\n  }\n\n  function rerankRecs(root) {\n    var scope = root || document;\n    var lists = scope.querySelectorAll\n      ? scope.querySelectorAll('.wmn-shopify-recs .product-list')\n      : [];\n    if (root && root.classList && root.classList.contains('wmn-shopify-recs')) {\n      var pl = root.querySelector('.product-list');\n      lists = pl ? [pl] : [];\n    }\n    var any = false;\n    for (var i = 0; i < lists.length; i++) {\n      if (reorderAffinityGrid(lists[i])) any = true;\n    }\n    // Geo/genre hard-gate after affinity reorder (Shopify related is blind\n    // to country:* / region:* tags).\n    if (graphReady()) {\n      if (gateShopifyRecs(root)) any = true;\n    } else {\n      try {\n        if (\n          window.wmnCatalogGraph &&\n          typeof window.wmnCatalogGraph.ensureLoaded === 'function'\n        ) {\n          window.wmnCatalogGraph.ensureLoaded().then(function () {\n            gateShopifyRecs(root);\n          }).catch(function () {});\n        }\n      } catch (eGate) {\n        /* ignore */\n      }\n    }\n    return any;\n  }\n\n  function bindExtraSignals() {\n    if (window.__wmnExtraSignals) return;\n    window.__wmnExtraSignals = true;\n\n    document.addEventListener(\n      'submit',\n      function (e) {\n        var form = e.target;\n        if (!form || !form.getAttribute) return;\n        var action = (form.getAttribute('action') || '').toLowerCase();\n        if (action.indexOf('/cart/add') === -1) return;\n        var handle =\n          (document.querySelector('meta[property=\"og:url\"]') &&\n            productHandleFromHref(\n              document.querySelector('meta[property=\"og:url\"]').getAttribute('content')\n            )) ||\n          productHandleFromHref(window.location.pathname);\n        var node = document.getElementById('wmn-engagement-product');\n        var genres = [];\n        var title = '';\n        if (node) {\n          try {\n            var payload = JSON.parse(node.textContent || '{}');\n            genres = payload.genres || [];\n            title = payload.title || '';\n            handle = payload.handle || handle;\n          } catch (err) {\n            /* ignore */\n          }\n        }\n        if (handle) {\n          recordView({ handle: handle, title: title, genres: genres, kind: 'atc' });\n        }\n      },\n      true\n    );\n\n    document.addEventListener(\n      'click',\n      function (e) {\n        var t = e.target && e.target.closest ? e.target.closest('a, button') : null;\n        if (!t) return;\n\n        if (t.classList && t.classList.contains('wmn-genres__chip')) {\n          var label = (t.textContent || '').trim();\n          if (label) recordView({ genres: [label], kind: 'chip' });\n          return;\n        }\n\n        var listen =\n          t.closest &&\n          (t.closest('[data-wmn-listen]') ||\n            t.closest('.wmn-listen') ||\n            t.closest('a[href*=\"spotify.com\"]') ||\n            t.closest('a[href*=\"music.apple.com\"]') ||\n            t.closest('.product_section a[href*=\"open.spotify\"]'));\n        if (listen) {\n          var node = document.getElementById('wmn-engagement-product');\n          if (node) {\n            try {\n              var payload = JSON.parse(node.textContent || '{}');\n              recordView({\n                handle: payload.handle,\n                title: payload.title,\n                genres: payload.genres || [],\n                image: payload.image,\n                price: payload.price,\n                kind: 'listen'\n              });\n            } catch (err2) {\n              /* ignore */\n            }\n          }\n        }\n      },\n      true\n    );\n  }\n\n  /**\n   * Always-available cloud payload (does not depend on intent-analytics load order).\n   * Prefer analytics builder when present so settles / logTail travel with taste.\n   */\n  function buildTasteCloudProfile(store) {\n    store = store || readStore();\n    if (\n      window.wmnIntentAnalytics &&\n      typeof window.wmnIntentAnalytics.buildCloudProfile === 'function'\n    ) {\n      try {\n        return window.wmnIntentAnalytics.buildCloudProfile(store);\n      } catch (eBuild) {\n        /* fall through to local builder */\n      }\n    }\n    var interest = readInterestProfile();\n    var focus = readFocus();\n    if (!focus && interest && interest.focus) focus = interest.focus;\n    var uEmb = readUEmb();\n    if (!uEmb && interest && interest.uEmb) uEmb = interest.uEmb;\n    return {\n      v: 2,\n      events: store.events || [],\n      entities: store.entities || {},\n      negatives: store.negatives || {},\n      et: store.et,\n      intent: {\n        updatedAt: Date.now(),\n        focus: focus || undefined,\n        uEmb: uEmb || undefined\n      }\n    };\n  }\n\n  /**\n   * Merge a cloud profile object into local durable taste + session.\n   * Used by Liquid seed and by prefs-sync GET hydrate.\n   * @returns {boolean} true when something was applied\n   */\n  function applyCloudProfile(cloud) {\n    if (!cloud || typeof cloud !== 'object') return false;\n    var applied = false;\n    try {\n      var hasEngagement =\n        Array.isArray(cloud.events) ||\n        (cloud.entities && typeof cloud.entities === 'object');\n      var hasInterest = !!(\n        cloud.intent &&\n        (cloud.intent.focus || (cloud.intent.uEmb && cloud.intent.uEmb.v))\n      );\n      if (!hasEngagement && !hasInterest) return false;\n      if (hasEngagement) {\n        if (!Array.isArray(cloud.events)) cloud.events = [];\n        writeStore(mergeStores(readStore(), cloud));\n        applied = true;\n      }\n      if (hasInterest) {\n        applyCloudInterest(cloud);\n        applied = true;\n      }\n      if (applied) {\n        // Refresh pending from merged local so a subsequent prefs-sync flush\n        // does not overwrite cloud with a stale pre-hydrate payload.\n        var mergedStore = readStore();\n        var pendingProfile = buildTasteCloudProfile(mergedStore);\n        try {\n          window.localStorage.setItem(\n            'wmn_prefs_pending_sync',\n            JSON.stringify(pendingProfile)\n          );\n        } catch (ePending) {\n          /* ignore */\n        }\n        document.dispatchEvent(\n          new CustomEvent('wmn:preferences-updated', {\n            detail: {\n              store: mergedStore,\n              profile: pendingProfile,\n              source: 'cloud'\n            }\n          })\n        );\n      }\n    } catch (e) {\n      return false;\n    }\n    return applied;\n  }\n\n  function mergeCloudPreferences() {\n    var node = document.getElementById('wmn-engagement-cloud');\n    if (!node) return;\n    try {\n      var raw = node.textContent || '';\n      if (!raw || !raw.trim() || raw.trim() === 'null') return;\n      var cloud = JSON.parse(raw);\n      applyCloudProfile(cloud);\n    } catch (e) {\n      /* ignore */\n    }\n  }\n\n  function logIntentEvent(partial) {\n    try {\n      if (\n        window.wmnIntentAnalytics &&\n        typeof window.wmnIntentAnalytics.log === 'function'\n      ) {\n        window.wmnIntentAnalytics.log(partial || {});\n      }\n    } catch (e) {\n      /* ignore */\n    }\n  }\n\n  function roundPi(x) {\n    if (typeof x !== 'number' || !isFinite(x)) return 0;\n    return Math.round(x * 1e8) / 1e8;\n  }\n\n  /**\n   * Softmax \u03C0 over scored eligible items. Temperature keeps mass off one-hot.\n   * @param {{ handle: string, score: number }[]} rows\n   * @param {number} [temp]\n   * @returns {Object.<string, number>}\n   */\n  function softmaxPiMap(rows, temp) {\n    var out = {};\n    if (!rows || !rows.length) return out;\n    var t = temp != null && temp > 0 ? temp : FY_SOFTMAX_TEMP;\n    var maxS = -Infinity;\n    var i;\n    for (i = 0; i < rows.length; i++) {\n      var s = rows[i] && typeof rows[i].score === 'number' ? rows[i].score : 0;\n      if (s > maxS) maxS = s;\n    }\n    var sum = 0;\n    var exps = new Array(rows.length);\n    for (i = 0; i < rows.length; i++) {\n      var sc =\n        rows[i] && typeof rows[i].score === 'number' ? rows[i].score : 0;\n      var e = Math.exp((sc - maxS) / t);\n      if (!isFinite(e)) e = 0;\n      exps[i] = e;\n      sum += e;\n    }\n    if (!(sum > 0)) {\n      var u = 1 / rows.length;\n      for (i = 0; i < rows.length; i++) {\n        if (rows[i] && rows[i].handle) out[rows[i].handle] = u;\n      }\n      return out;\n    }\n    for (i = 0; i < rows.length; i++) {\n      if (rows[i] && rows[i].handle) {\n        out[rows[i].handle] = exps[i] / sum;\n      }\n    }\n    return out;\n  }\n\n  function slotWeight(rank) {\n    var r = typeof rank === 'number' && rank >= 0 ? rank : 0;\n    return 1 / (1 + r);\n  }\n\n  /**\n   * Clipped IPS + SNIPS over logged events.\n   * Event shape: { pi|piSlot, reward, handle? }; piNewMap[handle] or piNewFn(ev).\n   */\n  function estimateIps(events, piNew, opts) {\n    opts = opts || {};\n    var clip = opts.clip != null ? opts.clip : FY_IPS_CLIP;\n    var useSlot = opts.useSlot !== false;\n    var list = events || [];\n    var n = list.length;\n    if (!n) {\n      return { clippedIps: 0, snips: 0, n: 0, weightSum: 0 };\n    }\n    var piNewFn =\n      typeof piNew === 'function'\n        ? piNew\n        : function (ev) {\n            if (!ev) return 0;\n            var h = ev.handle;\n            if (piNew && h != null && piNew[h] != null) return piNew[h];\n            return 0;\n          };\n    var sumWr = 0;\n    var sumW = 0;\n    var sumClipped = 0;\n    var i;\n    for (i = 0; i < n; i++) {\n      var ev = list[i];\n      if (!ev) continue;\n      var piLog = useSlot\n        ? ev.piSlot != null\n          ? ev.piSlot\n          : (ev.pi || 0) * slotWeight(ev.rank)\n        : ev.pi || 0;\n      if (!(piLog > 0)) continue;\n      var piN = piNewFn(ev);\n      if (!(piN >= 0) || !isFinite(piN)) piN = 0;\n      var w = piN / piLog;\n      if (w > clip) w = clip;\n      if (!(w >= 0) || !isFinite(w)) w = 0;\n      var r = ev.reward != null ? ev.reward : ev.r != null ? ev.r : 0;\n      sumWr += w * r;\n      sumW += w;\n      sumClipped += w * r;\n    }\n    return {\n      clippedIps: sumClipped / n,\n      snips: sumW > 0 ? sumWr / sumW : 0,\n      n: n,\n      weightSum: sumW\n    };\n  }\n\n  function getPendingSync() {\n    try {\n      var raw = window.localStorage.getItem('wmn_prefs_pending_sync');\n      if (!raw) return null;\n      return JSON.parse(raw);\n    } catch (e) {\n      return null;\n    }\n  }\n\n  function scheduleCloudWriteback() {\n    if (!document.querySelector('meta[name=\"wmn-customer-id\"]')) return;\n    if (window.__wmnCloudWriteTimer) window.clearTimeout(window.__wmnCloudWriteTimer);\n    window.__wmnCloudWriteTimer = window.setTimeout(function () {\n      var store = readStore();\n      var profile = buildTasteCloudProfile(store);\n      try {\n        window.localStorage.setItem(\n          'wmn_prefs_pending_sync',\n          JSON.stringify(profile)\n        );\n      } catch (e) {\n        /* ignore */\n      }\n      // Customer Account extension / app proxy can pick this up when available.\n      document.dispatchEvent(\n        new CustomEvent('wmn:preferences-updated', {\n          detail: { store: store, profile: profile }\n        })\n      );\n    }, 1500);\n  }\n\n  /**\n   * Full-catalog For you scorer (Phase 1).\n   * Enumerates all graph products \u2014 not expand-neighborhood only.\n   * Uses entity EU (country/region 1.4) + focus + skip negatives + optional annealed explore.\n   * \u03BB_emb \u2248 0.25 as tie-break under focusDominant; fuller when no session focus.\n   *\n   * @param {{\n   *   limit?: number,\n   *   excludeHandles?: string[]|Object,\n   *   explore?: boolean,\n   *   seed?: number,\n   *   pinRecent?: boolean\n   * }} [opts]\n   * @returns {{ picks: object[], labels: string[], seeds: string[], geo: boolean, scored: number }|null}\n   */\n  /**\n   * Staff Picks / strange finds \u2014 rarity + anti-popular, biweekly cohort.\n   * Sales not in graph yet: proxy via artist/genre/country long-tail +\n   * exclude bestsellers handles (opts.excludeHandles).\n   *\n   * @param {{\n   *   limit?: number,\n   *   excludeHandles?: string[]|object,\n   *   pool?: number,\n   *   now?: number\n   * }} [opts]\n   * @returns {{ picks: object[], bucket: number, scored: number }|null}\n   */\n  function staffPicksFortnightBucket(nowMs) {\n    var days = Math.floor((nowMs != null ? nowMs : Date.now()) / 86400000);\n    return Math.floor(days / 14);\n  }\n\n  function staffHashSeed(str) {\n    var h = 2166136261;\n    var s = String(str || '');\n    for (var i = 0; i < s.length; i++) {\n      h ^= s.charCodeAt(i);\n      h = Math.imul(h, 16777619);\n    }\n    return h >>> 0;\n  }\n\n  function scoreCatalogStaffPicks(opts) {\n    opts = opts || {};\n    var lim = opts.limit || 16;\n    var poolN = opts.pool || 72;\n    ensureGraphWarm();\n    if (!graphReady()) return null;\n\n    var data = window.wmnCatalogGraph.getData();\n    var products = (data && data.products) || {};\n    var artists = (data && data.artists) || {};\n    var genres = (data && data.genres) || {};\n    var countries = (data && data.countries) || {};\n\n    var exclude = {};\n    var ex = opts.excludeHandles;\n    if (ex) {\n      if (Array.isArray(ex)) {\n        for (var xi = 0; xi < ex.length; xi++) {\n          if (ex[xi]) exclude[String(ex[xi])] = true;\n        }\n      } else if (typeof ex === 'object') {\n        for (var xk in ex) {\n          if (Object.prototype.hasOwnProperty.call(ex, xk) && ex[xk]) {\n            exclude[xk] = true;\n          }\n        }\n      }\n    }\n\n    var excludeGenres = {};\n    var eg = opts.excludeGenres;\n    if (eg) {\n      if (Array.isArray(eg)) {\n        for (var egi = 0; egi < eg.length; egi++) {\n          if (eg[egi]) excludeGenres[String(eg[egi])] = true;\n        }\n      } else if (typeof eg === 'object') {\n        for (var egk in eg) {\n          if (Object.prototype.hasOwnProperty.call(eg, egk) && eg[egk]) {\n            excludeGenres[egk] = true;\n          }\n        }\n      }\n    }\n\n    function degreeOf(map, slug) {\n      if (!slug || !map[slug]) return 1;\n      var arr = map[slug].p;\n      return arr && arr.length ? arr.length : 1;\n    }\n\n    function rarityFromDegree(deg) {\n      return 1 / Math.log(2 + deg);\n    }\n\n    function genreSlugsForHandle(handle) {\n      var prod = products[handle];\n      return (prod && prod.g) || [];\n    }\n\n    function genresConflict(gList, used) {\n      if (!gList || !gList.length) return false;\n      var gi;\n      for (gi = 0; gi < gList.length; gi++) {\n        if (gList[gi] && used[gList[gi]]) return true;\n      }\n      return false;\n    }\n\n    function claimGenres(gList, used) {\n      if (!gList || !gList.length) return;\n      var gi;\n      for (gi = 0; gi < gList.length; gi++) {\n        if (gList[gi]) used[gList[gi]] = true;\n      }\n    }\n\n    var ranked = [];\n    var handles = Object.keys(products);\n    var hi;\n    for (hi = 0; hi < handles.length; hi++) {\n      var handle = handles[hi];\n      if (!handle || exclude[handle]) continue;\n      var item = graphItemFromHandle(handle);\n      if (!item) continue;\n\n      var p = products[handle];\n      var aSlug = p.a || '';\n      var aDeg = degreeOf(artists, aSlug);\n      // \"Various\" is common \u2014 treat as mid, not ultra-rare\n      var artistR =\n        aSlug === 'various' || aSlug === 'various-artists'\n          ? 0.35\n          : rarityFromDegree(aDeg);\n\n      var gList = p.g || [];\n      if (genresConflict(gList, excludeGenres)) continue;\n\n      var gR = 0;\n      var gi;\n      if (gList.length) {\n        for (gi = 0; gi < gList.length; gi++) {\n          gR += rarityFromDegree(degreeOf(genres, gList[gi]));\n        }\n        gR /= gList.length;\n      } else {\n        gR = 0.55;\n      }\n\n      var cList = p.c || [];\n      var cR = 0;\n      var ci;\n      if (cList.length) {\n        for (ci = 0; ci < cList.length; ci++) {\n          cR += rarityFromDegree(degreeOf(countries, cList[ci]));\n        }\n        cR /= cList.length;\n      } else {\n        cR = 0.45;\n      }\n\n      var titleL = String(item.title || '').toLowerCase();\n      var handleL = String(handle).toLowerCase();\n      if (\n        /t-?shirt|hoodie|tote|mug|poster|sticker|gift voucher|gift card/.test(\n          titleL\n        ) ||\n        /t-?shirt|hoodie|tote-bag/.test(handleL)\n      ) {\n        continue;\n      }\n      var massPenalty = 0;\n      if (/best of|greatest hits|collection\\b/.test(titleL)) massPenalty += 0.12;\n      // Core Rough Guide flagships are familiar merch \u2014 soft demote, not ban\n      if (/^the rough guide to /.test(titleL) && aDeg > 8) massPenalty += 0.08;\n\n      var hasSp = !!(p.sp && String(p.sp));\n      var listenBoost = hasSp ? 0.06 : 0;\n\n      // Low \"popularity\" proxy: sparse artist + rare genre/country\n      var weird =\n        0.38 * artistR + 0.32 * gR + 0.18 * cR + listenBoost - massPenalty;\n\n      ranked.push({\n        handle: handle,\n        item: item,\n        score: weird,\n        hasSp: hasSp,\n        genres: gList.slice()\n      });\n    }\n\n    ranked.sort(function (a, b) {\n      return b.score - a.score;\n    });\n\n    // Wide pool \u2014 genre uniqueness burns through candidates faster.\n    var pool = ranked.slice(0, Math.max(poolN, lim * 30));\n    var bucket = staffPicksFortnightBucket(opts.now);\n    var rng = makeRng(staffHashSeed('wmn-staff-picks-' + bucket));\n\n    // Seeded Fisher\u2013Yates on the weird pool so the fortnight cohort rotates\n    var i;\n    for (i = pool.length - 1; i > 0; i--) {\n      var j = Math.floor(rng() * (i + 1));\n      var tmp = pool[i];\n      pool[i] = pool[j];\n      pool[j] = tmp;\n    }\n\n    // Prefer prior-window holdout when available\n    var holdKey = 'wmn_staff_picks_prev_' + (bucket - 1);\n    var held = {};\n    try {\n      var rawHold = window.sessionStorage.getItem(holdKey);\n      if (rawHold) {\n        var arr = JSON.parse(rawHold);\n        if (Array.isArray(arr)) {\n          for (i = 0; i < arr.length; i++) held[arr[i]] = true;\n        }\n      }\n    } catch (eHold) {\n      /* ignore */\n    }\n\n    pool.sort(function (a, b) {\n      var ha = held[a.handle] ? 1 : 0;\n      var hb = held[b.handle] ? 1 : 0;\n      if (ha !== hb) return ha - hb;\n      return 0;\n    });\n\n    var picks = [];\n    var seen = {};\n    var usedGenres = {};\n    for (var ug in excludeGenres) {\n      if (Object.prototype.hasOwnProperty.call(excludeGenres, ug) && excludeGenres[ug]) {\n        usedGenres[ug] = true;\n      }\n    }\n    for (i = 0; i < pool.length && picks.length < lim; i++) {\n      var row = pool[i];\n      if (!row || !row.handle || seen[row.handle]) continue;\n      var rowGenres = row.genres || genreSlugsForHandle(row.handle);\n      // One product per genre across the mosaic \u2014 skip any shared slug.\n      if (genresConflict(rowGenres, usedGenres)) continue;\n      seen[row.handle] = true;\n      claimGenres(rowGenres, usedGenres);\n      var out = row.item;\n      out.score = row.score;\n      out.branch = 'staff-picks';\n      picks.push(out);\n    }\n\n    try {\n      window.sessionStorage.setItem(\n        'wmn_staff_picks_prev_' + bucket,\n        JSON.stringify(\n          picks.map(function (p) {\n            return p.handle;\n          })\n        )\n      );\n    } catch (eSave) {\n      /* ignore */\n    }\n\n    return {\n      picks: picks,\n      bucket: bucket,\n      scored: ranked.length,\n      usedGenres: usedGenres\n    };\n  }\n\n  /**\n   * True when the visitor has enough engagement signal to personalize\n   * one Staff Picks slot (events, entity prefs, or session/durable focus).\n   */\n  function hasStaffPicksAffinitySignal() {\n    var store = readStore();\n    if (store.events && store.events.length) return true;\n    if (store.entities && Object.keys(store.entities).length) return true;\n    var focus = readFocusOrDurable();\n    if (!focus) return false;\n    if (focus.primaryGenre || focus.primaryCountry || focus.primaryRegion) {\n      return true;\n    }\n    if (focus.primaryKind) return true;\n    if (focus.genres && focus.genres.length) return true;\n    if (focus.countries && focus.countries.length) return true;\n    if (focus.artists && focus.artists.length) return true;\n    if (focus.handles && focus.handles.length) return true;\n    return false;\n  }\n\n  /**\n   * Inject exactly one analytics-driven product into a Staff Picks cohort.\n   * Slot 0 is the designated \"for you\" card. Cold visitors keep the\n   * editorial/biweekly list unchanged.\n   * Must stay unique vs Dig deeper \u2014 never share that affinity handle.\n   *\n   * @param {{ picks: object[], bucket?: number, scored?: number }|null} built\n   * @param {{ excludeHandles?: string[]|object, slot?: number }=} opts\n   * @returns {{\n   *   picks: object[],\n   *   bucket?: number,\n   *   scored?: number,\n   *   affinitySlot: number|null,\n   *   affinityHandle: string|null\n   * }|null}\n   */\n  var lastStaffPicksAffinityHandle = '';\n\n  function setStaffPicksAffinityHandle(handle) {\n    lastStaffPicksAffinityHandle = handle ? String(handle) : '';\n  }\n\n  /** Last Staff Picks \"For you\" handle (module + DOM fallback). */\n  function getStaffPicksAffinityHandle() {\n    if (lastStaffPicksAffinityHandle) return lastStaffPicksAffinityHandle;\n    try {\n      var root = document.getElementById('wmn-staff-picks');\n      if (root) {\n        var attr = root.getAttribute('data-wmn-staff-affinity');\n        if (attr) return attr;\n      }\n      var el = document.querySelector(\n        '#wmn-staff-picks [data-wmn-staff-for-you=\"1\"][data-wmn-handle], [data-wmn-staff-for-you=\"1\"][data-wmn-handle]'\n      );\n      if (el) return el.getAttribute('data-wmn-handle') || '';\n    } catch (eDom) {\n      /* ignore */\n    }\n    return '';\n  }\n\n  /** Dig deeper pool + painted cards \u2014 Staff affinity must not collide. */\n  function digDeeperOccupiedHandles() {\n    var out = {};\n    try {\n      var root =\n        document.getElementById('wmn-because-you-looked') ||\n        document.querySelector('[data-wmn-because]');\n      var state = root && root._wmnBecauseState;\n      if (state && state.pool && state.pool.length) {\n        var pi;\n        for (pi = 0; pi < state.pool.length; pi++) {\n          if (state.pool[pi] && state.pool[pi].handle) {\n            out[state.pool[pi].handle] = true;\n          }\n        }\n      }\n      var nodes = document.querySelectorAll(\n        '#wmn-because-grid [data-wmn-handle], [data-wmn-because-grid] [data-wmn-handle]'\n      );\n      var ni;\n      for (ni = 0; ni < nodes.length; ni++) {\n        var h = nodes[ni].getAttribute('data-wmn-handle');\n        if (h) out[h] = true;\n      }\n    } catch (eDig) {\n      /* ignore */\n    }\n    return out;\n  }\n\n  function blendStaffPicksAffinity(built, opts) {\n    opts = opts || {};\n    if (!built || !built.picks || !built.picks.length) return built;\n\n    var out = {\n      picks: built.picks.slice(),\n      bucket: built.bucket,\n      scored: built.scored,\n      affinitySlot: null,\n      affinityHandle: null\n    };\n\n    if (!hasStaffPicksAffinitySignal() || !graphReady()) {\n      setStaffPicksAffinityHandle('');\n      return out;\n    }\n\n    var SLOT = opts.slot != null ? opts.slot : 0;\n    if (SLOT < 0) SLOT = 0;\n    if (SLOT >= out.picks.length) SLOT = 0;\n\n    var exclude = {};\n    var ex = opts.excludeHandles;\n    if (ex) {\n      if (Array.isArray(ex)) {\n        for (var xi = 0; xi < ex.length; xi++) {\n          if (ex[xi]) exclude[String(ex[xi])] = true;\n        }\n      } else if (typeof ex === 'object') {\n        for (var xk in ex) {\n          if (Object.prototype.hasOwnProperty.call(ex, xk) && ex[xk]) {\n            exclude[xk] = true;\n          }\n        }\n      }\n    }\n\n    // Prefer discovery over re-showing the last viewed album in Staff Picks.\n    var store = readStore();\n    var recent = store.events || [];\n    var ri;\n    for (ri = Math.max(0, recent.length - 8); ri < recent.length; ri++) {\n      if (recent[ri] && recent[ri].h) exclude[recent[ri].h] = true;\n    }\n\n    // Never pick a Dig deeper product for the Staff Picks affinity slot.\n    var digOcc = digDeeperOccupiedHandles();\n    var dk;\n    for (dk in digOcc) {\n      if (Object.prototype.hasOwnProperty.call(digOcc, dk) && digOcc[dk]) {\n        exclude[dk] = true;\n      }\n    }\n\n    var fy = scoreCatalogForYou({\n      limit: 36,\n      excludeHandles: exclude,\n      pinRecent: false,\n      explore: false\n    });\n    if (!fy || !fy.picks || !fy.picks.length) {\n      setStaffPicksAffinityHandle('');\n      return out;\n    }\n\n    var indexByHandle = {};\n    var pi;\n    for (pi = 0; pi < out.picks.length; pi++) {\n      if (out.picks[pi] && out.picks[pi].handle) {\n        indexByHandle[out.picks[pi].handle] = pi;\n      }\n    }\n\n    var chosen = null;\n    var chosenIdx = -1;\n    var ci;\n    for (ci = 0; ci < fy.picks.length; ci++) {\n      var cand = fy.picks[ci];\n      if (!cand || !cand.handle) continue;\n      if (exclude[cand.handle]) continue;\n      // Skip merchandise / non-album noise (same filters as staff scorer).\n      var titleL = String(cand.title || '').toLowerCase();\n      var handleL = String(cand.handle).toLowerCase();\n      if (\n        /t-?shirt|hoodie|tote|mug|poster|sticker|gift voucher|gift card/.test(\n          titleL\n        ) ||\n        /t-?shirt|hoodie|tote-bag/.test(handleL)\n      ) {\n        continue;\n      }\n      if (!cand.image) {\n        var imgTry = graphItemFromHandle(cand.handle);\n        if (imgTry && imgTry.image) cand = imgTry;\n      }\n      if (!cand.image) continue;\n\n      if (Object.prototype.hasOwnProperty.call(indexByHandle, cand.handle)) {\n        chosen = out.picks[indexByHandle[cand.handle]] || cand;\n        chosenIdx = indexByHandle[cand.handle];\n      } else {\n        chosen = cand;\n        chosenIdx = -1;\n      }\n      break;\n    }\n\n    if (!chosen || !chosen.handle) {\n      setStaffPicksAffinityHandle('');\n      return out;\n    }\n\n    var marked = chosen;\n    marked.branch = 'staff-picks-for-you';\n    marked.staffAffinity = true;\n\n    var next = out.picks.slice();\n    if (chosenIdx === SLOT) {\n      next[SLOT] = marked;\n    } else if (chosenIdx >= 0) {\n      next.splice(chosenIdx, 1);\n      next.splice(SLOT, 0, marked);\n    } else {\n      next[SLOT] = marked;\n    }\n\n    function staffGenreSlugs(item) {\n      if (!item || !item.handle || !graphReady()) return [];\n      try {\n        var gdata = window.wmnCatalogGraph.getData();\n        var gp = gdata && gdata.products && gdata.products[item.handle];\n        return (gp && gp.g) || [];\n      } catch (eG) {\n        return [];\n      }\n    }\n\n    function staffGenresConflict(gList, used) {\n      if (!gList || !gList.length) return false;\n      var gi;\n      for (gi = 0; gi < gList.length; gi++) {\n        if (gList[gi] && used[gList[gi]]) return true;\n      }\n      return false;\n    }\n\n    function staffClaimGenres(gList, used) {\n      if (!gList || !gList.length) return;\n      var gi;\n      for (gi = 0; gi < gList.length; gi++) {\n        if (gList[gi]) used[gList[gi]] = true;\n      }\n    }\n\n    // Guarantee handle uniqueness + one product per genre (affinity wins its genres).\n    var targetLen = built.picks.length;\n    var seen = {};\n    var usedGenres = {};\n    var deduped = [];\n    var affinityGenres = staffGenreSlugs(marked);\n    staffClaimGenres(affinityGenres, usedGenres);\n\n    // Pin affinity first so later editorial picks cannot share its genres.\n    seen[marked.handle] = true;\n    deduped.push(marked);\n\n    for (pi = 0; pi < next.length; pi++) {\n      var row = next[pi];\n      if (!row || !row.handle || seen[row.handle]) continue;\n      var rowGenres = staffGenreSlugs(row);\n      if (staffGenresConflict(rowGenres, usedGenres)) continue;\n      seen[row.handle] = true;\n      staffClaimGenres(rowGenres, usedGenres);\n      if (row.staffAffinity) {\n        delete row.staffAffinity;\n        if (row.branch === 'staff-picks-for-you') row.branch = 'staff-picks';\n      }\n      deduped.push(row);\n    }\n\n    // Top up from original cohort if replace/dedupe shortened the rail.\n    for (pi = 0; pi < built.picks.length && deduped.length < targetLen; pi++) {\n      var fill = built.picks[pi];\n      if (!fill || !fill.handle || seen[fill.handle]) continue;\n      var fillGenres = staffGenreSlugs(fill);\n      if (staffGenresConflict(fillGenres, usedGenres)) continue;\n      seen[fill.handle] = true;\n      staffClaimGenres(fillGenres, usedGenres);\n      deduped.push(fill);\n    }\n\n    // Still short after affinity genre collisions \u2014 pull more diverse editorial picks.\n    if (deduped.length < targetLen) {\n      var topUpExclude = {};\n      var ek;\n      for (ek in exclude) {\n        if (Object.prototype.hasOwnProperty.call(exclude, ek) && exclude[ek]) {\n          topUpExclude[ek] = true;\n        }\n      }\n      for (ek in seen) {\n        if (Object.prototype.hasOwnProperty.call(seen, ek) && seen[ek]) {\n          topUpExclude[ek] = true;\n        }\n      }\n      var more = scoreCatalogStaffPicks({\n        limit: targetLen - deduped.length + 4,\n        excludeHandles: topUpExclude,\n        excludeGenres: usedGenres,\n        pool: 160\n      });\n      if (more && more.picks && more.picks.length) {\n        for (pi = 0; pi < more.picks.length && deduped.length < targetLen; pi++) {\n          var extra = more.picks[pi];\n          if (!extra || !extra.handle || seen[extra.handle]) continue;\n          var extraGenres = staffGenreSlugs(extra);\n          if (staffGenresConflict(extraGenres, usedGenres)) continue;\n          seen[extra.handle] = true;\n          staffClaimGenres(extraGenres, usedGenres);\n          extra.staffAffinity = false;\n          extra.branch = 'staff-picks';\n          deduped.push(extra);\n        }\n      }\n    }\n\n    // Affinity must stay in SLOT (usually 0).\n    if (deduped.length && deduped[0] && deduped[0].handle === marked.handle) {\n      /* already first */\n    } else {\n      var affAt = -1;\n      for (pi = 0; pi < deduped.length; pi++) {\n        if (deduped[pi] && deduped[pi].handle === marked.handle) {\n          affAt = pi;\n          break;\n        }\n      }\n      if (affAt > 0) {\n        var moved = deduped.splice(affAt, 1)[0];\n        deduped.splice(SLOT, 0, moved);\n      } else if (affAt < 0) {\n        deduped.splice(SLOT, 0, marked);\n      }\n    }\n    // Re-mark affinity after any reorder.\n    for (pi = 0; pi < deduped.length; pi++) {\n      if (!deduped[pi]) continue;\n      if (deduped[pi].handle === marked.handle) {\n        deduped[pi].branch = 'staff-picks-for-you';\n        deduped[pi].staffAffinity = true;\n      } else if (deduped[pi].staffAffinity) {\n        delete deduped[pi].staffAffinity;\n        if (deduped[pi].branch === 'staff-picks-for-you') {\n          deduped[pi].branch = 'staff-picks';\n        }\n      }\n    }\n\n    out.picks = deduped.slice(0, targetLen);\n    out.affinitySlot = SLOT;\n    out.affinityHandle = marked.handle;\n    setStaffPicksAffinityHandle(marked.handle);\n    return out;\n  }\n\n  function scoreCatalogForYou(opts) {\n    opts = opts || {};\n    var lim = opts.limit || 18;\n    var explore = !!opts.explore;\n    var pinRecent = opts.pinRecent !== false;\n    // Store collection pagination needs the full ranked catalog (prefer first,\n    // then score-ordered remainder). Homepage rails keep prefer-only.\n    var fillToLimit = !!opts.fillToLimit;\n    ensureGraphWarm();\n    var store = readStore();\n    var prefs = store.entities || {};\n    var negatives = store.negatives || {};\n    // Cold sessions (no events/prefs) still rank the full catalog so the\n    // homepage rail never vanishes \u2014 soft bestsellers-style path below.\n    if (!graphReady()) return null;\n\n    var exclude = {};\n    var ex = opts.excludeHandles;\n    if (ex) {\n      if (Array.isArray(ex)) {\n        for (var xi = 0; xi < ex.length; xi++) {\n          if (ex[xi]) exclude[ex[xi]] = true;\n        }\n      } else if (typeof ex === 'object') {\n        for (var xk in ex) {\n          if (Object.prototype.hasOwnProperty.call(ex, xk) && ex[xk]) {\n            exclude[xk] = true;\n          }\n        }\n      }\n    }\n\n    var topCountries = topEntityIds(prefs, 4, ['country']);\n    var topRegions = topEntityIds(prefs, 4, ['region']);\n    var topArtistGenre = topEntityIds(prefs, 6, ['artist', 'genre']);\n    var topProducts = topEntityIds(prefs, 4, ['product']);\n    var labelSeeds = topCountries.slice();\n    var si;\n    for (si = 0; si < topRegions.length; si++) {\n      if (labelSeeds.indexOf(topRegions[si]) === -1) labelSeeds.push(topRegions[si]);\n    }\n    for (si = 0; si < topArtistGenre.length; si++) {\n      if (labelSeeds.indexOf(topArtistGenre[si]) === -1) {\n        labelSeeds.push(topArtistGenre[si]);\n      }\n    }\n    for (si = 0; si < topProducts.length; si++) {\n      if (labelSeeds.indexOf(topProducts[si]) === -1) labelSeeds.push(topProducts[si]);\n    }\n    // Cold / pre-focus: empty seeds are fine \u2014 candidates still rank via score.\n\n    var focus = opts.focus != null ? opts.focus : readFocus();\n    var uEmbState = readUEmb();\n    var scoreCtx = {\n      prefs: prefs,\n      focus: focus,\n      negatives: negatives,\n      uEmb: uEmbState && uEmbState.v ? uEmbState.v : null\n    };\n    // scoreCtx.dampGeoPrefs set below once focusDominant is known\n    var prefsNorm = prefsL1(prefs);\n    var rng = makeRng(\n      opts.seed != null\n        ? opts.seed\n        : (store.et || 1) ^ ((store.events && store.events.length) || 0)\n    );\n\n    var geoKeys = {};\n    var gi;\n\n    // Session focus is the SOLE ranking driver when primaryKind is set\n    // (genre / country / region). Stale Mali/India prefs must not fill the rail\n    // while the subtitle says Latin America / Jazz / Blues.\n    var focusPrimaryGenre =\n      (focus &&\n        (focus.primaryGenre || (focus.genres && focus.genres[0]))) ||\n      '';\n    var focusPrimaryCountry = (focus && focus.primaryCountry) || '';\n    var focusPrimaryRegion = (focus && focus.primaryRegion) || '';\n    var focusPrimaryKind = (focus && focus.primaryKind) || '';\n    if (!focusPrimaryKind && focus) {\n      if (focusPrimaryCountry) focusPrimaryKind = 'country';\n      else if (focusPrimaryRegion) focusPrimaryKind = 'region';\n      else if (focusPrimaryGenre) focusPrimaryKind = 'genre';\n      else if (\n        focus.primaryArtist ||\n        (focus.artists && focus.artists[0])\n      ) {\n        focusPrimaryKind = 'artist';\n      }\n    }\n\n    // Align with subtitle: genre label wins unless country/region owns kind.\n    // Artist kind + primaryGenre (e.g. blues) must still hard-filter the rail.\n    if (\n      focus &&\n      focusPrimaryGenre &&\n      focusPrimaryKind !== 'country' &&\n      focusPrimaryKind !== 'region' &&\n      focusPrimaryKind !== 'genre'\n    ) {\n      focusPrimaryKind = 'genre';\n    }\n\n    var focusDominant =\n      !!focus &&\n      ((focusPrimaryKind === 'genre' && !!focusPrimaryGenre) ||\n        (focusPrimaryKind === 'country' && !!focusPrimaryCountry) ||\n        (focusPrimaryKind === 'region' && !!focusPrimaryRegion));\n\n    // Legacy prefs-geo only when there is NO session focus primary.\n    var geoDominant =\n      !focusDominant && !!(topCountries.length || topRegions.length);\n\n    // Dampen stale country/region entity mass whenever session focus owns ranking.\n    scoreCtx.dampGeoPrefs = focusDominant;\n\n    if (focusDominant && focusPrimaryKind === 'country') {\n      geoKeys['country:' + focusPrimaryCountry] = true;\n    } else if (focusDominant && focusPrimaryKind === 'region') {\n      geoKeys['region:' + focusPrimaryRegion] = true;\n    } else if (geoDominant) {\n      for (gi = 0; gi < topCountries.length; gi++) {\n        geoKeys[topCountries[gi]] = true;\n      }\n      for (gi = 0; gi < topRegions.length; gi++) {\n        geoKeys[topRegions[gi]] = true;\n      }\n    }\n\n    // Genre hard-filter keys: ONLY exact focusPrimaryGenre.\n    // Do NOT expand relatedGenres into the prefer gate / handleMatchesFocus \u2014\n    // jazz\u2192gospel-spiritual sibling was admitting Spiritual India. Related\n    // genres may still boost soft ranking via FOCUS_GENRE_BONUS on focus.genres;\n    // country focus keeps its own bridge/related path (focusCountryGenreKeys).\n    var FOCUS_GENRE_KEYS_CAP = 12;\n    var focusGenreKeys = [];\n    function addFocusGenreKey(slug) {\n      if (!slug || focusGenreKeys.indexOf(slug) !== -1) return false;\n      if (focusGenreKeys.length >= FOCUS_GENRE_KEYS_CAP) return false;\n      focusGenreKeys.push(slug);\n      return true;\n    }\n    if (focusDominant && focusPrimaryKind === 'genre') {\n      if (focusPrimaryGenre) addFocusGenreKey(focusPrimaryGenre);\n    }\n\n    // Country focus: expand prefer pool via country-named genres + bridges.\n    // Catalog often tags only a few products with country:* (India \u2192 3) while\n    // dozens sit on indian-classical-raga / bollywood-filmi.\n    var focusCountryGenreKeys = [];\n    function addFocusCountryGenreKey(slug) {\n      if (!slug || focusCountryGenreKeys.indexOf(slug) !== -1) return false;\n      if (focusCountryGenreKeys.length >= FOCUS_GENRE_KEYS_CAP) return false;\n      focusCountryGenreKeys.push(slug);\n      return true;\n    }\n    function genreMatchesCountryTokens(slug, name, tokens) {\n      var s = String(slug || '').toLowerCase();\n      var n = String(name || '').toLowerCase();\n      var ti;\n      for (ti = 0; ti < tokens.length; ti++) {\n        var t = tokens[ti];\n        if (!t) continue;\n        if (\n          s === t ||\n          s.indexOf(t + '-') === 0 ||\n          s.indexOf('-' + t + '-') !== -1 ||\n          s.slice(-(t.length + 1)) === '-' + t\n        ) {\n          return true;\n        }\n        var tre = new RegExp(\n          '\\\\b' + String(t).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + '\\\\b',\n          'i'\n        );\n        if (tre.test(n) || tre.test(s.replace(/-/g, ' '))) return true;\n      }\n      return false;\n    }\n    function buildCountryFocusGenreKeys(countrySlug) {\n      if (!countrySlug || !graphReady()) return;\n      var gdata = window.wmnCatalogGraph.getData();\n      var genresMap = (gdata && gdata.genres) || {};\n      var tokens = [countrySlug].concat(COUNTRY_ADJ_TOKENS[countrySlug] || []);\n      var slug;\n      for (slug in genresMap) {\n        if (!Object.prototype.hasOwnProperty.call(genresMap, slug)) continue;\n        var node = genresMap[slug];\n        if (genreMatchesCountryTokens(slug, (node && node.n) || '', tokens)) {\n          addFocusCountryGenreKey(slug);\n        }\n      }\n      var bridges = COUNTRY_GENRE_BRIDGES[countrySlug] || [];\n      for (gi = 0; gi < bridges.length; gi++) {\n        if (genresMap[bridges[gi]]) addFocusCountryGenreKey(bridges[gi]);\n      }\n      // Majority genres on country-tagged products (skip one-off noise like\n      // gospel-spiritual on Spiritual India). Also skip broad styles (folk/\n      // jazz/blues) that would admit half the catalog under Mali/Cuba.\n      var cNode =\n        gdata.countries && gdata.countries[countrySlug]\n          ? gdata.countries[countrySlug]\n          : null;\n      var cProducts = (cNode && cNode.p) || [];\n      if (cProducts.length) {\n        var freq = {};\n        var pi;\n        for (pi = 0; pi < cProducts.length; pi++) {\n          var cp = gdata.products[cProducts[pi]];\n          var cgs = (cp && cp.g) || [];\n          var cgi;\n          for (cgi = 0; cgi < cgs.length; cgi++) {\n            if (cgs[cgi]) freq[cgs[cgi]] = (freq[cgs[cgi]] || 0) + 1;\n          }\n        }\n        var need = Math.max(2, Math.ceil(cProducts.length * 0.5));\n        for (slug in freq) {\n          if (!Object.prototype.hasOwnProperty.call(freq, slug)) continue;\n          if (GENERIC_COUNTRY_FOCUS_GENRES[slug]) continue;\n          if (freq[slug] >= need) addFocusCountryGenreKey(slug);\n        }\n      }\n      // One related hop, but only keep siblings that still look on-country\n      // (name tokens) or already appear on a country-tagged product \u2014 avoids\n      // cuba\u2192afro-cuban-son\u2192brazilian dumping all of Latin into India-style rails.\n      if (\n        typeof window.wmnCatalogGraph.relatedGenres === 'function' &&\n        focusCountryGenreKeys.length\n      ) {\n        var seeds = focusCountryGenreKeys.slice();\n        var countryProductGenre = {};\n        for (pi = 0; pi < cProducts.length; pi++) {\n          var cp2 = gdata.products[cProducts[pi]];\n          var cgs2 = (cp2 && cp2.g) || [];\n          for (cgi = 0; cgi < cgs2.length; cgi++) {\n            if (cgs2[cgi]) countryProductGenre[cgs2[cgi]] = true;\n          }\n        }\n        for (gi = 0; gi < seeds.length; gi++) {\n          if (focusCountryGenreKeys.length >= FOCUS_GENRE_KEYS_CAP) break;\n          var related = window.wmnCatalogGraph.relatedGenres(seeds[gi]);\n          var ri;\n          for (ri = 0; ri < (related || []).length; ri++) {\n            var row = related[ri];\n            var relSlug = row && (row.slug || row);\n            if (typeof relSlug !== 'string') continue;\n            var relNode = genresMap[relSlug];\n            // Never hop into generic styles (folk\u2192country, jazz\u2192\u2026), even if\n            // a country-tagged product carries that tag.\n            if (GENERIC_COUNTRY_FOCUS_GENRES[relSlug]) continue;\n            if (\n              genreMatchesCountryTokens(\n                relSlug,\n                (relNode && relNode.n) || '',\n                tokens\n              ) ||\n              countryProductGenre[relSlug] ||\n              (COUNTRY_GENRE_BRIDGES[countrySlug] || []).indexOf(relSlug) !== -1\n            ) {\n              addFocusCountryGenreKey(relSlug);\n            }\n          }\n        }\n      }\n    }\n    if (focusDominant && focusPrimaryKind === 'country' && focusPrimaryCountry) {\n      buildCountryFocusGenreKeys(focusPrimaryCountry);\n    }\n\n    var focusRegionGenreKeys = [];\n    function addFocusRegionGenreKey(slug) {\n      if (!slug || focusRegionGenreKeys.indexOf(slug) !== -1) return false;\n      if (focusRegionGenreKeys.length >= FOCUS_GENRE_KEYS_CAP) return false;\n      focusRegionGenreKeys.push(slug);\n      return true;\n    }\n    function buildRegionFocusGenreKeys(regionSlug) {\n      if (!regionSlug || !graphReady()) return;\n      var gdata = window.wmnCatalogGraph.getData();\n      var genresMap = (gdata && gdata.genres) || {};\n      var bridges = REGION_GENRE_BRIDGES[regionSlug] || [];\n      var bi;\n      for (bi = 0; bi < bridges.length; bi++) {\n        if (genresMap[bridges[bi]]) addFocusRegionGenreKey(bridges[bi]);\n      }\n      var rNode =\n        gdata.regions && gdata.regions[regionSlug]\n          ? gdata.regions[regionSlug]\n          : null;\n      var rProducts = (rNode && rNode.p) || [];\n      if (rProducts.length) {\n        var freq = {};\n        var pi;\n        for (pi = 0; pi < rProducts.length; pi++) {\n          var rp = gdata.products[rProducts[pi]];\n          var rgs = (rp && rp.g) || [];\n          var rgi;\n          for (rgi = 0; rgi < rgs.length; rgi++) {\n            if (rgs[rgi]) freq[rgs[rgi]] = (freq[rgs[rgi]] || 0) + 1;\n          }\n        }\n        var need = Math.max(2, Math.ceil(rProducts.length * 0.5));\n        var slug;\n        for (slug in freq) {\n          if (!Object.prototype.hasOwnProperty.call(freq, slug)) continue;\n          if (GENERIC_COUNTRY_FOCUS_GENRES[slug]) continue;\n          if (freq[slug] >= need) addFocusRegionGenreKey(slug);\n        }\n      }\n      // Name-token genres: \"balkan\", \"caribbean\", \"andes\" \u2014 not bare \"africa\".\n      var tokens = [];\n      if (regionSlug.indexOf('-') !== -1) {\n        tokens.push(regionSlug);\n        var parts = regionSlug.split('-');\n        var ti;\n        for (ti = 0; ti < parts.length; ti++) {\n          if (parts[ti] && parts[ti].length > 4 && parts[ti] !== 'africa') {\n            tokens.push(parts[ti]);\n          }\n        }\n      } else if (regionSlug.length > 4 && regionSlug !== 'africa') {\n        tokens.push(regionSlug);\n      }\n      if (tokens.length) {\n        var gslug;\n        for (gslug in genresMap) {\n          if (!Object.prototype.hasOwnProperty.call(genresMap, gslug)) continue;\n          var gnode = genresMap[gslug];\n          if (\n            genreMatchesCountryTokens(gslug, (gnode && gnode.n) || '', tokens)\n          ) {\n            addFocusRegionGenreKey(gslug);\n          }\n        }\n      }\n    }\n    if (focusDominant && focusPrimaryKind === 'region' && focusPrimaryRegion) {\n      buildRegionFocusGenreKeys(focusPrimaryRegion);\n    }\n\n    function handleMatchesFocus(handle) {\n      if (!focusDominant || !handle || !graphReady()) return false;\n      var resolved = window.wmnCatalogGraph.resolveProduct(handle) || {};\n      var p = window.wmnCatalogGraph.getData().products[handle];\n      var title = String((p && p.t) || handle).toLowerCase();\n      var hLow = String(handle).toLowerCase();\n\n      if (focusPrimaryKind === 'genre') {\n        return genreFocusMatchStrength(handle, resolved, title, hLow) ===\n          'strong';\n      }\n      if (focusPrimaryKind === 'country') {\n        return countryFocusMatchStrength(handle, resolved, title, hLow) ===\n          'strong';\n      }\n      if (focusPrimaryKind === 'region') {\n        return regionFocusMatchStrength(handle, resolved, title, hLow) ===\n          'strong';\n      }\n      return false;\n    }\n\n    /** Core genres for purity: drop broad style tags unless they are focus keys. */\n    function focusCoreGenres(genres, keepKeys) {\n      var out = [];\n      var keep = keepKeys || [];\n      var gi;\n      for (gi = 0; gi < (genres || []).length; gi++) {\n        var g = genres[gi];\n        if (!g) continue;\n        if (GENERIC_COUNTRY_FOCUS_GENRES[g] && keep.indexOf(g) === -1) continue;\n        out.push(g);\n      }\n      return out;\n    }\n\n    function genreInTitleOrHandle(g, title, hLow) {\n      if (!g || typeof g !== 'string') return false;\n      if (hLow.indexOf(g) !== -1) return true;\n      var gWords = String(g).replace(/-/g, ' ').trim();\n      if (!gWords) return false;\n      if (gWords.indexOf(' ') === -1) {\n        var re = new RegExp(\n          '\\\\b' + gWords.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + '\\\\b',\n          'i'\n        );\n        return re.test(title) || re.test(hLow);\n      }\n      return title.indexOf(gWords) !== -1;\n    }\n\n    function genreFocusTitleHit(title, hLow) {\n      var ci;\n      for (ci = 0; ci < focusGenreKeys.length; ci++) {\n        if (genreInTitleOrHandle(focusGenreKeys[ci], title, hLow)) return true;\n      }\n      return false;\n    }\n\n    /**\n     * Genre prefer vs soft-fill.\n     * strong = title/handle genre OR all core tags are the focus genre(s)\n     * weak = carries focus genre among other substantive styles\n     */\n    function genreFocusMatchStrength(handle, resolved, title, hLow) {\n      if (!focusPrimaryGenre || !focusGenreKeys.length) return '';\n      resolved = resolved || window.wmnCatalogGraph.resolveProduct(handle) || {};\n      if (title == null || hLow == null) {\n        var p0 = window.wmnCatalogGraph.getData().products[handle];\n        title = String((p0 && p0.t) || handle).toLowerCase();\n        hLow = String(handle).toLowerCase();\n      }\n      if (genreFocusTitleHit(title, hLow)) return 'strong';\n      var genres = resolved.genres || [];\n      var core = focusCoreGenres(genres, focusGenreKeys);\n      var list = core.length ? core : genres;\n      var hits = 0;\n      var off = 0;\n      var ci;\n      for (ci = 0; ci < list.length; ci++) {\n        if (focusGenreKeys.indexOf(list[ci]) !== -1) hits++;\n        else off++;\n      }\n      if (hits > 0 && off === 0) return 'strong';\n      if (hits > 0) return 'weak';\n      return '';\n    }\n\n    function genreFocusPurityBonus(handle) {\n      if (\n        !focusDominant ||\n        focusPrimaryKind !== 'genre' ||\n        !focusGenreKeys.length ||\n        !handle ||\n        !graphReady()\n      ) {\n        return 0;\n      }\n      var resolved = window.wmnCatalogGraph.resolveProduct(handle) || {};\n      var p = window.wmnCatalogGraph.getData().products[handle];\n      var title = String((p && p.t) || handle).toLowerCase();\n      var hLow = String(handle).toLowerCase();\n      var bonus = 0;\n      if (genreFocusTitleHit(title, hLow)) bonus += FOCUS_PURITY_TITLE;\n      var genres = resolved.genres || [];\n      var core = focusCoreGenres(genres, focusGenreKeys);\n      var list = core.length ? core : genres;\n      var hits = 0;\n      var ci;\n      for (ci = 0; ci < list.length; ci++) {\n        if (focusGenreKeys.indexOf(list[ci]) !== -1) hits++;\n      }\n      var denom = Math.max(1, list.length);\n      bonus += (hits / denom) * FOCUS_PURITY_FRAC_SCALE;\n      if (hits > 0 && hits === list.length && list.length === 1) {\n        bonus += FOCUS_PURITY_SOLE_EXTRA;\n      }\n      return bonus;\n    }\n\n    /**\n     * Country focus prefer vs soft-fill.\n     * strong = country tag | title/adj | all core genres are on-country bridges\n     * weak = merely shares a bridge genre among multi-region tags\n     */\n    function countryFocusTitleHit(title, hLow) {\n      var cWords = String(focusPrimaryCountry).replace(/-/g, ' ');\n      if (title.indexOf(cWords) !== -1 || hLow.indexOf(focusPrimaryCountry) !== -1) {\n        return true;\n      }\n      var adjList = COUNTRY_ADJ_TOKENS[focusPrimaryCountry] || [];\n      var ci;\n      for (ci = 0; ci < adjList.length; ci++) {\n        var adj = adjList[ci];\n        if (!adj) continue;\n        var adjRe = new RegExp(\n          '\\\\b' + String(adj).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + '\\\\b',\n          'i'\n        );\n        if (adjRe.test(title) || adjRe.test(hLow)) return true;\n      }\n      var inferredC = [];\n      inferGeoFromText(title, function (id) {\n        inferredC.push(id);\n      });\n      return inferredC.indexOf('country:' + focusPrimaryCountry) !== -1;\n    }\n\n    function countryFocusMatchStrength(handle, resolved, title, hLow) {\n      if (!focusPrimaryCountry) return '';\n      resolved = resolved || window.wmnCatalogGraph.resolveProduct(handle) || {};\n      if (title == null || hLow == null) {\n        var p0 = window.wmnCatalogGraph.getData().products[handle];\n        title = String((p0 && p0.t) || handle).toLowerCase();\n        hLow = String(handle).toLowerCase();\n      }\n      var ci;\n      for (ci = 0; ci < (resolved.countries || []).length; ci++) {\n        if (resolved.countries[ci] === focusPrimaryCountry) return 'strong';\n      }\n      if (countryFocusTitleHit(title, hLow)) return 'strong';\n\n      var genres = resolved.genres || [];\n      var core = focusCoreGenres(genres, focusCountryGenreKeys);\n      var list = core.length ? core : genres;\n      var hits = 0;\n      var off = 0;\n      for (ci = 0; ci < list.length; ci++) {\n        if (focusCountryGenreKeys.indexOf(list[ci]) !== -1) hits++;\n        else off++;\n      }\n      if (hits > 0 && off === 0) return 'strong';\n      if (hits > 0) return 'weak';\n      return '';\n    }\n\n    function countryFocusPurityBonus(handle) {\n      if (\n        !focusDominant ||\n        focusPrimaryKind !== 'country' ||\n        !focusPrimaryCountry ||\n        !handle ||\n        !graphReady()\n      ) {\n        return 0;\n      }\n      var resolved = window.wmnCatalogGraph.resolveProduct(handle) || {};\n      var p = window.wmnCatalogGraph.getData().products[handle];\n      var title = String((p && p.t) || handle).toLowerCase();\n      var hLow = String(handle).toLowerCase();\n      var bonus = 0;\n      var ci;\n      for (ci = 0; ci < (resolved.countries || []).length; ci++) {\n        if (resolved.countries[ci] === focusPrimaryCountry) {\n          bonus += FOCUS_PURITY_COUNTRY_TAG;\n          break;\n        }\n      }\n      if (countryFocusTitleHit(title, hLow)) bonus += FOCUS_PURITY_TITLE;\n      var genres = resolved.genres || [];\n      var core = focusCoreGenres(genres, focusCountryGenreKeys);\n      var list = core.length ? core : genres;\n      var hits = 0;\n      for (ci = 0; ci < list.length; ci++) {\n        if (focusCountryGenreKeys.indexOf(list[ci]) !== -1) hits++;\n      }\n      var denom = Math.max(1, list.length);\n      bonus += (hits / denom) * FOCUS_PURITY_FRAC_SCALE;\n      if (hits > 0 && hits === list.length && list.length === 1) {\n        bonus += FOCUS_PURITY_SOLE_EXTRA;\n      }\n      return bonus;\n    }\n\n    function regionFocusTitleHit(title, hLow) {\n      var rWords = String(focusPrimaryRegion).replace(/-/g, ' ');\n      if (\n        title.indexOf(rWords) !== -1 ||\n        hLow.indexOf(focusPrimaryRegion) !== -1\n      ) {\n        return true;\n      }\n      if (focusPrimaryRegion === 'latin-america') {\n        if (\n          /latin|salsa|cumbia|brazil|cuba|tango|colombia|peru|mexico|argentina/i.test(\n            title\n          ) ||\n          /latin|salsa|cumbia|brazil|cuba|tango/i.test(hLow)\n        ) {\n          return true;\n        }\n      }\n      var inferredR = [];\n      inferGeoFromText(title, function (id) {\n        inferredR.push(id);\n      });\n      return inferredR.indexOf('region:' + focusPrimaryRegion) !== -1;\n    }\n\n    function regionFocusMatchStrength(handle, resolved, title, hLow) {\n      if (!focusPrimaryRegion) return '';\n      resolved = resolved || window.wmnCatalogGraph.resolveProduct(handle) || {};\n      if (title == null || hLow == null) {\n        var p0 = window.wmnCatalogGraph.getData().products[handle];\n        title = String((p0 && p0.t) || handle).toLowerCase();\n        hLow = String(handle).toLowerCase();\n      }\n      var ci;\n      for (ci = 0; ci < (resolved.regions || []).length; ci++) {\n        if (resolved.regions[ci] === focusPrimaryRegion) return 'strong';\n      }\n      if (regionFocusTitleHit(title, hLow)) return 'strong';\n\n      var genres = resolved.genres || [];\n      var core = focusCoreGenres(genres, focusRegionGenreKeys);\n      var list = core.length ? core : genres;\n      var hits = 0;\n      var off = 0;\n      for (ci = 0; ci < list.length; ci++) {\n        if (focusRegionGenreKeys.indexOf(list[ci]) !== -1) hits++;\n        else off++;\n      }\n      if (hits > 0 && off === 0) return 'strong';\n      if (hits > 0) return 'weak';\n      return '';\n    }\n\n    function regionFocusPurityBonus(handle) {\n      if (\n        !focusDominant ||\n        focusPrimaryKind !== 'region' ||\n        !focusPrimaryRegion ||\n        !handle ||\n        !graphReady()\n      ) {\n        return 0;\n      }\n      var resolved = window.wmnCatalogGraph.resolveProduct(handle) || {};\n      var p = window.wmnCatalogGraph.getData().products[handle];\n      var title = String((p && p.t) || handle).toLowerCase();\n      var hLow = String(handle).toLowerCase();\n      var bonus = 0;\n      var ci;\n      for (ci = 0; ci < (resolved.regions || []).length; ci++) {\n        if (resolved.regions[ci] === focusPrimaryRegion) {\n          bonus += FOCUS_PURITY_REGION_TAG;\n          break;\n        }\n      }\n      if (regionFocusTitleHit(title, hLow)) bonus += FOCUS_PURITY_TITLE;\n      var genres = resolved.genres || [];\n      var core = focusCoreGenres(genres, focusRegionGenreKeys);\n      var list = core.length ? core : genres;\n      var hits = 0;\n      for (ci = 0; ci < list.length; ci++) {\n        if (focusRegionGenreKeys.indexOf(list[ci]) !== -1) hits++;\n      }\n      var denom = Math.max(1, list.length);\n      bonus += (hits / denom) * FOCUS_PURITY_FRAC_SCALE;\n      if (hits > 0 && hits === list.length && list.length === 1) {\n        bonus += FOCUS_PURITY_SOLE_EXTRA;\n      }\n      return bonus;\n    }\n\n    function focusPurityBonus(handle) {\n      if (focusPrimaryKind === 'country') return countryFocusPurityBonus(handle);\n      if (focusPrimaryKind === 'region') return regionFocusPurityBonus(handle);\n      if (focusPrimaryKind === 'genre') return genreFocusPurityBonus(handle);\n      return 0;\n    }\n\n    function handleMatchesFocusWeak(handle) {\n      if (!focusDominant || !handle || !graphReady()) return false;\n      var resolved = window.wmnCatalogGraph.resolveProduct(handle) || {};\n      var p = window.wmnCatalogGraph.getData().products[handle];\n      var title = String((p && p.t) || handle).toLowerCase();\n      var hLow = String(handle).toLowerCase();\n      if (focusPrimaryKind === 'country') {\n        return countryFocusMatchStrength(handle, resolved, title, hLow) ===\n          'weak';\n      }\n      if (focusPrimaryKind === 'region') {\n        return regionFocusMatchStrength(handle, resolved, title, hLow) ===\n          'weak';\n      }\n      if (focusPrimaryKind === 'genre') {\n        return genreFocusMatchStrength(handle, resolved, title, hLow) ===\n          'weak';\n      }\n      return false;\n    }\n\n    function handleMatchesGeo(handle) {\n      if (!geoDominant || !handle || !graphReady()) return false;\n      var resolved = window.wmnCatalogGraph.resolveProduct(handle) || {};\n      var ci;\n      for (ci = 0; ci < (resolved.countries || []).length; ci++) {\n        var c = resolved.countries[ci];\n        if (c && c !== 'celtic' && geoKeys['country:' + c]) return true;\n      }\n      for (ci = 0; ci < (resolved.regions || []).length; ci++) {\n        var r = resolved.regions[ci];\n        if (r && geoKeys['region:' + r]) return true;\n      }\n      var p = window.wmnCatalogGraph.getData().products[handle];\n      var title = (p && p.t) || handle;\n      var inferred = [];\n      inferGeoFromText(title, function (id) {\n        inferred.push(id);\n      });\n      for (ci = 0; ci < inferred.length; ci++) {\n        if (geoKeys[inferred[ci]]) return true;\n      }\n      return false;\n    }\n\n    function scoreWithGeoBonus(handle) {\n      var base = scoreHandleEntities(handle, scoreCtx);\n      if (focusDominant) {\n        if (handleMatchesFocus(handle)) {\n          base += FOCUS_SESSION_MATCH_BONUS;\n          base += focusPurityBonus(handle);\n        } else if (handleMatchesFocusWeak(handle)) {\n          // Bridge-sampled comps: soft-fill only, never prefer-front.\n          base += FOCUS_WEAK_BRIDGE_BONUS;\n          base += focusPurityBonus(handle) * 0.35;\n        } else {\n          base -= FOCUS_SESSION_NONMATCH_PENALTY;\n        }\n        // Emb is tie-break only under session focus (cannot overcome \u00B1match).\n        if (LAMBDA_EMB > 0 && scoreCtx.uEmb) {\n          base +=\n            LAMBDA_EMB *\n            EMB_FOCUS_TIE_SCALE *\n            embDotForHandle(handle, scoreCtx.uEmb);\n        }\n      } else if (geoDominant) {\n        if (handleMatchesGeo(handle)) {\n          base += 160;\n        } else {\n          base -= 220;\n        }\n        if (LAMBDA_EMB > 0 && scoreCtx.uEmb) {\n          base +=\n            LAMBDA_EMB *\n            EMB_SCORE_SCALE *\n            embDotForHandle(handle, scoreCtx.uEmb);\n        }\n      } else if (LAMBDA_EMB > 0 && scoreCtx.uEmb) {\n        base +=\n          LAMBDA_EMB *\n          EMB_SCORE_SCALE *\n          embDotForHandle(handle, scoreCtx.uEmb);\n      }\n      return base;\n    }\n\n    var data = window.wmnCatalogGraph.getData();\n    var handles = Object.keys(data.products || {});\n    var candidates = [];\n    var hi;\n    for (hi = 0; hi < handles.length; hi++) {\n      var h = handles[hi];\n      if (!h || exclude[h]) continue;\n      var gItem = graphItemFromHandle(h);\n      if (!gItem) continue;\n      var base = scoreWithGeoBonus(h);\n      if (explore) base += exploreNoise(prefsNorm, rng);\n      gItem._fyScore = base;\n      candidates.push(gItem);\n    }\n\n    candidates.sort(function (a, b) {\n      return (b._fyScore || 0) - (a._fyScore || 0);\n    });\n\n    var picks = [];\n    var seen = {};\n    var branchByHandle = {};\n    function pushItem(item, branch) {\n      if (!item || !item.handle || seen[item.handle]) return;\n      seen[item.handle] = true;\n      if (branch) branchByHandle[item.handle] = branch;\n      picks.push(item);\n    }\n\n    var recentHandles = [];\n    if (pinRecent) {\n      store.events.forEach(function (ev) {\n        if (ev && ev.h && recentHandles.indexOf(ev.h) === -1) {\n          recentHandles.push(ev.h);\n        }\n      });\n      recentHandles = recentHandles.slice(-10).reverse();\n      if (focusDominant) {\n        var focusRecent = [];\n        for (var rf = 0; rf < recentHandles.length; rf++) {\n          if (handleMatchesFocus(recentHandles[rf])) {\n            focusRecent.push(recentHandles[rf]);\n          }\n        }\n        recentHandles = focusRecent;\n      } else if (geoDominant) {\n        var geoRecent = [];\n        for (var rj = 0; rj < recentHandles.length; rj++) {\n          if (handleMatchesGeo(recentHandles[rj])) geoRecent.push(recentHandles[rj]);\n        }\n        recentHandles = geoRecent;\n      }\n      var pinCap = Math.min(6, Math.max(3, Math.floor(lim / 4)));\n      var rh;\n      for (rh = 0; rh < recentHandles.length && picks.length < pinCap; rh++) {\n        if (exclude[recentHandles[rh]]) continue;\n        var pinned = graphItemFromHandle(recentHandles[rh]);\n        if (pinned) {\n          pinned._fyScore =\n            scoreWithGeoBonus(recentHandles[rh]) + FOCUS_HANDLE_BONUS;\n          pushItem(pinned, 'pin');\n        }\n      }\n    }\n\n    // Prefer focus-matching pool (or prefs-geo pool) for MMR.\n    // Under session focusDominant with a non-empty prefer pool: do not mmr-fill\n    // with unrelated bestsellers (labels would lie). Empty prefer \u2192 soft catalog.\n    var mmrPool = [];\n    var mmrPreferPool = [];\n    function rebuildMmrPools() {\n      mmrPool = [];\n      mmrPreferPool = [];\n      for (var ci = 0; ci < candidates.length; ci++) {\n        if (seen[candidates[ci].handle]) continue;\n        if (focusDominant && handleMatchesFocus(candidates[ci].handle)) {\n          mmrPreferPool.push(candidates[ci]);\n        } else if (geoDominant && handleMatchesGeo(candidates[ci].handle)) {\n          mmrPreferPool.push(candidates[ci]);\n        } else {\n          mmrPool.push(candidates[ci]);\n        }\n      }\n    }\n    rebuildMmrPools();\n\n    var preferActive;\n    var preferPool;\n    var preferBranch;\n    var focusSoftFallback = false;\n    if (focusDominant) {\n      if (mmrPreferPool.length > 0) {\n        preferActive = true;\n        preferPool = mmrPreferPool;\n        preferBranch = 'mmr-prefer';\n      } else {\n        // Empty focus prefer (strict genre hard-gate, etc.) \u2014 show catalog\n        // rather than hiding the whole Picked for you section.\n        focusSoftFallback = true;\n        preferActive = false;\n        preferPool = mmrPool;\n        preferBranch = 'mmr-soft';\n      }\n    } else {\n      preferActive = geoDominant && mmrPreferPool.length;\n      preferPool = preferActive ? mmrPreferPool : mmrPool;\n      preferBranch = preferActive ? 'mmr-prefer' : 'mmr';\n    }\n    var skipCountryMmr =\n      focusDominant &&\n      (focusPrimaryKind === 'country' || focusPrimaryKind === 'region');\n    var mmrPicked = mmrSelect(\n      preferPool,\n      lim - picks.length,\n      picks,\n      function (it) {\n        return it._fyScore || 0;\n      },\n      -Infinity,\n      { skipCountryDiversity: skipCountryMmr }\n    );\n    for (var mi = 0; mi < mmrPicked.length; mi++) {\n      pushItem(mmrPicked[mi], preferBranch);\n    }\n    // Soft-fill when prefs-geo prefer is active, or focus prefer was empty /\n    // too sparse after hard gate (< 3) so the rail never vanishes.\n    // fillToLimit: Store For you paginates Shopify's full catalog \u2014 after the\n    // India/prefer block, continue with score-ordered remainder (mmr-fill)\n    // without clearing focusDominant / lying about the focus subtitle.\n    if (\n      picks.length < lim &&\n      ((preferActive && preferPool === mmrPreferPool && !focusDominant) ||\n        focusSoftFallback ||\n        (focusDominant && picks.length < 3) ||\n        (focusDominant && fillToLimit))\n    ) {\n      if (focusDominant && picks.length < 3 && !fillToLimit) {\n        focusSoftFallback = true;\n      }\n      var fill = mmrSelect(\n        mmrPool,\n        lim - picks.length,\n        picks,\n        function (it) {\n          return it._fyScore || 0;\n        },\n        -Infinity,\n        { skipCountryDiversity: skipCountryMmr }\n      );\n      for (var fi = 0; fi < fill.length; fi++) {\n        pushItem(\n          fill[fi],\n          focusSoftFallback ? 'mmr-soft' : 'mmr-fill'\n        );\n      }\n    }\n\n    // Rails need \u22653 cards; single-tile callers (mega-promo limit:1\u20135) may\n    // request fewer \u2014 only abort when we can't fill the requested lim floor.\n    if (picks.length < Math.min(3, lim)) return null;\n\n    // Soft fallback must not keep a lying focus subtitle / focusDominant flag.\n    if (focusSoftFallback) {\n      focusDominant = false;\n      focus = null;\n    }\n\n    // Softmax \u03C0 over full eligible candidate set (scores include explore noise).\n    var piRows = [];\n    for (var pri = 0; pri < candidates.length; pri++) {\n      piRows.push({\n        handle: candidates[pri].handle,\n        score: candidates[pri]._fyScore || 0\n      });\n    }\n    // Pins may have elevated score not in candidates list \u2014 include them.\n    for (var ppi = 0; ppi < picks.length; ppi++) {\n      var ph = picks[ppi].handle;\n      var found = false;\n      for (var pj = 0; pj < piRows.length; pj++) {\n        if (piRows[pj].handle === ph) {\n          found = true;\n          if ((picks[ppi]._fyScore || 0) > piRows[pj].score) {\n            piRows[pj].score = picks[ppi]._fyScore || 0;\n          }\n          break;\n        }\n      }\n      if (!found) {\n        piRows.push({ handle: ph, score: picks[ppi]._fyScore || 0 });\n      }\n    }\n    var piMap = softmaxPiMap(piRows, FY_SOFTMAX_TEMP);\n\n    // Labels: single primary from last intentional focus (hover/click/search),\n    // not a stack of neighbors. uniqPush re-promotes so Blues after Klezmer wins.\n    // Prefer genre/artist when set (Jazz/Blues subtitle); else country/region.\n    var focusLabelIds = [];\n    if (focus) {\n      var primaryG =\n        focus.primaryGenre || (focus.genres && focus.genres[0]) || '';\n      var primaryA =\n        focus.primaryArtist || (focus.artists && focus.artists[0]) || '';\n      var kind = focus.primaryKind || focusPrimaryKind || '';\n      if (primaryG && kind !== 'country' && kind !== 'region') {\n        focusLabelIds.push('genre:' + primaryG);\n      } else if (kind === 'country' && focus.primaryCountry) {\n        focusLabelIds.push('country:' + focus.primaryCountry);\n      } else if (kind === 'region' && focus.primaryRegion) {\n        focusLabelIds.push('region:' + focus.primaryRegion);\n      } else if (primaryG) {\n        focusLabelIds.push('genre:' + primaryG);\n      } else if (primaryA) {\n        focusLabelIds.push('artist:' + primaryA);\n      }\n    }\n\n    var labelIds;\n    if (focusLabelIds.length) {\n      labelIds = focusLabelIds.slice(0, 1);\n    } else if (topCountries.length) {\n      labelIds = topCountries.slice(0, 2);\n    } else if (topRegions.length) {\n      labelIds = topRegions.slice(0, 2);\n    } else if (topArtistGenre.length) {\n      labelIds = topArtistGenre.slice(0, 2);\n    } else {\n      labelIds = labelSeeds.slice(0, 2);\n    }\n    var labels = labelIds.map(function (id) {\n      var parts = id.split(':');\n      var key = parts[1] || id;\n      var gdata = window.wmnCatalogGraph.getData();\n      if (parts[0] === 'country' && gdata.countries && gdata.countries[key]) {\n        return gdata.countries[key].n;\n      }\n      if (parts[0] === 'region' && gdata.regions && gdata.regions[key]) {\n        return gdata.regions[key].n;\n      }\n      if (parts[0] === 'artist' && gdata.artists[key]) return gdata.artists[key].n;\n      if (parts[0] === 'genre' && gdata.genres[key]) return gdata.genres[key].n;\n      return key.replace(/-/g, ' ').replace(/\\b\\w/g, function (c) {\n        return c.toUpperCase();\n      });\n    });\n\n    // Strip internal score before return (keep for debug via scored count).\n    var outPicks = picks.slice(0, lim).map(function (it, idx) {\n      var pi = piMap[it.handle] != null ? piMap[it.handle] : 0;\n      var br = branchByHandle[it.handle] || 'mmr';\n      var copy = {\n        handle: it.handle,\n        title: it.title,\n        artist: it.artist,\n        url: it.url,\n        image: it.image,\n        genres: it.genres,\n        fromGraph: it.fromGraph,\n        score: it._fyScore,\n        pi: roundPi(pi),\n        rank: idx,\n        piSlot: roundPi(pi * slotWeight(idx)),\n        branch: br,\n        policy: FY_POLICY_ID,\n        explore: !!explore\n      };\n      return copy;\n    });\n\n    return {\n      picks: outPicks,\n      labels: labels,\n      seeds: labelSeeds,\n      geo:\n        focusDominant\n          ? focusPrimaryKind === 'country' || focusPrimaryKind === 'region'\n          : !!(topCountries.length || topRegions.length),\n      focusDominant: !!focusDominant,\n      focusKind: focusPrimaryKind || '',\n      scored: candidates.length,\n      policy: FY_POLICY_ID,\n      explore: !!explore,\n      eligible: piRows.length\n    };\n  }\n\n  /**\n   * Shared For you composition (legacy homepage paint + Discover via scoreCatalogForYou(32)).\n   * Homepage endless feed owns #wmn-for-you via wmn-for-you-feed.js.\n   * @returns {{ picks: object[], labels: string[], seeds: string[] }|null}\n   */\n  function buildForYouPicks(limit) {\n    return scoreCatalogForYou({\n      limit: limit || 18,\n      explore: false,\n      pinRecent: true\n    });\n  }\n\n  function hasGeoForYouPrefs() {\n    var prefs = (readStore().entities || {});\n    return (\n      topEntityIds(prefs, 1, ['country']).length > 0 ||\n      topEntityIds(prefs, 1, ['region']).length > 0\n    );\n  }\n\n  function forYouFeedOwns(root) {\n    var el = root || document.getElementById('wmn-for-you');\n    if (!el) return false;\n    if (el.getAttribute('data-wmn-fy-feed') === '1') return true;\n    return !!(window.wmnForYouFeed && typeof window.wmnForYouFeed.ensure === 'function');\n  }\n\n  var BECAUSE_CAP = 80;\n  var BECAUSE_PAGE = 8;\n  var BECAUSE_TITLE_MAX = 40;\n\n  /**\n   * Handle key for Because exclude: lowercase, strip leading `the-`, collapse dashes.\n   * Also accepts /products/\u2026 paths (same as RV cookie normalize).\n   */\n  function normalizeBecauseHandleKey(handle) {\n    var h = normalizeRecentlyViewedHandle(handle);\n    if (!h) h = String(handle == null ? '' : handle).replace(/^\\s+|\\s+$/g, '');\n    if (!h) return '';\n    h = h.toLowerCase();\n    if (h.indexOf('the-') === 0) h = h.slice(4);\n    h = h.replace(/-+/g, '-').replace(/^-|-$/g, '');\n    return h;\n  }\n\n  /**\n   * Title core for Because exclude: lowercase, strip punctuation / \"the\" /\n   * \"rough guide to\", collapse whitespace. \"Rough Guide to Spiritual Blues\"\n   * and \"Spiritual Blues\" share the same key.\n   */\n  function normalizeBecauseTitleKey(title) {\n    var s = String(title || '')\n      .toLowerCase()\n      .replace(/&/g, ' and ')\n      .replace(/['']/g, '')\n      .replace(/[^a-z0-9]+/g, ' ')\n      .replace(/\\s+/g, ' ')\n      .replace(/^\\s+|\\s+$/g, '');\n    s = s.replace(/^the\\s+/, '');\n    s = s.replace(/^rough\\s+guide\\s+to\\s+/, '');\n    s = s.replace(/^rough\\s+guide\\s+/, '');\n    return s;\n  }\n\n  /**\n   * Stable Shopify CDN fingerprint: basename without `_200x` size / query.\n   * Catches duplicate SKUs that share a cover (e.g. spiritual-blues \u2194 gospel-holy).\n   */\n  function becauseImageKey(url) {\n    if (!url) return '';\n    var u = normalizeImageUrl(url).toLowerCase().split('?')[0];\n    u = u.replace(/_\\d+x\\d*(?=\\.(?:jpe?g|png|webp|gif)$)/i, '');\n    u = u.replace(\n      /_(pico|icon|thumb|small|compact|medium|large|grande|original|master)(?=\\.(?:jpe?g|png|webp|gif)$)/i,\n      ''\n    );\n    var slash = u.lastIndexOf('/');\n    var base = slash >= 0 ? u.slice(slash + 1) : u;\n    return base.replace(/\\.(?:jpe?g|png|webp|gif)$/i, '') || u;\n  }\n\n  /**\n   * Distinctive seed phrases for fuzzy exclude, e.g. spiritual-blues / spiritual blues.\n   * Derived from handle + title cores (after stripping the-/rough-guide-to-).\n   */\n  /**\n   * True when phrase is a catalog genre slug/name (e.g. \"flamenco\").\n   * Those must not become fuzzy-exclude tokens \u2014 they wipe the Dig deeper\n   * pure-genre pool (Calaita Flamenco Son, Rough Guide to Flamenco vol 1\u2026).\n   */\n  function becauseIsCatalogGenrePhrase(phrase) {\n    if (!phrase || !graphReady()) return false;\n    var data = window.wmnCatalogGraph.getData();\n    if (!data || !data.genres) return false;\n    var raw = String(phrase)\n      .toLowerCase()\n      .replace(/^\\s+|\\s+$/g, '');\n    if (!raw) return false;\n    var slug = raw.replace(/\\s+/g, '-').replace(/-+/g, '-');\n    if (data.genres[slug]) return true;\n    var want = raw.replace(/[^a-z0-9]+/g, ' ').replace(/\\s+/g, ' ').trim();\n    var k;\n    for (k in data.genres) {\n      if (!Object.prototype.hasOwnProperty.call(data.genres, k)) continue;\n      var n = data.genres[k] && data.genres[k].n;\n      if (!n) continue;\n      var nn = String(n)\n        .toLowerCase()\n        .replace(/[^a-z0-9]+/g, ' ')\n        .replace(/\\s+/g, ' ')\n        .trim();\n      if (nn && nn === want) return true;\n    }\n    return false;\n  }\n\n  function becauseSeedFuzzyPhrases(seed, seedTitle) {\n    var out = [];\n    var seen = {};\n    function add(p) {\n      var k = String(p || '')\n        .toLowerCase()\n        .replace(/^\\s+|\\s+$/g, '');\n      if (!k || k.length < 6 || seen[k]) return;\n      // Genre-only cores exclude the whole Dig deeper lane \u2014 skip them.\n      if (becauseIsCatalogGenrePhrase(k)) return;\n      seen[k] = true;\n      out.push(k);\n    }\n    var norm = normalizeBecauseHandleKey(seed);\n    var hCore = norm\n      .replace(/^rough-guide-to-/, '')\n      .replace(/^rough-guide-/, '');\n    if (hCore) {\n      add(hCore);\n      add(hCore.replace(/-/g, ' '));\n    }\n    var tCore = normalizeBecauseTitleKey(seedTitle || '');\n    if (tCore) {\n      add(tCore);\n      add(tCore.replace(/\\s+/g, '-'));\n    }\n    return out;\n  }\n\n  function becauseFuzzyMatchesSeed(handle, title, phrases) {\n    if (!phrases || !phrases.length) return false;\n    var h = String(handle || '').toLowerCase();\n    var t = normalizeBecauseTitleKey(title || '');\n    var blob = h + ' ' + h.replace(/-/g, ' ') + ' ' + t;\n    var i;\n    for (i = 0; i < phrases.length; i++) {\n      if (phrases[i] && blob.indexOf(phrases[i]) !== -1) return true;\n    }\n    return false;\n  }\n\n  /** Seed = focus.handles[0] or latest view / search_click event handle. */\n  function becauseSeedHandle() {\n    var focus = readFocus();\n    if (focus && focus.handles && focus.handles.length && focus.handles[0]) {\n      return String(focus.handles[0]);\n    }\n    var store = readStore();\n    var events = store.events || [];\n    for (var i = events.length - 1; i >= 0; i--) {\n      var ev = events[i];\n      if (!ev || !ev.h) continue;\n      var k = ev.k || 'view';\n      if (k === 'view' || k === 'search_click') return String(ev.h);\n    }\n    return '';\n  }\n\n  function becauseSeedTitle(handle) {\n    if (!handle) return '';\n    try {\n      var item = graphItemFromHandle(handle);\n      if (item && item.title) return item.title;\n      // Handle mismatch: try normalized / the- variants against the graph.\n      var norm = normalizeBecauseHandleKey(handle);\n      if (norm && norm !== handle) {\n        item = graphItemFromHandle(norm);\n        if (item && item.title) return item.title;\n        item = graphItemFromHandle('the-' + norm);\n        if (item && item.title) return item.title;\n      }\n    } catch (e) {\n      /* ignore */\n    }\n    var store = readStore();\n    var events = store.events || [];\n    for (var i = events.length - 1; i >= 0; i--) {\n      if (events[i] && events[i].h === handle && events[i].title) {\n        return String(events[i].title);\n      }\n    }\n    return humanizeSlug(handle);\n  }\n\n  function truncateBecauseTitle(title) {\n    var s = String(title || '').replace(/\\s+/g, ' ').trim();\n    if (s.length <= BECAUSE_TITLE_MAX) return s;\n    var cut = s.slice(0, BECAUSE_TITLE_MAX - 1);\n    var sp = cut.lastIndexOf(' ');\n    if (sp > 16) cut = cut.slice(0, sp);\n    return cut.replace(/[.,;:\\-\u2013\u2014\\s]+$/, '') + '\u2026';\n  }\n\n  /**\n   * Block seed (+ handle variants), core titles, identical cover images,\n   * fuzzy seed phrases, RV cookie, and For You locked.\n   * @returns {{ handles: Object, norms: Object, titles: Object, images: Object, phrases: string[] }}\n   */\n  function becauseExcludeSet(seed) {\n    var handles = {};\n    var norms = {};\n    var titles = {};\n    var images = {};\n    var phrases = [];\n\n    function blockHandle(h) {\n      if (!h) return;\n      var raw = normalizeRecentlyViewedHandle(h) || String(h).replace(/^\\s+|\\s+$/g, '');\n      if (!raw) return;\n      handles[raw] = true;\n      handles[String(h)] = true;\n      var n = normalizeBecauseHandleKey(raw);\n      if (n) {\n        norms[n] = true;\n        handles[n] = true;\n        handles['the-' + n] = true;\n      }\n    }\n\n    function blockTitle(t) {\n      var key = normalizeBecauseTitleKey(t);\n      if (key) titles[key] = true;\n    }\n\n    function blockImage(url) {\n      var key = becauseImageKey(url);\n      if (key) images[key] = true;\n    }\n\n    blockHandle(seed);\n    var seedTitle = becauseSeedTitle(seed);\n    blockTitle(seedTitle);\n    phrases = becauseSeedFuzzyPhrases(seed, seedTitle);\n\n    try {\n      var seedItem = graphItemFromHandle(seed);\n      if (seedItem) {\n        if (seedItem.title) blockTitle(seedItem.title);\n        if (seedItem.image) blockImage(seedItem.image);\n      }\n      var seedNorm = normalizeBecauseHandleKey(seed);\n      if (seedNorm) {\n        var alt =\n          graphItemFromHandle(seedNorm) || graphItemFromHandle('the-' + seedNorm);\n        if (alt) {\n          if (alt.title) blockTitle(alt.title);\n          if (alt.image) blockImage(alt.image);\n          blockHandle(alt.handle || seedNorm);\n        }\n        // Raw catalog img (before getProductImage width rewrite).\n        if (graphReady()) {\n          var data = window.wmnCatalogGraph.getData();\n          var rawP =\n            (data && data.products && data.products[seed]) ||\n            (data && data.products && data.products[seedNorm]) ||\n            (data && data.products && data.products['the-' + seedNorm]);\n          if (rawP && rawP.img) blockImage(rawP.img);\n          // Block every catalog twin that shares the seed cover.\n          if (rawP && rawP.img && data && data.products) {\n            var seedImgKey = becauseImageKey(rawP.img);\n            if (seedImgKey) {\n              var ph;\n              for (ph in data.products) {\n                if (!Object.prototype.hasOwnProperty.call(data.products, ph)) {\n                  continue;\n                }\n                var twin = data.products[ph];\n                if (!twin || !twin.img) continue;\n                if (becauseImageKey(twin.img) !== seedImgKey) continue;\n                blockHandle(ph);\n                if (twin.t) blockTitle(twin.t);\n                blockImage(twin.img);\n              }\n            }\n          }\n        }\n      }\n    } catch (eSeed) {\n      /* ignore */\n    }\n\n    try {\n      var rv = readRecentlyViewedCookie();\n      for (var r = 0; r < rv.length; r++) blockHandle(rv[r]);\n    } catch (eRv) {\n      /* ignore */\n    }\n\n    try {\n      var cards = document.querySelectorAll(\n        '#wmn-for-you-grid [data-wmn-handle][data-wmn-fy-locked=\"1\"]'\n      );\n      for (var i = 0; i < cards.length; i++) {\n        var h = cards[i].getAttribute('data-wmn-handle');\n        if (h) blockHandle(h);\n      }\n    } catch (e) {\n      /* ignore */\n    }\n\n    // Staff Picks \"For you\" slot must never also appear in Dig deeper.\n    try {\n      var staffFy = getStaffPicksAffinityHandle();\n      if (staffFy) blockHandle(staffFy);\n    } catch (eStaff) {\n      /* ignore */\n    }\n\n    return {\n      handles: handles,\n      norms: norms,\n      titles: titles,\n      images: images,\n      phrases: phrases\n    };\n  }\n\n  function becauseIsExcluded(handle, item, excl) {\n    if (!handle || !excl) return true;\n    if (excl.handles[handle]) return true;\n    var n = normalizeBecauseHandleKey(handle);\n    if (n && (excl.norms[n] || excl.handles[n] || excl.handles['the-' + n])) {\n      return true;\n    }\n    var title = item && item.title ? item.title : '';\n    var image = item && item.image ? item.image : '';\n    if (!title || !image) {\n      try {\n        var gi = graphItemFromHandle(handle);\n        if (gi) {\n          if (!title && gi.title) title = gi.title;\n          if (!image && gi.image) image = gi.image;\n        }\n      } catch (eT) {\n        /* ignore */\n      }\n    }\n    if (!image && graphReady()) {\n      try {\n        var data = window.wmnCatalogGraph.getData();\n        var raw =\n          data && data.products && (data.products[handle] || data.products[n]);\n        if (raw && raw.img) image = raw.img;\n        if (!title && raw && raw.t) title = raw.t;\n      } catch (eImg) {\n        /* ignore */\n      }\n    }\n    var tk = normalizeBecauseTitleKey(title);\n    if (tk && excl.titles[tk]) return true;\n    var ik = becauseImageKey(image);\n    if (ik && excl.images && excl.images[ik]) return true;\n    if (becauseFuzzyMatchesSeed(handle, title, excl.phrases)) return true;\n    return false;\n  }\n\n  /** Merge two becauseExcludeSet results (used when raw seed \u2260 resolved seedKey). */\n  function becauseMergeExclude(into, extra) {\n    if (!into || !extra) return into;\n    var ek;\n    for (ek in extra.handles) {\n      if (Object.prototype.hasOwnProperty.call(extra.handles, ek)) {\n        into.handles[ek] = true;\n      }\n    }\n    for (ek in extra.norms) {\n      if (Object.prototype.hasOwnProperty.call(extra.norms, ek)) {\n        into.norms[ek] = true;\n      }\n    }\n    for (ek in extra.titles) {\n      if (Object.prototype.hasOwnProperty.call(extra.titles, ek)) {\n        into.titles[ek] = true;\n      }\n    }\n    if (extra.images) {\n      if (!into.images) into.images = {};\n      for (ek in extra.images) {\n        if (Object.prototype.hasOwnProperty.call(extra.images, ek)) {\n          into.images[ek] = true;\n        }\n      }\n    }\n    if (extra.phrases && extra.phrases.length) {\n      into.phrases = (into.phrases || []).concat(extra.phrases);\n    }\n    return into;\n  }\n\n  function becauseRankScore(handle, seedResolved) {\n    if (!handle || !seedResolved || !graphReady()) return 0;\n    var r = window.wmnCatalogGraph.resolveProduct(handle) || {};\n    var score = 0;\n    var sa = seedResolved.artists || [];\n    var ra = r.artists || [];\n    var i;\n    for (i = 0; i < sa.length; i++) {\n      if (sa[i] && ra.indexOf(sa[i]) !== -1) {\n        score += 1000;\n        break;\n      }\n    }\n    var sg = seedResolved.genres || [];\n    var rg = r.genres || [];\n    if (sg[0] && rg.indexOf(sg[0]) !== -1) score += 200;\n    for (i = 1; i < sg.length; i++) {\n      if (sg[i] && rg.indexOf(sg[i]) !== -1) {\n        score += 40;\n        break;\n      }\n    }\n    var sc = seedResolved.countries || [];\n    var rc = r.countries || [];\n    for (i = 0; i < sc.length; i++) {\n      if (sc[i] && rc.indexOf(sc[i]) !== -1) {\n        score += 80;\n        break;\n      }\n    }\n    return score;\n  }\n\n  /**\n   * Dig deeper lane target \u2014 prefers session focus (search \"jazz\") so the\n   * title and pool stay aligned, then falls back to the seed product.\n   * @returns {{ kind: 'genre'|'country'|'region', slug: string }|null}\n   */\n  function becauseDigDeeperTarget(seedKey) {\n    var focus = readFocus();\n    var resolved =\n      seedKey && graphReady()\n        ? window.wmnCatalogGraph.resolveProduct(seedKey) || {}\n        : {};\n\n    if (focus && focus.primaryKind === 'genre') {\n      var fg =\n        focus.primaryGenre || (focus.genres && focus.genres[0]) || '';\n      if (fg) return { kind: 'genre', slug: String(fg) };\n    }\n    if (focus && focus.primaryKind === 'country' && focus.primaryCountry) {\n      return { kind: 'country', slug: String(focus.primaryCountry) };\n    }\n    if (focus && focus.primaryKind === 'region' && focus.primaryRegion) {\n      return { kind: 'region', slug: String(focus.primaryRegion) };\n    }\n\n    var g0 = (resolved.genres && resolved.genres[0]) || '';\n    if (!g0 && focus) {\n      g0 = focus.primaryGenre || (focus.genres && focus.genres[0]) || '';\n    }\n    if (g0) return { kind: 'genre', slug: String(g0) };\n\n    var c0 = (resolved.countries && resolved.countries[0]) || '';\n    if (!c0 && focus) c0 = focus.primaryCountry || '';\n    if (c0) return { kind: 'country', slug: String(c0) };\n\n    var r0 = (resolved.regions && resolved.regions[0]) || '';\n    if (!r0 && focus) r0 = focus.primaryRegion || '';\n    if (r0) return { kind: 'region', slug: String(r0) };\n\n    return null;\n  }\n\n  /**\n   * Word-bound genre match against title/handle text.\n   * @param {string} text\n   * @param {string} genreSlug\n   * @returns {boolean}\n   */\n  function becauseGenreWordInText(text, genreSlug) {\n    var gWords = String(genreSlug || '')\n      .toLowerCase()\n      .replace(/-/g, ' ')\n      .trim();\n    if (!gWords || !text) return false;\n    if (gWords.indexOf(' ') === -1) {\n      var re = new RegExp(\n        '\\\\b' + gWords.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + '\\\\b',\n        'i'\n      );\n      return re.test(text);\n    }\n    return text.indexOf(gWords) !== -1;\n  }\n\n  /**\n   * \"Jazz and Blues Legends\" series \u2014 Blues-primary dual tags; the word\n   * \"jazz\" in the series name is not Jazz-genre evidence.\n   */\n  function becauseIsJazzAndBluesSeries(title, handle) {\n    var text = (String(title || '') + ' ' + String(handle || ''))\n      .toLowerCase()\n      .replace(/-/g, ' ');\n    return /\\bjazz\\s+and\\s+blues\\b/.test(text);\n  }\n\n  /**\n   * Neighbor genre slugs for Dig deeper soft-fill.\n   * Genre digs: relatedGenres siblings only \u2014 never region bridges\n   * (salsa\u2208caribbean was pulling reggae/calypso into \"Dig deeper into Salsa\").\n   * Country/region digs: still use geo\u2192genre bridges.\n   */\n  function becauseDigNeighborSlugs(digTarget) {\n    var out = [];\n    var seen = {};\n    if (!digTarget || !digTarget.slug || !graphReady()) return out;\n    var data = window.wmnCatalogGraph.getData() || {};\n    var genres = data.genres || {};\n\n    function add(slug) {\n      var s = String(slug || '').toLowerCase();\n      if (!s || seen[s] || !genres[s]) return;\n      if (digTarget.kind === 'genre' && s === String(digTarget.slug).toLowerCase()) {\n        return;\n      }\n      seen[s] = true;\n      out.push(s);\n    }\n\n    if (digTarget.kind === 'genre') {\n      var digSlug = String(digTarget.slug).toLowerCase();\n      try {\n        if (typeof window.wmnCatalogGraph.relatedGenres === 'function') {\n          var rels = window.wmnCatalogGraph.relatedGenres(digSlug) || [];\n          var ri;\n          for (ri = 0; ri < rels.length; ri++) {\n            if (rels[ri] && rels[ri].slug) add(rels[ri].slug);\n          }\n        }\n      } catch (eRel) {\n        /* ignore */\n      }\n    } else if (digTarget.kind === 'country') {\n      var cBridge = COUNTRY_GENRE_BRIDGES[String(digTarget.slug).toLowerCase()] || [];\n      var ci;\n      for (ci = 0; ci < cBridge.length; ci++) add(cBridge[ci]);\n    } else if (digTarget.kind === 'region') {\n      var rBridge =\n        REGION_GENRE_BRIDGES[String(digTarget.slug).toLowerCase()] || [];\n      var rbi;\n      for (rbi = 0; rbi < rBridge.length; rbi++) add(rBridge[rbi]);\n    }\n    return out;\n  }\n\n  /**\n   * Soft Dig deeper match \u2014 primary genre must be a neighbor.\n   * Secondary brazilian/reggae chips on unrelated albums must not pad Salsa.\n   */\n  function becauseProductMatchesNeighborGenre(handle, neighborSlugs) {\n    if (!handle || !neighborSlugs || !neighborSlugs.length || !graphReady()) {\n      return false;\n    }\n    var resolved = window.wmnCatalogGraph.resolveProduct(handle) || {};\n    var pGenres = resolved.genres || [];\n    if (!pGenres.length) return false;\n    // Kitchen-sink comps (4+ chips) are never honest soft neighbours.\n    if (pGenres.length >= 4) return false;\n    var primary = String(pGenres[0] || '').toLowerCase();\n    if (!primary) return false;\n    var j;\n    for (j = 0; j < neighborSlugs.length; j++) {\n      if (primary === neighborSlugs[j]) return true;\n    }\n    return false;\n  }\n\n  /**\n   * Dig deeper genre gate \u2014 oval chips (graph g[]) are source of truth.\n   * Jazz stays tighter: \"Jazz and Blues\" series \u2260 Jazz; secondary Jazz\n   * still needs the word in the title. Kitchen-sink comps (\u22654 chips) need\n   * the dig genre in the title or as primary \u2014 \"Best Music You've Never\n   * Heard\" must not qualify as Salsa from a buried chip.\n   */\n  function becauseProductMatchesGenre(handle, genreSlug) {\n    if (!handle || !genreSlug || !graphReady()) return false;\n    var slug = String(genreSlug).toLowerCase();\n    var resolved = window.wmnCatalogGraph.resolveProduct(handle) || {};\n    var pGenres = resolved.genres || [];\n    var i;\n    var hasChip = false;\n    var genresLow = [];\n    for (i = 0; i < pGenres.length; i++) {\n      var gLow = String(pGenres[i] || '').toLowerCase();\n      if (!gLow) continue;\n      genresLow.push(gLow);\n      if (gLow === slug) hasChip = true;\n    }\n    if (!hasChip) return false;\n\n    var data = window.wmnCatalogGraph.getData();\n    var p =\n      (data && data.products && data.products[handle]) || null;\n    var title = String((p && p.t) || handle).toLowerCase();\n    var hLow = String(handle).toLowerCase();\n    var text = title + ' ' + hLow.replace(/-/g, ' ');\n    var digInTitle = becauseGenreWordInText(text, slug);\n\n    if (slug === 'jazz' && becauseIsJazzAndBluesSeries(title, handle)) {\n      return false;\n    }\n\n    // Multi-tag comps: buried chips are not Dig deeper evidence.\n    if (genresLow.length >= 4 && genresLow[0] !== slug && !digInTitle) {\n      return false;\n    }\n\n    // Primary oval matches dig genre \u2014 reject when title clearly names\n    // another tagged genre instead (Highlife 2nd ed tagged Jazz first).\n    if (genresLow.length && genresLow[0] === slug) {\n      if (!digInTitle) {\n        for (i = 0; i < genresLow.length; i++) {\n          if (genresLow[i] === slug) continue;\n          if (becauseGenreWordInText(text, genresLow[i])) return false;\n        }\n      }\n      return true;\n    }\n\n    // Secondary chip: Jazz stays title-bound; other genres trust the chip.\n    if (slug === 'jazz') return digInTitle;\n    return true;\n  }\n\n  /**\n   * Dig deeper country gate \u2014 require graph country tag OR explicit\n   * country/adjective in title/handle. No soft genre association (that was\n   * flooding \"Dig deeper into Japan\" with Latin/Brazil neighbours).\n   */\n  function becauseProductMatchesCountry(handle, countrySlug) {\n    if (!handle || !countrySlug || !graphReady()) return false;\n    var slug = String(countrySlug).toLowerCase();\n    var resolved = window.wmnCatalogGraph.resolveProduct(handle) || {};\n    var countries = resolved.countries || [];\n    var i;\n    for (i = 0; i < countries.length; i++) {\n      if (String(countries[i] || '').toLowerCase() === slug) return true;\n    }\n    var data = window.wmnCatalogGraph.getData();\n    var p = (data && data.products && data.products[handle]) || null;\n    var title = String((p && p.t) || handle).toLowerCase();\n    var hLow = String(handle).toLowerCase();\n    var text = title + ' ' + hLow.replace(/-/g, ' ');\n    var cWords = slug.replace(/-/g, ' ');\n    if (cWords && text.indexOf(cWords) !== -1) return true;\n    var adjList = COUNTRY_ADJ_TOKENS[slug] || [];\n    for (i = 0; i < adjList.length; i++) {\n      var adj = adjList[i];\n      if (!adj) continue;\n      var adjRe = new RegExp(\n        '\\\\b' + String(adj).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + '\\\\b',\n        'i'\n      );\n      if (adjRe.test(title) || adjRe.test(hLow)) return true;\n    }\n    return false;\n  }\n\n  /**\n   * Dig deeper region gate \u2014 require graph region membership (or Latin\n   * America soft genre/title cues already encoded on the product).\n   */\n  function becauseProductMatchesRegion(handle, regionSlug) {\n    if (!handle || !regionSlug || !graphReady()) return false;\n    var slug = String(regionSlug).toLowerCase();\n    var resolved = window.wmnCatalogGraph.resolveProduct(handle) || {};\n    var regions = resolved.regions || [];\n    var i;\n    for (i = 0; i < regions.length; i++) {\n      if (String(regions[i] || '').toLowerCase() === slug) return true;\n    }\n    var data = window.wmnCatalogGraph.getData();\n    var p = (data && data.products && data.products[handle]) || null;\n    var title = String((p && p.t) || handle).toLowerCase();\n    var hLow = String(handle).toLowerCase();\n    var text = title + ' ' + hLow.replace(/-/g, ' ');\n    var rWords = slug.replace(/-/g, ' ');\n    if (rWords && text.indexOf(rWords) !== -1) return true;\n    if (slug === 'latin-america') {\n      var latinGenres = [\n        'salsa',\n        'cumbia',\n        'brazilian',\n        'afro-cuban-son',\n        'tango'\n      ];\n      var genres = resolved.genres || [];\n      for (i = 0; i < genres.length; i++) {\n        if (latinGenres.indexOf(String(genres[i] || '').toLowerCase()) !== -1) {\n          return true;\n        }\n      }\n      if (\n        /latin|salsa|cumbia|brazil|cuba|tango|colombia|peru|mexico|argentina/i.test(\n          text\n        )\n      ) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  function becauseColumnClass(index) {\n    var cycle = index % 4;\n    var pos = cycle === 0 ? 'alpha' : cycle === 3 ? 'omega' : '';\n    return (\n      'thumbnail four columns wmn-because-card' +\n      (pos ? ' ' + pos : '') +\n      (index % 2 === 0 ? ' even' : ' odd')\n    );\n  }\n\n  /** Dig deeper cover URL \u2014 item.image, graph cache, then baked products[h].img. */\n  function becauseResolveImage(handle, item) {\n    var img = (item && item.image) || '';\n    try {\n      if (\n        window.wmnCatalogGraph &&\n        typeof window.wmnCatalogGraph.getProductImage === 'function'\n      ) {\n        img = window.wmnCatalogGraph.getProductImage(handle) || img;\n      }\n      if (\n        !img &&\n        window.wmnCatalogGraph &&\n        typeof window.wmnCatalogGraph.getData === 'function'\n      ) {\n        var data = window.wmnCatalogGraph.getData();\n        var p = data && data.products && data.products[handle];\n        if (p && p.img) img = p.img;\n      }\n    } catch (eImg) {\n      /* ignore */\n    }\n    return withShopifyImageWidth(normalizeImageUrl(img), 800) || '';\n  }\n\n  function becausePatchCardImages(grid) {\n    if (!grid) return;\n    var cards = grid.querySelectorAll('[data-wmn-because-card]');\n    var i;\n    for (i = 0; i < cards.length; i++) {\n      var card = cards[i];\n      var handle = card.getAttribute('data-wmn-handle');\n      if (!handle) continue;\n      var src = becauseResolveImage(handle, null);\n      if (!src) continue;\n      var img = card.querySelector('.product_image img, .image__container img, img');\n      if (img) {\n        var cur = img.getAttribute('src') || '';\n        if (cur && img.complete && img.naturalWidth > 0) continue;\n        img.removeAttribute('data-src');\n        img.setAttribute('loading', 'eager');\n        img.setAttribute('decoding', 'async');\n        img.setAttribute('width', '800');\n        img.setAttribute('height', '800');\n        img.setAttribute('src', src);\n        continue;\n      }\n      var box = card.querySelector('.image__container');\n      if (box) {\n        box.innerHTML =\n          '<img src=\"' +\n          escapeHtml(src) +\n          '\" alt=\"' +\n          escapeHtml(card.getAttribute('data-wmn-title') || '') +\n          '\" loading=\"eager\" decoding=\"async\" width=\"800\" height=\"800\" />';\n      }\n    }\n  }\n\n  /**\n   * Safari/WebKit: imgs inserted under [hidden]/display:none often never\n   * fetch. After the rail is revealed, re-assign src to kick the loader.\n   */\n  function becauseNudgeImages(grid) {\n    if (!grid) return;\n    var imgs = grid.querySelectorAll(\n      '[data-wmn-because-card] .image__container img, [data-wmn-because-card] img'\n    );\n    var i;\n    for (i = 0; i < imgs.length; i++) {\n      var img = imgs[i];\n      if (!img) continue;\n      if (img.complete && img.naturalWidth > 0) continue;\n      var src = img.getAttribute('src') || img.getAttribute('data-src') || '';\n      if (!src) continue;\n      img.removeAttribute('data-src');\n      img.setAttribute('loading', 'eager');\n      img.setAttribute('decoding', 'async');\n      // Clear then restore \u2014 forces WebKit to start the request post-reveal.\n      img.removeAttribute('src');\n      img.setAttribute('src', src);\n    }\n  }\n\n  function becauseHydratePageImages(grid, handles) {\n    if (!grid) return;\n    var need = [];\n    var seen = {};\n    var i;\n    for (i = 0; i < (handles || []).length; i++) {\n      var h = handles[i];\n      if (!h || seen[h]) continue;\n      seen[h] = true;\n      need.push(h);\n    }\n    var cards = grid.querySelectorAll('[data-wmn-because-card]');\n    for (i = 0; i < cards.length; i++) {\n      var handle = cards[i].getAttribute('data-wmn-handle');\n      if (!handle || seen[handle]) continue;\n      var img = cards[i].querySelector('img');\n      var src = img && img.getAttribute('src');\n      if (src) continue;\n      seen[handle] = true;\n      need.push(handle);\n    }\n    if (!need.length) {\n      becausePatchCardImages(grid);\n      becauseNudgeImages(grid);\n      return;\n    }\n    if (\n      !window.wmnCatalogGraph ||\n      typeof window.wmnCatalogGraph.hydrateImages !== 'function'\n    ) {\n      becausePatchCardImages(grid);\n      becauseNudgeImages(grid);\n      return;\n    }\n    window.wmnCatalogGraph\n      .hydrateImages(need)\n      .then(function () {\n        becausePatchCardImages(grid);\n        becauseNudgeImages(grid);\n      })\n      .catch(function () {\n        becausePatchCardImages(grid);\n        becauseNudgeImages(grid);\n      });\n  }\n\n  function becausePaintPage(root, grid) {\n    var state = root && root._wmnBecauseState;\n    if (!state || !state.pool || !state.pool.length || !grid) return 0;\n    var pool = state.pool;\n    var start = ((state.pageIndex % pool.length) + pool.length) % pool.length;\n    try {\n      var holdH = grid.offsetHeight;\n      if (holdH > 40) grid.style.minHeight = holdH + 'px';\n    } catch (eHold) {\n      /* ignore */\n    }\n    grid.innerHTML = '';\n    grid.className = 'product-list clearfix collection-matrix';\n    var added = 0;\n    var needHydrate = [];\n    var i;\n    for (i = 0; i < BECAUSE_PAGE && i < pool.length; i++) {\n      var pick = pool[(start + i) % pool.length];\n      if (!pick || !pick.handle || !pick.item) continue;\n      var imgUrl = becauseResolveImage(pick.handle, pick.item);\n      if (!imgUrl) needHydrate.push(pick.handle);\n      // Keep item.image warm for later pages / exclude fingerprints.\n      if (imgUrl && pick.item && !pick.item.image) pick.item.image = imgUrl;\n      var ev = {\n        h: pick.handle,\n        title: pick.item.title || pick.handle,\n        img: imgUrl,\n        price: '',\n        tags: []\n      };\n      var card = buildSearchMemoryCard(ev, becauseColumnClass(added), {\n        eager: true\n      });\n      if (!card) continue;\n      // Keep wmn-memory-search-card so cover CSS (width:100%) still applies.\n      card.className = becauseColumnClass(added) + ' wmn-memory-search-card';\n      card.removeAttribute('data-wmn-injected');\n      card.setAttribute('data-wmn-handle', pick.handle);\n      card.setAttribute('data-wmn-title', ev.title);\n      card.setAttribute('data-wmn-because-card', '1');\n      grid.appendChild(card);\n      added += 1;\n    }\n    becauseHydratePageImages(grid, needHydrate);\n    try {\n      var pageFp =\n        (root.getAttribute('data-wmn-because-seed') || '') +\n        '@' +\n        String(state.pageIndex || 0) +\n        ':' +\n        Array.prototype.slice\n          .call(grid.querySelectorAll('[data-wmn-because-card]'))\n          .map(function (el) {\n            return el.getAttribute('data-wmn-handle') || '';\n          })\n          .join('|');\n      if (root && pageFp) root.setAttribute('data-wmn-because-fp', pageFp);\n    } catch (eFp) {\n      /* ignore */\n    }\n    if (typeof window.requestAnimationFrame === 'function') {\n      window.requestAnimationFrame(function () {\n        try {\n          grid.style.minHeight = '';\n        } catch (eClr) {\n          /* ignore */\n        }\n      });\n    }\n    return added;\n  }\n\n  function becauseBindPageControls(root, grid) {\n    if (!root || root._wmnBecauseNavBound) return;\n    root._wmnBecauseNavBound = true;\n    var prev = root.querySelector('[data-wmn-because-prev]');\n    var next = root.querySelector('[data-wmn-because-next]');\n\n    function go(dir) {\n      var state = root._wmnBecauseState;\n      if (!state || !state.pool || !state.pool.length) return;\n      var step = Math.min(BECAUSE_PAGE, state.pool.length);\n      state.pageIndex =\n        ((state.pageIndex + dir * step) % state.pool.length + state.pool.length) %\n        state.pool.length;\n      becausePaintPage(root, grid);\n      becauseNudgeImages(grid);\n    }\n\n    if (prev) {\n      prev.addEventListener('click', function (e) {\n        e.preventDefault();\n        go(-1);\n      });\n    }\n    if (next) {\n      next.addEventListener('click', function (e) {\n        e.preventDefault();\n        go(1);\n      });\n    }\n  }\n\n  /** Human label for \"Dig deeper into {genre|country|region}\". */\n  function becauseLabelForTarget(target) {\n    if (!graphReady() || !target || !target.slug) return '';\n    var data = window.wmnCatalogGraph.getData() || {};\n    var kind = target.kind;\n    var slug = target.slug;\n\n    function titleCaseSlug(s) {\n      return String(s || '')\n        .replace(/-/g, ' ')\n        .replace(/\\b\\w/g, function (c) {\n          return c.toUpperCase();\n        });\n    }\n\n    if (kind === 'genre' && data.genres && data.genres[slug] && data.genres[slug].n) {\n      return data.genres[slug].n;\n    }\n    if (\n      kind === 'country' &&\n      data.countries &&\n      data.countries[slug] &&\n      data.countries[slug].n\n    ) {\n      return data.countries[slug].n;\n    }\n    if (\n      kind === 'region' &&\n      data.regions &&\n      data.regions[slug] &&\n      data.regions[slug].n\n    ) {\n      return data.regions[slug].n;\n    }\n    return titleCaseSlug(slug);\n  }\n\n  function becauseDigDeeperLabel(seedKey) {\n    return becauseLabelForTarget(becauseDigDeeperTarget(seedKey));\n  }\n\n  function hideBecauseRail(root, grid) {\n    if (grid) {\n      try {\n        grid.style.minHeight = '';\n      } catch (eMin) {\n        /* ignore */\n      }\n      grid.innerHTML = '';\n    }\n    if (root) {\n      root.setAttribute('hidden', 'hidden');\n      root.classList.add('hidden');\n      root.removeAttribute('data-wmn-because-live');\n      root.removeAttribute('data-wmn-because-seed');\n      root.removeAttribute('data-wmn-because-fp');\n      root._wmnBecauseState = null;\n    }\n  }\n\n  function renderBecauseYouLookedRail() {\n    var root =\n      document.getElementById('wmn-because-you-looked') ||\n      document.querySelector('[data-wmn-because]');\n    var grid =\n      document.getElementById('wmn-because-grid') ||\n      (root && root.querySelector('[data-wmn-because-grid]'));\n    if (!root || !grid) return;\n\n    function paint() {\n      renderBecauseYouLookedPaint(root, grid);\n    }\n\n    try {\n      if (\n        window.wmnCatalogGraph &&\n        typeof window.wmnCatalogGraph.ensureLoaded === 'function' &&\n        !graphReady()\n      ) {\n        window.wmnCatalogGraph.ensureLoaded().then(paint).catch(function () {\n          hideBecauseRail(root, grid);\n        });\n        return;\n      }\n    } catch (e) {\n      /* fall through */\n    }\n    paint();\n  }\n\n  /**\n   * Expand + rank Because candidates for a seed (no DOM). Used by paint + smoke.\n   * @returns {{ seedKey: string, picks: Array<{handle:string,item:object,score:number}>, exclude: object }|null}\n   */\n  function becausePicksForSeed(seedInput) {\n    if (!seedInput || !graphReady()) return null;\n\n    var seed = String(seedInput);\n    var seedKey = normalizeRecentlyViewedHandle(seed) || String(seed).trim();\n    var resolved = window.wmnCatalogGraph.resolveProduct(seedKey) || {};\n    if (\n      !(resolved.artists || []).length &&\n      !(resolved.genres || []).length &&\n      !(resolved.countries || []).length\n    ) {\n      var seedNorm = normalizeBecauseHandleKey(seedKey);\n      if (seedNorm) {\n        var altResolved = window.wmnCatalogGraph.resolveProduct(seedNorm) || {};\n        if (\n          (altResolved.artists || []).length ||\n          (altResolved.genres || []).length ||\n          (altResolved.countries || []).length\n        ) {\n          seedKey = seedNorm;\n          resolved = altResolved;\n        } else {\n          altResolved = window.wmnCatalogGraph.resolveProduct('the-' + seedNorm) || {};\n          if (\n            (altResolved.artists || []).length ||\n            (altResolved.genres || []).length ||\n            (altResolved.countries || []).length\n          ) {\n            seedKey = 'the-' + seedNorm;\n            resolved = altResolved;\n          }\n        }\n      }\n    }\n\n    function digTargetFromSeedOnly() {\n      var g0 = (resolved.genres && resolved.genres[0]) || '';\n      if (g0) return { kind: 'genre', slug: String(g0) };\n      var c0 = (resolved.countries && resolved.countries[0]) || '';\n      if (c0) return { kind: 'country', slug: String(c0) };\n      var r0 = (resolved.regions && resolved.regions[0]) || '';\n      if (r0) return { kind: 'region', slug: String(r0) };\n      return null;\n    }\n\n    function buildForDigTarget(digTarget) {\n      var expandIds = [];\n      var i;\n      var neighborSlugs = becauseDigNeighborSlugs(digTarget);\n      // Expand the dig target entity first so the pool matches the title.\n      if (digTarget && digTarget.slug) {\n        if (digTarget.kind === 'genre') {\n          expandIds.push('genre:' + digTarget.slug);\n        } else if (digTarget.kind === 'country') {\n          expandIds.push('country:' + digTarget.slug);\n        } else if (digTarget.kind === 'region') {\n          expandIds.push('region:' + digTarget.slug);\n        }\n      }\n      // Neighbor genres (siblings / region bridges) for soft-fill candidates.\n      for (i = 0; i < neighborSlugs.length; i++) {\n        expandIds.push('genre:' + neighborSlugs[i]);\n      }\n      if (!expandIds.length) {\n        for (i = 0; i < (resolved.artists || []).length; i++) {\n          expandIds.push('artist:' + resolved.artists[i]);\n        }\n        for (i = 0; i < (resolved.genres || []).length; i++) {\n          expandIds.push('genre:' + resolved.genres[i]);\n        }\n        for (i = 0; i < (resolved.countries || []).length; i++) {\n          expandIds.push('country:' + resolved.countries[i]);\n        }\n      }\n      if (!expandIds.length) return null;\n\n      var candidates = window.wmnCatalogGraph.expand(expandIds, 2) || [];\n      var exclude = becauseExcludeSet(seedKey);\n      if (seed && seed !== seedKey) {\n        becauseMergeExclude(exclude, becauseExcludeSet(seed));\n      }\n\n      function becauseMatchesDigTargetPure(handle) {\n        if (!digTarget || !digTarget.slug) return true;\n        if (digTarget.kind === 'genre') {\n          return becauseProductMatchesGenre(handle, digTarget.slug);\n        }\n        if (digTarget.kind === 'country') {\n          return becauseProductMatchesCountry(handle, digTarget.slug);\n        }\n        if (digTarget.kind === 'region') {\n          return becauseProductMatchesRegion(handle, digTarget.slug);\n        }\n        return true;\n      }\n\n      function becauseMatchesDigTargetSoft(handle) {\n        if (!digTarget || !digTarget.slug) return false;\n        if (!neighborSlugs.length) return false;\n        return becauseProductMatchesNeighborGenre(handle, neighborSlugs);\n      }\n\n      var pureRanked = [];\n      var softRanked = [];\n      for (i = 0; i < candidates.length; i++) {\n        var h = candidates[i];\n        if (!h) continue;\n        var item = graphItemFromHandle(h);\n        if (!item) continue;\n        if (becauseIsExcluded(h, item, exclude)) continue;\n        var row = {\n          handle: h,\n          item: item,\n          score: becauseRankScore(h, resolved)\n        };\n        if (becauseMatchesDigTargetPure(h)) {\n          pureRanked.push(row);\n        } else if (becauseMatchesDigTargetSoft(h)) {\n          // Soft fills rank below pure (same genre affinity / region bridges).\n          softRanked.push({\n            handle: row.handle,\n            item: row.item,\n            score: row.score - 2500\n          });\n        }\n      }\n      function byScoreThenHandle(a, b) {\n        if (b.score !== a.score) return b.score - a.score;\n        return String(a.handle).localeCompare(String(b.handle));\n      }\n      pureRanked.sort(byScoreThenHandle);\n      softRanked.sort(byScoreThenHandle);\n\n      var picks = [];\n      var seenPick = {};\n      function pushPick(row) {\n        if (!row || !row.handle || seenPick[row.handle]) return;\n        if (becauseIsExcluded(row.handle, row.item, exclude)) return;\n        seenPick[row.handle] = true;\n        picks.push(row);\n      }\n      for (i = 0; i < pureRanked.length && picks.length < BECAUSE_CAP; i++) {\n        pushPick(pureRanked[i]);\n      }\n      // Country/region digs may soft-fill from geo genre bridges. Genre digs\n      // stay pure-only \u2014 padding \"Salsa\" with tango/reggae lied to the title.\n      if (!digTarget || digTarget.kind !== 'genre') {\n        for (\n          i = 0;\n          i < softRanked.length && picks.length < BECAUSE_PAGE;\n          i++\n        ) {\n          pushPick(softRanked[i]);\n        }\n      }\n\n      return {\n        seedKey: seedKey,\n        picks: picks,\n        exclude: exclude,\n        resolved: resolved,\n        digTarget: digTarget\n      };\n    }\n\n    var digTarget = becauseDigDeeperTarget(seedKey);\n    var built = buildForDigTarget(digTarget);\n    // Thin country/region pools (e.g. Japan with 1\u20133 gated SKUs) leave Dig\n    // deeper looking empty. Prefer the seed product's genre when that yields\n    // a fuller rail \u2014 title follows built.digTarget so we never show Latin\n    // under a Japan heading.\n    var DIG_GEO_MIN = 4;\n    if (\n      digTarget &&\n      (digTarget.kind === 'country' || digTarget.kind === 'region')\n    ) {\n      var geoCount = built && built.picks ? built.picks.length : 0;\n      if (geoCount < DIG_GEO_MIN) {\n        var seedGenre0 =\n          (resolved.genres && resolved.genres[0]) || '';\n        if (\n          seedGenre0 &&\n          (digTarget.kind !== 'genre' || digTarget.slug !== seedGenre0)\n        ) {\n          var genreBuilt = buildForDigTarget({\n            kind: 'genre',\n            slug: String(seedGenre0)\n          });\n          var genreCount =\n            genreBuilt && genreBuilt.picks ? genreBuilt.picks.length : 0;\n          if (genreCount > geoCount) {\n            built = genreBuilt;\n          }\n        }\n      }\n    }\n    // Empty gated pool (e.g. stale geo focus with zero matching SKUs) \u2014\n    // fall back to the seed's own genre/country so Dig deeper still appears.\n    if (!built || !built.picks || !built.picks.length) {\n      var seedTarget = digTargetFromSeedOnly();\n      if (\n        seedTarget &&\n        (!digTarget ||\n          digTarget.kind !== seedTarget.kind ||\n          digTarget.slug !== seedTarget.slug)\n      ) {\n        built = buildForDigTarget(seedTarget);\n      }\n    }\n    return built;\n  }\n\n  function renderBecauseYouLookedPaint(root, grid) {\n    var seed = becauseSeedHandle();\n    if (!seed || !graphReady()) {\n      hideBecauseRail(root, grid);\n      return;\n    }\n\n    var built = becausePicksForSeed(seed);\n    if (!built || !built.picks || !built.picks.length) {\n      hideBecauseRail(root, grid);\n      return;\n    }\n\n    var seedKey = built.seedKey;\n    var picks = built.picks;\n    var exclude = built.exclude;\n\n    var digLabel = '';\n    if (built.digTarget && built.digTarget.slug) {\n      digLabel = becauseLabelForTarget(built.digTarget);\n    }\n    if (!digLabel) digLabel = becauseDigDeeperLabel(seedKey);\n    var titleText = digLabel\n      ? 'Dig deeper into ' + digLabel\n      : 'Dig deeper';\n    var titleEl =\n      root.querySelector('[data-wmn-because-title]') ||\n      root.querySelector('.wmn-section-head__title');\n    if (titleEl) {\n      titleEl.textContent = titleText;\n    }\n    grid.setAttribute('aria-label', titleText);\n\n    // Stable pool for Back/Next paging (wraps forever)\n    var pool = [];\n    var i;\n    var staffFyBlock = getStaffPicksAffinityHandle();\n    for (i = 0; i < picks.length; i++) {\n      if (becauseIsExcluded(picks[i].handle, picks[i].item, exclude)) continue;\n      if (staffFyBlock && picks[i].handle === staffFyBlock) continue;\n      pool.push(picks[i]);\n    }\n    if (!pool.length) {\n      hideBecauseRail(root, grid);\n      return;\n    }\n\n    root._wmnBecauseState = { pool: pool, pageIndex: 0 };\n    var pageFp =\n      seedKey +\n      '@0:' +\n      pool\n        .slice(0, BECAUSE_PAGE)\n        .map(function (p) {\n          return (p && p.handle) || '';\n        })\n        .join('|');\n    // Live-refresh often re-paints identical Dig deeper content \u2014 wiping the\n    // grid collapses height and fights sticky-header scroll anchoring.\n    if (\n      root.getAttribute('data-wmn-because-fp') === pageFp &&\n      grid.querySelector('[data-wmn-because-card]')\n    ) {\n      root.removeAttribute('hidden');\n      root.classList.remove('hidden');\n      // Still nudge \u2014 Safari may have painted blank covers under [hidden].\n      becausePatchCardImages(grid);\n      becauseNudgeImages(grid);\n      return;\n    }\n\n    root.setAttribute('data-wmn-because-seed', seedKey);\n    // Reveal before paint so WebKit fetches covers (hidden subtree skips loads).\n    root.removeAttribute('hidden');\n    root.classList.remove('hidden');\n    becausePaintPage(root, grid);\n\n    if (!grid.querySelector('[data-wmn-because-card]')) {\n      hideBecauseRail(root, grid);\n      return;\n    }\n\n    becauseBindPageControls(root, grid);\n    becauseNudgeImages(grid);\n\n    root.setAttribute('data-wmn-because-live', String(Date.now()));\n    root.setAttribute('data-wmn-because-fp', pageFp);\n\n    try {\n      if (\n        window.wmnIntentAnalytics &&\n        typeof window.wmnIntentAnalytics.log === 'function'\n      ) {\n        window.wmnIntentAnalytics.log({\n          type: 'because_rail_shown',\n          handle: seedKey,\n          n: pool.length\n        });\n      }\n    } catch (errShown) {\n      /* optional */\n    }\n  }\n\n  /* ------------------------------------------------------------------ */\n  /* Phase 3 \u2014 PDP related stack (More from artist + genre top-up)      */\n  /* ------------------------------------------------------------------ */\n\n  var PDP_ARTIST_CAP = 8;\n  var PDP_ARTIST_DEPTH = 0;\n\n  /**\n   * Light exclude for PDP rails: current handle + cover-fingerprint twins.\n   * Reuses becauseImageKey; does not block RV / For You (unlike Because).\n   */\n  function pdpExcludeSet(seedHandle) {\n    var handles = {};\n    var images = {};\n\n    function blockHandle(h) {\n      if (!h) return;\n      var raw =\n        normalizeRecentlyViewedHandle(h) ||\n        String(h).replace(/^\\s+|\\s+$/g, '');\n      if (!raw) return;\n      handles[raw] = true;\n      handles[String(h)] = true;\n      var n = normalizeBecauseHandleKey(raw);\n      if (n) {\n        handles[n] = true;\n        handles['the-' + n] = true;\n      }\n    }\n\n    function blockImage(url) {\n      var key = becauseImageKey(url);\n      if (key) images[key] = true;\n    }\n\n    blockHandle(seedHandle);\n\n    try {\n      if (graphReady() && seedHandle) {\n        var data = window.wmnCatalogGraph.getData();\n        var seedNorm = normalizeBecauseHandleKey(seedHandle);\n        var rawP =\n          (data && data.products && data.products[seedHandle]) ||\n          (data && data.products && seedNorm && data.products[seedNorm]) ||\n          (data &&\n            data.products &&\n            seedNorm &&\n            data.products['the-' + seedNorm]);\n        if (rawP && rawP.img) {\n          blockImage(rawP.img);\n          var seedImgKey = becauseImageKey(rawP.img);\n          if (seedImgKey && data.products) {\n            var ph;\n            for (ph in data.products) {\n              if (!Object.prototype.hasOwnProperty.call(data.products, ph)) {\n                continue;\n              }\n              var twin = data.products[ph];\n              if (!twin || !twin.img) continue;\n              if (becauseImageKey(twin.img) !== seedImgKey) continue;\n              blockHandle(ph);\n              blockImage(twin.img);\n            }\n          }\n        }\n        var seedItem = graphItemFromHandle(seedHandle);\n        if (seedItem && seedItem.image) blockImage(seedItem.image);\n      }\n    } catch (eEx) {\n      /* ignore */\n    }\n\n    return { handles: handles, images: images };\n  }\n\n  function pdpIsExcluded(handle, item, excl) {\n    if (!handle || !excl) return true;\n    if (excl.handles[handle]) return true;\n    var n = normalizeBecauseHandleKey(handle);\n    if (n && (excl.handles[n] || excl.handles['the-' + n])) return true;\n    var image = item && item.image ? item.image : '';\n    if (!image && graphReady()) {\n      try {\n        var data = window.wmnCatalogGraph.getData();\n        var raw =\n          data && data.products && (data.products[handle] || data.products[n]);\n        if (raw && raw.img) image = raw.img;\n      } catch (eImg) {\n        /* ignore */\n      }\n    }\n    var ik = becauseImageKey(image);\n    if (ik && excl.images && excl.images[ik]) return true;\n    return false;\n  }\n\n  function pdpArtistColumnClass(index) {\n    return (\n      'gallery-cell thumbnail visible-4 wmn-more-from-artist-card' +\n      (index % 2 === 0 ? ' even' : ' odd')\n    );\n  }\n\n  function pdpGenreColumnClass(index) {\n    var cycle = index % 4;\n    var pos = cycle === 0 ? 'alpha' : cycle === 3 ? 'omega' : '';\n    return (\n      'thumbnail four columns wmn-related-genre-card' +\n      (pos ? ' ' + pos : '') +\n      (index % 2 === 0 ? ' even' : ' odd')\n    );\n  }\n\n  function hideMoreFromArtistRail(root, grid) {\n    if (grid) {\n      try {\n        if (\n          window.jQuery &&\n          jQuery.fn.flickity &&\n          jQuery(grid).hasClass('flickity-enabled')\n        ) {\n          jQuery(grid).flickity('destroy');\n        }\n      } catch (eFl) {\n        /* ignore */\n      }\n      grid.innerHTML = '';\n    }\n    if (root) {\n      root.setAttribute('hidden', 'hidden');\n      root.classList.add('hidden');\n      root.removeAttribute('data-wmn-artist-live');\n      root.removeAttribute('data-wmn-artist-fp');\n    }\n  }\n\n  function settleMoreFromArtistSlider($slider, grid) {\n    if (!$slider || !$slider.length) return;\n    function settle() {\n      try {\n        if (!$slider.hasClass('flickity-enabled')) return;\n        $slider.flickity('reloadCells');\n        $slider.flickity('resize');\n      } catch (eSettle) {\n        /* ignore */\n      }\n    }\n    // Layout after paint + after images (lazy/async CDN) settle.\n    if (typeof window.requestAnimationFrame === 'function') {\n      window.requestAnimationFrame(function () {\n        settle();\n        window.requestAnimationFrame(settle);\n      });\n    } else {\n      settle();\n    }\n    var imgs = grid ? grid.querySelectorAll('img') : [];\n    var i;\n    for (i = 0; i < imgs.length; i++) {\n      if (imgs[i].complete) continue;\n      imgs[i].addEventListener('load', settle, { once: true });\n      imgs[i].addEventListener('error', settle, { once: true });\n    }\n    window.setTimeout(settle, 300);\n    window.setTimeout(settle, 1000);\n  }\n\n  function initMoreFromArtistSlider(grid, count) {\n    if (!grid || !count) return;\n    // Match theme products-slider: length class = cell count for CSS centering.\n    grid.setAttribute('data-products-available', String(count));\n    grid.setAttribute('data-products-limit', String(Math.max(count, 1)));\n    grid.className = grid.className\n      .replace(/\\bproducts-length-\\d+\\b/g, '')\n      .replace(/\\s+/g, ' ')\n      .trim();\n    grid.classList.add('products-length-' + count);\n\n    if (!window.jQuery || !jQuery.fn.flickity) return;\n    var $slider = jQuery(grid);\n    try {\n      if ($slider.hasClass('flickity-enabled')) {\n        $slider.flickity('destroy');\n      }\n    } catch (eDes) {\n      /* ignore */\n    }\n\n    var perSlide = parseInt($slider.attr('data-products-per-slide'), 10) || 4;\n    var available = count;\n    var limit = parseInt($slider.attr('data-products-limit'), 10) || available;\n    // Mirror app.js relatedProducts / featuredCollection options.\n    var cellAlign =\n      available > perSlide && limit > perSlide ? 'left' : 'center';\n    var draggable = available > perSlide && limit > perSlide;\n    var prevNext = draggable;\n    var wrapAround = draggable;\n    var initialIndex = 0;\n\n    if (jQuery(window).width() <= 798) {\n      cellAlign = 'center';\n      draggable = true;\n      prevNext = true;\n      wrapAround = available > 1;\n      initialIndex = available > 1 ? 1 : 0;\n    }\n\n    var arrowShape =\n      typeof window.arrowSize !== 'undefined'\n        ? window.arrowSize\n        : { x0: 10, x1: 60, y1: 50, x2: 70, y2: 40, x3: 30 };\n\n    try {\n      $slider.flickity({\n        lazyLoad: 2,\n        imagesLoaded: true,\n        draggable: draggable,\n        cellAlign: cellAlign,\n        prevNextButtons: prevNext,\n        pageDots: false,\n        wrapAround: wrapAround,\n        contain: true,\n        freeScroll: true,\n        arrowShape: arrowShape,\n        initialIndex: initialIndex\n      });\n      $slider.addClass('slider-initialized');\n      settleMoreFromArtistSlider($slider, grid);\n    } catch (eInit) {\n      /* ignore */\n    }\n  }\n\n  function moreFromArtistPicks(artistSlug, excludeHandle, limit) {\n    if (!artistSlug || !graphReady()) return [];\n    var cap = limit || PDP_ARTIST_CAP;\n    var candidates =\n      window.wmnCatalogGraph.expand(\n        ['artist:' + artistSlug],\n        PDP_ARTIST_DEPTH\n      ) || [];\n    var exclude = pdpExcludeSet(excludeHandle);\n    var picks = [];\n    var i;\n    for (i = 0; i < candidates.length && picks.length < cap; i++) {\n      var h = candidates[i];\n      if (!h) continue;\n      var item = graphItemFromHandle(h);\n      if (!item) continue;\n      if (pdpIsExcluded(h, item, exclude)) continue;\n      // Strict: only this artist (title says More from {Artist}).\n      var resolved = window.wmnCatalogGraph.resolveProduct(h) || {};\n      var artists = resolved.artists || [];\n      if (artists.indexOf(artistSlug) === -1) continue;\n      picks.push({ handle: h, item: item });\n    }\n    return picks;\n  }\n\n  function renderMoreFromArtistRail() {\n    var root = document.querySelector('[data-wmn-more-from-artist]');\n    var grid =\n      document.getElementById('wmn-more-from-artist-grid') ||\n      (root && root.querySelector('[data-wmn-more-from-artist-grid]'));\n    if (!root || !grid) return;\n\n    function paint() {\n      renderMoreFromArtistPaint(root, grid);\n    }\n\n    try {\n      if (\n        window.wmnCatalogGraph &&\n        typeof window.wmnCatalogGraph.ensureLoaded === 'function' &&\n        !graphReady()\n      ) {\n        window.wmnCatalogGraph\n          .ensureLoaded()\n          .then(paint)\n          .catch(function () {\n            hideMoreFromArtistRail(root, grid);\n          });\n        return;\n      }\n    } catch (e) {\n      /* fall through */\n    }\n    paint();\n  }\n\n  function renderMoreFromArtistPaint(root, grid) {\n    var artistSlug = root.getAttribute('data-wmn-artist-slug') || '';\n    var excludeHandle = root.getAttribute('data-wmn-exclude-handle') || '';\n    var limit =\n      parseInt(root.getAttribute('data-wmn-limit'), 10) || PDP_ARTIST_CAP;\n\n    if (!artistSlug || !graphReady()) {\n      hideMoreFromArtistRail(root, grid);\n      return;\n    }\n\n    // Confirm artist exists in graph (avoid empty expand of unknown slug).\n    try {\n      var data = window.wmnCatalogGraph.getData();\n      if (!data || !data.artists || !data.artists[artistSlug]) {\n        hideMoreFromArtistRail(root, grid);\n        return;\n      }\n    } catch (eArt) {\n      hideMoreFromArtistRail(root, grid);\n      return;\n    }\n\n    var picks = moreFromArtistPicks(artistSlug, excludeHandle, limit);\n    if (!picks.length) {\n      hideMoreFromArtistRail(root, grid);\n      return;\n    }\n\n    // Avoid destroy/rebuild mid-scroll on affinity/live-refresh repaints.\n    var fingerprint = picks\n      .map(function (p) {\n        return p.handle;\n      })\n      .join(',');\n    if (\n      root.getAttribute('data-wmn-artist-fp') === fingerprint &&\n      grid.querySelector('[data-wmn-more-from-artist-card]') &&\n      window.jQuery &&\n      jQuery(grid).hasClass('flickity-enabled')\n    ) {\n      return;\n    }\n\n    try {\n      if (\n        window.jQuery &&\n        jQuery.fn.flickity &&\n        jQuery(grid).hasClass('flickity-enabled')\n      ) {\n        jQuery(grid).flickity('destroy');\n      }\n    } catch (eDes2) {\n      /* ignore */\n    }\n\n    grid.innerHTML = '';\n    var i;\n    for (i = 0; i < picks.length; i++) {\n      var pick = picks[i];\n      var ev = {\n        h: pick.handle,\n        title: pick.item.title || pick.handle,\n        img: pick.item.image || '',\n        price: '',\n        tags: []\n      };\n      var card = buildSearchMemoryCard(ev, pdpArtistColumnClass(i));\n      if (!card) continue;\n      card.className = pdpArtistColumnClass(i);\n      card.removeAttribute('data-wmn-injected');\n      card.setAttribute('data-wmn-handle', pick.handle);\n      card.setAttribute('data-wmn-title', ev.title);\n      card.setAttribute('data-wmn-more-from-artist-card', '1');\n      // Eager images so Flickity imagesLoaded + cell size settle before drag.\n      var imgEl = card.querySelector('img');\n      if (imgEl) {\n        imgEl.loading = 'eager';\n        imgEl.removeAttribute('loading');\n        imgEl.setAttribute('loading', 'eager');\n        imgEl.setAttribute('decoding', 'async');\n      }\n      grid.appendChild(card);\n    }\n\n    if (!grid.querySelector('[data-wmn-more-from-artist-card]')) {\n      hideMoreFromArtistRail(root, grid);\n      return;\n    }\n\n    root.removeAttribute('hidden');\n    root.classList.remove('hidden');\n    root.setAttribute('data-wmn-artist-live', String(Date.now()));\n    root.setAttribute('data-wmn-artist-fp', fingerprint);\n    initMoreFromArtistSlider(grid, picks.length);\n  }\n\n  function enrichRelatedByGenreRail() {\n    var root = document.querySelector('[data-wmn-related-by-genre]');\n    var grid =\n      root && root.querySelector('[data-wmn-related-by-genre-grid]');\n    if (!root || !grid) return;\n\n    function paint() {\n      enrichRelatedByGenrePaint(root, grid);\n    }\n\n    try {\n      if (\n        window.wmnCatalogGraph &&\n        typeof window.wmnCatalogGraph.ensureLoaded === 'function' &&\n        !graphReady()\n      ) {\n        window.wmnCatalogGraph.ensureLoaded().then(paint).catch(function () {});\n        return;\n      }\n    } catch (e) {\n      /* fall through */\n    }\n    paint();\n  }\n\n  function enrichRelatedByGenrePaint(root, grid) {\n    if (!graphReady()) return;\n\n    var genreSlug = root.getAttribute('data-wmn-genre-slug') || '';\n    var excludeHandle = root.getAttribute('data-wmn-exclude-handle') || '';\n    var limit = parseInt(root.getAttribute('data-wmn-limit'), 10) || 4;\n    var matchedCount =\n      parseInt(root.getAttribute('data-wmn-matched-count'), 10) || 0;\n    if (!genreSlug || matchedCount >= limit) return;\n\n    var need = limit - matchedCount;\n    if (need <= 0) return;\n\n    var existing = {};\n    var existingNodes = grid.querySelectorAll('[data-wmn-handle]');\n    var ei;\n    for (ei = 0; ei < existingNodes.length; ei++) {\n      var eh = existingNodes[ei].getAttribute('data-wmn-handle');\n      if (eh) existing[eh] = true;\n    }\n    // Liquid thumbnails may lack data-wmn-handle \u2014 also parse matched-handles attr.\n    var matchedAttr = root.getAttribute('data-wmn-matched-handles') || '';\n    var parts = matchedAttr.split('|');\n    for (ei = 0; ei < parts.length; ei++) {\n      if (parts[ei]) existing[parts[ei]] = true;\n    }\n    // Fallback: scrape product links already in the grid.\n    var links = grid.querySelectorAll('a[href*=\"/products/\"]');\n    for (ei = 0; ei < links.length; ei++) {\n      var href = links[ei].getAttribute('href') || '';\n      var m = href.match(/\\/products\\/([^/?#]+)/);\n      if (m && m[1]) {\n        try {\n          existing[decodeURIComponent(m[1])] = true;\n        } catch (eDec) {\n          existing[m[1]] = true;\n        }\n      }\n    }\n\n    var expandIds = ['genre:' + genreSlug];\n    try {\n      if (typeof window.wmnCatalogGraph.relatedGenres === 'function') {\n        var related = window.wmnCatalogGraph.relatedGenres(genreSlug) || [];\n        var ri;\n        for (ri = 0; ri < related.length; ri++) {\n          if (related[ri] && related[ri].slug) {\n            expandIds.push('genre:' + related[ri].slug);\n          }\n        }\n      }\n    } catch (eRel) {\n      /* ignore */\n    }\n\n    var candidates = window.wmnCatalogGraph.expand(expandIds, 1) || [];\n    var exclude = pdpExcludeSet(excludeHandle);\n    var primary = [];\n    var secondary = [];\n    var i;\n    for (i = 0; i < candidates.length; i++) {\n      var h = candidates[i];\n      if (!h || existing[h]) continue;\n      var item = graphItemFromHandle(h);\n      if (!item) continue;\n      if (pdpIsExcluded(h, item, exclude)) continue;\n      var resolved = window.wmnCatalogGraph.resolveProduct(h) || {};\n      var genres = resolved.genres || [];\n      var row = { handle: h, item: item };\n      if (genres.indexOf(genreSlug) !== -1) {\n        primary.push(row);\n      } else {\n        secondary.push(row);\n      }\n    }\n\n    var picks = [];\n    for (i = 0; i < primary.length && picks.length < need; i++) {\n      picks.push(primary[i]);\n    }\n    for (i = 0; i < secondary.length && picks.length < need; i++) {\n      picks.push(secondary[i]);\n    }\n    if (!picks.length) return;\n\n    var startIndex = matchedCount;\n    for (i = 0; i < picks.length; i++) {\n      var pick = picks[i];\n      if (existing[pick.handle]) continue;\n      existing[pick.handle] = true;\n      var ev = {\n        h: pick.handle,\n        title: pick.item.title || pick.handle,\n        img: pick.item.image || '',\n        price: '',\n        tags: []\n      };\n      var card = buildSearchMemoryCard(\n        ev,\n        pdpGenreColumnClass(startIndex + i)\n      );\n      if (!card) continue;\n      card.className = pdpGenreColumnClass(startIndex + i);\n      card.removeAttribute('data-wmn-injected');\n      card.setAttribute('data-wmn-handle', pick.handle);\n      card.setAttribute('data-wmn-title', ev.title);\n      card.setAttribute('data-wmn-genre-topup', '1');\n      grid.appendChild(card);\n    }\n\n    root.setAttribute(\n      'data-wmn-matched-count',\n      String(\n        grid.querySelectorAll(\n          '[data-wmn-handle], a[href*=\"/products/\"]'\n        ).length\n      )\n    );\n    root.setAttribute('data-wmn-genre-enriched', String(Date.now()));\n  }\n\n  function renderPdpRelatedRails() {\n    renderMoreFromArtistRail();\n    enrichRelatedByGenreRail();\n  }\n\n  function renderForYouRail() {\n    var root = document.getElementById('wmn-for-you');\n    var grid = document.getElementById('wmn-for-you-grid');\n    if (!root || !grid) return;\n\n    // Phase 2: endless feed owns homepage \u2014 never wipe mid-session.\n    if (forYouFeedOwns(root)) {\n      try {\n        if (window.wmnForYouFeed && typeof window.wmnForYouFeed.ensure === 'function') {\n          window.wmnForYouFeed.ensure();\n        }\n      } catch (eFeed) {\n        /* ignore */\n      }\n      return;\n    }\n\n    function paint() {\n      renderForYouRailPaint(root, grid);\n    }\n\n    try {\n      if (\n        window.wmnCatalogGraph &&\n        typeof window.wmnCatalogGraph.ensureLoaded === 'function' &&\n        !graphReady()\n      ) {\n        window.wmnCatalogGraph.ensureLoaded().then(paint).catch(paint);\n        return;\n      }\n    } catch (e) {\n      /* fall through */\n    }\n    paint();\n  }\n\n  function renderForYouRailPaint(root, grid) {\n    var built = buildForYouPicks(18);\n    if (built && built.picks && built.picks.length >= 3) {\n      var picks = built.picks;\n      var limitG =\n        picks.length >= 9 ? 9 : picks.length >= 6 ? 6 : picks.length >= 3 ? 3 : picks.length;\n      var classNameG = 'wmn-for-you-card thumbnail';\n      grid.innerHTML = '';\n      grid.className = 'product-list clearfix wmn-for-you-grid';\n      picks.slice(0, limitG).forEach(function (item) {\n        var ev = {\n          h: item.handle,\n          title: item.title || item.handle,\n          img: item.image || '',\n          price: '',\n          tags: []\n        };\n        var card = buildSearchMemoryCard(ev, classNameG);\n        if (!card) return;\n        card.className = classNameG;\n        card.removeAttribute('data-wmn-injected');\n        card.setAttribute('data-wmn-handle', item.handle);\n        card.setAttribute('data-wmn-title', ev.title);\n        grid.appendChild(card);\n      });\n      var subtitleG = root.querySelector('.wmn-for-you__subtitle');\n      if (subtitleG && built.labels && built.labels.length) {\n        subtitleG.textContent =\n          'Based on your interest in ' + built.labels.join(' & ');\n      }\n      root.removeAttribute('hidden');\n      root.setAttribute('data-wmn-for-you-live', String(Date.now()));\n      return;\n    }\n\n    var affinity = getAffinityCompat();\n    var tops = topGenres(affinity, 2);\n\n    if (!tops.length || tops[0].w < 4) {\n      // Soft show: if we have events but weak genre weight, keep prior grid if any\n      if (!grid.children.length) root.setAttribute('hidden', 'hidden');\n      return;\n    }\n\n    var existingFallback = {};\n    store.events.forEach(function (ev) {\n      if (ev && ev.h) existingFallback[ev.h] = true;\n    });\n\n    var term = tops[0].g;\n    var url =\n      (window.Shopify && window.Shopify.routes && window.Shopify.routes.root\n        ? window.Shopify.routes.root\n        : '/') +\n      'search?type=product&q=' +\n      encodeURIComponent(term) +\n      '*&view=json';\n\n    fetch(url)\n      .then(function (r) {\n        if (!r.ok) throw new Error('for-you fetch');\n        return r.json();\n      })\n      .then(function (data) {\n        var results = (data && data.results) || [];\n        var picks = [];\n        var seen = {};\n        for (var i = 0; i < results.length && picks.length < 18; i++) {\n          var item = results[i];\n          if (!item || item.object_type !== 'product') continue;\n          var handle = productHandleFromHref(item.url) || '';\n          if (!handle || seen[handle]) continue;\n          seen[handle] = true;\n          var title = String(item.title || '').toLowerCase();\n          if (title.indexOf('gift voucher') !== -1 || title.indexOf('gift card') !== -1) {\n            continue;\n          }\n          picks.push(item);\n        }\n        if (!picks.length) {\n          root.setAttribute('hidden', 'hidden');\n          return;\n        }\n\n        picks.sort(function (a, b) {\n          var ha = productHandleFromHref(a.url);\n          var hb = productHandleFromHref(b.url);\n          var sa =\n            scoreByHandleTitleGenres(ha, a.title || '', [], affinity) + scoreHandle(ha);\n          var sb =\n            scoreByHandleTitleGenres(hb, b.title || '', [], affinity) + scoreHandle(hb);\n          return sb - sa;\n        });\n\n        var limit = picks.length >= 9 ? 9 : picks.length >= 6 ? 6 : picks.length >= 3 ? 3 : picks.length;\n        var className = 'wmn-for-you-card thumbnail';\n\n        grid.innerHTML = '';\n        grid.className = 'product-list clearfix wmn-for-you-grid';\n        picks.slice(0, limit).forEach(function (item) {\n          var handle = productHandleFromHref(item.url);\n          var thumb =\n            (item.image && item.image !== 'NULL' ? item.image : '') ||\n            (item.thumbnail && item.thumbnail !== 'NULL' ? item.thumbnail : '');\n          var ev = {\n            h: handle,\n            title: item.title || handle,\n            img: withShopifyImageWidth(thumb, 1200),\n            price: item.price || '',\n            tags: item.tags || []\n          };\n          var card = buildSearchMemoryCard(ev, className);\n          if (!card) return;\n          card.className = className;\n          card.removeAttribute('data-wmn-injected');\n          card.setAttribute('data-wmn-handle', handle);\n          card.setAttribute('data-wmn-title', ev.title);\n          grid.appendChild(card);\n        });\n\n        var subtitle = root.querySelector('.wmn-for-you__subtitle');\n        if (subtitle) {\n          subtitle.textContent =\n            'Based on your interest in ' +\n            tops\n              .map(function (t) {\n                return t.g.replace(/\\b\\w/g, function (c) {\n                  return c.toUpperCase();\n                });\n              })\n              .join(' & ');\n        }\n        root.removeAttribute('hidden');\n        root.setAttribute('data-wmn-for-you-live', String(Date.now()));\n      })\n      .catch(function () {\n        root.setAttribute('hidden', 'hidden');\n      });\n  }\n\n  function migrateAnonymousToCustomer() {\n    var key = storageKey();\n    if (key === BASE_KEY) return;\n    try {\n      var anon = parseStore(window.localStorage.getItem(BASE_KEY));\n      if (\n        (anon.events && anon.events.length) ||\n        (anon.entities && Object.keys(anon.entities).length)\n      ) {\n        writeStore(mergeStores(readStore(), anon));\n      }\n    } catch (e) {\n      /* ignore */\n    }\n    // Bring anon durable focus/uEmb under the customer-scoped interest key.\n    try {\n      var custInterestKey = interestProfileKey();\n      if (custInterestKey === INTEREST_KEY) return;\n      var anonRaw = window.localStorage.getItem(INTEREST_KEY);\n      if (!anonRaw) return;\n      var anonProf = JSON.parse(anonRaw);\n      if (!anonProf || typeof anonProf !== 'object') return;\n      var custRaw = window.localStorage.getItem(custInterestKey);\n      var custProf = null;\n      if (custRaw) {\n        try {\n          custProf = JSON.parse(custRaw);\n        } catch (eParse) {\n          custProf = null;\n        }\n      }\n      var anonT = (anonProf && anonProf.t) || 0;\n      var custT = (custProf && custProf.t) || 0;\n      if (!custProf || anonT >= custT) {\n        var mergedInterest = {\n          v: 1,\n          t: Math.max(anonT, custT, now()),\n          focus:\n            (anonProf && anonProf.focus) ||\n            (custProf && custProf.focus) ||\n            null,\n          uEmb:\n            (anonProf && anonProf.uEmb) ||\n            (custProf && custProf.uEmb) ||\n            null\n        };\n        // Prefer newer focus object by its own t when both exist.\n        if (\n          anonProf &&\n          anonProf.focus &&\n          custProf &&\n          custProf.focus &&\n          (custProf.focus.t || 0) > (anonProf.focus.t || 0)\n        ) {\n          mergedInterest.focus = custProf.focus;\n        }\n        if (\n          anonProf &&\n          anonProf.uEmb &&\n          custProf &&\n          custProf.uEmb &&\n          (custProf.uEmb.t || 0) > (anonProf.uEmb.t || 0)\n        ) {\n          mergedInterest.uEmb = custProf.uEmb;\n        }\n        window.localStorage.setItem(\n          custInterestKey,\n          JSON.stringify(mergedInterest)\n        );\n      }\n    } catch (e2) {\n      /* ignore */\n    }\n  }\n\n  function eventToDiscoverItem(ev) {\n    if (!ev || !ev.h) return null;\n    var title = ev.title || ev.h;\n    var titleL = String(title).toLowerCase();\n    if (titleL.indexOf('gift voucher') !== -1 || titleL.indexOf('gift card') !== -1) {\n      return null;\n    }\n    var root =\n      window.Shopify && window.Shopify.routes && window.Shopify.routes.root\n        ? window.Shopify.routes.root\n        : '/';\n    var img = withShopifyImageWidth(ev.img || '', 400) || null;\n    return {\n      handle: ev.h,\n      title: title,\n      artist: '',\n      url: root + 'products/' + ev.h,\n      image: img || null,\n      genres: Array.isArray(ev.g) ? ev.g : []\n    };\n  }\n\n  /**\n   * Intent-conditioned For you grid:\n   * Continue (recent) \u2192 Related artists \u2192 Genre lane \u2192 Exploit prefs \u2192 Explore bestsellers\n   * with MMR artist diversity. Session focus boosts the active lane.\n   */\n  function rankByAffinity(items) {\n    var limit = DISCOVER_LIMIT;\n    var seed = items || [];\n    ensureGraphWarm();\n\n    // Align with homepage Picked for you when country/region prefs exist:\n    // same expand + pin composition (not intent-field bestseller reorder).\n    if (hasGeoForYouPrefs()) {\n      try {\n        var geoBuilt = buildForYouPicks(limit);\n        if (geoBuilt && geoBuilt.picks && geoBuilt.picks.length >= 3) {\n          return geoBuilt.picks.slice(0, limit);\n        }\n      } catch (geoErr) {\n        /* fall through */\n      }\n    }\n\n    // Intent field ranks whenever it has energy (explore-after-type OR lean/committed).\n    // Skip when geographic prefs should own empty-query For you (handled above).\n    if (\n      !hasGeoForYouPrefs() &&\n      fieldHasRankableEnergy() &&\n      window.wmnIntentField &&\n      typeof window.wmnIntentField.rankForYou === 'function'\n    ) {\n      try {\n        var fieldState =\n          typeof window.wmnIntentField.getField === 'function'\n            ? window.wmnIntentField.getField()\n            : null;\n        var hasFieldNodes =\n          fieldState &&\n          fieldState.nodes &&\n          Object.keys(fieldState.nodes).length > 0;\n        if (hasFieldNodes) {\n          var fieldRanked = window.wmnIntentField.rankForYou(seed, {\n            limit: limit\n          });\n          if (fieldRanked && fieldRanked.length >= Math.min(8, limit)) {\n            return fieldRanked;\n          }\n        }\n      } catch (fieldErr) {\n        /* fall through to legacy explore path only */\n      }\n    }\n\n    // Entity expand (artist/genre/product) \u2014 same builder as homepage when possible\n    try {\n      var built2 = buildForYouPicks(limit);\n      if (built2 && built2.picks && built2.picks.length >= Math.min(8, limit)) {\n        return built2.picks.slice(0, limit);\n      }\n    } catch (e2) {\n      /* ignore */\n    }\n\n    var store = readStore();\n    var seen = {};\n    var merged = [];\n    var byHandle = {};\n\n    function pushItem(item) {\n      if (!item || !item.handle || seen[item.handle]) return;\n      var t = String(item.title || '').toLowerCase();\n      if (t.indexOf('gift voucher') !== -1 || t.indexOf('gift card') !== -1) return;\n      seen[item.handle] = true;\n      merged.push(item);\n      byHandle[item.handle] = item;\n    }\n\n    if (store.events && store.events.length) {\n      for (var i = store.events.length - 1; i >= 0; i--) {\n        var ev = store.events[i];\n        if (!ev || !ev.h) continue;\n        var mapped = eventToDiscoverItem(ev);\n        if (mapped) pushItem(mapped);\n      }\n    }\n\n    for (var s = 0; s < seed.length; s++) {\n      var seedItem = seed[s];\n      if (!seedItem || !seedItem.handle) continue;\n      if (seen[seedItem.handle]) {\n        var cur = byHandle[seedItem.handle];\n        if (cur) {\n          cur.title = cur.title || seedItem.title;\n          cur.artist = seedItem.artist || cur.artist || '';\n          cur.url = seedItem.url || cur.url;\n          cur.image = cur.image || seedItem.image || null;\n          cur.genres =\n            cur.genres && cur.genres.length ? cur.genres : seedItem.genres || [];\n          cur.fromSeed = true;\n        }\n        continue;\n      }\n      seedItem.fromSeed = true;\n      pushItem(seedItem);\n    }\n\n    var focus = readFocus();\n    var expandIds = [];\n    var focusArtists = (focus && focus.artists) || [];\n    var focusGenres = (focus && focus.genres) || [];\n    var ti;\n    for (ti = 0; ti < focusArtists.length; ti++) {\n      expandIds.push('artist:' + focusArtists[ti]);\n    }\n    for (ti = 0; ti < focusGenres.length; ti++) {\n      expandIds.push('genre:' + focusGenres[ti]);\n    }\n    var topEnts = topEntityIds(store.entities || {}, 10);\n    for (ti = 0; ti < topEnts.length; ti++) {\n      if (expandIds.indexOf(topEnts[ti]) === -1) expandIds.push(topEnts[ti]);\n    }\n\n    if (graphReady() && expandIds.length) {\n      var expanded = window.wmnCatalogGraph.expand(expandIds, 2) || [];\n      for (var ex = 0; ex < expanded.length; ex++) {\n        if (seen[expanded[ex]]) continue;\n        var gItem = graphItemFromHandle(expanded[ex]);\n        if (gItem) {\n          gItem.fromGraph = true;\n          pushItem(gItem);\n        }\n      }\n    }\n\n    var hasSignal =\n      (store.events && store.events.length) ||\n      Object.keys(store.entities || {}).length > 0 ||\n      (focus && (focus.artists.length || focus.genres.length || focus.handles.length));\n    if (!hasSignal) {\n      return merged.slice(0, limit);\n    }\n\n    var affinity = getAffinityCompat();\n    function baseScore(item) {\n      if (!item || !item.handle) return 0;\n      return (\n        scoreHandle(item.handle) +\n        scoreByHandleTitleGenres(\n          item.handle,\n          item.title || '',\n          item.genres || [],\n          affinity\n        )\n      );\n    }\n\n    // --- Row composition ---\n    var out = [];\n    var outSeen = {};\n\n    function take(list) {\n      for (var x = 0; x < list.length && out.length < limit; x++) {\n        if (!list[x] || !list[x].handle || outSeen[list[x].handle]) continue;\n        outSeen[list[x].handle] = true;\n        out.push(list[x]);\n      }\n    }\n\n    // 1) Continue \u2014 newest unique views / search clicks (max SLOT_CONTINUE)\n    var continueItems = [];\n    var pinSeen = {};\n    if (store.events && store.events.length) {\n      for (\n        var pi = store.events.length - 1;\n        pi >= 0 && continueItems.length < SLOT_CONTINUE;\n        pi--\n      ) {\n        var pev = store.events[pi];\n        if (!pev || !pev.h || pinSeen[pev.h]) continue;\n        pinSeen[pev.h] = true;\n        var pinned = byHandle[pev.h] || eventToDiscoverItem(pev);\n        if (pinned) continueItems.push(pinned);\n      }\n    }\n    take(continueItems);\n\n    // 2) Related \u2014 same / related artists (prefer focus artists)\n    var relatedPool = [];\n    for (var ri = 0; ri < merged.length; ri++) {\n      var rit = merged[ri];\n      if (!rit || outSeen[rit.handle]) continue;\n      var rak = itemArtistKey(rit);\n      if (!rak) continue;\n      var isFocusArtist =\n        focusArtists.indexOf(rak) !== -1 ||\n        (focusArtists.length &&\n          graphReady() &&\n          (function () {\n            var node = window.wmnCatalogGraph.getData().artists[focusArtists[0]];\n            return node && node.r && node.r.indexOf(rak) !== -1;\n          })());\n      var isPrefArtist = !!(store.entities && store.entities['artist:' + rak]);\n      if (isFocusArtist || isPrefArtist || rit.fromGraph) {\n        relatedPool.push(rit);\n      }\n    }\n    take(mmrSelect(relatedPool, SLOT_RELATED, out, baseScore, 1));\n\n    // 3) Genre lane \u2014 products matching focus / top genres\n    var genreTargets = focusGenres.slice();\n    if (!genreTargets.length) {\n      var topG = topEntityIds(store.entities || {}, 3, ['genre']);\n      for (ti = 0; ti < topG.length; ti++) {\n        genreTargets.push(String(topG[ti]).replace(/^genre:/, ''));\n      }\n    }\n    var genrePool = [];\n    for (var gi = 0; gi < merged.length; gi++) {\n      var git = merged[gi];\n      if (!git || outSeen[git.handle]) continue;\n      var gks = itemGenreKeys(git);\n      var hit = false;\n      for (var gk = 0; gk < gks.length; gk++) {\n        if (genreTargets.indexOf(gks[gk]) !== -1) {\n          hit = true;\n          break;\n        }\n      }\n      if (hit) genrePool.push(git);\n    }\n    take(mmrSelect(genrePool, SLOT_GENRE, out, baseScore, 1));\n\n    // 4) Exploit \u2014 remaining high entity-score items (any source) with MMR\n    var exploitPool = [];\n    for (var ei = 0; ei < merged.length; ei++) {\n      if (merged[ei] && !outSeen[merged[ei].handle] && baseScore(merged[ei]) >= 8) {\n        exploitPool.push(merged[ei]);\n      }\n    }\n    take(mmrSelect(exploitPool, SLOT_EXPLOIT, out, baseScore, 8));\n\n    // 5) Explore \u2014 Best Sellers / seed not already shown (serendipity ~25%)\n    var explorePool = [];\n    for (var xi = 0; xi < merged.length; xi++) {\n      var xit = merged[xi];\n      if (!xit || outSeen[xit.handle]) continue;\n      if (xit.fromSeed || (!xit.fromGraph && baseScore(xit) < 50)) {\n        explorePool.push(xit);\n      }\n    }\n    // Prefer lower personalization for explore (novelty)\n    take(\n      mmrSelect(\n        explorePool,\n        SLOT_EXPLORE,\n        out,\n        function (it) {\n          return 40 - Math.min(35, baseScore(it) * 0.05) + (it.fromSeed ? 5 : 0);\n        },\n        0\n      )\n    );\n\n    // Fill any remaining slots with next-best MMR from leftovers\n    if (out.length < limit) {\n      var rest = [];\n      for (var yi = 0; yi < merged.length; yi++) {\n        if (merged[yi] && !outSeen[merged[yi].handle]) rest.push(merged[yi]);\n      }\n      take(mmrSelect(rest, limit - out.length, out, baseScore, 0));\n    }\n\n    return out.slice(0, limit);\n  }\n\n  function collectionMatrixCards(container) {\n    var nodes = container.children;\n    var out = [];\n    var i;\n    for (i = 0; i < nodes.length; i++) {\n      var n = nodes[i];\n      if (!n.classList || !n.classList.contains('thumbnail')) continue;\n      if (!n.getAttribute || !n.getAttribute('data-wmn-handle')) continue;\n      out.push(n);\n    }\n    return out;\n  }\n\n  function collectionCardFromEvent(node) {\n    if (!node || !node.closest) return null;\n    var card = node.closest('.thumbnail[data-wmn-handle]');\n    if (!card || !card.closest) return null;\n    if (!card.closest('.collection-template-section, .collection-template')) return null;\n    return card;\n  }\n\n  function collectionCardGenres(card) {\n    var raw = (card && card.getAttribute('data-wmn-genres')) || '';\n    if (!raw) return [];\n    return raw\n      .split('|')\n      .map(function (s) {\n        return s.trim();\n      })\n      .filter(Boolean);\n  }\n\n  function collectionCardTitle(card) {\n    if (!card) return '';\n    var titled = card.getAttribute('data-wmn-title');\n    if (titled) return titled;\n    var el = card.querySelector('.title');\n    return el ? (el.textContent || '').trim() : '';\n  }\n\n  var collectionLive = {\n    hoverTimer: 0,\n    hoverHandle: '',\n    hoverX: 0,\n    hoverY: 0,\n    hoverStarted: 0,\n    dwell: {},\n    skip: {},\n    exposedAt: {},\n    io: null,\n    tailTimer: 0\n  };\n\n  function markCollectionTail() {\n    window.__wmnCollectionTailUntil = Date.now() + 2500;\n  }\n\n  function pointerStillOnCollectionCard(handle, x, y) {\n    if (!handle) return false;\n    try {\n      var el = document.elementFromPoint(x, y);\n      var card = collectionCardFromEvent(el);\n      return !!(card && card.getAttribute('data-wmn-handle') === handle);\n    } catch (ePt) {\n      return false;\n    }\n  }\n\n  function clearCollectionHover() {\n    if (collectionLive.hoverTimer) {\n      clearTimeout(collectionLive.hoverTimer);\n      collectionLive.hoverTimer = 0;\n    }\n    collectionLive.hoverHandle = '';\n    window.__wmnCollectionHoverHandle = '';\n  }\n\n  function emitCollectionSignal(card, kind, extra) {\n    if (!card) return;\n    var handle = card.getAttribute('data-wmn-handle');\n    if (!handle) return;\n    extra = extra || {};\n    markCollectionTail();\n    if (kind === 'listen') {\n      recordView({\n        handle: handle,\n        title: collectionCardTitle(card),\n        genres: collectionCardGenres(card),\n        kind: 'listen'\n      });\n      return;\n    }\n    if (kind === 'skip') {\n      recordFeedSignal({\n        kind: 'skip',\n        handle: handle,\n        title: collectionCardTitle(card),\n        source: 'collection-grid',\n        amount: extra.amount == null ? 0.28 : extra.amount\n      });\n      return;\n    }\n    recordFeedSignal({\n      kind: 'hover',\n      handle: handle,\n      title: collectionCardTitle(card),\n      genres: collectionCardGenres(card),\n      dwellMs: extra.dwellMs || 450,\n      source: 'collection-grid'\n    });\n  }\n\n  function scheduleCollectionTailReorder() {\n    if (collectionLive.tailTimer) clearTimeout(collectionLive.tailTimer);\n    collectionLive.tailTimer = setTimeout(function () {\n      collectionLive.tailTimer = 0;\n      if (window.__wmnProductNavUntil && Date.now() < window.__wmnProductNavUntil) return;\n      function run() {\n        var grids = document.querySelectorAll(\n          '.collection-template-section .product-list.collection-matrix, .collection-template .product-list.collection-matrix'\n        );\n        var i;\n        for (i = 0; i < grids.length; i++) reorderCollectionTail(grids[i]);\n      }\n      if (\n        window.wmnCatalogGraph &&\n        typeof window.wmnCatalogGraph.ensureLoaded === 'function' &&\n        !graphReady()\n      ) {\n        window.wmnCatalogGraph.ensureLoaded().then(run).catch(function () {});\n        return;\n      }\n      run();\n    }, 280);\n  }\n\n  function buildCollectionTailCard(pick, className) {\n    if (!pick || !pick.handle) return null;\n    var data = window.wmnCatalogGraph.getData && window.wmnCatalogGraph.getData();\n    var products = (data && data.products) || {};\n    var p = products[pick.handle] || {};\n    var genreLabels = [];\n    var gs = pick.genres || p.g || [];\n    var gi;\n    for (gi = 0; gi < gs.length && genreLabels.length < 2; gi++) {\n      genreLabels.push(humanizeSlug(gs[gi]));\n    }\n    var card = buildSearchMemoryCard(\n      {\n        h: pick.handle,\n        title: pick.title || p.t || pick.handle,\n        img: pick.image || p.img || '',\n        price: '',\n        tags: []\n      },\n      className,\n      { eager: false, collection: true, genres: genreLabels }\n    );\n    if (!card) return null;\n    card.className = className + ' wmn-memory-search-card';\n    card.setAttribute('data-wmn-fy-paint', '1');\n    card.setAttribute('data-wmn-genres', genreLabels.join('|'));\n    return card;\n  }\n\n  /**\n   * Keep every card that is on screen (and the one under the pointer).\n   * Replace only cards fully below the viewport with the new ranking.\n   */\n  function reorderCollectionTail(container) {\n    if (!container || !wantsAlgorithmCollectionSort()) return false;\n    if (!graphReady() || !collectionInterestWarm()) return false;\n    var cards = collectionMatrixCards(container);\n    if (cards.length < 2) return false;\n    var vh = window.innerHeight || document.documentElement.clientHeight;\n    var keep = {};\n    var replace = [];\n    var i;\n    for (i = 0; i < cards.length; i++) {\n      var card = cards[i];\n      var handle = card.getAttribute('data-wmn-handle');\n      var rect = card.getBoundingClientRect();\n      var hovering = handle && handle === window.__wmnCollectionHoverHandle;\n      if (hovering || rect.top < vh - 8) {\n        if (handle) keep[handle] = true;\n      } else {\n        replace.push(card);\n      }\n    }\n    if (!replace.length) return false;\n\n    var page = collectionPageNumber();\n    var prim = collectionFocusPrimary();\n    var focusOverride = focusFromCollectionPrimary(prim);\n    var lim = Math.max(cards.length * 3, 72, page * 48);\n    if (lim > 600) lim = 600;\n    var fy = scoreCatalogForYou({\n      limit: lim,\n      explore: false,\n      pinRecent: false,\n      fillToLimit: true,\n      focus: focusOverride || undefined\n    });\n    if (!fy || !fy.picks || !fy.picks.length) return false;\n\n    var prior = fyHandlesBeforePage(page);\n    var desired = [];\n    var seen = {};\n    for (i = 0; i < fy.picks.length && desired.length < replace.length; i++) {\n      var pick = fy.picks[i];\n      if (!pick || !pick.handle || keep[pick.handle] || prior[pick.handle] || seen[pick.handle]) continue;\n      seen[pick.handle] = true;\n      desired.push(pick);\n    }\n    if (!desired.length) return false;\n\n    var same = desired.length === replace.length;\n    if (same) {\n      for (i = 0; i < desired.length; i++) {\n        if (desired[i].handle !== replace[i].getAttribute('data-wmn-handle')) {\n          same = false;\n          break;\n        }\n      }\n    }\n    if (same) return false;\n\n    var sample = cards[0];\n    var className = 'thumbnail';\n    if (sample && sample.className) {\n      className = String(sample.className || '')\n        .replace(/\\bwmn-memory-search-card\\b/g, '')\n        .replace(/\\bwmn-interest-card\\b/g, '')\n        .replace(/\\beven\\b/g, '')\n        .replace(/\\bodd\\b/g, '')\n        .replace(/\\s+/g, ' ')\n        .trim();\n    }\n\n    var pool = {};\n    for (i = 0; i < replace.length; i++) {\n      pool[replace[i].getAttribute('data-wmn-handle')] = replace[i];\n    }\n    var anchor = replace[replace.length - 1].nextSibling;\n    var frag = document.createDocumentFragment();\n    var used = {};\n    window.__wmnCollectionTailPainting = true;\n    try {\n      for (i = 0; i < desired.length; i++) {\n        var want = desired[i].handle;\n        var node = pool[want];\n        if (!node) node = buildCollectionTailCard(desired[i], className);\n        if (!node) continue;\n        frag.appendChild(node);\n        used[want] = true;\n      }\n      for (i = 0; i < replace.length; i++) {\n        var oldH = replace[i].getAttribute('data-wmn-handle');\n        if (!used[oldH] && replace[i].parentNode) {\n          replace[i].parentNode.removeChild(replace[i]);\n        }\n      }\n      container.insertBefore(frag, anchor);\n    } finally {\n      setTimeout(function () {\n        window.__wmnCollectionTailPainting = false;\n      }, 500);\n    }\n    nudgeStuckLazyImages(container);\n    observeCollectionCards(container);\n    rememberFyPage(\n      collectionPageNumber(),\n      collectionMatrixCards(container).map(function (card) {\n        return card.getAttribute('data-wmn-handle');\n      })\n    );\n    return true;\n  }\n\n  function observeCollectionCards(root) {\n    if (!collectionLive.io) return;\n    var scope = root && root.querySelectorAll ? root : document;\n    if (isHomepagePersonalRail(scope)) return;\n    var lists;\n    if (\n      scope.classList &&\n      scope.classList.contains('collection-matrix') &&\n      scope.closest &&\n      scope.closest('.collection-template-section, .collection-template')\n    ) {\n      lists = [scope];\n    } else {\n      lists = scope.querySelectorAll(\n        '.collection-template-section .product-list.collection-matrix, .collection-template .product-list.collection-matrix'\n      );\n    }\n    var i;\n    for (i = 0; i < lists.length; i++) {\n      var cards = collectionMatrixCards(lists[i]);\n      var j;\n      for (j = 0; j < cards.length; j++) {\n        if (cards[j].getAttribute('data-wmn-live-obs') === '1') continue;\n        cards[j].setAttribute('data-wmn-live-obs', '1');\n        collectionLive.io.observe(cards[j]);\n      }\n    }\n  }\n\n  function bindCollectionLiveRank() {\n    if (window.__wmnCollectionLive) return;\n    window.__wmnCollectionLive = true;\n\n    document.addEventListener(\n      'pointerover',\n      function (e) {\n        var card = collectionCardFromEvent(e.target);\n        if (!card) return;\n        var handle = card.getAttribute('data-wmn-handle');\n        if (!handle || handle === collectionLive.hoverHandle) return;\n        clearCollectionHover();\n        collectionLive.hoverHandle = handle;\n        window.__wmnCollectionHoverHandle = handle;\n        collectionLive.hoverX = e.clientX;\n        collectionLive.hoverY = e.clientY;\n        collectionLive.hoverStarted = Date.now();\n        collectionLive.hoverTimer = setTimeout(function () {\n          collectionLive.hoverTimer = 0;\n          if (collectionLive.hoverHandle !== handle) return;\n          var dwell = Date.now() - collectionLive.hoverStarted;\n          if (dwell < 450) return;\n          if (\n            !pointerStillOnCollectionCard(\n              handle,\n              collectionLive.hoverX,\n              collectionLive.hoverY\n            )\n          ) {\n            return;\n          }\n          if (collectionLive.dwell[handle]) return;\n          collectionLive.dwell[handle] = true;\n          emitCollectionSignal(card, 'hover', { dwellMs: dwell });\n        }, 450);\n      },\n      true\n    );\n\n    document.addEventListener(\n      'pointermove',\n      function (e) {\n        if (!collectionLive.hoverHandle) return;\n        if (typeof e.clientX === 'number') collectionLive.hoverX = e.clientX;\n        if (typeof e.clientY === 'number') collectionLive.hoverY = e.clientY;\n      },\n      true\n    );\n\n    document.addEventListener(\n      'pointerout',\n      function (e) {\n        var card = collectionCardFromEvent(e.target);\n        if (!card) return;\n        if (card.getAttribute('data-wmn-handle') !== collectionLive.hoverHandle) return;\n        var next = e.relatedTarget ? collectionCardFromEvent(e.relatedTarget) : null;\n        if (next === card) return;\n        clearCollectionHover();\n      },\n      true\n    );\n\n    document.addEventListener(\n      'click',\n      function (e) {\n        var btn =\n          e.target && e.target.closest\n            ? e.target.closest(\n                '.collection-template-section [data-wmn-play], .collection-template-section [data-wmn-listen], .collection-template [data-wmn-play], .collection-template [data-wmn-listen]'\n              )\n            : null;\n        if (!btn) return;\n        var card = collectionCardFromEvent(btn) || collectionCardFromEvent(e.target);\n        var handle =\n          (card && card.getAttribute('data-wmn-handle')) ||\n          btn.getAttribute('data-wmn-handle');\n        if (!handle) return;\n        collectionLive.dwell[handle] = true;\n        if (!card) return;\n        emitCollectionSignal(card, 'listen');\n      },\n      true\n    );\n\n    if (typeof window.IntersectionObserver === 'function') {\n      collectionLive.io = new IntersectionObserver(\n        function (entries) {\n          if (window.__wmnCollectionTailPainting) return;\n          var now = Date.now();\n          var i;\n          for (i = 0; i < entries.length; i++) {\n            var en = entries[i];\n            var card = en.target;\n            if (!card || !card.getAttribute) continue;\n            var handle = card.getAttribute('data-wmn-handle');\n            if (!handle) continue;\n            if (en.isIntersecting && en.intersectionRatio >= 0.55) {\n              if (!collectionLive.exposedAt[handle]) collectionLive.exposedAt[handle] = now;\n              continue;\n            }\n            if (en.isIntersecting) continue;\n            var started = collectionLive.exposedAt[handle];\n            var rect = card.getBoundingClientRect();\n            var scrolledPast = rect.bottom <= 4;\n            if (\n              started &&\n              now - started >= 700 &&\n              scrolledPast &&\n              !collectionLive.dwell[handle] &&\n              !collectionLive.skip[handle]\n            ) {\n              collectionLive.skip[handle] = true;\n              emitCollectionSignal(card, 'skip', { amount: 0.28 });\n            }\n            if (en.intersectionRatio === 0) delete collectionLive.exposedAt[handle];\n          }\n        },\n        { threshold: [0, 0.55] }\n      );\n      observeCollectionCards(document);\n      if (window.MutationObserver) {\n        var scanTimer = 0;\n        var mo = new MutationObserver(function () {\n          if (scanTimer) return;\n          scanTimer = setTimeout(function () {\n            scanTimer = 0;\n            observeCollectionCards(document);\n          }, 120);\n        });\n        mo.observe(document.documentElement, { childList: true, subtree: true });\n      }\n    }\n  }\n\n  function init() {\n    bindEngagementObservers();\n    bindCollectionLiveRank();\n    bindExtraSignals();\n    // Login on this browser: fold anon taste into customer keys first,\n    // then overlay cloud metafield (newer wins inside applyCloudInterest),\n    // then copy durable \u2192 session for For You.\n    migrateAnonymousToCustomer();\n    mergeCloudPreferences();\n    hydrateInterestFromDurable();\n    recordFromPage();\n    reorderSearch();\n    reorderProductGrids();\n    reorderAutocompleteLists();\n    bindCollectionSortSelect();\n    scheduleCollectionAlgorithmSort();\n    nudgeStuckLazyImages(document);\n    armStuckLazyImageObserver();\n    rerankRecs(document);\n    renderForYouRail();\n    renderBecauseYouLookedRail();\n    renderPdpRelatedRails();\n    scheduleCloudWriteback();\n    bindForYouLiveRefresh();\n    bindSearchGhost();\n  }\n\n  /** Re-paint homepage Picked for you when rail/prefs affinity updates. */\n  function bindForYouLiveRefresh() {\n    if (window.__wmnForYouLiveBound) return;\n    window.__wmnForYouLiveBound = true;\n    var timer = 0;\n    function schedule(reason) {\n      if (timer) clearTimeout(timer);\n      timer = setTimeout(function () {\n        timer = 0;\n        function paint() {\n          if (window.__wmnProductNavUntil && Date.now() < window.__wmnProductNavUntil) return;\n          try {\n            var root = document.getElementById('wmn-for-you');\n            // Phase 2: feed owns section \u2014 tail rebuild only, never wipe.\n            if (forYouFeedOwns(root)) {\n              if (\n                window.wmnForYouFeed &&\n                typeof window.wmnForYouFeed.remount === 'function' &&\n                reason &&\n                String(reason).indexOf('rail') !== -1\n              ) {\n                window.wmnForYouFeed.remount(\n                  'force-remount:' + (reason || 'live-refresh')\n                );\n              } else if (\n                window.wmnForYouFeed &&\n                typeof window.wmnForYouFeed.rebuildTail === 'function'\n              ) {\n                window.wmnForYouFeed.rebuildTail(reason || 'live-refresh');\n              } else {\n                document.dispatchEvent(\n                  new CustomEvent('wmn:for-you-state', {\n                    detail: { reason: reason || 'live-refresh' }\n                  })\n                );\n              }\n            } else {\n              renderForYouRail();\n            }\n            renderBecauseYouLookedRail();\n            renderPdpRelatedRails();\n          } catch (e) {\n            /* ignore */\n          }\n        }\n        try {\n          if (\n            window.wmnCatalogGraph &&\n            typeof window.wmnCatalogGraph.ensureLoaded === 'function'\n          ) {\n            window.wmnCatalogGraph.ensureLoaded().then(paint).catch(paint);\n            return;\n          }\n        } catch (e2) {\n          /* fall through */\n        }\n        paint();\n      }, 200);\n    }\n    document.addEventListener('wmn:preferences-updated', function () {\n      schedule('preferences-updated');\n    });\n    document.addEventListener('wmn:rail-affinity', function () {\n      schedule('rail-affinity');\n    });\n    document.addEventListener('wmn:intent-field-updated', function () {\n      schedule('intent-field-updated');\n    });\n    document.addEventListener('wmn:focus-changed', function () {\n      schedule('focus-changed');\n    });\n\n    // Collection \"For you\" must re-rank when search/view intent changes \u2014\n    // homepage rails alone used to refresh, leaving /collections/all stuck on\n    // the first cold sort (often Mali/Jazz imprint mass).\n    function scheduleCollectionRefresh() {\n      if (!wantsAlgorithmCollectionSort()) return;\n      if (\n        !document.querySelector(\n          '.collection-template-section .product-list.collection-matrix, .collection-template .product-list.collection-matrix'\n        )\n      ) {\n        return;\n      }\n      if (window.__wmnProductNavUntil && Date.now() < window.__wmnProductNavUntil) return;\n      // Grid hover / scroll / play: refresh what is still below the fold.\n      // A full matrix swap removes the card under the pointer.\n      if (window.__wmnCollectionTailUntil && Date.now() < window.__wmnCollectionTailUntil) {\n        scheduleCollectionTailReorder();\n        return;\n      }\n      invalidateCollectionAlgorithmSort();\n      scheduleCollectionAlgorithmSort();\n    }\n    document.addEventListener('wmn:preferences-updated', scheduleCollectionRefresh);\n    document.addEventListener('wmn:intent-field-updated', scheduleCollectionRefresh);\n    document.addEventListener('wmn:focus-changed', scheduleCollectionRefresh);\n  }\n\n  window.wmnEngagement = {\n    init: init,\n    recordView: recordView,\n    recordSearch: recordSearch,\n    recordSearchClick: recordSearchClick,\n    recordSkipNegative: recordSkipNegative,\n    recordFeedSignal: recordFeedSignal,\n    getStore: readStore,\n    reorderProductGrids: reorderProductGrids,\n    scheduleCollectionAlgorithmSort: scheduleCollectionAlgorithmSort,\n    wantsAlgorithmCollectionSort: wantsAlgorithmCollectionSort,\n    nudgeStuckLazyImages: nudgeStuckLazyImages,\n    rerankRecs: rerankRecs,\n    gateShopifyRecs: gateShopifyRecs,\n    renderForYouRail: renderForYouRail,\n    renderBecauseYouLookedRail: renderBecauseYouLookedRail,\n    becausePicksForSeed: becausePicksForSeed,\n    becauseExcludeSet: becauseExcludeSet,\n    becauseIsExcluded: becauseIsExcluded,\n    becauseDigDeeperTarget: becauseDigDeeperTarget,\n    becauseProductMatchesGenre: becauseProductMatchesGenre,\n    renderMoreFromArtistRail: renderMoreFromArtistRail,\n    enrichRelatedByGenreRail: enrichRelatedByGenreRail,\n    renderPdpRelatedRails: renderPdpRelatedRails,\n    moreFromArtistPicks: moreFromArtistPicks,\n    buildForYouPicks: buildForYouPicks,\n    scoreCatalogForYou: scoreCatalogForYou,\n    scoreCatalogStaffPicks: scoreCatalogStaffPicks,\n    blendStaffPicksAffinity: blendStaffPicksAffinity,\n    hasStaffPicksAffinitySignal: hasStaffPicksAffinitySignal,\n    getStaffPicksAffinityHandle: getStaffPicksAffinityHandle,\n    staffPicksFortnightBucket: staffPicksFortnightBucket,\n    hasGeoForYouPrefs: hasGeoForYouPrefs,\n    rankByAffinity: rankByAffinity,\n    fieldOwnsRanking: fieldOwnsRanking,\n    getEntityPrefs: getEntityPrefs,\n    getFocus: readFocus,\n    getSearchSuggestion: getSearchSuggestion,\n    getInterestProfile: readInterestProfile,\n    applyCloudProfile: applyCloudProfile,\n    buildTasteCloudProfile: buildTasteCloudProfile,\n    promoteFocus: promoteFocus,\n    scoreHandle: scoreHandle,\n    scoreHandleEntities: scoreHandleEntities,\n    recordQueryClick: recordQueryClick,\n    queryClickBoost: queryClickBoost,\n    queryClickWeight: queryClickWeight,\n    queryClickTopHandles: queryClickTopHandles,\n    ensureQueryClickCollective: ensureQueryClickCollective,\n    logIntent: logIntentEvent,\n    getPendingSync: getPendingSync,\n    softmaxPiMap: softmaxPiMap,\n    estimateIps: estimateIps,\n    slotWeight: slotWeight,\n    FY_POLICY_ID: FY_POLICY_ID,\n    FY_IPS_CLIP: FY_IPS_CLIP,\n    /** Theme recentlyViewed cookie helpers (Phase 1 history unify). */\n    readRecentlyViewedCookie: readRecentlyViewedCookie,\n    writeRecentlyViewedCookie: writeRecentlyViewedCookie,\n    pushRecentlyViewedHandle: pushRecentlyViewedHandle,\n    prependRecentlyViewedHandles: prependRecentlyViewedHandles,\n    normalizeRecentlyViewedHandle: normalizeRecentlyViewedHandle,\n    isLikelyProductHandle: isLikelyProductHandle,\n    getAffinity: function () {\n      return getAffinityCompat();\n    }\n  };\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n\n  // Theme InstantClick uses .on('change'); some builds also emit instantclick:newpage.\n  // Without this, SPA navigations to PDPs never call recordFromPage (full genres/image).\n  function onInstantNav() {\n    init();\n  }\n  document.addEventListener('instantclick:newpage', onInstantNav);\n  if (window.InstantClick && typeof InstantClick.on === 'function') {\n    try {\n      InstantClick.on('change', onInstantNav);\n    } catch (errIc) {\n      /* ignore */\n    }\n  }\n})(window, document);\n"],
  "mappings": "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",
  "names": ["window", "document", "i", "slug", "store", "p", "g", "ev", "arr", "handle", "gList", "gi", "base", "h", "digTarget", "row", "picks", "item", "card", "now"]
}
