{"id":3883,"date":"2026-07-19T18:06:16","date_gmt":"2026-07-19T16:06:16","guid":{"rendered":"https:\/\/oswego.eu\/?page_id=3883"},"modified":"2026-09-22T15:04:15","modified_gmt":"2026-09-22T13:04:15","slug":"assessment","status":"publish","type":"page","link":"https:\/\/oswego.eu\/ar\/assessment\/","title":{"rendered":"Assessment"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>OswegO \u2014 Centre d&rsquo;Assessment Op\u00e9rations Client<\/title>\n<style>\n\/* Tous les styles sont scop\u00e9s \u00e0 #oswego-app pour rester immunis\u00e9s\n   contre le CSS du th\u00e8me WordPress h\u00f4te (int\u00e9gration en bloc HTML\n   personnalis\u00e9) : pas de d\u00e9pendance \u00e0 :root, body ou \u00e0 un reset global. *\/\n#oswego-app{\n  --ink:#252525;\n  --paper:#f2f2f2;\n  --paper-2:#e7e6e2;\n  --line:#25252533;\n  --accent:#ff0000;\n  --accent-2:#72706d;\n  --gold:#e0392a;\n  --on-accent:#ffffff;\n  --serif:'Helvetica Neue',Helvetica,Arial,sans-serif;\n  --sans:'Helvetica Neue',Helvetica,Arial,sans-serif;\n  --mono:'Courier New',monospace;\n}\n#oswego-app.theme-dark{\n  --ink:#f2f2f2;\n  --paper:#252525;\n  --paper-2:#343432;\n  --line:#f2f2f233;\n  --accent-2:#a3a19b;\n  --gold:#ff5b45;\n}\n#oswego-app *{box-sizing:border-box;margin:0;padding:0;}\n#oswego-app{\n  display:block;\n  max-width:960px;\n  margin:40px auto;\n  padding:0 40px;\n  background:var(--paper) !important;\n  color:var(--ink) !important;\n  font-family:var(--sans) !important;\n  -webkit-font-smoothing:antialiased;\n  transition:background .25s ease, color .25s ease;\n  line-height:1.4;\n}\n#oswego-app p,#oswego-app h1,#oswego-app h2,#oswego-app h3,\n#oswego-app span,#oswego-app div,#oswego-app label,#oswego-app li,\n#oswego-app button,#oswego-app input,#oswego-app a{\n  color:inherit;background:transparent;text-decoration:none;\n  line-height:inherit;font-family:inherit;\n}\n#oswego-app .wrap{max-width:760px;margin:0 auto;padding:80px 44px 120px;}\n#oswego-app::selection{background:var(--accent);color:var(--paper);}\n\n\/* ===== Header \/ brand ===== *\/\n#oswego-app .brand {\n  display:flex;justify-content:space-between;align-items:flex-end;\n  border-bottom:1px solid var(--line);\n  padding-bottom:18px;margin-bottom:56px;\n}#oswego-app .brand-mark {font-family:var(--serif);font-size:20px;letter-spacing:0.04em;font-weight:800;}#oswego-app .brand-tagline {font-size:10.5px;color:var(--accent-2);letter-spacing:0.02em;margin-top:3px;}#oswego-app .brand-tag {font-size:11px;text-transform:uppercase;letter-spacing:0.12em;color:var(--ink);opacity:.55;}\n\/* ===== Screens ===== *\/\n#oswego-app .screen {display:none;animation:rise .5s cubic-bezier(.16,1,.3,1);}#oswego-app .screen.active {display:block;}\n@keyframes rise{from{opacity:0;transform:translateY(14px);}to{opacity:1;transform:translateY(0);}}\n\/* ===== Intro ===== *\/\n#oswego-app .eyebrow {\n  font-size:11px;text-transform:uppercase;letter-spacing:0.16em;\n  color:var(--accent);font-weight:700;margin-bottom:18px;\n}#oswego-app h1 {\n  font-family:var(--serif);\n  font-size:44px;line-height:1.08;font-weight:800;\n  margin-bottom:24px;letter-spacing:-0.01em;\n}#oswego-app .lede {font-size:17px;line-height:1.6;color:var(--ink);opacity:.8;max-width:560px;margin-bottom:36px;}#oswego-app .meta-row {display:flex;gap:32px;margin-bottom:48px;flex-wrap:wrap;}#oswego-app .meta-item {border-left:2px solid var(--accent);padding-left:12px;}#oswego-app .meta-num {font-family:var(--serif);font-size:22px;font-weight:600;}#oswego-app .meta-label {font-size:11px;text-transform:uppercase;letter-spacing:0.08em;opacity:.6;margin-top:2px;}#oswego-app .pillars {display:grid;grid-template-columns:1fr 1fr 1fr;grid-template-rows:auto auto auto;gap:1px;background:var(--line);border:1px solid var(--line);margin-bottom:48px;}#oswego-app .pillar {display:grid;grid-template-rows:subgrid;grid-row:span 3;row-gap:0;background:var(--paper);padding:20px 16px;}#oswego-app .pillar-k {font-family:var(--serif);font-weight:700;font-size:14px;text-transform:uppercase;letter-spacing:0.04em;margin-bottom:6px;}#oswego-app .pillar-v {font-size:12.5px;opacity:.65;line-height:1.4;margin-bottom:16px;}#oswego-app .autoeval-title {font-family:var(--serif);font-size:20px;font-weight:800;color:var(--accent);margin-bottom:16px;letter-spacing:0.01em;}#oswego-app .required-star {color:var(--accent);}#oswego-app .pillar-stars {display:flex;gap:4px;padding:4px;margin:-4px;}#oswego-app .pillar-stars.blink {animation:oswego-star-blink 0.35s ease-in-out 0s 2;}\n@keyframes oswego-star-blink {\n  0%,100%{background:transparent;box-shadow:none;}\n  50%{background:rgba(255,0,0,0.18);box-shadow:0 0 0 4px rgba(255,0,0,0.18);}\n}#oswego-app .star {\n  font-size:19px;line-height:1;cursor:pointer;color:#55534d;\n  transition:color .12s ease, transform .12s ease;\n  user-select:none;\n}#oswego-app .star:hover {transform:scale(1.12);}#oswego-app .star.filled {color:var(--accent);}\n\/* ===== Buttons ===== *\/\n#oswego-app .btn {\n  appearance:none;border:none;cursor:pointer;\n  font-family:var(--sans);font-size:14px;font-weight:600;\n  letter-spacing:0.02em;\n  padding:15px 30px;\n  background:var(--ink);color:var(--paper);\n  transition:transform .15s ease, background .15s ease;\n  display:inline-flex;align-items:center;gap:10px;\n}#oswego-app .btn:hover {background:var(--accent);color:var(--on-accent);transform:translateX(2px);}#oswego-app .btn:active {transform:translateX(0);}#oswego-app .btn.ghost {background:transparent;color:var(--ink);border:1px solid var(--line);}#oswego-app .btn.ghost:hover {background:var(--ink);color:var(--paper);}#oswego-app .btn:disabled {opacity:.3;cursor:not-allowed;pointer-events:none;}#oswego-app .btn-arrow {transition:transform .15s ease;}#oswego-app .btn:hover .btn-arrow {transform:translateX(3px);}\n\/* ===== Progress ===== *\/\n#oswego-app .progress-shell {margin-bottom:40px;}#oswego-app .progress-top {display:flex;justify-content:space-between;font-size:11px;text-transform:uppercase;letter-spacing:0.1em;opacity:.55;margin-bottom:8px;}#oswego-app .progress-track {height:2px;background:var(--line);position:relative;}#oswego-app .progress-fill {height:100%;background:var(--accent);transition:width .4s cubic-bezier(.16,1,.3,1);}#oswego-app .dim-track {display:flex;gap:4px;margin-top:14px;}#oswego-app .dim-seg {flex:1;height:3px;background:var(--line);position:relative;overflow:hidden;}#oswego-app .dim-seg i {display:block;height:100%;width:0%;transition:width .3s ease;}#oswego-app .dim-seg[data-d=\"savoir\"] i {background:var(--accent-2);}#oswego-app .dim-seg[data-d=\"savoir-faire\"] i {background:var(--gold);}#oswego-app .dim-seg[data-d=\"savoir-etre\"] i {background:var(--accent);}\n\/* ===== Question ===== *\/\n#oswego-app .q-dim {font-size:11px;text-transform:uppercase;letter-spacing:0.14em;font-weight:700;margin-bottom:14px;}#oswego-app .q-dim.savoir {color:var(--accent-2);}#oswego-app .q-dim.savoir-faire {color:var(--gold);}#oswego-app .q-dim.savoir-etre {color:var(--accent);}#oswego-app .q-cat {font-size:12px;opacity:.5;margin-bottom:6px;}#oswego-app .q-text {font-family:var(--serif);font-size:26px;line-height:1.32;font-weight:800;margin-bottom:36px;max-width:600px;}#oswego-app .opts {display:flex;flex-direction:column;gap:10px;margin-bottom:40px;}#oswego-app .opt {\n  border:1px solid var(--line);\n  padding:18px 20px;\n  cursor:pointer;\n  display:flex;align-items:center;gap:16px;\n  transition:border-color .15s ease, background .15s ease;\n  background:var(--paper);\n}#oswego-app .opt:hover {border-color:var(--ink);background:var(--paper-2);}#oswego-app .opt.selected {border-color:var(--accent);background:var(--paper-2);}#oswego-app .opt-mark {\n  width:22px;height:22px;border-radius:50%;border:1.5px solid var(--line);\n  flex-shrink:0;display:flex;align-items:center;justify-content:center;\n  font-size:11px;font-weight:700;color:var(--ink);opacity:.5;\n}#oswego-app .opt.selected .opt-mark {background:var(--accent);border-color:var(--accent);color:var(--on-accent);opacity:1;}#oswego-app .opt-text {font-size:15px;line-height:1.4;}#oswego-app .q-nav {display:flex;justify-content:space-between;align-items:center;}#oswego-app .q-count {font-size:12px;opacity:.5;font-family:var(--mono);}\n\/* ===== Results ===== *\/\n#oswego-app .res-eyebrow {font-size:11px;text-transform:uppercase;letter-spacing:0.16em;color:var(--accent);font-weight:700;margin-bottom:14px;}#oswego-app .res-title {font-family:var(--serif);font-size:36px;line-height:1.15;font-weight:800;margin-bottom:8px;}#oswego-app .res-sub {font-size:15px;opacity:.65;margin-bottom:48px;}#oswego-app .score-grid {display:grid;grid-template-columns:1fr 1fr 1fr;gap:1px;background:var(--line);border:1px solid var(--line);margin-bottom:56px;}\n\/* ===== Profil arch\u00e9type (reveal) ===== *\/\n#oswego-app .profile-card {\n  border:1px solid var(--ink);\n  padding:36px 32px;\n  margin-bottom:48px;\n  position:relative;\n  background:var(--paper);\n}#oswego-app .profile-eyebrow {font-size:11px;text-transform:uppercase;letter-spacing:0.14em;opacity:.5;margin-bottom:10px;}#oswego-app .profile-name {font-family:var(--serif);font-size:32px;font-weight:800;margin-bottom:4px;}#oswego-app .profile-tagline {font-family:var(--serif);font-weight:700;font-size:14px;text-transform:uppercase;letter-spacing:0.03em;color:var(--accent);margin-bottom:20px;}#oswego-app .profile-desc {font-size:15px;line-height:1.65;opacity:.85;max-width:600px;margin-bottom:22px;}#oswego-app .profile-cols {display:grid;grid-template-columns:1fr 1fr;gap:24px;border-top:1px solid var(--line);padding-top:20px;}#oswego-app .profile-col-label {font-size:10px;text-transform:uppercase;letter-spacing:0.1em;font-weight:700;opacity:.55;margin-bottom:6px;}#oswego-app .profile-col-text {font-size:13.5px;line-height:1.55;opacity:.8;}#oswego-app .profile-second {\n  margin-top:18px;padding-top:18px;border-top:1px solid var(--line);\n  font-size:13px;opacity:.6;line-height:1.5;\n}\n#oswego-app .profile-radar-wrap{margin-top:24px;padding-top:20px;border-top:1px solid var(--line);}\n#oswego-app .profile-radar-row{display:flex;gap:28px;align-items:stretch;}\n#oswego-app .profile-radar-col{flex:1;min-width:0;display:flex;flex-direction:column;}\n#oswego-app .profile-image-col{flex:1;min-width:0;display:flex;flex-direction:column;}\n#oswego-app .profile-image-link{display:block;flex:1;border:1px solid var(--line);background:var(--paper-2);min-height:180px;}\n#oswego-app .profile-image-link img{width:100%;height:100%;object-fit:contain;display:block;}\n#oswego-app .profile-image-cta{display:flex;gap:8px;margin-top:8px;}\n#oswego-app .btn.small{padding:9px 16px;font-size:12.5px;flex:1;justify-content:center;}\n@media(max-width:600px){#oswego-app .profile-radar-row{flex-direction:column;gap:20px;}#oswego-app .profile-image-link{min-height:220px;}}\n@media(max-width:600px){#oswego-app .profile-cols {grid-template-columns:1fr;}#oswego-app .profile-name {font-size:26px;}\n}#oswego-app .score-card {background:var(--paper);padding:26px 20px;}#oswego-app .score-dim {font-size:11px;text-transform:uppercase;letter-spacing:0.1em;font-weight:700;margin-bottom:14px;}#oswego-app .score-dim.savoir {color:var(--accent-2);}#oswego-app .score-dim.savoir-faire {color:var(--gold);}#oswego-app .score-dim.savoir-etre {color:var(--accent);}#oswego-app .score-num {font-family:var(--serif);font-size:38px;font-weight:800;margin-bottom:4px;}#oswego-app .score-bar {height:3px;background:var(--line);margin-bottom:10px;}#oswego-app .score-bar i {display:block;height:100%;}#oswego-app .score-card[data-d=\"savoir\"] .score-bar i {background:var(--accent-2);}#oswego-app .score-card[data-d=\"savoir-faire\"] .score-bar i {background:var(--gold);}#oswego-app .score-card[data-d=\"savoir-etre\"] .score-bar i {background:var(--accent);}#oswego-app .score-level {font-size:12px;opacity:.6;}#oswego-app .section-head {\n  display:flex;align-items:baseline;gap:14px;\n  border-bottom:1px solid var(--line);padding-bottom:12px;margin-bottom:24px;margin-top:56px;\n}\n\/* ===== Perception vs mesure ===== *\/\n#oswego-app .perc-row {margin-bottom:26px;padding-bottom:22px;border-bottom:1px solid var(--line);}#oswego-app .perc-row:last-child {border-bottom:none;}#oswego-app .perc-dim {font-size:11px;text-transform:uppercase;letter-spacing:0.1em;font-weight:700;margin-bottom:12px;}#oswego-app .perc-dim.savoir {color:var(--accent-2);}#oswego-app .perc-dim.savoir-faire {color:var(--gold);}#oswego-app .perc-dim.savoir-etre {color:var(--accent);}#oswego-app .perc-bar-line {display:flex;align-items:center;gap:12px;margin-bottom:8px;}#oswego-app .perc-label {font-size:12px;opacity:.6;width:150px;flex-shrink:0;}#oswego-app .perc-track {flex:1;height:6px;background:var(--paper-2);border:1px solid var(--line);position:relative;}#oswego-app .perc-track i {display:block;height:100%;background:var(--ink);opacity:.35;}#oswego-app .perc-track.measured i {background:var(--accent);opacity:1;}#oswego-app .perc-val {font-family:var(--mono);font-size:12px;width:38px;text-align:right;flex-shrink:0;}#oswego-app .perc-verdict {font-size:13px;opacity:.7;margin-top:10px;font-style:italic;}\n@media(max-width:600px){#oswego-app .perc-label {width:110px;font-size:11px;}\n}#oswego-app .section-num {font-family:var(--mono);font-size:12px;opacity:.5;}#oswego-app .section-title {font-family:var(--serif);font-size:20px;font-weight:800;}#oswego-app .synth-text {font-size:15.5px;line-height:1.7;opacity:.85;margin-bottom:16px;}#oswego-app .synth-text b {color:var(--ink);font-weight:700;}#oswego-app .gap-list {list-style:none;margin-bottom:8px;}#oswego-app .gap-item {\n  padding:14px 0;border-bottom:1px solid var(--line);\n  display:flex;gap:16px;align-items:flex-start;\n}#oswego-app .gap-item:last-child {border-bottom:none;}#oswego-app .gap-tag {\n  font-size:10px;text-transform:uppercase;letter-spacing:0.08em;font-weight:700;\n  padding:4px 8px;flex-shrink:0;margin-top:2px;\n}#oswego-app .gap-tag.savoir {background:var(--accent-2);color:var(--paper);}#oswego-app .gap-tag.savoir-faire {background:var(--gold);color:var(--paper);}#oswego-app .gap-tag.savoir-etre {background:var(--accent);color:var(--on-accent);}#oswego-app .gap-body-text {font-size:14.5px;line-height:1.5;}#oswego-app .gap-body-text b {display:block;font-size:15px;margin-bottom:2px;}\n\/* ===== Program (recommandations) ===== *\/\n#oswego-app .prog-list {display:flex;flex-direction:column;gap:1px;background:var(--line);border:1px solid var(--line);margin-bottom:24px;}#oswego-app .prog-item {background:var(--paper);padding:22px 24px;display:flex;gap:20px;align-items:flex-start;}#oswego-app .prog-rank {font-family:var(--serif);font-size:22px;font-weight:800;color:var(--accent);flex-shrink:0;width:28px;}#oswego-app .prog-body {flex:1;}#oswego-app .prog-title {font-weight:700;font-size:15.5px;margin-bottom:4px;}#oswego-app .prog-why {font-size:13px;opacity:.65;line-height:1.5;margin-bottom:8px;}#oswego-app .prog-tags {display:flex;gap:6px;flex-wrap:wrap;}#oswego-app .prog-pill {font-size:10px;text-transform:uppercase;letter-spacing:0.06em;border:1px solid var(--line);padding:3px 8px;opacity:.7;}#oswego-app .prog-price {font-family:var(--mono);font-size:12px;opacity:.55;flex-shrink:0;white-space:nowrap;}#oswego-app .prog-link {font-size:12px;text-decoration:none;color:var(--accent);font-weight:600;}#oswego-app .footer-note {\n  margin-top:64px;padding-top:24px;border-top:1px solid var(--line);\n  font-size:12px;opacity:.5;line-height:1.6;\n}#oswego-app .restart-row {margin-top:48px;display:flex;gap:12px;flex-wrap:wrap;}\n\/* ===== Formulaire de capture (gate PDF) ===== *\/\n#oswego-app .pdf-gate {\n  display:none;\n  margin-top:24px;\n  border:1px solid var(--ink);\n  padding:28px 28px 24px;\n  background:var(--paper-2);\n}#oswego-app .pdf-gate.open {display:block;animation:rise .4s cubic-bezier(.16,1,.3,1);}#oswego-app .pdf-gate-title {font-family:var(--serif);font-size:19px;font-weight:800;margin-bottom:6px;}#oswego-app .pdf-gate-sub {font-size:13px;opacity:.6;margin-bottom:20px;}#oswego-app .pdf-fields {display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:16px;}#oswego-app .pdf-field {display:flex;flex-direction:column;gap:5px;}#oswego-app .pdf-field label {font-size:11px;text-transform:uppercase;letter-spacing:0.06em;opacity:.6;}#oswego-app .pdf-field input {\n  border:1px solid var(--line);background:var(--paper);\n  padding:11px 12px;font-family:var(--sans);font-size:14px;color:var(--ink);\n  outline:none;transition:border-color .15s ease;\n}#oswego-app .pdf-field input:focus {border-color:var(--accent);}#oswego-app .pdf-field input.invalid {border-color:var(--accent);background:rgba(255,0,0,0.08);}#oswego-app .pdf-error {color:var(--accent);font-size:12.5px;line-height:1.6;margin-bottom:14px;min-height:0;}#oswego-app .pdf-error ul {margin-left:18px;}#oswego-app .pdf-success {font-size:13px;color:var(--accent-2);margin-top:14px;}\n@media(max-width:600px){#oswego-app .pdf-fields {grid-template-columns:1fr;}\n}\n\n@media(max-width:600px){#oswego-app {padding:0 12px;margin:20px auto;}#oswego-app .wrap {padding:40px 24px 90px;}#oswego-app h1 {font-size:32px;}#oswego-app .q-text {font-size:21px;}#oswego-app .pillars {grid-template-columns:1fr;}#oswego-app .score-grid {grid-template-columns:1fr;}#oswego-app .meta-row {gap:20px;}\n}\n@media(prefers-reduced-motion:reduce){#oswego-app .screen {animation:none;}#oswego-app .btn, #oswego-app .opt, #oswego-app .progress-fill {transition:none;}\n}\n<\/style>\n<\/head>\n<body>\n<div id=\"oswego-app\" class=\"theme-dark\">\n<div class=\"wrap\">\n\n  <div class=\"brand\">\n    <div>\n      <div class=\"brand-mark\">OswegO<\/div>\n      <div class=\"brand-tagline\">Craft Operations for Brighter Futures<\/div>\n    <\/div>\n    <div class=\"brand-tag\">Centre d&rsquo;Assessment<\/div>\n  <\/div>\n\n  <!-- ===================== \u00c9CRAN 1 : INTRO ===================== -->\n  <section class=\"screen active\" id=\"screen-intro\">\n    <div class=\"eyebrow\">Op\u00e9rations Client \u2014 Diagnostic individuel<\/div>\n    <h1>O\u00f9 en \u00eates-vous, r\u00e9ellement,<br>dans votre pratique ?<\/h1>\n    <p class=\"lede\">Vingt-sept choix entre deux propositions, chacune tir\u00e9e d&rsquo;un th\u00e8me diff\u00e9rent des op\u00e9rations client \u2014 en interne, chez un donneur d&rsquo;ordre ou via un partenaire externalis\u00e9. Il n&rsquo;y a pas de bonne r\u00e9ponse : \u00e0 chaque fois, choisissez simplement celle qui vous ressemble le plus. \u00c0 l&rsquo;arriv\u00e9e : une lecture pr\u00e9cise de vos trois dimensions, et un programme de formation qui vous correspond.<\/p>\n\n    <div class=\"meta-row\">\n      <div class=\"meta-item\"><div class=\"meta-num\">27<\/div><div class=\"meta-label\">Questions<\/div><\/div>\n      <div class=\"meta-item\"><div class=\"meta-num\">~20<\/div><div class=\"meta-label\">Minutes<\/div><\/div>\n      <div class=\"meta-item\"><div class=\"meta-num\">3<\/div><div class=\"meta-label\">Dimensions<\/div><\/div>\n    <\/div>\n\n    <h2 class=\"autoeval-title\">Auto-\u00e9valuation <span class=\"required-star\">*<\/span><\/h2>\n\n    <div class=\"pillars\">\n      <div class=\"pillar\">\n        <div class=\"pillar-k\">Savoir<\/div>\n        <div class=\"pillar-v\">Concepts, mod\u00e8les \u00e9conomiques, indicateurs, cadre contractuel.<\/div>\n        <div class=\"pillar-stars\" id=\"stars-savoir\"><\/div>\n      <\/div>\n      <div class=\"pillar\">\n        <div class=\"pillar-k\">Savoir-faire<\/div>\n        <div class=\"pillar-v\">Pilotage, organisation, gestion de la performance au quotidien.<\/div>\n        <div class=\"pillar-stars\" id=\"stars-savoir-faire\"><\/div>\n      <\/div>\n      <div class=\"pillar\">\n        <div class=\"pillar-k\">Savoir-\u00eatre<\/div>\n        <div class=\"pillar-v\">Posture manag\u00e9riale, relation, communication, droit \u00e0 l&rsquo;erreur.<\/div>\n        <div class=\"pillar-stars\" id=\"stars-savoir-etre\"><\/div>\n      <\/div>\n    <\/div>\n\n    <button class=\"btn\" onclick=\"tryStartAssessment()\">Commencer l&rsquo;assessment <span class=\"btn-arrow\">\u2192<\/span><\/button>\n  <\/section>\n\n  <!-- ===================== \u00c9CRAN 2 : QUESTIONS ===================== -->\n  <section class=\"screen\" id=\"screen-quiz\">\n    <div class=\"progress-shell\">\n      <div class=\"progress-top\">\n        <span id=\"progress-label\">Question 1 \/ 27<\/span>\n        <span id=\"progress-pct\">4%<\/span>\n      <\/div>\n      <div class=\"progress-track\"><div class=\"progress-fill\" id=\"progress-fill\" style=\"width:4%\"><\/div><\/div>\n    <\/div>\n\n    <div class=\"q-text\" id=\"q-text\"><\/div>\n\n    <div class=\"opts\" id=\"q-opts\"><\/div>\n\n    <div class=\"q-nav\">\n      <button class=\"btn ghost\" id=\"btn-prev\" onclick=\"prevQuestion()\">\u2190 Pr\u00e9c\u00e9dent<\/button>\n      <span class=\"q-count\" id=\"q-count\"><\/span>\n      <button class=\"btn\" id=\"btn-next\" onclick=\"nextQuestion()\" disabled>Suivant <span class=\"btn-arrow\">\u2192<\/span><\/button>\n    <\/div>\n  <\/section>\n\n  <!-- ===================== \u00c9CRAN 3 : R\u00c9SULTATS ===================== -->\n  <section class=\"screen\" id=\"screen-results\">\n    <div class=\"res-eyebrow\">Synth\u00e8se individuelle<\/div>\n    <div class=\"res-title\" id=\"res-title\">Votre profil op\u00e9rations client<\/div>\n    <div class=\"res-sub\" id=\"res-sub\"><\/div>\n\n    <div id=\"profile-reveal\"><\/div>\n\n    <div class=\"score-grid\" id=\"score-grid\"><\/div>\n\n    <div id=\"perception-block\"><\/div>\n\n    <div class=\"section-head\"><span class=\"section-num\">02<\/span><span class=\"section-title\">Lecture de situation<\/span><\/div>\n    <div id=\"synth-block\"><\/div>\n\n    <div class=\"section-head\"><span class=\"section-num\">03<\/span><span class=\"section-title\">Points de vigilance identifi\u00e9s<\/span><\/div>\n    <ul class=\"gap-list\" id=\"gap-list\"><\/ul>\n\n    <div class=\"section-head\"><span class=\"section-num\">04<\/span><span class=\"section-title\">Votre programme de formation recommand\u00e9<\/span><\/div>\n    <div class=\"prog-list\" id=\"prog-list\"><\/div>\n    <p class=\"synth-text\" style=\"font-size:13px;opacity:.55;\">Le catalogue Academy Online s&rsquo;enrichit chaque mois. Cette s\u00e9lection refl\u00e8te l&rsquo;offre disponible \u00e0 ce jour et sera actualis\u00e9e \u00e0 votre prochaine session.<\/p>\n\n    <div class=\"restart-row\">\n      <button class=\"btn ghost\" onclick=\"restart()\">\u21bb Refaire l&rsquo;assessment<\/button>\n      <button class=\"btn\" id=\"btn-open-gate\" onclick=\"togglePdfGate()\">T\u00e9l\u00e9charger ma synth\u00e8se (PDF) \u2192<\/button>\n    <\/div>\n\n    <div class=\"pdf-gate\" id=\"pdf-gate\">\n      <div class=\"pdf-gate-title\">Recevoir votre synth\u00e8se en PDF<\/div>\n      <div class=\"pdf-gate-sub\">Ces informations personnalisent votre document et sa page de couverture.<\/div>\n      <div class=\"pdf-fields\">\n        <div class=\"pdf-field\"><label>Pr\u00e9nom<\/label><input type=\"text\" id=\"pdf-prenom\" autocomplete=\"given-name\"><\/div>\n        <div class=\"pdf-field\"><label>Nom<\/label><input type=\"text\" id=\"pdf-nom\" autocomplete=\"family-name\"><\/div>\n        <div class=\"pdf-field\"><label>Entreprise<\/label><input type=\"text\" id=\"pdf-entreprise\" autocomplete=\"organization\"><\/div>\n        <div class=\"pdf-field\"><label>Email professionnel<\/label><input type=\"email\" id=\"pdf-email\" autocomplete=\"email\"><\/div>\n      <\/div>\n      <div class=\"pdf-error\" id=\"pdf-error\"><\/div>\n      <button class=\"btn\" onclick=\"validateAndGeneratePDF()\">G\u00e9n\u00e9rer mon PDF \u2192<\/button>\n    <\/div>\n\n    <div class=\"footer-note\">\n      OswegO Conseil \u2014 Centre d&rsquo;Assessment Op\u00e9rations Client. Ce diagnostic est un outil d&rsquo;auto-positionnement ; il oriente une trajectoire de formation, il ne mesure pas une performance certifi\u00e9e. academy.oswego.eu\n    <\/div>\n  <\/section>\n\n<\/div>\n<\/div>\n\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js\"><\/script>\n<script>\n\/* =========================================================================\n   BANQUE DE QUESTIONS\n   Chaque question porte une dimension (savoir \/ savoir-faire \/ savoir-etre)\n   et une cat\u00e9gorie th\u00e9matique. Les options sont not\u00e9es de 0 \u00e0 3\n   (0 = r\u00e9flexe \u00e0 consolider fortement, 3 = pratique mature).\n   ========================================================================= *\/\nconst QUESTIONS = [\n  \/\/ Chaque question oppose deux affirmations issues de cat\u00e9gories DIFF\u00c9RENTES\n  \/\/ et sans lien th\u00e9matique direct. L'utilisateur choisit celle qui lui\n  \/\/ ressemble le plus \u2014 la logique de pr\u00e9f\u00e9rence (ipsative) r\u00e9v\u00e8le la pratique\n  \/\/ r\u00e9elle sans laisser deviner une \"bonne\" r\u00e9ponse.\n  {opts:[\n    {t:\"Vous aimez comprendre l'impact d'une variation d'activit\u00e9 sur la structure de co\u00fbts avant d'agir.\", cat:\"Mod\u00e8le \u00e9conomique\", dim:\"savoir\"},\n    {t:\"Vous aimez ajuster une organisation en temps r\u00e9el en fonction des al\u00e9as (absences, pics d'activit\u00e9).\", cat:\"Pilotage\", dim:\"savoir-faire\"}\n  ]},\n  {opts:[\n    {t:\"Vous \u00eates \u00e0 l'aise pour construire un sc\u00e9nario de dimensionnement en mobilisant les leviers du temps de travail.\", cat:\"Temps de travail\", dim:\"savoir\"},\n    {t:\"Vous valorisez la transparence d'un collaborateur qui vous signale spontan\u00e9ment une erreur.\", cat:\"Droit \u00e0 l'erreur\", dim:\"savoir-etre\"}\n  ]},\n  {opts:[\n    {t:\"Vous prenez le temps de questionner ce qu'un indicateur mesure vraiment avant d'en tirer une conclusion.\", cat:\"Indicateurs\", dim:\"savoir\"},\n    {t:\"Vous \u00eates \u00e0 l'aise pour construire un dimensionnement \u00e0 partir de donn\u00e9es chiffr\u00e9es plut\u00f4t que d'un ressenti.\", cat:\"Dimensionnement\", dim:\"savoir-faire\"}\n  ]},\n  {opts:[\n    {t:\"Vous accordez une grande importance \u00e0 la clart\u00e9 des engagements r\u00e9ciproques dans une relation de travail.\", cat:\"Relation client\/partenaire\", dim:\"savoir\"},\n    {t:\"Vous pr\u00e9f\u00e9rez d\u00e9l\u00e9guer avec un cadre clair, puis laisser la main.\", cat:\"Confiance\", dim:\"savoir-etre\"}\n  ]},\n  {opts:[\n    {t:\"Vous utilisez les indicateurs pour \u00e9clairer vos d\u00e9cisions plut\u00f4t que pour \u00e9valuer les personnes.\", cat:\"KPI's\", dim:\"savoir\"},\n    {t:\"Vous pr\u00e9f\u00e9rez aborder rapidement une baisse de performance en \u00e9changeant directement avec la personne concern\u00e9e.\", cat:\"Gestion de la performance\", dim:\"savoir-faire\"}\n  ]},\n  {opts:[\n    {t:\"Vous aimez documenter pr\u00e9cis\u00e9ment les co\u00fbts avant d'entrer dans une n\u00e9gociation.\", cat:\"Co\u00fbts \/ valeur \u00e9conomique\", dim:\"savoir\"},\n    {t:\"Vous \u00eates plut\u00f4t \u00e0 l'aise avec l'exp\u00e9rimentation dans un contexte incertain.\", cat:\"Posture face \u00e0 l'incertitude\", dim:\"savoir-etre\"}\n  ]},\n  {opts:[\n    {t:\"Le sujet de l'intelligence artificielle et de ses limites dans la relation humaine vous int\u00e9resse particuli\u00e8rement.\", cat:\"IA & relation client\", dim:\"savoir\"},\n    {t:\"Le point individuel r\u00e9gulier avec chaque collaborateur fait partie de vos rituels install\u00e9s.\", cat:\"Rituels manag\u00e9riaux\", dim:\"savoir-faire\"}\n  ]},\n  {opts:[\n    {t:\"Face \u00e0 plusieurs sollicitations, vous prenez le temps de distinguer l'urgent de l'important.\", cat:\"Organisation\", dim:\"savoir\"},\n    {t:\"Vous accordez une attention particuli\u00e8re au lien et \u00e0 la dynamique collective de votre \u00e9quipe.\", cat:\"Exp\u00e9rience collaborateur\", dim:\"savoir-etre\"}\n  ]},\n  {opts:[\n    {t:\"Vous aimez structurer votre journ\u00e9e selon un ordre de priorit\u00e9 plut\u00f4t que selon l'ordre d'arriv\u00e9e des sujets.\", cat:\"Priorisation\", dim:\"savoir-faire\"},\n    {t:\"Exprimer votre reconnaissance fait naturellement partie de votre pratique manag\u00e9riale.\", cat:\"Gratitude & reconnaissance\", dim:\"savoir-etre\"}\n  ]},\n  {opts:[\n    {t:\"Vous aimez garder un \u0153il r\u00e9gulier sur les donn\u00e9es \u00e9conomiques de votre p\u00e9rim\u00e8tre, pas seulement en fin de mois.\", cat:\"Suivi budg\u00e9taire\", dim:\"savoir-faire\"},\n    {t:\"En arrivant sur un nouveau poste, vous pr\u00e9f\u00e9rez d'abord comprendre le terrain avant d'agir en profondeur.\", cat:\"Prise de fonction\", dim:\"savoir-etre\"}\n  ]},\n  {opts:[\n    {t:\"Vous prenez le temps d'\u00e9valuer l'impact d'une demande avant d'y r\u00e9pondre, plut\u00f4t que de r\u00e9agir dans l'instant.\", cat:\"Relation avec les parties prenantes\", dim:\"savoir-faire\"},\n    {t:\"Vous croyez que la dimension \u00e9motionnelle d'une relation compte autant que son efficacit\u00e9 op\u00e9rationnelle.\", cat:\"Connexion \u00e9motionnelle\", dim:\"savoir-etre\"}\n  ]},\n  {opts:[\n    {t:\"Vous pr\u00e9parez soigneusement vos messages importants avant de les adresser \u00e0 votre \u00e9quipe.\", cat:\"Communication manag\u00e9riale\", dim:\"savoir-faire\"},\n    {t:\"Face \u00e0 un d\u00e9saccord, votre premier r\u00e9flexe est d'\u00e9couter avant de r\u00e9pondre.\", cat:\"Communication & \u00e9coute\", dim:\"savoir-etre\"}\n  ]},\n  {opts:[\n    {t:\"Face \u00e0 un changement de volume d'activit\u00e9, votre premier r\u00e9flexe est d'en mesurer l'effet sur l'\u00e9quilibre \u00e9conomique.\", cat:\"Mod\u00e8le \u00e9conomique\", dim:\"savoir\"},\n    {t:\"D\u00e8s qu'une performance d\u00e9croche, vous allez rapidement en discuter directement avec la personne concern\u00e9e.\", cat:\"Gestion de la performance\", dim:\"savoir-faire\"}\n  ]},\n  {opts:[\n    {t:\"Manier les leviers du temps de travail (annualisation, modulation) pour construire un sc\u00e9nario ne vous pose pas de difficult\u00e9.\", cat:\"Temps de travail\", dim:\"savoir\"},\n    {t:\"Le lien et la dynamique collective au sein de votre \u00e9quipe sont un sujet auquel vous \u00eates particuli\u00e8rement attentif.\", cat:\"Exp\u00e9rience collaborateur\", dim:\"savoir-etre\"}\n  ]},\n  {opts:[\n    {t:\"Avant de conclure \u00e0 partir d'un chiffre, vous v\u00e9rifiez ce que cet indicateur refl\u00e8te r\u00e9ellement.\", cat:\"Indicateurs\", dim:\"savoir\"},\n    {t:\"Vous tenez un point individuel r\u00e9gulier avec chacun de vos collaborateurs, c'est ancr\u00e9 dans votre pratique.\", cat:\"Rituels manag\u00e9riaux\", dim:\"savoir-faire\"}\n  ]},\n  {opts:[\n    {t:\"Poser clairement les engagements de chacun dans une relation professionnelle compte beaucoup pour vous.\", cat:\"Relation client\/partenaire\", dim:\"savoir\"},\n    {t:\"Exp\u00e9rimenter dans un contexte flou ne vous met pas mal \u00e0 l'aise, plut\u00f4t le contraire.\", cat:\"Posture face \u00e0 l'incertitude\", dim:\"savoir-etre\"}\n  ]},\n  {opts:[\n    {t:\"Un indicateur sert avant tout, selon vous, \u00e0 guider une d\u00e9cision \u2014 pas \u00e0 juger quelqu'un.\", cat:\"KPI's\", dim:\"savoir\"},\n    {t:\"R\u00e9ajuster une organisation au fil de l'eau face \u00e0 un impr\u00e9vu (absence, pic d'activit\u00e9) fait partie de vos r\u00e9flexes.\", cat:\"Pilotage\", dim:\"savoir-faire\"}\n  ]},\n  {opts:[\n    {t:\"Avant toute n\u00e9gociation, vous pr\u00e9f\u00e9rez avoir chiffr\u00e9 pr\u00e9cis\u00e9ment les co\u00fbts en jeu.\", cat:\"Co\u00fbts \/ valeur \u00e9conomique\", dim:\"savoir\"},\n    {t:\"Qu'un collaborateur vous signale une erreur de lui-m\u00eame, sans qu'on le lui demande, c'est quelque chose que vous valorisez.\", cat:\"Droit \u00e0 l'erreur\", dim:\"savoir-etre\"}\n  ]},\n  {opts:[\n    {t:\"Vous suivez avec int\u00e9r\u00eat la question des limites de l'intelligence artificielle dans une relation humaine.\", cat:\"IA & relation client\", dim:\"savoir\"},\n    {t:\"Vous pr\u00e9f\u00e9rez asseoir un dimensionnement sur des donn\u00e9es chiffr\u00e9es plut\u00f4t que sur une impression.\", cat:\"Dimensionnement\", dim:\"savoir-faire\"}\n  ]},\n  {opts:[\n    {t:\"Quand tout semble prioritaire en m\u00eame temps, vous prenez le temps de trier ce qui est urgent de ce qui est important.\", cat:\"Organisation\", dim:\"savoir\"},\n    {t:\"Vous d\u00e9l\u00e9gez volontiers d\u00e8s lors que le cadre est clair, sans reprendre la main ensuite.\", cat:\"Confiance\", dim:\"savoir-etre\"}\n  ]},\n  {opts:[\n    {t:\"Vous organisez votre journ\u00e9e par ordre de priorit\u00e9, plut\u00f4t qu'au fil de l'arriv\u00e9e des sujets.\", cat:\"Priorisation\", dim:\"savoir-faire\"},\n    {t:\"Pour vous, l'\u00e9motion dans une relation p\u00e8se autant que son efficacit\u00e9 op\u00e9rationnelle.\", cat:\"Connexion \u00e9motionnelle\", dim:\"savoir-etre\"}\n  ]},\n  {opts:[\n    {t:\"Vous surveillez r\u00e9guli\u00e8rement les donn\u00e9es \u00e9conomiques de votre p\u00e9rim\u00e8tre, sans attendre la cl\u00f4ture du mois.\", cat:\"Suivi budg\u00e9taire\", dim:\"savoir-faire\"},\n    {t:\"Devant un d\u00e9saccord, vous commencez toujours par \u00e9couter avant de prendre la parole.\", cat:\"Communication & \u00e9coute\", dim:\"savoir-etre\"}\n  ]},\n  {opts:[\n    {t:\"Avant de r\u00e9pondre \u00e0 une demande, vous en mesurez l'impact plut\u00f4t que de r\u00e9agir \u00e0 chaud.\", cat:\"Relation avec les parties prenantes\", dim:\"savoir-faire\"},\n    {t:\"Vous exprimez votre reconnaissance assez naturellement, \u00e7a fait partie de votre fa\u00e7on de manager.\", cat:\"Gratitude & reconnaissance\", dim:\"savoir-etre\"}\n  ]},\n  {opts:[\n    {t:\"Un message important \u00e0 votre \u00e9quipe se pr\u00e9pare soigneusement en amont, selon vous.\", cat:\"Communication manag\u00e9riale\", dim:\"savoir-faire\"},\n    {t:\"Sur un nouveau poste, vous prenez d'abord le temps de comprendre le terrain avant d'engager des changements de fond.\", cat:\"Prise de fonction\", dim:\"savoir-etre\"}\n  ]},\n  {opts:[\n    {t:\"Avant d'agir sur un parcours client, je cherche \u00e0 comprendre ce qui p\u00e8se r\u00e9ellement en heures et en ressources dans mon dispositif.\", cat:\"Co\u00fbts \/ valeur \u00e9conomique\", dim:\"savoir\"},\n    {t:\"Dans une relation de travail, vous veillez \u00e0 ce que chacun sache clairement ce qui est attendu de lui.\", cat:\"Relation client\/partenaire\", dim:\"savoir\"}\n  ]},\n  {opts:[\n    {t:\"Quand un parcours client pose probl\u00e8me, j'observe ce qui se passe vraiment sur le terrain avant de d\u00e9cider quoi changer.\", cat:\"Priorisation\", dim:\"savoir-faire\"},\n    {t:\"Le rendez-vous individuel r\u00e9gulier avec chaque collaborateur est un rituel que vous ne sautez jamais.\", cat:\"Rituels manag\u00e9riaux\", dim:\"savoir-faire\"}\n  ]},\n  {opts:[\n    {t:\"Je ne valide un chantier d'optimisation que si j'ai formalis\u00e9 une hypoth\u00e8se de r\u00e9sultat mesurable avant de d\u00e9marrer.\", cat:\"Temps de travail\", dim:\"savoir\"},\n    {t:\"Suivre les chiffres de votre p\u00e9rim\u00e8tre au fil de l'eau, plut\u00f4t qu'une fois par mois, fait partie de vos habitudes.\", cat:\"Suivi budg\u00e9taire\", dim:\"savoir-faire\"}\n  ]}\n];\n\n\/* =========================================================================\n   CATALOGUE ACADEMY ONLINE \u2014 \u00e9volutif, un module ajout\u00e9 chaque mois.\n   Pour ajouter un module : dupliquer un bloc et l'ajouter au tableau.\n   dims: dimensions couvertes ; triggers: cat\u00e9gories de faiblesse cibl\u00e9es.\n   ========================================================================= *\/\nconst MODULES = [\n  {title:\"BPO, les bases du pilotage\", price:\"Gratuit\", dims:[\"savoir\"], packId:\"bpo\", packEntry:true, triggers:[\"Mod\u00e8le \u00e9conomique\",\"Temps de travail\"],\n   url:\"https:\/\/academy.oswego.eu\/learn\/detail-enrolment-program\/6862b2ca7222b97511cdf77d\"},\n  {title:\"BPO, le pilotage avanc\u00e9\", price:\"Payant\", dims:[\"savoir\",\"savoir-faire\"], packId:\"bpo\", triggers:[\"Co\u00fbts \/ valeur \u00e9conomique\",\"Dimensionnement\",\"Suivi budg\u00e9taire\"],\n   url:\"https:\/\/academy.oswego.eu\/learn\/detail-enrolment-program\/6862a36d7222b97511cdf10c\"},\n  {title:\"BPO, la relation client donneur d'ordre\", price:\"Payant\", dims:[\"savoir\",\"savoir-faire\"], packId:\"bpo\", triggers:[\"Relation client\/partenaire\",\"Relation avec les parties prenantes\"],\n   url:\"https:\/\/academy.oswego.eu\/learn\/detail-enrolment-program\/68611d0d353bf80b3fd3b869\"},\n  {title:\"Pack Pilotage BPO (parcours complet)\", price:\"Payant\", dims:[\"savoir\",\"savoir-faire\"], isPack:true, triggers:[\"Mod\u00e8le \u00e9conomique\",\"Co\u00fbts \/ valeur \u00e9conomique\",\"Relation client\/partenaire\"],\n   url:\"https:\/\/academy.oswego.eu\/learn\/detail-enrolment-program\/6862b5187222b97511cdf99e\"},\n  {title:\"Le Management & le Professeur Chamouton\", price:\"Gratuit\", dims:[\"savoir-etre\"], packId:\"management-chamouton\", packEntry:true, triggers:[\"Confiance\",\"Posture face \u00e0 l'incertitude\"],\n   url:\"https:\/\/academy.oswego.eu\/learn\/detail-enrolment-program\/685d0d04353bf80b3fd2daa5\"},\n  {title:\"Le Droit \u00e0 l'erreur & le Professeur Chamouton\", price:\"Payant\", dims:[\"savoir-etre\"], packId:\"management-chamouton\", triggers:[\"Droit \u00e0 l'erreur\",\"Posture face \u00e0 l'incertitude\"],\n   url:\"https:\/\/academy.oswego.eu\/learn\/detail-enrolment-program\/685eb421353bf80b3fd3a53c\"},\n  {title:\"De Manager \u00e0 M\u00e9nageur & le Professeur Chamouton\", price:\"Payant\", dims:[\"savoir-etre\"], packId:\"management-chamouton\", triggers:[\"Exp\u00e9rience collaborateur\",\"Confiance\"],\n   url:\"https:\/\/academy.oswego.eu\/learn\/detail-enrolment-program\/68646f33b7cd1bc3f7c51036\"},\n  {title:\"Pack Management & le Professeur Chamouton\", price:\"Payant\", dims:[\"savoir-etre\"], isPack:true, triggers:[\"Droit \u00e0 l'erreur\",\"Confiance\",\"Exp\u00e9rience collaborateur\"],\n   url:\"https:\/\/academy.oswego.eu\/learn\/detail-enrolment-program\/68647827b7cd1bc3f7c51e7e\"},\n  {title:\"La communication manag\u00e9riale efficace\", price:\"99\u20ac\", dims:[\"savoir-faire\",\"savoir-etre\"], triggers:[\"Communication manag\u00e9riale\",\"Communication & \u00e9coute\"],\n   url:\"https:\/\/academy.oswego.eu\/learn\/detail-enrolment-program\/6894a8a0a31c6d0228e954f1\"},\n  {title:\"Les KPI's (indicateurs) & le Professeur Chamouton\", price:\"Gratuit\", dims:[\"savoir\"], triggers:[\"Indicateurs\",\"KPI's\"],\n   url:\"https:\/\/academy.oswego.eu\/learn\/detail-enrolment-program\/68bf1401d082c799502c5fa0\"},\n  {title:\"Le pouvoir du merci, fabuleux et puissant\", price:\"Gratuit\", dims:[\"savoir-etre\"], triggers:[\"Gratitude & reconnaissance\"],\n   url:\"#\"},\n  {title:\"IA g\u00e9n\u00e9rative : la fronti\u00e8re d'une r\u00e9volution ?\", price:\"Gratuit\", dims:[\"savoir\"], triggers:[\"IA & relation client\"],\n   url:\"#\"},\n  {title:\"Le 1to1, rituel indispensable\", price:\"19\u20ac\", dims:[\"savoir-faire\"], triggers:[\"Rituels manag\u00e9riaux\"],\n   url:\"https:\/\/academy.oswego.eu\/learn\/detail-enrolment-program\/69f4d260f3fa9002bfc8023f\"},\n  {title:\"Dire merci aux clients : la r\u00e9sonance exp\u00e9rientielle\", price:\"99\u20ac\", dims:[\"savoir-etre\"], triggers:[\"Gratitude & reconnaissance\"],\n   url:\"https:\/\/academy.oswego.eu\/learn\/detail-enrolment-program\/6928d40654c511b74f070de9\"},\n  {title:\"Organisation : la m\u00e9thode intemporelle d'Eisenhower\", price:\"19\u20ac\", dims:[\"savoir\",\"savoir-faire\"], triggers:[\"Organisation\",\"Priorisation\"],\n   url:\"https:\/\/academy.oswego.eu\/learn\/detail-enrolment-program\/6932b95554c511b74f0753f9\"},\n  {title:\"Le clienteling, de la relation \u00e0 l'exp\u00e9rience \u2014 les enseignements du luxe\", price:\"99\u20ac\", dims:[\"savoir-etre\"], triggers:[\"Connexion \u00e9motionnelle\"],\n   url:\"https:\/\/academy.oswego.eu\/learn\/detail-enrolment-program\/69c24f8a5fed192e7b4dc36a\"},\n  {title:\"Manager : la prise de fonctions\", price:\"Gratuit\", dims:[\"savoir-etre\"], triggers:[\"Prise de fonction\"],\n   url:\"https:\/\/academy.oswego.eu\/learn\/detail-enrolment-program\/6a1d3e2f8cc5bdaf41bddd32\"},\n  {title:\"Parcours client : la m\u00e9thode \u00e9conomique\", price:\"45\u20ac\", dims:[\"savoir\",\"savoir-faire\"], triggers:[\"Co\u00fbts \/ valeur \u00e9conomique\",\"Mod\u00e8le \u00e9conomique\",\"Indicateurs\",\"Priorisation\",\"Suivi budg\u00e9taire\"],\n   url:\"https:\/\/academy.oswego.eu\/learn\/detail-enrolment-program\/6a6c66e06c0dc749d0c6f081\"}\n];\n\nconst DIM_LABELS = {\"savoir\":\"Savoir\",\"savoir-faire\":\"Savoir-faire\",\"savoir-etre\":\"Savoir-\u00eatre\"};\n\n\/\/ Les \"packs\" sont des assemblages de modules d\u00e9j\u00e0 existants : on ne les\n\/\/ recommande jamais individuellement dans le plan de formation, seulement\n\/\/ les modules unitaires qui les composent.\nconst RECOMMENDABLE_MODULES = MODULES.filter(m => !m.isPack);\n\n\/* =========================================================================\n   MOTEUR DE RECOMMANDATION \u2014 partag\u00e9 entre l'\u00e9cran web et le PDF, pour que\n   les deux pr\u00e9sentent exactement le m\u00eame plan de formation.\n   R\u00e8gle pack -> module d'entr\u00e9e : si plusieurs modules d'un m\u00eame pack sont\n   pertinents \u00e0 la fois, on ne recommande que le premier module du pack\n   (packEntry:true) comme point d'entr\u00e9e, plut\u00f4t que de les lister un par un.\n   ========================================================================= *\/\nfunction computeRecommendedModules(weakCats, scores){\n  const dims = [\"savoir\",\"savoir-faire\",\"savoir-etre\"];\n  const weakestDim = [...dims].sort((a,b)=>scores[a].pct-scores[b].pct)[0];\n\n  let scored = RECOMMENDABLE_MODULES.map(m=>{\n    const matched = m.triggers.filter(t=>weakCats[t]);\n    let relevance = matched.reduce((sum,t)=>sum+weakCats[t],0);\n    if(m.dims.includes(weakestDim)) relevance += 1;\n    return {...m, relevance, matched};\n  }).filter(m=>m.relevance>0);\n\n  \/\/ regrouper par pack : si 2+ modules du m\u00eame pack sont pertinents,\n  \/\/ ne garder que le module d'entr\u00e9e du pack, avec le poids et les\n  \/\/ raisons cumul\u00e9s de tout le groupe.\n  const byPack = {};\n  scored.forEach(m=>{ if(m.packId){ (byPack[m.packId] = byPack[m.packId]||[]).push(m); } });\n\n  Object.entries(byPack).forEach(([packId, members])=>{\n    if(members.length < 2) return; \/\/ un seul module du pack concern\u00e9 : pas de fusion\n    const entry = RECOMMENDABLE_MODULES.find(m=>m.packId===packId && m.packEntry);\n    if(!entry) return;\n    const combinedRelevance = members.reduce((sum,m)=>sum+m.relevance,0);\n    const combinedMatched = [...new Set(members.flatMap(m=>m.matched))];\n    \/\/ retirer tous les membres du groupe de la liste scored...\n    scored = scored.filter(m=>m.packId!==packId);\n    \/\/ ...puis r\u00e9injecter uniquement le module d'entr\u00e9e avec le score cumul\u00e9\n    scored.push({...entry, relevance: combinedRelevance, matched: combinedMatched});\n  });\n\n  scored.sort((a,b)=>b.relevance-a.relevance);\n  const finalList = scored.length>0 ? scored.slice(0,5) : RECOMMENDABLE_MODULES.slice(0,3).map(m=>({...m, matched:[]}));\n  return finalList;\n}\n\n\/* =========================================================================\n   PROFIL ARCH\u00c9TYPE \u2014 lecture compl\u00e9mentaire, propre \u00e0 OswegO (non calqu\u00e9e\n   sur un mod\u00e8le de personnalit\u00e9 sous licence). Chacune des cat\u00e9gories\n   d\u00e9j\u00e0 utilis\u00e9es pour le score savoir\/savoir-faire\/savoir-\u00eatre est aussi\n   rattach\u00e9e \u00e0 l'un des 4 arch\u00e9types ci-dessous. Le profil se d\u00e9duit donc\n   des M\u00caMES r\u00e9ponses, sans allonger le parcours.\n   ========================================================================= *\/\nconst ARCHETYPES = {\n  \"pilote\": {\n    name:\"Le Pilote\", tagline:\"D\u00e9cider par les chiffres\",\n    desc:\"Vous orientez votre pratique par la donn\u00e9e. Face \u00e0 une situation, votre r\u00e9flexe est de comprendre les m\u00e9canismes \u00e9conomiques et les indicateurs avant d'agir \u2014 une rigueur analytique qui structure vos d\u00e9cisions.\",\n    force:\"Lecture fine des \u00e9quilibres \u00e9conomiques, d\u00e9cisions \u00e9tay\u00e9es, anticipation.\",\n    vigilance:\"Veiller \u00e0 ne pas r\u00e9duire une situation humaine \u00e0 sa seule dimension chiffr\u00e9e.\"\n  },\n  \"batisseur\": {\n    name:\"Le B\u00e2tisseur\", tagline:\"Avancer par l'action\",\n    desc:\"Vous pr\u00e9f\u00e9rez ajuster, organiser, avancer \u2014 plut\u00f4t qu'attendre la situation id\u00e9ale. Votre terrain de pr\u00e9dilection, c'est le pilotage concret et la prise d'initiative.\",\n    force:\"R\u00e9activit\u00e9, sens pratique, capacit\u00e9 \u00e0 transformer une intention en r\u00e9sultat.\",\n    vigilance:\"S'assurer de prendre le temps de cadrer avant d'agir, pour ne pas avancer plus vite que l'\u00e9quipe.\"\n  },\n  \"federateur\": {\n    name:\"Le F\u00e9d\u00e9rateur\", tagline:\"Cr\u00e9er le lien\",\n    desc:\"Votre boussole, c'est la relation \u2014 avec l'\u00e9quipe, le client, le partenaire. Vous portez une attention naturelle \u00e0 l'\u00e9coute et \u00e0 la reconnaissance.\",\n    force:\"Coh\u00e9sion d'\u00e9quipe, qualit\u00e9 relationnelle, fid\u00e9lisation durable.\",\n    vigilance:\"Veiller \u00e0 ce que la qualit\u00e9 de la relation ne prenne pas le pas sur la rigueur du cadre.\"\n  },\n  \"gardien\": {\n    name:\"Le Gardien\", tagline:\"S\u00e9curiser le cadre\",\n    desc:\"Vous valorisez la fiabilit\u00e9, la constance et le cadre. Confiance et rituels structur\u00e9s sont au c\u0153ur de votre pratique manag\u00e9riale.\",\n    force:\"Fiabilit\u00e9, sens du cadre, stabilit\u00e9 apport\u00e9e \u00e0 l'\u00e9quipe.\",\n    vigilance:\"Veiller \u00e0 garder de la souplesse face \u00e0 l'impr\u00e9vu, pour ne pas freiner l'initiative.\"\n  }\n};\n\nconst CAT_ARCHETYPE = {\n  \"Mod\u00e8le \u00e9conomique\":\"pilote\", \"Indicateurs\":\"pilote\", \"KPI's\":\"pilote\",\n  \"Co\u00fbts \/ valeur \u00e9conomique\":\"pilote\", \"Suivi budg\u00e9taire\":\"pilote\", \"Dimensionnement\":\"pilote\",\n\n  \"Organisation\":\"batisseur\", \"Pilotage\":\"batisseur\", \"Priorisation\":\"batisseur\",\n  \"Gestion de la performance\":\"batisseur\", \"Prise de fonction\":\"batisseur\", \"Posture face \u00e0 l'incertitude\":\"batisseur\",\n\n  \"Communication & \u00e9coute\":\"federateur\", \"Connexion \u00e9motionnelle\":\"federateur\", \"Gratitude & reconnaissance\":\"federateur\",\n  \"Exp\u00e9rience collaborateur\":\"federateur\", \"Relation client\/partenaire\":\"federateur\", \"Relation avec les parties prenantes\":\"federateur\",\n\n  \"Temps de travail\":\"gardien\", \"Droit \u00e0 l'erreur\":\"gardien\", \"Confiance\":\"gardien\",\n  \"Rituels manag\u00e9riaux\":\"gardien\", \"Communication manag\u00e9riale\":\"gardien\", \"IA & relation client\":\"gardien\"\n};\n\nlet current = 0;\nlet activeQuestions = QUESTIONS; \/\/ parcours actif (m\u00e9lang\u00e9 \u00e0 chaque lancement)\nlet answers = new Array(QUESTIONS.length).fill(null); \/\/ index (0 ou 1) choisi par question\nconst selfRatings = {\"savoir\":0, \"savoir-faire\":0, \"savoir-etre\":0};\n\nfunction shuffleArray(arr){\n  const a = [...arr];\n  for(let i=a.length-1; i>0; i--){\n    const j = Math.floor(Math.random()*(i+1));\n    [a[i],a[j]] = [a[j],a[i]];\n  }\n  return a;\n}\n\nfunction buildActiveQuestions(){\n  \/\/ Nouveau tirage \u00e0 chaque lancement : ordre des questions m\u00e9lang\u00e9,\n  \/\/ et pour chacune, ordre A\/B des deux affirmations m\u00e9lang\u00e9 \u00e9galement.\n  activeQuestions = shuffleArray(QUESTIONS).map(q=>{\n    const opts = Math.random() < 0.5 ? [q.opts[0], q.opts[1]] : [q.opts[1], q.opts[0]];\n    return { opts };\n  });\n  answers = new Array(activeQuestions.length).fill(null);\n}\n\nfunction renderStarWidgets(){\n  Object.keys(selfRatings).forEach(d=>{\n    const el = document.getElementById('stars-'+d);\n    if(!el) return;\n    el.innerHTML = '';\n    if(selfRatings[d]>0) el.classList.remove('missing');\n    for(let i=1;i<=5;i++){\n      const s = document.createElement('span');\n      s.className = 'star' + (i<=selfRatings[d] ? ' filled':'');\n      s.textContent = '\u2605';\n      s.onclick = ()=>{ selfRatings[d] = (selfRatings[d]===i ? i-1 : i); renderStarWidgets(); };\n      el.appendChild(s);\n    }\n  });\n}\nrenderStarWidgets();\n\n\/\/ Majuscule automatique sur la premi\u00e8re lettre (pr\u00e9nom, nom, entreprise) \u2014\n\/\/ live pendant la saisie, sans perturber la position du curseur.\nfunction capitalizeFirst(v){\n  if(!v) return v;\n  return v.charAt(0).toUpperCase() + v.slice(1);\n}\n['pdf-prenom','pdf-nom','pdf-entreprise'].forEach(id=>{\n  const el = document.getElementById(id);\n  if(!el) return;\n  el.addEventListener('input', ()=>{\n    const start = el.selectionStart, end = el.selectionEnd;\n    const capitalized = capitalizeFirst(el.value);\n    if(capitalized !== el.value){\n      el.value = capitalized;\n      el.setSelectionRange(start, end);\n    }\n  });\n});\n\nfunction tryStartAssessment(){\n  const dims = [\"savoir\",\"savoir-faire\",\"savoir-etre\"];\n  const missing = dims.filter(d=>selfRatings[d]===0);\n\n  if(missing.length>0){\n    missing.forEach(d=>{\n      const el = document.getElementById('stars-'+d);\n      if(!el) return;\n      el.classList.remove('blink'); \/\/ reset pour permettre de rejouer l'animation\n      void el.offsetWidth; \/\/ force reflow\n      el.classList.add('blink');\n      el.addEventListener('animationend', ()=> el.classList.remove('blink'), {once:true});\n    });\n    return;\n  }\n  startAssessment();\n}\n\nfunction startAssessment(){\n  current = 0;\n  buildActiveQuestions();\n  swap('screen-quiz');\n  renderQuestion();\n}\n\nfunction swap(id){\n  document.querySelectorAll('.screen').forEach(s=>s.classList.remove('active'));\n  document.getElementById(id).classList.add('active');\n  document.getElementById('oswego-app').classList.toggle('theme-dark', id==='screen-intro');\n  window.scrollTo({top:0,behavior:'smooth'});\n}\n\nfunction renderQuestion(){\n  const q = activeQuestions[current];\n  document.getElementById('q-text').textContent = \"Laquelle de ces deux propositions vous ressemble le plus ?\";\n\n  const optsEl = document.getElementById('q-opts');\n  optsEl.innerHTML = '';\n  q.opts.forEach((o,i)=>{\n    const letter = String.fromCharCode(65+i); \/\/ A, B\n    const div = document.createElement('div');\n    div.className = 'opt' + (answers[current]===i ? ' selected':'');\n    div.innerHTML = `<div class=\"opt-mark\">${letter}<\/div><div class=\"opt-text\">${o.t}<\/div>`;\n    div.onclick = ()=>selectOption(i);\n    optsEl.appendChild(div);\n  });\n\n  document.getElementById('q-count').textContent = `${current+1} \/ ${activeQuestions.length}`;\n  document.getElementById('progress-label').textContent = `Question ${current+1} \/ ${activeQuestions.length}`;\n  const pct = Math.round(((current)\/activeQuestions.length)*100);\n  document.getElementById('progress-pct').textContent = pct + '%';\n  document.getElementById('progress-fill').style.width = pct + '%';\n\n  document.getElementById('btn-prev').disabled = current===0;\n  document.getElementById('btn-next').disabled = answers[current]===null;\n  document.getElementById('btn-next').innerHTML = current===activeQuestions.length-1 ? 'Voir ma synth\u00e8se <span class=\"btn-arrow\">\u2192<\/span>' : 'Suivant <span class=\"btn-arrow\">\u2192<\/span>';\n}\n\nfunction selectOption(i){\n  answers[current] = i;\n  renderQuestion();\n}\n\nfunction nextQuestion(){\n  if(answers[current]===null) return;\n  if(current < activeQuestions.length-1){\n    current++;\n    renderQuestion();\n  } else {\n    showResults();\n  }\n}\n\nfunction prevQuestion(){\n  if(current>0){\n    current--;\n    renderQuestion();\n  }\n}\n\nfunction restart(){\n  current = 0;\n  answers = new Array(QUESTIONS.length).fill(null);\n  Object.keys(selfRatings).forEach(d=>selfRatings[d]=0);\n  renderStarWidgets();\n  swap('screen-intro');\n}\n\nlet lastResults = null; \/\/ r\u00e9utilis\u00e9 par le g\u00e9n\u00e9rateur PDF\n\nfunction showResults(){\n  \/\/ Comptage ipsatif : chaque cat\u00e9gorie appara\u00eet exactement 2 fois dans le\n  \/\/ parcours. On compte combien de fois elle a \u00e9t\u00e9 choisie sur ses 2\n  \/\/ apparitions -> score de pr\u00e9f\u00e9rence relative par cat\u00e9gorie.\n  const appearances = {};\n  const chosen = {};\n  const catDim = {};\n\n  activeQuestions.forEach((q,qi)=>{\n    q.opts.forEach((o,oi)=>{\n      appearances[o.cat] = (appearances[o.cat]||0) + 1;\n      catDim[o.cat] = o.dim;\n      if(answers[qi]===oi){\n        chosen[o.cat] = (chosen[o.cat]||0) + 1;\n      }\n    });\n  });\n\n  const catScores = {}; \/\/ 0-100 par cat\u00e9gorie\n  Object.keys(appearances).forEach(cat=>{\n    catScores[cat] = Math.round(((chosen[cat]||0) \/ appearances[cat]) * 100);\n  });\n\n  const dims = [\"savoir\",\"savoir-faire\",\"savoir-etre\"];\n  const scores = {};\n  dims.forEach(d=>{\n    const cats = Object.keys(catDim).filter(c=>catDim[c]===d);\n    const avg = cats.reduce((sum,c)=>sum+catScores[c],0) \/ cats.length;\n    scores[d] = {pct: Math.round(avg)};\n  });\n\n  \/\/ cat\u00e9gories faibles = celles jamais choisies, ou choisies 1 fois sur 2\n  const weakCats = {};\n  Object.keys(catScores).forEach(cat=>{\n    if(catScores[cat] < 100){\n      weakCats[cat] = (appearances[cat] - (chosen[cat]||0));\n    }\n  });\n\n  \/\/ arch\u00e9types (m\u00eames r\u00e9ponses, agr\u00e9g\u00e9es diff\u00e9remment)\n  const archAppear = {}, archChosen = {};\n  Object.keys(CAT_ARCHETYPE).forEach(cat=>{\n    const a = CAT_ARCHETYPE[cat];\n    archAppear[a] = (archAppear[a]||0) + (appearances[cat]||0);\n    archChosen[a] = (archChosen[a]||0) + (chosen[cat]||0);\n  });\n  const archScores = {};\n  Object.keys(archAppear).forEach(a=>{\n    archScores[a] = Math.round((archChosen[a]\/archAppear[a])*100);\n  });\n  const archSorted = Object.entries(archScores).sort((a,b)=>b[1]-a[1]);\n\n  lastResults = {appearances, chosen, catDim, catScores, scores, weakCats, archScores, archSorted,\n                 questionCount: activeQuestions.length, selfRatings: {...selfRatings}};\n\n  renderScoreGrid(scores);\n  renderProfile(lastResults);\n  renderPerception(scores);\n  renderSynthesis(scores);\n  renderGaps(weakCats, catDim);\n  renderProgram(weakCats, scores);\n\n  \/\/ masquer le formulaire PDF au cas o\u00f9 on revient d'une session pr\u00e9c\u00e9dente\n  document.getElementById('pdf-gate').classList.remove('open');\n  document.getElementById('pdf-error').innerHTML = '';\n\n  swap('screen-results');\n}\n\nfunction renderPerception(scores){\n  const dims = [\"savoir\",\"savoir-faire\",\"savoir-etre\"];\n  const rated = dims.filter(d=>selfRatings[d]>0);\n  const block = document.getElementById('perception-block');\n\n  if(rated.length===0){ block.innerHTML=''; return; }\n\n  const rows = rated.map(d=>{\n    const selfPct = selfRatings[d]*20;\n    const measured = scores[d].pct;\n    const delta = measured - selfPct;\n    let verdict;\n    if(Math.abs(delta)<=15) verdict = \"Votre auto-\u00e9valuation est align\u00e9e avec votre pratique mesur\u00e9e.\";\n    else if(delta>15) verdict = \"Vous vous sous-estimez sur cette dimension \u2014 votre pratique est plus solide que vous ne le pensez.\";\n    else verdict = \"On observe une surestimation : la pratique mesur\u00e9e est en retrait par rapport \u00e0 votre perception.\";\n    return `\n      <div class=\"perc-row\">\n        <div class=\"perc-dim ${d}\">${DIM_LABELS[d]}<\/div>\n        <div class=\"perc-bar-line\"><span class=\"perc-label\">Votre estimation<\/span><div class=\"perc-track\"><i style=\"width:${selfPct}%\"><\/i><\/div><span class=\"perc-val\">${selfPct}%<\/span><\/div>\n        <div class=\"perc-bar-line\"><span class=\"perc-label\">Mesure de l'assessment<\/span><div class=\"perc-track measured\"><i style=\"width:${measured}%\"><\/i><\/div><span class=\"perc-val\">${measured}%<\/span><\/div>\n        <div class=\"perc-verdict\">${verdict}<\/div>\n      <\/div>`;\n  }).join('');\n\n  block.innerHTML = `\n    <div class=\"section-head\"><span class=\"section-num\">01<\/span><span class=\"section-title\">Perception vs mesure<\/span><\/div>\n    ${rows}\n  `;\n}\n\nfunction buildRadarSVG(archScores){\n  const order = [\"pilote\",\"batisseur\",\"federateur\",\"gardien\"];\n  const labels = order.map(k=>ARCHETYPES[k].name.replace(\"Le \",\"\"));\n  \/\/ cadre \u00e9largi horizontalement (300 au lieu de 240) + centre d\u00e9cal\u00e9 (150)\n  \/\/ pour laisser assez de place aux libell\u00e9s est\/ouest, qui partent d\u00e9sormais\n  \/\/ de leur point d'ancrage vers l'ext\u00e9rieur au lieu d'\u00eatre centr\u00e9s dessus\n  \/\/ (c'est ce centrage qui les faisait d\u00e9border du cadre et para\u00eetre rogn\u00e9s).\n  const cx=170, cy=132, R=68;\n  const angleFor = i => (-90 + i*90) * Math.PI\/180;\n  const ptAt = (r,i) => { const a=angleFor(i); return [cx+r*Math.cos(a), cy+r*Math.sin(a)]; };\n  const ringPath = (r) => order.map((_,i)=>ptAt(r,i).join(',')).join(' ');\n  const dataPts = order.map((k,i)=>ptAt(R*(archScores[k]\/100), i));\n  const dataPath = dataPts.map(p=>p.join(',')).join(' ');\n\n  let grid = [0.25,0.5,0.75,1].map(f=>\n    `<polygon points=\"${ringPath(R*f)}\" fill=\"none\" stroke=\"var(--line)\" stroke-width=\"1\"\/>`).join('');\n  let axes = order.map((_,i)=>{\n    const [x2,y2] = ptAt(R,i);\n    return `<line x1=\"${cx}\" y1=\"${cy}\" x2=\"${x2}\" y2=\"${y2}\" stroke=\"var(--line)\" stroke-width=\"1\"\/>`;\n  }).join('');\n\n  \/\/ ancrage du texte : est (i=1) part vers la droite, ouest (i=3) vers la\n  \/\/ gauche, nord\/sud restent centr\u00e9s sur leur axe vertical.\n  const anchorFor = i => i===1 ? 'start' : i===3 ? 'end' : 'middle';\n  const dxFor = i => i===1 ? 6 : i===3 ? -6 : 0;\n\n  let labelsSvg = order.map((k,i)=>{\n    const [lx,ly] = ptAt(R+16,i);\n    const anchor = anchorFor(i), dx = dxFor(i);\n    return `<text x=\"${lx+dx}\" y=\"${ly}\" text-anchor=\"${anchor}\" font-size=\"11\" font-weight=\"700\" fill=\"var(--ink)\">${labels[i]}<\/text>\n            <text x=\"${lx+dx}\" y=\"${ly+13}\" text-anchor=\"${anchor}\" font-size=\"10\" fill=\"var(--accent)\">${archScores[k]}%<\/text>`;\n  }).join('');\n\n  return `<svg viewBox=\"0 0 360 264\" style=\"width:100%;display:block;\">\n    ${grid}${axes}\n    <polygon points=\"${dataPath}\" fill=\"var(--accent)\" fill-opacity=\"0.16\" stroke=\"var(--accent)\" stroke-width=\"2\"\/>\n    ${dataPts.map(p=>`<circle cx=\"${p[0]}\" cy=\"${p[1]}\" r=\"3\" fill=\"var(--accent)\"\/>`).join('')}\n    ${labelsSvg}\n  <\/svg>`;\n}\n\nfunction renderProfile(results){\n  const [leadKey, leadScore] = results.archSorted[0];\n  const [secondKey, secondScore] = results.archSorted[1];\n  const lead = ARCHETYPES[leadKey];\n  const second = ARCHETYPES[secondKey];\n\n  const close = (leadScore - secondScore) <= 15;\n  const radarSvg = buildRadarSVG(results.archScores);\n  const shareUrl = ARCHETYPE_SHARE_URLS[leadKey];\n\n  const html = `\n    <div class=\"profile-card\">\n      <div class=\"profile-eyebrow\">Profil dominant<\/div>\n      <div class=\"profile-name\">${lead.name}<\/div>\n      <div class=\"profile-tagline\">${lead.tagline}<\/div>\n      <p class=\"profile-desc\">${lead.desc}<\/p>\n      <div class=\"profile-cols\">\n        <div><div class=\"profile-col-label\">Force naturelle<\/div><div class=\"profile-col-text\">${lead.force}<\/div><\/div>\n        <div><div class=\"profile-col-label\">Point de vigilance<\/div><div class=\"profile-col-text\">${lead.vigilance}<\/div><\/div>\n      <\/div>\n      ${close ? `<div class=\"profile-second\">Votre profil est proche de <b>${second.name}<\/b> (${second.tagline.toLowerCase()}) \u2014 une combinaison qui nuance votre pratique au quotidien.<\/div>` : ''}\n      <div class=\"profile-radar-wrap\">\n        <div class=\"profile-radar-row\">\n          <div class=\"profile-radar-col\">\n            <div class=\"profile-col-label\" style=\"text-align:center;margin-bottom:4px;\">R\u00e9partition sur les 4 profils<\/div>\n            ${radarSvg}\n          <\/div>\n          <div class=\"profile-image-col\">\n            <div class=\"profile-col-label\" style=\"text-align:center;margin-bottom:4px;\">Votre profil en image<\/div>\n            <a href=\"${shareUrl}\" target=\"_blank\" rel=\"noopener\" class=\"profile-image-link\">\n              <img decoding=\"async\" src=\"${shareUrl}\" alt=\"Visuel du profil ${lead.name}\" loading=\"lazy\">\n            <\/a>\n            <div class=\"profile-image-cta\">\n              <button class=\"btn ghost small\" onclick=\"downloadImageFile('${shareUrl}')\">T\u00e9l\u00e9charger<\/button>\n              <button class=\"btn ghost small\" onclick=\"shareProfile()\">Partager \u2197<\/button>\n            <\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  `;\n  document.getElementById('profile-reveal').innerHTML = html;\n}\n\nfunction levelLabel(pct){\n  if(pct>=80) return \"Ma\u00eetrise confirm\u00e9e\";\n  if(pct>=60) return \"Pratique install\u00e9e\";\n  if(pct>=40) return \"Bases \u00e0 consolider\";\n  return \"Axe prioritaire\";\n}\n\nfunction renderScoreGrid(scores){\n  const grid = document.getElementById('score-grid');\n  grid.innerHTML='';\n  [\"savoir\",\"savoir-faire\",\"savoir-etre\"].forEach(d=>{\n    const s = scores[d];\n    const card = document.createElement('div');\n    card.className='score-card';\n    card.dataset.d = d;\n    card.innerHTML = `\n      <div class=\"score-dim ${d}\">${DIM_LABELS[d]}<\/div>\n      <div class=\"score-num\">${s.pct}%<\/div>\n      <div class=\"score-bar\"><i style=\"width:${s.pct}%\"><\/i><\/div>\n      <div class=\"score-level\">${levelLabel(s.pct)}<\/div>`;\n    grid.appendChild(card);\n  });\n}\n\nfunction renderSynthesis(scores){\n  const overall = Math.round((scores.savoir.pct + scores[\"savoir-faire\"].pct + scores[\"savoir-etre\"].pct)\/3);\n  const sorted = [\"savoir\",\"savoir-faire\",\"savoir-etre\"].sort((a,b)=>scores[b].pct - scores[a].pct);\n  const strong = sorted[0], weak = sorted[2];\n\n  document.getElementById('res-sub').textContent = `Score global : ${overall}% \u2014 profil \u00e9tabli sur ${activeQuestions.length} choix de pr\u00e9f\u00e9rence`;\n\n  let commentaire = \"\";\n  if(overall>=75){\n    commentaire = \"Votre profil traduit une pratique d\u00e9j\u00e0 mature des op\u00e9rations client. \";\n  } else if(overall>=55){\n    commentaire = \"Votre profil traduit une pratique install\u00e9e, avec des marges de progression identifiables et actionnables. \";\n  } else {\n    commentaire = \"Votre profil r\u00e9v\u00e8le une pratique encore en construction sur plusieurs dimensions cl\u00e9s du m\u00e9tier. \";\n  }\n\n  const html = `\n    <p class=\"synth-text\">${commentaire}Votre point le plus solide se situe sur la dimension <b>${DIM_LABELS[strong]}<\/b> (${scores[strong].pct}%), tandis que la dimension <b>${DIM_LABELS[weak]}<\/b> (${scores[weak].pct}%) constitue votre principal axe de progression.<\/p>\n    <p class=\"synth-text\">Cette lecture ne mesure pas une performance certifi\u00e9e : elle refl\u00e8te vos pr\u00e9f\u00e9rences et priorit\u00e9s r\u00e9elles, et oriente une trajectoire de formation coh\u00e9rente avec votre pratique du terrain.<\/p>\n  `;\n  document.getElementById('synth-block').innerHTML = html;\n}\n\nfunction renderGaps(weakCats, catDim){\n  const list = document.getElementById('gap-list');\n  list.innerHTML='';\n  const sorted = Object.entries(weakCats).sort((a,b)=>b[1]-a[1]).slice(0,6);\n\n  if(sorted.length===0){\n    list.innerHTML = '<p class=\"synth-text\">Aucun point de vigilance marqu\u00e9 \u2014 votre profil est homog\u00e8ne sur l\\'ensemble des th\u00e8mes test\u00e9s.<\/p>';\n    return;\n  }\n\n  sorted.forEach(([cat,weight])=>{\n    const dim = catDim[cat];\n    const div = document.createElement('li');\n    div.className='gap-item';\n    div.innerHTML = `<div class=\"gap-tag ${dim}\">${DIM_LABELS[dim]}<\/div>\n      <div class=\"gap-body-text\"><b>${cat}<\/b>Vos choix sur ce th\u00e8me indiquent une pratique encore \u00e0 consolider.<\/div>`;\n    list.appendChild(div);\n  });\n}\n\nfunction renderProgram(weakCats, scores){\n  const progList = document.getElementById('prog-list');\n  progList.innerHTML='';\n\n  const finalList = computeRecommendedModules(weakCats, scores);\n\n  finalList.forEach((m,i)=>{\n    const div = document.createElement('div');\n    div.className='prog-item';\n    const dimTags = m.dims.map(d=>`<span class=\"prog-pill\">${DIM_LABELS[d]}<\/span>`).join('');\n    const priceLabel = m.price==='Gratuit' ? 'Gratuit' : 'Payant';\n    const why = (m.matched && m.matched.length>0) ? m.matched.join(', ') : 'votre profil global';\n    div.innerHTML = `\n      <div class=\"prog-rank\">${String(i+1).padStart(2,'0')}<\/div>\n      <div class=\"prog-body\">\n        <div class=\"prog-title\">${m.title}<\/div>\n        <div class=\"prog-why\">Recommand\u00e9 au regard de : ${why}<\/div>\n        <div class=\"prog-tags\">${dimTags}<\/div>\n      <\/div>\n      <div class=\"prog-price\">${priceLabel}${m.url!=='#' ? `<br><a class=\"prog-link\" href=\"${m.url}\" target=\"_blank\">Voir le module \u2192<\/a>` : ''}<\/div>\n    `;\n    progList.appendChild(div);\n  });\n}\n\n\/* =========================================================================\n   FORMULAIRE DE CAPTURE + G\u00c9N\u00c9RATION PDF (jsPDF)\n   ========================================================================= *\/\n\/* =========================================================================\n   PARTAGE DU PROFIL \u2014 visuel g\u00e9n\u00e9rique par arch\u00e9type (pas de personnalisation,\n   image stock\u00e9e dans la m\u00e9diath\u00e8que WP). Web Share API sur mobile (partage\n   natif du fichier image quand le navigateur le permet), repli en ouverture\n   d'onglet sur desktop.\n   ========================================================================= *\/\nconst ARCHETYPE_SHARE_URLS = {\n  pilote:     \"https:\/\/oswego.eu\/wp-content\/uploads\/2026\/09\/oswego-assessment-profil-pilote.png\",\n  batisseur:  \"https:\/\/oswego.eu\/wp-content\/uploads\/2026\/09\/oswego-assessment-profil-batisseur.png\",\n  federateur: \"https:\/\/oswego.eu\/wp-content\/uploads\/2026\/09\/oswego-assessment-profil-federateur.png\",\n  gardien:    \"https:\/\/oswego.eu\/wp-content\/uploads\/2026\/09\/oswego-assessment-profil-gardien.png\"\n};\n\n\/\/ T\u00e9l\u00e9charge un fichier distant directement en local (plut\u00f4t que de l'ouvrir\n\/\/ dans un nouvel onglet). Retourne true si le t\u00e9l\u00e9chargement a \u00e9t\u00e9 d\u00e9clench\u00e9.\nasync function downloadImageFile(url){\n  try{\n    const resp = await fetch(url);\n    const blob = await resp.blob();\n    const blobUrl = URL.createObjectURL(blob);\n    const a = document.createElement('a');\n    a.href = blobUrl;\n    a.download = url.split('\/').pop();\n    document.body.appendChild(a);\n    a.click();\n    a.remove();\n    setTimeout(()=>URL.revokeObjectURL(blobUrl), 4000);\n    return true;\n  } catch(e){\n    return false; \/\/ \u00e9chec r\u00e9seau\/CORS : laisser l'appelant d\u00e9cider du repli\n  }\n}\n\nasync function shareProfile(){\n  if(!lastResults || !lastResults.archSorted || !lastResults.archSorted[0]){\n    return; \/\/ pas de r\u00e9sultat calcul\u00e9 (ne devrait pas arriver depuis l'\u00e9cran r\u00e9sultats)\n  }\n  const leadKey = lastResults.archSorted[0][0];\n  const imageUrl = ARCHETYPE_SHARE_URLS[leadKey];\n  const archetypeName = ARCHETYPES[leadKey] ? ARCHETYPES[leadKey].name : \"\";\n  const shareText = `Mon profil au Centre d'Assessment OswegO : ${archetypeName}. Et vous, quel est votre profil ?`;\n\n  \/\/ mobile avec Web Share API + partage de fichier natif si possible\n  if(navigator.share){\n    try{\n      if(navigator.canShare && window.fetch){\n        const resp = await fetch(imageUrl);\n        const blob = await resp.blob();\n        const file = new File([blob], imageUrl.split('\/').pop(), {type: blob.type || 'image\/png'});\n        if(navigator.canShare({files:[file]})){\n          await navigator.share({files:[file], text:shareText, url:\"https:\/\/oswego.eu\/assessment\"});\n          return;\n        }\n      }\n      \/\/ repli : partage du lien seul si le partage de fichier n'est pas support\u00e9\n      await navigator.share({text:shareText, url:imageUrl});\n      return;\n    } catch(e){\n      \/\/ l'utilisateur a annul\u00e9 le partage, ou une erreur r\u00e9seau : pas d'action bloquante\n      if(e && e.name === 'AbortError') return;\n    }\n  }\n\n  \/\/ repli desktop : t\u00e9l\u00e9charger directement le visuel en local\n  const downloaded = await downloadImageFile(imageUrl);\n  if(!downloaded){\n    \/\/ dernier repli si le t\u00e9l\u00e9chargement \u00e9choue (CORS, r\u00e9seau) : au moins consultable\n    window.open(imageUrl, '_blank');\n  }\n}\n\nfunction togglePdfGate(){\n  const gate = document.getElementById('pdf-gate');\n  const opening = !gate.classList.contains('open');\n  gate.classList.toggle('open');\n  if(opening){\n    gate.scrollIntoView({behavior:'smooth', block:'center'});\n  }\n}\n\nfunction isPlausibleName(v){\n  v = (v||'').trim();\n  if(v.length<2 || v.length>40) return false;\n  if(!\/^[A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u00ff][A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u00ff' -]*$\/.test(v)) return false;\n  if(\/^(.)\\1+$\/.test(v.replace(\/\\s\/g,''))) return false; \/\/ \"aaaa\"\n  if(\/^(test|essai|xxx|prenom|nom|na|none)$\/i.test(v)) return false;\n  return true;\n}\n\nfunction isPlausibleCompany(v){\n  v = (v||'').trim();\n  if(v.length<2 || v.length>80) return false;\n  if(\/^(.)\\1+$\/.test(v.replace(\/\\s\/g,''))) return false;\n  if(\/^(test|essai|xxx|entreprise|societe|soci\u00e9t\u00e9|na|none)$\/i.test(v)) return false;\n  return true;\n}\n\nconst DISPOSABLE_DOMAINS = [\"mailinator.com\",\"yopmail.com\",\"guerrillamail.com\",\"10minutemail.com\",\n  \"trashmail.com\",\"test.com\",\"example.com\",\"fake.com\",\"tempmail.com\",\"sharklasers.com\"];\n\nfunction isPlausibleEmail(v){\n  v = (v||'').trim().toLowerCase();\n  const re = \/^[a-z0-9._%+-]+@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.[a-z]{2,24}$\/;\n  if(!re.test(v)) return false;\n  const [local, domain] = v.split('@');\n  if(local.length<2) return false;\n  if(\/^(test|essai|asdf|abc123|xxx|none|na|admin|user|email)$\/.test(local)) return false;\n  if(\/(.)\\1{3,}\/.test(local)) return false; \/\/ 4+ caract\u00e8res identiques d'affil\u00e9e\n  if(DISPOSABLE_DOMAINS.includes(domain)) return false;\n  return true;\n}\n\nasync function validateAndGeneratePDF(){\n  const prenom = document.getElementById('pdf-prenom').value;\n  const nom = document.getElementById('pdf-nom').value;\n  const entreprise = document.getElementById('pdf-entreprise').value;\n  const email = document.getElementById('pdf-email').value;\n\n  const fields = [\n    {id:'pdf-prenom', ok:isPlausibleName(prenom), msg:\"Le pr\u00e9nom saisi ne semble pas valide.\"},\n    {id:'pdf-nom', ok:isPlausibleName(nom), msg:\"Le nom saisi ne semble pas valide.\"},\n    {id:'pdf-entreprise', ok:isPlausibleCompany(entreprise), msg:\"Le nom d'entreprise saisi ne semble pas valide.\"},\n    {id:'pdf-email', ok:isPlausibleEmail(email), msg:\"L'adresse email saisie ne semble pas valide.\"},\n  ];\n\n  let errors = [];\n  fields.forEach(f=>{\n    const el = document.getElementById(f.id);\n    if(f.ok){ el.classList.remove('invalid'); }\n    else { el.classList.add('invalid'); errors.push(f.msg); }\n  });\n\n  const errBox = document.getElementById('pdf-error');\n  if(errors.length>0){\n    errBox.innerHTML = '<ul>' + errors.map(e=>`<li>${e}<\/li>`).join('') + '<\/ul>';\n    return;\n  }\n  errBox.innerHTML = '';\n\n  try{\n    await generatePDF({\n      prenom: capitalizeFirst(prenom.trim()), nom: capitalizeFirst(nom.trim()),\n      entreprise: capitalizeFirst(entreprise.trim()), email: email.trim()\n    });\n  } catch(e){\n    \/\/ Filet de s\u00e9curit\u00e9 : si generatePDF \u00e9choue quand m\u00eame pour une raison\n    \/\/ impr\u00e9vue, on l'affiche clairement au lieu de laisser un clic sans effet.\n    console.error(\"\u00c9chec de la g\u00e9n\u00e9ration du PDF :\", e);\n    errBox.innerHTML = \"<ul><li>La g\u00e9n\u00e9ration du PDF a \u00e9chou\u00e9. Merci de r\u00e9essayer \u2014 si le probl\u00e8me persiste, contactez l'\u00e9quipe technique.<\/li><\/ul>\";\n  }\n}\n\n\/\/ ---- Helpers de dessin PDF ----\nconst PDF_COLORS = {\n  ink:[37,37,37], paper:[247,247,247], paper2:[235,235,233], line:[214,212,207],\n  accent:[255,0,0], accent2:[114,112,109], gold:[224,60,42], grey:[114,112,109]\n};\n\/\/ Palette noire OswegO \u2014 r\u00e9serv\u00e9e aux pages de couverture et de cl\u00f4ture\n\/\/ (marketing \/ communication), le reste du document (livrable client)\n\/\/ reste sur fond clair conform\u00e9ment \u00e0 la charte.\nconst PDF_DARK = {\n  bg:[37,37,37], ink:[242,242,242], grey:[163,161,155], accent:[255,0,0]\n};\nfunction pdfSetFill(doc,c){ doc.setFillColor(c[0],c[1],c[2]); }\nfunction pdfSetText(doc,c){ doc.setTextColor(c[0],c[1],c[2]); }\nfunction pdfSetDraw(doc,c){ doc.setDrawColor(c[0],c[1],c[2]); }\n\nfunction pdfBar(doc, x, y, w, h, pct, fillColor){\n  pdfSetFill(doc, PDF_COLORS.paper2);\n  doc.rect(x, y, w, h, 'F');\n  pdfSetDraw(doc, PDF_COLORS.line);\n  doc.setLineWidth(0.15);\n  doc.rect(x, y, w, h, 'S');\n  const filled = Math.max(1, w * (pct\/100));\n  pdfSetFill(doc, fillColor);\n  doc.rect(x, y, filled, h, 'F');\n}\n\nfunction pdfWrapText(doc, text, x, y, maxWidth, lineHeight){\n  const lines = doc.splitTextToSize(text, maxWidth);\n  lines.forEach((line,i)=> doc.text(line, x, y + i*lineHeight));\n  return y + lines.length*lineHeight;\n}\n\n\/\/ Charge une image distante en data URL (n\u00e9cessaire pour doc.addImage, qui ne\n\/\/ sait pas aller chercher une URL r\u00e9seau lui-m\u00eame). Retourne null en cas\n\/\/ d'\u00e9chec (CORS, r\u00e9seau) plut\u00f4t que de faire \u00e9chouer toute la g\u00e9n\u00e9ration.\nasync function loadImageAsDataUrl(url){\n  try{\n    const resp = await fetch(url);\n    const blob = await resp.blob();\n    return await new Promise((resolve,reject)=>{\n      const reader = new FileReader();\n      reader.onload = ()=> resolve(reader.result);\n      reader.onerror = reject;\n      reader.readAsDataURL(blob);\n    });\n  } catch(e){\n    return null;\n  }\n}\n\n\/\/ Dimensions r\u00e9elles de l'image, pour un redimensionnement \"contain\" fid\u00e8le\n\/\/ (on ne devine jamais un ratio \u2014 jsPDF d\u00e9forme l'image si on se trompe).\nfunction getImageNaturalSize(dataUrl){\n  return new Promise((resolve,reject)=>{\n    const img = new Image();\n    img.onload = ()=> resolve({w:img.naturalWidth, h:img.naturalHeight});\n    img.onerror = reject;\n    img.src = dataUrl;\n  });\n}\n\n\/\/ Pied de page (QR Academy + tagline + contact) sur les pages int\u00e9rieures,\n\/\/ num\u00e9rotation sur TOUTES les pages. Passe finale, appliqu\u00e9e apr\u00e8s que tout\n\/\/ le contenu a \u00e9t\u00e9 compos\u00e9 \u2014 page 1 (couverture) et derni\u00e8re page (cl\u00f4ture)\n\/\/ gardent une num\u00e9rotation discr\u00e8te mais pas le pied de page complet, pour\n\/\/ rester \u00e9pur\u00e9es comme demand\u00e9.\nasync function pdfAddFootersAndPageNumbers(doc, PW, PH, M){\n  let qrData = null;\n  try{\n    qrData = await loadImageAsDataUrl(\n      \"https:\/\/api.qrserver.com\/v1\/create-qr-code\/?size=200x200&margin=0&data=\" +\n      encodeURIComponent(\"https:\/\/academy.oswego.eu\")\n    );\n  } catch(e){ qrData = null; }\n\n  const totalPages = doc.internal.getNumberOfPages();\n  for(let i=1; i<=totalPages; i++){\n    doc.setPage(i);\n    const isDarkPage = (i===1 || i===totalPages);\n    const numColor = isDarkPage ? PDF_DARK.grey : PDF_COLORS.grey;\n\n    if(!isDarkPage){\n      \/\/ pied de page complet : filet, QR cliquable, tagline, contact.\n      \/\/ Le QR occupe le coin bas-droit ; le num\u00e9ro de page est d\u00e9lib\u00e9r\u00e9ment\n      \/\/ plac\u00e9 ailleurs (centr\u00e9, tout en bas) pour ne jamais se superposer.\n      const footerTop = PH - 26;\n      pdfSetDraw(doc, PDF_COLORS.line); doc.setLineWidth(0.2);\n      doc.line(M, footerTop, PW-M, footerTop);\n\n      const qrSize = 12;\n      const qrX = PW - M - qrSize, qrY = footerTop + 3;\n      if(qrData){\n        try{\n          doc.addImage(qrData, 'PNG', qrX, qrY, qrSize, qrSize);\n          doc.link(qrX, qrY, qrSize, qrSize, {url:\"https:\/\/academy.oswego.eu\"});\n        } catch(e){ \/* pas de QR si l'insertion \u00e9choue : le reste du pied de page reste affich\u00e9 *\/ }\n      }\n\n      doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(8); pdfSetText(doc, PDF_COLORS.ink);\n      doc.text(\"OswegO \u2014 Craft Operations for Brighter Futures\", M, footerTop+8);\n      doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(7); pdfSetText(doc, PDF_COLORS.grey);\n      doc.text(\"www.oswego.eu   \u00b7   +33 1 89 31 14 78   \u00b7   academy.oswego.eu\", M, footerTop+13);\n    }\n\n    \/\/ num\u00e9rotation, sur toutes les pages \u2014 centr\u00e9e tout en bas, \u00e0 l'\u00e9cart du\n    \/\/ QR (coin bas-droit) pour ne jamais se chevaucher avec lui.\n    const numColorFinal = isDarkPage ? PDF_DARK.grey : PDF_COLORS.ink;\n    doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(9); pdfSetText(doc, numColorFinal);\n    doc.text(`${i} \/ ${totalPages}`, PW\/2, PH-6, {align:'center'});\n  }\n}\n\nfunction dimColorPdf(dim){\n  return dim===\"savoir\" ? PDF_COLORS.accent2 : dim===\"savoir-faire\" ? PDF_COLORS.gold : PDF_COLORS.accent;\n}\n\nfunction pdfDrawRadar(doc, archScores, cx, cy, R){\n  const order = [\"pilote\",\"batisseur\",\"federateur\",\"gardien\"];\n  const labels = {pilote:\"Pilote\", batisseur:\"B\u00e2tisseur\", federateur:\"F\u00e9d\u00e9rateur\", gardien:\"Gardien\"};\n  const angleFor = i => (-90 + i*90) * Math.PI\/180;\n  const ptAt = (r,i) => { const a=angleFor(i); return [cx+r*Math.cos(a), cy+r*Math.sin(a)]; };\n\n  \/\/ grille (anneaux 25\/50\/75\/100%)\n  pdfSetDraw(doc, PDF_COLORS.line); doc.setLineWidth(0.15);\n  [0.25,0.5,0.75,1].forEach(f=>{\n    const pts = order.map((_,i)=>ptAt(R*f,i));\n    for(let i=0;i<pts.length;i++){\n      const a=pts[i], b=pts[(i+1)%pts.length];\n      doc.line(a[0],a[1],b[0],b[1]);\n    }\n  });\n  \/\/ axes\n  order.forEach((_,i)=>{ const [x2,y2]=ptAt(R,i); doc.line(cx,cy,x2,y2); });\n\n  \/\/ polygone de donn\u00e9es\n  const dataPts = order.map((k,i)=>ptAt(R*(archScores[k]\/100), i));\n  pdfSetDraw(doc, PDF_COLORS.accent); doc.setLineWidth(0.6);\n  for(let i=0;i<dataPts.length;i++){\n    const a=dataPts[i], b=dataPts[(i+1)%dataPts.length];\n    doc.line(a[0],a[1],b[0],b[1]);\n  }\n  pdfSetFill(doc, PDF_COLORS.accent);\n  dataPts.forEach(p=>doc.circle(p[0],p[1],0.8,'F'));\n\n  \/\/ libell\u00e9s + scores \u2014 est (i=1) part vers la droite, ouest (i=3) vers la\n  \/\/ gauche, nord\/sud restent centr\u00e9s : \u00e9vite que le texte d\u00e9borde de sa\n  \/\/ colonne quand le radar est r\u00e9duit (mise en page \u00e0 deux colonnes).\n  const alignFor = i => i===1 ? 'left' : i===3 ? 'right' : 'center';\n  order.forEach((k,i)=>{\n    const [lx,ly] = ptAt(R+7,i);\n    const align = alignFor(i);\n    doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(7.5); pdfSetText(doc, PDF_COLORS.ink);\n    doc.text(labels[k], lx, ly, {align});\n    doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(7); pdfSetText(doc, PDF_COLORS.accent);\n    doc.text(`${archScores[k]}%`, lx, ly+3.5, {align});\n  });\n}\n\nasync function generatePDF(person){\n  const { jsPDF } = window.jspdf;\n  const doc = new jsPDF({unit:'mm', format:'a4'});\n  const PW = 210, PH = 297, M = 20;\n  let y = 0;\n\n  const r = lastResults;\n  const dims = [\"savoir\",\"savoir-faire\",\"savoir-etre\"];\n\n  \/\/ Vrai logo OswegO (variante blanche, pour fonds noirs) \u2014 charg\u00e9 une fois,\n  \/\/ r\u00e9utilis\u00e9 sur la couverture et la page de cl\u00f4ture. Repli sur le texte\n  \/\/ \"OswegO\" si le logo ne charge pas (r\u00e9seau\/CORS), comme pour le visuel du profil.\n  const LOGO_URL = \"https:\/\/oswego.eu\/wp-content\/uploads\/2025\/01\/oswego_logo_white.png\";\n  let logoData = null, logoRatio = 4; \/\/ 4800x1200 = ratio 4:1 par d\u00e9faut si la mesure \u00e9choue\n  try{\n    logoData = await loadImageAsDataUrl(LOGO_URL);\n    if(logoData){\n      const sz = await getImageNaturalSize(logoData);\n      logoRatio = sz.w \/ sz.h;\n    }\n  } catch(e){ logoData = null; }\n\n  function drawLogo(x, y, w, colors, align){\n    const h = w \/ logoRatio;\n    if(logoData){\n      try{\n        const drawX = align==='center' ? x - w\/2 : x;\n        doc.addImage(logoData, 'PNG', drawX, y, w, h);\n        return h;\n      } catch(e){ \/* repli texte ci-dessous *\/ }\n    }\n    doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(w*1.55); pdfSetText(doc, colors.ink);\n    doc.text(\"OswegO\", align==='center' ? x : x, y + h*0.8, {align: align||'left'});\n    return h;\n  }\n\n  \/\/ ===== PAGE DE COUVERTURE (fond noir OswegO \u2014 marketing\/communication) =====\n  pdfSetFill(doc, PDF_DARK.bg); doc.rect(0,0,PW,PH,'F');\n\n  \/\/ logo + tagline, align\u00e9s \u00e0 gauche en haut\n  const logoH1 = drawLogo(M, 20, 44, PDF_DARK, 'left');\n  doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(9); pdfSetText(doc, PDF_DARK.grey);\n  doc.text(\"Craft Operations for Brighter Futures\", M, 20 + logoH1 + 7);\n\n  pdfSetDraw(doc, PDF_DARK.accent); doc.setLineWidth(0.6);\n  doc.line(PW\/2-21, 108, PW\/2+21, 108);\n\n  doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(10); pdfSetText(doc, PDF_DARK.accent);\n  doc.text(\"CENTRE D'ASSESSMENT\", PW\/2, 122, {align:'center'});\n  doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(26); pdfSetText(doc, PDF_DARK.ink);\n  doc.text(\"Synth\u00e8se individuelle\", PW\/2, 135, {align:'center'});\n  doc.setFont(\"helvetica\",\"italic\"); doc.setFontSize(12); pdfSetText(doc, PDF_DARK.grey);\n  doc.text(\"Op\u00e9rations Client \u2014 Savoir, Savoir-faire, Savoir-\u00eatre\", PW\/2, 143, {align:'center'});\n\n  doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(11.5); pdfSetText(doc, PDF_DARK.ink);\n  doc.text(`${person.prenom} ${person.nom}`, PW\/2, 166, {align:'center'});\n  doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(9.5); pdfSetText(doc, PDF_DARK.grey);\n  doc.text(person.entreprise, PW\/2, 172, {align:'center'});\n  const today = new Date().toLocaleDateString('fr-FR', {year:'numeric',month:'long',day:'numeric'});\n  doc.text(today, PW\/2, 178, {align:'center'});\n\n  pdfSetDraw(doc, PDF_DARK.grey); doc.setLineWidth(0.2);\n  doc.line(M, 258, PW-M, 258);\n  doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(7.5); pdfSetText(doc, PDF_DARK.grey);\n  const confid = \"Document confidentiel, \u00e9tabli \u00e0 l'usage exclusif de la personne \u00e9valu\u00e9e. Ce diagnostic est un outil d'auto-positionnement ; il oriente une trajectoire de formation, il ne mesure pas une performance certifi\u00e9e.\";\n  pdfWrapText(doc, confid, M, 265, PW-2*M, 3.6);\n\n  \/\/ ===== PAGE COURRIER (fond clair \u2014 mot personnel d'Adeline Noirat) =====\n  doc.addPage();\n  let ly = M;\n  doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(13); pdfSetText(doc, PDF_COLORS.ink);\n  doc.text(\"OswegO\", M, ly);\n  doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(8); pdfSetText(doc, PDF_COLORS.grey);\n  doc.text(\"CENTRE D'ASSESSMENT\", PW-M, ly, {align:'right'});\n  pdfSetDraw(doc, PDF_COLORS.ink); doc.setLineWidth(0.4);\n  doc.line(M, ly+3, PW-M, ly+3);\n  ly += 26;\n\n  doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(10.5); pdfSetText(doc, PDF_COLORS.ink);\n  doc.text(`Bonjour ${person.prenom},`, M, ly); ly += 12;\n\n  const letterParagraphs = [\n    \"Merci d'avoir pris le temps de r\u00e9aliser cet assessment.\",\n    \"Une pr\u00e9cision avant tout : les informations que vous avez transmises ne servent qu'\u00e0 personnaliser ce document. Aucune donn\u00e9e n'est conserv\u00e9e \u2014 vous pouvez d'ailleurs refaire l'assessment autant de fois que vous le souhaitez, par exemple avant et apr\u00e8s un parcours de formation, pour mesurer votre \u00e9volution.\",\n    \"Les modules recommand\u00e9s dans les pages suivantes ne sont pas une liste g\u00e9n\u00e9rique : ils r\u00e9pondent \u00e0 vos besoins pr\u00e9cis, et sont pens\u00e9s sp\u00e9cifiquement pour les m\u00e9tiers de l'exp\u00e9rience et des op\u00e9rations client.\",\n    \"Faire cet assessment, c'est d\u00e9j\u00e0 un signe de volont\u00e9 de progresser. C'est cette m\u00eame exigence qui anime OswegO Academy, aujourd'hui pl\u00e9biscit\u00e9e par les managers de l'exp\u00e9rience client et par les entreprises qui les accompagnent.\",\n    \"Prenez le temps de lire ce qui suit \u2014 et si vous le pouvez, partagez ces r\u00e9sultats avec vos pairs ou votre hi\u00e9rarchie : un regard crois\u00e9 donne toujours plus de valeur \u00e0 ce type de diagnostic.\",\n    `Sachez, ${person.prenom}, qu'avec les \u00e9quipes d'OswegO, je reste \u00e0 votre disposition pour vous aider \u00e0 progresser dans vos comp\u00e9tences et votre carri\u00e8re.`,\n  ];\n  letterParagraphs.forEach(p=>{\n    ly = pdfWrapText(doc, p, M, ly, PW-2*M, 5.2) + 7;\n  });\n\n  ly += 6;\n  doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(10.5); pdfSetText(doc, PDF_COLORS.ink);\n  doc.text(\"Bien \u00e0 vous,\", M, ly); ly += 14;\n  doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(11); pdfSetText(doc, PDF_COLORS.ink);\n  doc.text(\"Adeline Noirat\", M, ly); ly += 5.5;\n  doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(9); pdfSetText(doc, PDF_COLORS.grey);\n  doc.text(\"Directrice des programmes \u2014 OswegO Academy\", M, ly);\n\n  \/\/ ===== PAGE DE CONTENU (fond clair \u2014 livrable client) =====\n  doc.addPage();\n  y = M;\n  doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(13); pdfSetText(doc, PDF_COLORS.ink);\n  doc.text(\"OswegO\", M, y);\n  doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(8); pdfSetText(doc, PDF_COLORS.grey);\n  doc.text(\"CENTRE D'ASSESSMENT\", PW-M, y, {align:'right'});\n  pdfSetDraw(doc, PDF_COLORS.ink); doc.setLineWidth(0.4);\n  doc.line(M, y+3, PW-M, y+3);\n  y += 14;\n\n  doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(9); pdfSetText(doc, PDF_COLORS.accent);\n  doc.text(\"OP\u00c9RATIONS CLIENT \u2014 SYNTH\u00c8SE INDIVIDUELLE\", M, y);\n  y += 9;\n  doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(21); pdfSetText(doc, PDF_COLORS.ink);\n  doc.text(`R\u00e9sultats de ${person.prenom} ${person.nom}`, M, y);\n  y += 6;\n  const overall = Math.round((r.scores.savoir.pct + r.scores[\"savoir-faire\"].pct + r.scores[\"savoir-etre\"].pct)\/3);\n  doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(9.5); pdfSetText(doc, PDF_COLORS.grey);\n  doc.text(`Score global : ${overall}% \u2014 \u00e9tabli sur ${r.questionCount} choix de pr\u00e9f\u00e9rence \u00b7 ${today}`, M, y);\n  y += 12;\n\n  \/\/ cartes de score\n  const cardW = (PW - 2*M - 2*6) \/ 3;\n  dims.forEach((d,i)=>{\n    const x = M + i*(cardW+6);\n    const c = dimColorPdf(d);\n    pdfSetDraw(doc, PDF_COLORS.line); doc.setLineWidth(0.2);\n    doc.rect(x, y, cardW, 28, 'S');\n    doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(7.5); pdfSetText(doc, c);\n    doc.text(DIM_LABELS[d].toUpperCase(), x+5, y+8);\n    doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(19); pdfSetText(doc, PDF_COLORS.ink);\n    doc.text(`${r.scores[d].pct}%`, x+5, y+19);\n    doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(7.5); pdfSetText(doc, PDF_COLORS.grey);\n    doc.text(levelLabel(r.scores[d].pct), x+5, y+25);\n  });\n  y += 38;\n\n  \/\/ carte profil\n  const [leadKey] = r.archSorted[0];\n  const [secondKey, secondScore] = r.archSorted[1];\n  const lead = ARCHETYPES[leadKey], second = ARCHETYPES[secondKey];\n  const close = (r.archSorted[0][1] - secondScore) <= 15;\n  const profBoxH = close ? 68 : 60;\n  pdfSetDraw(doc, PDF_COLORS.ink); doc.setLineWidth(0.4);\n  doc.rect(M, y, PW-2*M, profBoxH, 'S');\n  let py = y+9;\n  doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(8); pdfSetText(doc, PDF_COLORS.accent);\n  doc.text(\"PROFIL DOMINANT\", M+8, py); py += 8;\n  doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(16); pdfSetText(doc, PDF_COLORS.ink);\n  doc.text(lead.name, M+8, py); py += 6.5;\n  doc.setFont(\"helvetica\",\"italic\"); doc.setFontSize(10.5); pdfSetText(doc, PDF_COLORS.accent);\n  doc.text(lead.tagline, M+8, py); py += 8;\n  doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(9); pdfSetText(doc, PDF_COLORS.ink);\n  py = pdfWrapText(doc, lead.desc, M+8, py, PW-2*M-16, 4.4) + 4;\n\n  const colW = (PW-2*M-16)\/2;\n  doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(7); pdfSetText(doc, PDF_COLORS.grey);\n  doc.text(\"FORCE NATURELLE\", M+8, py);\n  doc.text(\"POINT DE VIGILANCE\", M+16+colW, py);\n  py += 5;\n  doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(8); pdfSetText(doc, PDF_COLORS.ink);\n  pdfWrapText(doc, lead.force, M+8, py, colW-4, 4);\n  pdfWrapText(doc, lead.vigilance, M+16+colW, py, colW-4, 4);\n\n  if(close){\n    doc.setFont(\"helvetica\",\"italic\"); doc.setFontSize(8); pdfSetText(doc, PDF_COLORS.grey);\n    doc.text(`Profil proche de ${second.name} \u2014 une combinaison qui nuance votre pratique au quotidien.`,\n              M+8, y+profBoxH-6);\n  }\n  y += profBoxH + 10;\n\n  \/\/ mini-radar des 4 profils + visuel du pack (c\u00f4te \u00e0 c\u00f4te, 50\/50)\n  \/\/ Ce bloc peut occuper jusqu'\u00e0 ~108mm (visuel du pack en hauteur max) : il\n  \/\/ faut donc au moins cet espace AVANT le pied de page (qui commence \u00e0 PH-24),\n  \/\/ pas juste une marge arbitraire \u2014 d'o\u00f9 le calcul explicite ci-dessous.\n  if(y > (PH - 24) - 110){ doc.addPage(); y = M; }\n  const packUrl = ARCHETYPE_SHARE_URLS[leadKey];\n  const packImgData = await loadImageAsDataUrl(packUrl);\n  const radColGap = 10;\n  const radColW = (PW - 2*M - radColGap) \/ 2;\n  const blockH = 100; \/\/ hauteur allou\u00e9e \u00e0 la ligne radar\/visuel\n\n  \/\/ On tente la mise en page \u00e0 deux colonnes (radar + visuel) uniquement si\n  \/\/ l'image a \u00e9t\u00e9 r\u00e9cup\u00e9r\u00e9e ET peut \u00eatre ins\u00e9r\u00e9e sans erreur. La moindre\n  \/\/ anomalie (format inattendu, image corrompue, etc.) fait basculer sur le\n  \/\/ radar plein format plut\u00f4t que de faire \u00e9chouer TOUTE la g\u00e9n\u00e9ration du\n  \/\/ PDF \u2014 un \u00e9chec sur l'image ne doit jamais emp\u00eacher le reste du document.\n  let imageInserted = false;\n  if(packImgData){\n    try{\n      doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(7.5); pdfSetText(doc, PDF_COLORS.grey);\n      doc.text(\"R\u00c9PARTITION SUR LES 4 PROFILS\", M+radColW\/2, y, {align:'center'});\n      pdfDrawRadar(doc, r.archScores, M+radColW\/2, y+52, 20);\n\n      \/\/ colonne droite : visuel du pack, contenu (jamais recadr\u00e9) + zone cliquable\n      const rightX = M + radColW + radColGap;\n      doc.text(\"VOTRE PROFIL EN IMAGE\", rightX+radColW\/2, y, {align:'center'});\n      const naturalSize = await getImageNaturalSize(packImgData);\n      let drawW = radColW, drawH = drawW * (naturalSize.h\/naturalSize.w);\n      if(drawH > blockH){ drawH = blockH; drawW = drawH * (naturalSize.w\/naturalSize.h); }\n      const imgX = rightX + (radColW - drawW)\/2;\n      const imgY = y + 8 + (blockH - drawH)\/2;\n      doc.addImage(packImgData, 'PNG', imgX, imgY, drawW, drawH);\n      doc.link(imgX, imgY, drawW, drawH, {url: packUrl}); \/\/ clic -> ouverture du visuel dans le navigateur\n\n      y += blockH + 20;\n      imageInserted = true;\n    } catch(e){\n      console.error(\"PDF : \u00e9chec de l'insertion du visuel du profil, repli sur le radar seul.\", e);\n    }\n  }\n\n  if(!imageInserted){\n    \/\/ repli si l'image n'a pas pu \u00eatre charg\u00e9e\/ins\u00e9r\u00e9e (CORS, r\u00e9seau, format) :\n    \/\/ radar plein format, comme avant \u2014 la g\u00e9n\u00e9ration du PDF continue normalement.\n    doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(7.5); pdfSetText(doc, PDF_COLORS.grey);\n    doc.text(\"R\u00c9PARTITION SUR LES 4 PROFILS\", PW\/2, y, {align:'center'});\n    y += 8;\n    pdfDrawRadar(doc, r.archScores, PW\/2, y+55, 26);\n    y += 112;\n  }\n\n  \/\/ ---- Perception vs mesure ----\n  const rated = dims.filter(d=>r.selfRatings[d]>0);\n  if(rated.length>0){\n    if(y > (PH - 24) - 48){ doc.addPage(); y = M; }\n    y = pdfSectionHead(doc, \"01\", \"Perception vs mesure\", y, M, PW);\n    rated.forEach(d=>{\n      const c = dimColorPdf(d);\n      const selfPct = r.selfRatings[d]*20;\n      const measPct = r.scores[d].pct;\n      const delta = measPct - selfPct;\n      let verdict;\n      if(Math.abs(delta)<=15) verdict = \"Auto-\u00e9valuation align\u00e9e avec la pratique mesur\u00e9e.\";\n      else if(delta>15) verdict = \"Sous-estimation \u2014 la pratique mesur\u00e9e est plus solide que l'auto-\u00e9valuation.\";\n      else verdict = \"On observe une surestimation : la pratique mesur\u00e9e est en retrait par rapport \u00e0 votre perception.\";\n\n      if(y > PH - 55){ doc.addPage(); y = M; }\n      doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(8); pdfSetText(doc, c);\n      doc.text(DIM_LABELS[d].toUpperCase(), M, y); y += 6;\n\n      doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(8); pdfSetText(doc, PDF_COLORS.grey);\n      doc.text(\"Votre estimation\", M+2, y+3);\n      pdfBar(doc, M+35, y, 90, 4, selfPct, [201,198,184]);\n      doc.text(`${selfPct}%`, M+130, y+3);\n      y += 8;\n      doc.text(\"Mesure de l'assessment\", M+2, y+3);\n      pdfBar(doc, M+35, y, 90, 4, measPct, c);\n      doc.text(`${measPct}%`, M+130, y+3);\n      y += 7;\n      doc.setFont(\"helvetica\",\"italic\"); doc.setFontSize(8); pdfSetText(doc, PDF_COLORS.grey);\n      doc.text(verdict, M+2, y); y += 9;\n    });\n    y += 4;\n  }\n\n  \/\/ ---- Lecture de situation ----\n  \/\/ En-t\u00eate + deux paragraphes \u2248 56mm de contenu.\n  if(y > (PH - 24) - 60){ doc.addPage(); y = M; }\n  const sorted = [...dims].sort((a,b)=>r.scores[b].pct-r.scores[a].pct);\n  const strong = sorted[0], weak = sorted[2];\n  y = pdfSectionHead(doc, \"02\", \"Lecture de situation\", y, M, PW);\n  doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(9); pdfSetText(doc, PDF_COLORS.ink);\n  const lecture1 = `Votre profil traduit une pratique install\u00e9e, avec des marges de progression identifiables et actionnables. Votre point le plus solide se situe sur la dimension ${DIM_LABELS[strong]} (${r.scores[strong].pct}%), tandis que la dimension ${DIM_LABELS[weak]} (${r.scores[weak].pct}%) constitue votre principal axe de progression.`;\n  y = pdfWrapText(doc, lecture1, M, y, PW-2*M, 4.6) + 5;\n  const lecture2 = \"Cette lecture ne mesure pas une performance certifi\u00e9e : elle refl\u00e8te vos pr\u00e9f\u00e9rences et priorit\u00e9s r\u00e9elles, et oriente une trajectoire de formation coh\u00e9rente avec votre pratique du terrain.\";\n  y = pdfWrapText(doc, lecture2, M, y, PW-2*M, 4.6) + 10;\n\n  \/\/ ---- Points de vigilance ----\n  const gapSorted = Object.entries(r.weakCats).sort((a,b)=>b[1]-a[1]).slice(0,6);\n  if(y > (PH - 24) - 25){ doc.addPage(); y = M; }\n  y = pdfSectionHead(doc, \"03\", \"Points de vigilance identifi\u00e9s\", y, M, PW);\n  if(gapSorted.length===0){\n    doc.setFont(\"helvetica\",\"italic\"); doc.setFontSize(9); pdfSetText(doc, PDF_COLORS.grey);\n    doc.text(\"Aucun point de vigilance marqu\u00e9 \u2014 profil homog\u00e8ne sur l'ensemble des th\u00e8mes test\u00e9s.\", M, y);\n    y += 10;\n  } else {\n    gapSorted.forEach(([cat])=>{\n      if(y > PH - 40){ doc.addPage(); y = M; }\n      const dim = r.catDim[cat];\n      const c = dimColorPdf(dim);\n      pdfSetFill(doc, c);\n      doc.rect(M, y-4, 26, 6, 'F');\n      doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(6.3); doc.setTextColor(255,255,255);\n      doc.text(DIM_LABELS[dim].toUpperCase(), M+13, y, {align:'center'});\n      doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(8.7); pdfSetText(doc, PDF_COLORS.ink);\n      doc.text(`${cat} \u2014 pratique encore \u00e0 consolider.`, M+30, y);\n      pdfSetDraw(doc, PDF_COLORS.line); doc.setLineWidth(0.15);\n      doc.line(M, y+4, PW-M, y+4);\n      y += 11;\n    });\n  }\n  y += 6;\n\n  \/\/ ---- Programme recommand\u00e9 ----\n  const finalModules = computeRecommendedModules(r.weakCats, r.scores);\n\n  if(y > (PH - 24) - 25){ doc.addPage(); y = M; }\n  y = pdfSectionHead(doc, \"04\", \"Votre programme de formation recommand\u00e9\", y, M, PW);\n  doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(7); pdfSetText(doc, PDF_COLORS.grey);\n  doc.text(\"MODULE\", M, y);\n  doc.text(\"ACC\u00c8S\", M+82, y);\n  doc.text(\"RECOMMAND\u00c9 AU REGARD DE\", M+102, y);\n  pdfSetDraw(doc, PDF_COLORS.ink); doc.setLineWidth(0.3);\n  doc.line(M, y+2, PW-M, y+2);\n  y += 8;\n\n  finalModules.forEach((m,i)=>{\n    if(y > (PH - 24) - 30){ doc.addPage(); y = M; }\n    doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(8.5); pdfSetText(doc, PDF_COLORS.ink);\n    const titleLines = doc.splitTextToSize(`${String(i+1).padStart(2,'0')}. ${m.title}`, 78);\n    doc.text(titleLines, M, y);\n    doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(8); pdfSetText(doc, PDF_COLORS.grey);\n    doc.text(m.price==='Gratuit' ? 'Gratuit' : 'Payant', M+82, y);\n    doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(8.5); pdfSetText(doc, PDF_COLORS.ink);\n    const why = (m.matched && m.matched.length>0) ? m.matched.join(', ') : 'votre profil global';\n    const whyLines = doc.splitTextToSize(why, 66);\n    doc.text(whyLines, M+102, y);\n    const titleBlockH = titleLines.length * 4.4;\n    let linkY = y + titleBlockH + 2;\n    if(m.url && m.url!=='#' && typeof doc.textWithLink === 'function'){\n      doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(8); pdfSetText(doc, PDF_COLORS.accent);\n      doc.textWithLink(\"Voir le module \u00bb\", M, linkY, {url:m.url});\n    }\n    const rowH = Math.max(titleBlockH + 6, whyLines.length * 4.4) + 4;\n    pdfSetDraw(doc, PDF_COLORS.line); doc.setLineWidth(0.15);\n    doc.line(M, y+rowH-2, PW-M, y+rowH-2);\n    y += rowH + 3;\n  });\n  y += 4;\n  \/\/ Garde manquante avant : ce paragraphe n'\u00e9tait prot\u00e9g\u00e9 par aucun seuil,\n  \/\/ il pouvait d\u00e9border sur le pied de page si le dernier module tombait\n  \/\/ pile en bas de page.\n  if(y > (PH - 24) - 12){ doc.addPage(); y = M; }\n  doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(7.5); pdfSetText(doc, PDF_COLORS.grey);\n  y = pdfWrapText(doc, \"Le catalogue Academy Online s'enrichit chaque mois. Cette s\u00e9lection refl\u00e8te l'offre disponible \u00e0 ce jour et sera actualis\u00e9e \u00e0 votre prochaine session.\", M, y, PW-2*M, 3.6);\n\n  \/\/ ===== PAGE DE CL\u00d4TURE (fond noir OswegO \u2014 marketing\/communication) =====\n  \/\/ Simplifi\u00e9e \u00e0 l'essentiel : logo r\u00e9el + tagline, rien d'autre.\n  doc.addPage();\n  pdfSetFill(doc, PDF_DARK.bg); doc.rect(0,0,PW,PH,'F');\n  const closeLogoW = 62;\n  const closeLogoH = closeLogoW \/ logoRatio;\n  drawLogo(PW\/2, 143 - closeLogoH\/2, closeLogoW, PDF_DARK, 'center');\n  doc.setFont(\"helvetica\",\"normal\"); doc.setFontSize(11); pdfSetText(doc, PDF_DARK.grey);\n  doc.text(\"Craft Operations for Brighter Futures\", PW\/2, 143 + closeLogoH\/2 + 12, {align:'center'});\n\n  \/\/ ===== PIED DE PAGE + NUM\u00c9ROTATION (toutes les pages) =====\n  await pdfAddFootersAndPageNumbers(doc, PW, PH, M);\n\n  doc.save(`OswegO-Synthese-Assessment-${person.nom.replace(\/\\s+\/g,'')}.pdf`);\n\n  \/\/ en plus du PDF, on t\u00e9l\u00e9charge aussi le visuel du profil (pack)\n  downloadImageFile(ARCHETYPE_SHARE_URLS[leadKey]);\n\n  \/\/ confirmation visuelle puis redirection vers l'offre Academy CX\n  const gate = document.getElementById('pdf-gate');\n  let successMsg = document.getElementById('pdf-success-msg');\n  if(!successMsg){\n    successMsg = document.createElement('div');\n    successMsg.id = 'pdf-success-msg';\n    successMsg.className = 'pdf-success';\n    gate.appendChild(successMsg);\n  }\n  successMsg.textContent = \"Votre PDF a \u00e9t\u00e9 g\u00e9n\u00e9r\u00e9 et t\u00e9l\u00e9charg\u00e9. Redirection vers votre programme de formation...\";\n  setTimeout(()=>{\n    window.location.href = \"https:\/\/oswego.eu\/academy-cx\/\";\n  }, 1500);\n}\n\nfunction pdfSectionHead(doc, num, title, y, M, PW){\n  doc.setFont(\"courier\",\"normal\"); doc.setFontSize(8); pdfSetText(doc, PDF_COLORS.grey);\n  doc.text(num, M, y);\n  doc.setFont(\"helvetica\",\"bold\"); doc.setFontSize(13); pdfSetText(doc, PDF_COLORS.ink);\n  doc.text(title, M+10, y);\n  y += 3;\n  pdfSetDraw(doc, PDF_COLORS.line); doc.setLineWidth(0.2);\n  doc.line(M, y, PW-M, y);\n  return y + 9;\n}\n\n\/* =========================================================================\n   COMMANDE SECR\u00c8TE (d\u00e9mo interne) \u2014 taper \"demo\" n'importe o\u00f9 sur la page\n   (hors champ de saisie) lance un passage complet avec r\u00e9ponses al\u00e9atoires,\n   de l'auto-\u00e9valuation jusqu'\u00e0 la 27\u1d49 question, et affiche directement les\n   r\u00e9sultats. Aucune trace dans l'interface \u2014 pratique pour les d\u00e9monstrations\n   sans avoir \u00e0 r\u00e9pondre manuellement \u00e0 chaque fois.\n   ========================================================================= *\/\n(function(){\n  const secret = 'demo';\n  let buffer = '';\n  document.addEventListener('keydown', (e)=>{\n    const tag = document.activeElement && document.activeElement.tagName;\n    if(tag === 'INPUT' || tag === 'TEXTAREA') return; \/\/ ne pas g\u00eaner la saisie du formulaire\n    if(e.key.length === 1){\n      buffer = (buffer + e.key.toLowerCase()).slice(-secret.length);\n      if(buffer === secret){\n        buffer = '';\n        runRandomDemo();\n      }\n    }\n  });\n})();\n\nfunction runRandomDemo(){\n  [\"savoir\",\"savoir-faire\",\"savoir-etre\"].forEach(d=>{\n    selfRatings[d] = 1 + Math.floor(Math.random()*5);\n  });\n  renderStarWidgets();\n  startAssessment();\n  for(let i=0;i<activeQuestions.length;i++){\n    current = i;\n    selectOption(Math.random()<0.5 ? 0 : 1);\n  }\n  showResults();\n}\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>OswegO \u2014 Centre d&rsquo;Assessment Op\u00e9rations Client OswegO Craft Operations for Brighter Futures Centre d&rsquo;Assessment Op\u00e9rations Client \u2014 Diagnostic individuel O\u00f9 en \u00eates-vous, r\u00e9ellement,dans votre pratique ? Vingt-sept choix entre deux propositions, chacune tir\u00e9e d&rsquo;un th\u00e8me diff\u00e9rent des op\u00e9rations client \u2014 en interne, chez un donneur d&rsquo;ordre ou via un partenaire externalis\u00e9. Il n&rsquo;y a pas [&hellip;]<\/p>\n","protected":false},"author":258930097,"featured_media":3334,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"vault","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_forum_subforum_count":0,"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_wpcom_ai_launchpad_about_page":false,"_wpcom_ai_launchpad_gallery_page":false,"_wpcom_ai_launchpad_contact_page":false,"_wpcom_ai_launchpad_events_page":false,"_wpcom_ai_launchpad_video_page":false,"_wpcom_ai_launchpad_portfolio_piece":false,"footnotes":"","_members_access_role":[],"_members_access_error":""},"class_list":["post-3883","page","type-page","status-publish","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"OswegO \u2014 Centre d&#039;Assessment Op\u00e9rations Client OswegO Craft Operations for Brighter Futures Centre d&#039;Assessment Op\u00e9rations Client \u2014 Diagnostic individuel O\u00f9 en \u00eates-vous, r\u00e9ellement,dans votre pratique ? Vingt-sept choix entre deux propositions, chacune tir\u00e9e d&#039;un th\u00e8me diff\u00e9rent des op\u00e9rations client \u2014 en interne, chez un donneur d&#039;ordre ou via un partenaire externalis\u00e9. Il n&#039;y a pas\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/oswego.eu\/ar\/assessment\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ar_AR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"OswegO - Craft Operations for Brighter Futures\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Assessment - OswegO\" \/>\n\t\t<meta property=\"og:description\" content=\"OswegO \u2014 Centre d&#039;Assessment Op\u00e9rations Client OswegO Craft Operations for Brighter Futures Centre d&#039;Assessment Op\u00e9rations Client \u2014 Diagnostic individuel O\u00f9 en \u00eates-vous, r\u00e9ellement,dans votre pratique ? Vingt-sept choix entre deux propositions, chacune tir\u00e9e d&#039;un th\u00e8me diff\u00e9rent des op\u00e9rations client \u2014 en interne, chez un donneur d&#039;ordre ou via un partenaire externalis\u00e9. Il n&#039;y a pas\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/oswego.eu\/ar\/assessment\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/oswego.eu\/wp-content\/uploads\/2024\/11\/oo_favicon_web.png\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/oswego.eu\/wp-content\/uploads\/2024\/11\/oo_favicon_web.png\" \/>\n\t\t<meta property=\"og:image:width\" content=\"48\" \/>\n\t\t<meta property=\"og:image:height\" content=\"48\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-07-19T16:06:16+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-09-22T13:04:15+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Assessment - OswegO\" \/>\n\t\t<meta name=\"twitter:description\" content=\"OswegO \u2014 Centre d&#039;Assessment Op\u00e9rations Client OswegO Craft Operations for Brighter Futures Centre d&#039;Assessment Op\u00e9rations Client \u2014 Diagnostic individuel O\u00f9 en \u00eates-vous, r\u00e9ellement,dans votre pratique ? Vingt-sept choix entre deux propositions, chacune tir\u00e9e d&#039;un th\u00e8me diff\u00e9rent des op\u00e9rations client \u2014 en interne, chez un donneur d&#039;ordre ou via un partenaire externalis\u00e9. Il n&#039;y a pas\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/oswego.eu\/wp-content\/uploads\/2024\/11\/oo_favicon_web.png\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/assessment\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/assessment\\\/#listItem\",\"name\":\"Assessment\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/assessment\\\/#listItem\",\"position\":2,\"name\":\"Assessment\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/#listItem\",\"name\":\"Home\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/#organization\",\"name\":\"OswegOOswegO\",\"description\":\"Craft Operations for Brighter Futures Crafting Operations for Brighter Futures\",\"url\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/\",\"telephone\":\"+33189311478\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/oswego.eu\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/oswego_logo_white.png?fit=4800%2C1200&ssl=1\",\"@id\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/assessment\\\/#organizationLogo\",\"width\":4800,\"height\":1200,\"caption\":\"logo de OswegO sp\\u00e9cialiste des op\\u00e9rations client\"},\"image\":{\"@id\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/assessment\\\/#organizationLogo\"},\"sameAs\":[\"https:\\\/\\\/fr.linkedin.com\\\/company\\\/oswego-eu\"]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/assessment\\\/#webpage\",\"url\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/assessment\\\/\",\"name\":\"Assessment - OswegO\",\"description\":\"OswegO \\u2014 Centre d'Assessment Op\\u00e9rations Client OswegO Craft Operations for Brighter Futures Centre d'Assessment Op\\u00e9rations Client \\u2014 Diagnostic individuel O\\u00f9 en \\u00eates-vous, r\\u00e9ellement,dans votre pratique ? Vingt-sept choix entre deux propositions, chacune tir\\u00e9e d'un th\\u00e8me diff\\u00e9rent des op\\u00e9rations client \\u2014 en interne, chez un donneur d'ordre ou via un partenaire externalis\\u00e9. Il n'y a pas\",\"inLanguage\":\"ar\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/assessment\\\/#breadcrumblist\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/oswego.eu\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/brooke-cagle-uWVWQ8gF8PE-unsplash.jpg?fit=1920%2C1280&ssl=1\",\"@id\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/assessment\\\/#mainImage\",\"width\":1920,\"height\":1280},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/assessment\\\/#mainImage\"},\"datePublished\":\"2026-07-19T18:06:16+02:00\",\"dateModified\":\"2026-09-22T15:04:15+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/#website\",\"url\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/\",\"name\":\"OswegO\",\"description\":\"Craft Operations for Brighter Futures\",\"inLanguage\":\"ar\",\"publisher\":{\"@id\":\"https:\\\/\\\/oswego.eu\\\/ar\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Assessment - OswegO","description":"OswegO \u2014 Centre d'Assessment Op\u00e9rations Client OswegO Craft Operations for Brighter Futures Centre d'Assessment Op\u00e9rations Client \u2014 Diagnostic individuel O\u00f9 en \u00eates-vous, r\u00e9ellement,dans votre pratique ? Vingt-sept choix entre deux propositions, chacune tir\u00e9e d'un th\u00e8me diff\u00e9rent des op\u00e9rations client \u2014 en interne, chez un donneur d'ordre ou via un partenaire externalis\u00e9. Il n'y a pas","canonical_url":"https:\/\/oswego.eu\/ar\/assessment\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/oswego.eu\/ar\/assessment\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/oswego.eu\/ar\/#listItem","position":1,"name":"Home","item":"https:\/\/oswego.eu\/ar\/","nextItem":{"@type":"ListItem","@id":"https:\/\/oswego.eu\/ar\/assessment\/#listItem","name":"Assessment"}},{"@type":"ListItem","@id":"https:\/\/oswego.eu\/ar\/assessment\/#listItem","position":2,"name":"Assessment","previousItem":{"@type":"ListItem","@id":"https:\/\/oswego.eu\/ar\/#listItem","name":"Home"}}]},{"@type":"Organization","@id":"https:\/\/oswego.eu\/ar\/#organization","name":"OswegOOswegO","description":"Craft Operations for Brighter Futures Crafting Operations for Brighter Futures","url":"https:\/\/oswego.eu\/ar\/","telephone":"+33189311478","logo":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/oswego.eu\/wp-content\/uploads\/2025\/01\/oswego_logo_white.png?fit=4800%2C1200&ssl=1","@id":"https:\/\/oswego.eu\/ar\/assessment\/#organizationLogo","width":4800,"height":1200,"caption":"logo de OswegO sp\u00e9cialiste des op\u00e9rations client"},"image":{"@id":"https:\/\/oswego.eu\/ar\/assessment\/#organizationLogo"},"sameAs":["https:\/\/fr.linkedin.com\/company\/oswego-eu"]},{"@type":"WebPage","@id":"https:\/\/oswego.eu\/ar\/assessment\/#webpage","url":"https:\/\/oswego.eu\/ar\/assessment\/","name":"Assessment - OswegO","description":"OswegO \u2014 Centre d'Assessment Op\u00e9rations Client OswegO Craft Operations for Brighter Futures Centre d'Assessment Op\u00e9rations Client \u2014 Diagnostic individuel O\u00f9 en \u00eates-vous, r\u00e9ellement,dans votre pratique ? Vingt-sept choix entre deux propositions, chacune tir\u00e9e d'un th\u00e8me diff\u00e9rent des op\u00e9rations client \u2014 en interne, chez un donneur d'ordre ou via un partenaire externalis\u00e9. Il n'y a pas","inLanguage":"ar","isPartOf":{"@id":"https:\/\/oswego.eu\/ar\/#website"},"breadcrumb":{"@id":"https:\/\/oswego.eu\/ar\/assessment\/#breadcrumblist"},"image":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/oswego.eu\/wp-content\/uploads\/2026\/05\/brooke-cagle-uWVWQ8gF8PE-unsplash.jpg?fit=1920%2C1280&ssl=1","@id":"https:\/\/oswego.eu\/ar\/assessment\/#mainImage","width":1920,"height":1280},"primaryImageOfPage":{"@id":"https:\/\/oswego.eu\/ar\/assessment\/#mainImage"},"datePublished":"2026-07-19T18:06:16+02:00","dateModified":"2026-09-22T15:04:15+02:00"},{"@type":"WebSite","@id":"https:\/\/oswego.eu\/ar\/#website","url":"https:\/\/oswego.eu\/ar\/","name":"OswegO","description":"Craft Operations for Brighter Futures","inLanguage":"ar","publisher":{"@id":"https:\/\/oswego.eu\/ar\/#organization"}}]},"og:locale":"ar_AR","og:site_name":"OswegO - Craft Operations for Brighter Futures","og:type":"article","og:title":"Assessment - OswegO","og:description":"OswegO \u2014 Centre d'Assessment Op\u00e9rations Client OswegO Craft Operations for Brighter Futures Centre d'Assessment Op\u00e9rations Client \u2014 Diagnostic individuel O\u00f9 en \u00eates-vous, r\u00e9ellement,dans votre pratique ? Vingt-sept choix entre deux propositions, chacune tir\u00e9e d'un th\u00e8me diff\u00e9rent des op\u00e9rations client \u2014 en interne, chez un donneur d'ordre ou via un partenaire externalis\u00e9. Il n'y a pas","og:url":"https:\/\/oswego.eu\/ar\/assessment\/","og:image":"https:\/\/oswego.eu\/wp-content\/uploads\/2024\/11\/oo_favicon_web.png","og:image:secure_url":"https:\/\/oswego.eu\/wp-content\/uploads\/2024\/11\/oo_favicon_web.png","og:image:width":48,"og:image:height":48,"article:published_time":"2026-07-19T16:06:16+00:00","article:modified_time":"2026-09-22T13:04:15+00:00","twitter:card":"summary_large_image","twitter:title":"Assessment - OswegO","twitter:description":"OswegO \u2014 Centre d'Assessment Op\u00e9rations Client OswegO Craft Operations for Brighter Futures Centre d'Assessment Op\u00e9rations Client \u2014 Diagnostic individuel O\u00f9 en \u00eates-vous, r\u00e9ellement,dans votre pratique ? Vingt-sept choix entre deux propositions, chacune tir\u00e9e d'un th\u00e8me diff\u00e9rent des op\u00e9rations client \u2014 en interne, chez un donneur d'ordre ou via un partenaire externalis\u00e9. Il n'y a pas","twitter:image":"https:\/\/oswego.eu\/wp-content\/uploads\/2024\/11\/oo_favicon_web.png"},"aioseo_meta_data":{"post_id":"3883","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"WebPage","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-07-19 16:06:18","updated":"2026-09-22 14:08:42","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/oswego.eu\/ar\/\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tAssessment\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/oswego.eu\/ar\/"},{"label":"Assessment","link":"https:\/\/oswego.eu\/ar\/assessment\/"}],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Assessment - OswegO<\/title>\n<meta name=\"description\" content=\"D\u00e9couvrir Assessment avec OswegO, un cabinet de conseil sp\u00e9cialis\u00e9 dans l&#039;exp\u00e9rience client et le succ\u00e8s des op\u00e9rations.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/oswego.eu\/ar\/assessment\/\" \/>\n<meta property=\"og:locale\" content=\"ar_AR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Assessment - OswegO\" \/>\n<meta property=\"og:description\" content=\"D\u00e9couvrir Assessment avec OswegO, un cabinet de conseil sp\u00e9cialis\u00e9 dans l&#039;exp\u00e9rience client et le succ\u00e8s des op\u00e9rations.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/oswego.eu\/ar\/assessment\/\" \/>\n<meta property=\"og:site_name\" content=\"OswegO\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-22T13:04:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/oswego.eu\/wp-content\/uploads\/2026\/05\/brooke-cagle-uWVWQ8gF8PE-unsplash.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1280\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u0648\u0642\u062a \u0627\u0644\u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0645\u064f\u0642\u062f\u0651\u0631\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u062f\u0642\u064a\u0642\u062a\u0627\u0646\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":[\"WebPage\",\"FAQPage\"],\"@id\":\"https:\\\/\\\/oswego.eu\\\/assessment\\\/\",\"url\":\"https:\\\/\\\/oswego.eu\\\/assessment\\\/\",\"name\":\"Assessment - OswegO\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/oswego.eu\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/oswego.eu\\\/assessment\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/oswego.eu\\\/assessment\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/oswego.eu\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/brooke-cagle-uWVWQ8gF8PE-unsplash.jpg?fit=1920%2C1280&ssl=1\",\"datePublished\":\"2026-07-19T16:06:16+00:00\",\"dateModified\":\"2026-09-22T13:04:15+00:00\",\"description\":\"D\u00e9couvrir Assessment avec OswegO, un cabinet de conseil sp\u00e9cialis\u00e9 dans l'exp\u00e9rience client et le succ\u00e8s des op\u00e9rations.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/oswego.eu\\\/assessment\\\/#breadcrumb\"},\"inLanguage\":\"ar\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/oswego.eu\\\/assessment\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ar\",\"@id\":\"https:\\\/\\\/oswego.eu\\\/assessment\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/oswego.eu\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/brooke-cagle-uWVWQ8gF8PE-unsplash.jpg?fit=1920%2C1280&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/oswego.eu\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/brooke-cagle-uWVWQ8gF8PE-unsplash.jpg?fit=1920%2C1280&ssl=1\",\"width\":1920,\"height\":1280},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/oswego.eu\\\/assessment\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/oswego.eu\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Assessment\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/oswego.eu\\\/#website\",\"url\":\"https:\\\/\\\/oswego.eu\\\/\",\"name\":\"OswegO\",\"description\":\"Craft Operations for Brighter Futures\",\"publisher\":{\"@id\":\"https:\\\/\\\/oswego.eu\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/oswego.eu\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ar\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/oswego.eu\\\/#organization\",\"name\":\"OswegO\",\"url\":\"https:\\\/\\\/oswego.eu\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ar\",\"@id\":\"https:\\\/\\\/oswego.eu\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/oswego.eu\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/oswego_logo_white.png?fit=4800%2C1200&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/oswego.eu\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/oswego_logo_white.png?fit=4800%2C1200&ssl=1\",\"width\":4800,\"height\":1200,\"caption\":\"OswegO\"},\"image\":{\"@id\":\"https:\\\/\\\/oswego.eu\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/company\\\/oswego-eu\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Assessment - OswegO","description":"D\u00e9couvrir Assessment avec OswegO, un cabinet de conseil sp\u00e9cialis\u00e9 dans l'exp\u00e9rience client et le succ\u00e8s des op\u00e9rations.","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:\/\/oswego.eu\/ar\/assessment\/","og_locale":"ar_AR","og_type":"article","og_title":"Assessment - OswegO","og_description":"D\u00e9couvrir Assessment avec OswegO, un cabinet de conseil sp\u00e9cialis\u00e9 dans l'exp\u00e9rience client et le succ\u00e8s des op\u00e9rations.","og_url":"https:\/\/oswego.eu\/ar\/assessment\/","og_site_name":"OswegO","article_modified_time":"2026-09-22T13:04:15+00:00","og_image":[{"width":1920,"height":1280,"url":"https:\/\/oswego.eu\/wp-content\/uploads\/2026\/05\/brooke-cagle-uWVWQ8gF8PE-unsplash.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"\u0648\u0642\u062a \u0627\u0644\u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0645\u064f\u0642\u062f\u0651\u0631":"\u062f\u0642\u064a\u0642\u062a\u0627\u0646"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["WebPage","FAQPage"],"@id":"https:\/\/oswego.eu\/assessment\/","url":"https:\/\/oswego.eu\/assessment\/","name":"Assessment - OswegO","isPartOf":{"@id":"https:\/\/oswego.eu\/#website"},"primaryImageOfPage":{"@id":"https:\/\/oswego.eu\/assessment\/#primaryimage"},"image":{"@id":"https:\/\/oswego.eu\/assessment\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/oswego.eu\/wp-content\/uploads\/2026\/05\/brooke-cagle-uWVWQ8gF8PE-unsplash.jpg?fit=1920%2C1280&ssl=1","datePublished":"2026-07-19T16:06:16+00:00","dateModified":"2026-09-22T13:04:15+00:00","description":"D\u00e9couvrir Assessment avec OswegO, un cabinet de conseil sp\u00e9cialis\u00e9 dans l'exp\u00e9rience client et le succ\u00e8s des op\u00e9rations.","breadcrumb":{"@id":"https:\/\/oswego.eu\/assessment\/#breadcrumb"},"inLanguage":"ar","potentialAction":[{"@type":"ReadAction","target":["https:\/\/oswego.eu\/assessment\/"]}]},{"@type":"ImageObject","inLanguage":"ar","@id":"https:\/\/oswego.eu\/assessment\/#primaryimage","url":"https:\/\/i0.wp.com\/oswego.eu\/wp-content\/uploads\/2026\/05\/brooke-cagle-uWVWQ8gF8PE-unsplash.jpg?fit=1920%2C1280&ssl=1","contentUrl":"https:\/\/i0.wp.com\/oswego.eu\/wp-content\/uploads\/2026\/05\/brooke-cagle-uWVWQ8gF8PE-unsplash.jpg?fit=1920%2C1280&ssl=1","width":1920,"height":1280},{"@type":"BreadcrumbList","@id":"https:\/\/oswego.eu\/assessment\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/oswego.eu\/"},{"@type":"ListItem","position":2,"name":"Assessment"}]},{"@type":"WebSite","@id":"https:\/\/oswego.eu\/#website","url":"https:\/\/oswego.eu\/","name":"\u0623\u0648\u0632\u0648\u0627\u0644\u062f","description":"Craft Operations for Brighter Futures","publisher":{"@id":"https:\/\/oswego.eu\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/oswego.eu\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ar"},{"@type":"Organization","@id":"https:\/\/oswego.eu\/#organization","name":"\u0623\u0648\u0632\u0648\u0627\u0644\u062f","url":"https:\/\/oswego.eu\/","logo":{"@type":"ImageObject","inLanguage":"ar","@id":"https:\/\/oswego.eu\/#\/schema\/logo\/image\/","url":"https:\/\/i0.wp.com\/oswego.eu\/wp-content\/uploads\/2025\/01\/oswego_logo_white.png?fit=4800%2C1200&ssl=1","contentUrl":"https:\/\/i0.wp.com\/oswego.eu\/wp-content\/uploads\/2025\/01\/oswego_logo_white.png?fit=4800%2C1200&ssl=1","width":4800,"height":1200,"caption":"OswegO"},"image":{"@id":"https:\/\/oswego.eu\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/oswego-eu\/"]}]}},"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/PgbXGF-10D","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/oswego.eu\/ar\/wp-json\/wp\/v2\/pages\/3883","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oswego.eu\/ar\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/oswego.eu\/ar\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/oswego.eu\/ar\/wp-json\/wp\/v2\/users\/258930097"}],"replies":[{"embeddable":true,"href":"https:\/\/oswego.eu\/ar\/wp-json\/wp\/v2\/comments?post=3883"}],"version-history":[{"count":15,"href":"https:\/\/oswego.eu\/ar\/wp-json\/wp\/v2\/pages\/3883\/revisions"}],"predecessor-version":[{"id":4687,"href":"https:\/\/oswego.eu\/ar\/wp-json\/wp\/v2\/pages\/3883\/revisions\/4687"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oswego.eu\/ar\/wp-json\/wp\/v2\/media\/3334"}],"wp:attachment":[{"href":"https:\/\/oswego.eu\/ar\/wp-json\/wp\/v2\/media?parent=3883"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}