{"id":466,"date":"2026-09-21T17:40:34","date_gmt":"2026-09-21T15:40:34","guid":{"rendered":"https:\/\/wegetfunded.com\/?p=466"},"modified":"2026-10-23T13:58:34","modified_gmt":"2026-10-23T11:58:34","slug":"configurer-mon-challenge","status":"publish","type":"post","link":"https:\/\/wegetfunded.com\/fr\/blog\/configurer-mon-challenge\/","title":{"rendered":"Configurez votre challenge de trading | WeGetFunded"},"content":{"rendered":"\n<style data-wgf-configurateur-css>\n\/* Proposition \u00ab Desk \u00bb : poste de trading. Tout est pr\u00e9fix\u00e9 .desk pour \u00e9viter les collisions.\n   Deux signaux de couleur seulement : violet WGF pour ce qui est arm\u00e9, ambre pour ce qui vient de l'offre.\n   Aucune esperluette dans ce fichier (contrainte F-WGF-293). *\/\n@font-face { font-family: 'Mona Sans'; src: url('https:\/\/wegetfunded.com\/wp-content\/uploads\/fonts\/mona-sans.woff2') format('woff2'); font-weight: 200 900; font-display: swap; }\n\n.desk {\n  --void: #0a0910;\n  --panel: #121019;\n  --panel-armed: #1a1626;\n  --weave: #1d1a28;\n  --rule: #312b41;\n  --rule-live: #4a4162;\n  --ink: #f4f1fb;\n  --ink-2: #c0b9d1;\n  --ink-3: #a79fb8;\n  --ink-4: #8e869f;\n  --violet: #a14efe;\n  --violet-deep: #6a28c4;\n  --violet-cta: #8f3df0;\n  --violet-soft: #d6b6ff;\n  --amber: #f2c45a;\n  --amber-dim: #3a2f14;\n  --mono: ui-monospace, SFMono-Regular, Menlo, monospace;\n  --ticker-h: 158px;\n  --ease-in: cubic-bezier(.22,.9,.24,1);\n  --ease-state: cubic-bezier(.4,0,.2,1);\n  --t-tap: 120ms;\n  --t-state: 180ms;\n  --t-panel: 280ms;\n  --t-price: 420ms;\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  min-height: 100dvh;\n  background: var(--void);\n  color: var(--ink);\n  font-family: 'Mona Sans', system-ui, sans-serif;\n  line-height: 1.45;\n  isolation: isolate;\n  padding-bottom: calc(var(--ticker-h) + 20px);\n}\n.desk, .desk *, .desk *::before, .desk *::after { box-sizing: border-box; }\n.desk [hidden] { display: none !important; }\n\n\/* Trame technique du poste : grille fine, non imprim\u00e9e sur le contenu. *\/\n.desk::before {\n  content: \"\";\n  position: fixed;\n  inset: 0;\n  z-index: -2;\n  background:\n    linear-gradient(180deg, rgba(161,78,254,.10), rgba(10,9,16,0) 42%),\n    repeating-linear-gradient(90deg, var(--weave) 0 1px, transparent 1px 72px),\n    repeating-linear-gradient(0deg, var(--weave) 0 1px, transparent 1px 72px),\n    var(--void);\n  opacity: .9;\n  pointer-events: none;\n}\n.desk__trace {\n  position: fixed;\n  inset: auto 0 0 0;\n  width: 100%;\n  height: 48vh;\n  max-height: 460px;\n  z-index: -1;\n  opacity: .5;\n  pointer-events: none;\n}\n.desk__trace-note {\n  margin: 20px 0 0;\n  font-family: var(--mono);\n  font-size: 12.5px;\n  letter-spacing: .04em;\n  color: var(--ink-3);\n}\n\n\/* En-t\u00eate du poste *\/\n.desk__head {\n  display: grid;\n  grid-template-columns: auto 1fr;\n  align-items: center;\n  gap: 10px 14px;\n  padding: 14px 18px 10px;\n  border-bottom: 1px solid var(--weave);\n}\n\/* Stabilite de chargement : la boite du logo est reservee avant l'arrivee du SVG,\n   l'image se contente d'y tenir sans etirement. *\/\n.desk__logo { height: 24px; width: 132px; object-fit: contain; object-position: left center; }\n.desk__logo--text { width: auto; height: auto; font-size: 17px; font-weight: 800; letter-spacing: -.02em; }\n.desk__signal {\n  justify-self: end;\n  display: inline-flex;\n  align-items: center;\n  gap: 7px;\n  margin: 0;\n  font-family: var(--mono);\n  font-size: 13px;\n  letter-spacing: .04em;\n  text-transform: uppercase;\n  color: var(--ink-3);\n  max-width: 52vw;\n  min-height: 38px;\n  text-align: right;\n}\n.desk__led {\n  width: 7px;\n  height: 7px;\n  flex: 0 0 7px;\n  border-radius: 50%;\n  background: var(--ink-3);\n  box-shadow: 0 0 0 0 rgba(161,78,254,.5);\n}\n.desk[data-catalog-state=\"ready\"] .desk__led { background: var(--violet); box-shadow: 0 0 10px rgba(161,78,254,.75); }\n.desk[data-catalog-state=\"loading\"] .desk__led { background: var(--amber); animation: desk-pulse 1.4s var(--ease-state) infinite; }\n.desk[data-catalog-state=\"unavailable\"] .desk__led { background: #ff8a7a; }\n@keyframes desk-pulse { 0%, 100% { opacity: .35; } 50% { opacity: 1; } }\n\n.desk__rail {\n  grid-column: 1 \/ -1;\n  list-style: none;\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  gap: 6px;\n  margin: 2px 0 0;\n  padding: 0;\n}\n.desk__rail li { min-width: 0; }\n.desk__rail i {\n  display: block;\n  height: 3px;\n  border-radius: 2px;\n  background: var(--rule);\n  transition: background var(--t-state) var(--ease-state), box-shadow var(--t-state) var(--ease-state);\n}\n.desk__rail span {\n  display: block;\n  margin-top: 7px;\n  font-size: 12px;\n  font-weight: 600;\n  letter-spacing: 0;\n  color: var(--ink-3);\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.desk__rail li.is-done i { background: var(--violet-deep); }\n.desk__rail li.is-current i { background: var(--violet); box-shadow: 0 0 12px rgba(161,78,254,.6); }\n.desk__rail li.is-current span { color: var(--violet-soft); }\n\n\/* Corps *\/\n.desk__main {\n  flex: 1;\n  width: 100%;\n  max-width: 760px;\n  margin: 0 auto;\n  padding: 16px 18px 20px;\n  min-height: calc(100vh - 76px);\n  min-height: calc(100svh - 76px);\n}\n\/* La baie d'etat garde sa hauteur quand le bandeau de verification disparait :\n   sans cela toute l'etape remonte au moment ou le catalogue est pret. *\/\n.desk__notices { min-height: 52px; }\n.desk__notice {\n  position: relative;\n  margin: 0 0 10px;\n  padding: 11px 13px 11px 15px;\n  font-size: 13.5px;\n  line-height: 1.5;\n  color: var(--ink-2);\n  background: var(--panel);\n  border: 1px solid var(--rule);\n  border-left: 2px solid var(--amber);\n  border-radius: 3px;\n}\n.desk__notices .desk__btn { width: 100%; margin-bottom: 12px; }\n\n\/* Panneau d'\u00e9tape : cadre de terminal *\/\n.desk__panel { position: relative; padding-top: 4px; }\n.desk__tag {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  margin: 0 0 10px;\n  font-family: var(--mono);\n  font-size: 12px;\n  font-weight: 700;\n  letter-spacing: .16em;\n  text-transform: uppercase;\n  color: var(--ink-3);\n}\n.desk__tag span {\n  color: var(--violet-soft);\n  padding: 2px 6px;\n  border: 1px solid var(--rule-live);\n  border-radius: 2px;\n  background: rgba(161,78,254,.08);\n}\n.desk__title {\n  margin: 0 0 10px;\n  font-size: clamp(26px, 7vw, 40px);\n  font-weight: 800;\n  line-height: 1.05;\n  letter-spacing: -.03em;\n  text-wrap: balance;\n}\n.desk__title { position: relative; }\n.desk__title:focus-visible::before {\n  content: \"\";\n  position: absolute;\n  left: -12px;\n  top: 6px;\n  bottom: 6px;\n  width: 3px;\n  border-radius: 2px;\n  background: var(--violet);\n}\n.desk__lead { margin: 0 0 16px; font-size: 15px; line-height: 1.5; color: var(--ink-2); }\n.desk__hint {\n  margin: 14px 0 0;\n  padding-left: 12px;\n  border-left: 2px solid var(--rule-live);\n  font-size: 13.5px;\n  line-height: 1.5;\n  color: var(--ink-3);\n}\n\n\/* Choix : canaux (programmes) *\/\n.desk__channels { display: grid; gap: 10px; }\n.desk__choice {\n  position: relative;\n  display: block;\n  padding: 14px 14px 14px 40px;\n  background: var(--panel);\n  border: 1px solid var(--rule);\n  border-radius: 4px;\n  cursor: pointer;\n  transition: border-color var(--t-state) var(--ease-state), background var(--t-state) var(--ease-state), transform var(--t-tap) var(--ease-state);\n}\n.desk__choice:hover { border-color: var(--rule-live); }\n.desk__choice input {\n  position: absolute;\n  opacity: 0;\n  width: 1px;\n  height: 1px;\n  margin: 0;\n  pointer-events: none;\n}\n.desk__choice-led {\n  position: absolute;\n  left: 15px;\n  top: 19px;\n  width: 11px;\n  height: 11px;\n  border: 1px solid var(--rule-live);\n  border-radius: 50%;\n}\n.desk__choice-led::after {\n  content: \"\";\n  position: absolute;\n  inset: 2px;\n  border-radius: 50%;\n  background: var(--violet);\n  transform: scale(.2);\n  opacity: 0;\n  transition: transform var(--t-state) var(--ease-in), opacity var(--t-state) var(--ease-state);\n}\n.desk__choice:has(input:checked) { border-color: var(--violet); background: var(--panel-armed); }\n.desk__choice:has(input:checked) .desk__choice-led { border-color: var(--violet); box-shadow: 0 0 12px rgba(161,78,254,.45); }\n.desk__choice:has(input:checked) .desk__choice-led::after { transform: scale(1); opacity: 1; }\n.desk__choice:focus-within { outline: 2px solid var(--violet-soft); outline-offset: 3px; }\n.desk__choice:has(input:disabled) { opacity: .5; cursor: not-allowed; }\n.desk__choice-name { display: block; font-size: 17px; font-weight: 700; letter-spacing: -.01em; }\n.desk__choice-desc { display: block; margin-top: 3px; font-size: 13.5px; line-height: 1.45; color: var(--ink-2); }\n\n\/* Attente du catalogue : empreinte des cartes, sans valeur affich\u00e9e *\/\n.desk__skeleton {\n  display: block;\n  height: 176px;\n  border: 1px solid var(--rule);\n  border-radius: 4px;\n  background: linear-gradient(100deg, var(--panel) 30%, var(--panel-armed) 50%, var(--panel) 70%);\n  background-size: 300% 100%;\n  animation: desk-wait 1.8s linear infinite;\n}\n@keyframes desk-wait { from { background-position: 120% 0; } to { background-position: -40% 0; } }\n\n\/* Bande d'indicateurs (r\u00e8gles lues dans le snapshot) *\/\n.desk__gauges { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; margin-top: 10px; }\n.desk__gauge {\n  display: inline-flex;\n  flex-direction: column;\n  gap: 2px;\n  min-width: 0;\n  padding: 5px 8px;\n  border: 1px solid var(--weave);\n  border-radius: 3px;\n  background: rgba(255,255,255,.015);\n}\n.desk__gauge b {\n  font-family: var(--mono);\n  font-size: 13px;\n  font-weight: 700;\n  line-height: 1.3;\n  letter-spacing: .02em;\n  text-transform: uppercase;\n  color: var(--ink-3);\n  max-width: 20ch;\n  overflow-wrap: anywhere;\n}\n.desk__gauge span { font-size: 13px; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--ink); }\n\n\/* Choix : tuiles de capital *\/\n.desk__tiles { display: grid; gap: 10px; }\n.desk__tile { padding: 14px 14px 14px 40px; }\n.desk__tile-amount {\n  display: block;\n  white-space: nowrap;\n  font-size: clamp(23px, 7vw, 32px);\n  font-weight: 800;\n  line-height: 1.05;\n  letter-spacing: -.03em;\n  font-variant-numeric: tabular-nums;\n}\n.desk__tile-price { display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px; margin-top: 8px; }\n.desk__pay { font-size: 19px; font-weight: 800; font-variant-numeric: tabular-nums; letter-spacing: -.02em; }\n.desk__list { font-size: 14px; font-weight: 500; color: var(--ink-3); font-variant-numeric: tabular-nums; }\n.desk__save {\n  display: inline-block;\n  padding: 3px 7px;\n  border-radius: 2px;\n  background: var(--amber-dim);\n  color: var(--amber);\n  font-size: 13px;\n  font-weight: 700;\n  font-variant-numeric: tabular-nums;\n  white-space: nowrap;\n}\n.desk__checking { font-family: var(--mono); font-size: 13px; color: var(--ink-3); }\n@media (min-width: 560px) { .desk__tiles { grid-template-columns: repeat(2, 1fr); } }\n@media (min-width: 880px) { .desk__tiles { grid-template-columns: repeat(3, 1fr); } }\n\n\/* Options : modules \u00e0 armer *\/\n.desk__group { border: 0; margin: 0 0 16px; padding: 0; min-width: 0; }\n.desk__group legend {\n  display: flex;\n  align-items: baseline;\n  gap: 10px;\n  width: 100%;\n  padding: 0 0 8px;\n  font-size: 16px;\n  font-weight: 700;\n}\n.desk__group-index {\n  font-family: var(--mono);\n  font-size: 12px;\n  font-weight: 700;\n  letter-spacing: .1em;\n  text-transform: uppercase;\n  color: var(--ink-3);\n}\n.desk__module {\n  position: relative;\n  display: grid;\n  grid-template-columns: 1fr auto;\n  gap: 4px 12px;\n  padding: 12px 14px 12px 40px;\n  margin-bottom: 8px;\n  background: var(--panel);\n  border: 1px solid var(--rule);\n  border-radius: 4px;\n  cursor: pointer;\n  transition: border-color var(--t-state) var(--ease-state), background var(--t-state) var(--ease-state);\n}\n.desk__module:hover { border-color: var(--rule-live); }\n.desk__module:has(input:checked) { border-color: var(--violet); background: var(--panel-armed); }\n.desk__module .desk__choice-led { top: 15px; }\n.desk__module:has(input:checked) .desk__choice-led { border-color: var(--violet); box-shadow: 0 0 12px rgba(161,78,254,.45); }\n.desk__module:has(input:checked) .desk__choice-led::after { transform: scale(1); opacity: 1; }\n.desk__module:focus-within { outline: 2px solid var(--violet-soft); outline-offset: 3px; }\n.desk__module:has(input:disabled) { opacity: .55; cursor: not-allowed; }\n.desk__module input { position: absolute; opacity: 0; width: 1px; height: 1px; margin: 0; pointer-events: none; }\n.desk__module-name { font-size: 15px; font-weight: 700; }\n.desk__module-desc { grid-column: 1 \/ -1; font-size: 13px; line-height: 1.45; color: var(--ink-2); }\n.desk__module-delta {\n  font-size: 15px;\n  font-weight: 700;\n  font-variant-numeric: tabular-nums;\n  white-space: nowrap;\n  color: var(--ink-2);\n  align-self: start;\n}\n.desk__module:has(input:checked) .desk__module-delta { color: var(--violet-soft); }\n.desk__module-state {\n  grid-column: 1 \/ -1;\n  justify-self: start;\n  font-family: var(--mono);\n  font-size: 13px;\n  font-weight: 600;\n  letter-spacing: .1em;\n  text-transform: uppercase;\n  color: var(--ink-3);\n}\n.desk__module:has(input:checked) .desk__module-state { color: var(--violet-soft); }\n\n\/* R\u00e8gles d\u00e9taill\u00e9es *\/\n.desk__rules { display: grid; gap: 8px; }\n.desk__rule { display: grid; gap: 2px; padding-bottom: 8px; border-bottom: 1px solid var(--weave); }\n.desk__rule b { font-size: 13px; font-weight: 700; }\n.desk__rule span { font-size: 13px; color: var(--ink-2); font-variant-numeric: tabular-nums; }\n.desk__more { margin-top: 16px; border-top: 1px solid var(--weave); }\n.desk__more summary {\n  display: flex;\n  align-items: center;\n  min-height: 44px;\n  cursor: pointer;\n  font-size: 14.5px;\n  color: var(--violet-soft);\n}\n.desk__more p { margin: 0 0 12px; font-size: 13.5px; line-height: 1.55; color: var(--ink-2); }\n\n\/* \u00c9cran de pr\u00e9-lancement *\/\n.desk__panel--launch .desk__title { font-size: clamp(23px, 6.2vw, 34px); margin-bottom: 8px; }\n.desk__panel--launch .desk__gauges { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; }\n.desk__panel--launch .desk__gauge { padding: 4px 8px; }\n.desk__sheet {\n  position: relative;\n  padding: 14px 12px;\n  background: linear-gradient(180deg, rgba(161,78,254,.07), rgba(18,16,25,0) 180px), var(--panel);\n  border: 1px solid var(--rule-live);\n  border-radius: 4px;\n}\n.desk__sheet::before, .desk__sheet::after {\n  content: \"\";\n  position: absolute;\n  width: 14px;\n  height: 14px;\n  border: 1px solid var(--violet);\n  pointer-events: none;\n}\n.desk__sheet::before { top: -1px; left: -1px; border-right: 0; border-bottom: 0; }\n.desk__sheet::after { bottom: -1px; right: -1px; border-left: 0; border-top: 0; }\n.desk__sheet-head {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: baseline;\n  justify-content: space-between;\n  gap: 6px 10px;\n  padding-bottom: 10px;\n  border-bottom: 1px solid var(--weave);\n}\n.desk__sheet-name { font-size: clamp(20px, 5.6vw, 26px); font-weight: 800; letter-spacing: -.025em; line-height: 1.1; }\n.desk__sheet-capital {\n  font-family: var(--mono);\n  font-size: 14.5px;\n  font-weight: 700;\n  color: var(--violet-soft);\n  font-variant-numeric: tabular-nums;\n}\n.desk__line {\n  display: grid;\n  grid-template-columns: 88px 1fr;\n  gap: 4px 10px;\n  padding: 8px 0;\n  border-bottom: 1px solid var(--weave);\n}\n.desk__line dt {\n  font-family: var(--mono);\n  font-size: 13px;\n  font-weight: 700;\n  letter-spacing: .08em;\n  text-transform: uppercase;\n  color: var(--ink-3);\n  padding-top: 2px;\n}\n.desk__line dd { margin: 0; font-size: 14.5px; line-height: 1.45; }\n.desk__chips { display: flex; flex-wrap: wrap; gap: 6px; }\n.desk__chip {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  padding: 4px 9px;\n  border: 1px solid var(--rule-live);\n  border-radius: 2px;\n  background: rgba(161,78,254,.07);\n  font-size: 13px;\n  font-weight: 600;\n}\n.desk__chip::before { content: \"\"; width: 5px; height: 5px; border-radius: 50%; background: var(--violet); }\n.desk__chip--code {\n  font-family: var(--mono);\n  letter-spacing: .08em;\n  border-color: var(--amber);\n  background: var(--amber-dim);\n  color: var(--amber);\n}\n.desk__chip--code::before { background: var(--amber); }\n.desk__chip--gift { border-color: var(--amber); background: var(--amber-dim); color: var(--amber); }\n.desk__chip--gift::before { background: var(--amber); }\n\n.desk__price-block { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--rule); }\n.desk__price-label {\n  display: block;\n  font-family: var(--mono);\n  font-size: 13px;\n  font-weight: 700;\n  letter-spacing: .14em;\n  text-transform: uppercase;\n  color: var(--ink-2);\n}\n.desk__price-pay {\n  display: block;\n  margin-top: 2px;\n  font-size: clamp(40px, 13vw, 64px);\n  font-weight: 800;\n  line-height: 1;\n  letter-spacing: -.04em;\n  font-variant-numeric: tabular-nums;\n}\n.desk__price-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin-top: 10px; }\n.desk__price-list { font-size: 15px; color: var(--ink-3); font-variant-numeric: tabular-nums; }\n.desk__price-save {\n  display: inline-block;\n  padding: 5px 10px;\n  border-radius: 2px;\n  background: var(--amber-dim);\n  border: 1px solid rgba(242,196,90,.45);\n  color: var(--amber);\n  font-size: 13.5px;\n  font-weight: 700;\n  font-variant-numeric: tabular-nums;\n  transform-origin: left center;\n}\n.desk__countdown {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  margin-top: 12px;\n  font-family: var(--mono);\n  font-size: 13px;\n  letter-spacing: .06em;\n  color: var(--amber);\n  font-variant-numeric: tabular-nums;\n}\n.desk__unavailable { font-size: 15px; font-weight: 600; color: var(--ink-2); }\n\n.desk__edit { display: flex; flex-wrap: wrap; align-items: center; gap: 2px 16px; margin: 14px 0 10px; font-size: 13px; color: var(--ink-2); }\n.desk__edit button {\n  min-height: 44px;\n  padding: 10px 0;\n  border: 0;\n  background: none;\n  color: var(--violet-soft);\n  font: inherit;\n  text-decoration: underline;\n  text-underline-offset: 3px;\n  cursor: pointer;\n}\n.desk__edit button:disabled { opacity: .5; cursor: not-allowed; }\n.desk__cart-status { margin: 0 0 10px; font-size: 13px; line-height: 1.55; color: var(--ink-3); }\n.desk__fees:empty, .desk__cart-status:empty { display: none; }\n.desk__cart-open { display: inline-block; margin-bottom: 10px; font-size: 13px; color: var(--violet-soft); }\n.desk__source { display: flex; flex-wrap: wrap; gap: 6px 18px; margin: 18px 0 0; font-size: 13px; }\n.desk__source button, .desk__source a {\n  display: inline-flex;\n  align-items: center;\n  min-height: 44px;\n  padding: 10px 0;\n  border: 0;\n  background: none;\n  color: var(--ink-3);\n  font: inherit;\n  text-decoration: underline;\n  cursor: pointer;\n}\n\n\/* Boutons *\/\n.desk__btn, .desk__cta {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  min-height: 48px;\n  padding: 12px 20px;\n  border: 1px solid var(--violet);\n  border-radius: 3px;\n  background: var(--violet-deep);\n  color: #fff;\n  font: inherit;\n  font-size: 15.5px;\n  font-weight: 700;\n  cursor: pointer;\n  overflow: hidden;\n  transition: background var(--t-state) var(--ease-state), transform var(--t-tap) var(--ease-state), box-shadow var(--t-state) var(--ease-state);\n}\n.desk__btn:hover, .desk__cta:hover { background: #7a32dd; }\n.desk__btn:active, .desk__cta:active { transform: translateY(1px); }\n.desk__btn:focus-visible, .desk__cta:focus-visible { outline: 2px solid var(--violet-soft); outline-offset: 3px; }\n.desk__btn--ghost { background: transparent; border-color: var(--rule-live); color: var(--ink-2); }\n.desk__btn--ghost:hover { background: rgba(255,255,255,.04); }\n.desk__btn:disabled, .desk__cta[aria-disabled=\"true\"], .desk__cta:disabled { opacity: .5; cursor: not-allowed; }\n.desk__cta {\n  flex: 1;\n  min-height: 56px;\n  font-size: 17.5px;\n  letter-spacing: -.01em;\n  background: linear-gradient(135deg, var(--violet-cta) 0%, var(--violet-deep) 100%);\n  box-shadow: 0 0 0 1px rgba(161,78,254,.35), 0 10px 30px -14px rgba(161,78,254,.9);\n}\n.desk__cta:hover { box-shadow: 0 0 0 1px rgba(161,78,254,.6), 0 14px 34px -12px rgba(161,78,254,1); }\n.desk__cta-sweep {\n  position: absolute;\n  inset: 0;\n  background: linear-gradient(100deg, transparent 20%, rgba(255,255,255,.22) 50%, transparent 80%);\n  transform: translateX(-120%);\n  pointer-events: none;\n}\n.desk__cta:not([disabled]) .desk__cta-sweep { animation: desk-sweep 4.5s var(--ease-state) 1.2s infinite; }\n@keyframes desk-sweep { 0% { transform: translateX(-120%); } 55%, 100% { transform: translateX(120%); } }\n\n\/* Ticker : barre de prix fixe *\/\n.desk__ticker {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 5;\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) auto;\n  grid-template-areas: \"pack price\" \"meta meta\" \"fees fees\" \"nav nav\";\n  gap: 8px 12px;\n  align-items: center;\n  padding: 10px 18px calc(10px + env(safe-area-inset-bottom));\n  background: var(--void);\n  border-top: 1px solid var(--rule);\n}\n.desk__ticker::before {\n  content: \"\";\n  position: absolute;\n  inset: -1px 0 auto 0;\n  height: 1px;\n  background: linear-gradient(90deg, transparent, var(--violet), transparent);\n  opacity: .55;\n}\n.desk__ticker-pack { grid-area: pack; min-width: 0; }\n.desk__ticker-name { display: block; font-size: 13.5px; font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.desk__ticker-variant {\n  display: block;\n  font-family: var(--mono);\n  font-size: 13px;\n  letter-spacing: .01em;\n  color: var(--ink-3);\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.desk__ticker-price { display: contents; }\n.desk__ticker-total { grid-area: price; text-align: right; }\n.desk__ticker-meta { grid-area: meta; }\n.desk__ticker-total {\n  display: block;\n  font-size: clamp(24px, 7.4vw, 34px);\n  font-weight: 800;\n  line-height: 1.05;\n  letter-spacing: -.03em;\n  font-variant-numeric: tabular-nums;\n}\n.desk__ticker-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; min-width: 0; min-height: 22px; }\n.desk__ticker-strike { font-size: 13px; color: var(--ink-3); font-variant-numeric: tabular-nums; }\n.desk__ticker-save { font-size: 13px; font-weight: 700; color: var(--amber); font-variant-numeric: tabular-nums; }\n.desk__ticker-code {\n  font-family: var(--mono);\n  font-size: 13px;\n  letter-spacing: .04em;\n  color: var(--amber);\n  padding: 2px 6px;\n  border: 1px solid rgba(242,196,90,.4);\n  border-radius: 2px;\n}\n\/* Frais d'activation repris dans la barre persistante, au-dessus du CTA : le visiteur\n   qui agit depuis la barre sans remonter la page les a sous les yeux. Texte entier,\n   jamais tronque, jamais replie ; la hauteur reelle de la barre est remesuree et\n   reinjectee dans --ticker-h, donc la reserve de defilement suit. *\/\n.desk__ticker-fees {\n  grid-area: fees;\n  margin: 2px 0 0;\n  padding: 7px 10px;\n  border: 1px solid var(--rule);\n  border-left: 2px solid var(--amber);\n  border-radius: 3px;\n  background: rgba(242,196,90,.06);\n  color: var(--ink);\n  font-size: 13px;\n  line-height: 1.4;\n  overflow-wrap: anywhere;\n}\n.desk__ticker-nav { grid-area: nav; display: flex; gap: 8px; }\n.desk__ticker-nav .desk__btn { flex: 1; }\n\n.desk__armed { animation: desk-armed 520ms var(--ease-state); }\n@keyframes desk-armed {\n  0% { box-shadow: inset 0 0 0 0 rgba(161,78,254,.4); }\n  35% { box-shadow: inset 0 0 40px 0 rgba(161,78,254,.28); }\n  100% { box-shadow: inset 0 0 0 0 rgba(161,78,254,0); }\n}\n\n\/* Pied r\u00e9glementaire *\/\n.desk__legal-notice { padding: 0 18px 14px; font-size: 13px; color: var(--ink-3); }\n.desk__legal-notice summary { min-height: 44px; display: flex; align-items: center; cursor: pointer; }\n.desk__legal-notice p { line-height: 1.55; }\n.desk__legal { display: flex; flex-wrap: wrap; gap: 2px 16px; padding: 0 18px 12px; font-size: 13px; }\n.desk__legal a { display: inline-flex; align-items: center; min-height: 44px; color: var(--ink-3); }\n.desk__mentions { margin: 0; padding: 0 18px 8px; font-size: 13px; line-height: 1.55; color: var(--ink-3); }\n\n\/* Console lat\u00e9rale : r\u00e9serv\u00e9e au desktop *\/\n.desk__console { display: none; }\n\n\/* \u00c9tats globaux *\/\n.desk[data-price-state=\"unavailable\"] .desk__ticker-total,\n.desk[data-price-state=\"loading\"] .desk__ticker-total {\n  font-size: 16px;\n  font-weight: 700;\n  color: var(--ink-2);\n  letter-spacing: 0;\n}\n.desk[data-cart-state=\"added\"] .desk__sheet { border-color: var(--violet); }\n.desk[data-catalog-state=\"unavailable\"] .desk__sheet { border-color: var(--rule); }\n\n\/* Desktop : poste \u00e9largi, r\u00e9capitulatif en deux colonnes *\/\n@media (min-width: 1080px) {\n  .desk { --ticker-h: 92px; }\n  .desk__head { max-width: 1120px; margin: 0 auto; width: 100%; padding: 18px 28px 12px; }\n  .desk__rail { max-width: 560px; justify-self: end; grid-column: 2; }\n  .desk__main {\n    max-width: 1120px;\n    padding: 28px 28px 28px;\n    display: grid;\n    grid-template-columns: minmax(0, 1fr) 272px;\n    gap: 0 36px;\n    align-items: start;\n  }\n  .desk__notices, .desk__panel, .desk__source, .desk__trace-note { grid-column: 1; }\n  .desk__main:has([data-view-step=\"4\"]) { grid-template-columns: minmax(0, 1fr); }\n  .desk__main:has([data-view-step=\"4\"]) .desk__console { display: none; }\n  .desk__panel:not(.desk__panel--launch) { max-width: 760px; }\n  .desk__console {\n    display: block;\n    grid-column: 2;\n    grid-row: 1 \/ 30;\n    position: sticky;\n    top: 24px;\n    padding: 16px;\n    border: 1px solid var(--rule);\n    border-radius: 4px;\n    background: rgba(18,16,25,.72);\n  }\n  .desk__console-title {\n    margin: 0 0 12px;\n    font-family: var(--mono);\n    font-size: 13px;\n    font-weight: 700;\n    letter-spacing: .18em;\n    text-transform: uppercase;\n    color: var(--ink-3);\n  }\n  .desk__console-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }\n  .desk__console-item {\n    display: grid;\n    grid-template-columns: 9px 1fr;\n    gap: 2px 9px;\n    padding-bottom: 10px;\n    border-bottom: 1px solid var(--weave);\n  }\n  .desk__console-item i {\n    width: 7px;\n    height: 7px;\n    margin-top: 5px;\n    border-radius: 50%;\n    background: var(--rule-live);\n    transition: background var(--t-state) var(--ease-state), box-shadow var(--t-state) var(--ease-state);\n  }\n  .desk__console-item.is-on i { background: var(--violet); box-shadow: 0 0 10px rgba(161,78,254,.7); }\n  .desk__console-item b {\n    font-family: var(--mono);\n    font-size: 13px;\n    font-weight: 700;\n    letter-spacing: .12em;\n    text-transform: uppercase;\n    color: var(--ink-3);\n  }\n  .desk__console-item span { grid-column: 2; font-size: 13.5px; font-weight: 600; color: var(--ink-2); overflow-wrap: anywhere; }\n  .desk__console-item.is-on span { color: var(--ink); }\n  .desk__title { margin-bottom: 12px; }\n  .desk__channels { grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }\n  .desk__tile-amount { font-size: 26px; }\n  .desk__panel--launch .desk__gauges { gap: 8px; }\n  .desk__panel--launch .desk__sheet { display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(300px, .85fr); gap: 0 28px; padding: 22px; }\n  .desk__panel--launch .desk__sheet-head { grid-column: 1 \/ -1; }\n  .desk__panel--launch .desk__base { grid-column: 1; align-self: start; }\n  .desk__panel--launch .desk__price-block {\n    grid-column: 2;\n    grid-row: 2 \/ 20;\n    align-self: start;\n    margin-top: 0;\n    padding: 16px;\n    border: 1px solid var(--rule-live);\n    border-top: 1px solid var(--rule-live);\n    border-radius: 3px;\n    background: rgba(161,78,254,.05);\n  }\n  .desk__ticker {\n    grid-template-columns: minmax(0, 1fr) auto auto;\n    grid-template-areas: \"fees fees fees\" \"pack price nav\" \"pack meta nav\";\n    padding: 12px 28px;\n    gap: 2px 24px;\n    max-width: 1176px;\n    margin: 0 auto;\n  }\n  .desk__ticker-pack { align-self: center; }\n  .desk__ticker-nav { align-self: center; grid-row: 2 \/ 4; }\n  .desk__ticker-total { align-self: end; }\n  .desk__ticker-nav .desk__btn { flex: 0 0 auto; min-width: 150px; }\n  .desk__ticker-nav .desk__cta { flex: 0 0 auto; min-width: 260px; }\n  .desk__legal-notice, .desk__legal, .desk__mentions { width: 100%; max-width: 1120px; margin-inline: auto; padding-left: 28px; padding-right: 28px; }\n  .desk__ticker-price { display: contents; }\n  .desk__ticker-meta { grid-area: meta; justify-content: flex-end; }\n  .desk__ticker-fees { margin: 0 0 10px; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .desk *, .desk *::before, .desk *::after {\n    animation-duration: 1ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 1ms !important;\n  }\n  .desk__cta-sweep { display: none; }\n}\n\n\n\/* ---------- v2 : lisibilite, revelation, deltas d'options ---------- *\/\n\n\/* Valeur accessible continue : lue et copiable, l'animation reste decorative (D-I3). *\/\n.desk__sr {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip-path: inset(50%);\n  white-space: nowrap;\n  border: 0;\n}\n.desk__amount { display: inline; }\n\/* Focus personnalise sur tout ce qui est atteignable au clavier (D-I4). *\/\n.desk a:focus-visible,\n.desk button:focus-visible,\n.desk summary:focus-visible,\n.desk details:focus-visible {\n  outline: 2px solid var(--violet-soft);\n  outline-offset: 3px;\n  border-radius: 3px;\n}\n.desk__choice:focus-within,\n.desk__module:focus-within {\n  outline: 2px solid var(--violet-soft);\n  outline-offset: 3px;\n}\n\n\/* Regles toujours qualifiees : jamais presentees comme l'etat final apres options. *\/\n.desk__gauges-note,\n.desk__hint-label {\n  display: block;\n  margin: 10px 0 0;\n  font-family: var(--mono);\n  font-size: 13px;\n  font-weight: 700;\n  letter-spacing: .06em;\n  text-transform: uppercase;\n  color: var(--ink-3);\n}\n.desk__hint-label { margin: 0 0 4px; }\n.desk__hint span { display: block; }\n\/* Regles de base : dossier technique, ferme par defaut, place sous la decision.\n   La qualification \u00ab avant options \u00bb est portee par le resume lui-meme, donc visible\n   sans ouvrir le depliant. *\/\n.desk__base {\n  margin-top: 16px;\n  padding-top: 12px;\n  border-top: 1px solid var(--weave);\n}\n.desk__base-summary {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  min-height: 44px;\n  cursor: pointer;\n  font-family: var(--mono);\n  font-size: 13px;\n  font-weight: 700;\n  letter-spacing: .06em;\n  text-transform: uppercase;\n  color: var(--ink-3);\n}\n.desk__base-summary::after {\n  content: \"+\";\n  font-weight: 700;\n  color: var(--violet-soft);\n}\n.desk__base[open] .desk__base-summary::after { content: \"-\"; }\n.desk__base[open] .desk__base-summary { color: var(--ink-2); margin-bottom: 8px; }\n.desk__base-note {\n  margin: 8px 0 0;\n  font-size: 13px;\n  line-height: 1.5;\n  color: var(--ink-2);\n}\n\n\/* Supplements d'option : net en exergue, catalogue barre et economie quand le socle les donne. *\/\n.desk__module-price {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: baseline;\n  justify-content: flex-end;\n  gap: 4px 8px;\n  align-self: start;\n  text-align: right;\n}\n.desk__module-list {\n  font-size: 13px;\n  color: var(--ink-3);\n  font-variant-numeric: tabular-nums;\n  white-space: nowrap;\n}\n.desk__module-save {\n  display: inline-block;\n  padding: 2px 7px;\n  border-radius: 2px;\n  background: var(--amber-dim);\n  color: var(--amber);\n  font-size: 13px;\n  font-weight: 700;\n  font-variant-numeric: tabular-nums;\n  white-space: nowrap;\n}\n\n\/* Frais d'activation : contre le prix, au niveau typographique de l'economie (D-B1). *\/\n.desk__fees {\n  margin: 12px 0 0;\n  padding: 10px 12px;\n  border: 1px solid var(--rule);\n  border-left: 2px solid var(--amber);\n  border-radius: 3px;\n  background: rgba(242,196,90,.06);\n  font-size: 14px;\n  line-height: 1.5;\n  color: var(--ink);\n}\n\n\/* Revelation du pre-lancement : fiche, indicateurs, prix, economie, frais.\n   Opacite et translation seulement ; aucun controle n'est retarde ni desactive. *\/\n.desk__sheet.is-reveal::after { animation: desk-corner 900ms var(--ease-state) 200ms both; }\n\/* Le bloc de prix, l'economie, l'echeance et les frais d'activation ne sont JAMAIS\n   retardes ni rendus transparents : ils sont lisibles des l'arrivee, pendant que le\n   CTA est actionnable. Seul le roulement des chiffres du prix reste decoratif,\n   et il part toujours du prix catalogue, donc jamais d'un montant inferieur au prix du. *\/\n.desk__sheet.is-reveal .desk__price-block,\n.desk__sheet.is-reveal .desk__price-pay,\n.desk__sheet.is-reveal .desk__price-meta,\n.desk__sheet.is-reveal .desk__price-list,\n.desk__sheet.is-reveal .desk__price-save,\n.desk__sheet.is-reveal .desk__countdown,\n.desk__sheet.is-reveal .desk__fees {\n  animation: none;\n  opacity: 1;\n  transform: none;\n}\n@keyframes desk-corner {\n  0% { opacity: 0; }\n  40% { opacity: 1; }\n  100% { opacity: 1; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .desk__sheet.is-reveal .desk__sheet-head,\n  .desk__sheet.is-reveal .desk__line,\n  .desk__sheet.is-reveal .desk__base,\n  .desk__sheet.is-reveal .desk__price-block,\n  .desk__sheet.is-reveal .desk__price-save,\n  .desk__sheet.is-reveal .desk__countdown,\n  .desk__sheet.is-reveal .desk__fees {\n    animation: none !important;\n    opacity: 1 !important;\n    transform: none !important;\n  }\n}\n\n.desk__gauges-note + .desk__gauges { margin-top: 4px; }\n\n.desk__programme-details { display: none; }\n\n\/* Revision mobile 23\/10 : le poste devient un parcours compact, un choix par\n   ecran. Pas de masquage du prix, des economies, ni des frais avant l'action. *\/\n@media (max-width: 899px) {\n  .desk { --ticker-h: 121px; padding-bottom: calc(var(--ticker-h) + 16px); font-size: 14px; }\n  .desk__head { padding: 8px 16px; gap: 4px 10px; }\n  .desk__logo { height: 22px; width: 100px; }\n  .desk__signal { min-height: 26px; font-size: 11px; letter-spacing: .01em; }\n  .desk__rail { gap: 5px; }\n  .desk__rail span { margin-top: 4px; font-size: 11.5px; }\n  .desk__main { min-height: max(0px,calc(100svh - 73px)); max-width: 600px; padding: 12px 16px 16px; }\n  .desk__notices { min-height: 0; }\n  .desk__notice { margin-bottom: 8px; padding: 8px 10px; font-size: 13px; }\n  .desk:not([data-catalog-state]) .desk__notices, .desk[data-catalog-state=\"loading\"] .desk__notices { position: fixed; bottom: calc(var(--ticker-h) + 8px); left: 16px; right: 16px; z-index: 7; pointer-events: none; }\n  .desk__panel { padding-top: 0; }\n  .desk__tag { margin-bottom: 6px; font-size: 11px; letter-spacing: .08em; }\n  .desk__tag span { padding: 1px 5px; }\n  .desk__title { font-size: 27px; line-height: 1.1; margin-bottom: 12px; }\n  .desk__lead { font-size: 14px; line-height: 1.4; margin-bottom: 12px; }\n  [data-step=\"1\"] > .desk__lead { display: none; }\n  [data-step=\"3\"] { display: flex; flex-direction: column; }\n  [data-step=\"3\"] > .desk__lead { order: 1; margin-top: 12px; }\n  .desk__channels, .desk__tiles { gap: 8px; grid-template-columns: 1fr; }\n  .desk__channels { min-height: 280px; }\n  .desk__channels .desk__skeleton { min-height: 88px; }\n  .desk__choice, .desk__tile { padding: 10px 12px 10px 36px; min-height: 48px; }\n  .desk__choice-led { left: 12px; top: 15px; }\n  .desk__choice-name { font-size: 16px; line-height: 1.25; }\n  .desk__choice-desc { font-size: 13px; line-height: 1.35; margin-top: 4px; }\n  .desk__choice .desk__gauges { display: none; }\n  .desk__programme-details:not([hidden]) { display: block; }\n  .desk__programme-details h3 { margin: 16px 0 8px; font-size: 15px; }\n  .desk__gauges-note { margin-top: 4px; font-size: 12px; line-height: 1.2; letter-spacing: 0; text-transform: none; }\n  .desk__gauges { margin-top: 4px; gap: 3px 8px; }\n  .desk__gauge { padding: 3px 5px; gap: 2px; }\n  .desk__gauge b { font-size: 11px; letter-spacing: 0; text-transform: none; }\n  .desk__gauge span { font-size: 13px; }\n  .desk__tile { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1.35fr); gap: 6px 8px; align-items: center; }\n  .desk__tile-amount { font-size: 21px; white-space: normal; line-height: 1.2; }\n  .desk__tile-price { margin: 0; justify-content: flex-end; gap: 2px 6px; }\n  .desk__pay { font-size: 20px; }\n  .desk__list { font-size: 13px; }\n  .desk__save { font-size: 13px; padding: 1px 4px; }\n  .desk__hint { margin-top: 12px; font-size: 13px; }\n  .desk__group { margin-bottom: 12px; }\n  .desk__group legend { font-size: 16px; line-height: 1.3; padding-bottom: 8px; }\n  .desk__module { padding: 10px 10px 10px 34px; gap: 3px 8px; }\n  .desk__module-name { font-size: 14px; }\n  .desk__module-desc { font-size: 13px; line-height: 1.35; }\n  .desk__module-price { gap: 2px 6px; }\n  .desk__module-delta { font-size: 16px; }\n  .desk__module-save { font-size: 13px; padding: 1px 4px; }\n  .desk__module-state { display: none; }\n  .desk__panel--launch .desk__title { font-size: 27px; margin-bottom: 12px; }\n  .desk__sheet { padding: 12px; }\n  .desk__sheet-name { font-size: 18px; }\n  .desk__sheet-capital { font-size: 14px; }\n  .desk__sheet-head { gap: 4px 8px; padding-bottom: 8px; }\n  .desk__sheet dl { margin: 8px 0; }\n  .desk__line { grid-template-columns: 76px minmax(0,1fr); padding: 5px 0; gap: 4px 8px; }\n  .desk__line dt { font-size: 11px; letter-spacing: .04em; }\n  .desk__line dd { font-size: 13px; }\n  .desk__chip { padding: 2px 6px; font-size: 12px; }\n  .desk__price-block { margin-top: 8px; padding-top: 8px; }\n  .desk__price-label { font-size: 12px; letter-spacing: .04em; }\n  .desk__price-pay { font-size: 38px; }\n  .desk__price-meta { gap: 4px 8px; margin-top: 6px; }\n  .desk__price-list { font-size: 13px; }\n  .desk__price-save { padding: 3px 6px; font-size: 13px; }\n  .desk__fees { margin-top: 8px; padding: 6px 8px; font-size: 13px; line-height: 1.35; }\n  .desk__countdown { margin-top: 8px; font-size: 12px; letter-spacing: 0; }\n  .desk__base { margin-top: 10px; padding-top: 4px; }\n  .desk__edit { gap: 2px 12px; margin: 6px 0; }\n  .desk__edit button { min-width: 44px; }\n  .desk__ticker { grid-template-columns: minmax(0,1fr); grid-template-areas: \"price\" \"fees\" \"nav\"; gap: 6px; padding: 8px 16px calc(8px + env(safe-area-inset-bottom)); min-height: 121px; }\n  .desk__ticker-pack { display: none; }\n  .desk__ticker-price { grid-area: price; display: grid; grid-template-columns: auto minmax(0,1fr) auto; gap: 2px 8px; align-items: baseline; }\n  .desk__ticker-total { grid-area: auto; grid-column: 1; grid-row: 1; text-align: left; font-size: 23px; line-height: 1.2; }\n  .desk__ticker-meta { display: contents; }\n  .desk__ticker-strike { grid-column: 2; grid-row: 1; font-size: 13px; }\n  .desk__ticker-save { grid-column: 1 \/ -1; grid-row: 2; font-size: 13px; line-height: 1.4; }\n  .desk__ticker-code { grid-column: 3; grid-row: 1; justify-self: end; max-width: 104px; overflow-wrap: anywhere; font-size: 12px; letter-spacing: 0; padding: 0; border: 0; }\n  .desk__ticker-fees { padding: 0; margin: 0; border: 0; background: none; font-size: 13px; line-height: 1.35; }\n  .desk__btn, .desk__cta { min-height: 44px; padding: 10px 14px; font-size: 14px; }\n  .desk__ticker-nav .desk__btn--ghost { flex: 0 0 76px; }\n  .desk__trace-note { margin-top: 14px; font-size: 11px; }\n  .desk__legal-notice, .desk__legal, .desk__mentions { padding-left: 16px; padding-right: 16px; }\n  .desk :is(button,a,summary,label) { scroll-margin-block: 16px calc(var(--ticker-h) + 16px); touch-action: manipulation; }\n}\n@media (max-width: 899px) and (max-height: 500px) {\n  .desk { padding-bottom: 0; }\n  .desk__ticker { position: relative; }\n  .desk:not([data-catalog-state]) .desk__notices, .desk[data-catalog-state=\"loading\"] .desk__notices { position: static; }\n  .desk :is(button,a,summary,label) { scroll-margin-block: 16px; }\n}\n\n\/* Int\u00e9gration contenu seulement ; aucun gabarit remplac\u00e9. *\/\nbody:has(.desk){margin:0;background:#0a0910}.wp-site-blocks:has(.desk){padding:0;margin:0}.wp-site-blocks>.wp-block-post-content:has(.desk){margin:0}.desk__cart-open{min-height:44px;align-items:center}.desk__cart-open:not([hidden]){display:inline-flex}\n\n\/* P01c R2 : prix statiques, focus effectif et cibles 44x44. Aucun changement de typo. *\/\n.desk :is(button,a,summary,label) { min-width:44px; min-height:44px; }\n\/* L'animation porte UNIQUEMENT sur un encadrement d\u00e9coratif, jamais le contenant texte. *\/\n.desk__panel-frame::after {\n  content:\"\"; position:absolute; inset:-4px; border:1px solid transparent;\n  pointer-events:none; animation:desk-panel-frame 280ms var(--ease-state);\n}\n@keyframes desk-panel-frame { 50% { border-color:var(--violet-soft); } }\n\n<\/style>\n<div class=\"desk\" data-wgf-tunnel data-lp-id=\"configurateur-fr\" data-lp-family=\"tunnel\" data-lp-version=\"20261023-trading-desk-fr-v2\" data-origin=\"https:\/\/wegetfunded.com\" lang=\"fr\" data-price-state=\"loading\" data-promo-state=\"loading\">\n\n<canvas class=\"desk__trace\" data-desk-trace aria-hidden=\"true\"><\/canvas>\n\n<header class=\"desk__head\">\n  <img loading=\"lazy\" src=\"https:\/\/wegetfunded.com\/logos\/wgf-logo.svg\" alt=\"WeGetFunded\" class=\"desk__logo\" width=\"132\" height=\"24\" decoding=\"async\" onerror=\"this.replaceWith(Object.assign(document.createElement('strong'),{textContent:'WeGetFunded',className:'desk__logo desk__logo--text'}))\">\n  <p class=\"desk__signal\" data-desk-signal><span class=\"desk__led\" aria-hidden=\"true\"><\/span><span data-desk-signal-text>Mise sous tension du poste<\/span><\/p>\n  <ol class=\"desk__rail\" aria-label=\"\u00c9tapes\">\n    <li data-step-dot=\"1\" aria-current=\"step\"><i aria-hidden=\"true\"><\/i><span>Programme<\/span><\/li>\n    <li data-step-dot=\"2\"><i aria-hidden=\"true\"><\/i><span>Capital<\/span><\/li>\n    <li data-step-dot=\"3\"><i aria-hidden=\"true\"><\/i><span>Options<\/span><\/li>\n    <li data-step-dot=\"4\"><i aria-hidden=\"true\"><\/i><span>R\u00e9capitulatif<\/span><\/li>\n  <\/ol>\n<\/header>\n\n<main class=\"desk__main\">\n  <aside class=\"desk__notices\">\n    <p class=\"desk__notice\" data-catalog-status role=\"status\" aria-live=\"polite\">V\u00e9rification du catalogue en cours\u2026<\/p>\n    <p class=\"desk__notice\" data-entry-notice role=\"status\" aria-live=\"polite\" hidden><\/p>\n    <button type=\"button\" class=\"desk__btn desk__btn--ghost\" data-catalog-confirm hidden>J\u2019ai v\u00e9rifi\u00e9 ma s\u00e9lection et les tarifs<\/button>\n  <\/aside>\n\n  <section class=\"desk__panel\" data-step=\"1\" data-view-step=\"1\" aria-labelledby=\"desk-h1\">\n    <p class=\"desk__tag\"><span>01<\/span> Programme<\/p>\n    <h1 id=\"desk-h1\" class=\"desk__title\">Quel chemin vers le capital simul\u00e9 ?<\/h1>\n    <p class=\"desk__lead\">Choisissez votre programme, puis composez votre pack. Les conditions ci-dessous sont celles publi\u00e9es par le site.<\/p>\n    <div class=\"desk__channels\" role=\"radiogroup\" aria-label=\"Programme\" data-programs><\/div>\n    <details class=\"desk__more\"><summary>Ce que \u00ab simul\u00e9 \u00bb veut dire<\/summary><p>Vous tradez sur un compte de d\u00e9monstration aliment\u00e9 par WeGetFunded. Les profits sont simul\u00e9s ; les r\u00e9compenses vers\u00e9es, elles, sont r\u00e9elles et suivent le partage du programme. Aucune garantie de r\u00e9ussite ni de gain.<\/p><\/details>\n  <\/section>\n\n  <section class=\"desk__panel\" data-step=\"2\" aria-labelledby=\"desk-h2\" hidden>\n    <p class=\"desk__tag\"><span>02<\/span> Capital<\/p>\n    <h2 id=\"desk-h2\" class=\"desk__title\">Quel capital simul\u00e9 ?<\/h2>\n    <p class=\"desk__lead\">Choisissez parmi les capitaux actuellement propos\u00e9s pour ce programme.<\/p>\n    <div class=\"desk__tiles\" role=\"radiogroup\" aria-label=\"Capital\" data-capitals><\/div>\n    <p class=\"desk__hint\" data-capital-hint><\/p>\n    <details class=\"desk__more\"><summary>R\u00e8gles du programme, avant options<\/summary><p>R\u00e8gles de base. Les options peuvent les modifier : reportez-vous \u00e0 leur description et au configurateur du site.<\/p><div class=\"desk__rules\" data-rules><\/div><\/details>\n  <\/section>\n\n  <section class=\"desk__panel\" data-step=\"3\" aria-labelledby=\"desk-h3\" hidden>\n    <p class=\"desk__tag\"><span>03<\/span> Options<\/p>\n    <h2 id=\"desk-h3\" class=\"desk__title\">Des options, ou pas<\/h2>\n    <p class=\"desk__lead\" data-options-lead><\/p>\n    <p class=\"desk__hint\" data-option-warning hidden>Certaines options ne disposent pas de conditions compl\u00e8tes dans les donn\u00e9es publiques. Elles ne sont pas propos\u00e9es \u00e0 la s\u00e9lection dans ce tunnel.<\/p>\n    <div data-options><\/div>\n  <\/section>\n\n  <section class=\"desk__panel desk__panel--launch\" data-step=\"4\" aria-labelledby=\"desk-h4\" hidden>\n    <p class=\"desk__tag\"><span>04<\/span> Pr\u00e9-lancement<\/p>\n    <h2 id=\"desk-h4\" class=\"desk__title\">Votre challenge<\/h2>\n    <div class=\"desk__sheet\" data-recap><\/div>\n    <nav class=\"desk__edit\" aria-label=\"Modifier votre configuration\"><span>Modifier :<\/span><button type=\"button\" data-edit-step=\"1\" aria-label=\"Modifier le programme\">Programme<\/button><button type=\"button\" data-edit-step=\"2\" aria-label=\"Modifier le capital\">Capital<\/button><button type=\"button\" data-edit-step=\"3\" aria-label=\"Modifier les options\">Options<\/button><\/nav>\n    <p class=\"desk__cart-status\" id=\"desk-cart-status\" data-cart-status role=\"status\" aria-live=\"polite\">Votre pack sera ajout\u00e9 au panier, sans repasser par le configurateur du site.<\/p>\n    <a class=\"desk__cart-open\" data-cart-open href=\"https:\/\/wegetfunded.com\/fr\/cart\" hidden>V\u00e9rifier mon panier<\/a>\n  <\/section>\n\n  <noscript><p class=\"desk__hint\">Ce configurateur n\u00e9cessite JavaScript pour lire les tarifs et conditions actuels. Aucun tarif de secours n\u2019est affich\u00e9.<\/p><\/noscript>\n\n  <p class=\"desk__source\" data-source-controls hidden><button type=\"button\" data-catalog-refresh>Actualiser le catalogue<\/button><a href=\"https:\/\/wegetfunded.com\/fr#challenges\">Consulter le configurateur du site<\/a><\/p>\n  <p class=\"desk__trace-note\">Trac\u00e9 de fond d\u00e9coratif : aucune donn\u00e9e de march\u00e9.<\/p>\n<\/main>\n\n<footer class=\"desk__ticker\" data-bar>\n  <div class=\"desk__ticker-pack\">\n    <span class=\"desk__ticker-name\" data-bar-name>Votre challenge<\/span>\n    <span class=\"desk__ticker-variant\" data-bar-variant>Chargement du catalogue<\/span>\n  <\/div>\n  <div class=\"desk__ticker-price\">\n    <span class=\"desk__ticker-total\" data-bar-total data-price-pay>\u2026<\/span>\n    <span class=\"desk__ticker-meta\"><s class=\"desk__ticker-strike\" data-bar-strike data-price-list hidden><\/s><span class=\"desk__ticker-save\" data-bar-savings data-price-savings hidden><\/span><span class=\"desk__ticker-code\" data-bar-code hidden><\/span><\/span>\n  <\/div>\n  <p class=\"desk__ticker-fees\" data-bar-fees hidden><\/p>\n  <div class=\"desk__ticker-nav\">\n    <button type=\"button\" class=\"desk__btn desk__btn--ghost\" data-prev data-cta-prev hidden>Retour<\/button>\n    <button type=\"button\" class=\"desk__btn\" data-next data-cta-next disabled>Continuer<\/button>\n    <button type=\"button\" class=\"desk__cta\" data-wgf-lp-cta data-cta-cart data-cta-id=\"recap\" aria-disabled=\"true\" aria-describedby=\"desk-cart-status\" disabled hidden><span class=\"desk__cta-label\">Ajouter au panier<\/span><span class=\"desk__cta-sweep\" aria-hidden=\"true\"><\/span><\/button>\n  <\/div>\n<\/footer>\n\n<details class=\"desk__legal-notice\"><summary>Mentions l\u00e9gales<\/summary>\n\n<p>Les activit\u00e9s de trading sur cette plateforme sont ex\u00e9cut\u00e9es uniquement par WeGetFunded LTD. en utilisant des fonds virtuels dans un environnement simul\u00e9 et ne comportent aucun risque financier r\u00e9el ni trading avec de v\u00e9ritables instruments financiers. WeGetFunded LTD. est une soci\u00e9t\u00e9 enregistr\u00e9e conform\u00e9ment aux lois de Sainte-Lucie, avec le num\u00e9ro d&#x27;enregistrement 2025-00757, et a son si\u00e8ge social au rez-de-chauss\u00e9e, The Sotheby Building, Rodney Village, Rodney Bay, Gros-Islet, Sainte-Lucie. Le bien lou\u00e9 est un bureau situ\u00e9 au 24 Ketevan Tsamebuli Ave, Office 4, Tbilissi 0103, G\u00e9orgie. Le site web wegetfunded.com est exploit\u00e9 par WeGetFunded LTD.<\/p>\n\n\n<p>Divulgation l\u00e9gale : WeGetFunded Ltd. fournit un acc\u00e8s \u00e0 des programmes de trading simul\u00e9s con\u00e7us uniquement pour l&#x27;\u00e9valuation des comp\u00e9tences en trading et en gestion des risques. Toutes les transactions ont lieu dans un environnement de d\u00e9monstration utilisant du capital virtuel.<\/p>\n\n\n<p>Aucun fonds client \/ Aucun trading en direct : WeGetFunded n&#x27;est pas un courtier, un n\u00e9gociant, une bourse ou un conseiller en investissement, et n&#x27;accepte ni ne g\u00e8re les d\u00e9p\u00f4ts des clients. Les participants ne tradent pas d&#x27;actifs r\u00e9els et ne passent pas d&#x27;ordres de march\u00e9 en direct. Toute r\u00e9compense est bas\u00e9e sur la performance et d\u00e9riv\u00e9e uniquement des r\u00e9sultats d&#x27;\u00e9valuation. Seul le Programme Live, r\u00e9serv\u00e9 aux traders s\u00e9lectionn\u00e9s apr\u00e8s la phase financ\u00e9e, s&#x27;ex\u00e9cute sur du capital r\u00e9el fourni par WeGetFunded, selon ses propres conditions.<\/p>\n\n\n<p>Usage d&#x27;\u00e9valuation uniquement : Tout contenu, outil et service est fourni uniquement \u00e0 des fins d&#x27;\u00e9valuation et d&#x27;appr\u00e9ciation et ne doit pas \u00eatre interpr\u00e9t\u00e9 comme un conseil en investissement, une sollicitation ou une offre d&#x27;achat ou de vente de tout produit financier, cryptomonnaie ou d\u00e9riv\u00e9. Les participants sont encourag\u00e9s \u00e0 consulter des conseillers financiers, juridiques ou fiscaux ind\u00e9pendants avant de s&#x27;engager dans toute activit\u00e9 de trading en dehors de ce programme.<\/p>\n\n\n<p>Divulgation de performance hypoth\u00e9tique : R\u00e8gle CFTC 4.41 : Les r\u00e9sultats de trading simul\u00e9s ou hypoth\u00e9tiques pr\u00e9sentent des limites inh\u00e9rentes. Contrairement aux enregistrements de performance r\u00e9els, ils ne repr\u00e9sentent pas une activit\u00e9 de trading r\u00e9elle et peuvent \u00eatre con\u00e7us avec le b\u00e9n\u00e9fice du recul. Aucune d\u00e9claration n&#x27;est faite selon laquelle un compte atteindra, ou est susceptible d&#x27;atteindre, des profits ou des pertes similaires \u00e0 ceux pr\u00e9sent\u00e9s ou impliqu\u00e9s.<\/p>\n\n\n<p>Restrictions juridictionnelles : WeGetFunded Ltd. n&#x27;offre pas de services aux r\u00e9sidents des juridictions suivantes : Russie, Myanmar, Iran, Soudan, Syrie, Cor\u00e9e du Nord, Afghanistan, Albanie, Bi\u00e9lorussie, R\u00e9publique centrafricaine, Cuba, R\u00e9publique d\u00e9mocratique du Congo, \u00c9thiopie, Liban, Libye, Mali, Nicaragua, Somalie, Soudan du Sud, Ukraine, Venezuela, Y\u00e9men, Zimbabwe, Bangladesh.<\/p>\n\n\n<p>Avertissement sur les risques : Le trading sur les march\u00e9s de contrats \u00e0 terme, de d\u00e9riv\u00e9s et d&#x27;actifs num\u00e9riques comporte un risque substantiel de perte. Les performances pass\u00e9es ne pr\u00e9jugent pas des r\u00e9sultats futurs.<\/p>\n\n\n<p>Paiements et remboursements : Tous les frais d&#x27;\u00e9valuation pay\u00e9s sont strictement destin\u00e9s \u00e0 des fins d&#x27;\u00e9valuation et pour l&#x27;acc\u00e8s \u00e0 nos services d&#x27;\u00e9valuation.<\/p>\n\n\n<p>Pas un d\u00e9p\u00f4t | Pas assur\u00e9 FDIC | Peut perdre de la valeur<\/p>\n\n<\/details>\n<nav class=\"desk__legal\" aria-label=\"Informations l\u00e9gales\"><a href=\"\/fr\/legal\/privacy\">Confidentialit\u00e9<\/a><a href=\"\/fr\/legal\/terms\">Conditions g\u00e9n\u00e9rales<\/a><a href=\"\/fr\/legal\/risk-disclosure\">Risques<\/a><a href=\"\/fr\/legal\/cookies\">Cookies<\/a><\/nav>\n<p class=\"desk__mentions\">Capital simul\u00e9. R\u00e9compenses r\u00e9elles selon le partage du programme. Aucune garantie de gain. Catalogue et promotion revalid\u00e9s avant l\u2019ajout. <\/p>\n<\/div>\n\n<script data-wgf-module=\"catalogue.js\">\n\/* Adaptateur du catalogue public Next. Aucune donn\u00e9e tarifaire embarqu\u00e9e.\n   Le contrat public n'expose pas les exclusivit\u00e9s : les familles connues sont\n   conserv\u00e9es, toute famille nouvelle reste visible mais non s\u00e9lectionnable. *\/\n(function () {\n  'use strict';\n  function fail(reason) { throw new Error('catalog_' + reason); }\n  function id(value) { return typeof value === 'string' ? \/^[A-Za-z0-9_-]+$\/.test(value) : false; }\n  function text(value) { return typeof value === 'string' ? value.trim() : ''; }\n  function objectAt(source, key) {\n    var at = source.indexOf('\"' + key + '\":');\n    if (at < 0) { return null; }\n    var start = at + key.length + 3;\n    while (\/\\s\/.test(source[start] || 'x')) { start++; }\n    if (source[start] !== '{') { return null; }\n    var depth = 0, quote = false, escape = false;\n    for (var i = start; i < source.length; i++) {\n      var c = source[i];\n      if (quote) {\n        if (escape) { escape = false; }\n        else if (c === '\\\\') { escape = true; }\n        else if (c === '\"') { quote = false; }\n      } else if (c === '\"') { quote = true; }\n      else if (c === '{') { depth++; }\n      else if (c === '}') {\n        depth--;\n        if (!depth) { return JSON.parse(source.slice(start, i + 1)); }\n      }\n    }\n    return null;\n  }\n  function decode(html) {\n    var re = \/self\\.__next_f\\.push\\((\\[1,.*?\\])\\)<\\\/script>\/g, match, source = '';\n    while ((match = re.exec(html))) {\n      try { source += JSON.parse(match[1])[1]; } catch (e) { \/* sch\u00e9ma contr\u00f4l\u00e9 ensuite *\/ }\n    }\n    var catalog = objectAt(source, 'catalog'), challenge = objectAt(source, 'challenge');\n    if (!catalog || !challenge) { fail('missing'); }\n    return {catalog: catalog, challenge: challenge};\n  }\n  function euro(value) {\n    if (typeof value !== 'string' || !value.includes('\u20ac')) { return null; }\n    var n = Number(value.replace(\/[\\s\\u00a0\\u202f\u20ac]\/g, '').replace(',', '.'));\n    return Number.isFinite(n) ? (n >= 0 ? n : null) : null;\n  }\n  function family(optionId) {\n    if (optionId === '9010' || optionId === '100Split') { return 'split'; }\n    if (\/^extendedDD[1-9][0-9]*$\/.test(optionId)) { return 'edd'; }\n    if (optionId === 'oneDayPass') { return 'reg'; }\n    if (optionId === 'noConsistency') { return 'reg2'; }\n    if (optionId === 'otp') { return 'pay'; }\n    return null;\n  }\n  function ruleSummary(rules, ids) {\n    return rules.filter(function (r) { return ids.includes(r.id); }).map(function (r) {\n      var values = r.values.filter(function (v) { return v !== 'N\/A' ? !!v : false; });\n      values = values.filter(function (v, i) { return values.indexOf(v) === i; });\n      return values.length ? r.label + ' : ' + values.join(' puis ') + '.' : '';\n    }).filter(Boolean).join(' ');\n  }\n  function rulesFrom(meta, phases) {\n    var numeric = {profit_target:'profitTargetPercent', min_trading_days:'minTradingDays', daily_drawdown:'dailyDrawdownPercent', max_drawdown:'maxLossPercent', max_loss:'maxLossPercent'};\n    return meta.rules.map(function (r) {\n      if (!id(r.id) || !text(r.label) || !Array.isArray(r.values)) { fail('rules'); }\n      return {id:r.id, label:r.label, tooltip:text(r.tooltip), values:r.values.map(function (v, i) {\n        if (typeof v !== 'string') { fail('rule_value'); }\n        var field = numeric[r.id], phase = phases[i];\n        if (!field || !phase || v === 'N\/A') { return v; }\n        var n = phase[field];\n        if (n == null) { return v; }\n        if (!Number.isFinite(n) || n < 0) { fail('phase_value'); }\n        return field === 'minTradingDays' ? String(n) : new Intl.NumberFormat('fr-FR', {maximumFractionDigits:4}).format(n * 100) + ' %';\n      })};\n    });\n  }\n  function normalize(raw, dict) {\n    if (!raw || !dict || !Array.isArray(raw.categories) || !Array.isArray(raw.options) || !Array.isArray(dict.categories)) { fail('shape'); }\n    if (!raw.categories.length) { fail('empty'); }\n    var prices = Object.create(null), programs = Object.create(null), warnings = [];\n    raw.options.forEach(function (o) {\n      if (!id(o.optionId) || !text(o.uuid) || !Number.isFinite(o.priceMultiplier) || o.priceMultiplier < 0 || !Number.isFinite(o.flatPrice) || o.flatPrice < 0 || prices[o.optionId]) { fail('option_invalid'); }\n      prices[o.optionId] = Object.assign({}, o);\n    });\n    var described = new Set();\n    raw.categories.forEach(function (c) {\n      if (!id(c.categoryId) || !id(c.type) || programs[c.categoryId] || !Array.isArray(c.capitals) || !Array.isArray(c.phases)) { fail('program_shape'); }\n      var meta = dict.categories.find(function (m) { return m.id === c.categoryId; });\n      if (!meta || !text(meta.label) || !Array.isArray(meta.options) || !Array.isArray(meta.rules) || !Array.isArray(meta.phases)) { fail('program_metadata'); }\n      if (!c.capitals.length) { return; } \/\/ programme retir\u00e9 de la vente\n      var seen = new Set();\n      var capitals = c.capitals.map(function (cap) {\n        if (!id(cap.capitalId) || seen.has(cap.capitalId) || !text(cap.uuid) || !Number.isFinite(cap.price) || cap.price <= 0 || !Number.isFinite(cap.amount) || cap.amount <= 0) { fail('price_invalid'); }\n        seen.add(cap.capitalId); return Object.assign({}, cap);\n      });\n      var rules = rulesFrom(meta, c.phases), allowed = Object.create(null), groups = [];\n      var groupMap = Object.create(null), activationRule = rules.find(function (r) { return r.id === 'activation_fee'; });\n      var activation = activationRule ? euro(activationRule.values[activationRule.values.length - 1]) : null;\n      meta.options.forEach(function (o) {\n        if (!id(o.id) || !text(o.label)) { fail('option_metadata'); }\n        described.add(o.id);\n        if (!prices[o.id]) { return; } \/\/ supprim\u00e9e c\u00f4t\u00e9 tarifaire : jamais trait\u00e9e comme gratuite\n        if (allowed[o.id]) { fail('option_duplicate'); }\n        var group = family(o.id), enabled = group !== null;\n        var value = Object.assign({}, prices[o.id], {label:o.label, description:text(o.tooltip), group:group, enabled:enabled});\n        if (group === 'pay') {\n          value.description = text(dict.activationMode ? dict.activationMode.otpDescription : '');\n          if (!value.description || activation === null) { value.enabled = false; }\n        }\n        allowed[o.id] = value;\n        var key = group || 'unknown_' + o.id;\n        if (!groupMap[key]) {\n          var labels = {split:'Partage des profits simul\u00e9s', edd:text(dict.extendedDrawdown ? dict.extendedDrawdown.title : ''), reg:'R\u00e9gularit\u00e9', reg2:'Coh\u00e9rence', pay:activationRule ? activationRule.label : ''};\n          var defaults = {split:['profit_split'], edd:['max_loss','daily_drawdown','max_drawdown'], reg:['min_trading_days','consistency'], reg2:['consistency'], pay:['activation_fee']};\n          groupMap[key] = {id:key, name:group || key, label:labels[group] || o.label, description:enabled ? ruleSummary(rules, defaults[group] || []) : 'Compatibilit\u00e9 non document\u00e9e dans ce tunnel. Consultez le configurateur du site.', options:[]};\n        }\n        groupMap[key].options.push(value);\n      });\n      var order = ['split','edd','reg','reg2','pay'];\n      Object.keys(groupMap).sort(function (a,b) {\n        var ai = order.indexOf(a), bi = order.indexOf(b);\n        return (ai < 0 ? order.length : ai) - (bi < 0 ? order.length : bi);\n      }).forEach(function (k) { groups.push(groupMap[k]); });\n      var label = \/^(1|2) \u00c9tape\/.test(meta.label) ? 'Challenge ' + meta.label : \/^instant funded$\/i.test(meta.label) ? 'Instant Funded' : meta.label;\n      programs[c.categoryId] = Object.assign({}, c, {label:label, capitals:capitals, rules:rules, phaseLabels:meta.phases.slice(), options:allowed, groups:groups, activation:activation, activationMode:dict.activationMode || {}, description:ruleSummary(rules,['profit_target','max_loss','max_drawdown']) || ruleSummary(rules,['daily_drawdown','profit_split'])});\n    });\n    if (!Object.keys(programs).length) { fail('empty'); }\n    Object.keys(prices).forEach(function (key) { if (!described.has(key)) { warnings.push(key); } });\n    return {programs:programs, options:prices, warnings:warnings, activation:programs.oneStep ? programs.oneStep.activation : null};\n  }\n  function fromHTML(html) { var data = decode(html); return normalize(data.catalog, data.challenge); }\n  function reconcile(catalog, state) {\n    var ids = Object.keys(catalog.programs);\n    var programme = catalog.programs[state.programme] ? state.programme : ids[0];\n    var p = catalog.programs[programme];\n    var capital = p.capitals.find(function (c) { return c.capitalId === state.capital; }) || p.capitals.reduce(function (smallest, c) { return c.amount < smallest.amount ? c : smallest; });\n    var occupied = new Set();\n    var options = (state.options || []).filter(function (key) {\n      var o = p.options[key];\n      if (!o || !o.enabled || occupied.has(o.group)) { return false; }\n      occupied.add(o.group); return true;\n    });\n    return {programme:programme, capital:capital.capitalId, options:options};\n  }\n  function selectedOptions(program, ids) {\n    var seen = new Set();\n    return ids.map(function (key) {\n      var o = program.options[key];\n      if (!o || !o.enabled || seen.has(o.group)) { fail('selection_invalid'); }\n      seen.add(o.group); return o;\n    });\n  }\n  var api = {objectAt:objectAt, decode:decode, normalize:normalize, fromHTML:fromHTML, reconcile:reconcile, selectedOptions:selectedOptions, ruleSummary:ruleSummary};\n  if (typeof module !== 'undefined') { module.exports = api; }\n  else { window.WGFCatalogue = api; }\n})();\n\n<\/script>\n<script data-wgf-module=\"tunnel.js\">\n\/* Moteur de prix et promotion personnelle du prototype local. Aucun panier \u00e9crit.\n   applies \/ validPromo \/ discounted restent identiques au runtime LP partag\u00e9.\n   Les donn\u00e9es m\u00e9tier sont charg\u00e9es par catalogue.js, l'interface par interface.js. *\/\n(function () {\n  'use strict';\n  var source = typeof module !== 'undefined' ? require('.\/catalogue.js') : window.WGFCatalogue;\n  function round(n) { return Math.round(n * 100) \/ 100; }\n  function applies(p, product, type) {\n    if (!p) { return false; }\n    if (!Array.isArray(p.scopes)) { return false; }\n    if (p.endsAt) {\n      var end = Date.parse(p.endsAt);\n      if (!Number.isFinite(end) || end <= Date.now()) { return false; }\n    }\n    return !p.scopes.length || p.scopes.some(function (s) {\n      return s.challengeUuid !== null ? s.challengeUuid === product.uuid : s.challengeType === type;\n    });\n  }\n  function validPromo(p) {\n    if (!p) { return null; }\n    if (typeof p.code !== 'string' || !p.code.trim() || p.code.length > 128) { return null; }\n    if (!Number.isFinite(p.discountPercent) || p.discountPercent < 0 || p.discountPercent > 1) { return null; }\n    if (p.discountAmount != null) {\n      if (!Number.isFinite(p.discountAmount) || p.discountAmount < 0) { return null; }\n    }\n    if (!Array.isArray(p.scopes)) { return null; }\n    return p;\n  }\n  function discounted(price, flat, promo) {\n    if (!promo) { return price; }\n    return round(Math.max(0, Math.max(0, price - flat) * (1 - promo.discountPercent) - (promo.discountAmount || 0))) + flat;\n  }\n  function normalizePromoCode(value) {\n    if (typeof value !== 'string') { return ''; }\n    var code = value.trim().toUpperCase();\n    return \/^[A-Z0-9._-]{1,64}$\/.test(code) ? code : '';\n  }\n  function promoCookie(cookies) {\n    var item = String(cookies || '').split(';').map(function (s) { return s.trim(); }).find(function (s) { return s.indexOf('wgf_promo_code=') === 0; });\n    if (!item) { return ''; }\n    try { return normalizePromoCode(decodeURIComponent(item.slice('wgf_promo_code='.length))); } catch (e) { return ''; }\n  }\n  function currentPromo(p) {\n    if (!validPromo(p)) { return null; }\n    if (p.scopes.some(function (s) {\n      if (!s || typeof s !== 'object') { return true; }\n      return s.challengeUuid === null ? typeof s.challengeType !== 'string' : typeof s.challengeUuid !== 'string';\n    })) { return null; }\n    if (p.endsAt) {\n      var end = Date.parse(p.endsAt);\n      if (!Number.isFinite(end) || end <= Date.now()) { return null; }\n    }\n    return p;\n  }\n  function resolveVisitorPromo(search, cookies, validate) {\n    var params = new URLSearchParams(search);\n    var linked = normalizePromoCode(params.has('promo') ? params.get('promo') : params.get('code'));\n    var saved = promoCookie(cookies);\n    function checked(code) {\n      if (!code) { return Promise.resolve(null); }\n      return Promise.resolve().then(function () { return validate(code); }).then(function (p) {\n        return currentPromo(p) ? (normalizePromoCode(p.code) === code ? p : null) : null;\n      });\n    }\n    return checked(linked).then(function (p) {\n      return p || saved === linked ? p : checked(saved);\n    }).catch(function () { return null; });\n  }\n  \/* Avantages du code, au format du panier du site : challenge offert (identique \u00e0 l'achat ou\n     challenge pr\u00e9cis, nomm\u00e9 par le moteur ou d\u00e9crit par le catalogue) et option offerte.\n     context (facultatif) : challenge(uuid, type, coins), option(uuid), chosen(uuid). *\/\n  function giftLabels(p, context) {\n    if (!currentPromo(p) || !Array.isArray(p.rewards)) { return []; }\n    var ctx = context || {};\n    function named(v) { return typeof v === 'string' ? v.trim() : ''; }\n    function count(n) { return Number.isInteger(n) ? n >= 1 : false; }\n    function ask(name, a, b, c) { return typeof ctx[name] === 'function' ? named(ctx[name](a, b, c)) : ''; }\n    return p.rewards.map(function (r) {\n      if (!r || typeof r !== 'object') { return ''; }\n      if (r.rewardType === 'FREE_OPTION') {\n        var option = named(r.optionUuid) ? (named(r.optionName) || ask('option', r.optionUuid)) : '';\n        if (!option) { return ''; }\n        return optionLabel(option, typeof ctx.chosen === 'function' ? ctx.chosen(r.optionUuid) === true : false);\n      }\n      if (r.rewardType !== 'FREE_CHALLENGE' || !count(r.buyQuantity) || !count(r.freeQuantity)) { return ''; }\n      if (r.targetMode === 'MIRROR_PURCHASED') { return challengeLabel(r.buyQuantity, r.freeQuantity, null); }\n      if (r.targetMode !== 'SPECIFIC' || !named(r.challengeUuid)) { return ''; }\n      var target = named(r.challengeName) || ask('challenge', r.challengeUuid, r.challengeType, r.challengeCoins);\n      return target ? challengeLabel(r.buyQuantity, r.freeQuantity, target) : '';\n    }).filter(function (label) { return label.length > 0; });\n  }\n  \/* Libell\u00e9s des avantages : seule partie de ce module \u00e0 traduire. *\/\n  function challengeLabel(buy, free, target) {\n    var bought = buy + (buy === 1 ? ' challenge achet\u00e9' : ' challenges achet\u00e9s');\n    var gift = free + (free === 1 ? ' challenge offert' : ' challenges offerts');\n    return 'Pour ' + bought + ' : ' + gift + ' (' + (target === null ? 'identique au challenge achet\u00e9' : target) + ').';\n  }\n  function optionLabel(option, chosen) {\n    return chosen ? 'Option ' + option + ' offerte avec ce code.' : 'Option ' + option + ' offerte avec ce code : ajoutez-la \u00e0 votre challenge pour en profiter.';\n  }\n  \/* Options offertes par le code (FREE_OPTION) : le panier du site les retire du prix de l'article\n     quand le code s'applique au challenge (WGFEVO-68). M\u00eame r\u00e8gle ici, pour afficher le m\u00eame total. *\/\n  function offeredOptionUuids(p) {\n    if (!currentPromo(p) || !Array.isArray(p.rewards)) { return []; }\n    return p.rewards.filter(function (r) {\n      return r ? (r.rewardType === 'FREE_OPTION' ? (typeof r.optionUuid === 'string' ? r.optionUuid.length > 0 : false) : false) : false;\n    }).map(function (r) { return r.optionUuid; });\n  }\n  function payableOptions(options, applied) {\n    var offered = applied ? offeredOptionUuids(applied) : [];\n    if (!offered.length) { return options; }\n    return options.filter(function (o) { return offered.indexOf(o.uuid) < 0; });\n  }\n  function catalogUnitPrice(base, options) {\n    var mult = 0, flat = 0;\n    options.forEach(function (o) { mult += o.priceMultiplier; flat += o.flatPrice; });\n    return {price: round(base * (1 + mult)) + flat, flat: flat};\n  }\n  var api = {round:round, applies:applies, validPromo:validPromo, discounted:discounted, catalogUnitPrice:catalogUnitPrice, objectAt:source.objectAt, catalogueFromHTML:source.fromHTML, normalizePromoCode:normalizePromoCode, promoCookie:promoCookie, resolveVisitorPromo:resolveVisitorPromo, giftLabels:giftLabels, offeredOptionUuids:offeredOptionUuids, payableOptions:payableOptions};\n  if (typeof module !== 'undefined') { module.exports = api; }\n  else { window.WGFTunnel = api; }\n})();\n\n<\/script>\n<script data-wgf-module=\"preselection.js\">\n\/* Param\u00e8tres d'entr\u00e9e : choix valid\u00e9s contre le catalogue, jamais prix ou \u00e9tape impos\u00e9s.\n   options absent = choix \u00e0 faire ; options= = choix explicite sans suppl\u00e9ment. *\/\n(function () {\n  'use strict';\n  var source = typeof module !== 'undefined' ? require('.\/catalogue.js') : window.WGFCatalogue;\n  function resolve(catalog, search) {\n    var params = new URLSearchParams(search), errors = [];\n    var selection = source.reconcile(catalog, {programme:null,capital:null,options:[]});\n    var complete = {programme:false,capital:false,options:false};\n    var provided = {programme:params.has('challengeType'),capital:params.has('capital'),options:params.has('options')};\n    var aliases = {one_step:'unlimited',two_step:'standard'};\n    var sub = 1;\n    function issue(field, message) { errors.push({field:field,message:message}); }\n    function single(key) { return params.getAll(key).length === 1; }\n    if (!provided.programme) {\n      return {selection:selection,complete:complete,provided:provided,step:1,sub:1,errors:errors};\n    }\n    var rawType = params.get('challengeType');\n    var programs = Object.keys(catalog.programs).filter(function (key) { return catalog.programs[key].type === rawType; });\n    if (!programs.length ? Object.prototype.hasOwnProperty.call(aliases,rawType) : false) {\n      programs = Object.keys(catalog.programs).filter(function (key) { return catalog.programs[key].type === aliases[rawType]; });\n    }\n    if (!single('challengeType') || programs.length !== 1) {\n      issue('programme','Le programme indiqu\u00e9 dans ce lien est inconnu ou ambigu. Choisissez un programme.');\n      return {selection:selection,complete:complete,provided:provided,step:1,sub:1,errors:errors};\n    }\n    selection = source.reconcile(catalog,{programme:programs[0],capital:null,options:[]});\n    complete.programme = true;\n    var program = catalog.programs[selection.programme];\n    if (provided.capital) {\n      var rawCapital = params.get('capital'), amount = Number(rawCapital);\n      var capitals = program.capitals.filter(function (c) { return c.amount === amount; });\n      if (!single('capital') || !\/^[1-9][0-9]*$\/.test(rawCapital) || !Number.isSafeInteger(amount) || capitals.length !== 1) {\n        issue('capital','Le capital indiqu\u00e9 dans ce lien n\u2019est pas disponible pour ce programme. Choisissez un capital.');\n      } else { selection.capital = capitals[0].capitalId; complete.capital = true; }\n    }\n    if (provided.options) {\n      var rawOptions = params.get('options'), ids = rawOptions === '' ? [] : rawOptions.split(',').map(function (id) { return id.trim(); });\n      if (!single('options') || rawOptions.length > 4096) {\n        issue('options','Les options de ce lien sont ambigu\u00ebs. V\u00e9rifiez les options souhait\u00e9es.');\n      } else {\n        var seen = new Set(), members = Object.create(null), invalidGroups = new Set();\n        ids.forEach(function (id) {\n          var option = program.options[id];\n          if (!id || seen.has(id)) { issue('options','Le lien r\u00e9p\u00e8te une option ou contient une valeur vide. V\u00e9rifiez les options.'); return; }\n          seen.add(id);\n          if (!option || !option.enabled) {\n            issue('options','Une option du lien est indisponible ou sa compatibilit\u00e9 n\u2019est pas document\u00e9e. V\u00e9rifiez les options.'); return;\n          }\n          if (members[option.group]) {\n            invalidGroups.add(option.group);\n            issue('options','Le lien combine des options incompatibles. Choisissez une seule option dans le groupe concern\u00e9.');\n          } else { members[option.group] = id; }\n        });\n        selection.options = Object.keys(members).filter(function (group) { return !invalidGroups.has(group); }).map(function (group) { return members[group]; });\n        if (invalidGroups.size) {\n          sub = program.groups.findIndex(function (g) { return invalidGroups.has(g.id); }) + 1;\n        }\n      }\n      complete.options = !errors.some(function (e) { return e.field === 'options'; });\n    } else { complete.options = program.groups.length === 0; }\n    var step = !complete.capital ? 2 : !complete.options ? 3 : 4;\n    return {selection:selection,complete:complete,provided:provided,step:step,sub:Math.max(1,sub),errors:errors};\n  }\n  var api = {resolve:resolve};\n  if (typeof module !== 'undefined') { module.exports = api; }\n  else { window.WGFPrefill = api; }\n})();\n\n<\/script>\n<script data-wgf-module=\"panier.js\">\n\/* Adaptateur du stockage natif, autoris\u00e9 par Adel. Prix catalogue non remis\u00e9 :\n   le panier Next applique lui-m\u00eame le code personnel. Aucune requ\u00eate de paiement. *\/\n(function () {\n  'use strict';\n  var C = typeof module !== 'undefined' ? require('.\/catalogue.js') : window.WGFCatalogue;\n  var E = typeof module !== 'undefined' ? require('.\/tunnel.js') : window.WGFTunnel;\n  var KEYS = ['wgf_cart_id','wgf_cart_promo','wgf_cart'];\n  function fail(code) { throw new Error(code); }\n  function uuid(s) { return typeof s === 'string' ? \/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$\/i.test(s) : false; }\n  function nonnegative(n) { return typeof n === 'number' ? (Number.isFinite(n) ? n >= 0 : false) : false; }\n  function size(n) { return n >= 1e6 ? String(Number((n\/1e6).toFixed(2)))+'M' : n >= 1e3 ? String(Number((n\/1e3).toFixed(2)))+'K' : String(Math.round(n)); }\n  function supported(origin) { return origin === 'https:\/\/wegetfunded.com'; }\n  function build(catalog, selection) {\n    var p = catalog.programs[selection.programme];\n    if (!p || !['unlimited','standard','instant_funded'].includes(p.type)) { fail('cart_selection'); }\n    var capital = p.capitals.find(function(c) { return c.capitalId === selection.capital; });\n    if (!capital || !uuid(capital.uuid)) { fail('cart_selection'); }\n    var options = C.selectedOptions(p, selection.options);\n    if (options.some(function(o) { return !uuid(o.uuid); })) { fail('cart_selection'); }\n    var ids = options.map(function(o) { return o.optionId; }).sort();\n    var amount = E.catalogUnitPrice(capital.price, options);\n    if (!nonnegative(amount.price) || !nonnegative(amount.flat)) { fail('cart_selection'); }\n    var item = {id:capital.uuid+(ids.length ? '|'+ids.join(',') : ''), name:p.label+' \u00b7 '+size(capital.amount), price:amount.price, quantity:1,\n      challengeUuid:capital.uuid, challengeType:p.type, optionUuids:options.map(function(o) { return o.uuid; }), brokerName:'mt5', amount:capital.amount, flatPrice:amount.flat};\n    if (options.length) { item.variant=options.map(function(o) { return o.label; }).join(' \u00b7 '); }\n    return item;\n  }\n  function validateItems(items) {\n    if (!Array.isArray(items)) { fail('cart_corrupt'); }\n    var ids = new Set();\n    items.forEach(function(x) {\n      if (!x || Array.isArray(x) || typeof x !== 'object' || typeof x.id !== 'string' || !x.id || typeof x.name !== 'string' || !x.name || !nonnegative(x.price) || !Number.isSafeInteger(x.quantity) || x.quantity < 1 || ids.has(x.id)) { fail('cart_corrupt'); }\n      ['image','variant','challengeUuid','challengeType','brokerName'].forEach(function(k) { if (x[k] !== undefined ? typeof x[k] !== 'string' : false) { fail('cart_corrupt'); } });\n      ['freeTrial','contest'].forEach(function(k) { if (x[k] !== undefined ? typeof x[k] !== 'boolean' : false) { fail('cart_corrupt'); } });\n      ['amount','flatPrice'].forEach(function(k) { if (x[k] !== undefined ? !nonnegative(x[k]) : false) { fail('cart_corrupt'); } });\n      if (x.optionUuids !== undefined) { if (!Array.isArray(x.optionUuids) || x.optionUuids.some(function(s) { return typeof s !== 'string'; })) { fail('cart_corrupt'); } }\n      ids.add(x.id);\n    });\n    return items;\n  }\n  function snapshot(storage) {\n    var raw={};\n    KEYS.forEach(function(k) { raw[k]=storage.getItem(k); });\n    var items;\n    try { items=raw.wgf_cart === null ? [] : JSON.parse(raw.wgf_cart); } catch(e) { fail('cart_corrupt'); }\n    return {raw:raw, items:validateItems(items)};\n  }\n  function equalOptions(a,b) { return JSON.stringify((a||[]).slice().sort()) === JSON.stringify((b||[]).slice().sort()); }\n  function prepare(before, item, promoCode, newId) {\n    validateItems([item]);\n    if (promoCode !== E.normalizePromoCode(promoCode)) { fail('cart_promo'); }\n    var items=before.items.map(function(x) { return Object.assign(Object.create(null),x); });\n    if (items.some(function(x) { return x.freeTrial === true; })) { fail('cart_free_trial'); }\n    var existing=items.find(function(x) { return x.id === item.id; });\n    if (existing) {\n      if (existing.contest || existing.price !== item.price || (existing.flatPrice||0) !== item.flatPrice || existing.challengeUuid !== item.challengeUuid || existing.challengeType !== item.challengeType || existing.amount !== item.amount || !equalOptions(existing.optionUuids,item.optionUuids)) { fail('cart_existing_changed'); }\n      if (!Number.isSafeInteger(existing.quantity+1)) { fail('cart_corrupt'); }\n      existing.quantity++;\n    } else { items.push(item); }\n    var cartId=before.raw.wgf_cart_id || newId();\n    if (!uuid(cartId)) { fail('cart_id_invalid'); }\n    return {before:before.raw, after:{wgf_cart_id:cartId,wgf_cart_promo:promoCode||null,wgf_cart:JSON.stringify(items)}, cartId:cartId, item:item, items:items, code:promoCode};\n  }\n  function store(storage,key,value) { if(value===null) { storage.removeItem(key); } else { storage.setItem(key,value); } }\n  function commit(storage,doc,origin,plan) {\n    if (!supported(origin)) { fail('cart_origin'); }\n    var cookieBefore=E.promoCookie(doc.cookie), written=[], cookieTouched=false;\n    KEYS.forEach(function(k) { if(storage.getItem(k)!==plan.before[k]) { fail('cart_concurrent'); } });\n    function cookie(code) { doc.cookie='wgf_promo_code='+encodeURIComponent(code)+'; Path=\/; Max-Age='+(code?'604800':'0')+'; SameSite=Lax; Secure'; }\n    try {\n      KEYS.forEach(function(k) {\n        if(storage.getItem(k)!==plan.before[k]) { fail('cart_concurrent'); }\n        written.push(k);store(storage,k,plan.after[k]);\n        if(storage.getItem(k)!==plan.after[k]) { fail('cart_storage'); }\n      });\n      if (cookieBefore !== plan.code) { cookieTouched=true;cookie(plan.code); }\n      if (E.promoCookie(doc.cookie)!==plan.code) { fail('cart_cookie'); }\n      KEYS.forEach(function(k) { if(storage.getItem(k)!==plan.after[k]) { fail('cart_concurrent'); } });\n    } catch(e) {\n      \/\/ Retour arri\u00e8re seulement sur nos propres valeurs, jamais celles d'un autre onglet.\n      var rollback=true;\n      written.reverse().forEach(function(k) {\n        try { if(storage.getItem(k)===plan.after[k]) { store(storage,k,plan.before[k]); } else if(storage.getItem(k)!==plan.before[k]) { rollback=false; } }\n        catch(ignore) { rollback=false; }\n      });\n      if(cookieTouched) { try { if(E.promoCookie(doc.cookie)===plan.code) { cookie(cookieBefore); } } catch(ignore) { rollback=false; } }\n      if (!rollback) { fail('cart_uncertain'); }\n      throw e;\n    }\n    return {cartId:plan.cartId,item:plan.item};\n  }\n  function destination(origin,search) {\n    if(!supported(origin)) { fail('cart_origin'); }\n    var u=new URL('\/fr\/cart',origin), params=new URLSearchParams(search);\n    ['gclid','gbraid','wbraid','gclsrc','msclkid','fbclid','ttclid','utm_source','utm_medium','utm_campaign','utm_term','utm_content','utm_id','ref'].forEach(function(k) { if(params.has(k)) { u.searchParams.set(k,params.get(k)); } });\n    return u.href;\n  }\n  var api={build:build,snapshot:snapshot,prepare:prepare,commit:commit,supported:supported,destination:destination,size:size};\n  if(typeof module !== 'undefined') { module.exports=api; } else { window.WGFPanier=api; }\n})();\n\n<\/script>\n<script data-wgf-module=\"mesure.js\">\n\/* Mesure au format du front (relev\u00e9 du code en ligne le 25\/09\/2026, accord d'Adel \u00ab P1 : je valide \u00bb).\n   R\u00e9plique track() de l'application : consentement isConsentGranted, enrichissement (wgf_attr, _fbp,\n   _ga, session GA4, wgf_aid, page), event_id v4, _destinations du catalogue, capture PostHog, puis\n   dataLayer {event, event_id, ...props aplaties}. C\u00f4t\u00e9 serveur, les destinations PostHog \u00ab Meta CAPI,\n   catalogue WGF \u00bb et \u00ab GA4 Measurement Protocol \u00bb relaient selon _destinations ; c\u00f4t\u00e9 navigateur, GTM\n   d\u00e9clenche le pixel avec eventID = event_id (d\u00e9duplication).\n   Aucune esperluette ni fermeture de balise : WordPress les r\u00e9\u00e9crirait. *\/\n(function () {\n  'use strict';\n  var GA4_ID = 'G-GC003WWBE5';\n  \/* Catalogue du front, pour les seuls \u00e9v\u00e9nements \u00e9mis ici. *\/\n  var DESTINATIONS = {challenge_configurator_viewed: ['meta'], challenge_configured: ['meta'], cart_item_added: ['meta', 'ga4']};\n  var REQUIRES = {meta: ['event_id', 'fbp|fbc'], ga4: ['ga_client_id']};\n  var ATTR_KEYS = ['fbclid', 'fbclid_captured_at', 'fbc', 'fbp', 'gclid', 'wbraid', 'gbraid', 'ttclid', 'msclkid', 'li_fat_id',\n    'ga_client_id', 'ga_session_id', 'affiliation_code'];\n  var FAMILIES = ['standard', 'unlimited', 'instant_funded', 'funded', 'funded_standard', 'funded_unlimited', 'concours'];\n  var URL_IDS = {'9010': 'split_90_10', '100Split': 'split_100', oneDayPass: 'one_day_pass', noConsistency: 'no_consistency', otp: 'otp',\n    extendedDD1: 'extended_dd_1', extendedDD2: 'extended_dd_2', extendedDD3: 'extended_dd_3'};\n\n  function cookieList(raw) {\n    return String(raw || '').split('; ').filter(function (c) { return c.indexOf('=') > 0; }).map(function (c) {\n      var i = c.indexOf('='), v = c.slice(i + 1);\n      try { v = decodeURIComponent(v); } catch (e) { \/* valeur brute *\/ }\n      return {name: c.slice(0, i).trim(), value: v};\n    });\n  }\n  function cookie(raw, name) {\n    var hit = cookieList(raw).filter(function (c) { return c.name === name; })[0];\n    return hit ? hit.value : null;\n  }\n  function isConsentGranted(v) { return !v || v.trim().toLowerCase() === 'granted'; }\n  function parseAttr(v) {\n    if (!v) { return {}; }\n    try { var o = JSON.parse(v); if (o) { if (typeof o === 'object') { if (!Array.isArray(o)) { return o; } } } } catch (e) { \/* vide *\/ }\n    return {};\n  }\n  function normalizeGaClientId(v) { if (!v) { return null; } var m = \/^GA\\d+\\.\\d+\\.(.+)$\/.exec(v); return m ? m[1] : v; }\n  function gaSessionCookie(raw) {\n    var exact = '_ga_' + GA4_ID.replace(\/^G-\/i, ''), first = null, list = cookieList(raw);\n    for (var i = 0; i < list.length; i++) {\n      if (list[i].name === exact) { return list[i].value; }\n      if (first === null) { if (list[i].name.indexOf('_ga_') === 0) { first = list[i].value; } }\n    }\n    return first;\n  }\n  function extractGaSessionId(v) { if (!v) { return null; } var m = \/^GS\\d+\\.\\d+\\.s?(\\d+)\/.exec(v); return m ? m[1] : (\/^\\d+$\/.test(v) ? v : null); }\n  function uuidV4(cryptoObj) {\n    var b = new Array(16), i, fort = false;\n    if (cryptoObj) { if (typeof cryptoObj.getRandomValues === 'function') { b = cryptoObj.getRandomValues(new Uint8Array(16)); fort = true; } }\n    if (!fort) { for (i = 0; i < 16; i++) { b[i] = Math.floor(256 * Math.random()); } }\n    b[6] = (b[6] % 16) + 64; b[8] = (b[8] % 64) + 128;\n    var h = Array.prototype.map.call(b, function (x) { return (x + 256).toString(16).slice(1); }).join('');\n    return h.slice(0, 8) + '-' + h.slice(8, 12) + '-' + h.slice(12, 16) + '-' + h.slice(16, 20) + '-' + h.slice(20);\n  }\n  function flatten(obj, prefix) {\n    var out = {};\n    Object.keys(obj).forEach(function (k) {\n      var v = obj[k], key = prefix ? prefix + '_' + k : k;\n      if (v === undefined) { return; }\n      if (v === null || typeof v !== 'object' || Array.isArray(v)) { out[key] = v; } else { Object.assign(out, flatten(v, key)); }\n    });\n    return out;\n  }\n  function challengeSizeSku(n) {\n    if (n == null || !Number.isFinite(n) || n <= 0) { return undefined; }\n    var f = function (x) { return String(Number(x.toFixed(2))); };\n    return n >= 1e6 ? f(n \/ 1e6) + 'M' : n >= 1e3 ? f(n \/ 1e3) + 'K' : String(Math.round(n));\n  }\n  function family(type) { return FAMILIES.indexOf(type || '') >= 0 ? type : 'standard'; }\n  function addonName(optionId) { return URL_IDS[optionId] || optionId; }\n  \/* M\u00eame forme que cartItemProps du front. *\/\n  function cartItemProps(item, cartId, optionIds) {\n    var price = item.freeTrial ? 0 : item.price;\n    return {cart_id: cartId, cart_entry_type: item.freeTrial ? 'free_trial' : item.contest ? 'contest' : 'challenge',\n      challenge_family: family(item.challengeType), challenge_size: challengeSizeSku(item.amount),\n      challenge_size_value: Math.round(item.amount || 0), value: price * item.quantity, currency: 'EUR', quantity: item.quantity,\n      price_displayed: price, addons: item.optionUuids || [], addons_count: (item.optionUuids || []).length,\n      addon_names: (optionIds || []).map(addonName)};\n  }\n  function enrich(env) {\n    var raw = env.cookies(), attr = parseAttr(cookie(raw, 'wgf_attr')), out = {};\n    ATTR_KEYS.forEach(function (k) { if (attr[k]) { out[k] = attr[k]; } });\n    var fbp = cookie(raw, '_fbp'); if (fbp) { out.fbp = fbp; }\n    var ga = normalizeGaClientId(cookie(raw, '_ga')); if (ga) { out.ga_client_id = ga; }\n    var gs = gaSessionCookie(raw), sid = extractGaSessionId(gs); if (sid) { out.ga_session_id = sid; }\n    out.wgf_aid = cookie(raw, 'wgf_aid') || undefined;\n    out.page_url = env.location.href; out.page_path = env.location.pathname; out.page_title = env.document.title;\n    out.page_referrer = env.document.referrer || undefined; out.locale = env.document.documentElement.lang || undefined;\n    out.consent_state = cookie(raw, 'consent_state') || 'granted';\n    out.gtm_loaded = !!env.window.google_tag_manager; out.fbq_loaded = typeof env.window.fbq === 'function';\n    out.ga_session_cookie = gs !== null;\n    return out;\n  }\n  function missing(dests, payload) {\n    var out = [];\n    dests.forEach(function (d) {\n      (REQUIRES[d] || []).forEach(function (f) {\n        var ok = f.split('|').some(function (k) { var v = payload[k]; return v !== null ? (v !== undefined ? v !== '' : false) : false; });\n        if (!ok) { out.push(d + ':' + f); }\n      });\n    });\n    return out;\n  }\n  \/* env : {window, document, location, cookies()} ; posthog : client initialis\u00e9, ou null. *\/\n  function track(env, posthog, event, props, opts, extra) {\n    if (!isConsentGranted(cookie(env.cookies(), 'consent_state'))) { return null; }\n    var eventId = uuidV4(env.window.crypto), dests = (DESTINATIONS[event] || []).slice();\n    var payload = Object.assign(enrich(env), extra || {}, props, {event_id: eventId, _destinations: dests});\n    var manque = missing(dests, payload);\n    var envoi = (opts ? opts.instant : false) ? {transport: 'sendBeacon', send_instantly: true} : undefined;\n    var captures = manque.length ? [['tracking_incomplete_payload', {event: event, schema_valid: true, missing: manque, _destinations: []}, undefined]] : [];\n    captures.push([event, payload, envoi]);\n    \/* PostHog absent : captures diff\u00e9r\u00e9es avec le m\u00eame event_id (d\u00e9duplication pixel et CAPI pr\u00e9serv\u00e9e). *\/\n    captures.forEach(function (c) {\n      if (posthog) { posthog.capture(c[0], c[1], c[2]); }\n      else if (opts ? typeof opts.differer === 'function' : false) { opts.differer(c); }\n    });\n    var dl = Object.assign({event: event, event_id: eventId}, flatten(props));\n    if (opts ? typeof opts.eventCallback === 'function' : false) { dl.eventCallback = opts.eventCallback; dl.eventTimeout = 1500; }\n    env.window.dataLayer = env.window.dataLayer || [];\n    env.window.dataLayer.push(dl);\n    return eventId;\n  }\n  var api = {track: track, cartItemProps: cartItemProps, challengeSizeSku: challengeSizeSku, family: family, addonName: addonName,\n    isConsentGranted: isConsentGranted, uuidV4: uuidV4, flatten: flatten, DESTINATIONS: DESTINATIONS};\n  if (typeof module !== 'undefined') { module.exports = api; } else { window.WGFMesure = api; }\n})();\n\n<\/script>\n<script data-wgf-module=\"instantane.js\">\/* Projection pure du moteur vers le contrat de vue. Aucun DOM, r\u00e9seau ou mesure. *\/\n(function () {\n  \"use strict\";\n  function build(x) {\n    var source=x.source, engine=x.engine, state=x.state, catalog=x.catalog, offer=x.offer;\n    var p=catalog?catalog.programs[state.programme]:null;\n    var product=p?p.capitals.find(function(c){return c.capitalId===state.capital;}):null;\n    var ready=x.status===\"ready\", locked=!!(x.submitting||x.added||x.cartUncertain);\n    function money(n){return new Intl.NumberFormat(\"fr-FR\",{style:\"currency\",currency:\"EUR\"}).format(n);}\n    function percent(n){return new Intl.NumberFormat(\"fr-FR\",{style:'percent',maximumFractionDigits:2}).format(n\/100);}\n    function dollars(n){return new Intl.NumberFormat(\"fr-FR\",{style:\"currency\",currency:\"USD\",maximumFractionDigits:0}).format(n);}\n    function rules(program){return program.rules.map(function(r){return {label:r.label,phases:r.values.map(function(v,i){return {phase:program.phaseLabels[i]||\"Phase \"+(i+1),value:v};})};});}\n    function price(c,ids){\n      if(!ready||!p||!c){return null;}\n      var applied=engine.applies(offer,c,p.type)?offer:null;\n      var unit=engine.catalogUnitPrice(c.price,engine.payableOptions(source.selectedOptions(p,ids),applied));\n      var pay=engine.discounted(unit.price,unit.flat,applied), savings=engine.round(unit.price-pay);\n      return {list:unit.price,pay:pay,savings:savings,savingsPercent:unit.price?engine.round(savings\/unit.price*100):0,promoApplies:!!applied,promo:applied};\n    }\n    var total=price(product,state.options), gs=p?p.groups:[], subCount=Math.max(1,gs.length);\n    var labels=p?state.options.map(function(id){return p.options[id].label;}):[];\n    var fees=\"\";\n    if(p?ready:false){\n      if(state.options.includes(\"otp\")){fees=p.activationMode.otpDescription||\"\";}\n      else if(p.activation!==null){fees=\"\u00c0 la validation du challenge : \"+money(p.activation)+\" de frais d\u2019activation, hors du total pay\u00e9 maintenant.\";}\n    }\n    function giftContext(){\n      var ps=catalog?Object.keys(catalog.programs).map(function(k){return catalog.programs[k];}):[];\n      return {challenge:function(uuid,type,coins){var found=\"\";ps.forEach(function(pr){pr.capitals.forEach(function(c){if(c.uuid===uuid){found=pr.label+\" \"+dollars(c.amount);}});});if(found){return found;}var same=ps.find(function(pr){return pr.type===type;});return same?(Number.isFinite(coins)?(coins>0?same.label+\" \"+dollars(coins):\"\"):\"\"):\"\";},option:function(uuid){var found=\"\";ps.forEach(function(pr){Object.keys(pr.options).forEach(function(id){if(pr.options[id].uuid===uuid){found=pr.options[id].label;}});});return found;},chosen:function(uuid){return p?state.options.some(function(id){return p.options[id].uuid===uuid;}):false;}};\n    }\n    var canAdd=!!total?!x.needsReview?!x.entryProblems.length?x.promoState===\"resolved\":false:false:false;\n    if(x.promoUnavailable||x.submitting||x.cartUncertain||!x.complete.programme||!x.complete.capital||!x.complete.options){canAdd=false;}\n    var cartState=x.added?\"added\":x.submitting?\"checking\":x.cartUncertain?\"uncertain\":x.cartError?\"error\":x.originOK?\"ready\":\"wrong_origin\";\n    var notice=!x.originOK?\"L\u2019ajout n\u00e9cessite la m\u00eame origine que le site. Cet aper\u00e7u ne peut pas \u00e9crire dans le panier WGF.\":x.cartError||(x.added?\"Votre pack a \u00e9t\u00e9 ajout\u00e9. Ouvrez votre panier sans l\u2019ajouter \u00e0 nouveau.\":x.promoUnavailable?\"La promotion ne peut pas \u00eatre v\u00e9rifi\u00e9e. R\u00e9essayez avant d\u2019ajouter le pack.\":\"Votre pack sera ajout\u00e9 au panier, sans repasser par le configurateur du site.\");\n    return {\n      version:x.version,locale:\"fr-FR\",status:x.status,needsReview:!!x.needsReview,\n      catalogNotice:x.status===\"loading\"?\"V\u00e9rification du catalogue en cours\u2026\":x.status===\"unavailable\"?\"Catalogue indisponible. Les prix et la s\u00e9lection sont suspendus. R\u00e9essayez ou consultez le site.\":x.needsReview?\"Le catalogue ou la promotion a chang\u00e9. V\u00e9rifiez votre s\u00e9lection et les nouveaux tarifs.\":\"\",\n      catalogControls:{refreshVisible:x.status===\"unavailable\",refreshDisabled:x.status===\"loading\"||locked,confirmVisible:!!(x.needsReview?ready:false)},\n      entryNotice:Array.from(new Set(x.entryProblems.map(function(e){return e.message;}))).join(\" \"),\n      promoState:x.promoState,promo:offer?{code:offer.code,endsAt:offer.endsAt||null,percent:Number.isFinite(offer.discountPercent)?engine.round(offer.discountPercent*100):null}:null,\n      step:state.step,sub:Math.max(1,Math.min(state.sub,subCount)),subCount:subCount,locked:locked,complete:Object.assign({},x.complete),\n      programmes:catalog?Object.keys(catalog.programs).map(function(key){var pr=catalog.programs[key];return {key:key,label:pr.label,description:pr.description,type:pr.type,selected:state.programme===key,rules:rules(pr),activation:pr.activation};}):[],\n      capitals:p?p.capitals.map(function(c){var t=price(c,state.options);return Object.assign({id:c.capitalId,amount:c.amount,selected:c.capitalId===state.capital,priceText:ready?\"ready\":\"checking\"},t?{list:t.list,pay:t.pay,savings:t.savings,savingsPercent:t.savingsPercent,promoApplies:t.promoApplies}:{list:null,pay:null,savings:0,savingsPercent:0,promoApplies:false});}):[],\n      capitalHint:p?source.ruleSummary(p.rules,[\"profit_target\",\"min_trading_days\"]):\"\",\n      groups:gs.map(function(g,i){return {id:g.id,name:g.name,label:g.label,description:g.description,index:i+1,includedSelected:!g.options.some(function(o){return state.options.includes(o.optionId);}),options:g.options.map(function(o){\n        var other=state.options.filter(function(id){return p.options[id].group!==o.group;}),base=price(product,other),next=price(product,other.concat(o.enabled?[o.optionId]:[]));\n        var delta=o.enabled?(base?(next?engine.round(next.pay-base.pay):null):null):null;\n        var deltaList=delta===null?null:engine.round(next.list-base.list);\n        var deltaSavings=delta===null?null:engine.round(deltaList-delta);\n        var deltaSavingsPercent=delta===null?null:deltaList>0?engine.round(deltaSavings\/deltaList*100):0;\n        var deltaPromoApplies=deltaSavings===null?false:deltaSavings>0;\n        return {id:o.optionId,uuid:o.uuid,label:o.label,description:o.enabled?o.description:\"Compatibilit\u00e9 non document\u00e9e dans ce tunnel. Choix \u00e0 confirmer sur le site.\",enabled:o.enabled,selected:state.options.includes(o.optionId),delta:delta,deltaText:!o.enabled?\"\u00c0 confirmer\":delta===null?\"\u2026\":\"+\"+money(delta),deltaList:deltaList,deltaSavings:deltaSavings,deltaSavingsPercent:deltaSavingsPercent,deltaPromoApplies:deltaPromoApplies};\n      })};}),\n      optionsLead:gs.length?\"Les suppl\u00e9ments sont recalcul\u00e9s pour votre s\u00e9lection. Aucune option n\u2019est obligatoire.\":\"Aucune option propos\u00e9e pour ce programme dans le catalogue publi\u00e9.\",optionWarning:!!(catalog?catalog.warnings.length:false),\n      summary:total?{programmeLabel:p.label,programmeType:p.type,capitalAmount:product.amount,capitalText:dollars(product.amount),rules:rules(p),optionsLabels:labels,list:total.list,pay:total.pay,savings:total.savings,savingsPercent:total.savingsPercent,promoCode:total.promo?total.promo.code:null,promoEndsAt:total.promo?total.promo.endsAt||null:null,gifts:engine.giftLabels(total.promo,giftContext()),feesText:fees}:null,\n      priceState:total?(total.promo?\"validated_offer\":\"catalogue\"):x.status===\"loading\"?\"loading\":\"unavailable\",\n      bar:{name:p?p.label:\"Votre challenge\",variant:product?dollars(product.amount)+(labels.length?\" \u00b7 \"+labels.join(\" \u00b7 \"):\"\"):\"Choisissez votre programme\",total:total?money(total.pay):x.status===\"loading\"?\"V\u00e9rification\u2026\":\"Tarif indisponible\",strike:total?(total.savings>0?money(total.list):\"\"):\"\",code:total?(total.promo?\"Code \"+total.promo.code:\"\"):\"\",savingsText:total?(total.savings>0?\"\u00c9conomie \"+money(total.savings)+' (-'+percent(total.savingsPercent)+\")\":\"\"):\"\"},\n      cart:{state:cartState,ctaLabel:x.added?\"Ouvrir mon panier\":x.submitting?\"V\u00e9rification du pack\u2026\":\"Ajouter au panier\",ctaDisabled:!!(!x.originOK||(!x.added?!canAdd:x.submitting)),notice:notice,canOpen:!!(x.originOK?(x.cartError||x.cartUncertain):false)},\n      nav:{prevVisible:state.step!==1?state.step!==4:false,prevDisabled:locked,nextVisible:state.step!==4,nextDisabled:!!(!ready||x.submitting||x.added),nextLabel:state.step===3?\"Continuer (\"+state.sub+\"\/\"+subCount+\")\":\"Continuer\",ctaVisible:state.step===4},stepNames:[\"Programme\",\"Capital\",\"Options\",\"R\u00e9capitulatif\"]\n    };\n  }\n  if(typeof module!=='undefined'){module.exports=build;}else{window.WGFInstantane=build;}\n})();\n<\/script>\n<script data-wgf-module=\"focus_mobile.js\">\/* Ergonomie de presentation uniquement : garder le choix entier au-dessus de\n   la barre fixe quand un radio (souvent masque visuellement) recoit le focus.\n   Aucun calcul, choix, evenement metier ni transport reseau. *\/\n(function () {\n  'use strict';\n  window.WGFMobileFocus = function (root, bar) {\n    var frame = 0;\n    function onFocus(event) {\n      if (window.innerWidth > 899) { return; }\n      var control = event.target;\n      if (!control.matches('input,button,a,summary')) { return; }\n      if (bar.contains(control)) { return; }\n      window.cancelAnimationFrame(frame);\n      frame = window.requestAnimationFrame(function () {\n        if (document.activeElement !== control) { return; }\n        var item = control.closest('label') || control;\n        var rect = item.getBoundingClientRect();\n        if (!rect.height) { return; }\n        var top = 12;\n        var bottom = window.innerHeight - 12;\n        if (window.getComputedStyle(bar).position === 'fixed') {\n          bottom = Math.min(bottom, bar.getBoundingClientRect().top - 12);\n        }\n        var distance = 0;\n        if (rect.height > bottom - top) { distance = rect.top - top; }\n        else if (rect.bottom > bottom) { distance = rect.bottom - bottom; }\n        else if (rect.top < top) { distance = rect.top - top; }\n        if (distance) { window.scrollBy({top: distance, behavior: 'instant'}); }\n      });\n    }\n    root.addEventListener('focusin', onFocus);\n    return function () {\n      window.cancelAnimationFrame(frame);\n      root.removeEventListener('focusin', onFocus);\n    };\n  };\n}());\n<\/script>\n<script data-wgf-module=\"vue.js\">\/* Proposition \u00ab Desk \u00bb : vue du configurateur WGF.\n   Vanilla, sans biblioth\u00e8que, sans esperluette (F-WGF-293 : utiliser .every(), des if imbriqu\u00e9s).\n   La vue ne lit que le snapshot et n'appelle que l'api du contr\u00f4leur. Aucune mesure ici. *\/\nwindow.WGFVue = function (root, api) {\n  \"use strict\";\n\n  var reduceQuery = window.matchMedia ? window.matchMedia('(prefers-reduced-motion: reduce)') : null;\n  function reduced() { return reduceQuery ? reduceQuery.matches === true : false; }\n\n  function q(sel) { return root.querySelector(sel); }\n  function el(tag, className, text) {\n    var node = document.createElement(tag);\n    if (className) { node.className = className; }\n    if (text !== undefined) { node.textContent = text; }\n    return node;\n  }\n  \/* Les espaces fines ins\u00e9cables du format mon\u00e9taire collent les milliers dans les tr\u00e8s grands corps. *\/\n  function spaced(value) {\n    return String(value).replace(\/\\u202f\/g, \" \").replace(\/\\u00a0\/g, \" \");\n  }\n  function setText(node, value) {\n    if (!node) { return; }\n    var next = value === null ? \"\" : String(value === undefined ? \"\" : value);\n    if (node.textContent !== next) { node.textContent = next; }\n  }\n  function setHidden(node, hidden) {\n    if (!node) { return; }\n    if (node.hidden !== hidden) { node.hidden = hidden; }\n  }\n  function setDisabled(node, disabled) {\n    if (!node) { return; }\n    if (node.disabled !== disabled) { node.disabled = disabled; }\n  }\n  function setFlag(node, className, on) {\n    if (!node) { return; }\n    if (node.classList.contains(className) !== on) { node.classList.toggle(className, on); }\n  }\n  function replay(node, className) {\n    if (!node) { return; }\n    if (reduced()) { return; }\n    node.classList.remove(className);\n    void node.offsetWidth;\n    node.classList.add(className);\n  }\n\n  \/* ---------- Roulement de chiffres : seuls les glyphes modifi\u00e9s bougent ---------- *\/\n  function writeMoneyText(node, text) {\n    if (!node) { return; }\n    if (node.__deskText === text) { return; }\n    node.__deskText = text;\n    node.textContent = text;\n  }\n\n  \/* ---------- Pourcentages : toujours au format fr-FR, jamais interpol\u00e9s bruts ---------- *\/\n  var pctFormat = new Intl.NumberFormat(\"fr-FR\", {style: 'percent', maximumFractionDigits: 2});\n  function pct(value) {\n    var n = Number(value);\n    return pctFormat.format((Number.isFinite(n) ? n : 0) \/ 100);\n  }\n\n  \/* ---------- Montant : valeur en texte continu pour l'assistance, animation \u00e0 part ---------- *\/\n  function amountNode(node, label) {\n    if (node.__sr) { return; }\n    node.__label = label || \"\";\n    node.__sr = el(\"span\", 'desk__sr', \"\");\n    node.__anim = el(\"span\", 'desk__amount');\n    node.__anim.setAttribute('aria-hidden', 'true');\n    node.replaceChildren(node.__sr, node.__anim);\n  }\n  function writeAmount(node, text) {\n    if (!node) { return; }\n    if (!node.__sr) { amountNode(node, \"\"); }\n    if (node.__value === text) { return; }\n    node.__value = text;\n    setText(node.__sr, node.__label ? node.__label + \" \" + text : text);\n    writeMoneyText(node.__anim, text);\n  }\n  \/* ---------- Trac\u00e9 d\u00e9coratif de fond (aucune donn\u00e9e de march\u00e9) ---------- *\/\n  var trace = q('[data-desk-trace]');\n  var traceCtx = trace ? trace.getContext('2d') : null;\n  var traceRaf = 0, traceLast = 0, traceStop = false;\n\n  function traceSize() {\n    if (!trace) { return; }\n    var ratio = window.devicePixelRatio ? Math.min(window.devicePixelRatio, 2) : 1;\n    var w = trace.clientWidth, h = trace.clientHeight;\n    if (w <= 0) { return; }\n    if (h <= 0) { return; }\n    trace.width = Math.round(w * ratio);\n    trace.height = Math.round(h * ratio);\n    if (traceCtx) { traceCtx.setTransform(ratio, 0, 0, ratio, 0, 0); }\n  }\n  function traceDraw(time) {\n    if (!traceCtx) { return; }\n    var w = trace.clientWidth, h = trace.clientHeight;\n    traceCtx.clearRect(0, 0, w, h);\n    var phase = time \/ 24000 * Math.PI * 2;\n    var layers = [\n      {amp: .26, freq: 1.4, shift: 0, color: 'rgba(161,78,254,.30)', width: 1.6},\n      {amp: .17, freq: 2.3, shift: 1.1, color: 'rgba(214,182,255,.16)', width: 1.1},\n      {amp: .11, freq: 3.6, shift: 2.4, color: 'rgba(242,196,90,.10)', width: 1}\n    ];\n    layers.forEach(function (layer) {\n      traceCtx.beginPath();\n      var x, y, base = h * .62;\n      for (x = 0; x <= w; x += 6) {\n        var t = x \/ Math.max(w, 1);\n        y = base\n          - Math.sin(t * Math.PI * layer.freq + phase + layer.shift) * h * layer.amp * .5\n          - Math.sin(t * Math.PI * layer.freq * 2.7 + phase * 1.6) * h * layer.amp * .16\n          - t * h * .16;\n        if (x === 0) { traceCtx.moveTo(x, y); } else { traceCtx.lineTo(x, y); }\n      }\n      traceCtx.strokeStyle = layer.color;\n      traceCtx.lineWidth = layer.width;\n      traceCtx.stroke();\n    });\n  }\n  function traceFrame(now) {\n    traceRaf = 0;\n    if (traceStop) { return; }\n    if (document.hidden) { return; }\n    if (now - traceLast >= 33) {\n      traceLast = now;\n      traceDraw(now);\n    }\n    traceRaf = window.requestAnimationFrame(traceFrame);\n  }\n  function traceStart() {\n    if (!traceCtx) { return; }\n    traceSize();\n    if (reduced()) { traceDraw(0); return; }\n    if (traceRaf) { return; }\n    traceRaf = window.requestAnimationFrame(traceFrame);\n  }\n  function traceWake() {\n    if (document.hidden) { return; }\n    if (traceRaf) { return; }\n    traceStart();\n  }\n  var traceResize = function () { traceSize(); if (reduced()) { traceDraw(0); } };\n  window.addEventListener('resize', traceResize);\n  document.addEventListener(\"visibilitychange\", traceWake);\n  traceStart();\n\n  \/* ---------- R\u00e9f\u00e9rences du squelette ---------- *\/\n  var refs = {\n    bar: q('[data-bar]'),\n    signal: q('[data-desk-signal-text]'),\n    rail: Array.prototype.slice.call(root.querySelectorAll(\"[data-step-dot]\")),\n    panels: Array.prototype.slice.call(root.querySelectorAll(\"[data-step]\")),\n    catalogStatus: q(\"[data-catalog-status]\"),\n    entryNotice: q(\"[data-entry-notice]\"),\n    catalogConfirm: q(\"[data-catalog-confirm]\"),\n    catalogRefresh: q(\"[data-catalog-refresh]\"),\n    sourceControls: q(\"[data-source-controls]\"),\n    programs: q(\"[data-programs]\"),\n    capitals: q(\"[data-capitals]\"),\n    capitalHint: q(\"[data-capital-hint]\"),\n    rules: q(\"[data-rules]\"),\n    options: q(\"[data-options]\"),\n    optionsLead: q(\"[data-options-lead]\"),\n    optionWarning: q(\"[data-option-warning]\"),\n    recap: q(\"[data-recap]\"),\n    fees: q(\"[data-recap-fees]\"),\n    cartStatus: q(\"[data-cart-status]\"),\n    cartOpen: q(\"[data-cart-open]\"),\n    edits: Array.prototype.slice.call(root.querySelectorAll(\"[data-edit-step]\")),\n    barName: q(\"[data-bar-name]\"),\n    barVariant: q(\"[data-bar-variant]\"),\n    barTotal: q(\"[data-bar-total]\"),\n    barStrike: q(\"[data-bar-strike]\"),\n    barSavings: q('[data-bar-savings]'),\n    barCode: q(\"[data-bar-code]\"),\n    barFees: q('[data-bar-fees]'),\n    prev: q('[data-cta-prev]'),\n    next: q('[data-cta-next]'),\n    cta: q('[data-cta-cart]'),\n    ctaLabel: q('.desk__cta-label')\n  };\n\n  \/* ---------- Hauteur r\u00e9elle du ticker : le contenu ne doit jamais passer dessous ---------- *\/\n  var ticker = q('[data-bar]');\n  function syncTickerHeight() {\n    if (!ticker) { return; }\n    var h = Math.round(ticker.getBoundingClientRect().height);\n    if (h > 0) { root.style.setProperty('--ticker-h', h + 'px'); }\n  }\n  var tickerWatch = window.ResizeObserver ? new window.ResizeObserver(syncTickerHeight) : null;\n  if (tickerWatch) { if (ticker) { tickerWatch.observe(ticker); } }\n  window.addEventListener('resize', syncTickerHeight);\n\n  \/* ---------- Console lat\u00e9rale (desktop) : \u00e9tat du poste, sans prix pour ne pas doubler le ticker ---------- *\/\n  var poste = {};\n  function buildConsole() {\n    var main = q('.desk__main');\n    if (!main) { return; }\n    var aside = el('aside', 'desk__console');\n    aside.setAttribute('aria-hidden', 'true');\n    aside.appendChild(el(\"p\", 'desk__console-title', \"\u00c9tat du poste\"));\n    var list = el('ul', 'desk__console-list');\n    [\n      {key: \"programme\", label: \"Programme\"},\n      {key: \"capital\", label: \"Capital\"},\n      {key: \"options\", label: \"Options arm\u00e9es\"},\n      {key: 'offre', label: \"Code\"}\n    ].forEach(function (def) {\n      var item = el('li', 'desk__console-item');\n      var led = el('i', \"\");\n      led.setAttribute('aria-hidden', 'true');\n      item.appendChild(led);\n      item.appendChild(el(\"b\", \"\", def.label));\n      var value = el(\"span\", \"\", \"en attente\");\n      item.appendChild(value);\n      list.appendChild(item);\n      poste[def.key] = {item: item, value: value};\n    });\n    aside.appendChild(list);\n    main.appendChild(aside);\n  }\n  buildConsole();\n\n  function renderConsole(snapshot) {\n    function put(key, text) {\n      var slot = poste[key];\n      if (!slot) { return; }\n      var on = text ? true : false;\n      setText(slot.value, on ? text : \"en attente\");\n      setFlag(slot.item, 'is-on', on);\n    }\n    var programme = (snapshot.programmes || []).find(function (p) { return p.selected === true; });\n    var capital = (snapshot.capitals || []).find(function (c) { return c.selected === true; });\n    var armedOptions = [];\n    (snapshot.groups || []).forEach(function (group) {\n      (group.options || []).forEach(function (option) {\n        if (option.selected === true) { armedOptions.push(option.label); }\n      });\n    });\n    var summary = snapshot.summary;\n    put(\"programme\", programme ? programme.label : \"\");\n    put(\"capital\", capital ? spaced(api.dollars(capital.amount)) : \"\");\n    put(\"options\", armedOptions.length ? armedOptions.join(\", \") : \"\");\n    \/* Code appliqu\u00e9 au produit courant, jamais la simple validation globale du code. *\/\n    put('offre', summary ? (summary.promoCode || \"\") : \"\");\n  }\n\n  \/* ---------- Fiche de pr\u00e9-lancement : construite une fois, mise \u00e0 jour ensuite ---------- *\/\n  var sheet = {};\n  function buildSheet() {\n    var head = el('div', 'desk__sheet-head');\n    sheet.name = el(\"p\", 'desk__sheet-name', \"Votre challenge\");\n    sheet.capital = el(\"p\", 'desk__sheet-capital', \"\");\n    head.appendChild(sheet.name);\n    head.appendChild(sheet.capital);\n    refs.recap.appendChild(head);\n\n    sheet.list = el('dl', 'desk__sheet-lines');\n    refs.recap.appendChild(sheet.list);\n\n    sheet.lines = {};\n    [\n      {key: \"options\", label: \"Options arm\u00e9es\"},\n      {key: 'offre', label: \"Offre\"}\n    ].forEach(function (def) {\n      var row = el('div', 'desk__line');\n      var dt = el(\"dt\", \"\", def.label);\n      var dd = el(\"dd\", \"\");\n      row.appendChild(dt);\n      row.appendChild(dd);\n      sheet.list.appendChild(row);\n      sheet.lines[def.key] = {row: row, value: dd};\n    });\n\n    var block = el('div', 'desk__price-block');\n    sheet.priceLabel = el(\"span\", 'desk__price-label', \"\u00c0 payer maintenant\");\n    sheet.priceLabel.setAttribute('aria-hidden', 'true');\n    sheet.pay = el('strong', 'desk__price-pay', \"\");\n    sheet.pay.setAttribute('data-price-pay', \"\");\n    amountNode(sheet.pay, \"\u00c0 payer maintenant :\");\n    var meta = el('div', 'desk__price-meta');\n    sheet.listPrice = el(\"s\", 'desk__price-list', \"\");\n    sheet.listPrice.setAttribute('data-price-list', \"\");\n    sheet.listPrice.hidden = true;\n    sheet.savings = el(\"span\", 'desk__price-save', \"\");\n    sheet.savings.setAttribute('data-price-savings', \"\");\n    sheet.savings.hidden = true;\n    meta.appendChild(sheet.listPrice);\n    meta.appendChild(sheet.savings);\n    sheet.countdown = el(\"p\", 'desk__countdown', \"\");\n    sheet.countdown.hidden = true;\n    sheet.unavailable = el(\"p\", 'desk__unavailable', \"\");\n    sheet.unavailable.hidden = true;\n    \/* Frais d'activation : texte r\u00e9glementaire du contr\u00f4leur, en entier, contre le prix. *\/\n    sheet.fees = el(\"p\", 'desk__fees');\n    sheet.fees.setAttribute('data-recap-fees', \"\");\n    sheet.fees.hidden = true;\n    block.appendChild(sheet.priceLabel);\n    block.appendChild(sheet.pay);\n    block.appendChild(meta);\n    block.appendChild(sheet.countdown);\n    block.appendChild(sheet.fees);\n    block.appendChild(sheet.unavailable);\n    refs.recap.appendChild(block);\n    sheet.block = block;\n\n    \/* Les r\u00e8gles de base viennent APRES la d\u00e9cision : composition, puis prix, puis seulement\n       le d\u00e9tail technique. D\u00e9pliant ferme par defaut, qualification \u00ab avant options \u00bb tenue\n       par le resume lui-meme, pour que le premier ecran porte le choix et le prix. *\/\n    sheet.base = el('details', 'desk__base');\n    sheet.base.setAttribute('data-base-rules', \"\");\n    sheet.base.appendChild(el('summary', 'desk__base-summary', \"R\u00e8gles du programme, avant options\"));\n    sheet.gauges = el('div', 'desk__gauges');\n    sheet.base.appendChild(sheet.gauges);\n    sheet.base.appendChild(el(\"p\", 'desk__base-note', \"Les options retenues peuvent modifier ces r\u00e8gles. Conditions compl\u00e8tes sur le site.\"));\n    sheet.rulesAll = el('div', 'desk__rules');\n    sheet.base.appendChild(sheet.rulesAll);\n    refs.recap.appendChild(sheet.base);\n  }\n  if (refs.recap) { buildSheet(); }\n  if (refs.barTotal) { amountNode(refs.barTotal, \"Total \u00e0 payer :\"); }\n\n  \/* ---------- R\u00e9v\u00e9lation du pr\u00e9-lancement : en-t\u00eate, options arm\u00e9es, indicateurs.\n     Le bloc de prix, l'\u00e9conomie, l'\u00e9ch\u00e9ance et les frais d'activation en sont exclus :\n     ils sont lisibles d\u00e8s l'arriv\u00e9e, sans opacit\u00e9 ni d\u00e9lai, pendant que le CTA est actionnable.\n     Purement visuelle : le CTA reste actionnable d\u00e8s l'entr\u00e9e et la valeur exacte est\n     d\u00e9j\u00e0 dans le texte accessible du prix avant la premi\u00e8re image. ---------- *\/\n  function revealSheet() {\n    if (!refs.recap) { return; }\n    if (reduced()) { return; }\n    replay(refs.recap, 'is-reveal');\n    \/* Le montant affiche est celui du moteur, des la premiere image : on ne fait que\n       le souligner. Aucun chiffre intermediaire, aucune attente avant le CTA. *\/\n  }\n\n  \/* ---------- Marquage pour la cascade d'entr\u00e9e ---------- *\/\n  function markStagger(container) {\n    if (!container) { return; }\n    var kids = Array.prototype.slice.call(container.children);\n    kids.forEach(function (node, i) {\n      node.classList.add('desk__stagger');\n      node.style.setProperty('--i', String(Math.min(i, 8)));\n    });\n  }\n\n  \/* ---------- Indicateurs de r\u00e8gles ---------- *\/\n  function ruleValue(rule) {\n    if (!rule) { return \"\"; }\n    if (!Array.isArray(rule.phases)) { return \"\"; }\n    var values = [];\n    rule.phases.forEach(function (p) {\n      var v = p ? String(p.value === undefined ? \"\" : p.value) : \"\";\n      if (v === 'N\/A') { return; }\n      if (v) { if (values.indexOf(v) < 0) { values.push(v); } }\n    });\n    return values.join(\" puis \");\n  }\n  \/* Les trois indicateurs les plus utiles d'abord : objectif, perte, jours de trading. *\/\n  var PRIORITES = [\"objectif\", \"perte\", \"drawdown\", \"jour\"];\n  function rang(rule) {\n    var label = String(rule.label || \"\").toLowerCase();\n    var score = PRIORITES.length;\n    PRIORITES.forEach(function (mot, i) {\n      if (label.indexOf(mot) >= 0) { if (i < score) { score = i; } }\n    });\n    return score;\n  }\n  function fillGauges(container, rules, avoid, limite) {\n    container.replaceChildren();\n    if (!Array.isArray(rules)) { return; }\n    var dit = typeof avoid === \"string\" ? avoid.toLowerCase() : \"\";\n    var max = Number(limite) > 0 ? Number(limite) : 3;\n    var shown = 0;\n    var ordered = rules.slice().sort(function (a, b) { return rang(a) - rang(b); });\n    ordered.forEach(function (rule) {\n      if (shown >= max) { return; }\n      var value = ruleValue(rule);\n      if (!value) { return; }\n      if (dit) { if (dit.indexOf(String(rule.label).toLowerCase()) >= 0) { return; } }\n      var gauge = el(\"span\", 'desk__gauge');\n      gauge.appendChild(el(\"b\", \"\", rule.label));\n      gauge.appendChild(el(\"span\", \"\", value));\n      container.appendChild(gauge);\n      shown++;\n    });\n  }\n\n  \/* ---------- \u00c9tape 1 : canaux ---------- *\/\n  var programNodes = Object.create(null);\n  var programmeDetails = el('details', 'desk__more desk__programme-details');\n  programmeDetails.appendChild(el('summary', \"\", \"Comparer les r\u00e8gles des programmes\"));\n  programmeDetails.appendChild(el(\"p\", \"\", \"R\u00e8gles de base, avant options.\"));\n  var programmeDetailsBody = el('div');\n  programmeDetails.appendChild(programmeDetailsBody);\n  if (refs.programs) { refs.programs.after(programmeDetails); }\n  var programmeDetailsKey = \"\";\n  function renderProgrammeDetails(programmes) {\n    setHidden(programmeDetails, !programmes.length);\n    var signature = JSON.stringify(programmes.map(function (p) { return [p.label, p.rules]; }));\n    if (signature === programmeDetailsKey) { return; }\n    programmeDetailsKey = signature;\n    programmeDetailsBody.replaceChildren();\n    programmes.forEach(function (programme) {\n      var section = el('section');\n      section.appendChild(el('h3', \"\", programme.label));\n      (programme.rules || []).forEach(function (rule) {\n        var value = phasesText(rule);\n        if (!value) { return; }\n        var row = el(\"p\", 'desk__rule');\n        row.appendChild(el(\"b\", \"\", rule.label));\n        row.appendChild(el(\"span\", \"\", value));\n        section.appendChild(row);\n      });\n      programmeDetailsBody.appendChild(section);\n    });\n  }\n  function renderPrograms(snapshot) {\n    if (!refs.programs) { return; }\n    var list = Array.isArray(snapshot.programmes) ? snapshot.programmes : [];\n    renderProgrammeDetails(list);\n    if (!list.length) {\n      if (snapshot.status === \"loading\") {\n        if (!refs.programs.__skeleton) {\n          refs.programs.replaceChildren();\n          programNodes = Object.create(null);\n          var n;\n          for (n = 0; n < 3; n++) { refs.programs.appendChild(el(\"span\", 'desk__skeleton')); }\n          refs.programs.__skeleton = true;\n          refs.programs.__empty = false;\n        }\n        return;\n      }\n      \/* Aucun message d'auteur ici : le bandeau du contr\u00f4leur fait foi (constat D-F1). *\/\n      if (!refs.programs.__empty) {\n        refs.programs.replaceChildren();\n        programNodes = Object.create(null);\n        refs.programs.__empty = true;\n        refs.programs.__skeleton = false;\n      }\n      return;\n    }\n    if (refs.programs.__empty ? true : refs.programs.__skeleton === true) {\n      refs.programs.replaceChildren();\n      programNodes = Object.create(null);\n      refs.programs.__empty = false;\n      refs.programs.__skeleton = false;\n    }\n    var order = [];\n    list.forEach(function (programme) {\n      var node = programNodes[programme.key];\n      if (!node) {\n        var label = el(\"label\", 'desk__choice desk__channel');\n        label.setAttribute('data-choice', 'programme:' + programme.key);\n        var radio = el(\"input\");\n        radio.type = \"radio\";\n        radio.name = \"programme\";\n        radio.value = programme.key;\n        var led = el(\"span\", 'desk__choice-led');\n        led.setAttribute('aria-hidden', 'true');\n        var name = el(\"span\", 'desk__choice-name', programme.label);\n        var desc = el(\"span\", 'desk__choice-desc', programme.description);\n        var gauges = el(\"span\", 'desk__gauges');\n        \/* Qualification obligatoire : ce sont les r\u00e8gles de base, pas l'\u00e9tat apr\u00e8s options. *\/\n        var gaugeNote = el(\"span\", 'desk__gauges-note', \"R\u00e8gles de base, avant options\");\n        gaugeNote.hidden = true;\n        label.appendChild(radio);\n        label.appendChild(led);\n        label.appendChild(name);\n        label.appendChild(desc);\n        label.appendChild(gaugeNote);\n        label.appendChild(gauges);\n        node = {label: label, radio: radio, name: name, desc: desc, gauges: gauges, gaugeNote: gaugeNote, rulesKey: \"\"};\n        programNodes[programme.key] = node;\n        refs.programs.appendChild(label);\n      }\n      setText(node.name, programme.label);\n      setText(node.desc, programme.description);\n      var key = JSON.stringify(programme.rules || []) + \"|\" + programme.description;\n      if (node.rulesKey !== key) {\n        node.rulesKey = key;\n        fillGauges(node.gauges, programme.rules, programme.description, 2);\n        setHidden(node.gaugeNote, node.gauges.children.length === 0);\n      }\n      if (node.radio.checked !== (programme.selected === true)) { node.radio.checked = programme.selected === true; }\n      setDisabled(node.radio, snapshot.locked === true ? true : snapshot.status !== \"ready\");\n      order.push(programme.key);\n    });\n    Object.keys(programNodes).forEach(function (key) {\n      if (order.indexOf(key) < 0) {\n        programNodes[key].label.remove();\n        delete programNodes[key];\n      }\n    });\n    markStagger(refs.programs);\n  }\n\n  \/* ---------- \u00c9tape 2 : tuiles de capital ---------- *\/\n  var capitalNodes = Object.create(null);\n  function renderCapitals(snapshot) {\n    if (!refs.capitals) { return; }\n    var list = Array.isArray(snapshot.capitals) ? snapshot.capitals : [];\n    var order = [];\n    list.forEach(function (capital) {\n      var node = capitalNodes[capital.id];\n      if (!node) {\n        var label = el(\"label\", 'desk__choice desk__tile');\n        label.setAttribute('data-choice', 'capital:' + capital.id);\n        var radio = el(\"input\");\n        radio.type = \"radio\";\n        radio.name = \"capital\";\n        radio.value = capital.id;\n        var led = el(\"span\", 'desk__choice-led');\n        led.setAttribute('aria-hidden', 'true');\n        var amount = el(\"b\", 'desk__tile-amount', \"\");\n        var price = el(\"span\", 'desk__tile-price');\n        var pay = el(\"span\", 'desk__pay', \"\");\n        var listed = el(\"s\", 'desk__list', \"\");\n        listed.hidden = true;\n        var save = el(\"span\", 'desk__save', \"\");\n        save.hidden = true;\n        var checking = el(\"span\", 'desk__checking', \"V\u00e9rification du tarif\u2026\");\n        checking.hidden = true;\n        price.appendChild(pay);\n        price.appendChild(listed);\n        price.appendChild(save);\n        price.appendChild(checking);\n        label.appendChild(radio);\n        label.appendChild(led);\n        label.appendChild(amount);\n        label.appendChild(price);\n        node = {label: label, radio: radio, amount: amount, pay: pay, list: listed, save: save, checking: checking};\n        capitalNodes[capital.id] = node;\n        refs.capitals.appendChild(label);\n      }\n      setText(node.amount, spaced(api.dollars(capital.amount)));\n      var ready = capital.priceText !== \"checking\";\n      setHidden(node.checking, ready);\n      setHidden(node.pay, !ready);\n      if (ready) {\n        writeMoneyText(node.pay, api.money(capital.pay));\n        var discounted = capital.savings > 0;\n        setHidden(node.list, !discounted);\n        setHidden(node.save, !discounted);\n        if (discounted) {\n          setText(node.list, api.money(capital.list));\n          setText(node.save, '-' + pct(capital.savingsPercent) + \" \u00b7 \" + api.money(capital.savings));\n        }\n      } else {\n        setHidden(node.list, true);\n        setHidden(node.save, true);\n      }\n      if (node.radio.checked !== (capital.selected === true)) { node.radio.checked = capital.selected === true; }\n      setDisabled(node.radio, snapshot.locked === true ? true : snapshot.status !== \"ready\");\n      order.push(capital.id);\n    });\n    Object.keys(capitalNodes).forEach(function (id) {\n      if (order.indexOf(id) < 0) {\n        capitalNodes[id].label.remove();\n        delete capitalNodes[id];\n      }\n    });\n    markStagger(refs.capitals);\n    \/* Le texte du contr\u00f4leur reste intact ; seule une \u00e9tiquette le qualifie. *\/\n    if (refs.capitalHint) {\n      var hint = snapshot.capitalHint || \"\";\n      if (refs.capitalHint.__hint !== hint) {\n        refs.capitalHint.__hint = hint;\n        refs.capitalHint.replaceChildren();\n        if (hint) {\n          refs.capitalHint.appendChild(el(\"b\", 'desk__hint-label', \"R\u00e8gles du programme, avant options\"));\n          refs.capitalHint.appendChild(el(\"span\", \"\", hint));\n        }\n      }\n      setHidden(refs.capitalHint, !hint);\n    }\n  }\n\n  \/* ---------- R\u00e8gles d\u00e9taill\u00e9es (repli du panneau capital) ---------- *\/\n  var rulesKey = \"\";\n  function renderRules(snapshot) {\n    if (!refs.rules) { return; }\n    var current = (snapshot.programmes || []).find(function (p) { return p.selected === true; });\n    var rules = current ? current.rules : [];\n    var key = JSON.stringify(rules || []);\n    if (key === rulesKey) { return; }\n    rulesKey = key;\n    refs.rules.replaceChildren();\n    (rules || []).forEach(function (rule) {\n      var phases = phasesText(rule);\n      if (!phases) { return; }\n      var row = el(\"p\", 'desk__rule');\n      row.appendChild(el(\"b\", \"\", rule.label));\n      row.appendChild(el(\"span\", \"\", phases));\n      refs.rules.appendChild(row);\n    });\n  }\n\n  \/* ---------- \u00c9tape 3 : modules \u00e0 armer ---------- *\/\n  var groupNodes = Object.create(null);\n  function moduleRow(groupName, optionId, choiceKey) {\n    var label = el(\"label\", 'desk__module');\n    label.setAttribute('data-choice', 'option:' + groupName + \":\" + choiceKey);\n    var radio = el(\"input\");\n    radio.type = \"radio\";\n    radio.name = groupName;\n    radio.value = optionId;\n    var led = el(\"span\", 'desk__choice-led');\n    led.setAttribute('aria-hidden', 'true');\n    var name = el(\"span\", 'desk__module-name', \"\");\n    var price = el(\"span\", 'desk__module-price');\n    var delta = el(\"output\", 'desk__module-delta');\n    delta.setAttribute(\"data-opt-price\", optionId);\n    var deltaList = el(\"s\", 'desk__module-list', \"\");\n    deltaList.hidden = true;\n    var deltaSave = el(\"span\", 'desk__module-save', \"\");\n    deltaSave.hidden = true;\n    price.appendChild(deltaList);\n    price.appendChild(delta);\n    price.appendChild(deltaSave);\n    var desc = el(\"span\", 'desk__module-desc', \"\");\n    var state = el(\"span\", 'desk__module-state', \"\");\n    label.appendChild(radio);\n    label.appendChild(led);\n    label.appendChild(name);\n    label.appendChild(price);\n    label.appendChild(desc);\n    label.appendChild(state);\n    return {label: label, radio: radio, name: name, delta: delta, deltaList: deltaList, deltaSave: deltaSave, desc: desc, state: state};\n  }\n  function renderOptions(snapshot) {\n    if (!refs.options) { return; }\n    var groups = Array.isArray(snapshot.groups) ? snapshot.groups : [];\n    var order = [];\n    groups.forEach(function (group, index) {\n      var node = groupNodes[group.id];\n      if (!node) {\n        var field = el(\"fieldset\", 'desk__group');\n        field.setAttribute(\"data-option-group\", group.id);\n        var legend = el(\"legend\", \"\");\n        var legendText = el(\"span\", \"\", group.label);\n        var legendIndex = el(\"span\", 'desk__group-index', \"\");\n        legend.appendChild(legendText);\n        legend.appendChild(legendIndex);\n        field.appendChild(legend);\n        var included = moduleRow(group.name, \"\", 'incl');\n        field.appendChild(included.label);\n        node = {field: field, legendText: legendText, legendIndex: legendIndex, included: included, rows: Object.create(null)};\n        groupNodes[group.id] = node;\n        refs.options.appendChild(field);\n      }\n      node.field.setAttribute(\"data-substep\", String(group.index || (index + 1)));\n      setText(node.legendText, group.label);\n      setText(node.legendIndex, \"Groupe \" + (group.index || (index + 1)) + ' \/ ' + groups.length);\n      setText(node.included.name, \"R\u00e8gles du programme, incluses\");\n      setText(node.included.desc, group.description || \"\");\n      setText(node.included.delta, \"inclus\");\n      setHidden(node.included.deltaList, true);\n      setHidden(node.included.deltaSave, true);\n      setText(node.included.state, group.includedSelected === true ? \"Actif\" : \"Disponible\");\n      if (node.included.radio.checked !== (group.includedSelected === true)) { node.included.radio.checked = group.includedSelected === true; }\n      setDisabled(node.included.radio, snapshot.locked === true ? true : snapshot.status !== \"ready\");\n\n      var rowOrder = [];\n      (group.options || []).forEach(function (option) {\n        var row = node.rows[option.id];\n        if (!row) {\n          row = moduleRow(group.name, option.id, option.id);\n          node.rows[option.id] = row;\n          node.field.appendChild(row.label);\n        }\n        setText(row.name, option.label);\n        setText(row.desc, option.description || \"\");\n        setText(row.delta, option.deltaText || \"\u2026\");\n        \/* Barr\u00e9 et \u00e9conomie de l'option : champs du socle, jamais une remise d\u00e9duite du code. *\/\n        var remise = option.deltaPromoApplies === true ? option.deltaSavings > 0 : false;\n        setHidden(row.deltaList, !remise);\n        setHidden(row.deltaSave, !remise);\n        if (remise) {\n          setText(row.deltaList, \"+\" + api.money(option.deltaList));\n          setText(row.deltaSave, '-' + pct(option.deltaSavingsPercent) + \" \u00b7 \" + api.money(option.deltaSavings));\n        }\n        var armed = option.selected === true;\n        var off = option.enabled === false;\n        setText(row.state, off ? \"Non disponible\" : (armed ? \"Arm\u00e9\" : \"En veille\"));\n        if (row.radio.checked !== armed) { row.radio.checked = armed; }\n        setDisabled(row.radio, snapshot.locked === true ? true : (snapshot.status !== \"ready\" ? true : off));\n        rowOrder.push(option.id);\n      });\n      Object.keys(node.rows).forEach(function (id) {\n        if (rowOrder.indexOf(id) < 0) {\n          node.rows[id].label.remove();\n          delete node.rows[id];\n        }\n      });\n      order.push(group.id);\n    });\n    Object.keys(groupNodes).forEach(function (id) {\n      if (order.indexOf(id) < 0) {\n        groupNodes[id].field.remove();\n        delete groupNodes[id];\n      }\n    });\n    setText(refs.optionsLead, snapshot.optionsLead || \"\");\n    setHidden(refs.optionWarning, snapshot.optionWarning !== true);\n    showSub(snapshot.sub);\n  }\n  function showSub(sub) {\n    var wanted = Number(sub) > 0 ? Number(sub) : 1;\n    root.querySelectorAll(\"[data-substep]\").forEach(function (field) {\n      var hide = Number(field.getAttribute(\"data-substep\")) !== wanted;\n      if (field.hidden !== hide) { field.hidden = hide; }\n      if (!hide) { markStagger(field); }\n    });\n  }\n\n  \/* ---------- Compte \u00e0 rebours : seulement sur une \u00e9ch\u00e9ance r\u00e9elle ---------- *\/\n  var countdownTimer = 0, countdownEnd = 0;\n  function stopCountdown() {\n    if (countdownTimer) { window.clearInterval(countdownTimer); countdownTimer = 0; }\n    countdownEnd = 0;\n    if (sheet.countdown) { setHidden(sheet.countdown, true); }\n  }\n  function pad(n) { return n < 10 ? '0' + n : String(n); }\n  function tickCountdown() {\n    if (!countdownEnd) { return; }\n    var left = countdownEnd - Date.now();\n    if (left <= 0) { stopCountdown(); return; }\n    var totalMinutes = Math.floor(left \/ 60000);\n    var days = Math.floor(totalMinutes \/ 1440);\n    var hours = Math.floor((totalMinutes % 1440) \/ 60);\n    var minutes = totalMinutes % 60;\n    var seconds = Math.floor((left % 60000) \/ 1000);\n    var text = days > 0\n      ? days + \" j \" + pad(hours) + \" h \" + pad(minutes) + \" min\"\n      : pad(hours) + \" h \" + pad(minutes) + \" min \" + pad(seconds) + \" s\";\n    setText(sheet.countdown, \"Fin de l\u2019offre dans \" + text);\n    setHidden(sheet.countdown, false);\n  }\n  function syncCountdown(endsAt) {\n    if (!endsAt) { stopCountdown(); return; }\n    var end = Date.parse(endsAt);\n    if (!Number.isFinite(end)) { stopCountdown(); return; }\n    if (end <= Date.now()) { stopCountdown(); return; }\n    if (countdownEnd === end) { return; }\n    countdownEnd = end;\n    tickCountdown();\n    if (!countdownTimer) { countdownTimer = window.setInterval(tickCountdown, 1000); }\n  }\n\n  \/* ---------- \u00c9tape 4 : \u00e9cran de pr\u00e9-lancement ---------- *\/\n  var lastPay = \"\";\n  function setLine(key, visible, fill) {\n    var line = sheet.lines[key];\n    if (!line) { return; }\n    setHidden(line.row, !visible);\n    if (visible) { fill(line.value); }\n  }\n  \/* Bloc des r\u00e8gles de base : titre qualifiant obligatoire, aucune d\u00e9duction sur ce qu'une option modifie. *\/\n  \/* Une phase sans valeur publiee (N\/A) n'est pas une regle : elle n'est jamais affichee. *\/\n  function phasesText(rule) {\n    return (rule.phases || [])\n      .filter(function (p) { return p ? String(p.value) !== 'N\/A' : false; })\n      .map(function (p) { return p.phase + \" : \" + p.value; })\n      .join(' \\u00b7 ');\n  }\n\n  function renderBase(summary) {\n    var rules = Array.isArray(summary.rules) ? summary.rules : [];\n    var key = JSON.stringify(rules);\n    if (sheet.base.__key !== key) {\n      sheet.base.__key = key;\n      fillGauges(sheet.gauges, rules, \"\", 3);\n      sheet.rulesAll.replaceChildren();\n      rules.forEach(function (rule) {\n        var phases = phasesText(rule);\n        if (!phases) { return; }\n        var row = el(\"p\", 'desk__rule');\n        row.appendChild(el(\"b\", \"\", rule.label));\n        row.appendChild(el(\"span\", \"\", phases));\n        sheet.rulesAll.appendChild(row);\n      });\n    }\n    setHidden(sheet.base, rules.length === 0);\n  }\n\n  function renderSummary(snapshot) {\n    if (!refs.recap) { return; }\n    var summary = snapshot.summary;\n    if (!summary) {\n      setText(sheet.name, \"Votre challenge\");\n      setText(sheet.capital, \"\");\n      Object.keys(sheet.lines).forEach(function (key) { setHidden(sheet.lines[key].row, true); });\n      setHidden(sheet.pay, true);\n      setHidden(sheet.listPrice, true);\n      setHidden(sheet.savings, true);\n      setHidden(sheet.priceLabel, true);\n      setHidden(sheet.unavailable, false);\n      setHidden(sheet.base, true);\n      setHidden(sheet.fees, true);\n      setText(sheet.unavailable, snapshot.priceState === \"loading\" ? \"V\u00e9rification du tarif en cours\u2026\" : \"Tarif indisponible. Aucun montant ne peut \u00eatre confirm\u00e9.\");\n      stopCountdown();\n      return;\n    }\n    setHidden(sheet.unavailable, true);\n    setHidden(sheet.priceLabel, false);\n    setHidden(sheet.pay, false);\n    setText(sheet.name, summary.programmeLabel);\n    setText(sheet.capital, spaced(summary.capitalText || api.dollars(summary.capitalAmount)));\n    renderBase(summary);\n    setLine(\"options\", true, function (dd) {\n      var labels = Array.isArray(summary.optionsLabels) ? summary.optionsLabels : [];\n      var key = labels.join(\"|\");\n      if (dd.__key === key) { return; }\n      dd.__key = key;\n      dd.replaceChildren();\n      if (!labels.length) { dd.appendChild(document.createTextNode(\"aucune\")); return; }\n      var wrap = el(\"span\", 'desk__chips');\n      labels.forEach(function (label) { wrap.appendChild(el(\"span\", 'desk__chip', label)); });\n      dd.appendChild(wrap);\n    });\n    var gifts = Array.isArray(summary.gifts) ? summary.gifts : [];\n    var hasOffer = summary.promoCode ? true : gifts.length > 0;\n    setLine('offre', hasOffer, function (dd) {\n      var key = (summary.promoCode || \"\") + \"|\" + gifts.join(\"|\");\n      if (dd.__key === key) { return; }\n      dd.__key = key;\n      dd.replaceChildren();\n      var wrap = el(\"span\", 'desk__chips');\n      if (summary.promoCode) { wrap.appendChild(el(\"span\", 'desk__chip desk__chip--code', \"Code \" + summary.promoCode)); }\n      gifts.forEach(function (gift) { wrap.appendChild(el(\"span\", 'desk__chip desk__chip--gift', gift)); });\n      dd.appendChild(wrap);\n    });\n\n    var payText = api.money(summary.pay);\n    writeAmount(sheet.pay, payText);\n    if (lastPay !== payText) {\n      lastPay = payText;\n    }\n    var discounted = summary.savings > 0;\n    setHidden(sheet.listPrice, !discounted);\n    setHidden(sheet.savings, !discounted);\n    if (discounted) {\n      setText(sheet.listPrice, api.money(summary.list));\n      var savingsText = \"\u00c9conomie \" + api.money(summary.savings) + ' (-' + pct(summary.savingsPercent) + \")\";\n      if (sheet.savings.textContent !== savingsText) {\n        setText(sheet.savings, savingsText);\n      }\n    }\n    \/* Frais d'activation : texte du contr\u00f4leur affich\u00e9 en entier, contre le prix. *\/\n    var fees = summary.feesText || \"\";\n    setText(sheet.fees, fees);\n    setHidden(sheet.fees, !fees);\n    syncCountdown(summary.promoEndsAt);\n  }\n\n  \/* ---------- Ticker ---------- *\/\n  var lastBarTotal = \"\";\n  function renderBar(snapshot) {\n    var bar = snapshot.bar || {};\n    setText(refs.barName, bar.name || \"Votre challenge\");\n    setText(refs.barVariant, bar.variant || \"\");\n    var total = bar.total || \"\u2026\";\n    writeAmount(refs.barTotal, total);\n    if (lastBarTotal !== total) {\n      lastBarTotal = total;\n    }\n    setHidden(refs.barStrike, !bar.strike);\n    if (bar.strike) { setText(refs.barStrike, bar.strike); }\n    \/* Meme libelle que le controleur, mais nombres au format francais : le texte brut de la\n       barre porte un pourcentage a point decimal (-54.22 %). On recompose a partir des\n       nombres du socle, jamais d'un calcul local. *\/\n    var resume = snapshot.summary;\n    var economie = bar.savingsText || \"\";\n    if (economie !== \"\") {\n      if (resume ? resume.savings > 0 : false) {\n        economie = \"\u00c9conomie \" + api.money(resume.savings) + ' (-' + pct(resume.savingsPercent) + \")\";\n      }\n    }\n    setHidden(refs.barSavings, !economie);\n    if (economie) { setText(refs.barSavings, economie); }\n    setHidden(refs.barCode, !bar.code);\n    if (bar.code) { setText(refs.barCode, bar.code); }\n    \/* Les frais d'activation accompagnent le CTA persistant : meme texte integral que la\n       fiche, affiche des que le bouton panier est atteignable, sans troncature ni repli. *\/\n    var fees = snapshot.summary ? (snapshot.summary.feesText || \"\") : \"\";\n    var nav = snapshot.nav || {};\n    var showFees = fees !== \"\" ? nav.ctaVisible === true : false;\n    setText(refs.barFees, fees);\n    setHidden(refs.barFees, !showFees);\n  }\n\n  \/* ---------- Navigation, \u00e9tat du panier, bandeaux ---------- *\/\n  function renderNav(snapshot) {\n    var nav = snapshot.nav || {};\n    var cart = snapshot.cart || {};\n    setHidden(refs.prev, nav.prevVisible !== true);\n    setDisabled(refs.prev, nav.prevDisabled === true);\n    setHidden(refs.next, nav.nextVisible !== true);\n    setDisabled(refs.next, nav.nextDisabled === true);\n    setText(refs.next, nav.nextLabel || \"Continuer\");\n    setHidden(refs.cta, nav.ctaVisible !== true);\n    setText(refs.ctaLabel, cart.ctaLabel || \"Ajouter au panier\");\n    setDisabled(refs.cta, cart.ctaDisabled === true);\n    refs.cta.setAttribute(\"aria-disabled\", String(cart.ctaDisabled === true));\n    refs.cta.setAttribute(\"aria-busy\", String(cart.state === \"checking\"));\n    setText(refs.cartStatus, cart.notice || \"\");\n    setHidden(refs.cartOpen, cart.canOpen !== true);\n    refs.edits.forEach(function (button) { setDisabled(button, snapshot.locked === true); });\n  }\n  function renderNotices(snapshot) {\n    var controls = snapshot.catalogControls || {};\n    setText(refs.catalogStatus, snapshot.catalogNotice || \"\");\n    setHidden(refs.catalogStatus, !snapshot.catalogNotice);\n    setText(refs.entryNotice, snapshot.entryNotice || \"\");\n    setHidden(refs.entryNotice, !snapshot.entryNotice);\n    setHidden(refs.catalogConfirm, controls.confirmVisible !== true);\n    setDisabled(refs.catalogConfirm, snapshot.locked === true);\n    setHidden(refs.sourceControls, controls.refreshVisible !== true);\n    setDisabled(refs.catalogRefresh, controls.refreshDisabled === true);\n    var signal = \"V\u00e9rification du catalogue\";\n    if (snapshot.status === \"unavailable\") { signal = \"Catalogue indisponible\"; }\n    else if (snapshot.status === \"ready\") { signal = snapshot.needsReview === true ? \"V\u00e9rification requise\" : \"Catalogue v\u00e9rifi\u00e9\"; }\n    setText(refs.signal, signal);\n  }\n  function renderRail(snapshot) {\n    refs.rail.forEach(function (item) {\n      var n = Number(item.getAttribute(\"data-step-dot\"));\n      setFlag(item, \"is-done\", n < snapshot.step);\n      setFlag(item, \"is-current\", n === snapshot.step);\n      if (n === snapshot.step) { item.setAttribute(\"aria-current\", \"step\"); }\n      else { item.removeAttribute(\"aria-current\"); }\n    });\n  }\n\n  \/* ---------- Armement visuel : feedback imm\u00e9diat sur le choix ---------- *\/\n  function armed(event) {\n    var choice = event.target.closest ? event.target.closest('[data-choice]') : null;\n    if (!choice) { return; }\n    replay(choice, 'desk__armed');\n  }\n  root.addEventListener(\"change\", armed);\n\n  \/* ---------- Commandes ---------- *\/\n  function bind(node, handler) {\n    if (!node) { return; }\n    node.addEventListener(\"click\", function (event) {\n      event.preventDefault();\n      handler();\n    });\n  }\n  bind(refs.next, function () { api.next(); });\n  bind(refs.prev, function () { api.prev(); });\n  bind(refs.cta, function () {\n    var snapshot = api.snapshot();\n    var cart = snapshot ? snapshot.cart : null;\n    if (cart ? cart.state === \"added\" : false) {\n      if (cart.canOpen === true) { api.openCart(); return; }\n    }\n    api.addToCart();\n  });\n  bind(refs.catalogRefresh, function () { api.refreshCatalog(); });\n  bind(refs.catalogConfirm, function () { api.confirmCatalog(); });\n  bind(refs.cartOpen, function () { api.openCart(); });\n  refs.edits.forEach(function (button) {\n    bind(button, function () { api.go(Number(button.getAttribute(\"data-edit-step\")), 1); });\n  });\n\n  \/* ---------- Hooks ---------- *\/\n  function render(snapshot) {\n    if (!snapshot) { return; }\n    root.setAttribute(\"data-catalog-state\", snapshot.status);\n    renderNotices(snapshot);\n    renderPrograms(snapshot);\n    renderCapitals(snapshot);\n    renderRules(snapshot);\n    renderOptions(snapshot);\n    renderSummary(snapshot);\n    renderBar(snapshot);\n    renderNav(snapshot);\n    renderRail(snapshot);\n    renderConsole(snapshot);\n    syncTickerHeight();\n  }\n\n  function showStep(step, sub, snapshot) {\n    var wanted = Number(step) > 0 ? Number(step) : 1;\n    refs.panels.forEach(function (panel) {\n      var n = Number(panel.getAttribute(\"data-step\"));\n      var hide = n !== wanted;\n      if (panel.hidden !== hide) { panel.hidden = hide; }\n      if (hide) { panel.removeAttribute('data-view-step'); }\n      else { panel.setAttribute('data-view-step', String(n)); }\n    });\n    showSub(sub);\n    if (snapshot) { renderRail(snapshot); }\n    var panel = refs.panels.find(function (p) { return Number(p.getAttribute(\"data-step\")) === wanted; });\n    if (wanted === 4) { revealSheet(); }\n    \/* La barre gagne la ligne de frais au recapitulatif : la reserve de defilement est\n       recalculee meme sans ResizeObserver. *\/\n    syncTickerHeight();\n    if (panel) {\n      replay(panel, 'desk__panel-frame');\n      var heading = panel.querySelector('h1, h2');\n      if (heading) {\n        heading.setAttribute(\"tabindex\", \"-1\");\n        heading.focus({preventScroll: true});\n      }\n    }\n    window.scrollTo({top: 0, behavior: \"instant\"});\n  }\n\n  var stopMobileFocus = window.WGFMobileFocus(root, refs.bar);\n  function destroy() {\n    stopMobileFocus();\n    traceStop = true;\n    if (traceRaf) { window.cancelAnimationFrame(traceRaf); traceRaf = 0; }\n    window.removeEventListener('resize', traceResize);\n    document.removeEventListener(\"visibilitychange\", traceWake);\n    stopCountdown();\n\n    if (tickerWatch) { tickerWatch.disconnect(); }\n    window.removeEventListener('resize', syncTickerHeight);\n  }\n\n  return {render: render, showStep: showStep, destroy: destroy};\n};\n<\/script>\n<script data-wgf-module=\"interface.js\">\/* Contr\u00f4leur commun d\u00e9riv\u00e9 de v8. Rendu d\u00e9l\u00e9gu\u00e9 ; mesure conserv\u00e9e. *\/\n(function () {\n  \"use strict\";\n  var root = document.querySelector(\"[data-wgf-tunnel]\");\n  if (!root || root.__wgfTunnelMounted) { return; }\n  root.__wgfTunnelMounted=true;\n  var source = window.WGFCatalogue, engine = window.WGFTunnel, prefill = window.WGFPrefill, cart=window.WGFPanier;\n  var VERSION = \"20261023-trading-desk-fr-v2\", LOCALE = \"fr-FR\";\n  var hooks, lastSnapshot, shownStep=null, shownSub=null;\n  var submitting=false, added=false, cartError=\"\", cartUncertain=false, promoUnavailable=false;\n  var ORIGIN = root.getAttribute(\"data-origin\") || \"https:\/\/wegetfunded.com\";\n  var catalog = null, offer = null, status = \"loading\", priceState = \"loading\";\n  var state = {step:1, sub:1, programme:null, capital:null, options:[]};\n  var signature = \"\", needsReview = false, inFlight = null, lastCheck = 0;\n  var entryApplied=false, entryProblems=[], pendingProgramme=false, prefillPending=false;\n  var complete={programme:false,capital:false,options:false};\n  var promoQuery = location.search;\n  var lastCookieCode = engine.promoCookie(cookies()), promoRevision = 0, expiryTimer;\n  function el(tag, className, content) {\n    var node = document.createElement(tag);\n    if (className) { node.className = className; }\n    if (content !== undefined) { node.textContent = content; }\n    return node;\n  }\n  function money(n) { return new Intl.NumberFormat(LOCALE,{style:\"currency\",currency:\"EUR\"}).format(n); }\n  function dollars(n) { return new Intl.NumberFormat(LOCALE,{style:\"currency\",currency:\"USD\",maximumFractionDigits:0}).format(n); }\n  function program() { return catalog ? catalog.programs[state.programme] : null; }\n  function product() { return program() ? program().capitals.find(function (p) { return p.capitalId === state.capital; }) : null; }\n  function groups() { return program() ? program().groups : []; }\n  function priceFor(ids) {\n    if (!product() || status !== \"ready\") { return null; }\n    try {\n      var applied = engine.applies(offer, product(), program().type) ? offer : null;\n      var unit = engine.catalogUnitPrice(product().price, engine.payableOptions(source.selectedOptions(program(), ids), applied));\n      return {list:unit.price, pay:engine.discounted(unit.price,unit.flat,applied), promo:applied};\n    } catch (e) { return null; }\n  }\n  function project() {\n    var max=Math.max(1,groups().length);state.sub=Math.max(1,Math.min(state.sub,max));\n    lastSnapshot=window.WGFInstantane({source:source,engine:engine,catalog:catalog,offer:offer,status:status,state:state,\n      needsReview:needsReview,entryProblems:entryProblems,complete:complete,promoState:root.getAttribute(\"data-promo-state\")||\"loading\",\n      promoUnavailable:promoUnavailable,submitting:submitting,added:added,cartError:cartError,cartUncertain:cartUncertain,\n      originOK:cart ? cart.supported(location.origin) : false,version:VERSION});\n    priceState=lastSnapshot.priceState;\n    root.setAttribute(\"data-price-state\",priceState);root.setAttribute(\"data-cart-state\",lastSnapshot.cart.state);\n    root.setAttribute(\"data-catalog-state\",status);root.setAttribute(\"data-catalog-review\",String(needsReview));\n    root.setAttribute(\"data-entry-state\",entryApplied?(entryProblems.length?\"needs_review\":\"resolved\"):\"loading\");\n    return lastSnapshot;\n  }\n  function renderSummary(){hooks.render(project());}\n  function renderNavigation(){hooks.render(project());}\n  function clearEntryProblem(field){entryProblems=entryProblems.filter(function(e){return e.field!==field;});}\n  function acceptProgramme(){\n    complete.programme=true;clearEntryProblem(\"programme\");\n    if(!pendingProgramme){return;}\n    pendingProgramme=false;\n    var params=new URLSearchParams(location.search);params.set(\"challengeType\",program().type);\n    var resolved=prefill.resolve(catalog,params.toString());\n    Object.assign(state,resolved.selection);complete=resolved.complete;entryProblems=resolved.errors;\n  }\n  function render() {\n    hooks.render(project());\n    if(typeof configuredWatch===\"function\"){configuredWatch();configuratorViewed();}\n    if(shownStep!==state.step||shownSub!==state.sub){shownStep=state.step;shownSub=state.sub;hooks.showStep(state.step,state.sub,lastSnapshot);}\n  }\n  function go(step,sub) {\n    if(submitting||added||cartUncertain){return;}\n    state.step=Math.max(1,Math.min(4,Number(step)||1));state.sub=sub||1;\n    if(state.step===3?!groups().length:false){if(!entryProblems.some(function(e){return e.field===\"options\";})){state.step=4;}}\n    renderNavigation();track(\"lp_step_viewed\",{step_index:state.step,step_name:[\"programme\",\"capital\",\"options\",\"recap\"][state.step-1],sub_step:state.sub});\n    shownStep=state.step;shownSub=state.sub;hooks.showStep(state.step,state.sub,lastSnapshot);\n  }\n  function select(name,value){\n    if(status!==\"ready\"||submitting||added||cartUncertain){return;}\n    cartError=\"\";\n    if(name===\"programme\"){\n      if(!catalog.programs[value]){return;}\n      if(!complete.capital){state.capital=null;}\n      state.programme=value;state.options=[];state.sub=1;Object.assign(state,source.reconcile(catalog,state));\n      complete={programme:true,capital:false,options:groups().length===0};entryProblems=[];acceptProgramme();\n    }\n    else if(name===\"capital\"){\n      if(!program().capitals.some(function(c){return c.capitalId===value;})){return;}\n      state.capital=value;complete.capital=true;clearEntryProblem(\"capital\");\n    }\n    else{\n      var group=groups().find(function(g){return g.name===name;});if(!group){return;}\n      if(value?!group.options.some(function(o){return o.optionId===value?o.enabled:false;}):false){return;}\n      state.options=state.options.filter(function(id){return !group.options.some(function(o){return o.optionId===id;});});if(value){state.options.push(value);}\n    }\n    render();\n  }\n  function next(){\n    if(status!==\"ready\"||submitting||added||cartUncertain){return;}track(\"lp_step_completed\",{step_index:state.step,sub_step:state.sub,selection:{programme:state.programme,capital:state.capital,options:state.options.slice()}});\n    if(state.step===1){acceptProgramme();render();go(complete.capital?(complete.options?4:3):2);}\n    else if(state.step===2){complete.capital=true;clearEntryProblem(\"capital\");render();go(complete.options?4:3);}\n    else if(state.sub<groups().length){go(3,state.sub+1);}\n    else{complete.options=true;clearEntryProblem(\"options\");render();go(4);}\n  }\n  function prev(){\n    if(submitting||added||cartUncertain){return;}\n    if(state.step===3?state.sub>1:false){go(3,state.sub-1);}\n    else if(state.step===4){go(groups().length?3:2,groups().length);}\n    else{go(state.step-1);}\n  }\n  function openCart(){window.location.assign(cart.destination(location.origin,location.search));}\n  var api={money:money,dollars:dollars,snapshot:function(){return lastSnapshot;},\n    selectProgramme:function(key){select(\"programme\",key);},selectCapital:function(id){select(\"capital\",id);},selectOption:function(group,id){select(group,id);},\n    next:next,prev:prev,go:go,addToCart:addToCart,openCart:openCart,refreshCatalog:loadCatalog,confirmCatalog:function(){if(status===\"ready\"){needsReview=false;render();}}};\n  hooks=window.WGFVue(root,api);\n  root.addEventListener(\"change\",function(e){if(e.target.matches(\"input[type=radio]\")){select(e.target.name,e.target.value);}});\n  root.addEventListener(\"wgf-tunnel-go\",function(e){go(e.detail.step,e.detail.sub);});\n  function cartSignature(){return JSON.stringify({programme:state.programme,capital:state.capital,options:state.options.slice().sort(),price:priceFor(state.options),offer:offer});}\n  function cartFailure(e){\n    var messages={cart_selection:\"Ce pack n\u2019est pas reconnu par le contrat panier actuel. V\u00e9rifiez sa disponibilit\u00e9 sur le site.\",cart_corrupt:\"Votre panier existant ne peut pas \u00eatre lu. Il a \u00e9t\u00e9 conserv\u00e9 sans modification.\",cart_existing_changed:\"Ce pack existe d\u00e9j\u00e0 au panier avec des conditions diff\u00e9rentes. V\u00e9rifiez votre panier avant de le compl\u00e9ter.\",cart_free_trial:\"Votre panier contient un essai gratuit. Retirez-le du panier avant d\u2019ajouter un challenge payant.\",cart_concurrent:\"Le panier ou le code a chang\u00e9 dans un autre onglet. R\u00e9essayez pour reprendre son \u00e9tat actuel.\",cart_uncertain:\"L\u2019\u00e9criture du panier n\u2019a pas pu \u00eatre confirm\u00e9e. V\u00e9rifiez-le avant toute nouvelle tentative.\"};\n    lpDiagnostic(\"configurator_error\",\"cart\",Object.prototype.hasOwnProperty.call(messages,e.message)?e.message:\"cart_other\");\n    cartUncertain=e.message===\"cart_uncertain\";cartError=messages[e.message]||\"L\u2019ajout n\u2019a pas pu \u00eatre confirm\u00e9. V\u00e9rifiez que le stockage et les cookies sont autoris\u00e9s, puis r\u00e9essayez.\";\n  }\n  function addToCart(){\n    if(submitting||cartUncertain||!cart||!cart.supported(location.origin)){return;}\n    if(added){openCart();return;}\n    if(lastSnapshot.cart.ctaDisabled||state.step!==4||!complete.programme||!complete.capital||!complete.options){return;}\n    var before, storage, viewed=cartSignature(), cookieStart=engine.promoCookie(cookies());\n    try{storage=window.localStorage;before=cart.snapshot(storage);}catch(error){cartFailure(error);renderSummary();return;}\n    submitting=true;cartError=\"\";render();\n    loadCatalog().then(function(ok){\n      if(!ok||promoUnavailable||root.getAttribute(\"data-promo-state\")!==\"resolved\"){return;}\n      if(needsReview||entryProblems.length||viewed!==cartSignature()){needsReview=true;return;}\n      if(cookieStart!==engine.promoCookie(cookies())){throw new Error(\"cart_concurrent\");}\n      var item=cart.build(catalog,state), total=priceFor(state.options);\n      \/\/ Code personnel valid\u00e9, m\u00eame s'il ne couvre que d'autres lignes d\u00e9j\u00e0 au panier.\n      var code=offer?engine.normalizePromoCode(offer.code):\"\";\n      var plan=cart.prepare(before,item,code,function(){return window.crypto.randomUUID();});\n      var result=cart.commit(storage,document,location.origin,plan);\n      added=true;lastCookieCode=engine.promoCookie(cookies());\n      var destination=cart.destination(location.origin,location.search), parti=false;\n      function allerAuPanier(){if(parti){return;}parti=true;window.location.assign(destination);}\n      try{\n        frontTrack(\"cart_item_added\",mesure.cartItemProps(Object.assign({},item,{quantity:1}),result.cartId,state.options.slice()),{instant:true,eventCallback:function(){window.setTimeout(allerAuPanier,300);}},{price_displayed_pay:total.pay,selection_preserved:true,cart_source:\"guided_configurator\"});\n      }catch(ignore){\/* La mesure ne rejoue jamais l'ajout. *\/}\n      window.setTimeout(allerAuPanier,1500);\n    }).catch(function(error){if(added){cartError=\"Votre pack est ajout\u00e9. Cliquez pour ouvrir le panier, sans nouvel ajout.\";}else{cartFailure(error);}}).finally(function(){submitting=false;render();});\n  }\n  function cookies(){try{return document.cookie;}catch(e){return \"\";}}\n  function getJSON(url){return fetch(url,{credentials:\"omit\",cache:\"no-store\",signal:AbortSignal.timeout(8000)}).then(function(r){if(!r.ok){throw new Error(\"promo_unavailable\");}return r.json();});}\n  function validate(code){return getJSON(ORIGIN+\"\/api\/promo-codes\/validate?code=\"+encodeURIComponent(code)).then(function(d){return d.valid===true?engine.validPromo(d.promo):null;}).catch(function(e){promoUnavailable=true;lpDiagnostic(\"configurator_error\",\"promo\",\"unavailable\");throw e;});}\n  function loadPromo(){\n    var saved=engine.promoCookie(cookies());if(saved!==lastCookieCode){promoQuery=\"\";lastCookieCode=saved;}\n    var revision=++promoRevision;promoUnavailable=false;window.clearTimeout(expiryTimer);offer=null;root.setAttribute(\"data-promo-state\",\"loading\");renderSummary();\n    return engine.resolveVisitorPromo(promoQuery,cookies(),validate).then(function(p){\n      if(revision!==promoRevision){return;}offer=p;root.setAttribute(\"data-promo-state\",\"resolved\");render();sendPrefillEvent();lpDiagnostic(\"configurator_offer_state\",\"promo\",promoUnavailable?\"unavailable\":p?\"validated\":(engine.promoCookie(cookies())||new URLSearchParams(promoQuery).has(\"promo\")||new URLSearchParams(promoQuery).has(\"code\")?\"rejected\":\"none\"));\n      function expire(){if(revision!==promoRevision||!offer||!offer.endsAt){return;}var left=Date.parse(offer.endsAt)-Date.now();if(left<=0){offer=null;render();lpDiagnostic(\"configurator_offer_state\",\"promo\",\"expired\");return;}expiryTimer=window.setTimeout(expire,Math.min(left,2147483647));}expire();\n    });\n  }\n  function loadCatalog(){\n    if(inFlight){return inFlight;}\n    status=\"loading\";render();\n    inFlight=fetch(ORIGIN+\"\/fr\",{credentials:\"omit\",cache:\"no-store\",signal:AbortSignal.timeout(8000)})\n      .then(function(r){if(!r.ok){throw new Error(\"catalog_unavailable\");}return r.text();})\n      .then(function(html){\n        var next=source.fromHTML(html), fingerprint=JSON.stringify(next);\n        if(signature?signature!==fingerprint:false){needsReview=true;}\n        signature=fingerprint;catalog=next;\n        if(!entryApplied){\n          var resolved=prefill.resolve(catalog,location.search);\n          Object.assign(state,resolved.selection);state.step=resolved.step;state.sub=resolved.sub;\n          complete=resolved.complete;entryProblems=resolved.errors;entryApplied=true;\n          pendingProgramme=!complete.programme?(resolved.provided.capital||resolved.provided.options):false;\n          prefillPending=complete.programme||complete.capital||complete.options;\n        }else{Object.assign(state,source.reconcile(catalog,state));}\n        status=\"ready\";lastCheck=Date.now();\n        root.setAttribute(\"data-catalog-checked-at\",new Date(lastCheck).toISOString());render();return loadPromo();\n      }).then(function(){return true;}).catch(function(){\n        status=\"unavailable\";lpDiagnostic(\"configurator_error\",\"catalogue\",\"unavailable\");offer=null;catalog=null;promoRevision++;window.clearTimeout(expiryTimer);root.setAttribute(\"data-promo-state\",\"resolved\");render();return false;\n      }).finally(function(){inFlight=null;});\n    return inFlight;\n  }\n  root.addEventListener(\"wgf-tunnel-refresh\",loadCatalog);\n  function refreshIfIdle(){if(submitting||added||cartUncertain){return;}loadCatalog();}\n  window.addEventListener(\"focus\",refreshIfIdle);\n  document.addEventListener(\"visibilitychange\",function(){if(!document.hidden){refreshIfIdle();}});\n  window.addEventListener(\"pageshow\",function(e){if(e.persisted){refreshIfIdle();}});\n  window.setInterval(function(){\n    if(document.hidden||inFlight||submitting||added||cartUncertain){return;}\n    if(Date.now()-lastCheck>=60000){loadCatalog();return;}\n    if(catalog?engine.promoCookie(cookies())!==lastCookieCode:false){loadPromo();}\n  },1000);\n\n  var sdk=null, lpSdkReady=false, lpSdkLoading=false, lpSdkTries=0, lpQueue=[], lpDiagSeen=new Set(), lpPageSent=false, lpLastConsent=null;\n  function consent(){var m=cookies().match('(^|;)\\\\s*consent_state\\\\s*=\\\\s*([^;]*)');try{return m?decodeURIComponent(m[2]).trim().toLowerCase():null;}catch(e){return null;}}\n  function sendPrefillEvent(){\n    if(!prefillPending||!sdk||status!=='ready'||root.getAttribute('data-promo-state')!=='resolved'){return;}\n    prefillPending=false;var total=priceFor(state.options);\n    track('configurator_prefilled',{capital:product().amount,challenge_type:program().type,options:state.options.slice(),price_displayed:total?total.pay:null,entry_step:state.step,entry_valid:!entryProblems.length});\n  }\n  var mesure=window.WGFMesure, frontQueue=[], viewedSent=false, interacted=false, configuredKey=null, configuredTimer=null;\n  function lpExtra(){return {lp_id:root.getAttribute('data-lp-id'),lp_family:root.getAttribute('data-lp-family'),lp_version:VERSION,locale_lp:LOCALE};}\n  function frontEnv(){return {window:window,document:document,location:location,cookies:cookies};}\n  function frontTrack(event,props,opts,extra){\n    if(!mesure){return;}\n    var o=Object.assign({},opts||{},{differer:function(c){if(frontQueue.length<40){frontQueue.push(c);}}});\n    try { mesure.track(frontEnv(),lpSdkReady?sdk:null,event,props,o,Object.assign(lpExtra(),extra||{})); } catch (e) { \/* mesure non bloquante *\/ }\n  }\n  function flushFront(){if(!lpAllowed()){frontQueue=[];return;}var q=frontQueue;frontQueue=[];q.forEach(function(c){try{sdk.capture(c[0],c[1],c[2]);}catch(e){\/* sans rejeu *\/}});}\n  function configuratorViewed(){\n    if(viewedSent||status!=='ready'){return;}viewedSent=true;\n    window.setTimeout(function(){frontTrack('challenge_configurator_viewed',{});},1000);\n  }\n  function selectionKey(){return [state.programme||'',state.capital||'',state.options.slice().sort().join(',')].join('|');}\n  function configuredWatch(){\n    if(status!=='ready'||!product()){return;}\n    var key=selectionKey();if(configuredKey===null){configuredKey=key;return;}\n    if(key===configuredKey){return;}configuredKey=key;\n    if(!interacted){return;}\n    window.clearTimeout(configuredTimer);\n    configuredTimer=window.setTimeout(function(){\n      if(!product()){return;}var total=priceFor(state.options),amount=Math.round(product().amount||0);\n      frontTrack('challenge_configured',{challenge_family:mesure.family(program().type),challenge_size:mesure.challengeSizeSku(amount),challenge_size_value:amount,addons:source.selectedOptions(program(),state.options).map(function(o){return o.uuid;}).filter(function(u){return u!==null;}),price_displayed:total?total.pay:0,is_final_state:true});\n    },2500);\n  }\n  root.addEventListener('pointerdown',function(){interacted=true;},{capture:true});\n  root.addEventListener('keydown',function(){interacted=true;},{capture:true});\n  \/* T012 candidat complet pour T016, non d\u00e9ploy\u00e9. Prix\/panier\/offre inchang\u00e9s. *\/\n  function lpAllowed() { return mesure.isConsentGranted(consent()); }\n  function lpSafeURL(value) {\n    if (typeof value !== 'string' || !value) { return ''; }\n    try { var u = new URL(value, location.href); return u.origin + u.pathname; } catch (e) { return ''; }\n  }\n  function lpSafeTag(value) {\n    if (typeof value !== 'string' || value.length > 128) { return null; }\n    if (!\/^[\\p{L}\\p{N} _.:|(){}-]+$\/u.test(value)) { return null; }\n    if (\/https?:|www\\.|[0-9]{7,}\/i.test(value)) { return null; }\n    return value;\n  }\n  function lpOpt(method, props) {\n    try { if (sdk) { if (typeof sdk[method] === 'function') { sdk[method](props); } } } catch (e) { \/* non bloquant *\/ }\n  }\n  function lpBeforeSend(event) {\n    if (!lpAllowed()) { return null; }\n    Object.keys(event.properties || {}).forEach(function (k) {\n      if (['page_url', '$current_url', 'page_referrer', '$referrer', '$initial_current_url', '$initial_referrer', 'destination'].indexOf(k) >= 0) {\n        event.properties[k] = lpSafeURL(event.properties[k]);\n      }\n      if (\/^(?:\\$initial_)?utm_(campaign|content|term)$\/.test(k)) {\n        var v = lpSafeTag(event.properties[k]); if (v) { event.properties[k] = v; } else { delete event.properties[k]; }\n      }\n    });\n    delete event.properties.$set; delete event.properties.$set_once;\n    return event;\n  }\n  function lpDiagnostic(event, domain, status) {\n    if (!lpAllowed()) { return; }\n    var key = event + ':' + domain + ':' + status;\n    if (lpDiagSeen.has(key)) { return; }\n    if (track(event, {diagnostic_domain: domain, diagnostic_status: status,\n      validation_scope: 'public_api_not_customer_eligibility'})) { lpDiagSeen.add(key); }\n  }\n  function flushLp() {\n    if (!lpAllowed()) { lpQueue = []; frontQueue = []; return; }\n    if (!lpSdkReady) { return; }\n    var q = lpQueue; lpQueue = [];\n    q.forEach(function (c) { try { sdk.capture(c[0], c[1]); } catch (e) { \/* ne pas rejouer un envoi incertain *\/ } });\n  }\n  function track(event, props) {\n    if (!lpAllowed()) { lpQueue = []; return false; }\n    var total = priceFor(state.options);\n    var payload = Object.assign({lp_id: root.getAttribute('data-lp-id'), lp_family: root.getAttribute('data-lp-family'),\n      lp_version: VERSION, template_version: VERSION, locale: LOCALE, page_path: location.pathname,\n      consent_state: consent() === 'granted' ? 'granted' : 'unknown', consent_source: consent() === 'granted' ? 'explicit' : 'default',\n      measurement_policy: 'default_on', price_state: priceState,\n      promo_code: total ? (total.promo ? total.promo.code : null) : null, programme: state.programme,\n      capital: state.capital, options: state.options.slice(), selection_preserved: false, _destinations: []}, props || {});\n    var params = new URLSearchParams(location.search);\n    ['utm_campaign', 'utm_content', 'utm_term'].forEach(function (k) { var v = lpSafeTag(params.get(k)); if (v) { payload[k] = v; } });\n    var campaignId = params.get('utm_id'); if (\/^[0-9]{1,30}$\/.test(campaignId || '')) { payload.utm_id = campaignId; }\n    if (lpSdkReady) { try { sdk.capture(event, payload); } catch (e) { \/* non bloquant, sans rejeu *\/ } }\n    else if (lpQueue.length < 60) { lpQueue.push([event, payload]); }\n    else { return false; }\n    return true;\n  }\n  function lpInitial() {\n    if (!lpAllowed() || !lpSdkReady || lpPageSent) { return; }\n    lpPageSent = true; track('page_viewed');\n    if (!lpQueue.some(function (c) { return c[0] === 'lp_step_viewed'; })) {\n      track('lp_step_viewed', {step_index: state.step, step_name: ['programme', 'capital', 'options', 'recap'][state.step - 1]});\n    }\n  }\n  function lpReady(client) {\n    if (lpSdkReady) { return; }\n    sdk = client; lpSdkReady = true; lpSdkLoading = false;\n    if (consent() === 'granted') { lpOpt('opt_in_capturing', {captureEventName: false}); }\n    if (!lpAllowed()) { lpQueue = []; frontQueue = []; lpDiagSeen.clear(); return; }\n    lpInitial(); flushLp(); sendPrefillEvent(); flushFront();\n  }\n  function lpStart() {\n    if (!lpAllowed() || lpSdkLoading || lpSdkReady || lpSdkTries >= 2) { return; }\n    if (location.hostname !== 'wegetfunded.com' ? location.hostname !== 'www.wegetfunded.com' : false) { return; }\n    lpSdkLoading = true; lpSdkTries++;\n    function init() {\n      if (!lpAllowed() || !window.posthog) { lpSdkLoading = false; return; }\n      sdk = window.posthog;\n      try {\n        var cfg = {api_host: '\/s', capture_pageview: false, capture_pageleave: false, autocapture: false,\n          disable_session_recording: true, disable_surveys: true, advanced_disable_feature_flags: true,\n          before_send: lpBeforeSend, loaded: lpReady};\n        if (sdk.__loaded) { sdk.set_config(cfg); lpReady(sdk); }\n        else { sdk.init('phc_Cx86yLkm9TgRUVEW9Gn4NbbPys6dFx3ScepvdEc3Ehsu', cfg); }\n      } catch (e) { lpSdkLoading = false; lpSdkReady = false; sdk = null; }\n    }\n    if (window.posthog) { if (typeof window.posthog.init === 'function') { init(); return; } }\n    var lib = el('script'); lib.src = '\/s\/static\/array.js'; lib.async = true;\n    lib.onload = init; lib.onerror = function () { lpSdkLoading = false; };\n    document.head.appendChild(lib);\n  }\n  lpStart();\n  window.setInterval(function () {\n    var current = consent();\n    if (current === lpLastConsent) { return; }\n    lpLastConsent = current;\n    if (current === 'granted') { lpOpt('opt_in_capturing', {captureEventName: false}); }\n    if (!lpAllowed()) { lpQueue = []; frontQueue = []; lpDiagSeen.clear(); lpOpt('opt_out_capturing'); }\n    else { lpStart(); lpInitial(); flushLp(); }\n  }, 1000);\n\n  loadCatalog();\n})();\n\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>Choisissez votre programme, votre capital simul\u00e9 et vos options, puis ajoutez votre challenge au panier.<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"lp-configurateur","format":"standard","meta":{"_wgf_editorial_author":"","_wgf_editorial_kind":"","footnotes":""},"categories":[26],"tags":[],"class_list":["post-466","post","type-post","status-publish","format-standard","hentry","category-lp-ads"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Configurez votre challenge de trading | WeGetFunded<\/title>\n<meta name=\"description\" content=\"Choisissez votre programme, votre capital simul\u00e9 et vos options, puis ajoutez votre challenge au panier.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wegetfunded.com\/fr\/blog\/configurer-mon-challenge\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Configurez votre challenge de trading | WeGetFunded\" \/>\n<meta property=\"og:description\" content=\"Choisissez votre programme, votre capital simul\u00e9 et vos options, puis ajoutez votre challenge au panier.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wegetfunded.com\/fr\/blog\/configurer-mon-challenge\/\" \/>\n<meta property=\"og:site_name\" content=\"WeGetFunded\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-21T15:40:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-23T11:58:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wegetfunded.com\/logos\/wgf-logo.svg\" \/>\n<meta name=\"author\" content=\"WeGetFunded\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"WeGetFunded\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/fr\\\/blog\\\/configurer-mon-challenge\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/fr\\\/blog\\\/configurer-mon-challenge\\\/\"},\"author\":{\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/#organization\",\"name\":\"WeGetFunded\"},\"headline\":\"Configurez votre challenge de trading | WeGetFunded\",\"datePublished\":\"2026-09-21T15:40:34+00:00\",\"dateModified\":\"2026-10-23T11:58:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/fr\\\/blog\\\/configurer-mon-challenge\\\/\"},\"wordCount\":845,\"image\":{\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/fr\\\/blog\\\/configurer-mon-challenge\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/wegetfunded.com\\\/logos\\\/wgf-logo.svg\",\"articleSection\":[\"Pages d'atterrissage (annonces)\"],\"inLanguage\":\"fr\",\"publisher\":{\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/fr\\\/blog\\\/configurer-mon-challenge\\\/\",\"url\":\"https:\\\/\\\/wegetfunded.com\\\/fr\\\/blog\\\/configurer-mon-challenge\\\/\",\"name\":\"Configurez votre challenge de trading | WeGetFunded\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/fr\\\/blog\\\/configurer-mon-challenge\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/fr\\\/blog\\\/configurer-mon-challenge\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/wegetfunded.com\\\/logos\\\/wgf-logo.svg\",\"datePublished\":\"2026-09-21T15:40:34+00:00\",\"dateModified\":\"2026-10-23T11:58:34+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/#organization\"},\"description\":\"Choisissez votre programme, votre capital simul\u00e9 et vos options, puis ajoutez votre challenge au panier.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/fr\\\/blog\\\/configurer-mon-challenge\\\/#breadcrumb\"},\"inLanguage\":\"fr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wegetfunded.com\\\/fr\\\/blog\\\/configurer-mon-challenge\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr\",\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/fr\\\/blog\\\/configurer-mon-challenge\\\/#primaryimage\",\"url\":\"https:\\\/\\\/wegetfunded.com\\\/logos\\\/wgf-logo.svg\",\"contentUrl\":\"https:\\\/\\\/wegetfunded.com\\\/logos\\\/wgf-logo.svg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/fr\\\/blog\\\/configurer-mon-challenge\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/wegetfunded.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Configurez votre challenge de trading | WeGetFunded\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/#website\",\"url\":\"https:\\\/\\\/wegetfunded.com\",\"name\":\"WeGetFunded\",\"publisher\":{\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/#organization\"},\"inLanguage\":[\"fr\",\"en\",\"es\",\"it\",\"de\"]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/#organization\",\"name\":\"WeGetFunded\",\"alternateName\":[\"We Get Funded\",\"WGF\"],\"legalName\":\"WeGetFunded LTD.\",\"url\":\"https:\\\/\\\/wegetfunded.com\",\"logo\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/#logo\",\"url\":\"https:\\\/\\\/wegetfunded.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/wgf-site-icon-512.png\",\"contentUrl\":\"https:\\\/\\\/wegetfunded.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/wgf-site-icon-512.png\",\"width\":512,\"height\":512,\"caption\":\"WeGetFunded\"},\"image\":{\"@id\":\"https:\\\/\\\/wegetfunded.com\\\/#logo\"},\"sameAs\":[\"https:\\\/\\\/www.youtube.com\\\/@wegetfunded\",\"https:\\\/\\\/x.com\\\/wegetfunded\",\"https:\\\/\\\/discord.com\\\/invite\\\/rrcRVgq2J3\",\"https:\\\/\\\/play.google.com\\\/store\\\/apps\\\/details?id=com.wegetfunded.app\",\"https:\\\/\\\/instagram.com\\\/wegetfundedcom\",\"https:\\\/\\\/tiktok.com\\\/@wegetfunded\",\"https:\\\/\\\/facebook.com\\\/wegetfunded\",\"https:\\\/\\\/t.me\\\/wegetfunded\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Configurez votre challenge de trading | WeGetFunded","description":"Choisissez votre programme, votre capital simul\u00e9 et vos options, puis ajoutez votre challenge au panier.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wegetfunded.com\/fr\/blog\/configurer-mon-challenge\/","og_locale":"fr_FR","og_type":"article","og_title":"Configurez votre challenge de trading | WeGetFunded","og_description":"Choisissez votre programme, votre capital simul\u00e9 et vos options, puis ajoutez votre challenge au panier.","og_url":"https:\/\/wegetfunded.com\/fr\/blog\/configurer-mon-challenge\/","og_site_name":"WeGetFunded","article_published_time":"2026-09-21T15:40:34+00:00","article_modified_time":"2026-10-23T11:58:34+00:00","og_image":[{"url":"https:\/\/wegetfunded.com\/logos\/wgf-logo.svg","type":"","width":"","height":""}],"author":"WeGetFunded","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"WeGetFunded","Dur\u00e9e de lecture estim\u00e9e":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wegetfunded.com\/fr\/blog\/configurer-mon-challenge\/#article","isPartOf":{"@id":"https:\/\/wegetfunded.com\/fr\/blog\/configurer-mon-challenge\/"},"author":{"@id":"https:\/\/wegetfunded.com\/#organization","name":"WeGetFunded"},"headline":"Configurez votre challenge de trading | WeGetFunded","datePublished":"2026-09-21T15:40:34+00:00","dateModified":"2026-10-23T11:58:34+00:00","mainEntityOfPage":{"@id":"https:\/\/wegetfunded.com\/fr\/blog\/configurer-mon-challenge\/"},"wordCount":845,"image":{"@id":"https:\/\/wegetfunded.com\/fr\/blog\/configurer-mon-challenge\/#primaryimage"},"thumbnailUrl":"https:\/\/wegetfunded.com\/logos\/wgf-logo.svg","articleSection":["Pages d'atterrissage (annonces)"],"inLanguage":"fr","publisher":{"@id":"https:\/\/wegetfunded.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/wegetfunded.com\/fr\/blog\/configurer-mon-challenge\/","url":"https:\/\/wegetfunded.com\/fr\/blog\/configurer-mon-challenge\/","name":"Configurez votre challenge de trading | WeGetFunded","isPartOf":{"@id":"https:\/\/wegetfunded.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/wegetfunded.com\/fr\/blog\/configurer-mon-challenge\/#primaryimage"},"image":{"@id":"https:\/\/wegetfunded.com\/fr\/blog\/configurer-mon-challenge\/#primaryimage"},"thumbnailUrl":"https:\/\/wegetfunded.com\/logos\/wgf-logo.svg","datePublished":"2026-09-21T15:40:34+00:00","dateModified":"2026-10-23T11:58:34+00:00","author":{"@id":"https:\/\/wegetfunded.com\/#organization"},"description":"Choisissez votre programme, votre capital simul\u00e9 et vos options, puis ajoutez votre challenge au panier.","breadcrumb":{"@id":"https:\/\/wegetfunded.com\/fr\/blog\/configurer-mon-challenge\/#breadcrumb"},"inLanguage":"fr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wegetfunded.com\/fr\/blog\/configurer-mon-challenge\/"]}]},{"@type":"ImageObject","inLanguage":"fr","@id":"https:\/\/wegetfunded.com\/fr\/blog\/configurer-mon-challenge\/#primaryimage","url":"https:\/\/wegetfunded.com\/logos\/wgf-logo.svg","contentUrl":"https:\/\/wegetfunded.com\/logos\/wgf-logo.svg"},{"@type":"BreadcrumbList","@id":"https:\/\/wegetfunded.com\/fr\/blog\/configurer-mon-challenge\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/wegetfunded.com\/"},{"@type":"ListItem","position":2,"name":"Configurez votre challenge de trading | WeGetFunded"}]},{"@type":"WebSite","@id":"https:\/\/wegetfunded.com\/#website","url":"https:\/\/wegetfunded.com","name":"WeGetFunded","publisher":{"@id":"https:\/\/wegetfunded.com\/#organization"},"inLanguage":["fr","en","es","it","de"]},{"@type":"Organization","@id":"https:\/\/wegetfunded.com\/#organization","name":"WeGetFunded","alternateName":["We Get Funded","WGF"],"legalName":"WeGetFunded LTD.","url":"https:\/\/wegetfunded.com","logo":{"@type":"ImageObject","@id":"https:\/\/wegetfunded.com\/#logo","url":"https:\/\/wegetfunded.com\/wp-content\/uploads\/2026\/09\/wgf-site-icon-512.png","contentUrl":"https:\/\/wegetfunded.com\/wp-content\/uploads\/2026\/09\/wgf-site-icon-512.png","width":512,"height":512,"caption":"WeGetFunded"},"image":{"@id":"https:\/\/wegetfunded.com\/#logo"},"sameAs":["https:\/\/www.youtube.com\/@wegetfunded","https:\/\/x.com\/wegetfunded","https:\/\/discord.com\/invite\/rrcRVgq2J3","https:\/\/play.google.com\/store\/apps\/details?id=com.wegetfunded.app","https:\/\/instagram.com\/wegetfundedcom","https:\/\/tiktok.com\/@wegetfunded","https:\/\/facebook.com\/wegetfunded","https:\/\/t.me\/wegetfunded"]}]}},"_links":{"self":[{"href":"https:\/\/wegetfunded.com\/fr\/wp-json\/wp\/v2\/posts\/466","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wegetfunded.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wegetfunded.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wegetfunded.com\/fr\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/wegetfunded.com\/fr\/wp-json\/wp\/v2\/comments?post=466"}],"version-history":[{"count":7,"href":"https:\/\/wegetfunded.com\/fr\/wp-json\/wp\/v2\/posts\/466\/revisions"}],"predecessor-version":[{"id":1893,"href":"https:\/\/wegetfunded.com\/fr\/wp-json\/wp\/v2\/posts\/466\/revisions\/1893"}],"wp:attachment":[{"href":"https:\/\/wegetfunded.com\/fr\/wp-json\/wp\/v2\/media?parent=466"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wegetfunded.com\/fr\/wp-json\/wp\/v2\/categories?post=466"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wegetfunded.com\/fr\/wp-json\/wp\/v2\/tags?post=466"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}