{"id":14331,"date":"2026-08-19T11:57:46","date_gmt":"2026-08-19T15:57:46","guid":{"rendered":"https:\/\/inclusionincanadiansports.ca\/00-community-partners-20260819\/"},"modified":"2026-08-19T13:36:02","modified_gmt":"2026-08-19T17:36:02","slug":"00-community-partners-20260819","status":"publish","type":"page","link":"https:\/\/inclusionincanadiansports.ca\/fr\/00-community-partners-20260819\/","title":{"rendered":"00-community-partners-20260819"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"14331\" class=\"elementor elementor-14331 elementor-14321\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ea3b1f0 e-flex e-con-boxed e-con e-parent\" data-id=\"ea3b1f0\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;jet_parallax_layout_list&quot;:[]}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bf3d3eb elementor-widget elementor-widget-heading\" data-id=\"bf3d3eb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Nos partenaires communautaires<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4ab6fc5 elementor-widget elementor-widget-text-editor\" data-id=\"4ab6fc5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>D\u00e9couvrez nos partenaires communautaires partout au Canada : Passez la souris ou appuyez sur n&rsquo;importe quelle province.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d356d8a elementor-widget elementor-widget-shortcode\" data-id=\"d356d8a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><!-- ICSN Community Partners Map -->\n<style>\n  \/* =========================================================\n     ICSN Canada Community Partners Map\n     ========================================================= *\/\n  :root {\n    --bg-panel:       #242428;\n    --province:       #C4141B;\n    --province-hover: #000000;\n    --province-sel:   #C9A419;\n    --province-null:  #cfd2d7;\n    --accent-red:     #C4141B;\n    --accent-gold:    #C9A419;\n    --text-dark:      #1C1C1F;\n    --text-soft:      #E7E7E7;\n    --text-muted:     #8F8F8F;\n    --border-light:   #E7E7E7;\n  }\n\n  .icsn-map-wrap * ,\n  .icsn-map-wrap *::before,\n  .icsn-map-wrap *::after { box-sizing: border-box; }\n\n  .icsn-map-wrap {\n    background: #ffffff;\n    font-family: 'Open Sans', system-ui, sans-serif;\n    color: var(--text-dark);\n    padding: 16px 0;\n    position: relative;\n  }\n\n  .icsn-container {\n    position: relative;\n    max-width: 1180px;\n    margin: 0 auto;\n  }\n\n  \/* \u2500\u2500 MAP LAYOUT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  .icsn-map-stage {\n    position: relative;\n    width: 100%;\n    max-width: 1100px;\n    margin: 0 auto;\n    min-height: 240px;\n  }\n  #icsn-svg {\n    width: 100%;\n    height: auto;\n    display: block;\n  }\n  @media (max-width: 620px) {\n    .icsn-map-stage {\n      width: 100vw !important;\n      max-width: 100vw !important;\n      margin-left: calc(50% - 50vw) !important;\n      margin-right: calc(50% - 50vw) !important;\n      padding: 0 8px !important;\n    }\n  }\n  path.prov {\n    fill: var(--province);\n    stroke: #ffffff;\n    stroke-width: 1;\n    cursor: pointer;\n    transition: fill .22s, filter .22s;\n  }\n  path.prov:hover {\n    fill: var(--province-hover);\n    filter: drop-shadow(0 0 10px rgba(0,0,0,.4));\n  }\n  path.prov.is-selected {\n    fill: var(--province-sel);\n    filter: drop-shadow(0 0 10px rgba(201,164,25,.55));\n  }\n  path.prov.is-empty {\n    cursor: default;\n  }\n\n  \/* \u2500\u2500 LOADING \/ ERROR \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  .icsn-state {\n    position: absolute;\n    inset: 0;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    gap: 14px;\n    background: #ffffff;\n    color: var(--text-muted);\n    font-size: .85rem;\n    font-family: 'Open Sans', sans-serif;\n    font-weight: 500;\n    min-height: 240px;\n  }\n  .icsn-spinner {\n    width: 32px; height: 32px;\n    border: 2px solid var(--border-light);\n    border-top-color: var(--accent-red);\n    border-radius: 50%;\n    animation: icsn-spin 0.9s linear infinite;\n  }\n  @keyframes icsn-spin { to { transform: rotate(360deg); } }\n  .icsn-state.error { color: var(--accent-red); }\n\n  \/* \u2500\u2500 TOOLTIP \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  #icsn-tooltip {\n    position: absolute;\n    opacity: 0;\n    pointer-events: none;\n    transform: translate(-50%, calc(-100% - 16px));\n    transition: opacity .18s ease, transform .18s ease;\n    background: linear-gradient(150deg, #1f2940, var(--bg-panel));\n    border: 1px solid rgba(201,164,25,.4);\n    border-radius: 12px;\n    padding: 16px 20px 14px;\n    min-width: 180px;\n    max-width: 260px;\n    box-shadow: 0 18px 40px rgba(28,28,31,.28);\n    z-index: 100;\n    text-align: center;\n  }\n  #icsn-tooltip.show {\n    opacity: 1;\n    transform: translate(-50%, calc(-100% - 12px));\n  }\n  #icsn-tooltip.is-touch { pointer-events: auto; }\n  #icsn-tooltip::after {\n    content: \"\";\n    position: absolute;\n    bottom: -6px;\n    left: 50%;\n    transform: translateX(-50%) rotate(45deg);\n    width: 11px; height: 11px;\n    background: var(--bg-panel);\n    border-right: 1px solid rgba(201,164,25,.4);\n    border-bottom: 1px solid rgba(201,164,25,.4);\n  }\n  .tt-close {\n    position: absolute;\n    top: 6px; right: 6px;\n    width: 26px; height: 26px;\n    border-radius: 50%;\n    border: 0;\n    background: rgba(196,20,27,.9);\n    color: #fff;\n    font-size: 14px;\n    font-weight: 700;\n    line-height: 1;\n    cursor: pointer;\n    display: none;\n    align-items: center;\n    justify-content: center;\n    padding: 0;\n    -webkit-tap-highlight-color: transparent;\n    font-family: 'Open Sans', sans-serif;\n  }\n  #icsn-tooltip.is-touch .tt-close { display: flex; }\n  .tt-close:active { transform: scale(.9); }\n  .tt-name {\n    font-family: 'Ubuntu', sans-serif;\n    font-weight: 500;\n    font-size: 1.05rem;\n    letter-spacing: .5px;\n    color: #ffffff;\n    line-height: 1.1;\n    margin-bottom: 10px;\n    padding: 0 22px;\n  }\n  .tt-count {\n    font-family: 'Ubuntu', sans-serif;\n    font-weight: 700;\n    font-size: 2.6rem;\n    color: var(--accent-red);\n    line-height: 1;\n  }\n  .tt-label {\n    font-family: 'Open Sans', sans-serif;\n    font-size: .72rem;\n    font-weight: 600;\n    color: var(--text-soft);\n    opacity: .75;\n    margin-top: 6px;\n  }\n  .tt-cta {\n    font-family: 'Open Sans', sans-serif;\n    font-size: .78rem;\n    font-weight: 700;\n    color: var(--accent-gold);\n    margin-top: 12px;\n    padding-top: 10px;\n    border-top: 1px solid rgba(231,231,231,.12);\n    cursor: pointer;\n  }\n  .tt-cta.is-hidden { display: none; }\n\n  \/* \u2500\u2500 ACTION BUTTON (INTERNATIONAL) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  .icsn-actions-row {\n    width: 100%;\n    max-width: 1100px;\n    margin: 28px auto 0;\n    display: flex;\n    justify-content: center;\n    gap: 16px;\n  }\n  @media (max-width: 620px) {\n    .icsn-actions-row {\n      padding: 0 16px;\n    }\n  }\n  .icsn-action-btn {\n    display: inline-flex;\n    align-items: center;\n    gap: 18px;\n    padding: 16px 28px 16px 22px;\n    background: #ffffff;\n    border: 1px solid var(--border-light);\n    border-radius: 14px;\n    cursor: pointer;\n    transition: transform .25s, border-color .25s, box-shadow .25s;\n    font-family: inherit;\n    color: var(--text-dark);\n    flex: 0 1 auto;\n  }\n  @media (max-width: 620px) {\n    .icsn-action-btn { width: 100%; }\n  }\n  .icsn-action-btn:hover {\n    transform: translateY(-2px);\n    border-color: var(--accent-red);\n    box-shadow: 0 12px 28px rgba(196,20,27,.18);\n  }\n  .icsn-action-btn:disabled {\n    cursor: default;\n    opacity: .45;\n  }\n  .icsn-action-btn:disabled:hover {\n    transform: none;\n    border-color: var(--border-light);\n    box-shadow: none;\n  }\n  .action-icon {\n    width: 52px;\n    height: 52px;\n    color: var(--accent-red);\n    flex-shrink: 0;\n  }\n  .action-info {\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n    text-align: left;\n    line-height: 1.1;\n  }\n  .action-name {\n    font-family: 'Ubuntu', sans-serif;\n    font-weight: 500;\n    font-size: 1.15rem;\n    color: var(--text-dark);\n    margin-bottom: 6px;\n  }\n  .action-count-row {\n    display: flex;\n    align-items: baseline;\n    gap: 8px;\n  }\n  .action-count {\n    font-family: 'Ubuntu', sans-serif;\n    font-weight: 700;\n    font-size: 1.9rem;\n    color: var(--accent-red);\n    line-height: 1;\n  }\n  .action-label {\n    font-family: 'Open Sans', sans-serif;\n    font-size: .78rem;\n    font-weight: 600;\n    color: var(--text-muted);\n  }\n\n  \/* \u2500\u2500 POPUP OVERLAY (portaled to body) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  #icsn-overlay {\n    display: none;\n    position: fixed !important;\n    top: 0 !important;\n    right: 0 !important;\n    bottom: 0 !important;\n    left: 0 !important;\n    width: 100vw !important;\n    height: 100vh !important;\n    height: 100dvh !important;\n    background: rgba(28, 28, 31, .85);\n    -webkit-backdrop-filter: blur(6px);\n    backdrop-filter: blur(6px);\n    z-index: 2147483647 !important;\n    align-items: center;\n    justify-content: center;\n    padding: 20px;\n    overscroll-behavior: contain;\n    font-family: 'Open Sans', system-ui, sans-serif;\n  }\n  #icsn-overlay.open { display: flex !important; }\n\n  .popup-card {\n    background: linear-gradient(155deg, #1f2940 0%, var(--bg-panel) 100%);\n    border: 1px solid rgba(201,164,25,.22);\n    border-radius: 18px;\n    padding: 38px 36px 32px;\n    width: 100%;\n    max-width: 780px;\n    max-height: calc(100vh - 40px);\n    max-height: calc(100dvh - 40px);\n    display: flex;\n    flex-direction: column;\n    position: relative;\n    box-shadow: 0 32px 80px rgba(0,0,0,.7), 0 0 0 1px rgba(231,231,231,.04);\n    animation: pop-in .28s cubic-bezier(.34,1.56,.64,1);\n    color: #ffffff;\n    font-family: 'Open Sans', sans-serif;\n    overflow: hidden;\n  }\n  @keyframes pop-in {\n    from { transform: scale(.9) translateY(20px); opacity: 0; }\n    to   { transform: scale(1)   translateY(0);    opacity: 1; }\n  }\n  @media (max-width: 620px) {\n    #icsn-overlay { padding: 20px 10px 10px; }\n    .popup-card {\n      padding: 56px 18px 18px;\n      border-radius: 14px;\n      max-height: calc(100vh - 40px);\n      max-height: calc(100dvh - 40px);\n    }\n    .popup-close {\n      top: 14px !important;\n      right: 14px !important;\n    }\n  }\n\n  .popup-close {\n    position: absolute !important;\n    top: 12px !important;\n    right: 12px !important;\n    width: 44px !important;\n    height: 44px !important;\n    min-width: 44px !important;\n    min-height: 44px !important;\n    padding: 0 !important;\n    margin: 0 !important;\n    border-radius: 50% !important;\n    border: 0 !important;\n    background: #C4141B !important;\n    color: #ffffff !important;\n    font-size: 22px !important;\n    line-height: 1 !important;\n    font-weight: 700 !important;\n    text-align: center !important;\n    cursor: pointer !important;\n    display: flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n    visibility: visible !important;\n    opacity: 1 !important;\n    z-index: 10 !important;\n    box-shadow: 0 4px 14px rgba(0,0,0,.5) !important;\n    -webkit-tap-highlight-color: transparent;\n    font-family: 'Open Sans', sans-serif !important;\n  }\n  .popup-close:hover {\n    background: #8f0d13 !important;\n    transform: scale(1.08);\n  }\n  .popup-close:active { transform: scale(.95); }\n\n  .popup-head {\n    flex: 0 0 auto;\n    margin-bottom: 18px;\n    padding-right: 40px;\n  }\n  .popup-eyebrow {\n    display: inline-block;\n    font-family: 'Open Sans', sans-serif;\n    font-size: .72rem;\n    font-weight: 700;\n    letter-spacing: 1px;\n    color: var(--accent-gold);\n    border: 1px solid var(--accent-gold);\n    border-radius: 3px;\n    padding: 3px 9px;\n    margin-bottom: 10px;\n  }\n  .popup-title {\n    font-family: 'Ubuntu', sans-serif;\n    font-weight: 500;\n    font-size: clamp(1.6rem, 4vw, 2.4rem);\n    letter-spacing: .5px;\n    color: #ffffff;\n    line-height: 1.05;\n    margin: 0 0 8px;\n  }\n  .popup-counter {\n    font-family: 'Ubuntu', sans-serif;\n    font-weight: 400;\n    font-size: .95rem;\n    color: var(--text-soft);\n    opacity: .75;\n  }\n  .popup-counter strong {\n    font-weight: 700;\n    color: var(--accent-red);\n    font-size: 1.3rem;\n    margin-right: 4px;\n    opacity: 1;\n  }\n  .popup-divider {\n    flex: 0 0 auto;\n    height: 1px;\n    background: linear-gradient(90deg, rgba(201,164,25,.5), transparent);\n    margin: 0 0 18px;\n  }\n  .popup-grid {\n    flex: 1 1 auto;\n    min-height: 0;\n    display: grid;\n    grid-template-columns: repeat(4, 1fr);\n    gap: 14px;\n    overflow-y: auto;\n    overflow-x: hidden;\n    padding-right: 6px;\n    -webkit-overflow-scrolling: touch;\n    overscroll-behavior: contain;\n  }\n  @media (max-width: 820px) { .popup-grid { grid-template-columns: repeat(3, 1fr); } }\n  @media (max-width: 520px) { .popup-grid { grid-template-columns: repeat(2, 1fr); gap: 10px; } }\n  .popup-grid::-webkit-scrollbar { width: 6px; }\n  .popup-grid::-webkit-scrollbar-track { background: transparent; }\n  .popup-grid::-webkit-scrollbar-thumb { background: rgba(231,231,231,.25); border-radius: 3px; }\n\n  .logo-tile {\n    background: #fff;\n    border-radius: 10px;\n    position: relative;\n    display: block;\n    width: 100%;\n    padding-bottom: 100%;\n    text-decoration: none;\n    transition: transform .22s, box-shadow .22s;\n    overflow: hidden;\n  }\n  .logo-tile:hover {\n    transform: translateY(-3px) scale(1.03);\n    box-shadow: 0 12px 28px rgba(201,164,25,.35);\n  }\n  .logo-tile img {\n    position: absolute !important;\n    top: 10% !important;\n    left: 10% !important;\n    width: 80% !important;\n    height: 80% !important;\n    max-width: 80% !important;\n    max-height: 80% !important;\n    object-fit: contain !important;\n    display: block !important;\n  }\n  .logo-tile .logo-name {\n    position: absolute;\n    left: 0; right: 0; bottom: 0;\n    background: linear-gradient(transparent, rgba(0,0,0,.88));\n    color: #fff;\n    font-family: 'Open Sans', sans-serif;\n    font-size: .72rem;\n    font-weight: 600;\n    padding: 14px 8px 6px;\n    text-align: center;\n    opacity: 0;\n    transition: opacity .22s;\n    pointer-events: none;\n    z-index: 2;\n  }\n  .logo-tile:hover .logo-name { opacity: 1; }\n\n  body.icsn-popup-open { overflow: hidden; }\n<\/style>\n\n<div class=\"icsn-map-wrap\">\n  <div class=\"icsn-container\">\n\n    <!-- MAP -->\n    <div class=\"icsn-map-stage\" id=\"icsn-stage\">\n      <div class=\"icsn-state\" id=\"icsn-loading\">\n        <div class=\"icsn-spinner\"><\/div>\n        <div id=\"icsn-loading-text\">Loading map\u2026<\/div>\n      <\/div>\n      <svg id=\"icsn-svg\" viewBox=\"90 120 800 440\" style=\"display:none\" preserveAspectRatio=\"xMidYMid meet\"><\/svg>\n     <div id=\"icsn-tooltip\" aria-hidden=\"true\">\n        <button class=\"tt-close\" id=\"tt-close\" aria-label=\"Close\" type=\"button\">\u2715<\/button>\n        <div class=\"tt-name\" id=\"tt-name\"><\/div>\n        <div class=\"tt-count\" id=\"tt-count\">0<\/div>\n        <div class=\"tt-label\" id=\"tt-label\">Community Partners<\/div>\n        <div class=\"tt-cta\" id=\"tt-cta\">Read More \u25b8<\/div>\n      <\/div>\n    <\/div>\n\n    <!-- ACTION BUTTON (International only) -->\n    <div class=\"icsn-actions-row\">\n\n      <!-- INTERNATIONAL -->\n      <button class=\"icsn-action-btn\" id=\"icsn-international\" disabled aria-label=\"International partners\">\n        <svg class=\"action-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n          <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\n          <path d=\"M2 12h20M12 2a15 15 0 010 20M12 2a15 15 0 000 20\"\/>\n        <\/svg>\n        <div class=\"action-info\">\n          <span class=\"action-name\" id=\"btn-international-name\">International<\/span>\n          <span class=\"action-count-row\">\n            <span class=\"action-count\" id=\"international-count\">0<\/span>\n            <span class=\"action-label\" id=\"btn-international-label\">Community Partners<\/span>\n          <\/span>\n        <\/div>\n      <\/button>\n\n    <\/div>\n\n  <\/div>\n<\/div>\n\n<!-- POPUP -->\n<div id=\"icsn-overlay\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"pop-name\">\n  <div class=\"popup-card\">\n    <button class=\"popup-close\" id=\"pop-close\" aria-label=\"Close\" type=\"button\">\u2715<\/button>\n    <div class=\"popup-head\">\n      <div class=\"popup-eyebrow\" id=\"pop-eyebrow\">Province<\/div>\n      <h2 class=\"popup-title\" id=\"pop-name\">\u2014<\/h2>\n      <div class=\"popup-counter\"><strong id=\"pop-count\">0<\/strong> <span id=\"pop-label\">Community Partners<\/span><\/div>\n    <\/div>\n    <div class=\"popup-divider\"><\/div>\n    <div class=\"popup-grid\" id=\"pop-grid\"><\/div>\n  <\/div>\n<\/div>\n\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/d3\/7.8.5\/d3.min.js\"><\/script>\n<script>\n(function () {\n  'use strict';\n\n  const IS_TOUCH = (('ontouchstart' in window) || navigator.maxTouchPoints > 0);\n\n  \/\/ =========================================================\n  \/\/ LANGUAGE DETECTION\n  \/\/ =========================================================\n  \/\/ Cascade fallback so it never breaks the widget:\n  \/\/   1) <html lang=\"...\"> attribute\n  \/\/   2) URL path starts with \/fr\/\n  \/\/   3) WPML cookie\n  \/\/   4) Default: 'en'\n  \/\/ =========================================================\n  function detectLanguage() {\n    try {\n      var htmlLang = document.documentElement.getAttribute('lang') || '';\n      if (htmlLang.toLowerCase().indexOf('fr') === 0) return 'fr';\n    } catch (e) {}\n\n    try {\n      var path = window.location.pathname || '';\n      if (path === '\/fr' || path.indexOf('\/fr\/') === 0) return 'fr';\n    } catch (e) {}\n\n    try {\n      var cookies = (document.cookie || '').split(';');\n      for (var i = 0; i < cookies.length; i++) {\n        var c = cookies[i].trim();\n        \/\/ WPML uses various cookie names across versions\n        if (c.indexOf('wp-wpml_current_language=fr') === 0) return 'fr';\n        if (c.indexOf('_icl_current_language=fr') === 0) return 'fr';\n      }\n    } catch (e) {}\n\n    return 'en';\n  }\n\n  const LANG = detectLanguage();\n  const IS_FR = (LANG === 'fr');\n\n  \/\/ =========================================================\n  \/\/ LOCALES \u2014 all translatable strings\n  \/\/ =========================================================\n  const LOCALES = {\n    en: {\n      loadingMap:          'Loading map\u2026',\n      unableToLoad:        '\u26a0\ufe0f Unable to load map. Please try again shortly.',\n      communityPartners:   'Community Partners',\n      communityPartner:    'Community Partner',\n      readMore:            'Read More \u25b8',\n      internationalBtn:    'International',\n      worldwideEyebrow:    'Worldwide',\n      provinceEyebrow:     'Province',\n    },\n    fr: {\n      loadingMap:          'Chargement de la carte\u2026',\n      unableToLoad:        '\u26a0\ufe0f Impossible de t\u00e9l\u00e9charger la carte. Veuillez r\u00e9essayer bient\u00f4t.',\n      communityPartners:   'Partenaires communautaires',\n      communityPartner:    'Partenaire communautaire',\n      readMore:            'En savoir plus \u25b8',\n      internationalBtn:    'Internationale',\n      worldwideEyebrow:    '\u00c0 travers le monde',\n      provinceEyebrow:     'Province',\n    }\n  };\n\n  function t(key) {\n    return (LOCALES[LANG] && LOCALES[LANG][key]) || LOCALES.en[key] || '';\n  }\n\n  \/\/ Pluralization helper for \"Community Partner(s)\"\n  function partnersLabel(count) {\n    return count === 1 ? t('communityPartner') : t('communityPartners');\n  }\n\n  \/\/ =========================================================\n  \/\/ PERMALINK LOCALIZATION\n  \/\/ =========================================================\n  \/\/ Transforms \/community-part-logos\/... \u2192 \/fr\/community-part-logos\/...\n  \/\/ Rules:\n  \/\/   - Only applies when LANG === 'fr'\n  \/\/   - Only touches URLs from the ICSN domain\n  \/\/   - Never duplicates \/fr\/ if already present\n  \/\/   - Preserves query strings and anchors\n  \/\/   - Returns original URL on any error\n  \/\/ =========================================================\n  const ICSN_HOST = 'inclusionincanadiansports.ca';\n\n  function localizePermalink(url) {\n    if (!IS_FR || !url) return url;\n    try {\n      \/\/ Only transform URLs on the ICSN domain\n      if (url.indexOf(ICSN_HOST) === -1) return url;\n\n      var u = new URL(url);\n      var path = u.pathname || '\/';\n\n      \/\/ Already localized? Return as-is\n      if (path === '\/fr' || path.indexOf('\/fr\/') === 0) return url;\n\n      \/\/ Insert \/fr at the start of the path\n      u.pathname = '\/fr' + (path.charAt(0) === '\/' ? path : '\/' + path);\n      return u.toString();\n    } catch (e) {\n      \/\/ If anything fails, fall back to original URL \u2014 never break the link\n      return url;\n    }\n  }\n\n  \/\/ =========================================================\n  \/\/ APPLY STATIC LABELS ASAP\n  \/\/ =========================================================\n  \/\/ Localizes the visible-immediately texts (before fetch\/init runs).\n  \/\/ If JS fails or is slow, texts fall back to the EN in the HTML \u2014\n  \/\/ safe default.\n  \/\/ =========================================================\n  function applyStaticLabels() {\n    var loadingText = $('icsn-loading-text');\n    if (loadingText) loadingText.textContent = t('loadingMap');\n\n    var btnName = $('btn-international-name');\n    if (btnName) btnName.textContent = t('internationalBtn');\n\n    var btnLabel = $('btn-international-label');\n    if (btnLabel) btnLabel.textContent = t('communityPartners');\n\n    \/\/ Button aria-label for accessibility\n    var btn = $('icsn-international');\n    if (btn) {\n      btn.setAttribute(\n        'aria-label',\n        IS_FR ? 'Partenaires internationaux' : 'International partners'\n      );\n    }\n  }\n\n  function portalPopup() {\n    const overlay = document.getElementById('icsn-overlay');\n    if (overlay && overlay.parentNode !== document.body) {\n      document.body.appendChild(overlay);\n    }\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', portalPopup);\n  } else {\n    portalPopup();\n  }\n\n  const CONFIG = {\n    WP_BASE: 'https:\/\/inclusionincanadiansports.ca\/wp-json\/wp\/v2',\n    GEOJSON_URL: 'https:\/\/raw.githubusercontent.com\/codeforamerica\/click_that_hood\/master\/public\/data\/canada.geojson',\n    CACHE_KEY: 'icsn_canada_geojson_v1',\n    PER_PAGE: 100,\n    MAX_PAGES: 10,\n  };\n\n  \/\/ Each province has both EN and FR labels\n  const PROVINCE_MAP = {\n    'Alberta':                    { slug: 'alberta',                    label: 'Alberta',                   labelFr: 'Alberta' },\n    'British Columbia':           { slug: 'british-columbia',           label: 'British Columbia',          labelFr: 'Colombie-Britannique' },\n    'Manitoba':                   { slug: 'manitoba',                   label: 'Manitoba',                  labelFr: 'Manitoba' },\n    'New Brunswick':              { slug: 'new-brunswick',              label: 'New Brunswick',             labelFr: 'Nouveau-Brunswick' },\n    'Newfoundland and Labrador':  { slug: 'newfoundland-and-labrador',  label: 'Newfoundland and Labrador', labelFr: 'Terre-Neuve-et-Labrador' },\n    'Northwest Territories':      { slug: 'northwest-territories',      label: 'Northwest Territories',     labelFr: 'Territoires du Nord-Ouest' },\n    'Nova Scotia':                { slug: 'nova-scotia',                label: 'Nova Scotia',               labelFr: 'Nouvelle-\u00c9cosse' },\n    'Nunavut':                    { slug: 'nunavut',                    label: 'Nunavut',                   labelFr: 'Nunavut' },\n    'Ontario':                    { slug: 'ontario',                    label: 'Ontario',                   labelFr: 'Ontario' },\n    'Prince Edward Island':       { slug: 'prince-edward-island',       label: 'Prince Edward Island',      labelFr: '\u00cele-du-Prince-\u00c9douard' },\n    'Quebec':                     { slug: 'quebec',                     label: 'Quebec',                    labelFr: 'Qu\u00e9bec' },\n    'Qu\u00e9bec':                     { slug: 'quebec',                     label: 'Quebec',                    labelFr: 'Qu\u00e9bec' },\n    'Saskatchewan':               { slug: 'saskatchewan',               label: 'Saskatchewan',              labelFr: 'Saskatchewan' },\n    'Yukon':                      { slug: 'yukon',                      label: 'Yukon',                     labelFr: 'Yukon' },\n    'Yukon Territory':            { slug: 'yukon',                      label: 'Yukon',                     labelFr: 'Yukon' },\n  };\n  const CANADIAN_SLUGS = Object.values(PROVINCE_MAP).map(v => v.slug).filter((v,i,a)=>a.indexOf(v)===i);\n\n  const $ = (id) => document.getElementById(id);\n  const state = {\n    byProvince: {},\n    international: [],\n    animatedProvinces: new Set(),\n    currentSelectedSlug: null,\n    savedScrollY: 0,\n    geoFeatures: [],\n  };\n\n  let touchTooltipSlug = null;\n\n  \/\/ Now that $ is defined, apply static labels\n  applyStaticLabels();\n\n  async function loadGeoJSON() {\n    try {\n      const cached = sessionStorage.getItem(CONFIG.CACHE_KEY);\n      if (cached) return JSON.parse(cached);\n    } catch (e) {}\n    const res = await fetch(CONFIG.GEOJSON_URL);\n    if (!res.ok) throw new Error('GeoJSON HTTP ' + res.status);\n    const data = await res.json();\n    try { sessionStorage.setItem(CONFIG.CACHE_KEY, JSON.stringify(data)); } catch(e) {}\n    return data;\n  }\n\n  async function loadProvinces() {\n    const res = await fetch(CONFIG.WP_BASE + '\/province?per_page=20');\n    if (!res.ok) throw new Error('Provinces HTTP ' + res.status);\n    const terms = await res.json();\n    const idToSlug = {};\n    terms.forEach(t => { idToSlug[t.id] = t.slug; });\n    return idToSlug;\n  }\n\n  async function loadAllPartners() {\n    const out = [];\n    for (let page = 1; page <= CONFIG.MAX_PAGES; page++) {\n      const url = `${CONFIG.WP_BASE}\/community-part-logos?per_page=${CONFIG.PER_PAGE}&page=${page}&_fields=id,title,province,acf_fields`;\n      const res = await fetch(url);\n      if (!res.ok) {\n        if (res.status === 400 && page > 1) break;\n        throw new Error('Partners HTTP ' + res.status);\n      }\n      const batch = await res.json();\n      if (!Array.isArray(batch) || batch.length === 0) break;\n      out.push(...batch);\n      if (batch.length < CONFIG.PER_PAGE) break;\n    }\n    return out;\n  }\n\n  function buildGroups(partners, idToSlug) {\n    const byProvince = {};\n    const international = [];\n    CANADIAN_SLUGS.forEach(s => { byProvince[s] = []; });\n\n    partners.forEach(p => {\n      const acf = p.acf_fields;\n      if (!acf || typeof acf !== 'object' || Array.isArray(acf)) return;\n\n      const logoObj = acf.logo;\n      if (!logoObj || typeof logoObj !== 'object' || !logoObj.url) return;\n\n      const record = {\n        id:   p.id,\n        name: decodeEntities(p.title && p.title.rendered ? p.title.rendered : ''),\n        logo: logoObj.medium || logoObj.large || logoObj.url,\n        alt:  (logoObj.alt && logoObj.alt.trim()) || decodeEntities(p.title.rendered || 'Partner'),\n        link: acf.permalink || null,\n      };\n      if (!record.name) return;\n\n      const provIds = Array.isArray(p.province) ? p.province : [];\n      const slugs = provIds.map(id => idToSlug[id]).filter(Boolean);\n      if (slugs.length === 0) return;\n\n      if (slugs.includes('international')) {\n        pushUnique(international, record);\n      }\n      slugs.forEach(s => {\n        if (s === 'international') return;\n        if (byProvince[s]) pushUnique(byProvince[s], record);\n      });\n    });\n\n    return { byProvince, international };\n  }\n\n  function pushUnique(arr, rec) {\n    if (!arr.some(x => x.id === rec.id)) arr.push(rec);\n  }\n\n  function decodeEntities(str) {\n    if (!str) return '';\n    const el = document.createElement('textarea');\n    el.innerHTML = str;\n    return el.value.trim();\n  }\n\n  const PROJ_W = 960, PROJ_H = 620;\n  const projection = d3.geoAzimuthalEqualArea()\n    .rotate([96, -62])\n    .center([0, 0])\n    .scale(720)\n    .translate([PROJ_W \/ 2, PROJ_H \/ 2]);\n  const geoPath = d3.geoPath().projection(projection);\n\n  function slugForFeature(f) {\n    const entry = PROVINCE_MAP[f.properties.name];\n    return entry ? entry.slug : null;\n  }\n\n  function labelForFeature(f) {\n    const entry = PROVINCE_MAP[f.properties.name];\n    if (!entry) return f.properties.name;\n    \/\/ Return FR label when in French mode, EN otherwise\n    return IS_FR ? (entry.labelFr || entry.label) : entry.label;\n  }\n\n  function buildMap(geo) {\n    const svg = d3.select('#icsn-svg');\n    svg.selectAll('path').remove();\n\n    svg.selectAll('path.prov')\n      .data(geo.features)\n      .enter().append('path')\n        .attr('d', geoPath)\n        .attr('class', d => {\n          const slug = slugForFeature(d);\n          const hasData = slug && state.byProvince[slug] && state.byProvince[slug].length > 0;\n          return 'prov' + (hasData ? '' : ' is-empty');\n        })\n        .attr('data-slug', d => slugForFeature(d) || '')\n        .on('mouseenter', onProvMouseEnter)\n        .on('mousemove',  onProvMouseMove)\n        .on('mouseleave', onProvMouseLeave)\n        .on('click',      onProvClick);\n\n    $('icsn-loading').style.display = 'none';\n    $('icsn-svg').style.display = 'block';\n\n    state.geoFeatures = geo.features;\n  }\n\n  \/\/ Helpers to set tooltip mode\n  function setTooltipFull(d, list) {\n    $('tt-name').textContent = labelForFeature(d);\n    $('tt-label').textContent = partnersLabel(list.length);\n    $('tt-cta').textContent = t('readMore');\n    $('tt-cta').classList.remove('is-hidden');\n    $('tt-cta').style.cursor = 'pointer';\n    const slug = slugForFeature(d);\n    const countEl = $('tt-count');\n    if (!state.animatedProvinces.has(slug)) {\n      state.animatedProvinces.add(slug);\n      animateCount(countEl, list.length, 900);\n    } else {\n      countEl.textContent = list.length;\n    }\n  }\n\n  function setTooltipEmpty(d) {\n    $('tt-name').textContent = labelForFeature(d);\n    $('tt-count').textContent = '0';\n    $('tt-label').textContent = t('communityPartners');\n    $('tt-cta').classList.add('is-hidden');\n  }\n\n  function onProvMouseEnter(event, d) {\n    if (IS_TOUCH) return;\n    const slug = slugForFeature(d);\n    if (!slug) return;\n    const list = state.byProvince[slug] || [];\n\n    if (list.length === 0) {\n      setTooltipEmpty(d);\n    } else {\n      setTooltipFull(d, list);\n    }\n\n    positionTooltip(d);\n    $('icsn-tooltip').classList.add('show');\n  }\n\n  function onProvMouseMove(event, d) {\n    if (IS_TOUCH) return;\n    if (!slugForFeature(d)) return;\n    positionTooltip(d);\n  }\n\n  function onProvMouseLeave() {\n    if (IS_TOUCH) return;\n    $('icsn-tooltip').classList.remove('show');\n  }\n\n  function showTooltipTouch(d) {\n    const slug = slugForFeature(d);\n    if (!slug) return;\n    const list = state.byProvince[slug] || [];\n\n    const tip = $('icsn-tooltip');\n    tip.classList.add('is-touch');\n\n    if (list.length === 0) {\n      setTooltipEmpty(d);\n    } else {\n      setTooltipFull(d, list);\n    }\n\n    positionTooltip(d);\n    tip.classList.add('show');\n    touchTooltipSlug = slug;\n  }\n\n  function hideTooltipTouch() {\n    $('icsn-tooltip').classList.remove('show');\n    touchTooltipSlug = null;\n  }\n\n  function positionTooltip(d) {\n    const svgEl = $('icsn-svg');\n    const stage = $('icsn-stage');\n    const rect = svgEl.getBoundingClientRect();\n    const stageRect = stage.getBoundingClientRect();\n\n    const centroid = geoPath.centroid(d);\n    if (isNaN(centroid[0])) return;\n\n    const VB_X = 90, VB_Y = 120, VB_W = 800, VB_H = 440;\n    const scaleX = rect.width \/ VB_W;\n    const scaleY = rect.height \/ VB_H;\n\n    const x = (centroid[0] - VB_X) * scaleX + (rect.left - stageRect.left);\n    const y = (centroid[1] - VB_Y) * scaleY + (rect.top  - stageRect.top);\n\n    const tip = $('icsn-tooltip');\n    tip.style.left = x + 'px';\n    tip.style.top  = y + 'px';\n  }\n\n  function onProvClick(event, d) {\n    const slug = slugForFeature(d);\n    if (!slug) return;\n    const list = state.byProvince[slug] || [];\n\n    \/\/ Empty province: only show tooltip with message, never open the big popup\n    if (list.length === 0) {\n      if (IS_TOUCH) {\n        if (touchTooltipSlug === slug) {\n          hideTooltipTouch();\n        } else {\n          showTooltipTouch(d);\n        }\n      }\n      return;\n    }\n\n    \/\/ Province with partners: normal behaviour\n    if (!IS_TOUCH) {\n      openPopup({ slug, eyebrow: t('provinceEyebrow'), name: labelForFeature(d), list });\n      return;\n    }\n    if (touchTooltipSlug === slug) {\n      hideTooltipTouch();\n      openPopup({ slug, eyebrow: t('provinceEyebrow'), name: labelForFeature(d), list });\n    } else {\n      showTooltipTouch(d);\n    }\n  }\n\n  function lockBodyScroll() {\n    state.savedScrollY = window.scrollY || window.pageYOffset || 0;\n    document.body.classList.add('icsn-popup-open');\n    document.body.style.position = 'fixed';\n    document.body.style.top = '-' + state.savedScrollY + 'px';\n    document.body.style.left = '0';\n    document.body.style.right = '0';\n    document.body.style.width = '100%';\n  }\n\n  function unlockBodyScroll() {\n    document.body.classList.remove('icsn-popup-open');\n    document.body.style.position = '';\n    document.body.style.top = '';\n    document.body.style.left = '';\n    document.body.style.right = '';\n    document.body.style.width = '';\n    window.scrollTo(0, state.savedScrollY);\n  }\n\n  function openPopup(opts) {\n    hideTooltipTouch();\n    $('icsn-tooltip').classList.remove('show');\n\n    if (state.currentSelectedSlug) {\n      d3.select('[data-slug=\"' + state.currentSelectedSlug + '\"]').classed('is-selected', false);\n    }\n    if (opts.slug && opts.slug !== 'international') {\n      d3.select('[data-slug=\"' + opts.slug + '\"]').classed('is-selected', true);\n      state.currentSelectedSlug = opts.slug;\n    } else {\n      state.currentSelectedSlug = null;\n    }\n\n    $('pop-eyebrow').textContent = opts.eyebrow;\n    $('pop-name').textContent    = opts.name;\n    $('pop-count').textContent   = opts.list.length;\n    $('pop-label').textContent   = partnersLabel(opts.list.length);\n\n    const grid = $('pop-grid');\n    grid.innerHTML = '';\n    grid.scrollTop = 0;\n\n    const sorted = opts.list.slice().sort((a,b) => a.name.localeCompare(b.name));\n    sorted.forEach(p => grid.appendChild(buildLogoTile(p)));\n\n    $('icsn-overlay').classList.add('open');\n    lockBodyScroll();\n  }\n\n  function buildLogoTile(p) {\n    \/\/ Localize the permalink so \/fr\/ visitors land on the FR partner page\n    const localizedLink = p.link ? localizePermalink(p.link) : null;\n\n    const tile = document.createElement(localizedLink ? 'a' : 'div');\n    tile.className = 'logo-tile';\n    if (localizedLink) {\n      tile.href = localizedLink;\n      tile.target = '_blank';\n      tile.rel = 'noopener noreferrer';\n    }\n    tile.title = p.name;\n\n    const img = document.createElement('img');\n    img.src = p.logo;\n    img.alt = p.alt || p.name;\n    img.loading = 'lazy';\n    img.onerror = function() {\n      console.warn('[ICSN Map] Logo failed to load:', p.name, p.logo);\n    };\n    tile.appendChild(img);\n\n    const label = document.createElement('span');\n    label.className = 'logo-name';\n    label.textContent = p.name;\n    tile.appendChild(label);\n\n    return tile;\n  }\n\n  function closePopup() {\n    $('icsn-overlay').classList.remove('open');\n    unlockBodyScroll();\n    if (state.currentSelectedSlug) {\n      d3.select('[data-slug=\"' + state.currentSelectedSlug + '\"]').classed('is-selected', false);\n      state.currentSelectedSlug = null;\n    }\n  }\n\n  function setupActionButton(btnId, countId, list, popupOpts) {\n    const btn = $(btnId);\n    const countEl = $(countId);\n    const count = list.length;\n\n    if (count === 0) {\n      btn.disabled = true;\n      countEl.textContent = '0';\n      return;\n    }\n    btn.disabled = false;\n    animateCount(countEl, count, 1100);\n\n    btn.addEventListener('click', () => {\n      openPopup(Object.assign({ list }, popupOpts));\n    });\n  }\n\n  function animateCount(el, target, duration) {\n    if (target <= 0) { el.textContent = '0'; return; }\n    const start = performance.now();\n    const tick = now => {\n      const p = Math.min((now - start) \/ duration, 1);\n      const eased = 1 - Math.pow(1 - p, 3);\n      el.textContent = Math.floor(eased * target);\n      if (p < 1) requestAnimationFrame(tick);\n      else el.textContent = target;\n    };\n    requestAnimationFrame(tick);\n  }\n\n  async function init() {\n    try {\n      const [geo, idToSlug, partners] = await Promise.all([\n        loadGeoJSON(),\n        loadProvinces(),\n        loadAllPartners(),\n      ]);\n      const grouped = buildGroups(partners, idToSlug);\n      state.byProvince    = grouped.byProvince;\n      state.international = grouped.international;\n\n      buildMap(geo);\n\n      setupActionButton('icsn-international', 'international-count', state.international, {\n        slug: 'international',\n        eyebrow: t('worldwideEyebrow'),\n        name: t('internationalBtn'),\n      });\n    } catch (err) {\n      console.error('[ICSN Map]', err);\n      const loading = $('icsn-loading');\n      loading.innerHTML = '';\n      loading.classList.add('error');\n      const msg = document.createElement('div');\n      msg.textContent = t('unableToLoad');\n      loading.appendChild(msg);\n    }\n  }\n\n  function bindPopupEvents() {\n    $('pop-close').addEventListener('click', closePopup);\n    $('icsn-overlay').addEventListener('click', e => {\n      if (e.target === $('icsn-overlay')) closePopup();\n    });\n\n    $('tt-close').addEventListener('click', function(e) {\n      e.stopPropagation();\n      hideTooltipTouch();\n    });\n\n    $('tt-cta').addEventListener('click', function(e) {\n      if (!IS_TOUCH) return;\n      e.stopPropagation();\n      if (!touchTooltipSlug) return;\n      const feat = state.geoFeatures.find(f => slugForFeature(f) === touchTooltipSlug);\n      if (feat) {\n        const slug = touchTooltipSlug;\n        const list = state.byProvince[slug] || [];\n        if (list.length === 0) return;\n        hideTooltipTouch();\n        openPopup({\n          slug,\n          eyebrow: t('provinceEyebrow'),\n          name: labelForFeature(feat),\n          list,\n        });\n      }\n    });\n\n    document.addEventListener('click', function(e) {\n      if (!IS_TOUCH) return;\n      const tip = $('icsn-tooltip');\n      if (!tip.classList.contains('show')) return;\n      if (tip.contains(e.target)) return;\n      if (e.target.closest && e.target.closest('path.prov')) return;\n      hideTooltipTouch();\n    });\n  }\n\n  document.addEventListener('keydown', e => {\n    if ($('icsn-overlay').classList.contains('open')) {\n      if (e.key === 'Escape') closePopup();\n    } else if ($('icsn-tooltip').classList.contains('show')) {\n      if (e.key === 'Escape') hideTooltipTouch();\n    }\n  });\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', function() {\n      bindPopupEvents();\n      init();\n    });\n  } else {\n    bindPopupEvents();\n    init();\n  }\n})();\n<\/script>\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-99d3d6c elementor-widget elementor-widget-text-editor\" data-id=\"99d3d6c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Derni\u00e8re mise \u00e0 jour : juin 2026<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Nos partenaires communautaires D\u00e9couvrez nos partenaires communautaires partout au Canada : Passez la souris ou appuyez sur n&rsquo;importe quelle province. Derni\u00e8re mise \u00e0 jour : juin 2026<\/p>\n","protected":false},"author":7,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-14331","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/inclusionincanadiansports.ca\/fr\/wp-json\/wp\/v2\/pages\/14331","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/inclusionincanadiansports.ca\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/inclusionincanadiansports.ca\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/inclusionincanadiansports.ca\/fr\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/inclusionincanadiansports.ca\/fr\/wp-json\/wp\/v2\/comments?post=14331"}],"version-history":[{"count":10,"href":"https:\/\/inclusionincanadiansports.ca\/fr\/wp-json\/wp\/v2\/pages\/14331\/revisions"}],"predecessor-version":[{"id":14354,"href":"https:\/\/inclusionincanadiansports.ca\/fr\/wp-json\/wp\/v2\/pages\/14331\/revisions\/14354"}],"wp:attachment":[{"href":"https:\/\/inclusionincanadiansports.ca\/fr\/wp-json\/wp\/v2\/media?parent=14331"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}