{"id":447,"date":"2025-09-11T07:39:01","date_gmt":"2025-09-11T05:39:01","guid":{"rendered":"https:\/\/huguesg.fr\/site\/?p=447"},"modified":"2025-09-11T07:39:01","modified_gmt":"2025-09-11T05:39:01","slug":"ambition-france-transport","status":"publish","type":"post","link":"https:\/\/huguesg.fr\/site\/index.php\/2025\/09\/11\/ambition-france-transport\/","title":{"rendered":"Ambition France Transport"},"content":{"rendered":"\n<p>Le 9 juillet 2025, Dominique Bussereau, pr\u00e9sident de la conf\u00e9rence intitul\u00e9e Ambition France Transports, a remis au ministre des transports le rapport issu des travaux des membres de cette conf\u00e9rence. Cet article reprend les principales propositions de ce rapport, en tentant de les mettre en rapport avec les flux existants.<\/p>\n\n\n\n<p>Cette conf\u00e9rence \u00e9tait organis\u00e9e en 4 groupes de travail :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Le mod\u00e8le \u00e9conomique des Autorit\u00e9s Organisatrices de la Mobilit\u00e9 (AOM) et des Services Express R\u00e9gionaux M\u00e9tropolitains (SERM)<\/li>\n\n\n\n<li>L&#8217;avenir des infrastructures routi\u00e8res<\/li>\n\n\n\n<li>Les infrastructures et services ferroviaires de voyageurs<\/li>\n\n\n\n<li>Le report modal et le transport de marchandises<\/li>\n<\/ul>\n\n\n\n<p>Chaque groupe \u00e9tait copr\u00e9sid\u00e9 par un bin\u00f4me parlementaire\/sp\u00e9cialiste du secteur, et regroupait une quinzaine de participants (repr\u00e9sentants d&#8217;entreprises, de f\u00e9d\u00e9rations, \u00e9lus, &#8230;).<\/p>\n\n\n\n<p>Organis\u00e9e sur 2 mois, chaque groupe de travail s&#8217;est r\u00e9uni \u00e0 5 reprises, et un comit\u00e9 de pilotage transverse aux 4 groupes se r\u00e9unissait \u00e9galement r\u00e9guli\u00e8rement pour coordonner les travaux, qui ont \u00e9galement \u00e9t\u00e9 enrichis par de nombreux &#8220;cahiers d&#8217;acteurs&#8221; d\u00e9pos\u00e9s par des entreprises ou des experts.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1) 3Md\u20ac d&#8217;investissements suppl\u00e9mentaires pour les infrastructures de transport<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.1) 26.8Md\u20ac de d\u00e9penses actuelles<\/h3>\n\n\n\n<p>Aujourd&#8217;hui, un total de 26.8Md\u20ac\/an sont investis par la puissance publique (nationale, mais aussi locale) sur les infrastructures de transport en France. La r\u00e9partition par mode est accessible dans le bilan annuel des transports et est repris dans la figure ci-dessous.<\/p>\n\n\n\n<script src=\"https:\/\/www.gstatic.com\/charts\/loader.js\"><\/script>\n\n  <style>\n    #chartAftInvestMode { max-width: 900px; height: 520px; margin: 0 auto; }\n    .noteAftInvestMode { color:#555; margin-bottom: 12px; }\n  <\/style>\n\n  <div id=\"chartAftInvestMode\"><\/div>\n\n  <script>\n    \/\/ ========= CONFIG =========\n    const DATA_URL_AftInvestMode = 'https:\/\/huguesg.fr\/docs\/aft-invest-mode.csv'; \/\/\n\n    \/\/ ========= UTILS =========\n    const parseNumberFR_AftInvestMode = (s) =>\n      parseFloat(String(s).trim().replace(\/\\s\/g, '').replace(',', '.'));\n\n    function autoSplitLine_AftInvestMode(line) {\n      for (const sep of ['\\t', ';', ',']) {\n        const parts = line.split(sep);\n        if (parts.length >= 2) return [parts[0], parts.slice(1).join(sep)];\n      }\n      return [line, null];\n    }\n\n\nasync function fetchCSV_AftInvestMode(url) {\n  \/\/ Important pour WP (pr\u00e9visualisation) : expliciter CORS et d\u00e9coder proprement les accents\n  const resp = await fetch(url, { cache: 'no-cache', mode: 'cors', credentials: 'omit' });\n  const buf = await resp.arrayBuffer();\n\n  \/\/ 1) tentative UTF-8 (standard)\n  let text = new TextDecoder('utf-8', { fatal: false }).decode(buf);\n\n  \/\/ 2) si des \ufffd (U+FFFD) apparaissent, on essaie Windows-1252 (CSV encod\u00e9s en ANSI)\n  if ((text.match(\/\\uFFFD\/g) || []).length > 0) {\n    try { text = new TextDecoder('windows-1252').decode(buf); } catch (_) {}\n  }\n  return text;\n}\n  \n\nfunction parseCSVToRows_AftInvestMode(text) {\n      const rows = [];\n      const cleaned = text.split(\/\\r?\\n\/)\n        .map(l => l.trim())\n        .filter(l => l.length > 0);\n\n      let start = 1;\n      if (\/^\\d{4}$\/.test(cleaned[0])) start = 1;\n\n      for (let i = start; i < cleaned.length; i++) {\n        const [label, raw] = autoSplitLine_AftInvestMode(cleaned[i]);\n        if (!raw) continue;\n        const value = parseNumberFR_AftInvestMode(raw);\n        if (isFinite(value)) rows.push([label.trim(), value]);\n      }\n      return rows;\n    }\n\n    function buildDataTable_AftInvestMode(rows) {\n      const total = rows.reduce((a, r) => a + r[1], 0);\n\n      const data = new google.visualization.DataTable();\n      data.addColumn('string', 'Mode (valeur \u2013 %)');\n      data.addColumn('number', 'Valeur');\n      data.addColumn({ type: 'string', role: 'tooltip', p: { html: true } });\n\n      const nf = new Intl.NumberFormat('fr-FR', { maximumFractionDigits: 1 });\n      const nfVal = new Intl.NumberFormat('fr-FR', { maximumFractionDigits: 2 });\n\n      const rowsWithLabels = rows.map(([label, val]) => {\n        const pct = total > 0 ? (val \/ total) * 100 : 0;\n        const labelInSlice = `${label} (${nfVal.format(val)} Md\u20ac\u2013 ${nf.format(pct)} %)`;\n\n        const tooltip =\n          `<div style=\"padding:8px 10px\">\n             <div style=\"font-weight:600\">${label}<\/div>\n             <div>Valeur&nbsp;: ${nfVal.format(val)} Md\u20ac<\/div>\n             <div>Part&nbsp;: ${nf.format(pct)}&nbsp;%<\/div>\n           <\/div>`;\n\n        return [labelInSlice, val, tooltip];\n      });\n\n      data.addRows(rowsWithLabels);\n      return { data, total };\n    }\n\n    function drawPie_AftInvestMode(dataTable) {\n      const options = {\n        chartArea: { left: 10, top: 10, width: '90%', height: '90%' },\n        legend: { position: 'right', alignment: 'center' },\n        tooltip: { isHtml: true, textStyle: { fontSize: 12 } },\n        pieSliceText: 'label',\n        pieSliceTextStyle: { fontSize: 8 },\n        sliceVisibilityThreshold: 0,\n      };\n\n      const chart = new google.visualization.PieChart(\n        document.getElementById('chartAftInvestMode')\n      );\n      chart.draw(dataTable, options);\n      window.addEventListener('resize', () => chart.draw(dataTable, options));\n    }\n\n    \/\/ ========= MAIN =========\n    google.charts.load('current', { packages: ['corechart'] });\n    google.charts.setOnLoadCallback(async () => {\n      try {\n        const csvText = await fetchCSV_AftInvestMode(DATA_URL_AftInvestMode);\n        const rows = parseCSVToRows_AftInvestMode(csvText);\n        const { data } = buildDataTable_AftInvestMode(rows);\n        drawPie_AftInvestMode(data);\n      } catch (e) {\n        document.getElementById('chartAftInvestMode').innerHTML =\n          '<p style=\"color:#b00\">Impossible de charger les donn\u00e9es. V\u00e9rifiez le chemin du fichier et les autorisations CORS.<\/p>';\n        console.error(e);\n      }\n    });\n  <\/script>\n\n\n\n<h3 class=\"wp-block-heading\">1.2) 1.5Md\u20ac\/an de plus pour le ferroviaire<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1.2.1) Investissement port\u00e9 sur le r\u00e9seau structurant<\/h4>\n\n\n\n<p>Les d\u00e9penses actuelles d&#8217;investissement pour le ferroviaire en termes de renouvellement du r\u00e9seau s&#8217;\u00e9l\u00e8vent \u00e0 3.100Md\u20ac\/an. Ces d\u00e9penses sont aujourd&#8217;hui port\u00e9es par SNCF R\u00e9seau, l&#8217;entreprise \u00e9tant elle-m\u00eame financ\u00e9e par les p\u00e9ages des entreprises ferroviaires et de l&#8217;\u00e9tat, ainsi que par le fonds de concours (c&#8217;est \u00e0 dire des dividendes du groupe SNCF que l&#8217;Etat a choisi d&#8217;affecter \u00e0 SNCF R\u00e9seau).<\/p>\n\n\n\n<p>Le rapport envisage alors 3 options d&#8217;investissement, inspir\u00e9es du rapport de l&#8217;ART sur les sc\u00e9narios d&#8217;investissement \u00e0 long terme publi\u00e9 en 2023 :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Augmentation de l&#8217;investissement de +1.9Md\u20ac(2028) : augmentation du trafic sur le r\u00e9seau de 36%, sans faire aucun autre investissement (SERM ou grands projets LGV) <\/li>\n\n\n\n<li>Augmentation de l&#8217;investissement de +1.5Md\u20ac(2028) : sc\u00e9nario retenu par la conf\u00e9rence<\/li>\n\n\n\n<li>Pas d&#8217;augmentation de l&#8217;investissement : baisse de 25% des trafics sur le r\u00e9seau<\/li>\n<\/ul>\n\n\n\n<p>Le rapport pr\u00e9conise donc d&#8217;augmenter les investissements de +1.5Md\u20ac(2028) sur la p\u00e9riode 2026-2031, soit +1.1Md\u20ac(2025).<\/p>\n\n\n\n<script src=\"https:\/\/www.gstatic.com\/charts\/loader.js\"><\/script>\n<style>\n  #chart-renouv { height: 520px; max-width: 1100px; margin: 24px auto; }\n<\/style>\n<div id=\"chart-renouv\"><\/div>\n\n<script>\n  \/\/ ========= CONFIG =========\n  const DATA_URL_renouv = 'https:\/\/huguesg.fr\/docs\/cfl-reseau.csv'; \/\/ <-- remplacez par l\u2019URL r\u00e9el\n  const CUT_YEAR_renouv = 2024;       \/\/ jusqu\u2019\u00e0 cette ann\u00e9e = valeurs du fichier\n  const EXTEND_TO_renouv = 2033;      \/\/ prolongement inclus\n  const EXTENDED_VAL_renouv = 4200;   \/\/ valeur arbitraire pour 2025\u20132033\n\n  \/\/ ========= UTILS =========\n  const parseNumberFR_renouv = (s) =>\n    parseFloat(String(s ?? '').replace(\/\\u00A0\/g,' ').trim().replace(\/\\s\/g,'').replace(',', '.'));\n\n  const normalize_renouv = (s) =>\n    String(s || '')\n      .normalize('NFD').replace(\/[\\u0300-\\u036f]\/g, '') \/\/ enl\u00e8ve accents\n      .replace(\/\\s+\/g, ' ').trim().toLowerCase();\n\n  function detectSep_renouv(line) {\n    let best = ';', bestCount = 1;\n    for (const sep of ['\\t','; ',',']) {\n      const n = line.split(sep).length;\n      if (n > bestCount) { best = sep; bestCount = n; }\n    }\n    return best;\n  }\n\n  async function fetchCSV_renouv(url) {\n    const resp = await fetch(url, { cache: 'no-cache', mode: 'cors' });\n    if (!resp.ok) throw new Error('HTTP ' + resp.status);\n    const buf = await resp.arrayBuffer();\n    \/\/ UTF-8 d\u2019abord, fallback Windows-1252 si besoin (accents)\n    let text = new TextDecoder('utf-8', { fatal: false }).decode(buf);\n    if (text.includes('\\uFFFD')) {\n      try { text = new TextDecoder('windows-1252').decode(buf); } catch {}\n    }\n    return text.replace(\/^\\uFEFF\/, '');\n  }\n\n  function parseCSV_renouv(text) {\n    const lines = text.split(\/\\r?\\n\/).filter(l => l.trim().length > 0);\n    if (!lines.length) return { headers: [], rows: [] };\n    const sep = detectSep_renouv(lines[0]);\n    const split = l => l.split(sep).map(x => x.trim());\n\n    const headers = split(lines[0]);\n    const rows = lines.slice(1).map(split);\n    return { headers, rows };\n  }\n\n  \/\/ extrait la s\u00e9rie \"Investissements renouvellement et performance\"\n  function extractSeries_renouv(headers, rows) {\n    \/\/ trouver colonne ann\u00e9e\n    let idxYear = headers.findIndex(h => \/^annee$\/.test(normalize_renouv(h)));\n    if (idxYear === -1) idxYear = 0; \/\/ fallback : premi\u00e8re colonne\n\n    \/\/ trouver la colonne cible (tol\u00e9rant aux variations d\u2019accents\/casse\/espaces)\n    const targetName = 'investissements renouvellement et performance';\n    const idxRenouv = headers.findIndex(h => normalize_renouv(h) === targetName);\n    if (idxRenouv === -1) return new Map();\n\n    const byYear = new Map();\n    rows.forEach(r => {\n      const y = parseInt(String(r[idxYear]).replace(\/\\D\/g,''), 10);\n      if (!Number.isFinite(y)) return;\n      const v = parseNumberFR_renouv(r[idxRenouv]);\n      if (Number.isFinite(v)) byYear.set(y, v);\n    });\n\n    \/\/ prolonger au-del\u00e0 de CUT_YEAR_renouv\n    for (let y = CUT_YEAR_renouv + 1; y <= EXTEND_TO_renouv; y++) {\n      byYear.set(y, EXTENDED_VAL_renouv);\n    }\n    return byYear;\n  }\n\n  function buildDataTable_renouv(byYear) {\n    const data = new google.visualization.DataTable();\n    data.addColumn('string', 'Ann\u00e9e');\n    data.addColumn('number', 'Financement r\u00e9alis\u00e9');\n    data.addColumn({ type: 'string', role: 'annotation' });\n    data.addColumn('number', 'Besoins estim\u00e9s');\n    data.addColumn({ type: 'string', role: 'annotation' });\n\n    const years = Array.from(byYear.keys()).sort((a,b)=>a-b);\n    years.forEach(y => {\n      const val = byYear.get(y);\n      if (y <= CUT_YEAR_renouv) {\n        data.addRow([String(y), val, String(val), null, null]);\n      } else {\n        data.addRow([String(y), null, null, val, String(val)]);\n      }\n    });\n\n    \/\/ format FR sans d\u00e9cimales\n    const nf = new google.visualization.NumberFormat({ groupingSymbol: ' ', decimalSymbol: ',', fractionDigits: 0 });\n    nf.format(data, 1);\n    nf.format(data, 3);\n\n    return data;\n  }\n\n  function drawLine_renouv(data) {\n    const options = {\n      legend: { position: 'top' },\n      chartArea: { left: 70, right: 30, top: 40, height: '70%' },\n      vAxis: { title: 'Montant (M\u20ac)', viewWindow: { min: 0 } },\n      hAxis: { title: 'Ann\u00e9e' },\n      lineWidth: 3,\n      pointSize: 6,\n      annotations: { alwaysOutside: true },\n      series: {\n        0: { color: '#1f77b4' }, \/\/ bleu plus fonc\u00e9 (jusqu\u2019\u00e0 2024)\n        1: { color: '#6baed6' }  \/\/ bleu plus clair (2025\u20132033)\n      }\n    };\n    const chart = new google.visualization.LineChart(document.getElementById('chart-renouv'));\n    chart.draw(data, options);\n    window.addEventListener('resize', () => chart.draw(data, options));\n  }\n\n  \/\/ ========= MAIN =========\n  google.charts.load('current', { packages: ['corechart'] });\n  google.charts.setOnLoadCallback(async () => {\n    try {\n      const csv = await fetchCSV_renouv(DATA_URL_renouv);\n      const parsed = parseCSV_renouv(csv);\n      const byYear = extractSeries_renouv(parsed.headers, parsed.rows);\n      const data = buildDataTable_renouv(byYear);\n      drawLine_renouv(data);\n    } catch (err) {\n      document.getElementById('chart-renouv').innerHTML =\n        '<p style=\"color:#b00\">Erreur de chargement\/parsing. V\u00e9rifiez l\u2019URL du CSV, le nom de colonne et CORS.<\/p>';\n      console.error(err);\n    }\n  });\n<\/script>\n\n\n\n\n<h4 class=\"wp-block-heading\">1.2.2) Financement restant \u00e0 trouver pour les Lignes de Desserte Fine du Territoire (LDFT)<\/h4>\n\n\n\n<p>Ces lignes se r\u00e9partissent en plusieurs cat\u00e9gories depuis le rapport Philizot :<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Cat\u00e9gorie de ligne<\/strong><\/td><td><strong>Mode de financement<\/strong><\/td><\/tr><tr><td>Lignes d&#8217;int\u00e9r\u00eat national<\/td><td>Int\u00e9gr\u00e9es au r\u00e9seau structurant en 2023, financ\u00e9es dans la cat\u00e9gorie \u00e9voqu\u00e9e pr\u00e9c\u00e9demment \u00e0 100% par SNCF R\u00e9seau<\/td><\/tr><tr><td>Lignes d&#8217;int\u00e9r\u00eat r\u00e9gional<\/td><td>Financ\u00e9es dans le cadre des CPER \u00e0 hauteur de 400M\u20ac (Etat + R\u00e9gions)<\/td><\/tr><tr><td>Lignes d&#8217;int\u00e9r\u00eat local ou r\u00e9gional<\/td><td>Besoin de financement estim\u00e9 \u00e0 600M\u20ac &#8211; Non couvert<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Pour cette derni\u00e8re cat\u00e9gorie de lignes, le rapport propose une &#8220;revue g\u00e9n\u00e9rale d&#8217;\u00e9tape&#8221;, dans la continuit\u00e9 des travaux du rapport de 2020.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1.2.3) Faire passer les grands projets au second plan<\/h4>\n\n\n\n<p>Aujourd&#8217;hui, environ 35% des investissements de SNCF R\u00e9seau sont consacr\u00e9s \u00e0 des projets de d\u00e9veloppement, qu&#8217;ils soient nationaux ou r\u00e9gionaux, pour des montants d&#8217;environ 2Mds\u20ac\/an. Les diff\u00e9rents rapports du COI laissent entrevoir des investissements suppl\u00e9mentaires dans la construction de nouvelles lignes entre 0 et +3Mds\u20ac\/an. <\/p>\n\n\n\n<script src=\"https:\/\/www.gstatic.com\/charts\/loader.js\"><\/script>\n  <style>\n    #chartAftInvestReseauDev { height: 560px; max-width: 1100px; margin: 0 auto; }\n  <\/style>\n  <div id=\"chartAftInvestReseauDev\"><\/div>\n  <script>\n    \/\/ ========= CONFIG =========\n    const DATA_URL_AftInvestReseauDev = 'https:\/\/huguesg.fr\/docs\/cfl-reseau.csv';\n\n    \/\/ ========= UTILITAIRES =========\n    const parseNumberFR_AftInvestReseauDev = (s) =>\n      parseFloat(String(s ?? '').trim().replace(\/\\s\/g, '').replace(',', '.'));\n\n    const splitSmart_AftInvestReseauDev = (line) => {\n      for (const sep of ['\\t', ';', ',']) {\n        const parts = line.split(sep);\n        if (parts.length > 1) return parts;\n      }\n      return [line];\n    };\n\n    const norm_AftInvestReseauDev = (s) => String(s || '')\n      .normalize('NFD').replace(\/[\\u0300-\\u036f]\/g, '')\n      .toLowerCase().replace(\/\\s+\/g, ' ').trim();\n\n    async function fetchCSV_AftInvestReseauDev(url) {\n      const resp = await fetch(url, { cache: 'no-cache' });\n      if (!resp.ok) throw new Error('HTTP ' + resp.status);\n      return await resp.text();\n    }\n\n    function parseCSV_AftInvestReseauDev(text) {\n      const rows = text.split(\/\\r?\\n\/).map(l => l.trim()).filter(Boolean).map(splitSmart_AftInvestReseauDev);\n      if (!rows.length) return { headers: [], rows: [] };\n      const headers = rows[0].map(h => h.trim());\n      const dataRows = rows.slice(1);\n      return { headers, rows: dataRows };\n    }\n\n    function buildDataTable_AftInvestReseauDev(headers, rows) {\n      const idxByName = {};\n\n      headers.forEach((h, i) => idxByName[norm_AftInvestReseauDev(h)] = i);\n      const key = (s) => idxByName[norm_AftInvestReseauDev(s)];\n\n      const idxYear = key('Annee');\n      const idxGP = key('Investissements Grands Projets de developpement');\n      const idxPR = key('Investissements Projets regionaux de developpement');\n      const idxConformite = key('Investissements Mise en conformite du reseau');\n      const idxRenouvPerf = key('Investissements renouvellement et performance');\n      const idxFoncAutres = key('Investissements Fonciers et autres');\n      const idxIndus = key('Investissements industriels');\n\n      if ([idxYear, idxGP, idxPR, idxConformite, idxRenouvPerf, idxFoncAutres, idxIndus]\n          .some(i => typeof i !== 'number')) {\n        throw new Error(\"Impossible de rep\u00e9rer toutes les colonnes d'investissements.\");\n      }\n\n      const data = new google.visualization.DataTable();\n      data.addColumn('string', 'Ann\u00e9e');\n      data.addColumn('number', 'Grands Projets');\n      data.addColumn('number', 'Grands Projets r\u00e9gionaux');\n      data.addColumn('number', 'Part des grands projets dans le total des investissements de SNCF R\u00e9seau');\n\n      rows.forEach(r => {\n        const year = String(r[idxYear]).trim();\n        if (!\/^\\d{4}$\/.test(year)) return;\n\n        const gp = parseNumberFR_AftInvestReseauDev(r[idxGP]);\n        const pr = parseNumberFR_AftInvestReseauDev(r[idxPR]);\n        const conformite = parseNumberFR_AftInvestReseauDev(r[idxConformite]);\n        const renouv = parseNumberFR_AftInvestReseauDev(r[idxRenouvPerf]);\n        const fonc = parseNumberFR_AftInvestReseauDev(r[idxFoncAutres]);\n        const indus = parseNumberFR_AftInvestReseauDev(r[idxIndus]);\n\n        if (![gp, pr, conformite, renouv, fonc, indus].every(Number.isFinite)) return;\n\n        const total = gp + pr + conformite + renouv + fonc + indus;\n        const ratio = total > 0 ? (gp + pr) \/ total : 0;\n\n        data.addRow([year, gp, pr, ratio]);\n      });\n\n      return data;\n    }\n\n    function drawChart_AftInvestReseauDev(data) {\n      const options = {\n        isStacked: true,\n        seriesType: 'bars',\n        series: {\n          0: { targetAxisIndex: 0 },\n          1: { targetAxisIndex: 0 },\n          2: { type: 'line', targetAxisIndex: 1 }\n        },\n        vAxes: {\n          0: { title: 'Montant (M\u20ac)', viewWindow: { min: 0 } },\n          1: { title: 'Part des grands projets dans les investissements de SNCF R\u00e9seau', format: 'percent', viewWindow: { min: 0, max: 1 } }\n        },\n        legend: { position: 'top' },\n        chartArea: { left: 70, right: 70, top: 50, height: '70%' },\n        tooltip: { isHtml: true }\n      };\n\n      const chart = new google.visualization.ComboChart(\n        document.getElementById('chartAftInvestReseauDev')\n      );\n      chart.draw(data, options);\n      window.addEventListener('resize', () => chart.draw(data, options));\n    }\n\n    \/\/ ======== MAIN ========\n    google.charts.load('current', { packages: ['corechart'] });\n    google.charts.setOnLoadCallback(async () => {\n      try {\n        const csv = await fetchCSV_AftInvestReseauDev(DATA_URL_AftInvestReseauDev);\n        const { headers, rows } = parseCSV_AftInvestReseauDev(csv);\n        const data = buildDataTable_AftInvestReseauDev(headers, rows);\n        drawChart_AftInvestReseauDev(data);\n      } catch (err) {\n        document.getElementById('chartAftInvestReseauDev').innerHTML =\n          '<p style=\"color:#b00\">Erreur lors du chargement ou du parsing des donn\u00e9es.<br>' +\n          'V\u00e9rifiez le chemin du fichier, les en-t\u00eates et les autorisations CORS.<\/p>';\n        console.error(err);\n      }\n    });\n  <\/script>\n\n\n\n<p>Le rapport pr\u00e9conise d\u00e8s lors de prioriser de mani\u00e8re transparente l&#8217;ensemble des investissements \u00e0 r\u00e9aliser par SNCF R\u00e9seau, d&#8217;o\u00f9 la proposition de d\u00e9veloppement d&#8217;un &#8220;ferroscope&#8221;, note attribu\u00e9e \u00e0 chaque projet sur la base de crit\u00e8res pond\u00e9r\u00e9s, permettant de choisir les projets les plus pertinents, en privil\u00e9giant le renouvellement et la modernisation du r\u00e9seau structurant existant.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.3) 1Md\u20ac\/an de plus pour le r\u00e9seau routier<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1.3.1) Investissement port\u00e9 sur le r\u00e9seau non conc\u00e9d\u00e9<\/h4>\n\n\n\n<p>Le financement actuel du r\u00e9seau routier non conc\u00e9d\u00e9 (celui pour lequel les besoins de renouvellement sont les plus criants) par l&#8217;Etat est aujourd&#8217;hui d&#8217;environ 700M\u20ac\/an.<\/p>\n\n\n\n<p>Les besoins compl\u00e9mentaires identifi\u00e9s se d\u00e9composent comme suit :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>+150M\u20ac\/an pour stabiliser le vieillissement du r\u00e9seau<\/li>\n\n\n\n<li>+350M\u20ac\/an pour r\u00e9sorber en 8 ans la &#8220;dette grise&#8221; issue du sous-investissement latent ces derni\u00e8res ann\u00e9es sur ce r\u00e9seau<\/li>\n\n\n\n<li>+200M\u20ac\/an pour r\u00e9pondre \u00e0 de nouveaux besoins (modernisation des tunnels, d\u00e9samiantage des chauss\u00e9es, &#8230;)<\/li>\n\n\n\n<li>+250M\u20ac\/an pour moderniser le r\u00e9seau (r\u00e9duction de l&#8217;empreinte environnementale, r\u00e9silience face au changement climatique, &#8230;), puis +400M\u20ac \u00e0 partir de 2032.<\/li>\n<\/ul>\n\n\n\n<script src=\"https:\/\/www.gstatic.com\/charts\/loader.js\"><\/script>\n  <style>\n    #chart-FinancementRoutes { height: 520px; max-width: 1100px; margin: 24px auto; }\n  <\/style>\n  <div id=\"chart-FinancementRoutes\"><\/div>\n  <script>\n    \/\/ ====== CONFIG (sp\u00e9cifique) ======\n    const DATA_URL_FinancementRoutes = 'https:\/\/huguesg.fr\/docs\/depenses-p203.csv';   \/\/\n    const ACTION_CODE_FinancementRoutes = '203-04-01';\n    const START_YEAR_FinancementRoutes = 2020;\n    const END_YEAR_EXISTING_FinancementRoutes = 2025;\n    const EXTEND_TO_YEAR_FinancementRoutes = 2035;\n\n    \/\/ ====== UTILS ======\n    const parseNumberFR_FinancementRoutes = (s) =>\n      parseFloat(String(s ?? '').trim().replace(\/\\s\/g, '').replace(',', '.'));\n\n    const splitSmart_FinancementRoutes = (line) => {\n      for (const sep of ['\\t', ';', ',']) {\n        const parts = line.split(sep);\n        if (parts.length > 1) return parts;\n      }\n      return [line];\n    };\n\n    const normalize_FinancementRoutes = (s) =>\n      String(s || '')\n        .normalize('NFD').replace(\/[\\u0300-\\u036f]\/g, '')\n        .replace(\/\\s+\/g, ' ')\n        .trim();\n\n    async function fetchCSV_FinancementRoutes(url) {\n      const resp = await fetch(url, { cache: 'no-cache' });\n      if (!resp.ok) throw new Error('HTTP ' + resp.status);\n      return await resp.text();\n    }\n\n    function parseCSV_FinancementRoutes(text) {\n      const lines = text.split(\/\\r?\\n\/).map(l => l.trim()).filter(Boolean);\n      if (!lines.length) return { headers: [], rows: [] };\n      const headers = splitSmart_FinancementRoutes(lines[0]).map(h => h.trim());\n      const rows = lines.slice(1).map(splitSmart_FinancementRoutes);\n      return { headers, rows };\n    }\n\n    function extractSeries_FinancementRoutes(headers, rows) {\n      const idxAction = headers.findIndex(h => normalize_FinancementRoutes(h).startsWith('Action'));\n      const yearCols = [];\n\n      headers.forEach((h, i) => {\n        const hn = normalize_FinancementRoutes(h);\n        const m = hn.match(\/^(\\d{4})\\s+(prevision|realisation)$\/i);\n        if (m) {\n          const year = parseInt(m[1], 10);\n          const type = m[2].toLowerCase().startsWith('real') ? 'real' : 'prev';\n          yearCols.push({ year, type, index: i });\n        }\n      });\n\n      const row = rows.find(r => String(r[idxAction]).trim() === ACTION_CODE_FinancementRoutes);\n      if (!row) return new Map();\n\n      const byYear = new Map();\n      for (let y = START_YEAR_FinancementRoutes; y <= END_YEAR_EXISTING_FinancementRoutes; y++) {\n        const realCol = yearCols.find(c => c.year === y && c.type === 'real');\n        const prevCol = yearCols.find(c => c.year === y && c.type === 'prev');\n\n        let val = NaN;\n        if (realCol && row[realCol.index] !== undefined && row[realCol.index] !== '') {\n          val = parseNumberFR_FinancementRoutes(row[realCol.index]);\n        }\n        if (!Number.isFinite(val) && prevCol && row[prevCol.index] !== undefined) {\n          val = parseNumberFR_FinancementRoutes(row[prevCol.index]);\n        }\n        if (Number.isFinite(val)) byYear.set(y, val);\n      }\n\n      for (let y = END_YEAR_EXISTING_FinancementRoutes + 1; y <= 2034; y++) {\n  let val = 1650; \/\/ valeur par d\u00e9faut 2026\u20132031\n  if (y === 2032 || y === 2033) val = 1800;\n  if (y === 2034) val = 1450;\n  byYear.set(y, val);\n}\n\n      return byYear;\n    }\n\nfunction buildDataTable_FinancementRoutes(byYear) {\n  const data = new google.visualization.DataTable();\n  data.addColumn('string', 'Ann\u00e9e');\n  data.addColumn('number', 'Financements r\u00e9alis\u00e9s');\n  data.addColumn({ type: 'string', role: 'annotation' });\n  data.addColumn('number', 'Besoins estim\u00e9s');\n  data.addColumn({ type: 'string', role: 'annotation' });\n\n  const years = Array.from(byYear.keys()).sort((a, b) => a - b);\n  years.forEach(y => {\n    const val = byYear.get(y);\n    if (y <= 2025) {\n      data.addRow([String(y), val, String(val), null, null]);\n    } else {\n      data.addRow([String(y), null, null, val, String(val)]);\n    }\n  });\n  return data;\n}\n\nfunction drawLine_FinancementRoutes(data) {\n  const options = {\n    legend: { position: 'top' },\n    chartArea: { left: 60, right: 20, top: 40, height: '70%' },\n    vAxis: { title: 'Montant (M\u20ac)', viewWindow: { min: 0 } },\n    hAxis: { title: 'Ann\u00e9e' },\n    lineWidth: 3,\n    pointSize: 6,\n    annotations: { alwaysOutside: true },\n    series: {\n      0: { color: '#1f77b4' }, \/\/ bleu fonc\u00e9 jusqu\u2019\u00e0 2025\n      1: { color: '#6baed6' }  \/\/ bleu clair \u00e0 partir de 2026\n    }\n  };\n  const chart = new google.visualization.LineChart(\n    document.getElementById('chart-FinancementRoutes')\n  );\n  chart.draw(data, options);\n  window.addEventListener('resize', () => chart.draw(data, options));\n}\n\n\n    \/\/ ====== MAIN ======\n    google.charts.load('current', { packages: ['corechart'] });\n    google.charts.setOnLoadCallback(async () => {\n      try {\n        const csvText_FinancementRoutes = await fetchCSV_FinancementRoutes(DATA_URL_FinancementRoutes);\n        const parsed_FinancementRoutes = parseCSV_FinancementRoutes(csvText_FinancementRoutes);\n        const byYear_FinancementRoutes = extractSeries_FinancementRoutes(parsed_FinancementRoutes.headers, parsed_FinancementRoutes.rows);\n        const data_FinancementRoutes = buildDataTable_FinancementRoutes(byYear_FinancementRoutes);\n        drawLine_FinancementRoutes(data_FinancementRoutes);\n      } catch (err) {\n        document.getElementById('chart-FinancementRoutes').innerHTML =\n          '<p style=\"color:#b00\">Erreur de chargement ou de parsing des donn\u00e9es. V\u00e9rifiez le chemin du CSV et CORS.<\/p>';\n        console.error(err);\n      }\n    });\n  <\/script>\n\n\n\n<h4 class=\"wp-block-heading\">1.3.2) Besoin compl\u00e9mentaire \u00e0 financer pour le r\u00e9seau conc\u00e9d\u00e9<\/h4>\n\n\n\n<p>Le r\u00e9seau autoroutier (conc\u00e9d\u00e9) est quant \u00e0 lui financ\u00e9 par les soci\u00e9t\u00e9s concessionnaires elles-m\u00eames, \u00e0 hauteur de 1.7Md\u20ac\/an. Ce besoin est stable dans le temps (y compris apr\u00e8s la fin des concessions), mais un besoin compl\u00e9mentaire de modernisation est estim\u00e9 \u00e0 +600M\u20ac\/an (voire plus selon les concessionnaires actuels) \u00e0 partir de 2032.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1.3.3) Et pour le r\u00e9seau d\u00e9partemental ?<\/h4>\n\n\n\n<p>En l&#8217;absence d&#8217;audit pr\u00e9existant, il est difficile d&#8217;estimer les besoins li\u00e9s au r\u00e9seau d\u00e9partemental, globalement plut\u00f4t estim\u00e9 en bon \u00e9tat et en am\u00e9lioration avec les financements existants, bien qu&#8217;une dette grise soit \u00e9voqu\u00e9e.<\/p>\n\n\n\n<p>Cependant, un besoin est d&#8217;ores et d\u00e9j\u00e0 identifi\u00e9 pour le financement des ponts, \u00e0 hauteur de 3.3Mds\u20ac sur 10 ans,<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.4) 500M\u20ac\/an pour les marchandises<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1.4.1) 300M\u20ac\/an pour le fret ferroviaire<\/h4>\n\n\n\n<p>Aujourd&#8217;hui, les investissements sur les infrastructures de fret ferroviaire regroupent l&#8217;action 45-01 du programme 203, ainsi que les investissements directs r\u00e9alis\u00e9s par l&#8217;AFITF, pour un montant estim\u00e9 autour de 200M\u20ac\/an. Pour poursuivre et acc\u00e9l\u00e9rer le renouvellement des installations hors d&#8217;\u00e2ge, un besoin suppl\u00e9mentaire de 300M\u20ac\/an est estim\u00e9 n\u00e9cessaire. Ces investissements doivent permettre de :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>R\u00e9g\u00e9n\u00e9rer les installations existantes (capillaires fret, voies de service, installations de tri, &#8230;)<\/li>\n\n\n\n<li>Moderniser le r\u00e9seau (\u00e9largissement de gabarits, augmentation de capacit\u00e9s en ligne, d\u00e9veloppement de syst\u00e8mes num\u00e9riques pour la standardisation europ\u00e9enne, &#8230;)<\/li>\n\n\n\n<li>Augmenter la capacit\u00e9 du transport combin\u00e9<\/li>\n<\/ul>\n\n\n\n<script src=\"https:\/\/www.gstatic.com\/charts\/loader.js\"><\/script>\n  <style>\n    #chart-P203AFITFStack { height: 560px; max-width: 1200px; margin: 24px auto; }\n  <\/style>\n  <div id=\"chart-P203AFITFStack\"><\/div>\n\n  <script>\n    \/\/ ====== CONFIG ======\n    const DATA_URL_P203 = 'https:\/\/huguesg.fr\/docs\/depenses-p203.csv';     \/\/ <-- adapter au chemin r\u00e9el\n    const DATA_URL_AFITF = 'https:\/\/huguesg.fr\/docs\/depenses-afitf.csv';   \/\/ <-- adapter au chemin r\u00e9el\n    const P203_ACTION_CODE = '203-45-01';\n    const AFITF_CATEGORY_NAME = 'Fret';\n\n    \/\/ ====== UTILS ======\n    const parseNumberFR = (s) =>\n      parseFloat(String(s ?? '').trim().replace(\/\\s\/g, '').replace(',', '.'));\n\n    const splitSmart = (line) => {\n      for (const sep of ['\\t', ';', ',']) {\n        const parts = line.split(sep);\n        if (parts.length > 1) return parts;\n      }\n      return [line];\n    };\n\n    const normalize = (s) =>\n      String(s || '')\n        .normalize('NFD').replace(\/[\\u0300-\\u036f]\/g, '')\n        .replace(\/\\s+\/g, ' ')\n        .trim()\n        .toLowerCase();\n\n    const isYearHeader = (h) => {\n      const n = normalize(h);\n      \/\/ ex: \"2020 prevision\", \"2020 realisation\" ou juste \"2020\"\n      return \/^(\\d{4})(\\s+(prevision|realisation))?$\/.test(n);\n    };\n\n    const parseYearHeader = (h) => {\n      const n = normalize(h);\n      const m = n.match(\/^(\\d{4})(\\s+(prevision|realisation))?$\/);\n      if (!m) return null;\n      return { year: parseInt(m[1], 10), type: (m[3] || '').slice(0, 4) }; \/\/ 'real' | 'prev' | ''\n    };\n\n    async function fetchCSV(url) {\n  const resp = await fetch(url, { cache: 'no-cache', mode: 'cors' });\n  if (!resp.ok) throw new Error(`HTTP ${resp.status} on ${url}`);\n  const buf = await resp.arrayBuffer();\n\n  \/\/ 1) tentative UTF-8\n  let text = new TextDecoder('utf-8', { fatal: false }).decode(buf);\n\n  \/\/ 2) si des \ufffd apparaissent (U+FFFD), on essaie Windows-1252\n  if (text.includes('\\uFFFD')) {\n    try {\n      text = new TextDecoder('windows-1252').decode(buf);\n    } catch (e) {\n      console.warn('Fallback Windows-1252 failed', e);\n    }\n  }\n  return text;\n}\n\n\n    function parseCSV(text) {\n      const lines = text.split(\/\\r?\\n\/).map(l => l.trim()).filter(Boolean);\n      if (!lines.length) return { headers: [], rows: [] };\n      const headers = splitSmart(lines[0]).map(h => h.trim());\n      const rows = lines.slice(1).map(splitSmart);\n      return { headers, rows };\n    }\n\n    \/\/ ---- Extraction depuis P203 : ligne 'Action = 203-45-01', Real > Prev ----\n    function extractSeriesFromP203({ headers, rows }) {\n      const idxAction = headers.findIndex(h => normalize(h).startsWith('action'));\n      if (idxAction === -1) return new Map();\n\n      \/\/ recense les colonnes ann\u00e9e\n      const yearCols = [];\n      headers.forEach((h, i) => {\n        if (isYearHeader(h)) {\n          const info = parseYearHeader(h);\n          if (info) yearCols.push({ ...info, index: i });\n        }\n      });\n\n      const row = rows.find(r => String(r[idxAction]).trim() === P203_ACTION_CODE);\n      if (!row) return new Map();\n\n      const byYear = new Map();\n      \/\/ groupe par ann\u00e9e puis prend Real sinon Prev sinon valeur simple\n      const years = [...new Set(yearCols.map(c => c.year))].sort((a,b)=>a-b);\n      for (const y of years) {\n        const realCol = yearCols.find(c => c.year === y && c.type === 'real');\n        const prevCol = yearCols.find(c => c.year === y && c.type === 'prev');\n        const plainCol = yearCols.find(c => c.year === y && !c.type);\n\n        let v = NaN;\n        if (realCol && row[realCol.index] !== undefined && row[realCol.index] !== '') {\n          v = parseNumberFR(row[realCol.index]);\n        }\n        if (!Number.isFinite(v) && prevCol && row[prevCol.index] !== undefined) {\n          v = parseNumberFR(row[prevCol.index]);\n        }\n        if (!Number.isFinite(v) && plainCol && row[plainCol.index] !== undefined) {\n          v = parseNumberFR(row[plainCol.index]);\n        }\n        if (Number.isFinite(v)) byYear.set(y, v);\n      }\n      return byYear;\n    }\n\n    \/\/ ---- Extraction depuis AFITF : ligne 'Fret' (premi\u00e8re colonne ou libell\u00e9 proche), Real > Prev si pr\u00e9sent ----\n    function extractSeriesFromAFITF({ headers, rows }) {\n      \/\/ essaie de trouver la colonne qui porte le libell\u00e9 cat\u00e9gorie\n      const idxLabel =\n        headers.findIndex(h => \/^(categorie)\/.test(normalize(h))) >= 0\n          ? headers.findIndex(h => \/^(categorie)\/.test(normalize(h)))\n          : 0; \/\/ \u00e0 d\u00e9faut, 1\u00e8re colonne\n      const targetRow =\n        rows.find(r => normalize(r[idxLabel]) === normalize(AFITF_CATEGORY_NAME)) ||\n        rows.find(r => normalize(r[idxLabel]).includes('fret'));\n      if (!targetRow) return new Map();\n\n      const yearCols = [];\n      headers.forEach((h, i) => {\n        if (isYearHeader(h)) {\n          const info = parseYearHeader(h);\n          if (info) yearCols.push({ ...info, index: i });\n        }\n      });\n\n      const byYear = new Map();\n      const years = [...new Set(yearCols.map(c => c.year))].sort((a,b)=>a-b);\n      for (const y of years) {\n        const realCol = yearCols.find(c => c.year === y && c.type === 'real');\n        const prevCol = yearCols.find(c => c.year === y && c.type === 'prev');\n        const plainCol = yearCols.find(c => c.year === y && !c.type);\n\n        let v = NaN;\n        if (realCol && targetRow[realCol.index] !== undefined && targetRow[realCol.index] !== '') {\n          v = parseNumberFR(targetRow[realCol.index]);\n        }\n        if (!Number.isFinite(v) && prevCol && targetRow[prevCol.index] !== undefined) {\n          v = parseNumberFR(targetRow[prevCol.index]);\n        }\n        if (!Number.isFinite(v) && plainCol && targetRow[plainCol.index] !== undefined) {\n          v = parseNumberFR(targetRow[plainCol.index]);\n        }\n        if (Number.isFinite(v)) byYear.set(y, v);\n      }\n      return byYear;\n    }\n\n    \/\/ ---- Fusion des s\u00e9ries sur l'union des ann\u00e9es ----\n    function buildStackedDataTable(seriesP203, seriesAFITF) {\n  const yearsSet = new Set([...seriesP203.keys(), ...seriesAFITF.keys()]);\n  const years = Array.from(yearsSet).sort((a, b) => a - b);\n\n  const data = new google.visualization.DataTable();\n  data.addColumn('string', 'Ann\u00e9e');\n  data.addColumn('number', 'P203 \u2014 203-45-01');\n  data.addColumn('number', 'AFITF \u2014 Fret');\n\n  years.forEach(y => {\n    const v1 = seriesP203.get(y) ?? 0;\n    const v2 = seriesAFITF.get(y) ?? 0;\n    data.addRow([String(y), v1, v2]);\n  });\n\n  \/\/ === Format des nombres sans d\u00e9cimales (arrondi) ===\n  const formatter = new google.visualization.NumberFormat({\n    groupingSymbol: ' ',\n    decimalSymbol: ',',\n    fractionDigits: 0\n  });\n  formatter.format(data, 1); \/\/ colonne P203\n  formatter.format(data, 2); \/\/ colonne AFITF\n\n  \/\/ Ajoute une colonne d'annotation = somme arrondie (sans d\u00e9cimales)\n  const view = new google.visualization.DataView(data);\n  view.setColumns([\n    0, 1, 2,\n    {\n      type: 'string',\n      role: 'annotation',\n      calc: (dt, row) => {\n        const total = (dt.getValue(row, 1) || 0) + (dt.getValue(row, 2) || 0);\n        return formatter.formatValue(total); \/\/ ex: \"1 234\"\n      }\n    },\n  ]);\n  return view;\n}\n\n\n    function drawStacked(view) {\n      const options = {\n        isStacked: true,\n        legend: { position: 'top' },\n        chartArea: { left: 70, right: 30, top: 50, height: '70%' },\n        vAxis: { title: 'Montant (M\u20ac)', viewWindow: { min: 0 } },\n        hAxis: { title: 'Ann\u00e9e' },\n        annotations: { alwaysOutside: true }\n      };\n      const chart = new google.visualization.ColumnChart(\n        document.getElementById('chart-P203AFITFStack')\n      );\n      chart.draw(view, options);\n      window.addEventListener('resize', () => chart.draw(view, options));\n    }\n\n    \/\/ ====== MAIN ======\n    google.charts.load('current', { packages: ['corechart'] });\n    google.charts.setOnLoadCallback(async () => {\n      try {\n        \/\/ charge les deux CSV en parall\u00e8le\n        const [csvP203, csvAFITF] = await Promise.all([\n          fetchCSV(DATA_URL_P203),\n          fetchCSV(DATA_URL_AFITF)\n        ]);\n\n        const parsedP203 = parseCSV(csvP203);\n        const parsedAFITF = parseCSV(csvAFITF);\n\n        const seriesP203 = extractSeriesFromP203(parsedP203);\n        const seriesAFITF = extractSeriesFromAFITF(parsedAFITF);\n\n        const view = buildStackedDataTable(seriesP203, seriesAFITF);\n        drawStacked(view);\n      } catch (err) {\n        document.getElementById('chart-P203AFITFStack').innerHTML =\n          '<p style=\"color:#b00\">Erreur de chargement \/ parsing. V\u00e9rifiez les chemins CSV et CORS.<\/p>';\n        console.error(err);\n      }\n    });\n  <\/script>\n\n\n\n<p>Ces investissements doivent permettre d&#8217;atteindre les 4.2Md\u20ac d&#8217;investissement cumul\u00e9s estim\u00e9s n\u00e9cessaires \u00e0 l&#8217;horizon 2032 d&#8217;apr\u00e8s le dernier rapport du COI et les estimations de la fili\u00e8re.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1.4.2) 200M\u20ac\/an pour le fluvial<\/h4>\n\n\n\n<p>De m\u00eame, des investissements suppl\u00e9mentaires estim\u00e9s \u00e0 +200M\u20ac\/an ont \u00e9t\u00e9 identifi\u00e9s par la Cour des Comptes dans un rapport de 2023 pour le r\u00e9seau fluvial, afin de :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>R\u00e9sorber une dette grise estim\u00e9e \u00e0 1.1Md\u20ac<\/li>\n\n\n\n<li>Moderniser le r\u00e9seau (t\u00e9l\u00e9conduite, supervision, &#8230;)<\/li>\n\n\n\n<li>R\u00e9pondre \u00e0 des enjeux compl\u00e9mentaires \u00e0 ceux des transports (gestion de l&#8217;eau, irrigation, agricole, &#8230;).<\/li>\n<\/ul>\n\n\n\n<script src=\"https:\/\/www.gstatic.com\/charts\/loader.js\"><\/script>\n  <style>\n    #chart-FinancementFluvial { height: 520px; max-width: 1100px; margin: 24px auto; }\n  <\/style>\n\n  <div id=\"chart-FinancementFluvial\"><\/div>\n\n  <script>\n    \/\/ ====== CONFIG ======\n    const DATA_URL_FinancementFluvial = 'https:\/\/huguesg.fr\/docs\/depenses-p203.csv';   \/\/ <-- ajustez l\u2019URL du CSV\n    const ACTION_CODE_FinancementFluvial = '203-42-02';\n    const START_YEAR_FinancementFluvial = 2020;\n    const END_YEAR_EXISTING_FinancementFluvial = 2025;\n    const EXTEND_TO_YEAR_FinancementFluvial = 2028;\n    const EXTENDED_VALUE_FinancementFluvial = 400;\n\n    \/\/ ====== UTILS ======\n    const parseNumberFR_FinancementFluvial = (s) =>\n      parseFloat(String(s ?? '').trim().replace(\/\\s\/g, '').replace(',', '.'));\n\n    const splitSmart_FinancementFluvial = (line) => {\n      for (const sep of ['\\t', ';', ',']) {\n        const parts = line.split(sep);\n        if (parts.length > 1) return parts;\n      }\n      return [line];\n    };\n\n    const normalize_FinancementFluvial = (s) =>\n      String(s || '')\n        .normalize('NFD').replace(\/[\\u0300-\\u036f]\/g, '')\n        .replace(\/\\s+\/g, ' ')\n        .trim();\n\n    async function fetchCSV_FinancementFluvial(url) {\n      \/\/ Important pour WP (pr\u00e9visualisation) : expliciter CORS et d\u00e9coder proprement les accents\n  const resp = await fetch(url, { cache: 'no-cache', mode: 'cors', credentials: 'omit' });\n  const buf = await resp.arrayBuffer();\n\n  \/\/ 1) tentative UTF-8 (standard)\n  let text = new TextDecoder('utf-8', { fatal: false }).decode(buf);\n\n  \/\/ 2) si des \ufffd (U+FFFD) apparaissent, on essaie Windows-1252 (CSV encod\u00e9s en ANSI)\n  if ((text.match(\/\\uFFFD\/g) || []).length > 0) {\n    try { text = new TextDecoder('windows-1252').decode(buf); } catch (_) {}\n  }\n  return text;\n}\n   \n\n    function parseCSV_FinancementFluvial(text) {\n      const lines = text.split(\/\\r?\\n\/).map(l => l.trim()).filter(Boolean);\n      if (!lines.length) return { headers: [], rows: [] };\n      const headers = splitSmart_FinancementFluvial(lines[0]).map(h => h.trim());\n      const rows = lines.slice(1).map(splitSmart_FinancementFluvial);\n      return { headers, rows };\n    }\n\n    function extractSeries_FinancementFluvial(headers, rows) {\n      const idxAction = headers.findIndex(h => normalize_FinancementFluvial(h).startsWith('Action'));\n      const yearCols = [];\n\n      headers.forEach((h, i) => {\n        const hn = normalize_FinancementFluvial(h);\n        const m = hn.match(\/^(\\d{4})\\s+(prevision|realisation)$\/i);\n        if (m) {\n          const year = parseInt(m[1], 10);\n          const type = m[2].toLowerCase().startsWith('real') ? 'real' : 'prev';\n          yearCols.push({ year, type, index: i });\n        }\n      });\n      const row = rows.find(r => String(r[idxAction]).trim() === ACTION_CODE_FinancementFluvial);\nif (!row) return new Map();\n\n      const byYear = new Map();\n      for (let y = START_YEAR_FinancementFluvial; y <= END_YEAR_EXISTING_FinancementFluvial; y++) {\n        const realCol = yearCols.find(c => c.year === y && c.type === 'real');\n        const prevCol = yearCols.find(c => c.year === y && c.type === 'prev');\n\n        let val = NaN;\n        if (realCol && row[realCol.index] !== undefined && row[realCol.index] !== '') {\n          val = parseNumberFR_FinancementFluvial(row[realCol.index]);\n        }\n        if (!Number.isFinite(val) && prevCol && row[prevCol.index] !== undefined) {\n          val = parseNumberFR_FinancementFluvial(row[prevCol.index]);\n        }\n        if (Number.isFinite(val)) byYear.set(y, val);\n      }\n\n      \/\/ prolonger de 2026 \u00e0 2033 avec valeur 300\n      for (let y = END_YEAR_EXISTING_FinancementFluvial + 1; y <= EXTEND_TO_YEAR_FinancementFluvial; y++) {\n        byYear.set(y, EXTENDED_VALUE_FinancementFluvial);\n      }\n      return byYear;\n    }\n\n    function buildDataTable_FinancementFluvial(byYear) {\n  const data = new google.visualization.DataTable();\n  data.addColumn('string', 'Ann\u00e9e');\n  data.addColumn('number', 'Fluvial (r\u00e9alis\u00e9)');\n  data.addColumn({ type: 'string', role: 'annotation' });\n  data.addColumn('number', 'Fluvial (pr\u00e9vision)');\n  data.addColumn({ type: 'string', role: 'annotation' });\n\n  const years = Array.from(byYear.keys()).sort((a, b) => a - b);\n  years.forEach(y => {\n    const val = byYear.get(y);\n    if (y <= END_YEAR_EXISTING_FinancementFluvial) {\n      data.addRow([String(y), val, String(val), null, null]);\n    } else {\n      data.addRow([String(y), null, null, val, String(val)]);\n    }\n  });\n  return data;\n}\n\n\n   function drawLine_FinancementFluvial(data) {\n  const options = {\n    legend: { position: 'top' },\n    chartArea: { left: 60, right: 20, top: 40, height: '70%' },\n    vAxis: { title: 'Montant (M\u20ac)', viewWindow: { min: 0 } },\n    hAxis: { title: 'Ann\u00e9e' },\n    lineWidth: 3,\n    pointSize: 6,\n    annotations: { alwaysOutside: true },\n    series: {\n      0: { color: '#1f77b4' }, \/\/ bleu fonc\u00e9 = R\u00e9alis\u00e9\n      1: { color: '#6baed6' }  \/\/ bleu clair = Pr\u00e9vision\n    }\n  };\n  const chart = new google.visualization.LineChart(\n    document.getElementById('chart-FinancementFluvial')\n  );\n  chart.draw(data, options);\n  window.addEventListener('resize', () => chart.draw(data, options));\n}\n\n\n    \/\/ ====== MAIN ======\n    google.charts.load('current', { packages: ['corechart'] });\n    google.charts.setOnLoadCallback(async () => {\n      try {\n        const csvText_FinancementFluvial = await fetchCSV_FinancementFluvial(DATA_URL_FinancementFluvial);\n        const parsed_FinancementFluvial = parseCSV_FinancementFluvial(csvText_FinancementFluvial);\n        const byYear_FinancementFluvial = extractSeries_FinancementFluvial(parsed_FinancementFluvial.headers, parsed_FinancementFluvial.rows);\n        const data_FinancementFluvial = buildDataTable_FinancementFluvial(byYear_FinancementFluvial);\n        drawLine_FinancementFluvial(data_FinancementFluvial);\n      } catch (err) {\n        document.getElementById('chart-FinancementFluvial').innerHTML =\n          '<p style=\"color:#b00\">Erreur de chargement ou de parsing des donn\u00e9es. V\u00e9rifiez le chemin du CSV et CORS.<\/p>';\n        console.error(err);\n      }\n    });\n  <\/script>\n\n\n\n<h4 class=\"wp-block-heading\">1.4.3) Et les poids-lourds ?<\/h4>\n\n\n\n<p>Des besoins d&#8217;investissements suppl\u00e9mentaires ont \u00e9galement \u00e9t\u00e9 identifi\u00e9s pour l&#8217;\u00e9lectrification des poids lourds, et notamment :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>+450M\u20ac d&#8217;ici 2030 pour des bornes de recharge ouvertes au public sur le r\u00e9seau national<\/li>\n\n\n\n<li>+2.5Md\u20ac pour l&#8217;\u00e9quipement des d\u00e9p\u00f4ts priv\u00e9s des transporteurs et op\u00e9rateurs logistiques<\/li>\n\n\n\n<li>+500M\u20ac pour l&#8217;\u00e9quipement des sites logistiques \u00e0 destination<\/li>\n\n\n\n<li>+2 \u00e0 5 Md\u20ac \u00e0 l&#8217;horizon 2030 pour financer les surco\u00fbts des poids lourds \u00e9lectriques, \u00e0 financer par les entreprises<\/li>\n<\/ul>\n\n\n\n<p>A noter que ces montants, pourtant significatifs, ne sont pas repris dans le graphique de synth\u00e8se du rapport.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1.5) Un besoin de d\u00e9veloppement de l&#8217;offre des transports urbains<\/h2>\n\n\n\n<p>La conf\u00e9rence a identifi\u00e9 comme priorit\u00e9 le renforcement des liaisons entre les villes-centres et leurs p\u00e9riph\u00e9rie, ainsi qu&#8217;au sein des p\u00e9riph\u00e9ries elles-m\u00eames, notamment gr\u00e2ce aux SERM.<\/p>\n\n\n\n<p>Le besoin de financement pour ces services est encore tr\u00e8s incertain, la composante ferroviaire repr\u00e9sentant un besoin pouvant aller jusqu&#8217;\u00e0 25Md\u20ac \u00e0 l&#8217;horizon 2040. Dans tous les cas, ce financement passera par une diversification des ressources des AOM, en actionnant les leviers d\u00e9crits ci-dessous.  <\/p>\n\n\n\n<h1 class=\"wp-block-heading\">2) Plusieurs leviers \u00e0 actionner pour financer ces besoins<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">2.1) Faire mieux avec les ressources existantes<\/h3>\n\n\n\n<p>Dans le contexte de tension budg\u00e9taire actuel, il est \u00e9vident que le premier levier \u00e0 actionner est celui de l&#8217;optimisation de l&#8217;existant, avec quelques pistes identifi\u00e9es :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Optimisation de l&#8217;infrastructure et de l&#8217;offre ferroviaires existants (ex : SERM de Bordeaux ou Strasbourg), en utilisant par exemple les donn\u00e9es pour mieux cibler les besoins.<\/li>\n\n\n\n<li>D\u00e9ploiement de cars express ou de solutions de covoiturage, pouvant parfois \u00eatre autofinanc\u00e9es<\/li>\n\n\n\n<li>Augmentation de la vitesse commerciale des bus (ex : Territoire de Belfort), permettant de r\u00e9duire les co\u00fbts d&#8217;exploitation<\/li>\n\n\n\n<li>Ouverture \u00e0 la concurrence du ferroviaire (ex : Etoile d&#8217;Amiens : -20% des co\u00fbts pour +9.5% d&#8217;offre)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.2) Faire payer certains usagers et clients dans la mesure du possible<\/h3>\n\n\n\n<p>Cette piste est politiquement plus sensible, mais peut produire des effets importants, par exemple via les moyens suivants :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Augmenter la tarification des transports en commun, en pr\u00e9servant l&#8217;\u00e9quit\u00e9 via la g\u00e9n\u00e9ralisation de tarifs solidaires ou de tarification diff\u00e9renci\u00e9e en fonction des revenus et des distances parcourues (ex : +10% sur les tarifs = +150M\u20ac\/an). A noter que la part de financement des transports urbains par les usagers en France est de 28% en 2022, contre 75% en 1975 et 40 \u00e0 60% ailleurs en Europe.<\/li>\n\n\n\n<li>Faire intervenir des financements priv\u00e9s via l&#8217;utilisation de PPP (Partenariats Public-Priv\u00e9) : SNCF R\u00e9seau estime pouvoir financer environ 200M\u20ac de projets de modernisation par an, au prix de hausse des p\u00e9ages sur les axes modernis\u00e9s afin de financer les loyers associ\u00e9s.<\/li>\n\n\n\n<li>Elargissement des \u00e9co-contributions territoriales pour les poids lourds sur les axes routiers tr\u00e8s fr\u00e9quent\u00e9s (60M\u20ac\/an en Alsace, 150M\u20ac\/an en Grand Est)<\/li>\n\n\n\n<li>Majoration cibl\u00e9e des p\u00e9ages poids-lourds sur les autoroutes (comme permis par la directive Eurovignette), pouvant rapporter quelques 10aines \u00e0 quelques 100aines de M\u20ac.<\/li>\n\n\n\n<li>Mise en place d&#8217;une trajectoire incitative \u00e0 l&#8217;\u00e9lectrification des poids lourds pour les chargeurs les plus importants.<\/li>\n\n\n\n<li>Mise en place d&#8217;un syst\u00e8me Book &amp; Claim (achats volontaires de certificats \u00e9mis par les entreprises ferroviaires et fluviales) afin de financer des infrastructures de fret massifi\u00e9.<\/li>\n<\/ul>\n\n\n\n<p>La piste d&#8217;une taxe temporaire sur les billets TGV n&#8217;a pas fait consensus et n&#8217;est donc finalement pas retenue.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.3) Augmenter les ressources de l&#8217;AFITF<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">2.3.1) Mieux fl\u00e9cher les ressources existantes<\/h4>\n\n\n\n<p>La conf\u00e9rence identifie 5 pistes de ressources qui ne sont pas aujourd&#8217;hui suffisamment fl\u00e9ch\u00e9es vers le financement des transports :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La TICPE : repr\u00e9sentant 30Md\u20ac de recettes, seule une fraction limit\u00e9e (entre 1.2 et 1.9Md\u20ac selon les ann\u00e9es) est affect\u00e9e \u00e0 l&#8217;AFITF. Cependant, le montant de cette taxe a vocation \u00e0 diminuer de 8Md\u20ac d&#8217;ici 2030 avec l&#8217;\u00e9lectrification du parc de v\u00e9hicules, ne pouvant donc pas constituer une piste p\u00e9renne.<\/li>\n<\/ul>\n\n\n\n<script src=\"https:\/\/www.gstatic.com\/charts\/loader.js\"><\/script>\n  <style>\n    #chart-TICPE { height: 560px; max-width: 1200px; margin: 24px auto; }\n  <\/style>\n\n  <div id=\"chart-TICPE\"><\/div>\n\n  <script>\n    \/\/ ========= CONFIG =========\n    const DATA_URL_TICPE = 'https:\/\/huguesg.fr\/docs\/aft-ticpe.csv'; \/\/ <-- \u00e0 adapter\n\n    \/\/ ========= UTILS =========\n    const parseNumberFR_TICPE = (s) =>\n      parseFloat(String(s ?? '').trim().replace(\/\\s\/g, '').replace(',', '.'));\n\n    const splitSmart_TICPE = (line) => {\n      for (const sep of ['\\t', ';', ',']) {\n        const parts = line.split(sep);\n        if (parts.length > 1) return parts.map(p => p.trim());\n      }\n      return [line.trim()];\n    };\n\n    const normalize_TICPE = (s) =>\n      String(s || '')\n        .normalize('NFD').replace(\/[\\u0300-\\u036f]\/g, '')\n        .replace(\/\\s+\/g, ' ')\n        .trim()\n        .toLowerCase();\n\n    const isYearHeader_TICPE = (h) => \/^\\d{4}$\/.test(normalize_TICPE(h));\n\n    async function fetchCSV_TICPE(url) {\nconst resp = await fetch(url, { cache: 'no-cache', mode: 'cors' });\n  if (!resp.ok) throw new Error(`HTTP ${resp.status} on ${url}`);\n  const buf = await resp.arrayBuffer();\n\n  \/\/ 1) tentative UTF-8\n  let text = new TextDecoder('utf-8', { fatal: false }).decode(buf);\n\n  \/\/ 2) si des \ufffd apparaissent (U+FFFD), on essaie Windows-1252\n  if (text.includes('\\uFFFD')) {\n    try {\n      text = new TextDecoder('windows-1252').decode(buf);\n    } catch (e) {\n      console.warn('Fallback Windows-1252 failed', e);\n    }\n  }\n  return text;\n}\n\n    function parseCSV_TICPE(text) {\n      const lines = text.split(\/\\r?\\n\/).map(l => l.trim()).filter(Boolean);\n      if (!lines.length) return { headers: [], rows: [] };\n      const headers = splitSmart_TICPE(lines[0]);\n      const rows = lines.slice(1).map(splitSmart_TICPE);\n      return { headers, rows };\n    }\n\n    \/\/ Construit une table Year \u00d7 Category \u2192 value\n    function pivotByYearCategory_TICPE(headers, rows) {\n      \/\/ 1) Trouver la colonne de libell\u00e9 (cat\u00e9gorie)\n      \/\/ On prend la 1re colonne non-ann\u00e9e comme libell\u00e9. \u00c0 d\u00e9faut, index 0.\n      let idxLabel = 0;\n      for (let i = 0; i < headers.length; i++) {\n        if (!isYearHeader_TICPE(headers[i])) { idxLabel = i; break; }\n      }\n\n      \/\/ 2) Identifier les colonnes Ann\u00e9es\n      const yearCols = [];\n      headers.forEach((h, i) => {\n        if (i !== idxLabel && isYearHeader_TICPE(h)) {\n          yearCols.push({ year: parseInt(headers[i], 10), index: i });\n        }\n      });\n      yearCols.sort((a, b) => a.year - b.year);\n\n      \/\/ 3) Construire la structure { year -> { category -> value } }\n      const byYear = new Map();\n      const categories = new Set();\n\n      rows.forEach(r => {\n        const label = (r[idxLabel] ?? '').trim();\n        if (!label) return;\n        categories.add(label);\n\n        yearCols.forEach(({ year, index }) => {\n          const raw = r[index];\n          const val = parseNumberFR_TICPE(raw);\n          if (Number.isFinite(val)) {\n            if (!byYear.has(year)) byYear.set(year, new Map());\n            byYear.get(year).set(label, val);\n          }\n        });\n      });\n\n      \/\/ 4) Ordonner\n      const sortedYears = Array.from(byYear.keys()).sort((a, b) => a - b);\n      const sortedCats = Array.from(categories).sort((a, b) => a.localeCompare(b, 'fr'));\n      return { byYear, years: sortedYears, categories: sortedCats };\n    }\n\n    function buildStackedData_TICPE(pivot) {\n      const data = new google.visualization.DataTable();\n      data.addColumn('string', 'Ann\u00e9e');\n      \/\/ une colonne par cat\u00e9gorie\n      pivot.categories.forEach(cat => data.addColumn('number', cat));\n\n      pivot.years.forEach(y => {\n        const row = [String(y)];\n        pivot.categories.forEach(cat => {\n          const v = pivot.byYear.get(y)?.get(cat) ?? 0;\n          row.push(v);\n        });\n        data.addRow(row);\n      });\n\n      return data;\n    }\n\n    function drawStacked_TICPE(data) {\n      const options = {\n        isStacked: true,                           \/\/ empil\u00e9\n        legend: { position: 'top' },\n        chartArea: { left: 70, right: 30, top: 50, height: '70%' },\n        vAxis: { title: 'Montant (Md\u20ac)', viewWindow: { min: 0 } },\n        hAxis: { title: 'Ann\u00e9e' },\n        tooltip: { isHtml: false }\n      };\n      const chart = new google.visualization.ColumnChart(\n        document.getElementById('chart-TICPE')\n      );\n      chart.draw(data, options);\n      window.addEventListener('resize', () => chart.draw(data, options));\n    }\n\n    \/\/ ========= MAIN =========\n    google.charts.load('current', { packages: ['corechart'] }); \/\/ loader + corechart\n    google.charts.setOnLoadCallback(async () => {\n      try {\n        const csvText_TICPE = await fetchCSV_TICPE(DATA_URL_TICPE);\n        const parsed_TICPE = parseCSV_TICPE(csvText_TICPE);\n        const pivot_TICPE = pivotByYearCategory_TICPE(parsed_TICPE.headers, parsed_TICPE.rows);\n        const data_TICPE = buildStackedData_TICPE(pivot_TICPE);\n        drawStacked_TICPE(data_TICPE);\n      } catch (err) {\n        document.getElementById('chart-TICPE').innerHTML =\n          '<p style=\"color:#b00\">Erreur de chargement\/parsing. V\u00e9rifiez le chemin du CSV et CORS.<\/p>';\n        console.error(err);\n      }\n    });\n  <\/script>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La Taxe de Solidarit\u00e9 sur les Billets d&#8217;Avion (TSBA) : g\u00e9n\u00e9rant 1.2Md\u20ac, seuls 270M\u20ac sont affect\u00e9s \u00e0 l&#8217;AFITF.<\/li>\n\n\n\n<li>A partir de 2032 (fin des concessions autorouti\u00e8res existantes), une partie des ressources issues des p\u00e9ages pourrait venir financer une nouvelle dette lev\u00e9e sp\u00e9cifiquement pour r\u00e9sorber la &#8220;dette grise&#8221; du r\u00e9seau routier national non conc\u00e9d\u00e9.<\/li>\n\n\n\n<li>La TEITLD (Taxe sur l&#8217;Exploitation des Infrastructures de Transport Longue Distance) : aujourd&#8217;hui, 50M\u20ac de ses recettes sont saupoudr\u00e9es vers les communes, et auraient plus de pertinence \u00e0 \u00eatre fl\u00e9ch\u00e9es vers le CEREMA pour le financement d&#8217;un programme de r\u00e9novation des ponts.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">2.3.2) Cr\u00e9er de nouvelles ressources pour investir dans les infrastructures<\/h4>\n\n\n\n<p>Plusieurs pistes sont \u00e9voqu\u00e9es :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Les ETS1 : ressources issues de la vente des quotas carbone, il ne s&#8217;agit pas \u00e0 proprement parler d&#8217;une ressource nouvelle car elle repr\u00e9sente d\u00e9j\u00e0 aujourd&#8217;hui une manne de 1.5 \u00e0 2Md\u20ac, fl\u00e9ch\u00e9es vers l&#8217;ANAH pour 700M\u20ac et vers le budget de l&#8217;Etat pour le compl\u00e9ment. En revanche, cette ressource devrait augmenter de 200M\u20ac \u00e0 partir de 2026 (du fait d&#8217;une \u00e9volution des modalit\u00e9s de fonctionnement). Cependant, \u00e0 partir de 2028, l&#8217;Union Europ\u00e9enne pr\u00e9voit d&#8217;en r\u00e9cup\u00e9rer une partie pour son budget propre, limitant la viabilit\u00e9 de cette option.<\/li>\n<\/ul>\n\n\n\n<script src=\"https:\/\/www.gstatic.com\/charts\/loader.js\"><\/script>\n<style>\n  #chart-AnahBudget { height: 520px; max-width: 1100px; margin: 24px auto; }\n<\/style>\n\n<div id=\"chart-AnahBudget\"><\/div>\n\n<script>\n  \/\/ ========= CONFIG =========\n  const DATA_URL_ETS = 'https:\/\/huguesg.fr\/docs\/aft-ets.csv'; \/\/ <-- remplacez par l\u2019URL r\u00e9elle du fichier\n\n  \/\/ ========= UTILS =========\n  const parseNumberFR_ETS = (s) =>\n    parseFloat(String(s ?? '').replace(\/\\u00A0\/g,' ').trim().replace(\/\\s\/g,'').replace(',', '.'));\n\n  function detectSep_ETS(line) {\n    let best = ';', bestCount = 1;\n    for (const sep of ['\\t','; ', ';', ',']) {\n      const n = line.split(sep).length;\n      if (n > bestCount) { best = sep; bestCount = n; }\n    }\n    return best;\n  }\n\n  async function fetchCSV_ETS(url) {\n    const resp = await fetch(url, { cache: 'no-cache', mode: 'cors' });\n    if (!resp.ok) throw new Error('HTTP ' + resp.status);\n    const buf = await resp.arrayBuffer();\n    let text = new TextDecoder('utf-8', { fatal: false }).decode(buf);\n    if (text.includes('\\uFFFD')) {\n      try { text = new TextDecoder('windows-1252').decode(buf); } catch {}\n    }\n    return text.replace(\/^\\uFEFF\/, '');\n  }\n\n  function parseCSV_ETS(text) {\n    const lines = text.split(\/\\r?\\n\/).filter(l => l.trim().length > 0);\n    if (!lines.length) return { headers: [], rows: [] };\n\n    const sep = detectSep_ETS(lines[0]);\n    const split = l => l.split(sep).map(x => x.trim());\n\n    const first = split(lines[0]);\n    const isHeader =\n      !\/^\\d{4}$\/.test(first[0]) &&\n      lines[1] && \/^\\d{4}(\\D|$)\/.test(split(lines[1])[0]);\n\n    let headers = [];\n    let start = 0;\n    if (isHeader) {\n      headers = first;\n      start = 1;\n    } else {\n      headers = ['Ann\u00e9e', \"Montant revers\u00e9 \u00e0 l'ANAH\", 'Montant vers\u00e9 au budget g\u00e9n\u00e9ral'];\n    }\n\n    if (headers.length === 2) {\n      headers = ['Ann\u00e9e', ...headers];\n    }\n\n    const rows = lines.slice(start).map(split);\n    return { headers, rows };\n  }\n\n  function buildStackedData_ETS(headers, rows) {\n    const data = new google.visualization.DataTable();\n    data.addColumn('string', 'Ann\u00e9e');\n\n    const colAnah = 1;\n    const colBudget = 2;\n    const labelAnah   = headers[colAnah]  || \"Montant revers\u00e9 \u00e0 l'ANAH\";\n    const labelBudget = headers[colBudget] || 'Montant vers\u00e9 au budget g\u00e9n\u00e9ral';\n\n    data.addColumn('number', labelAnah);\n    data.addColumn('number', labelBudget);\n\n    rows.forEach(r => {\n      const year = String(r[0]).trim();\n      if (!\/^\\d{4}$\/.test(year)) return;\n      const vAnah   = parseNumberFR_ETS(r[colAnah]);\n      const vBudget = parseNumberFR_ETS(r[colBudget]);\n      if (!Number.isFinite(vAnah) && !Number.isFinite(vBudget)) return;\n      data.addRow([year, Number.isFinite(vAnah) ? vAnah : 0, Number.isFinite(vBudget) ? vBudget : 0]);\n    });\n\n    const nf = new google.visualization.NumberFormat({ groupingSymbol: ' ', decimalSymbol: ',', fractionDigits: 0 });\n    nf.format(data, 1);\n    nf.format(data, 2);\n\n    return data;\n  }\n\n  function drawStacked_ETS(data) {\n    const options = {\n      isStacked: true,\n      legend: { position: 'top' },\n      chartArea: { left: 70, right: 30, top: 50, height: '70%' },\n      vAxis: { title: 'Montant (M\u20ac)', viewWindow: { min: 0 } },\n      hAxis: { title: 'Ann\u00e9e' },\n      bar: { groupWidth: '70%' },\n      tooltip: { isHtml: false }\n    };\n    const chart = new google.visualization.ColumnChart(\n      document.getElementById('chart-AnahBudget')\n    );\n    chart.draw(data, options);\n    window.addEventListener('resize', () => chart.draw(data, options));\n  }\n\n  \/\/ ========= MAIN =========\n  google.charts.load('current', { packages: ['corechart'] });\n  google.charts.setOnLoadCallback(async () => {\n    try {\n      const csv = await fetchCSV_ETS(DATA_URL_ETS);\n      const parsed = parseCSV_ETS(csv);\n      const data = buildStackedData_ETS(parsed.headers, parsed.rows);\n      drawStacked_ETS(data);\n    } catch (err) {\n      document.getElementById('chart-AnahBudget').innerHTML =\n        '<p style=\"color:#b00\">Erreur de chargement\/parsing. V\u00e9rifiez l\u2019URL du CSV et son s\u00e9parateur.<\/p>';\n      console.error(err);\n    }\n  });\n<\/script>\n\n\n\n\n<ul class=\"wp-block-list\">\n<li>La piste des ETS2 est \u00e9voqu\u00e9e mais para\u00eet \u00e9galement limit\u00e9e par le besoin d&#8217;accompagner la mise en place de ce dispositif aupr\u00e8s des m\u00e9nages et des entreprises afin d&#8217;en limiter l&#8217;impact, r\u00e9duisant d&#8217;autant les recettes g\u00e9n\u00e9r\u00e9es.<\/li>\n\n\n\n<li>Evolution du malus poids \u00e0 l&#8217;achat d&#8217;un v\u00e9hicule neuf : \n<ul class=\"wp-block-list\">\n<li>400M\u20ac\/an de recettes pourraient \u00eatre g\u00e9n\u00e9r\u00e9es en abaissant le seuil de d\u00e9clenchement de 1500 \u00e0 1400kg.<\/li>\n\n\n\n<li>200M\u20ac\/an seraient g\u00e9n\u00e9r\u00e9s par la suppression des abattements sur les v\u00e9hicules hybrides<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Suppression d&#8217;ici 2030 du taux r\u00e9duit de TICPE pour le transport routier de marchandises : 1.2Md\u20ac\/an pourraient ainsi progressivement \u00eatre affect\u00e9s \u00e0 l&#8217;AFITF, avec cependant une trajectoire d\u00e9croissante li\u00e9e \u00e0 l&#8217;\u00e9lectrification du parc.<\/li>\n\n\n\n<li>Taxe sur la livraison de colis \u00e0 domicile en zone urbaine : entre 50 et 200M\u20ac selon le choix des param\u00e8tres.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">2.3.3) Utiliser des ressources sp\u00e9cifiques \u00e0 certains modes de transport<\/h4>\n\n\n\n<p>Il s&#8217;agit ici de garantir que certaines ressources servent \u00e0 certains modes directement, sans passer par l&#8217;AFITF. Sont en particulier \u00e9voqu\u00e9s :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Une augmentation du fonds de concours du groupe SNCF de +500M\u20ac\/an \u00e0 partir de 2028, d\u00e9j\u00e0 \u00e9voqu\u00e9e pr\u00e9c\u00e9demment par le pr\u00e9sident m\u00eame de la SNCF, Jean-Pierre Farandou.<\/li>\n\n\n\n<li>Un recours \u00e0 l&#8217;emprunt du groupe SNCF, mais sans d\u00e9grader les ratios d&#8217;endettement de l&#8217;entreprise (ce qui limiterait fortement les possibilit\u00e9s au regard du ratio d&#8217;endettement actuel et de la r\u00e8gle d&#8217;or l&#8217;encadrant strictement).<\/li>\n\n\n\n<li>Une augmentation de la redevance hydraulique dans le fluvial, de +40M\u20ac\/an<\/li>\n\n\n\n<li>Une meilleure utilisation des CEE pour le secteur des transports (en particulier le v\u00e9lo ou le mat\u00e9riel roulant ferroviaire).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2.4) 2 sc\u00e9narios pour les AOM<\/h2>\n\n\n\n<p>Aujourd&#8217;hui, le financement des Autorit\u00e9s Organisatrices de la Mobilit\u00e9 (AOM) d\u00e9pend de plusieurs sources.<\/p>\n\n\n\n<script src=\"https:\/\/www.gstatic.com\/charts\/loader.js\"><\/script>\n  <style>\n    #chart-FinancementAOM { height: 520px; max-width: 900px; margin: 24px auto; }\n  <\/style>\n\n  <div id=\"chart-FinancementAOM\"><\/div>\n\n  <script>\n    \/\/ ====== CONFIG ======\n    const DATA_URL_FinancementAOM = 'https:\/\/huguesg.fr\/docs\/aft-financement-aom.csv'; \/\/ <-- \u00e0 adapter\n\n    \/\/ ====== UTILS ======\n    const parseNumberFR_FinancementAOM = (s) =>\n      parseFloat(String(s ?? '').trim().replace('%','').replace(',', '.'));\n\n    const splitSmart_FinancementAOM = (line) => {\n      for (const sep of ['\\t',';','\\t',' ']) {\n        const parts = line.split(sep);\n        if (parts.length > 1) return parts;\n      }\n      \/\/ si c\u2019est du type \"Etat 2%\" (s\u00e9par\u00e9 par tabulation ou multiple espaces)\n      const m = line.match(\/^(.*?)(\\d+[.,]?\\d*)\\s*%$\/);\n      if (m) return [m[1], m[2]+'%'];\n      return [line];\n    };\n\n    async function fetchCSV_FinancementAOM(url) {\n      const resp = await fetch(url, { cache: 'no-cache' });\n      if (!resp.ok) throw new Error('HTTP ' + resp.status);\n      return await resp.text();\n    }\n\n    function parseCSV_FinancementAOM(text) {\n      const lines = text.split(\/\\r?\\n\/).map(l => l.trim()).filter(Boolean);\n      \/\/ ignore une \u00e9ventuelle premi\u00e8re ligne = ann\u00e9e\n      let start = 1;\n      if (\/^\\d{4}$\/.test(lines[0])) start = 1;\n\n      const rows = [];\n      for (let i=start;i<lines.length;i++) {\n        const parts = splitSmart_FinancementAOM(lines[i]);\n        if (parts.length>=2) {\n          const label = parts[0].trim();\n          const val = parseNumberFR_FinancementAOM(parts[1]);\n          if (!isNaN(val)) rows.push([label, val]);\n        }\n      }\n      return rows;\n    }\n\n    function buildDataTable_FinancementAOM(rows) {\n  const data = new google.visualization.DataTable();\n  data.addColumn('string','Source (affich\u00e9)');\n  data.addColumn('number','Part (%)');\n  data.addColumn({ type: 'string', role: 'tooltip', p: { html: true } });\n\n  const nf = new Intl.NumberFormat('fr-FR', { maximumFractionDigits: 1 });\n\n  const rowsWithLabels = rows.map(([label, val]) => {\n    const libelle = `${label} \u2013 ${nf.format(val)} %`;\n    const tooltip =\n      `<div style=\"padding:8px 10px\">\n         <div style=\"font-weight:600\">${label}<\/div>\n         <div>Part&nbsp;: ${nf.format(val)}&nbsp;%<\/div>\n       <\/div>`;\n    return [libelle, val, tooltip];\n  });\n\n  data.addRows(rowsWithLabels);\n  return data;\n}\n\n    function drawPie_FinancementAOM(data) {\n      const options = {\n    legend: { position: 'right' },\n    chartArea: { left: 20, top: 20, width: '90%', height: '90%' },\n    pieSliceText: 'label',       \/\/ affiche Poste + valeur %\n    pieSliceTextStyle: { fontSize: 8 },\n    tooltip: { isHtml: true, textStyle: { fontSize: 12 } }\n  };\n      const chart = new google.visualization.PieChart(\n        document.getElementById('chart-FinancementAOM')\n      );\n      chart.draw(data, options);\n      window.addEventListener('resize', () => chart.draw(data, options));\n    }\n\n    \/\/ ====== MAIN ======\n    google.charts.load('current',{packages:['corechart']});\n    google.charts.setOnLoadCallback(async () => {\n      try {\n        const csvText_FinancementAOM = await fetchCSV_FinancementAOM(DATA_URL_FinancementAOM);\n        const rows_FinancementAOM = parseCSV_FinancementAOM(csvText_FinancementAOM);\n        const data_FinancementAOM = buildDataTable_FinancementAOM(rows_FinancementAOM);\n        drawPie_FinancementAOM(data_FinancementAOM);\n      } catch(err) {\n        document.getElementById('chart-FinancementAOM').innerHTML =\n          '<p style=\"color:#b00\">Erreur de chargement\/parsing. V\u00e9rifiez le chemin du CSV et CORS.<\/p>';\n        console.error(err);\n      }\n    });\n  <\/script>\n\n\n\n<p>Comme \u00e9voqu\u00e9 en partie 2.2, il para\u00eet n\u00e9cessaire d&#8217;augmenter le financement par les utilisateurs. Cependant, ce seul levier ne permettra pas de r\u00e9pondre aux enjeux d&#8217;un choc d&#8217;offre demand\u00e9 par l&#8217;ensemble des acteurs de la conf\u00e9rence. Deux sc\u00e9narios alternatifs ont donc \u00e9t\u00e9 envisag\u00e9, sans qu&#8217;un consensus se soit d\u00e9gag\u00e9 entre les acteurs sur celui \u00e0 privil\u00e9gier.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.4.1) Sc\u00e9nario 1 : D\u00e9plafonner le VM sous condition<\/h3>\n\n\n\n<p>2 choix sont envisag\u00e9s :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>D\u00e9plafonnement du Versement Mobilit\u00e9s (VM) existant (+0.1 point = +360M\u20ac\/an pour les AOM locales hors Ile de France d\u00e9j\u00e0 au pafond). Il est envisag\u00e9 de coupler \u00e7a \u00e0 l&#8217;augmentation du financement des utilisateurs en fixant par exemple des conditions minimales sur le ratio Recettes\/D\u00e9penses.<\/li>\n\n\n\n<li>Simplification du Versement Mobilit\u00e9 Additionnel lev\u00e9 par les syndicats mixtes (SRU) en supprimant sa limitation actuelle au territoire des EPCI (Etablissements Publics de Coop\u00e9ration Intercommunale) de moins de 100 000 habitants. <\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.4.2) Sc\u00e9nario 2 : De nouvelles taxes<\/h3>\n\n\n\n<p>Dans ce sc\u00e9nario, le mod\u00e8le est plus profond\u00e9ment revu, en ne faisant pas \u00e9voluer le VM, imp\u00f4t de production fortement d\u00e9cri\u00e9 par les entreprises.<br>Il propose l&#8217;introduction de nouvelles taxes telles que :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Une taxe locale sp\u00e9cifiquement affect\u00e9e au financement de l&#8217;exploitation des r\u00e9seaux (sans en pr\u00e9ciser l&#8217;assiette)<\/li>\n\n\n\n<li>Une taxe sur les plus-value fonci\u00e8res induites par le d\u00e9veloppement des infrastructures de transports (surtaxe des droits de mutation \u00e0 titre on\u00e9reux, ou &#8220;frais de notaire&#8221;, et\/ou surtaxe fonci\u00e8re)<\/li>\n\n\n\n<li>Une taxe r\u00e9gionale additionnelle sur les certificats d&#8217;immatriculation : aujourd&#8217;hui plafonn\u00e9e \u00e0 60\u20ac, une majoration de 10\u20ac g\u00e9n\u00e9rerait +380M\u20ac\/an.<\/li>\n\n\n\n<li>Une taxe additionnelle aux taxes communales de s\u00e9jour<\/li>\n\n\n\n<li>Des p\u00e9ages urbains tenant compte de crit\u00e8res sociaux, sur le mod\u00e8le de Stockholm<\/li>\n<\/ul>\n\n\n\n<p>Ce sc\u00e9nario semble cependant plus difficile \u00e0 mettre en \u0153uvre dans le contexte l\u00e9gislatif actuel&#8230;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2.5) Utiliser les p\u00e9ages des autoroutes<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">2.5.1) Des ressources importantes<\/h3>\n\n\n\n<p>Le rapport s&#8217;attarde aussi sur ce qui \u00e9tait finalement un de ses enjeux initiaux fondamentaux : que faire des autoroutes au terme des concessions qui arrivent \u00e0 leur terme entre 2031 et 2036 ?<\/p>\n\n\n\n<p>Le rapport plaide tout d&#8217;abord pour un maintien d&#8217;un syst\u00e8me de p\u00e9ages, par opposition \u00e0 la gratuit\u00e9 des autoroutes pour les utilisateurs, n\u00e9cessitant un financement par l&#8217;imp\u00f4t et donc par les contribuables.<\/p>\n\n\n\n<p>Aujourd&#8217;hui, les p\u00e9ages autoroutiers rapportent environ 14.8Mds\u20ac\/an, utilis\u00e9s selon la r\u00e9partition ci-dessous :<\/p>\n\n\n\n<script src=\"https:\/\/www.gstatic.com\/charts\/loader.js\"><\/script>\n  <style>\n    #chart-SCA { height: 520px; max-width: 900px; margin: 24px auto; }\n  <\/style>\n\n  <div id=\"chart-SCA\"><\/div>\n\n  <script>\n    \/\/ ====== CONFIG (sp\u00e9cifique) ======\n    const DATA_URL_SCA = 'https:\/\/huguesg.fr\/docs\/aft-sca.csv'; \/\/ <-- adaptez l\u2019URL de votre CSV\n\n    \/\/ ====== UTILS ======\n    const parseNumberFR_SCA = (s) =>\n      parseFloat(String(s ?? '').trim().replace(\/\\s\/g,'').replace(',', '.'));\n\n    const splitSmart_SCA = (line) => {\n      \/\/ essaie tab, point-virgule, virgule\n      for (const sep of ['\\t',';',',']) {\n        const parts = line.split(sep);\n        if (parts.length >= 2) return parts;\n      }\n      return [line, null];\n    };\n\n    async function fetchCSV_SCA(url) {\n      const resp = await fetch(url, { cache: 'no-cache', mode: 'cors' });\n    if (!resp.ok) throw new Error('HTTP ' + resp.status);\n    const buf = await resp.arrayBuffer();\n    let text = new TextDecoder('utf-8', { fatal: false }).decode(buf);\n    if (text.includes('\\uFFFD')) {\n      try { text = new TextDecoder('windows-1252').decode(buf); } catch {}\n    }\n    return text.replace(\/^\\uFEFF\/, '');\n  }\n\n    function parseCSV_SCA(text) {\n      const lines = text.split(\/\\r?\\n\/).map(l=>l.trim()).filter(Boolean);\n      let start = 1;\n      if (\/^\\d{4}$\/.test(lines[0])) start = 1; \/\/ ignore \"2023\"\n      const rows = [];\n      for (let i=start;i<lines.length;i++) {\n        const [label, rawVal] = splitSmart_SCA(lines[i]);\n        if (!rawVal) continue;\n        const v = parseNumberFR_SCA(rawVal);\n        if (Number.isFinite(v)) rows.push([label.trim(), v]);\n      }\n      return rows;\n    }\n\n    function buildDataTable_SCA(rows) {\n  const data = new google.visualization.DataTable();\n  data.addColumn('string', 'Poste (affich\u00e9)');\n  data.addColumn('number', 'Valeur');\n  data.addColumn({ type: 'string', role: 'tooltip', p: { html: true } });\n\n  const total = rows.reduce((a, r) => a + r[1], 0);\n\n  const nf = new Intl.NumberFormat('fr-FR', { maximumFractionDigits: 1 });\n  const rowsWithLabels = rows.map(([label, val]) => {\n    const libelle = `${label} \u2013 ${nf.format(val)} Md\u20ac`;\n    const tooltip =\n      `<div style=\"padding:8px 10px\">\n         <div style=\"font-weight:600\">${label}<\/div>\n         <div>Valeur&nbsp;: ${nf.format(val)}&nbsp;Md\u20ac<\/div>\n       <\/div>`;\n    return [libelle, val, tooltip];\n  });\n\n  data.addRows(rowsWithLabels);\n  return { data, total };\n}\n\n    function drawPie_SCA(dataTable, total) {\n      const options = {\n    legend: { position: 'right' },\n    chartArea: { left: 10, top: 10, width: '90%', height: '90%' },\n    \/\/ Affiche directement le libell\u00e9 enrichi (Poste + valeur + Md\u20ac)\n    pieSliceText: 'label',\n    pieSliceTextStyle: { fontSize: 8 },\n    tooltip: { isHtml: true, textStyle: { fontSize: 12 } }\n  };\n\n      \/\/ Ajoute un formatter pour afficher aussi les % au survol\n      const numberFmt = new google.visualization.NumberFormat({ groupingSymbol: ' ', decimalSymbol: ',', fractionDigits: 1 });\n      numberFmt.format(dataTable, 1);\n\n      const chart = new google.visualization.PieChart(document.getElementById('chart-SCA'));\n\n      \/\/ Personnalise le tooltip via 'onmouseover' si on veut montrer le %\n      google.visualization.events.addListener(chart, 'onmouseover', e => {\n        \/\/ rien \u00e0 faire : Google Charts montrera d\u00e9j\u00e0 la part et la valeur ;\n        \/\/ si vous souhaitez un tooltip HTML custom, on peut ajouter une colonne 'tooltip' role.\n      });\n\n      chart.draw(dataTable, options);\n      window.addEventListener('resize', () => chart.draw(dataTable, options));\n    }\n\n    \/\/ ====== MAIN ======\n    google.charts.load('current', { packages: ['corechart'] });\n    google.charts.setOnLoadCallback(async () => {\n      try {\n        const csvText_SCA = await fetchCSV_SCA(DATA_URL_SCA);\n        const rows_SCA = parseCSV_SCA(csvText_SCA);\n        const { data, total } = buildDataTable_SCA(rows_SCA);\n        drawPie_SCA(data, total);\n      } catch (err) {\n        document.getElementById('chart-SCA').innerHTML =\n          '<p style=\"color:#b00\">Erreur de chargement ou parsing. V\u00e9rifiez l\u2019URL du CSV et CORS.<\/p>';\n        console.error(err);\n      }\n    });\n  <\/script>\n\n\n\n<p>Les autoroutes financent donc aujourd&#8217;hui le budget de l&#8217;Etat \u00e0 hauteur 4.2Md\u20ac, et les infrastructures de transport \u00e0 hauteur de 1.1Md\u20ac (taxes fl\u00e9ch\u00e9es vers l&#8217;AFITF) + 5.4Mds\u20ac pour l&#8217;exploitation et la modernisation des autoroutes. Une fois les concessions termin\u00e9es, la part de r\u00e9mun\u00e9ration de la dette et des investisseurs pourra diminuer, et il est estim\u00e9 qu&#8217;environ 2.5Md\u20ac\/an pourraient ainsi \u00eatre d\u00e9gag\u00e9s, que la conf\u00e9rence propose de fl\u00e9cher en priorit\u00e9 vers l&#8217;AFITF.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.5.2) Deux propositions d&#8217;organisation<\/h3>\n\n\n\n<p>Plusieurs propositions d&#8217;organisation ont tout d&#8217;abord \u00e9t\u00e9 \u00e9cart\u00e9es :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La prolongation des concessions actuelles en l&#8217;\u00e9tat, qui ne serait pas une solution acceptable au vu du besoin de r\u00e9\u00e9quilibrer la relation financi\u00e8re entre l&#8217;Etat et les soci\u00e9t\u00e9s concessionnaires d&#8217;autoroutes.<\/li>\n\n\n\n<li>Le mod\u00e8le de la r\u00e9gie, qui ne permet pas de p\u00e9renniser le p\u00e9age puisque celui-ci est dans ce mod\u00e8le fix\u00e9 chaque ann\u00e9e par une d\u00e9cision politique, et peut donc mener \u00e0 un sous-investissement au gr\u00e9 du contexte budg\u00e9taire et\/ou politique.<\/li>\n\n\n\n<li>La mise en place de soci\u00e9t\u00e9s r\u00e9gionales de gestion autorouti\u00e8res, qui pr\u00e9sente certains avantages mais ne para\u00eet pas compatible avec l&#8217;h\u00e9t\u00e9rog\u00e9n\u00e9it\u00e9 du r\u00e9seau ainsi que le besoin d&#8217;un assemblage national sur le r\u00e9seau notamment pour l&#8217;utilisation des ressources financi\u00e8res qui en sont issues.<\/li>\n<\/ul>\n\n\n\n<p>Deux options sont alors propos\u00e9es :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Une am\u00e9lioration du syst\u00e8me actuel de concessions, avec des concessions plus petites, plus courtes, et plus tax\u00e9es notamment au b\u00e9n\u00e9fice de l&#8217;AFITF, ainsi qu&#8217;un actionnariat public \u00e9ventuellement renforc\u00e9.<\/li>\n\n\n\n<li>La mise en place d&#8217;un \u00e9tablissement public qui g\u00e9rerait \u00e0 la fois le r\u00e9seau routier conc\u00e9d\u00e9, et \u00e9ventuellement non-conc\u00e9d\u00e9, et qui associerait les acteurs priv\u00e9s soit via des march\u00e9s publics, soit via des concessions avec transfert du risque trafic.<\/li>\n<\/ul>\n\n\n\n<p>C&#8217;est le premier sc\u00e9nario qui est favoris\u00e9 par les participants \u00e0 la conf\u00e9rence. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2.6) Il faut un cadre stable et pr\u00e9visible<\/h2>\n\n\n\n<p>Enfin, le rapport rappelle qu&#8217;il est indispensable d&#8217;inscrire toutes ces mesures dans une trajectoire pluriannuelle stable et pr\u00e9visible, adapt\u00e9e aux enjeux des infrastructures qui sont par nature des actifs du temps long. <\/p>\n\n\n\n<p>De nombreuses ressources nouvelles sont identifi\u00e9es dans le rapport, mais doivent \u00eatre articul\u00e9es entre elles (fin des concessions, fin du remboursement de la TICPE, mise en \u0153uvre de l&#8217;ETS2, &#8230;).<\/p>\n\n\n\n<p>Une loi de programmation des infrastructures de transport est donc ardemment demand\u00e9e par les acteurs du secteur.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3) Bilan<\/h2>\n\n\n\n<p>En additionnant l&#8217;ensemble des investissements \u00e9voqu\u00e9s dans le rapport et en le comparant \u00e0 la situation actuelle, on peut estimer le besoin de financement additionnel autour de +3.8Md\u20ac \u00e0 court terme, et +4.6Md\u20ac \u00e0 moyen terme, selon le d\u00e9tail explicit\u00e9 ci-dessous.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>Cat\u00e9gorie<\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Montant des investissements dans la situation actuelle (M\u20ac)<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Besoins d&#8217;investissements suppl\u00e9mentaires annuels \u00e0 court terme (M\u20ac<\/strong> <strong>&#8211; par rapport \u00e0 la situation actuelle)<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Besoins d&#8217;investissements suppl\u00e9mentaires annuels \u00e0 moyen terme (M\u20ac<strong> &#8211; par rapport \u00e0 la situation actuelle)<\/strong><\/strong><\/td><td><strong>Remarque<\/strong>s<\/td><\/tr><tr><td>Ferroviaire &#8211; R\u00e9seau structurant<\/td><td class=\"has-text-align-center\" data-align=\"center\">3100<\/td><td class=\"has-text-align-center\" data-align=\"center\">+1100<\/td><td class=\"has-text-align-center\" data-align=\"center\">+1100<\/td><td><\/td><\/tr><tr><td>Ferroviaire &#8211; LDFT<\/td><td class=\"has-text-align-center\" data-align=\"center\">400<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td>Financ\u00e9 par les CPER. Non prise en compte d&#8217;un besoin suppl\u00e9mentaire de 600M\u20ac sur les lignes d&#8217;int\u00e9r\u00eat local<\/td><\/tr><tr><td>Ferroviaire &#8211; Grands projets de d\u00e9veloppement<\/td><td class=\"has-text-align-center\" data-align=\"center\">2000<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td>Sc\u00e9narios \u00e0 affiner par le COI, mais moins prioritaire que le financement du r\u00e9seau structurant<\/td><\/tr><tr><td>Routier &#8211; Non conc\u00e9d\u00e9<\/td><td class=\"has-text-align-center\" data-align=\"center\">700<\/td><td class=\"has-text-align-center\" data-align=\"center\">+950<\/td><td class=\"has-text-align-center\" data-align=\"center\">+1100<\/td><td><\/td><\/tr><tr><td>Routier &#8211; Conc\u00e9d\u00e9<\/td><td class=\"has-text-align-center\" data-align=\"center\">1700<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td class=\"has-text-align-center\" data-align=\"center\">+600<\/td><td>Aujourd&#8217;hui financ\u00e9 par les soci\u00e9t\u00e9s concessionnaires d&#8217;autoroutes<\/td><\/tr><tr><td>Fret<\/td><td class=\"has-text-align-center\" data-align=\"center\">200<\/td><td class=\"has-text-align-center\" data-align=\"center\">+300<\/td><td class=\"has-text-align-center\" data-align=\"center\">+300<\/td><td><\/td><\/tr><tr><td>Fluvial<\/td><td class=\"has-text-align-center\" data-align=\"center\">200<\/td><td class=\"has-text-align-center\" data-align=\"center\">+200<\/td><td class=\"has-text-align-center\" data-align=\"center\">+200<\/td><td><\/td><\/tr><tr><td>Routier &#8211; Soutien \u00e0 l&#8217;\u00e9lectrification des poids-lourds<\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td class=\"has-text-align-center\" data-align=\"center\">+550<\/td><td class=\"has-text-align-center\" data-align=\"center\">+550<\/td><td>Hypoth\u00e8se arbitraire \u00e0 partir des chiffres du rapport, en estimant un financement de 50% des surco\u00fbts \u00e9voqu\u00e9s en fourchette basse<\/td><\/tr><tr><td>Transports urbains<\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><td class=\"has-text-align-center\" data-align=\"center\">+700<\/td><td class=\"has-text-align-center\" data-align=\"center\">+700<\/td><td>Hypoth\u00e8se arbitraire \u00e0 partir des chiffres du rapport<\/td><\/tr><tr><td><strong>Total<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>8300<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>+3800<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>+4550<\/strong><\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Pour y r\u00e9pondre, les ressources suivantes ont \u00e9t\u00e9 identifi\u00e9es :<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Ressource<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Rendement potentiel \u00e0 court terme (M\u20ac\/an)<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Rendement potentiel \u00e0 moyen terme (M\u20ac\/an)<\/strong><\/td><td><strong>Remarques<\/strong><\/td><\/tr><tr><td>Hausse de la contribution des usagers<\/td><td class=\"has-text-align-center\" data-align=\"center\">150<\/td><td class=\"has-text-align-center\" data-align=\"center\">150<\/td><td><\/td><\/tr><tr><td>Eco-contribution poids-lourds<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td class=\"has-text-align-center\" data-align=\"center\">210<\/td><td><\/td><\/tr><tr><td>Majoration cibl\u00e9e des p\u00e9ages poids lourds<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td class=\"has-text-align-center\" data-align=\"center\">100<\/td><td><\/td><\/tr><tr><td>Surplus de recettes issus des p\u00e9ages<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td class=\"has-text-align-center\" data-align=\"center\">2500<\/td><td><\/td><\/tr><tr><td>Refl\u00e9chage de la TICPE<\/td><td class=\"has-text-align-center\" data-align=\"center\">1000<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td>Hypoth\u00e8se arbitraire, non durable en raison de l&#8217;\u00e9rosion pr\u00e9visible de la TICPE + non cumul avec la suppression du taux r\u00e9duit<\/td><\/tr><tr><td>Suppression du taux r\u00e9duit de TICPE<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td class=\"has-text-align-center\" data-align=\"center\">1200<\/td><td><\/td><\/tr><tr><td>Refl\u00e9chage de la taxe sur les billets d&#8217;avion<\/td><td class=\"has-text-align-center\" data-align=\"center\">500<\/td><td class=\"has-text-align-center\" data-align=\"center\">500<\/td><td>Hypoth\u00e8se arbitraire <\/td><\/tr><tr><td>ETS1<\/td><td class=\"has-text-align-center\" data-align=\"center\">200<\/td><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td>Ressource reprise par le budget europ\u00e9en \u00e0 moyen terme<\/td><\/tr><tr><td>Abaissement du seuil du malus automobile<\/td><td class=\"has-text-align-center\" data-align=\"center\">400<\/td><td class=\"has-text-align-center\" data-align=\"center\">400<\/td><td><\/td><\/tr><tr><td>Suppression abattement v\u00e9hicule hybride malus auto<\/td><td class=\"has-text-align-center\" data-align=\"center\">200<\/td><td class=\"has-text-align-center\" data-align=\"center\">200<\/td><td><\/td><\/tr><tr><td>Taxe sur la livraison de colis \u00e0 domicile<\/td><td class=\"has-text-align-center\" data-align=\"center\">100<\/td><td class=\"has-text-align-center\" data-align=\"center\">100<\/td><td><\/td><\/tr><tr><td>Fonds de concours SNCF<\/td><td class=\"has-text-align-center\" data-align=\"center\">500<\/td><td class=\"has-text-align-center\" data-align=\"center\">500<\/td><td><\/td><\/tr><tr><td>Hausse de la redevance hydraulique<\/td><td class=\"has-text-align-center\" data-align=\"center\">40<\/td><td class=\"has-text-align-center\" data-align=\"center\">40<\/td><td><\/td><\/tr><tr><td>D\u00e9plafonnement du VM<\/td><td class=\"has-text-align-center\" data-align=\"center\">360<\/td><td class=\"has-text-align-center\" data-align=\"center\">360<\/td><td><\/td><\/tr><tr><td><strong>Total<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>+3450<\/strong> <\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>+6260<\/strong><\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Si le bilan semble globalement pouvoir s&#8217;\u00e9quilibrer \u00e0 moyen terme (notamment gr\u00e2ce \u00e0 la r\u00e9cup\u00e9ration de la manne des autoroutes), on observe cependant qu&#8217;\u00e0 court terme, m\u00eame en actionnant l&#8217;ensemble des leviers identifi\u00e9s ci-dessus, l&#8217;\u00e9quilibre entre les besoins suppl\u00e9mentaires et les ressources identifi\u00e9es para\u00eet fragile. Dans un contexte politique et budg\u00e9taire extr\u00eamement tendu, l&#8217;ascension de la courbe des investissements est une direction que le rapport a le m\u00e9rite de tracer clairement, mais qui semble donc sem\u00e9 d&#8217;emb\u00fbches&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le 9 juillet 2025, Dominique Bussereau, pr\u00e9sident de la conf\u00e9rence intitul\u00e9e Ambition France Transports, a remis au ministre des transports le rapport issu des travaux des membres de cette conf\u00e9rence. Cet article reprend les principales propositions de ce rapport, en tentant de les mettre en rapport avec les flux existants. Cette conf\u00e9rence \u00e9tait organis\u00e9e en [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ocean_post_layout":"","ocean_both_sidebars_style":"","ocean_both_sidebars_content_width":0,"ocean_both_sidebars_sidebars_width":0,"ocean_sidebar":"","ocean_second_sidebar":"","ocean_disable_margins":"enable","ocean_add_body_class":"","ocean_shortcode_before_top_bar":"","ocean_shortcode_after_top_bar":"","ocean_shortcode_before_header":"","ocean_shortcode_after_header":"","ocean_has_shortcode":"","ocean_shortcode_after_title":"","ocean_shortcode_before_footer_widgets":"","ocean_shortcode_after_footer_widgets":"","ocean_shortcode_before_footer_bottom":"","ocean_shortcode_after_footer_bottom":"","ocean_display_top_bar":"default","ocean_display_header":"default","ocean_header_style":"","ocean_center_header_left_menu":"","ocean_custom_header_template":"","ocean_custom_logo":0,"ocean_custom_retina_logo":0,"ocean_custom_logo_max_width":0,"ocean_custom_logo_tablet_max_width":0,"ocean_custom_logo_mobile_max_width":0,"ocean_custom_logo_max_height":0,"ocean_custom_logo_tablet_max_height":0,"ocean_custom_logo_mobile_max_height":0,"ocean_header_custom_menu":"","ocean_menu_typo_font_family":"","ocean_menu_typo_font_subset":"","ocean_menu_typo_font_size":0,"ocean_menu_typo_font_size_tablet":0,"ocean_menu_typo_font_size_mobile":0,"ocean_menu_typo_font_size_unit":"px","ocean_menu_typo_font_weight":"","ocean_menu_typo_font_weight_tablet":"","ocean_menu_typo_font_weight_mobile":"","ocean_menu_typo_transform":"","ocean_menu_typo_transform_tablet":"","ocean_menu_typo_transform_mobile":"","ocean_menu_typo_line_height":0,"ocean_menu_typo_line_height_tablet":0,"ocean_menu_typo_line_height_mobile":0,"ocean_menu_typo_line_height_unit":"","ocean_menu_typo_spacing":0,"ocean_menu_typo_spacing_tablet":0,"ocean_menu_typo_spacing_mobile":0,"ocean_menu_typo_spacing_unit":"","ocean_menu_link_color":"","ocean_menu_link_color_hover":"","ocean_menu_link_color_active":"","ocean_menu_link_background":"","ocean_menu_link_hover_background":"","ocean_menu_link_active_background":"","ocean_menu_social_links_bg":"","ocean_menu_social_hover_links_bg":"","ocean_menu_social_links_color":"","ocean_menu_social_hover_links_color":"","ocean_disable_title":"default","ocean_disable_heading":"default","ocean_post_title":"","ocean_post_subheading":"","ocean_post_title_style":"","ocean_post_title_background_color":"","ocean_post_title_background":0,"ocean_post_title_bg_image_position":"","ocean_post_title_bg_image_attachment":"","ocean_post_title_bg_image_repeat":"","ocean_post_title_bg_image_size":"","ocean_post_title_height":0,"ocean_post_title_bg_overlay":0.5,"ocean_post_title_bg_overlay_color":"","ocean_disable_breadcrumbs":"default","ocean_breadcrumbs_color":"","ocean_breadcrumbs_separator_color":"","ocean_breadcrumbs_links_color":"","ocean_breadcrumbs_links_hover_color":"","ocean_display_footer_widgets":"default","ocean_display_footer_bottom":"default","ocean_custom_footer_template":"","ocean_post_oembed":"","ocean_post_self_hosted_media":"","ocean_post_video_embed":"","ocean_link_format":"","ocean_link_format_target":"self","ocean_quote_format":"","ocean_quote_format_link":"post","ocean_gallery_link_images":"on","ocean_gallery_id":[],"footnotes":""},"categories":[1],"tags":[],"class_list":["post-447","post","type-post","status-publish","format-standard","hentry","category-non-classe","entry"],"_links":{"self":[{"href":"https:\/\/huguesg.fr\/site\/index.php\/wp-json\/wp\/v2\/posts\/447","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/huguesg.fr\/site\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/huguesg.fr\/site\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/huguesg.fr\/site\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/huguesg.fr\/site\/index.php\/wp-json\/wp\/v2\/comments?post=447"}],"version-history":[{"count":121,"href":"https:\/\/huguesg.fr\/site\/index.php\/wp-json\/wp\/v2\/posts\/447\/revisions"}],"predecessor-version":[{"id":623,"href":"https:\/\/huguesg.fr\/site\/index.php\/wp-json\/wp\/v2\/posts\/447\/revisions\/623"}],"wp:attachment":[{"href":"https:\/\/huguesg.fr\/site\/index.php\/wp-json\/wp\/v2\/media?parent=447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/huguesg.fr\/site\/index.php\/wp-json\/wp\/v2\/categories?post=447"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/huguesg.fr\/site\/index.php\/wp-json\/wp\/v2\/tags?post=447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}