{"id":94085,"date":"2025-11-24T20:09:03","date_gmt":"2025-11-24T19:09:03","guid":{"rendered":"https:\/\/umoatitres.com\/courbes-des-taux\/"},"modified":"2026-07-21T14:18:28","modified_gmt":"2026-07-21T12:18:28","slug":"yield-curves","status":"publish","type":"page","link":"https:\/\/umoatitres.com\/en\/yield-curves\/","title":{"rendered":"Yield Curves"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"94085\" class=\"elementor elementor-94085 elementor-46042\" data-elementor-post-type=\"page\">\n\t\t\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-a33f1f1 e-flex e-con-boxed e-con e-parent\" data-id=\"a33f1f1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-0c1f0c9 e-flex e-con-boxed e-con e-child\" data-id=\"0c1f0c9\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-c9223cc e-con-full e-flex e-con e-child\" data-id=\"c9223cc\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-50290d7 elementor-widget elementor-widget-breadcrumbs\" data-id=\"50290d7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"breadcrumbs.default\">\n\t\t\t\t\t<p id=\"breadcrumbs\"><span><span><a href=\"https:\/\/umoatitres.com\/en\/\">Accueil<\/a><\/span><\/span><\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-c34fb43 e-flex e-con-boxed e-con e-parent\" data-id=\"c34fb43\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-62e864a e-flex e-con-boxed e-con e-child\" data-id=\"62e864a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0cb3d3f elementor-widget elementor-widget-shortcode\" data-id=\"0cb3d3f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n<style>\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   TOUT le CSS est pr\u00e9fix\u00e9 par #umoa-courbes-app pour isoler le composant\n   du reste du site (menu, header, banni\u00e8re Elementor, etc.)\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\n#umoa-courbes-app,\n#umoa-courbes-app *,\n#umoa-courbes-app *::before,\n#umoa-courbes-app *::after {\n    margin: 0;\n    padding: 0;\n    box-sizing: border-box;\n}\n\n#umoa-courbes-app {\n    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n    background: #f5f8fa;\n    color: #333;\n}\n\n\/* \u2500\u2500\u2500 LOADING \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n#umoa-courbes-app .app-loading {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    padding: 80px 20px;\n    gap: 16px;\n    background: white;\n}\n#umoa-courbes-app .spinner {\n    width: 50px;\n    height: 50px;\n    border: 5px solid rgba(33, 84, 113, 0.3);\n    border-top-color: #215471;\n    border-radius: 50%;\n    animation: umoa-spin 1s ease-in-out infinite;\n}\n@keyframes umoa-spin { to { transform: rotate(360deg); } }\n#umoa-courbes-app .loading-text { color: #215471; font-weight: 600; font-size: 1.1em; }\n#umoa-courbes-app .loading-sub { color: #666; font-size: 0.95em; }\n\n#umoa-courbes-app .container {\n    margin: 0 auto;\n    background: white;\n    max-width: 1400px;\n    padding: 20px;\n}\n\n\/* \u2500\u2500\u2500 SECTION 1 : COURBE DES TAUX \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n#umoa-courbes-app .main-layout {\n    display: flex;\n    gap: 28px;\n    align-items: flex-start;\n}\n\n#umoa-courbes-app .controls-column {\n    width: 380px;\n    flex-shrink: 0;\n    display: flex;\n    flex-direction: column;\n    gap: 20px;\n    align-self: stretch;\n}\n\n#umoa-courbes-app .chart-column {\n    flex: 1;\n    min-width: 0;\n}\n\n#umoa-courbes-app .control-group {\n    background: #EEF4F6;\n    padding: 25px;\n    border-radius: 12px;\n    display: flex;\n    flex-direction: column;\n    gap: 0;\n    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);\n    transition: transform 0.2s, box-shadow 0.2s;\n}\n#umoa-courbes-app .control-group:hover {\n    transform: translateY(-2px);\n    box-shadow: 0 4px 15px rgba(0, 0, 0, 0.08);\n}\n#umoa-courbes-app .control-group h3 {\n    color: #333;\n    margin-bottom: 16px;\n    font-size: 1.1em;\n    font-weight: 600;\n}\n#umoa-courbes-app .control-group small {\n    margin-top: 10px;\n    color: #666;\n    font-size: 0.85em;\n    line-height: 1.4;\n    display: block;\n}\n\n#umoa-courbes-app #datePicker {\n    width: 100%;\n    padding: 12px;\n    border: 2px solid #ddd;\n    border-radius: 10px;\n    font-size: 0.93em;\n    transition: 0.3s;\n    background: white;\n    color: #333;\n}\n#umoa-courbes-app #datePicker:focus {\n    outline: none;\n    border-color: #215471;\n    box-shadow: 0 0 0 3px rgba(33, 84, 113, 0.1);\n}\n\n#umoa-courbes-app .files-list {\n    background: white;\n    padding: 15px;\n    border-radius: 10px;\n    max-height: 320px;\n    overflow-y: auto;\n    border: 2px solid #e0e0e0;\n}\n\n#umoa-courbes-app .file-item {\n    display: flex;\n    align-items: center;\n    padding: 12px;\n    margin-bottom: 8px;\n    background: #f8f9fa;\n    border-radius: 8px;\n    cursor: pointer;\n    transition: all 0.2s;\n    border: 2px solid transparent;\n}\n#umoa-courbes-app .file-item:hover {\n    background: #e9ecef;\n    border-color: #215471;\n    transform: translateX(3px);\n}\n#umoa-courbes-app .file-item input[type=\"radio\"] {\n    margin-right: 12px;\n    cursor: pointer;\n    width: 18px;\n    height: 18px;\n    accent-color: #215471;\n    flex-shrink: 0;\n}\n#umoa-courbes-app .file-item label {\n    flex: 1;\n    cursor: pointer;\n    display: flex;\n    flex-direction: column;\n    gap: 4px;\n    margin: 0;\n}\n#umoa-courbes-app .file-name {\n    font-weight: 500;\n    color: #333;\n    font-size: 0.87em;\n}\n#umoa-courbes-app .file-date {\n    color: #579CBD;\n    font-weight: 600;\n    font-size: 0.87em;\n}\n#umoa-courbes-app .no-files {\n    text-align: center;\n    color: #999;\n    padding: 28px 16px;\n    font-size: 0.93em;\n    font-style: italic;\n}\n#umoa-courbes-app .files-list::-webkit-scrollbar { width: 6px; }\n#umoa-courbes-app .files-list::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 10px; }\n#umoa-courbes-app .files-list::-webkit-scrollbar-thumb { background: #215471; border-radius: 10px; }\n\n#umoa-courbes-app .controls-column .control-group:last-child { flex: 1; }\n#umoa-courbes-app .files-list-stretch {\n    max-height: 470px;\n    flex: 1;\n    height: 0;\n}\n\n\/* Chart section *\/\n#umoa-courbes-app .chart-section {\n    background: #EEF4F6;\n    padding: 30px;\n    border-radius: 12px;\n    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);\n}\n#umoa-courbes-app .chart-header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    margin-bottom: 16px;\n    flex-wrap: wrap;\n    gap: 15px;\n}\n#umoa-courbes-app .chart-title {\n    color: #333;\n    font-size: 1.4em;\n    font-weight: 600;\n}\n#umoa-courbes-app .download-btn {\n    background: #215471;\n    color: white;\n    padding: 12px 25px;\n    border: none;\n    border-radius: 10px;\n    cursor: pointer;\n    font-weight: 600;\n    font-size: 0.92em;\n    box-shadow: 0 4px 14px rgba(33, 84, 113, 0.35);\n    transition: all 0.3s;\n    white-space: nowrap;\n}\n#umoa-courbes-app .download-btn:hover {\n    transform: translateY(-2px);\n    box-shadow: 0 6px 20px rgba(33, 84, 113, 0.45);\n    background: #1a4359;\n}\n#umoa-courbes-app .download-btn:active { transform: translateY(0); }\n\n#umoa-courbes-app .country-tabs {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 8px;\n    padding: 14px 0;\n    border-top: 1.5px solid #c8dce6;\n    border-bottom: 1.5px solid #c8dce6;\n    margin-bottom: 16px;\n}\n#umoa-courbes-app .country-tab {\n    padding: 6px 14px;\n    border: 2px solid #b5d5e8;\n    border-radius: 20px;\n    background: white;\n    color: #215471;\n    font-size: 0.83em;\n    font-weight: 600;\n    cursor: pointer;\n    transition: all 0.2s;\n    user-select: none;\n    letter-spacing: 0.3px;\n}\n#umoa-courbes-app .country-tab:hover {\n    border-color: #215471;\n    background: #dcedf5;\n}\n#umoa-courbes-app .country-tab.active {\n    background: #215471;\n    color: white;\n    border-color: #215471;\n    box-shadow: 0 2px 8px rgba(33, 84, 113, 0.28);\n}\n\n#umoa-courbes-app .chart-summary {\n    display: flex;\n    align-items: center;\n    flex-wrap: wrap;\n    gap: 7px;\n    background: linear-gradient(135deg, #EEF4F6 0%, #dcedf5 100%);\n    border: 1.5px solid #b5d5e8;\n    border-radius: 10px;\n    padding: 10px 18px;\n    margin-bottom: 14px;\n    font-size: 0.95em;\n    color: #215471;\n    font-weight: 500;\n}\n#umoa-courbes-app .summary-date { font-weight: 700; color: #215471; }\n#umoa-courbes-app .summary-sep { color: #aaa; margin: 0 4px; }\n#umoa-courbes-app .summary-countries {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 5px;\n    align-items: center;\n}\n#umoa-courbes-app .country-tag {\n    background: #215471;\n    color: white;\n    border-radius: 20px;\n    padding: 2px 11px;\n    font-size: 0.86em;\n    font-weight: 600;\n    letter-spacing: 0.3px;\n}\n\n#umoa-courbes-app .chart-container {\n    position: relative;\n    height: 600px;\n    background: #f8fbfd;\n    border-radius: 10px;\n    padding: 20px;\n    box-shadow: inset 0 2px 10px rgba(33, 84, 113, 0.06);\n}\n#umoa-courbes-app .chart-info {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    height: 100%;\n    padding: 40px 20px;\n    color: #555;\n}\n#umoa-courbes-app .chart-info-icon {\n    font-size: 1.15em;\n    margin-bottom: 24px;\n    font-weight: 700;\n    color: #215471;\n}\n#umoa-courbes-app .chart-info-steps {\n    display: flex;\n    flex-direction: column;\n    gap: 14px;\n    width: 100%;\n    max-width: 340px;\n}\n#umoa-courbes-app .chart-info-step {\n    display: flex;\n    align-items: center;\n    gap: 14px;\n    background: #f0f6fa;\n    border-left: 4px solid #579CBD;\n    border-radius: 0 8px 8px 0;\n    padding: 11px 14px;\n    font-size: 0.95em;\n    color: #333;\n    font-weight: 500;\n}\n#umoa-courbes-app .chart-info-note {\n    margin-top: 20px;\n    font-size: 0.86em;\n    color: #888;\n    font-style: italic;\n    text-align: center;\n}\n\n\/* Flatpickr override (s\u00e9lecteur global n\u00e9cessaire \u2014 flatpickr injecte hors du conteneur) *\/\n.flatpickr-day.flatpickr-disabled,\n.flatpickr-day.flatpickr-disabled:hover {\n    background: #f5f5f5 !important;\n    color: #ccc !important;\n    cursor: not-allowed !important;\n    text-decoration: line-through;\n}\n\n\/* \u2500\u2500\u2500 SECTION 2 : HISTORIQUE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n#umoa-courbes-app .historique-header {\n    margin-bottom: 22px;\n    margin-top: 100px;\n}\n#umoa-courbes-app .historique-header h1 {\n    font-size: 2.2rem;\n    margin-bottom: 12px;\n    font-weight: 700;\n    color: #000;\n    letter-spacing: -0.3px;\n    line-height: 1.1;\n}\n#umoa-courbes-app .historique-header p {\n    font-size: 0.9rem;\n    color: #002;\n    margin-top: 4px;\n}\n\n#umoa-courbes-app .hist-controls {\n    display: flex;\n    gap: 12px;\n    margin-bottom: 16px;\n}\n\n#umoa-courbes-app .search-wrap {\n    flex: 1;\n    display: grid !important;\n    grid-template-columns: 1fr 14px !important;\n    align-items: center !important;\n    gap: 10px;\n    background: white;\n    border: 1.5px solid #c8dce6;\n    border-radius: 10px;\n    padding: 0 14px;\n    transition: border-color 0.2s, box-shadow 0.2s;\n}\n#umoa-courbes-app .search-wrap:focus-within {\n    border-color: #215471;\n    box-shadow: 0 0 0 3px rgba(33, 84, 113, 0.1);\n}\n#umoa-courbes-app .search-wrap input {\n    grid-column: 1 !important;\n    grid-row: 1 !important;\n    width: 100% !important;\n    min-width: 0 !important;\n    border: none !important;\n    outline: none !important;\n    box-shadow: none !important;\n    background: transparent !important;\n    padding: 10px 0 !important;\n    margin: 0 !important;\n    font-family: inherit;\n    font-size: 0.9rem;\n    color: #333;\n}\n#umoa-courbes-app .search-wrap input::placeholder { color: #9bb5c5; }\n#umoa-courbes-app .search-wrap svg {\n    grid-column: 2 !important;\n    grid-row: 1 !important;\n    position: static !important;\n    transform: none !important;\n    left: auto !important;\n    top: auto !important;\n    width: 14px !important;\n    height: 14px !important;\n    color: #8aacbf;\n    pointer-events: none;\n    justify-self: end;\n}\n\n#umoa-courbes-app .year-wrap { position: relative; }\n#umoa-courbes-app .year-wrap select {\n    appearance: none;\n    padding: 10px 36px 10px 14px;\n    border: 1.5px solid #c8dce6;\n    border-radius: 10px;\n    font-family: inherit;\n    font-size: 0.9rem;\n    background: white;\n    color: #333;\n    outline: none;\n    cursor: pointer;\n    min-width: 130px;\n    transition: border-color 0.2s, box-shadow 0.2s;\n}\n#umoa-courbes-app .year-wrap select:focus {\n    border-color: #215471;\n    box-shadow: 0 0 0 3px rgba(33, 84, 113, 0.1);\n}\n#umoa-courbes-app .year-wrap::after {\n    content: '';\n    position: absolute;\n    right: 12px;\n    top: 50%;\n    transform: translateY(-50%);\n    border-left: 5px solid transparent;\n    border-right: 5px solid transparent;\n    border-top: 6px solid #8aacbf;\n    pointer-events: none;\n}\n\n#umoa-courbes-app .stats-bar {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    margin-bottom: 18px;\n    font-size: 0.83rem;\n    color: #6b8fa6;\n}\n#umoa-courbes-app .stats-bar strong { color: #215471; }\n\n#umoa-courbes-app .hist-grid {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: 14px;\n}\n#umoa-courbes-app .hist-card {\n    background: white;\n    border: 1.5px solid #d6e8f0;\n    border-radius: 12px;\n    padding: 15px 17px;\n    display: flex;\n    align-items: center;\n    gap: 13px;\n    transition: border-color 0.2s, box-shadow 0.2s, transform 0.18s;\n    animation: umoa-fadeUp 0.4s ease both;\n    box-shadow: 0 2px 8px rgba(33, 84, 113, 0.05);\n}\n#umoa-courbes-app .hist-card:hover {\n    border-color: #579cbd;\n    box-shadow: 0 5px 18px rgba(33, 84, 113, 0.13);\n    transform: translateY(-2px);\n}\n#umoa-courbes-app .card-icon {\n    width: 48px;\n    height: 48px;\n    border-radius: 10px;\n    background: #215471;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    flex-shrink: 0;\n    overflow: hidden;\n}\n#umoa-courbes-app .card-body { flex: 1; min-width: 0; }\n#umoa-courbes-app .card-title {\n    font-size: 0.78rem;\n    font-weight: 700;\n    color: #215471;\n    text-transform: uppercase;\n    letter-spacing: 0.4px;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n#umoa-courbes-app .card-date {\n    font-size: 0.82rem;\n    color: #579cbd;\n    font-weight: 600;\n    margin-top: 2px;\n}\n#umoa-courbes-app .card-dl {\n    width: 34px;\n    height: 34px;\n    border-radius: 8px;\n    background: #215471;\n    border: none;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    cursor: pointer;\n    flex-shrink: 0;\n    transition: background 0.18s, transform 0.15s;\n}\n#umoa-courbes-app .card-dl:hover {\n    background: #1a4359;\n    transform: scale(1.08);\n}\n#umoa-courbes-app .card-dl:active { transform: scale(0.97); }\n#umoa-courbes-app .card-dl svg { color: white; }\n\n#umoa-courbes-app .load-more-wrap {\n    display: flex;\n    justify-content: center;\n    margin-top: 28px;\n}\n#umoa-courbes-app .btn-load {\n    padding: 11px 38px;\n    background: #215471;\n    color: white;\n    border: none;\n    border-radius: 10px;\n    font-family: inherit;\n    font-size: 0.91rem;\n    font-weight: 600;\n    cursor: pointer;\n    box-shadow: 0 4px 14px rgba(33, 84, 113, 0.26);\n    transition: background 0.18s, transform 0.15s, box-shadow 0.18s;\n}\n#umoa-courbes-app .btn-load:hover {\n    background: #1a4359;\n    transform: translateY(-1px);\n    box-shadow: 0 6px 18px rgba(33, 84, 113, 0.36);\n}\n#umoa-courbes-app .btn-load:disabled {\n    background: #8aacbf;\n    cursor: not-allowed;\n    transform: none;\n    box-shadow: none;\n}\n\n#umoa-courbes-app .hist-empty {\n    grid-column: 1\/-1;\n    text-align: center;\n    padding: 56px;\n    color: #8aacbf;\n}\n#umoa-courbes-app .hist-empty svg {\n    opacity: 0.32;\n    margin-bottom: 10px;\n    display: block;\n    margin-inline: auto;\n}\n#umoa-courbes-app .hist-empty p { font-size: 0.93rem; }\n\n\/* Toast \u2014 s\u00e9lecteur global car position:fixed en dehors du conteneur *\/\n.umoa-toast {\n    position: fixed;\n    bottom: 26px;\n    right: 26px;\n    background: #215471;\n    color: white;\n    padding: 12px 18px;\n    border-radius: 10px;\n    font-size: 0.88rem;\n    font-weight: 500;\n    box-shadow: 0 6px 20px rgba(33, 84, 113, 0.32);\n    z-index: 9999;\n    animation: umoa-slideIn 0.3s ease;\n    display: flex;\n    align-items: center;\n    gap: 9px;\n    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n.umoa-toast.success { background: #1a7a4a; }\n.umoa-toast.error { background: #b83232; }\n\n@keyframes umoa-slideIn {\n    from { opacity: 0; transform: translateY(14px); }\n    to   { opacity: 1; transform: translateY(0); }\n}\n@keyframes umoa-fadeUp {\n    from { opacity: 0; transform: translateY(14px); }\n    to   { opacity: 1; transform: translateY(0); }\n}\n@keyframes umoa-fadeDown {\n    from { opacity: 0; transform: translateY(-14px); }\n    to   { opacity: 1; transform: translateY(0); }\n}\n\n\/* \u2500\u2500\u2500 RESPONSIVE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n@media (max-width: 1200px) {\n    #umoa-courbes-app .main-layout {\n        flex-direction: column;\n        align-items: stretch;\n    }\n    #umoa-courbes-app .controls-column,\n    #umoa-courbes-app .chart-column {\n        width: 100%;\n    }\n}\n\n@media (max-width: 1100px) {\n    #umoa-courbes-app .main-layout {\n        flex-direction: column;\n        gap: 20px;\n    }\n    #umoa-courbes-app .controls-column { width: 100%; }\n    #umoa-courbes-app .chart-container { height: 500px; }\n    #umoa-courbes-app .hist-grid { grid-template-columns: repeat(2, 1fr); }\n}\n\n@media (max-width: 768px) {\n    #umoa-courbes-app .control-group { padding: 15px; }\n    #umoa-courbes-app .chart-section { padding: 15px; }\n    #umoa-courbes-app .chart-header {\n        flex-direction: column;\n        align-items: flex-start;\n        gap: 15px;\n    }\n    #umoa-courbes-app .chart-title { font-size: 1.2em; }\n    #umoa-courbes-app .download-btn { width: 100%; text-align: center; }\n    #umoa-courbes-app .chart-container { height: 400px; padding: 10px; }\n    #umoa-courbes-app .country-tabs { justify-content: center; }\n    #umoa-courbes-app .country-tab { padding: 6px 12px; font-size: 0.8em; }\n    #umoa-courbes-app .chart-info-step { font-size: 0.9em; padding: 10px; }\n}\n\n@media (max-width: 700px) {\n    #umoa-courbes-app .hist-grid { grid-template-columns: 1fr; }\n    #umoa-courbes-app .hist-controls { flex-direction: column; }\n    #umoa-courbes-app .historique-header h1 { font-size: 1.6rem; }\n}\n\n\/* Extension carte \"Affichez une donn\u00e9e\" *\/\n#umoa-courbes-app .controls-row {\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n}\n#umoa-courbes-app .controls-row .control-group:last-child {\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n}\n#umoa-courbes-app .files-list-compact {\n    max-height: none;\n    flex: 1;\n    height: 0;\n}\n<\/style>\n\n<div id=\"umoa-courbes-app\">\n\n    <!-- \u2550\u2550 LOADING \u2550\u2550 -->\n    <div id=\"loadingScreen\" class=\"app-loading\">\n        <div class=\"spinner\"><\/div>\n        <div class=\"loading-text\">Loading data<\/div>\n        <div class=\"loading-sub\" id=\"loadingStatus\">Please wait\u2026<\/div>\n    <\/div>\n\n    <!-- \u2550\u2550 APP \u2550\u2550 -->\n    <div id=\"appContent\" class=\"container\" style=\"display:none;\">\n\n        <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 SECTION 1 : COURBE DES TAUX \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n        <div class=\"main-layout\">\n\n            <div class=\"controls-column\">\n                <div class=\"control-group\">\n                    <h3>Choose a period<\/h3>\n                    <input type=\"text\" id=\"datePicker\" placeholder=\"Select a date or a period\" \/>\n                    <small>Click a single date or select a period to display the available publications.<\/small>\n                <\/div>\n                <div class=\"control-group\" style=\"flex:1; display:flex; flex-direction:column;\">\n                    <h3 id=\"filesListTitle\">Display a data set<\/h3>\n                    <div class=\"files-list files-list-stretch\" id=\"filesList\">\n                        <div class=\"no-files\">Loading data\u2026<\/div>\n                    <\/div>\n                    <small>Select the publication date of the curve.<\/small>\n                <\/div>\n            <\/div>\n\n            <div class=\"chart-column\">\n                <div class=\"chart-section\">\n                    <div class=\"chart-header\">\n                        <h3 class=\"chart-title\" id=\"selectedFileInfo\">Yield Curve by country and date<\/h3>\n                        <button id=\"downloadExcelBtnCourbe\" class=\"download-btn\" style=\"display:none;\">\ud83d\udcca Download Excel Report<\/button>\n                    <\/div>\n\n                    <div class=\"country-tabs\" id=\"countryTabs\"><\/div>\n\n                    <div id=\"chartSummaryBanner\" class=\"chart-summary\" style=\"display:none;\">\n                        <span>\ud83d\udcc5<\/span>\n                        <span class=\"summary-date\" id=\"summaryDate\"><\/span>\n                        <span class=\"summary-sep\">\u2014<\/span>\n                        <div class=\"summary-countries\" id=\"summaryCountries\"><\/div>\n                    <\/div>\n\n                    <div class=\"chart-container\" id=\"chartContainer\">\n                        <div class=\"chart-info\" id=\"chartInfoBlock\">\n                            <div class=\"chart-info-icon\">How to display a curve?<\/div>\n                            <div class=\"chart-info-steps\">\n                                <div class=\"chart-info-step\"><span>1\ufe0f\u20e3<\/span><span>Choose a <strong>period<\/strong><\/span><\/div>\n                                <div class=\"chart-info-step\"><span>2\ufe0f\u20e3<\/span><span>Select a <strong>publication date<\/strong><\/span><\/div>\n                                <div class=\"chart-info-step\"><span>3\ufe0f\u20e3<\/span><span>Click <strong>a country<\/strong> using the tabs above<\/span><\/div>\n                            <\/div>\n                            <p class=\"chart-info-note\">The curve will be displayed automatically.<\/p>\n                        <\/div>\n                        <canvas id=\"evolutionChart\" style=\"display:none;\"><\/canvas>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 SECTION 2 : HISTORIQUE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n        <div class=\"historique-header\">\n            <h1>Curve history<\/h1>\n            <p>View and download all published UMOA yield curves<\/p>\n        <\/div>\n\n        <div class=\"hist-controls\">\n            <div class=\"search-wrap\">\n                <input type=\"text\" id=\"searchInput\" placeholder=\"Search by keyword or date\u2026\" \/>\n                <svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\n                    <circle cx=\"11\" cy=\"11\" r=\"8\" \/>\n                    <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" \/>\n                <\/svg>\n            <\/div>\n            <div class=\"year-wrap\">\n                <select id=\"yearSelect\">\n                    <option value=\"\" selected>All years<\/option>\n                <\/select>\n            <\/div>\n        <\/div>\n\n        <div class=\"stats-bar\">\n            <span>Showing <strong id=\"countShown\">0<\/strong> \/ <strong id=\"countTotal\">0<\/strong> publications<\/span>\n            <span id=\"filterStatus\"><\/span>\n        <\/div>\n\n        <div id=\"histGrid\" class=\"hist-grid\"><\/div>\n\n        <div class=\"load-more-wrap\">\n            <button class=\"btn-load\" id=\"btnLoad\" disabled>Load more<\/button>\n        <\/div>\n\n    <\/div><!-- \/#appContent -->\n<\/div><!-- \/#umoa-courbes-app -->\n\n<script>\n(function() {\n    'use strict';\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       CONSTANTES PARTAG\u00c9ES\n    \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    const COLOR_TAUX_APRES_LISSAGE = '#4facfe';\n    const COLOR_ZERO_COUPON = '#48dbfb';\n\n    const COUNTRIES = ['BENIN', 'BURKINA FASO', \"C\u00d4TE D'IVOIRE\", 'GUINEE-BISSAU', 'MALI', 'NIGER', 'SENEGAL', 'TOGO'];\n    const COUNTRY_MAP = {\n        'Benin': 'BENIN', 'Burkina Faso': 'BURKINA FASO',\n        \"C\u00f4te d'Ivoire\": \"C\u00d4TE D'IVOIRE\", 'Guin\u00e9e-Bissau': 'GUINEE-BISSAU',\n        'Mali': 'MALI', 'Niger': 'NIGER', 'S\u00e9n\u00e9gal': 'SENEGAL', 'Togo': 'TOGO'\n    };\n\n    const logoBase64 = \"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAm8AAAC3CAYAAABExLnjAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4nO3deXxV1bk38N+z9jmHiBSQIlKKaL2teqmJY716a8UOtg4ICRInQO2krQpJQKoVvHlzAYdSSICrrXZwArUGSIJDrbZVWudWhKBUrddSHK5FioIYQ7LXet4\/EAuSk+wz7LP3gd\/386HVnGev9YTEnCd7r\/UsgIiIiIiIiIiIiIiIiIhojybpXjAV1c8VMhEiioYo1tjmhnFR50FERMEk0r0gkCMKmQgRRUTURZ0CEREFZ6JOgIiIiIiCY\/FGREREVERYvBEREREVERZvREREREWExRsRERFREWHxRkRERFREWLwRERERFREWb0RERERFhMUbERERURFh8UZERERURFi8ERERERURFm9ERERERYTFGxEREVERYfFGREREVERYvBEREREVERZvREREREWExRsRERFREWHxRkRERFREWLwRERERFREWb0RERERFhMUbERERURFh8UZERERURFi8ERERERURFm9ERERERYTFGxEREVERYfFGREREVERYvBEREREVERZvREREREWExRsRERFREWHxRkRERFREWLwRERERFREWb0RERERFhMUbERERURFh8UZERERURFi8ERERERWRRNQJEBERUXZSo6oOtgaHqUFfVfk3ABBgOHTbzRkFXoagQ8S8B2Ct1+m\/2Hnv\/NZIk6acsXgjIiKKs8raFN7bWGL2Sl4G6AWiOgSQEggS9sMQUUB2vEZ2+j9AFQDgEh68ihoA6gPoAKQNDkstsABJvILF9e2F+JQoNyzeiCi2vNFVJ8GYR3qO1A22qWHf8DPKDzO6ploM6nuKU8UK11x\/dC5zeRXV7wHSJ0isOEzxW+rn5jJfHHnl1TdA5JIgsQq9zzU1nBF2Tj2q+MFQ4zpHAVol\/uaDsVcCwLYCDCLdXhqMJLCtBugNg4s84CJYABU17QAajJrGzuY5K\/IwUfyMrTrYs+aloOFW5BtYOvehMFPKFNe8ERERAEAFs72K6q9EnUc+eeVTxgQt3OLAjKm+yCuvfs5D52ticIMYObjAKZQAuNKJe9Yrr\/6nN6b6epRfOqDAOYTK882vM4p37ibU1saqXopVMkREFCGBgeJ+VF4xLOpU8iE1qupgiP1V1HkE4VVUzfPKqzeJyk0QOSLqfAAAIgOg8gNPkv8wFdVPY2Rt76hTylXyjEuGQ3BQRheJHOit3HRaSCllhY9NiYjoX0RKPL9jlT1l4n54cEFH1OlkbXRtfyub\/vTh48F4GlGbMPu8O0nEzAHwsUVrcSIJAY71kpvf1\/LqRx06z0TzDRujziobLpH6TVYXGrkXMfoK8c4bERF9XH9T4v0p6iSydtFFCSObnoRI36hTSat8ylHegE2vfVS4FQkROcmT1D9NedXkqHPJlBldcx4gQ7O+vrz6e\/nMJxcs3oiIaBciUuaVVxVVYbGdWd97iYgcGnUe6Uh51QIP9k+ADI46l2yJmDmmovppVF4R3wJ5R5WVRkR73CTUHUHPm4wKhcUbERF1Tcxkb0zNmKjTyESiYvLlIjIq6jy6NKI24ZVX\/9WIuQwiRf\/+K5BjPb\/jbYyt+WzUufTE2P0vgsignAYRKfEqqn+Wp5RyEt+1AEREFD3FEoydeggWz3456lR6kjhzyrHq3Oyo8+jS2IkDPbv5L4AMzNuYCgfoWwq8CWCDiKx32\/4ZADoApAAATlNicDBUBojowA8fHeZr80HKs\/irjJoywl825w95GjO\/RlxQIqo\/ydNoF+KMSdNw7\/z1eRovK2mLNzHyxUImsp06DAHcXbFeZBohVbxskvJtOLjQ5rB2MER+tePXQBUPGE9mqXNDVIz58IMlgO70m4w47Aeza08pBQ6EahdfU0kBSL8GQTBQgOK4LR8XqhsV8u5OHxO8CdX2f\/2rroUYf1u4Fu\/aJioIz+\/8kx1R+0ksr\/OjziWd3hXVg7c6+0iM1pT\/y+lX9vf89tUQ5Fy4KfAYnN5rjPzBf+39P+PZmwN9TfTjHxgz+VDj7BEQqRSVUZDcbuaocY945ZNG2+b59+UyThi8Af1n5W80SXiemW2BC\/I3ZubSfrH8JXOfKGQiO\/LKq38B4Rt2V0T1Hr+x\/rGw5\/EqqtsBfFSEGWOu95fMiex7oluVl\/TB1r2DRsf7+yrlt6Mj0fMOv17vA403bilARkSASF9vn00vWOCQqFNJZ6vKKkje7ibllZfa+jdA+md7vaquE6PftX7qCSybvQVA7r+9L537ogNeBHA3RtQmUp\/852etJusAnJXVeAIDmKZEec0X\/eb6Z3JNL7+kOkiUUzfTiJne83ByPs6ZNBV3R3f3jXe3iowaGV6YiWB2+gXWufgemZJZEcOChygbIgd75dW\/ss0NZ0edyseZiuonAeS2nikMtbXGW7VpNYCsCjeFPuo2vnMqlt8W7s\/f5XV+x7ZC7mwAZ3ujJ82AmMshUpLZQJJQwdOo+N5+aPpppI8VtzPl1b8Bel5fqIpWbZ53NcqrA33ept087YDP5CfLzBX9gkkKiez82Dp+v0kRUcGJnGVGxaddAgBIRXWdQI6LOo+uyMpN10Oy+IVb3Rpr3SGuqeHLoRduXbAt86+2yX79VLA4m+s97fWXfOeUlTNqPivA14KEGsil2\/7BnhokXkQOTJVXRbajmcUbEREFJkZuSI2qKvSRTV3yxlR\/zSh6fswVgeQZk8qMIONeaOLkapt8sxTL5kW7QaSxrsMtra+Ek6\/uuF42EDEDvPLqyNvMmARuCrKrV1X\/7DfPfQwAbOmAPyg00N+9FWnKNcdsxbN4i3NjRSKiPZnAWGP+gsrKaN8\/KqoHw8lv4tpywyXMIxnlpuqs2qP9lrkz0dgY2oa0TNmWub+373ufBLAhw0urMWZKdMesVUw6TIBA5\/Q6NRUf\/UtdnTMG3w42iRzqVdSUZ5VfjmL5TU\/dShVoHn5vEO1BVLU5cLDAeJ2f\/jsuuiiaddMjahOe4m\/bFskHoW0KFGwXpDd60hhAMjjMXds8Yz6P5vkrwssqBw\/PabNN9ftCNfg6NhFjnL0jxKy65an5Y8DQZ9Ay9\/UdP+AvaXgMimAb9FRviOK\/A75BF59CNUPkZhaiPYhT\/aaqvhL4ApGh5u0+kRz67u2z+clMFtOL6lcF+laYOe08oRf870XhLHBGx9K5L4aYUV7Yve3nFBr4TFMROTF1WuHXhXkV1V+BBNvda7VXl2vcLOSbUO35DqjIkOTbe4\/NMMWcsXgjIiIAgHvfOxzbmrsGItAxifLJBT3j0quouR6CY4LGq2Ki3zzvqTBz2pFXUX1aJj3TVLUKTQ2\/DzOnvFm0YLPz9PhMLvFTUvi7b4pFweL0TjRf13Ux2jz3ZYg8H2QYB9yBWi1oPRW\/4q380gxuNRMRUd48PKfNOvk3qAYu4FR0DkZVBy6mcmEqqs8D8IPAFyhudc31\/xNeRl1Mqbg+g+B1rqWhoPnlbPG8l9Xp1UHDReQY1NYWrNYwFTWTIEHOjFXfSu8p3UXYjX2PDjhtwmudfG3A2LyIXfHWy3KzQuRO\/37WzSSJqMi1zH0d6iq2Hb0UjOfhSYytGRJmWhgz9bMCCXZHBQAUK+w7fb8bYka7OmPSIBE5LGi49d2XwkwnLK6lYSag7\/YcuY15btOkMPP5yMiLeovqjECxam5E0zXdP0pfXucDGrRdSjXG1mTYFy97sSveqHuC3I9X6UnKS4T7Q5iIYs22zH9AVH8Y\/ApJeL4+iaNDWrh9ysSU5\/zngl+gW6z\/\/pcKfZyXSZjzgsY61Vtx3\/x1YeYTJnE4I3CsQQbfS9lLJPa+PFi3Cm2zyfZpQca08C4NOH3K8\/WGgLE5Y\/FWfEIv3oiI\/JaGHynwUOALRIaZ\/ff6dRi5eHslnoZglzOTu6awiY5P4b6b28LIpfupZVzg0A4N\/ng1hvwj+j3RxYmpaUj471uVl\/RRaG2gWIf5gU\/maZqzHqo3BsziQoyaWpCbH7Er3lRRsNuORESUnku8fipcsIalACBivuaNrs7r2h+vvOoOAEcEvkD11EjO\/T15Sm8JupFC0YoH5sV+d2m36uqcqAlWLAmMd+blo8JMx9hetwTqq6fqbEtDRncCbbLjCmiAoxVFjDGdP8lk7GzFrnizqWSAhYZERBS6xkZnk\/aLAAK3h4CRK70xk7+ej+nNmKrvQcz4oPGquNo2z3swH3NnbC9\/aNBQFY2kxUq++Qb3BA62NvBj1oyNmtpHFIHadajg4ozHb7xxC0R\/GiRUREalxkwKvaVX7Io3ip71koXqJUdEcbd4wQarHccH6nm1ndP7S0ZOyqm7fslplwwTNYHvYijwkGuun5nLnLnwJBH4yDDX2dYQZi4FU\/qJl6Ea6PG0CgJv5MhUwvgtgQIVm90H9vZs5rCJN64IHKvm4WzmyASLN9qVKBv0EtG\/NN\/wslj7xcDxgkRn0luFU8Zl1z1g3MS+nalefw1+gW5wTfXfyGquPHHGBp2\/I5L1eGGoq3MKDXQSgageFEYKydGXHqYS7BgshX4XDy4I3AZnJ42NTtUEvGsnB2LUxOFZzRMQi7didMrEQh2RRUQEAPDvXfAUoNdlcEl\/U7LvclTek9n7zAW1JabNexYS8ChA1S12i3dARnOEQIATAoZmVzzElIg8EzBwUBjzW0ndEjB0rWtuCP6Ytwsuue5WAIFapHie95tc5upJ7Io3dRrKF5iIiHJjy\/pNU9XfBo0XkSM8\/8mgb64AALNp0xKBBFy6ob4VdzwenhP5nSxRBDoGShWtYedSSOrc\/wYOrqjO65r2xOjqE4JvEnHfz3nCxsYOdToxWLAM9UbXjMl5zjRiV7wBGnA7OBERFVRdnXPv9DsVikzOCT3flFd9K0hgomLydBE5LejAqvg2muYHOsIodAHPWhWRP4SdSiGJmNd7jvqQal4bwKuRoHe3NuZrI4s7ot+dULwaKNjgZ\/mYsytc20S7UIM+YvMwUGVtCrq5Ty\/f7+\/E66+QlEL6qLohRjBIVfaF6BAAUMjB2KFNjIgOBCSrfjkf+812nYi+K879RdWstOr+jHvnr8\/xMwvsW4+9PaTD2e8YTz7vVD78zVxLRCTw4uYdbf\/cRBwUsv3zXA01m+HJKwmn7zp1Gzs83dI3ud\/Gm4+RgjYppT3A8jrfAp\/yKmq2AsEebQrMzzDy0pW474YV6WK80ZO+ogjYHR+AU\/xImxuyWnweKdHd6r\/JBOwrfsBSIul5JZ15mtcrr\/46gN5BYq1rPzxP0wJ1dQ6jq6sgcm+A6AFmdPVlYRyBxuKNdmV1GCA7fShZOeWozsY5u\/zg7Tu2ZsD71hyhzh0qgs+p4CCBDgNwIPzN\/QHAlx2\/zRQisq21o3z0Pzv+44d2nj8TIijb4V\/LAIEaDwDgqVlngYKtj+mAmy2eOU+35bU9w6zH+9fnZiDY4fMUBZzCfhiUdIIPtr6NCY\/\/4y0AryjkVVW8JGpbNZlcuei4gcF\/WybqgoUe70GeDRQsMF4itdyeO\/kzuGvuho+\/3Kv88oN8+PcHnVtVH9XmhsC7\/2g3JFgSJExVW9Hyk7z+vLMtDfd5FTVrARzYU6wYqUdl7c1orMvrWkcWb8VovwEFf9ztfPu0Ka9qFmC9ihku0CFQGfy+RV\/AYXtrxB1KMYoFGQxgsAAniAAQD2Idxj++vl2gG6DylkIaF56w74+izpSKTFPDCh0z+ZuiGmxNm6CP94E+Z4H9d\/r4iNoSH5v+GPSxo0LfdP3eOTXzhGl3kSiv+S9FsBM3PM9NCN7jJjjr42QvgSA7ohOev6nWAoGO4woqhmveTAxzipl32iIouiUhYsZCzCUCnATIwRBk1waAIidACSBDITgGcGdHnc8eR4MeKxRvbuncWwH9eeALBENNRc3yHT9k9tn0EiToEgltc1pSittua88kz1hR2a1umvjwMugL6udeR42a2kehVwcJVcGyziXzw9kgcm\/9K0DA00dUrkRlbV67RMSuUBK4yLd8E1E8iHEB36Ql0NqXuBCjnwsWGP+2Erap4btQ\/DlovAAnmorJlwOAVzF5togEa+ar6ozTL6L5uuCnPcSQqgbbHVkkVGRA0NhOZ3JebyzGnwEJUAArXAom4M7Q7HidZnSgQIER\/71F+Zw7dsUbEdF2YrzNgQI1YE+wuBAJuOsuWPf6qNl3VhyvqrusZUtH1F0vFTVzAL086DUKuaCzZd7K7DIMn0ID5SbQ48LOpZBE3ecDB2\/sF\/h7pEtjawYYQXWQUBVtbl86Z11O8\/Wg4765Lyr0gSCxRnVMaszUvJ1exOKNiGKr0zfBijdBAqd\/P69tCMKkQKAf4qIo2M7onCxf7juxRwaOFzEGmBw4XvFz11y\/MJvUCkUUwQpLkeL6RaMHioDHXik2YHldTjttja+BNikAgNu3rSDLQZwvVYECBcZXvz5f87J4o12oyl5R50AEAEglgxVvALxUyUkhZpI\/tbVGIMcGCXWCYGtq4qBpwesw5stQ5HV9uAKP2eb67+ZzzDCo6CPBAjWV7\/VPURJIwJMlNLe7YCMnDxSRk4KEOsjPcfPNhWnJcm\/9KwpdGiRUgJE4c1JZz5E9260WTlJ+GNEDuWOUYqHx+s2oqNkMBNgcoxgBoDn0nHLVumVg0FCjeDwfLRcLxS6Z86ipmDxRoDfkZUDV9S4hJ+dlrJA5xTNekB+bIjAd753ngFvDzilsvcZUH+SrBPx+ljW5zOUl9ddBY42601Be\/fdc5suISiroW6Znzb35aFfF4o2IYk5fAeSoAIFBz5aMVAIdB2nAH702+caj4WaTf65p7o2mvPpkESnPdSyLzn\/H4huKY2dpu3sTewV8mCXuUuwGxZtT+5WgZYRK8OLr4xKjphyrcME3egTevRwBkWGp8qpDO5rnvZjLMHF8bBrHnOLF2UD9kIh2D0EPvsYxqLwi9u1rHBLBThFQdWhsjP1u06645BtnqmoOx1YpLEwpmm8onp2lDy7YrAh2bqmIHIOxEwPfgY0p45CYFzTYNTXcme1Ealxed2pGzUKW9xzVvRgWSjI06gyIKEaMezhwqL91ZJip5IMAXwsYWpSFGwCgsdG5ZMfxyGAH6o4UqEHTnHicWZoBcboscGxnIlCvstgaXTMcAY+nyvb7AAC88qoxkGAbfIqGyCBTXv29XIaIYfFGRPQv9n13X9BF8AJcH3Y+ufDKJwcuLp3I3DBzCV3jjVuswX9AMz3LUxe7poaGcJIKl\/X8wHeIjOAyjK0J3CMtbjzRwL9UwZjsdgpXVhqI+UVW18aciMzCxIlZb1xh8UZE8fbggg6IvhksWIbi9Enx\/S1d3E1BQ9Um8rPoP0pLG14V3341cLzq67apoTLEjMK19H9eVNVXAsUKjLF6W8gZhcJUTDkHIoODxlvvtSlZzeMPOwtA0bQAytAA85r3rWwvZvFGRLEnIoH7I3kp81yYuWTLjKn6HhBwIbVqO47s\/VbIKRWEf9+CP4h1Pb95Kzbbd577TAFSCpfIrMChkJGJ0dVFsdHmI2dMGiRwwYtOxVo0NmbePqay0mQ0TxESkZ9gZG1Wp8OweCOi2POX1mfwCFH6JMqrrwwvm8ztXTFlkKiZEzReYWagri6M87Qj4S+bN7f7XljqW+e+gOXLC9ObK0Suqf7WTB4Vq+DhktGTi2Ot9wW1JV7CWw4EP9HEwr8gm6k8f+jsTOYpVl5i00+yuY7FGxEVBYU+ETxWZiQravLSDDMf2mH\/iKCLuwE4keCHvRcJl+h3LlTXdv0iKrBsXvE0JO6BCmoCB4uUdBpdjVHf6hNiSnnhbd70OIBDg8Yr9BU0D3gs44m27cS9LOPripHI+Rhbk3EHCfZ5o10pDHv0Utw4wQRP8b+BggUJB6xCxZT90DQn0iOmTHn1k4AcHPgCp4vREm3OoWis67DAZ7zymk7Iju89OtO2NNwXXWL55xL\/eaPX+cRsiAR9U+7vef3es6OmfhrLZgdc31lAp0xMeSWJ5wAMD36Rwlgd55D5HWTP92ZDgt11E+B4v6n+qUznCJspnzRexLsjUKyPex2QUTNq3nmjXahgUNQ5EO1iacOrqi7QIdDbeepew+iqA0PKqHuVlcZUVC8RkeAHkat27J2Ui0PMKnJW5TNQdQCgwEO2qaG4W2Z0pfEsB3WnZ3qZ53W+4Y2pOS2MlLI2pvogby\/vfyGZFG6AAkv9ZfOC9Wjc0diaIRC5MNgkujKOhRsAuHf2uRsI1iJFBF\/DmMmB72gCLN6KU1L4daM9khP5NjSD\/meClCfmr6a86pwQ09rV6Kr+XuenVwlkTIZXNmxeXF88jWmz0TL3dRUZp9CnXKLvGVGnExbbMv\/3UL0ns6sEUNxvKmqWYORFWS1kzydTXjPdU7yUcf9VVZftwfCeH\/wkBtspGRfIBbO8zgck8Jm8xmlGLVFYBBQjz\/FxN+2ZmhrecnA\/yugaQULE3GUqav5YiAPBk2MmX+iJ\/AMih2V6rW1uuCKMnOLGNdXf7ZoajkdjXfE2Ig7AvtNvHFQzfgQuwBgvufc\/E+U1\/xVGXj1JlE8+wSuv\/ocIZgCS8fuNReJzWR0Mf8akQRAJtlZV8Trur4\/fI+Yd2Kb6ZgRsHSOC\/8SZ1YHvbsavCFAtgXDBFRF1TZvnXY2K6jGAZPQYR4ATPH\/zVlTULLTOXY2WeWvzltTJU3qbT+hIce42l83PMFVnjVf8bTJoZ8vrfAvs55VXf5DB+rftSlRQ51XU1DnVX6rT60Pd1FExZZCBXy4wNykUyHLhs7E6zi778atZXZvwng4aazt7lWYzR6EZwdkOeDZIrGfxuAX2CRIbv+Itg8Z\/RLRnsvu2He69vffbyK6B53jPmPFaXr0GkFtcp23G\/fODNVbd0SkT+5q9EqcBqBS4Mdve77J7w1MjE7B0zrqsLqbY86BHWmB1NnexAMCIfAuefAvlNW9BdDEg99uNGx\/F8tvac0qsovooo3IaoGcL3GG5PowTJ1d3LqvP6gxTb\/Sk0wAcGCRWgaW4\/7p3s5mn0DqbGlZ4FdVrAv2yKdI\/UV5zot9c\/4eeQuNXvBER9eTmm307uupIz5i\/IsufYyIyHMBsL+XNRnl1m0LWArpegZUi+hcY2emNUS2OFJGDoBgiwFAI8vKLpoP+WJdmf2g3xV9H87wXk2dO\/oKz7nGIZL+WTTAYkMsAXOYNGACUV7+lwHoAryvwvHh4wSheEattO15mE1IGXwaKaKkKhgtkMFQHA5LadoMt96dd4nCF3zI3syUNOzIm8Okjrpf9ftbzRMACX\/WA\/wsSq9AlAPbtKY7FGxEVp5Z5a3uddsn+W1Opv2XxSGpnIr0FGA7IcAFOAgQfP031o5tq+V3VMVebGqbmdUSKpc4lc1fi5Cn7en3cawDyc6apyGABBgMoE+A0OEABqNn5m1QcPrypJv\/69s3b8iT1oa7Cb5mfdbsXU1H9ncCbIlR\/ibvnF1crnaaGt7Si6j6B6flsY5GBpqJmkmuqn99dGDcsEFHRanvgxrdsv377QFFcR0kpnKpebJvqszrzkYrUw3PabOL1fRV4KOpU8mS9Z+3htjn7wg1H35QQRbBzfFXbbbJfUd112y4pUhU0VoAZPTXuZfFGRMXttrp2+87Gzyg0ox5wkVFtE6Nfcs0NN0edCkWgsdG5pvpvGLUTMmp7EzdOf2rL+n66Y9mCNbkMY\/b\/y+UQCbYL3ODmYt2hvHVpw6tQvT1geN+Ekx90F8DijYiK3\/Lb2l1Tw+mwpnJ7A9g4UtWnbEI+6S9tCHzUF+2eOpvnL7TJrZ9UxW+jziUjiresr5+3LQ3fR11dzmfRCmRW0Fhb2i\/4sWMxZHuXVEE\/viCja+q0FqOr0m7IYvFGRLsNu2zOYtvc4EH1TiD44eChU33ROHeka244Hovrc9shSLuPxhu3uOb6k23n+\/uK6u\/j\/IsHgLXie1+0zfWfwr0NOd1t207KqxZBgtUhClShLvOjtmLlzuvehSLYucUC43WziYPFGxHtdmxzw7hewP4AfhppIoqVEPcN29zw750t81ZGmgvF1303b\/CbG75qVT8J1Qaobo46pe0UuE\/UHW+b6j\/j3\/vj\/N0xHjV1iIE5K2D0u+4DP9r\/lvPEttRncvzdWai8pE9XL7B4I6LdUltTw1u2qf77NrH1E6p6NhRZNQ7NiuJHCfX\/zTbXH2mXzttdFqdT2FrmvWubG2rsO\/0+KVa\/AOit0SSiK2BRYZ3bxzXVn+E3z8v7+aHGdMyDBOt4oep+iAcXFOVat66oumlBYz0\/dX9XH4\/dUQZeefVyiJwYdR5xZj18GovDOxbEVFT\/TiBfCWv8SKmus80NBxRquvGP\/WORiJxXqPmyoaorFp6w39FR51EQtbUmsXrTcc6hViBHQdAXQA5HZqkPSBuADUa1rjP5xkI0Nhb3ox2Kn8pK43XsP0pFp4rooVD0zrk9DgAofEDbAKxXI7e5jvfn4r6b23q8jiLHPm9EtOeoq3M+8ASAb3z0sVFT+3iePU6dO0oEh0CktyoG7nKtoF0UmxX6kohZk\/DbV26998aPTmawBfkEaI\/U2Ogs0Ixtf7YZMSKR6HfEUc6TMqgZJNDPK7Q3IF08ZlMnkA1OsEFU\/iFGV1q\/YyWW3RDrs0EpPRZvRLRnWzZ7iwV+C2S264\/FGkVq+XLfx\/JnADyTyWUaUjpUWFzzRkRERFREWLwVIa\/THhd1DkRERBQNFm+0CwEGRZ0DERERdY3FGxEREVERYfFGREREVERYvBEREREVERZvREREREWExRsRERFREWHxRkRERFREWLwRERERFREWb0RERERFhMUbERERURFh8UZERERURFi8ERERERURFm9ERERERSQRdQK7EKSiToGIiIj2LMNr7xlsOvxB4rnDADneKI5VaAlEyrbHqGq7iKxRdWsBvOyJ+aNC1jpf31x93bh3C5Vr\/Io3xRBI1EkQUTEorV14oliMizqPnoi4Z1fNOP\/mXMcpveqO4\/PQ7TUAABLiSURBVMTIN7t6zdvaXvfc7O+8mfMc0xbViejgXMcJW+vM8RfnY5yy6Qtvysc4QamqU+CvRvVlTXprVteNe7WQ829XOv2OgwUyJYq5u6XY3Dpr\/NRCTHX0RTcl\/EF9RqpinEJPE9vZGx6AD4sQlX\/983YiUgLgKBFzFAA44EpAIQmgdPrCjQIsc5AW5yUfWFN3VkdYuceveCMiCkgchgNyUdR59ETVWwwg5+JNjDkYQJefr+uVmAcg5+JNoGcBcmiu4xRAXoq3Qn\/\/iAi21wRigdLpCzeI4hlNJK5eXXfOikLlYUSGqMbxvx19C0CoxdshU5v79Eq9v6hT9OsASiCA5OGukUAGALjQABeK3+GXTl\/0B+N0yqprxq\/MefCPYfFGREQUEYEMhOA0sfa0smkL29XoyatnTHgs6rx2RyNqbyn5p039xmDLidvuqIX3mE9EEgC+okaeK5u+qF3FnH1oqXdf41lnuXyMzw0LREREcSBSImr+WDpt0eOHTG3uE3U6u5Oy2kUnbLSpdwxwYphFWxoloq7lpdaO\/yuddveJ+RiQxRsREVGMiOA\/U722vDGi9paSqHPZHZROW\/gdWPxRgIj\/PmWQiF1eNm3RLbmOxMemREREMSOQvhv9Xn8HsF\/UuRSzz0+\/u0zg\/yzwBYrH1MgSo3hI1W9DAm0fD0mipKTDaolBxxFO5UwIygUSvFOG4MLSaQu\/vveA5L89NeXs9sDX7YDFGxEVLeMnF5uE\/0yu4\/hOfwORgbu+opsTIl\/OdfxO016wFgK5EjFneqI53aGwVgar0fu7fFHx24TBFbmMXygJwdH5HrPTyVFQe7IYOQYqB0LSPwET0UGHTV\/U8vzMcaPznUe3VK5JGF1S0Dm3T219P19jDa+9J+X5nY9Aun1MulFUb+xMpGZksTv0ZQD3bP+XI6bfXuZg5qnKsSLonfYqVXhGZmVbuAEs3oioiK289uwNADbkOk7p9EUdXf94F3\/FjHEF2wEYB6tmnrcm1zGOrr1nWKftTPOqblwxY3xR\/J2G9LVfAeDnAHBs7R19P3CmXhTfShdsgFFltXcf1lp3zvMh5NIlhftbsXyNupPyOyY5kQHpXhfF\/INfTtY0NuZnE8HKmee3AvgyAJROX3Q5FNNE0H\/XiWXmyhnjbsxlLq55IyIiisAzdRM2r54x7tsicnq3gc7Frx9bEbAiae\/wqugVq2aNq8pX4fZxq2eO+3FHxwf7KzB\/pxec+1HrzHFX5zo+izciIqIIrZpx3gNw+sO0Ac5dePRFN\/FJWQbKam8fJEAXSyEABdatnjH+R2Hn8NLs72xZPXNcVafqAVC0q9M7W6+ZkJclAyzeiIiIItZ6zfjrVHddHA8AEIH9ZP9dH79RWtYm0z4uhbo\/FzAV\/GXW+HVtmzf0W33N+LydBsPijShMRl6KOgUiKhKCtBtbnNnKvm8Z8Gxn2juVAnNgAVMBALyyoCqvR2XFsXh7PeoEiPJG0\/8wJiLakaik3TntW24wzISfKtmc7jUVHFZWe\/ugQuaTb3Es3vK2TZiIiKhYKFz69hKUkc9\/Hq9rmnpCgJT63t+OmH53WaHzypc4Fm9ERER7HpGj0r3k9ZKse4LtiRrPOsuJ4n\/SvS6C3g52Vdm0RX8qnXbnOYdM\/XlRPZbmbVgiIqKIHX3FPX07tGNAuoayHW2f4BKMDLUlXG1vX74DkfSFmeAYgd7Vq9deKJ2+aJ0AaxVoFdWnVbBy9czxBeuvl4n4FW+K9YU\/M5aIiCg6ncmOJQJJ9zRs3Uuzy7cUMJ2K0ul37l+IiVbPPK82rLFfqZuw+bDaRV8wPl7o7iSL7QQYBmCYACdC5DIBUDZ9EVThi8Ap1AHiAPXFYYWKrBCHPyX2do++v2nrFq93344sTmnISvyKN0mzVZqIiGg3M7z2nlTCdt4G4GvpYhSYUcCUICKnAXpagaYLrXgDgOfrxr14zA\/vPrzD+E92eweuGyLbaiX56M6SAAYnCXASPMBvN+jVay\/AdqJs2sItAH4LlV9YMStfmHVuKJsw41e8ARujToB2XyryctQ5EBF9ofaewVvd1ovU77wC3Z6DKRtSw967tXCZ7X7+fO05zx965W0HJL3Ez0QwJtTJthWI5RCUe3AonbZwHSB320Ryxpq6s\/J29zSGxZtuAZ+bUkiEvxwQUUCl0xc9l9cBVVMiKIGi\/1bbOQAwPZyZDsDouGcvvphdGHL04nUXbARw5pHTFg6zIrcBOKkQ84rIMAA\/8PzOyaXTF\/1e+tmK1qnn5\/yEMXbFmwJ\/Y+lGRERRE+CI\/A4oHw0cLN5MbZ1x7kN5zWEP99ys8evw4eHxZVct+rqKXi+CAwEJ9QSLDx+9fh2bvPfL\/uuub7f+97m\/zGW82LUKEWPeijqHuLOiK6POgYiIwqPA1NYZ5\/446jx2Z63XjHto9azxR7bOHL9P0tuyL2AvAHCjAo8Cuj60iZ37Rdm0hTfkMkTs7ryZTl3rErz31q1Egv1+iIh2R6obrNFTX5gxoaDnb+6UAvSnCvlNVPNH4dm6izcAuP3DPwCA4+b8quS9jW6gMW4QHAaIoq+IDlfFv8PIcORyZ1bkktKrF72wesa4G7O5PHbFW6fRNz2ueeteu4S9FTkV8vhERLQDVbQZdeNWJccvQ524aJPBs8\/PGtccaQ4x8NSUs9ux7cjOHXeMLt0xZkRtbWItDkwMbN871ZnoOEVFLobiOOluE8qHxOkNB11x08JXr7847VFe6cSueEPLvHdRUdMG9PyJ77H6fSLc4k3Rn\/UzEVHY9ClR3L933z4NT1yxvY\/bhGhToowsr6vzAfh\/B9oB3PPhHxwx61cDta1zgRMZK+lqLRH0Se59BYBpmc4bv+INAFQ3QoTFWzqvI9ziLcBvDEREuzv1XE6NasWXKohcnn4CvLVq1viZucxB8bRy2tkbAJx7+PQ7Z6i65yDS5RMtVVyJ3aZ4g64HZGjUWcTW8rqQ17xl18iQdiUWK+FFnQURZWN13YRcG6xOLZu+8AhAum7AK1JedtXts1qvOT\/jN28qDqtmnrfm8Npb\/kNtqsu2M5LlY67Y7TYFAAgiW6gZdwqEu9O0YiKL5jxSGG4uIdqDtc4cf7ICa9MGGO+q0ml3nFO4jPY8R05bOCzK+cv\/34Wt+R4zlsWbB\/PrqHOIK1F5NMzxE8YMCXN8IqI9TcfWD0q7az0hYu46\/OqF\/1nInPYUZVffeawF\/n7YtIWzosqhTvK\/ASWWxVtH374PRp1DbAkeCXN4BzkwzPGJiPY0L83+zhbxOv9DNf3Z3erwyFFX3TG4kHnt7obX3jNM1S2HCIzIVaXTFz49dM6vSiLII20HB4VmNWb64m3U1OjuwNwW9pqu4mW18\/kwxxerXwhz\/KiJ4OmocyCiPc+qum+u9Zz7AtK9WYukfGP+PqL2kZiuRS8ux9be0Tfhd\/xVIB8VawI5dp93\/PcOm76oHLW1Bbt5lfQ7fpDuNYFk9Z6eNnlj7InZDJg3irwd4Lob2YzmBa+GOYGKd0yY40dOEW3\/JCLaY628dsIacVrRTUhqo33jb5+dOI+9NnMwovaRRLsv\/+hqh6cACQM0ldnP\/f3waXedFHYuZVfdPlIFM9IGJLxx2YybtngTcadnM2C+KHR2lPPHkao+EeoElZVG4E4IdQ4ioj3YqmsmNKtgbrrXBTJ0r377\/q62gHeGdjfvdL5xFUR6eDwqQ1XcI2XTF75WdtXCSSNqb8nr49Sja5f1Lp2+6Bcw3r3pDrNV1fWta8yabMZPf3tWNdLFk853t3pJry7KHGJHtSnU8d8bPAB7CW\/ZExGF6NAXk1NfPKTjYIGM7Op1gZ7Q5B\/8CwDfLHBq2+YXzCqbtmhqFHMDgDg3Y9W1ExZme33rNeP\/+4ir72pz6gLcBJKhMJi30abmlE1b9CrgbnHO++Xz156X1dmmpdMWfU2Aazvse0ekbc77Ic8kTkfjWVk9DUo\/sJgB2QyYN0Pa38T63g4i\/O0DAFSde\/fd23sOzMHeyaFw2S2eJCKiYBq3vWGfUTp90WoBDusySHBh2dULn2udMX5+YbMDABkEwaDCz7t9etM\/1yFWzjj3x4dfcddil7BPikiPG0EESEBwMGCuNZ5eWzZ9EQBAgQ5RbQWwQuVjy26c9hEjZYCUdTFeeqqAMVUrZ5yTdVu07gqj\/hhdlfNfYNZuvtlXYFlk88fP61h+W6gbOYzT68Mcf08knhf2ObREVKRWzxxXCsi7aQMc5pVNX8QecFladf25a1fPGv8pQK9RVT+bMQRIQeQYiFwkkO\/t9MeY8V0Vbj3Tia0zzsupKO\/2rpYROSuXwXMl4m6Icv44UXU\/DHsOAb4e9hx7mju+uE+4TZWJqKh1qjs87YsigOptR05bGO0GwiLXOnP8NM8lPwWRn0eZhwJtIvrl1lkT\/ifXsXp4JCmRblqwZfv8Hgj5HM8i4Vrm3xnqBJWVfDxNRFRgf5k1fp1V92VoNy1ERH53KHvA5WTltWdvaJ1x3nfRz+4N1R9DtWC1har6Kvhv6yX3WTVj\/KP5GLPbN2yBfj3SN\/W6OgfRuyObPy40\/L8Dzx9aH\/YcRES0qxdmTXhUoBenK+AESKSM+b+yKbf3LnBqu53Wqee3tc4aP7V11vhe6nlHQ92Dqshqc0K3FE5Vn1eRmtWzxidXzxhXu6burLwVjN3vLBQpSXQecKwPPJWvCTNlt8oPvaSeD8nu8NbdgVUT\/q4fxVlZno9bbCL7Xqb4SnjyBc\/fdXNUp5p49QX8wC5OlSR\/39VL+vbWtwqdTjrP4oU3j9FD9+\/qNbEdaU8ZiEJKTZd5FtqqWRNuLv3BHQ\/0SnppY7YmkQLSn9KQifcHDnii\/\/pNsfjcP64t6aVfB5hHq+vOWQHgVGDb+acO8hUYfMk5PVZEut5Iko4qFFgjIk8I5OHOhPfbNXVnbwwjb6CbDRFeRc32XwFut031F4SVQBBeefVrENkjD0xX1Ydcc8M3wpwjWVF9lIM8G+YccSHA8X5TfUELuAmPr4\/1Fl5VXbHwhP2OjjoPIqLYqK01pVsP7mvV7ytJ9E54Xgk6d2j6m9QO39r2lHptvpXNq68bV5CCc7sgPb3Ox3E1F+Op+siOrLIl7mhvq\/ePqOaPjMK5ZCL0wtlCaveMm25EREQB1NW51cC72PYndoKtZ\/uU+UrIeXTv7vnrAayLNIdo\/BKNPw73UcioS4cIMCrUOYiIiChvAhVvHtyvwk6kJ9aaU6POoaBUO+w7fb8f9jSeSdWEPQcRERHlT9CdpH2SZ07KohFdHi2bswbQWyPNoYCshyOxvC6rpoKBnTIxBcHloc5BREREeRW4DYh1XvR3315642JAY\/n8Oa9Ub8WShqwOq82Et5d3R9hzEBERUX4FLt4EONQrn3JKmMn0aE1jhzX6jbTNDHcDqnjettuLw55n7zMmDYLK2LDniRtfNP\/9fIiIiAoowwa89hZU3hNtJ\/4l855RyNWR5hAWxWan7kt4cEHonZ\/bPdMCyfTrvxtY2vBq1CkQERHlIrM3b5HBpuOJyNdIueb6mQpdGnUeeaXaYd83n0LLvNAfC5vyqm9B5Liw5yEiIqL8y\/jOixi5HuOnRH5Eh0u8UanQP0SdR16otlnjfQ4Pzwm\/8\/jYmgECc1Po8xAREVEosnps5r3vou\/G39joXOKNL6vqg1GnkhPFBqvmECydU5A+dsbXxyGBmjMTERFRDGW75ulQr6Lm+rxmko3GRueaG051ghujTiUrqutsu\/9ptMx9vRDTeaOrrxWRQwsxFxEREYUjlwXrP\/DKJ4\/MWyY50KX1l0J1NFRjdeBxWqrOAdfY5oYDCrE5AQC80dUjYeTKQsxFRERE4cltt6G4Joy6dEiecsmJbW5YZhP2AFX8NupcuqevWvEO16b6aYWaMVkx6TAIlhRqPiIiIgpPjmufJOGZ5P9aYK\/8pJOjxQs2OOBklE86wYNZApFBUae0E3Vn2uZ5hd0le\/KU3g7uaQhSBZ2XiIiIQpH7wnWREq+i+p820XEAGm\/ckoecctc8\/zEL7JesmHSYg3c\/oMMAiSYX1fUqcoVrqr+14HOf\/v3+XtL9E7neYSUiIqLYyNObugzw\/NRLGFszID\/j5Udn0\/znbVP9AXZrx6egaICiMA1aVdsVWCaKEba5Yb9ICreRk4Z5qZK\/7ZGNeImIiHZjeWwZIUM8X1+wI0bsj+XLwz1QPVMP3PiWBWoA1OCMms8a406AMRUCjMrbHKrrAbkHBkvsxn6PYXmd7\/I2eIbGXHao58zjAPpHlQIRERGFo5viTTMvwAQDvQFHvm1HHvJp3HdzPHd+3lv\/igNeAXArAKDykj7w9+oNY4cZh2MF8h+q+KxAj+nqrpWqvAxgg4H+zhfvAQDr0Pnelrh8vr3OqPms7\/S5bb3csvgaUghi\/nVQxDs\/IiIiIiIiIiIiIiIiIiIiIiIiIiIiKkr\/H2bpnkX4nPVLAAAAAElFTkSuQmCC    \";\n\n\n    \/\/ Donn\u00e9es partag\u00e9es (charg\u00e9es une seule fois)\n    let allData = [];\n\n    \/\/ \u00c9tat Section 1\n    let evolutionChart = null;\n    let flatpickrInstance = null;\n\n    \/\/ \u00c9tat Section 2\n    let histFiltered = [];\n    let histShown = 0;\n    const HIST_PAGE = 15;\n\n    \/\/ R\u00e9f\u00e9rence racine pour scoper toutes les requ\u00eates DOM\n    const root = document.getElementById('umoa-courbes-app');\n    if (!root) return; \/\/ s\u00e9curit\u00e9\n\n    \/\/ Helper de s\u00e9lection scop\u00e9e\n    const $ = (sel) => root.querySelector(sel);\n    const $$ = (sel) => root.querySelectorAll(sel);\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       UTILITAIRES\n    \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    function normalizeCountry(n) { return COUNTRY_MAP[n] || n.toUpperCase(); }\n\n    function formatDate(d) {\n        if (!d) return '';\n        return `${String(d.getDate()).padStart(2, '0')}\/${String(d.getMonth() + 1).padStart(2, '0')}\/${d.getFullYear()}`;\n    }\n\n    function formatDateLong(d) {\n        if (!d) return '';\n        return d.toLocaleDateString('fr-FR', { day: 'numeric', month: 'long', year: 'numeric' });\n    }\n\n    function populateYearSelect() {\n        const yearSelect = $('#yearSelect');\n        if (!yearSelect) return;\n        const uniqueYears = [...new Set(allData.map(item => item.date.getFullYear()))];\n        uniqueYears.sort((a, b) => b - a);\n        yearSelect.innerHTML = '<option value=\"\" selected>' + \"All years\" + '<\/option>';\n        uniqueYears.forEach(year => {\n            const option = document.createElement('option');\n            option.value = year;\n            option.textContent = year;\n            yearSelect.appendChild(option);\n        });\n    }\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       TOAST\n    \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    function showToast(msg, type = '') {\n        const old = document.querySelector('.umoa-toast');\n        if (old) old.remove();\n        const t = document.createElement('div');\n        t.className = 'umoa-toast ' + type;\n        t.innerHTML = msg;\n        document.body.appendChild(t);\n        setTimeout(() => t.remove(), 3500);\n    }\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       EXPORT EXCEL (partag\u00e9 par les deux sections)\n    \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    async function buildAndDownloadExcel(item) {\n        const wb = new ExcelJS.Workbook();\n        const formattedDate = formatDate(item.date);\n        let logoImageId;\n        try { logoImageId = wb.addImage({ base64: logoBase64, extension: 'png' }); } catch (e) {}\n\n        for (const country of item.post_datas) {\n            const countryName = country.nom_pays;\n            if (!country.datas || country.datas.length === 0) continue;\n\n            const ws = wb.addWorksheet(countryName);\n            ws.getRow(1).height = 45;\n            ws.getRow(2).height = 20;\n            ws.mergeCells('C1:K2');\n            const titleCell = ws.getCell('C1');\n            titleCell.value = countryName.toUpperCase() + ' - ' + \"YIELD CURVE\" + ' (' + formattedDate + ')';\n            titleCell.alignment = { vertical: 'middle', horizontal: 'center' };\n            titleCell.font = { name: 'Courier New', size: 16, bold: true, color: { argb: 'FFFFFFFF' } };\n            titleCell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FF6699FF' } };\n            if (logoImageId !== undefined) {\n                ws.addImage(logoImageId, { tl: { col: 0, row: 0 }, ext: { width: 220, height: 80 } });\n            }\n\n            const dataPoints = country.datas.map(d => ({\n                mat: d.maturite,\n                zc: parseFloat(d.zero_coupon),\n                tal: parseFloat(d.taux_apres_lissage)\n            }));\n\n            const tempCanvas = document.createElement('canvas');\n            tempCanvas.width = 900;\n            tempCanvas.height = 450;\n            const tempChart = new Chart(tempCanvas.getContext('2d'), {\n                type: 'line',\n                data: {\n                    labels: dataPoints.map(d => d.mat),\n                    datasets: [\n                        { label: \"Rate After Smoothing\", data: dataPoints.map(d => d.tal), borderColor: '#FF8C42', backgroundColor: '#FF8C42', borderWidth: 4, tension: 0.4, pointRadius: 0 },\n                        { label: \"Zero Coupon\", data: dataPoints.map(d => d.zc), borderColor: '#5dade2', backgroundColor: '#5dade2', tension: 0, pointRadius: 4 }\n                    ]\n                },\n                options: {\n                    responsive: false, animation: false,\n                    plugins: { legend: { labels: { color: '#fff' } } },\n                    scales: {\n                        x: { ticks: { color: '#ccc' }, grid: { color: '#555' } },\n                        y: { min: 0, max: 15, ticks: { color: '#ccc', callback: v => v + '%' }, grid: { color: '#555' } }\n                    }\n                },\n                plugins: [{\n                    id: 'bg', beforeDraw: (chart) => {\n                        const c = chart.canvas.getContext('2d');\n                        c.save();\n                        c.globalCompositeOperation = 'destination-over';\n                        c.fillStyle = '#333333';\n                        c.fillRect(0, 0, chart.width, chart.height);\n                        c.restore();\n                    }\n                }]\n            });\n\n            await new Promise(r => setTimeout(r, 200));\n            const imgB64 = tempCanvas.toDataURL('image\/png');\n            const chartImageId = wb.addImage({ base64: imgB64, extension: 'png' });\n            ws.addImage(chartImageId, { tl: { col: 0, row: 3 }, br: { col: 6, row: 20 } });\n            tempChart.destroy();\n\n            const startRow = 22;\n            const headerRow = ws.getRow(startRow);\n            headerRow.values = [\"Maturity\", \"Zero Coupon\", \"Rate After Smoothing\"];\n            headerRow.eachCell(cell => {\n                cell.font = { bold: true };\n                cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FFE0E0E0' } };\n                cell.border = { top: { style: 'thin' }, left: { style: 'thin' }, bottom: { style: 'double' }, right: { style: 'thin' } };\n                cell.alignment = { horizontal: 'center' };\n            });\n            dataPoints.forEach((pt, i) => {\n                const row = ws.getRow(startRow + 1 + i);\n                row.values = [pt.mat, pt.zc \/ 100, pt.tal \/ 100];\n                row.getCell(1).font = { bold: true };\n                row.getCell(1).fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FFF0F0F0' } };\n                [2, 3].forEach(col => { row.getCell(col).numFmt = '0.0000%'; });\n            });\n            ws.getColumn(1).width = 15;\n            ws.getColumn(2).width = 20;\n            ws.getColumn(3).width = 25;\n        }\n\n        const buffer = await wb.xlsx.writeBuffer();\n        saveAs(new Blob([buffer]), `UMOA_Courbes_Taux_${formattedDate.replace(\/\\\/\/g, '-')}.xlsx`);\n    }\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       SECTION 1 \u2014 COURBE DES TAUX\n    \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    function buildCountryTabs() {\n        const container = $('#countryTabs');\n        container.innerHTML = '';\n        COUNTRIES.forEach(country => {\n            const tab = document.createElement('div');\n            tab.className = 'country-tab';\n            tab.dataset.country = country;\n            tab.textContent = country.charAt(0) + country.slice(1).toLowerCase();\n            tab.addEventListener('click', () => {\n                const wasActive = tab.classList.contains('active');\n                $$('.country-tab').forEach(t => t.classList.remove('active'));\n                if (!wasActive) tab.classList.add('active');\n                updateChart();\n            });\n            container.appendChild(tab);\n        });\n    }\n\n    function getSelectedCountry() {\n        const active = root.querySelector('.country-tab.active');\n        return active ? active.dataset.country : null;\n    }\n\n    function updateChartSummary(selectedData, country) {\n        const banner = $('#chartSummaryBanner');\n        if (!selectedData || !country) { banner.style.display = 'none'; return; }\n        $('#summaryDate').textContent = formatDateLong(selectedData.date);\n        const sc = $('#summaryCountries');\n        sc.innerHTML = '';\n        const tag = document.createElement('span');\n        tag.className = 'country-tag';\n        tag.textContent = country.charAt(0) + country.slice(1).toLowerCase();\n        sc.appendChild(tag);\n        banner.style.display = 'flex';\n    }\n\n    function getCourbeFilteredData() {\n        if (!flatpickrInstance) return [...allData];\n        const sd = flatpickrInstance.selectedDates;\n        if (sd.length === 0) return [...allData];\n        if (sd.length === 1) return allData.filter(item => item.date.toDateString() === sd[0].toDateString());\n        return allData.filter(item => item.date >= sd[0] && item.date <= sd[1]);\n    }\n\n    function updateFilesListTitle(filteredData) {\n        const title = $('#filesListTitle');\n        if (filteredData.length === 0) { title.textContent = \"No data available\"; return; }\n        if (flatpickrInstance && flatpickrInstance.selectedDates.length > 0) {\n            const sd = flatpickrInstance.selectedDates;\n            if (sd.length === 1) title.textContent = \"Data of %s\".replace('%s', formatDate(sd[0]));\n            else if (sd.length === 2) title.textContent = \"Data from %1$s to %2$s\".replace('%1$s', formatDate(sd[0])).replace('%2$s', formatDate(sd[1]));\n        } else {\n            title.textContent = \"All available data\";\n        }\n    }\n\n    function updateFilesList() {\n        const filesList = $('#filesList');\n        const filteredData = getCourbeFilteredData();\n        updateFilesListTitle(filteredData);\n        if (filteredData.length === 0) {\n            filesList.innerHTML = '<div class=\"no-files\">' + \"No data found for this selection\" + '<\/div>';\n            return;\n        }\n        filesList.innerHTML = '';\n        filteredData.forEach((item, index) => {\n            const div = document.createElement('div');\n            div.className = 'file-item';\n            div.innerHTML = `\n                <input type=\"radio\" id=\"data-${index}\" name=\"selectedData\" value=\"${index}\">\n                <label for=\"data-${index}\">\n                    <span class=\"file-name\">YIELD CURVES<\/span>\n                    <span class=\"file-date\">\ud83d\udcc5 ${formatDate(item.date)}<\/span>\n                <\/label>`;\n            filesList.appendChild(div);\n        });\n        filesList.querySelectorAll('input[type=\"radio\"]').forEach(radio => {\n            radio.addEventListener('change', e => {\n                if (e.target.checked) {\n                    const selectedData = filteredData[parseInt(e.target.value)];\n                    $('#selectedFileInfo').textContent = \"\\ud83d\\udcc8 Yield Curves \\u2014 %s\".replace('%s', formatDate(selectedData.date));\n                    $('#downloadExcelBtnCourbe').style.display = 'block';\n                    updateChart();\n                }\n            });\n        });\n    }\n\n    function updateChart() {\n        const selectedDataRadio = root.querySelector('input[name=\"selectedData\"]:checked');\n        if (!selectedDataRadio) return;\n        const filteredData = getCourbeFilteredData();\n        const selectedData = filteredData[parseInt(selectedDataRadio.value)];\n        if (!selectedData) return;\n\n        let selectedCountry = getSelectedCountry();\n        if (!selectedCountry) {\n            const firstTab = root.querySelector('.country-tab');\n            if (firstTab) { firstTab.classList.add('active'); selectedCountry = firstTab.dataset.country; }\n            else return;\n        }\n\n        const canvas = $('#evolutionChart');\n        const chartInfoBlock = $('#chartInfoBlock');\n        updateChartSummary(selectedData, selectedCountry);\n\n        if (!selectedCountry) {\n            if (evolutionChart) { evolutionChart.destroy(); evolutionChart = null; }\n            canvas.style.display = 'none';\n            chartInfoBlock.style.display = 'flex';\n            return;\n        }\n\n        chartInfoBlock.style.display = 'none';\n        canvas.style.display = 'block';\n\n        const countryData = selectedData.post_datas.find(pd => pd.nom_pays === selectedCountry);\n        if (!countryData || !countryData.datas || countryData.datas.length === 0) return;\n\n        const labels = countryData.datas.map(d => d.maturite);\n        const zeroCouponRates = countryData.datas.map(d => parseFloat(d.zero_coupon) || 0);\n        const tauxApresRates = countryData.datas.map(d => parseFloat(d.taux_apres_lissage) || 0);\n\n        const ctx = canvas.getContext('2d');\n        if (evolutionChart) evolutionChart.destroy();\n        evolutionChart = new Chart(ctx, {\n            type: 'line',\n            data: {\n                labels,\n                datasets: [\n                    {\n                        label: \"Zero Coupon\", data: zeroCouponRates,\n                        borderColor: COLOR_ZERO_COUPON, backgroundColor: COLOR_ZERO_COUPON + '30',\n                        borderWidth: 2, borderDash: [8, 4], tension: 0.4, fill: false, pointRadius: 4, pointHoverRadius: 6\n                    },\n                    {\n                        label: \"Rate After Smoothing\", data: tauxApresRates,\n                        borderColor: COLOR_TAUX_APRES_LISSAGE, backgroundColor: COLOR_TAUX_APRES_LISSAGE + '30',\n                        borderWidth: 3, tension: 0.4, fill: false, pointRadius: 4, pointHoverRadius: 6\n                    }\n                ]\n            },\n            options: {\n                responsive: true, maintainAspectRatio: false,\n                plugins: {\n                    title: { display: false },\n                    legend: { display: true, position: 'top', labels: { usePointStyle: true, padding: 18, font: { size: 12, weight: '500' } } },\n                    tooltip: { backgroundColor: 'rgba(0,0,0,0.8)', padding: 11, titleFont: { size: 13, weight: 'bold' }, bodyFont: { size: 12 }, cornerRadius: 8 }\n                },\n                scales: {\n                    x: { title: { display: true, text: \"Maturity\", font: { size: 13, weight: 'bold' }, color: '#333' }, grid: { color: 'rgba(0,0,0,0.04)' } },\n                    y: { title: { display: true, text: \"Rate (%)\", font: { size: 13, weight: 'bold' }, color: '#333' }, grid: { color: 'rgba(0,0,0,0.04)' } }\n                },\n                interaction: { intersect: false, mode: 'index' }\n            }\n        });\n    }\n\n    \/\/ Bouton de t\u00e9l\u00e9chargement Excel Section 1\n    $('#downloadExcelBtnCourbe').addEventListener('click', async () => {\n        const selectedDataRadio = root.querySelector('input[name=\"selectedData\"]:checked');\n        if (!selectedDataRadio) { alert(\"Please select a yield curve\"); return; }\n        const filteredData = getCourbeFilteredData();\n        const selectedData = filteredData[parseInt(selectedDataRadio.value)];\n        if (!selectedData) { alert(\"Data not found\"); return; }\n        const btn = $('#downloadExcelBtnCourbe');\n        const orig = btn.textContent;\n        btn.textContent = \"\\u23f3 Generating\\u2026\";\n        btn.disabled = true;\n        try {\n            await buildAndDownloadExcel(selectedData);\n            showToast(\"\\u2705 Excel report downloaded\", 'success');\n        } catch (e) {\n            console.error(e);\n            showToast(\"\\u274c Error while generating\", 'error');\n        } finally {\n            btn.textContent = orig;\n            btn.disabled = false;\n        }\n    });\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       SECTION 2 \u2014 HISTORIQUE\n    \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    function xlsIcon() {\n        return `<svg width=\"26\" height=\"26\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n            <rect x=\"5\" y=\"3\" width=\"22\" height=\"30\" rx=\"2.5\" fill=\"rgba(255,255,255,0.15)\" stroke=\"rgba(255,255,255,0.7)\" stroke-width=\"1.3\"\/>\n            <path d=\"M23 3 L27 7 L23 7 Z\" fill=\"rgba(255,255,255,0.4)\"\/>\n            <rect x=\"5\" y=\"20\" width=\"22\" height=\"13\" fill=\"rgba(30,160,60,0.6)\"\/>\n            <line x1=\"5\" y1=\"13\" x2=\"27\" y2=\"13\" stroke=\"rgba(255,255,255,0.25)\" stroke-width=\"1\"\/>\n            <line x1=\"5\" y1=\"20\" x2=\"27\" y2=\"20\" stroke=\"rgba(255,255,255,0.25)\" stroke-width=\"1\"\/>\n            <text x=\"8\" y=\"31\" font-family=\"'Segoe UI',sans-serif\" font-size=\"8.5\" font-weight=\"700\" fill=\"white\" letter-spacing=\"0.3\">XLS<\/text>\n        <\/svg>`;\n    }\n\n    function dlIcon() {\n        return `<svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" viewBox=\"0 0 24 24\">\n            <path d=\"M12 3v13M7 11l5 5 5-5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\n            <path d=\"M5 21h14\" stroke-linecap=\"round\"\/>\n        <\/svg>`;\n    }\n\n    function renderHistCards(items, append = false) {\n        const grid = $('#histGrid');\n        if (!append) {\n            grid.innerHTML = '';\n            histShown = 0;\n        }\n\n        const btnLoad = $('#btnLoad');\n\n        if (items.length === 0 && !append) {\n            grid.innerHTML = `<div class=\"hist-empty\">\n                <svg width=\"40\" height=\"40\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\" viewBox=\"0 0 24 24\">\n                    <circle cx=\"11\" cy=\"11\" r=\"8\"\/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"\/>\n                <\/svg>\n                <p>No results found<\/p>\n            <\/div>`;\n            btnLoad.style.display = 'none';\n            return;\n        }\n\n        items.forEach((item, idx) => {\n            const card = document.createElement('div');\n            card.className = 'hist-card';\n            card.style.animationDelay = `${(idx % HIST_PAGE) * 30}ms`;\n            card.innerHTML = `\n                <div class=\"card-icon\">${xlsIcon()}<\/div>\n                <div class=\"card-body\">\n                    <div class=\"card-title\">Yield curves<\/div>\n                    <div class=\"card-date\">${\"as of %s\".replace('%s', formatDate(item.date))}<\/div>\n                <\/div>\n                <button class=\"card-dl\" title=\"Download the Excel report\">${dlIcon()}<\/button>\n            `;\n\n            const dlBtn = card.querySelector('.card-dl');\n            dlBtn.addEventListener('click', async () => {\n                if (!item.post_datas || item.post_datas.length === 0) {\n                    showToast(\"\\u274c No data available\", 'error');\n                    return;\n                }\n                dlBtn.innerHTML = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" stroke-width=\"2.5\"><circle cx=\"12\" cy=\"12\" r=\"9\" stroke-dasharray=\"28 56\" stroke-linecap=\"round\" style=\"animation:umoa-spin 0.8s linear infinite;transform-origin:center\"\/><\/svg>`;\n                dlBtn.disabled = true;\n                try {\n                    await buildAndDownloadExcel(item);\n                    showToast(\"\\u2705 Excel report downloaded\", 'success');\n                } catch (e) {\n                    console.error(e);\n                    showToast(\"\\u274c Error while generating\", 'error');\n                } finally {\n                    dlBtn.innerHTML = dlIcon();\n                    dlBtn.disabled = false;\n                }\n            });\n\n            grid.appendChild(card);\n        });\n\n        histShown = grid.querySelectorAll('.hist-card').length;\n        $('#countShown').textContent = histShown;\n        btnLoad.style.display = histShown >= histFiltered.length ? 'none' : 'flex';\n        btnLoad.disabled = false;\n    }\n\n    function applyHistFilters() {\n        const q = $('#searchInput').value.toLowerCase().trim();\n        const yr = $('#yearSelect').value;\n\n        histFiltered = allData.filter(item => {\n            const yearMatch = !yr || String(item.date.getFullYear()) === yr;\n            const dateStr = formatDate(item.date).toLowerCase();\n            const qMatch = !q || dateStr.includes(q) || item.titre.toLowerCase().includes(q);\n            return yearMatch && qMatch;\n        });\n\n        $('#countTotal').textContent = histFiltered.length;\n        $('#filterStatus').textContent = q ? \"Filter: \\\"%s\\\"\".replace('%s', q) : '';\n        histShown = 0;\n        renderHistCards(histFiltered.slice(0, HIST_PAGE));\n        histShown = Math.min(HIST_PAGE, histFiltered.length);\n        $('#countShown').textContent = histShown;\n    }\n\n    $('#searchInput').addEventListener('input', applyHistFilters);\n    $('#yearSelect').addEventListener('change', applyHistFilters);\n    $('#btnLoad').addEventListener('click', () => {\n        const next = histFiltered.slice(histShown, histShown + HIST_PAGE);\n        renderHistCards(next, true);\n    });\n\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       CHARGEMENT DES DONN\u00c9ES (fetch unique pour les deux sections)\n    \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    async function loadData() {\n        const status = $('#loadingStatus');\n        try {\n            status.textContent = \"Please wait\\u2026\";\n            const response = await fetch('https:\/\/umoatitres.com\/wp-json\/courbe-de-taux\/v1\/data');\n            if (!response.ok) throw new Error(`HTTP ${response.status}`);\n            status.textContent = \"Almost there\\u2026\";\n            const raw = await response.json();\n\n            allData = raw.map(item => ({\n                id: item.id,\n                titre: item.titre,\n                date: new Date(item.date),\n                post_datas: (item.post_datas || []).map(cd => ({\n                    nom_pays: normalizeCountry(cd.nom_pays),\n                    datas: cd.datas || []\n                }))\n            }));\n            allData.sort((a, b) => b.date - a.date);\n\n        } catch (error) {\n            console.warn('API error, using fake data:', error);\n            loadFakeData();\n        }\n\n        \/\/ Affichage de l'app et initialisation des deux sections\n        $('#loadingScreen').style.display = 'none';\n        $('#appContent').style.display = 'block';\n        initSection1();\n        initSection2();\n    }\n\n    function loadFakeData() {\n        const maturites = ['3M', '6M', '1A', '2A', '3A', '5A', '7A', '10A', '15A', '20A'];\n        function fakeCountryData() {\n            return COUNTRIES.map(nom_pays => ({\n                nom_pays,\n                datas: maturites.map(m => ({\n                    maturite: m,\n                    zero_coupon: (5 + Math.random() * 5).toFixed(4),\n                    taux_apres_lissage: (5 + Math.random() * 5).toFixed(4),\n                }))\n            }));\n        }\n        const base = new Date(2026, 2, 6);\n        allData = Array.from({ length: 40 }, (_, i) => {\n            const d = new Date(base);\n            d.setDate(base.getDate() - i * 7);\n            return {\n                id: i + 1,\n                titre: `COURBES DE TAUX au ${formatDate(d)}`,\n                date: d,\n                post_datas: fakeCountryData()\n            };\n        });\n        allData.sort((a, b) => b.date - a.date);\n    }\n\n    function initSection1() {\n        buildCountryTabs();\n        const today = new Date();\n        today.setHours(23, 59, 59, 999);\n        flatpickrInstance = flatpickr($('#datePicker'), {\n            mode: 'range',\n            dateFormat: 'd-m-Y',\n            locale: 'fr',\n            maxDate: today,\n            onChange: () => updateFilesList()\n        });\n        updateFilesList();\n    }\n\n    function initSection2() {\n        populateYearSelect();\n        applyHistFilters();\n    }\n\n    \/\/ \u2500\u2500\u2500 D\u00e9marrage : on attend que les libs externes soient pr\u00eates \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    function waitForLibs(callback) {\n        if (typeof Chart !== 'undefined' &&\n            typeof ExcelJS !== 'undefined' &&\n            typeof saveAs !== 'undefined' &&\n            typeof flatpickr !== 'undefined') {\n            callback();\n        } else {\n            setTimeout(() => waitForLibs(callback), 100);\n        }\n    }\n\n    waitForLibs(loadData);\n\n})();\n<\/script>\n\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-94085","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Yield Curves | UMOA-Titres<\/title>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Yield Curves | UMOA-Titres\" \/>\n<meta property=\"og:url\" content=\"https:\/\/umoatitres.com\/en\/yield-curves\/\" \/>\n<meta property=\"og:site_name\" content=\"UMOA-Titres\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-21T12:18:28+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/umoatitres.com\\\/en\\\/yield-curves\\\/\",\"url\":\"https:\\\/\\\/umoatitres.com\\\/en\\\/yield-curves\\\/\",\"name\":\"Yield Curves | UMOA-Titres\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/umoatitres.com\\\/en\\\/#website\"},\"datePublished\":\"2025-11-24T19:09:03+00:00\",\"dateModified\":\"2026-07-21T12:18:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/umoatitres.com\\\/en\\\/yield-curves\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/umoatitres.com\\\/en\\\/yield-curves\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/umoatitres.com\\\/en\\\/yield-curves\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/umoatitres.com\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Yield Curves\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/umoatitres.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/umoatitres.com\\\/en\\\/\",\"name\":\"UMOA-Titres\",\"description\":\"UMOA-Titres - Agence r\u00e9gionale d&#039;appui \u00e0 l&#039;\u00e9mission et \u00e0 la gestion des titres publics dans l&#039;UMOA\",\"publisher\":{\"@id\":\"https:\\\/\\\/umoatitres.com\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/umoatitres.com\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/umoatitres.com\\\/en\\\/#organization\",\"name\":\"UMOA-Titres\",\"url\":\"https:\\\/\\\/umoatitres.com\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/umoatitres.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/umoatitres.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/cropped-UMOA-Titre.png\",\"contentUrl\":\"https:\\\/\\\/umoatitres.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/cropped-UMOA-Titre.png\",\"width\":623,\"height\":183,\"caption\":\"UMOA-Titres\"},\"image\":{\"@id\":\"https:\\\/\\\/umoatitres.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Yield Curves | UMOA-Titres","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"Yield Curves | UMOA-Titres","og_url":"https:\/\/umoatitres.com\/en\/yield-curves\/","og_site_name":"UMOA-Titres","article_modified_time":"2026-07-21T12:18:28+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/umoatitres.com\/en\/yield-curves\/","url":"https:\/\/umoatitres.com\/en\/yield-curves\/","name":"Yield Curves | UMOA-Titres","isPartOf":{"@id":"https:\/\/umoatitres.com\/en\/#website"},"datePublished":"2025-11-24T19:09:03+00:00","dateModified":"2026-07-21T12:18:28+00:00","breadcrumb":{"@id":"https:\/\/umoatitres.com\/en\/yield-curves\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/umoatitres.com\/en\/yield-curves\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/umoatitres.com\/en\/yield-curves\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/umoatitres.com\/en\/"},{"@type":"ListItem","position":2,"name":"Yield Curves"}]},{"@type":"WebSite","@id":"https:\/\/umoatitres.com\/en\/#website","url":"https:\/\/umoatitres.com\/en\/","name":"UMOA-Titres","description":"UMOA-Titres - Agence r\u00e9gionale d&#039;appui \u00e0 l&#039;\u00e9mission et \u00e0 la gestion des titres publics dans l&#039;UMOA","publisher":{"@id":"https:\/\/umoatitres.com\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/umoatitres.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/umoatitres.com\/en\/#organization","name":"UMOA-Titres","url":"https:\/\/umoatitres.com\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/umoatitres.com\/en\/#\/schema\/logo\/image\/","url":"https:\/\/umoatitres.com\/wp-content\/uploads\/2025\/10\/cropped-UMOA-Titre.png","contentUrl":"https:\/\/umoatitres.com\/wp-content\/uploads\/2025\/10\/cropped-UMOA-Titre.png","width":623,"height":183,"caption":"UMOA-Titres"},"image":{"@id":"https:\/\/umoatitres.com\/en\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/umoatitres.com\/en\/wp-json\/wp\/v2\/pages\/94085","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umoatitres.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/umoatitres.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/umoatitres.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/umoatitres.com\/en\/wp-json\/wp\/v2\/comments?post=94085"}],"version-history":[{"count":0,"href":"https:\/\/umoatitres.com\/en\/wp-json\/wp\/v2\/pages\/94085\/revisions"}],"wp:attachment":[{"href":"https:\/\/umoatitres.com\/en\/wp-json\/wp\/v2\/media?parent=94085"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}