{
  "version": 3,
  "sources": ["/cdn/shop/t/64/assets/nmp-quote.js?nocache=1794193286610"],
  "sourcesContent": ["/* NMP Quote Builder \u2014 No More Pain Ergonomics\r\n * Create mode: details \u2192 products \u2192 delivery (live Shopify rates) \u2192 formal quote + PDF\r\n * Accept mode: load quote (link / PDF / this device) \u2192 PO number + PO document \u2192 checkout\r\n * No server required: shipping uses the storefront Cart API; orders are placed through\r\n * Shopify checkout using the \"Company Purchase Order\" manual payment method.\r\n */\r\n(() => {\r\n  'use strict';\r\n\r\n  const LS_QUOTES = 'nmpq_quotes_v1';\r\n  const LS_DRAFT = 'nmpq_draft_v1';\r\n  const LS_CART_BACKUP = 'nmpq_cart_backup_v1';\r\n  const PDF_TAG = 'NMPQ1';\r\n  const JSPDF = 'https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js';\r\n  const AUTOTABLE = 'https://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.8.2/jspdf.plugin.autotable.min.js';\r\n  const STATES = { QLD: 'Queensland', NSW: 'New South Wales', VIC: 'Victoria', ACT: 'Australian Capital Territory', SA: 'South Australia', WA: 'Western Australia', TAS: 'Tasmania', NT: 'Northern Territory' };\r\n\r\n  /* ---------------- helpers ---------------- */\r\n  const $ = (sel, el) => (el || document).querySelector(sel);\r\n  const $$ = (sel, el) => Array.from((el || document).querySelectorAll(sel));\r\n  const esc = (s) => String(s == null ? '' : s).replace(/[&<>\"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]));\r\n  const sleep = (ms) => new Promise((r) => setTimeout(r, ms));\r\n  const toCents = (v) => Math.round(parseFloat(v || 0) * 100);\r\n  const store = {\r\n    get(k, d) { try { const v = localStorage.getItem(k); return v ? JSON.parse(v) : d; } catch (e) { return d; } },\r\n    set(k, v) { try { localStorage.setItem(k, JSON.stringify(v)); } catch (e) { /* ignore */ } },\r\n    del(k) { try { localStorage.removeItem(k); } catch (e) { /* ignore */ } }\r\n  };\r\n  // Privacy: details saved on this device don't linger \u2014 quotes are removed once they lapse, unfinished drafts after 24 hours\r\n  const DRAFT_TTL = 24 * 3600 * 1000;\r\n  (function purgeStale() {\r\n    const now = Date.now();\r\n    const all = store.get(LS_QUOTES, null);\r\n    if (all && typeof all === 'object') {\r\n      let changed = false;\r\n      Object.keys(all).forEach((k) => {\r\n        const q = all[k] || {};\r\n        const until = q.validUntil ? new Date(q.validUntil).getTime() : (q.created ? new Date(q.created).getTime() + 30 * 86400000 : 0);\r\n        if (!until || isNaN(until) || until < now) { delete all[k]; changed = true; }\r\n      });\r\n      if (changed) { if (Object.keys(all).length) store.set(LS_QUOTES, all); else store.del(LS_QUOTES); }\r\n    }\r\n    const dr = store.get(LS_DRAFT, null);\r\n    if (dr && (!dr.at || now - dr.at > DRAFT_TTL)) store.del(LS_DRAFT);\r\n  })();\r\n  const b64urlEncode = (str) => {\r\n    const bytes = new TextEncoder().encode(str);\r\n    let bin = '';\r\n    bytes.forEach((b) => { bin += String.fromCharCode(b); });\r\n    return btoa(bin).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\r\n  };\r\n  const b64urlDecode = (s) => {\r\n    s = s.replace(/-/g, '+').replace(/_/g, '/');\r\n    while (s.length % 4) s += '=';\r\n    const bin = atob(s);\r\n    const bytes = new Uint8Array(bin.length);\r\n    for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\r\n    return new TextDecoder().decode(bytes);\r\n  };\r\n  const fmtDate = (iso) => new Date(iso).toLocaleDateString('en-AU', { day: 'numeric', month: 'long', year: 'numeric' });\r\n  const scriptCache = {};\r\n  const loadScript = (src) => {\r\n    if (!scriptCache[src]) {\r\n      scriptCache[src] = new Promise((res, rej) => {\r\n        const s = document.createElement('script'); s.src = src; s.onload = res;\r\n        s.onerror = () => { delete scriptCache[src]; rej(new Error('Could not load ' + src)); };\r\n        document.head.appendChild(s);\r\n      });\r\n    }\r\n    return scriptCache[src];\r\n  };\r\n  const api = {\r\n    async get(url) { const r = await fetch(url, { headers: { Accept: 'application/json' }, credentials: 'same-origin' }); if (!r.ok) throw new Error(url + ' ' + r.status); return r.json(); },\r\n    async post(url, body) {\r\n      const opts = { method: 'POST', credentials: 'same-origin', headers: { Accept: 'application/json', 'X-Requested-With': 'XMLHttpRequest' } };\r\n      if (body instanceof FormData) opts.body = body; else if (body) { opts.body = JSON.stringify(body); opts.headers['Content-Type'] = 'application/json'; }\r\n      const r = await fetch(url, opts);\r\n      const txt = await r.text();\r\n      let json = null; try { json = txt ? JSON.parse(txt) : null; } catch (e) { /* non-JSON */ }\r\n      if (!r.ok) { const err = new Error((json && (json.description || json.message)) || (url + ' ' + r.status)); err.status = r.status; throw err; }\r\n      return json;\r\n    }\r\n  };\r\n\r\n  /* --------- cart backup / restore (shipping calc temporarily uses the cart) --------- */\r\n  async function restoreCartBackup() {\r\n    const backup = store.get(LS_CART_BACKUP, null);\r\n    if (!backup) return;\r\n    try {\r\n      await api.post('/cart/clear.js');\r\n      if (backup.items && backup.items.length) await api.post('/cart/add.js', { items: backup.items });\r\n    } catch (e) {\r\n      // try line by line so one unavailable item doesn't block the rest\r\n      for (const it of (backup.items || [])) { try { await api.post('/cart/add.js', { items: [it] }); } catch (e2) { /* skip */ } }\r\n    }\r\n    store.del(LS_CART_BACKUP);\r\n  }\r\n  async function backupCart() {\r\n    const cart = await api.get('/cart.js');\r\n    const items = cart.items.map((i) => {\r\n      const o = { id: i.variant_id, quantity: i.quantity };\r\n      if (i.properties && Object.keys(i.properties).length) o.properties = i.properties;\r\n      if (i.selling_plan_allocation && i.selling_plan_allocation.selling_plan) o.selling_plan = i.selling_plan_allocation.selling_plan.id;\r\n      return o;\r\n    });\r\n    store.set(LS_CART_BACKUP, { items, at: Date.now() });\r\n  }\r\n\r\n  /* ---------------- catalogue ---------------- */\r\n  let catalogPromise = null;\r\n  function loadCatalog() {\r\n    if (catalogPromise) return catalogPromise;\r\n    catalogPromise = (async () => {\r\n      const out = [];\r\n      for (let page = 1; page <= 10; page++) {\r\n        const data = await api.get(`/products.json?limit=250&page=${page}`);\r\n        const list = data.products || [];\r\n        list.forEach((p) => {\r\n          const img = p.images && p.images[0] ? p.images[0].src : '';\r\n          const imgById = {};\r\n          (p.images || []).forEach((im) => { (im.variant_ids || []).forEach((vid) => { imgById[vid] = im.src; }); });\r\n          out.push({\r\n            id: p.id, handle: p.handle, title: p.title, vendor: p.vendor, type: p.product_type, tags: (p.tags || []).join(' '),\r\n            image: img,\r\n            options: (p.options || []).map((o) => o.name),\r\n            hasOptions: p.variants.length > 1,\r\n            variants: p.variants.map((v) => ({\r\n              id: v.id, title: v.title, sku: v.sku || '', price: toCents(v.price), available: v.available !== false,\r\n              requiresShipping: v.requires_shipping !== false, taxable: v.taxable !== false, grams: v.grams || 0,\r\n              options: [v.option1, v.option2, v.option3].filter((x) => x != null),\r\n              image: (v.featured_image && v.featured_image.src) || imgById[v.id] || img\r\n            }))\r\n          });\r\n        });\r\n        if (list.length < 250) break;\r\n      }\r\n      out.forEach((p) => { p.hay = [p.title, p.vendor, p.type, p.tags, p.variants.map((v) => v.sku + ' ' + v.title).join(' ')].join(' ').toLowerCase(); });\r\n      return out;\r\n    })();\r\n    return catalogPromise;\r\n  }\r\n  const thumb = (src, w) => {\r\n    if (!src) return '';\r\n    return src + (src.includes('?') ? '&' : '?') + 'width=' + (w || 160);\r\n  };\r\n\r\n  /* ---------------- shipping rates via cart ---------------- */\r\n  // Shopify merges rates into one generic line when a cart spans several shipping profiles.\r\n  // To show every carrier, price the carrier-rated items (Interparcel) together and add the rest.\r\n  async function fetchRates(items, addr, onProgress) {\r\n    const shippable = items.filter((i) => i.requiresShipping !== false);\r\n    if (!shippable.length) return { rates: [{ name: 'No shipping required', price: 0, code: 'none' }], partial: false };\r\n    await backupCart();\r\n    try {\r\n      const all = await cartRates(shippable, addr);\r\n      if (all.rates.length > 1 || shippable.length === 1 || shippable.length > 8) return all;\r\n      if (onProgress) onProgress('Comparing carriers for your items\u2026');\r\n      const carrierItems = []; const other = [];\r\n      for (const it of shippable) {\r\n        const r = await cartRates([it], addr);\r\n        (r.rates.some((x) => x.carrier) ? carrierItems : other).push(it);\r\n      }\r\n      if (!carrierItems.length) return all;\r\n      const A = await cartRates(carrierItems, addr);\r\n      if (A.rates.length < 2) return all;\r\n      let extra = 0; let partial = all.partial || A.partial;\r\n      if (other.length) {\r\n        const B = await cartRates(other, addr);\r\n        if (!B.rates.length) partial = true; else extra = B.rates[0].price;\r\n        partial = partial || B.partial;\r\n      }\r\n      return { rates: A.rates.map((r) => Object.assign({}, r, { price: r.price + extra, extra })).sort((a, b) => a.price - b.price), partial };\r\n    } finally {\r\n      await restoreCartBackup();\r\n    }\r\n  }\r\n  async function cartRates(shippable, addr) {\r\n    let partial = false;\r\n    {\r\n      await api.post('/cart/clear.js');\r\n      try {\r\n        await api.post('/cart/add.js', { items: shippable.map((i) => ({ id: i.variantId, quantity: i.qty })) });\r\n      } catch (e) {\r\n        // one or more lines can't be added (e.g. stock) \u2014 add what we can\r\n        partial = true;\r\n        for (const i of shippable) { try { await api.post('/cart/add.js', { items: [{ id: i.variantId, quantity: i.qty }] }); } catch (e2) { /* skip */ } }\r\n      }\r\n      const qs = new URLSearchParams({\r\n        'shipping_address[zip]': addr.zip,\r\n        'shipping_address[country]': 'AU',\r\n        'shipping_address[province]': addr.province\r\n      }).toString();\r\n      await api.post('/cart/prepare_shipping_rates.json?' + qs);\r\n      const started = Date.now();\r\n      while (Date.now() - started < 40000) {\r\n        const r = await fetch('/cart/async_shipping_rates.json?' + qs, { credentials: 'same-origin' });\r\n        if (r.status === 200) {\r\n          const t = await r.text();\r\n          if (t && t !== 'null') {\r\n            const j = JSON.parse(t);\r\n            const rates = (j.shipping_rates || []).map((x) => ({\r\n              name: x.presentment_name || x.name, code: x.code, price: toCents(x.price),\r\n              carrier: !!x.carrier_identifier || !/^shopify$/i.test(String(x.source || '')),\r\n              days: Array.isArray(x.delivery_days) && x.delivery_days.length ? x.delivery_days : null\r\n            })).sort((a, b) => a.price - b.price);\r\n            return { rates, partial };\r\n          }\r\n        } else if (r.status >= 400) {\r\n          const t = await r.text();\r\n          throw new Error('Shipping calculation failed (' + r.status + ') ' + t.slice(0, 120));\r\n        }\r\n        await sleep(900);\r\n      }\r\n      throw new Error('Shipping calculation timed out');\r\n    }\r\n  }\r\n\r\n  /* ---------------- totals ---------------- */\r\n  function computeTotals(items, freight, cfg) {\r\n    const subtotal = items.reduce((s, i) => s + i.price * i.qty, 0);\r\n    const f = freight || 0;\r\n    const taxBase = subtotal + f; // all NMP products and freight include GST\r\n    let gst, total;\r\n    if (cfg.taxesIncluded) { total = subtotal + f; gst = Math.round(taxBase / 11); } else { gst = Math.round(taxBase * cfg.gstRate); total = subtotal + f + gst; }\r\n    return { subtotal, freight: f, gst, total };\r\n  }\r\n\r\n  /* ================================================================== */\r\n  function init(root) {\r\n    const cfgEl = document.getElementById('nmpq-config-' + root.dataset.sectionId);\r\n    const cfg = JSON.parse(cfgEl.textContent);\r\n    const money = (c) => (c == null ? 'TBC' : new Intl.NumberFormat('en-AU', { style: 'currency', currency: cfg.currency || 'AUD' }).format(c / 100));\r\n\r\n    const el = {\r\n      notice: $('[data-notice]', root),\r\n      create: $('[data-mode=\"create\"]', root),\r\n      accept: $('[data-mode=\"accept\"]', root),\r\n      modeBtns: $$('[data-mode-btn]', root),\r\n      steps: $$('[data-step]', root),\r\n      stepInd: $$('[data-step-ind]', root),\r\n      details: $('[data-step=\"1\"]', root),\r\n      shipSame: $('[name=\"shippingSame\"]', root),\r\n      shipFields: $('[data-shipping-fields]', root),\r\n      search: $('[data-search]', root),\r\n      results: $('[data-results]', root),\r\n      catalogStatus: $('[data-catalog-status]', root),\r\n      configurator: $('[data-configurator]', root),\r\n      lines: $('[data-lines]', root),\r\n      notes: $('[data-notes]', root),\r\n      methods: $$('[data-method]', root),\r\n      shipTo: $('[data-ship-to]', root),\r\n      pickupNote: $('[data-pickup-note]', root),\r\n      rates: $('[data-rates]', root),\r\n      nextDelivery: $('[data-next-delivery]', root),\r\n      doc: $('[data-doc]', root),\r\n      quoteFile: $('[data-quote-file]', root),\r\n      savedQuotes: $('[data-saved-quotes]', root),\r\n      acceptLoad: $('[data-accept-load]', root),\r\n      acceptForm: $('[data-accept-form]', root),\r\n      acceptNo: $('[data-accept-no]', root),\r\n      acceptSummary: $('[data-accept-summary]', root)\r\n    };\r\n\r\n    const state = {\r\n      step: 1,\r\n      details: null,\r\n      items: [],\r\n      notes: '',\r\n      delivery: null,       // { method, name, price, code, days }\r\n      ratesSig: null,\r\n      rates: null,\r\n      quote: null,\r\n      acceptQuote: null,\r\n      catalog: null\r\n    };\r\n\r\n    /* ---------- notices ---------- */\r\n    function notice(msg, type) {\r\n      if (!msg) { el.notice.hidden = true; el.notice.innerHTML = ''; return; }\r\n      el.notice.className = 'nmpq__notice' + (type ? ' is-' + type : '');\r\n      el.notice.innerHTML = msg;\r\n      el.notice.hidden = false;\r\n      el.notice.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n    }\r\n\r\n    /* ---------- modes ---------- */\r\n    function setMode(mode) {\r\n      el.modeBtns.forEach((b) => { const on = b.dataset.modeBtn === mode; b.classList.toggle('is-active', on); b.setAttribute('aria-selected', on); });\r\n      el.create.hidden = mode !== 'create';\r\n      el.accept.hidden = mode !== 'accept';\r\n      notice(null);\r\n      if (mode === 'accept') renderSavedQuotes();\r\n    }\r\n    el.modeBtns.forEach((b) => b.addEventListener('click', () => setMode(b.dataset.modeBtn)));\r\n\r\n    /* ---------- steps ---------- */\r\n    function goTo(n) {\r\n      if (n >= 2 && !state.details) {\r\n        if (validateDetails()) state.details = readDetails();\r\n        else n = 1;\r\n      }\r\n      state.step = n;\r\n      el.steps.forEach((s) => { s.hidden = Number(s.dataset.step) !== n; });\r\n      el.stepInd.forEach((s) => {\r\n        const i = Number(s.dataset.stepInd);\r\n        s.classList.toggle('is-current', i === n);\r\n        s.classList.toggle('is-done', i < n);\r\n      });\r\n      notice(null);\r\n      if (n === 2) openPending();\r\n      if (n === 3) enterDelivery();\r\n      root.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n      saveDraft();\r\n    }\r\n    el.stepInd.forEach((s) => s.addEventListener('click', () => { const i = Number(s.dataset.stepInd); if (i < state.step) goTo(i); }));\r\n    $$('[data-back]', root).forEach((b) => b.addEventListener('click', () => goTo(state.step - 1)));\r\n\r\n    /* ---------- step 1: details ---------- */\r\n    el.shipSame.addEventListener('change', () => { el.shipFields.hidden = el.shipSame.checked; });\r\n\r\n    function fieldError(input, msg) {\r\n      const f = input.closest('.nmpq__field');\r\n      if (!f) return;\r\n      f.classList.toggle('is-invalid', !!msg);\r\n      let e = $('.nmpq__err', f);\r\n      if (msg) { if (!e) { e = document.createElement('span'); e.className = 'nmpq__err'; f.appendChild(e); } e.textContent = msg; } else if (e) e.remove();\r\n    }\r\n    function validateDetails() {\r\n      let ok = true; let first = null;\r\n      const check = (input, cond, msg) => { if (!cond) { fieldError(input, msg); ok = false; if (!first) first = input; } else fieldError(input, null); };\r\n      const f = el.details;\r\n      ['name', 'company'].forEach((n) => { const i = f.elements[n]; check(i, i.value.trim(), 'Required'); });\r\n      const em = f.elements.email; check(em, /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/.test(em.value.trim()), 'Enter a valid email');\r\n      if (f.elements.insuranceOn.checked) {\r\n        check(f.elements.ins_claim, f.elements.ins_claim.value.trim(), 'Enter the claim number');\r\n        const ie = f.elements.ins_email; check(ie, !ie.value.trim() || /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/.test(ie.value.trim()), 'Enter a valid email');\r\n      } else { fieldError(f.elements.ins_claim, null); fieldError(f.elements.ins_email, null); }\r\n      const groups = ['billing'].concat(el.shipSame.checked ? [] : ['shipping']);\r\n      groups.forEach((g) => {\r\n        $$(`[data-address-group=\"${g}\"] [data-req]`, f).forEach((i) => {\r\n          if (i.name.endsWith('_zip')) check(i, /^\\d{4}$/.test(i.value.trim()), '4-digit postcode');\r\n          else check(i, i.value.trim(), 'Required');\r\n        });\r\n      });\r\n      if (first) first.focus();\r\n      return ok;\r\n    }\r\n    function readAddress(prefix) {\r\n      const f = el.details.elements;\r\n      return {\r\n        address1: f[prefix + '_address1'].value.trim(), address2: f[prefix + '_address2'].value.trim(),\r\n        city: f[prefix + '_city'].value.trim(), province: f[prefix + '_province'].value, zip: f[prefix + '_zip'].value.trim(), country: 'AU'\r\n      };\r\n    }\r\n    function readDetails() {\r\n      const f = el.details.elements;\r\n      const billing = readAddress('billing');\r\n      const same = el.shipSame.checked;\r\n      const shipping = same ? Object.assign({}, billing) : readAddress('shipping');\r\n      shipping.attention = same ? '' : f.shipping_attention.value.trim();\r\n      shipping.phone = same ? '' : f.shipping_phone.value.trim();\r\n      return {\r\n        name: f.name.value.trim(), email: f.email.value.trim(), phone: f.phone.value.trim(), company: f.company.value.trim(),\r\n        abn: f.abn.value.trim(), reference: f.reference.value.trim(), billing, shipping, shippingSame: same,\r\n        insurance: f.insuranceOn.checked ? {\r\n          type: f.ins_type.value, claim: f.ins_claim.value.trim(), consultant: f.ins_consultant.value.trim(),\r\n          email: f.ins_email.value.trim(), phone: f.ins_phone.value.trim(), provider: f.ins_provider.value.trim()\r\n        } : null\r\n      };\r\n    }\r\n    function fillDetails(d) {\r\n      if (!d) return;\r\n      const f = el.details.elements;\r\n      ['name', 'email', 'phone', 'company', 'abn', 'reference'].forEach((k) => { if (f[k] && d[k] != null) f[k].value = d[k]; });\r\n      ['billing', 'shipping'].forEach((p) => {\r\n        const a = d[p] || {};\r\n        ['address1', 'address2', 'city', 'province', 'zip'].forEach((k) => { if (f[p + '_' + k] && a[k] != null) f[p + '_' + k].value = a[k]; });\r\n      });\r\n      el.shipSame.checked = d.shippingSame !== false;\r\n      el.shipFields.hidden = el.shipSame.checked;\r\n      if (d.shipping) { f.shipping_attention.value = d.shipping.attention || ''; f.shipping_phone.value = d.shipping.phone || ''; }\r\n      const ins = d.insurance;\r\n      f.insuranceOn.checked = !!ins;\r\n      if (ins) { f.ins_type.value = ins.type || f.ins_type.value; f.ins_claim.value = ins.claim || ''; f.ins_consultant.value = ins.consultant || ''; f.ins_email.value = ins.email || ''; f.ins_phone.value = ins.phone || ''; f.ins_provider.value = ins.provider || ''; }\r\n      $('[data-ins-fields]', root).hidden = !ins;\r\n    }\r\n    $('[data-ins-toggle]', root).addEventListener('change', (e) => { $('[data-ins-fields]', root).hidden = !e.target.checked; });\r\n    // insurance details as label/value rows (quote, PDF, emails, order attributes)\r\n    function insRows(d) {\r\n      const i = d && d.insurance; if (!i) return [];\r\n      return [['Claim type', i.type], ['Claim number', i.claim], ['Rehab consultant', i.consultant], ['Consultant email', i.email], ['Consultant phone', i.phone], ['Rehab provider', i.provider]].filter((r) => r[1]);\r\n    }\r\n    el.details.addEventListener('submit', (e) => {\r\n      e.preventDefault();\r\n      if (!validateDetails()) { notice('Please complete the highlighted fields.', 'error'); return; }\r\n      state.details = readDetails();\r\n      goTo(2);\r\n    });\r\n    el.details.addEventListener('input', (e) => { if (e.target.closest('.is-invalid')) fieldError(e.target, null); });\r\n\r\n    /* ---------- step 2: products ---------- */\r\n    // ?product=<handle> (from \"Request a quote\" on product pages) opens that product's options on step 2\r\n    // Items handed over from a product page (?variant=&qty=) or the cart (?items=vid:qty,...)\r\n    function applyIncoming(list) {\r\n      const inc = state.incoming; if (!inc) return;\r\n      state.incoming = null;\r\n      const find = (vid) => { for (const p of list) { const v = p.variants.find((x) => x.id === vid); if (v) return [p, v]; } return null; };\r\n      if (inc.items) state.items = [];\r\n      const added = [];\r\n      (inc.items || [[inc.variant, inc.qty]]).forEach(([vid, qty]) => {\r\n        const hit = find(vid); if (!hit) return;\r\n        addItem(hit[0], hit[1], Math.max(1, Math.min(999, qty || 1)));\r\n        added.push(hit[0].title);\r\n      });\r\n      if (!added.length) return;\r\n      state.pendingHandle = null; state.quote = null; state.delivery = null; state.rates = null;\r\n      renderLines(); saveDraft();\r\n      const what = added.length === 1 ? `<strong>${esc(added[0])}</strong> has` : `<strong>${added.length} items</strong> from your cart have`;\r\n      notice(`${what} been added to your quote. ${state.step === 1 ? 'Enter your details to continue.' : ''}`);\r\n    }\r\n    function openPending() {\r\n      if (!state.pendingHandle || !state.catalog) return;\r\n      const p = state.catalog.find((x) => x.handle === state.pendingHandle);\r\n      state.pendingHandle = null;\r\n      if (p) setTimeout(() => openConfigurator(p), 50);\r\n    }\r\n    loadCatalog().then((list) => {\r\n      state.catalog = list;\r\n      applyIncoming(list);\r\n      if (state.step === 2) openPending();\r\n      else if (state.pendingHandle && state.step === 1) {\r\n        const p = list.find((x) => x.handle === state.pendingHandle);\r\n        if (p) notice(`<strong>${esc(p.title)}</strong> will be ready to add once you\u2019ve entered your details.`);\r\n      }\r\n      el.catalogStatus.textContent = `${list.length} products available. Can't find something? Add a note and we'll include it.`;\r\n      repairItems();\r\n    }).catch(() => { el.catalogStatus.textContent = 'We could not load the catalogue. Please refresh the page or contact us.'; });\r\n\r\n    let activeIdx = -1;\r\n    function searchCatalog(q) {\r\n      const terms = q.toLowerCase().split(/\\s+/).filter(Boolean);\r\n      if (!terms.length || !state.catalog) return [];\r\n      return state.catalog.filter((p) => terms.every((t) => p.hay.includes(t)))\r\n        .sort((a, b) => (b.title.toLowerCase().startsWith(terms[0]) - a.title.toLowerCase().startsWith(terms[0])))\r\n        .slice(0, 12);\r\n    }\r\n    function priceRange(p) {\r\n      const prices = p.variants.map((v) => v.price);\r\n      const min = Math.min.apply(null, prices); const max = Math.max.apply(null, prices);\r\n      return min === max ? money(min) : 'From ' + money(min);\r\n    }\r\n    function renderResults() {\r\n      const q = el.search.value.trim();\r\n      if (!q) { el.results.hidden = true; return; }\r\n      if (!state.catalog) { el.results.innerHTML = '<div class=\"nmpq__catalog-empty\">Loading catalogue\u2026</div>'; el.results.hidden = false; return; }\r\n      const res = searchCatalog(q);\r\n      activeIdx = -1;\r\n      el.results.innerHTML = res.length ? res.map((p, i) => `\r\n        <button type=\"button\" class=\"nmpq__result\" data-pid=\"${p.id}\" data-idx=\"${i}\">\r\n          ${p.image ? `<img src=\"${esc(thumb(p.image, 120))}\" alt=\"\" loading=\"lazy\">` : '<span class=\"nmpq__thumb\"></span>'}\r\n          <span><b>${esc(p.title)}</b><small>${esc([p.vendor, p.type].filter(Boolean).join(' \u00B7 '))}${p.hasOptions ? ' \u00B7 ' + p.variants.length + ' options' : ''}</small></span>\r\n          <span>${priceRange(p)}</span>\r\n        </button>`).join('') : '<div class=\"nmpq__catalog-empty\">No matching products. Try a different word, or add it in the notes below.</div>';\r\n      el.results.hidden = false;\r\n    }\r\n    el.search.addEventListener('input', renderResults);\r\n    el.search.addEventListener('focus', renderResults);\r\n    el.search.addEventListener('keydown', (e) => {\r\n      const btns = $$('.nmpq__result', el.results);\r\n      if (!btns.length) return;\r\n      if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\r\n        e.preventDefault();\r\n        activeIdx = (activeIdx + (e.key === 'ArrowDown' ? 1 : -1) + btns.length) % btns.length;\r\n        btns.forEach((b, i) => b.classList.toggle('is-active', i === activeIdx));\r\n        btns[activeIdx].scrollIntoView({ block: 'nearest' });\r\n      } else if (e.key === 'Enter') {\r\n        e.preventDefault();\r\n        (btns[activeIdx] || btns[0]).click();\r\n      } else if (e.key === 'Escape') { el.results.hidden = true; }\r\n    });\r\n    document.addEventListener('click', (e) => { if (!e.target.closest('.nmpq__search')) el.results.hidden = true; });\r\n    el.results.addEventListener('click', (e) => {\r\n      const b = e.target.closest('[data-pid]');\r\n      if (!b) return;\r\n      const p = state.catalog.find((x) => String(x.id) === b.dataset.pid);\r\n      el.results.hidden = true;\r\n      el.search.value = '';\r\n      openConfigurator(p);\r\n    });\r\n\r\n    function findVariant(p, selected) {\r\n      return p.variants.find((v) => v.options.every((o, i) => o === selected[i])) || null;\r\n    }\r\n    // Reuse the product page's own option configurator (window.NmpeConfigurator) so options look and\r\n    // behave exactly as on the product listing. Falls back to simple dropdowns if it can't load.\r\n    async function loadNmpe(handle) {\r\n      const html = await fetch('/products/' + encodeURIComponent(handle), { credentials: 'same-origin' }).then((r) => r.text());\r\n      const d = new DOMParser().parseFromString(html, 'text/html');\r\n      const data = d.querySelector('[id^=\"nmpe-cfg-data-\"]');\r\n      if (!data) return null;\r\n      if (!document.getElementById('nmpq-nmpe-style')) {\r\n        const st = Array.from(d.querySelectorAll('style')).find((x) => /\\.nmpe-cfg\\s*\\{/.test(x.textContent));\r\n        if (st) { const n = document.createElement('style'); n.id = 'nmpq-nmpe-style'; n.textContent = st.textContent; document.head.appendChild(n); }\r\n      }\r\n      if (!window.NmpeConfigurator) {\r\n        const lib = Array.from(d.scripts).filter((x) => x.textContent.includes('NmpeConfigurator')).sort((a, b) => b.textContent.length - a.textContent.length)[0];\r\n        if (lib) { const n = document.createElement('script'); n.textContent = lib.textContent; document.head.appendChild(n); }\r\n      }\r\n      if (!window.NmpeConfigurator) return null;\r\n      return JSON.parse(data.textContent);\r\n    }\r\n    let cfgToken = 0;\r\n    function openConfigurator(p) {\r\n      const token = ++cfgToken;\r\n      const first = p.variants.find((v) => v.available) || p.variants[0];\r\n      const selected = first.options.slice();\r\n      const optHtml = p.hasOptions ? p.options.map((name, i) => {\r\n        const values = [...new Set(p.variants.map((v) => v.options[i]))];\r\n        return `<label>${esc(name)}<select data-opt=\"${i}\">${values.map((v) => `<option ${v === selected[i] ? 'selected' : ''}>${esc(v)}</option>`).join('')}</select></label>`;\r\n      }).join('') : '';\r\n      el.configurator.innerHTML = `\r\n        <img src=\"${esc(thumb(first.image || p.image, 240))}\" alt=\"\" data-cimg>\r\n        <div>\r\n          <p class=\"nmpq__config-title\">${esc(p.title)}</p>\r\n          <span class=\"nmpq__muted nmpq__small\">${esc([p.vendor, p.type].filter(Boolean).join(' \u00B7 '))} \u00B7 <a href=\"/products/${esc(p.handle)}\" target=\"_blank\" rel=\"noopener\">View product</a></span>\r\n          ${p.hasOptions ? '<div class=\"nmpq__nmpe\" data-nmpe><p class=\"nmpq__loading\"><span class=\"nmpq__spinner\"></span>Loading options\u2026</p></div><div hidden data-nmpe-scope></div>' : ''}\r\n          ${optHtml ? `<div class=\"nmpq__config-opts\" data-fallback hidden>${optHtml}</div>` : '<div style=\"height:12px\"></div>'}\r\n          <div class=\"nmpq__config-foot\">\r\n            <div class=\"nmpq__config-price\" data-cprice></div>\r\n            <label class=\"nmpq__field\"><span>Qty</span><input class=\"nmpq__qty\" type=\"number\" min=\"1\" step=\"1\" value=\"1\" data-cqty></label>\r\n            <button type=\"button\" class=\"button button--primary nmpq__btn\" data-cadd>Add to quote</button>\r\n            <button type=\"button\" class=\"nmpq__link\" data-cclose>Cancel</button>\r\n          </div>\r\n        </div>`;\r\n      el.configurator.hidden = false;\r\n      const update = () => {\r\n        const v = findVariant(p, selected);\r\n        const priceEl = $('[data-cprice]', el.configurator);\r\n        const add = $('[data-cadd]', el.configurator);\r\n        if (!v) { priceEl.innerHTML = '<small>This combination isn\u2019t available</small>\u2014'; add.disabled = true; return; }\r\n        add.disabled = false;\r\n        priceEl.innerHTML = `${money(v.price)}<small>${cfg.taxesIncluded ? 'incl. GST' : 'excl. GST'} \u00B7 ${v.available ? 'In stock / available' : 'Currently unavailable \u2014 lead time confirmed by our team'}</small>`;\r\n        if (v.image) $('[data-cimg]', el.configurator).src = thumb(v.image, 240);\r\n      };\r\n      $$('[data-opt]', el.configurator).forEach((s) => s.addEventListener('change', () => { selected[Number(s.dataset.opt)] = s.value; update(); }));\r\n      $('[data-cclose]', el.configurator).addEventListener('click', () => { el.configurator.hidden = true; });\r\n      $('[data-cadd]', el.configurator).addEventListener('click', () => {\r\n        const v = findVariant(p, selected);\r\n        const qty = Math.max(1, parseInt($('[data-cqty]', el.configurator).value, 10) || 1);\r\n        if (!v) return;\r\n        addItem(p, v, qty);\r\n        el.configurator.hidden = true;\r\n        el.search.focus();\r\n      });\r\n      update();\r\n      el.configurator.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n      if (!p.hasOptions) return;\r\n      const host = $('[data-nmpe]', el.configurator);\r\n      const scope = $('[data-nmpe-scope]', el.configurator);\r\n      const fallback = () => { if (token !== cfgToken) return; host.remove(); const fb = $('[data-fallback]', el.configurator); if (fb) fb.hidden = false; };\r\n      loadNmpe(p.handle).then((pc) => {\r\n        if (token !== cfgToken) return;\r\n        if (!pc || !pc.product) return fallback();\r\n        // hidden selects the configurator writes the chosen option values into\r\n        scope.innerHTML = pc.product.options.map((o) => {\r\n          const name = typeof o === 'string' ? o : o.name;\r\n          const vals = typeof o === 'string' ? [] : o.values;\r\n          return `<select name=\"options[${esc(name)}]\">${vals.map((v) => `<option>${esc(v)}</option>`).join('')}</select>`;\r\n        }).join('');\r\n        const url0 = location.href;\r\n        const read = () => {\r\n          p.options.forEach((name, i) => { const sel = scope.querySelector(`select[name=\"options[${CSS.escape(name)}]\"]`); if (sel && sel.value) selected[i] = sel.value; });\r\n          update();\r\n          if (location.href !== url0) history.replaceState(history.state, '', url0);\r\n        };\r\n        scope.addEventListener('change', read);\r\n        host.innerHTML = '';\r\n        try {\r\n          new window.NmpeConfigurator(host, pc.product, Object.assign({}, pc, { scope, shipping: false, selectedId: first.id }));\r\n        } catch (e) { console.warn('[nmp-quote] configurator failed', e); return fallback(); }\r\n        if (!host.querySelector('.nmpe-cfg__opt')) return fallback();\r\n        host.addEventListener('click', () => setTimeout(read, 0));\r\n        read();\r\n      }).catch(fallback);\r\n    }\r\n    function addItem(p, v, qty) {\r\n      const existing = state.items.find((i) => i.variantId === v.id);\r\n      if (existing) existing.qty += qty;\r\n      else state.items.push({\r\n        variantId: v.id, productId: p.id, handle: p.handle, title: p.title, variantTitle: p.hasOptions ? v.title : '',\r\n        sku: v.sku, price: v.price, qty, image: v.image || p.image, requiresShipping: v.requiresShipping, taxable: v.taxable, available: v.available, vendor: p.vendor\r\n      });\r\n      state.ratesSig = null;\r\n      renderLines();\r\n      saveDraft();\r\n    }\r\n    // refresh prices/availability of draft items against the live catalogue\r\n    function repairItems() {\r\n      if (!state.catalog || !state.items.length) return;\r\n      state.items.forEach((it) => {\r\n        const p = state.catalog.find((x) => x.id === it.productId);\r\n        const v = p && p.variants.find((x) => x.id === it.variantId);\r\n        if (v) { it.price = v.price; it.available = v.available; it.requiresShipping = v.requiresShipping; it.taxable = v.taxable; }\r\n      });\r\n      renderLines();\r\n    }\r\n    function renderLines() {\r\n      if (!state.items.length) { el.lines.innerHTML = '<div class=\"nmpq__empty\">No products yet \u2014 search above to add your first item.</div>'; return; }\r\n      const t = computeTotals(state.items, 0, cfg);\r\n      el.lines.innerHTML = `\r\n        <table class=\"nmpq__lines\">\r\n          <thead><tr><th>Item</th><th class=\"num\">Unit price</th><th class=\"num\">Qty</th><th class=\"num\">Total</th><th></th></tr></thead>\r\n          <tbody>${state.items.map((i, idx) => `\r\n            <tr>\r\n              <td><div class=\"nmpq__line-item\">${i.image ? `<img class=\"nmpq__thumb\" src=\"${esc(thumb(i.image, 120))}\" alt=\"\">` : ''}<div>${esc(i.title)}${i.variantTitle ? `<small>${esc(i.variantTitle)}</small>` : ''}${i.available === false ? '<span class=\"nmpq__flag\">Currently unavailable \u2014 lead time to be confirmed</span>' : ''}</div></div></td>\r\n              <td class=\"num unit\">${money(i.price)}</td>\r\n              <td class=\"num\"><input class=\"nmpq__qty\" type=\"number\" min=\"1\" step=\"1\" value=\"${i.qty}\" data-qty=\"${idx}\" aria-label=\"Quantity\"></td>\r\n              <td class=\"num\">${money(i.price * i.qty)}</td>\r\n              <td class=\"num\"><button type=\"button\" class=\"nmpq__remove\" data-remove=\"${idx}\" aria-label=\"Remove ${esc(i.title)}\">\u00D7</button></td>\r\n            </tr>`).join('')}\r\n          </tbody>\r\n          <tfoot><tr><td colspan=\"3\">Products subtotal ${cfg.taxesIncluded ? '(incl. GST)' : '(excl. GST)'}</td><td class=\"num\">${money(t.subtotal)}</td><td></td></tr></tfoot>\r\n        </table>`;\r\n    }\r\n    el.lines.addEventListener('change', (e) => {\r\n      const q = e.target.closest('[data-qty]');\r\n      if (!q) return;\r\n      const i = state.items[Number(q.dataset.qty)];\r\n      i.qty = Math.max(1, parseInt(q.value, 10) || 1);\r\n      state.ratesSig = null;\r\n      renderLines(); saveDraft();\r\n    });\r\n    el.lines.addEventListener('click', (e) => {\r\n      const r = e.target.closest('[data-remove]');\r\n      if (!r) return;\r\n      state.items.splice(Number(r.dataset.remove), 1);\r\n      state.ratesSig = null;\r\n      renderLines(); saveDraft();\r\n    });\r\n    el.notes.addEventListener('input', () => { state.notes = el.notes.value; saveDraft(); });\r\n    $('[data-next-products]', root).addEventListener('click', () => {\r\n      if (!state.items.length) { notice('Add at least one product to your quote.', 'error'); return; }\r\n      state.notes = el.notes.value.trim();\r\n      goTo(3);\r\n    });\r\n\r\n    /* ---------- step 3: delivery ---------- */\r\n    const addrLine = (a) => [a.address1, a.address2, a.city, (a.province || '') + ' ' + (a.zip || '')].filter((x) => x && x.trim()).join(', ');\r\n    function enterDelivery() {\r\n      const d = state.details;\r\n      el.shipTo.textContent = d ? addrLine(d.shipping) : '';\r\n      const sig = JSON.stringify([state.items.map((i) => [i.variantId, i.qty]), d && d.shipping.zip, d && d.shipping.province]);\r\n      if (sig !== state.ratesSig) { state.rates = null; if (state.delivery && state.delivery.method === 'ship') state.delivery = null; }\r\n      const m = state.delivery ? state.delivery.method : null;\r\n      el.methods.forEach((r) => { r.checked = r.value === m; });\r\n      onMethodChange();\r\n    }\r\n    function onMethodChange() {\r\n      const m = (el.methods.find((r) => r.checked) || {}).value;\r\n      if (el.pickupNote) el.pickupNote.hidden = m !== 'pickup';\r\n      if (m === 'pickup') {\r\n        state.delivery = { method: 'pickup', name: 'Pick up from ' + cfg.pickupName, price: 0, code: 'pickup' };\r\n        el.rates.hidden = true;\r\n      } else if (m === 'ship') {\r\n        el.rates.hidden = false;\r\n        if (!state.delivery || state.delivery.method !== 'ship') state.delivery = null;\r\n        if (state.rates) renderRates(); else calcRates();\r\n      } else {\r\n        state.delivery = null; el.rates.hidden = true;\r\n      }\r\n      el.nextDelivery.disabled = !state.delivery;\r\n    }\r\n    el.methods.forEach((r) => r.addEventListener('change', onMethodChange));\r\n    let calcToken = 0;\r\n    async function calcRates() {\r\n      const token = ++calcToken;\r\n      const d = state.details;\r\n      el.rates.innerHTML = '<div class=\"nmpq__loading\"><span class=\"nmpq__spinner\"></span>Calculating live freight to ' + esc(d.shipping.city + ' ' + d.shipping.zip) + '\u2026 this can take up to 20 seconds.</div>';\r\n      el.nextDelivery.disabled = true;\r\n      try {\r\n        const res = await fetchRates(state.items, d.shipping, (msg) => { if (token === calcToken) { const l = $('.nmpq__loading', el.rates); if (l) l.innerHTML = '<span class=\"nmpq__spinner\"></span>' + esc(msg); } });\r\n        if (token !== calcToken) return;\r\n        state.rates = res;\r\n      } catch (e) {\r\n        if (token !== calcToken) return;\r\n        state.rates = { rates: [], partial: true, error: true };\r\n      }\r\n      state.ratesSig = JSON.stringify([state.items.map((i) => [i.variantId, i.qty]), d.shipping.zip, d.shipping.province]);\r\n      renderRates();\r\n    }\r\n    function renderRates() {\r\n      const res = state.rates;\r\n      const opts = res.rates.slice();\r\n      const tbc = !opts.length || res.partial;\r\n      let html = '<div class=\"nmpq__rates\">';\r\n      if (res.error) html += '<p class=\"nmpq__muted nmpq__small\">We couldn\u2019t reach our freight calculator just now. You can retry, or choose \u201CFreight to be confirmed\u201D.</p>';\r\n      else if (!opts.length) html += '<p class=\"nmpq__muted nmpq__small\">We couldn\u2019t automatically price freight for this combination of items and address (some items ship direct from our suppliers). Choose \u201CFreight to be confirmed\u201D and our team will confirm the freight cost before you accept.</p>';\r\n      else if (res.partial) html += '<p class=\"nmpq__muted nmpq__small\">Some items couldn\u2019t be included in the live calculation. Choose a rate below \u2014 our team will confirm freight for the remaining items.</p>';\r\n      opts.forEach((r, i) => {\r\n        const days = (r.days ? `<small>Estimated ${r.days[0]}${r.days[1] && r.days[1] !== r.days[0] ? '\u2013' + r.days[1] : ''} business days</small>` : '') + (r.extra ? `<small>Includes ${money(r.extra)} delivery for your other items</small>` : '');\r\n        html += `<label class=\"nmpq__rate\"><input type=\"radio\" name=\"nmpq-rate-${root.dataset.sectionId}\" value=\"${i}\"><span class=\"nmpq__rate-name\">${esc(r.name)}${days}</span><span class=\"nmpq__rate-price\">${r.price === 0 ? 'Free' : money(r.price)}</span></label>`;\r\n      });\r\n      if (tbc) html += `<label class=\"nmpq__rate\"><input type=\"radio\" name=\"nmpq-rate-${root.dataset.sectionId}\" value=\"tbc\"><span class=\"nmpq__rate-name\">Freight to be confirmed<small>Our team will confirm the freight cost with you</small></span><span class=\"nmpq__rate-price\">TBC</span></label>`;\r\n      html += '<button type=\"button\" class=\"nmpq__link\" data-recalc>Recalculate</button></div>';\r\n      el.rates.innerHTML = html;\r\n      const cur = state.delivery && state.delivery.method === 'ship' ? state.delivery : null;\r\n      $$('input[type=radio]', el.rates).forEach((inp) => {\r\n        if (cur && ((inp.value === 'tbc' && cur.code === 'tbc') || (opts[inp.value] && opts[inp.value].code === cur.code))) inp.checked = true;\r\n        inp.addEventListener('change', () => {\r\n          if (inp.value === 'tbc') state.delivery = { method: 'ship', name: 'Freight to be confirmed', price: null, code: 'tbc' };\r\n          else { const r = opts[Number(inp.value)]; state.delivery = { method: 'ship', name: r.name, price: r.price, code: r.code, days: r.days }; }\r\n          el.nextDelivery.disabled = false;\r\n        });\r\n      });\r\n      $('[data-recalc]', el.rates).addEventListener('click', () => { state.rates = null; state.delivery = null; calcRates(); });\r\n      el.nextDelivery.disabled = !state.delivery;\r\n    }\r\n    el.nextDelivery.addEventListener('click', () => {\r\n      if (!state.delivery) return;\r\n      buildQuote();\r\n      goTo(4);\r\n    });\r\n\r\n    /* ---------- step 4: quote ---------- */\r\n    function newQuoteNo() {\r\n      const d = new Date();\r\n      const ymd = String(d.getFullYear()).slice(2) + String(d.getMonth() + 1).padStart(2, '0') + String(d.getDate()).padStart(2, '0');\r\n      const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';\r\n      let r = ''; const rnd = crypto.getRandomValues(new Uint8Array(4));\r\n      rnd.forEach((b) => { r += chars[b % chars.length]; });\r\n      return 'Q' + ymd + '-' + r;\r\n    }\r\n    function buildQuote() {\r\n      const now = new Date();\r\n      const prev = state.quote;\r\n      const base = prev ? prev.base : newQuoteNo();\r\n      const rev = prev ? prev.rev + 1 : 1;\r\n      const valid = new Date(now.getTime() + cfg.validDays * 86400000);\r\n      const totals = computeTotals(state.items, state.delivery.price, cfg);\r\n      state.quote = {\r\n        v: 1, base, rev, no: base + (rev > 1 ? '-R' + rev : ''),\r\n        created: now.toISOString(), validUntil: valid.toISOString(),\r\n        details: state.details, items: state.items.map((i) => Object.assign({}, i)), delivery: Object.assign({}, state.delivery),\r\n        notes: state.notes, totals, taxesIncluded: cfg.taxesIncluded\r\n      };\r\n      const all = store.get(LS_QUOTES, {});\r\n      all[state.quote.no] = state.quote;\r\n      const keys = Object.keys(all).sort((a, b) => new Date(all[b].created) - new Date(all[a].created));\r\n      keys.slice(20).forEach((k) => delete all[k]);\r\n      store.set(LS_QUOTES, all);\r\n      renderDoc(state.quote, el.doc);\r\n      state.quoteSync = syncQuote(state.quote);\r\n    }\r\n    function persistQuote(q) {\r\n      const all = store.get(LS_QUOTES, {}); all[q.no] = q; store.set(LS_QUOTES, all); saveDraft();\r\n    }\r\n    // Save the quote as a Shopify draft order (emails info@ via the backend); fall back to contact form\r\n    async function syncQuote(q) {\r\n      if (!cfg.draftApi) { notifyStore(q); return; }\r\n      try {\r\n        const ctrl = new AbortController(); const tm = setTimeout(() => ctrl.abort(), 20000);\r\n        const payload = Object.assign({}, q); delete payload._notified;\r\n        const r = await fetch(cfg.draftApi.replace(/\\/$/, '') + '/quote', { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify(payload), signal: ctrl.signal });\r\n        clearTimeout(tm);\r\n        const j = await r.json();\r\n        if (!j.ok) throw new Error(j.error || 'draft failed');\r\n        q.draftId = j.draftId; q.draftName = j.draftName;\r\n        if (!j.emailed) notifyStore(q);\r\n        persistQuote(q);\r\n        if (state.quote === q) renderDoc(q, el.doc);\r\n      } catch (e) {\r\n        console.warn('[nmp-quote] draft order not created', e);\r\n        notifyStore(q);\r\n      }\r\n    }\r\n    // Shipping line: title + (carrier if specific) + delivery address\r\n    function shipInfo(q) {\r\n      const d = q.delivery || {};\r\n      if (d.method === 'pickup') return { title: 'Pick up', lines: [cfg.pickupName + ', ' + cfg.pickupAddress] };\r\n      const lines = [];\r\n      if (d.name && !/^shipping$/i.test(d.name)) lines.push(d.name);\r\n      const s = q.details && q.details.shipping;\r\n      if (s) lines.push([s.attention, s.address1, s.address2, `${s.city} ${s.province} ${s.zip}`].filter((x) => x && String(x).trim()).join(', '));\r\n      return { title: 'Shipping', lines };\r\n    }\r\n    const productUrl = (i) => cfg.storeUrl.replace(/\\/$/, '') + '/products/' + i.handle + (i.variantId ? '?variant=' + i.variantId : '');\r\n    function acceptLink(q) {\r\n      const compact = { n: q.no, x: q.draftId || undefined, c: q.created, u: q.validUntil, i: q.items.map((i) => [i.variantId, i.qty, i.price]), d: [q.delivery.method, q.delivery.name, q.delivery.price], t: q.totals.total };\r\n      return cfg.pageUrl + '?accept=' + b64urlEncode(JSON.stringify(compact));\r\n    }\r\n    function deliveryBlock(q) {\r\n      const d = q.details;\r\n      if (q.delivery.method === 'pickup') return `<strong>Pick up</strong><br>${esc(cfg.pickupName)}<br>${esc(cfg.pickupAddress)}`;\r\n      const s = d.shipping;\r\n      return `${s.attention ? esc(s.attention) + '<br>' : ''}${esc(d.company)}<br>${esc(s.address1)}${s.address2 ? '<br>' + esc(s.address2) : ''}<br>${esc(s.city)} ${esc(s.province)} ${esc(s.zip)}${s.phone ? '<br>' + esc(s.phone) : ''}`;\r\n    }\r\n    function renderDoc(q, target) {\r\n      const d = q.details; const t = q.totals;\r\n      const b = d.billing;\r\n      const link = acceptLink(q);\r\n      target.innerHTML = `\r\n        <div class=\"nmpq-q__head\">\r\n          <div class=\"nmpq-q__brand\">\r\n            ${cfg.logoUrl ? `<img src=\"${esc(cfg.logoUrl)}\" alt=\"${esc(cfg.shopName)}\">` : `<div class=\"nmpq-q__brand-name\">${esc(cfg.shopName)}</div>`}\r\n            <p>${cfg.abn ? 'ABN ' + esc(cfg.abn) + '<br>' : ''}${esc(cfg.pickupAddress)}<br>${esc(cfg.phone)} \u00B7 ${esc(cfg.email)}<br>${esc(cfg.storeUrl.replace(/^https?:\\/\\//, ''))}</p>\r\n          </div>\r\n          <div class=\"nmpq-q__meta\">\r\n            <h2>QUOTE</h2>${q.draftName ? `<p class=\"nmpq-q__ref\">Reference ${esc(q.draftName)}</p>` : ''}\r\n            <table>\r\n              <tr><td>Quote no.</td><td><strong>${esc(q.no)}</strong></td></tr>\r\n              <tr><td>Date</td><td>${fmtDate(q.created)}</td></tr>\r\n              <tr><td>Valid until</td><td>${fmtDate(q.validUntil)}</td></tr>\r\n              ${d.reference ? `<tr><td>Your ref.</td><td>${esc(d.reference)}</td></tr>` : ''}\r\n            </table>\r\n          </div>\r\n        </div>\r\n        <div class=\"nmpq-q__parties\">\r\n          <div><h4>Prepared for</h4><p><strong>${esc(d.name)}</strong><br>${esc(d.company)}${d.abn ? '<br>ABN ' + esc(d.abn) : ''}<br>${esc(d.email)}${d.phone ? '<br>' + esc(d.phone) : ''}</p></div>\r\n          <div><h4>Bill to</h4><p>${esc(d.company)}<br>${esc(b.address1)}${b.address2 ? '<br>' + esc(b.address2) : ''}<br>${esc(b.city)} ${esc(b.province)} ${esc(b.zip)}<br>Australia</p></div>\r\n          <div><h4>${q.delivery.method === 'pickup' ? 'Collection' : 'Ship to'}</h4><p>${deliveryBlock(q)}</p></div>\r\n        </div>\r\n        ${insRows(d).length ? `<div class=\"nmpq-q__ins\"><h4>Insurance claim</h4><dl>${insRows(d).map((r) => `<div><dt>${esc(r[0])}</dt><dd>${esc(r[1])}</dd></div>`).join('')}</dl></div>` : ''}\r\n        <table class=\"nmpq-q__table\">\r\n          <thead><tr><th style=\"width:32px\">#</th><th style=\"width:64px\"></th><th>Product</th><th class=\"num\">Qty</th><th class=\"num\">Unit price</th><th class=\"num\">Amount</th></tr></thead>\r\n          <tbody>\r\n            ${q.items.map((i, n) => `<tr><td>${n + 1}</td><td>${i.image ? `<a href=\"${esc(productUrl(i))}\" target=\"_blank\" rel=\"noopener\"><img class=\"nmpq-q__img\" src=\"${esc(thumb(i.image, 160))}\" alt=\"\"></a>` : ''}</td><td>${i.handle ? `<a class=\"nmpq-q__plink\" href=\"${esc(productUrl(i))}\" target=\"_blank\" rel=\"noopener\"><strong>${esc(i.title)}</strong></a>` : `<strong>${esc(i.title)}</strong>`}${i.variantTitle ? `<small>${esc(i.variantTitle)}</small>` : ''}</td><td class=\"num\">${i.qty}</td><td class=\"num\">${money(i.price)}</td><td class=\"num\">${money(i.price * i.qty)}</td></tr>`).join('')}\r\n            <tr class=\"is-freight\"><td></td><td></td><td><strong>${esc(shipInfo(q).title)}</strong>${shipInfo(q).lines.map((l) => `<small>${esc(l)}</small>`).join('')}</td><td class=\"num\">1</td><td class=\"num\">${money(q.delivery.price)}</td><td class=\"num\">${money(q.delivery.price)}</td></tr>\r\n          </tbody>\r\n        </table>\r\n        <table class=\"nmpq-q__totals\">\r\n          <tr><td>Products</td><td>${money(t.subtotal)}</td></tr>\r\n          <tr><td>${q.delivery.method === 'pickup' ? 'Pick up' : 'Shipping'}</td><td>${q.delivery.price == null ? 'TBC' : money(t.freight)}</td></tr>\r\n          ${q.taxesIncluded ? '' : `<tr><td>GST (10%)</td><td>${money(t.gst)}</td></tr>`}\r\n          <tr class=\"is-grand\"><td>Total AUD${q.delivery.price == null ? ' (excl. shipping)' : ''}</td><td>${money(t.total)}</td></tr>\r\n          ${q.taxesIncluded ? `<tr class=\"is-sub\"><td>Includes GST of</td><td>${money(t.gst)}</td></tr>` : ''}\r\n        </table>\r\n        <div class=\"nmpq-q__foot\">\r\n          <div>\r\n            ${q.notes ? `<h4>Notes</h4><p>${esc(q.notes).replace(/\\n/g, '<br>')}</p>` : ''}\r\n            ${cfg.paymentTerms ? `<h4>Payment</h4><p>${esc(cfg.paymentTerms)}</p>` : ''}\r\n          </div>\r\n          <div><h4>Terms</h4><p>${esc(cfg.quoteTerms)}</p><p>Returns, exchanges &amp; warranties: <a href=\"${esc(cfg.storeUrl)}/pages/returns-exchanges-warranties\" target=\"_blank\" rel=\"noopener\">view policy</a> \u00B7 <a href=\"${esc(cfg.storeUrl)}/pages/warranty\" target=\"_blank\" rel=\"noopener\">warranty information</a></p></div>\r\n        </div>\r\n        <div class=\"nmpq-q__accept\"><strong>To accept this quote</strong>, visit the link below, enter your purchase order number and upload your PO \u2014 or upload this PDF at ${esc(cfg.pageUrl.replace(/^https?:\\/\\//, ''))}.<br><a href=\"${esc(link)}\">Accept quote ${esc(q.no)} online \u2192</a></div>`;\r\n    }\r\n    function quoteText(q) {\r\n      const d = q.details;\r\n      const lines = q.items.map((i) => `- ${i.qty} x ${i.title}${i.variantTitle ? ' (' + i.variantTitle + ')' : ''}${i.sku ? ' [' + i.sku + ']' : ''} @ ${money(i.price)} = ${money(i.price * i.qty)}`);\r\n      return [\r\n        `New quote ${q.no} generated on the website`, '',\r\n        `Name: ${d.name}`, `Company: ${d.company}${d.abn ? ' (ABN ' + d.abn + ')' : ''}`, `Email: ${d.email}`, `Phone: ${d.phone || '-'}`, d.reference ? `Reference: ${d.reference}` : '',\r\n        ...insRows(d).map((r) => `${r[0]}: ${r[1]}`),\r\n        `Billing: ${addrLine(d.billing)}`, `Delivery: ${q.delivery.method === 'pickup' ? 'Pick up \u2013 ' + cfg.pickupName : addrLine(d.shipping)}`, '',\r\n        'Items:', ...lines, '',\r\n        `Freight: ${q.delivery.name} \u2013 ${money(q.delivery.price)}`,\r\n        `Total: ${money(q.totals.total)} ${q.taxesIncluded ? '(incl. GST ' + money(q.totals.gst) + ')' : ''}`,\r\n        `Valid until: ${fmtDate(q.validUntil)}`, q.notes ? `\\nCustomer notes: ${q.notes}` : '', '',\r\n        `Accept link: ${acceptLink(q)}`\r\n      ].filter((x) => x !== null).join('\\n');\r\n    }\r\n    async function notifyStore(q) {\r\n      if (!cfg.notifyStore || q._notified) return;\r\n      q._notified = true;\r\n      try {\r\n        const fd = new FormData();\r\n        fd.append('form_type', 'contact'); fd.append('utf8', '\u2713');\r\n        fd.append('contact[name]', q.details.name);\r\n        fd.append('contact[email]', q.details.email);\r\n        fd.append('contact[phone]', q.details.phone || '');\r\n        fd.append('contact[Company]', q.details.company);\r\n        fd.append('contact[Quote number]', q.no);\r\n        fd.append('contact[Quote total]', money(q.totals.total));\r\n        fd.append('contact[body]', quoteText(q));\r\n        await fetch('/contact', { method: 'POST', body: fd, credentials: 'same-origin' });\r\n      } catch (e) { /* best effort */ }\r\n    }\r\n\r\n    /* ---------- PDF ---------- */\r\n    const pdfSafe = (s) => String(s == null ? '' : s)\r\n      .replace(/[\u2013\u2014]/g, '-').replace(/[\u2018\u2019]/g, \"'\").replace(/[\u201C\u201D]/g, '\"')\r\n      .replace(/\u2122/g, '').replace(/\u00AE/g, '(R)').replace(/\u2026/g, '...').replace(/\u00D7/g, 'x').replace(/\u2192/g, '->')\r\n      .replace(/[^\\x00-\\xFF]/g, '');\r\n    // Load an image (CORS-enabled Shopify CDN) and flatten it onto a white square canvas\r\n    function imageToData(url, size, opts) {\r\n      opts = opts || {};\r\n      return new Promise((resolve) => {\r\n        if (!url) return resolve(null);\r\n        const img = new Image();\r\n        img.crossOrigin = 'anonymous';\r\n        img.onload = () => {\r\n          try {\r\n            const ratio = img.naturalWidth / img.naturalHeight;\r\n            const W = opts.keepRatio ? Math.round(size * Math.min(ratio, 4)) : size;\r\n            const H = opts.keepRatio ? Math.round(W / ratio) : size;\r\n            const c = document.createElement('canvas'); c.width = W; c.height = H;\r\n            const x = c.getContext('2d');\r\n            if (!opts.transparent) { x.fillStyle = '#ffffff'; x.fillRect(0, 0, W, H); }\r\n            const s = Math.min(W / img.naturalWidth, H / img.naturalHeight);\r\n            const w = img.naturalWidth * s; const h = img.naturalHeight * s;\r\n            x.drawImage(img, (W - w) / 2, (H - h) / 2, w, h);\r\n            resolve({ data: c.toDataURL(opts.transparent ? 'image/png' : 'image/jpeg', 0.88), w: W, h: H, fmt: opts.transparent ? 'PNG' : 'JPEG' });\r\n          } catch (e) { resolve(null); }\r\n        };\r\n        img.onerror = () => resolve(null);\r\n        const u = url.startsWith('//') ? 'https:' + url : url;\r\n        img.src = u + (u.includes('?') ? '&' : '?') + 'width=' + (opts.fetchWidth || 300);\r\n      });\r\n    }\r\n    // Pull the rich product information shown on each product listing (selling points, best for,\r\n    // when to recommend, dimensions, specifications, images) for the PDF's product pages.\r\n    const detailCache = {};\r\n    function productDetails(handle) {\r\n      if (!handle) return Promise.resolve(null);\r\n      if (!detailCache[handle]) {\r\n        detailCache[handle] = fetch('/products/' + encodeURIComponent(handle), { credentials: 'same-origin' }).then((r) => r.text()).then((html) => {\r\n          const d = new DOMParser().parseFromString(html, 'text/html');\r\n          const txt = (e) => (e ? e.textContent.replace(/\\s+/g, ' ').trim() : '');\r\n          let meta = {}; let product = null;\r\n          const data = d.querySelector('[id^=\"nmpe-cfg-data-\"]');\r\n          if (data) { try { const j = JSON.parse(data.textContent); meta = j.meta || {}; product = j.product; } catch (e) { /* ignore */ } }\r\n          const dimsEl = d.querySelector('[data-nmhp-dims]');\r\n          const dims = dimsEl ? dimsEl.innerHTML.split(/<br\\s*\\/?>/i).map((x) => x.replace(/<[^>]+>/g, '').replace(/&amp;/g, '&').replace(/\\s+/g, ' ').trim()).filter(Boolean) : [];\r\n          const wtr = Array.from(d.querySelectorAll('[data-nmhp-wtr] p, [data-nmhp-wtr] li')).map(txt).filter(Boolean);\r\n          const seen = {}; const specs = [];\r\n          d.querySelectorAll('.nmpe-pd__spec').forEach((sp) => {\r\n            const l = txt(sp.querySelector('.nmpe-pd__spec-label')); const v = txt(sp).replace(l, '').trim();\r\n            const key = l + '|' + v; if (l && v && !seen[key]) { seen[key] = 1; specs.push([l, v]); }\r\n          });\r\n          const chips = Array.from(d.querySelectorAll('.nmtop__chip')).map(txt).filter((c) => /warrant/i.test(c));\r\n          const lead = txt(d.querySelector('.nmpe-pd__eyebrow')) || txt(d.querySelector('.nmpe-pd__lead'));\r\n          const images = product && product.images ? product.images.slice(0, 4).map((u) => (typeof u === 'string' ? u : u.src)) : [];\r\n          return { points: meta.points || [], bestFor: meta.bestFor || '', bestSeller: !!meta.bestSeller, dims, wtr, specs, chips, lead, images };\r\n        }).catch(() => null);\r\n      }\r\n      return detailCache[handle];\r\n    }\r\n    async function downloadPdf(q, btn) {\r\n      const label = btn ? btn.textContent : '';\r\n      if (btn) { btn.disabled = true; btn.textContent = 'Preparing PDF\u2026'; }\r\n      try {\r\n        await loadScript(JSPDF);\r\n        await loadScript(AUTOTABLE);\r\n        const { jsPDF } = window.jspdf;\r\n        const doc = new jsPDF({ unit: 'mm', format: 'a4', compress: true });\r\n        const W = 210; const H = 297; const M = 15; const R = W - M;\r\n        const d = q.details; const t = q.totals;\r\n        // Brand palette (No More Pain Ergonomics)\r\n        const TEAL = [14, 59, 59]; const GREEN = [149, 198, 134]; const SAGE = [173, 196, 194];\r\n        const SAGE_LT = [239, 244, 243]; const GREEN_LT = [234, 244, 231]; const INK = [24, 33, 33]; const GREY = [96, 110, 110];\r\n        const money2 = (c) => pdfSafe(money(c));\r\n        const site = cfg.storeUrl.replace(/^https?:\\/\\//, '');\r\n\r\n        const [logo, ...thumbs] = await Promise.all([\r\n          imageToData(cfg.logoUrl, 320, { keepRatio: true, transparent: true, fetchWidth: 400 }),\r\n          ...q.items.map((i) => imageToData(i.image, 180))\r\n        ]);\r\n        const details = await Promise.all(q.items.map((i) => productDetails(i.handle)));\r\n        const detailImgs = await Promise.all(q.items.map((i, k) => {\r\n          const d0 = details[k]; const urls = [i.image].concat(d0 && d0.images ? d0.images : []).filter(Boolean);\r\n          const uniq = urls.filter((u, x) => urls.findIndex((v) => String(v).split('?')[0] === String(u).split('?')[0]) === x).slice(0, 3);\r\n          return Promise.all(uniq.map((u, x) => imageToData(u, x ? 220 : 480, { fetchWidth: x ? 300 : 600 })));\r\n        }));\r\n\r\n        // ---- Header: logo + business details | QUOTE\r\n        doc.setFillColor(...TEAL); doc.rect(0, 0, W, 4, 'F');\r\n        doc.setFillColor(...GREEN); doc.rect(0, 4, W, 1.2, 'F');\r\n        let y = 13;\r\n        let brandRight = M;\r\n        if (logo) {\r\n          let lh = 22; let lw = lh * (logo.w / logo.h);\r\n          if (lw > 60) { lw = 60; lh = lw * (logo.h / logo.w); }\r\n          doc.addImage(logo.data, logo.fmt, M, y, lw, lh);\r\n          brandRight = M + lw + 5;\r\n        }\r\n        doc.setFont('helvetica', 'bold'); doc.setFontSize(13); doc.setTextColor(...TEAL);\r\n        doc.text(pdfSafe(cfg.shopName), brandRight, y + 5);\r\n        doc.setFont('helvetica', 'normal'); doc.setFontSize(8.3); doc.setTextColor(...GREY);\r\n        const fromLines = [cfg.abn ? 'ABN ' + cfg.abn : null, cfg.pickupAddress, cfg.phone, cfg.email, site].filter(Boolean).map(pdfSafe);\r\n        doc.text(fromLines, brandRight, y + 10, { lineHeightFactor: 1.35 });\r\n\r\n        doc.setFont('helvetica', 'bold'); doc.setFontSize(26); doc.setTextColor(...TEAL);\r\n        doc.text('QUOTE', R, y + 8, { align: 'right' });\r\n        doc.setFont('helvetica', 'normal'); doc.setFontSize(9); doc.setTextColor(...GREY);\r\n        doc.text(q.draftName ? 'Reference ' + pdfSafe(q.draftName) : 'Formal quotation', R, y + 14, { align: 'right' });\r\n        y = Math.max(y + 10 + fromLines.length * 4, logo ? y + 24 : y + 18) + 4;\r\n\r\n        // ---- Meta strip (teal)\r\n        const meta = [['QUOTE NO.', q.no], ['DATE', fmtDate(q.created)], ['VALID UNTIL', fmtDate(q.validUntil)], ['YOUR REF.', d.reference || '-']];\r\n        doc.setFillColor(...TEAL); doc.roundedRect(M, y, R - M, 15, 2, 2, 'F');\r\n        const mw = (R - M) / meta.length;\r\n        meta.forEach((m, i) => {\r\n          const x = M + 6 + i * mw;\r\n          doc.setFont('helvetica', 'bold'); doc.setFontSize(6.8); doc.setTextColor(...SAGE); doc.text(m[0], x, y + 5.8);\r\n          doc.setFont('helvetica', 'bold'); doc.setFontSize(9.8); doc.setTextColor(255, 255, 255); doc.text(pdfSafe(m[1]), x, y + 11);\r\n        });\r\n        y += 21;\r\n\r\n        // ---- Parties (sage boxes)\r\n        const gap = 5; const colW = (R - M - gap * 2) / 3;\r\n        const b = d.billing; const s = d.shipping;\r\n        const cols = [\r\n          ['PREPARED FOR', [d.name, d.company, d.abn ? 'ABN ' + d.abn : null, d.email, d.phone].filter(Boolean)],\r\n          ['BILL TO', [d.company, b.address1, b.address2, `${b.city} ${b.province} ${b.zip}`, 'Australia'].filter(Boolean)],\r\n          q.delivery.method === 'pickup'\r\n            ? ['COLLECTION', ['Pick up from', cfg.pickupName, cfg.pickupAddress]]\r\n            : ['DELIVER TO', [s.attention, d.company, s.address1, s.address2, `${s.city} ${s.province} ${s.zip}`, s.phone].filter(Boolean)]\r\n        ];\r\n        doc.setFontSize(8.8);\r\n        const colLines = cols.map((c) => c[1].reduce((acc, l) => acc.concat(doc.splitTextToSize(pdfSafe(l), colW - 8)), []));\r\n        const boxH = 10 + Math.max(...colLines.map((l) => l.length)) * 4.1;\r\n        cols.forEach((c, i) => {\r\n          const x = M + i * (colW + gap);\r\n          doc.setFillColor(...SAGE_LT); doc.roundedRect(x, y, colW, boxH, 2, 2, 'F');\r\n          doc.setFillColor(...GREEN); doc.rect(x, y + 2, 1.1, boxH - 4, 'F');\r\n          doc.setFont('helvetica', 'bold'); doc.setFontSize(6.8); doc.setTextColor(...GREY); doc.text(c[0], x + 4.5, y + 6);\r\n          doc.setFont('helvetica', 'normal'); doc.setFontSize(8.8); doc.setTextColor(...INK);\r\n          colLines[i].forEach((ln, k) => { if (k === 0) doc.setFont('helvetica', 'bold'); else doc.setFont('helvetica', 'normal'); doc.text(ln, x + 4.5, y + 11 + k * 4.1); });\r\n        });\r\n        y += boxH + 5;\r\n        const ir = insRows(d);\r\n        if (ir.length) {\r\n          const cw = (R - M - 8) / 3; const rowsN = Math.ceil(ir.length / 3); const ih = 9 + rowsN * 8.5;\r\n          doc.setFillColor(...GREEN_LT); doc.roundedRect(M, y, R - M, ih, 2, 2, 'F');\r\n          doc.setFillColor(...GREEN); doc.rect(M, y + 2, 1.1, ih - 4, 'F');\r\n          doc.setFont('helvetica', 'bold'); doc.setFontSize(6.8); doc.setTextColor(...TEAL); doc.text('INSURANCE CLAIM', M + 4.5, y + 5.5);\r\n          ir.forEach((r, k) => {\r\n            const cx = M + 4.5 + (k % 3) * cw; const cy = y + 10.5 + Math.floor(k / 3) * 8.5;\r\n            doc.setFont('helvetica', 'normal'); doc.setFontSize(6.8); doc.setTextColor(...GREY); doc.text(pdfSafe(r[0]).toUpperCase(), cx, cy);\r\n            doc.setFont('helvetica', 'bold'); doc.setFontSize(8.6); doc.setTextColor(...INK); doc.text(doc.splitTextToSize(pdfSafe(r[1]), cw - 4)[0], cx, cy + 4);\r\n          });\r\n          y += ih + 5;\r\n        }\r\n\r\n        // ---- Items table with product images\r\n        const IMG = 16;\r\n        const body = q.items.map((i, n) => [\r\n          String(n + 1), '',\r\n          { content: pdfSafe(i.title) + (i.variantTitle ? '\\n' + pdfSafe(i.variantTitle) : ''), _title: true, _url: i.handle ? productUrl(i) : null },\r\n          String(i.qty), money2(i.price), money2(i.price * i.qty)\r\n        ]);\r\n        const si = shipInfo(q);\r\n        body.push(['', '', { content: [si.title].concat(si.lines).map(pdfSafe).join('\\n'), _title: true }, '1', money2(q.delivery.price), money2(q.delivery.price)]);\r\n        doc.autoTable({\r\n          startY: y, margin: { left: M, right: M, bottom: 22 },\r\n          head: [['#', '', 'Product', 'Qty', 'Unit price', 'Amount']], body,\r\n          theme: 'plain',\r\n          styles: { font: 'helvetica', fontSize: 8.6, textColor: INK, cellPadding: { top: 3, bottom: 3, left: 2.4, right: 2.4 }, valign: 'middle', lineColor: [221, 230, 229], lineWidth: { bottom: 0.25 } },\r\n          headStyles: { fillColor: TEAL, textColor: [255, 255, 255], fontStyle: 'bold', fontSize: 8, valign: 'middle', cellPadding: { top: 3.2, bottom: 3.2, left: 2.4, right: 2.4 } },\r\n          alternateRowStyles: { fillColor: [248, 250, 250] },\r\n          columnStyles: { 0: { cellWidth: 8, textColor: GREY }, 1: { cellWidth: IMG + 4, minCellHeight: IMG + 4 }, 3: { cellWidth: 13, halign: 'right' }, 4: { cellWidth: 26, halign: 'right' }, 5: { cellWidth: 27, halign: 'right', fontStyle: 'bold' } },\r\n          didParseCell: (data) => {\r\n            if (data.section === 'head' && data.column.index >= 3) data.cell.styles.halign = 'right';\r\n            if (data.section === 'body' && data.row.index === q.items.length) { data.cell.styles.fillColor = GREEN_LT; data.cell.styles.minCellHeight = 0; }\r\n          },\r\n          didDrawCell: (data) => {\r\n            if (data.section !== 'body') return;\r\n            if (data.column.index === 1 && data.row.index < q.items.length) {\r\n              const th = thumbs[data.row.index];\r\n              const cx = data.cell.x + 2; const cy = data.cell.y + (data.cell.height - IMG) / 2;\r\n              doc.setDrawColor(221, 230, 229); doc.setLineWidth(0.2); doc.roundedRect(cx, cy, IMG, IMG, 1.2, 1.2, 'S');\r\n              if (th) doc.addImage(th.data, 'JPEG', cx + 0.6, cy + 0.6, IMG - 1.2, IMG - 1.2);\r\n              const it = q.items[data.row.index];\r\n              if (it && it.handle) doc.link(cx, cy, IMG, IMG, { url: productUrl(it) });\r\n            }\r\n            if (data.column.index === 2 && data.cell.raw && data.cell.raw._url) {\r\n              doc.link(data.cell.x, data.cell.y, data.cell.width, data.cell.height, { url: data.cell.raw._url });\r\n            }\r\n            if (data.column.index === 2 && data.cell.raw && data.cell.raw._title) {\r\n              // re-draw first line (product name) in bold teal\r\n              const first = data.cell.text[0];\r\n              const pad = data.cell.padding('left');\r\n              const lh = data.cell.styles.fontSize * 0.3528 * 1.15;\r\n              const textH = data.cell.text.length * lh;\r\n              const ty = data.cell.y + (data.cell.height - textH) / 2 + lh * 0.78;\r\n              doc.setFillColor(...(data.row.index === q.items.length ? GREEN_LT : (data.row.index % 2 ? [248, 250, 250] : [255, 255, 255])));\r\n              doc.rect(data.cell.x + pad - 0.2, ty - lh * 0.8, doc.getTextWidth(first) + 0.6, lh, 'F');\r\n              doc.setFont('helvetica', 'bold'); doc.setTextColor(...TEAL); doc.text(first, data.cell.x + pad, ty);\r\n              doc.setFont('helvetica', 'normal'); doc.setTextColor(...INK);\r\n            }\r\n          }\r\n        });\r\n        y = doc.lastAutoTable.finalY + 5;\r\n\r\n        // ---- Totals\r\n        if (y > H - 85) { doc.addPage(); y = 20; }\r\n        const tx = R - 82; const tw = R - tx;\r\n        const rows = [['Products', money2(t.subtotal)], [q.delivery.method === 'pickup' ? 'Pick up' : 'Shipping', q.delivery.price == null ? 'TBC' : money2(t.freight)]];\r\n        if (!q.taxesIncluded) rows.push(['GST', money2(t.gst)]);\r\n        doc.setFontSize(9);\r\n        rows.forEach((r) => { doc.setFont('helvetica', 'normal'); doc.setTextColor(...GREY); doc.text(r[0], tx + 4, y); doc.setTextColor(...INK); doc.text(r[1], R - 4, y, { align: 'right' }); y += 6; });\r\n        doc.setFillColor(...TEAL); doc.roundedRect(tx, y - 2, tw, 12, 2, 2, 'F');\r\n        doc.setFont('helvetica', 'bold'); doc.setFontSize(10.5); doc.setTextColor(255, 255, 255);\r\n        doc.text('TOTAL AUD' + (q.delivery.price == null ? ' (excl. shipping)' : ''), tx + 4, y + 5.6);\r\n        doc.setFontSize(13); doc.text(money2(t.total), R - 4, y + 5.8, { align: 'right' });\r\n        y += 15;\r\n        doc.setFont('helvetica', 'normal'); doc.setFontSize(8); doc.setTextColor(...GREY);\r\n        if (q.taxesIncluded) { doc.text('Includes GST of ' + money2(t.gst), R - 4, y, { align: 'right' }); y += 5; }\r\n\r\n        // ---- Notes / payment / terms\r\n        y += 2;\r\n        const block = (title, text) => {\r\n          if (!text) return;\r\n          doc.setFontSize(8.3);\r\n          const lines = doc.splitTextToSize(pdfSafe(text), R - M);\r\n          if (y + 8 + lines.length * 3.8 > H - 20) { doc.addPage(); y = 20; }\r\n          doc.setFont('helvetica', 'bold'); doc.setFontSize(7); doc.setTextColor(...TEAL); doc.text(title, M, y);\r\n          doc.setDrawColor(...GREEN); doc.setLineWidth(0.6); doc.line(M, y + 1.4, M + 10, y + 1.4);\r\n          doc.setFont('helvetica', 'normal'); doc.setFontSize(8.3); doc.setTextColor(...INK); doc.text(lines, M, y + 5.6);\r\n          y += 5.6 + lines.length * 3.8 + 4;\r\n        };\r\n        block('NOTES', q.notes);\r\n        block('PAYMENT', cfg.paymentTerms);\r\n        block('TERMS & CONDITIONS', cfg.quoteTerms);\r\n        {\r\n          const base = cfg.storeUrl.replace(/\\/$/, '');\r\n          const links = [['Returns, exchanges & warranties policy', base + '/pages/returns-exchanges-warranties'], ['Warranty information', base + '/pages/warranty']];\r\n          if (y + 10 > H - 20) { doc.addPage(); y = 20; }\r\n          doc.setFont('helvetica', 'normal'); doc.setFontSize(8.3);\r\n          let lx = M;\r\n          links.forEach((l, k) => {\r\n            if (k) { doc.setTextColor(...GREY); doc.text('|', lx, y); lx += 4; }\r\n            doc.setTextColor(30, 90, 90); doc.textWithLink(l[0], lx, y, { url: l[1] });\r\n            const w = doc.getTextWidth(l[0]); doc.setDrawColor(30, 90, 90); doc.setLineWidth(0.15); doc.line(lx, y + 0.6, lx + w, y + 0.6);\r\n            lx += w + 4;\r\n          });\r\n          doc.setTextColor(...INK);\r\n          y += 7;\r\n        }\r\n\r\n        // ---- Accept panel\r\n        const link = acceptLink(q);\r\n        if (y + 23 > H - 15.5) { doc.addPage(); y = 20; }\r\n        doc.setFillColor(...GREEN_LT); doc.roundedRect(M, y, R - M, 22, 2, 2, 'F');\r\n        doc.setFillColor(...GREEN); doc.rect(M, y, 2, 22, 'F');\r\n        doc.setFont('helvetica', 'bold'); doc.setFontSize(10.5); doc.setTextColor(...TEAL);\r\n        doc.text('Ready to proceed? Accept this quote online', M + 7, y + 6.5);\r\n        doc.setFont('helvetica', 'normal'); doc.setFontSize(8.3); doc.setTextColor(...INK);\r\n        doc.text(doc.splitTextToSize(pdfSafe(`Enter your purchase order number and upload your PO - we'll take you to a secure checkout to confirm the order (no card payment needed). You can also upload this PDF at ${cfg.pageUrl.replace(/^https?:\\/\\//, '')}.`), R - M - 70), M + 7, y + 11);\r\n        // button\r\n        const bw = 52; const bx = R - bw - 6; const by = y + 6.5;\r\n        doc.setFillColor(...TEAL); doc.roundedRect(bx, by, bw, 9, 4.5, 4.5, 'F');\r\n        doc.setFont('helvetica', 'bold'); doc.setFontSize(9); doc.setTextColor(255, 255, 255);\r\n        doc.text('Accept quote online', bx + bw / 2, by + 6, { align: 'center' });\r\n        doc.link(bx, by, bw, 9, { url: link });\r\n\r\n        // ---- Product information pages (page 2 onwards)\r\n        const seenP = {};\r\n        const infoItems = q.items.map((i, k) => ({ i, d: details[k], imgs: detailImgs[k] })).filter((x) => { const key = x.i.handle || x.i.title; if (seenP[key]) return false; seenP[key] = 1; return true; });\r\n        if (infoItems.length) {\r\n          doc.addPage(); y = 16;\r\n          doc.setFillColor(...TEAL); doc.rect(0, 0, W, 4, 'F'); doc.setFillColor(...GREEN); doc.rect(0, 4, W, 1.2, 'F');\r\n          doc.setFont('helvetica', 'bold'); doc.setFontSize(17); doc.setTextColor(...TEAL); doc.text('Product information', M, y + 4);\r\n          doc.setFont('helvetica', 'normal'); doc.setFontSize(8.5); doc.setTextColor(...GREY); doc.text(pdfSafe('Quote ' + q.no + ' - details of the products included in this quote'), M, y + 9.5);\r\n          y += 16;\r\n          const IW = 52; const TX = M + IW + 7; const TW = R - TX;\r\n          const newPage = () => { doc.addPage(); doc.setFillColor(...TEAL); doc.rect(0, 0, W, 4, 'F'); doc.setFillColor(...GREEN); doc.rect(0, 4, W, 1.2, 'F'); y = 16; };\r\n          infoItems.forEach(({ i, d: info, imgs }, idx) => {\r\n            info = info || { points: [], dims: [], wtr: [], specs: [], chips: [] };\r\n            // estimate block height to keep each product together where possible\r\n            doc.setFontSize(8.3);\r\n            const est = 22 + (info.points.length + info.wtr.length) * 4.4 + Math.min(info.specs.length, 12) * 3.9 + info.dims.length * 3.9 + 20;\r\n            // start a new page only if the image + heading won't fit; long text flows on to the next page\r\n            if (idx > 0 && y + Math.min(est, IW + 26) > H - 22) newPage();\r\n            const top = y; const startPage = doc.getNumberOfPages();\r\n            // images\r\n            const big = imgs && imgs[0];\r\n            doc.setDrawColor(221, 230, 229); doc.setLineWidth(0.25);\r\n            doc.roundedRect(M, top, IW, IW, 2, 2, 'S');\r\n            if (big) doc.addImage(big.data, 'JPEG', M + 1, top + 1, IW - 2, IW - 2);\r\n            if (i.handle) doc.link(M, top, IW, IW, { url: productUrl(i) });\r\n            const small = (imgs || []).slice(1, 3); const sw = (IW - 3) / 2;\r\n            small.forEach((im, x) => { const sx = M + x * (sw + 3); doc.roundedRect(sx, top + IW + 3, sw, sw, 1.5, 1.5, 'S'); if (im) doc.addImage(im.data, 'JPEG', sx + 0.6, top + IW + 3.6, sw - 1.2, sw - 1.2); });\r\n            const imgBottom = top + IW + (small.length ? 3 + sw : 0);\r\n            // text column\r\n            let ty = top + 4;\r\n            doc.setFont('helvetica', 'bold'); doc.setFontSize(12.5); doc.setTextColor(...TEAL);\r\n            const tl = doc.splitTextToSize(pdfSafe(i.title), TW);\r\n            doc.text(tl, TX, ty); if (i.handle) doc.link(TX, ty - 4.5, TW, tl.length * 5.4, { url: productUrl(i) });\r\n            ty += tl.length * 5.4;\r\n            doc.setFont('helvetica', 'normal'); doc.setFontSize(8.3); doc.setTextColor(...GREY);\r\n            const sub = [i.variantTitle, i.qty > 1 ? 'Qty ' + i.qty : 'Qty 1'].filter(Boolean).join('  |  ');\r\n            const sl = doc.splitTextToSize(pdfSafe(sub), TW); doc.text(sl, TX, ty); ty += sl.length * 3.8 + 1.5;\r\n            // badges\r\n            const badges = (info.bestSeller ? ['Best seller'] : []).concat(info.chips || []);\r\n            let bx = TX;\r\n            badges.forEach((b) => { const w = doc.getTextWidth(pdfSafe(b)) + 6; doc.setFillColor(...GREEN_LT); doc.roundedRect(bx, ty - 3.4, w, 5.4, 2.7, 2.7, 'F'); doc.setTextColor(...TEAL); doc.setFont('helvetica', 'bold'); doc.text(pdfSafe(b), bx + 3, ty + 0.3); bx += w + 2.5; });\r\n            if (badges.length) ty += 6;\r\n            doc.setFont('helvetica', 'normal');\r\n            const heading = (t) => {\r\n              if (ty > H - 30) { newPage(); ty = y; }\r\n              doc.setFont('helvetica', 'bold'); doc.setFontSize(7); doc.setTextColor(...TEAL); doc.text(t, TX, ty + 2);\r\n              doc.setDrawColor(...GREEN); doc.setLineWidth(0.6); doc.line(TX, ty + 3.3, TX + 9, ty + 3.3); ty += 6.5;\r\n              doc.setFont('helvetica', 'normal'); doc.setFontSize(8.3); doc.setTextColor(...INK);\r\n            };\r\n            const bullets = (arr) => arr.forEach((b) => {\r\n              const ls = doc.splitTextToSize(pdfSafe(b), TW - 5);\r\n              if (ty + ls.length * 3.8 > H - 22) { newPage(); ty = y; }\r\n              doc.setFillColor(...GREEN); doc.circle(TX + 1.2, ty - 1, 0.8, 'F'); doc.text(ls, TX + 4.5, ty); ty += ls.length * 3.8 + 0.8;\r\n            });\r\n            if (info.bestFor) { heading('BEST FOR'); const ls = doc.splitTextToSize(pdfSafe(info.bestFor), TW); doc.text(ls, TX, ty); ty += ls.length * 3.8 + 2.5; }\r\n            if (info.points.length) { heading('KEY SELLING POINTS'); bullets(info.points); ty += 1.7; }\r\n            if (info.wtr.length) { heading('WHEN TO RECOMMEND'); bullets(info.wtr); ty += 1.7; }\r\n            if (info.dims.length) {\r\n              heading('DIMENSIONS');\r\n              const half = Math.ceil(info.dims.length / 2);\r\n              info.dims.forEach((dm, x) => { const cx = x < half ? TX : TX + TW / 2; const cy = ty + (x < half ? x : x - half) * 3.9; doc.text(pdfSafe(dm), cx, cy); });\r\n              ty += half * 3.9 + 2;\r\n            }\r\n            if (info.specs.length) {\r\n              heading('SPECIFICATIONS');\r\n              info.specs.slice(0, 14).forEach(([l, v]) => {\r\n                const vl = doc.splitTextToSize(pdfSafe(v), TW - 40);\r\n                if (ty + vl.length * 3.8 > H - 22) { newPage(); ty = y; }\r\n                doc.setTextColor(...GREY); doc.text(pdfSafe(l), TX, ty); doc.setTextColor(...INK); doc.text(vl, TX + 40, ty); ty += vl.length * 3.8 + 0.6;\r\n              });\r\n            }\r\n            if (!info.points.length && !info.wtr.length && !info.dims.length && !info.specs.length) {\r\n              doc.setTextColor(...GREY); doc.text('See the full product listing for details.', TX, ty); ty += 5;\r\n            }\r\n            if (i.handle) {\r\n              ty += 1.5; doc.setFont('helvetica', 'bold'); doc.setFontSize(8.3); doc.setTextColor(30, 90, 90);\r\n              doc.textWithLink('View full product listing  >', TX, ty, { url: productUrl(i) }); ty += 3;\r\n              doc.setFont('helvetica', 'normal');\r\n            }\r\n            y = (doc.getNumberOfPages() === startPage ? Math.max(ty, imgBottom) : ty) + 7;\r\n            if (idx < infoItems.length - 1) { doc.setDrawColor(221, 230, 229); doc.setLineWidth(0.3); doc.line(M, y - 3.5, R, y - 3.5); }\r\n          });\r\n        }\r\n\r\n        // ---- Footer on every page\r\n        const pages = doc.getNumberOfPages();\r\n        for (let p = 1; p <= pages; p++) {\r\n          doc.setPage(p);\r\n          doc.setFillColor(...SAGE_LT); doc.rect(0, H - 14, W, 14, 'F');\r\n          doc.setFillColor(...GREEN); doc.rect(0, H - 14, W, 0.8, 'F');\r\n          // two lines left (business details) / two lines right (quote ref, page) so nothing overlaps\r\n          doc.setFont('helvetica', 'bold'); doc.setFontSize(7.5); doc.setTextColor(...TEAL);\r\n          doc.text(pdfSafe([cfg.shopName, cfg.abn ? 'ABN ' + cfg.abn : null].filter(Boolean).join('  |  ')), M, H - 8);\r\n          doc.setFont('helvetica', 'normal');\r\n          doc.text(pdfSafe([cfg.phone, cfg.email, site].filter(Boolean).join('  |  ')), M, H - 4.2);\r\n          doc.text(pdfSafe('Quote ' + q.no), R, H - 8, { align: 'right' });\r\n          doc.text(`Page ${p} of ${pages}`, R, H - 4.2, { align: 'right' });\r\n        }\r\n\r\n        const payload = Object.assign({}, q); delete payload._notified;\r\n        doc.setProperties({\r\n          title: 'Quote ' + q.no + ' - ' + pdfSafe(cfg.shopName),\r\n          subject: 'Quotation for ' + pdfSafe(d.company),\r\n          author: pdfSafe(cfg.shopName),\r\n          creator: 'NMP Quote Builder',\r\n          keywords: `${PDF_TAG}:${b64urlEncode(JSON.stringify(payload))}:${PDF_TAG}END`\r\n        });\r\n        doc.save(`${pdfSafe(cfg.shopName).replace(/[^A-Za-z0-9]+/g, '-')}-Quote-${q.no}.pdf`);\r\n      } catch (e) {\r\n        console.error('[nmp-quote] PDF failed', e);\r\n        notice('Sorry \u2014 the PDF couldn\u2019t be created. You can still print this page to PDF (Ctrl/Cmd + P).', 'error');\r\n      } finally {\r\n        if (btn) { btn.disabled = false; btn.textContent = label; }\r\n      }\r\n    }\r\n    $('[data-download]', root).addEventListener('click', async (e) => {\r\n      const b = e.currentTarget;\r\n      if (state.quoteSync) { b.disabled = true; b.textContent = 'Saving quote\u2026'; try { await state.quoteSync; } catch (x) { /* ignore */ } b.disabled = false; b.textContent = 'Download PDF'; }\r\n      downloadPdf(state.quote, b);\r\n    });\r\n    $('[data-edit]', root).addEventListener('click', () => goTo(2));\r\n    $('[data-new]', root).addEventListener('click', () => {\r\n      if (!confirmReset()) return;\r\n      state.items = []; state.delivery = null; state.rates = null; state.quote = null; state.notes = ''; el.notes.value = '';\r\n      renderLines(); saveDraft(); goTo(1);\r\n    });\r\n    function confirmReset() { return true; }\r\n    $('[data-accept-now]', root).addEventListener('click', () => { setMode('accept'); showAccept(state.quote); });\r\n\r\n    /* ---------- draft persistence ---------- */\r\n    function saveDraft() {\r\n      const details = state.details || (el.details ? readDetails() : null);\r\n      store.set(LS_DRAFT, { details, items: state.items, notes: state.notes, delivery: state.delivery, quote: state.quote, step: state.step, at: Date.now() });\r\n    }\r\n    el.details.addEventListener('change', () => { state.details = null; saveDraft(); });\r\n    function loadDraft() {\r\n      const dr = store.get(LS_DRAFT, null);\r\n      if (dr && Date.now() - dr.at < DRAFT_TTL) {\r\n        fillDetails(dr.details);\r\n        state.items = dr.items || [];\r\n        state.notes = dr.notes || ''; el.notes.value = state.notes;\r\n        if (dr.quote) state.quote = dr.quote;\r\n      } else if (cfg.customerEmail) {\r\n        el.details.elements.email.value = cfg.customerEmail;\r\n        el.details.elements.name.value = cfg.customerName;\r\n      }\r\n      renderLines();\r\n    }\r\n\r\n    /* ================= ACCEPT MODE ================= */\r\n    function renderSavedQuotes() {\r\n      const all = Object.values(store.get(LS_QUOTES, {})).sort((a, b) => new Date(b.created) - new Date(a.created)).slice(0, 5);\r\n      if (!all.length) { el.savedQuotes.innerHTML = ''; return; }\r\n      el.savedQuotes.innerHTML = `<div class=\"nmpq__saved\"><h3>Quotes created on this device</h3>${all.map((q) => `<button type=\"button\" data-saved=\"${esc(q.no)}\"><span><strong>${esc(q.no)}</strong> \u00B7 ${esc(q.details.company)}</span><span>${money(q.totals.total)} \u00B7 ${new Date(q.validUntil) < new Date() ? 'Expired' : 'Valid to ' + fmtDate(q.validUntil)}</span></button>`).join('')}</div>`;\r\n      $$('[data-saved]', el.savedQuotes).forEach((b) => b.addEventListener('click', () => showAccept(store.get(LS_QUOTES, {})[b.dataset.saved])));\r\n    }\r\n    async function parseQuotePdf(file) {\r\n      const buf = await file.arrayBuffer();\r\n      const bytes = new Uint8Array(buf);\r\n      let s = '';\r\n      for (let i = 0; i < bytes.length; i += 65536) s += String.fromCharCode.apply(null, bytes.subarray(i, i + 65536));\r\n      const m = s.match(new RegExp(PDF_TAG + ':([A-Za-z0-9_-]+):' + PDF_TAG + 'END'));\r\n      if (!m) throw new Error('not-a-quote');\r\n      return JSON.parse(b64urlDecode(m[1]));\r\n    }\r\n    el.quoteFile.addEventListener('change', async () => {\r\n      const f = el.quoteFile.files[0];\r\n      if (!f) return;\r\n      try { showAccept(await parseQuotePdf(f)); } catch (e) {\r\n        notice('We couldn\u2019t read a quote from that file. Please upload the original PDF downloaded from this page, or use the \u201CAccept online\u201D link in it. Need help? Call ' + esc(cfg.phone) + '.', 'error');\r\n      }\r\n      el.quoteFile.value = '';\r\n    });\r\n    const drop = el.quoteFile.closest('.nmpq__drop');\r\n    ['dragenter', 'dragover'].forEach((ev) => drop.addEventListener(ev, () => drop.classList.add('is-over')));\r\n    ['dragleave', 'drop'].forEach((ev) => drop.addEventListener(ev, () => drop.classList.remove('is-over')));\r\n\r\n    // Hydrate a compact accept-link quote using the live catalogue (+ full copy if on this device)\r\n    async function quoteFromLink(code) {\r\n      const c = JSON.parse(b64urlDecode(code));\r\n      const local = store.get(LS_QUOTES, {})[c.n];\r\n      if (local) return local;\r\n      const cat = await loadCatalog();\r\n      const items = c.i.map(([vid, qty, price]) => {\r\n        for (const p of cat) {\r\n          const v = p.variants.find((x) => x.id === vid);\r\n          if (v) return { variantId: vid, productId: p.id, handle: p.handle, title: p.title, variantTitle: p.hasOptions ? v.title : '', sku: v.sku, price, qty, image: v.image || p.image, requiresShipping: v.requiresShipping, taxable: v.taxable, available: v.available };\r\n        }\r\n        return { variantId: vid, title: 'Product no longer available', variantTitle: '', price, qty, missing: true };\r\n      });\r\n      const delivery = { method: c.d[0], name: c.d[1], price: c.d[2] };\r\n      return { v: 1, no: c.n, draftId: c.x, created: c.c, validUntil: c.u, items, delivery, details: null, notes: '', totals: computeTotals(items, delivery.price, cfg), taxesIncluded: cfg.taxesIncluded, fromLink: true };\r\n    }\r\n\r\n    async function showAccept(q) {\r\n      if (!q) return;\r\n      notice(null);\r\n      state.acceptQuote = q;\r\n      // insurance claims: pay via \"Invoice to Insurer\", claim number stands in for a PO, PO document optional\r\n      const isIns = !!(q.details && q.details.insurance);\r\n      const pm = $('[data-pay-method]', root); if (pm) pm.textContent = '\u201C' + (isIns ? cfg.insurerMethodName : cfg.paymentMethodName) + '\u201D';\r\n      const fpo = el.acceptForm.elements.po; const ffile = el.acceptForm.elements.poFile;\r\n      fpo.closest('.nmpq__field').querySelector('span').textContent = isIns ? 'Purchase order or claim number *' : 'Purchase order number *';\r\n      ffile.closest('.nmpq__field').querySelector('span').textContent = isIns ? 'Purchase order / insurer approval (optional)' : 'Purchase order document (PDF/image) *';\r\n      if (isIns && !fpo.value) fpo.value = q.details.insurance.claim;\r\n      el.acceptNo.textContent = q.no;\r\n      const expired = new Date(q.validUntil) < new Date();\r\n      let cat = null; try { cat = await loadCatalog(); } catch (e) { /* ignore */ }\r\n      const changes = [];\r\n      q.items.forEach((i) => {\r\n        i._current = null; i._flag = '';\r\n        if (!cat) return;\r\n        const p = cat.find((x) => x.variants.some((v) => v.id === i.variantId));\r\n        const v = p && p.variants.find((x) => x.id === i.variantId);\r\n        if (!v) { i._flag = 'No longer available \u2014 please contact us'; i.missing = true; changes.push(i); return; }\r\n        i._current = v.price;\r\n        if (v.price !== i.price) { i._flag = `Current price ${money(v.price)} (quoted ${money(i.price)})`; changes.push(i); }\r\n        else if (!v.available) i._flag = 'Currently unavailable \u2014 lead time will be confirmed';\r\n      });\r\n      el.acceptSummary.innerHTML = `\r\n        ${expired ? `<div class=\"nmpq__notice is-warn\">This quote expired on ${fmtDate(q.validUntil)}. Please <button type=\"button\" class=\"nmpq__link\" data-requote>create an updated quote</button> with current pricing.</div>` : ''}\r\n        ${!expired && changes.length ? '<div class=\"nmpq__notice is-warn\">Some prices or items have changed since this quote was issued. Checkout uses current pricing \u2014 contact us before accepting if you need the quoted price honoured.</div>' : ''}\r\n        <table class=\"nmpq__lines\" style=\"margin-bottom:16px\">\r\n          <thead><tr><th>Item</th><th class=\"num\">Qty</th><th class=\"num\">Quoted</th></tr></thead>\r\n          <tbody>${q.items.map((i) => `<tr><td>${esc(i.title)}${i.variantTitle ? `<small style=\"display:block\" class=\"nmpq__muted\">${esc(i.variantTitle)}</small>` : ''}${i._flag ? `<span class=\"nmpq__flag\">${esc(i._flag)}</span>` : ''}</td><td class=\"num\">${i.qty}</td><td class=\"num\">${money(i.price * i.qty)}</td></tr>`).join('')}\r\n          <tr><td>${esc(q.delivery.method === 'pickup' ? 'Pick up from ' + cfg.pickupName : 'Shipping' + (/^shipping$/i.test(q.delivery.name || '') ? '' : ': ' + q.delivery.name))}</td><td></td><td class=\"num\">${money(q.delivery.price)}</td></tr></tbody>\r\n          <tfoot><tr><td>Quoted total ${q.taxesIncluded ? '(incl. GST)' : ''}</td><td></td><td class=\"num\">${money(q.totals.total)}</td></tr></tfoot>\r\n        </table>`;\r\n      const rq = $('[data-requote]', el.acceptSummary);\r\n      if (rq) rq.addEventListener('click', () => requote(q));\r\n      el.acceptLoad.hidden = true;\r\n      el.acceptForm.hidden = false;\r\n      $('[data-accept-submit]', root).disabled = expired || q.items.some((i) => i.missing);\r\n      el.acceptForm.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n    }\r\n    function requote(q) {\r\n      if (q.details) fillDetails(q.details);\r\n      state.items = q.items.filter((i) => !i.missing).map((i) => Object.assign({}, i, { price: i._current != null ? i._current : i.price }));\r\n      state.quote = null; state.delivery = null; state.rates = null;\r\n      renderLines();\r\n      setMode('create');\r\n      goTo(q.details ? 2 : 1);\r\n    }\r\n    $('[data-accept-cancel]', root).addEventListener('click', () => {\r\n      el.acceptForm.hidden = true; el.acceptLoad.hidden = false; state.acceptQuote = null; el.acceptForm.reset(); renderSavedQuotes();\r\n    });\r\n\r\n    el.acceptForm.addEventListener('submit', async (e) => {\r\n      e.preventDefault();\r\n      const f = el.acceptForm.elements;\r\n      const q = state.acceptQuote;\r\n      let ok = true;\r\n      const po = f.po.value.trim();\r\n      if (!po) { fieldError(f.po, 'Enter your PO number'); ok = false; } else fieldError(f.po, null);\r\n      const file = f.poFile.files[0];\r\n      const isIns = !!(q.details && q.details.insurance);\r\n      if (!file && !isIns) { fieldError(f.poFile, 'Upload your purchase order'); ok = false; }\r\n      else if (file.size > 20 * 1024 * 1024) { fieldError(f.poFile, 'File must be under 20 MB'); ok = false; }\r\n      else fieldError(f.poFile, null);\r\n      if (!f.agree.checked) { notice('Please confirm you\u2019re authorised to accept this quote.', 'error'); ok = false; }\r\n      if (!ok) return;\r\n\r\n      const btn = $('[data-accept-submit]', root);\r\n      btn.disabled = true; btn.textContent = 'Preparing your order\u2026';\r\n      try {\r\n        store.del(LS_CART_BACKUP); // we are intentionally replacing the cart\r\n        await api.post('/cart/clear.js');\r\n        const items = q.items.filter((i) => !i.missing);\r\n        const [first, ...rest] = items;\r\n        const fd = new FormData();\r\n        fd.append('id', first.variantId);\r\n        fd.append('quantity', first.qty);\r\n        fd.append('properties[_Quote]', q.no);\r\n        if (file) fd.append('properties[PO Document]', file, file.name);\r\n        await api.post('/cart/add.js', fd);\r\n        if (rest.length) {\r\n          try { await api.post('/cart/add.js', { items: rest.map((i) => ({ id: i.variantId, quantity: i.qty, properties: { _Quote: q.no } })) }); } catch (err) {\r\n            for (const i of rest) { try { await api.post('/cart/add.js', { items: [{ id: i.variantId, quantity: i.qty, properties: { _Quote: q.no } }] }); } catch (e2) { throw new Error(`\"${i.title}\" can\u2019t be added (${e2.message}).`); } }\r\n          }\r\n        }\r\n        const attrs = {\r\n          'Quote Number': q.no,\r\n          'PO Number': po,\r\n          'Quote Date': fmtDate(q.created),\r\n          'Quoted Total': money(q.totals.total),\r\n          'Delivery Method': q.delivery.method === 'pickup' ? 'Pick up - ' + cfg.pickupName : 'Ship - ' + q.delivery.name,\r\n          'Quoted Freight': money(q.delivery.price)\r\n        };\r\n        if (q.details) { attrs['Company'] = q.details.company; if (q.details.abn) attrs['ABN'] = q.details.abn; if (q.details.reference) attrs['Customer Reference'] = q.details.reference; insRows(q.details).forEach((r) => { attrs['Insurance - ' + r[0]] = r[1]; }); }\r\n        const note = [`Quote ${q.no} accepted with PO ${po}.`, f.notes.value.trim()].filter(Boolean).join('\\n');\r\n        await api.post('/cart/update.js', { attributes: attrs, note });\r\n        store.set(LS_DRAFT, null);\r\n        let dest = '/checkout';\r\n        if (cfg.draftApi && q.draftId) {\r\n          try {\r\n            const cart = await api.get('/cart.js');\r\n            const line = cart.items.find((i) => i.properties && i.properties['PO Document']);\r\n            const r = await fetch(cfg.draftApi.replace(/\\/$/, '') + '/accept', {\r\n              method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\r\n              body: JSON.stringify({ draftId: q.draftId, quoteNo: q.no, po, poFileUrl: line ? line.properties['PO Document'] : '', notes: f.notes.value.trim() })\r\n            });\r\n            const j = await r.json();\r\n            // Use the draft's own checkout when freight is priced \u2014 honours quoted prices and converts that draft into the order\r\n            if (j.ok && j.invoiceUrl && q.delivery.price != null) { await api.post('/cart/clear.js'); dest = j.invoiceUrl; }\r\n          } catch (e2) { console.warn('[nmp-quote] draft accept failed, using cart checkout', e2); }\r\n        }\r\n        btn.textContent = 'Opening checkout\u2026';\r\n        window.location.href = dest;\r\n      } catch (err) {\r\n        btn.disabled = false; btn.textContent = 'Accept & continue to checkout';\r\n        notice('We couldn\u2019t prepare your order: ' + esc(err.message) + ' Please try again or call ' + esc(cfg.phone) + '.', 'error');\r\n      }\r\n    });\r\n\r\n    /* ---------- boot ---------- */\r\n    restoreCartBackup().catch(() => {});\r\n    loadDraft();\r\n    const params = new URLSearchParams(location.search);\r\n    if (params.get('variant') && /^\\d+$/.test(params.get('variant'))) state.incoming = { variant: +params.get('variant'), qty: parseInt(params.get('qty'), 10) || 1 };\r\n    else if (params.get('items')) {\r\n      const its = params.get('items').split(',').map((x) => x.split(':').map(Number)).filter(([v, q]) => v > 0 && q > 0).slice(0, 60);\r\n      if (its.length) state.incoming = { items: its };\r\n    }\r\n    if (params.get('product') && !state.incoming) state.pendingHandle = params.get('product');\r\n    if (params.get('accept')) {\r\n      setMode('accept');\r\n      quoteFromLink(params.get('accept')).then(showAccept).catch(() => notice('That quote link looks incomplete. Please upload your quote PDF instead.', 'error'));\r\n    } else if (params.get('mode') === 'accept') {\r\n      setMode('accept');\r\n    } else {\r\n      setMode('create');\r\n      const dr = store.get(LS_DRAFT, null);\r\n      if (dr && dr.quote && dr.step === 4 && !state.pendingHandle && !state.incoming) { state.delivery = dr.delivery; state.details = dr.details; renderDoc(state.quote, el.doc); goTo(4); }\r\n    }\r\n  }\r\n\r\n  const boot = () => $$('[data-nmpq]').forEach((r) => { if (!r.__nmpq) { r.__nmpq = true; init(r); } });\r\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot); else boot();\r\n  document.addEventListener('shopify:section:load', boot);\r\n})();\r\n"],
  "mappings": "CAMC,IAAM,CACL,aAEA,MAAM,UAAY,iBACZ,SAAW,gBACX,eAAiB,sBACjB,QAAU,QACV,MAAQ,sEACR,UAAY,6FACZ,OAAS,CAAE,IAAK,aAAc,IAAK,kBAAmB,IAAK,WAAY,IAAK,+BAAgC,GAAI,kBAAmB,GAAI,oBAAqB,IAAK,WAAY,GAAI,oBAAqB,EAGtM,EAAI,CAAC,IAAK,MAAQ,IAAM,UAAU,cAAc,GAAG,EACnD,GAAK,CAAC,IAAK,KAAO,MAAM,MAAM,IAAM,UAAU,iBAAiB,GAAG,CAAC,EACnE,IAAO,GAAM,OAAO,GAAY,EAAM,EAAE,QAAQ,WAAa,IAAO,CAAE,IAAK,QAAS,IAAK,OAAQ,IAAK,OAAQ,IAAK,SAAU,IAAK,OAAQ,GAAE,CAAC,CAAE,EAC/I,MAAS,IAAO,IAAI,QAAS,GAAM,WAAW,EAAG,EAAE,CAAC,EACpD,QAAW,GAAM,KAAK,MAAM,WAAW,GAAK,CAAC,EAAI,GAAG,EACpD,MAAQ,CACZ,IAAI,EAAG,EAAG,CAAE,GAAI,CAAE,MAAM,EAAI,aAAa,QAAQ,CAAC,EAAG,OAAO,EAAI,KAAK,MAAM,CAAC,EAAI,CAAG,MAAY,CAAE,OAAO,CAAG,CAAE,EAC7G,IAAI,EAAG,EAAG,CAAE,GAAI,CAAE,aAAa,QAAQ,EAAG,KAAK,UAAU,CAAC,CAAC,CAAG,MAAY,CAAe,CAAE,EAC3F,IAAI,EAAG,CAAE,GAAI,CAAE,aAAa,WAAW,CAAC,CAAG,MAAY,CAAe,CAAE,CAC1E,EAEM,UAAY,GAAK,KAAO,KAC7B,UAAsB,CACrB,MAAM,IAAM,KAAK,IAAI,EACf,IAAM,MAAM,IAAI,UAAW,IAAI,EACrC,GAAI,KAAO,OAAO,KAAQ,SAAU,CAClC,IAAI,QAAU,GACd,OAAO,KAAK,GAAG,EAAE,QAAS,GAAM,CAC9B,MAAM,EAAI,IAAI,CAAC,GAAK,CAAC,EACf,MAAQ,EAAE,WAAa,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAK,EAAE,QAAU,IAAI,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAI,GAAK,MAAW,GACzH,CAAC,OAAS,MAAM,KAAK,GAAK,MAAQ,OAAO,OAAO,IAAI,CAAC,EAAG,QAAU,GACxE,CAAC,EACG,UAAe,OAAO,KAAK,GAAG,EAAE,OAAQ,MAAM,IAAI,UAAW,GAAG,EAAQ,MAAM,IAAI,SAAS,EACjG,CACA,MAAM,GAAK,MAAM,IAAI,SAAU,IAAI,EAC/B,KAAO,CAAC,GAAG,IAAM,IAAM,GAAG,GAAK,YAAY,MAAM,IAAI,QAAQ,CACnE,GAAG,EACH,MAAM,aAAgB,KAAQ,CAC5B,MAAM,MAAQ,IAAI,YAAY,EAAE,OAAO,GAAG,EAC1C,IAAI,IAAM,GACV,aAAM,QAAS,GAAM,CAAE,KAAO,OAAO,aAAa,CAAC,CAAG,CAAC,EAChD,KAAK,GAAG,EAAE,QAAQ,MAAO,GAAG,EAAE,QAAQ,MAAO,GAAG,EAAE,QAAQ,MAAO,EAAE,CAC5E,EACM,aAAgB,GAAM,CAE1B,IADA,EAAI,EAAE,QAAQ,KAAM,GAAG,EAAE,QAAQ,KAAM,GAAG,EACnC,EAAE,OAAS,GAAG,GAAK,IAC1B,MAAM,IAAM,KAAK,CAAC,EACZ,MAAQ,IAAI,WAAW,IAAI,MAAM,EACvC,QAAS,EAAI,EAAG,EAAI,IAAI,OAAQ,IAAK,MAAM,CAAC,EAAI,IAAI,WAAW,CAAC,EAChE,OAAO,IAAI,YAAY,EAAE,OAAO,KAAK,CACvC,EACM,QAAW,KAAQ,IAAI,KAAK,GAAG,EAAE,mBAAmB,QAAS,CAAE,IAAK,UAAW,MAAO,OAAQ,KAAM,SAAU,CAAC,EAC/G,YAAc,CAAC,EACf,WAAc,MACb,YAAY,GAAG,IAClB,YAAY,GAAG,EAAI,IAAI,QAAQ,CAAC,IAAK,MAAQ,CAC3C,MAAM,EAAI,SAAS,cAAc,QAAQ,EAAG,EAAE,IAAM,IAAK,EAAE,OAAS,IACpE,EAAE,QAAU,IAAM,CAAE,OAAO,YAAY,GAAG,EAAG,IAAI,IAAI,MAAM,kBAAoB,GAAG,CAAC,CAAG,EACtF,SAAS,KAAK,YAAY,CAAC,CAC7B,CAAC,GAEI,YAAY,GAAG,GAElB,IAAM,CACV,MAAM,IAAI,IAAK,CAAE,MAAM,EAAI,MAAM,MAAM,IAAK,CAAE,QAAS,CAAE,OAAQ,kBAAmB,EAAG,YAAa,aAAc,CAAC,EAAG,GAAI,CAAC,EAAE,GAAI,MAAM,IAAI,MAAM,IAAM,IAAM,EAAE,MAAM,EAAG,OAAO,EAAE,KAAK,CAAG,EACzL,MAAM,KAAK,IAAK,KAAM,CACpB,MAAM,KAAO,CAAE,OAAQ,OAAQ,YAAa,cAAe,QAAS,CAAE,OAAQ,mBAAoB,mBAAoB,gBAAiB,CAAE,EACrI,gBAAgB,SAAU,KAAK,KAAO,KAAe,OAAQ,KAAK,KAAO,KAAK,UAAU,IAAI,EAAG,KAAK,QAAQ,cAAc,EAAI,oBAClI,MAAM,EAAI,MAAM,MAAM,IAAK,IAAI,EACzB,IAAM,MAAM,EAAE,KAAK,EACzB,IAAI,KAAO,KAAM,GAAI,CAAE,KAAO,IAAM,KAAK,MAAM,GAAG,EAAI,IAAM,MAAY,CAAiB,CACzF,GAAI,CAAC,EAAE,GAAI,CAAE,MAAM,IAAM,IAAI,MAAO,OAAS,KAAK,aAAe,KAAK,UAAc,IAAM,IAAM,EAAE,MAAO,EAAG,UAAI,OAAS,EAAE,OAAc,GAAK,CAC9I,OAAO,IACT,CACF,EAGA,eAAe,mBAAoB,CACjC,MAAM,OAAS,MAAM,IAAI,eAAgB,IAAI,EAC7C,GAAK,OACL,IAAI,CACF,MAAM,IAAI,KAAK,gBAAgB,EAC3B,OAAO,OAAS,OAAO,MAAM,QAAQ,MAAM,IAAI,KAAK,eAAgB,CAAE,MAAO,OAAO,KAAM,CAAC,CACjG,MAAY,CAEV,UAAW,MAAO,OAAO,OAAS,CAAC,EAAM,GAAI,CAAE,MAAM,IAAI,KAAK,eAAgB,CAAE,MAAO,CAAC,EAAE,CAAE,CAAC,CAAG,MAAa,CAAa,CAC5H,CACA,MAAM,IAAI,cAAc,EAC1B,CACA,eAAe,YAAa,CAE1B,MAAM,OADO,MAAM,IAAI,IAAI,UAAU,GAClB,MAAM,IAAK,GAAM,CAClC,MAAM,EAAI,CAAE,GAAI,EAAE,WAAY,SAAU,EAAE,QAAS,EACnD,OAAI,EAAE,YAAc,OAAO,KAAK,EAAE,UAAU,EAAE,SAAQ,EAAE,WAAa,EAAE,YACnE,EAAE,yBAA2B,EAAE,wBAAwB,eAAc,EAAE,aAAe,EAAE,wBAAwB,aAAa,IAC1H,CACT,CAAC,EACD,MAAM,IAAI,eAAgB,CAAE,MAAO,GAAI,KAAK,IAAI,CAAE,CAAC,CACrD,CAGA,IAAI,eAAiB,KACrB,SAAS,aAAc,CACrB,OAAI,iBACJ,gBAAkB,SAAY,CAC5B,MAAM,IAAM,CAAC,EACb,QAAS,KAAO,EAAG,MAAQ,GAAI,OAAQ,CAErC,MAAM,MADO,MAAM,IAAI,IAAI,iCAAiC,IAAI,EAAE,GAChD,UAAY,CAAC,EAkB/B,GAjBA,KAAK,QAAS,GAAM,CAClB,MAAM,IAAM,EAAE,QAAU,EAAE,OAAO,CAAC,EAAI,EAAE,OAAO,CAAC,EAAE,IAAM,GAClD,QAAU,CAAC,GAChB,EAAE,QAAU,CAAC,GAAG,QAAS,IAAO,EAAG,GAAG,aAAe,CAAC,GAAG,QAAS,KAAQ,CAAE,QAAQ,GAAG,EAAI,GAAG,GAAK,CAAC,CAAG,CAAC,EACzG,IAAI,KAAK,CACP,GAAI,EAAE,GAAI,OAAQ,EAAE,OAAQ,MAAO,EAAE,MAAO,OAAQ,EAAE,OAAQ,KAAM,EAAE,aAAc,MAAO,EAAE,MAAQ,CAAC,GAAG,KAAK,GAAG,EACjH,MAAO,IACP,SAAU,EAAE,SAAW,CAAC,GAAG,IAAK,GAAM,EAAE,IAAI,EAC5C,WAAY,EAAE,SAAS,OAAS,EAChC,SAAU,EAAE,SAAS,IAAK,IAAO,CAC/B,GAAI,EAAE,GAAI,MAAO,EAAE,MAAO,IAAK,EAAE,KAAO,GAAI,MAAO,QAAQ,EAAE,KAAK,EAAG,UAAW,EAAE,YAAc,GAChG,iBAAkB,EAAE,oBAAsB,GAAO,QAAS,EAAE,UAAY,GAAO,MAAO,EAAE,OAAS,EACjG,QAAS,CAAC,EAAE,QAAS,EAAE,QAAS,EAAE,OAAO,EAAE,OAAQ,GAAM,GAAK,IAAI,EAClE,MAAQ,EAAE,gBAAkB,EAAE,eAAe,KAAQ,QAAQ,EAAE,EAAE,GAAK,GACxE,EAAE,CACJ,CAAC,CACH,CAAC,EACG,KAAK,OAAS,IAAK,KACzB,CACA,WAAI,QAAS,GAAM,CAAE,EAAE,IAAM,CAAC,EAAE,MAAO,EAAE,OAAQ,EAAE,KAAM,EAAE,KAAM,EAAE,SAAS,IAAK,GAAM,EAAE,IAAM,IAAM,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,YAAY,CAAG,CAAC,EAC5I,GACT,GAAG,EACI,eACT,CACA,MAAM,MAAQ,CAAC,IAAK,IACb,IACE,KAAO,IAAI,SAAS,GAAG,EAAI,IAAM,KAAO,UAAY,GAAK,KAD/C,GAOnB,eAAe,WAAW,MAAO,KAAM,WAAY,CACjD,MAAM,UAAY,MAAM,OAAQ,GAAM,EAAE,mBAAqB,EAAK,EAClE,GAAI,CAAC,UAAU,OAAQ,MAAO,CAAE,MAAO,CAAC,CAAE,KAAM,uBAAwB,MAAO,EAAG,KAAM,MAAO,CAAC,EAAG,QAAS,EAAM,EAClH,MAAM,WAAW,EACjB,GAAI,CACF,MAAM,IAAM,MAAM,UAAU,UAAW,IAAI,EAC3C,GAAI,IAAI,MAAM,OAAS,GAAK,UAAU,SAAW,GAAK,UAAU,OAAS,EAAG,OAAO,IAC/E,YAAY,WAAW,yCAAoC,EAC/D,MAAM,aAAe,CAAC,EAAS,MAAQ,CAAC,EACxC,UAAW,MAAM,YACL,MAAM,UAAU,CAAC,EAAE,EAAG,IAAI,GACjC,MAAM,KAAM,GAAM,EAAE,OAAO,EAAI,aAAe,OAAO,KAAK,EAAE,EAEjE,GAAI,CAAC,aAAa,OAAQ,OAAO,IACjC,MAAM,EAAI,MAAM,UAAU,aAAc,IAAI,EAC5C,GAAI,EAAE,MAAM,OAAS,EAAG,OAAO,IAC/B,IAAI,MAAQ,EAAO,QAAU,IAAI,SAAW,EAAE,QAC9C,GAAI,MAAM,OAAQ,CAChB,MAAM,EAAI,MAAM,UAAU,MAAO,IAAI,EAChC,EAAE,MAAM,OAA6B,MAAQ,EAAE,MAAM,CAAC,EAAE,MAAxC,QAAU,GAC/B,QAAU,SAAW,EAAE,OACzB,CACA,MAAO,CAAE,MAAO,EAAE,MAAM,IAAK,GAAM,OAAO,OAAO,CAAC,EAAG,EAAG,CAAE,MAAO,EAAE,MAAQ,MAAO,KAAM,CAAC,CAAC,EAAE,KAAK,CAAC,EAAG,IAAM,EAAE,MAAQ,EAAE,KAAK,EAAG,OAAQ,CACzI,QAAE,CACA,MAAM,kBAAkB,CAC1B,CACF,CACA,eAAe,UAAU,UAAW,KAAM,CACxC,IAAI,QAAU,GACd,CACE,MAAM,IAAI,KAAK,gBAAgB,EAC/B,GAAI,CACF,MAAM,IAAI,KAAK,eAAgB,CAAE,MAAO,UAAU,IAAK,IAAO,CAAE,GAAI,EAAE,UAAW,SAAU,EAAE,GAAI,EAAE,CAAE,CAAC,CACxG,MAAY,CAEV,QAAU,GACV,UAAW,KAAK,UAAa,GAAI,CAAE,MAAM,IAAI,KAAK,eAAgB,CAAE,MAAO,CAAC,CAAE,GAAI,EAAE,UAAW,SAAU,EAAE,GAAI,CAAC,CAAE,CAAC,CAAG,MAAa,CAAa,CAClJ,CACA,MAAM,GAAK,IAAI,gBAAgB,CAC7B,wBAAyB,KAAK,IAC9B,4BAA6B,KAC7B,6BAA8B,KAAK,QACrC,CAAC,EAAE,SAAS,EACZ,MAAM,IAAI,KAAK,qCAAuC,EAAE,EACxD,MAAM,QAAU,KAAK,IAAI,EACzB,KAAO,KAAK,IAAI,EAAI,QAAU,KAAO,CACnC,MAAM,EAAI,MAAM,MAAM,mCAAqC,GAAI,CAAE,YAAa,aAAc,CAAC,EAC7F,GAAI,EAAE,SAAW,IAAK,CACpB,MAAM,EAAI,MAAM,EAAE,KAAK,EACvB,GAAI,GAAK,IAAM,OAOb,MAAO,CAAE,OANC,KAAK,MAAM,CAAC,EACL,gBAAkB,CAAC,GAAG,IAAK,IAAO,CACjD,KAAM,EAAE,kBAAoB,EAAE,KAAM,KAAM,EAAE,KAAM,MAAO,QAAQ,EAAE,KAAK,EACxE,QAAS,CAAC,CAAC,EAAE,oBAAsB,CAAC,aAAa,KAAK,OAAO,EAAE,QAAU,EAAE,CAAC,EAC5E,KAAM,MAAM,QAAQ,EAAE,aAAa,GAAK,EAAE,cAAc,OAAS,EAAE,cAAgB,IACrF,EAAE,EAAE,KAAK,CAAC,EAAG,IAAM,EAAE,MAAQ,EAAE,KAAK,EACpB,OAAQ,CAE5B,SAAW,EAAE,QAAU,IAAK,CAC1B,MAAM,EAAI,MAAM,EAAE,KAAK,EACvB,MAAM,IAAI,MAAM,gCAAkC,EAAE,OAAS,KAAO,EAAE,MAAM,EAAG,GAAG,CAAC,CACrF,CACA,MAAM,MAAM,GAAG,CACjB,CACA,MAAM,IAAI,MAAM,gCAAgC,CAClD,CACF,CAGA,SAAS,cAAc,MAAO,QAAS,IAAK,CAC1C,MAAM,SAAW,MAAM,OAAO,CAAC,EAAG,IAAM,EAAI,EAAE,MAAQ,EAAE,IAAK,CAAC,EACxD,EAAI,SAAW,EACf,QAAU,SAAW,EAC3B,IAAI,IAAK,MACT,OAAI,IAAI,eAAiB,MAAQ,SAAW,EAAG,IAAM,KAAK,MAAM,QAAU,EAAE,IAAY,IAAM,KAAK,MAAM,QAAU,IAAI,OAAO,EAAG,MAAQ,SAAW,EAAI,KACjJ,CAAE,SAAU,QAAS,EAAG,IAAK,KAAM,CAC5C,CAGA,SAAS,KAAK,KAAM,CAClB,MAAM,MAAQ,SAAS,eAAe,eAAiB,KAAK,QAAQ,SAAS,EACvE,IAAM,KAAK,MAAM,MAAM,WAAW,EAClC,MAAS,GAAO,GAAK,KAAO,MAAQ,IAAI,KAAK,aAAa,QAAS,CAAE,MAAO,WAAY,SAAU,IAAI,UAAY,KAAM,CAAC,EAAE,OAAO,EAAI,GAAG,EAEzI,GAAK,CACT,OAAQ,EAAE,gBAAiB,IAAI,EAC/B,OAAQ,EAAE,uBAAwB,IAAI,EACtC,OAAQ,EAAE,uBAAwB,IAAI,EACtC,SAAU,GAAG,kBAAmB,IAAI,EACpC,MAAO,GAAG,cAAe,IAAI,EAC7B,QAAS,GAAG,kBAAmB,IAAI,EACnC,QAAS,EAAE,kBAAmB,IAAI,EAClC,SAAU,EAAE,wBAAyB,IAAI,EACzC,WAAY,EAAE,yBAA0B,IAAI,EAC5C,OAAQ,EAAE,gBAAiB,IAAI,EAC/B,QAAS,EAAE,iBAAkB,IAAI,EACjC,cAAe,EAAE,wBAAyB,IAAI,EAC9C,aAAc,EAAE,sBAAuB,IAAI,EAC3C,MAAO,EAAE,eAAgB,IAAI,EAC7B,MAAO,EAAE,eAAgB,IAAI,EAC7B,QAAS,GAAG,gBAAiB,IAAI,EACjC,OAAQ,EAAE,iBAAkB,IAAI,EAChC,WAAY,EAAE,qBAAsB,IAAI,EACxC,MAAO,EAAE,eAAgB,IAAI,EAC7B,aAAc,EAAE,uBAAwB,IAAI,EAC5C,IAAK,EAAE,aAAc,IAAI,EACzB,UAAW,EAAE,oBAAqB,IAAI,EACtC,YAAa,EAAE,sBAAuB,IAAI,EAC1C,WAAY,EAAE,qBAAsB,IAAI,EACxC,WAAY,EAAE,qBAAsB,IAAI,EACxC,SAAU,EAAE,mBAAoB,IAAI,EACpC,cAAe,EAAE,wBAAyB,IAAI,CAChD,EAEM,MAAQ,CACZ,KAAM,EACN,QAAS,KACT,MAAO,CAAC,EACR,MAAO,GACP,SAAU,KACV,SAAU,KACV,MAAO,KACP,MAAO,KACP,YAAa,KACb,QAAS,IACX,EAGA,SAAS,OAAO,IAAK,KAAM,CACzB,GAAI,CAAC,IAAK,CAAE,GAAG,OAAO,OAAS,GAAM,GAAG,OAAO,UAAY,GAAI,MAAQ,CACvE,GAAG,OAAO,UAAY,gBAAkB,KAAO,OAAS,KAAO,IAC/D,GAAG,OAAO,UAAY,IACtB,GAAG,OAAO,OAAS,GACnB,GAAG,OAAO,eAAe,CAAE,SAAU,SAAU,MAAO,QAAS,CAAC,CAClE,CAGA,SAAS,QAAQ,KAAM,CACrB,GAAG,SAAS,QAAS,GAAM,CAAE,MAAM,GAAK,EAAE,QAAQ,UAAY,KAAM,EAAE,UAAU,OAAO,YAAa,EAAE,EAAG,EAAE,aAAa,gBAAiB,EAAE,CAAG,CAAC,EAC/I,GAAG,OAAO,OAAS,OAAS,SAC5B,GAAG,OAAO,OAAS,OAAS,SAC5B,OAAO,IAAI,EACP,OAAS,UAAU,kBAAkB,CAC3C,CACA,GAAG,SAAS,QAAS,GAAM,EAAE,iBAAiB,QAAS,IAAM,QAAQ,EAAE,QAAQ,OAAO,CAAC,CAAC,EAGxF,SAAS,KAAK,EAAG,CACX,GAAK,GAAK,CAAC,MAAM,UACf,gBAAgB,EAAG,MAAM,QAAU,YAAY,EAC9C,EAAI,GAEX,MAAM,KAAO,EACb,GAAG,MAAM,QAAS,GAAM,CAAE,EAAE,OAAS,OAAO,EAAE,QAAQ,IAAI,IAAM,CAAG,CAAC,EACpE,GAAG,QAAQ,QAAS,GAAM,CACxB,MAAM,EAAI,OAAO,EAAE,QAAQ,OAAO,EAClC,EAAE,UAAU,OAAO,aAAc,IAAM,CAAC,EACxC,EAAE,UAAU,OAAO,UAAW,EAAI,CAAC,CACrC,CAAC,EACD,OAAO,IAAI,EACP,IAAM,GAAG,YAAY,EACrB,IAAM,GAAG,cAAc,EAC3B,KAAK,eAAe,CAAE,SAAU,SAAU,MAAO,OAAQ,CAAC,EAC1D,UAAU,CACZ,CACA,GAAG,QAAQ,QAAS,GAAM,EAAE,iBAAiB,QAAS,IAAM,CAAE,MAAM,EAAI,OAAO,EAAE,QAAQ,OAAO,EAAO,EAAI,MAAM,MAAM,KAAK,CAAC,CAAG,CAAC,CAAC,EAClI,GAAG,cAAe,IAAI,EAAE,QAAS,GAAM,EAAE,iBAAiB,QAAS,IAAM,KAAK,MAAM,KAAO,CAAC,CAAC,CAAC,EAG9F,GAAG,SAAS,iBAAiB,SAAU,IAAM,CAAE,GAAG,WAAW,OAAS,GAAG,SAAS,OAAS,CAAC,EAE5F,SAAS,WAAW,MAAO,IAAK,CAC9B,MAAM,EAAI,MAAM,QAAQ,cAAc,EACtC,GAAI,CAAC,EAAG,OACR,EAAE,UAAU,OAAO,aAAc,CAAC,CAAC,GAAG,EACtC,IAAI,EAAI,EAAE,aAAc,CAAC,EACrB,KAAY,IAAK,EAAI,SAAS,cAAc,MAAM,EAAG,EAAE,UAAY,YAAa,EAAE,YAAY,CAAC,GAAK,EAAE,YAAc,KAAgB,GAAG,EAAE,OAAO,CACtJ,CACA,SAAS,iBAAkB,CACzB,IAAI,GAAK,GAAU,MAAQ,KAC3B,MAAM,MAAQ,CAAC,MAAO,KAAM,MAAQ,CAAO,KAA8E,WAAW,MAAO,IAAI,GAA5F,WAAW,MAAO,GAAG,EAAG,GAAK,GAAY,QAAO,MAAQ,OAAuC,EAC5I,EAAI,GAAG,QACb,CAAC,OAAQ,SAAS,EAAE,QAAS,GAAM,CAAE,MAAM,EAAI,EAAE,SAAS,CAAC,EAAG,MAAM,EAAG,EAAE,MAAM,KAAK,EAAG,UAAU,CAAG,CAAC,EACrG,MAAM,GAAK,EAAE,SAAS,MACtB,GAD6B,MAAM,GAAI,gCAAgC,KAAK,GAAG,MAAM,KAAK,CAAC,EAAG,qBAAqB,EAC/G,EAAE,SAAS,YAAY,QAAS,CAClC,MAAM,EAAE,SAAS,UAAW,EAAE,SAAS,UAAU,MAAM,KAAK,EAAG,wBAAwB,EACvF,MAAM,GAAK,EAAE,SAAS,UAAW,MAAM,GAAI,CAAC,GAAG,MAAM,KAAK,GAAK,gCAAgC,KAAK,GAAG,MAAM,KAAK,CAAC,EAAG,qBAAqB,CAC7I,MAAS,WAAW,EAAE,SAAS,UAAW,IAAI,EAAG,WAAW,EAAE,SAAS,UAAW,IAAI,EAEtF,MADe,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,QAAU,CAAC,EAAI,CAAC,UAAU,CAAC,EAClE,QAAS,GAAM,CACpB,GAAG,wBAAwB,CAAC,gBAAiB,CAAC,EAAE,QAAS,GAAM,CACzD,EAAE,KAAK,SAAS,MAAM,EAAG,MAAM,EAAG,UAAU,KAAK,EAAE,MAAM,KAAK,CAAC,EAAG,kBAAkB,EACnF,MAAM,EAAG,EAAE,MAAM,KAAK,EAAG,UAAU,CAC1C,CAAC,CACH,CAAC,EACG,OAAO,MAAM,MAAM,EAChB,EACT,CACA,SAAS,YAAY,OAAQ,CAC3B,MAAM,EAAI,GAAG,QAAQ,SACrB,MAAO,CACL,SAAU,EAAE,OAAS,WAAW,EAAE,MAAM,KAAK,EAAG,SAAU,EAAE,OAAS,WAAW,EAAE,MAAM,KAAK,EAC7F,KAAM,EAAE,OAAS,OAAO,EAAE,MAAM,KAAK,EAAG,SAAU,EAAE,OAAS,WAAW,EAAE,MAAO,IAAK,EAAE,OAAS,MAAM,EAAE,MAAM,KAAK,EAAG,QAAS,IAClI,CACF,CACA,SAAS,aAAc,CACrB,MAAM,EAAI,GAAG,QAAQ,SACf,QAAU,YAAY,SAAS,EAC/B,KAAO,GAAG,SAAS,QACnB,SAAW,KAAO,OAAO,OAAO,CAAC,EAAG,OAAO,EAAI,YAAY,UAAU,EAC3E,gBAAS,UAAY,KAAO,GAAK,EAAE,mBAAmB,MAAM,KAAK,EACjE,SAAS,MAAQ,KAAO,GAAK,EAAE,eAAe,MAAM,KAAK,EAClD,CACL,KAAM,EAAE,KAAK,MAAM,KAAK,EAAG,MAAO,EAAE,MAAM,MAAM,KAAK,EAAG,MAAO,EAAE,MAAM,MAAM,KAAK,EAAG,QAAS,EAAE,QAAQ,MAAM,KAAK,EACnH,IAAK,EAAE,IAAI,MAAM,KAAK,EAAG,UAAW,EAAE,UAAU,MAAM,KAAK,EAAG,QAAS,SAAU,aAAc,KAC/F,UAAW,EAAE,YAAY,QAAU,CACjC,KAAM,EAAE,SAAS,MAAO,MAAO,EAAE,UAAU,MAAM,KAAK,EAAG,WAAY,EAAE,eAAe,MAAM,KAAK,EACjG,MAAO,EAAE,UAAU,MAAM,KAAK,EAAG,MAAO,EAAE,UAAU,MAAM,KAAK,EAAG,SAAU,EAAE,aAAa,MAAM,KAAK,CACxG,EAAI,IACN,CACF,CACA,SAAS,YAAY,EAAG,CACtB,GAAI,CAAC,EAAG,OACR,MAAM,EAAI,GAAG,QAAQ,SACrB,CAAC,OAAQ,QAAS,QAAS,UAAW,MAAO,WAAW,EAAE,QAAS,GAAM,CAAM,EAAE,CAAC,GAAK,EAAE,CAAC,GAAK,OAAM,EAAE,CAAC,EAAE,MAAQ,EAAE,CAAC,EAAG,CAAC,EACzH,CAAC,UAAW,UAAU,EAAE,QAAS,GAAM,CACrC,MAAM,EAAI,EAAE,CAAC,GAAK,CAAC,EACnB,CAAC,WAAY,WAAY,OAAQ,WAAY,KAAK,EAAE,QAAS,GAAM,CAAM,EAAE,EAAI,IAAM,CAAC,GAAK,EAAE,CAAC,GAAK,OAAM,EAAE,EAAI,IAAM,CAAC,EAAE,MAAQ,EAAE,CAAC,EAAG,CAAC,CACzI,CAAC,EACD,GAAG,SAAS,QAAU,EAAE,eAAiB,GACzC,GAAG,WAAW,OAAS,GAAG,SAAS,QAC/B,EAAE,WAAY,EAAE,mBAAmB,MAAQ,EAAE,SAAS,WAAa,GAAI,EAAE,eAAe,MAAQ,EAAE,SAAS,OAAS,IACxH,MAAM,IAAM,EAAE,UACd,EAAE,YAAY,QAAU,CAAC,CAAC,IACtB,MAAO,EAAE,SAAS,MAAQ,IAAI,MAAQ,EAAE,SAAS,MAAO,EAAE,UAAU,MAAQ,IAAI,OAAS,GAAI,EAAE,eAAe,MAAQ,IAAI,YAAc,GAAI,EAAE,UAAU,MAAQ,IAAI,OAAS,GAAI,EAAE,UAAU,MAAQ,IAAI,OAAS,GAAI,EAAE,aAAa,MAAQ,IAAI,UAAY,IACjQ,EAAE,oBAAqB,IAAI,EAAE,OAAS,CAAC,GACzC,CACA,EAAE,oBAAqB,IAAI,EAAE,iBAAiB,SAAW,GAAM,CAAE,EAAE,oBAAqB,IAAI,EAAE,OAAS,CAAC,EAAE,OAAO,OAAS,CAAC,EAE3H,SAAS,QAAQ,EAAG,CAClB,MAAM,EAAI,GAAK,EAAE,UAAW,OAAK,EAC1B,CAAC,CAAC,aAAc,EAAE,IAAI,EAAG,CAAC,eAAgB,EAAE,KAAK,EAAG,CAAC,mBAAoB,EAAE,UAAU,EAAG,CAAC,mBAAoB,EAAE,KAAK,EAAG,CAAC,mBAAoB,EAAE,KAAK,EAAG,CAAC,iBAAkB,EAAE,QAAQ,CAAC,EAAE,OAAQ,GAAM,EAAE,CAAC,CAAC,EADpK,CAAC,CAE9C,CACA,GAAG,QAAQ,iBAAiB,SAAW,GAAM,CAE3C,GADA,EAAE,eAAe,EACb,CAAC,gBAAgB,EAAG,CAAE,OAAO,0CAA2C,OAAO,EAAG,MAAQ,CAC9F,MAAM,QAAU,YAAY,EAC5B,KAAK,CAAC,CACR,CAAC,EACD,GAAG,QAAQ,iBAAiB,QAAU,GAAM,CAAM,EAAE,OAAO,QAAQ,aAAa,GAAG,WAAW,EAAE,OAAQ,IAAI,CAAG,CAAC,EAKhH,SAAS,cAAc,KAAM,CAC3B,MAAM,IAAM,MAAM,SAAU,GAAI,CAAC,IAAK,OACtC,MAAM,SAAW,KACjB,MAAM,KAAQ,KAAQ,CAAE,UAAW,KAAK,KAAM,CAAE,MAAM,EAAI,EAAE,SAAS,KAAM,GAAM,EAAE,KAAO,GAAG,EAAG,GAAI,EAAG,MAAO,CAAC,EAAG,CAAC,CAAG,CAAE,OAAO,IAAM,EACjI,IAAI,QAAO,MAAM,MAAQ,CAAC,GAC9B,MAAM,MAAQ,CAAC,EAMf,IALC,IAAI,OAAS,CAAC,CAAC,IAAI,QAAS,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAK,GAAG,IAAM,CAC9D,MAAM,IAAM,KAAK,GAAG,EAAQ,MAC5B,QAAQ,IAAI,CAAC,EAAG,IAAI,CAAC,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK,KAAO,CAAC,CAAC,CAAC,EAC5D,MAAM,KAAK,IAAI,CAAC,EAAE,KAAK,EACzB,CAAC,EACG,CAAC,MAAM,OAAQ,OACnB,MAAM,cAAgB,KAAM,MAAM,MAAQ,KAAM,MAAM,SAAW,KAAM,MAAM,MAAQ,KACrF,YAAY,EAAG,UAAU,EACzB,MAAM,KAAO,MAAM,SAAW,EAAI,WAAW,IAAI,MAAM,CAAC,CAAC,CAAC,gBAAkB,WAAW,MAAM,MAAM,sCACnG,OAAO,GAAG,IAAI,8BAA8B,MAAM,OAAS,EAAI,kCAAoC,EAAE,EAAE,CACzG,CACA,SAAS,aAAc,CACrB,GAAI,CAAC,MAAM,eAAiB,CAAC,MAAM,QAAS,OAC5C,MAAM,EAAI,MAAM,QAAQ,KAAM,GAAM,EAAE,SAAW,MAAM,aAAa,EACpE,MAAM,cAAgB,KAClB,GAAG,WAAW,IAAM,iBAAiB,CAAC,EAAG,EAAE,CACjD,CACA,YAAY,EAAE,KAAM,MAAS,CAG3B,GAFA,MAAM,QAAU,KAChB,cAAc,IAAI,EACd,MAAM,OAAS,EAAG,YAAY,UACzB,MAAM,eAAiB,MAAM,OAAS,EAAG,CAChD,MAAM,EAAI,KAAK,KAAM,GAAM,EAAE,SAAW,MAAM,aAAa,EACvD,GAAG,OAAO,WAAW,IAAI,EAAE,KAAK,CAAC,uEAAkE,CACzG,CACA,GAAG,cAAc,YAAc,GAAG,KAAK,MAAM,8EAC7C,YAAY,CACd,CAAC,EAAE,MAAM,IAAM,CAAE,GAAG,cAAc,YAAc,yEAA2E,CAAC,EAE5H,IAAI,UAAY,GAChB,SAAS,cAAc,EAAG,CACxB,MAAM,MAAQ,EAAE,YAAY,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO,EACzD,MAAI,CAAC,MAAM,QAAU,CAAC,MAAM,QAAgB,CAAC,EACtC,MAAM,QAAQ,OAAQ,GAAM,MAAM,MAAO,GAAM,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC,EACrE,KAAK,CAAC,EAAG,IAAO,EAAE,MAAM,YAAY,EAAE,WAAW,MAAM,CAAC,CAAC,EAAI,EAAE,MAAM,YAAY,EAAE,WAAW,MAAM,CAAC,CAAC,CAAE,EACxG,MAAM,EAAG,EAAE,CAChB,CACA,SAAS,WAAW,EAAG,CACrB,MAAM,OAAS,EAAE,SAAS,IAAK,GAAM,EAAE,KAAK,EACtC,IAAM,KAAK,IAAI,MAAM,KAAM,MAAM,EAAS,IAAM,KAAK,IAAI,MAAM,KAAM,MAAM,EACjF,OAAO,MAAQ,IAAM,MAAM,GAAG,EAAI,QAAU,MAAM,GAAG,CACvD,CACA,SAAS,eAAgB,CACvB,MAAM,EAAI,GAAG,OAAO,MAAM,KAAK,EAC/B,GAAI,CAAC,EAAG,CAAE,GAAG,QAAQ,OAAS,GAAM,MAAQ,CAC5C,GAAI,CAAC,MAAM,QAAS,CAAE,GAAG,QAAQ,UAAY,iEAA6D,GAAG,QAAQ,OAAS,GAAO,MAAQ,CAC7I,MAAM,IAAM,cAAc,CAAC,EAC3B,UAAY,GACZ,GAAG,QAAQ,UAAY,IAAI,OAAS,IAAI,IAAI,CAAC,EAAG,IAAM;AAAA,+DACG,EAAE,EAAE,eAAe,CAAC;AAAA,YACvE,EAAE,MAAQ,aAAa,IAAI,MAAM,EAAE,MAAO,GAAG,CAAC,CAAC,2BAA6B,mCAAmC;AAAA,qBACtG,IAAI,EAAE,KAAK,CAAC,cAAc,IAAI,CAAC,EAAE,OAAQ,EAAE,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,CAAC,CAAC,GAAG,EAAE,WAAa,SAAQ,EAAE,SAAS,OAAS,WAAa,EAAE;AAAA,kBAC7I,WAAW,CAAC,CAAC;AAAA,kBACb,EAAE,KAAK,EAAE,EAAI,mHACzB,GAAG,QAAQ,OAAS,EACtB,CACA,GAAG,OAAO,iBAAiB,QAAS,aAAa,EACjD,GAAG,OAAO,iBAAiB,QAAS,aAAa,EACjD,GAAG,OAAO,iBAAiB,UAAY,GAAM,CAC3C,MAAM,KAAO,GAAG,gBAAiB,GAAG,OAAO,EACtC,KAAK,SACN,EAAE,MAAQ,aAAe,EAAE,MAAQ,WACrC,EAAE,eAAe,EACjB,WAAa,WAAa,EAAE,MAAQ,YAAc,EAAI,IAAM,KAAK,QAAU,KAAK,OAChF,KAAK,QAAQ,CAAC,EAAG,IAAM,EAAE,UAAU,OAAO,YAAa,IAAM,SAAS,CAAC,EACvE,KAAK,SAAS,EAAE,eAAe,CAAE,MAAO,SAAU,CAAC,GAC1C,EAAE,MAAQ,SACnB,EAAE,eAAe,GAChB,KAAK,SAAS,GAAK,KAAK,CAAC,GAAG,MAAM,GAC1B,EAAE,MAAQ,WAAY,GAAG,QAAQ,OAAS,IACvD,CAAC,EACD,SAAS,iBAAiB,QAAU,GAAM,CAAO,EAAE,OAAO,QAAQ,eAAe,IAAG,GAAG,QAAQ,OAAS,GAAM,CAAC,EAC/G,GAAG,QAAQ,iBAAiB,QAAU,GAAM,CAC1C,MAAM,EAAI,EAAE,OAAO,QAAQ,YAAY,EACvC,GAAI,CAAC,EAAG,OACR,MAAM,EAAI,MAAM,QAAQ,KAAM,GAAM,OAAO,EAAE,EAAE,IAAM,EAAE,QAAQ,GAAG,EAClE,GAAG,QAAQ,OAAS,GACpB,GAAG,OAAO,MAAQ,GAClB,iBAAiB,CAAC,CACpB,CAAC,EAED,SAAS,YAAY,EAAG,SAAU,CAChC,OAAO,EAAE,SAAS,KAAM,GAAM,EAAE,QAAQ,MAAM,CAAC,EAAG,IAAM,IAAM,SAAS,CAAC,CAAC,CAAC,GAAK,IACjF,CAGA,eAAe,SAAS,OAAQ,CAC9B,MAAM,KAAO,MAAM,MAAM,aAAe,mBAAmB,MAAM,EAAG,CAAE,YAAa,aAAc,CAAC,EAAE,KAAM,GAAM,EAAE,KAAK,CAAC,EAClH,EAAI,IAAI,UAAU,EAAE,gBAAgB,KAAM,WAAW,EACrD,KAAO,EAAE,cAAc,wBAAwB,EACrD,GAAI,CAAC,KAAM,OAAO,KAClB,GAAI,CAAC,SAAS,eAAe,iBAAiB,EAAG,CAC/C,MAAM,GAAK,MAAM,KAAK,EAAE,iBAAiB,OAAO,CAAC,EAAE,KAAM,GAAM,kBAAkB,KAAK,EAAE,WAAW,CAAC,EACpG,GAAI,GAAI,CAAE,MAAM,EAAI,SAAS,cAAc,OAAO,EAAG,EAAE,GAAK,kBAAmB,EAAE,YAAc,GAAG,YAAa,SAAS,KAAK,YAAY,CAAC,CAAG,CAC/I,CACA,GAAI,CAAC,OAAO,iBAAkB,CAC5B,MAAM,IAAM,MAAM,KAAK,EAAE,OAAO,EAAE,OAAQ,GAAM,EAAE,YAAY,SAAS,kBAAkB,CAAC,EAAE,KAAK,CAAC,EAAG,IAAM,EAAE,YAAY,OAAS,EAAE,YAAY,MAAM,EAAE,CAAC,EACzJ,GAAI,IAAK,CAAE,MAAM,EAAI,SAAS,cAAc,QAAQ,EAAG,EAAE,YAAc,IAAI,YAAa,SAAS,KAAK,YAAY,CAAC,CAAG,CACxH,CACA,OAAK,OAAO,iBACL,KAAK,MAAM,KAAK,WAAW,EADG,IAEvC,CACA,IAAI,SAAW,EACf,SAAS,iBAAiB,EAAG,CAC3B,MAAM,MAAQ,EAAE,SACV,MAAQ,EAAE,SAAS,KAAM,GAAM,EAAE,SAAS,GAAK,EAAE,SAAS,CAAC,EAC3D,SAAW,MAAM,QAAQ,MAAM,EAC/B,QAAU,EAAE,WAAa,EAAE,QAAQ,IAAI,CAAC,KAAM,IAAM,CACxD,MAAM,OAAS,CAAC,GAAG,IAAI,IAAI,EAAE,SAAS,IAAK,GAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC/D,MAAO,UAAU,IAAI,IAAI,CAAC,qBAAqB,CAAC,KAAK,OAAO,IAAK,GAAM,WAAW,IAAM,SAAS,CAAC,EAAI,WAAa,EAAE,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,mBACtJ,CAAC,EAAE,KAAK,EAAE,EAAI,GACd,GAAG,aAAa,UAAY;AAAA,oBACd,IAAI,MAAM,MAAM,OAAS,EAAE,MAAO,GAAG,CAAC,CAAC;AAAA;AAAA,0CAEjB,IAAI,EAAE,KAAK,CAAC;AAAA,kDACJ,IAAI,CAAC,EAAE,OAAQ,EAAE,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,CAAC,CAAC,4BAAyB,IAAI,EAAE,MAAM,CAAC;AAAA,YAC/H,EAAE,WAAa,kKAA+J,EAAE;AAAA,YAChL,QAAU,uDAAuD,OAAO,SAAW,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAQ1H,GAAG,aAAa,OAAS,GACzB,MAAM,OAAS,IAAM,CACnB,MAAM,EAAI,YAAY,EAAG,QAAQ,EAC3B,QAAU,EAAE,gBAAiB,GAAG,YAAY,EAC5C,IAAM,EAAE,cAAe,GAAG,YAAY,EAC5C,GAAI,CAAC,EAAG,CAAE,QAAQ,UAAY,6DAAoD,IAAI,SAAW,GAAM,MAAQ,CAC/G,IAAI,SAAW,GACf,QAAQ,UAAY,GAAG,MAAM,EAAE,KAAK,CAAC,UAAU,IAAI,cAAgB,YAAc,WAAW,SAAM,EAAE,UAAY,uBAAyB,8DAAyD,WAC9L,EAAE,QAAO,EAAE,cAAe,GAAG,YAAY,EAAE,IAAM,MAAM,EAAE,MAAO,GAAG,EACzE,EAaA,GAZA,GAAG,aAAc,GAAG,YAAY,EAAE,QAAS,GAAM,EAAE,iBAAiB,SAAU,IAAM,CAAE,SAAS,OAAO,EAAE,QAAQ,GAAG,CAAC,EAAI,EAAE,MAAO,OAAO,CAAG,CAAC,CAAC,EAC7I,EAAE,gBAAiB,GAAG,YAAY,EAAE,iBAAiB,QAAS,IAAM,CAAE,GAAG,aAAa,OAAS,EAAM,CAAC,EACtG,EAAE,cAAe,GAAG,YAAY,EAAE,iBAAiB,QAAS,IAAM,CAChE,MAAM,EAAI,YAAY,EAAG,QAAQ,EAC3B,IAAM,KAAK,IAAI,EAAG,SAAS,EAAE,cAAe,GAAG,YAAY,EAAE,MAAO,EAAE,GAAK,CAAC,EAC7E,IACL,QAAQ,EAAG,EAAG,GAAG,EACjB,GAAG,aAAa,OAAS,GACzB,GAAG,OAAO,MAAM,EAClB,CAAC,EACD,OAAO,EACP,GAAG,aAAa,eAAe,CAAE,SAAU,SAAU,MAAO,SAAU,CAAC,EACnE,CAAC,EAAE,WAAY,OACnB,MAAM,KAAO,EAAE,cAAe,GAAG,YAAY,EACvC,MAAQ,EAAE,oBAAqB,GAAG,YAAY,EAC9C,SAAW,IAAM,CAAE,GAAI,QAAU,SAAU,OAAQ,KAAK,OAAO,EAAG,MAAM,GAAK,EAAE,kBAAmB,GAAG,YAAY,EAAO,KAAI,GAAG,OAAS,GAAO,EACrJ,SAAS,EAAE,MAAM,EAAE,KAAM,IAAO,CAC9B,GAAI,QAAU,SAAU,OACxB,GAAI,CAAC,IAAM,CAAC,GAAG,QAAS,OAAO,SAAS,EAExC,MAAM,UAAY,GAAG,QAAQ,QAAQ,IAAK,GAAM,CAC9C,MAAM,KAAO,OAAO,GAAM,SAAW,EAAI,EAAE,KACrC,KAAO,OAAO,GAAM,SAAW,CAAC,EAAI,EAAE,OAC5C,MAAO,yBAAyB,IAAI,IAAI,CAAC,MAAM,KAAK,IAAK,GAAM,WAAW,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,WACvG,CAAC,EAAE,KAAK,EAAE,EACV,MAAM,KAAO,SAAS,KAChB,KAAO,IAAM,CACjB,EAAE,QAAQ,QAAQ,CAAC,KAAM,IAAM,CAAE,MAAM,IAAM,MAAM,cAAc,wBAAwB,IAAI,OAAO,IAAI,CAAC,KAAK,EAAO,KAAO,IAAI,QAAO,SAAS,CAAC,EAAI,IAAI,MAAO,CAAC,EACjK,OAAO,EACH,SAAS,OAAS,MAAM,QAAQ,aAAa,QAAQ,MAAO,GAAI,IAAI,CAC1E,EACA,MAAM,iBAAiB,SAAU,IAAI,EACrC,KAAK,UAAY,GACjB,GAAI,CACF,IAAI,OAAO,iBAAiB,KAAM,GAAG,QAAS,OAAO,OAAO,CAAC,EAAG,GAAI,CAAE,MAAO,SAAU,GAAO,WAAY,MAAM,EAAG,CAAC,CAAC,CACvH,OAAS,EAAG,CAAE,eAAQ,KAAK,kCAAmC,CAAC,EAAU,SAAS,CAAG,CACrF,GAAI,CAAC,KAAK,cAAc,gBAAgB,EAAG,OAAO,SAAS,EAC3D,KAAK,iBAAiB,QAAS,IAAM,WAAW,KAAM,CAAC,CAAC,EACxD,KAAK,CACP,CAAC,EAAE,MAAM,QAAQ,CACnB,CACA,SAAS,QAAQ,EAAG,EAAG,IAAK,CAC1B,MAAM,SAAW,MAAM,MAAM,KAAM,GAAM,EAAE,YAAc,EAAE,EAAE,EACzD,SAAU,SAAS,KAAO,IACzB,MAAM,MAAM,KAAK,CACpB,UAAW,EAAE,GAAI,UAAW,EAAE,GAAI,OAAQ,EAAE,OAAQ,MAAO,EAAE,MAAO,aAAc,EAAE,WAAa,EAAE,MAAQ,GAC3G,IAAK,EAAE,IAAK,MAAO,EAAE,MAAO,IAAK,MAAO,EAAE,OAAS,EAAE,MAAO,iBAAkB,EAAE,iBAAkB,QAAS,EAAE,QAAS,UAAW,EAAE,UAAW,OAAQ,EAAE,MAC1J,CAAC,EACD,MAAM,SAAW,KACjB,YAAY,EACZ,UAAU,CACZ,CAEA,SAAS,aAAc,CACjB,CAAC,MAAM,SAAW,CAAC,MAAM,MAAM,SACnC,MAAM,MAAM,QAAS,IAAO,CAC1B,MAAM,EAAI,MAAM,QAAQ,KAAM,GAAM,EAAE,KAAO,GAAG,SAAS,EACnD,EAAI,GAAK,EAAE,SAAS,KAAM,GAAM,EAAE,KAAO,GAAG,SAAS,EACvD,IAAK,GAAG,MAAQ,EAAE,MAAO,GAAG,UAAY,EAAE,UAAW,GAAG,iBAAmB,EAAE,iBAAkB,GAAG,QAAU,EAAE,QACpH,CAAC,EACD,YAAY,EACd,CACA,SAAS,aAAc,CACrB,GAAI,CAAC,MAAM,MAAM,OAAQ,CAAE,GAAG,MAAM,UAAY,6FAAyF,MAAQ,CACjJ,MAAM,EAAI,cAAc,MAAM,MAAO,EAAG,GAAG,EAC3C,GAAG,MAAM,UAAY;AAAA;AAAA;AAAA,mBAGR,MAAM,MAAM,IAAI,CAAC,EAAG,MAAQ;AAAA;AAAA,iDAEE,EAAE,MAAQ,iCAAiC,IAAI,MAAM,EAAE,MAAO,GAAG,CAAC,CAAC,YAAc,EAAE,QAAQ,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,aAAe,UAAU,IAAI,EAAE,YAAY,CAAC,WAAa,EAAE,GAAG,EAAE,YAAc,GAAQ,yFAAsF,EAAE;AAAA,qCACtS,MAAM,EAAE,KAAK,CAAC;AAAA,+FAC4C,EAAE,GAAG,eAAe,GAAG;AAAA,gCACtF,MAAM,EAAE,MAAQ,EAAE,GAAG,CAAC;AAAA,wFACkC,GAAG,wBAAwB,IAAI,EAAE,KAAK,CAAC;AAAA,kBAC7G,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,yDAE6B,IAAI,cAAgB,cAAgB,aAAa,wBAAwB,MAAM,EAAE,QAAQ,CAAC;AAAA,iBAE/I,CACA,GAAG,MAAM,iBAAiB,SAAW,GAAM,CACzC,MAAM,EAAI,EAAE,OAAO,QAAQ,YAAY,EACvC,GAAI,CAAC,EAAG,OACR,MAAM,EAAI,MAAM,MAAM,OAAO,EAAE,QAAQ,GAAG,CAAC,EAC3C,EAAE,IAAM,KAAK,IAAI,EAAG,SAAS,EAAE,MAAO,EAAE,GAAK,CAAC,EAC9C,MAAM,SAAW,KACjB,YAAY,EAAG,UAAU,CAC3B,CAAC,EACD,GAAG,MAAM,iBAAiB,QAAU,GAAM,CACxC,MAAM,EAAI,EAAE,OAAO,QAAQ,eAAe,EACrC,IACL,MAAM,MAAM,OAAO,OAAO,EAAE,QAAQ,MAAM,EAAG,CAAC,EAC9C,MAAM,SAAW,KACjB,YAAY,EAAG,UAAU,EAC3B,CAAC,EACD,GAAG,MAAM,iBAAiB,QAAS,IAAM,CAAE,MAAM,MAAQ,GAAG,MAAM,MAAO,UAAU,CAAG,CAAC,EACvF,EAAE,uBAAwB,IAAI,EAAE,iBAAiB,QAAS,IAAM,CAC9D,GAAI,CAAC,MAAM,MAAM,OAAQ,CAAE,OAAO,0CAA2C,OAAO,EAAG,MAAQ,CAC/F,MAAM,MAAQ,GAAG,MAAM,MAAM,KAAK,EAClC,KAAK,CAAC,CACR,CAAC,EAGD,MAAM,SAAY,GAAM,CAAC,EAAE,SAAU,EAAE,SAAU,EAAE,MAAO,EAAE,UAAY,IAAM,KAAO,EAAE,KAAO,GAAG,EAAE,OAAQ,GAAM,GAAK,EAAE,KAAK,CAAC,EAAE,KAAK,IAAI,EACzI,SAAS,eAAgB,CACvB,MAAM,EAAI,MAAM,QAChB,GAAG,OAAO,YAAc,EAAI,SAAS,EAAE,QAAQ,EAAI,GACvC,KAAK,UAAU,CAAC,MAAM,MAAM,IAAK,GAAM,CAAC,EAAE,UAAW,EAAE,GAAG,CAAC,EAAG,GAAK,EAAE,SAAS,IAAK,GAAK,EAAE,SAAS,QAAQ,CAAC,IAC5G,MAAM,WAAY,MAAM,MAAQ,KAAU,MAAM,UAAY,MAAM,SAAS,SAAW,SAAQ,MAAM,SAAW,OAC3H,MAAM,EAAI,MAAM,SAAW,MAAM,SAAS,OAAS,KACnD,GAAG,QAAQ,QAAS,GAAM,CAAE,EAAE,QAAU,EAAE,QAAU,CAAG,CAAC,EACxD,eAAe,CACjB,CACA,SAAS,gBAAiB,CACxB,MAAM,GAAK,GAAG,QAAQ,KAAM,GAAM,EAAE,OAAO,GAAK,CAAC,GAAG,MAChD,GAAG,aAAY,GAAG,WAAW,OAAS,IAAM,UAC5C,IAAM,UACR,MAAM,SAAW,CAAE,OAAQ,SAAU,KAAM,gBAAkB,IAAI,WAAY,MAAO,EAAG,KAAM,QAAS,EACtG,GAAG,MAAM,OAAS,IACT,IAAM,QACf,GAAG,MAAM,OAAS,IACd,CAAC,MAAM,UAAY,MAAM,SAAS,SAAW,UAAQ,MAAM,SAAW,MACtE,MAAM,MAAO,YAAY,EAAQ,UAAU,IAE/C,MAAM,SAAW,KAAM,GAAG,MAAM,OAAS,IAE3C,GAAG,aAAa,SAAW,CAAC,MAAM,QACpC,CACA,GAAG,QAAQ,QAAS,GAAM,EAAE,iBAAiB,SAAU,cAAc,CAAC,EACtE,IAAI,UAAY,EAChB,eAAe,WAAY,CACzB,MAAM,MAAQ,EAAE,UACV,EAAI,MAAM,QAChB,GAAG,MAAM,UAAY,6FAA+F,IAAI,EAAE,SAAS,KAAO,IAAM,EAAE,SAAS,GAAG,EAAI,+CAClK,GAAG,aAAa,SAAW,GAC3B,GAAI,CACF,MAAM,IAAM,MAAM,WAAW,MAAM,MAAO,EAAE,SAAW,KAAQ,CAAE,GAAI,QAAU,UAAW,CAAE,MAAM,EAAI,EAAE,iBAAkB,GAAG,KAAK,EAAO,IAAG,EAAE,UAAY,sCAAwC,IAAI,GAAG,EAAG,CAAE,CAAC,EAC/M,GAAI,QAAU,UAAW,OACzB,MAAM,MAAQ,GAChB,MAAY,CACV,GAAI,QAAU,UAAW,OACzB,MAAM,MAAQ,CAAE,MAAO,CAAC,EAAG,QAAS,GAAM,MAAO,EAAK,CACxD,CACA,MAAM,SAAW,KAAK,UAAU,CAAC,MAAM,MAAM,IAAK,GAAM,CAAC,EAAE,UAAW,EAAE,GAAG,CAAC,EAAG,EAAE,SAAS,IAAK,EAAE,SAAS,QAAQ,CAAC,EACnH,YAAY,CACd,CACA,SAAS,aAAc,CACrB,MAAM,IAAM,MAAM,MACZ,KAAO,IAAI,MAAM,MAAM,EACvB,IAAM,CAAC,KAAK,QAAU,IAAI,QAChC,IAAI,KAAO,4BACP,IAAI,MAAO,MAAQ,+JACb,KAAK,OACN,IAAI,UAAS,MAAQ,0LADP,MAAQ,sRAE/B,KAAK,QAAQ,CAAC,EAAG,IAAM,CACrB,MAAM,MAAQ,EAAE,KAAO,oBAAoB,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,GAAK,EAAE,KAAK,CAAC,IAAM,EAAE,KAAK,CAAC,EAAI,SAAM,EAAE,KAAK,CAAC,EAAI,EAAE,yBAA2B,KAAO,EAAE,MAAQ,mBAAmB,MAAM,EAAE,KAAK,CAAC,yCAA2C,IAC1O,MAAQ,iEAAiE,KAAK,QAAQ,SAAS,YAAY,CAAC,mCAAmC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,yCAAyC,EAAE,QAAU,EAAI,OAAS,MAAM,EAAE,KAAK,CAAC,iBACnP,CAAC,EACG,MAAK,MAAQ,iEAAiE,KAAK,QAAQ,SAAS,6LACxG,MAAQ,kFACR,GAAG,MAAM,UAAY,KACrB,MAAM,IAAM,MAAM,UAAY,MAAM,SAAS,SAAW,OAAS,MAAM,SAAW,KAClF,GAAG,oBAAqB,GAAG,KAAK,EAAE,QAAS,KAAQ,CAC7C,MAAS,IAAI,QAAU,OAAS,IAAI,OAAS,OAAW,KAAK,IAAI,KAAK,GAAK,KAAK,IAAI,KAAK,EAAE,OAAS,IAAI,QAAQ,IAAI,QAAU,IAClI,IAAI,iBAAiB,SAAU,IAAM,CACnC,GAAI,IAAI,QAAU,MAAO,MAAM,SAAW,CAAE,OAAQ,OAAQ,KAAM,0BAA2B,MAAO,KAAM,KAAM,KAAM,MACjH,CAAE,MAAM,EAAI,KAAK,OAAO,IAAI,KAAK,CAAC,EAAG,MAAM,SAAW,CAAE,OAAQ,OAAQ,KAAM,EAAE,KAAM,MAAO,EAAE,MAAO,KAAM,EAAE,KAAM,KAAM,EAAE,IAAK,CAAG,CACzI,GAAG,aAAa,SAAW,EAC7B,CAAC,CACH,CAAC,EACD,EAAE,gBAAiB,GAAG,KAAK,EAAE,iBAAiB,QAAS,IAAM,CAAE,MAAM,MAAQ,KAAM,MAAM,SAAW,KAAM,UAAU,CAAG,CAAC,EACxH,GAAG,aAAa,SAAW,CAAC,MAAM,QACpC,CACA,GAAG,aAAa,iBAAiB,QAAS,IAAM,CACzC,MAAM,WACX,WAAW,EACX,KAAK,CAAC,EACR,CAAC,EAGD,SAAS,YAAa,CACpB,MAAM,EAAI,IAAI,KACR,IAAM,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,EAAI,OAAO,EAAE,SAAS,EAAI,CAAC,EAAE,SAAS,EAAG,GAAG,EAAI,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAG,GAAG,EACxH,MAAQ,mCACd,IAAI,EAAI,GACR,OADwB,OAAO,gBAAgB,IAAI,WAAW,CAAC,CAAC,EAC5D,QAAS,GAAM,CAAE,GAAK,MAAM,EAAI,MAAM,MAAM,CAAG,CAAC,EAC7C,IAAM,IAAM,IAAM,CAC3B,CACA,SAAS,YAAa,CACpB,MAAM,IAAM,IAAI,KACV,KAAO,MAAM,MACb,KAAO,KAAO,KAAK,KAAO,WAAW,EACrC,IAAM,KAAO,KAAK,IAAM,EAAI,EAC5B,MAAQ,IAAI,KAAK,IAAI,QAAQ,EAAI,IAAI,UAAY,KAAQ,EACzD,OAAS,cAAc,MAAM,MAAO,MAAM,SAAS,MAAO,GAAG,EACnE,MAAM,MAAQ,CACZ,EAAG,EAAG,KAAM,IAAK,GAAI,MAAQ,IAAM,EAAI,KAAO,IAAM,IACpD,QAAS,IAAI,YAAY,EAAG,WAAY,MAAM,YAAY,EAC1D,QAAS,MAAM,QAAS,MAAO,MAAM,MAAM,IAAK,GAAM,OAAO,OAAO,CAAC,EAAG,CAAC,CAAC,EAAG,SAAU,OAAO,OAAO,CAAC,EAAG,MAAM,QAAQ,EACvH,MAAO,MAAM,MAAO,OAAQ,cAAe,IAAI,aACjD,EACA,MAAM,IAAM,MAAM,IAAI,UAAW,CAAC,CAAC,EACnC,IAAI,MAAM,MAAM,EAAE,EAAI,MAAM,MACf,OAAO,KAAK,GAAG,EAAE,KAAK,CAAC,EAAG,IAAM,IAAI,KAAK,IAAI,CAAC,EAAE,OAAO,EAAI,IAAI,KAAK,IAAI,CAAC,EAAE,OAAO,CAAC,EAC3F,MAAM,EAAE,EAAE,QAAS,GAAM,OAAO,IAAI,CAAC,CAAC,EAC3C,MAAM,IAAI,UAAW,GAAG,EACxB,UAAU,MAAM,MAAO,GAAG,GAAG,EAC7B,MAAM,UAAY,UAAU,MAAM,KAAK,CACzC,CACA,SAAS,aAAa,EAAG,CACvB,MAAM,IAAM,MAAM,IAAI,UAAW,CAAC,CAAC,EAAG,IAAI,EAAE,EAAE,EAAI,EAAG,MAAM,IAAI,UAAW,GAAG,EAAG,UAAU,CAC5F,CAEA,eAAe,UAAU,EAAG,CAC1B,GAAI,CAAC,IAAI,SAAU,CAAE,YAAY,CAAC,EAAG,MAAQ,CAC7C,GAAI,CACF,MAAM,KAAO,IAAI,gBAAyB,GAAK,WAAW,IAAM,KAAK,MAAM,EAAG,GAAK,EAC7E,QAAU,OAAO,OAAO,CAAC,EAAG,CAAC,EAAG,OAAO,QAAQ,UACrD,MAAM,EAAI,MAAM,MAAM,IAAI,SAAS,QAAQ,MAAO,EAAE,EAAI,SAAU,CAAE,OAAQ,OAAQ,YAAa,cAAe,QAAS,CAAE,eAAgB,mBAAoB,OAAQ,kBAAmB,EAAG,KAAM,KAAK,UAAU,OAAO,EAAG,OAAQ,KAAK,MAAO,CAAC,EACjP,aAAa,EAAE,EACf,MAAM,EAAI,MAAM,EAAE,KAAK,EACvB,GAAI,CAAC,EAAE,GAAI,MAAM,IAAI,MAAM,EAAE,OAAS,cAAc,EACpD,EAAE,QAAU,EAAE,QAAS,EAAE,UAAY,EAAE,UAClC,EAAE,SAAS,YAAY,CAAC,EAC7B,aAAa,CAAC,EACV,MAAM,QAAU,GAAG,UAAU,EAAG,GAAG,GAAG,CAC5C,OAAS,EAAG,CACV,QAAQ,KAAK,sCAAuC,CAAC,EACrD,YAAY,CAAC,CACf,CACF,CAEA,SAAS,SAAS,EAAG,CACnB,MAAM,EAAI,EAAE,UAAY,CAAC,EACzB,GAAI,EAAE,SAAW,SAAU,MAAO,CAAE,MAAO,UAAW,MAAO,CAAC,IAAI,WAAa,KAAO,IAAI,aAAa,CAAE,EACzG,MAAM,MAAQ,CAAC,EACX,EAAE,MAAQ,CAAC,cAAc,KAAK,EAAE,IAAI,GAAG,MAAM,KAAK,EAAE,IAAI,EAC5D,MAAM,EAAI,EAAE,SAAW,EAAE,QAAQ,SACjC,OAAI,GAAG,MAAM,KAAK,CAAC,EAAE,UAAW,EAAE,SAAU,EAAE,SAAU,GAAG,EAAE,IAAI,IAAI,EAAE,QAAQ,IAAI,EAAE,GAAG,EAAE,EAAE,OAAQ,GAAM,GAAK,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EACpI,CAAE,MAAO,WAAY,KAAM,CACpC,CACA,MAAM,WAAc,GAAM,IAAI,SAAS,QAAQ,MAAO,EAAE,EAAI,aAAe,EAAE,QAAU,EAAE,UAAY,YAAc,EAAE,UAAY,IACjI,SAAS,WAAW,EAAG,CACrB,MAAM,QAAU,CAAE,EAAG,EAAE,GAAI,EAAG,EAAE,SAAW,OAAW,EAAG,EAAE,QAAS,EAAG,EAAE,WAAY,EAAG,EAAE,MAAM,IAAK,GAAM,CAAC,EAAE,UAAW,EAAE,IAAK,EAAE,KAAK,CAAC,EAAG,EAAG,CAAC,EAAE,SAAS,OAAQ,EAAE,SAAS,KAAM,EAAE,SAAS,KAAK,EAAG,EAAG,EAAE,OAAO,KAAM,EACxN,OAAO,IAAI,QAAU,WAAa,aAAa,KAAK,UAAU,OAAO,CAAC,CACxE,CACA,SAAS,cAAc,EAAG,CACxB,MAAM,EAAI,EAAE,QACZ,GAAI,EAAE,SAAS,SAAW,SAAU,MAAO,+BAA+B,IAAI,IAAI,UAAU,CAAC,OAAO,IAAI,IAAI,aAAa,CAAC,GAC1H,MAAM,EAAI,EAAE,SACZ,MAAO,GAAG,EAAE,UAAY,IAAI,EAAE,SAAS,EAAI,OAAS,EAAE,GAAG,IAAI,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,SAAW,OAAS,IAAI,EAAE,QAAQ,EAAI,EAAE,OAAO,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,MAAQ,OAAS,IAAI,EAAE,KAAK,EAAI,EAAE,EACtO,CACA,SAAS,UAAU,EAAG,OAAQ,CAC5B,MAAM,EAAI,EAAE,QAAe,EAAI,EAAE,OAC3B,EAAI,EAAE,QACN,KAAO,WAAW,CAAC,EACzB,OAAO,UAAY;AAAA;AAAA;AAAA,cAGX,IAAI,QAAU,aAAa,IAAI,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,QAAQ,CAAC,KAAO,mCAAmC,IAAI,IAAI,QAAQ,CAAC,QAAQ;AAAA,iBACtI,IAAI,IAAM,OAAS,IAAI,IAAI,GAAG,EAAI,OAAS,EAAE,GAAG,IAAI,IAAI,aAAa,CAAC,OAAO,IAAI,IAAI,KAAK,CAAC,SAAM,IAAI,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,SAAS,QAAQ,eAAgB,EAAE,CAAC,CAAC;AAAA;AAAA;AAAA,4BAGxJ,EAAE,UAAY,oCAAoC,IAAI,EAAE,SAAS,CAAC,OAAS,EAAE;AAAA;AAAA,kDAEvD,IAAI,EAAE,EAAE,CAAC;AAAA,qCACtB,QAAQ,EAAE,OAAO,CAAC;AAAA,4CACX,QAAQ,EAAE,UAAU,CAAC;AAAA,gBACjD,EAAE,UAAY,6BAA6B,IAAI,EAAE,SAAS,CAAC,aAAe,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,iDAK3C,IAAI,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,IAAM,WAAa,IAAI,EAAE,GAAG,EAAI,EAAE,OAAO,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,MAAQ,OAAS,IAAI,EAAE,KAAK,EAAI,EAAE;AAAA,oCACvJ,IAAI,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,SAAW,OAAS,IAAI,EAAE,QAAQ,EAAI,EAAE,OAAO,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE,GAAG,CAAC;AAAA,qBACnJ,EAAE,SAAS,SAAW,SAAW,aAAe,SAAS,WAAW,cAAc,CAAC,CAAC;AAAA;AAAA,UAE/F,QAAQ,CAAC,EAAE,OAAS,wDAAwD,QAAQ,CAAC,EAAE,IAAK,GAAM,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,cAAgB,EAAE;AAAA;AAAA;AAAA;AAAA,cAIjL,EAAE,MAAM,IAAI,CAAC,EAAG,IAAM,WAAW,EAAI,CAAC,YAAY,EAAE,MAAQ,YAAY,IAAI,WAAW,CAAC,CAAC,CAAC,kEAAkE,IAAI,MAAM,EAAE,MAAO,GAAG,CAAC,CAAC,gBAAkB,EAAE,YAAY,EAAE,OAAS,kCAAkC,IAAI,WAAW,CAAC,CAAC,CAAC,4CAA4C,IAAI,EAAE,KAAK,CAAC,gBAAkB,WAAW,IAAI,EAAE,KAAK,CAAC,WAAW,GAAG,EAAE,aAAe,UAAU,IAAI,EAAE,YAAY,CAAC,WAAa,EAAE,wBAAwB,EAAE,GAAG,wBAAwB,MAAM,EAAE,KAAK,CAAC,wBAAwB,MAAM,EAAE,MAAQ,EAAE,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC;AAAA,mEACjhB,IAAI,SAAS,CAAC,EAAE,KAAK,CAAC,YAAY,SAAS,CAAC,EAAE,MAAM,IAAK,GAAM,UAAU,IAAI,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,8CAA8C,MAAM,EAAE,SAAS,KAAK,CAAC,wBAAwB,MAAM,EAAE,SAAS,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA,qCAIrP,MAAM,EAAE,QAAQ,CAAC;AAAA,oBAClC,EAAE,SAAS,SAAW,SAAW,UAAY,UAAU,YAAY,EAAE,SAAS,OAAS,KAAO,MAAQ,MAAM,EAAE,OAAO,CAAC;AAAA,YAC9H,EAAE,cAAgB,GAAK,6BAA6B,MAAM,EAAE,GAAG,CAAC,YAAY;AAAA,8CAC1C,EAAE,SAAS,OAAS,KAAO,oBAAsB,EAAE,YAAY,MAAM,EAAE,KAAK,CAAC;AAAA,YAC/G,EAAE,cAAgB,kDAAkD,MAAM,EAAE,GAAG,CAAC,aAAe,EAAE;AAAA;AAAA;AAAA;AAAA,cAI/F,EAAE,MAAQ,oBAAoB,IAAI,EAAE,KAAK,EAAE,QAAQ,MAAO,MAAM,CAAC,OAAS,EAAE;AAAA,cAC5E,IAAI,aAAe,sBAAsB,IAAI,IAAI,YAAY,CAAC,OAAS,EAAE;AAAA;AAAA,kCAErD,IAAI,IAAI,UAAU,CAAC,wDAAwD,IAAI,IAAI,QAAQ,CAAC,qGAAkG,IAAI,IAAI,QAAQ,CAAC;AAAA;AAAA,oLAElE,IAAI,IAAI,QAAQ,QAAQ,eAAgB,EAAE,CAAC,CAAC,iBAAiB,IAAI,IAAI,CAAC,kBAAkB,IAAI,EAAE,EAAE,CAAC,0BAC5Q,CACA,SAAS,UAAU,EAAG,CACpB,MAAM,EAAI,EAAE,QACN,MAAQ,EAAE,MAAM,IAAK,GAAM,KAAK,EAAE,GAAG,MAAM,EAAE,KAAK,GAAG,EAAE,aAAe,KAAO,EAAE,aAAe,IAAM,EAAE,GAAG,EAAE,IAAM,KAAO,EAAE,IAAM,IAAM,EAAE,MAAM,MAAM,EAAE,KAAK,CAAC,MAAM,MAAM,EAAE,MAAQ,EAAE,GAAG,CAAC,EAAE,EAChM,MAAO,CACL,aAAa,EAAE,EAAE,4BAA6B,GAC9C,SAAS,EAAE,IAAI,GAAI,YAAY,EAAE,OAAO,GAAG,EAAE,IAAM,SAAW,EAAE,IAAM,IAAM,EAAE,GAAI,UAAU,EAAE,KAAK,GAAI,UAAU,EAAE,OAAS,GAAG,GAAI,EAAE,UAAY,cAAc,EAAE,SAAS,GAAK,GAC/K,GAAG,QAAQ,CAAC,EAAE,IAAK,GAAM,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAC3C,YAAY,SAAS,EAAE,OAAO,CAAC,GAAI,aAAa,EAAE,SAAS,SAAW,SAAW,kBAAe,IAAI,WAAa,SAAS,EAAE,QAAQ,CAAC,GAAI,GACzI,SAAU,GAAG,MAAO,GACpB,YAAY,EAAE,SAAS,IAAI,WAAM,MAAM,EAAE,SAAS,KAAK,CAAC,GACxD,UAAU,MAAM,EAAE,OAAO,KAAK,CAAC,IAAI,EAAE,cAAgB,cAAgB,MAAM,EAAE,OAAO,GAAG,EAAI,IAAM,EAAE,GACnG,gBAAgB,QAAQ,EAAE,UAAU,CAAC,GAAI,EAAE,MAAQ;AAAA,kBAAqB,EAAE,KAAK,GAAK,GAAI,GACxF,gBAAgB,WAAW,CAAC,CAAC,EAC/B,EAAE,OAAQ,GAAM,IAAM,IAAI,EAAE,KAAK;AAAA,CAAI,CACvC,CACA,eAAe,YAAY,EAAG,CAC5B,GAAI,GAAC,IAAI,aAAe,EAAE,WAC1B,GAAE,UAAY,GACd,GAAI,CACF,MAAM,GAAK,IAAI,SACf,GAAG,OAAO,YAAa,SAAS,EAAG,GAAG,OAAO,OAAQ,QAAG,EACxD,GAAG,OAAO,gBAAiB,EAAE,QAAQ,IAAI,EACzC,GAAG,OAAO,iBAAkB,EAAE,QAAQ,KAAK,EAC3C,GAAG,OAAO,iBAAkB,EAAE,QAAQ,OAAS,EAAE,EACjD,GAAG,OAAO,mBAAoB,EAAE,QAAQ,OAAO,EAC/C,GAAG,OAAO,wBAAyB,EAAE,EAAE,EACvC,GAAG,OAAO,uBAAwB,MAAM,EAAE,OAAO,KAAK,CAAC,EACvD,GAAG,OAAO,gBAAiB,UAAU,CAAC,CAAC,EACvC,MAAM,MAAM,WAAY,CAAE,OAAQ,OAAQ,KAAM,GAAI,YAAa,aAAc,CAAC,CAClF,MAAY,CAAoB,EAClC,CAGA,MAAM,QAAW,GAAM,OAAO,GAAY,EAAM,EAC7C,QAAQ,QAAS,GAAG,EAAE,QAAQ,QAAS,GAAG,EAAE,QAAQ,QAAS,GAAG,EAChE,QAAQ,KAAM,EAAE,EAAE,QAAQ,KAAM,KAAK,EAAE,QAAQ,KAAM,KAAK,EAAE,QAAQ,KAAM,GAAG,EAAE,QAAQ,KAAM,IAAI,EACjG,QAAQ,gBAAiB,EAAE,EAE9B,SAAS,YAAY,IAAK,KAAM,KAAM,CACpC,YAAO,MAAQ,CAAC,EACT,IAAI,QAAS,SAAY,CAC9B,GAAI,CAAC,IAAK,OAAO,QAAQ,IAAI,EAC7B,MAAM,IAAM,IAAI,MAChB,IAAI,YAAc,YAClB,IAAI,OAAS,IAAM,CACjB,GAAI,CACF,MAAM,MAAQ,IAAI,aAAe,IAAI,cAC/B,EAAI,KAAK,UAAY,KAAK,MAAM,KAAO,KAAK,IAAI,MAAO,CAAC,CAAC,EAAI,KAC7D,EAAI,KAAK,UAAY,KAAK,MAAM,EAAI,KAAK,EAAI,KAC7C,EAAI,SAAS,cAAc,QAAQ,EAAG,EAAE,MAAQ,EAAG,EAAE,OAAS,EACpE,MAAM,EAAI,EAAE,WAAW,IAAI,EACtB,KAAK,cAAe,EAAE,UAAY,UAAW,EAAE,SAAS,EAAG,EAAG,EAAG,CAAC,GACvE,MAAM,EAAI,KAAK,IAAI,EAAI,IAAI,aAAc,EAAI,IAAI,aAAa,EACxD,EAAI,IAAI,aAAe,EAAS,EAAI,IAAI,cAAgB,EAC9D,EAAE,UAAU,KAAM,EAAI,GAAK,GAAI,EAAI,GAAK,EAAG,EAAG,CAAC,EAC/C,QAAQ,CAAE,KAAM,EAAE,UAAU,KAAK,YAAc,YAAc,aAAc,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,KAAK,YAAc,MAAQ,MAAO,CAAC,CACxI,MAAY,CAAE,QAAQ,IAAI,CAAG,CAC/B,EACA,IAAI,QAAU,IAAM,QAAQ,IAAI,EAChC,MAAM,EAAI,IAAI,WAAW,IAAI,EAAI,SAAW,IAAM,IAClD,IAAI,IAAM,GAAK,EAAE,SAAS,GAAG,EAAI,IAAM,KAAO,UAAY,KAAK,YAAc,IAC/E,CAAC,CACH,CAGA,MAAM,YAAc,CAAC,EACrB,SAAS,eAAe,OAAQ,CAC9B,OAAK,QACA,YAAY,MAAM,IACrB,YAAY,MAAM,EAAI,MAAM,aAAe,mBAAmB,MAAM,EAAG,CAAE,YAAa,aAAc,CAAC,EAAE,KAAM,GAAM,EAAE,KAAK,CAAC,EAAE,KAAM,MAAS,CAC1I,MAAM,EAAI,IAAI,UAAU,EAAE,gBAAgB,KAAM,WAAW,EACrD,IAAO,GAAO,EAAI,EAAE,YAAY,QAAQ,OAAQ,GAAG,EAAE,KAAK,EAAI,GACpE,IAAI,KAAO,CAAC,EAAO,QAAU,KAC7B,MAAM,KAAO,EAAE,cAAc,wBAAwB,EACrD,GAAI,KAAQ,GAAI,CAAE,MAAM,EAAI,KAAK,MAAM,KAAK,WAAW,EAAG,KAAO,EAAE,MAAQ,CAAC,EAAG,QAAU,EAAE,OAAS,MAAY,CAAe,CAC/H,MAAM,OAAS,EAAE,cAAc,kBAAkB,EAC3C,KAAO,OAAS,OAAO,UAAU,MAAM,aAAa,EAAE,IAAK,GAAM,EAAE,QAAQ,WAAY,EAAE,EAAE,QAAQ,SAAU,GAAG,EAAE,QAAQ,OAAQ,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,EAAI,CAAC,EAClK,IAAM,MAAM,KAAK,EAAE,iBAAiB,uCAAuC,CAAC,EAAE,IAAI,GAAG,EAAE,OAAO,OAAO,EACrG,KAAO,CAAC,EAAS,MAAQ,CAAC,EAChC,EAAE,iBAAiB,gBAAgB,EAAE,QAAS,IAAO,CACnD,MAAM,EAAI,IAAI,GAAG,cAAc,sBAAsB,CAAC,EAAS,EAAI,IAAI,EAAE,EAAE,QAAQ,EAAG,EAAE,EAAE,KAAK,EACzF,IAAM,EAAI,IAAM,EAAO,GAAK,GAAK,CAAC,KAAK,GAAG,IAAK,KAAK,GAAG,EAAI,EAAG,MAAM,KAAK,CAAC,EAAG,CAAC,CAAC,EACvF,CAAC,EACD,MAAM,MAAQ,MAAM,KAAK,EAAE,iBAAiB,cAAc,CAAC,EAAE,IAAI,GAAG,EAAE,OAAQ,GAAM,WAAW,KAAK,CAAC,CAAC,EAChG,KAAO,IAAI,EAAE,cAAc,mBAAmB,CAAC,GAAK,IAAI,EAAE,cAAc,gBAAgB,CAAC,EACzF,OAAS,SAAW,QAAQ,OAAS,QAAQ,OAAO,MAAM,EAAG,CAAC,EAAE,IAAK,GAAO,OAAO,GAAM,SAAW,EAAI,EAAE,GAAI,EAAI,CAAC,EACzH,MAAO,CAAE,OAAQ,KAAK,QAAU,CAAC,EAAG,QAAS,KAAK,SAAW,GAAI,WAAY,CAAC,CAAC,KAAK,WAAY,KAAM,IAAK,MAAO,MAAO,KAAM,MAAO,CACxI,CAAC,EAAE,MAAM,IAAM,IAAI,GAEd,YAAY,MAAM,GAtBL,QAAQ,QAAQ,IAAI,CAuB1C,CACA,eAAe,YAAY,EAAG,IAAK,CACjC,MAAM,MAAQ,IAAM,IAAI,YAAc,GAClC,MAAO,IAAI,SAAW,GAAM,IAAI,YAAc,uBAClD,GAAI,CACF,MAAM,WAAW,KAAK,EACtB,MAAM,WAAW,SAAS,EAC1B,KAAM,CAAE,KAAM,EAAI,OAAO,MACnB,IAAM,IAAI,MAAM,CAAE,KAAM,KAAM,OAAQ,KAAM,SAAU,EAAK,CAAC,EAC5D,EAAI,IAAW,EAAI,IAAW,EAAI,GAAU,EAAI,EAAI,EACpD,EAAI,EAAE,QAAe,EAAI,EAAE,OAE3B,KAAO,CAAC,GAAI,GAAI,EAAE,EAAS,MAAQ,CAAC,IAAK,IAAK,GAAG,EAAS,KAAO,CAAC,IAAK,IAAK,GAAG,EAC/E,QAAU,CAAC,IAAK,IAAK,GAAG,EAAS,SAAW,CAAC,IAAK,IAAK,GAAG,EAAS,IAAM,CAAC,GAAI,GAAI,EAAE,EAAS,KAAO,CAAC,GAAI,IAAK,GAAG,EACjH,OAAU,GAAM,QAAQ,MAAM,CAAC,CAAC,EAChC,KAAO,IAAI,SAAS,QAAQ,eAAgB,EAAE,EAE9C,CAAC,KAAM,GAAG,MAAM,EAAI,MAAM,QAAQ,IAAI,CAC1C,YAAY,IAAI,QAAS,IAAK,CAAE,UAAW,GAAM,YAAa,GAAM,WAAY,GAAI,CAAC,EACrF,GAAG,EAAE,MAAM,IAAK,GAAM,YAAY,EAAE,MAAO,GAAG,CAAC,CACjD,CAAC,EACK,QAAU,MAAM,QAAQ,IAAI,EAAE,MAAM,IAAK,GAAM,eAAe,EAAE,MAAM,CAAC,CAAC,EACxE,WAAa,MAAM,QAAQ,IAAI,EAAE,MAAM,IAAI,CAAC,EAAG,IAAM,CACzD,MAAM,GAAK,QAAQ,CAAC,EAAS,KAAO,CAAC,EAAE,KAAK,EAAE,OAAO,IAAM,GAAG,OAAS,GAAG,OAAS,CAAC,CAAC,EAAE,OAAO,OAAO,EAC/F,KAAO,KAAK,OAAO,CAAC,EAAG,IAAM,KAAK,UAAW,GAAM,OAAO,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,IAAM,OAAO,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,IAAM,CAAC,EAAE,MAAM,EAAG,CAAC,EAC/H,OAAO,QAAQ,IAAI,KAAK,IAAI,CAAC,EAAG,IAAM,YAAY,EAAG,EAAI,IAAM,IAAK,CAAE,WAAY,EAAI,IAAM,GAAI,CAAC,CAAC,CAAC,CACrG,CAAC,CAAC,EAGF,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,KAAK,EAAG,EAAG,EAAG,EAAG,GAAG,EACnD,IAAI,aAAa,GAAG,KAAK,EAAG,IAAI,KAAK,EAAG,EAAG,EAAG,IAAK,GAAG,EACtD,IAAI,EAAI,GACJ,WAAa,EACjB,GAAI,KAAM,CACR,IAAI,GAAK,GAAQ,GAAK,IAAM,KAAK,EAAI,KAAK,GACtC,GAAK,KAAM,GAAK,GAAI,GAAK,IAAM,KAAK,EAAI,KAAK,IACjD,IAAI,SAAS,KAAK,KAAM,KAAK,IAAK,EAAG,EAAG,GAAI,EAAE,EAC9C,WAAa,EAAI,GAAK,CACxB,CACA,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,YAAY,EAAE,EAAG,IAAI,aAAa,GAAG,IAAI,EAC/E,IAAI,KAAK,QAAQ,IAAI,QAAQ,EAAG,WAAY,EAAI,CAAC,EACjD,IAAI,QAAQ,YAAa,QAAQ,EAAG,IAAI,YAAY,GAAG,EAAG,IAAI,aAAa,GAAG,IAAI,EAClF,MAAM,UAAY,CAAC,IAAI,IAAM,OAAS,IAAI,IAAM,KAAM,IAAI,cAAe,IAAI,MAAO,IAAI,MAAO,IAAI,EAAE,OAAO,OAAO,EAAE,IAAI,OAAO,EAChI,IAAI,KAAK,UAAW,WAAY,EAAI,GAAI,CAAE,iBAAkB,IAAK,CAAC,EAElE,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,YAAY,EAAE,EAAG,IAAI,aAAa,GAAG,IAAI,EAC/E,IAAI,KAAK,QAAS,EAAG,EAAI,EAAG,CAAE,MAAO,OAAQ,CAAC,EAC9C,IAAI,QAAQ,YAAa,QAAQ,EAAG,IAAI,YAAY,CAAC,EAAG,IAAI,aAAa,GAAG,IAAI,EAChF,IAAI,KAAK,EAAE,UAAY,aAAe,QAAQ,EAAE,SAAS,EAAI,mBAAoB,EAAG,EAAI,GAAI,CAAE,MAAO,OAAQ,CAAC,EAC9G,EAAI,KAAK,IAAI,EAAI,GAAK,UAAU,OAAS,EAAG,KAAO,EAAI,GAAK,EAAI,EAAE,EAAI,EAGtE,MAAM,KAAO,CAAC,CAAC,YAAa,EAAE,EAAE,EAAG,CAAC,OAAQ,QAAQ,EAAE,OAAO,CAAC,EAAG,CAAC,cAAe,QAAQ,EAAE,UAAU,CAAC,EAAG,CAAC,YAAa,EAAE,WAAa,GAAG,CAAC,EAC1I,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,YAAY,EAAG,EAAG,EAAI,EAAG,GAAI,EAAG,EAAG,GAAG,EACrE,MAAM,IAAM,EAAI,GAAK,KAAK,OAC1B,KAAK,QAAQ,CAAC,EAAG,IAAM,CACrB,MAAM,EAAI,EAAI,EAAI,EAAI,GACtB,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,YAAY,GAAG,EAAG,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,KAAK,EAAE,CAAC,EAAG,EAAG,EAAI,GAAG,EAC5G,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,YAAY,GAAG,EAAG,IAAI,aAAa,IAAK,IAAK,GAAG,EAAG,IAAI,KAAK,QAAQ,EAAE,CAAC,CAAC,EAAG,EAAG,EAAI,EAAE,CAC5H,CAAC,EACD,GAAK,GAGL,MAAM,IAAM,EAAS,MAAQ,EAAI,EAAI,IAAM,GAAK,EAC1C,EAAI,EAAE,QAAe,EAAI,EAAE,SAC3B,KAAO,CACX,CAAC,eAAgB,CAAC,EAAE,KAAM,EAAE,QAAS,EAAE,IAAM,OAAS,EAAE,IAAM,KAAM,EAAE,MAAO,EAAE,KAAK,EAAE,OAAO,OAAO,CAAC,EACrG,CAAC,UAAW,CAAC,EAAE,QAAS,EAAE,SAAU,EAAE,SAAU,GAAG,EAAE,IAAI,IAAI,EAAE,QAAQ,IAAI,EAAE,GAAG,GAAI,WAAW,EAAE,OAAO,OAAO,CAAC,EAChH,EAAE,SAAS,SAAW,SAClB,CAAC,aAAc,CAAC,eAAgB,IAAI,WAAY,IAAI,aAAa,CAAC,EAClE,CAAC,aAAc,CAAC,EAAE,UAAW,EAAE,QAAS,EAAE,SAAU,EAAE,SAAU,GAAG,EAAE,IAAI,IAAI,EAAE,QAAQ,IAAI,EAAE,GAAG,GAAI,EAAE,KAAK,EAAE,OAAO,OAAO,CAAC,CAClI,EACA,IAAI,YAAY,GAAG,EACnB,MAAM,SAAW,KAAK,IAAK,GAAM,EAAE,CAAC,EAAE,OAAO,CAAC,IAAK,IAAM,IAAI,OAAO,IAAI,gBAAgB,QAAQ,CAAC,EAAG,KAAO,CAAC,CAAC,EAAG,CAAC,CAAC,CAAC,EAC7G,KAAO,GAAK,KAAK,IAAI,GAAG,SAAS,IAAK,GAAM,EAAE,MAAM,CAAC,EAAI,IAC/D,KAAK,QAAQ,CAAC,EAAG,IAAM,CACrB,MAAM,EAAI,EAAI,GAAK,KAAO,KAC1B,IAAI,aAAa,GAAG,OAAO,EAAG,IAAI,YAAY,EAAG,EAAG,KAAM,KAAM,EAAG,EAAG,GAAG,EACzE,IAAI,aAAa,GAAG,KAAK,EAAG,IAAI,KAAK,EAAG,EAAI,EAAG,IAAK,KAAO,EAAG,GAAG,EACjE,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,YAAY,GAAG,EAAG,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,KAAK,EAAE,CAAC,EAAG,EAAI,IAAK,EAAI,CAAC,EAChH,IAAI,QAAQ,YAAa,QAAQ,EAAG,IAAI,YAAY,GAAG,EAAG,IAAI,aAAa,GAAG,GAAG,EACjF,SAAS,CAAC,EAAE,QAAQ,CAAC,GAAI,IAAM,CAAM,IAAM,EAAG,IAAI,QAAQ,YAAa,MAAM,EAAQ,IAAI,QAAQ,YAAa,QAAQ,EAAG,IAAI,KAAK,GAAI,EAAI,IAAK,EAAI,GAAK,EAAI,GAAG,CAAG,CAAC,CACrK,CAAC,EACD,GAAK,KAAO,EACZ,MAAM,GAAK,QAAQ,CAAC,EACpB,GAAI,GAAG,OAAQ,CACb,MAAM,IAAM,EAAI,EAAI,GAAK,EAAiD,GAAK,EAArC,KAAK,KAAK,GAAG,OAAS,CAAC,EAA0B,IAC3F,IAAI,aAAa,GAAG,QAAQ,EAAG,IAAI,YAAY,EAAG,EAAG,EAAI,EAAG,GAAI,EAAG,EAAG,GAAG,EACzE,IAAI,aAAa,GAAG,KAAK,EAAG,IAAI,KAAK,EAAG,EAAI,EAAG,IAAK,GAAK,EAAG,GAAG,EAC/D,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,YAAY,GAAG,EAAG,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,KAAK,kBAAmB,EAAI,IAAK,EAAI,GAAG,EAC/H,GAAG,QAAQ,CAAC,EAAG,IAAM,CACnB,MAAM,GAAK,EAAI,IAAO,EAAI,EAAK,GAAU,GAAK,EAAI,KAAO,KAAK,MAAM,EAAI,CAAC,EAAI,IAC7E,IAAI,QAAQ,YAAa,QAAQ,EAAG,IAAI,YAAY,GAAG,EAAG,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,KAAK,QAAQ,EAAE,CAAC,CAAC,EAAE,YAAY,EAAG,GAAI,EAAE,EACjI,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,YAAY,GAAG,EAAG,IAAI,aAAa,GAAG,GAAG,EAAG,IAAI,KAAK,IAAI,gBAAgB,QAAQ,EAAE,CAAC,CAAC,EAAG,GAAK,CAAC,EAAE,CAAC,EAAG,GAAI,GAAK,CAAC,CACtJ,CAAC,EACD,GAAK,GAAK,CACZ,CAGA,MAAM,IAAM,GACN,KAAO,EAAE,MAAM,IAAI,CAAC,EAAG,IAAM,CACjC,OAAO,EAAI,CAAC,EAAG,GACf,CAAE,QAAS,QAAQ,EAAE,KAAK,GAAK,EAAE,aAAe;AAAA,EAAO,QAAQ,EAAE,YAAY,EAAI,IAAK,OAAQ,GAAM,KAAM,EAAE,OAAS,WAAW,CAAC,EAAI,IAAK,EAC1I,OAAO,EAAE,GAAG,EAAG,OAAO,EAAE,KAAK,EAAG,OAAO,EAAE,MAAQ,EAAE,GAAG,CACxD,CAAC,EACK,GAAK,SAAS,CAAC,EACrB,KAAK,KAAK,CAAC,GAAI,GAAI,CAAE,QAAS,CAAC,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,IAAI,OAAO,EAAE,KAAK;AAAA,CAAI,EAAG,OAAQ,EAAK,EAAG,IAAK,OAAO,EAAE,SAAS,KAAK,EAAG,OAAO,EAAE,SAAS,KAAK,CAAC,CAAC,EAC3J,IAAI,UAAU,CACZ,OAAQ,EAAG,OAAQ,CAAE,KAAM,EAAG,MAAO,EAAG,OAAQ,EAAG,EACnD,KAAM,CAAC,CAAC,IAAK,GAAI,UAAW,MAAO,aAAc,QAAQ,CAAC,EAAG,KAC7D,MAAO,QACP,OAAQ,CAAE,KAAM,YAAa,SAAU,IAAK,UAAW,IAAK,YAAa,CAAE,IAAK,EAAG,OAAQ,EAAG,KAAM,IAAK,MAAO,GAAI,EAAG,OAAQ,SAAU,UAAW,CAAC,IAAK,IAAK,GAAG,EAAG,UAAW,CAAE,OAAQ,GAAK,CAAE,EACjM,WAAY,CAAE,UAAW,KAAM,UAAW,CAAC,IAAK,IAAK,GAAG,EAAG,UAAW,OAAQ,SAAU,EAAG,OAAQ,SAAU,YAAa,CAAE,IAAK,IAAK,OAAQ,IAAK,KAAM,IAAK,MAAO,GAAI,CAAE,EAC3K,mBAAoB,CAAE,UAAW,CAAC,IAAK,IAAK,GAAG,CAAE,EACjD,aAAc,CAAE,EAAG,CAAE,UAAW,EAAG,UAAW,IAAK,EAAG,EAAG,CAAE,UAAW,IAAM,EAAG,cAAe,IAAM,CAAE,EAAG,EAAG,CAAE,UAAW,GAAI,OAAQ,OAAQ,EAAG,EAAG,CAAE,UAAW,GAAI,OAAQ,OAAQ,EAAG,EAAG,CAAE,UAAW,GAAI,OAAQ,QAAS,UAAW,MAAO,CAAE,EAChP,aAAe,MAAS,CAClB,KAAK,UAAY,QAAU,KAAK,OAAO,OAAS,IAAG,KAAK,KAAK,OAAO,OAAS,SAC7E,KAAK,UAAY,QAAU,KAAK,IAAI,QAAU,EAAE,MAAM,SAAU,KAAK,KAAK,OAAO,UAAY,SAAU,KAAK,KAAK,OAAO,cAAgB,EAC9I,EACA,YAAc,MAAS,CACrB,GAAI,KAAK,UAAY,OACrB,IAAI,KAAK,OAAO,QAAU,GAAK,KAAK,IAAI,MAAQ,EAAE,MAAM,OAAQ,CAC9D,MAAM,GAAK,OAAO,KAAK,IAAI,KAAK,EAC1B,GAAK,KAAK,KAAK,EAAI,EAAS,GAAK,KAAK,KAAK,GAAK,KAAK,KAAK,OAAS,KAAO,EAChF,IAAI,aAAa,IAAK,IAAK,GAAG,EAAG,IAAI,aAAa,EAAG,EAAG,IAAI,YAAY,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAG,EACnG,IAAI,IAAI,SAAS,GAAG,KAAM,OAAQ,GAAK,GAAK,GAAK,GAAK,IAAM,IAAK,IAAM,GAAG,EAC9E,MAAM,GAAK,EAAE,MAAM,KAAK,IAAI,KAAK,EAC7B,IAAM,GAAG,QAAQ,IAAI,KAAK,GAAI,GAAI,IAAK,IAAK,CAAE,IAAK,WAAW,EAAE,CAAE,CAAC,CACzE,CAIA,GAHI,KAAK,OAAO,QAAU,GAAK,KAAK,KAAK,KAAO,KAAK,KAAK,IAAI,MAC5D,IAAI,KAAK,KAAK,KAAK,EAAG,KAAK,KAAK,EAAG,KAAK,KAAK,MAAO,KAAK,KAAK,OAAQ,CAAE,IAAK,KAAK,KAAK,IAAI,IAAK,CAAC,EAE/F,KAAK,OAAO,QAAU,GAAK,KAAK,KAAK,KAAO,KAAK,KAAK,IAAI,OAAQ,CAEpE,MAAM,MAAQ,KAAK,KAAK,KAAK,CAAC,EACxB,IAAM,KAAK,KAAK,QAAQ,MAAM,EAC9B,GAAK,KAAK,KAAK,OAAO,SAAW,MAAS,KAC1C,MAAQ,KAAK,KAAK,KAAK,OAAS,GAChC,GAAK,KAAK,KAAK,GAAK,KAAK,KAAK,OAAS,OAAS,EAAI,GAAK,IAC/D,IAAI,aAAa,GAAI,KAAK,IAAI,QAAU,EAAE,MAAM,OAAS,SAAY,KAAK,IAAI,MAAQ,EAAI,CAAC,IAAK,IAAK,GAAG,EAAI,CAAC,IAAK,IAAK,GAAG,CAAG,EAC7H,IAAI,KAAK,KAAK,KAAK,EAAI,IAAM,GAAK,GAAK,GAAK,GAAK,IAAI,aAAa,KAAK,EAAI,GAAK,GAAI,GAAG,EACvF,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,KAAK,MAAO,KAAK,KAAK,EAAI,IAAK,EAAE,EAClG,IAAI,QAAQ,YAAa,QAAQ,EAAG,IAAI,aAAa,GAAG,GAAG,CAC7D,EACF,CACF,CAAC,EACD,EAAI,IAAI,cAAc,OAAS,EAG3B,EAAI,EAAI,KAAM,IAAI,QAAQ,EAAG,EAAI,IACrC,MAAM,GAAK,EAAI,GAAU,GAAK,EAAI,GAC5B,KAAO,CAAC,CAAC,WAAY,OAAO,EAAE,QAAQ,CAAC,EAAG,CAAC,EAAE,SAAS,SAAW,SAAW,UAAY,WAAY,EAAE,SAAS,OAAS,KAAO,MAAQ,OAAO,EAAE,OAAO,CAAC,CAAC,EAC1J,EAAE,eAAe,KAAK,KAAK,CAAC,MAAO,OAAO,EAAE,GAAG,CAAC,CAAC,EACtD,IAAI,YAAY,CAAC,EACjB,KAAK,QAAS,GAAM,CAAE,IAAI,QAAQ,YAAa,QAAQ,EAAG,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,KAAK,EAAE,CAAC,EAAG,GAAK,EAAG,CAAC,EAAG,IAAI,aAAa,GAAG,GAAG,EAAG,IAAI,KAAK,EAAE,CAAC,EAAG,EAAI,EAAG,EAAG,CAAE,MAAO,OAAQ,CAAC,EAAG,GAAK,CAAG,CAAC,EACjM,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,YAAY,GAAI,EAAI,EAAG,GAAI,GAAI,EAAG,EAAG,GAAG,EACvE,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,YAAY,IAAI,EAAG,IAAI,aAAa,IAAK,IAAK,GAAG,EACvF,IAAI,KAAK,aAAe,EAAE,SAAS,OAAS,KAAO,oBAAsB,IAAK,GAAK,EAAG,EAAI,GAAG,EAC7F,IAAI,YAAY,EAAE,EAAG,IAAI,KAAK,OAAO,EAAE,KAAK,EAAG,EAAI,EAAG,EAAI,IAAK,CAAE,MAAO,OAAQ,CAAC,EACjF,GAAK,GACL,IAAI,QAAQ,YAAa,QAAQ,EAAG,IAAI,YAAY,CAAC,EAAG,IAAI,aAAa,GAAG,IAAI,EAC5E,EAAE,gBAAiB,IAAI,KAAK,mBAAqB,OAAO,EAAE,GAAG,EAAG,EAAI,EAAG,EAAG,CAAE,MAAO,OAAQ,CAAC,EAAG,GAAK,GAGxG,GAAK,EACL,MAAM,MAAQ,CAAC,MAAO,OAAS,CAC7B,GAAI,CAAC,KAAM,OACX,IAAI,YAAY,GAAG,EACnB,MAAM,MAAQ,IAAI,gBAAgB,QAAQ,IAAI,EAAG,EAAI,CAAC,EAClD,EAAI,EAAI,MAAM,OAAS,IAAM,EAAI,KAAM,IAAI,QAAQ,EAAG,EAAI,IAC9D,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,YAAY,CAAC,EAAG,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,KAAK,MAAO,EAAG,CAAC,EACrG,IAAI,aAAa,GAAG,KAAK,EAAG,IAAI,aAAa,EAAG,EAAG,IAAI,KAAK,EAAG,EAAI,IAAK,EAAI,GAAI,EAAI,GAAG,EACvF,IAAI,QAAQ,YAAa,QAAQ,EAAG,IAAI,YAAY,GAAG,EAAG,IAAI,aAAa,GAAG,GAAG,EAAG,IAAI,KAAK,MAAO,EAAG,EAAI,GAAG,EAC9G,GAAK,IAAM,MAAM,OAAS,IAAM,CAClC,EACA,MAAM,QAAS,EAAE,KAAK,EACtB,MAAM,UAAW,IAAI,YAAY,EACjC,MAAM,qBAAsB,IAAI,UAAU,EAC1C,CACE,MAAM,KAAO,IAAI,SAAS,QAAQ,MAAO,EAAE,EACrC,MAAQ,CAAC,CAAC,yCAA0C,KAAO,qCAAqC,EAAG,CAAC,uBAAwB,KAAO,iBAAiB,CAAC,EACvJ,EAAI,GAAK,EAAI,KAAM,IAAI,QAAQ,EAAG,EAAI,IAC1C,IAAI,QAAQ,YAAa,QAAQ,EAAG,IAAI,YAAY,GAAG,EACvD,IAAI,GAAK,EACT,MAAM,QAAQ,CAAC,EAAG,IAAM,CAClB,IAAK,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,KAAK,IAAK,GAAI,CAAC,EAAG,IAAM,GAChE,IAAI,aAAa,GAAI,GAAI,EAAE,EAAG,IAAI,aAAa,EAAE,CAAC,EAAG,GAAI,EAAG,CAAE,IAAK,EAAE,CAAC,CAAE,CAAC,EACzE,MAAM,EAAI,IAAI,aAAa,EAAE,CAAC,CAAC,EAAG,IAAI,aAAa,GAAI,GAAI,EAAE,EAAG,IAAI,aAAa,GAAI,EAAG,IAAI,KAAK,GAAI,EAAI,GAAK,GAAK,EAAG,EAAI,EAAG,EAC7H,IAAM,EAAI,CACZ,CAAC,EACD,IAAI,aAAa,GAAG,GAAG,EACvB,GAAK,CACP,CAGA,MAAM,KAAO,WAAW,CAAC,EACrB,EAAI,GAAK,EAAI,OAAQ,IAAI,QAAQ,EAAG,EAAI,IAC5C,IAAI,aAAa,GAAG,QAAQ,EAAG,IAAI,YAAY,EAAG,EAAG,EAAI,EAAG,GAAI,EAAG,EAAG,GAAG,EACzE,IAAI,aAAa,GAAG,KAAK,EAAG,IAAI,KAAK,EAAG,EAAG,EAAG,GAAI,GAAG,EACrD,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,YAAY,IAAI,EAAG,IAAI,aAAa,GAAG,IAAI,EACjF,IAAI,KAAK,6CAA8C,EAAI,EAAG,EAAI,GAAG,EACrE,IAAI,QAAQ,YAAa,QAAQ,EAAG,IAAI,YAAY,GAAG,EAAG,IAAI,aAAa,GAAG,GAAG,EACjF,IAAI,KAAK,IAAI,gBAAgB,QAAQ,4KAA4K,IAAI,QAAQ,QAAQ,eAAgB,EAAE,CAAC,GAAG,EAAG,EAAI,EAAI,EAAE,EAAG,EAAI,EAAG,EAAI,EAAE,EAExR,MAAM,GAAK,GAAU,GAAK,EAAI,GAAK,EAAS,GAAK,EAAI,IACrD,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,YAAY,GAAI,GAAI,GAAI,EAAG,IAAK,IAAK,GAAG,EACvE,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,YAAY,CAAC,EAAG,IAAI,aAAa,IAAK,IAAK,GAAG,EACpF,IAAI,KAAK,sBAAuB,GAAK,GAAK,EAAG,GAAK,EAAG,CAAE,MAAO,QAAS,CAAC,EACxE,IAAI,KAAK,GAAI,GAAI,GAAI,EAAG,CAAE,IAAK,IAAK,CAAC,EAGrC,MAAM,MAAQ,CAAC,EACT,UAAY,EAAE,MAAM,IAAI,CAAC,EAAG,KAAO,CAAE,EAAG,EAAG,QAAQ,CAAC,EAAG,KAAM,WAAW,CAAC,CAAE,EAAE,EAAE,OAAQ,GAAM,CAAE,MAAM,IAAM,EAAE,EAAE,QAAU,EAAE,EAAE,MAAO,OAAI,MAAM,GAAG,EAAU,IAAO,MAAM,GAAG,EAAI,EAAU,GAAM,CAAC,EACtM,GAAI,UAAU,OAAQ,CACpB,IAAI,QAAQ,EAAG,EAAI,GACnB,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,KAAK,EAAG,EAAG,EAAG,EAAG,GAAG,EAAG,IAAI,aAAa,GAAG,KAAK,EAAG,IAAI,KAAK,EAAG,EAAG,EAAG,IAAK,GAAG,EAC5G,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,YAAY,EAAE,EAAG,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,KAAK,sBAAuB,EAAG,EAAI,CAAC,EAC1H,IAAI,QAAQ,YAAa,QAAQ,EAAG,IAAI,YAAY,GAAG,EAAG,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,KAAK,QAAQ,SAAW,EAAE,GAAK,mDAAmD,EAAG,EAAG,EAAI,GAAG,EACxL,GAAK,GACL,MAAM,GAAK,GAAU,GAAK,EAAI,GAAK,EAAS,GAAK,EAAI,GAC/C,QAAU,IAAM,CAAE,IAAI,QAAQ,EAAG,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,KAAK,EAAG,EAAG,EAAG,EAAG,GAAG,EAAG,IAAI,aAAa,GAAG,KAAK,EAAG,IAAI,KAAK,EAAG,EAAG,EAAG,IAAK,GAAG,EAAG,EAAI,EAAI,EAC9J,UAAU,QAAQ,CAAC,CAAE,EAAG,EAAG,KAAM,IAAK,EAAG,MAAQ,CAC/C,KAAO,MAAQ,CAAE,OAAQ,CAAC,EAAG,KAAM,CAAC,EAAG,IAAK,CAAC,EAAG,MAAO,CAAC,EAAG,MAAO,CAAC,CAAE,EAErE,IAAI,YAAY,GAAG,EACnB,MAAM,IAAM,IAAM,KAAK,OAAO,OAAS,KAAK,IAAI,QAAU,IAAM,KAAK,IAAI,KAAK,MAAM,OAAQ,EAAE,EAAI,IAAM,KAAK,KAAK,OAAS,IAAM,GAE7H,IAAM,GAAK,EAAI,KAAK,IAAI,IAAK,GAAK,EAAE,EAAI,EAAI,IAAI,QAAQ,EAC5D,MAAM,IAAM,EAAS,UAAY,IAAI,iBAAiB,EAEhD,IAAM,MAAQ,KAAK,CAAC,EAC1B,IAAI,aAAa,IAAK,IAAK,GAAG,EAAG,IAAI,aAAa,GAAI,EACtD,IAAI,YAAY,EAAG,IAAK,GAAI,GAAI,EAAG,EAAG,GAAG,EACrC,KAAK,IAAI,SAAS,IAAI,KAAM,OAAQ,EAAI,EAAG,IAAM,EAAG,GAAK,EAAG,GAAK,CAAC,EAClE,EAAE,QAAQ,IAAI,KAAK,EAAG,IAAK,GAAI,GAAI,CAAE,IAAK,WAAW,CAAC,CAAE,CAAC,EAC7D,MAAM,OAAS,MAAQ,CAAC,GAAG,MAAM,EAAG,CAAC,EAAS,IAAM,GAAK,GAAK,EAC9D,MAAM,QAAQ,CAAC,GAAI,IAAM,CAAE,MAAM,GAAK,EAAI,GAAK,GAAK,GAAI,IAAI,YAAY,GAAI,IAAM,GAAK,EAAG,GAAI,GAAI,IAAK,IAAK,GAAG,EAAO,IAAI,IAAI,SAAS,GAAG,KAAM,OAAQ,GAAK,GAAK,IAAM,GAAK,IAAK,GAAK,IAAK,GAAK,GAAG,CAAG,CAAC,EACxM,MAAM,UAAY,IAAM,IAAM,MAAM,OAAS,EAAI,GAAK,GAEtD,IAAI,GAAK,IAAM,EACf,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,YAAY,IAAI,EAAG,IAAI,aAAa,GAAG,IAAI,EACjF,MAAM,GAAK,IAAI,gBAAgB,QAAQ,EAAE,KAAK,EAAG,EAAE,EACnD,IAAI,KAAK,GAAI,GAAI,EAAE,EAAO,EAAE,QAAQ,IAAI,KAAK,GAAI,GAAK,IAAK,GAAI,GAAG,OAAS,IAAK,CAAE,IAAK,WAAW,CAAC,CAAE,CAAC,EACtG,IAAM,GAAG,OAAS,IAClB,IAAI,QAAQ,YAAa,QAAQ,EAAG,IAAI,YAAY,GAAG,EAAG,IAAI,aAAa,GAAG,IAAI,EAClF,MAAM,IAAM,CAAC,EAAE,aAAc,EAAE,IAAM,EAAI,OAAS,EAAE,IAAM,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,OAAO,EACzF,GAAK,IAAI,gBAAgB,QAAQ,GAAG,EAAG,EAAE,EAAG,IAAI,KAAK,GAAI,GAAI,EAAE,EAAG,IAAM,GAAG,OAAS,IAAM,IAEhG,MAAM,QAAU,KAAK,WAAa,CAAC,aAAa,EAAI,CAAC,GAAG,OAAO,KAAK,OAAS,CAAC,CAAC,EAC/E,IAAIA,IAAK,GACT,OAAO,QAASC,IAAM,CAAE,MAAM,EAAI,IAAI,aAAa,QAAQA,EAAC,CAAC,EAAI,EAAG,IAAI,aAAa,GAAG,QAAQ,EAAG,IAAI,YAAYD,IAAI,GAAK,IAAK,EAAG,IAAK,IAAK,IAAK,GAAG,EAAG,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,KAAK,QAAQC,EAAC,EAAGD,IAAK,EAAG,GAAK,EAAG,EAAGA,KAAM,EAAI,GAAK,CAAC,EAC1Q,OAAO,SAAQ,IAAM,GACzB,IAAI,QAAQ,YAAa,QAAQ,EACjC,MAAM,QAAWE,IAAM,CACjB,GAAK,EAAI,KAAM,QAAQ,EAAG,GAAK,GACnC,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,YAAY,CAAC,EAAG,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,KAAKA,GAAG,GAAI,GAAK,CAAC,EACvG,IAAI,aAAa,GAAG,KAAK,EAAG,IAAI,aAAa,EAAG,EAAG,IAAI,KAAK,GAAI,GAAK,IAAK,GAAK,EAAG,GAAK,GAAG,EAAG,IAAM,IACnG,IAAI,QAAQ,YAAa,QAAQ,EAAG,IAAI,YAAY,GAAG,EAAG,IAAI,aAAa,GAAG,GAAG,CACnF,EACM,QAAW,KAAQ,IAAI,QAASD,IAAM,CAC1C,MAAM,GAAK,IAAI,gBAAgB,QAAQA,EAAC,EAAG,GAAK,CAAC,EAC7C,GAAK,GAAG,OAAS,IAAM,EAAI,KAAM,QAAQ,EAAG,GAAK,GACrD,IAAI,aAAa,GAAG,KAAK,EAAG,IAAI,OAAO,GAAK,IAAK,GAAK,EAAG,GAAK,GAAG,EAAG,IAAI,KAAK,GAAI,GAAK,IAAK,EAAE,EAAG,IAAM,GAAG,OAAS,IAAM,EAC1H,CAAC,EACD,GAAI,KAAK,QAAS,CAAE,QAAQ,UAAU,EAAG,MAAM,GAAK,IAAI,gBAAgB,QAAQ,KAAK,OAAO,EAAG,EAAE,EAAG,IAAI,KAAK,GAAI,GAAI,EAAE,EAAG,IAAM,GAAG,OAAS,IAAM,GAAK,CAGvJ,GAFI,KAAK,OAAO,SAAU,QAAQ,oBAAoB,EAAG,QAAQ,KAAK,MAAM,EAAG,IAAM,KACjF,KAAK,IAAI,SAAU,QAAQ,mBAAmB,EAAG,QAAQ,KAAK,GAAG,EAAG,IAAM,KAC1E,KAAK,KAAK,OAAQ,CACpB,QAAQ,YAAY,EACpB,MAAM,KAAO,KAAK,KAAK,KAAK,KAAK,OAAS,CAAC,EAC3C,KAAK,KAAK,QAAQ,CAAC,GAAI,IAAM,CAAE,MAAM,GAAK,EAAI,KAAO,GAAK,GAAK,GAAK,EAAS,GAAK,IAAM,EAAI,KAAO,EAAI,EAAI,MAAQ,IAAK,IAAI,KAAK,QAAQ,EAAE,EAAG,GAAI,EAAE,CAAG,CAAC,EACxJ,IAAM,KAAO,IAAM,CACrB,CACI,KAAK,MAAM,SACb,QAAQ,gBAAgB,EACxB,KAAK,MAAM,MAAM,EAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,EAAG,CAAC,IAAM,CAC1C,MAAM,GAAK,IAAI,gBAAgB,QAAQ,CAAC,EAAG,GAAK,EAAE,EAC9C,GAAK,GAAG,OAAS,IAAM,EAAI,KAAM,QAAQ,EAAG,GAAK,GACrD,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,KAAK,QAAQ,CAAC,EAAG,GAAI,EAAE,EAAG,IAAI,aAAa,GAAG,GAAG,EAAG,IAAI,KAAK,GAAI,GAAK,GAAI,EAAE,EAAG,IAAM,GAAG,OAAS,IAAM,EACxI,CAAC,GAEC,CAAC,KAAK,OAAO,QAAU,CAAC,KAAK,IAAI,QAAU,CAAC,KAAK,KAAK,QAAU,CAAC,KAAK,MAAM,SAC9E,IAAI,aAAa,GAAG,IAAI,EAAG,IAAI,KAAK,4CAA6C,GAAI,EAAE,EAAG,IAAM,GAE9F,EAAE,SACJ,IAAM,IAAK,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,YAAY,GAAG,EAAG,IAAI,aAAa,GAAI,GAAI,EAAE,EAC9F,IAAI,aAAa,+BAAgC,GAAI,GAAI,CAAE,IAAK,WAAW,CAAC,CAAE,CAAC,EAAG,IAAM,EACxF,IAAI,QAAQ,YAAa,QAAQ,GAEnC,GAAK,IAAI,iBAAiB,IAAM,UAAY,KAAK,IAAI,GAAI,SAAS,EAAI,IAAM,EACxE,IAAM,UAAU,OAAS,IAAK,IAAI,aAAa,IAAK,IAAK,GAAG,EAAG,IAAI,aAAa,EAAG,EAAG,IAAI,KAAK,EAAG,EAAI,IAAK,EAAG,EAAI,GAAG,EAC3H,CAAC,CACH,CAGA,MAAM,MAAQ,IAAI,iBAAiB,EACnC,QAAS,EAAI,EAAG,GAAK,MAAO,IAC1B,IAAI,QAAQ,CAAC,EACb,IAAI,aAAa,GAAG,OAAO,EAAG,IAAI,KAAK,EAAG,EAAI,GAAI,EAAG,GAAI,GAAG,EAC5D,IAAI,aAAa,GAAG,KAAK,EAAG,IAAI,KAAK,EAAG,EAAI,GAAI,EAAG,GAAK,GAAG,EAE3D,IAAI,QAAQ,YAAa,MAAM,EAAG,IAAI,YAAY,GAAG,EAAG,IAAI,aAAa,GAAG,IAAI,EAChF,IAAI,KAAK,QAAQ,CAAC,IAAI,SAAU,IAAI,IAAM,OAAS,IAAI,IAAM,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,OAAO,CAAC,EAAG,EAAG,EAAI,CAAC,EAC3G,IAAI,QAAQ,YAAa,QAAQ,EACjC,IAAI,KAAK,QAAQ,CAAC,IAAI,MAAO,IAAI,MAAO,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,OAAO,CAAC,EAAG,EAAG,EAAI,GAAG,EACxF,IAAI,KAAK,QAAQ,SAAW,EAAE,EAAE,EAAG,EAAG,EAAI,EAAG,CAAE,MAAO,OAAQ,CAAC,EAC/D,IAAI,KAAK,QAAQ,CAAC,OAAO,KAAK,GAAI,EAAG,EAAI,IAAK,CAAE,MAAO,OAAQ,CAAC,EAGlE,MAAM,QAAU,OAAO,OAAO,CAAC,EAAG,CAAC,EAAG,OAAO,QAAQ,UACrD,IAAI,cAAc,CAChB,MAAO,SAAW,EAAE,GAAK,MAAQ,QAAQ,IAAI,QAAQ,EACrD,QAAS,iBAAmB,QAAQ,EAAE,OAAO,EAC7C,OAAQ,QAAQ,IAAI,QAAQ,EAC5B,QAAS,oBACT,SAAU,GAAG,OAAO,IAAI,aAAa,KAAK,UAAU,OAAO,CAAC,CAAC,IAAI,OAAO,KAC1E,CAAC,EACD,IAAI,KAAK,GAAG,QAAQ,IAAI,QAAQ,EAAE,QAAQ,iBAAkB,GAAG,CAAC,UAAU,EAAE,EAAE,MAAM,CACtF,OAAS,EAAG,CACV,QAAQ,MAAM,yBAA0B,CAAC,EACzC,OAAO,sGAA6F,OAAO,CAC7G,QAAE,CACI,MAAO,IAAI,SAAW,GAAO,IAAI,YAAc,MACrD,CACF,CACA,EAAE,kBAAmB,IAAI,EAAE,iBAAiB,QAAS,MAAO,GAAM,CAChE,MAAM,EAAI,EAAE,cACZ,GAAI,MAAM,UAAW,CAAE,EAAE,SAAW,GAAM,EAAE,YAAc,qBAAiB,GAAI,CAAE,MAAM,MAAM,SAAW,MAAY,CAAe,CAAE,EAAE,SAAW,GAAO,EAAE,YAAc,cAAgB,CACzL,YAAY,MAAM,MAAO,CAAC,CAC5B,CAAC,EACD,EAAE,cAAe,IAAI,EAAE,iBAAiB,QAAS,IAAM,KAAK,CAAC,CAAC,EAC9D,EAAE,aAAc,IAAI,EAAE,iBAAiB,QAAS,IAAM,CAC/C,aAAa,IAClB,MAAM,MAAQ,CAAC,EAAG,MAAM,SAAW,KAAM,MAAM,MAAQ,KAAM,MAAM,MAAQ,KAAM,MAAM,MAAQ,GAAI,GAAG,MAAM,MAAQ,GACpH,YAAY,EAAG,UAAU,EAAG,KAAK,CAAC,EACpC,CAAC,EACD,SAAS,cAAe,CAAE,MAAO,EAAM,CACvC,EAAE,oBAAqB,IAAI,EAAE,iBAAiB,QAAS,IAAM,CAAE,QAAQ,QAAQ,EAAG,WAAW,MAAM,KAAK,CAAG,CAAC,EAG5G,SAAS,WAAY,CACnB,MAAM,QAAU,MAAM,UAAY,GAAG,QAAU,YAAY,EAAI,MAC/D,MAAM,IAAI,SAAU,CAAE,QAAS,MAAO,MAAM,MAAO,MAAO,MAAM,MAAO,SAAU,MAAM,SAAU,MAAO,MAAM,MAAO,KAAM,MAAM,KAAM,GAAI,KAAK,IAAI,CAAE,CAAC,CACzJ,CACA,GAAG,QAAQ,iBAAiB,SAAU,IAAM,CAAE,MAAM,QAAU,KAAM,UAAU,CAAG,CAAC,EAClF,SAAS,WAAY,CACnB,MAAM,GAAK,MAAM,IAAI,SAAU,IAAI,EAC/B,IAAM,KAAK,IAAI,EAAI,GAAG,GAAK,WAC7B,YAAY,GAAG,OAAO,EACtB,MAAM,MAAQ,GAAG,OAAS,CAAC,EAC3B,MAAM,MAAQ,GAAG,OAAS,GAAI,GAAG,MAAM,MAAQ,MAAM,MACjD,GAAG,QAAO,MAAM,MAAQ,GAAG,QACtB,IAAI,gBACb,GAAG,QAAQ,SAAS,MAAM,MAAQ,IAAI,cACtC,GAAG,QAAQ,SAAS,KAAK,MAAQ,IAAI,cAEvC,YAAY,CACd,CAGA,SAAS,mBAAoB,CAC3B,MAAM,IAAM,OAAO,OAAO,MAAM,IAAI,UAAW,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAG,IAAM,IAAI,KAAK,EAAE,OAAO,EAAI,IAAI,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,EAAG,CAAC,EACxH,GAAI,CAAC,IAAI,OAAQ,CAAE,GAAG,YAAY,UAAY,GAAI,MAAQ,CAC1D,GAAG,YAAY,UAAY,kEAAkE,IAAI,IAAK,GAAM,qCAAqC,IAAI,EAAE,EAAE,CAAC,mBAAmB,IAAI,EAAE,EAAE,CAAC,kBAAe,IAAI,EAAE,QAAQ,OAAO,CAAC,gBAAgB,MAAM,EAAE,OAAO,KAAK,CAAC,SAAM,IAAI,KAAK,EAAE,UAAU,EAAI,IAAI,KAAS,UAAY,YAAc,QAAQ,EAAE,UAAU,CAAC,kBAAkB,EAAE,KAAK,EAAE,CAAC,SACvX,GAAG,eAAgB,GAAG,WAAW,EAAE,QAAS,GAAM,EAAE,iBAAiB,QAAS,IAAM,WAAW,MAAM,IAAI,UAAW,CAAC,CAAC,EAAE,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,CAC5I,CACA,eAAe,cAAc,KAAM,CACjC,MAAM,IAAM,MAAM,KAAK,YAAY,EAC7B,MAAQ,IAAI,WAAW,GAAG,EAChC,IAAI,EAAI,GACR,QAAS,EAAI,EAAG,EAAI,MAAM,OAAQ,GAAK,MAAO,GAAK,OAAO,aAAa,MAAM,KAAM,MAAM,SAAS,EAAG,EAAI,KAAK,CAAC,EAC/G,MAAM,EAAI,EAAE,MAAM,IAAI,OAAO,QAAU,qBAAuB,QAAU,KAAK,CAAC,EAC9E,GAAI,CAAC,EAAG,MAAM,IAAI,MAAM,aAAa,EACrC,OAAO,KAAK,MAAM,aAAa,EAAE,CAAC,CAAC,CAAC,CACtC,CACA,GAAG,UAAU,iBAAiB,SAAU,SAAY,CAClD,MAAM,EAAI,GAAG,UAAU,MAAM,CAAC,EAC9B,GAAK,EACL,IAAI,CAAE,WAAW,MAAM,cAAc,CAAC,CAAC,CAAG,MAAY,CACpD,OAAO,4KAA+J,IAAI,IAAI,KAAK,EAAI,IAAK,OAAO,CACrM,CACA,GAAG,UAAU,MAAQ,GACvB,CAAC,EACD,MAAM,KAAO,GAAG,UAAU,QAAQ,aAAa,EAC/C,CAAC,YAAa,UAAU,EAAE,QAAS,IAAO,KAAK,iBAAiB,GAAI,IAAM,KAAK,UAAU,IAAI,SAAS,CAAC,CAAC,EACxG,CAAC,YAAa,MAAM,EAAE,QAAS,IAAO,KAAK,iBAAiB,GAAI,IAAM,KAAK,UAAU,OAAO,SAAS,CAAC,CAAC,EAGvG,eAAe,cAAc,KAAM,CACjC,MAAM,EAAI,KAAK,MAAM,aAAa,IAAI,CAAC,EACjC,MAAQ,MAAM,IAAI,UAAW,CAAC,CAAC,EAAE,EAAE,CAAC,EAC1C,GAAI,MAAO,OAAO,MAClB,MAAM,IAAM,MAAM,YAAY,EACxB,MAAQ,EAAE,EAAE,IAAI,CAAC,CAAC,IAAK,IAAK,KAAK,IAAM,CAC3C,UAAW,KAAK,IAAK,CACnB,MAAM,EAAI,EAAE,SAAS,KAAM,GAAM,EAAE,KAAO,GAAG,EAC7C,GAAI,EAAG,MAAO,CAAE,UAAW,IAAK,UAAW,EAAE,GAAI,OAAQ,EAAE,OAAQ,MAAO,EAAE,MAAO,aAAc,EAAE,WAAa,EAAE,MAAQ,GAAI,IAAK,EAAE,IAAK,MAAO,IAAK,MAAO,EAAE,OAAS,EAAE,MAAO,iBAAkB,EAAE,iBAAkB,QAAS,EAAE,QAAS,UAAW,EAAE,SAAU,CACpQ,CACA,MAAO,CAAE,UAAW,IAAK,MAAO,8BAA+B,aAAc,GAAI,MAAO,IAAK,QAAS,EAAK,CAC7G,CAAC,EACK,SAAW,CAAE,OAAQ,EAAE,EAAE,CAAC,EAAG,KAAM,EAAE,EAAE,CAAC,EAAG,MAAO,EAAE,EAAE,CAAC,CAAE,EAC/D,MAAO,CAAE,EAAG,EAAG,GAAI,EAAE,EAAG,QAAS,EAAE,EAAG,QAAS,EAAE,EAAG,WAAY,EAAE,EAAG,MAAO,SAAU,QAAS,KAAM,MAAO,GAAI,OAAQ,cAAc,MAAO,SAAS,MAAO,GAAG,EAAG,cAAe,IAAI,cAAe,SAAU,EAAK,CACtN,CAEA,eAAe,WAAW,EAAG,CAC3B,GAAI,CAAC,EAAG,OACR,OAAO,IAAI,EACX,MAAM,YAAc,EAEpB,MAAM,MAAQ,CAAC,EAAE,EAAE,SAAW,EAAE,QAAQ,WAClC,GAAK,EAAE,oBAAqB,IAAI,EAAO,KAAI,GAAG,YAAc,UAAO,MAAQ,IAAI,kBAAoB,IAAI,mBAAqB,UAClI,MAAM,IAAM,GAAG,WAAW,SAAS,GAAU,MAAQ,GAAG,WAAW,SAAS,OAC5E,IAAI,QAAQ,cAAc,EAAE,cAAc,MAAM,EAAE,YAAc,MAAQ,mCAAqC,0BAC7G,MAAM,QAAQ,cAAc,EAAE,cAAc,MAAM,EAAE,YAAc,MAAQ,+CAAiD,wCACvH,OAAS,CAAC,IAAI,QAAO,IAAI,MAAQ,EAAE,QAAQ,UAAU,OACzD,GAAG,SAAS,YAAc,EAAE,GAC5B,MAAM,QAAU,IAAI,KAAK,EAAE,UAAU,EAAI,IAAI,KAC7C,IAAI,IAAM,KAAM,GAAI,CAAE,IAAM,MAAM,YAAY,CAAG,MAAY,CAAe,CAC5E,MAAM,QAAU,CAAC,EACjB,EAAE,MAAM,QAAS,GAAM,CAErB,GADA,EAAE,SAAW,KAAM,EAAE,MAAQ,GACzB,CAAC,IAAK,OACV,MAAM,EAAI,IAAI,KAAM,GAAM,EAAE,SAAS,KAAME,IAAMA,GAAE,KAAO,EAAE,SAAS,CAAC,EAChE,EAAI,GAAK,EAAE,SAAS,KAAM,GAAM,EAAE,KAAO,EAAE,SAAS,EAC1D,GAAI,CAAC,EAAG,CAAE,EAAE,MAAQ,+CAA2C,EAAE,QAAU,GAAM,QAAQ,KAAK,CAAC,EAAG,MAAQ,CAC1G,EAAE,SAAW,EAAE,MACX,EAAE,QAAU,EAAE,OAAS,EAAE,MAAQ,iBAAiB,MAAM,EAAE,KAAK,CAAC,YAAY,MAAM,EAAE,KAAK,CAAC,IAAK,QAAQ,KAAK,CAAC,GACvG,EAAE,YAAW,EAAE,MAAQ,2DACnC,CAAC,EACD,GAAG,cAAc,UAAY;AAAA,UACzB,QAAU,2DAA2D,QAAQ,EAAE,UAAU,CAAC,8HAAgI,EAAE;AAAA,UAC5N,CAAC,SAAW,QAAQ,OAAS,iNAA8M,EAAE;AAAA;AAAA;AAAA,mBAGpO,EAAE,MAAM,IAAK,GAAM,WAAW,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,aAAe,oDAAoD,IAAI,EAAE,YAAY,CAAC,WAAa,EAAE,GAAG,EAAE,MAAQ,4BAA4B,IAAI,EAAE,KAAK,CAAC,UAAY,EAAE,wBAAwB,EAAE,GAAG,wBAAwB,MAAM,EAAE,MAAQ,EAAE,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC;AAAA,oBACvT,IAAI,EAAE,SAAS,SAAW,SAAW,gBAAkB,IAAI,WAAa,YAAc,cAAc,KAAK,EAAE,SAAS,MAAQ,EAAE,EAAI,GAAK,KAAO,EAAE,SAAS,KAAK,CAAC,iCAAiC,MAAM,EAAE,SAAS,KAAK,CAAC;AAAA,wCACnM,EAAE,cAAgB,cAAgB,EAAE,iCAAiC,MAAM,EAAE,OAAO,KAAK,CAAC;AAAA,kBAE5H,MAAM,GAAK,EAAE,iBAAkB,GAAG,aAAa,EAC3C,IAAI,GAAG,iBAAiB,QAAS,IAAM,QAAQ,CAAC,CAAC,EACrD,GAAG,WAAW,OAAS,GACvB,GAAG,WAAW,OAAS,GACvB,EAAE,uBAAwB,IAAI,EAAE,SAAW,SAAW,EAAE,MAAM,KAAM,GAAM,EAAE,OAAO,EACnF,GAAG,WAAW,eAAe,CAAE,SAAU,SAAU,MAAO,OAAQ,CAAC,CACrE,CACA,SAAS,QAAQ,EAAG,CACd,EAAE,SAAS,YAAY,EAAE,OAAO,EACpC,MAAM,MAAQ,EAAE,MAAM,OAAQ,GAAM,CAAC,EAAE,OAAO,EAAE,IAAK,GAAM,OAAO,OAAO,CAAC,EAAG,EAAG,CAAE,MAAO,EAAE,UAAY,KAAO,EAAE,SAAW,EAAE,KAAM,CAAC,CAAC,EACrI,MAAM,MAAQ,KAAM,MAAM,SAAW,KAAM,MAAM,MAAQ,KACzD,YAAY,EACZ,QAAQ,QAAQ,EAChB,KAAK,EAAE,QAAU,EAAI,CAAC,CACxB,CACA,EAAE,uBAAwB,IAAI,EAAE,iBAAiB,QAAS,IAAM,CAC9D,GAAG,WAAW,OAAS,GAAM,GAAG,WAAW,OAAS,GAAO,MAAM,YAAc,KAAM,GAAG,WAAW,MAAM,EAAG,kBAAkB,CAChI,CAAC,EAED,GAAG,WAAW,iBAAiB,SAAU,MAAO,GAAM,CACpD,EAAE,eAAe,EACjB,MAAM,EAAI,GAAG,WAAW,SAClB,EAAI,MAAM,YAChB,IAAI,GAAK,GACT,MAAM,GAAK,EAAE,GAAG,MAAM,KAAK,EACtB,GAAmE,WAAW,EAAE,GAAI,IAAI,GAAlF,WAAW,EAAE,GAAI,sBAAsB,EAAG,GAAK,IAC1D,MAAM,KAAO,EAAE,OAAO,MAAM,CAAC,EACvB,MAAQ,CAAC,EAAE,EAAE,SAAW,EAAE,QAAQ,WAKxC,GAJI,CAAC,MAAQ,CAAC,OAAS,WAAW,EAAE,OAAQ,4BAA4B,EAAG,GAAK,IACvE,KAAK,KAAO,GAAK,KAAO,MAAQ,WAAW,EAAE,OAAQ,0BAA0B,EAAG,GAAK,IAC3F,WAAW,EAAE,OAAQ,IAAI,EACzB,EAAE,MAAM,UAAW,OAAO,8DAA0D,OAAO,EAAG,GAAK,IACpG,CAAC,GAAI,OAET,MAAM,IAAM,EAAE,uBAAwB,IAAI,EAC1C,IAAI,SAAW,GAAM,IAAI,YAAc,6BACvC,GAAI,CACF,MAAM,IAAI,cAAc,EACxB,MAAM,IAAI,KAAK,gBAAgB,EAC/B,MAAM,MAAQ,EAAE,MAAM,OAAQ,GAAM,CAAC,EAAE,OAAO,EACxC,CAAC,MAAO,GAAG,IAAI,EAAI,MACnB,GAAK,IAAI,SAMf,GALA,GAAG,OAAO,KAAM,MAAM,SAAS,EAC/B,GAAG,OAAO,WAAY,MAAM,GAAG,EAC/B,GAAG,OAAO,qBAAsB,EAAE,EAAE,EAChC,MAAM,GAAG,OAAO,0BAA2B,KAAM,KAAK,IAAI,EAC9D,MAAM,IAAI,KAAK,eAAgB,EAAE,EAC7B,KAAK,OACP,GAAI,CAAE,MAAM,IAAI,KAAK,eAAgB,CAAE,MAAO,KAAK,IAAK,IAAO,CAAE,GAAI,EAAE,UAAW,SAAU,EAAE,IAAK,WAAY,CAAE,OAAQ,EAAE,EAAG,CAAE,EAAE,CAAE,CAAC,CAAG,MAAc,CACpJ,UAAW,KAAK,KAAQ,GAAI,CAAE,MAAM,IAAI,KAAK,eAAgB,CAAE,MAAO,CAAC,CAAE,GAAI,EAAE,UAAW,SAAU,EAAE,IAAK,WAAY,CAAE,OAAQ,EAAE,EAAG,CAAE,CAAC,CAAE,CAAC,CAAG,OAAS,GAAI,CAAE,MAAM,IAAI,MAAM,IAAI,EAAE,KAAK,0BAAqB,GAAG,OAAO,IAAI,CAAG,CACjO,CAEF,MAAM,MAAQ,CACZ,eAAgB,EAAE,GAClB,YAAa,GACb,aAAc,QAAQ,EAAE,OAAO,EAC/B,eAAgB,MAAM,EAAE,OAAO,KAAK,EACpC,kBAAmB,EAAE,SAAS,SAAW,SAAW,aAAe,IAAI,WAAa,UAAY,EAAE,SAAS,KAC3G,iBAAkB,MAAM,EAAE,SAAS,KAAK,CAC1C,EACI,EAAE,UAAW,MAAM,QAAa,EAAE,QAAQ,QAAa,EAAE,QAAQ,MAAK,MAAM,IAAS,EAAE,QAAQ,KAAS,EAAE,QAAQ,YAAW,MAAM,oBAAoB,EAAI,EAAE,QAAQ,WAAW,QAAQ,EAAE,OAAO,EAAE,QAAS,GAAM,CAAE,MAAM,eAAiB,EAAE,CAAC,CAAC,EAAI,EAAE,CAAC,CAAG,CAAC,GAC9P,MAAM,KAAO,CAAC,SAAS,EAAE,EAAE,qBAAqB,EAAE,IAAK,EAAE,MAAM,MAAM,KAAK,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK;AAAA,CAAI,EACtG,MAAM,IAAI,KAAK,kBAAmB,CAAE,WAAY,MAAO,IAAK,CAAC,EAC7D,MAAM,IAAI,SAAU,IAAI,EACxB,IAAI,KAAO,YACX,GAAI,IAAI,UAAY,EAAE,QACpB,GAAI,CAEF,MAAM,MADO,MAAM,IAAI,IAAI,UAAU,GACnB,MAAM,KAAM,GAAM,EAAE,YAAc,EAAE,WAAW,aAAa,CAAC,EAKzE,EAAI,MAJA,MAAM,MAAM,IAAI,SAAS,QAAQ,MAAO,EAAE,EAAI,UAAW,CACjE,OAAQ,OAAQ,YAAa,cAAe,QAAS,CAAE,eAAgB,mBAAoB,OAAQ,kBAAmB,EACtH,KAAM,KAAK,UAAU,CAAE,QAAS,EAAE,QAAS,QAAS,EAAE,GAAI,GAAI,UAAW,KAAO,KAAK,WAAW,aAAa,EAAI,GAAI,MAAO,EAAE,MAAM,MAAM,KAAK,CAAE,CAAC,CACpJ,CAAC,GACiB,KAAK,EAEnB,EAAE,IAAM,EAAE,YAAc,EAAE,SAAS,OAAS,OAAQ,MAAM,IAAI,KAAK,gBAAgB,EAAG,KAAO,EAAE,WACrG,OAAS,GAAI,CAAE,QAAQ,KAAK,uDAAwD,EAAE,CAAG,CAE3F,IAAI,YAAc,yBAClB,OAAO,SAAS,KAAO,IACzB,OAAS,IAAK,CACZ,IAAI,SAAW,GAAO,IAAI,YAAc,gCACxC,OAAO,wCAAqC,IAAI,IAAI,OAAO,EAAI,6BAA+B,IAAI,IAAI,KAAK,EAAI,IAAK,OAAO,CAC7H,CACF,CAAC,EAGD,kBAAkB,EAAE,MAAM,IAAM,CAAC,CAAC,EAClC,UAAU,EACV,MAAM,OAAS,IAAI,gBAAgB,SAAS,MAAM,EAClD,GAAI,OAAO,IAAI,SAAS,GAAK,QAAQ,KAAK,OAAO,IAAI,SAAS,CAAC,EAAG,MAAM,SAAW,CAAE,QAAS,CAAC,OAAO,IAAI,SAAS,EAAG,IAAK,SAAS,OAAO,IAAI,KAAK,EAAG,EAAE,GAAK,CAAE,UACvJ,OAAO,IAAI,OAAO,EAAG,CAC5B,MAAM,IAAM,OAAO,IAAI,OAAO,EAAE,MAAM,GAAG,EAAE,IAAK,GAAM,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,EAAG,CAAC,IAAM,EAAI,GAAK,EAAI,CAAC,EAAE,MAAM,EAAG,EAAE,EAC1H,IAAI,SAAQ,MAAM,SAAW,CAAE,MAAO,GAAI,EAChD,CAEA,GADI,OAAO,IAAI,SAAS,GAAK,CAAC,MAAM,WAAU,MAAM,cAAgB,OAAO,IAAI,SAAS,GACpF,OAAO,IAAI,QAAQ,EACrB,QAAQ,QAAQ,EAChB,cAAc,OAAO,IAAI,QAAQ,CAAC,EAAE,KAAK,UAAU,EAAE,MAAM,IAAM,OAAO,0EAA2E,OAAO,CAAC,UAClJ,OAAO,IAAI,MAAM,IAAM,SAChC,QAAQ,QAAQ,MACX,CACL,QAAQ,QAAQ,EAChB,MAAM,GAAK,MAAM,IAAI,SAAU,IAAI,EAC/B,IAAM,GAAG,OAAS,GAAG,OAAS,GAAK,CAAC,MAAM,eAAiB,CAAC,MAAM,WAAY,MAAM,SAAW,GAAG,SAAU,MAAM,QAAU,GAAG,QAAS,UAAU,MAAM,MAAO,GAAG,GAAG,EAAG,KAAK,CAAC,EACpL,CACF,CAEA,MAAM,KAAO,IAAM,GAAG,aAAa,EAAE,QAAS,GAAM,CAAO,EAAE,SAAU,EAAE,OAAS,GAAM,KAAK,CAAC,EAAK,CAAC,EAChG,SAAS,aAAe,UAAW,SAAS,iBAAiB,mBAAoB,IAAI,EAAQ,KAAK,EACtG,SAAS,iBAAiB,uBAAwB,IAAI,CACxD,GAAG",
  "names": ["bx", "b", "t", "v"]
}
