{"id":11,"date":"2026-07-28T21:29:31","date_gmt":"2026-07-28T21:29:31","guid":{"rendered":"https:\/\/solusflyerscanada.com\/?page_id=11"},"modified":"2026-07-28T21:53:48","modified_gmt":"2026-07-28T21:53:48","slug":"11-2","status":"publish","type":"page","link":"https:\/\/solusflyerscanada.com\/?page_id=11","title":{"rendered":""},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Solus Flyers Partner Map &#8211; preview<\/title>\n<!--\n  PREVIEW ONLY. This is exactly what the [solus_partner_map] shortcode renders,\n  with the plugin CSS, JS and data inlined so you can open it locally and check\n  the colours before installing anything. The plugin is the solus-partner-map folder.\n-->\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Archivo:wght@500;600;700;800&#038;family=Public+Sans:wght@400;500;600;700&#038;family=IBM+Plex+Mono:wght@500;600&#038;display=swap\" rel=\"stylesheet\">\n<style>\n\/* ============================================================\n   SOLUS FLYERS PARTNER MAP \u2014 styles\n   Every selector is scoped under .sf-root so it cannot collide\n   with the host website's stylesheet.\n   ============================================================ *\/\n.sf-root{\n  \/* ---- Brand palette (overridable from the shortcode) ---- *\/\n  --sf-ink:        #1B1B1B;   \/* headings and body copy            *\/\n  --sf-ink-2:      #333333;   \/* banner gradient partner           *\/\n  --sf-signal:     #D7262E;   \/* action red - buttons, accents     *\/\n  --sf-signal-dk:  #A81D24;\n  --sf-paper:      #FFFFFF;   \/* cards                             *\/\n  --sf-shell:      #F4F5F6;   \/* inset panels                      *\/\n  --sf-line:       #E2E4E7;   \/* hairlines                         *\/\n  --sf-muted:      #6A7278;   \/* secondary text                    *\/\n\n  \/* ---- Status colours ---- *\/\n  --sf-operating:  #1F9D55;\n  --sf-seeking:    #F2B705;\n  --sf-coming:     #2D7DD2;\n\n  \/* ---- Map surface ---- *\/\n  --sf-water:      #E7EDF1;\n  --sf-land:       #FFFFFF;\n  --sf-land-line:  #C9D2D9;\n  --sf-prov-line:  #D5DCE2;\n\n  \/* ---- Type ---- *\/\n  --sf-display: \"Archivo\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  --sf-body:    \"Public Sans\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Arial, sans-serif;\n  --sf-mono:    \"IBM Plex Mono\", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n\n  --sf-r-lg: 24px;\n  --sf-r-md: 16px;\n  --sf-r-sm: 10px;\n  --sf-shadow-sm: 0 1px 2px rgba(13,34,51,.06), 0 4px 14px rgba(13,34,51,.06);\n  --sf-shadow-md: 0 2px 6px rgba(13,34,51,.07), 0 18px 40px rgba(13,34,51,.12);\n\n  max-width: 1240px;\n  margin: 0 auto;\n  padding: 24px 18px 48px;\n  box-sizing: border-box;\n  font-family: var(--sf-body);\n  color: var(--sf-ink);\n  line-height: 1.55;\n  -webkit-font-smoothing: antialiased;\n}\n.sf-root *,\n.sf-root *::before,\n.sf-root *::after{ box-sizing: border-box; }\n\n.sf-root h1,\n.sf-root h2,\n.sf-root h3,\n.sf-root p,\n.sf-root ul,\n.sf-root li{ margin:0; padding:0; }\n.sf-root button{ font: inherit; color: inherit; cursor: pointer; }\n\n.sf-root .sf-sr{\n  position:absolute; width:1px; height:1px; padding:0; margin:-1px;\n  overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0;\n}\n\n\/* ------------------------------------------------------------\n   1. Banner\n   ------------------------------------------------------------ *\/\n.sf-root .sf-banner{\n  position: relative;\n  overflow: hidden;\n  border-radius: var(--sf-r-lg);\n  padding: clamp(30px, 5vw, 56px) clamp(22px, 5vw, 56px);\n  background:\n    radial-gradient(1100px 380px at 12% -30%, rgba(228,87,46,.30), transparent 62%),\n    linear-gradient(135deg, var(--sf-ink) 0%, var(--sf-ink-2) 100%);\n  color: #fff;\n  box-shadow: var(--sf-shadow-md);\n}\n\/* halftone print dots \u2014 a nod to what actually lands in the mailbox *\/\n.sf-root .sf-banner::after{\n  content:\"\"; position:absolute; inset:0; pointer-events:none;\n  background-image: radial-gradient(rgba(255,255,255,.16) 1px, transparent 1.4px);\n  background-size: 13px 13px;\n  mask-image: linear-gradient(105deg, transparent 45%, #000 105%);\n  -webkit-mask-image: linear-gradient(105deg, transparent 45%, #000 105%);\n  opacity:.85;\n}\n.sf-root .sf-eyebrow{\n  font-family: var(--sf-mono);\n  font-size: .72rem;\n  letter-spacing: .16em;\n  text-transform: uppercase;\n  color: rgba(255,255,255,.62);\n  margin-bottom: 14px !important;\n}\n.sf-root .sf-banner h1{\n  font-family: var(--sf-display);\n  font-weight: 800;\n  letter-spacing: -.025em;\n  line-height: 1.02;\n  font-size: clamp(2rem, 5vw, 3.4rem);\n  max-width: 17ch;\n}\n.sf-root .sf-banner h1 em{ font-style: normal; color: #FFC9B4; }\n.sf-root .sf-banner p.sf-sub{\n  margin-top: 18px !important;\n  max-width: 56ch;\n  font-size: clamp(1rem, 1.4vw, 1.14rem);\n  color: rgba(255,255,255,.78);\n}\n\n\/* ------------------------------------------------------------\n   2. Statistics\n   ------------------------------------------------------------ *\/\n.sf-root .sf-stats{\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  gap: 14px;\n  margin-top: 22px;\n}\n.sf-root .sf-stat{\n  background: var(--sf-paper);\n  border: 1px solid var(--sf-line);\n  border-radius: var(--sf-r-md);\n  padding: 20px 20px 18px;\n  box-shadow: var(--sf-shadow-sm);\n  opacity: 0;\n  transform: translateY(14px);\n  transition: opacity .6s ease, transform .6s cubic-bezier(.2,.7,.3,1);\n}\n.sf-root .sf-stat.sf-in{ opacity: 1; transform: none; }\n.sf-root .sf-stat .sf-num{\n  font-family: var(--sf-mono);\n  font-weight: 600;\n  font-size: clamp(1.6rem, 3.1vw, 2.3rem);\n  letter-spacing: -.03em;\n  line-height: 1;\n  font-variant-numeric: tabular-nums;\n}\n.sf-root .sf-stat .sf-lab{\n  margin-top: 10px !important;\n  font-size: .74rem;\n  letter-spacing: .09em;\n  text-transform: uppercase;\n  font-weight: 600;\n  color: var(--sf-muted);\n}\n.sf-root .sf-stat .sf-rule{\n  width: 26px; height: 3px; border-radius: 2px;\n  background: var(--sf-signal); margin-bottom: 14px;\n}\n.sf-root .sf-stat:nth-child(2) .sf-rule{ background: var(--sf-seeking); }\n.sf-root .sf-stat:nth-child(3) .sf-rule{ background: var(--sf-operating); }\n.sf-root .sf-stat:nth-child(4) .sf-rule{ background: var(--sf-coming); }\n\n\/* ------------------------------------------------------------\n   3. Toolbar \u2014 search, filters, view switch\n   ------------------------------------------------------------ *\/\n.sf-root .sf-toolbar{\n  margin-top: 26px;\n  display: grid;\n  grid-template-columns: minmax(240px, 380px) 1fr auto;\n  gap: 12px;\n  align-items: start;\n}\n.sf-root .sf-search{ position: relative; }\n.sf-root .sf-search input{\n  width: 100%;\n  font: inherit;\n  font-size: 1rem;\n  padding: 14px 44px 14px 44px;\n  border-radius: 999px;\n  border: 1px solid var(--sf-line);\n  background: var(--sf-paper) ;\n  color: var(--sf-ink);\n  box-shadow: var(--sf-shadow-sm);\n  transition: border-color .2s ease, box-shadow .2s ease;\n}\n.sf-root .sf-search input::placeholder{ color:#8FA1AE; }\n.sf-root .sf-search input:focus{\n  outline: none;\n  border-color: var(--sf-ink-2);\n  box-shadow: 0 0 0 4px rgba(23,56,79,.12);\n}\n.sf-root .sf-search .sf-mag{\n  position:absolute; left:16px; top:50%; transform:translateY(-50%);\n  width:18px; height:18px; color:#8FA1AE; pointer-events:none;\n}\n.sf-root .sf-search .sf-clear{\n  position:absolute; right:8px; top:50%; transform:translateY(-50%);\n  width:32px; height:32px; border:0; border-radius:50%;\n  background:transparent; color:var(--sf-muted); display:none;\n  align-items:center; justify-content:center; font-size:1.1rem; line-height:1;\n}\n.sf-root .sf-search.sf-has-value .sf-clear{ display:flex; }\n.sf-root .sf-search .sf-clear:hover{ background:var(--sf-shell); }\n\n.sf-root .sf-suggest{\n  position:absolute; z-index:40; left:0; right:0; top:calc(100% + 8px);\n  background:var(--sf-paper); border:1px solid var(--sf-line);\n  border-radius:var(--sf-r-md); box-shadow:var(--sf-shadow-md);\n  max-height:320px; overflow-y:auto; padding:6px; display:none;\n}\n.sf-root .sf-suggest.sf-open{ display:block; }\n.sf-root .sf-suggest li{\n  list-style:none; display:flex; align-items:center; gap:10px;\n  padding:10px 12px; border-radius:var(--sf-r-sm); cursor:pointer;\n}\n.sf-root .sf-suggest li[aria-selected=\"true\"],\n.sf-root .sf-suggest li:hover{ background:var(--sf-shell); }\n.sf-root .sf-suggest .sf-dot{ width:9px; height:9px; border-radius:50%; flex:none; }\n.sf-root .sf-suggest .sf-nm{ font-weight:600; }\n.sf-root .sf-suggest .sf-pv{ color:var(--sf-muted); font-size:.86rem; margin-left:auto; font-family:var(--sf-mono); }\n.sf-root .sf-suggest .sf-empty{ padding:14px 12px; color:var(--sf-muted); }\n\n.sf-root .sf-filters{ display:flex; flex-wrap:wrap; gap:8px; align-items:center; }\n.sf-root .sf-chip{\n  border:1px solid var(--sf-line);\n  background:var(--sf-paper);\n  border-radius:999px;\n  padding:11px 16px;\n  font-size:.9rem; font-weight:600;\n  display:inline-flex; align-items:center; gap:8px;\n  box-shadow:var(--sf-shadow-sm);\n  transition: transform .18s ease, background .18s ease, border-color .18s ease, color .18s ease;\n}\n.sf-root .sf-chip:hover{ transform: translateY(-1px); }\n.sf-root .sf-chip .sf-dot{ width:9px; height:9px; border-radius:50%; }\n.sf-root .sf-chip[aria-pressed=\"true\"]{ background:var(--sf-ink); border-color:var(--sf-ink); color:#fff; }\n.sf-root .sf-chip .sf-count{ font-family:var(--sf-mono); font-size:.78rem; opacity:.6; }\n\n.sf-root .sf-viewswitch{\n  display:inline-flex; padding:4px; gap:4px;\n  background:var(--sf-paper); border:1px solid var(--sf-line);\n  border-radius:999px; box-shadow:var(--sf-shadow-sm);\n}\n.sf-root .sf-viewswitch button{\n  border:0; background:transparent; border-radius:999px;\n  padding:9px 16px; font-size:.88rem; font-weight:600; color:var(--sf-muted);\n  transition: background .18s ease, color .18s ease;\n}\n.sf-root .sf-viewswitch button[aria-pressed=\"true\"]{ background:var(--sf-ink); color:#fff; }\n\n\/* ------------------------------------------------------------\n   4. Map\n   ------------------------------------------------------------ *\/\n.sf-root .sf-mapwrap{\n  position:relative;\n  margin-top:16px;\n  border-radius:var(--sf-r-lg);\n  overflow:hidden;\n  background:var(--sf-water);\n  border:1px solid var(--sf-line);\n  box-shadow:var(--sf-shadow-md);\n  aspect-ratio: 16 \/ 9;\n  min-height: 420px;\n  touch-action: pan-y;\n}\n.sf-root .sf-map{ display:block; width:100%; height:100%; cursor:grab; }\n.sf-root .sf-map.sf-dragging{ cursor:grabbing; }\n.sf-root .sf-map:focus-visible{ outline:3px solid var(--sf-ink-2); outline-offset:-3px; }\n\n.sf-root .sf-land{ fill:var(--sf-land); stroke:var(--sf-land-line); stroke-width:1; vector-effect:non-scaling-stroke; }\n.sf-root .sf-lake{ fill:var(--sf-water); stroke:var(--sf-land-line); stroke-width:.8; vector-effect:non-scaling-stroke; }\n.sf-root .sf-prov{ fill:none; stroke:var(--sf-prov-line); stroke-width:1; stroke-dasharray:4 4; vector-effect:non-scaling-stroke; }\n.sf-root .sf-provlabel{\n  font-family:var(--sf-mono); font-size:9px; font-weight:600;\n  fill:#93A6B4; letter-spacing:.14em; text-anchor:middle;\n  pointer-events:none; user-select:none;\n}\n.sf-root .sf-qc-note{ font-family:var(--sf-body); font-size:7.4px; fill:#A2B3C0; text-anchor:middle; letter-spacing:.02em; }\n\n.sf-root .sf-mk{ cursor:pointer; }\n.sf-root .sf-mk .sf-hit{ fill:transparent; }\n.sf-root .sf-mk .sf-core{ stroke:#fff; stroke-width:1.6; transition:filter .2s ease; }\n.sf-root .sf-mk .sf-halo{ fill:none; stroke-width:1.6; opacity:0; }\n.sf-root .sf-mk:hover .sf-core,\n.sf-root .sf-mk:focus .sf-core{ filter:drop-shadow(0 2px 5px rgba(13,34,51,.45)); }\n.sf-root .sf-mk:focus{ outline:none; }\n.sf-root .sf-mk:focus-visible .sf-ring{ opacity:1; }\n.sf-root .sf-mk .sf-ring{ fill:none; stroke:var(--sf-ink); stroke-width:2; opacity:0; }\n.sf-root .sf-mk.sf-active .sf-ring{ opacity:1; stroke:var(--sf-ink); }\n.sf-root .sf-mk .sf-lbl{\n  font-family:var(--sf-body); font-size:8.6px; font-weight:600;\n  fill:var(--sf-ink); paint-order:stroke; stroke:rgba(255,255,255,.9); stroke-width:2.6px;\n  pointer-events:none; opacity:0; transition:opacity .2s ease;\n}\n.sf-root .sf-mk.sf-labelled .sf-lbl{ opacity:1; }\n\n@keyframes sf-beacon{\n  0%   { opacity:.85; transform:scale(1); }\n  70%  { opacity:0;   transform:scale(2.9); }\n  100% { opacity:0;   transform:scale(2.9); }\n}\n.sf-root .sf-mk.sf-pulse .sf-halo{\n  opacity:1;\n  transform-origin:center;\n  transform-box:fill-box;\n  animation: sf-beacon 2.4s cubic-bezier(.2,.6,.3,1) infinite;\n}\n\n.sf-root .sf-heat circle{ mix-blend-mode:multiply; }\n\n\/* map controls *\/\n.sf-root .sf-ctrls{ position:absolute; right:14px; bottom:14px; display:flex; flex-direction:column; gap:8px; z-index:5; }\n.sf-root .sf-ctrls button{\n  width:40px; height:40px; border-radius:12px;\n  border:1px solid var(--sf-line); background:rgba(255,255,255,.94);\n  backdrop-filter:blur(6px);\n  display:flex; align-items:center; justify-content:center;\n  font-size:1.15rem; font-weight:600; color:var(--sf-ink);\n  box-shadow:var(--sf-shadow-sm);\n  transition: transform .16s ease, background .16s ease;\n}\n.sf-root .sf-ctrls button:hover{ transform:scale(1.06); background:#fff; }\n.sf-root .sf-ctrls button.sf-reset{ font-size:.68rem; letter-spacing:.06em; font-family:var(--sf-mono); }\n\n.sf-root .sf-hint{\n  position:absolute; left:14px; bottom:14px; z-index:5;\n  font-size:.74rem; color:var(--sf-muted);\n  background:rgba(255,255,255,.9); backdrop-filter:blur(6px);\n  border:1px solid var(--sf-line); border-radius:999px; padding:7px 13px;\n  box-shadow:var(--sf-shadow-sm);\n  transition:opacity .4s ease;\n}\n\n\/* ------------------------------------------------------------\n   5. City panel\n   ------------------------------------------------------------ *\/\n.sf-root .sf-panel{\n  position:absolute; z-index:20;\n  top:14px; right:14px; bottom:14px; width:370px;\n  background:var(--sf-paper);\n  border:1px solid var(--sf-line);\n  border-radius:var(--sf-r-lg);\n  box-shadow:var(--sf-shadow-md);\n  display:flex; flex-direction:column;\n  transform:translateX(calc(100% + 22px));\n  opacity:0; pointer-events:none;\n  transition: transform .42s cubic-bezier(.2,.75,.25,1), opacity .3s ease;\n}\n.sf-root .sf-panel.sf-open{ transform:none; opacity:1; pointer-events:auto; }\n.sf-root .sf-panel-head{ padding:22px 22px 16px; border-bottom:1px solid var(--sf-line); position:relative; }\n.sf-root .sf-panel-close{\n  position:absolute; top:14px; right:14px;\n  width:34px; height:34px; border-radius:50%; border:0;\n  background:var(--sf-shell); color:var(--sf-muted);\n  display:flex; align-items:center; justify-content:center; font-size:1.1rem;\n  transition:background .18s ease, transform .18s ease;\n}\n.sf-root .sf-panel-close:hover{ background:#E2E9EE; transform:rotate(90deg); }\n.sf-root .sf-panel h3{\n  font-family:var(--sf-display); font-weight:700; letter-spacing:-.02em;\n  font-size:1.45rem; line-height:1.12; padding-right:36px;\n}\n.sf-root .sf-panel .sf-prov-name{ color:var(--sf-muted); font-size:.92rem; margin-top:2px !important; }\n.sf-root .sf-status{\n  display:inline-flex; align-items:center; gap:8px;\n  margin-top:14px; padding:7px 14px; border-radius:999px;\n  font-size:.8rem; font-weight:700; letter-spacing:.04em; text-transform:uppercase;\n}\n.sf-root .sf-status .sf-dot{ width:9px; height:9px; border-radius:50%; background:currentColor; }\n.sf-root .sf-status.sf-s-operating{ color:#0E7038; background:rgba(31,157,85,.13); }\n.sf-root .sf-status.sf-s-seeking{   color:#8A6400; background:rgba(242,183,5,.18); }\n.sf-root .sf-status.sf-s-coming{    color:#1B5B9E; background:rgba(45,125,210,.14); }\n\n.sf-root .sf-panel-body{ padding:20px 22px 22px; overflow-y:auto; flex:1; }\n.sf-root .sf-metrics{ display:grid; grid-template-columns:1fr 1fr; gap:12px; }\n.sf-root .sf-metric{\n  background:var(--sf-shell); border-radius:var(--sf-r-md); padding:14px 15px;\n}\n.sf-root .sf-metric .sf-k{\n  font-size:.68rem; letter-spacing:.09em; text-transform:uppercase;\n  font-weight:700; color:var(--sf-muted);\n}\n.sf-root .sf-metric .sf-v{\n  font-family:var(--sf-mono); font-weight:600; font-size:1.22rem;\n  margin-top:5px !important; font-variant-numeric:tabular-nums; letter-spacing:-.02em;\n}\n.sf-root .sf-block-k{\n  font-size:.68rem; letter-spacing:.09em; text-transform:uppercase;\n  font-weight:700; color:var(--sf-muted); margin-top:22px !important;\n}\n.sf-root .sf-stars{ display:flex; align-items:center; gap:7px; margin-top:8px; }\n.sf-root .sf-stars svg{ width:19px; height:19px; }\n.sf-root .sf-stars .sf-on{ fill:var(--sf-signal); }\n.sf-root .sf-stars .sf-off{ fill:#D8E0E6; }\n.sf-root .sf-stars span{ font-weight:700; font-size:.92rem; margin-left:3px; }\n.sf-root .sf-why{ margin-top:9px !important; color:#354B5C; font-size:.95rem; }\n\n.sf-root .sf-panel-foot{ padding:16px 22px 20px; border-top:1px solid var(--sf-line); }\n.sf-root .sf-cta{\n  display:block; width:100%; text-align:center;\n  border:0; border-radius:999px;\n  padding:16px 20px;\n  background:var(--sf-signal); color:#fff;\n  font-family:var(--sf-display); font-weight:700; font-size:1rem; letter-spacing:-.01em;\n  box-shadow:0 8px 20px rgba(228,87,46,.32);\n  transition: transform .18s ease, background .18s ease, box-shadow .18s ease;\n}\n.sf-root .sf-cta:hover{ transform:scale(1.025); background:var(--sf-signal-dk); box-shadow:0 10px 26px rgba(228,87,46,.4); }\n.sf-root .sf-cta.sf-ghost{\n  background:transparent; color:var(--sf-ink);\n  border:1.5px solid var(--sf-line); box-shadow:none;\n}\n.sf-root .sf-cta.sf-ghost:hover{ background:var(--sf-shell); transform:none; }\n.sf-root .sf-foot-note{ margin-top:10px !important; font-size:.78rem; color:var(--sf-muted); text-align:center; }\n\n\/* ------------------------------------------------------------\n   6. Legend\n   ------------------------------------------------------------ *\/\n.sf-root .sf-legend{\n  display:flex; flex-wrap:wrap; align-items:center; gap:10px 20px;\n  margin-top:16px; padding:16px 20px;\n  background:var(--sf-paper); border:1px solid var(--sf-line);\n  border-radius:var(--sf-r-md); box-shadow:var(--sf-shadow-sm);\n}\n.sf-root .sf-legend .sf-li{ display:inline-flex; align-items:center; gap:9px; font-size:.9rem; font-weight:600; }\n.sf-root .sf-legend .sf-dot{ width:11px; height:11px; border-radius:50%; }\n.sf-root .sf-legend .sf-note{\n  margin-left:auto; font-size:.82rem; color:var(--sf-muted); font-weight:400;\n}\n@media (max-width: 720px){ .sf-root .sf-legend .sf-note{ margin-left:0; width:100%; } }\n\n\/* ------------------------------------------------------------\n   7. Footer call to action\n   ------------------------------------------------------------ *\/\n.sf-root .sf-closer{\n  margin-top:24px;\n  border-radius:var(--sf-r-lg);\n  padding:clamp(30px,4.6vw,52px) clamp(22px,5vw,52px);\n  background:\n    radial-gradient(900px 340px at 88% -20%, rgba(45,125,210,.30), transparent 60%),\n    linear-gradient(120deg, var(--sf-ink-2) 0%, var(--sf-ink) 100%);\n  color:#fff;\n  display:grid; grid-template-columns:1.35fr .65fr; gap:30px; align-items:center;\n  box-shadow:var(--sf-shadow-md);\n}\n.sf-root .sf-closer h2{\n  font-family:var(--sf-display); font-weight:800; letter-spacing:-.025em;\n  font-size:clamp(1.7rem,3.6vw,2.6rem); line-height:1.05;\n}\n.sf-root .sf-closer p{ margin-top:14px !important; color:rgba(255,255,255,.78); max-width:52ch; }\n.sf-root .sf-closer .sf-cta{ box-shadow:0 10px 30px rgba(228,87,46,.4); }\n\n\/* ------------------------------------------------------------\n   8. Toast\n   ------------------------------------------------------------ *\/\nbody .sf-toast{\n  position:fixed; left:50%; bottom:26px; transform:translate(-50%, 20px);\n  background:var(--sf-ink); color:#fff; padding:13px 20px;\n  border-radius:999px; font-size:.88rem; z-index:9999;\n  box-shadow:var(--sf-shadow-md); opacity:0; pointer-events:none;\n  transition:opacity .3s ease, transform .3s ease; max-width:90vw; text-align:center;\n}\nbody .sf-toast.sf-show{ opacity:1; transform:translate(-50%,0); }\n\n\/* ------------------------------------------------------------\n   9. Responsive\n   ------------------------------------------------------------ *\/\n.sf-root @media (max-width: 1000px){\n  .sf-root .sf-toolbar{ grid-template-columns:1fr; }\n  .sf-root .sf-viewswitch{ justify-self:start; }\n  .sf-root .sf-closer{ grid-template-columns:1fr; }\n}\n@media (max-width: 760px){\n  .sf-root{ padding:14px 12px 36px; }\n  .sf-root .sf-stats{ grid-template-columns:1fr 1fr; }\n  .sf-root .sf-mapwrap{ aspect-ratio:4 \/ 3; min-height:360px; border-radius:var(--sf-r-md); }\n  .sf-root .sf-hint{ display:none; }\n  .sf-root .sf-ctrls button{ width:44px; height:44px; }\n\n  \/* city information slides up from the bottom *\/\n.sf-root .sf-panel{\n    top:auto; left:0; right:0; bottom:0; width:auto;\n    max-height:74%;\n    border-radius:22px 22px 0 0;\n    border-bottom:0;\n    transform:translateY(calc(100% + 20px));\n  }\n  .sf-root .sf-panel::before{\n    content:\"\"; position:absolute; top:9px; left:50%; transform:translateX(-50%);\n    width:44px; height:4px; border-radius:2px; background:var(--sf-line);\n  }\n  .sf-root .sf-panel-head{ padding-top:26px; }\n  .sf-root .sf-panel.sf-open{ transform:translateY(0); }\n  .sf-root .sf-cta{ padding:17px 20px; }\n}\n@media (max-width: 420px){\n  .sf-root .sf-stats{ grid-template-columns:1fr; }\n}\n\n\/* ------------------------------------------------------------\n   10. Accessibility preferences\n   ------------------------------------------------------------ *\/\n.sf-root @media (prefers-reduced-motion: reduce){\n  .sf-root *{ animation-duration:.001ms !important; animation-iteration-count:1 !important; transition-duration:.001ms !important; }\n  .sf-root .sf-stat{ opacity:1; transform:none; }\n}\n@media (prefers-contrast: more){\n  .sf-root{ --sf-line:#8FA1AE; --sf-muted:#3A4E5D; --sf-land-line:#7B8F9D; }\n}\n.sf-root :focus-visible{ outline:3px solid var(--sf-ink-2); outline-offset:2px; border-radius:6px; }\n\n\n\/* ============================================================\n   WordPress theme guard\n   Themes commonly restyle bare button \/ input \/ svg \/ ul elements.\n   These rules are last in the file and carry .sf-root specificity,\n   so the widget keeps its own look inside any theme.\n   ============================================================ *\/\n.sf-root{ width:100%; clear:both; }\n.sf-root, .sf-root *{ box-sizing:border-box; }\n.sf-root svg{ max-width:none; max-height:none; width:auto; height:auto; display:inline-block; vertical-align:middle; }\n.sf-root .sf-map{ width:100%; height:100%; display:block; }\n.sf-root .sf-mag, .sf-root .sf-stars svg{ display:block; }\n.sf-root button{\n  font-family:inherit; text-transform:none; letter-spacing:normal;\n  -webkit-appearance:none; appearance:none; text-decoration:none;\n  min-width:0; min-height:0; width:auto; text-shadow:none;\n}\n.sf-root input[type=\"search\"], .sf-root input[type=\"text\"]{\n  -webkit-appearance:none; appearance:none; height:auto; min-height:0;\n  text-transform:none; letter-spacing:normal; box-shadow:var(--sf-shadow-sm);\n}\n.sf-root input[type=\"search\"]::-webkit-search-decoration,\n.sf-root input[type=\"search\"]::-webkit-search-cancel-button{ -webkit-appearance:none; }\n.sf-root ul, .sf-root li{ list-style:none; margin:0; padding:0; }\n.sf-root ul::before, .sf-root li::before{ content:none; }\n.sf-root h1, .sf-root h2, .sf-root h3{ text-transform:none; }\n.sf-root a{ text-decoration:none; }\n\n<\/style>\n<\/head>\n<body style=\"margin:0;background:#F4F5F6;\">\n\t<div class=\"sf-root\"\n\t\t id=\"sfm-1\"\n\t\t data-solus-map\n\t\t data-apply=\"#partner-with-us, #partner-with-us-form, .partner-with-us, #apply, #contact\"\n\t\t data-apply-url=\"\"\n\t\t data-people-per-home=\"2.4\"\n\t\t >\n\n\t\t<header class=\"sf-banner\">\n\t\t\t<p class=\"sf-eyebrow\">Partner network &#8211; Canada<\/p>\n\t\t\t<h1>Partner with Solus Flyers Across Canada<\/h1>\n\t\t\t<p class=\"sf-sub\">Own and operate a Solus Flyers business in your community. Click on a city below to discover available opportunities.<\/p>\n\t\t<\/header>\n\n\t\t<section class=\"sf-stats\" aria-label=\"Network at a glance\">\n\t\t\t<div class=\"sf-stat\"><div class=\"sf-rule\"><\/div><p class=\"sf-num\" data-count=\"0\" data-suffix=\"\">0<\/p><p class=\"sf-lab\">Communities mapped<\/p><\/div>\n\t\t\t<div class=\"sf-stat\"><div class=\"sf-rule\"><\/div><p class=\"sf-num\" data-count=\"0\" data-suffix=\"+\">0<\/p><p class=\"sf-lab\">Homes within reach<\/p><\/div>\n\t\t\t<div class=\"sf-stat\"><div class=\"sf-rule\"><\/div><p class=\"sf-num\" data-count=\"0\" data-suffix=\"\">0<\/p><p class=\"sf-lab\">Partners operating<\/p><\/div>\n\t\t\t<div class=\"sf-stat\"><div class=\"sf-rule\"><\/div><p class=\"sf-num\" data-count=\"0\" data-suffix=\"\">0<\/p><p class=\"sf-lab\">Cities seeking a partner<\/p><\/div>\n\t\t<\/section>\n\n\t\t<div class=\"sf-toolbar\">\n\t\t\t<div class=\"sf-search\">\n\t\t\t\t<svg class=\"sf-mag\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"7\"><\/circle><path d=\"M20 20l-3.6-3.6\"><\/path><\/svg>\n\t\t\t\t<input class=\"sf-q\" id=\"sfm-1-q\" type=\"search\" autocomplete=\"off\" spellcheck=\"false\"\n\t\t\t\t\t   placeholder=\"Search for your city...\"\n\t\t\t\t\t   aria-label=\"Search for your city\"\n\t\t\t\t\t   role=\"combobox\" aria-expanded=\"false\"\n\t\t\t\t\t   aria-controls=\"sfm-1-suggest\" aria-autocomplete=\"list\">\n\t\t\t\t<button class=\"sf-clear\" type=\"button\" aria-label=\"Clear search\">&times;<\/button>\n\t\t\t\t<ul class=\"sf-suggest\" id=\"sfm-1-suggest\" role=\"listbox\" aria-label=\"Matching cities\"><\/ul>\n\t\t\t<\/div>\n\n\t\t\t<div class=\"sf-filters\" role=\"group\" aria-label=\"Filter cities by status\">\n\t\t\t\t<button class=\"sf-chip\" type=\"button\" data-filter=\"all\" aria-pressed=\"true\">All cities <span class=\"sf-count\" data-c=\"all\"><\/span><\/button>\n\t\t\t\t<button class=\"sf-chip\" type=\"button\" data-filter=\"operating\" aria-pressed=\"false\"><span class=\"sf-dot\" style=\"background:var(--sf-operating)\"><\/span>Operating <span class=\"sf-count\" data-c=\"operating\"><\/span><\/button>\n\t\t\t\t<button class=\"sf-chip\" type=\"button\" data-filter=\"seeking\" aria-pressed=\"false\"><span class=\"sf-dot\" style=\"background:var(--sf-seeking)\"><\/span>Seeking partner <span class=\"sf-count\" data-c=\"seeking\"><\/span><\/button>\n\t\t\t\t<button class=\"sf-chip\" type=\"button\" data-filter=\"coming\" aria-pressed=\"false\"><span class=\"sf-dot\" style=\"background:var(--sf-coming)\"><\/span>Coming soon <span class=\"sf-count\" data-c=\"coming\"><\/span><\/button>\n\t\t\t<\/div>\n\n\t\t\t<div class=\"sf-viewswitch\" role=\"group\" aria-label=\"Map display mode\">\n\t\t\t\t<button type=\"button\" data-view=\"markers\" aria-pressed=\"true\">Markers<\/button>\n\t\t\t\t<button type=\"button\" data-view=\"heat\" aria-pressed=\"false\">Heat map<\/button>\n\t\t\t<\/div>\n\t\t<\/div>\n\n\t\t<div class=\"sf-mapwrap\">\n\t\t\t<svg class=\"sf-map\" tabindex=\"0\" role=\"application\"\n\t\t\t\t aria-label=\"Map of Canada showing Solus Flyers partner opportunities by city. Use the search box above to jump to a city, or press Tab to move between city markers.\"\n\t\t\t\t xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><\/svg>\n\n\t\t\t<p class=\"sf-hint\">Drag to pan &middot; click the map, then scroll to zoom<\/p>\n\n\t\t\t<div class=\"sf-ctrls\">\n\t\t\t\t<button type=\"button\" class=\"sf-zin\" aria-label=\"Zoom in\">+<\/button>\n\t\t\t\t<button type=\"button\" class=\"sf-zout\" aria-label=\"Zoom out\">&minus;<\/button>\n\t\t\t\t<button type=\"button\" class=\"sf-zres sf-reset\" aria-label=\"Reset the map view\">RESET<\/button>\n\t\t\t<\/div>\n\n\t\t\t<aside class=\"sf-panel\" role=\"dialog\" aria-modal=\"false\" aria-labelledby=\"sfm-1-city\" aria-hidden=\"true\">\n\t\t\t\t<div class=\"sf-panel-head\">\n\t\t\t\t\t<button class=\"sf-panel-close sf-p-close\" type=\"button\" aria-label=\"Close city details\">&times;<\/button>\n\t\t\t\t\t<h3 class=\"sf-p-name\" id=\"sfm-1-city\">City<\/h3>\n\t\t\t\t\t<p class=\"sf-prov-name sf-p-prov\">Province<\/p>\n\t\t\t\t\t<span class=\"sf-status sf-p-status\"><span class=\"sf-dot\"><\/span><span class=\"sf-p-statustext\">Status<\/span><\/span>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"sf-panel-body\">\n\t\t\t\t\t<div class=\"sf-metrics\">\n\t\t\t\t\t\t<div class=\"sf-metric\"><p class=\"sf-k\">Population<\/p><p class=\"sf-v sf-p-pop\">&mdash;<\/p><\/div>\n\t\t\t\t\t\t<div class=\"sf-metric\"><p class=\"sf-k\">Est. residential homes<\/p><p class=\"sf-v sf-p-homes\">&mdash;<\/p><\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<p class=\"sf-block-k\">Opportunity rating<\/p>\n\t\t\t\t\t<div class=\"sf-stars sf-p-stars\"><\/div>\n\t\t\t\t\t<p class=\"sf-block-k\">Why this city?<\/p>\n\t\t\t\t\t<p class=\"sf-why sf-p-why\"><\/p>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"sf-panel-foot sf-p-foot\"><\/div>\n\t\t\t<\/aside>\n\t\t<\/div>\n\n\t\t<div class=\"sf-legend\">\n\t\t\t<span class=\"sf-li\"><span class=\"sf-dot\" style=\"background:var(--sf-operating)\"><\/span>Operating<\/span>\n\t\t\t<span class=\"sf-li\"><span class=\"sf-dot\" style=\"background:var(--sf-seeking)\"><\/span>Seeking partner<\/span>\n\t\t\t<span class=\"sf-li\"><span class=\"sf-dot\" style=\"background:var(--sf-coming)\"><\/span>Coming soon<\/span>\n\t\t\t<span class=\"sf-note\">Zoom in to reveal smaller communities. Solus Flyers does not currently operate in Quebec.<\/span>\n\t\t<\/div>\n\n\t\t<p class=\"sf-sr sf-live\" role=\"status\" aria-live=\"polite\"><\/p>\n\n\t\t<section class=\"sf-closer\">\n\t\t\t<div>\n\t\t\t\t<h2>Your city could be next<\/h2>\n\t\t\t\t<p>If your city is currently seeking a partner, now is the perfect time to become part of the Solus Flyers network. We provide the business model, marketing materials, website, and ongoing support so you can focus on building your local business.<\/p>\n\t\t\t<\/div>\n\t\t\t<div>\n\t\t\t\t<button class=\"sf-cta\" type=\"button\" data-sf-apply>Apply to become a Solus Flyers Partner<\/button>\n\t\t\t<\/div>\n\t\t<\/section>\n\t<\/div>\n<section id=\"partner-with-us\" style=\"max-width:1240px;margin:0 auto;padding:0 18px 80px;font-family:'Public Sans',Arial,sans-serif;color:#1B1B1B;\">\n  <div style=\"background:#fff;border:1px solid #E2E4E7;border-radius:24px;padding:clamp(26px,4vw,44px);box-shadow:0 2px 6px rgba(0,0,0,.06),0 18px 40px rgba(0,0,0,.08);\">\n    <p style=\"font-family:'IBM Plex Mono',monospace;font-size:.72rem;letter-spacing:.16em;text-transform:uppercase;color:#6A7278;margin:0 0 12px;\">Stand-in for your WordPress form<\/p>\n    <h2 style=\"font-family:'Archivo',Arial,sans-serif;font-weight:800;letter-spacing:-.025em;font-size:clamp(1.6rem,3vw,2.2rem);margin:0;\">Partner with Us<\/h2>\n    <p style=\"color:#6A7278;margin:12px 0 24px;max-width:60ch;\">In WordPress this is your real form. Give its block the HTML anchor <code>partner-with-us<\/code>, and the map will scroll here and fill the area field in.<\/p>\n    <div style=\"display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;\">\n      <label style=\"display:block;font-size:.78rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#6A7278;\">First &amp; last name<input type=\"text\" name=\"name\" style=\"display:block;width:100%;margin-top:7px;padding:13px 15px;border:1px solid #E2E4E7;border-radius:12px;font:inherit;font-size:1rem;text-transform:none;letter-spacing:normal;color:#1B1B1B;\"><\/label>\n      <label style=\"display:block;font-size:.78rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#6A7278;\">Email address<input type=\"email\" name=\"email\" style=\"display:block;width:100%;margin-top:7px;padding:13px 15px;border:1px solid #E2E4E7;border-radius:12px;font:inherit;font-size:1rem;text-transform:none;letter-spacing:normal;color:#1B1B1B;\"><\/label>\n      <label style=\"display:block;font-size:.78rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#6A7278;\">Which Area?<input type=\"text\" name=\"area\" placeholder=\"Filled in from the map\" style=\"display:block;width:100%;margin-top:7px;padding:13px 15px;border:1px solid #E2E4E7;border-radius:12px;font:inherit;font-size:1rem;text-transform:none;letter-spacing:normal;color:#1B1B1B;\"><\/label>\n    <\/div>\n  <\/div>\n<\/section>\n\n<script>window.SolusPartnerMapData = {\"cities\":[\n{\"name\":\"Toronto\",\"prov\":\"ON\",\"lat\":43.65,\"lng\":-79.38,\"pop\":2794356,\"status\":\"coming\"},\n{\"name\":\"Calgary\",\"prov\":\"AB\",\"lat\":51.05,\"lng\":-114.07,\"pop\":1306784,\"status\":\"coming\"},\n{\"name\":\"Ottawa\",\"prov\":\"ON\",\"lat\":45.42,\"lng\":-75.7,\"pop\":1017449,\"status\":\"coming\"},\n{\"name\":\"Edmonton\",\"prov\":\"AB\",\"lat\":53.55,\"lng\":-113.49,\"pop\":1010899,\"status\":\"coming\"},\n{\"name\":\"Winnipeg\",\"prov\":\"MB\",\"lat\":49.9,\"lng\":-97.14,\"pop\":749607,\"status\":\"coming\"},\n{\"name\":\"Mississauga\",\"prov\":\"ON\",\"lat\":43.59,\"lng\":-79.64,\"pop\":717961,\"status\":\"seeking\"},\n{\"name\":\"Vancouver\",\"prov\":\"BC\",\"lat\":49.28,\"lng\":-123.12,\"pop\":662248,\"status\":\"coming\"},\n{\"name\":\"Brampton\",\"prov\":\"ON\",\"lat\":43.68,\"lng\":-79.76,\"pop\":656480,\"status\":\"seeking\"},\n{\"name\":\"Hamilton\",\"prov\":\"ON\",\"lat\":43.26,\"lng\":-79.87,\"pop\":569353,\"status\":\"coming\"},\n{\"name\":\"Surrey\",\"prov\":\"BC\",\"lat\":49.19,\"lng\":-122.85,\"pop\":568322,\"status\":\"seeking\"},\n{\"name\":\"Halifax\",\"prov\":\"NS\",\"lat\":44.65,\"lng\":-63.58,\"pop\":439819,\"status\":\"coming\"},\n{\"name\":\"London\",\"prov\":\"ON\",\"lat\":42.98,\"lng\":-81.25,\"pop\":422324,\"status\":\"coming\"},\n{\"name\":\"Markham\",\"prov\":\"ON\",\"lat\":43.86,\"lng\":-79.34,\"pop\":338503,\"status\":\"seeking\"},\n{\"name\":\"Vaughan\",\"prov\":\"ON\",\"lat\":43.84,\"lng\":-79.51,\"pop\":323103,\"status\":\"seeking\"},\n{\"name\":\"Saskatoon\",\"prov\":\"SK\",\"lat\":52.13,\"lng\":-106.67,\"pop\":266141,\"status\":\"coming\"},\n{\"name\":\"Kitchener\",\"prov\":\"ON\",\"lat\":43.45,\"lng\":-80.49,\"pop\":256885,\"status\":\"coming\"},\n{\"name\":\"Burnaby\",\"prov\":\"BC\",\"lat\":49.25,\"lng\":-122.98,\"pop\":249125,\"status\":\"seeking\"},\n{\"name\":\"Windsor\",\"prov\":\"ON\",\"lat\":42.32,\"lng\":-83.04,\"pop\":229660,\"status\":\"coming\"},\n{\"name\":\"Regina\",\"prov\":\"SK\",\"lat\":50.45,\"lng\":-104.62,\"pop\":226404,\"status\":\"seeking\"},\n{\"name\":\"Oakville\",\"prov\":\"ON\",\"lat\":43.47,\"lng\":-79.69,\"pop\":213759,\"status\":\"seeking\"},\n{\"name\":\"Richmond\",\"prov\":\"BC\",\"lat\":49.17,\"lng\":-123.14,\"pop\":209937,\"status\":\"seeking\"},\n{\"name\":\"Richmond Hill\",\"prov\":\"ON\",\"lat\":43.88,\"lng\":-79.44,\"pop\":202022,\"status\":\"seeking\"},\n{\"name\":\"Burlington\",\"prov\":\"ON\",\"lat\":43.34,\"lng\":-79.83,\"pop\":186948,\"status\":\"seeking\"},\n{\"name\":\"Oshawa\",\"prov\":\"ON\",\"lat\":43.9,\"lng\":-78.87,\"pop\":175383,\"status\":\"seeking\"},\n{\"name\":\"Greater Sudbury\",\"prov\":\"ON\",\"lat\":46.49,\"lng\":-80.99,\"pop\":166004,\"status\":\"operating\"},\n{\"name\":\"Abbotsford\",\"prov\":\"BC\",\"lat\":49.05,\"lng\":-122.33,\"pop\":153524,\"status\":\"seeking\"},\n{\"name\":\"Coquitlam\",\"prov\":\"BC\",\"lat\":49.28,\"lng\":-122.79,\"pop\":148625,\"status\":\"seeking\"},\n{\"name\":\"Barrie\",\"prov\":\"ON\",\"lat\":44.39,\"lng\":-79.69,\"pop\":147829,\"status\":\"operating\"},\n{\"name\":\"Kelowna\",\"prov\":\"BC\",\"lat\":49.89,\"lng\":-119.5,\"pop\":144576,\"status\":\"seeking\"},\n{\"name\":\"Guelph\",\"prov\":\"ON\",\"lat\":43.55,\"lng\":-80.25,\"pop\":143740,\"status\":\"seeking\"},\n{\"name\":\"Whitby\",\"prov\":\"ON\",\"lat\":43.88,\"lng\":-78.94,\"pop\":138501,\"status\":\"seeking\"},\n{\"name\":\"Cambridge\",\"prov\":\"ON\",\"lat\":43.36,\"lng\":-80.31,\"pop\":138479,\"status\":\"seeking\"},\n{\"name\":\"St. Catharines\",\"prov\":\"ON\",\"lat\":43.16,\"lng\":-79.25,\"pop\":136803,\"status\":\"seeking\"},\n{\"name\":\"Milton\",\"prov\":\"ON\",\"lat\":43.51,\"lng\":-79.88,\"pop\":132979,\"status\":\"seeking\"},\n{\"name\":\"Langley Township\",\"prov\":\"BC\",\"lat\":49.1,\"lng\":-122.66,\"pop\":132603,\"status\":\"seeking\"},\n{\"name\":\"Kingston\",\"prov\":\"ON\",\"lat\":44.23,\"lng\":-76.49,\"pop\":132485,\"status\":\"coming\"},\n{\"name\":\"Ajax\",\"prov\":\"ON\",\"lat\":43.85,\"lng\":-79.02,\"pop\":126666,\"status\":\"seeking\"},\n{\"name\":\"Waterloo\",\"prov\":\"ON\",\"lat\":43.47,\"lng\":-80.52,\"pop\":121436,\"status\":\"seeking\"},\n{\"name\":\"Saanich\",\"prov\":\"BC\",\"lat\":48.48,\"lng\":-123.38,\"pop\":117735,\"status\":\"seeking\"},\n{\"name\":\"St. John's\",\"prov\":\"NL\",\"lat\":47.56,\"lng\":-52.71,\"pop\":110525,\"status\":\"seeking\"},\n{\"name\":\"Thunder Bay\",\"prov\":\"ON\",\"lat\":48.38,\"lng\":-89.25,\"pop\":108843,\"status\":\"coming\"},\n{\"name\":\"Delta\",\"prov\":\"BC\",\"lat\":49.09,\"lng\":-123.06,\"pop\":108455,\"status\":\"seeking\"},\n{\"name\":\"Brantford\",\"prov\":\"ON\",\"lat\":43.14,\"lng\":-80.26,\"pop\":104688,\"status\":\"seeking\"},\n{\"name\":\"Chatham-Kent\",\"prov\":\"ON\",\"lat\":42.4,\"lng\":-82.19,\"pop\":103988,\"status\":\"seeking\"},\n{\"name\":\"Clarington\",\"prov\":\"ON\",\"lat\":43.93,\"lng\":-78.61,\"pop\":101427,\"status\":\"seeking\"},\n{\"name\":\"Red Deer\",\"prov\":\"AB\",\"lat\":52.27,\"lng\":-113.81,\"pop\":100844,\"status\":\"seeking\"},\n{\"name\":\"Nanaimo\",\"prov\":\"BC\",\"lat\":49.17,\"lng\":-123.94,\"pop\":99863,\"status\":\"seeking\"},\n{\"name\":\"Pickering\",\"prov\":\"ON\",\"lat\":43.84,\"lng\":-79.09,\"pop\":99186,\"status\":\"seeking\"},\n{\"name\":\"Lethbridge\",\"prov\":\"AB\",\"lat\":49.69,\"lng\":-112.84,\"pop\":98406,\"status\":\"seeking\"},\n{\"name\":\"Kamloops\",\"prov\":\"BC\",\"lat\":50.67,\"lng\":-120.33,\"pop\":97902,\"status\":\"seeking\"},\n{\"name\":\"Niagara Falls\",\"prov\":\"ON\",\"lat\":43.1,\"lng\":-79.07,\"pop\":94415,\"status\":\"seeking\"},\n{\"name\":\"Cape Breton (Sydney)\",\"prov\":\"NS\",\"lat\":46.14,\"lng\":-60.19,\"pop\":93694,\"status\":\"seeking\"},\n{\"name\":\"Chilliwack\",\"prov\":\"BC\",\"lat\":49.16,\"lng\":-121.95,\"pop\":93203,\"status\":\"seeking\"},\n{\"name\":\"Victoria\",\"prov\":\"BC\",\"lat\":48.43,\"lng\":-123.37,\"pop\":91867,\"status\":\"seeking\"},\n{\"name\":\"Maple Ridge\",\"prov\":\"BC\",\"lat\":49.22,\"lng\":-122.6,\"pop\":90990,\"status\":\"seeking\"},\n{\"name\":\"North Vancouver District\",\"prov\":\"BC\",\"lat\":49.34,\"lng\":-123.07,\"pop\":88168,\"status\":\"seeking\"},\n{\"name\":\"Newmarket\",\"prov\":\"ON\",\"lat\":44.05,\"lng\":-79.46,\"pop\":87942,\"status\":\"seeking\"},\n{\"name\":\"Peterborough\",\"prov\":\"ON\",\"lat\":44.3,\"lng\":-78.32,\"pop\":84230,\"status\":\"coming\"},\n{\"name\":\"Moncton\",\"prov\":\"NB\",\"lat\":46.09,\"lng\":-64.77,\"pop\":79470,\"status\":\"seeking\"},\n{\"name\":\"Kawartha Lakes\",\"prov\":\"ON\",\"lat\":44.35,\"lng\":-78.74,\"pop\":79247,\"status\":\"seeking\"},\n{\"name\":\"New Westminster\",\"prov\":\"BC\",\"lat\":49.21,\"lng\":-122.91,\"pop\":78916,\"status\":\"seeking\"},\n{\"name\":\"Prince George\",\"prov\":\"BC\",\"lat\":53.92,\"lng\":-122.75,\"pop\":76708,\"status\":\"seeking\"},\n{\"name\":\"Caledon\",\"prov\":\"ON\",\"lat\":43.86,\"lng\":-79.87,\"pop\":76581,\"status\":\"seeking\"},\n{\"name\":\"Airdrie\",\"prov\":\"AB\",\"lat\":51.29,\"lng\":-114.01,\"pop\":74100,\"status\":\"seeking\"},\n{\"name\":\"Sault Ste. Marie\",\"prov\":\"ON\",\"lat\":46.52,\"lng\":-84.33,\"pop\":72051,\"status\":\"operating\"},\n{\"name\":\"Sarnia\",\"prov\":\"ON\",\"lat\":42.97,\"lng\":-82.4,\"pop\":72047,\"status\":\"seeking\"},\n{\"name\":\"Saint John\",\"prov\":\"NB\",\"lat\":45.27,\"lng\":-66.06,\"pop\":69895,\"status\":\"seeking\"},\n{\"name\":\"St. Albert\",\"prov\":\"AB\",\"lat\":53.63,\"lng\":-113.63,\"pop\":68232,\"status\":\"seeking\"},\n{\"name\":\"Fort McMurray\",\"prov\":\"AB\",\"lat\":56.73,\"lng\":-111.38,\"pop\":68002,\"status\":\"seeking\"},\n{\"name\":\"Norfolk County\",\"prov\":\"ON\",\"lat\":42.85,\"lng\":-80.3,\"pop\":67490,\"status\":\"seeking\"},\n{\"name\":\"Grande Prairie\",\"prov\":\"AB\",\"lat\":55.17,\"lng\":-118.8,\"pop\":64141,\"status\":\"seeking\"},\n{\"name\":\"Medicine Hat\",\"prov\":\"AB\",\"lat\":50.04,\"lng\":-110.68,\"pop\":63271,\"status\":\"seeking\"},\n{\"name\":\"Fredericton\",\"prov\":\"NB\",\"lat\":45.96,\"lng\":-66.64,\"pop\":63116,\"status\":\"seeking\"},\n{\"name\":\"Halton Hills\",\"prov\":\"ON\",\"lat\":43.63,\"lng\":-79.95,\"pop\":62951,\"status\":\"seeking\"},\n{\"name\":\"Kings County (New Minas)\",\"prov\":\"NS\",\"lat\":45.07,\"lng\":-64.48,\"pop\":62914,\"status\":\"seeking\"},\n{\"name\":\"Aurora\",\"prov\":\"ON\",\"lat\":44.0,\"lng\":-79.47,\"pop\":62057,\"status\":\"seeking\"},\n{\"name\":\"Port Coquitlam\",\"prov\":\"BC\",\"lat\":49.26,\"lng\":-122.78,\"pop\":61498,\"status\":\"seeking\"},\n{\"name\":\"North Vancouver City\",\"prov\":\"BC\",\"lat\":49.32,\"lng\":-123.07,\"pop\":58120,\"status\":\"seeking\"},\n{\"name\":\"Welland\",\"prov\":\"ON\",\"lat\":42.99,\"lng\":-79.25,\"pop\":55750,\"status\":\"seeking\"},\n{\"name\":\"Belleville\",\"prov\":\"ON\",\"lat\":44.16,\"lng\":-77.38,\"pop\":55071,\"status\":\"seeking\"},\n{\"name\":\"North Bay\",\"prov\":\"ON\",\"lat\":46.31,\"lng\":-79.46,\"pop\":52662,\"status\":\"operating\"},\n{\"name\":\"Brandon\",\"prov\":\"MB\",\"lat\":49.85,\"lng\":-99.95,\"pop\":51313,\"status\":\"seeking\"},\n{\"name\":\"Colchester (Truro)\",\"prov\":\"NS\",\"lat\":45.37,\"lng\":-63.28,\"pop\":50585,\"status\":\"seeking\"},\n{\"name\":\"Whitchurch-Stouffville\",\"prov\":\"ON\",\"lat\":43.97,\"lng\":-79.25,\"pop\":49864,\"status\":\"seeking\"},\n{\"name\":\"Haldimand County\",\"prov\":\"ON\",\"lat\":42.97,\"lng\":-79.87,\"pop\":49587,\"status\":\"seeking\"},\n{\"name\":\"Cornwall\",\"prov\":\"ON\",\"lat\":45.02,\"lng\":-74.73,\"pop\":47845,\"status\":\"seeking\"},\n{\"name\":\"Georgina\",\"prov\":\"ON\",\"lat\":44.3,\"lng\":-79.43,\"pop\":47642,\"status\":\"seeking\"},\n{\"name\":\"Woodstock\",\"prov\":\"ON\",\"lat\":43.13,\"lng\":-80.75,\"pop\":46705,\"status\":\"seeking\"},\n{\"name\":\"Langford\",\"prov\":\"BC\",\"lat\":48.45,\"lng\":-123.5,\"pop\":46584,\"status\":\"seeking\"},\n{\"name\":\"Quinte West\",\"prov\":\"ON\",\"lat\":44.18,\"lng\":-77.57,\"pop\":46560,\"status\":\"seeking\"},\n{\"name\":\"Vernon\",\"prov\":\"BC\",\"lat\":50.26,\"lng\":-119.27,\"pop\":44519,\"status\":\"seeking\"},\n{\"name\":\"New Tecumseth\",\"prov\":\"ON\",\"lat\":44.15,\"lng\":-79.78,\"pop\":44120,\"status\":\"seeking\"},\n{\"name\":\"Pictou County (New Glasgow)\",\"prov\":\"NS\",\"lat\":45.59,\"lng\":-62.65,\"pop\":43684,\"status\":\"seeking\"},\n{\"name\":\"Innisfil\",\"prov\":\"ON\",\"lat\":44.3,\"lng\":-79.61,\"pop\":43326,\"status\":\"seeking\"},\n{\"name\":\"Bradford West Gwillimbury\",\"prov\":\"ON\",\"lat\":44.11,\"lng\":-79.57,\"pop\":42880,\"status\":\"seeking\"},\n{\"name\":\"St. Thomas\",\"prov\":\"ON\",\"lat\":42.78,\"lng\":-81.18,\"pop\":42840,\"status\":\"seeking\"},\n{\"name\":\"Mission\",\"prov\":\"BC\",\"lat\":49.13,\"lng\":-122.31,\"pop\":41519,\"status\":\"seeking\"},\n{\"name\":\"Timmins\",\"prov\":\"ON\",\"lat\":48.48,\"lng\":-81.33,\"pop\":41145,\"status\":\"operating\"},\n{\"name\":\"Lakeshore\",\"prov\":\"ON\",\"lat\":42.24,\"lng\":-82.65,\"pop\":40410,\"status\":\"seeking\"},\n{\"name\":\"Brant County\",\"prov\":\"ON\",\"lat\":43.13,\"lng\":-80.36,\"pop\":39474,\"status\":\"seeking\"},\n{\"name\":\"Charlottetown\",\"prov\":\"PE\",\"lat\":46.24,\"lng\":-63.13,\"pop\":38809,\"status\":\"seeking\"},\n{\"name\":\"Prince Albert\",\"prov\":\"SK\",\"lat\":53.2,\"lng\":-105.75,\"pop\":37756,\"status\":\"seeking\"},\n{\"name\":\"Spruce Grove\",\"prov\":\"AB\",\"lat\":53.54,\"lng\":-113.92,\"pop\":37645,\"status\":\"seeking\"},\n{\"name\":\"Penticton\",\"prov\":\"BC\",\"lat\":49.5,\"lng\":-119.59,\"pop\":36885,\"status\":\"seeking\"},\n{\"name\":\"West Kelowna\",\"prov\":\"BC\",\"lat\":49.86,\"lng\":-119.63,\"pop\":36078,\"status\":\"seeking\"},\n{\"name\":\"Campbell River\",\"prov\":\"BC\",\"lat\":50.02,\"lng\":-125.24,\"pop\":35519,\"status\":\"seeking\"},\n{\"name\":\"East Gwillimbury\",\"prov\":\"ON\",\"lat\":44.1,\"lng\":-79.43,\"pop\":34637,\"status\":\"seeking\"},\n{\"name\":\"Leduc\",\"prov\":\"AB\",\"lat\":53.27,\"lng\":-113.55,\"pop\":34094,\"status\":\"seeking\"},\n{\"name\":\"Moose Jaw\",\"prov\":\"SK\",\"lat\":50.39,\"lng\":-105.53,\"pop\":33665,\"status\":\"seeking\"},\n{\"name\":\"Port Moody\",\"prov\":\"BC\",\"lat\":49.28,\"lng\":-122.83,\"pop\":33551,\"status\":\"seeking\"},\n{\"name\":\"Orillia\",\"prov\":\"ON\",\"lat\":44.61,\"lng\":-79.42,\"pop\":33411,\"status\":\"operating\"},\n{\"name\":\"Stratford\",\"prov\":\"ON\",\"lat\":43.37,\"lng\":-80.98,\"pop\":33232,\"status\":\"seeking\"},\n{\"name\":\"LaSalle\",\"prov\":\"ON\",\"lat\":42.22,\"lng\":-83.06,\"pop\":32932,\"status\":\"seeking\"},\n{\"name\":\"Fort Erie\",\"prov\":\"ON\",\"lat\":42.91,\"lng\":-79.02,\"pop\":32901,\"status\":\"seeking\"},\n{\"name\":\"Cochrane\",\"prov\":\"AB\",\"lat\":51.19,\"lng\":-114.47,\"pop\":32199,\"status\":\"seeking\"},\n{\"name\":\"North Cowichan\",\"prov\":\"BC\",\"lat\":48.83,\"lng\":-123.7,\"pop\":31990,\"status\":\"seeking\"},\n{\"name\":\"Centre Wellington\",\"prov\":\"ON\",\"lat\":43.71,\"lng\":-80.38,\"pop\":31093,\"status\":\"seeking\"},\n{\"name\":\"Okotoks\",\"prov\":\"AB\",\"lat\":50.73,\"lng\":-113.98,\"pop\":30214,\"status\":\"seeking\"},\n{\"name\":\"Orangeville\",\"prov\":\"ON\",\"lat\":43.92,\"lng\":-80.09,\"pop\":30167,\"status\":\"seeking\"},\n{\"name\":\"Leamington\",\"prov\":\"ON\",\"lat\":42.05,\"lng\":-82.6,\"pop\":29680,\"status\":\"seeking\"},\n{\"name\":\"Grimsby\",\"prov\":\"ON\",\"lat\":43.2,\"lng\":-79.56,\"pop\":28883,\"status\":\"seeking\"},\n{\"name\":\"Courtenay\",\"prov\":\"BC\",\"lat\":49.69,\"lng\":-124.99,\"pop\":28420,\"status\":\"seeking\"},\n{\"name\":\"Whitehorse\",\"prov\":\"YT\",\"lat\":60.72,\"lng\":-135.06,\"pop\":28201,\"status\":\"seeking\"},\n{\"name\":\"Dieppe\",\"prov\":\"NB\",\"lat\":46.08,\"lng\":-64.69,\"pop\":28114,\"status\":\"seeking\"},\n{\"name\":\"King\",\"prov\":\"ON\",\"lat\":43.93,\"lng\":-79.63,\"pop\":27333,\"status\":\"seeking\"},\n{\"name\":\"Fort Saskatchewan\",\"prov\":\"AB\",\"lat\":53.71,\"lng\":-113.21,\"pop\":27088,\"status\":\"seeking\"},\n{\"name\":\"Woolwich\",\"prov\":\"ON\",\"lat\":43.55,\"lng\":-80.55,\"pop\":26999,\"status\":\"seeking\"},\n{\"name\":\"Clarence-Rockland\",\"prov\":\"ON\",\"lat\":45.55,\"lng\":-75.29,\"pop\":26505,\"status\":\"seeking\"},\n{\"name\":\"Conception Bay South\",\"prov\":\"NL\",\"lat\":47.52,\"lng\":-52.99,\"pop\":26199,\"status\":\"seeking\"},\n{\"name\":\"Lincoln\",\"prov\":\"ON\",\"lat\":43.14,\"lng\":-79.42,\"pop\":25719,\"status\":\"seeking\"},\n{\"name\":\"Prince Edward County\",\"prov\":\"ON\",\"lat\":44.0,\"lng\":-77.15,\"pop\":25704,\"status\":\"seeking\"},\n{\"name\":\"Lunenburg (Bridgewater)\",\"prov\":\"NS\",\"lat\":44.38,\"lng\":-64.52,\"pop\":25545,\"status\":\"seeking\"},\n{\"name\":\"Wasaga Beach\",\"prov\":\"ON\",\"lat\":44.52,\"lng\":-80.02,\"pop\":24862,\"status\":\"seeking\"},\n{\"name\":\"Collingwood\",\"prov\":\"ON\",\"lat\":44.5,\"lng\":-80.22,\"pop\":24811,\"status\":\"seeking\"},\n{\"name\":\"Squamish\",\"prov\":\"BC\",\"lat\":49.7,\"lng\":-123.16,\"pop\":24072,\"status\":\"seeking\"},\n{\"name\":\"Thorold\",\"prov\":\"ON\",\"lat\":43.12,\"lng\":-79.2,\"pop\":23816,\"status\":\"seeking\"},\n{\"name\":\"Oro-Medonte\",\"prov\":\"ON\",\"lat\":44.55,\"lng\":-79.55,\"pop\":23613,\"status\":\"seeking\"},\n{\"name\":\"Strathroy-Caradoc\",\"prov\":\"ON\",\"lat\":42.96,\"lng\":-81.62,\"pop\":23559,\"status\":\"seeking\"},\n{\"name\":\"Amherstburg\",\"prov\":\"ON\",\"lat\":42.1,\"lng\":-83.1,\"pop\":23524,\"status\":\"seeking\"},\n{\"name\":\"Tecumseh\",\"prov\":\"ON\",\"lat\":42.31,\"lng\":-82.9,\"pop\":23229,\"status\":\"seeking\"},\n{\"name\":\"Paradise\",\"prov\":\"NL\",\"lat\":47.53,\"lng\":-52.86,\"pop\":22957,\"status\":\"seeking\"},\n{\"name\":\"Mount Pearl\",\"prov\":\"NL\",\"lat\":47.52,\"lng\":-52.81,\"pop\":22477,\"status\":\"seeking\"},\n{\"name\":\"Chestermere\",\"prov\":\"AB\",\"lat\":51.03,\"lng\":-113.82,\"pop\":22163,\"status\":\"seeking\"},\n{\"name\":\"Kingsville\",\"prov\":\"ON\",\"lat\":42.04,\"lng\":-82.74,\"pop\":22119,\"status\":\"seeking\"},\n{\"name\":\"White Rock\",\"prov\":\"BC\",\"lat\":49.02,\"lng\":-122.8,\"pop\":21939,\"status\":\"seeking\"},\n{\"name\":\"Brockville\",\"prov\":\"ON\",\"lat\":44.59,\"lng\":-75.68,\"pop\":21854,\"status\":\"seeking\"},\n{\"name\":\"Springwater\",\"prov\":\"ON\",\"lat\":44.47,\"lng\":-79.75,\"pop\":21834,\"status\":\"seeking\"},\n{\"name\":\"Scugog\",\"prov\":\"ON\",\"lat\":44.1,\"lng\":-78.94,\"pop\":21617,\"status\":\"seeking\"},\n{\"name\":\"Owen Sound\",\"prov\":\"ON\",\"lat\":44.57,\"lng\":-80.94,\"pop\":21612,\"status\":\"seeking\"},\n{\"name\":\"Uxbridge\",\"prov\":\"ON\",\"lat\":44.11,\"lng\":-79.12,\"pop\":21556,\"status\":\"seeking\"},\n{\"name\":\"Fort St. John\",\"prov\":\"BC\",\"lat\":56.25,\"lng\":-120.85,\"pop\":21465,\"status\":\"seeking\"},\n{\"name\":\"Wilmot\",\"prov\":\"ON\",\"lat\":43.4,\"lng\":-80.65,\"pop\":21429,\"status\":\"seeking\"},\n{\"name\":\"Essex\",\"prov\":\"ON\",\"lat\":42.17,\"lng\":-82.82,\"pop\":21216,\"status\":\"seeking\"},\n{\"name\":\"Huntsville\",\"prov\":\"ON\",\"lat\":45.33,\"lng\":-79.22,\"pop\":21147,\"status\":\"operating\"},\n{\"name\":\"Essa\",\"prov\":\"ON\",\"lat\":44.25,\"lng\":-79.79,\"pop\":21083,\"status\":\"seeking\"},\n{\"name\":\"Beaumont\",\"prov\":\"AB\",\"lat\":53.35,\"lng\":-113.42,\"pop\":20888,\"status\":\"seeking\"},\n{\"name\":\"Russell\",\"prov\":\"ON\",\"lat\":45.26,\"lng\":-75.36,\"pop\":20762,\"status\":\"seeking\"},\n{\"name\":\"Riverview\",\"prov\":\"NB\",\"lat\":46.06,\"lng\":-64.8,\"pop\":20584,\"status\":\"seeking\"},\n{\"name\":\"Cobourg\",\"prov\":\"ON\",\"lat\":43.96,\"lng\":-78.17,\"pop\":20519,\"status\":\"seeking\"},\n{\"name\":\"Cranbrook\",\"prov\":\"BC\",\"lat\":49.51,\"lng\":-115.77,\"pop\":20499,\"status\":\"seeking\"},\n{\"name\":\"Yellowknife\",\"prov\":\"NT\",\"lat\":62.45,\"lng\":-114.37,\"pop\":20340,\"status\":\"seeking\"},\n{\"name\":\"South Frontenac\",\"prov\":\"ON\",\"lat\":44.5,\"lng\":-76.5,\"pop\":19908,\"status\":\"seeking\"},\n{\"name\":\"Lloydminster\",\"prov\":\"AB\",\"lat\":53.28,\"lng\":-110.0,\"pop\":19739,\"status\":\"seeking\"},\n{\"name\":\"Salmon Arm\",\"prov\":\"BC\",\"lat\":50.7,\"lng\":-119.28,\"pop\":19432,\"status\":\"seeking\"},\n{\"name\":\"Corner Brook\",\"prov\":\"NL\",\"lat\":48.95,\"lng\":-57.95,\"pop\":19333,\"status\":\"seeking\"},\n{\"name\":\"Cumberland (Amherst)\",\"prov\":\"NS\",\"lat\":45.83,\"lng\":-64.21,\"pop\":19147,\"status\":\"seeking\"},\n{\"name\":\"Pitt Meadows\",\"prov\":\"BC\",\"lat\":49.23,\"lng\":-122.69,\"pop\":19146,\"status\":\"seeking\"},\n{\"name\":\"Niagara-on-the-Lake\",\"prov\":\"ON\",\"lat\":43.26,\"lng\":-79.07,\"pop\":19088,\"status\":\"seeking\"},\n{\"name\":\"Colwood\",\"prov\":\"BC\",\"lat\":48.42,\"lng\":-123.49,\"pop\":18961,\"status\":\"seeking\"},\n{\"name\":\"Middlesex Centre\",\"prov\":\"ON\",\"lat\":43.05,\"lng\":-81.45,\"pop\":18928,\"status\":\"seeking\"},\n{\"name\":\"Quispamsis\",\"prov\":\"NB\",\"lat\":45.43,\"lng\":-65.95,\"pop\":18768,\"status\":\"seeking\"},\n{\"name\":\"Camrose\",\"prov\":\"AB\",\"lat\":53.02,\"lng\":-112.83,\"pop\":18742,\"status\":\"seeking\"},\n{\"name\":\"Tillsonburg\",\"prov\":\"ON\",\"lat\":42.86,\"lng\":-80.73,\"pop\":18615,\"status\":\"seeking\"},\n{\"name\":\"Port Colborne\",\"prov\":\"ON\",\"lat\":42.89,\"lng\":-79.25,\"pop\":18306,\"status\":\"seeking\"},\n{\"name\":\"Petawawa\",\"prov\":\"ON\",\"lat\":45.9,\"lng\":-77.28,\"pop\":18160,\"status\":\"seeking\"},\n{\"name\":\"Loyalist\",\"prov\":\"ON\",\"lat\":44.2,\"lng\":-76.75,\"pop\":18000,\"status\":\"seeking\"},\n{\"name\":\"Stony Plain\",\"prov\":\"AB\",\"lat\":53.53,\"lng\":-114.0,\"pop\":17993,\"status\":\"seeking\"},\n{\"name\":\"Oak Bay\",\"prov\":\"BC\",\"lat\":48.437,\"lng\":-123.32,\"pop\":17990,\"status\":\"seeking\"},\n{\"name\":\"North Grenville\",\"prov\":\"ON\",\"lat\":45.02,\"lng\":-75.65,\"pop\":17861,\"status\":\"seeking\"},\n{\"name\":\"Steinbach\",\"prov\":\"MB\",\"lat\":49.53,\"lng\":-96.68,\"pop\":17806,\"status\":\"seeking\"},\n{\"name\":\"Miramichi\",\"prov\":\"NB\",\"lat\":47.03,\"lng\":-65.5,\"pop\":17537,\"status\":\"seeking\"},\n{\"name\":\"Esquimalt\",\"prov\":\"BC\",\"lat\":48.43,\"lng\":-123.41,\"pop\":17533,\"status\":\"seeking\"},\n{\"name\":\"Bracebridge\",\"prov\":\"ON\",\"lat\":45.04,\"lng\":-79.31,\"pop\":17499,\"status\":\"operating\"},\n{\"name\":\"Midland\",\"prov\":\"ON\",\"lat\":44.75,\"lng\":-79.89,\"pop\":17429,\"status\":\"seeking\"},\n{\"name\":\"Central Saanich\",\"prov\":\"BC\",\"lat\":48.58,\"lng\":-123.42,\"pop\":17385,\"status\":\"seeking\"},\n{\"name\":\"Pelham\",\"prov\":\"ON\",\"lat\":43.03,\"lng\":-79.29,\"pop\":17110,\"status\":\"seeking\"},\n{\"name\":\"Selwyn\",\"prov\":\"ON\",\"lat\":44.42,\"lng\":-78.35,\"pop\":17060,\"status\":\"seeking\"},\n{\"name\":\"Port Hope\",\"prov\":\"ON\",\"lat\":43.95,\"lng\":-78.29,\"pop\":16753,\"status\":\"seeking\"},\n{\"name\":\"Swift Current\",\"prov\":\"SK\",\"lat\":50.29,\"lng\":-107.8,\"pop\":16750,\"status\":\"seeking\"},\n{\"name\":\"Edmundston\",\"prov\":\"NB\",\"lat\":47.37,\"lng\":-68.33,\"pop\":16580,\"status\":\"seeking\"},\n{\"name\":\"Yorkton\",\"prov\":\"SK\",\"lat\":51.21,\"lng\":-102.46,\"pop\":16280,\"status\":\"seeking\"},\n{\"name\":\"Summerside\",\"prov\":\"PE\",\"lat\":46.4,\"lng\":-63.79,\"pop\":16001,\"status\":\"seeking\"},\n{\"name\":\"Sylvan Lake\",\"prov\":\"AB\",\"lat\":52.31,\"lng\":-114.1,\"pop\":15995,\"status\":\"seeking\"},\n{\"name\":\"Canmore\",\"prov\":\"AB\",\"lat\":51.09,\"lng\":-115.36,\"pop\":15990,\"status\":\"seeking\"},\n{\"name\":\"Saugeen Shores\",\"prov\":\"ON\",\"lat\":44.44,\"lng\":-81.36,\"pop\":15908,\"status\":\"seeking\"},\n{\"name\":\"Greater Napanee\",\"prov\":\"ON\",\"lat\":44.25,\"lng\":-76.95,\"pop\":15892,\"status\":\"seeking\"},\n{\"name\":\"North Perth\",\"prov\":\"ON\",\"lat\":43.73,\"lng\":-80.95,\"pop\":15168,\"status\":\"seeking\"},\n{\"name\":\"Sooke\",\"prov\":\"BC\",\"lat\":48.37,\"lng\":-123.73,\"pop\":15086,\"status\":\"seeking\"},\n{\"name\":\"Kenora\",\"prov\":\"ON\",\"lat\":49.77,\"lng\":-94.49,\"pop\":14967,\"status\":\"seeking\"},\n{\"name\":\"Brooks\",\"prov\":\"AB\",\"lat\":50.56,\"lng\":-111.9,\"pop\":14924,\"status\":\"seeking\"},\n{\"name\":\"Comox\",\"prov\":\"BC\",\"lat\":49.67,\"lng\":-124.93,\"pop\":14806,\"status\":\"seeking\"},\n{\"name\":\"Mississippi Mills\",\"prov\":\"ON\",\"lat\":45.22,\"lng\":-76.2,\"pop\":14613,\"status\":\"seeking\"},\n{\"name\":\"Strathmore\",\"prov\":\"AB\",\"lat\":51.04,\"lng\":-113.4,\"pop\":14344,\"status\":\"seeking\"},\n{\"name\":\"High River\",\"prov\":\"AB\",\"lat\":50.58,\"lng\":-113.87,\"pop\":14324,\"status\":\"seeking\"},\n{\"name\":\"West Nipissing\",\"prov\":\"ON\",\"lat\":46.37,\"lng\":-79.92,\"pop\":14282,\"status\":\"operating\"},\n{\"name\":\"Lacombe\",\"prov\":\"AB\",\"lat\":52.47,\"lng\":-113.74,\"pop\":13996,\"status\":\"seeking\"},\n{\"name\":\"Whistler\",\"prov\":\"BC\",\"lat\":50.12,\"lng\":-122.95,\"pop\":13982,\"status\":\"seeking\"},\n{\"name\":\"Pembroke\",\"prov\":\"ON\",\"lat\":45.83,\"lng\":-77.11,\"pop\":13955,\"status\":\"seeking\"},\n{\"name\":\"Central Elgin\",\"prov\":\"ON\",\"lat\":42.77,\"lng\":-81.14,\"pop\":13948,\"status\":\"seeking\"},\n{\"name\":\"Powell River\",\"prov\":\"BC\",\"lat\":49.84,\"lng\":-124.52,\"pop\":13943,\"status\":\"seeking\"},\n{\"name\":\"South Stormont\",\"prov\":\"ON\",\"lat\":45.08,\"lng\":-74.98,\"pop\":13891,\"status\":\"seeking\"},\n{\"name\":\"Thames Centre\",\"prov\":\"ON\",\"lat\":43.02,\"lng\":-81.1,\"pop\":13881,\"status\":\"seeking\"},\n{\"name\":\"Grand Falls-Windsor\",\"prov\":\"NL\",\"lat\":48.94,\"lng\":-55.66,\"pop\":13853,\"status\":\"seeking\"},\n{\"name\":\"North Battleford\",\"prov\":\"SK\",\"lat\":52.78,\"lng\":-108.3,\"pop\":13836,\"status\":\"seeking\"},\n{\"name\":\"Winkler\",\"prov\":\"MB\",\"lat\":49.18,\"lng\":-97.94,\"pop\":13745,\"status\":\"seeking\"},\n{\"name\":\"Ingersoll\",\"prov\":\"ON\",\"lat\":43.04,\"lng\":-80.88,\"pop\":13693,\"status\":\"seeking\"},\n{\"name\":\"Parksville\",\"prov\":\"BC\",\"lat\":49.32,\"lng\":-124.31,\"pop\":13642,\"status\":\"seeking\"},\n{\"name\":\"Guelph\/Eramosa\",\"prov\":\"ON\",\"lat\":43.66,\"lng\":-80.2,\"pop\":13372,\"status\":\"seeking\"},\n{\"name\":\"Portage la Prairie\",\"prov\":\"MB\",\"lat\":49.97,\"lng\":-98.29,\"pop\":13304,\"status\":\"seeking\"},\n{\"name\":\"South Glengarry\",\"prov\":\"ON\",\"lat\":45.15,\"lng\":-74.6,\"pop\":13150,\"status\":\"seeking\"},\n{\"name\":\"Thompson\",\"prov\":\"MB\",\"lat\":55.74,\"lng\":-97.86,\"pop\":13035,\"status\":\"seeking\"},\n{\"name\":\"Trent Hills\",\"prov\":\"ON\",\"lat\":44.3,\"lng\":-77.8,\"pop\":13000,\"status\":\"seeking\"},\n{\"name\":\"Gravenhurst\",\"prov\":\"ON\",\"lat\":44.92,\"lng\":-79.37,\"pop\":12955,\"status\":\"seeking\"},\n{\"name\":\"The Nation\",\"prov\":\"ON\",\"lat\":45.35,\"lng\":-75.05,\"pop\":12808,\"status\":\"seeking\"},\n{\"name\":\"Wetaskiwin\",\"prov\":\"AB\",\"lat\":52.97,\"lng\":-113.37,\"pop\":12655,\"status\":\"seeking\"},\n{\"name\":\"Tiny\",\"prov\":\"ON\",\"lat\":44.72,\"lng\":-79.95,\"pop\":12653,\"status\":\"seeking\"},\n{\"name\":\"Carleton Place\",\"prov\":\"ON\",\"lat\":45.14,\"lng\":-76.14,\"pop\":12517,\"status\":\"seeking\"},\n{\"name\":\"Warman\",\"prov\":\"SK\",\"lat\":52.32,\"lng\":-106.58,\"pop\":12419,\"status\":\"seeking\"},\n{\"name\":\"Dawson Creek\",\"prov\":\"BC\",\"lat\":55.76,\"lng\":-120.24,\"pop\":12323,\"status\":\"seeking\"},\n{\"name\":\"Prince Rupert\",\"prov\":\"BC\",\"lat\":54.31,\"lng\":-130.32,\"pop\":12300,\"status\":\"seeking\"},\n{\"name\":\"Kincardine\",\"prov\":\"ON\",\"lat\":44.18,\"lng\":-81.63,\"pop\":12268,\"status\":\"seeking\"},\n{\"name\":\"Rothesay\",\"prov\":\"NB\",\"lat\":45.38,\"lng\":-65.99,\"pop\":12255,\"status\":\"seeking\"},\n{\"name\":\"Bathurst\",\"prov\":\"NB\",\"lat\":47.62,\"lng\":-65.65,\"pop\":12157,\"status\":\"seeking\"},\n{\"name\":\"Summerland\",\"prov\":\"BC\",\"lat\":49.6,\"lng\":-119.68,\"pop\":12042,\"status\":\"seeking\"},\n{\"name\":\"Terrace\",\"prov\":\"BC\",\"lat\":54.52,\"lng\":-128.6,\"pop\":12017,\"status\":\"seeking\"},\n{\"name\":\"Brock\",\"prov\":\"ON\",\"lat\":44.31,\"lng\":-79.1,\"pop\":12014,\"status\":\"seeking\"},\n{\"name\":\"Wellesley\",\"prov\":\"ON\",\"lat\":43.47,\"lng\":-80.76,\"pop\":11881,\"status\":\"seeking\"},\n{\"name\":\"Gander\",\"prov\":\"NL\",\"lat\":48.95,\"lng\":-54.61,\"pop\":11880,\"status\":\"seeking\"},\n{\"name\":\"Erin\",\"prov\":\"ON\",\"lat\":43.77,\"lng\":-80.07,\"pop\":11439,\"status\":\"seeking\"},\n{\"name\":\"Elliot Lake\",\"prov\":\"ON\",\"lat\":46.38,\"lng\":-82.65,\"pop\":11372,\"status\":\"operating\"},\n{\"name\":\"Meaford\",\"prov\":\"ON\",\"lat\":44.61,\"lng\":-80.59,\"pop\":11315,\"status\":\"seeking\"},\n{\"name\":\"Nelson\",\"prov\":\"BC\",\"lat\":49.49,\"lng\":-117.29,\"pop\":11106,\"status\":\"seeking\"},\n{\"name\":\"Williams Lake\",\"prov\":\"BC\",\"lat\":52.13,\"lng\":-122.14,\"pop\":11104,\"status\":\"seeking\"},\n{\"name\":\"Penetanguishene\",\"prov\":\"ON\",\"lat\":44.77,\"lng\":-79.93,\"pop\":11000,\"status\":\"seeking\"},\n{\"name\":\"Stratford\",\"prov\":\"PE\",\"lat\":46.22,\"lng\":-63.09,\"pop\":10927,\"status\":\"seeking\"},\n{\"name\":\"Weyburn\",\"prov\":\"SK\",\"lat\":49.66,\"lng\":-103.85,\"pop\":10870,\"status\":\"seeking\"},\n{\"name\":\"Estevan\",\"prov\":\"SK\",\"lat\":49.14,\"lng\":-102.98,\"pop\":10851,\"status\":\"seeking\"},\n{\"name\":\"Sechelt\",\"prov\":\"BC\",\"lat\":49.47,\"lng\":-123.75,\"pop\":10847,\"status\":\"seeking\"},\n{\"name\":\"Yarmouth\",\"prov\":\"NS\",\"lat\":43.84,\"lng\":-66.12,\"pop\":10577,\"status\":\"seeking\"},\n{\"name\":\"Martensville\",\"prov\":\"SK\",\"lat\":52.29,\"lng\":-106.67,\"pop\":10549,\"status\":\"seeking\"},\n{\"name\":\"Selkirk\",\"prov\":\"MB\",\"lat\":50.14,\"lng\":-96.88,\"pop\":10504,\"status\":\"seeking\"},\n{\"name\":\"Georgian Bluffs\",\"prov\":\"ON\",\"lat\":44.66,\"lng\":-81.06,\"pop\":10479,\"status\":\"seeking\"},\n{\"name\":\"North Dumfries\",\"prov\":\"ON\",\"lat\":43.32,\"lng\":-80.42,\"pop\":10215,\"status\":\"seeking\"},\n{\"name\":\"Hawkesbury\",\"prov\":\"ON\",\"lat\":45.61,\"lng\":-74.61,\"pop\":10194,\"status\":\"seeking\"},\n{\"name\":\"North Glengarry\",\"prov\":\"ON\",\"lat\":45.31,\"lng\":-74.94,\"pop\":10109,\"status\":\"seeking\"}\n],\"geo\":{\n\"mainland\": [\n[49.00,-123.20],[49.32,-123.22],[49.42,-123.55],[49.52,-124.02],[49.78,-124.30],[49.92,-124.85],[50.25,-125.40],[50.70,-126.60],[51.05,-127.35],[51.55,-127.60],[52.05,-127.30],[52.55,-128.20],[53.00,-128.60],[53.55,-128.90],[54.05,-130.05],[54.35,-130.48],[54.52,-130.38],[54.80,-130.60],\n[55.55,-130.00],[56.20,-131.15],[56.90,-132.10],[57.60,-132.80],[58.30,-133.50],[58.90,-135.20],[59.35,-136.80],[59.75,-138.60],[60.00,-139.05],[60.00,-141.00],[69.65,-141.00],\n[69.45,-139.20],[69.10,-137.20],[68.90,-136.20],[69.30,-134.20],[69.65,-132.00],[69.25,-129.00],[68.60,-126.60],[68.20,-123.50],[67.60,-120.50],[67.95,-117.50],[68.30,-115.20],[67.70,-113.80],[68.10,-110.80],[68.45,-107.00],[67.75,-104.30],[68.25,-101.30],[68.95,-99.20],[69.55,-96.20],[69.10,-94.30],[68.20,-91.80],[66.90,-89.20],[65.50,-87.10],[64.20,-86.40],[63.60,-88.80],[62.20,-92.20],[60.60,-94.40],[59.00,-94.10],[57.60,-92.40],[56.40,-89.40],[55.35,-85.90],[55.20,-83.40],[54.00,-82.10],[52.50,-81.40],[51.50,-80.50],[51.20,-79.95],\n[51.90,-79.00],[53.60,-79.05],[55.00,-77.20],[56.40,-76.55],[57.80,-77.20],[59.20,-77.85],[60.60,-77.85],[62.30,-78.10],[62.55,-75.00],[61.90,-72.00],[60.70,-70.00],[59.20,-69.70],[58.50,-68.20],[58.10,-66.10],[59.20,-65.20],[60.30,-64.50],\n[58.90,-63.20],[57.50,-61.60],[56.10,-60.60],[54.60,-58.20],[53.60,-56.40],[52.30,-55.60],[51.45,-57.15],\n[50.70,-59.20],[50.30,-61.20],[50.25,-63.60],[49.35,-64.90],[49.20,-66.60],[48.75,-68.30],[48.20,-69.50],[47.45,-70.20],[46.90,-71.30],[46.45,-72.40],[45.95,-73.30],[45.50,-73.60],\n[45.20,-73.85],\n[45.55,-73.20],[46.05,-72.90],[46.45,-72.10],[46.75,-71.20],[47.10,-70.60],[47.55,-70.00],[48.00,-69.35],[48.45,-68.50],[48.85,-67.50],[49.10,-66.60],[49.25,-65.30],[48.90,-64.35],[48.50,-64.20],\n[48.15,-65.40],[48.05,-66.35],[47.95,-66.90],\n[47.75,-65.75],[47.15,-65.10],[46.70,-64.85],[46.25,-64.55],[46.13,-63.85],[45.95,-64.15],\n[45.85,-63.60],[45.70,-62.70],[45.62,-61.95],[45.65,-61.40],[45.35,-61.00],\n[45.05,-61.95],[44.63,-63.57],[44.38,-64.32],[44.05,-64.75],[43.72,-65.40],[43.80,-66.20],[44.05,-66.30],[44.40,-66.15],[44.68,-65.78],[45.05,-64.90],[45.10,-64.30],[45.35,-63.90],[45.40,-64.35],[45.85,-64.35],\n[45.62,-64.85],[45.35,-65.35],[45.27,-66.06],[45.10,-66.80],[45.08,-67.15],\n[45.60,-67.45],[46.00,-67.80],[46.60,-67.78],[47.06,-67.79],[47.20,-68.40],[47.35,-68.20],[47.46,-69.22],\n[46.70,-70.05],[45.95,-70.30],[45.40,-70.90],[45.02,-71.50],\n[45.02,-73.35],[45.00,-74.35],\n[45.02,-74.73],[44.55,-75.76],[44.30,-76.10],[44.18,-76.55],\n[44.10,-77.00],[43.90,-77.15],[43.93,-77.40],[44.05,-77.62],[43.95,-78.10],[43.85,-78.45],[43.62,-79.42],[43.30,-79.90],[43.22,-79.55],[43.28,-79.03],\n[42.86,-78.92],[42.83,-79.60],[42.72,-80.45],[42.60,-81.20],[42.25,-82.20],[41.96,-82.52],[42.00,-82.90],[42.05,-83.16],[42.35,-83.14],\n[42.62,-82.65],[42.98,-82.48],[43.30,-81.85],[43.85,-81.78],[44.22,-81.72],[44.50,-81.42],[44.80,-81.30],[45.25,-81.62],\n[44.85,-81.15],[44.62,-80.98],[44.68,-80.60],[44.58,-80.40],[44.53,-80.22],[44.55,-80.01],[44.72,-79.97],[44.85,-79.90],[45.10,-79.95],[45.34,-80.04],[45.75,-80.85],[45.97,-81.52],\n[46.20,-82.60],[46.30,-83.60],[46.52,-84.35],\n[46.95,-84.60],[47.55,-84.75],[48.10,-84.95],[48.72,-86.38],[48.85,-87.30],[48.80,-88.20],[48.40,-89.25],[48.10,-89.55],\n[48.35,-90.90],[48.60,-92.00],[48.65,-93.40],[49.00,-94.70],[49.00,-95.15],\n[49.00,-99.00],[49.00,-103.00],[49.00,-107.00],[49.00,-111.00],[49.00,-115.00],[49.00,-119.00],[49.00,-123.20]\n],\n\n\"islands\": [\n[[48.32,-123.52],[48.41,-123.29],[48.50,-123.28],[48.75,-123.48],[49.05,-123.75],[49.40,-124.20],[49.72,-124.88],[50.00,-125.18],[50.30,-125.50],[50.62,-126.15],[50.78,-127.30],[50.85,-128.10],[50.45,-128.30],[50.00,-127.30],[49.55,-126.60],[49.10,-125.85],[48.72,-125.10],[48.35,-124.05]],\n[[47.65,-52.63],[48.10,-52.95],[47.75,-53.60],[48.20,-53.90],[49.05,-53.50],[49.65,-54.80],[49.50,-55.75],[50.20,-56.10],[51.60,-55.45],[51.45,-56.85],[50.20,-57.60],[49.00,-58.30],[48.55,-58.95],[47.60,-59.30],[47.60,-58.00],[47.30,-56.00],[47.60,-54.60],[46.90,-55.50],[46.85,-54.20],[47.40,-53.60],[47.18,-52.92],[47.45,-52.68]],\n[[45.62,-61.40],[45.95,-60.75],[46.05,-60.30],[46.25,-59.98],[46.50,-60.05],[46.70,-60.35],[47.05,-60.60],[46.85,-61.10],[46.20,-61.50]],\n[[46.05,-62.10],[46.45,-62.60],[46.60,-63.60],[46.72,-64.15],[46.55,-64.40],[46.28,-63.60],[46.10,-63.10],[45.98,-62.45]],\n[[45.75,-83.00],[45.98,-83.20],[46.05,-82.60],[45.98,-81.75],[45.75,-81.75],[45.70,-82.35]],\n[[49.35,-64.50],[49.90,-64.20],[49.75,-62.00],[49.30,-61.70],[49.10,-62.50]]\n],\n\n\"lakes\": [\n[[67.00,-119.00],[66.30,-117.50],[65.30,-119.50],[65.20,-122.50],[66.00,-124.50],[66.90,-123.00]],\n[[62.30,-114.50],[61.30,-113.00],[60.80,-115.50],[61.20,-117.20],[62.20,-115.20]],\n[[59.55,-108.50],[58.70,-110.60],[58.60,-111.30],[59.10,-110.20]],\n[[53.85,-98.20],[52.60,-98.00],[51.60,-96.70],[50.60,-96.60],[51.20,-97.10],[52.30,-98.60],[53.30,-99.20]],\n[[52.20,-99.00],[51.10,-98.60],[50.40,-98.10],[50.80,-98.90],[51.90,-99.60]],\n[[53.20,-100.90],[52.20,-100.10],[51.60,-99.60],[52.30,-100.60],[53.10,-101.30]],\n[[50.20,-88.60],[49.60,-88.00],[49.30,-88.30],[49.80,-88.90]],\n[[57.50,-102.30],[56.60,-102.00],[56.30,-102.70],[57.20,-102.90]],\n[[49.80,-94.90],[49.05,-94.60],[49.05,-95.15],[49.40,-95.20]]\n],\n\n\"borders\": [\n[[60.00,-141.00],[60.00,-135.00],[60.00,-128.00],[60.00,-121.00],[60.00,-114.00],[60.00,-108.00],[60.00,-102.00]],\n[[60.00,-120.00],[54.00,-120.00],[53.00,-118.50],[52.00,-117.30],[51.00,-116.00],[50.00,-115.00],[49.00,-114.05]],\n[[60.00,-110.00],[49.00,-110.00]],\n[[60.00,-102.00],[49.00,-102.00]],\n[[49.00,-95.15],[52.80,-95.15],[56.90,-89.00]],\n[[51.40,-79.50],[47.00,-79.40],[46.32,-78.70],[45.85,-77.30],[45.42,-75.70],[45.00,-74.35]],\n[[60.00,-102.00],[64.80,-110.00],[67.00,-110.50],[68.30,-113.00]],\n[[60.00,-124.00],[62.00,-127.50],[64.00,-130.00],[66.00,-133.50],[67.50,-136.00],[69.20,-137.30]],\n[[51.45,-57.15],[52.00,-57.10],[52.00,-63.00],[52.60,-64.20],[54.00,-64.80],[55.20,-63.50],[56.50,-64.20],[58.00,-65.80],[60.30,-64.50]],\n[[48.05,-66.35],[47.90,-67.00],[47.55,-68.30],[47.46,-69.22]],\n[[45.95,-64.15],[45.85,-64.35]]\n],\n\n\"labels\": [\n{\"t\":\"YUKON\",\"lat\":63.4,\"lng\":-135.5},\n{\"t\":\"NORTHWEST TERRITORIES\",\"lat\":64.2,\"lng\":-119.0},\n{\"t\":\"NUNAVUT\",\"lat\":64.6,\"lng\":-98.0},\n{\"t\":\"BRITISH COLUMBIA\",\"lat\":54.6,\"lng\":-125.5},\n{\"t\":\"ALBERTA\",\"lat\":55.4,\"lng\":-115.0},\n{\"t\":\"SASKATCHEWAN\",\"lat\":55.4,\"lng\":-106.0},\n{\"t\":\"MANITOBA\",\"lat\":55.0,\"lng\":-98.0},\n{\"t\":\"ONTARIO\",\"lat\":50.6,\"lng\":-87.5},\n{\"t\":\"NEWFOUNDLAND & LABRADOR\",\"lat\":54.6,\"lng\":-62.0},\n{\"t\":\"N.B.\",\"lat\":46.7,\"lng\":-66.6},\n{\"t\":\"N.S.\",\"lat\":45.0,\"lng\":-62.6},\n{\"t\":\"P.E.I.\",\"lat\":47.15,\"lng\":-63.4}\n],\n\n\"quebec\": {\"t\":\"QU\\u00c9BEC\",\"lat\":51.5,\"lng\":-72.5,\"note\":\"not serviced\"}\n}};<\/script>\n<script>\n\/* ============================================================\n   SOLUS FLYERS PARTNER MAP \u2014 behaviour\n   No dependencies. Everything is namespaced inside one IIFE.\n   ============================================================ *\/\n(function () {\n  \"use strict\";\n\n  var DATA = window.SolusPartnerMapData;\n\n  \/* One call per [solus_partner_map] shortcode on the page. *\/\n  function initSolusMap(root) {\n    if (!DATA || root.getAttribute(\"data-solus-ready\")) return;\n    root.setAttribute(\"data-solus-ready\", \"1\");\n\n    \/* Everything configurable arrives as a data attribute from the shortcode. *\/\n    var SF_CONFIG = {\n      applyTargets: (root.getAttribute(\"data-apply\") || \"#partner-with-us\")\n                      .split(\",\")\n                      .map(function (s) { return s.trim(); })\n                      .filter(function (s) { return s.length > 0; }),\n      applyUrl:      root.getAttribute(\"data-apply-url\") || \"\",\n      peoplePerHome: parseFloat(root.getAttribute(\"data-people-per-home\")) || 2.4,\n      minZoom: 1,\n      maxZoom: 18\n    };\n\n    var CITIES = JSON.parse(JSON.stringify(DATA.cities));\n    var GEO    = DATA.geo;\n\n  var SVGNS  = \"http:\/\/www.w3.org\/2000\/svg\";\n  var svg    = root.querySelector(\".sf-map\");\n  var wrap   = root.querySelector(\".sf-mapwrap\");\n  var live   = root.querySelector(\".sf-live\");\n  var reduce = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\n  var STATUS = {\n    operating: { label: \"Operating\",       cls: \"sf-s-operating\", colour: \"#1F9D55\" },\n    seeking:   { label: \"Seeking Partner\", cls: \"sf-s-seeking\",   colour: \"#F2B705\" },\n    coming:    { label: \"Coming Soon\",     cls: \"sf-s-coming\",    colour: \"#2D7DD2\" }\n  };\n\n  \/* ==========================================================\n     1. Derived city fields\n     ========================================================== *\/\n  function homesOf(c) {\n    return c.homes || Math.round(c.pop \/ SF_CONFIG.peoplePerHome);\n  }\n  function ratingOf(c) {\n    if (c.rating) return c.rating;\n    var h = homesOf(c);\n    return h >= 30000 ? 5 : h >= 12000 ? 4 : 3;\n  }\n  var RATING_WORD = { 5: \"Excellent opportunity\", 4: \"Good opportunity\", 3: \"Moderate opportunity\" };\n\n  function whyOf(c, i) {\n    if (c.why) return c.why;\n    var homes = homesOf(c).toLocaleString(\"en-CA\");\n    if (c.status === \"operating\") {\n      return \"A Solus Flyers partner already delivers across \" + c.name + \", covering roughly \" +\n             homes + \" homes. Neighbouring routes and nearby communities may still be open \\u2014 get in touch and we will tell you what is free.\";\n    }\n    if (c.status === \"coming\") {\n      return c.name + \" is next on the expansion plan. We are mapping routes across an estimated \" +\n             homes + \" homes right now, and partners who register early get first look at the territory.\";\n    }\n    var v = [\n      \"This growing community has around \" + homes + \" homes that local businesses want to reach. Solus Flyers is seeking an enthusiastic partner to establish and grow the business in this area.\",\n      c.name + \" is open. About \" + homes + \" households sit inside the territory, and every restaurant, trade and clinic in town needs a way to reach them. The partner who takes this city gets it exclusively.\",\n      \"No one is delivering for Solus Flyers in \" + c.name + \" yet. With roughly \" + homes +\n      \" homes on the route map, there is room here for a full-time local business built on repeat advertisers.\"\n    ];\n    return v[i % v.length];\n  }\n\n  CITIES.forEach(function (c, i) {\n    c._homes  = homesOf(c);\n    c._rating = ratingOf(c);\n    c._why    = whyOf(c, i);\n    c._search = (c.name + \" \" + c.prov).toLowerCase();\n  });\n\n  \/* ==========================================================\n     2. Projection \u2014 Lambert conformal conic (standard for Canada)\n     ========================================================== *\/\n  var RAD = Math.PI \/ 180;\n  var P1 = 49 * RAD, P2 = 77 * RAD, P0 = 43 * RAD, L0 = -96 * RAD, K = 900;\n  var nCone = Math.log(Math.cos(P1) \/ Math.cos(P2)) \/\n              Math.log(Math.tan(Math.PI \/ 4 + P2 \/ 2) \/ Math.tan(Math.PI \/ 4 + P1 \/ 2));\n  var Fc    = Math.cos(P1) * Math.pow(Math.tan(Math.PI \/ 4 + P1 \/ 2), nCone) \/ nCone;\n  var rho0  = Fc \/ Math.pow(Math.tan(Math.PI \/ 4 + P0 \/ 2), nCone);\n\n  function project(lat, lng) {\n    var rho = Fc \/ Math.pow(Math.tan(Math.PI \/ 4 + lat * RAD \/ 2), nCone);\n    var th  = nCone * (lng * RAD - L0);\n    return [K * rho * Math.sin(th), -K * (rho0 - rho * Math.cos(th))];\n  }\n  function pathFrom(coords, close) {\n    var d = \"\", i, p;\n    for (i = 0; i < coords.length; i++) {\n      p = project(coords[i][0], coords[i][1]);\n      d += (i ? \"L\" : \"M\") + p[0].toFixed(2) + \" \" + p[1].toFixed(2);\n    }\n    return d + (close ? \"Z\" : \"\");\n  }\n\n  \/* ---- Frame: everything of interest, plus the settled south ---- *\/\n  var minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n  function extend(lat, lng) {\n    var p = project(lat, lng);\n    if (p[0] < minX) minX = p[0];\n    if (p[0] > maxX) maxX = p[0];\n    if (p[1] < minY) minY = p[1];\n    if (p[1] > maxY) maxY = p[1];\n  }\n  CITIES.forEach(function (c) { extend(c.lat, c.lng); });\n  GEO.mainland.forEach(function (p) { if (p[0] <= 64.8) extend(p[0], p[1]); });\n  GEO.islands.forEach(function (ring) { ring.forEach(function (p) { extend(p[0], p[1]); }); });\n\n  var padX = (maxX - minX) * 0.035, padY = (maxY - minY) * 0.09;\n  var VB = { x: minX - padX, y: minY - padY, w: (maxX - minX) + padX * 2, h: (maxY - minY) + padY * 2 };\n  svg.setAttribute(\"viewBox\", VB.x.toFixed(2) + \" \" + VB.y.toFixed(2) + \" \" + VB.w.toFixed(2) + \" \" + VB.h.toFixed(2));\n  svg.setAttribute(\"preserveAspectRatio\", \"xMidYMid meet\");\n\n  \/* ==========================================================\n     3. Build the map\n     ========================================================== *\/\n  function el(tag, attrs) {\n    var n = document.createElementNS(SVGNS, tag), k;\n    for (k in attrs) if (attrs.hasOwnProperty(k)) n.setAttribute(k, attrs[k]);\n    return n;\n  }\n\n  var defs = el(\"defs\", {});\n  defs.innerHTML =\n    '<radialGradient id=\"sf-heatgrad\">' +\n      '<stop offset=\"0%\"   stop-color=\"#E4572E\" stop-opacity=\"0.62\"\/>' +\n      '<stop offset=\"45%\"  stop-color=\"#F2B705\" stop-opacity=\"0.30\"\/>' +\n      '<stop offset=\"100%\" stop-color=\"#F2B705\" stop-opacity=\"0\"\/>' +\n    '<\/radialGradient>';\n  svg.appendChild(defs);\n\n  var scene = el(\"g\", { id: \"sf-scene\" });\n  svg.appendChild(scene);\n\n  var gLand   = el(\"g\", {}), gProv = el(\"g\", {}), gLakes = el(\"g\", {}),\n      gLabels = el(\"g\", {}), gHeat = el(\"g\", { \"class\": \"sf-heat\", opacity: \"0\" }),\n      gMarks  = el(\"g\", {});\n  [gLand, gLakes, gProv, gLabels, gHeat, gMarks].forEach(function (g) { scene.appendChild(g); });\n\n  gLand.appendChild(el(\"path\", { \"class\": \"sf-land\", d: pathFrom(GEO.mainland, true) }));\n  GEO.islands.forEach(function (r) { gLand.appendChild(el(\"path\", { \"class\": \"sf-land\", d: pathFrom(r, true) })); });\n  GEO.lakes.forEach(function (r) { gLakes.appendChild(el(\"path\", { \"class\": \"sf-lake\", d: pathFrom(r, true) })); });\n  GEO.borders.forEach(function (r) { gProv.appendChild(el(\"path\", { \"class\": \"sf-prov\", d: pathFrom(r, false) })); });\n\n  GEO.labels.forEach(function (l) {\n    var p = project(l.lat, l.lng);\n    var t = el(\"text\", { \"class\": \"sf-provlabel\", x: p[0], y: p[1] });\n    t.textContent = l.t;\n    gLabels.appendChild(t);\n  });\n  (function () {\n    var q = GEO.quebec, p = project(q.lat, q.lng);\n    var t = el(\"text\", { \"class\": \"sf-provlabel\", x: p[0], y: p[1] });\n    t.textContent = q.t;\n    gLabels.appendChild(t);\n    var s = el(\"text\", { \"class\": \"sf-qc-note\", x: p[0], y: p[1] + 11 });\n    s.textContent = q.note;\n    gLabels.appendChild(s);\n  })();\n\n  \/* ---- Heat blobs ---- *\/\n  CITIES.forEach(function (c) {\n    var p = project(c.lat, c.lng);\n    gHeat.appendChild(el(\"circle\", {\n      cx: p[0], cy: p[1], r: 2.5 + Math.sqrt(c.pop) * 0.019, fill: \"url(#sf-heatgrad)\"\n    }));\n  });\n\n  \/* ---- Markers ---- *\/\n  CITIES.forEach(function (c, i) {\n    var p = project(c.lat, c.lng);\n    var r = Math.max(3.1, Math.min(7, 3.1 + Math.log(c.pop \/ 10000) \/ Math.LN10 * 1.7));\n    var g = el(\"g\", {\n      \"class\": \"sf-mk\" + (c.status === \"seeking\" ? \" sf-pulse\" : \"\"),\n      role: \"button\", tabindex: \"-1\",\n      \"aria-label\": c.name + \", \" + c.prov + \". \" + STATUS[c.status].label +\n                    \". Estimated \" + c._homes.toLocaleString(\"en-CA\") + \" homes.\"\n    });\n    g.appendChild(el(\"circle\", { \"class\": \"sf-ring\",  r: r + 3.4, cx: 0, cy: 0 }));\n    if (c.status === \"seeking\") {\n      g.appendChild(el(\"circle\", { \"class\": \"sf-halo\", r: r + 1.5, cx: 0, cy: 0, stroke: STATUS[c.status].colour }));\n    }\n    g.appendChild(el(\"circle\", { \"class\": \"sf-core\", r: r, cx: 0, cy: 0, fill: STATUS[c.status].colour }));\n    g.appendChild(el(\"circle\", { \"class\": \"sf-hit\",  r: Math.max(r + 5, 11), cx: 0, cy: 0 }));\n    var t = el(\"text\", { \"class\": \"sf-lbl\", x: r + 5, y: 3.2 });\n    t.textContent = c.name;\n    g.appendChild(t);\n\n    c._g = g; c._px = p[0]; c._py = p[1]; c._r = r;\n    g.addEventListener(\"click\", function (e) { e.stopPropagation(); openCity(c); });\n    g.addEventListener(\"keydown\", function (e) {\n      if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); openCity(c); }\n    });\n    gMarks.appendChild(g);\n  });\n\n  \/* ==========================================================\n     4. Zoom and pan\n     ========================================================== *\/\n  var view = { k: 1, x: 0, y: 0 };\n  var filter = \"all\", mode = \"markers\", active = null, frame = null;\n\n  function clamp(v, lo, hi) { return v < lo ? lo : v > hi ? hi : v; }\n\n  function clampView() {\n    var k = view.k;\n    view.x = clamp(view.x, (VB.x + VB.w) * (1 - k), VB.x * (1 - k));\n    view.y = clamp(view.y, (VB.y + VB.h) * (1 - k), VB.y * (1 - k));\n  }\n\n  function popFloor(k) {\n    if (k < 1.6) return 90000;\n    if (k < 2.6) return 45000;\n    if (k < 4)   return 22000;\n    if (k < 6.5) return 13000;\n    return 0;\n  }\n  function labelFloor(k) {\n    if (k < 2.4) return Infinity;\n    if (k < 3.6) return 180000;\n    if (k < 5.5) return 60000;\n    if (k < 9)   return 25000;\n    return 0;\n  }\n\n  function render() {\n    frame = null;\n    clampView();\n    scene.setAttribute(\"transform\", \"translate(\" + view.x + \",\" + view.y + \") scale(\" + view.k + \")\");\n    var s = 1 \/ view.k, floor = popFloor(view.k), lf = labelFloor(view.k), shown = 0;\n    for (var i = 0; i < CITIES.length; i++) {\n      var c = CITIES[i], g = c._g;\n      var ok = (filter === \"all\" || c.status === filter) &#038;&#038;\n               (c.pop >= floor || c === active) && mode === \"markers\";\n      if (ok) {\n        shown++;\n        g.style.display = \"\";\n        g.setAttribute(\"transform\", \"translate(\" + c._px + \",\" + c._py + \") scale(\" + s + \")\");\n        g.setAttribute(\"tabindex\", \"0\");\n        if (c.pop >= lf || c === active) g.classList.add(\"sf-labelled\");\n        else g.classList.remove(\"sf-labelled\");\n      } else {\n        g.style.display = \"none\";\n        g.setAttribute(\"tabindex\", \"-1\");\n      }\n    }\n    gLabels.style.opacity = view.k > 3.4 ? \"0\" : \"1\";\n    return shown;\n  }\n  function schedule() { if (!frame) frame = requestAnimationFrame(render); }\n\n  \/* screen -> viewBox coordinates *\/\n  var pt = svg.createSVGPoint();\n  function toLocal(cx, cy) {\n    pt.x = cx; pt.y = cy;\n    var m = svg.getScreenCTM();\n    return m ? pt.matrixTransform(m.inverse()) : { x: 0, y: 0 };\n  }\n  function zoomAt(lx, ly, factor) {\n    var nk = clamp(view.k * factor, SF_CONFIG.minZoom, SF_CONFIG.maxZoom);\n    var f = nk \/ view.k;\n    view.x = lx - f * (lx - view.x);\n    view.y = ly - f * (ly - view.y);\n    view.k = nk;\n    schedule();\n  }\n  function centreOn(px, py, k, animate) {\n    var cx = VB.x + VB.w \/ 2, cy = VB.y + VB.h \/ 2;\n    var target = { k: k, x: cx - k * px, y: cy - k * py };\n    if (!animate || reduce) { view = target; schedule(); return; }\n    var from = { k: view.k, x: view.x, y: view.y }, t0 = performance.now(), dur = 620;\n    (function step(now) {\n      var t = clamp((now - t0) \/ dur, 0, 1);\n      var e = 1 - Math.pow(1 - t, 3);\n      view.k = from.k + (target.k - from.k) * e;\n      view.x = from.x + (target.x - from.x) * e;\n      view.y = from.y + (target.y - from.y) * e;\n      render();\n      if (t < 1) requestAnimationFrame(step);\n    })(t0);\n  }\n\n  \/* pointer drag *\/\n  var drag = null, hint = root.querySelector(\".sf-hint\"), hintGone = false;\n  function usedMap() {\n    if (hintGone || !hint) return;\n    hintGone = true; hint.style.opacity = \"0\";\n    setTimeout(function () { if (hint.parentNode) hint.parentNode.removeChild(hint); }, 500);\n  }\n  var mapActive = false;\n  document.addEventListener(\"pointerdown\", function (e) {\n    mapActive = wrap.contains(e.target);\n  }, true);\n\n  svg.addEventListener(\"pointerdown\", function (e) {\n    if (e.button !== 0 &#038;&#038; e.pointerType === \"mouse\") return;\n    drag = { id: e.pointerId, x: e.clientX, y: e.clientY, moved: 0 };\n    svg.setPointerCapture(e.pointerId);\n    svg.classList.add(\"sf-dragging\");\n  });\n  svg.addEventListener(\"pointermove\", function (e) {\n    if (!drag || e.pointerId !== drag.id) return;\n    var a = toLocal(drag.x, drag.y), b = toLocal(e.clientX, e.clientY);\n    view.x += b.x - a.x; view.y += b.y - a.y;\n    drag.moved += Math.abs(e.clientX - drag.x) + Math.abs(e.clientY - drag.y);\n    drag.x = e.clientX; drag.y = e.clientY;\n    if (drag.moved > 6) usedMap();\n    schedule();\n  });\n  function endDrag(e) {\n    if (!drag || (e && e.pointerId !== drag.id)) return;\n    drag = null; svg.classList.remove(\"sf-dragging\");\n  }\n  svg.addEventListener(\"pointerup\", endDrag);\n  svg.addEventListener(\"pointercancel\", endDrag);\n  svg.addEventListener(\"lostpointercapture\", endDrag);\n\n  \/* The wheel only zooms once the visitor has touched the map, so scrolling\n     past the widget never gets trapped. Ctrl\/Cmd + wheel always zooms. *\/\n  svg.addEventListener(\"wheel\", function (e) {\n    if (!mapActive && !e.ctrlKey && !e.metaKey) return;\n    e.preventDefault();\n    usedMap();\n    var l = toLocal(e.clientX, e.clientY);\n    zoomAt(l.x, l.y, e.deltaY < 0 ? 1.18 : 1 \/ 1.18);\n  }, { passive: false });\n\n  svg.addEventListener(\"keydown\", function (e) {\n    var step = 40 \/ view.k, c = { x: VB.x + VB.w \/ 2, y: VB.y + VB.h \/ 2 }, done = true;\n    switch (e.key) {\n      case \"ArrowLeft\":  view.x += step; break;\n      case \"ArrowRight\": view.x -= step; break;\n      case \"ArrowUp\":    view.y += step; break;\n      case \"ArrowDown\":  view.y -= step; break;\n      case \"+\": case \"=\": zoomAt(c.x, c.y, 1.35); break;\n      case \"-\": case \"_\": zoomAt(c.x, c.y, 1 \/ 1.35); break;\n      case \"0\": resetView(); break;\n      default: done = false;\n    }\n    if (done) { e.preventDefault(); usedMap(); schedule(); }\n  });\n\n  root.querySelector(\".sf-zin\").addEventListener(\"click\", function () {\n    usedMap(); zoomAt(VB.x + VB.w \/ 2, VB.y + VB.h \/ 2, 1.45);\n  });\n  root.querySelector(\".sf-zout\").addEventListener(\"click\", function () {\n    usedMap(); zoomAt(VB.x + VB.w \/ 2, VB.y + VB.h \/ 2, 1 \/ 1.45);\n  });\n  root.querySelector(\".sf-zres\").addEventListener(\"click\", resetView);\n  function resetView() {\n    closePanel();\n    if (reduce) { view = { k: 1, x: 0, y: 0 }; render(); }\n    else centreOn(VB.x + VB.w \/ 2, VB.y + VB.h \/ 2, 1, true);\n    announce(\"Map view reset.\");\n  }\n\n  \/* ==========================================================\n     5. City panel\n     ========================================================== *\/\n  var panel  = root.querySelector(\".sf-panel\");\n  var pName  = root.querySelector(\".sf-p-name\");\n  var pProv  = root.querySelector(\".sf-p-prov\");\n  var pStat  = root.querySelector(\".sf-p-status\");\n  var pStatT = root.querySelector(\".sf-p-statustext\");\n  var pPop   = root.querySelector(\".sf-p-pop\");\n  var pHomes = root.querySelector(\".sf-p-homes\");\n  var pStars = root.querySelector(\".sf-p-stars\");\n  var pWhy   = root.querySelector(\".sf-p-why\");\n  var pFoot  = root.querySelector(\".sf-p-foot\");\n\n  var PROV_NAME = {\n    BC: \"British Columbia\", AB: \"Alberta\", SK: \"Saskatchewan\", MB: \"Manitoba\", ON: \"Ontario\",\n    NB: \"New Brunswick\", NS: \"Nova Scotia\", PE: \"Prince Edward Island\",\n    NL: \"Newfoundland and Labrador\", YT: \"Yukon\", NT: \"Northwest Territories\", NU: \"Nunavut\"\n  };\n\n  function starRow(n) {\n    var html = \"\", i;\n    for (i = 1; i <= 5; i++) {\n      html += '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path class=\"' + (i <= n ? \"sf-on\" : \"sf-off\") +\n              '\" d=\"M12 2.6l2.9 5.9 6.5.95-4.7 4.6 1.1 6.5-5.8-3.05-5.8 3.05 1.1-6.5-4.7-4.6 6.5-.95z\"\/><\/svg>';\n    }\n    return html + \"<span>\" + RATING_WORD[n] + \"<\/span>\";\n  }\n\n  function openCity(c) {\n    active = c;\n    CITIES.forEach(function (o) { o._g.classList.toggle(\"sf-active\", o === c); });\n\n    pName.textContent  = c.name;\n    pProv.textContent  = PROV_NAME[c.prov] || c.prov;\n    pStat.className    = \"sf-status \" + STATUS[c.status].cls;\n    pStatT.textContent = STATUS[c.status].label;\n    pPop.textContent   = c.pop.toLocaleString(\"en-CA\");\n    pHomes.textContent = c._homes.toLocaleString(\"en-CA\");\n    pStars.innerHTML   = starRow(c._rating);\n    pStars.setAttribute(\"aria-label\", c._rating + \" out of 5 \\u2014 \" + RATING_WORD[c._rating]);\n    pWhy.textContent   = c._why;\n\n    pFoot.innerHTML = \"\";\n    var btn = document.createElement(\"button\");\n    btn.type = \"button\";\n    btn.className = \"sf-cta\" + (c.status === \"operating\" ? \" sf-ghost\" : \"\");\n    btn.textContent = c.status === \"operating\" ? \"Ask about nearby territory\"\n                    : c.status === \"coming\"    ? \"Register interest in this city\"\n                    : \"Become the Partner for this City\";\n    btn.addEventListener(\"click\", function () { goApply(c); });\n    pFoot.appendChild(btn);\n    if (c.status === \"operating\") {\n      var n = document.createElement(\"p\");\n      n.className = \"sf-foot-note\";\n      n.textContent = \"This city already has a partner.\";\n      pFoot.appendChild(n);\n    }\n\n    panel.classList.add(\"sf-open\");\n    panel.setAttribute(\"aria-hidden\", \"false\");\n    announce(c.name + \", \" + (PROV_NAME[c.prov] || c.prov) + \". \" + STATUS[c.status].label + \".\");\n    schedule();\n    keepClear(c);\n  }\n\n  \/* Nudge the map so the panel never sits on top of the selected marker *\/\n  function keepClear(c) {\n    if (window.innerWidth < 760) return;\n    requestAnimationFrame(function () {\n      var rect = svg.getBoundingClientRect();\n      var m = svg.getScreenCTM();\n      if (!m) return;\n      pt.x = c._px * view.k + view.x; pt.y = c._py * view.k + view.y;\n      var scr = pt.matrixTransform(m);\n      var limit = rect.right - 410;\n      if (scr.x > limit) {\n        var a = toLocal(scr.x, scr.y), b = toLocal(limit, scr.y);\n        view.x += b.x - a.x;\n        schedule();\n      }\n    });\n  }\n\n  function closePanel() {\n    panel.classList.remove(\"sf-open\");\n    panel.setAttribute(\"aria-hidden\", \"true\");\n    active = null;\n    CITIES.forEach(function (o) { o._g.classList.remove(\"sf-active\"); });\n    schedule();\n  }\n  root.querySelector(\".sf-p-close\").addEventListener(\"click\", function () {\n    closePanel(); svg.focus();\n  });\n  svg.addEventListener(\"click\", function (e) { if (e.target === svg) closePanel(); });\n  document.addEventListener(\"keydown\", function (e) {\n    if (e.key === \"Escape\" && panel.classList.contains(\"sf-open\")) { closePanel(); svg.focus(); }\n  });\n\n  function announce(msg) { live.textContent = msg; }\n\n  \/* ==========================================================\n     6. Search\n     ========================================================== *\/\n  var qWrap  = root.querySelector(\".sf-search\");\n  var q      = root.querySelector(\".sf-q\");\n  var sug    = root.querySelector(\".sf-suggest\");\n  var clearB = root.querySelector(\".sf-clear\");\n  var cursor = -1, matches = [];\n\n  function search(term) {\n    term = term.trim().toLowerCase();\n    if (!term) return [];\n    var starts = [], has = [];\n    for (var i = 0; i < CITIES.length; i++) {\n      var c = CITIES[i], idx = c._search.indexOf(term);\n      if (idx === 0) starts.push(c);\n      else if (idx > 0) has.push(c);\n      if (starts.length > 40) break;\n    }\n    return starts.concat(has).slice(0, 8);\n  }\n\n  function drawSuggest() {\n    sug.innerHTML = \"\";\n    if (!matches.length) {\n      if (q.value.trim()) {\n        var li = document.createElement(\"li\");\n        li.className = \"sf-empty\";\n        li.textContent = \"No match. Try a nearby city \\u2014 territories often cover more than one town.\";\n        sug.appendChild(li);\n        open(true);\n      } else { open(false); }\n      return;\n    }\n    matches.forEach(function (c, i) {\n      var li = document.createElement(\"li\");\n      li.setAttribute(\"role\", \"option\");\n      li.id = sug.id + \"-opt-\" + i;\n      li.setAttribute(\"aria-selected\", i === cursor ? \"true\" : \"false\");\n      li.innerHTML = '<span class=\"sf-dot\" style=\"background:' + STATUS[c.status].colour + '\"><\/span>' +\n                     '<span class=\"sf-nm\"><\/span><span class=\"sf-pv\">' + c.prov + \"<\/span>\";\n      li.querySelector(\".sf-nm\").textContent = c.name;\n      li.addEventListener(\"mousedown\", function (e) { e.preventDefault(); choose(c); });\n      sug.appendChild(li);\n    });\n    open(true);\n  }\n  function open(on) {\n    sug.classList.toggle(\"sf-open\", !!on);\n    q.setAttribute(\"aria-expanded\", on ? \"true\" : \"false\");\n  }\n  function choose(c) {\n    if (q) {\n      q.value = c.name;\n      qWrap.classList.add(\"sf-has-value\");\n      open(false);\n    }\n    if (filter !== \"all\" && filter !== c.status) setFilter(\"all\");\n    usedMap();\n    centreOn(c._px, c._py, 7, true);\n    setTimeout(function () { openCity(c); }, reduce ? 0 : 260);\n  }\n\n  if (q) {\n  q.addEventListener(\"input\", function () {\n    qWrap.classList.toggle(\"sf-has-value\", !!q.value);\n    matches = search(q.value);\n    cursor = matches.length ? 0 : -1;\n    drawSuggest();\n  });\n  q.addEventListener(\"keydown\", function (e) {\n    if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n      if (!matches.length) return;\n      e.preventDefault();\n      cursor = (cursor + (e.key === \"ArrowDown\" ? 1 : matches.length - 1)) % matches.length;\n      drawSuggest();\n      q.setAttribute(\"aria-activedescendant\", sug.id + \"-opt-\" + cursor);\n    } else if (e.key === \"Enter\") {\n      e.preventDefault();\n      if (matches[cursor]) choose(matches[cursor]);\n    } else if (e.key === \"Escape\") { open(false); }\n  });\n  q.addEventListener(\"blur\", function () { setTimeout(function () { open(false); }, 120); });\n  q.addEventListener(\"focus\", function () { if (matches.length) open(true); });\n  clearB.addEventListener(\"click\", function () {\n    q.value = \"\"; matches = []; qWrap.classList.remove(\"sf-has-value\"); open(false); q.focus();\n  });\n  }\n\n  \/* ==========================================================\n     7. Filters and view mode\n     ========================================================== *\/\n  var counts = { all: CITIES.length, operating: 0, seeking: 0, coming: 0 };\n  CITIES.forEach(function (c) { counts[c.status]++; });\n  Array.prototype.forEach.call(root.querySelectorAll(\"[data-c]\"), function (n) {\n    n.textContent = counts[n.getAttribute(\"data-c\")];\n  });\n\n  function setFilter(f) {\n    filter = f;\n    Array.prototype.forEach.call(root.querySelectorAll(\"[data-filter]\"), function (b) {\n      b.setAttribute(\"aria-pressed\", b.getAttribute(\"data-filter\") === f ? \"true\" : \"false\");\n    });\n    if (active && f !== \"all\" && active.status !== f) closePanel();\n    var n = render();\n    announce(n + \" cities shown\" + (f === \"all\" ? \"\" : \" for \" + STATUS[f].label) + \".\");\n  }\n  Array.prototype.forEach.call(root.querySelectorAll(\"[data-filter]\"), function (b) {\n    b.addEventListener(\"click\", function () { setFilter(b.getAttribute(\"data-filter\")); });\n  });\n\n  Array.prototype.forEach.call(root.querySelectorAll(\"[data-view]\"), function (b) {\n    b.addEventListener(\"click\", function () {\n      mode = b.getAttribute(\"data-view\");\n      Array.prototype.forEach.call(root.querySelectorAll(\"[data-view]\"), function (o) {\n        o.setAttribute(\"aria-pressed\", o === b ? \"true\" : \"false\");\n      });\n      gHeat.setAttribute(\"opacity\", mode === \"heat\" ? \"1\" : \"0\");\n      if (mode === \"heat\") closePanel();\n      render();\n      announce(mode === \"heat\" ? \"Heat map showing population density.\" : \"Marker view.\");\n    });\n  });\n\n  \/* ==========================================================\n     8. Apply \u2014 scroll to the form on the host page\n     ========================================================== *\/\n  var toastT;\n  function toastNode() {\n    var t = document.querySelector(\".sf-toast\");\n    if (!t) {\n      t = document.createElement(\"div\");\n      t.className = \"sf-toast\";\n      t.setAttribute(\"role\", \"status\");\n      t.setAttribute(\"aria-live\", \"polite\");\n      document.body.appendChild(t);\n    }\n    return t;\n  }\n  function say(msg) {\n    var toast = toastNode();\n    toast.textContent = msg;\n    toast.classList.add(\"sf-show\");\n    clearTimeout(toastT);\n    toastT = setTimeout(function () { toast.classList.remove(\"sf-show\"); }, 5000);\n  }\n\n  function goApply(city) {\n    window.dispatchEvent(new CustomEvent(\"solusflyers:apply\", { detail: city || null }));\n    var target = null;\n    for (var i = 0; i < SF_CONFIG.applyTargets.length &#038;&#038; !target; i++) {\n      target = document.querySelector(SF_CONFIG.applyTargets[i]);\n    }\n    if (!target) {\n      if (SF_CONFIG.applyUrl) {\n        var q = SF_CONFIG.applyUrl.indexOf(\"?\") < 0 ? \"?\" : \"&#038;\";\n        window.location.href = SF_CONFIG.applyUrl +\n          (city ? q + \"solus_city=\" + encodeURIComponent(city.name + \", \" + (PROV_NAME[city.prov] || city.prov)) : \"\");\n        return;\n      }\n      say(\"No application form found on this page. Set apply or apply_url on the shortcode.\");\n      return;\n    }\n    target.scrollIntoView({ behavior: reduce ? \"auto\" : \"smooth\", block: \"start\" });\n    if (city) prefill(target, city);\n  }\n\n  function prefill(target, city) {\n    var fields = target.querySelectorAll(\"input, select, textarea\"), i, f, tag;\n    for (i = 0; i < fields.length; i++) {\n      f = fields[i];\n      tag = ((f.name || \"\") + \" \" + (f.id || \"\") + \" \" + (f.placeholder || \"\")).toLowerCase();\n      if (\/city|town|community|territory|location|area|region\/.test(tag)) {\n        if (f.tagName === \"SELECT\") {\n          for (var j = 0; j < f.options.length; j++) {\n            if (f.options[j].text.indexOf(city.name) === 0) { f.selectedIndex = j; break; }\n          }\n        } else {\n          f.value = city.name + \", \" + (PROV_NAME[city.prov] || city.prov);\n        }\n        f.dispatchEvent(new Event(\"input\", { bubbles: true }));\n        f.dispatchEvent(new Event(\"change\", { bubbles: true }));\n        break;\n      }\n    }\n  }\n  Array.prototype.forEach.call(root.querySelectorAll(\"[data-sf-apply]\"), function (b) {\n    b.addEventListener(\"click\", function () { goApply(null); });\n  });\n\n  \/* ==========================================================\n     9. Statistics\n     ========================================================== *\/\n  var totalHomes = CITIES.reduce(function (a, c) { return a + c._homes; }, 0);\n  var values = [CITIES.length, totalHomes, counts.operating, counts.seeking];\n  var nums = root.querySelectorAll(\".sf-stats .sf-num\");\n  Array.prototype.forEach.call(nums, function (n, i) { n.setAttribute(\"data-count\", values[i]); });\n\n  function countUp(node) {\n    var to = +node.getAttribute(\"data-count\"), suffix = node.getAttribute(\"data-suffix\") || \"\";\n    if (reduce) { node.textContent = to.toLocaleString(\"en-CA\") + suffix; return; }\n    var t0 = performance.now(), dur = 1500;\n    (function step(now) {\n      var t = clamp((now - t0) \/ dur, 0, 1);\n      var e = 1 - Math.pow(2, -10 * t);\n      node.textContent = Math.round(to * (t === 1 ? 1 : e)).toLocaleString(\"en-CA\") + (t === 1 ? suffix : \"\");\n      if (t < 1) requestAnimationFrame(step);\n    })(t0);\n  }\n\n  var statsSection = root.querySelector(\".sf-stats\");\n  var cards = statsSection ? statsSection.querySelectorAll(\".sf-stat\") : [];\n  function runStats() {\n    Array.prototype.forEach.call(cards, function (card, i) {\n      setTimeout(function () {\n        card.classList.add(\"sf-in\");\n        countUp(card.querySelector(\".sf-num\"));\n      }, reduce ? 0 : i * 110);\n    });\n  }\n  if (!statsSection) {\n    \/* statistics switched off in the shortcode *\/\n  } else if (\"IntersectionObserver\" in window) {\n    var io = new IntersectionObserver(function (entries) {\n      entries.forEach(function (en) { if (en.isIntersecting) { runStats(); io.disconnect(); } });\n    }, { threshold: 0.25 });\n    io.observe(statsSection);\n  } else { runStats(); }\n\n  \/* ==========================================================\n     10. Go\n     ========================================================== *\/\n  render();\n  window.addEventListener(\"resize\", schedule);\n\n    \/* Public hook: window.SolusPartnerMap[0].show(\"Barrie\") *\/\n    (window.SolusPartnerMap = window.SolusPartnerMap || []).push({\n      root: root,\n      cities: CITIES,\n      show: function (name) {\n        var c = CITIES.filter(function (o) { return o.name.toLowerCase() === String(name).toLowerCase(); })[0];\n        if (c) choose(c);\n        return !!c;\n      },\n      reset: resetView\n    });\n  }\n\n  \/* When the map sends a visitor to another page, fill the city in on arrival. *\/\n  function fillFromQuery() {\n    var m = \/[?&#038;]solus_city=([^&#038;#]*)\/.exec(window.location.search);\n    if (!m) return;\n    var value = decodeURIComponent(m[1].replace(\/\\+\/g, \" \"));\n    var fields = document.querySelectorAll(\"input, select, textarea\"), i, f, tag;\n    for (i = 0; i < fields.length; i++) {\n      f = fields[i];\n      tag = ((f.name || \"\") + \" \" + (f.id || \"\") + \" \" + (f.placeholder || \"\")).toLowerCase();\n      if (\/city|town|community|territory|location|area|region\/.test(tag) &#038;&#038; f.type !== \"hidden\") {\n        if (f.tagName !== \"SELECT\") f.value = value;\n        f.dispatchEvent(new Event(\"input\", { bubbles: true }));\n        f.dispatchEvent(new Event(\"change\", { bubbles: true }));\n        break;\n      }\n    }\n  }\n\n  function boot() {\n    var roots = document.querySelectorAll(\"[data-solus-map]\"), i;\n    for (i = 0; i < roots.length; i++) initSolusMap(roots[i]);\n    fillFromQuery();\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", boot);\n  } else {\n    boot();\n  }\n})();\n\n<\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>Solus Flyers Partner Map &#8211; preview Partner network &#8211; Canada Partner with Solus Flyers Across Canada Own and operate a Solus Flyers business in your community. Click on a city below to discover available opportunities. 0 Communities mapped 0 Homes within reach 0 Partners operating 0 Cities seeking a partner &times; All cities Operating Seeking [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-11","page","type-page","status-publish","hentry"],"brizy_media":[],"_links":{"self":[{"href":"https:\/\/solusflyerscanada.com\/index.php?rest_route=\/wp\/v2\/pages\/11","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solusflyerscanada.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/solusflyerscanada.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/solusflyerscanada.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solusflyerscanada.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11"}],"version-history":[{"count":4,"href":"https:\/\/solusflyerscanada.com\/index.php?rest_route=\/wp\/v2\/pages\/11\/revisions"}],"predecessor-version":[{"id":15,"href":"https:\/\/solusflyerscanada.com\/index.php?rest_route=\/wp\/v2\/pages\/11\/revisions\/15"}],"wp:attachment":[{"href":"https:\/\/solusflyerscanada.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}